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