/* * close port */ static int snd_emux_close_seq_oss(struct snd_seq_oss_arg *arg) { struct snd_emux *emu; struct snd_emux_port *p; if (snd_BUG_ON(!arg)) return -ENXIO; p = arg->private_data; if (snd_BUG_ON(!p)) return -ENXIO; emu = p->emu; if (snd_BUG_ON(!emu)) return -ENXIO; mutex_lock(&emu->register_mutex); snd_emux_sounds_off_all(p); snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port)); snd_seq_event_port_detach(p->chset.client, p->chset.port); snd_emux_dec_count(emu); mutex_unlock(&emu->register_mutex); return 0; }
/* * Routine that is called upon the last unuse() of a particular port. */ static int snd_emux_unuse(void *private_data, snd_seq_port_subscribe_t *info) { snd_emux_port_t *p; snd_emux_t *emu; p = private_data; snd_assert(p != NULL, return -EINVAL); emu = p->emu; snd_assert(emu != NULL, return -EINVAL); down(&emu->register_mutex); snd_emux_sounds_off_all(p); snd_emux_dec_count(emu); up(&emu->register_mutex); return 0; }
/* * Routine that is called upon the last unuse() of a particular port. */ static int snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *info) { struct snd_emux_port *p; struct snd_emux *emu; p = private_data; if (snd_BUG_ON(!p)) return -EINVAL; emu = p->emu; if (snd_BUG_ON(!emu)) return -EINVAL; mutex_lock(&emu->register_mutex); snd_emux_sounds_off_all(p); snd_emux_dec_count(emu); mutex_unlock(&emu->register_mutex); return 0; }
/* * close port */ static int snd_emux_close_seq_oss(struct snd_seq_oss_arg *arg) { struct snd_emux *emu; struct snd_emux_port *p; snd_assert(arg != NULL, return -ENXIO); p = arg->private_data; snd_assert(p != NULL, return -ENXIO); emu = p->emu; snd_assert(emu != NULL, return -ENXIO); mutex_lock(&emu->register_mutex); snd_emux_sounds_off_all(p); snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port)); snd_seq_event_port_detach(p->chset.client, p->chset.port); snd_emux_dec_count(emu); mutex_unlock(&emu->register_mutex); return 0; }
/* * reset port */ void snd_emux_reset_port(snd_emux_port_t *port) { int i; /* stop all sounds */ snd_emux_sounds_off_all(port); snd_midi_channel_set_clear(&port->chset); #ifdef SNDRV_EMUX_USE_RAW_EFFECT snd_emux_clear_effect(port); #endif /* set port specific control parameters */ port->ctrls[EMUX_MD_DEF_BANK] = 0; port->ctrls[EMUX_MD_DEF_DRUM] = 0; port->ctrls[EMUX_MD_REALTIME_PAN] = 1; for (i = 0; i < port->chset.max_channels; i++) { snd_midi_channel_t *chan = port->chset.channels + i; chan->drum_channel = ((port->drum_flags >> i) & 1) ? 1 : 0; } }