some warnings fixed, nsf fixed, palettes, more code backported
[fceu.git] / sound.c
diff --git a/sound.c b/sound.c
index 0951e6f..7d56a2d 100644 (file)
--- a/sound.c
+++ b/sound.c
@@ -83,6 +83,7 @@ static const uint32 SNoiseFreqTable[0x10]=
 static uint32 NoiseFreqTable[0x10];
 
 int64 nesincsizeLL;
+int64 nesincsize;
 
 static const uint8 NTSCPCMTable[0x10]=
 {
@@ -330,15 +331,6 @@ static DECLFW(Write_PSG)
             X6502_IRQEnd(FCEU_IQDPCM);
           }
            break;
- case 0x17:
-          V&=0xC0;
-           fcnt=0;
-           if(V&0x80)
-            FrameSoundUpdate();
-           fhcnt=fhinc;
-           X6502_IRQEnd(FCEU_IQFCOUNT);
-          SIRQStat&=~0x40;
-           break;
  }
  PSG[A]=V;
 }
@@ -851,16 +843,30 @@ static void RDoNoise(void)
    }
 }
 
+DECLFW(Write_IRQFM)
+{
+ PSG[0x17]=V;
+ V=(V&0xC0)>>6;
+ fcnt=0;
+ if(V&0x2)
+  FrameSoundUpdate();
+ fcnt=1;
+ fhcnt=fhinc;
+ X6502_IRQEnd(FCEU_IQFCOUNT);
+ SIRQStat&=~0x40;
+ //IRQFrameMode=V; // IRQFrameMode is PSG[0x17] upper bits
+}
+
 void SetNESSoundMap(void)
 {
   SetWriteHandler(0x4000,0x4013,Write_PSG);
   SetWriteHandler(0x4011,0x4011,Write0x11);
   SetWriteHandler(0x4015,0x4015,Write_PSG);
-  SetWriteHandler(0x4017,0x4017,Write_PSG);
+  SetWriteHandler(0x4017,0x4017,Write_IRQFM);
   SetReadHandler(0x4015,0x4015,Read_PSG);
 }
 
-static int32 WaveNSF[256];
+static int32 WaveNSF[2048];
 
 int32 highp;                   // 0 through 65536, 0 = no high pass, 65536 = max high pass
 
@@ -917,6 +923,7 @@ static void FilterSound(uint32 *in, int32 *out, int16 *outMono, int count)
 
 
 
+static int32 inbuf=0;
 int FlushEmulateSound(void)
 {
   int x;
@@ -945,12 +952,12 @@ int FlushEmulateSound(void)
 //  printf("count %d, num ints %d\n", end, (end >> 4));
   if(FCEUGameInfo.type==GIT_NSF)
   {
-   printf("IS NSF");
-   int x,s=0,si=end/1024;       // Only want 1/4 of the output buffer to be displayed
-   for(x=0;x<256;x++)
+   int x;//,s=0,si=end/1024;
+   for(x=0;x<1024;x++)
    {
-    WaveNSF[x]=WaveFinal[s>>4];
-    s+=si;
+    //WaveNSF[x]=WaveFinal[s>>4];
+    WaveNSF[x]=WaveFinalMono[x];
+    //s+=si;
    }
   }
 
@@ -962,12 +969,15 @@ int FlushEmulateSound(void)
   for(x=0;x<5;x++)
    ChannelBC[x]=end&0xF;
   soundtsoffs=(soundtsinc*(end&0xF))>>16;
-  return(end>>4);
+  end>>=4;
+  inbuf=end;
+  return(end);
 }
 
-void GetSoundBuffer(int32 **W)
+int GetSoundBuffer(int32 **W)
 {
  *W=WaveNSF;
+ return inbuf;
 }
 
 void PowerSound(void)
@@ -1023,7 +1033,8 @@ void SetSoundVariables(void)
   if(GameExpSound.RChange)
    GameExpSound.RChange();
 
-  nesincsizeLL=(int64)((int64)562949953421312*(long double)(PAL?PAL_CPU:NTSC_CPU)/(FSettings.SndRate OVERSAMPLE));
+  nesincsizeLL=(int64)((int64)562949953421312*(double)(PAL?PAL_CPU:NTSC_CPU)/(FSettings.SndRate OVERSAMPLE));
+  nesincsize=(int64)(((int64)1<<17)*(double)(PAL?PAL_CPU:NTSC_CPU)/(FSettings.SndRate * 16));
   PSG_base=(uint32)(PAL?(long double)PAL_CPU/16:(long double)NTSC_CPU/16);
 
   for(x=0;x<0x10;x++)
@@ -1062,5 +1073,5 @@ void FCEUI_Sound(int Rate)
 
 void FCEUI_SetSoundVolume(uint32 volume)
 {
- FSettings.SoundVolume=(volume<<16)/100;
+ FSettings.SoundVolume=volume;
 }