X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dos_sbtest;a=blobdiff_plain;f=src%2Fau_sb.c;h=c2480c6d7b976f7f00750319fee9a95adb0b18cd;hp=c49b2cf646da07a5f2f541d667263d89f927c546;hb=HEAD;hpb=07c19444f4f2a55abf97d181ab62aeaa51033c62 diff --git a/src/au_sb.c b/src/au_sb.c index c49b2cf..c2480c6 100644 --- a/src/au_sb.c +++ b/src/au_sb.c @@ -89,9 +89,11 @@ static int xfer_mode; static int isplaying; static int cur_bits, cur_mode; +static int curblk; static void (INTERRUPT *prev_intr_handler)(); + int sb_detect(void) { int i; @@ -178,11 +180,11 @@ void sb_set_output_rate(int rate) void *sb_buffer(int *size) { - *size = 65536; - return buffer; + *size = 32768; + return (char*)buffer + curblk * 32768; } -void sb_start(int rate, int nchan) +void sb_start(int rate, int bits, int nchan) { uint16_t seg, pmsel; uint32_t addr; @@ -205,21 +207,23 @@ void sb_start(int rate, int nchan) addr = (uint32_t)buffer; } - if(!(size = audio_callback(buffer, 65536))) { + if(!(size = audio_callback(buffer, 32768))) { return; } + curblk = 1; _disable(); if(!prev_intr_handler) { prev_intr_handler = _dos_getvect(IRQ_TO_INTR(irq)); } + printf("setting interrupt vector: %d\n", IRQ_TO_INTR(irq)); _dos_setvect(IRQ_TO_INTR(irq), intr_handler); _enable(); unmask_irq(irq); - cur_bits = 8; - cur_mode = 0; + cur_bits = bits; + cur_mode = 0; /* TODO */ if(nchan > 1) { cur_mode |= DSP4_MODE_STEREO; } @@ -290,12 +294,15 @@ void sb_volume(int vol) static void INTERRUPT intr_handler() { int size; + void *bptr = (unsigned char*)buffer + curblk * 32768; + + curblk = (curblk + 1) & 1; /* ask for more data */ - if(!(size = audio_callback(buffer, 65536))) { + if(!(size = audio_callback(bptr, 32768))) { sb_stop(); } else { - dma_out(dma_chan, (uint32_t)buffer, size, DMA_SINGLE); + dma_out(dma_chan, (uint32_t)bptr, size, DMA_SINGLE); start_dsp4(cur_bits, cur_mode, size); }