Esempio n. 1
0
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 */
        }
    if (trace_init)
        printf("Sound initialization complete\n");
}
Esempio n. 2
0
int
sndtable_init_card(int unit, struct address_info * hw_config)
{
    int     i, n = num_sound_cards;
    struct card_info *ci = snd_installed_cards ;

    DDB(printf("sndtable_init_card(%d) entered\n", unit));

    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;

            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;
}
Esempio n. 3
0
static int sound_proc_get_info(char *buffer, char **start, off_t offset, int length, int inout)
{
	int len, i, drv;
        off_t pos = 0;
        off_t begin = 0;

#ifdef MODULE
#define MODULEPROCSTRING "Driver loaded as a module"
#else
#define MODULEPROCSTRING "Driver compiled into kernel"
#endif

	down(&uts_sem);	

	len = sprintf(buffer, "OSS/Free:" SOUND_VERSION_STRING "\n"
		      "Load type: " MODULEPROCSTRING "\n"
		      "Kernel: %s %s %s %s %s\n"
		      "Config options: %x\n\nInstalled drivers: \n", 
		      system_utsname.sysname, system_utsname.nodename, system_utsname.release, 
		      system_utsname.version, system_utsname.machine, SELECTED_SOUND_OPTIONS);
	up(&uts_sem);
	
	for (i = 0; (i < num_sound_drivers) && (pos <= offset + length); i++) {
		if (!sound_drivers[i].card_type)
			continue;
		len += sprintf(buffer + len, "Type %d: %s\n", 
			       sound_drivers[i].card_type, sound_drivers[i].name);
		pos = begin + len;
		if (pos < offset) {
			len = 0;
			begin = pos;
		}
	}
	len += sprintf(buffer + len, "\nCard config: \n");

	for (i = 0; (i < num_sound_cards) && (pos <= offset + length); i++) 
	{
		if (!snd_installed_cards[i].card_type)
			continue;
		if (!snd_installed_cards[i].enabled)
			len += sprintf(buffer + len, "(");
		if ((drv = snd_find_driver(snd_installed_cards[i].card_type)) != -1)
			len += sprintf(buffer + len, "%s", sound_drivers[drv].name);
		if (snd_installed_cards[i].config.io_base)
			len += sprintf(buffer + len, " at 0x%x", snd_installed_cards[i].config.io_base);
		if (snd_installed_cards[i].config.irq != 0)
			len += sprintf(buffer + len, " irq %d", abs(snd_installed_cards[i].config.irq));
		if (snd_installed_cards[i].config.dma != -1) {
			len += sprintf(buffer + len, " drq %d", snd_installed_cards[i].config.dma);
			if (snd_installed_cards[i].config.dma2 != -1)
				len += sprintf(buffer + len, ",%d", snd_installed_cards[i].config.dma2);
		}
		if (!snd_installed_cards[i].enabled)
			len += sprintf(buffer + len, ")");
		len += sprintf(buffer + len, "\n");
		pos = begin + len;
		if (pos < offset) {
			len = 0;
			begin = pos;
		}
	}
	if (!sound_started)
		len += sprintf(buffer + len, "\n\n***** Sound driver not started *****\n\n");
#ifndef CONFIG_AUDIO
	len += sprintf(buffer + len, "\nAudio devices: NOT ENABLED IN CONFIG\n");
#else
	len += sprintf(buffer + len, "\nAudio devices:\n");
	for (i = 0; (i < num_audiodevs) && (pos <= offset + length); i++) {
		if (audio_devs[i] == NULL)
			continue;
		len += sprintf(buffer + len, "%d: %s%s\n", i, audio_devs[i]->name, 
			       audio_devs[i]->flags & DMA_DUPLEX ? " (DUPLEX)" : "");
		pos = begin + len;
		if (pos < offset) {
			len = 0;
			begin = pos;
		}
	}
#endif

#ifndef CONFIG_SEQUENCER
	len += sprintf(buffer + len, "\nSynth devices: NOT ENABLED IN CONFIG\n");
#else
	len += sprintf(buffer + len, "\nSynth devices:\n");
	for (i = 0; (i < num_synths) && (pos <= offset + length); i++) {
		if (synth_devs[i] == NULL)
			continue;
		len += sprintf(buffer + len, "%d: %s\n", i, synth_devs[i]->info->name);
		pos = begin + len;
		if (pos < offset) {
			len = 0;
			begin = pos;
		}
	}
#endif

#ifndef CONFIG_MIDI
	len += sprintf(buffer + len, "\nMidi devices: NOT ENABLED IN CONFIG\n");
#else
	len += sprintf(buffer + len, "\nMidi devices:\n");
	for (i = 0; (i < num_midis) && (pos <= offset + length); i++) {
		if (midi_devs[i] == NULL)
			continue;
		len += sprintf(buffer + len, "%d: %s\n", i, midi_devs[i]->info.name);
		pos = begin + len;
		if (pos < offset) {
			len = 0;
			begin = pos;
		}
	}
#endif

#ifdef CONFIG_SEQUENCER
	len += sprintf(buffer + len, "\nTimers:\n");

	for (i = 0; (i < num_sound_timers) && (pos <= offset + length); i++) {
		if (sound_timer_devs[i] == NULL)
			continue;
		len += sprintf(buffer + len, "%d: %s\n", i, sound_timer_devs[i]->info.name);
		pos = begin + len;
		if (pos < offset) {
			len = 0;
			begin = pos;
		}
	}
#endif

	len += sprintf(buffer + len, "\nMixers:\n");
	for (i = 0; (i < num_mixers) && (pos <= offset + length); i++) {
		if (mixer_devs[i] == NULL)
			continue;
		len += sprintf(buffer + len, "%d: %s\n", i, mixer_devs[i]->name);
		pos = begin + len;
		if (pos < offset) {
			len = 0;
			begin = pos;
		}
	}
	*start = buffer + (offset - begin);
	len -= (offset - begin);
        if (len > length) 
		len = length;
        return len;
}
Esempio n. 4
0
int
sndtable_probe(int unit, struct address_info * hw_config)
{
    int  i, sel = -1, n = num_sound_cards;
    struct card_info *ci = snd_installed_cards ;

    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 */
        }

    /*
     * 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;

        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;
}