/* * decrease usage count */ void snd_emux_dec_count(snd_emux_t *emu) { module_put(emu->card->module); emu->used--; if (emu->used <= 0) snd_emux_terminate_all(emu); module_put(emu->ops.owner); }
/* * Detach from the ports that were set up for this synthesizer and * destroy the kernel client. */ void snd_emux_detach_seq(snd_emux_t *emu) { if (emu->voices) snd_emux_terminate_all(emu); down(&emu->register_mutex); if (emu->client >= 0) { snd_seq_delete_kernel_client(emu->client); emu->client = -1; } up(&emu->register_mutex); }
/* * Detach from the ports that were set up for this synthesizer and * destroy the kernel client. */ void snd_emux_detach_seq(struct snd_emux *emu) { if (emu->voices) snd_emux_terminate_all(emu); mutex_lock(&emu->register_mutex); if (emu->client >= 0) { snd_seq_delete_kernel_client(emu->client); emu->client = -1; } mutex_unlock(&emu->register_mutex); }
/* * OSS/AWE driver specific h/w controls */ static void emuspec_control(struct snd_emux *emu, struct snd_emux_port *port, int cmd, unsigned char *event, int atomic, int hop) { int voice; unsigned short p1; short p2; int i; struct snd_midi_channel *chan; voice = event[3]; if (voice < 0 || voice >= port->chset.max_channels) chan = NULL; else chan = &port->chset.channels[voice]; p1 = *(unsigned short *) &event[4]; p2 = *(short *) &event[6]; switch (cmd) { #if 0 /* don't do this atomically */ case _EMUX_OSS_REMOVE_LAST_SAMPLES: snd_soundfont_remove_unlocked(emu->sflist); break; #endif case _EMUX_OSS_SEND_EFFECT: if (chan) snd_emux_send_effect_oss(port, chan, p1, p2); break; case _EMUX_OSS_TERMINATE_ALL: snd_emux_terminate_all(emu); break; case _EMUX_OSS_TERMINATE_CHANNEL: /*snd_emux_mute_channel(emu, chan);*/ break; case _EMUX_OSS_RESET_CHANNEL: /*snd_emux_channel_init(chset, chan);*/ break; case _EMUX_OSS_RELEASE_ALL: fake_event(emu, port, voice, MIDI_CTL_ALL_NOTES_OFF, 0, atomic, hop); break; case _EMUX_OSS_NOTEOFF_ALL: fake_event(emu, port, voice, MIDI_CTL_ALL_SOUNDS_OFF, 0, atomic, hop); break; case _EMUX_OSS_INITIAL_VOLUME: if (p2) { port->volume_atten = (short)p1; snd_emux_update_port(port, SNDRV_EMUX_UPDATE_VOLUME); } break; case _EMUX_OSS_CHN_PRESSURE: if (chan) { chan->midi_pressure = p1; snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_FMMOD|SNDRV_EMUX_UPDATE_FM2FRQ2); } break; case _EMUX_OSS_CHANNEL_MODE: reset_port_mode(port, p1); snd_emux_reset_port(port); break; case _EMUX_OSS_DRUM_CHANNELS: port->drum_flags = *(unsigned int*)&event[4]; for (i = 0; i < port->chset.max_channels; i++) { chan = &port->chset.channels[i]; chan->drum_channel = ((port->drum_flags >> i) & 1) ? 1 : 0; } break; case _EMUX_OSS_MISC_MODE: if (p1 < EMUX_MD_END) port->ctrls[p1] = p2; break; case _EMUX_OSS_DEBUG_MODE: break; default: if (emu->ops.oss_ioctl) emu->ops.oss_ioctl(emu, cmd, p1, p2); break; } }