我一直在使用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)
一次初始化的指針。
但是,我仍然得到相同的錯誤。直到程序即將終止,錯誤纔會發生。
任何幫助,將不勝感激。
看起來像SFML在關閉時沒有正確清理OpenAL資源。 Alc.h是OpenAL util頭,所以這是一個可能的錯誤。 –
我可以很好地想象,有一個後臺線程爲渲染處理程序提供服務,並且在停止音頻輸出之前您剛剛從地板下拉出地毯。 – marko