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
118dd3060dSAxel Dörfler
120fc56ed5SStephan Aßmus#include <BufferProducer.h>
130fc56ed5SStephan Aßmus#include <MediaEventLooper.h>
140fc56ed5SStephan Aßmus
158dd3060dSAxel Dörfler
160fc56ed5SStephan Aßmusclass AudioSupplier;
179282400fSStephan Aßmusclass BHandler;
189282400fSStephan Aßmus
199282400fSStephan Aßmusenum {
209282400fSStephan Aßmus	MSG_PEAK_NOTIFICATION		= 'pknt'
219282400fSStephan Aßmus};
220fc56ed5SStephan Aßmus
238dd3060dSAxel Dörfler
240fc56ed5SStephan Aßmusclass AudioProducer : public BBufferProducer, public BMediaEventLooper {
250fc56ed5SStephan Aßmuspublic:
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ßmusprivate:
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;
1218dd3060dSAxel Dörfler			bigtime_t			fLastLateNotice;
1228dd3060dSAxel 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