c++ - 为什么我的代码没有完成 Sound::release() 调用?
问题描述
我正在创建一个简单的 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();
}
自由声音()和自由系统():
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应该解释行为:
“关闭渲染使用此系统创建的对象无效。请确保在调用此之前释放任何声音、通道组、几何和 DSP 对象。”。
System::close 由System::release调用,因此在组件遇到问题之前释放系统时。正如您所发现的那样,您只需在发布系统之前释放所有内容。
推荐阅读
- c - 代码在 Geany IDE 中工作,但在 HackerRanks 中出现分段错误。这样做的技术原因是什么?
- c# - 在表单上设计面板
- python-3.x - 故障检测的声音分析
- c# - 一键,两种不同的动作 asp.net core mvc
- jekyll - 如何使用页面变量作为数据文件名从子文件夹动态加载 jekyll 数据
- java - 如何使循环不那么混乱并按预期运行
- javascript - 谷歌图表数据表过滤日期
- html - 如何使用 CSS-grid 创建以下布局
- traefik - Docker swarm 模式、搬运工、traefik
- docker - 如果我在 Windows 主机上,是否需要 Vagrant 才能使用 Docker Linux 映像?