2017-07-30 15 views
0

SFMLを長年使用していましたが、今までAudioモジュールを使用したことはありません。sf :: SoundBufferを宣言すると、終了時にプログラムがクラッシュする

私は

class Deck : public sf::Drawable 
{ 
public: 
    ... 

private: 
    sf::Sound shuffleSound; 

    ... 

    static sf::SoundBuffer soundBuffer; 
}; 

...私の最初のアプローチはこれに類似していたので、私のゲームに効果音を追加したいと計画が一度soundBufferを初期化し、各オブジェクトのコンストラクタでshuffleSound.setBuffer(soundBuffer);を行うことでした。しかし、私はこのエラーを得た:このエラーをグーグル後

AL lib: (EE) alc_cleanup: 1 device not closed 

Assertion failed: (lockret == althrd_success), function LockLists, file /Users/m/Desktop/tmp/openal/build_deps/openal-soft-openal-soft-1.17.2/Alc/ALc.c, line 776. 
(lldb) 

を、私は、グローバルスコープでSFMLリソースを置くことではないどこかについては曖昧なメッセージを見ました。 static変数は、エラーの原因となった考え出す、私はこの試みた:

class Deck : public sf::Drawable 
{ 
public: 
    ... 

private: 
    sf::Sound shuffleSound; 

    ... 

    static std::unique_ptr<sf::SoundBuffer> bufptr; 
}; 

をし、オブジェクトが空だった場合make_uniqueを呼び出し、その後、コンストラクタでshuffleSound.setBuffer(*bufptr)を行うことによって、一度のポインタを初期化します。

しかし、私はまだ同じエラーが発生します。プログラムが終了しようとするまで、エラーは発生しません。

ご協力いただければ幸いです。

+0

閉じるときにSFMLがOpenALリソースを正しくクリーンアップしないように見えます。 Alc.hはOpenALのutilヘッダーなので、これはバグかもしれません。 –

+0

レンダリングハンドラにサービスを提供するバックグラウンドスレッドがあり、オーディオ出力を停止する前にラグを抜いてしまったと思います。 – marko

答えて

0

私の評判が低すぎるため、コメントを追加できませんので、私は答えを書くでしょう。

最初は、すべてのリソースを保持するクラスを作成することをお勧めします。 を確認してください。https://github.com/SFML/SFML-Game-Development-Book/tree/master/02_Resources/Include/Book

SFML Game Developmentの書籍のソースコードがあります。SFML Githubには、多くの参考資料があります。

あなたのケースでは、そのタイプのクラスのオブジェクトを作成することができます。ResourceHolder<sf::SoundBuffer, ID> mSoundHolder;ここで、IDはそれぞれのサウンドを識別するためにenumタイプです。

あなたのサウンドを再生するには、タイプsf::Sound sのオブジェクトを作成し、s.setBuffer(mSoundHolder.getResource(<YOUR_ID>)s.play()を使用します。

はローカルオブジェクトではないことを確認します。自動的に素早く破棄されるため、再生されないためです。それから、クラスでそれを作成するか、同じ作成でより多くのサウンドを再生したい場合は、例えばstd::list<sf::Sound> soundsでiterareでサウンドを再生します。再生が終了したことを確認するには、sound.getStatus() == sf::Sound::Stoppedを使用してリストからサウンドを削除します。

sf::Soundオブジェクトはsf::SoundBufferから作成できます。std::listを使用すると便利です。次に、単にリストオブジェクトにemplace_backを使用し、sf::SoundBufferを引数として渡すことができます。

希望します。

+0

'Sound'も' SoundBuffer'もローカルではありません。とにかく、これは本当に私の質問に答えることはありません... – Dovahkiin

関連する問題