xref: /haiku/src/apps/mediaplayer/media_node_framework/audio/AudioProducer.h (revision 8dd3060da4f50b8de2830fd93216b186efec7c4f)
10fc56ed5SStephan Aßmus /*	Copyright (c) 1998-99, Be Incorporated, All Rights Reserved.
20fc56ed5SStephan Aßmus  *	Distributed under the terms of the Be Sample Code license.
30fc56ed5SStephan Aßmus  *
40fc56ed5SStephan Aßmus  *	Copyright (c) 2000-2008, Ingo Weinhold <ingo_weinhold@gmx.de>,
50fc56ed5SStephan Aßmus  *	Copyright (c) 2000-2008, Stephan Aßmus <superstippi@gmx.de>,
60fc56ed5SStephan Aßmus  *	All Rights Reserved. Distributed under the terms of the MIT license.
70fc56ed5SStephan Aßmus  */
80fc56ed5SStephan Aßmus #ifndef AUDIO_PRODUCER_H
90fc56ed5SStephan Aßmus #define AUDIO_PRODUCER_H
100fc56ed5SStephan Aßmus 
11*8dd3060dSAxel Dörfler 
120fc56ed5SStephan Aßmus #include <BufferProducer.h>
130fc56ed5SStephan Aßmus #include <MediaEventLooper.h>
140fc56ed5SStephan Aßmus 
15*8dd3060dSAxel Dörfler 
160fc56ed5SStephan Aßmus class AudioSupplier;
179282400fSStephan Aßmus class BHandler;
189282400fSStephan Aßmus 
199282400fSStephan Aßmus enum {
209282400fSStephan Aßmus 	MSG_PEAK_NOTIFICATION		= 'pknt'
219282400fSStephan Aßmus };
220fc56ed5SStephan Aßmus 
23*8dd3060dSAxel Dörfler 
240fc56ed5SStephan Aßmus class AudioProducer : public BBufferProducer, public BMediaEventLooper {
250fc56ed5SStephan Aßmus public:
260fc56ed5SStephan Aßmus 								AudioProducer(const char* name,
270fc56ed5SStephan Aßmus 									AudioSupplier* supplier,
280fc56ed5SStephan Aßmus 									bool lowLatency = true);
290fc56ed5SStephan Aßmus 	virtual						~AudioProducer();
300fc56ed5SStephan Aßmus 
310fc56ed5SStephan Aßmus 	// BMediaNode interface
320fc56ed5SStephan Aßmus 	virtual	BMediaAddOn*		AddOn(int32 *internal_id) const;
330fc56ed5SStephan Aßmus 
340fc56ed5SStephan Aßmus 	// BBufferProducer interface
350fc56ed5SStephan Aßmus 	virtual	status_t			FormatSuggestionRequested(media_type type,
360fc56ed5SStephan Aßmus 									int32 quality, media_format* _format);
370fc56ed5SStephan Aßmus 
380fc56ed5SStephan Aßmus 	virtual	status_t			FormatProposal(const media_source& output,
390fc56ed5SStephan Aßmus 									media_format* format);
400fc56ed5SStephan Aßmus 
410fc56ed5SStephan Aßmus 	virtual	status_t			FormatChangeRequested(
420fc56ed5SStephan Aßmus 									const media_source& source,
430fc56ed5SStephan Aßmus 									const media_destination& destination,
440fc56ed5SStephan Aßmus 									media_format* ioFormat,
450fc56ed5SStephan Aßmus 									int32* _deprecated_);
460fc56ed5SStephan Aßmus 
470fc56ed5SStephan Aßmus 	virtual	status_t			GetNextOutput(int32* cookie,
480fc56ed5SStephan Aßmus 									media_output* _output);
490fc56ed5SStephan Aßmus 
500fc56ed5SStephan Aßmus 	virtual	status_t			DisposeOutputCookie(int32 cookie);
510fc56ed5SStephan Aßmus 
520fc56ed5SStephan Aßmus 	virtual	status_t			SetBufferGroup(const media_source& forSource,
530fc56ed5SStephan Aßmus 									BBufferGroup* group);
540fc56ed5SStephan Aßmus 
550fc56ed5SStephan Aßmus 	virtual	status_t			GetLatency(bigtime_t* _latency);
560fc56ed5SStephan Aßmus 
570fc56ed5SStephan Aßmus 	virtual	status_t			PrepareToConnect(const media_source& what,
580fc56ed5SStephan Aßmus 									const media_destination& where,
590fc56ed5SStephan Aßmus 									media_format* format,
600fc56ed5SStephan Aßmus 									media_source* outSource, char* outName);
610fc56ed5SStephan Aßmus 
620fc56ed5SStephan Aßmus 	virtual	void				Connect(status_t error,
630fc56ed5SStephan Aßmus 									const media_source& source,
640fc56ed5SStephan Aßmus 									const media_destination& destination,
650fc56ed5SStephan Aßmus 									const media_format& format,
660fc56ed5SStephan Aßmus 									char* ioName);
670fc56ed5SStephan Aßmus 
680fc56ed5SStephan Aßmus 	virtual	void				Disconnect(const media_source &what,
690fc56ed5SStephan Aßmus 									const media_destination& where);
700fc56ed5SStephan Aßmus 
710fc56ed5SStephan Aßmus 	virtual	void				LateNoticeReceived(const media_source& what,
720fc56ed5SStephan Aßmus 									bigtime_t howMuch,
730fc56ed5SStephan Aßmus 									bigtime_t performanceTime);
740fc56ed5SStephan Aßmus 
750fc56ed5SStephan Aßmus 	virtual	void				EnableOutput(const media_source& what,
760fc56ed5SStephan Aßmus 									bool enabled, int32* _deprecated_);
770fc56ed5SStephan Aßmus 
780fc56ed5SStephan Aßmus 	virtual	status_t			SetPlayRate(int32 numer, int32 denom);
790fc56ed5SStephan Aßmus 
800fc56ed5SStephan Aßmus 	virtual	status_t			HandleMessage(int32 message,
810fc56ed5SStephan Aßmus 									const void* data, size_t size);
820fc56ed5SStephan Aßmus 
830fc56ed5SStephan Aßmus 	virtual	void				AdditionalBufferRequested(
840fc56ed5SStephan Aßmus 									const media_source& source,
850fc56ed5SStephan Aßmus 									media_buffer_id prevBuffer,
860fc56ed5SStephan Aßmus 									bigtime_t prevTime,
870fc56ed5SStephan Aßmus 									const media_seek_tag* prevTag);
880fc56ed5SStephan Aßmus 										// may be NULL
890fc56ed5SStephan Aßmus 
900fc56ed5SStephan Aßmus 	virtual	void				LatencyChanged(const media_source& source,
910fc56ed5SStephan Aßmus 									const media_destination& destination,
920fc56ed5SStephan Aßmus 									bigtime_t newLatency, uint32 flags);
930fc56ed5SStephan Aßmus 
940fc56ed5SStephan Aßmus 	// BMediaEventLooper interface
950fc56ed5SStephan Aßmus 	virtual	void				NodeRegistered();
960fc56ed5SStephan Aßmus 
970fc56ed5SStephan Aßmus 	virtual	void				SetRunMode(run_mode mode);
980fc56ed5SStephan Aßmus 
990fc56ed5SStephan Aßmus 	virtual	void				HandleEvent(const media_timed_event* event,
1000fc56ed5SStephan Aßmus 									bigtime_t lateness,
1010fc56ed5SStephan Aßmus 									bool realTimeEvent = false);
1020fc56ed5SStephan Aßmus 
1039282400fSStephan Aßmus 	// AudioProducer
1049282400fSStephan Aßmus 			void				SetPeakListener(BHandler* handler);
1059282400fSStephan Aßmus 
106fa1a1c29SStephan Aßmus 			status_t			ChangeFormat(media_format* format);
107fa1a1c29SStephan Aßmus 
1080fc56ed5SStephan Aßmus private:
109fa1a1c29SStephan Aßmus 			status_t			_SpecializeFormat(media_format* format);
110fa1a1c29SStephan Aßmus 			status_t			_ChangeFormat(const media_format& format);
111fa1a1c29SStephan Aßmus 			status_t			_AllocateBuffers(const media_format& format);
1120fc56ed5SStephan Aßmus 			BBuffer*			_FillNextBuffer(bigtime_t eventTime);
1130fc56ed5SStephan Aßmus 
1140fc56ed5SStephan Aßmus 			void				_FillSampleBuffer(float* data,
1150fc56ed5SStephan Aßmus 									size_t numSamples);
1160fc56ed5SStephan Aßmus 
1170fc56ed5SStephan Aßmus 			BBufferGroup*		fBufferGroup;
1180fc56ed5SStephan Aßmus 			bool				fUsingOurBuffers;
1190fc56ed5SStephan Aßmus 			bigtime_t			fLatency;
1200fc56ed5SStephan Aßmus 			bigtime_t			fInternalLatency;
121*8dd3060dSAxel Dörfler 			bigtime_t			fLastLateNotice;
122*8dd3060dSAxel Dörfler 			bigtime_t			fNextScheduledBuffer;
1230fc56ed5SStephan Aßmus 			bool				fLowLatency;
1240fc56ed5SStephan Aßmus 			media_output		fOutput;
1250fc56ed5SStephan Aßmus 			bool				fOutputEnabled;
1260fc56ed5SStephan Aßmus 			media_format		fPreferredFormat;
1270fc56ed5SStephan Aßmus 
1280fc56ed5SStephan Aßmus 			uint64				fFramesSent;
1290fc56ed5SStephan Aßmus 			bigtime_t			fStartTime;
1300fc56ed5SStephan Aßmus 
1310fc56ed5SStephan Aßmus 			AudioSupplier*		fSupplier;
1329282400fSStephan Aßmus 
1339282400fSStephan Aßmus 			BHandler*			fPeakListener;
1340fc56ed5SStephan Aßmus };
1350fc56ed5SStephan Aßmus 
1360fc56ed5SStephan Aßmus #endif // AUDIO_PRODUCER_H
137