2017-07-30 69 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遊戲開發書的源代碼 - 你可以找到很多有用的材料,在SFML Github上。

因此,在你的情況下,你可以創建該類型的對象:ResourceHolder<sf::SoundBuffer, ID> mSoundHolder;其中ID是一些enum類型來標識每個聲音。

然後發揮你的聲音只需創建類型sf::Sound s的對象,並使用s.setBuffer(mSoundHolder.getResource(<YOUR_ID>)s.play()

確保sf::Sound不是本地對象,因爲它不會播放,因爲它會自動快速銷燬。然後在課堂上創建它,或者如果您想在同一個創建中播放更多聲音,例如,則可以播放聲音。要檢查它完成播放,請使用:sound.getStatus() == sf::Sound::Stopped比較,然後從列表中刪除聲音。

您可以創建sf::Sound對象sf::SoundBuffer使用std::list有什麼用。然後,您只需在列表對象上使用emplace_back並將您的sf::SoundBuffer作爲參數。

希望它有幫助。

+0

「Sound」或「SoundBuffer」都不是本地的。無論如何,這並不能真正回答我的問題...... – Dovahkiin