为什么我的代码没有完成 Sound::release() 调用?

Why is my code not completing the Sound::release() call?

我正在创建一个简单的 MP3 播放器并使用 FMOD Core API 来管理音频。我写了一个简单的程序来测试 play() 函数。 我有两个函数 freeSound()freeSystem() 分别释放 soundsystem 句柄。两者都是通过析构函数中的函数 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 调用,因此在组件发布之前发布系统时您会遇到问题。正如您发现自己在发布系统之前释放所有内容一样。