Don't process Sound Blaster 16-bit transfers when DMA disabled. Fixes Visual Player 2.0.

This commit is contained in:
SarahW 2018-04-13 21:16:33 +01:00
commit 20e255ceb7

View file

@ -340,7 +340,7 @@ void sb_8_write_dma(sb_dsp_t *dsp, uint8_t val)
fwrite(&val,1,1,soundf); fwrite(&val,1,1,soundf);
#endif #endif
} }
uint16_t sb_16_read_dma(sb_dsp_t *dsp) int sb_16_read_dma(sb_dsp_t *dsp)
{ {
return dma_channel_read(dsp->sb_16_dmanum); return dma_channel_read(dsp->sb_16_dmanum);
} }
@ -977,26 +977,42 @@ void pollsb(void *p)
} }
if (dsp->sb_16_enable && !dsp->sb_16_pause && dsp->sb_pausetime < 0 && dsp->sb_16_output) if (dsp->sb_16_enable && !dsp->sb_16_pause && dsp->sb_pausetime < 0 && dsp->sb_16_output)
{ {
int data[2];
sb_dsp_update(dsp); sb_dsp_update(dsp);
switch (dsp->sb_16_format) switch (dsp->sb_16_format)
{ {
case 0x00: /*Mono unsigned*/ case 0x00: /*Mono unsigned*/
dsp->sbdatl = dsp->sbdatr = sb_16_read_dma(dsp) ^ 0x8000; data[0] = sb_16_read_dma(dsp);
if (data[0] == DMA_NODATA)
break;
dsp->sbdatl = dsp->sbdatr = data[0] ^ 0x8000;
dsp->sb_16_length--; dsp->sb_16_length--;
break; break;
case 0x10: /*Mono signed*/ case 0x10: /*Mono signed*/
dsp->sbdatl = dsp->sbdatr = sb_16_read_dma(dsp); data[0] = sb_16_read_dma(dsp);
if (data[0] == DMA_NODATA)
break;
dsp->sbdatl = dsp->sbdatr = data[0];
dsp->sb_16_length--; dsp->sb_16_length--;
break; break;
case 0x20: /*Stereo unsigned*/ case 0x20: /*Stereo unsigned*/
dsp->sbdatl = sb_16_read_dma(dsp) ^ 0x8000; data[0] = sb_16_read_dma(dsp);
dsp->sbdatr = sb_16_read_dma(dsp) ^ 0x8000; data[1] = sb_16_read_dma(dsp);
if (data[0] == DMA_NODATA || data[1] == DMA_NODATA)
break;
dsp->sbdatl = data[0] ^ 0x8000;
dsp->sbdatr = data[1] ^ 0x8000;
dsp->sb_16_length -= 2; dsp->sb_16_length -= 2;
break; break;
case 0x30: /*Stereo signed*/ case 0x30: /*Stereo signed*/
dsp->sbdatl = sb_16_read_dma(dsp); data[0] = sb_16_read_dma(dsp);
dsp->sbdatr = sb_16_read_dma(dsp); data[1] = sb_16_read_dma(dsp);
if (data[0] == DMA_NODATA || data[1] == DMA_NODATA)
break;
dsp->sbdatl = data[0];
dsp->sbdatr = data[1];
dsp->sb_16_length -= 2; dsp->sb_16_length -= 2;
break; break;
// default: // default: