aboutsummaryrefslogtreecommitdiff
path: root/sys/i386
diff options
context:
space:
mode:
authorAmancio Hasty <ahasty@FreeBSD.org>1997-11-23 07:35:06 +0000
committerAmancio Hasty <ahasty@FreeBSD.org>1997-11-23 07:35:06 +0000
commit26ed678ef99eeae0fa12edaff8dda74af0158063 (patch)
treeebb74ccf2d750302e39959a11beada855231fbc1 /sys/i386
parent60dc9be97bb3cc543a58fa9b0d565803ebfa76bd (diff)
downloadsrc-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.c30
-rw-r--r--sys/i386/isa/sound/sb_dsp.c30
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