より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Xamarin+CocosSharpで効果音が鳴らない「Failed to generate OpenAL data buffer」

Xamarin+CocosSharpでデバッグしているとVisual Studioで以下のようなメッセージにふと気付きました。

f:id:rimever:20200111181933p:plain

github.com

結構前からあるバグで、CCAudioEngine.PlayEffectを1024回実行すると「Failed to generate OpenAL data buffer」となって正しく再生されなくなるようです。

確かに、効果音が鳴らなくなることがあるなと感じてはいましたが、あまり考えてませんでした。

nazenaninadesico.hatenablog.jp

上記サイトによると1024回呼び出したら、CCAudioEngineをEndして、GC.Collectすると解消されるようです。

実装すると下記のような感じですかね。

    /// <summary>
    /// Xamarin向けに実装した効果音再生サービスです。
    /// </summary>
    public class SoundService
    {
        CCAudioEngine _audioEngine = new CCAudioEngine();
        private int _audioPlayCount;

        /// <remarks>
        /// <see cref="CCAudioEngine.PlayEffect(string,bool)"/>を1024回実行すると「Failed to generate OpenAL data buffer」となるので1024回ごとにリセットする。
        /// </remarks>
        public void Play(string name, bool isLoop = false)
        {
            if (_audioPlayCount > 1024)
            {
                ResetAudioEngine();
            }

            _audioPlayCount++;
            _audioEngine.PlayEffect(name, isLoop);
        }

        /// <summary>
        /// CCAudioEngineをリセットします。
        /// </summary>
        /// <remarks>
        /// 適宜呼び出されますが、シーンの切り替わるタイミングで呼び出してリセットしてください。
        /// </remarks>
        public void ResetAudioEngine()
        {
            _audioEngine.End();
            _audioEngine.Dispose();
            _audioEngine = null;
            System.GC.Collect();
            _audioEngine = new CCAudioEngine();
            _audioPlayCount = 0;
        }
    }

参考サイト

nazenaninadesico.hatenablog.jp