/* * Initialise the EMUX Synth by creating a client and registering * a series of ports. * Each of the ports will contain the 16 midi channels. Applications * can connect to these ports to play midi data. */ int snd_emux_init_seq(snd_emux_t *emu, snd_card_t *card, int index) { int i; snd_seq_port_callback_t pinfo; char tmpname[64]; sprintf(tmpname, "%s WaveTable", emu->name); emu->client = get_client(card, index, tmpname); if (emu->client < 0) { snd_printk("can't create client\n"); return -ENODEV; } if (emu->num_ports < 0) { snd_printk("seqports must be greater than zero\n"); emu->num_ports = 1; } else if (emu->num_ports >= SNDRV_EMUX_MAX_PORTS) { snd_printk("too many ports." "limited max. ports %d\n", SNDRV_EMUX_MAX_PORTS); emu->num_ports = SNDRV_EMUX_MAX_PORTS; } memset(&pinfo, 0, sizeof(pinfo)); pinfo.owner = THIS_MODULE; pinfo.use = snd_emux_use; pinfo.unuse = snd_emux_unuse; pinfo.event_input = snd_emux_event_input; for (i = 0; i < emu->num_ports; i++) { snd_emux_port_t *p; sprintf(tmpname, "%s Port %d", emu->name, i); p = snd_emux_create_port(emu, tmpname, MIDI_CHANNELS, 0, &pinfo); if (p == NULL) { snd_printk("can't create port\n"); return -ENOMEM; } p->port_mode = SNDRV_EMUX_PORT_MODE_MIDI; snd_emux_init_port(p); emu->ports[i] = p->chset.port; emu->portptrs[i] = p; } return 0; }
/* * open port for OSS sequencer */ static int snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure) { struct snd_emux *emu; struct snd_emux_port *p; struct snd_seq_port_callback callback; char tmpname[64]; emu = closure; if (snd_BUG_ON(!arg || !emu)) return -ENXIO; mutex_lock(&emu->register_mutex); if (!snd_emux_inc_count(emu)) { mutex_unlock(&emu->register_mutex); return -EFAULT; } memset(&callback, 0, sizeof(callback)); callback.owner = THIS_MODULE; callback.event_input = snd_emux_event_oss_input; sprintf(tmpname, "%s OSS Port", emu->name); p = snd_emux_create_port(emu, tmpname, 32, 1, &callback); if (p == NULL) { snd_printk(KERN_ERR "can't create port\n"); snd_emux_dec_count(emu); mutex_unlock(&emu->register_mutex); return -ENOMEM; } /* fill the argument data */ arg->private_data = p; arg->addr.client = p->chset.client; arg->addr.port = p->chset.port; p->oss_arg = arg; reset_port_mode(p, arg->seq_mode); snd_emux_reset_port(p); mutex_unlock(&emu->register_mutex); return 0; }