diff options
author | markm <markm@FreeBSD.org> | 1997-10-31 06:30:22 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 1997-10-31 06:30:22 +0000 |
commit | be4808f6e2badf1629d651d8f1d2f5c7707e47a8 (patch) | |
tree | 9a3e498c45ec2bf39c7d1c79c9aa4bab90d109e8 /sys/i386/isa/sound/dev_table.c | |
parent | 17d7551904f5e100c3f914c00c72350a63a49dfa (diff) | |
download | FreeBSD-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.c | 341 |
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 |