ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Soundのバグその2

チャンネルをおまかせにしたサウンドを再生停止を繰り返していると、停止出来なくなったりする原因が分かった。
Play()の中ではすでに鳴っている場合があるので、Stop()を呼んでからPlayChunk()を呼んでいる。このときStop()ではSDL.Mix_Pause()を使って一時停止させている。そしてPlayChunk()の中で空きチャンクをSDL.Mix_Playing()を使って探すわけだが、SDL.Mix_Playing()は一時停止の場合でも再生中と判定している。そのためループするようなサウンドの場合は空きチャンクが足りなくなってしまう。
対処法としては、SDL.Mix_Pause()の部分をソースにもコメントとして書かれていたようにSDL.Mix_HaltChannel()を使うように変更すれば良いかな。
あと、空きチャンクが無かった場合の処理も修正してみた。0番を潰すため chunk[0] = s を追加。

public int GetEmptyChunk(Sound s){
    if (NoSound) return 0;
    for (int i = 0; i < 8; ++i) {
        if (SDL.Mix_Playing(i) == 0)
        {
            chunk[i] = s;
            return i;
        }
    }
    chunk[0] = s; // ←追加
    return 0; // 空きが無いので0番を潰すかぁ..(´Д`)
}