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@598 be3aeb3a-fb24-0410-a615-afba39da0efa

12 files changed:
pico/cd/pico.c
pico/debug.c
pico/debug.h
pico/pico.c
pico/pico_cmn.c
pico/pico_int.h
pico/sound/sound.c
platform/common/emu.h
platform/common/menu.c
platform/gp2x/emu.c
platform/gp2x/gp2x.h
platform/psp/emu.c

index 33899e4..b0b123c 100644 (file)
@@ -225,15 +225,6 @@ static __inline void update_chips(void)
 }
 
 
-static __inline void getSamples(int y)
-{
-  int len = PsndRender(0, PsndLen);
-  if (PicoWriteSound) PicoWriteSound(len);
-  // clear sound buffer
-  PsndClear();
-}
-
-
 #define PICO_CD
 #include "../pico_cmn.c"
 
index ac687f0..4751cf4 100644 (file)
@@ -2,6 +2,7 @@
 // (c) Copyright 2008 notaz, All rights reserved.
 
 #include "pico_int.h"
+#include "sound/ym2612.h"
 #include "debug.h"
 
 #define bit(r, x) ((r>>x)&1)
@@ -301,3 +302,43 @@ void PDebugDumpMem(void)
   }
 }
 
+void PDebugZ80Frame(void)
+{
+  int lines, line_sample;
+
+  if (Pico.m.pal) {
+    lines = 312;
+    line_sample = 68;
+  } else {
+    lines = 262;
+    line_sample = 93;
+  }
+
+  z80_resetCycles();
+  emustatus &= ~1;
+
+  if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80))
+    PicoSyncZ80(line_sample*488);
+  if (ym2612.dacen && PsndDacLine <= line_sample)
+    PsndDoDAC(line_sample);
+  if (PsndOut)
+    PsndGetSamples(line_sample);
+
+  if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80)) {
+    PicoSyncZ80(224*488);
+    z80_int();
+  }
+  if (ym2612.dacen && PsndDacLine <= 224)
+    PsndDoDAC(224);
+  if (PsndOut)
+    PsndGetSamples(224);
+
+  // sync z80
+  if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80))
+    PicoSyncZ80(Pico.m.pal ? 151809 : 127671); // cycles adjusted for converter
+  if (PsndOut && ym2612.dacen && PsndDacLine <= lines-1)
+    PsndDoDAC(lines-1);
+
+  timers_cycle();
+}
+
index 7d715ec..be819ee 100644 (file)
@@ -5,4 +5,5 @@ void PDebugShowSpriteStats(unsigned short *screen, int stride);
 void PDebugShowPalette(unsigned short *screen, int stride);
 void PDebugShowSprite(unsigned short *screen, int stride, int which);
 void PDebugDumpMem(void);
+void PDebugZ80Frame(void);
 
index 08ba510..e079f8a 100644 (file)
@@ -258,35 +258,6 @@ static __inline void SekRunM68k(int cyc)
 #endif\r
 }\r
 \r
-\r
-// to be called on 224 or line_sample scanlines only\r
-static __inline void getSamples(int y)\r
-{\r
-#if SIMPLE_WRITE_SOUND\r
-  if (y != 224) return;\r
-  PsndRender(0, PsndLen);\r
-  if (PicoWriteSound) PicoWriteSound(PsndLen);\r
-  PsndClear();\r
-#else\r
-  static int curr_pos = 0;\r
-\r
-  if(y == 224) {\r
-    if(emustatus & 2)\r
-         curr_pos += PsndRender(curr_pos, PsndLen-PsndLen/2);\r
-    else curr_pos  = PsndRender(0, PsndLen);\r
-    if (emustatus&1) emustatus|=2; else emustatus&=~2;\r
-    if (PicoWriteSound) PicoWriteSound(curr_pos);\r
-    // clear sound buffer\r
-    PsndClear();\r
-  }\r
-  else if(emustatus & 3) {\r
-    emustatus|= 2;\r
-    emustatus&=~1;\r
-    curr_pos = PsndRender(0, PsndLen/2);\r
-  }\r
-#endif\r
-}\r
-\r
 #include "pico_cmn.c"\r
 \r
 int z80stopCycle;\r
