notaz.gp2x.de
/
fceu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
merge x6502 code FCEUX
[fceu.git]
/
sound.c
diff --git
a/sound.c
b/sound.c
index
7e130fa
..
f0eeaf8
100644
(file)
--- a/
sound.c
+++ b/
sound.c
@@
-39,13
+39,11
@@
#include "svga.h"
#include "sound.h"
#include "svga.h"
#include "sound.h"
-uint32 soundtsinc;
-uint32 soundtsi;
+uint32 Wave[2048+512];
+int32 WaveHi[40000]; // unused
+int16 WaveFinalMono[2048+512];
-uint32 Wave[2048];
-int16 WaveFinalMono[2048];
-
-EXPSOUND GameExpSound={0,0,0};
+EXPSOUND GameExpSound={0,0,0,0,0,0};
uint8 trimode=0;
uint8 tricoop=0;
uint8 trimode=0;
uint8 tricoop=0;
@@
-63,7
+61,7
@@
uint32 soundtsoffs=0;
#undef printf
uint16 nreg;
#undef printf
uint16 nreg;
-int32 lengthcount[4];
+
static
int32 lengthcount[4];
extern int soundvol;
extern int soundvol;
@@
-81,8
+79,10
@@
static const uint32 SNoiseFreqTable[0x10]=
};
static uint32 NoiseFreqTable[0x10];
};
static uint32 NoiseFreqTable[0x10];
-static int32 nesincsize32;
-int64 nesincsize;
+int32 nesincsize;
+uint32 soundtsinc;
+uint32 soundtsi;
+
static const uint8 NTSCPCMTable[0x10]=
{
static const uint8 NTSCPCMTable[0x10]=
{
@@
-555,6
+555,31
@@
static void FASTAPASS(1) CalcRectAmp(int P)
*b=V;
}
*b=V;
}
+void FCEU_SoundCPUHook(int cycles48)
+{
+ fhcnt-=cycles48;
+ if(fhcnt<=0)
+ {
+ FrameSoundUpdate();
+ fhcnt+=fhinc;
+ }
+
+ if(PCMIRQCount>0)
+ {
+ PCMIRQCount-=cycles48;
+ if(PCMIRQCount<=0)
+ {
+ vdis=1;
+ if((PSG[0x10]&0x80) && !(PSG[0x10]&0x40))
+ {
+ extern uint8 SIRQStat;
+ SIRQStat|=0x80;
+ X6502_IRQBegin(FCEU_IQDPCM);
+ }
+ }
+ }
+}
+
static void RDoPCM(int32 end)
{
int32 V;
static void RDoPCM(int32 end)
{
int32 V;
@@
-574,7
+599,7
@@
static void RDoPCM(int32 end)
for(V=start;V<end;V++)
{
for(V=start;V<end;V++)
{
- PCMacc-=nesincsize
32
;
+ PCMacc-=nesincsize;
if(PCMacc<=0)
{
if(!PCMBitIndex)
if(PCMacc<=0)
{
if(!PCMBitIndex)
@@
-664,7
+689,7
@@
static void RDoSQ1(int32 end)
for(V=start;V<end;V++)
{
Wave[V>>4]+=out;
for(V=start;V<end;V++)
{
Wave[V>>4]+=out;
- sqacc[0]-=nesincsize
32
;
+ sqacc[0]-=nesincsize;
if(sqacc[0]<=0)
{
rea:
if(sqacc[0]<=0)
{
rea:
@@
-710,7
+735,7
@@
static void RDoSQ2(int32 end)
for(V=start;V<end;V++)
{
Wave[V>>4]+=out;
for(V=start;V<end;V++)
{
Wave[V>>4]+=out;
- sqacc[1]-=nesincsize
32
;
+ sqacc[1]-=nesincsize;
if(sqacc[1]<=0)
{
rea:
if(sqacc[1]<=0)
{
rea:
@@
-764,7
+789,7
@@
static void RDoTriangle(int32 end)
freq<<=17;
for(V=start;V<end;V++)
{
freq<<=17;
for(V=start;V<end;V++)
{
- triacc-=nesincsize
32
;
+ triacc-=nesincsize;
if(triacc<=0)
{
rea:
if(triacc<=0)
{
rea:
@@
-869,28
+894,29
@@
void SetNESSoundMap(void)
SetReadHandler(0x4015,0x4015,Read_PSG);
}
SetReadHandler(0x4015,0x4015,Read_PSG);
}
-static int32 WaveNSF[2048];
-
int32 highp; // 0 through 65536, 0 = no high pass, 65536 = max high pass
int32 lowp; // 0 through 65536, 65536 = max low pass(total attenuation)
// 65536 = no low pass
int32 highp; // 0 through 65536, 0 = no high pass, 65536 = max high pass
int32 lowp; // 0 through 65536, 65536 = max low pass(total attenuation)
// 65536 = no low pass
+static int32 flt_acc=0, flt_acc2=0;
+
static void FilterSound(uint32 *in, int16 *outMono, int count)
{
static void FilterSound(uint32 *in, int16 *outMono, int count)
{
- static int32 acc=0, acc2=0;
// static int min=0, max=0;
// static int min=0, max=0;
+ int sh=2;
+ if (soundvol < 5) sh += 5 - soundvol;
for(;count;count--,in++,outMono++)
{
int32 diff;
for(;count;count--,in++,outMono++)
{
int32 diff;
- diff = *in - acc;
+ diff = *in -
flt_
acc;
- acc += (diff*highp)>>16;
-
acc2+= (int32) (((int64)((diff-
acc2)*lowp))>>16);
+
flt_
acc += (diff*highp)>>16;
+
flt_acc2+= (int32) (((int64)((diff-flt_
acc2)*lowp))>>16);
*in=0;
*in=0;
- *outMono =
acc2*7 >> 2; //
* 1.75
+ *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; }
}
// if (acc2 < min) { printf("min: %i %04x\n", acc2, acc2); min = acc2; }
// if (acc2 > max) { printf("max: %i %04x\n", acc2, acc2); max = acc2; }
}
@@
-923,17
+949,6
@@
int FlushEmulateSound(void)
GameExpSound.Fill(end&0xF);
FilterSound(Wave,WaveFinalMono,end>>4);
GameExpSound.Fill(end&0xF);
FilterSound(Wave,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;
- }
- }
if(end&0xF)
Wave[0]=Wave[(end>>4)];
if(end&0xF)
Wave[0]=Wave[(end>>4)];
@@
-948,9
+963,9
@@
int FlushEmulateSound(void)
return(end);
}
return(end);
}
-int GetSoundBuffer(int
32
**W)
+int GetSoundBuffer(int
16
**W)
{
{
- *W=Wave
NSF
;
+ *W=Wave
FinalMono
;
return inbuf;
}
return inbuf;
}
@@
-1008,8
+1023,7
@@
void SetSoundVariables(void)
GameExpSound.RChange();
// nesincsizeLL=(int64)((int64)562949953421312*(double)(PAL?PAL_CPU:NTSC_CPU)/(FSettings.SndRate OVERSAMPLE));
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)); // 308845 - 1832727
- 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++)
PSG_base=(uint32)(PAL?(long double)PAL_CPU/16:(long double)NTSC_CPU/16);
for(x=0;x<0x10;x++)
@@
-1029,6
+1043,8
@@
void SetSoundVariables(void)
if(highp>(1<<16)) highp=1<<16;
if(lowp>(1<<16)) lowp=1<<16;
if(highp>(1<<16)) highp=1<<16;
if(lowp>(1<<16)) lowp=1<<16;
+
+ flt_acc=flt_acc2=0;
}
void FixOldSaveStateSFreq(void)
}
void FixOldSaveStateSFreq(void)