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

问题描述 投票:0回答:1

我正在创建一个简单的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();
}

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()然后以错误的顺序释放资源来重现。

c++ mp3 fmod
1个回答
1
投票

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

“关闭渲染使用此系统创建的对象无效。确保在调用之前释放任何Sound,ChannelGroup,Geometry和DSP对象。”

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

© www.soinside.com 2019 - 2024. All rights reserved.