index cc77f5f..368b4c8 100644 (file)
@@ -64,6 +64,7 @@ static int PicoFrameHints(void)
   SekCyclesResetS68k();
 #endif
   PsndDacLine = 0;
+  emustatus &= ~1;
 
   pv->status&=~0x88; // clear V-Int, come out of vblank
 
@@ -118,19 +119,15 @@ static int PicoFrameHints(void)
       }
     }
 
-#ifndef PICO_CD
     // get samples from sound chips
-    if (y == 32 && PsndOut)
-      emustatus &= ~1;
-    else if ((y == 224 || y == line_sample) && PsndOut)
+    if ((y == 224 || y == line_sample) && PsndOut)
     {
       if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80))
         PicoSyncZ80(SekCycleCnt);
       if (ym2612.dacen && PsndDacLine <= y)
         PsndDoDAC(y);
-      getSamples(y);
+      PsndGetSamples(y);
     }
-#endif
 
     // Run scanline:
     if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
@@ -196,15 +193,12 @@ static int PicoFrameHints(void)
   }
 
   // get samples from sound chips
-#ifndef PICO_CD
-  if (y == 224)
-#endif
-    if (PsndOut)
-    {
-      if (ym2612.dacen && PsndDacLine <= y)
-        PsndDoDAC(y);
-      getSamples(y);
-    }
+  if (y == 224 && PsndOut)
+  {
+    if (ym2612.dacen && PsndDacLine <= y)
+      PsndDoDAC(y);
+    PsndGetSamples(y);
+  }
 
   // Run scanline:
   if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
index a7ea5e8..9630399 100644 (file)
@@ -531,8 +531,8 @@ PICO_INTERNAL void PicoCDBufferRead(void *dest, int lba);
 // sound/sound.c\r
 PICO_INTERNAL void PsndReset(void);\r
 PICO_INTERNAL void PsndDoDAC(int line_to);\r
-PICO_INTERNAL int  PsndRender(int offset, int length);\r
 PICO_INTERNAL void PsndClear(void);\r
+PICO_INTERNAL void PsndGetSamples(int y);\r
 // z80 functionality wrappers\r
 PICO_INTERNAL void z80_init(void);\r
 PICO_INTERNAL void z80_pack(unsigned char *data);\r
index 39ae291..daf62b0 100644 (file)
@@ -297,7 +297,7 @@ PICO_INTERNAL void PsndClear(void)
 }\r
 \r
 \r
-PICO_INTERNAL int PsndRender(int offset, int length)\r
+static int PsndRender(int offset, int length)\r
 {\r
   int  buf32_updated = 0;\r
   int *buf32 = PsndBuffer+offset;\r
@@ -361,6 +361,35 @@ PICO_INTERNAL int PsndRender(int offset, int length)
   return length;\r
 }\r
 \r
+// to be called on 224 or line_sample scanlines only\r
+PICO_INTERNAL void PsndGetSamples(int y)\r
+{\r
+#if SIMPLE_WRITE_SOUND\r
+  if (y != 224) return;\r
+  PsndRender(0, PsndLen);\r
+  if (PicoWriteSound) PicoWriteSound(PsndLen);\r
+  PsndClear();\r
+#else\r
+  static int curr_pos = 0;\r
+\r
+  if (y == 224)\r
+  {\r
+    if (emustatus & 2)\r
+         curr_pos += PsndRender(curr_pos, PsndLen-PsndLen/2);\r
+    else curr_pos  = PsndRender(0, PsndLen);\r
+    if (emustatus&1) emustatus|=2; else emustatus&=~2;\r
+    if (PicoWriteSound) PicoWriteSound(curr_pos);\r
+    // clear sound buffer\r
+    PsndClear();\r
+  }\r
+  else if (emustatus & 3) {\r
+    emustatus|= 2;\r
+    emustatus&=~1;\r
+    curr_pos = PsndRender(0, PsndLen/2);\r
+  }\r
+#endif\r
+}\r
+\r
 \r
 // -----------------------------------------------------------------\r
 //                            z80 stuff\r
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)
@@ -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