root/src/apps/mediaplayer/media_node_framework/audio/AudioProducer.h
/*      Copyright (c) 1998-99, Be Incorporated, All Rights Reserved.
 *      Distributed under the terms of the Be Sample Code license.
 *
 *      Copyright (c) 2000-2008, Ingo Weinhold <ingo_weinhold@gmx.de>,
 *      Copyright (c) 2000-2008, Stephan Aßmus <superstippi@gmx.de>,
 *      All Rights Reserved. Distributed under the terms of the MIT license.
 */
#ifndef AUDIO_PRODUCER_H
#define AUDIO_PRODUCER_H


#include <BufferProducer.h>
#include <MediaEventLooper.h>


class AudioSupplier;
class BHandler;

enum {
        MSG_PEAK_NOTIFICATION           = 'pknt'
};


class AudioProducer : public BBufferProducer, public BMediaEventLooper {
public:
                                                                AudioProducer(const char* name,
                                                                        AudioSupplier* supplier,
                                                                        bool lowLatency = true);
        virtual                                         ~AudioProducer();

        // BMediaNode interface
        virtual BMediaAddOn*            AddOn(int32 *internal_id) const;

        // BBufferProducer interface
        virtual status_t                        FormatSuggestionRequested(media_type type,
                                                                        int32 quality, media_format* _format);

        virtual status_t                        FormatProposal(const media_source& output,
                                                                        media_format* format);

        virtual status_t                        FormatChangeRequested(
                                                                        const media_source& source,
                                                                        const media_destination& destination,
                                                                        media_format* ioFormat,
                                                                        int32* _deprecated_);

        virtual status_t                        GetNextOutput(int32* cookie,
                                                                        media_output* _output);

        virtual status_t                        DisposeOutputCookie(int32 cookie);

        virtual status_t                        SetBufferGroup(const media_source& forSource,
                                                                        BBufferGroup* group);

        virtual status_t                        GetLatency(bigtime_t* _latency);

        virtual status_t                        PrepareToConnect(const media_source& what,
                                                                        const media_destination& where,
                                                                        media_format* format,
                                                                        media_source* outSource, char* outName);

        virtual void                            Connect(status_t error,
                                                                        const media_source& source,
                                                                        const media_destination& destination,
                                                                        const media_format& format,
                                                                        char* ioName);

        virtual void                            Disconnect(const media_source &what,
                                                                        const media_destination& where);

        virtual void                            LateNoticeReceived(const media_source& what,
                                                                        bigtime_t howMuch,
                                                                        bigtime_t performanceTime);

        virtual void                            EnableOutput(const media_source& what,
                                                                        bool enabled, int32* _deprecated_);

        virtual status_t                        SetPlayRate(int32 numer, int32 denom);

        virtual status_t                        HandleMessage(int32 message,
                                                                        const void* data, size_t size);

        virtual void                            AdditionalBufferRequested(
                                                                        const media_source& source,
                                                                        media_buffer_id prevBuffer,
                                                                        bigtime_t prevTime,
                                                                        const media_seek_tag* prevTag);
                                                                                // may be NULL

        virtual void                            LatencyChanged(const media_source& source,
                                                                        const media_destination& destination,
                                                                        bigtime_t newLatency, uint32 flags);

        // BMediaEventLooper interface
        virtual void                            NodeRegistered();

        virtual void                            SetRunMode(run_mode mode);

        virtual void                            HandleEvent(const media_timed_event* event,
                                                                        bigtime_t lateness,
                                                                        bool realTimeEvent = false);

        // AudioProducer
                        void                            SetPeakListener(BHandler* handler);

                        status_t                        ChangeFormat(media_format* format);

private:
                        status_t                        _SpecializeFormat(media_format* format);
                        status_t                        _ChangeFormat(const media_format& format);
                        status_t                        _AllocateBuffers(const media_format& format);
                        BBuffer*                        _FillNextBuffer(bigtime_t eventTime);

                        void                            _FillSampleBuffer(float* data,
                                                                        size_t numSamples);

                        BBufferGroup*           fBufferGroup;
                        bool                            fUsingOurBuffers;
                        bigtime_t                       fLatency;
                        bigtime_t                       fInternalLatency;
                        bigtime_t                       fLastLateNotice;
                        bigtime_t                       fNextScheduledBuffer;
                        bool                            fLowLatency;
                        media_output            fOutput;
                        bool                            fOutputEnabled;
                        media_format            fPreferredFormat;

                        uint64                          fFramesSent;
                        bigtime_t                       fStartTime;

                        AudioSupplier*          fSupplier;

                        BHandler*                       fPeakListener;
};

#endif // AUDIO_PRODUCER_H