首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL_Mixer: crash Mix_FreeMusic();

SDL_Mixer: crash Mix_FreeMusic();
EN

Stack Overflow用户
提问于 2011-12-26 11:31:04
回答 3查看 1.5K关注 0票数 3

我正在使用SDL_mixer在SDL中完成我的项目。一切听起来都不错,但当我试图退出的时候,我的应用程序就崩溃了。我认为这与Mix_FreeMusic函数有关(我在使用了许多断点之后发现了这一点)--我在下面的代码中标记了这一行:

main.cpp中,函数RunEverything

代码语言:javascript
复制
//sound-related code:
if(SDL_Init(SDL_INIT_EVERYTHING) == -1) { printf("error: %s\n", SDL_GetError()); return NULL; }

int audio_rate = 22050;
Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */
int audio_channels = 2;
int audio_buffers = 4096;
if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers)) { printf("Unable to open audio!\n"); return NULL; }

稍后在main.cpp

代码语言:javascript
复制
int Screen_MainMenu(SDL_Surface *screen)
{
    SDL_Event event;
    CL_Menu Menu;
    /* ... */
    Mix_AllocateChannels(2);
    Mix_PlayMusic(Menu.mMusic, -1);

    while(quit==false) 
    {
        // some time-management, drawing stuff on screen etc., nothing audio-related

        while(SDL_PollEvent(&event))    
        {
            switch(event.type) 
            {
                case SDL_KEYDOWN:
                        switch(event.key.keysym.sym)
                        {
                        case SDLK_ESCAPE:
                            quit = true;
                            break;
                        case SDLK_UP:
                            Menu.kKlik = Mix_PlayChannel(-1, Menu.mKlik, 0);
                            break;
                        case SDLK_DOWN:
                            Menu.kKlik = Mix_PlayChannel(-1, Menu.mKlik, 0);
                            break;
                        }
                    break;
                case SDL_QUIT:
                    quit = true;
                    break;
            }
        }
    }
    Menu.FreeMem();
    return 0;

class.h.h

代码语言:javascript
复制
class CL_Menu
{
public:
    // some SDL_Surface & TTF_Font
    Mix_Music *mMusic;
    int kKlik;
    Mix_Chunk *mKlik;

    CL_Menu();
    void FreeMem();
};

class.cpp

代码语言:javascript
复制
CL_Menu::CL_Menu()
{
//loading .png & .ttf
    mMusic = Mix_LoadMUS("MP3/Sirio-Dance_Of_Stars.mp3");
    mKlik = Mix_LoadWAV("MP3/klik.wav");
};

void CL_Menu::FreeMem()
{
    //while(Mix_Playing(kKlik) != 0);
    Mix_HaltChannel(kKlik);
    Mix_HaltMusic();    
    Mix_FreeChunk(mKlik);   

// CloseFont & FreeSurface

    Mix_HaltMusic();
    SDL_Delay(100);
    Mix_FreeMusic(mMusic); // <-- that line probably causes crash
    mMusic = NULL;
};

我正在使用win7 x64、2010和最新的SDL库。我还注意到,当我在10-15秒内关闭我的程序时,它可以正常工作。只有当它运行20-30秒时,我才会崩溃。

编辑:如果它是重要的,我的mp3是相当大的-大约9MB (192 kb/s)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-05 22:32:20

最后,我设法弄明白了,所以我正在编写一个在我的情况下有效的解决方案。我不得不将我的.mp3文件转换为.ogg。仅此而已。可能是mp3文件以某种方式损坏了,或者是SDL库中的一个错误。

票数 3
EN

Stack Overflow用户

发布于 2017-01-08 12:15:47

就在不久前我也遇到了同样的问题。

如果有人在寻找解决方案,而.ogg转换不起作用,下面是一些您可以检查的快速提示:

正确的去初始化顺序

在我个人的例子中,SDL_mixer在取消音乐文件分配之前退出,给出Free_Music()错误不是因为文件被破坏了,而是因为SDL_mixer已经关闭并仍在被调用。

您可以使用Mix_QueryMusic(0,0,0)的返回值来查看您的音频是否仍然处于打开状态并可供使用,或者是否存在错误(int 0)。

如果您在某个地方使用包装器(您将智能指针指向该包装器),这种情况可能会很快发生。在Mix_Quit()Mix_AudioClose()**!**或之前,确保所有智能指针都超出了范围,如果您深入了解指针的所有权,通常可以这样做。在我的例子中,只有AudioManager类使用shared_ptr,其余的类使用weak_ptr。我只是告诉AudioManager类在关闭音频或退出Mix_Music之前先去初始化。

正确设置标志并使用AudioClose

其次,查看您的Mix_Init标志是否包括所有应该打开的文件,如Mix_INIT_MP3Mix_INIT_OGG

此外,您还应该关闭您的音频通过Mix_AudioClose()在您的程序结束。

票数 2
EN

Stack Overflow用户

发布于 2017-04-06 07:13:49

我也有类似的问题,只有C。Mix_Quit()Mix_FreeMusic()之前被调用。一旦我把一切都安排好了,问题就解决了。

我也对Mix_Quit()Mix_CloseAudio()感到困惑。从我的研究中我发现,您调用的每个Mix_Quit()都调用一次Mix_Init(),在使用Mix_Quit()之后只调用Mix_CloseAudio()一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8635321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档