- optimize SPU and fix bug [#1356];
winport:
- optimize Sound View Tool;
This commit is contained in:
mtabachenko 2013-11-30 03:15:42 +00:00
parent 02701e48d9
commit f9eb416311
6 changed files with 812 additions and 500 deletions

View File

@ -4695,7 +4695,7 @@ void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)
if (slot2_write<ARMCPU_ARM7, u8>(adr, val))
return;
if ((adr >= 0x04000400) && (adr < 0x04000520))
if (SPU_core->isSPU(adr))
{
SPU_WriteByte(adr, val);
return;
@ -4801,7 +4801,7 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
if (slot2_write<ARMCPU_ARM7, u16>(adr, val))
return;
if ((adr >= 0x04000400) && (adr < 0x04000520))
if (SPU_core->isSPU(adr))
{
SPU_WriteWord(adr, val);
return;
@ -4982,7 +4982,7 @@ void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
if (slot2_write<ARMCPU_ARM7, u32>(adr, val))
return;
if ((adr >= 0x04000400) && (adr < 0x04000520))
if (SPU_core->isSPU(adr))
{
SPU_WriteLong(adr, val);
return;
@ -5103,7 +5103,7 @@ u8 FASTCALL _MMU_ARM7_read08(u32 adr)
if (slot2_read<ARMCPU_ARM7, u8>(adr, slot2_val))
return slot2_val;
if ((adr>=0x04000400)&&(adr<0x04000520))
if (SPU_core->isSPU(adr))
{
return SPU_ReadByte(adr);
}
@ -5159,7 +5159,7 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr)
if (slot2_read<ARMCPU_ARM7, u16>(adr, slot2_val))
return slot2_val;
if ((adr>=0x04000400)&&(adr<0x04000520))
if (SPU_core->isSPU(adr))
{
return SPU_ReadWord(adr);
}
@ -5259,7 +5259,7 @@ u32 FASTCALL _MMU_ARM7_read32(u32 adr)
if (slot2_read<ARMCPU_ARM7, u32>(adr, slot2_val))
return slot2_val;
if ((adr>=0x04000400)&&(adr<0x04000520))
if (SPU_core->isSPU(adr))
{
return SPU_ReadLong(adr);
}

View File

@ -72,6 +72,7 @@ extern SoundInterface_struct *SNDCoreList[];
//const int shift = (FORMAT == 0 ? 2 : 1);
static const int format_shift[] = { 2, 1, 3, 0 };
static const u8 volume_shift[] = { 0, 1, 2, 4 };
static const s8 indextbl[8] =
{
@ -397,8 +398,8 @@ void SPU_struct::KeyOn(int channel)
//printf("keyon %d totlength:%d\n",channel,thischan.totlength);
//LOG("Channel %d key on: vol = %d, datashift = %d, hold = %d, pan = %d, waveduty = %d, repeat = %d, format = %d, source address = %07X,"
// "timer = %04X, loop start = %04X, length = %06X, MMU.ARM7_REG[0x501] = %02X\n", channel, chan->vol, chan->datashift, chan->hold,
//LOG("Channel %d key on: vol = %d, volumeDiv = %d, hold = %d, pan = %d, waveduty = %d, repeat = %d, format = %d, source address = %07X,"
// "timer = %04X, loop start = %04X, length = %06X, MMU.ARM7_REG[0x501] = %02X\n", channel, chan->vol, chan->volumeDiv, chan->hold,
// chan->pan, chan->waveduty, chan->repeat, chan->format, chan->addr, chan->timer, chan->loopstart, chan->length, T1ReadByte(MMU.ARM7_REG, 0x501));
switch(thischan.format)
@ -448,119 +449,225 @@ void SPU_struct::KeyOn(int channel)
//////////////////////////////////////////////////////////////////////////////
#define SETBYTE(which,oldval,newval) oldval = (oldval & (~(0xFF<<(which*8)))) | ((newval)<<(which*8))
#define GETBYTE(which,val) ((val>>(which*8))&0xFF)
u8 SPU_struct::ReadByte(u32 addr)
{
//individual channel regs
if ((addr & 0x0F00) == 0x0400)
{
u32 chan_num = (addr >> 4) & 0xF;
channel_struct &thischan=channels[chan_num];
switch (addr & 0xF)
{
case 0x0: return thischan.vol;
case 0x1: return (thischan.volumeDiv | (thischan.hold << 7));
case 0x2: return thischan.pan;
case 0x3: return ( thischan.waveduty
| (thischan.repeat << 3)
| (thischan.format << 5)
| ((thischan.status == CHANSTAT_PLAY)?0x80:0)
);
case 0x8: return *(u8*)(thischan.timer + 0);
case 0x9: return *(u8*)(thischan.timer + 1);
case 0xA: return *(u8*)(thischan.loopstart + 0);
case 0xB: return *(u8*)(thischan.loopstart + 1);
}
return 0;
}
u8 SPU_ReadByte(u32 addr) {
addr &= 0xFFF;
return SPU_core->ReadByte(addr);
}
u16 SPU_ReadWord(u32 addr) {
addr &= 0xFFF;
return SPU_core->ReadWord(addr);
}
u32 SPU_ReadLong(u32 addr) {
addr &= 0xFFF;
return SPU_core->ReadLong(addr);
switch(addr)
{
//SOUNDCNT
case 0x500: return regs.mastervol;
case 0x501: return (regs.ctl_left
| (regs.ctl_right << 2)
| (regs.ctl_ch1bypass << 4)
| (regs.ctl_ch3bypass << 5)
| (regs.masteren << 7)
);
//SOUNDBIAS
case 0x504: return *(u8*)(regs.soundbias + 0);
case 0x505: return *(u8*)(regs.soundbias + 1);
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
case 0x509:
{
u32 which = (addr - 0x508);
return regs.cap[which].add
| (regs.cap[which].source << 1)
| (regs.cap[which].oneshot << 2)
| (regs.cap[which].bits8 << 3)
| (regs.cap[which].runtime.running << 7);
}
//SNDCAP0DAD
case 0x510: return *(u8*)(regs.cap[0].dad + 0);
case 0x511: return *(u8*)(regs.cap[0].dad + 1);
case 0x512: return *(u8*)(regs.cap[0].dad + 2);
case 0x513: return *(u8*)(regs.cap[0].dad + 3);
//SNDCAP0LEN
case 0x514: return *(u8*)(regs.cap[0].len + 0);
case 0x515: return *(u8*)(regs.cap[0].len + 1);
//SNDCAP1DAD
case 0x518: return *(u8*)(regs.cap[1].dad + 0);
case 0x519: return *(u8*)(regs.cap[1].dad + 1);
case 0x51A: return *(u8*)(regs.cap[1].dad + 2);
case 0x51B: return *(u8*)(regs.cap[1].dad + 3);
//SNDCAP1LEN
case 0x51C: return *(u8*)(regs.cap[1].len + 0);
case 0x51D: return *(u8*)(regs.cap[1].len + 1);
} //switch on address
return 0;
}
u16 SPU_struct::ReadWord(u32 addr)
{
return ReadByte(addr)|(ReadByte(addr+1)<<8);
//individual channel regs
if ((addr & 0x0F00) == 0x0400)
{
u32 chan_num = (addr >> 4) & 0xF;
channel_struct &thischan=channels[chan_num];
switch (addr & 0xF)
{
case 0x0: return (thischan.vol
| (thischan.volumeDiv << 8)
| (thischan.hold << 15)
);
case 0x2: return (thischan.pan
| (thischan.waveduty << 8)
| (thischan.repeat << 11)
| (thischan.format << 13)
| ((thischan.status == CHANSTAT_PLAY)?(1 << 15):0)
);
case 0x8: return thischan.timer;
case 0xA: return thischan.loopstart;
} //switch on individual channel regs
return 0;
}
switch(addr)
{
//SOUNDCNT
case 0x500: return (regs.mastervol
| (regs.ctl_left << 8)
| (regs.ctl_right << 10)
| (regs.ctl_ch1bypass << 12)
| (regs.ctl_ch3bypass << 13)
| (regs.masteren << 15)
);
//SOUNDBIAS
case 0x504: return regs.soundbias;
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
{
u8 val0 = regs.cap[0].add
| (regs.cap[0].source << 1)
| (regs.cap[0].oneshot << 2)
| (regs.cap[0].bits8 << 3)
| (regs.cap[0].runtime.running << 7);
u8 val1 = regs.cap[1].add
| (regs.cap[1].source << 1)
| (regs.cap[1].oneshot << 2)
| (regs.cap[1].bits8 << 3)
| (regs.cap[1].runtime.running << 7);
return (u16)(val0 | (val1 << 8));
}
//SNDCAP0DAD
case 0x510: return *(u16*)(regs.cap[0].dad + 0);
case 0x512: return *(u16*)(regs.cap[0].dad + 1);
//SNDCAP0LEN
case 0x514: return regs.cap[0].len;
//SNDCAP1DAD
case 0x518: return *(u16*)(regs.cap[1].dad + 0);
case 0x51A: return *(u16*)(regs.cap[1].dad + 1);
//SNDCAP1LEN
case 0x51C: return regs.cap[1].len;
} //switch on address
return 0;
}
u32 SPU_struct::ReadLong(u32 addr)
{
return ReadByte(addr)|(ReadByte(addr+1)<<8)|(ReadByte(addr+2)<<16)|(ReadByte(addr+3)<<24);
}
u8 SPU_struct::ReadByte(u32 addr)
{
switch(addr)
//individual channel regs
if ((addr & 0x0F00) == 0x0400)
{
//SOUNDCNT
case 0x500: return regs.mastervol;
case 0x501:
return (regs.ctl_left)|(regs.ctl_right<<2)|(regs.ctl_ch1bypass<<4)|(regs.ctl_ch3bypass<<5)|(regs.masteren<<7);
case 0x502: return 0;
case 0x503: return 0;
//SOUNDBIAS
case 0x504: return regs.soundbias&0xFF;
case 0x505: return (regs.soundbias>>8)&0xFF;
case 0x506: return 0;
case 0x507: return 0;
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
case 0x509: {
u32 which = addr-0x508;
return regs.cap[which].add
| (regs.cap[which].source<<1)
| (regs.cap[which].oneshot<<2)
| (regs.cap[which].bits8<<3)
//| (regs.cap[which].active<<7); //? which is right? need test
| (regs.cap[which].runtime.running<<7);
}
//SNDCAP0DAD
case 0x510: return GETBYTE(0,regs.cap[0].dad);
case 0x511: return GETBYTE(1,regs.cap[0].dad);
case 0x512: return GETBYTE(2,regs.cap[0].dad);
case 0x513: return GETBYTE(3,regs.cap[0].dad);
//SNDCAP0LEN
case 0x514: return GETBYTE(0,regs.cap[0].len);
case 0x515: return GETBYTE(1,regs.cap[0].len);
case 0x516: return 0; //not used
case 0x517: return 0; //not used
//SNDCAP1DAD
case 0x518: return GETBYTE(0,regs.cap[1].dad);
case 0x519: return GETBYTE(1,regs.cap[1].dad);
case 0x51A: return GETBYTE(2,regs.cap[1].dad);
case 0x51B: return GETBYTE(3,regs.cap[1].dad);
//SNDCAP1LEN
case 0x51C: return GETBYTE(0,regs.cap[1].len);
case 0x51D: return GETBYTE(1,regs.cap[1].len);
case 0x51E: return 0; //not used
case 0x51F: return 0; //not used
default: {
//individual channel regs
u32 chan_num = (addr >> 4) & 0xF;
if(chan_num>0xF) return 0;
channel_struct &thischan=channels[chan_num];
switch(addr & 0xF) {
case 0x0: return thischan.vol;
case 0x1: {
u8 ret = thischan.datashift;
if(ret==4) ret=3;
ret |= thischan.hold<<7;
return ret;
}
case 0x2: return thischan.pan;
case 0x3: return thischan.waveduty|(thischan.repeat<<3)|(thischan.format<<5)|((thischan.status == CHANSTAT_PLAY)?0x80:0);
case 0x4: return 0; //return GETBYTE(0,thischan.addr); //not readable
case 0x5: return 0; //return GETBYTE(1,thischan.addr); //not readable
case 0x6: return 0; //return GETBYTE(2,thischan.addr); //not readable
case 0x7: return 0; //return GETBYTE(3,thischan.addr); //not readable
case 0x8: return GETBYTE(0,thischan.timer);
case 0x9: return GETBYTE(1,thischan.timer);
case 0xA: return GETBYTE(0,thischan.loopstart);
case 0xB: return GETBYTE(1,thischan.loopstart);
case 0xC: return 0; //return GETBYTE(0,thischan.length); //not readable
case 0xD: return 0; //return GETBYTE(1,thischan.length); //not readable
case 0xE: return 0; //return GETBYTE(2,thischan.length); //not readable
case 0xF: return 0; //return GETBYTE(3,thischan.length); //not readable
default: return 0; //impossible
switch (addr & 0xF)
{
case 0x0: return (thischan.vol
| (thischan.volumeDiv << 8)
| (thischan.hold << 15)
| (thischan.pan << 16)
| (thischan.waveduty << 24)
| (thischan.repeat << 27)
| (thischan.format << 29)
| ((thischan.status == CHANSTAT_PLAY)?(1 << 31):0)
);
case 0x8: return (thischan.timer | (thischan.loopstart << 16));
} //switch on individual channel regs
} //default case
return 0;
}
switch(addr)
{
//SOUNDCNT
case 0x500: return (regs.mastervol
| (regs.ctl_left << 8)
| (regs.ctl_right << 10)
| (regs.ctl_ch1bypass << 12)
| (regs.ctl_ch3bypass << 13)
| (regs.masteren << 15)
);
//SOUNDBIAS
case 0x504: return (u32)regs.soundbias;
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
{
u8 val0 = regs.cap[0].add
| (regs.cap[0].source << 1)
| (regs.cap[0].oneshot << 2)
| (regs.cap[0].bits8 << 3)
| (regs.cap[0].runtime.running << 7);
u8 val1 = regs.cap[1].add
| (regs.cap[1].source << 1)
| (regs.cap[1].oneshot << 2)
| (regs.cap[1].bits8 << 3)
| (regs.cap[1].runtime.running << 7);
return (u32)(val0 | (val1 << 8));
}
//SNDCAP0DAD
case 0x510: return regs.cap[0].dad;
//SNDCAP0LEN
case 0x514: return (u32)regs.cap[0].len;
//SNDCAP1DAD
case 0x518: return regs.cap[1].dad;
//SNDCAP1LEN
case 0x51C: return (u32)regs.cap[1].len;
} //switch on address
return 0;
}
SPUFifo::SPUFifo()
@ -637,167 +744,265 @@ void SPU_struct::ProbeCapture(int which)
void SPU_struct::WriteByte(u32 addr, u8 val)
{
switch(addr)
//individual channel regs
if ((addr & 0x0F00) == 0x0400)
{
//SOUNDCNT
case 0x500:
regs.mastervol = val&0x7F;
break;
case 0x501:
regs.ctl_left = (val>>0)&3;
regs.ctl_right = (val>>2)&3;
regs.ctl_ch1bypass = (val>>4)&1;
regs.ctl_ch3bypass = (val>>5)&1;
regs.masteren = (val>>7)&1;
for(int i=0;i<16;i++)
KeyProbe(i);
break;
case 0x502: break; //not used
case 0x503: break; //not used
//SOUNDBIAS
case 0x504: SETBYTE(0,regs.soundbias, val); break;
case 0x505: SETBYTE(1,regs.soundbias, val&3); break;
case 0x506: break; //these dont answer anyway
case 0x507: break; //these dont answer anyway
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
case 0x509: {
u32 which = addr-0x508;
regs.cap[which].add = BIT0(val);
regs.cap[which].source = BIT1(val);
regs.cap[which].oneshot = BIT2(val);
regs.cap[which].bits8 = BIT3(val);
regs.cap[which].active = BIT7(val);
ProbeCapture(which);
break;
}
//SNDCAP0DAD
case 0x510: SETBYTE(0,regs.cap[0].dad,val); break;
case 0x511: SETBYTE(1,regs.cap[0].dad,val); break;
case 0x512: SETBYTE(2,regs.cap[0].dad,val); break;
case 0x513: SETBYTE(3,regs.cap[0].dad,val&7); break;
//SNDCAP0LEN
case 0x514: SETBYTE(0,regs.cap[0].len,val); break;
case 0x515: SETBYTE(1,regs.cap[0].len,val); break;
case 0x516: break; //not used
case 0x517: break; //not used
//SNDCAP1DAD
case 0x518: SETBYTE(0,regs.cap[1].dad,val); break;
case 0x519: SETBYTE(1,regs.cap[1].dad,val); break;
case 0x51A: SETBYTE(2,regs.cap[1].dad,val); break;
case 0x51B: SETBYTE(3,regs.cap[1].dad,val&7); break;
//SNDCAP1LEN
case 0x51C: SETBYTE(0,regs.cap[1].len,val); break;
case 0x51D: SETBYTE(1,regs.cap[1].len,val); break;
case 0x51E: break; //not used
case 0x51F: break; //not used
default: {
//individual channel regs
u32 chan_num = (addr >> 4) & 0xF;
if(chan_num>0xF) break;
u8 chan_num = (addr >> 4) & 0xF;
channel_struct &thischan=channels[chan_num];
switch(addr & 0xF) {
case 0x0:
thischan.vol = val & 0x7F;
break;
switch (addr & 0x000F)
{
case 0x0: thischan.vol = (val & 0x7F); break;
case 0x1:
thischan.datashift = val & 0x3;
if (thischan.datashift == 3)
thischan.datashift = 4;
thischan.hold = (val >> 7) & 0x1;
break;
case 0x2:
thischan.pan = val & 0x7F;
thischan.volumeDiv = (val & 0x03);
thischan.hold = (val >> 7) & 0x01;
break;
case 0x2: thischan.pan = (val & 0x7F); break;
case 0x3:
thischan.waveduty = val & 0x7;
thischan.repeat = (val >> 3) & 0x3;
thischan.format = (val >> 5) & 0x3;
thischan.keyon = BIT7(val);
thischan.waveduty = (val & 0x07);
thischan.repeat = (val >> 3) & 0x03;
thischan.format = (val >> 5) & 0x03;
thischan.keyon = (val >> 7) & 0x01;
KeyProbe(chan_num);
break;
case 0x4: SETBYTE(0,thischan.addr,val); break;
case 0x5: SETBYTE(1,thischan.addr,val); break;
case 0x6: SETBYTE(2,thischan.addr,val); break;
case 0x7: SETBYTE(3,thischan.addr,val&0x7); break; //only 27 bits of this register are used
case 0x8:
SETBYTE(0,thischan.timer,val);
adjust_channel_timer(&thischan);
break;
case 0x9:
SETBYTE(1,thischan.timer,val);
adjust_channel_timer(&thischan);
break;
case 0xA: SETBYTE(0,thischan.loopstart,val); break;
case 0xB: SETBYTE(1,thischan.loopstart,val); break;
case 0xC: SETBYTE(0,thischan.length,val); break;
case 0xD: SETBYTE(1,thischan.length,val); break;
case 0xE: SETBYTE(2,thischan.length,val & 0x3F); break; //only 22 bits of this register are used
case 0xF: SETBYTE(3,thischan.length,0); break;
case 0x4: *(u8*)(thischan.addr + 0) = (val & 0xFC); break;
case 0x5: *(u8*)(thischan.addr + 1) = val; break;
case 0x6: *(u8*)(thischan.addr + 2) = val; break;
case 0x7: *(u8*)(thischan.addr + 3) = (val & 0x07); break; //only 27 bits of this register are used
case 0x8: *(u8*)(thischan.timer + 0) = val; adjust_channel_timer(&thischan); break;
case 0x9: *(u8*)(thischan.timer + 1) = val; adjust_channel_timer(&thischan); break;
case 0xA: *(u8*)(thischan.loopstart + 0) = val; break;
case 0xB: *(u8*)(thischan.loopstart + 1) = val; break;
case 0xC: *(u8*)(thischan.length + 0) = val; break;
case 0xD: *(u8*)(thischan.length + 1) = val; break;
case 0xE: *(u8*)(thischan.length + 2) = (val & 0x3F); break; //only 22 bits of this register are used
case 0xF: *(u8*)(thischan.length + 3) = 0; break;
} //switch on individual channel regs
} //default case
return;
}
switch(addr)
{
//SOUNDCNT
case 0x500: regs.mastervol = (val & 0x7F); break;
case 0x501:
regs.ctl_left = (val >> 0) & 3;
regs.ctl_right = (val >> 2) & 3;
regs.ctl_ch1bypass = (val >> 4) & 1;
regs.ctl_ch3bypass = (val >> 5) & 1;
regs.masteren = (val >> 7) & 1;
for(u8 i=0; i<16; i++)
KeyProbe(i);
break;
//SOUNDBIAS
case 0x504: *(u8*)(regs.soundbias + 0) = val; break;
case 0x505: *(u8*)(regs.soundbias + 1) = (val & 0x03); break;
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
case 0x509:
{
u32 which = (addr - 0x508);
regs.cap[which].add = BIT0(val);
regs.cap[which].source = BIT1(val);
regs.cap[which].oneshot = BIT2(val);
regs.cap[which].bits8 = BIT3(val);
regs.cap[which].active = BIT7(val);
ProbeCapture(which);
break;
}
//SNDCAP0DAD
case 0x510: *(u8*)(regs.cap[0].dad + 0) = (val & 0xFC); break;
case 0x511: *(u8*)(regs.cap[0].dad + 1) = val; break;
case 0x512: *(u8*)(regs.cap[0].dad + 2) = val; break;
case 0x513: *(u8*)(regs.cap[0].dad + 3) = (val & 0x07); break;
//SNDCAP0LEN
case 0x514: *(u8*)(regs.cap[0].len + 0) = val; break;
case 0x515: *(u8*)(regs.cap[0].len + 1) = val; break;
//SNDCAP1DAD
case 0x518: *(u8*)(regs.cap[1].dad + 0) = (val & 0xFC); break;
case 0x519: *(u8*)(regs.cap[1].dad + 1) = val; break;
case 0x51A: *(u8*)(regs.cap[1].dad + 2) = val; break;
case 0x51B: *(u8*)(regs.cap[1].dad + 3) = (val & 0x07); break;
//SNDCAP1LEN
case 0x51C: *(u8*)(regs.cap[1].len + 0) = val; break;
case 0x51D: *(u8*)(regs.cap[1].len + 1) = val; break;
} //switch on address
}
void SPU_WriteByte(u32 addr, u8 val)
{
//printf("%08X: chan:%02X reg:%02X val:%02X\n",addr,(addr>>4)&0xF,addr&0xF,val);
addr &= 0xFFF;
SPU_core->WriteByte(addr,val);
if(SPU_user) SPU_user->WriteByte(addr,val);
}
//////////////////////////////////////////////////////////////////////////////
void SPU_struct::WriteWord(u32 addr, u16 val)
{
WriteByte(addr,val&0xFF);
WriteByte(addr+1,(val>>8)&0xFF);
//individual channel regs
if ((addr & 0x0F00) == 0x0400)
{
u32 chan_num = (addr >> 4) & 0xF;
channel_struct &thischan=channels[chan_num];
switch (addr & 0xF)
{
case 0x0:
thischan.vol = (val & 0x7F);
thischan.volumeDiv = (val >> 8) & 0x3;
thischan.hold = (val >> 15) & 0x1;
break;
case 0x2:
thischan.pan = (val & 0x7F);
thischan.waveduty = (val >> 8) & 0x7;
thischan.repeat = (val >> 11) & 0x3;
thischan.format = (val >> 13) & 0x3;
thischan.keyon = (val >> 15) & 0x1;
KeyProbe(chan_num);
break;
case 0x4: *(u16*)(thischan.addr + 0) = (val & 0xFFFC); break;
case 0x6: *(u16*)(thischan.addr + 1) = (val & 0x07FF); break;
case 0x8: thischan.timer = val; adjust_channel_timer(&thischan); break;
case 0xA: thischan.loopstart = val; break;
case 0xC: *(u16*)(thischan.length + 0) = val; break;
case 0xE: *(u16*)(thischan.length + 1) = (val & 0x003F); break; //only 22 bits of this register are used
} //switch on individual channel regs
return;
}
switch (addr)
{
//SOUNDCNT
case 0x500:
regs.mastervol = (val & 0x7F);
regs.ctl_left = (val >> 8) & 0x03;
regs.ctl_right = (val >> 10) & 0x03;
regs.ctl_ch1bypass = (val >> 12) & 0x01;
regs.ctl_ch3bypass = (val >> 13) & 0x01;
regs.masteren = (val >> 15) & 0x01;
for(u8 i=0; i<16; i++)
KeyProbe(i);
break;
//SOUNDBIAS
case 0x504: regs.soundbias = (val & 0x3FF); break;
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
{
regs.cap[0].add = BIT0(val);
regs.cap[0].source = BIT1(val);
regs.cap[0].oneshot = BIT2(val);
regs.cap[0].bits8 = BIT3(val);
regs.cap[0].active = BIT7(val);
ProbeCapture(0);
regs.cap[1].add = BIT8(val);
regs.cap[1].source = BIT9(val);
regs.cap[1].oneshot = BIT10(val);
regs.cap[1].bits8 = BIT11(val);
regs.cap[1].active = BIT15(val);
ProbeCapture(1);
break;
}
//SNDCAP0DAD
case 0x510: *(u16*)(regs.cap[0].dad + 0) = (val & 0xFFFC); break;
case 0x512: *(u16*)(regs.cap[0].dad + 1) = (val & 0x7FFF); break;
//SNDCAP0LEN
case 0x514: regs.cap[0].len = val; break;
//SNDCAP1DAD
case 0x518: *(u16*)(regs.cap[1].dad + 0) = (val & 0xFFFC); break;
case 0x51A: *(u16*)(regs.cap[1].dad + 1) = (val & 0x7FFF); break;
//SNDCAP1LEN
case 0x51C: regs.cap[1].len = val; break;
} //switch on address
}
void SPU_WriteWord(u32 addr, u16 val)
{
//printf("%08X: chan:%02X reg:%02X val:%04X\n",addr,(addr>>4)&0xF,addr&0xF,val);
addr &= 0xFFF;
SPU_core->WriteWord(addr,val);
if(SPU_user) SPU_user->WriteWord(addr,val);
}
//////////////////////////////////////////////////////////////////////////////
void SPU_struct::WriteLong(u32 addr, u32 val)
{
WriteByte(addr,val&0xFF);
WriteByte(addr+1,(val>>8)&0xFF);
WriteByte(addr+2,(val>>16)&0xFF);
WriteByte(addr+3,(val>>24)&0xFF);
//individual channel regs
if ((addr & 0x0F00) == 0x0400)
{
u32 chan_num = (addr >> 4) & 0xF;
channel_struct &thischan=channels[chan_num];
switch (addr & 0xF)
{
case 0x0:
thischan.vol = val & 0x7F;
thischan.volumeDiv = (val >> 8) & 0x3;
thischan.hold = (val >> 15) & 0x1;
thischan.pan = (val >> 16) & 0x7F;
thischan.waveduty = (val >> 24) & 0x7;
thischan.repeat = (val >> 27) & 0x3;
thischan.format = (val >> 29) & 0x3;
thischan.keyon = (val >> 31) & 0x1;
KeyProbe(chan_num);
break;
case 0x4: thischan.addr = (val & 0x07FFFFFC); break;
case 0x8:
thischan.timer = (val & 0xFFFF);
thischan.loopstart = ((val >> 16) & 0xFFFF);
adjust_channel_timer(&thischan);
break;
case 0xC: thischan.length = (val & 0x003FFFFF); break; //only 22 bits of this register are used
} //switch on individual channel regs
return;
}
switch(addr)
{
//SOUNDCNT
case 0x500:
regs.mastervol = (val & 0x7F);
regs.ctl_left = ((val >> 8) & 3);
regs.ctl_right = ((val>>10) & 3);
regs.ctl_ch1bypass = ((val >> 12) & 1);
regs.ctl_ch3bypass = ((val >> 13) & 1);
regs.masteren = ((val >> 15) & 1);
for(u8 i=0; i<16; i++)
KeyProbe(i);
break;
//SOUNDBIAS
case 0x504: regs.soundbias = (val & 0x3FF);
//SNDCAP0CNT/SNDCAP1CNT
case 0x508:
regs.cap[0].add = BIT0(val);
regs.cap[0].source = BIT1(val);
regs.cap[0].oneshot = BIT2(val);
regs.cap[0].bits8 = BIT3(val);
regs.cap[0].active = BIT7(val);
ProbeCapture(0);
regs.cap[1].add = BIT8(val);
regs.cap[1].source = BIT9(val);
regs.cap[1].oneshot = BIT10(val);
regs.cap[1].bits8 = BIT11(val);
regs.cap[1].active = BIT15(val);
ProbeCapture(1);
break;
//SNDCAP0DAD
case 0x510: regs.cap[0].dad = (val & 0x07FFFFFC); break;
//SNDCAP0LEN
case 0x514: regs.cap[0].len = (val & 0xFFFF); break;
//SNDCAP1DAD
case 0x518: regs.cap[1].dad = (val & 0x07FFFFFC); break;
//SNDCAP1LEN
case 0x51C: regs.cap[1].len = (val & 0xFFFF); break;
} //switch on address
}
void SPU_WriteLong(u32 addr, u32 val)
{
//printf("%08X: chan:%02X reg:%02X val:%08X\n",addr,(addr>>4)&0xF,addr&0xF,val);
addr &= 0xFFF;
SPU_core->WriteLong(addr,val);
if(SPU_user)
SPU_user->WriteLong(addr,val);
}
//////////////////////////////////////////////////////////////////////////////
template<SPUInterpolationMode INTERPOLATE_MODE> static FORCEINLINE s32 Interpolate(s32 a, s32 b, double ratio)
{
double sampleA = (double)a;
@ -962,19 +1167,19 @@ static FORCEINLINE void FetchPSGData(channel_struct *chan, s32 *data)
static FORCEINLINE void MixL(SPU_struct* SPU, channel_struct *chan, s32 data)
{
data = spumuldiv7(data, chan->vol) >> chan->datashift;
data = spumuldiv7(data, chan->vol) >> volume_shift[chan->volumeDiv];
SPU->sndbuf[SPU->bufpos<<1] += data;
}
static FORCEINLINE void MixR(SPU_struct* SPU, channel_struct *chan, s32 data)
{
data = spumuldiv7(data, chan->vol) >> chan->datashift;
data = spumuldiv7(data, chan->vol) >> volume_shift[chan->volumeDiv];
SPU->sndbuf[(SPU->bufpos<<1)+1] += data;
}
static FORCEINLINE void MixLR(SPU_struct* SPU, channel_struct *chan, s32 data)
{
data = spumuldiv7(data, chan->vol) >> chan->datashift;
data = spumuldiv7(data, chan->vol) >> volume_shift[chan->volumeDiv];
SPU->sndbuf[SPU->bufpos<<1] += spumuldiv7(data, 127 - chan->pan);
SPU->sndbuf[(SPU->bufpos<<1)+1] += spumuldiv7(data, chan->pan);
}
@ -1177,7 +1382,7 @@ static void SPU_MixAudio_Advanced(bool actuallyMix, SPU_struct *SPU, int length)
//get channel's next output sample.
_SPU_ChanUpdate(domix, SPU, chan);
chanout[i] = SPU->lastdata >> chan->datashift;
chanout[i] = SPU->lastdata >> volume_shift[chan->volumeDiv];
//save the panned results
submix[i*2] = SPU->sndbuf[0];
@ -1696,7 +1901,7 @@ void spu_savestate(EMUFILE* os)
channel_struct &chan = spu->channels[j];
write32le(chan.num,os);
write8le(chan.vol,os);
write8le(chan.datashift,os);
write8le(chan.volumeDiv,os);
write8le(chan.hold,os);
write8le(chan.pan,os);
write8le(chan.waveduty,os);
@ -1762,7 +1967,8 @@ bool spu_loadstate(EMUFILE* is, int size)
channel_struct &chan = spu->channels[j];
read32le(&chan.num,is);
read8le(&chan.vol,is);
read8le(&chan.datashift,is);
read8le(&chan.volumeDiv,is);
if (chan.volumeDiv == 4) chan.volumeDiv = 3;
read8le(&chan.hold,is);
read8le(&chan.pan,is);
read8le(&chan.waveduty,is);

View File

@ -34,6 +34,7 @@
#define CHANSTAT_STOPPED 0
#define CHANSTAT_PLAY 1
//who made these static? theyre used in multiple places.
FORCEINLINE u32 sputrunc(float f) { return u32floor(f); }
FORCEINLINE u32 sputrunc(double d) { return u32floor(d); }
@ -71,11 +72,36 @@ extern int SPU_currentCoreNum;
struct channel_struct
{
channel_struct()
channel_struct() : num(0),
vol(0),
volumeDiv(0),
hold(0),
pan(0),
waveduty(0),
repeat(0),
format(0),
keyon(0),
status(0),
addr(0),
timer(0),
loopstart(0),
length(0),
totlength(0),
double_totlength_shifted(0.f),
sampcnt(0.f),
sampinc(0.f),
lastsampcnt(0),
pcm16b(0),
pcm16b_last(0),
loop_pcm16b(0),
index(0),
loop_index(0),
x(0),
psgnoise_last(0)
{}
u32 num;
u8 vol;
u8 datashift;
u8 volumeDiv;
u8 hold;
u8 pan;
u8 waveduty;
@ -181,16 +207,20 @@ public:
void KeyProbe(int channel);
void ProbeCapture(int which);
void WriteByte(u32 addr, u8 val);
void WriteWord(u32 addr, u16 val);
void WriteLong(u32 addr, u32 val);
u8 ReadByte(u32 addr);
u16 ReadWord(u32 addr);
u32 ReadLong(u32 addr);
void WriteWord(u32 addr, u16 val);
void WriteLong(u32 addr, u32 val);
bool isSPU(u32 addr) { return ((addr >= 0x04000400) && (addr < 0x04000520)); }
//kills all channels but leaves SPU otherwise running normally
void ShutUp();
};
extern SPU_struct *SPU_core, *SPU_user;
extern int spu_core_samples;
int SPU_ChangeSoundCore(int coreid, int buffersize);
SoundInterface_struct *SPU_SoundCore();
@ -203,20 +233,38 @@ void SPU_ClearOutputBuffer(void);
void SPU_Reset(void);
void SPU_DeInit(void);
void SPU_KeyOn(int channel);
void SPU_WriteByte(u32 addr, u8 val);
void SPU_WriteWord(u32 addr, u16 val);
void SPU_WriteLong(u32 addr, u32 val);
u8 SPU_ReadByte(u32 addr);
u16 SPU_ReadWord(u32 addr);
u32 SPU_ReadLong(u32 addr);
static FORCEINLINE void SPU_WriteByte(u32 addr, u8 val)
{
addr &= 0xFFF;
SPU_core->WriteByte(addr,val);
if(SPU_user)
SPU_user->WriteByte(addr,val);
}
static FORCEINLINE void SPU_WriteWord(u32 addr, u16 val)
{
addr &= 0xFFF;
SPU_core->WriteWord(addr,val);
if(SPU_user)
SPU_user->WriteWord(addr,val);
}
static FORCEINLINE void SPU_WriteLong(u32 addr, u32 val)
{
addr &= 0xFFF;
SPU_core->WriteLong(addr,val);
if(SPU_user)
SPU_user->WriteLong(addr,val);
}
static FORCEINLINE u8 SPU_ReadByte(u32 addr) { return SPU_core->ReadByte(addr & 0x0FFF); }
static FORCEINLINE u16 SPU_ReadWord(u32 addr) { return SPU_core->ReadWord(addr & 0x0FFF); }
static FORCEINLINE u32 SPU_ReadLong(u32 addr) { return SPU_core->ReadLong(addr & 0x0FFF); }
void SPU_Emulate_core(void);
void SPU_Emulate_user(bool mix = true);
void SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
size_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
extern SPU_struct *SPU_core, *SPU_user;
extern int spu_core_samples;
void spu_savestate(EMUFILE* os);
bool spu_loadstate(EMUFILE* is, int size);

View File

@ -1013,125 +1013,125 @@ BEGIN
LTEXT "This will be necessary to emulate sound capture (reverb and music visualization). This is costly, few games use it, and the effect is unnecessary. Enable it if your system has power to spare; check the Sound Viewer to see if the game is using capture.",IDC_STATIC,196,91,170,44
END
IDD_SOUND_VIEW DIALOGEX 0, 0, 550, 268
IDD_SOUND_VIEW DIALOGEX 0, 0, 568, 269
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Sound View"
FONT 8, "Ms Shell Dlg 2", 0, 0, 0x0
BEGIN
CTEXT "Volume",IDC_STATIC,30,22,100,11,0,WS_EX_STATICEDGE
CTEXT "Pan",IDC_STATIC,30,34,100,11,0,WS_EX_STATICEDGE
CTEXT "Hold",IDC_STATIC,131,22,22,11,0,WS_EX_STATICEDGE
CTEXT "Busy",IDC_STATIC,131,34,22,11,0,WS_EX_STATICEDGE
CTEXT "Repeat Mode",IDC_STATIC,154,22,72,11,0,WS_EX_STATICEDGE
CTEXT "Format",IDC_STATIC,154,34,72,11,0,WS_EX_STATICEDGE
CTEXT "Source Addr",IDC_STATIC,227,22,60,11,0,WS_EX_STATICEDGE
CTEXT "Loop Start",IDC_STATIC,227,34,60,11,0,WS_EX_STATICEDGE
CTEXT "Timer Value",IDC_STATIC,288,22,88,11,0,WS_EX_STATICEDGE
CTEXT "Sound Pos / Len",IDC_STATIC,288,34,88,11,0,WS_EX_STATICEDGE
CTEXT "Volume",IDC_STATIC,30,22,122,11,0,WS_EX_STATICEDGE
CTEXT "Pan",IDC_STATIC,30,34,122,11,0,WS_EX_STATICEDGE
CTEXT "Hold",IDC_STATIC,153,22,22,11,0,WS_EX_STATICEDGE
CTEXT "Busy",IDC_STATIC,153,34,22,11,0,WS_EX_STATICEDGE
CTEXT "Repeat Mode",IDC_STATIC,176,22,72,11,0,WS_EX_STATICEDGE
CTEXT "Format",IDC_STATIC,176,34,72,11,0,WS_EX_STATICEDGE
CTEXT "Source Addr",IDC_STATIC,249,22,60,11,0,WS_EX_STATICEDGE
CTEXT "Loop Start",IDC_STATIC,249,34,60,11,0,WS_EX_STATICEDGE
CTEXT "Timer Value",IDC_STATIC,310,22,88,11,0,WS_EX_STATICEDGE
CTEXT "Sound Pos / Len",IDC_STATIC,310,34,88,11,0,WS_EX_STATICEDGE
RTEXT "#00",IDC_SOUND0ID,4,50,23,10
CONTROL "",IDC_SOUND0VOLBAR,"msctls_progress32",0x1,30,49,68,11
CTEXT "",IDC_SOUND0VOL,100,49,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND0PANBAR,"msctls_progress32",0x1,30,62,68,10
CTEXT "",IDC_SOUND0PAN,100,61,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0HOLD,131,49,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0BUSY,131,61,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0REPEATMODE,154,49,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0FORMAT,154,61,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0SAD,227,49,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0PNT,227,61,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0TMR,288,49,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0POSLEN,288,61,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND0VOLBAR,30,49,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND0VOL,122,49,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND0PANBAR,30,62,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND0PAN,122,61,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0HOLD,153,49,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0BUSY,153,61,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0REPEATMODE,176,49,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0FORMAT,176,61,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0SAD,249,49,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0PNT,249,61,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0TMR,310,49,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND0POSLEN,310,61,88,11,0,WS_EX_STATICEDGE
RTEXT "#01",IDC_SOUND1ID,4,75,23,10
CONTROL "",IDC_SOUND1VOLBAR,"msctls_progress32",0x1,30,74,68,11
CTEXT "",IDC_SOUND1VOL,100,74,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND1PANBAR,"msctls_progress32",0x1,30,87,68,11
CTEXT "",IDC_SOUND1PAN,100,87,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1HOLD,131,74,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1BUSY,131,87,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1REPEATMODE,154,74,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1FORMAT,154,87,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1SAD,227,74,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1PNT,227,87,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1TMR,288,74,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1POSLEN,288,87,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND1VOLBAR,30,74,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND1VOL,122,74,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND1PANBAR,30,87,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND1PAN,122,87,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1HOLD,153,74,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1BUSY,153,87,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1REPEATMODE,176,74,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1FORMAT,176,87,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1SAD,249,74,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1PNT,249,87,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1TMR,310,74,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND1POSLEN,310,87,88,11,0,WS_EX_STATICEDGE
RTEXT "#02",IDC_SOUND2ID,4,101,23,10
CONTROL "",IDC_SOUND2VOLBAR,"msctls_progress32",0x1,30,100,68,11
CTEXT "",IDC_SOUND2VOL,100,100,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND2PANBAR,"msctls_progress32",0x1,30,113,68,11
CTEXT "",IDC_SOUND2PAN,100,113,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2HOLD,131,100,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2BUSY,131,113,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2REPEATMODE,154,100,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2FORMAT,154,113,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2SAD,227,100,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2PNT,227,113,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2TMR,288,100,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2POSLEN,288,113,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND2VOLBAR,30,100,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND2VOL,122,100,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND2PANBAR,30,113,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND2PAN,122,113,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2HOLD,153,100,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2BUSY,153,113,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2REPEATMODE,176,100,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2FORMAT,176,113,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2SAD,249,100,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2PNT,249,113,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2TMR,310,100,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND2POSLEN,310,113,88,11,0,WS_EX_STATICEDGE
RTEXT "#03",IDC_SOUND3ID,4,127,23,10
CONTROL "",IDC_SOUND3VOLBAR,"msctls_progress32",0x1,30,126,68,11
CTEXT "",IDC_SOUND3VOL,100,126,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND3PANBAR,"msctls_progress32",0x1,30,139,68,11
CTEXT "",IDC_SOUND3PAN,100,139,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3HOLD,131,126,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3BUSY,131,139,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3REPEATMODE,154,126,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3FORMAT,154,139,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3SAD,227,126,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3PNT,227,139,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3TMR,288,126,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3POSLEN,288,139,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND3VOLBAR,30,126,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND3VOL,122,126,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND3PANBAR,30,139,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND3PAN,122,139,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3HOLD,153,126,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3BUSY,153,139,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3REPEATMODE,176,126,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3FORMAT,176,139,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3SAD,249,126,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3PNT,249,139,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3TMR,310,126,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND3POSLEN,310,139,88,11,0,WS_EX_STATICEDGE
RTEXT "#04",IDC_SOUND4ID,4,153,23,10
CONTROL "",IDC_SOUND4VOLBAR,"msctls_progress32",0x1,30,152,68,11
CTEXT "",IDC_SOUND4VOL,100,152,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND4PANBAR,"msctls_progress32",0x1,30,165,68,11
CTEXT "",IDC_SOUND4PAN,100,165,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4HOLD,131,152,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4BUSY,131,165,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4REPEATMODE,154,152,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4FORMAT,154,165,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4SAD,227,152,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4PNT,227,165,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4TMR,288,152,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4POSLEN,288,165,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND4VOLBAR,30,152,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND4VOL,122,152,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND4PANBAR,30,165,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND4PAN,122,165,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4HOLD,153,152,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4BUSY,153,165,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4REPEATMODE,176,152,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4FORMAT,176,165,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4SAD,249,152,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4PNT,249,165,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4TMR,310,152,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND4POSLEN,310,165,88,11,0,WS_EX_STATICEDGE
RTEXT "#05",IDC_SOUND5ID,4,179,23,10
CONTROL "",IDC_SOUND5VOLBAR,"msctls_progress32",0x1,30,178,68,11
CTEXT "",IDC_SOUND5VOL,100,178,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND5PANBAR,"msctls_progress32",0x1,30,191,68,11
CTEXT "",IDC_SOUND5PAN,100,191,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5HOLD,131,178,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5BUSY,131,191,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5REPEATMODE,154,178,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5FORMAT,154,191,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5SAD,227,178,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5PNT,227,191,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5TMR,288,178,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5POSLEN,288,191,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND5VOLBAR,30,178,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND5VOL,122,178,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND5PANBAR,30,191,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND5PAN,122,191,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5HOLD,153,178,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5BUSY,153,191,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5REPEATMODE,176,178,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5FORMAT,176,191,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5SAD,249,178,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5PNT,249,191,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5TMR,310,178,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND5POSLEN,310,191,88,11,0,WS_EX_STATICEDGE
RTEXT "#06",IDC_SOUND6ID,4,205,23,10
CONTROL "",IDC_SOUND6VOLBAR,"msctls_progress32",0x1,30,204,68,11
CTEXT "",IDC_SOUND6VOL,100,204,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND6PANBAR,"msctls_progress32",0x1,30,217,68,11
CTEXT "",IDC_SOUND6PAN,100,217,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6HOLD,131,204,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6BUSY,131,217,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6REPEATMODE,154,204,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6FORMAT,154,217,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6SAD,227,204,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6PNT,227,217,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6TMR,288,204,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6POSLEN,288,217,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND6VOLBAR,30,204,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND6VOL,122,204,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND6PANBAR,30,217,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND6PAN,122,217,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6HOLD,153,204,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6BUSY,153,217,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6REPEATMODE,176,204,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6FORMAT,176,217,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6SAD,249,204,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6PNT,249,217,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6TMR,310,204,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND6POSLEN,310,217,88,11,0,WS_EX_STATICEDGE
RTEXT "#07",IDC_SOUND7ID,4,231,23,10
CONTROL "",IDC_SOUND7VOLBAR,"msctls_progress32",0x1,30,230,68,11
CTEXT "",IDC_SOUND7VOL,100,230,30,11,0,WS_EX_STATICEDGE
CONTROL "",IDC_SOUND7PANBAR,"msctls_progress32",0x1,30,243,68,11
CTEXT "",IDC_SOUND7PAN,100,243,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7HOLD,131,230,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7BUSY,131,243,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7REPEATMODE,154,230,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7FORMAT,154,243,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7SAD,227,230,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7PNT,227,243,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7TMR,288,230,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7POSLEN,288,243,88,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND7VOLBAR,30,230,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND7VOL,122,230,30,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_SOUND7PANBAR,30,244,85,11,NOT WS_GROUP
CTEXT "",IDC_SOUND7PAN,122,244,30,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7HOLD,153,230,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7BUSY,153,244,22,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7REPEATMODE,176,230,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7FORMAT,176,244,72,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7SAD,249,230,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7PNT,249,244,60,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7TMR,310,230,88,11,0,WS_EX_STATICEDGE
CTEXT "",IDC_SOUND7POSLEN,310,244,88,11,0,WS_EX_STATICEDGE
PUSHBUTTON "V",IDC_SOUNDVIEW_CHANSWITCH,16,33,12,12
CONTROL "Vol.Mode",IDC_BUTTON_VOLMODE,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,13,7,45,10
CONTROL "Check1",IDC_SOUND0MUTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,62,10,10
@ -1142,59 +1142,59 @@ BEGIN
CONTROL "Check1",IDC_SOUND5MUTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,192,10,10
CONTROL "Check1",IDC_SOUND6MUTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,217,10,10
CONTROL "Check1",IDC_SOUND7MUTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,243,10,10
GROUPBOX "Capture 0",IDC_STATIC,379,90,157,80
LTEXT "508 ctrl",IDC_STATIC,403,103,25,8
CHECKBOX "b0 AddCh1toCh0",IDC_CAP0_ADD,433,103,68,10
CHECKBOX "b1 Src",IDC_CAP0_SRC,383,116,36,10
CHECKBOX "b2 One-Shot",IDC_CAP0_ONESHOT,450,116,54,10
CHECKBOX "b3 Typ",IDC_CAP0_TYPE,383,127,36,10
CHECKBOX "b7 Active",IDC_CAP0_ACTIVE,450,127,49,10
LTEXT "",IDC_CAP0_DAD,383,141,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_CTRL,383,103,16,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_SRCTEXT,419,116,25,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_TYPETEXT,419,127,25,11,0,WS_EX_STATICEDGE
LTEXT "510 DAD",IDC_STATIC,423,143,29,8
LTEXT "514 LEN",IDC_STATIC,492,143,27,8
LTEXT "",IDC_CAP0_LEN,453,141,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_CURDAD,384,156,37,11,0,WS_EX_STATICEDGE
LTEXT "DAD CUR",IDC_STATIC,423,156,32,8
CHECKBOX "Running",IDC_CAP0_RUNNING,457,156,49,10
GROUPBOX "Capture 1",IDC_STATIC,379,174,157,80
LTEXT "509 ctrl",IDC_STATIC,403,187,25,8
CHECKBOX "b0 AddCh3toCh2",IDC_CAP1_ADD,433,187,68,10
CHECKBOX "b1 Src",IDC_CAP1_SRC,383,200,36,10
CHECKBOX "b2 One-Shot",IDC_CAP1_ONESHOT,449,200,54,10
CHECKBOX "b3 Typ",IDC_CAP1_TYPE,383,211,36,10
CHECKBOX "b7 Active",IDC_CAP1_ACTIVE,449,211,49,10
LTEXT "",IDC_CAP1_DAD,383,226,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_CTRL,383,187,16,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_SRCTEXT,419,200,25,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_TYPETEXT,419,211,25,11,0,WS_EX_STATICEDGE
LTEXT "518 DAD",IDC_STATIC,423,227,29,8
LTEXT "51C LEN",IDC_STATIC,492,227,28,8
LTEXT "",IDC_CAP1_LEN,453,226,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_CURDAD,383,240,37,11,0,WS_EX_STATICEDGE
LTEXT "DAD CUR",IDC_STATIC,423,240,32,8
CHECKBOX "Running",IDC_CAP1_RUNNING,457,240,49,10
GROUPBOX "Sound Control",IDC_STATIC,378,18,158,69
LTEXT "",IDC_SNDCTRL_CTRL,385,29,26,11,0,WS_EX_STATICEDGE
LTEXT "500 Ctrl",IDC_STATIC,416,31,26,8
LTEXT "",IDC_SNDCTRL_VOL,385,42,26,11,0,WS_EX_STATICEDGE
LTEXT "b0-6 Vol",IDC_STATIC,415,44,27,8
LTEXT "",IDC_SNDCTRL_BIAS,456,30,26,11,0,WS_EX_STATICEDGE
LTEXT "504 Bias",IDC_STATIC,485,32,28,8
CHECKBOX "b15 Enable",IDC_SNDCTRL_ENABLE,473,44,49,10
LTEXT "",IDC_SNDCTRL_LEFTOUT,385,57,12,11,0,WS_EX_STATICEDGE
LTEXT "b8-9 L-Out",IDC_STATIC,400,59,36,8
LTEXT "",IDC_SNDCTRL_LEFTOUTTEXT,445,57,25,11,0,WS_EX_STATICEDGE
CHECKBOX "b12 ch1 nomix",IDC_SNDCTRL_CH1NOMIX,473,57,59,10
LTEXT "",IDC_SNDCTRL_RIGHTOUT,385,70,12,11,0,WS_EX_STATICEDGE
LTEXT "b10-11 R-Out",IDC_STATIC,400,72,45,8
LTEXT "",IDC_SNDCTRL_RIGHTOUTTEXT,445,71,25,11,0,WS_EX_STATICEDGE
CHECKBOX "b13 ch3 nomix",IDC_SNDCTRL_CH3NOMIX,473,71,59,10
CONTROL "Capture muted channels",IDC_SOUND_CAPTURE_MUTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,435,5,94,10
PUSHBUTTON "Analyze Cap",IDC_SOUND_ANALYZE_CAP,379,3,50,14
PUSHBUTTON "Unmute All",IDC_SOUND_UNMUTE_ALL,325,3,50,14
GROUPBOX "Capture 0",IDC_STATIC,402,90,157,80
LTEXT "508 ctrl",IDC_STATIC,425,103,25,8
CHECKBOX "b0 AddCh1toCh0",IDC_CAP0_ADD,455,103,68,10
CHECKBOX "b1 Src",IDC_CAP0_SRC,405,116,36,10
CHECKBOX "b2 One-Shot",IDC_CAP0_ONESHOT,472,116,54,10
CHECKBOX "b3 Typ",IDC_CAP0_TYPE,405,127,36,10
CHECKBOX "b7 Active",IDC_CAP0_ACTIVE,472,127,49,10
LTEXT "",IDC_CAP0_DAD,405,141,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_CTRL,405,103,16,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_SRCTEXT,441,116,25,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_TYPETEXT,441,127,25,11,0,WS_EX_STATICEDGE
LTEXT "510 DAD",IDC_STATIC,445,143,29,8
LTEXT "514 LEN",IDC_STATIC,514,143,27,8
LTEXT "",IDC_CAP0_LEN,475,141,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP0_CURDAD,406,156,37,11,0,WS_EX_STATICEDGE
LTEXT "DAD CUR",IDC_STATIC,445,156,32,8
CHECKBOX "Running",IDC_CAP0_RUNNING,479,156,49,10
GROUPBOX "Capture 1",IDC_STATIC,402,175,157,80
LTEXT "509 ctrl",IDC_STATIC,425,187,25,8
CHECKBOX "b0 AddCh3toCh2",IDC_CAP1_ADD,455,187,68,10
CHECKBOX "b1 Src",IDC_CAP1_SRC,405,200,36,10
CHECKBOX "b2 One-Shot",IDC_CAP1_ONESHOT,471,200,54,10
CHECKBOX "b3 Typ",IDC_CAP1_TYPE,405,211,36,10
CHECKBOX "b7 Active",IDC_CAP1_ACTIVE,471,211,49,10
LTEXT "",IDC_CAP1_DAD,405,226,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_CTRL,405,187,16,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_SRCTEXT,441,200,25,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_TYPETEXT,441,211,25,11,0,WS_EX_STATICEDGE
LTEXT "518 DAD",IDC_STATIC,445,227,29,8
LTEXT "51C LEN",IDC_STATIC,514,227,28,8
LTEXT "",IDC_CAP1_LEN,475,226,37,11,0,WS_EX_STATICEDGE
LTEXT "",IDC_CAP1_CURDAD,405,240,37,11,0,WS_EX_STATICEDGE
LTEXT "DAD CUR",IDC_STATIC,445,240,32,8
CHECKBOX "Running",IDC_CAP1_RUNNING,479,240,49,10
GROUPBOX "Sound Control",IDC_STATIC,401,18,158,69
LTEXT "",IDC_SNDCTRL_CTRL,407,29,26,11,0,WS_EX_STATICEDGE
LTEXT "500 Ctrl",IDC_STATIC,438,31,26,8
LTEXT "",IDC_SNDCTRL_VOL,407,42,26,11,0,WS_EX_STATICEDGE
LTEXT "b0-6 Vol",IDC_STATIC,437,44,27,8
LTEXT "",IDC_SNDCTRL_BIAS,478,30,26,11,0,WS_EX_STATICEDGE
LTEXT "504 Bias",IDC_STATIC,507,32,28,8
CHECKBOX "b15 Enable",IDC_SNDCTRL_ENABLE,495,44,49,10
LTEXT "",IDC_SNDCTRL_LEFTOUT,407,57,12,11,0,WS_EX_STATICEDGE
LTEXT "b8-9 L-Out",IDC_STATIC,422,59,36,8
LTEXT "",IDC_SNDCTRL_LEFTOUTTEXT,467,57,25,11,0,WS_EX_STATICEDGE
CHECKBOX "b12 ch1 nomix",IDC_SNDCTRL_CH1NOMIX,495,57,59,10
LTEXT "",IDC_SNDCTRL_RIGHTOUT,407,70,12,11,0,WS_EX_STATICEDGE
LTEXT "b10-11 R-Out",IDC_STATIC,422,72,45,8
LTEXT "",IDC_SNDCTRL_RIGHTOUTTEXT,467,71,25,11,0,WS_EX_STATICEDGE
CHECKBOX "b13 ch3 nomix",IDC_SNDCTRL_CH3NOMIX,495,71,59,10
CONTROL "Capture muted channels",IDC_SOUND_CAPTURE_MUTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,457,5,94,10
PUSHBUTTON "Analyze Cap",IDC_SOUND_ANALYZE_CAP,401,3,50,14
PUSHBUTTON "Unmute All",IDC_SOUND_UNMUTE_ALL,347,3,50,14
END
IDD_TILE DIALOGEX 0, 0, 446, 180
@ -1891,8 +1891,8 @@ BEGIN
IDD_SOUND_VIEW, DIALOG
BEGIN
LEFTMARGIN, 4
RIGHTMARGIN, 536
BOTTOMMARGIN, 254
RIGHTMARGIN, 559
BOTTOMMARGIN, 255
END
IDD_WIFISETTINGS, DIALOG

View File

@ -69,29 +69,6 @@ inline int chanOfs()
return SoundView_Data->viewFirst8Channels ? 0 : 8;
}
inline int ProgressSetPosImmediate(HWND hDlg, int nIDDlgItem, int nPos)
{
int nOldPos = SendDlgItemMessage(hDlg, nIDDlgItem, PBM_GETPOS, (WPARAM)0, (LPARAM)0);
int nMin = SendDlgItemMessage(hDlg, nIDDlgItem, PBM_GETRANGE, (WPARAM)TRUE, (LPARAM)NULL);
int nMax = SendDlgItemMessage(hDlg, nIDDlgItem, PBM_GETRANGE, (WPARAM)FALSE, (LPARAM)NULL);
// get rid of fancy progress animation since Windows Vista
// http://stackoverflow.com/questions/1061715/how-do-i-make-tprogressbar-stop-lagging
if (nPos < nMax)
{
SendDlgItemMessage(hDlg, nIDDlgItem, PBM_SETPOS, (WPARAM)(nPos + 1), (LPARAM)0);
SendDlgItemMessage(hDlg, nIDDlgItem, PBM_SETPOS, (WPARAM)nPos, (LPARAM)0); // This will set Progress backwards and give an instant update
}
else
{
SendDlgItemMessage(hDlg, nIDDlgItem, PBM_SETRANGE32, nMin, nPos + 1);
SendDlgItemMessage(hDlg, nIDDlgItem, PBM_SETPOS, (WPARAM)(nPos + 1), (LPARAM)0);
SendDlgItemMessage(hDlg, nIDDlgItem, PBM_SETRANGE32, nMin, nPos); // This will also set Progress backwards also so instant update
}
return nOldPos;
}
BOOL SoundView_DlgOpen(HWND hParentWnd)
{
HWND hDlg;
@ -136,7 +113,12 @@ HWND SoundView_GetHWnd()
return SoundView_Data ? SoundView_Data->hDlg : NULL;
}
void SoundView_Refresh()
static channel_struct oldchanel[16];
static SPU_struct::REGS::CAP oldCap[2];
static s32 volBar[16] = {0};
static u16 oldCtrl = 0xFFFF;
void SoundView_Refresh(bool forceRedraw)
{
if(SoundView_Data == NULL || SPU_core == NULL)
return;
@ -144,21 +126,26 @@ void SoundView_Refresh()
char buf[256];
HWND hDlg = SoundView_Data->hDlg;
static const int format_shift[] = { 2, 1, 3, 0 };
static const u8 volume_shift[] = { 0, 1, 2, 4 };
static const double ARM7_CLOCK = 33513982;
for(int chanId = 0; chanId < 8; chanId++) {
int chan = chanId + chanOfs();
channel_struct &thischan = SPU_core->channels[chan];
channel_struct &oldchan = oldchanel[chan];
ProgressSetPosImmediate(hDlg, IDC_SOUND0PANBAR+chanId, spumuldiv7(128, thischan.pan));
if (!forceRedraw && memcmp(&oldchan, &thischan, sizeof(channel_struct)) == 0) continue;
InvalidateRect(GetDlgItem(hDlg, IDC_SOUND0PANBAR+chanId), NULL, FALSE);
if(thischan.status != CHANSTAT_STOPPED)
{
s32 vol = spumuldiv7(128, thischan.vol) >> thischan.datashift;
ProgressSetPosImmediate(hDlg, IDC_SOUND0VOLBAR+chanId, vol);
volBar[chan] = spumuldiv7(128, thischan.vol) >> volume_shift[thischan.volumeDiv];
InvalidateRect(GetDlgItem(hDlg, IDC_SOUND0VOLBAR+chanId), NULL, FALSE);
if(SoundView_Data->volModeAlternate)
sprintf(buf, "%d/%d", thischan.vol, 1 << thischan.datashift);
sprintf(buf, "%d/%d", thischan.vol, 1 << volume_shift[thischan.volumeDiv]);
else
sprintf(buf, "%d", vol);
sprintf(buf, "%d", volBar[chan]);
SetDlgItemText(hDlg, IDC_SOUND0VOL+chanId, buf);
if (thischan.pan == 0)
@ -210,31 +197,35 @@ void SoundView_Refresh()
SetDlgItemText(hDlg, IDC_SOUND0POSLEN+chanId, buf);
}
else {
ProgressSetPosImmediate(hDlg, IDC_SOUND0VOLBAR+chanId, 0);
strcpy(buf, "---");
SetDlgItemText(hDlg, IDC_SOUND0VOL+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0PAN+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0HOLD+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0BUSY+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0REPEATMODE+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0FORMAT+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0SAD+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0PNT+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0TMR+chanId, buf);
SetDlgItemText(hDlg, IDC_SOUND0POSLEN+chanId, buf);
#define _EMPTY "---"
volBar[chan] = 0;
InvalidateRect(GetDlgItem(hDlg, IDC_SOUND0VOLBAR+chanId), NULL, FALSE);
SetDlgItemText(hDlg, IDC_SOUND0VOL+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0PAN+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0HOLD+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0BUSY+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0REPEATMODE+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0FORMAT+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0SAD+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0PNT+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0TMR+chanId, _EMPTY);
SetDlgItemText(hDlg, IDC_SOUND0POSLEN+chanId, _EMPTY);
}
memcpy(&oldchan, &thischan, sizeof(channel_struct));
} //chan loop
//ctrl
u16 ctrl = _MMU_ARM7_read16(0x04000500);
if (oldCtrl != ctrl)
{
CheckDlgItem(hDlg,IDC_SNDCTRL_ENABLE,SPU_core->regs.masteren!=0);
CheckDlgItem(hDlg,IDC_SNDCTRL_CH1NOMIX,SPU_core->regs.ctl_ch1bypass!=0);
CheckDlgItem(hDlg,IDC_SNDCTRL_CH3NOMIX,SPU_core->regs.ctl_ch3bypass!=0);
sprintf(buf,"%04X",_MMU_ARM7_read16(0x04000500));
sprintf(buf,"%04X",ctrl);
SetDlgItemText(hDlg,IDC_SNDCTRL_CTRL,buf);
sprintf(buf,"%04X",_MMU_ARM7_read16(0x04000504));
sprintf(buf,"%04X",SPU_core->regs.soundbias);
SetDlgItemText(hDlg,IDC_SNDCTRL_BIAS,buf);
sprintf(buf,"%02X",SPU_core->regs.mastervol);
@ -252,67 +243,71 @@ void SoundView_Refresh()
SetDlgItemText(hDlg,IDC_SNDCTRL_LEFTOUTTEXT,leftouttext[SPU_core->regs.ctl_left]);
SetDlgItemText(hDlg,IDC_SNDCTRL_RIGHTOUTTEXT,rightouttext[SPU_core->regs.ctl_right]);
oldCtrl = ctrl;
}
//cap0
SPU_struct::REGS::CAP& cap0 = SPU_core->regs.cap[0];
if (memcmp(&oldCap[0], &cap0, sizeof(SPU_struct::REGS::CAP)) != 0)
{
SPU_struct::REGS::CAP& cap = SPU_core->regs.cap[0];
CheckDlgItem(hDlg,IDC_CAP0_ADD,cap0.add!=0);
CheckDlgItem(hDlg,IDC_CAP0_SRC,cap0.source!=0);
CheckDlgItem(hDlg,IDC_CAP0_ONESHOT,cap0.oneshot!=0);
CheckDlgItem(hDlg,IDC_CAP0_TYPE,cap0.bits8!=0);
CheckDlgItem(hDlg,IDC_CAP0_ACTIVE,cap0.active!=0);
CheckDlgItem(hDlg,IDC_CAP0_RUNNING,cap0.runtime.running!=0);
CheckDlgItem(hDlg,IDC_CAP0_ADD,cap.add!=0);
CheckDlgItem(hDlg,IDC_CAP0_SRC,cap.source!=0);
CheckDlgItem(hDlg,IDC_CAP0_ONESHOT,cap.oneshot!=0);
CheckDlgItem(hDlg,IDC_CAP0_TYPE,cap.bits8!=0);
CheckDlgItem(hDlg,IDC_CAP0_ACTIVE,cap.active!=0);
CheckDlgItem(hDlg,IDC_CAP0_RUNNING,cap.runtime.running!=0);
if(cap.source) SetDlgItemText(hDlg,IDC_CAP0_SRCTEXT,"Ch2");
if(cap0.source) SetDlgItemText(hDlg,IDC_CAP0_SRCTEXT,"Ch2");
else SetDlgItemText(hDlg,IDC_CAP0_SRCTEXT,"L-Mix");
if(cap.bits8) SetDlgItemText(hDlg,IDC_CAP0_TYPETEXT,"Pcm8");
if(cap0.bits8) SetDlgItemText(hDlg,IDC_CAP0_TYPETEXT,"Pcm8");
else SetDlgItemText(hDlg,IDC_CAP0_TYPETEXT,"Pcm16");
sprintf(buf,"%02X",_MMU_ARM7_read08(0x04000508));
SetDlgItemText(hDlg,IDC_CAP0_CTRL,buf);
sprintf(buf,"%08X",cap.dad);
sprintf(buf,"%08X",cap0.dad);
SetDlgItemText(hDlg,IDC_CAP0_DAD,buf);
sprintf(buf,"%08X",cap.len);
sprintf(buf,"%08X",cap0.len);
SetDlgItemText(hDlg,IDC_CAP0_LEN,buf);
sprintf(buf,"%08X",cap.runtime.curdad);
sprintf(buf,"%08X",cap0.runtime.curdad);
SetDlgItemText(hDlg,IDC_CAP0_CURDAD,buf);
memcpy(&oldCap[0], &cap0, sizeof(SPU_struct::REGS::CAP));
}
//cap1
SPU_struct::REGS::CAP& cap1 = SPU_core->regs.cap[1];
if (memcmp(&oldCap[1], &cap1, sizeof(SPU_struct::REGS::CAP)) != 0)
{
SPU_struct::REGS::CAP& cap = SPU_core->regs.cap[1];
CheckDlgItem(hDlg,IDC_CAP1_ADD,cap1.add!=0);
CheckDlgItem(hDlg,IDC_CAP1_SRC,cap1.source!=0);
CheckDlgItem(hDlg,IDC_CAP1_ONESHOT,cap1.oneshot!=0);
CheckDlgItem(hDlg,IDC_CAP1_TYPE,cap1.bits8!=0);
CheckDlgItem(hDlg,IDC_CAP1_ACTIVE,cap1.active!=0);
CheckDlgItem(hDlg,IDC_CAP1_RUNNING,cap1.runtime.running!=0);
CheckDlgItem(hDlg,IDC_CAP1_ADD,cap.add!=0);
CheckDlgItem(hDlg,IDC_CAP1_SRC,cap.source!=0);
CheckDlgItem(hDlg,IDC_CAP1_ONESHOT,cap.oneshot!=0);
CheckDlgItem(hDlg,IDC_CAP1_TYPE,cap.bits8!=0);
CheckDlgItem(hDlg,IDC_CAP1_ACTIVE,cap.active!=0);
CheckDlgItem(hDlg,IDC_CAP1_RUNNING,cap.runtime.running!=0);
if(cap.source) SetDlgItemText(hDlg,IDC_CAP1_SRCTEXT,"Ch3"); //maybe call it "Ch3(+2)" if it fits
if(cap1.source) SetDlgItemText(hDlg,IDC_CAP1_SRCTEXT,"Ch3"); //maybe call it "Ch3(+2)" if it fits
else SetDlgItemText(hDlg,IDC_CAP1_SRCTEXT,"R-Mix");
if(cap.bits8) SetDlgItemText(hDlg,IDC_CAP1_TYPETEXT,"Pcm8");
if(cap1.bits8) SetDlgItemText(hDlg,IDC_CAP1_TYPETEXT,"Pcm8");
else SetDlgItemText(hDlg,IDC_CAP1_TYPETEXT,"Pcm16");
sprintf(buf,"%02X",_MMU_ARM7_read08(0x04000509));
SetDlgItemText(hDlg,IDC_CAP1_CTRL,buf);
sprintf(buf,"%08X",cap.dad);
sprintf(buf,"%08X",cap1.dad);
SetDlgItemText(hDlg,IDC_CAP1_DAD,buf);
sprintf(buf,"%08X",cap.len);
sprintf(buf,"%08X",cap1.len);
SetDlgItemText(hDlg,IDC_CAP1_LEN,buf);
sprintf(buf,"%08X",cap.runtime.curdad);
sprintf(buf,"%08X",cap1.runtime.curdad);
SetDlgItemText(hDlg,IDC_CAP1_CURDAD,buf);
memcpy(&oldCap[1], &cap1, sizeof(SPU_struct::REGS::CAP));
}
}
@ -359,6 +354,63 @@ static void SoundView_SwitchChanOfs(SoundView_DataStruct *data)
SoundView_Refresh();
}
static LONG_PTR OldLevelBarProc = 0;
static LONG_PTR OldPanBarProc = 0;
static HBRUSH level_color = CreateSolidBrush(RGB(0, 255, 0));
static HBRUSH level_background = CreateSolidBrush(RGB(90, 90, 90));
static COLORREF pan_color = RGB(255, 0, 0);
static COLORREF pan_center_color = RGB(200, 200, 200);
static HBRUSH pan_background = (HBRUSH)COLOR_WINDOW;
INT_PTR CALLBACK LevelBarProc(HWND hBar, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_PAINT)
{
u8 chan = (u8)GetProp(hBar, "chan");
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hBar, &ps);
u32 vol = volBar[chan + chanOfs()];
if (vol > 0)
{
RECT rc = {0, 0, vol, ps.rcPaint.bottom};
FillRect(hdc, &rc, level_color);
}
if (vol < 128)
{
RECT rc2 = {vol + 1, 0, 128, ps.rcPaint.bottom};
FillRect(hdc, &rc2, level_background);
}
EndPaint(hBar, &ps);
}
return CallWindowProc((WNDPROC)OldLevelBarProc, hBar, msg, wParam, lParam);
}
INT_PTR CALLBACK PanBarProc(HWND hBar, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_PAINT)
{
u8 chan = (u8)GetProp(hBar, "chan");
channel_struct &thischan = SPU_core->channels[chan + chanOfs()];
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hBar, &ps);
FillRect(hdc, &ps.rcPaint, pan_background);
SelectObject(hdc, GetStockObject(DC_PEN));
if (thischan.pan != 64)
{
SetDCPenColor(hdc, pan_center_color);
MoveToEx(hdc, 64, 0, NULL);
LineTo(hdc, 64, ps.rcPaint.bottom);
}
SetDCPenColor(hdc, pan_color);
MoveToEx(hdc, thischan.pan, 0, NULL);
LineTo(hdc, thischan.pan, ps.rcPaint.bottom);
EndPaint(hBar, &ps);
}
return CallWindowProc((WNDPROC)OldPanBarProc, hBar, msg, wParam, lParam);
}
static INT_PTR CALLBACK SoundView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@ -371,8 +423,13 @@ static INT_PTR CALLBACK SoundView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, L
case WM_INITDIALOG:
{
for(int chanId = 0; chanId < 8; chanId++) {
SendDlgItemMessage(hDlg, IDC_SOUND0VOLBAR+chanId, PBM_SETRANGE, (WPARAM)0, MAKELPARAM(0, 128));
SendDlgItemMessage(hDlg, IDC_SOUND0PANBAR+chanId, PBM_SETRANGE, (WPARAM)0, MAKELPARAM(0, 128));
HWND tmp = GetDlgItem(hDlg, IDC_SOUND0VOLBAR+chanId);
OldLevelBarProc = SetWindowLongPtr(tmp, GWLP_WNDPROC, (LONG_PTR)LevelBarProc);
SetProp(tmp, "chan", (HANDLE)chanId);
tmp = GetDlgItem(hDlg, IDC_SOUND0PANBAR+chanId);
OldPanBarProc = SetWindowLongPtr(tmp, GWLP_WNDPROC, (LONG_PTR)PanBarProc);
SetProp(tmp, "chan", (HANDLE)chanId);
}
for(int chanId = 0; chanId < 8; chanId++) {
@ -441,6 +498,7 @@ static INT_PTR CALLBACK SoundView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, L
case IDC_SOUNDVIEW_CHANSWITCH:
{
SoundView_SwitchChanOfs(data);
SoundView_Refresh(true);
}
return 1;
}

View File

@ -25,7 +25,7 @@ BOOL SoundView_DlgOpen(HWND hParentWnd);
void SoundView_DlgClose();
BOOL SoundView_IsOpened();
HWND SoundView_GetHWnd();
void SoundView_Refresh();
void SoundView_Refresh(bool forceRedraw = false);
INT_PTR CALLBACK SoundView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);