Ogg Vorbis再生
2013-11-23


/******************** メモリ読み込み ********************/ static size_t callback_ov_read(void* ptr, size_t size, size_t nmemb, void* datasource) { return ((SoundPlayer*)datasource)-&gtov_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-&gtsize - ov_pos)/size); if ( _count >= nmemb ) { _count = nmemb; } else if ( _count <= 0 ) { return 0; } size *= _count; if ( size <= sound_data-&gtsize - ov_pos ) { memcpy(ptr, sound_data-&gtdata + ov_pos, size); } else { memcpy(ptr, sound_data-&gtdata + ov_pos, sound_data-&gtsize - ov_pos); memset((u8*)ptr + sound_data-&gtsize - ov_pos, 0x00, size - (sound_data-&gtsize - ov_pos)); } ov_pos += size; return _count; } /****************** メモリシーク ******************/ static int callback_ov_seek(void* datasource, ogg_int64_t offset, int whence) { return ((SoundPlayer*)datasource)-&gtov_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-&gtsize + offset; break; case SEEK_SET : ov_pos = offset; break; default : return -1; } if ( ov_pos > sound_data-&gtsize ) { ov_pos = sound_data-&gtsize; return -1; } else if ( ov_pos < 0 ) { ov_pos = 0; return -1; } return 0; } /******************** メモリクローズ ********************/ static int callback_ov_close(void* datasource) { return ((SoundPlayer*)datasource)-&gtov_close(); } int SoundPlayer::ov_close(void) { return 0; } /******************** メモリ位置通達 ********************/ static long callback_ov_tell(void* datasource) { return ((SoundPlayer*)datasource)-&gtov_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ファイルに差し替えているだけなので、説明は省略します。

プロジェクト一式は、こちらから。

戻る
[Android プログラミング]

コメント(全0件)
コメントをする


記事を書く
 powered by ASAHIネット