SDL_Mixer: crash Mix_FreeMusic();
SDL_Mixer: crash Mix_FreeMusic();
我正在SDL中工作,使用SDL_mixer。一切听起来都很好,但当我试图退出时,我的应用程序崩溃了。我认为这与Mix_FreeMusic函数有关(我在使用了很多断点后发现了这一点)-我在下面的代码中标记了那行:
在main.cpp中,函数RunEverything
//sound-related code:
if(SDL_Init(SDL_INIT_EVERYTHING) == -1) { printf("error: %sn", 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:
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;
在<<p> strong> class.h : class CL_Menu
{
public:
// some SDL_Surface & TTF_Font
Mix_Music *mMusic;
int kKlik;
Mix_Chunk *mKlik;
CL_Menu();
void FreeMem();
};
在<<p> strong> class.cpp : 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, Visual Studio 2010和最新的SDL库。我还注意到,当我在10-15秒内关闭程序时,它工作得很好。只有当它运行大约20-30秒时,我才会崩溃。
编辑:如果重要的话,我的mp3相当大——大约9mb (192kb/s)
最后我设法弄清楚了,所以我写了一个解决方案,在我的情况下工作。我必须将我的.mp3文件转换为。ogg。这就是全部。可能mp3文件被损坏了,或者是SDL库中的错误。
我实际上有同样的问题,就在不久前。
如果有人正在寻找解决方案,而.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_MP3
和Mix_INIT_OGG
。
此外,您还应该在程序结束时通过Mix_AudioClose()
关闭音频。
我有一个类似的问题,只有在c中Mix_Quit()
在Mix_FreeMusic()
之前被调用。一旦我把一切都安排妥当,问题就解决了。
我也对Mix_Quit()
和Mix_CloseAudio()
感到困惑。根据我的研究,我发现每调用一次Mix_Init()
,就调用一次Mix_Quit()
,并且在完成Mix_Quit()
之后,只调用一次Mix_CloseAudio()
。
- clCreateFromGLBuffer crash
- Protobuf ShortDebugString() crash
- Crash in boost::archive::text_iarchive in_archive {is} boost
- OpenCV Native Android cvtColor crash
- 通过调用 CreateRemoteThread 来弹出 dll:crash
- 获取stacktrace for Crash,而无需在调试器中运行该应用程序
- C++/Qt memcpy crash with QSharedMemory
- SDL_GetRendererInfo crash
- Python Numpy 方法对应于 C++ Eigen make crash
- Tesseract 3.02.02 Crash JRE
- Emscripten crash with mappedGlobals.find(name) != mappedGlob
- 在C 中导入.CSV文件:crash
- Qt threadred QOpenGLWidget crash
- Crash on curl_easy_perform() when uploading a file on CURL i
- 我可以从Crash Signature(Windows Crash Report)获取源代码吗?
- WinAPI EM_STREAMOUT crash
- JVM-Crash 在 JNI 中调用 ReleaseStringUTFChars,仅在 Windows 7 上,Win
- DirectX GetSystemMetrics Crash
- glBindBuffer crash - 使用 glew 实现 VBO
- Cocos2d-x Crash at setResponseCallback in Android