X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=sound.c;h=f95b0505abd111b22532bde7d4fd0e84cd84cafa;hp=9bbda3f6416ccadf14cca7e66f64c2c8dad2968e;hb=44343b8775fd8c9cfa1a2f865be369e09d1984ff;hpb=ec4d13a31d4416f0f794f8530d03b820cfa55417 diff --git a/sound.c b/sound.c index 9bbda3f..f95b050 100644 --- a/sound.c +++ b/sound.c @@ -39,14 +39,10 @@ #include "svga.h" #include "sound.h" -uint32 soundtsinc; -uint32 soundtsi; +uint32 Wave[2048+512]; +int16 WaveFinalMono[2048+512]; -uint32 Wave[2048]; -int32 WaveFinal[2048]; -int16 WaveFinalMono[2048]; - -EXPSOUND GameExpSound={0,0,0}; +EXPSOUND GameExpSound={0,0,0,0,0,0}; uint8 trimode=0; uint8 tricoop=0; @@ -64,7 +60,7 @@ uint32 soundtsoffs=0; #undef printf uint16 nreg; -int32 lengthcount[4]; +static int32 lengthcount[4]; extern int soundvol; @@ -82,8 +78,10 @@ static const uint32 SNoiseFreqTable[0x10]= }; static uint32 NoiseFreqTable[0x10]; -static int32 nesincsize32; -int64 nesincsize; +int32 nesincsize; +uint32 soundtsinc; +uint32 soundtsi; + static const uint8 NTSCPCMTable[0x10]= { @@ -114,13 +112,13 @@ int32 PCMSizeIndex=0; uint8 PCMBuffer=0; int vdis=0; -static void Dummyfunc(void) {}; +static void Dummyfunc(int end) {}; -static void (*DoNoise)(void)=Dummyfunc; -static void (*DoTriangle)(void)=Dummyfunc; -static void (*DoPCM)(void)=Dummyfunc; -static void (*DoSQ1)(void)=Dummyfunc; -static void (*DoSQ2)(void)=Dummyfunc; +static void (*DoNoise)(int end)=Dummyfunc; +static void (*DoTriangle)(int end)=Dummyfunc; +static void (*DoPCM)(int end)=Dummyfunc; +static void (*DoSQ1)(int end)=Dummyfunc; +static void (*DoSQ2)(int end)=Dummyfunc; static void CalcDPCMIRQ(void) { @@ -188,7 +186,7 @@ static int FASTAPASS(2) CheckFreq(uint32 cf, uint8 sr) static DECLFW(Write0x11) { - DoPCM(); + DoPCM(0); PSG[0x11]=V&0x7F; } @@ -202,7 +200,7 @@ static DECLFW(Write_PSG) switch(A) { case 0x0: - DoSQ1(); + DoSQ1(0); if(V&0x10) realvolume[0]=V&0xF; break; @@ -210,14 +208,14 @@ static DECLFW(Write_PSG) sweepon[0]=V&0x80; break; case 0x2: - DoSQ1(); + DoSQ1(0); curfreq[0]&=0xFF00; curfreq[0]|=V; break; case 0x3: if(PSG[0x15]&1) { - DoSQ1(); + DoSQ1(0); lengthcount[0]=lengthtable[(V>>3)&0x1f]; sqnon|=1; } @@ -231,7 +229,7 @@ static DECLFW(Write_PSG) break; case 0x4: - DoSQ2(); + DoSQ2(0); if(V&0x10) realvolume[1]=V&0xF; break; @@ -239,14 +237,14 @@ static DECLFW(Write_PSG) sweepon[1]=V&0x80; break; case 0x6: - DoSQ2(); + DoSQ2(0); curfreq[1]&=0xFF00; curfreq[1]|=V; break; case 0x7: if(PSG[0x15]&2) { - DoSQ2(); + DoSQ2(0); lengthcount[1]=lengthtable[(V>>3)&0x1f]; sqnon|=2; } @@ -259,7 +257,7 @@ static DECLFW(Write_PSG) sqacc[1]=((int32)curfreq[1]+1)<<18; break; case 0x8: - DoTriangle(); + DoTriangle(0); if(laster&0x80) { tricoop=V&0x7F; @@ -269,12 +267,12 @@ static DECLFW(Write_PSG) tricoop=0; laster=V&0x80; break; - case 0xa:DoTriangle(); + case 0xa:DoTriangle(0); break; case 0xb: if(PSG[0x15]&0x4) { - DoTriangle(); + DoTriangle(0); sqnon|=4; lengthcount[2]=lengthtable[(V>>3)&0x1f]; } @@ -282,22 +280,22 @@ static DECLFW(Write_PSG) tricoop=PSG[0x8]&0x7f; trimode=PSG[0x8]&0x80; break; - case 0xC:DoNoise(); + case 0xC:DoNoise(0); if(V&0x10) realvolume[2]=V&0xF; break; - case 0xE:DoNoise();break; + case 0xE:DoNoise(0);break; case 0xF: if(PSG[0x15]&8) { - DoNoise(); + DoNoise(0); sqnon|=8; lengthcount[3]=lengthtable[(V>>3)&0x1f]; } decvolume[2]=0xF; DecCountTo1[2]=(PSG[0xC]&0xF)+1; break; - case 0x10:DoPCM(); + case 0x10:DoPCM(0); if(!(V&0x80)) X6502_IRQEnd(FCEU_IQDPCM); break; @@ -306,15 +304,15 @@ static DECLFW(Write_PSG) int t=V^PSG[0x15]; if(t&1) - DoSQ1(); + DoSQ1(0); if(t&2) - DoSQ2(); + DoSQ2(0); if(t&4) - DoTriangle(); + DoTriangle(0); if(t&8) - DoNoise(); + DoNoise(0); if(t&0x10) - DoPCM(); + DoPCM(0); sqnon&=V; if(V&0x10) { @@ -339,7 +337,7 @@ DECLFR(Read_PSG) { uint8 ret; if(PSG[0x15]&0x10) - DoPCM(); + DoPCM(0); ret=(PSG[0x15]&(sqnon|0x10))|SIRQStat; SIRQStat&=~0x40; X6502_IRQEnd(/*FCEU_IQDPCM|*/FCEU_IQFCOUNT); @@ -359,10 +357,11 @@ DECLFR(Read_PSGDummy) static void FASTAPASS(1) FrameSoundStuff(int V) { int P; + uint32 end = (SOUNDTS<<16)/soundtsinc; - DoSQ1(); - DoSQ2(); - DoNoise(); + DoSQ1(end); + DoSQ2(end); + DoNoise(end); switch((V&1)) { @@ -375,7 +374,7 @@ static void FASTAPASS(1) FrameSoundStuff(int V) lengthcount[2]--; if(lengthcount[2]<=0) { - DoTriangle(); + DoTriangle(0); sqnon&=~4; } } @@ -460,7 +459,7 @@ static void FASTAPASS(1) FrameSoundStuff(int V) laster=0; if(tricoop) { - if(tricoop==1) DoTriangle(); + if(tricoop==1) DoTriangle(0); tricoop--; } } @@ -555,15 +554,15 @@ static void FASTAPASS(1) CalcRectAmp(int P) *b=V; } -static void RDoPCM(void) +static void RDoPCM(int32 end) { int32 V; - int32 start,end; + int32 start; int32 freq; uint32 out=PSG[0x11]<<3; start=ChannelBC[4]; - end=(SOUNDTS<<16)/soundtsinc; + if(end==0) end=(SOUNDTS<<16)/soundtsinc; if(end<=start) return; ChannelBC[4]=end; @@ -574,7 +573,7 @@ static void RDoPCM(void) for(V=start;V0x7ff) return; if(!CheckFreq(curfreq[0],PSG[0x1])) return; - if(PSG[0x15]&1 && sqnon&1) + CalcRectAmp(0); + { uint32 out=RectAmp[0][DutyCount[0]]; freq=curfreq[0]+1; @@ -661,7 +663,7 @@ static void RDoSQ1(void) for(V=start;V>4]+=out; - sqacc[0]-=nesincsize32; + sqacc[0]-=nesincsize; if(sqacc[0]<=0) { rea: @@ -672,30 +674,32 @@ static void RDoSQ1(void) DutyCount[0]&=7; out=RectAmp[0][DutyCount[0]]; } - } - } } + } } -static void RDoSQ2(void) +static void RDoSQ2(int32 end) { int32 V; - int32 start,end; + int32 start; int32 freq; - CalcRectAmp(1); start=ChannelBC[1]; - end=(SOUNDTS<<16)/soundtsinc; + if(end==0) end=(SOUNDTS<<16)/soundtsinc; if(end<=start) return; ChannelBC[1]=end; + if(!(PSG[0x15]&2 && sqnon&2)) + return; + if(curfreq[1]<8 || curfreq[1]>0x7ff) return; if(!CheckFreq(curfreq[1],PSG[0x5])) return; - if(PSG[0x15]&2 && sqnon&2) + CalcRectAmp(1); + { uint32 out=RectAmp[1][DutyCount[1]]; freq=curfreq[1]+1; @@ -705,7 +709,7 @@ static void RDoSQ2(void) for(V=start;V>4]+=out; - sqacc[1]-=nesincsize32; + sqacc[1]-=nesincsize; if(sqacc[1]<=0) { rea: @@ -717,20 +721,20 @@ static void RDoSQ2(void) out=RectAmp[1][DutyCount[1]]; } } - } } + } } -static void RDoTriangle(void) +static void RDoTriangle(int32 end) { static uint32 tcout=0; int32 V; - int32 start,end; //,freq; + int32 start; //,freq; int32 freq=(((PSG[0xa]|((PSG[0xb]&7)<<8))+1)); start=ChannelBC[2]; - end=(SOUNDTS<<16)/soundtsinc; + if(end==0) end=(SOUNDTS<<16)/soundtsinc; if(end<=start) return; ChannelBC[2]=end; @@ -759,7 +763,7 @@ static void RDoTriangle(void) freq<<=17; for(V=start;V>16; - acc2+= (int32) (((int64)((diff-acc2)*lowp))>>16); + flt_acc += (diff*highp)>>16; + flt_acc2+= (int32) (((int64)((diff-flt_acc2)*lowp))>>16); *in=0; - *outMono = (int16)acc2; + *outMono = flt_acc2*7 >> sh; // * 7 >> 2 = * 1.75 +// if (acc2 < min) { printf("min: %i %04x\n", acc2, acc2); min = acc2; } +// if (acc2 > max) { printf("max: %i %04x\n", acc2, acc2); max = acc2; } } } @@ -906,28 +913,16 @@ int FlushEmulateSound(void) } end=(SOUNDTS<<16)/soundtsinc; - DoSQ1(); - DoSQ2(); - DoTriangle(); - DoNoise(); - DoPCM(); + DoSQ1(end); + DoSQ2(end); + DoTriangle(end); + DoNoise(end); + DoPCM(end); if(GameExpSound.Fill) GameExpSound.Fill(end&0xF); -// FilterSound(Wave,WaveFinal,end>>4); - FilterSound(Wave,WaveFinal,WaveFinalMono,end>>4); -// printf("count %d, num ints %d\n", end, (end >> 4)); - if(FCEUGameInfo.type==GIT_NSF) - { - int x;//,s=0,si=end/1024; - for(x=0;x<1024;x++) - { - //WaveNSF[x]=WaveFinal[s>>4]; - WaveNSF[x]=WaveFinalMono[x]; - //s+=si; - } - } + FilterSound(Wave,WaveFinalMono,end>>4); if(end&0xF) Wave[0]=Wave[(end>>4)]; @@ -942,9 +937,9 @@ int FlushEmulateSound(void) return(end); } -int GetSoundBuffer(int32 **W) +int GetSoundBuffer(int16 **W) { - *W=WaveNSF; + *W=WaveFinalMono; return inbuf; } @@ -1002,8 +997,7 @@ void SetSoundVariables(void) GameExpSound.RChange(); // 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)); - nesincsize32=(int32)nesincsize; + nesincsize=(int32)(((int64)1<<17)*(double)(PAL?PAL_CPU:NTSC_CPU)/(FSettings.SndRate * 16)); // 308845 - 1832727 PSG_base=(uint32)(PAL?(long double)PAL_CPU/16:(long double)NTSC_CPU/16); for(x=0;x<0x10;x++) @@ -1015,7 +1009,7 @@ void SetSoundVariables(void) NoiseFreqTable[x]=z; } soundtsinc=(uint32)((uint64)(PAL?(long double)PAL_CPU*65536:(long double)NTSC_CPU*65536)/(FSettings.SndRate OVERSAMPLE)); - memset(Wave,0,2048*4); + memset(Wave,0,sizeof(Wave)); for(x=0;x<5;x++) ChannelBC[x]=0; highp=(250<<16)/FSettings.SndRate; // Arbitrary @@ -1023,6 +1017,8 @@ void SetSoundVariables(void) if(highp>(1<<16)) highp=1<<16; if(lowp>(1<<16)) lowp=1<<16; + + flt_acc=flt_acc2=0; } void FixOldSaveStateSFreq(void)