fixed DMA bug
[dos_sbtest] / src / au_sb.c
index c49b2cf..d733f20 100644 (file)
@@ -89,9 +89,11 @@ static int xfer_mode;
 \r
 static int isplaying;\r
 static int cur_bits, cur_mode;\r
+static int curblk;\r
 \r
 static void (INTERRUPT *prev_intr_handler)();\r
 \r
+\r
 int sb_detect(void)\r
 {\r
        int i;\r
@@ -178,11 +180,11 @@ void sb_set_output_rate(int rate)
 \r
 void *sb_buffer(int *size)\r
 {\r
-       *size = 65536;\r
-       return buffer;\r
+       *size = 32768;\r
+       return (char*)buffer + curblk * 32768;\r
 }\r
 \r
-void sb_start(int rate, int nchan)\r
+void sb_start(int rate, int bits, int nchan)\r
 {\r
        uint16_t seg, pmsel;\r
        uint32_t addr;\r
@@ -205,21 +207,23 @@ void sb_start(int rate, int nchan)
                addr = (uint32_t)buffer;\r
        }\r
 \r
-       if(!(size = audio_callback(buffer, 65536))) {\r
+       if(!(size = audio_callback(buffer, 32768))) {\r
                return;\r
        }\r
+       curblk = 1;\r
 \r
        _disable();\r
        if(!prev_intr_handler) {\r
                prev_intr_handler = _dos_getvect(IRQ_TO_INTR(irq));\r
        }\r
+       printf("setting interrupt vector: %d\n", IRQ_TO_INTR(irq));\r
        _dos_setvect(IRQ_TO_INTR(irq), intr_handler);\r
        _enable();\r
 \r
        unmask_irq(irq);\r
 \r
-       cur_bits = 8;\r
-       cur_mode = 0;\r
+       cur_bits = bits;\r
+       cur_mode = 0;   /* TODO */\r
        if(nchan > 1) {\r
                cur_mode |= DSP4_MODE_STEREO;\r
        }\r
@@ -236,6 +240,8 @@ static void start_dsp4(int bits, unsigned int mode, int num_samples)
        unsigned char cmd = bits == 8 ? DSP4_START_DMA8 : DSP4_START_DMA16;\r
        assert(bits == 8 || bits == 16);\r
 \r
+       /*cmd |= DSP4_AUTO | DSP4_FIFO;*/\r
+\r
        /* program the DSP to start the DMA transfer */\r
        write_dsp(cmd);\r
        write_dsp(mode);\r
@@ -290,12 +296,15 @@ void sb_volume(int vol)
 static void INTERRUPT intr_handler()\r
 {\r
        int size;\r
+       void *bptr = (unsigned char*)buffer + curblk * 32768;\r
+\r
+       curblk = (curblk + 1) & 1;\r
 \r
        /* ask for more data */\r
-       if(!(size = audio_callback(buffer, 65536))) {\r
+       if(!(size = audio_callback(bptr, 32768))) {\r
                sb_stop();\r
        } else {\r
-               dma_out(dma_chan, (uint32_t)buffer, size, DMA_SINGLE);\r
+               dma_out(dma_chan, (uint32_t)bptr, size, DMA_SINGLE);\r
                start_dsp4(cur_bits, cur_mode, size);\r
        }\r
 \r