/**************************************************************************** * libwiigui * * Tantric 2009 * * gui_sound_decoder.h * * by ardi 2009 * * GUI class definitions ***************************************************************************/ #ifndef GUI_SOUND_DECODER_H #define GUI_SOUND_DECODER_H #include #define REGISTER_GUI_SOUND_DECODER(decoder) GuiSoundDecoder::DecoderListEntry decoder##_l = GuiSoundDecoder::RegisterDecoder(decoder##_l, decoder::Create) class GuiSoundDecoder; typedef GuiSoundDecoder *(*GuiSoundDecoderCreate)(const u8 * snd, u32 len, bool snd_is_allocated); class GuiSoundDecoder { protected: GuiSoundDecoder(){}; // Constructors must protected so it can create only with Init(...); public: virtual ~GuiSoundDecoder(){}; // begin API // --------- // each Decoder must have an own static Create(...) fnc // static GuiSoundDecoder *Create(const u8 * snd, u32 len, bool snd_is_allocated); virtual s32 GetFormat()=0; virtual s32 GetSampleRate()=0; /* Read reads data from stream to buffer return: >0 = readed bytes; 0 = EOF; <0 = Error; */ virtual int Read(u8 * buffer, int buffer_size)=0; // set the stream to the start virtual int Rewind()=0; // ------- // end API struct DecoderListEntry { GuiSoundDecoderCreate fnc; DecoderListEntry *next; }; static DecoderListEntry &RegisterDecoder(DecoderListEntry &Decoder, GuiSoundDecoderCreate fnc); static GuiSoundDecoder *GetDecoder(const u8 * snd, u32 len, bool snd_is_allocated); private: static DecoderListEntry *DecoderList; GuiSoundDecoder(GuiSoundDecoder&); // no copy }; #define BIG_ENDIAN_HOST 1 // Wii PPC is a Big-Endian-Host #if BIG_ENDIAN_HOST inline uint16_t be16(const uint8_t *p8) { return *((uint16_t*)p8); } inline uint32_t be32(const uint8_t *p8) { return *((uint32_t*)p8); } inline uint16_t le16(const uint8_t *p8) { uint16_t ret = p8[1]<<8 | p8[0]; return ret; } inline uint32_t le32(const uint8_t *p8) { uint32_t ret = p8[3]<<24 | p8[2]<<16 | p8[1]<<8 | p8[0]; return ret; } #elif LITTLE_ENDIAN_HOST inline uint16_t be16(const uint8_t *p8) { uint16_t ret = p8[0]<<8 | p8[1]; return ret; } inline uint32_t be32(const uint8_t *p8) { uint32_t ret = p8[0]<<24 | p8[1]<<16 | p8[2]<<8 | p8[3]; return ret; } inline uint16_t le16(const uint8_t *p8) { return *((uint16_t*)p8); } inline uint32_t le32(const uint8_t *p8) { return *((uint32_t*)p8); } #else #error "BIG_ENDIAN_HOST or LITTLE_ENDIAN_HOST not setted" #endif /* XXX_ENDIAN_HOST */ #define be16inc(p8) (p8+=2, be16(p8-2)) #define le16inc(p8) (p8+=2, le16(p8-2)) #define be32inc(p8) (p8+=4, be32(p8-4)) #define le32inc(p8) (p8+=4, le32(p8-4)) #endif /* GUI_SOUND_DECODER_H */