This project has moved. For the latest updates, please go here.

有时候播放MP3格式音乐的时候程序会崩溃

Mar 11, 2013 at 2:25 PM
非常小的概率,出现在音乐切换的时候,好像都是战斗结束的时候,然后程序就崩溃了
不知为什么
Mar 13, 2013 at 12:48 PM
Image
今天调试的时候又遇到了,截图在这里,出现在:战斗失败播放完战斗失败音乐后,按键出错
Coordinator
Mar 13, 2013 at 3:55 PM
多谢指出。

近日加班加得厉害,暂时没时间测试,可否帮忙看下这么改是否可解决问题?
Index: sound.c
===================================================================
--- sound.c (revision 85556)
+++ sound.c (working copy)
@@ -212,10 +212,10 @@
    if (!g_fNoMusic)
    {
 #ifdef PAL_HAS_MP3
+      SDL_mutexP(gSndPlayer.lock);
+
       if (gSndPlayer.pMP3 != NULL)
       {
-         SDL_mutexP(gSndPlayer.lock);
-
          mad_getSamples(gSndPlayer.pMP3, stream, len);
 
          if (!mad_isPlaying(gSndPlayer.pMP3) && gSndPlayer.fMP3Loop)
@@ -225,9 +225,9 @@
 
             mad_getSamples(gSndPlayer.pMP3, stream, len);
          }
+      }
 
-         SDL_mutexV(gSndPlayer.lock);
-      }
+      SDL_mutexV(gSndPlayer.lock);
 #endif
       RIX_FillBuffer(stream, len);
    }
@@ -644,6 +644,8 @@
 #endif
 
 #ifdef PAL_HAS_MP3
+   SDL_mutexP(gSndPlayer.lock);
+
    if (gSndPlayer.pMP3 != NULL)
    {
       if (iNumRIX == gSndPlayer.iCurrentMP3 && !g_fNoMusic)
@@ -651,18 +653,16 @@
          return;
       }
 
-      SDL_mutexP(gSndPlayer.lock);
-
       mad_stop(gSndPlayer.pMP3);
       mad_closeFile(gSndPlayer.pMP3);
 
       gSndPlayer.pMP3 = NULL;
-
-      SDL_mutexV(gSndPlayer.lock);
    }
 
    gSndPlayer.iCurrentMP3 = -1;
 
+   SDL_mutexV(gSndPlayer.lock);
+
    if (iNumRIX > 0)
    {
       SDL_mutexP(gSndPlayer.lock);
Mar 15, 2013 at 4:18 PM
Edited Mar 15, 2013 at 4:23 PM
这样改了貌似不直接跳出了。。。
但是音乐会偶尔会卡住不能播放(出现在场景切换的时候。比如从试练窟的一层爬楼梯上了一层,这时候音乐是没有变的,但是有时候(不总是)会卡住放不了,不是静音那种,是卡住了),这个时候没有直接崩掉,还可以继续游戏,但是点关闭按钮这时候不能正常关闭
Coordinator
Mar 16, 2013 at 3:21 AM
Edited Mar 16, 2013 at 8:47 AM
多谢,我明天再看看
Coordinator
Mar 16, 2013 at 8:47 AM
Edited Mar 16, 2013 at 8:47 AM
在公司看了下,知道怎么回事了,低级错误啊。。。
明天可以的话我自己再测下
     if (iNumRIX == gSndPlayer.iCurrentMP3 && !g_fNoMusic)
     {
+      SDL_MutexV(gSndPlayer.lock);
        return;
     }