debug bgm player, sound code refactoring
authornotaz <notasas@gmail.com>
Thu, 16 Oct 2008 13:32:55 +0000 (13:32 +0000)
committernotaz <notasas@gmail.com>
Thu, 16 Oct 2008 13:32:55 +0000 (13:32 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@598 be3aeb3a-fb24-0410-a615-afba39da0efa

common/emu.h
common/menu.c
gp2x/emu.c
gp2x/gp2x.h
psp/emu.c

index 555df3a..e05f365 100644 (file)
@@ -69,7 +69,6 @@ void  emu_textOut16(int x, int y, const char *text);
 char *emu_makeRomId(void);
 void  emu_getGameName(char *str150);
 void  emu_findKeyBindCombos(void);
-void  emu_forcedFrame(int opts);
 void  emu_changeFastForward(int set_on);
 void  emu_RunEventsPico(unsigned int events);
 void  emu_DoTurbo(int *pad, int acts);
@@ -77,9 +76,14 @@ void  emu_packConfig(void);
 void  emu_unpackConfig(void);
 void  emu_shutdownMCD(void);
 
+/* not in common */
 extern const char * const keyNames[];
 void  emu_prepareDefaultConfig(void);
 void  emu_platformDebugCat(char *str);
+void  emu_forcedFrame(int opts);
+void  emu_startSound(void);
+void  emu_endSound(void);
+void  emu_waitSound(void);
 
 #ifdef __cplusplus
 } // extern "C"
index 1becb83..241af9f 100644 (file)
@@ -343,6 +343,20 @@ int me_process(menu_entry *entries, int count, menu_id id, int is_next)
 \r
 void SekStepM68k(void);\r
 \r
+static void mplayer_loop(void)\r
+{\r
+       emu_startSound();\r
+\r
+       while (1)\r
+       {\r
+               PDebugZ80Frame();\r
+               if (read_buttons_async(BTN_NORTH)) break;\r
+               emu_waitSound();\r
+       }\r
+\r
+       emu_endSound();\r
+}\r
+\r
 static void draw_text_debug(const char *str, int skip, int from)\r
 {\r
        const char *p;\r
@@ -415,7 +429,7 @@ void debug_menu_loop(void)
                }\r
                menu_draw_end();\r
 \r
-               inp = read_buttons(BTN_EAST|BTN_SOUTH|BTN_WEST|BTN_L|BTN_R|BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT);\r
+               inp = read_buttons(BTN_EAST|BTN_SOUTH|BTN_WEST|BTN_NORTH|BTN_L|BTN_R|BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT);\r
                if (inp & BTN_SOUTH) return;\r
                if (inp & BTN_L) { mode--; if (mode < 0) mode = 3; }\r
                if (inp & BTN_R) { mode++; if (mode > 3) mode = 0; }\r
