X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=sound.c;h=7d56a2d23ed5a9b41f9ad4653af6dac29b3e0c71;hp=0951e6fc24949ec7abbd6733b6c017f52062af0d;hb=92764e6252a3691033d6044b466bf716c96b62d5;hpb=4fdfab079f3f006ae215ab453072a25588aa951d diff --git a/sound.c b/sound.c index 0951e6f..7d56a2d 100644 --- 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; }