summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/sound/dev_table.c
diff options
context:
space:
mode:
authormarkm <markm@FreeBSD.org>1997-10-31 06:30:22 +0000
committermarkm <markm@FreeBSD.org>1997-10-31 06:30:22 +0000
commitbe4808f6e2badf1629d651d8f1d2f5c7707e47a8 (patch)
tree9a3e498c45ec2bf39c7d1c79c9aa4bab90d109e8 /sys/i386/isa/sound/dev_table.c
parent17d7551904f5e100c3f914c00c72350a63a49dfa (diff)
downloadFreeBSD-src-be4808f6e2badf1629d651d8f1d2f5c7707e47a8.zip
FreeBSD-src-be4808f6e2badf1629d651d8f1d2f5c7707e47a8.tar.gz
Upgrade the sound sources to Amancio Hasty's latest-and-greatest.
This is based on Voxware 3.5, and corresponds to Amancio's `guspnp21'. Bug reports to Amancio, please!
Diffstat (limited to 'sys/i386/isa/sound/dev_table.c')
-rw-r--r--sys/i386/isa/sound/dev_table.c341
1 files changed, 231 insertions, 110 deletions
diff --git a/sys/i386/isa/sound/dev_table.c b/sys/i386/isa/sound/dev_table.c
index ed01fd4..42e5197 100644
--- a/sys/i386/isa/sound/dev_table.c
+++ b/sys/i386/isa/sound/dev_table.c
@@ -1,10 +1,10 @@
/*
* sound/dev_table.c
- *
+ *
* Device call tables.
- *
+ *
* Copyright by Hannu Savolainen 1993
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: 1. Redistributions of source code must retain the above copyright
@@ -12,7 +12,7 @@
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -24,159 +24,280 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
*/
#define _DEV_TABLE_C_
#include <i386/isa/sound/sound_config.h>
-#ifdef CONFIGURE_SOUNDCARD
+#if NSND > 0
+
+int sound_started = 0;
+
+int sndtable_get_cardcount(void);
+int snd_find_driver(int type);
+void sndtable_init(void);
+int sndtable_probe(int unit, struct address_info * hw_config);
+int sndtable_init_card(int unit, struct address_info * hw_config);
+int sndtable_identify_card(char *name);
+void sound_chconf(int card_type, int ioaddr, int irq, int dma);
+static void start_services(void);
+static void start_cards(void);
+struct address_info *sound_getconf(int card_type);
int
-snd_find_driver (int type)
+snd_find_driver(int type)
{
- int i, n = sizeof (sound_drivers) / sizeof (struct driver_info);
+ int i, n = num_sound_drivers;
- for (i = 0; i < (n - 1); i++)
- if (sound_drivers[i].card_type == type)
- return i;
+ for (i = 0; i < n; i++)
+ if (sound_drivers[i].card_type == type)
+ return i;
- return -1; /*
- * Not found
- */
+ return -1;
}
-static long
-sndtable_init (long mem_start)
+static void
+start_services()
{
- int i, n = sizeof (snd_installed_cards) / sizeof (struct card_info);
- int drv;
-
- printk ("Sound initialization started\n");
-
- for (i = 0; i < (n - 1); i++)
- if (snd_installed_cards[i].enabled)
- if ((drv = snd_find_driver (snd_installed_cards[i].card_type)) == -1)
- snd_installed_cards[i].enabled = 0; /*
- * Mark as not detected
- */
- else if (sound_drivers[drv].probe (&snd_installed_cards[i].config))
- {
-#ifndef SHORT_BANNERS
- printk ("snd%d",
- snd_installed_cards[i].card_type);
+ int soundcards_installed;
+
+ if (!(soundcards_installed = sndtable_get_cardcount()))
+ return ; /* No cards detected */
+
+#ifdef CONFIG_AUDIO
+ if (num_audiodevs) /* Audio devices present */
+ DMAbuf_init();
#endif
- mem_start = sound_drivers[drv].attach (mem_start, &snd_installed_cards[i].config);
-#ifndef SHORT_BANNERS
- printk (" at 0x%x irq %d drq %d\n",
- snd_installed_cards[i].config.io_base,
- snd_installed_cards[i].config.irq,
- snd_installed_cards[i].config.dma);
+#ifdef CONFIG_MIDI
+ if (num_midis)
+ /* MIDIbuf_init(0) */;
#endif
+
+#ifdef CONFIG_SEQUENCER
+ if (num_midis + num_synths)
+ sequencer_init();
+#endif
+}
+
+static void
+start_cards()
+{
+ int drv, i, n = num_sound_cards;
+ struct card_info *ci = snd_installed_cards ;
+
+ sound_started = 1;
+ if (trace_init)
+ printf("Sound initialization started\n");
+
+ /*
+ * Check the number of cards actually defined in the table
+ */
+
+ for (i = 0; i < n && snd_installed_cards[i].card_type; i++)
+ num_sound_cards = i + 1;
+
+ for (i = 0; i < n && ci->card_type; ci++, i++)
+ if (ci->enabled) {
+ if ((drv = snd_find_driver(ci->card_type)) == -1) {
+ ci->enabled = 0; /* Mark as not detected */
+ continue;
+ }
+ ci->config.card_subtype = sound_drivers[drv].card_subtype;
+
+ if (sound_drivers[drv].probe(&(ci->config)))
+ sound_drivers[drv].attach(&(ci->config));
+ else
+ ci->enabled = 0; /* Mark as not detected */
}
- else
- snd_installed_cards[i].enabled = 0; /*
- * Mark as not detected
- */
- printk ("Sound initialization complete\n");
- return mem_start;
+ if (trace_init)
+ printf("Sound initialization complete\n");
}
+void
+sndtable_init()
+{
+ start_cards();
+}
+
+/*
+ * sndtable_probe probes a specific device. unit is the voxware unit number.
+ */
+
int
-sndtable_probe (int unit, struct address_info *hw_config)
+sndtable_probe(int unit, struct address_info * hw_config)
{
- int r, i, n = sizeof (snd_installed_cards) / sizeof (struct card_info);
+ int i, sel = -1, n = num_sound_cards;
+ struct card_info *ci = snd_installed_cards ;
- if (!unit)
- return 0;
+ DDB(printf("-- sndtable_probe(%d)\n", unit));
+
+
+ /*
+ * for some reason unit 0 always succeeds ?
+ */
+ if (!unit)
+ return TRUE;
+
+ sound_started = 1;
+
+ for (i=0; i<n && sel== -1 && ci->card_type; ci++, i++)
+ if ( (ci->enabled) && (ci->card_type == unit) ) {
+ /* DDB(printf("-- found card %d\n", i) ); */
+ sel = i; /* and break */
+ }
- for (i = 0; i < (n - 1); i++)
- if (snd_installed_cards[i].enabled)
- if (snd_installed_cards[i].card_type == unit)
- {
- int drv;
-
- snd_installed_cards[i].config.io_base = hw_config->io_base;
- snd_installed_cards[i].config.irq = hw_config->irq;
- snd_installed_cards[i].config.dma = hw_config->dma;
- if ((drv = snd_find_driver (snd_installed_cards[i].card_type)) == -1)
- snd_installed_cards[i].enabled = 0; /*
- * Mark as not
- * detected
- */
- else if ((r = sound_drivers[drv].probe (hw_config)))
- return r;
- snd_installed_cards[i].enabled = 0; /*
- * Mark as not detected
- */
- return 0;
+ /*
+ * not found. Creates a new entry in the table for this unit.
+ */
+ if (sel == -1 && num_sound_cards < max_sound_cards) {
+ int i;
+
+ i = sel = (num_sound_cards++);
+ DDB(printf("-- installing card %d\n", i) );
+
+ ci = &snd_installed_cards[sel] ;
+ ci->card_type = unit;
+ ci->enabled = 1;
+ }
+ /* DDB(printf("-- installed card %d\n", sel) ); */
+ if (sel != -1) {
+ int drv;
+
+ ci->config.io_base = hw_config->io_base;
+ ci->config.irq = hw_config->irq;
+ ci->config.dma = hw_config->dma;
+ ci->config.dma2 = hw_config->dma2;
+ ci->config.name = hw_config->name;
+ ci->config.always_detect = hw_config->always_detect;
+ ci->config.card_subtype = hw_config->card_subtype;
+ ci->config.osp = hw_config->osp;
+
+ if ((drv = snd_find_driver(ci->card_type)) == -1) {
+ ci->enabled = 0;
+ DDB(printf("Failed to find driver\n"));
+ return FALSE;
}
+ DDB(printf("-- Driver name '%s' probe 0x%08x\n",
+ sound_drivers[drv].name, sound_drivers[drv].probe));
+
+ hw_config->card_subtype =
+ ci->config.card_subtype = sound_drivers[drv].card_subtype;
- return 0;
+ if (sound_drivers[drv].probe(hw_config)) {
+ DDB(printf("-- Hardware probed OK\n"));
+ return TRUE;
+ }
+ DDB(printf("-- Failed to find hardware\n"));
+ ci->enabled = 0; /* mark as not detected */
+ return FALSE;
+ }
+ return FALSE;
}
int
-sndtable_init_card (int unit, struct address_info *hw_config)
+sndtable_init_card(int unit, struct address_info * hw_config)
{
- int i, n = sizeof (snd_installed_cards) / sizeof (struct card_info);
+ int i, n = num_sound_cards;
+ struct card_info *ci = snd_installed_cards ;
- if (!unit)
- {
- if (sndtable_init (0) != 0)
- panic ("snd: Invalid memory allocation\n");
- return TRUE;
- }
+ DDB(printf("sndtable_init_card(%d) entered\n", unit));
- for (i = 0; i < (n - 1); i++)
- if (snd_installed_cards[i].card_type == unit)
- {
- int drv;
-
- snd_installed_cards[i].config.io_base = hw_config->io_base;
- snd_installed_cards[i].config.irq = hw_config->irq;
- snd_installed_cards[i].config.dma = hw_config->dma;
-
- if ((drv = snd_find_driver (snd_installed_cards[i].card_type)) == -1)
- snd_installed_cards[i].enabled = 0; /*
- * Mark as not detected
- */
- else if (sound_drivers[drv].attach (0, hw_config) != 0)
- panic ("snd#: Invalid memory allocation\n");
+ if (!unit) {
+ sndtable_init() ;
return TRUE;
- }
+ }
+ for (i = 0; i < n && ci->card_type; ci++, i++)
+ if (ci->card_type == unit) {
+ int drv;
+
+ ci->config.io_base = hw_config->io_base;
+ ci->config.irq = hw_config->irq;
+ ci->config.dma = hw_config->dma;
+ ci->config.dma2 = hw_config->dma2;
+ ci->config.name = hw_config->name;
+ ci->config.always_detect = hw_config->always_detect;
+ ci->config.card_subtype = hw_config->card_subtype;
+ ci->config.osp = hw_config->osp;
- return FALSE;
+ if ((drv = snd_find_driver(ci->card_type)) == -1)
+ ci->enabled = 0; /* Mark not fnd */
+ else {
+ DDB(printf("Located card - calling attach routine\n"));
+ sound_drivers[drv].attach(hw_config) ;
+ DDB(printf("attach routine finished\n"));
+ }
+ start_services();
+ return TRUE;
+ }
+ DDB(printf("sndtable_init_card: No card defined with type=%d, num cards: %d\n",
+ unit, num_sound_cards));
+ return FALSE;
}
int
-sndtable_get_cardcount (void)
+sndtable_get_cardcount(void)
{
- return num_audiodevs + num_mixers + num_synths + num_midis;
+ return num_audiodevs + num_mixers + num_synths + num_midis;
}
-struct address_info *
-sound_getconf (int card_type)
+int
+sndtable_identify_card(char *name)
{
- int j, ptr;
- int n = sizeof (snd_installed_cards) / sizeof (struct card_info);
+ int i, n = num_sound_drivers;
- ptr = -1;
- for (j = 0; j < n && ptr == -1; j++)
- if (snd_installed_cards[j].card_type == card_type)
- ptr = j;
+ if (name == NULL)
+ return 0;
- if (ptr == -1)
- return (struct address_info *) NULL;
+ for (i = 0; i < n; i++)
+ if (sound_drivers[i].driver_id != NULL) {
+ char *id = sound_drivers[i].driver_id;
+ int j;
- return &snd_installed_cards[ptr].config;
+ for (j = 0; j < 80 && name[j] == id[j]; j++)
+ if (id[j] == 0 && name[j] == 0) /* Match */
+ return sound_drivers[i].card_type;
+ }
+ return 0;
}
-#else
-
void
-sound_setup (char *str, int *ints)
+sound_chconf(int card_type, int ioaddr, int irq, int dma)
+{
+ int j, ptr = -1, n = num_sound_cards;
+
+ for (j = 0; j < n && ptr == -1 && snd_installed_cards[j].card_type; j++)
+ if (snd_installed_cards[j].card_type == card_type &&
+ !snd_installed_cards[j].enabled) /* Not already found */
+ ptr = j;
+
+ if (ptr != -1) {
+ snd_installed_cards[ptr].enabled = 1;
+ if (ioaddr)
+ snd_installed_cards[ptr].config.io_base = ioaddr;
+ if (irq)
+ snd_installed_cards[ptr].config.irq = irq;
+ if (dma)
+ snd_installed_cards[ptr].config.dma = dma;
+ snd_installed_cards[ptr].config.dma2 = -1;
+ }
+}
+
+
+struct address_info *
+sound_getconf(int card_type)
{
+ int j, ptr = -1, n = num_sound_cards;
+
+ for (j = 0; j < n && ptr == -1 && snd_installed_cards[j].card_type; j++)
+ if (snd_installed_cards[j].card_type == card_type)
+ ptr = j;
+
+ if (ptr == -1)
+ return (struct address_info *) NULL;
+
+ return &snd_installed_cards[ptr].config;
}
#endif
OpenPOWER on IntegriCloud