去人たち開発ブログ

同人サークルK2Ceeが去人たち開発についての記事を掲載してきます!

SDL_mixer in yaneSDK

去人のクローズドβで、ユーザさんから、

ボリュームがおかしい!

っていわれて、いろいろ、デバッグはしていたんですが、なんか、気のせいかなあなんておもっていた。
わたし音量の微細な違いなんてわからんのだ。
まあ、当初から報告があったので、これマルチスレッドにしたときにおかしゅうなった、とおもって、シングルスレッドになおして、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の中身をみて、ちょっと怪訝に思った。


return Mix_PlayChannel(chunkChannel-1, chunk, loopflag)
? y4d_result.SDL_error:y4d_result.no_error;
Mix_PlayChannelは成功したときに 0 を返し、失敗したときに 非0 を返すのか?
SDL_mixerのリファレンスをみると、

Returns: the channel the sample is played on. On any errors, -1 is returned.

と書いてある。
そ、そのエラーチェックちごうとる...


return Mix_PlayChannel(chunkChannel-1, chunk, loopflag) == -1
? y4d_result.SDL_error:y4d_result.no_error;
ボリュームの設定に関しても、同様のエラーチェックのバグが入っていたので、すぐにyaneSDK4thスレにいって報告だ!

soundはあまり精査されていないのかもしれないゾ、と思い、
もしかしてボリュームに関してもバグがあるのか...?

SDL_mixerのリファレンスをみていて、ちょっと気になる関数があった。

  1. int Mix_Volume(int channel, int volume)
  2. int Mix_VolumeChunk(Mix_Chunk *chunk, int volume)

な、なんで二つあんの?
SDL_mixerの文献は英語しかみつからなかったので(日本の中の人がんがれ!)、辞書片手に解読してみたのだけど、どうも的を得ない。実際は、chunkのボリュームしかいじっていないし、チャンネルボリュームは変更していない。
チャンネルのボリュームが下がることによって、chunkのボリュームも引きずられて下がるのかもな。
そこで試しに、再生時に全チャンネルを最大音量にするコードを書き入れてみた。


// すべてのチャンネルのボリュームを最大にする
Mix_Volume(-1, 128);
実行してみると、確かに音量が良い調子である。ふらふらしていた、音量が安定している。

これでええのか?
もしかしたら、わたしsoundクラスいじっているときにエンバグしたんか?
でも、まあええわ。
テスト重ねて、検証してみます。