我正在创建一个简单的MP3播放器并使用FMOD Core API来管理音频。我写了一个简单的程序来测试play()
函数。我有两个函数freeSound()
和freeSystem()
分别释放sound
和system
手柄。两者都是通过析构函数中的cleanUp()
函数调用的。
我已经使用gdb
弄清楚由于某种原因,当调用析构函数时,我的程序卡在Sound::release()
中的freeSound()
调用中。
只有在freeSystem()
之前调用freeSound()
时才会出现此问题。只需先调用后者就可以解决这个问题。
我分享的代码很少,因为我认为可以显示这个问题。如果需要更多/更少,我将添加/删除。
main()函数:
int main()
{
musicPlayer p{"music.mp3"};
std::cout << "load success\n";
p.play();
std::cout << "press enter to quit\n";
std::cin.get();
}
类声明(仅包括相关位):
class musicPlayer
{
private:
FMOD::System *m_system = nullptr;
FMOD::Sound *m_sound = nullptr;
/*Some more functions*/
void cleanUp();
void freeSystem();
void freeSound();
public:
~musicPlayer();
/*Some more functions*/
};
析构函数:
musicPlayer::~musicPlayer()
{
cleanUp();
m_channel = nullptr;
}
清理():
void musicPlayer::cleanUp()
{
freeSystem();
freeSound();
}
freeSound()和freeSystem():
void musicPlayer::freeSystem()
{
if(m_system == nullptr)
return;
FMOD_RESULT result = m_system -> release();
if(result != FMOD_OK){
std::cerr << "freeSystem() Error: " << FMOD_ErrorString(result) << "\n";
return;
}
else
m_system = nullptr;
}
void musicPlayer::freeSound()
{
if(m_sound == nullptr)
return;
FMOD_RESULT result = m_sound -> release();
if(result != FMOD_OK){
std::cerr << "freeSound() Error: " << FMOD_ErrorString(result) << "\n";
return;
}
else
m_sound = nullptr;
}
我希望音频停止播放,并且当按下enter键时程序立即退出。
相反,在按Enter键时,音频停止,程序不会退出。
更新:
早些时候,我写道:
Blockquote我写了很少的测试程序,我在
System::release()
之前调用了Sound::release()
。此类程序不会出现此问题。
我错了。这个问题可以通过播放声音,调用cin.get()
然后以错误的顺序释放资源来重现。
FMOD参考FMOD System::close应解释行为:
“关闭渲染使用此系统创建的对象无效。确保在调用之前释放任何Sound,ChannelGroup,Geometry和DSP对象。”
System :: close由System::release调用,因此在组件之前释放系统时会遇到问题。正如您在发布系统之前发现的那样,只需释放所有内容。