ストリーミング再生ではないので、Wavファイルのサイズ分だけメモリを消費します。
想定してる用途としては、暗号化したWavファイルを復号化して再生すること。
確認コードはこんな感じになりました。
/*-------------------------------------------------------------------
Wavファイルを読み込んで再生
-------------------------------------------------------------------*/
char CSound::LoadFile(const char *file_name) {
// ファイルを開いてサイズを調べる
Fp = fopen(file_name,"rb");
fseek( Fp, 0, SEEK_END );
long size = ftell(Fp);
int wav_size = size - WAV_HEADER_SIZE;
fseek(Fp, WAV_HEADER_SIZE, SEEK_SET);
// バッファにデータを読み込む
Data = new char[wav_size];
if( ! Data ) {
printf("failed allocate\n");
return FAILED_LOAD_SOUND;
}
fread(Data, 1, wav_size, Fp);
// データを転送
Music = Mix_QuickLoad_RAW((Uint8*)Data, wav_size);
fclose(Fp);
// 読み込めてるか確認
if( Music == NULL ) {
printf("cannot load %s", file_name);
return FAILED_LOAD_SOUND;
}
return SOUND_OK;
}
/*-------------------------------------------------------------------
音楽の再生
-------------------------------------------------------------------*/
// 空いてるチャンネルを利用する
char CSound::Play(int repeat) {
if( Mix_PlayChannel(-1, Music, repeat) == -1 ) {
printf("cannot play sound");
return FAILED_PLAY_SOUND;
}
return SOUND_OK;
}
#include
int main(int argc, char *argv[]) {
CSound s;
s.LoadFile("Op.wav");
s.Play(-1);// -1:無限再生
Sleep(5000);
return 0;
}
SDLに与えてみたところ、正常に再生されました。
ポーリング処理を追加すれば、復号化しながらストリーミング再生ってのもできるだろうけど、
ポーリングと同時に復号化処理もやっちゃうと重くなりそうなので実装するかは悩みどころ。
そもそも、スクリプト類と違って、本来音楽ファイルは暗号化する意味あまりないんですよねぇ。
極論言えば、音楽鳴らなくてもゲームになるし。
だけど、動画サイトに音楽抜かれてアップされてる現状見てると、
何らかのプロテクト処置が必要かなぁ、と思ったのです。
音楽はそれ一つが”ゲーム音楽”という1作品として完結できるし、それを頒布する時に
「ゲームからWav抜けばいいから要らないわ」って反応されたらやだなぁ、って(w
そんなエゴの為のコードが今回のエントリだったりします。
市販のゲームは音楽にプロテクト処理されてるものってあまり無いですね。
僕は過去に、プレステソフトをコンポでCD再生したことが何度もありますが、
そのまま音楽聞けるソフトが大半(物によっては「CD再生するな」という警告音声が聞けるものも!)でした。
こういう遊び心大好きです(w
いいなぁこういう裏技的なものどっかに仕込みたい。。