/********************
メモリ読み込み
********************/
static
size_t callback_ov_read(void* ptr, size_t size, size_t nmemb, void* datasource)
{
return ((SoundPlayer*)datasource)->ov_read(ptr, size, nmemb);
}
size_t SoundPlayer::ov_read(void* ptr, size_t size, size_t nmemb)
{
if ( ptr == NULL ) {
return 0;
}
size_t _count = (size_t)((sound_data->size - ov_pos)/size);
if ( _count >= nmemb ) {
_count = nmemb;
}
else if ( _count <= 0 ) {
return 0;
}
size *= _count;
if ( size <= sound_data->size - ov_pos ) {
memcpy(ptr, sound_data->data + ov_pos, size);
}
else {
memcpy(ptr, sound_data->data + ov_pos, sound_data->size - ov_pos);
memset((u8*)ptr + sound_data->size - ov_pos, 0x00, size - (sound_data->size - ov_pos));
}
ov_pos += size;
return _count;
}
/******************
メモリシーク
******************/
static
int callback_ov_seek(void* datasource, ogg_int64_t offset, int whence)
{
return ((SoundPlayer*)datasource)->ov_seek(offset, whence);
}
int SoundPlayer::ov_seek(ogg_int64_t offset, int whence)
{
switch( whence ) {
case SEEK_CUR :
ov_pos += offset;
break;
case SEEK_END :
ov_pos = sound_data->size + offset;
break;
case SEEK_SET :
ov_pos = offset;
break;
default :
return -1;
}
if ( ov_pos > sound_data->size ) {
ov_pos = sound_data->size;
return -1;
}
else if ( ov_pos < 0 ) {
ov_pos = 0;
return -1;
}
return 0;
}
/********************
メモリクローズ
********************/
static
int callback_ov_close(void* datasource)
{
return ((SoundPlayer*)datasource)->ov_close();
}
int SoundPlayer::ov_close(void)
{
return 0;
}
/********************
メモリ位置通達
********************/
static
long callback_ov_tell(void* datasource)
{
return ((SoundPlayer*)datasource)->ov_tell();
}
long SoundPlayer::ov_tell(void)
{
return ov_pos;
}
/***************************
OggVorbisコールバック
***************************/
static
ov_callbacks callbacks =
{
callback_ov_read,
callback_ov_seek,
callback_ov_close,
callback_ov_tell,
};
デコードライブラリから呼ばれるコールバック関数です。
元はファイルから読み込むことを想定しているようですが、メモリから読み込む処理を行っています。
サンプルはWAVファイルををOGGファイルに差し替えているだけなので、説明は省略します。
プロジェクト一式は、
こちらから。
コメントをする