root/src/add-ons/media/plugins/ape_reader/APEReader.h
#ifndef ___APEReader_H_
#define ___APEReader_H_


#include "MACLib.h"
#include "MonkeysAudioMIMEType.h"
#include "PositionBridgeIO.h"

#include "ReaderPlugin.h"               // Haiku private header


const int32             BLOCK_COUNT = 1024*4;   // number of blocks, get from MACLib at once
const int32             BUFFER_SIZE = 1024*4;   // size of audio data passing to Media Kit
const int32             MEDIA_FILE_FORMAT_VERSION = 100;        // media_file_format::version


class   TAPEReader : public Reader
{
public:
        TAPEReader();
        virtual                         ~TAPEReader();

        virtual const char*     Copyright();

        virtual status_t        Sniff(int32* oStreamCount);

        virtual void            GetFileFormatInfo(media_file_format* oMFF);

        virtual status_t        AllocateCookie(int32 oStreamNumber, void** oCookie);
        virtual status_t        FreeCookie(void* oCookie);

        virtual status_t        GetStreamInfo(void* oCookie, int64* oFrameCount,
                                                        bigtime_t* oDuration, media_format* oFormat,
                                                        const void** oInfoBuffer, size_t* oInfoSize);

        virtual status_t                Seek(void *cookie, uint32 flags,
                                                                int64 *frame, bigtime_t *time);

        virtual status_t                FindKeyFrame(void* cookie, uint32 flags,
                                                                int64* frame, bigtime_t* time);

        virtual status_t        GetNextChunk(void* oCookie, const void** oChunkBuffer,
                                                                size_t* oChunkSize, media_header* oMediaHeader);

private:
        typedef Reader  SUPER;

        bigtime_t                       CurrentTime() const;
        status_t                        LoadAPECheck() const;
        status_t                        ReadBlocks();
        void                            Unset();

        char*                           mDecodedData;                           // data after decoding
        int64                           mDataSize;
        int64                           mPlayPos;
        int64                           mReadPos;
        int64                           mReadPosTotal;
        status_t                        mLoadAPECheck;
        BPositionIO*            mSrcPIO;
        IAPEDecompress*         mDecomp;
        TPositionBridgeIO       mPositionBridgeIO;
};


class   TAPEReaderPlugin : public ReaderPlugin
{
public:
        TAPEReaderPlugin();
        virtual ~TAPEReaderPlugin();

        virtual Reader* NewReader();
};


MediaPlugin*    instantiate_plugin();


#endif  // ___APEReader_H_