首页 > 解决方案 > 为什么我的代码没有完成 Sound::release() 调用?

问题描述

我正在创建一个简单的 MP3 播放器并使用 FMOD Core API 来管理音频。我写了一个简单的程序来测试这个play()功能。我有两个功能freeSound(),分别freeSystem()释放soundsystem手柄。两者都是通过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()然后以错误的顺序释放资源来重现。

标签: c++mp3fmod

解决方案


FMOD 参考FMOD System::close应该解释行为:

“关闭渲染使用此系统创建的对象无效。请确保在调用此之前释放任何声音、通道组、几何和 DSP 对象。”。

System::close 由System::release调用,因此在组件遇到问题之前释放系统时。正如您所发现的那样,您只需在发布系统之前释放所有内容。


推荐阅读