diff options
author | Amancio Hasty <ahasty@FreeBSD.org> | 1997-11-23 07:35:06 +0000 |
---|---|---|
committer | Amancio Hasty <ahasty@FreeBSD.org> | 1997-11-23 07:35:06 +0000 |
commit | 26ed678ef99eeae0fa12edaff8dda74af0158063 (patch) | |
tree | ebb74ccf2d750302e39959a11beada855231fbc1 /sys/i386 | |
parent | 60dc9be97bb3cc543a58fa9b0d565803ebfa76bd (diff) | |
download | src-26ed678ef99eeae0fa12edaff8dda74af0158063.tar.gz src-26ed678ef99eeae0fa12edaff8dda74af0158063.zip |
Fixed acquired dma channel problem.
Notes
Notes:
svn path=/head/; revision=31362
Diffstat (limited to 'sys/i386')
-rw-r--r-- | sys/i386/isa/sound/sb16_dsp.c | 30 | ||||
-rw-r--r-- | sys/i386/isa/sound/sb_dsp.c | 30 |
2 files changed, 56 insertions, 4 deletions
diff --git a/sys/i386/isa/sound/sb16_dsp.c b/sys/i386/isa/sound/sb16_dsp.c index 1e94e1529026..ad9be54032ce 100644 --- a/sys/i386/isa/sound/sb16_dsp.c +++ b/sys/i386/isa/sound/sb16_dsp.c @@ -48,6 +48,8 @@ static int dsp_stereo = 0; static int dsp_current_speed = 8000; static int dsp_busy = 0; static int dma16, dma8; + + static int trigger_bits = 0; static u_long dsp_count = 0; @@ -198,6 +200,7 @@ sb16_dsp_open(int dev, int mode) int retval; DEB(printf("sb16_dsp_open()\n")); + if (!sb16_dsp_ok) { printf("SB16 Error: SoundBlaster board not installed\n"); return -(ENXIO); @@ -207,6 +210,7 @@ sb16_dsp_open(int dev, int mode) sb_reset_dsp(); + irq_mode = IMODE_NONE; dsp_busy = 1; trigger_bits = 0; @@ -229,6 +233,8 @@ sb16_dsp_close(int dev) dsp_cleanup(); dsp_busy = 0; + + splx(flags); } @@ -237,10 +243,12 @@ sb16_dsp_output_block(int dev, u_long buf, int count, int intrflag, int dma_rest { u_long flags, cnt; + cnt = count; if (dsp_16bit) cnt >>= 1; cnt--; + if (audio_devs[dev]->flags & DMA_AUTOMODE && intrflag && cnt==dsp_count) { irq_mode = IMODE_OUTPUT; intr_active = 1; @@ -309,7 +317,20 @@ sb16_dsp_start_input(int dev, u_long buf, int count, int intrflag, int dma_resta static int sb16_dsp_prepare_for_input(int dev, int bsize, int bcount) { + int fudge; + struct dma_buffparms *dmap = audio_devs[dev]->dmap_in; + audio_devs[my_dev]->dmachan2 = dsp_16bit ? dma16 : dma8; + + + fudge = audio_devs[my_dev]->dmachan2 ; + + if (dmap->dma_chan != fudge ) { + isa_dma_release( dmap->dma_chan); + isa_dma_acquire(fudge); + dmap->dma_chan = fudge; + } + dsp_count = 0; dsp_cleanup(); if (dsp_16bit) @@ -325,11 +346,16 @@ static int sb16_dsp_prepare_for_output(int dev, int bsize, int bcount) { int fudge = dsp_16bit ? dma16 : dma8; + struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - isa_dma_release( audio_devs[my_dev]->dmachan1 ); - isa_dma_acquire(fudge); + if (dmap->dma_chan != fudge ) { + isa_dma_release( dmap->dma_chan); + isa_dma_acquire(fudge); + dmap->dma_chan = fudge; + } audio_devs[my_dev]->dmachan1 = fudge; + dsp_count = 0; dsp_cleanup(); if (dsp_16bit) diff --git a/sys/i386/isa/sound/sb_dsp.c b/sys/i386/isa/sound/sb_dsp.c index 67c66f765858..47e93b220080 100644 --- a/sys/i386/isa/sound/sb_dsp.c +++ b/sys/i386/isa/sound/sb_dsp.c @@ -50,6 +50,8 @@ * variables are put in a struct sb_unit[] array */ + + int sbc_base = 0; int sbc_irq = 0; static int open_mode = 0; /* Read, write or both */ @@ -231,7 +233,6 @@ dsp_speed(int speed) u_long flags; int max_speed = 44100; -printf("dsp_speed %d\n", speed); /* XXX lr 970601 */ if (speed < 4000) speed = 4000; @@ -310,7 +311,6 @@ printf("dsp_speed %d\n", speed); /* XXX lr 970601 */ speed /= 2; dsp_current_speed = speed; -printf("dsp_speed done %d\n", speed); return speed; } @@ -445,6 +445,9 @@ dsp_cleanup(void) static int sb_dsp_prepare_for_input(int dev, int bsize, int bcount) { + int fudge = -1; + struct dma_buffparms *dmap = audio_devs[dev]->dmap_in; + dsp_cleanup(); dsp_speaker(OFF); @@ -470,6 +473,14 @@ sb_dsp_prepare_for_input(int dev, int bsize, int bcount) dsp_speed(dsp_current_speed); /* Speed must be recalculated * if #channels * changes */ } + + fudge = audio_devs[my_dev]->dmachan1; + if (dmap->dma_chan != fudge ) { + isa_dma_release( dmap->dma_chan); + isa_dma_acquire(fudge); + dmap->dma_chan = fudge; + } + trigger_bits = 0; sb_dsp_command(DSP_CMD_DMAHALT); /* Halt DMA */ return 0; @@ -478,6 +489,10 @@ sb_dsp_prepare_for_input(int dev, int bsize, int bcount) static int sb_dsp_prepare_for_output(int dev, int bsize, int bcount) { + + int fudge; + struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; + dsp_cleanup(); dsp_speaker(ON); @@ -488,6 +503,7 @@ sb_dsp_prepare_for_output(int dev, int bsize, int bcount) * 16 bit specific instructions */ audio_devs[my_dev]->dmachan1 = dsp_16bit ? dma16 : dma8; + if (Jazz16_detected != 2) /* SM Wave */ sb_mixer_set_stereo(dsp_stereo); if (dsp_stereo) @@ -501,6 +517,14 @@ sb_dsp_prepare_for_output(int dev, int bsize, int bcount) * if #channels * changes */ } #endif + fudge = audio_devs[my_dev]->dmachan1; + + if (dmap->dma_chan != fudge ) { + isa_dma_release( dmap->dma_chan); + isa_dma_acquire(fudge); + dmap->dma_chan = fudge; + } + trigger_bits = 0; sb_dsp_command(DSP_CMD_DMAHALT); /* Halt DMA */ return 0; @@ -548,6 +572,7 @@ sb_dsp_open(int dev, int mode) sb_dsp_busy = 1; open_mode = mode; + return 0; } @@ -569,6 +594,7 @@ sb_dsp_close(int dev) sb_dsp_busy = 0; sb_dsp_highspeed = 0; open_mode = 0; + } #ifdef JAZZ16 |