#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_