【发布时间】:2011-12-26 11:31:04
【问题描述】:
我正在使用 SDL_mixer 处理我的 SDL 项目。一切听起来都不错,但是当我尝试退出时,我的应用程序崩溃了。我认为它与 Mix_FreeMusic 函数有关(我在使用大量断点后发现了这一点) - 我在下面的代码中标记了该行:
在 main.cpp 中,函数 RunEverything,
//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 中:
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中:
class CL_Menu
{
public:
// some SDL_Surface & TTF_Font
Mix_Music *mMusic;
int kKlik;
Mix_Chunk *mKlik;
CL_Menu();
void FreeMem();
};
在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 相当大 - 大约 9 MB (192 kb/s)
【问题讨论】:
-
不是答案,但
Mix_FreeMusic()记录为在必要时暂停音乐。如果删除对Mix_HaltMusic()和SDL_Delay()的调用,问题是否仍然存在? -
我知道这一点,但“出于安全原因”我决定自己停止音乐。删除这些行或将 SDL_Delay 增加到 10 秒并不能解决问题。
-
您的 SDL lib 如何处理您的 mp3 ?你链接的库(我猜是蹩脚的)好吗?