summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/sound/soundcard.c
diff options
context:
space:
mode:
authorswallace <swallace@FreeBSD.org>1995-03-12 23:34:12 +0000
committerswallace <swallace@FreeBSD.org>1995-03-12 23:34:12 +0000
commit918019dbbdac1461aa95629db3d864b7701860ff (patch)
tree27d81f18aab07907ea53bb67e00627773ac49366 /sys/i386/isa/sound/soundcard.c
parent1d684c7bdec8e2179021e431efa36a207446a54f (diff)
downloadFreeBSD-src-918019dbbdac1461aa95629db3d864b7701860ff.zip
FreeBSD-src-918019dbbdac1461aa95629db3d864b7701860ff.tar.gz
Reorganize how sound devices are configured. Use a snd controller
with individual devices for each type of sound card: opl, sb, sbxvi, sbmidi, pas, mpu, gus, gusxvi, gusmax, mss, uart EXCLUDE_* options are no longer required to be included in the config file. They are automatically determined by local.h depending on the devices included. Move #includes in local.h to os.h so files are included in the proper order to avoid warnings. soundcard.c now has additional code to reflect the device driver routines needed. Define new EXCLUDE_SB16MIDI for use in sb16_midi.c and dev_table.h. #ifndef EXCLUDE_SEQUENCER or EXCLUDE_AUDIO have been added to soundcard.c and sound_switch.c where appropriate. Probe outputs changed to reflect new device names. Readme.freebsd not needed. Update sound.doc with new config instructions. Reviewed by: wollman
Diffstat (limited to 'sys/i386/isa/sound/soundcard.c')
-rw-r--r--sys/i386/isa/sound/soundcard.c75
1 files changed, 63 insertions, 12 deletions
diff --git a/sys/i386/isa/sound/soundcard.c b/sys/i386/isa/sound/soundcard.c
index 69b62bf..83cf06e 100644
--- a/sys/i386/isa/sound/soundcard.c
+++ b/sys/i386/isa/sound/soundcard.c
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: soundcard.c,v 1.21 1995/02/13 22:49:06 jkh Exp $
+ * $Id: soundcard.c,v 1.23 1995/03/05 04:01:29 jkh Exp $
*/
#include "sound_config.h"
@@ -66,6 +66,18 @@ int sndwrite (int dev, struct uio *uio);
int sndselect (int dev, int rw, struct proc *p);
static void sound_mem_init(void);
+struct isa_driver opldriver = {sndprobe, sndattach, "opl"};
+struct isa_driver sbdriver = {sndprobe, sndattach, "sb"};
+struct isa_driver sbxvidriver = {sndprobe, sndattach, "sbxvi"};
+struct isa_driver sbmididriver = {sndprobe, sndattach, "sbmidi"};
+struct isa_driver pasdriver = {sndprobe, sndattach, "pas"};
+struct isa_driver mpudriver = {sndprobe, sndattach, "mpu"};
+struct isa_driver gusdriver = {sndprobe, sndattach, "gus"};
+struct isa_driver gusxvidriver = {sndprobe, sndattach, "gusxvi"};
+struct isa_driver gusmaxdriver = {sndprobe, sndattach, "gusmax"};
+struct isa_driver uartdriver = {sndprobe, sndattach, "uart"};
+struct isa_driver mssdriver = {sndprobe, sndattach, "mss"};
+
unsigned
long
get_time(void)
@@ -192,38 +204,74 @@ ipri_to_irq (unsigned short ipri)
return -1; /* Invalid argument */
}
+static int
+driver_to_voxunit(struct isa_driver *driver)
+{
+ /* converts a sound driver pointer into the equivalent
+ VoxWare device unit number */
+ if(driver == &opldriver)
+ return(SNDCARD_ADLIB);
+ else if(driver == &sbdriver)
+ return(SNDCARD_SB);
+ else if(driver == &pasdriver)
+ return(SNDCARD_PAS);
+ else if(driver == &gusdriver)
+ return(SNDCARD_GUS);
+ else if(driver == &mpudriver)
+ return(SNDCARD_MPU401);
+ else if(driver == &sbxvidriver)
+ return(SNDCARD_SB16);
+ else if(driver == &sbmididriver)
+ return(SNDCARD_SB16MIDI);
+ else if(driver == &uartdriver)
+ return(SNDCARD_UART6850);
+ else if(driver == &gusdriver)
+ return(SNDCARD_GUS16);
+ else if(driver == &mssdriver)
+ return(SNDCARD_MSS);
+ else
+ return(0);
+}
+
int
sndprobe (struct isa_device *dev)
{
struct address_info hw_config;
+ int unit;
+ unit = driver_to_voxunit(dev->id_driver);
hw_config.io_base = dev->id_iobase;
hw_config.irq = ipri_to_irq (dev->id_irq);
hw_config.dma = dev->id_drq;
- return sndtable_probe (dev->id_unit, &hw_config);
+ if(unit)
+ return sndtable_probe (unit, &hw_config);
+ else
+ return 0;
}
int
sndattach (struct isa_device *dev)
{
- int i;
+ int i, unit;
static int midi_initialized = 0;
static int seq_initialized = 0;
static int generic_midi_initialized = 0;
unsigned long mem_start = 0xefffffffUL;
struct address_info hw_config;
+ unit = driver_to_voxunit(dev->id_driver);
hw_config.io_base = dev->id_iobase;
hw_config.irq = ipri_to_irq (dev->id_irq);
hw_config.dma = dev->id_drq;
- if (dev->id_unit) /* Card init */
- if (!sndtable_init_card (dev->id_unit, &hw_config))
- {
- printf (" <Driver not configured>");
- return FALSE;
- }
+ if(!unit)
+ return FALSE;
+ if (!sndtable_init_card (unit, &hw_config))
+ {
+ printf (" <Driver not configured>");
+ return FALSE;
+ }
/*
* Init the high level sound driver
@@ -248,17 +296,21 @@ sndattach (struct isa_device *dev)
soundcard_configured = 1;
#endif
+#ifndef EXCLUDE_MIDI
if (num_midis && !midi_initialized)
{
midi_initialized = 1;
mem_start = MIDIbuf_init (mem_start);
}
+#endif
+#ifndef EXCLUDE_SEQUENCER
if ((num_midis + num_synths) && !seq_initialized)
{
seq_initialized = 1;
mem_start = sequencer_init (mem_start);
}
+#endif
return TRUE;
}
@@ -272,6 +324,7 @@ tenmicrosec (void)
inb (0x80);
}
+#ifndef EXCLUDE_SEQUENCER
void
request_sound_timer (int count)
{
@@ -305,6 +358,7 @@ sound_stop_timer (void)
untimeout ((timeout_func_t)sequencer_timer, 0);
timer_running = 0;
}
+#endif
#ifndef EXCLUDE_AUDIO
static void
@@ -365,9 +419,6 @@ sound_mem_init (void)
#endif
-struct isa_driver snddriver =
-{sndprobe, sndattach, "snd"};
-
int
snd_ioctl_return (int *addr, int value)
{
OpenPOWER on IntegriCloud