static int send_converted_effect(struct nrpn_conv_table *table, int num_tables, struct snd_emux_port *port, struct snd_midi_channel *chan, int type, int val, int mode) { int i, cval; for (i = 0; i < num_tables; i++) { if (table[i].control == type) { cval = table[i].convert(val); snd_emux_send_effect(port, chan, table[i].effect, cval, mode); return 1; } } return 0; }
static void gusspec_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 plong; struct snd_midi_channel *chan; if (port->port_mode != SNDRV_EMUX_PORT_MODE_OSS_SYNTH) return; if (cmd == _GUS_NUMVOICES) return; voice = event[3]; if (voice < 0 || voice >= port->chset.max_channels) return; chan = &port->chset.channels[voice]; p1 = *(unsigned short *) &event[4]; p2 = *(short *) &event[6]; plong = *(int*) &event[4]; switch (cmd) { case _GUS_VOICESAMPLE: chan->midi_program = p1; return; case _GUS_VOICEBALA: /* 0 to 15 --> 0 to 127 */ chan->control[MIDI_CTL_MSB_PAN] = (int)p1 << 3; snd_emux_update_channel(port, chan, SNDRV_EMUX_UPDATE_PAN); return; case _GUS_VOICEVOL: case _GUS_VOICEVOL2: /* not supported yet */ return; case _GUS_RAMPRANGE: case _GUS_RAMPRATE: case _GUS_RAMPMODE: case _GUS_RAMPON: case _GUS_RAMPOFF: /* volume ramping not supported */ return; case _GUS_VOLUME_SCALE: return; case _GUS_VOICE_POS: #ifdef SNDRV_EMUX_USE_RAW_EFFECT snd_emux_send_effect(port, chan, EMUX_FX_SAMPLE_START, (short)(plong & 0x7fff), EMUX_FX_FLAG_SET); snd_emux_send_effect(port, chan, EMUX_FX_COARSE_SAMPLE_START, (plong >> 15) & 0xffff, EMUX_FX_FLAG_SET); #endif return; } }