@@ -423,6 +437,10 @@ void debug_menu_loop(void)
                {\r
                        case 0:\r
                                if (inp & BTN_EAST) SekStepM68k();\r
+                               if (inp & BTN_NORTH) {\r
+                                       while (inp & BTN_NORTH) inp = read_buttons_async(BTN_NORTH);\r
+                                       mplayer_loop();\r
+                               }\r
                                if ((inp & (BTN_WEST|BTN_LEFT)) == (BTN_WEST|BTN_LEFT)) {\r
                                        mkdir("dumps", 0777);\r
                                        PDebugDumpMem();\r
index 77bd83e..8e726e3 100644 (file)
@@ -665,6 +665,46 @@ static void updateSound(int len)
                gp2x_sound_write(PsndOut, len<<1);\r
 }\r
 \r
+void emu_startSound(void)\r
+{\r
+       static int PsndRate_old = 0, PicoOpt_old = 0, pal_old = 0;\r
+       int target_fps = Pico.m.pal ? 50 : 60;\r
+\r
+       PsndOut = NULL;\r
+\r
+       // prepare sound stuff\r
+       if (currentConfig.EmuOpt & 4)\r
+       {\r
+               int snd_excess_add;\r
+               if (PsndRate != PsndRate_old || (PicoOpt&0x20b) != (PicoOpt_old&0x20b) || Pico.m.pal != pal_old ||\r
+                               ((PicoOpt&0x200) && crashed_940)) {\r
+                       PsndRerate(Pico.m.frame_count ? 1 : 0);\r
+               }\r
+               snd_excess_add = ((PsndRate - PsndLen*target_fps)<<16) / target_fps;\r
+               printf("starting audio: %i len: %i (ex: %04x) stereo: %i, pal: %i\n",\r
+                       PsndRate, PsndLen, snd_excess_add, (PicoOpt&8)>>3, Pico.m.pal);\r
+               gp2x_start_sound(PsndRate, 16, (PicoOpt&8)>>3);\r
+               gp2x_sound_volume(currentConfig.volume, currentConfig.volume);\r
+               PicoWriteSound = updateSound;\r
+               update_volume(0, 0);\r
+               memset(sndBuffer, 0, sizeof(sndBuffer));\r
+               PsndOut = sndBuffer;\r
+               PsndRate_old = PsndRate;\r
+               PicoOpt_old  = PicoOpt;\r
+               pal_old = Pico.m.pal;\r
+       }\r
+}\r
+\r
+void emu_endSound(void)\r
+{\r
+}\r
+\r
+/* wait until we can write more sound */\r
+void emu_waitSound(void)\r
+{\r
+       // don't need to do anything, writes will block by themselves\r
+}\r
+\r
 \r
 static void SkipFrame(int do_audio)\r
 {\r
@@ -776,8 +816,7 @@ static void tga_dump(void)
 \r
 void emu_Loop(void)\r
 {\r
-       static int gp2x_old_clock = 200;\r
-       static int PsndRate_old = 0, PicoOpt_old = 0, EmuOpt_old = 0, pal_old = 0;\r
+       static int gp2x_old_clock = 200, EmuOpt_old = 0;\r
        char fpsbuff[24]; // fps count c string\r
        struct timeval tval; // timing\r
        int pframes_done, pframes_shown, pthissec; // "period" frames, used for sync\r
@@ -821,29 +860,7 @@ void emu_Loop(void)
        target_frametime = 1000000/target_fps;\r
        reset_timing = 1;\r
 \r
-       // prepare sound stuff\r
-       if (currentConfig.EmuOpt & 4)\r
-       {\r
-               int snd_excess_add;\r
-               if (PsndRate != PsndRate_old || (PicoOpt&0x20b) != (PicoOpt_old&0x20b) || Pico.m.pal != pal_old ||\r
-                               ((PicoOpt&0x200) && crashed_940)) {\r
-                       PsndRerate(Pico.m.frame_count ? 1 : 0);\r
-               }\r
-               snd_excess_add = ((PsndRate - PsndLen*target_fps)<<16) / target_fps;\r
-               printf("starting audio: %i len: %i (ex: %04x) stereo: %i, pal: %i\n",\r
-                       PsndRate, PsndLen, snd_excess_add, (PicoOpt&8)>>3, Pico.m.pal);\r
-               gp2x_start_sound(PsndRate, 16, (PicoOpt&8)>>3);\r
-               gp2x_sound_volume(currentConfig.volume, currentConfig.volume);\r
-               PicoWriteSound = updateSound;\r
-               update_volume(0, 0);\r
-               memset(sndBuffer, 0, sizeof(sndBuffer));\r
-               PsndOut = sndBuffer;\r
-               PsndRate_old = PsndRate;\r
-               PicoOpt_old  = PicoOpt;\r
-               pal_old = Pico.m.pal;\r
-       } else {\r
-               PsndOut = NULL;\r
-       }\r
+       emu_startSound();\r
 \r
        // prepare CD buffer\r
        if (PicoAHW & PAHW_MCD) PicoCDBufferInit();\r
index f9aa851..3d0db13 100644 (file)
@@ -24,6 +24,7 @@ void gp2x_pd_clone_buffer2(void);
 void gp2x_start_sound(int rate, int bits, int stereo);\r
 void gp2x_sound_write(void *buff, int len);\r
 void gp2x_sound_volume(int l, int r);\r
+void gp2x_sound_sync(void);\r
 \r
 /* input */\r
 unsigned long gp2x_joystick_read(int allow_usb_joy);\r
index 91bd563..015c320 100644 (file)
--- a/psp/emu.c
+++ b/psp/emu.c
@@ -609,7 +609,7 @@ static void sound_init(void)
                lprintf("sceKernelCreateThread failed: %i\n", thid);
 }
 
-static void sound_prepare(void)
+void emu_startSound(void)
 {
        static int PsndRate_old = 0, PicoOpt_old = 0, pal_old = 0;
        int ret, stereo;
@@ -648,7 +648,7 @@ static void sound_prepare(void)
        }
 }
 
-static void sound_end(void)
+void emu_endSound(void)
 {
        int i;
        if (samples_done == 0)
@@ -667,6 +667,14 @@ static void sound_end(void)
        sceAudio_5C37C0AE();
 }
 
+/* wait until we can write more sound */
+void emu_waitSound(void)
+{
+       // TODO: test this
+       while (!sound_thread_exit && samples_made - samples_done > samples_block * 4)
+               psp_msleep(10);
+}
+
 static void sound_deinit(void)
 {
        sound_thread_exit = 1;
@@ -944,7 +952,7 @@ void emu_Loop(void)
        PsndOut = NULL;
        if (currentConfig.EmuOpt & 4)
        {
-               sound_prepare();
+               emu_startSound();
        }
 
        sceDisplayWaitVblankStart();
@@ -1090,8 +1098,8 @@ void emu_Loop(void)
        if (PicoAHW & PAHW_MCD) PicoCDBufferFree();
 
        if (PsndOut != NULL) {
+               emu_endSound();
                PsndOut = NULL;
-               sound_end();
        }
 
        // save SRAM