去人のクローズドβで、ユーザさんから、
ボリュームがおかしい!
っていわれて、いろいろ、デバッグはしていたんですが、なんか、気のせいかなあなんておもっていた。
わたし音量の微細な違いなんてわからんのだ。
まあ、当初から報告があったので、これマルチスレッドにしたときにおかしゅうなった、とおもって、シングルスレッドになおして、OKだとおもったのだ。
でも、今度は
BGMがなりもしないよ!
っていわれて、そら、一大事やと思っていた。
もう、2ヶ月ぐらいこの現象を放置していたわけだ。
いやあ、直そうとはしていたんですけど、確かに鳴らないって言うのは気のせいじゃない。
BGMがなんないっていてるんだよー!
〃〃∩ _, ,_
⊂⌒( `Д´) < ヤダヤダ!
`ヽ_つ__つ
ジタバタ
確かに、再現するのだ。BGMがならない、声が再生されない!
よし、じゃあ、本格的にチェックしたる!
y4d_soundのクラスを使っているとき、エラーチェックなんてしないでそのまま再生していたので、ちゃんとエラーチェックしてログをとるようにした。
こんな感じにコードにエラーチェックをいれて動かしたら、エラーがログがばしばしでるのだ。
y4d_result res;
Sound s = new Sound;
res = s.load("hogehoge.ogg");
checkError("load",res);
res = s.play();
checkError("play",res);
s.setLoop(-1);
res = s.setVolume(128);
checkError("setVolume",res);
音楽はちゃんとなっているし、再生もできている。
y4d_sound.soundの中身をみて、ちょっと怪訝に思った。
Mix_PlayChannelは成功したときに 0 を返し、失敗したときに 非0 を返すのか?
return Mix_PlayChannel(chunkChannel-1, chunk, loopflag)
? y4d_result.SDL_error:y4d_result.no_error;
SDL_mixerのリファレンスをみると、
Returns: the channel the sample is played on. On any errors, -1 is returned.
と書いてある。
そ、そのエラーチェックちごうとる...
ボリュームの設定に関しても、同様のエラーチェックのバグが入っていたので、すぐにyaneSDK4thスレにいって報告だ!
return Mix_PlayChannel(chunkChannel-1, chunk, loopflag) == -1
? y4d_result.SDL_error:y4d_result.no_error;
soundはあまり精査されていないのかもしれないゾ、と思い、
もしかしてボリュームに関してもバグがあるのか...?
SDL_mixerのリファレンスをみていて、ちょっと気になる関数があった。
- int Mix_Volume(int channel, int volume)
- int Mix_VolumeChunk(Mix_Chunk *chunk, int volume)
な、なんで二つあんの?
SDL_mixerの文献は英語しかみつからなかったので(日本の中の人がんがれ!)、辞書片手に解読してみたのだけど、どうも的を得ない。実際は、chunkのボリュームしかいじっていないし、チャンネルボリュームは変更していない。
チャンネルのボリュームが下がることによって、chunkのボリュームも引きずられて下がるのかもな。
そこで試しに、再生時に全チャンネルを最大音量にするコードを書き入れてみた。
実行してみると、確かに音量が良い調子である。ふらふらしていた、音量が安定している。
// すべてのチャンネルのボリュームを最大にする
Mix_Volume(-1, 128);
これでええのか?
もしかしたら、わたしsoundクラスいじっているときにエンバグしたんか?
でも、まあええわ。
テスト重ねて、検証してみます。