int snd_emux_free(struct snd_emux *emu) { unsigned long flags; if (! emu) return -EINVAL; spin_lock_irqsave(&emu->voice_lock, flags); if (emu->timer_active) del_timer(&emu->tlist); spin_unlock_irqrestore(&emu->voice_lock, flags); #ifdef CONFIG_PROC_FS snd_emux_proc_free(emu); #endif snd_emux_delete_virmidi(emu); #ifdef CONFIG_SND_SEQUENCER_OSS snd_emux_detach_seq_oss(emu); #endif snd_emux_detach_seq(emu); snd_emux_delete_hwdep(emu); if (emu->sflist) snd_sf_free(emu->sflist); kfree(emu->voices); kfree(emu->name); kfree(emu); return 0; }
/* * attach virtual rawmidi devices */ int snd_emux_init_virmidi(snd_emux_t *emu, snd_card_t *card) { int i; emu->vmidi = NULL; if (emu->midi_ports <= 0) return 0; emu->vmidi = kcalloc(emu->midi_ports, sizeof(snd_rawmidi_t*), GFP_KERNEL); if (emu->vmidi == NULL) return -ENOMEM; for (i = 0; i < emu->midi_ports; i++) { snd_rawmidi_t *rmidi; snd_virmidi_dev_t *rdev; if (snd_virmidi_new(card, emu->midi_devidx + i, &rmidi) < 0) goto __error; rdev = rmidi->private_data; sprintf(rmidi->name, "%s Synth MIDI", emu->name); rdev->seq_mode = SNDRV_VIRMIDI_SEQ_ATTACH; rdev->client = emu->client; rdev->port = emu->ports[i]; if (snd_device_register(card, rmidi) < 0) { snd_device_free(card, rmidi); goto __error; } emu->vmidi[i] = rmidi; //snd_printk("virmidi %d ok\n", i); } return 0; __error: //snd_printk("error init..\n"); snd_emux_delete_virmidi(emu); return -ENOMEM; }