projects
/
dos_sbtest
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed DMA bug
[dos_sbtest]
/
src
/
au_sb.c
diff --git
a/src/au_sb.c
b/src/au_sb.c
index
c49b2cf
..
d733f20
100644
(file)
--- a/
src/au_sb.c
+++ b/
src/au_sb.c
@@
-89,9
+89,11
@@
static int xfer_mode;
\r
static int isplaying;
\r
static int cur_bits, cur_mode;
\r
\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
static void (INTERRUPT *prev_intr_handler)();
\r
\r
+
\r
int sb_detect(void)
\r
{
\r
int i;
\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
\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
}
\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
{
\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
addr = (uint32_t)buffer;
\r
}
\r
\r
- if(!(size = audio_callback(buffer, 65536))) {
\r
+ if(!(size = audio_callback(buffer, 32768))) {
\r
return;
\r
}
\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
\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
_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
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
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
/* 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
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
\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
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
start_dsp4(cur_bits, cur_mode, size);
\r
}
\r
\r