root/headers/os/media/Sound.h
/*
 * Copyright 2009, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _SOUND_H
#define _SOUND_H


#include <MediaDefs.h>

class BFile;
class BSoundPlayer;
struct entry_ref;

namespace BPrivate {
        class BTrackReader;
};


class BSound {
public:
                                                                BSound(void* data, size_t size,
                                                                        const media_raw_audio_format& format,
                                                                        bool freeWhenDone = false);
                                                                BSound(const entry_ref* soundFile,
                                                                        bool loadIntoMemory = false);

                        status_t                        InitCheck();
                        BSound*                         AcquireRef();
                        bool                            ReleaseRef();
                        int32                           RefCount() const; // unreliable!

        virtual bigtime_t                       Duration() const;
        virtual const media_raw_audio_format &Format() const;
        virtual const void*                     Data() const; // returns NULL for files
        virtual off_t                           Size() const;

        virtual bool                            GetDataAt(off_t offset,
                                                                        void* intoBuffer, size_t bufferSize,
                                                                        size_t* outUsed);

protected:
                                                                BSound(const media_raw_audio_format& format);
        virtual status_t                        Perform(int32 code, ...);

private:
                        friend  class DummyFriend;
        virtual                                         ~BSound();

public:
        virtual status_t                        BindTo(BSoundPlayer* player,
                                                                        const media_raw_audio_format& format);
        virtual status_t                        UnbindFrom(BSoundPlayer* player);

private:
                        status_t                        _Reserved_Sound_0(void*);       // BindTo
                        status_t                        _Reserved_Sound_1(void*);       // UnbindFrom
        virtual status_t                        _Reserved_Sound_2(void*);
        virtual status_t                        _Reserved_Sound_3(void*);
        virtual status_t                        _Reserved_Sound_4(void*);
        virtual status_t                        _Reserved_Sound_5(void*);

private:
                        void*                           fData;
                        size_t                          fDataSize;
                        BFile*                          fFile;
                        int32                           fRefCount;
                        status_t                        fStatus;
                        media_raw_audio_format fFormat;

                        bool                            fFreeWhenDone;
                        bool                            fReserved[3];

                        BPrivate::BTrackReader* fTrackReader;
                        uint32                          fReserved2[18];
};

#endif // _SOUND_H