- limit output packet size to max. 0,1 sec for continous sound at low data

rates (e.g. 8000 Hz, 8 bit, mono)
This commit is contained in:
Volker Ruppert 2011-04-26 18:35:43 +00:00
parent c44f82f4ac
commit e8555036ea
3 changed files with 13 additions and 5 deletions

View File

@ -432,7 +432,7 @@ void bx_es1370_c::es1370_timer(void)
timer_id = bx_pc_system.triggeredTimerID();
i = (timer_id == BX_ES1370_THIS s.dac1_timer_index) ? 0 : 1;
run_channel(i, timer_id, BX_SOUNDLOW_WAVEPACKETSIZE);
run_channel(i, timer_id, BX_ES1370_THIS s.dac_packet_size[i]);
}
void bx_es1370_c::run_channel(unsigned chan, int timer_id, Bit32u buflen)
@ -627,7 +627,11 @@ void bx_es1370_c::update_voices(Bit32u ctl, Bit32u sctl, bx_bool force)
BX_ES1370_THIS s.dac_nr_active = i;
}
}
timer_val = (Bit64u)BX_SOUNDLOW_WAVEPACKETSIZE * 1000000 / (new_freq << d->shift);
BX_ES1370_THIS s.dac_packet_size[i] = (new_freq / 10) << d->shift; // 0.1 sec
if (BX_ES1370_THIS s.dac_packet_size[i] > BX_SOUNDLOW_WAVEPACKETSIZE) {
BX_ES1370_THIS s.dac_packet_size[i] = BX_SOUNDLOW_WAVEPACKETSIZE;
}
timer_val = (Bit64u)BX_ES1370_THIS s.dac_packet_size[i] * 1000000 / (new_freq << d->shift);
bx_pc_system.activate_timer(timer_id, timer_val, 1);
}
} else {

View File

@ -52,6 +52,7 @@ typedef struct {
bx_bool dac_outputinit;
bx_bool adc_inputinit;
int dac_nr_active;
Bit16u dac_packet_size[2];
Bit32u base_ioaddr;
Bit8u devfunc;

View File

@ -1163,7 +1163,10 @@ void bx_sb16_c::dsp_dma(Bit8u command, Bit8u mode, Bit16u length, Bit8u comp)
initvocfile();
}
}
DSP.dma.chunkcount = sampledatarate / 10; // 0.1 sec
if (DSP.dma.chunkcount > BX_SOUNDLOW_WAVEPACKETSIZE) {
DSP.dma.chunkcount = BX_SOUNDLOW_WAVEPACKETSIZE;
}
} else {
if (BX_SB16_THIS wavemode == 1) {
if (DSP.inputinit == 0) {
@ -1333,10 +1336,10 @@ void bx_sb16_c::dsp_sendwavepacket()
// put a sample byte into the output buffer
void bx_sb16_c::dsp_getsamplebyte(Bit8u value)
{
if (DSP.dma.chunkindex < BX_SOUNDLOW_WAVEPACKETSIZE)
if (DSP.dma.chunkindex < DSP.dma.chunkcount)
DSP.dma.chunk[DSP.dma.chunkindex++] = value;
if (DSP.dma.chunkindex >= BX_SOUNDLOW_WAVEPACKETSIZE)
if (DSP.dma.chunkindex >= DSP.dma.chunkcount)
dsp_sendwavepacket();
}