исправление микширования каналов GS (gsz80.cpp):
inline void flush_gs_sound()
{
unsigned l,r; //!
l=gs_v[0]+gs_v[1]; //!
r=gs_v[2]+gs_v[3]; //!
if (temp.sndblock) return;
sound.update(gscpu.t + (unsigned) (gs_t_states - gscpu_t_at_frame_start), (l+r/2)/2, (r+l/2)/2); //!
for (int ch = 0; ch < 4; ch++) {
gsleds[ch].level = led_gssum[ch] * gsvol[ch] / (led_gscnt[ch]*(0x100*0x40/16)+1);
led_gssum[ch] = led_gscnt[ch] = 0;
gsleds[ch].attrib = 0x0F;
}
}
т.е. половина правого канала слышна в левом и наоборот. по скорости, наверное,
медленно, но можно не создавать переменные l и r, а вставить в формулу.
деление суммы в этой формуле сделано на 2 для быстроты, так-то надо делить на 1.5.
исправление щелчков громкости (опционально! в GS не так!) (gsz80.cpp):
void gs_byte_to_dac(unsigned addr, unsigned char byte)
{
flush_gs_sound();
unsigned chan = (addr>>8) & 3;
gsbyte[chan] = byte;
gs_v[chan] = ((signed char)(gsbyte[chan]-0x80) * (signed)gs_vfx[gsvol[chan]]) /256 +gs_vfx[33]; //!
//gs_v[chan] = (gsbyte[chan] * gs_vfx[gsvol[chan]]) >>8; //!
led_gssum[chan] += byte;
led_gscnt[chan]++;
}
тут байт звука берется знаковый, т.е. 0х80 - это 0, при этом как не меняй
громкость, на выходе будет 0. в конце формулы прибавляется середина громкости,
чтоб в результате число было в тех же самых пределах, что и раньше.
точно такую же замену сделать в void out(unsigned port, unsigned char val).