psp mp3 implementation
[libpicofe.git] / psp / emu.c
index e72ea7d..51db24a 100644 (file)
--- a/psp/emu.c
+++ b/psp/emu.c
@@ -145,9 +145,15 @@ void emu_setDefaultConfig(void)
        currentConfig.KeyBinds[12] = 1<<26; // switch rnd
        currentConfig.KeyBinds[ 8] = 1<<27; // save state
        currentConfig.KeyBinds[ 9] = 1<<28; // load state
+       currentConfig.KeyBinds[28] = 1<<0; // num "buttons"
+       currentConfig.KeyBinds[30] = 1<<1;
+       currentConfig.KeyBinds[31] = 1<<2;
+       currentConfig.KeyBinds[29] = 1<<3;
        currentConfig.PicoCDBuffers = 0;
-       currentConfig.scaling = 1; // bilinear filtering for psp
-       currentConfig.scale = currentConfig.hscale32 = currentConfig.hscale40 = 1.0;
+       currentConfig.scaling = 1;     // bilinear filtering for psp
+       currentConfig.scale = 1.20;    // fullscreen
+       currentConfig.hscale40 = 1.25;
+       currentConfig.hscale32 = 1.56;
 }
 
 
@@ -353,15 +359,13 @@ static void blitscreen_clut(void)
 
 static void cd_leds(void)
 {
-       static int old_reg = 0;
-       unsigned int col_g, col_r, *p;
+       unsigned int reg, col_g, col_r, *p;
 
-       if (!((Pico_mcd->s68k_regs[0] ^ old_reg) & 3)) return; // no change
-       old_reg = Pico_mcd->s68k_regs[0];
+       reg = Pico_mcd->s68k_regs[0];
 
        p = (unsigned int *)((short *)psp_screen + 512*2+4+2);
-       col_g = (old_reg & 2) ? 0x06000600 : 0;
-       col_r = (old_reg & 1) ? 0x00180018 : 0;
+       col_g = (reg & 2) ? 0x06000600 : 0;
+       col_r = (reg & 1) ? 0x00180018 : 0;
        *p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r; p += 512/2 - 12/2;
        *p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r; p += 512/2 - 12/2;
        *p++ = col_g; *p++ = col_g; p+=2; *p++ = col_r; *p++ = col_r;
@@ -473,7 +477,7 @@ static void vidResetMode(void)
 /* sound stuff */
 #define SOUND_BLOCK_SIZE_NTSC (1470*2) // 1024 // 1152
 #define SOUND_BLOCK_SIZE_PAL  (1764*2)
-#define SOUND_BLOCK_COUNT    4
+#define SOUND_BLOCK_COUNT    8
 
 static short __attribute__((aligned(4))) sndBuffer[SOUND_BLOCK_SIZE_PAL*SOUND_BLOCK_COUNT + 44100/50*2];
 static short *snd_playptr = NULL, *sndBuffer_endptr = NULL;
@@ -485,7 +489,7 @@ static void writeSound(int len);
 
 static int sound_thread(SceSize args, void *argp)
 {
-       int ret;
+       int ret = 0;
 
        lprintf("sthr: started, priority %i\n", sceKernelGetThreadCurrentPriority());
 
@@ -493,14 +497,14 @@ static int sound_thread(SceSize args, void *argp)
        {
                if (samples_made - samples_done < samples_block) {
                        // wait for data (use at least 2 blocks)
-                       //lprintf("sthr: wait... (%i)\n", samples_made - samples_done);
+                       lprintf("sthr: wait... (%i)\n", samples_made - samples_done);
                        while (samples_made - samples_done <= samples_block*2 && !sound_thread_exit)
                                ret = sceKernelWaitSema(sound_sem, 1, 0);
-                       //lprintf("sthr: sceKernelWaitSema: %i\n", ret);
+                       if (ret < 0) lprintf("sthr: sceKernelWaitSema: %i\n", ret);
                        continue;
                }
 
-               //lprintf("sthr: got data: %i\n", samples_made - samples_done);
+               // lprintf("sthr: got data: %i\n", samples_made - samples_done);
 
                ret = sceAudio_E0727056(PSP_AUDIO_VOLUME_MAX, snd_playptr);
 
@@ -513,7 +517,7 @@ static int sound_thread(SceSize args, void *argp)
 
                // shouln't happen, but just in case
                if (samples_made - samples_done >= samples_block*3) {
-                       //lprintf("block skip (%i)\n", samples_made - samples_done);
+                       lprintf("sthr: block skip (%i)\n", samples_made - samples_done);
                        samples_done += samples_block; // skip
                        snd_playptr  += samples_block;
                }
@@ -611,6 +615,7 @@ static void writeSound(int len)
                lprintf("mov\n");
        }
        else*/
+       if (PsndOut > sndBuffer_endptr) lprintf("snd oflow %i!\n", PsndOut - sndBuffer_endptr);
        if (PsndOut >= sndBuffer_endptr)
                PsndOut = sndBuffer;
 
@@ -619,7 +624,7 @@ static void writeSound(int len)
        if (samples_made - samples_done > samples_block*2) {
                // lprintf("signal, %i/%i\n", samples_done, samples_made);
                ret = sceKernelSignalSema(sound_sem, 1);
-               // lprintf("signal ret %i\n", ret);
+               //if (ret < 0) lprintf("snd signal ret %08x\n", ret);
        }
 }
 
@@ -798,23 +803,22 @@ static void find_combos(void)
                if (act == 16 || act == 17) continue; // player2 flag
                if (act > 17)
                {
-                       for (u = 0; u < 32; u++)
+                       for (u = 0; u < 28; u++) // 28 because nub can't produce combos
                                if (currentConfig.KeyBinds[u] & (1 << act)) keyc++;
                }
                else
                {
-                       for (u = 0; u < 32; u++)
+                       for (u = 0; u < 28; u++)
                                if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1
                                        (currentConfig.KeyBinds[u] & (1 << act))) keyc++;
-                       for (u = 0; u < 32; u++)
+                       for (u = 0; u < 28; u++)
                                if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2
                                        (currentConfig.KeyBinds[u] & (1 << act))) keyc2++;
-                       if (keyc2 > keyc) keyc = keyc2;
                }
-               if (keyc > 1)
+               if (keyc > 1 || keyc2 > 1)
                {
                        // loop again and mark those keys and actions as combo
-                       for (u = 0; u < 32; u++)
+                       for (u = 0; u < 28; u++)
                        {
                                if (currentConfig.KeyBinds[u] & (1 << act)) {
                                        combo_keys |= 1 << u;