2009-11-10 00:03:13 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* libwiigui
|
|
|
|
*
|
|
|
|
* Tantric 2009
|
|
|
|
*
|
|
|
|
* gui_sound_decoder.h
|
|
|
|
*
|
|
|
|
* by ardi 2009
|
|
|
|
*
|
|
|
|
* GUI class definitions
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#ifndef GUI_SOUND_DECODER_H
|
|
|
|
#define GUI_SOUND_DECODER_H
|
|
|
|
|
|
|
|
#include <gccore.h>
|
|
|
|
|
|
|
|
#define REGISTER_GUI_SOUND_DECODER(decoder) GuiSoundDecoder::DecoderListEntry decoder##_l = GuiSoundDecoder::RegisterDecoder(decoder##_l, decoder::Create)
|
|
|
|
class GuiSoundDecoder;
|
2010-09-24 02:48:03 +02:00
|
|
|
typedef GuiSoundDecoder *(*GuiSoundDecoderCreate)(const u8 * snd, u32 len, bool snd_is_allocated);
|
2009-11-10 00:03:13 +01:00
|
|
|
|
2010-02-09 11:59:55 +01:00
|
|
|
class GuiSoundDecoder
|
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
protected:
|
2010-09-24 02:48:03 +02:00
|
|
|
GuiSoundDecoder()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
; // Constructors must protected so it can create only with Init(...);
|
2010-09-19 01:16:05 +02:00
|
|
|
public:
|
2010-09-24 02:48:03 +02:00
|
|
|
virtual ~GuiSoundDecoder()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
;
|
2010-09-19 01:16:05 +02:00
|
|
|
// 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
|
2010-09-24 02:48:03 +02:00
|
|
|
return: >0 = readed bytes;
|
|
|
|
0 = EOF;
|
|
|
|
<0 = Error;
|
|
|
|
*/
|
|
|
|
virtual int Read(u8 * buffer, int buffer_size) = 0;
|
2010-09-19 01:16:05 +02:00
|
|
|
// set the stream to the start
|
|
|
|
virtual int Rewind() = 0;
|
|
|
|
// -------
|
|
|
|
// end API
|
|
|
|
|
|
|
|
|
|
|
|
struct DecoderListEntry
|
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
GuiSoundDecoderCreate fnc;
|
|
|
|
DecoderListEntry *next;
|
2010-09-19 01:16:05 +02:00
|
|
|
};
|
2010-09-24 02:48:03 +02:00
|
|
|
static DecoderListEntry &RegisterDecoder(DecoderListEntry &Decoder, GuiSoundDecoderCreate fnc);
|
|
|
|
static GuiSoundDecoder *GetDecoder(const u8 * snd, u32 len, bool snd_is_allocated);
|
2010-09-19 01:16:05 +02:00
|
|
|
private:
|
|
|
|
static DecoderListEntry *DecoderList;
|
2010-09-24 02:48:03 +02:00
|
|
|
GuiSoundDecoder(GuiSoundDecoder&); // no copy
|
2009-11-10 00:03:13 +01:00
|
|
|
};
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
#define BIG_ENDIAN_HOST 1 // Wii PPC is a Big-Endian-Host
|
2009-11-10 00:03:13 +01:00
|
|
|
#if BIG_ENDIAN_HOST
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
inline uint16_t be16(const uint8_t *p8)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
return *((uint16_t*) p8);
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
2010-09-24 02:48:03 +02:00
|
|
|
inline uint32_t be32(const uint8_t *p8)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
return *((uint32_t*) p8);
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
2010-09-24 02:48:03 +02:00
|
|
|
inline uint16_t le16(const uint8_t *p8)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
uint16_t ret = p8[1] << 8 | p8[0];
|
|
|
|
return ret;
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
2010-09-24 02:48:03 +02:00
|
|
|
inline uint32_t le32(const uint8_t *p8)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
uint32_t ret = p8[3] << 24 | p8[2] << 16 | p8[1] << 8 | p8[0];
|
|
|
|
return ret;
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#elif LITTLE_ENDIAN_HOST
|
2010-09-19 01:16:05 +02:00
|
|
|
inline uint16_t be16( const uint8_t *p8 )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
uint16_t ret = p8[0] << 8 | p8[1];
|
|
|
|
return ret;
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
inline uint32_t be32( const uint8_t *p8 )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
uint32_t ret = p8[0] << 24 | p8[1] << 16 | p8[2] << 8 | p8[3];
|
|
|
|
return ret;
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
inline uint16_t le16( const uint8_t *p8 )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
return *( ( uint16_t* )p8 );
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
2010-09-19 01:16:05 +02:00
|
|
|
inline uint32_t le32( const uint8_t *p8 )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
return *( ( uint32_t* )p8 );
|
2009-11-10 00:03:13 +01:00
|
|
|
}
|
|
|
|
#else
|
2010-09-19 01:16:05 +02:00
|
|
|
#error "BIG_ENDIAN_HOST or LITTLE_ENDIAN_HOST not setted"
|
2009-11-10 00:03:13 +01:00
|
|
|
#endif /* XXX_ENDIAN_HOST */
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
#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))
|
2009-11-10 00:03:13 +01:00
|
|
|
|
|
|
|
#endif /* GUI_SOUND_DECODER_H */
|