Merge pull request #569 from gameblabla/gte_stalling_libretro
authorgameblabla <gameblabla@users.noreply.github.com>
Sat, 23 Oct 2021 22:15:27 +0000 (22:15 +0000)
committerGitHub <noreply@github.com>
Sat, 23 Oct 2021 22:15:27 +0000 (22:15 +0000)
GTE stalls/timings

Makefile.libretro
libpcsxcore/cdrom.c
plugins/dfsound/externals.h
plugins/dfsound/registers.c
plugins/dfsound/spu.c
plugins/spunull/spunull.c

index 2233620..30ca4f3 100644 (file)
@@ -306,6 +306,17 @@ else ifeq ($(platform), qnx)
        LIBDL :=
        LIBM :=
 
+#Raspberry Pi 1
+else ifeq ($(platform), rpi1)
+       TARGET := $(TARGET_NAME)_libretro.so
+       fpic := -fPIC
+       CFLAGS += -marm -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard
+       ASFLAGS += -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard
+       HAVE_NEON = 0
+       ARCH = arm
+       BUILTIN_GPU = unai
+       DYNAREC = ari64
+
 #Raspberry Pi 2
 else ifeq ($(platform), rpi2)
        TARGET := $(TARGET_NAME)_libretro.so
index 6f0b92c..c09ccb1 100644 (file)
@@ -1181,6 +1181,19 @@ void cdrReadInterrupt() {
                        int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector);
                        if (!ret) {
                                cdrAttenuate(cdr.Xa.pcm, cdr.Xa.nsamples, cdr.Xa.stereo);
+                               /*
+                                * Gameblabla -
+                                * This is a hack for Megaman X4, Castlevania etc...
+                                * that regressed from the new m_locationChanged and CDROM timings changes.
+                                * It is mostly noticeable in Castevania however and the stuttering can be very jarring.
+                                * 
+                                * According to PCSX redux authors, we shouldn't cause a location change if
+                                * the sector difference is too small. 
+                                * I attempted to go with that approach but came empty handed.
+                                * So for now, let's just set cdr.m_locationChanged to false when playing back any ADPCM samples.
+                                * This does not regress Crash Team Racing's intro at least.
+                               */
+                               cdr.m_locationChanged = FALSE;
                                SPU_playADPCMchannel(&cdr.Xa);
                                cdr.FirstSector = 0;
                        }
index c038ea3..19cd9ba 100644 (file)
@@ -204,7 +204,7 @@ typedef struct
  short         * pS;\r
 \r
  void (CALLBACK *irqCallback)(void);   // func of main emu, called on spu irq\r
- void (CALLBACK *cddavCallback)(unsigned short,unsigned short);\r
+ void (CALLBACK *cddavCallback)(short, short);\r
  void (CALLBACK *scheduleCallback)(unsigned int);\r
 \r
  xa_decode_t   * xapGlobal;\r
index cc72020..e069306 100644 (file)
@@ -204,12 +204,12 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val,
       break;\r
     //-------------------------------------------------//\r
     case H_CDLeft:\r
-      spu.iLeftXAVol=val  & 0x7fff;\r
-      if(spu.cddavCallback) spu.cddavCallback(0,val);\r
+      spu.iLeftXAVol=(int16_t)val;\r
+      if(spu.cddavCallback) spu.cddavCallback(0,(int16_t)val);\r
       break;\r
     case H_CDRight:\r
-      spu.iRightXAVol=val & 0x7fff;\r
-      if(spu.cddavCallback) spu.cddavCallback(1,val);\r
+      spu.iRightXAVol=(int16_t)val;\r
+      if(spu.cddavCallback) spu.cddavCallback(1,(int16_t)val);\r
       break;\r
     //-------------------------------------------------//\r
     case H_FMod1:\r
index e1b8a40..0a18887 100644 (file)
@@ -1580,7 +1580,7 @@ void CALLBACK SPUregisterCallback(void (CALLBACK *callback)(void))
  spu.irqCallback = callback;
 }
 
-void CALLBACK SPUregisterCDDAVolume(void (CALLBACK *CDDAVcallback)(unsigned short,unsigned short))
+void CALLBACK SPUregisterCDDAVolume(void (CALLBACK *CDDAVcallback)(short, short))
 {
  spu.cddavCallback = CDDAVcallback;
 }
index 96bd390..ece5db9 100644 (file)
@@ -53,7 +53,7 @@ char *         pConfigFile=0;
 ////////////////////////////////////////////////////////////////////////
 
 void (CALLBACK *irqCallback)(void)=0;                   // func of main emu, called on spu irq
-void (CALLBACK *cddavCallback)(unsigned short,unsigned short)=0;
+void (CALLBACK *cddavCallback)(short, short)=0;
 
 ////////////////////////////////////////////////////////////////////////
 // CODE AREA
@@ -361,7 +361,7 @@ void CALLBACK SPUregisterCallback(void (CALLBACK *callback)(void))
  irqCallback = callback;
 }
 
-void CALLBACK SPUregisterCDDAVolume(void (CALLBACK *CDDAVcallback)(unsigned short,unsigned short))
+void CALLBACK SPUregisterCDDAVolume(void (CALLBACK *CDDAVcallback)(short, short))
 {
  cddavCallback = CDDAVcallback;
 }