mirror of https://github.com/PCSX2/pcsx2.git
ZeroSPU2: Change the ini file to be more easily editable by hand in Linux, and assorted cleanup.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@622 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
b7d3c6316a
commit
1504b88a75
|
@ -68,12 +68,14 @@ void SoundFeedVoiceData(unsigned char* pSound,long lBytes)
|
|||
|
||||
GtkWidget *MsgDlg, *ConfDlg;
|
||||
|
||||
void OnMsg_Ok() {
|
||||
void OnMsg_Ok()
|
||||
{
|
||||
gtk_widget_destroy(MsgDlg);
|
||||
gtk_main_quit();
|
||||
}
|
||||
|
||||
void SysMessage(char *fmt, ...) {
|
||||
void SysMessage(char *fmt, ...)
|
||||
{
|
||||
GtkWidget *Ok,*Txt;
|
||||
GtkWidget *Box,*Box1;
|
||||
va_list list;
|
||||
|
@ -139,15 +141,17 @@ void on_Conf_Ok (GtkButton *button, gpointer user_data)
|
|||
{
|
||||
conf.options = 0;
|
||||
|
||||
if (is_checked(ConfDlg, "realtimebutton"))
|
||||
if (is_checked(ConfDlg, "realtimebutton"))
|
||||
conf.options |= OPTION_REALTIME;
|
||||
if (is_checked(ConfDlg, "timescalingbutton"))
|
||||
if (is_checked(ConfDlg, "timescalingbutton"))
|
||||
conf.options |= OPTION_TIMESTRETCH;
|
||||
if (is_checked(ConfDlg, "recordingbutton"))
|
||||
conf.options |= OPTION_RECORDING;
|
||||
if (is_checked(ConfDlg, "mutebutton"))
|
||||
conf.options |= OPTION_MUTE;
|
||||
|
||||
conf.Log = is_checked(ConfDlg, "loggingbutton");
|
||||
|
||||
SaveConfig();
|
||||
gtk_widget_destroy(ConfDlg);
|
||||
gtk_main_quit();
|
||||
|
@ -173,14 +177,22 @@ void SaveConfig()
|
|||
char cfg[255];
|
||||
|
||||
strcpy(cfg, s_strIniPath.c_str());
|
||||
|
||||
f = fopen(cfg,"w");
|
||||
if (f == NULL)
|
||||
{
|
||||
ERROR_LOG("Failed to open %s\n", s_strIniPath.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(f, "log = %d\n", conf.Log);
|
||||
fprintf(f, "options = %d\n", conf.options);
|
||||
//fprintf(f, "options = %d\n", conf.options);
|
||||
|
||||
fprintf(f, "realtime = %d\n", is_checked(ConfDlg, "realtimebutton"));
|
||||
fprintf(f, "timestretch = %d\n", is_checked(ConfDlg, "timescalingbutton"));
|
||||
fprintf(f, "recording = %d\n", is_checked(ConfDlg, "recordingbutton"));
|
||||
fprintf(f, "mute = %d\n", is_checked(ConfDlg, "mutebutton"));
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
|
@ -188,10 +200,12 @@ void LoadConfig()
|
|||
{
|
||||
FILE *f;
|
||||
char cfg[255];
|
||||
int temp;
|
||||
|
||||
memset(&conf, 0, sizeof(conf));
|
||||
|
||||
strcpy(cfg, s_strIniPath.c_str());
|
||||
|
||||
f = fopen(cfg, "r");
|
||||
if (f == NULL)
|
||||
{
|
||||
|
@ -201,7 +215,22 @@ void LoadConfig()
|
|||
SaveConfig();//save and return
|
||||
return;
|
||||
}
|
||||
|
||||
fscanf(f, "log = %d\n", &conf.Log);
|
||||
|
||||
fscanf(f, "realtime = %d\n", &temp);
|
||||
if (temp) conf.options |= OPTION_REALTIME;
|
||||
|
||||
fscanf(f, "timestretch = %d\n", &temp);
|
||||
if (temp) conf.options |= OPTION_TIMESTRETCH;
|
||||
|
||||
fscanf(f, "recording = %d\n", &temp);
|
||||
if (temp) conf.options |= OPTION_RECORDING;
|
||||
|
||||
fscanf(f, "mute = %d\n", &temp);
|
||||
if (temp) conf.options |= OPTION_MUTE;
|
||||
|
||||
fscanf(f, "options = %d\n", &conf.options);
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
|
|
@ -507,9 +507,9 @@ int MixADSR(VOICE_PROCESSED* pvoice) // MIX ADSR
|
|||
if (pvoice->ADSRX.SustainIncrease)
|
||||
{
|
||||
if ((pvoice->ADSRX.SustainModeExp) && (pvoice->ADSRX.EnvelopeVol>=0x60000000))
|
||||
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F) - 0x18 + 32];
|
||||
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F) - 0x18 + 32];
|
||||
else
|
||||
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F) - 0x10 + 32];
|
||||
pvoice->ADSRX.EnvelopeVol+=RateTable[(pvoice->ADSRX.SustainRate^0x7F) - 0x10 + 32];
|
||||
|
||||
if (pvoice->ADSRX.EnvelopeVol<0) pvoice->ADSRX.EnvelopeVol=0x7FFFFFFF;
|
||||
}
|
||||
|
@ -600,17 +600,16 @@ void MixChannels(int core)
|
|||
// simulate SPU2 for 1ms
|
||||
void SPU2Worker()
|
||||
{
|
||||
int s_1,s_2,fa;
|
||||
u8* start;
|
||||
u32 nSample;
|
||||
int ch,predict_nr,shift_factor,flags,d,s;
|
||||
int ch, predict_nr, shift_factor, flags;
|
||||
|
||||
// assume s_buffers are zeroed out
|
||||
if ( dwNewChannel2[0] || dwNewChannel2[1] )
|
||||
s_pAudioBuffers[s_nCurBuffer].newchannels++;
|
||||
|
||||
VOICE_PROCESSED* pChannel=voices;
|
||||
for (ch=0;ch<SPU_NUMBER_VOICES;ch++,pChannel++) // loop em all... we will collect 1 ms of sound of each playing channel
|
||||
for (ch=0; ch < SPU_NUMBER_VOICES; ch++, pChannel++) // loop em all... we will collect 1 ms of sound of each playing channel
|
||||
{
|
||||
if (pChannel->bNew)
|
||||
{
|
||||
|
@ -629,8 +628,10 @@ void SPU2Worker()
|
|||
|
||||
while(ns<NSSIZE)
|
||||
{
|
||||
if (pChannel->bFMod==1 && iFMod[ns]) // fmod freq channel
|
||||
pChannel->FModChangeFrequency(ns);
|
||||
int s_1, s_2, fa;
|
||||
|
||||
// fmod freq channel
|
||||
if (pChannel->bFMod==1 && iFMod[ns]) pChannel->FModChangeFrequency(ns);
|
||||
|
||||
while(pChannel->spos >= 0x10000 )
|
||||
{
|
||||
|
@ -646,22 +647,24 @@ void SPU2Worker()
|
|||
pChannel->ADSRX.EnvelopeVol=0;
|
||||
goto ENDX; // -> and done for this channel
|
||||
}
|
||||
|
||||
pChannel->iSBPos=0;
|
||||
|
||||
// decode the 16byte packet
|
||||
s_1=pChannel->s_1;
|
||||
s_2=pChannel->s_2;
|
||||
|
||||
|
||||
predict_nr=(s32)start[0];
|
||||
shift_factor=predict_nr&0xf;
|
||||
predict_nr >>= 4;
|
||||
flags=(s32)start[1];
|
||||
start += 2;
|
||||
|
||||
pChannel->iSBPos=0;
|
||||
|
||||
for (nSample=0;nSample<28; ++start)
|
||||
// decode the 16byte packet
|
||||
s_1=pChannel->s_1;
|
||||
s_2=pChannel->s_2;
|
||||
|
||||
for (nSample=0; nSample<28; ++start)
|
||||
{
|
||||
d = (int)*start;
|
||||
int s;
|
||||
int d = (int)*start;
|
||||
|
||||
s = ((d & 0xf)<<12);
|
||||
if (s & 0x8000) s |= 0xffff0000;
|
||||
|
||||
|
@ -669,23 +672,22 @@ void SPU2Worker()
|
|||
fa += ((s_1 * f[predict_nr][0]) >> 6) + ((s_2 * f[predict_nr][1]) >> 6);
|
||||
s_2 = s_1;
|
||||
s_1 = fa;
|
||||
s = ((d & 0xf0) << 8);
|
||||
|
||||
pChannel->SB[nSample++]=fa;
|
||||
|
||||
|
||||
s = ((d & 0xf0) << 8);
|
||||
if (s & 0x8000) s|=0xffff0000;
|
||||
|
||||
fa = (s>>shift_factor);
|
||||
fa += ((s_1 * f[predict_nr][0])>>6) + ((s_2 * f[predict_nr][1]) >> 6);
|
||||
s_2 = s_1;
|
||||
s_1 = fa;
|
||||
|
||||
pChannel->SB[nSample++]=fa;
|
||||
}
|
||||
|
||||
// irq occurs no matter what core access the address
|
||||
for (int core = 0; core < 2; ++core)
|
||||
{
|
||||
if (((SPU_CONTROL_*)(spu2regs + 0x400 * core + REG_C0_CTRL))->irq) // some callback and irq active?
|
||||
if (((SPU_CONTROL_*)(spu2regs + (0x400 * core) + REG_C0_CTRL))->irq) // some callback and irq active?
|
||||
{
|
||||
// if irq address reached or irq on looping addr, when stop/loop flag is set
|
||||
u8* pirq = (u8*)pSpuIrq[core];
|
||||
|
@ -700,7 +702,7 @@ void SPU2Worker()
|
|||
|
||||
// flag handler
|
||||
if ((flags&4) && (!pChannel->bIgnoreLoop))
|
||||
pChannel->pLoop=start-16; // loop adress
|
||||
pChannel->pLoop=start-16; // loop address
|
||||
|
||||
if (flags&1) // 1: stop/loop
|
||||
{
|
||||
|
@ -1457,114 +1459,142 @@ int CALLBACK SPU2setupRecording(int start, void* pData)
|
|||
return 1;
|
||||
}
|
||||
|
||||
void save_data(freezeData *data)
|
||||
{
|
||||
SPU2freezeData *spud;
|
||||
int i;
|
||||
|
||||
spud = (SPU2freezeData*)data->data;
|
||||
spud->version = 0x70000001;
|
||||
|
||||
memcpy(spud->spu2regs, spu2regs, 0x10000);
|
||||
memcpy(spud->spu2mem, spu2mem, 0x200000);
|
||||
|
||||
spud->nSpuIrq[0] = (int)(pSpuIrq[0] - spu2mem);
|
||||
spud->nSpuIrq[1] = (int)(pSpuIrq[1] - spu2mem);
|
||||
|
||||
memcpy(spud->dwNewChannel2, dwNewChannel2, 4*2);
|
||||
memcpy(spud->dwEndChannel2, dwEndChannel2, 4*2);
|
||||
|
||||
spud->dwNoiseVal = dwNoiseVal;
|
||||
spud->interrupt = interrupt;
|
||||
|
||||
memcpy(spud->iFMod, iFMod, sizeof(iFMod));
|
||||
memcpy(spud->MemAddr, MemAddr, sizeof(MemAddr));
|
||||
|
||||
spud->adma[0] = Adma4;
|
||||
spud->adma[1] = Adma7;
|
||||
spud->Adma4MemAddr = (u32)((uptr)Adma4.MemAddr - g_pDMABaseAddr);
|
||||
spud->Adma7MemAddr = (u32)((uptr)Adma7.MemAddr - g_pDMABaseAddr);
|
||||
|
||||
spud->SPUCycles = SPUCycles;
|
||||
spud->SPUWorkerCycles = SPUWorkerCycles;
|
||||
|
||||
memcpy(spud->SPUStartCycle, SPUStartCycle, sizeof(SPUStartCycle));
|
||||
memcpy(spud->SPUTargetCycle, SPUTargetCycle, sizeof(SPUTargetCycle));
|
||||
|
||||
for (i = 0; i < ARRAYSIZE(s_nDurations); ++i)
|
||||
{
|
||||
s_nDurations[i] = NSFRAMES*1000;
|
||||
}
|
||||
|
||||
s_nTotalDuration = ARRAYSIZE(s_nDurations)*NSFRAMES*1000;
|
||||
s_nCurDuration = 0;
|
||||
|
||||
spud->voicesize = SPU_VOICE_STATE_SIZE;
|
||||
for (i = 0; i < ARRAYSIZE(voices); ++i)
|
||||
{
|
||||
memcpy(&spud->voices[i], &voices[i], SPU_VOICE_STATE_SIZE);
|
||||
spud->voices[i].pStart = (u8*)((uptr)voices[i].pStart-(uptr)spu2mem);
|
||||
spud->voices[i].pLoop = (u8*)((uptr)voices[i].pLoop-(uptr)spu2mem);
|
||||
spud->voices[i].pCurr = (u8*)((uptr)voices[i].pCurr-(uptr)spu2mem);
|
||||
}
|
||||
|
||||
g_startcount=0xffffffff;
|
||||
s_GlobalTimeStamp = 0;
|
||||
s_nDropPacket = 0;
|
||||
}
|
||||
|
||||
void load_data(freezeData *data)
|
||||
{
|
||||
SPU2freezeData *spud;
|
||||
int i;
|
||||
|
||||
spud = (SPU2freezeData*)data->data;
|
||||
|
||||
if (spud->version != 0x70000001)
|
||||
{
|
||||
ERROR_LOG("zerospu2: Sound data either corrupted or from another plugin. Ignoring.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(spu2regs, spud->spu2regs, 0x10000);
|
||||
memcpy(spu2mem, spud->spu2mem, 0x200000);
|
||||
|
||||
pSpuIrq[0] = spu2mem + spud->nSpuIrq[0];
|
||||
pSpuIrq[1] = spu2mem + spud->nSpuIrq[1];
|
||||
|
||||
memcpy(dwNewChannel2, spud->dwNewChannel2, 4*2);
|
||||
memcpy(dwEndChannel2, spud->dwEndChannel2, 4*2);
|
||||
|
||||
dwNoiseVal = spud->dwNoiseVal;
|
||||
interrupt = spud->interrupt;
|
||||
|
||||
memcpy(iFMod, spud->iFMod, sizeof(iFMod));
|
||||
memcpy(MemAddr, spud->MemAddr, sizeof(MemAddr));
|
||||
|
||||
Adma4 = spud->adma[0];
|
||||
Adma7 = spud->adma[1];
|
||||
Adma4.MemAddr = (u16*)(g_pDMABaseAddr+spud->Adma4MemAddr);
|
||||
Adma7.MemAddr = (u16*)(g_pDMABaseAddr+spud->Adma7MemAddr);
|
||||
|
||||
SPUCycles = spud->SPUCycles;
|
||||
SPUWorkerCycles = spud->SPUWorkerCycles;
|
||||
|
||||
memcpy(SPUStartCycle, spud->SPUStartCycle, sizeof(SPUStartCycle));
|
||||
memcpy(SPUTargetCycle, spud->SPUTargetCycle, sizeof(SPUTargetCycle));
|
||||
|
||||
for (i = 0; i < ARRAYSIZE(voices); ++i)
|
||||
{
|
||||
memcpy(&voices[i], &spud->voices[i], min((int)SPU_VOICE_STATE_SIZE, spud->voicesize));
|
||||
voices[i].pStart = (u8*)((uptr)spud->voices[i].pStart+(uptr)spu2mem);
|
||||
voices[i].pLoop = (u8*)((uptr)spud->voices[i].pLoop+(uptr)spu2mem);
|
||||
voices[i].pCurr = (u8*)((uptr)spud->voices[i].pCurr+(uptr)spu2mem);
|
||||
}
|
||||
|
||||
s_GlobalTimeStamp = 0;
|
||||
g_startcount = 0xffffffff;
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(s_nDurations); ++i)
|
||||
{
|
||||
s_nDurations[i] = NSFRAMES*1000;
|
||||
}
|
||||
|
||||
s_nTotalDuration = ARRAYSIZE(s_nDurations)*NSFRAMES*1000;
|
||||
s_nCurDuration = 0;
|
||||
s_nQueuedBuffers = 0;
|
||||
s_nDropPacket = 0;
|
||||
}
|
||||
|
||||
s32 CALLBACK SPU2freeze(int mode, freezeData *data)
|
||||
{
|
||||
LOG_CALLBACK("SPU2freeze()\n");
|
||||
SPU2freezeData *spud;
|
||||
int i;
|
||||
assert( g_pDMABaseAddr != 0 );
|
||||
|
||||
if (mode == FREEZE_LOAD)
|
||||
switch (mode)
|
||||
{
|
||||
spud = (SPU2freezeData*)data->data;
|
||||
if (spud->version != 0x70000001)
|
||||
{
|
||||
ERROR_LOG("zerospu2: data wrong format\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(spu2regs, spud->spu2regs, 0x10000);
|
||||
memcpy(spu2mem, spud->spu2mem, 0x200000);
|
||||
pSpuIrq[0] = spu2mem + spud->nSpuIrq[0];
|
||||
pSpuIrq[1] = spu2mem + spud->nSpuIrq[1];
|
||||
memcpy(dwNewChannel2, spud->dwNewChannel2, 4*2);
|
||||
memcpy(dwEndChannel2, spud->dwEndChannel2, 4*2);
|
||||
dwNoiseVal = spud->dwNoiseVal;
|
||||
memcpy(iFMod, spud->iFMod, sizeof(iFMod));
|
||||
interrupt = spud->interrupt;
|
||||
memcpy(MemAddr, spud->MemAddr, sizeof(MemAddr));
|
||||
Adma4 = spud->adma[0];
|
||||
Adma4.MemAddr = (u16*)(g_pDMABaseAddr+spud->Adma4MemAddr);
|
||||
Adma7 = spud->adma[1];
|
||||
Adma7.MemAddr = (u16*)(g_pDMABaseAddr+spud->Adma7MemAddr);
|
||||
|
||||
SPUCycles = spud->SPUCycles;
|
||||
SPUWorkerCycles = spud->SPUWorkerCycles;
|
||||
memcpy(SPUStartCycle, spud->SPUStartCycle, sizeof(SPUStartCycle));
|
||||
memcpy(SPUTargetCycle, spud->SPUTargetCycle, sizeof(SPUTargetCycle));
|
||||
|
||||
for (i = 0; i < ARRAYSIZE(voices); ++i)
|
||||
{
|
||||
memcpy(&voices[i], &spud->voices[i], min((int)SPU_VOICE_STATE_SIZE, spud->voicesize));
|
||||
voices[i].pStart = (u8*)((uptr)spud->voices[i].pStart+(uptr)spu2mem);
|
||||
voices[i].pLoop = (u8*)((uptr)spud->voices[i].pLoop+(uptr)spu2mem);
|
||||
voices[i].pCurr = (u8*)((uptr)spud->voices[i].pCurr+(uptr)spu2mem);
|
||||
}
|
||||
|
||||
s_GlobalTimeStamp = 0;
|
||||
g_startcount = 0xffffffff;
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(s_nDurations); ++i)
|
||||
{
|
||||
s_nDurations[i] = NSFRAMES*1000;
|
||||
}
|
||||
|
||||
s_nTotalDuration = ARRAYSIZE(s_nDurations)*NSFRAMES*1000;
|
||||
s_nCurDuration = 0;
|
||||
s_nQueuedBuffers = 0;
|
||||
s_nDropPacket = 0;
|
||||
case FREEZE_LOAD:
|
||||
load_data(data);
|
||||
break;
|
||||
case FREEZE_SAVE:
|
||||
save_data(data);
|
||||
break;
|
||||
case FREEZE_SIZE:
|
||||
data->size = sizeof(SPU2freezeData);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else if (mode == FREEZE_SAVE)
|
||||
{
|
||||
spud = (SPU2freezeData*)data->data;
|
||||
spud->version = 0x70000001;
|
||||
|
||||
memcpy(spud->spu2regs, spu2regs, 0x10000);
|
||||
memcpy(spud->spu2mem, spu2mem, 0x200000);
|
||||
spud->nSpuIrq[0] = (int)(pSpuIrq[0] - spu2mem);
|
||||
spud->nSpuIrq[1] = (int)(pSpuIrq[1] - spu2mem);
|
||||
memcpy(spud->dwNewChannel2, dwNewChannel2, 4*2);
|
||||
memcpy(spud->dwEndChannel2, dwEndChannel2, 4*2);
|
||||
spud->dwNoiseVal = dwNoiseVal;
|
||||
memcpy(spud->iFMod, iFMod, sizeof(iFMod));
|
||||
spud->interrupt = interrupt;
|
||||
memcpy(spud->MemAddr, MemAddr, sizeof(MemAddr));
|
||||
|
||||
spud->adma[0] = Adma4;
|
||||
spud->Adma4MemAddr = (u32)((uptr)Adma4.MemAddr - g_pDMABaseAddr);
|
||||
spud->adma[1] = Adma7;
|
||||
spud->Adma7MemAddr = (u32)((uptr)Adma7.MemAddr - g_pDMABaseAddr);
|
||||
|
||||
spud->SPUCycles = SPUCycles;
|
||||
spud->SPUWorkerCycles = SPUWorkerCycles;
|
||||
|
||||
memcpy(spud->SPUStartCycle, SPUStartCycle, sizeof(SPUStartCycle));
|
||||
memcpy(spud->SPUTargetCycle, SPUTargetCycle, sizeof(SPUTargetCycle));
|
||||
|
||||
for (i = 0; i < ARRAYSIZE(s_nDurations); ++i)
|
||||
{
|
||||
s_nDurations[i] = NSFRAMES*1000;
|
||||
}
|
||||
s_nTotalDuration = ARRAYSIZE(s_nDurations)*NSFRAMES*1000;
|
||||
s_nCurDuration = 0;
|
||||
|
||||
spud->voicesize = SPU_VOICE_STATE_SIZE;
|
||||
for (i = 0; i < ARRAYSIZE(voices); ++i)
|
||||
{
|
||||
memcpy(&spud->voices[i], &voices[i], SPU_VOICE_STATE_SIZE);
|
||||
spud->voices[i].pStart = (u8*)((uptr)voices[i].pStart-(uptr)spu2mem);
|
||||
spud->voices[i].pLoop = (u8*)((uptr)voices[i].pLoop-(uptr)spu2mem);
|
||||
spud->voices[i].pCurr = (u8*)((uptr)voices[i].pCurr-(uptr)spu2mem);
|
||||
}
|
||||
|
||||
g_startcount=0xffffffff;
|
||||
s_GlobalTimeStamp = 0;
|
||||
s_nDropPacket = 0;
|
||||
}
|
||||
else if (mode == FREEZE_SIZE)
|
||||
{
|
||||
data->size = sizeof(SPU2freezeData);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue