为什么我的代码没有完成 Sound::release() 调用?
Why is my code not completing the Sound::release() call?
我正在创建一个简单的 MP3 播放器并使用 FMOD Core API 来管理音频。我写了一个简单的程序来测试 play()
函数。
我有两个函数 freeSound()
和 freeSystem()
分别释放 sound
和 system
句柄。两者都是通过析构函数中的函数 cleanUp()
调用的。
我用 gdb
发现由于某种原因,当调用析构函数时,我的程序卡在了 freeSound()
的 Sound::release()
调用中。
只有在 freeSound()
之前调用 freeSystem()
时才会出现此问题。只需先调用后者即可解决此问题。
我分享了尽可能少的代码来说明这个问题。如果需要 more/less 我会 add/remove.
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 声明(仅包含相关位):
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;
}
cleanUp():
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 时,音频停止并且程序不会退出。
更新:
早些时候,我写道:
Blockquote
I have written little test programs where I have called System::release()
before Sound::release()
. Such programs do not exhibit this issue.
我错了。可以通过播放声音、调用 cin.get()
然后以错误的顺序释放资源来重现该问题。
FMOD 参考 FMOD System::close 应该解释行为:
"Closing renders objects created with this System invalid. Make sure any Sound, ChannelGroup, Geometry and DSP objects are released before calling this."。
System::close 由 System::release 调用,因此在组件发布之前发布系统时您会遇到问题。正如您发现自己在发布系统之前释放所有内容一样。
我正在创建一个简单的 MP3 播放器并使用 FMOD Core API 来管理音频。我写了一个简单的程序来测试 play()
函数。
我有两个函数 freeSound()
和 freeSystem()
分别释放 sound
和 system
句柄。两者都是通过析构函数中的函数 cleanUp()
调用的。
我用 gdb
发现由于某种原因,当调用析构函数时,我的程序卡在了 freeSound()
的 Sound::release()
调用中。
只有在 freeSound()
之前调用 freeSystem()
时才会出现此问题。只需先调用后者即可解决此问题。
我分享了尽可能少的代码来说明这个问题。如果需要 more/less 我会 add/remove.
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 声明(仅包含相关位):
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;
}
cleanUp():
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 时,音频停止并且程序不会退出。
更新:
早些时候,我写道:
Blockquote I have written little test programs where I have called
System::release()
beforeSound::release()
. Such programs do not exhibit this issue.
我错了。可以通过播放声音、调用 cin.get()
然后以错误的顺序释放资源来重现该问题。
FMOD 参考 FMOD System::close 应该解释行为:
"Closing renders objects created with this System invalid. Make sure any Sound, ChannelGroup, Geometry and DSP objects are released before calling this."。
System::close 由 System::release 调用,因此在组件发布之前发布系统时您会遇到问题。正如您发现自己在发布系统之前释放所有内容一样。