Commit 3e7dc65c authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: firewire-tascam: initialize parameters at open of rawmidi character devices

In current design of ALSA driver for TASCAM FireWire series, initialization
of members in asymc midi port structure is done at device probing. Some of
the members should be initialized every time to use rawmidi devices because
they're changed in sequence of transmission for MIDI messages.

This commit adds a new function to initialize them. Invariant parameters
during object lifetime are kept as is.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 98a00d36
...@@ -18,6 +18,8 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream) ...@@ -18,6 +18,8 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream)
{ {
struct snd_tscm *tscm = substream->rmidi->private_data; struct snd_tscm *tscm = substream->rmidi->private_data;
snd_fw_async_midi_port_init(&tscm->out_ports[substream->number]);
/* Initialize internal status. */ /* Initialize internal status. */
tscm->running_status[substream->number] = 0; tscm->running_status[substream->number] = 0;
tscm->on_sysex[substream->number] = 0; tscm->on_sysex[substream->number] = 0;
......
...@@ -236,17 +236,10 @@ static void midi_port_work(struct work_struct *work) ...@@ -236,17 +236,10 @@ static void midi_port_work(struct work_struct *work)
port); port);
} }
int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port, void snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port)
struct fw_unit *unit)
{ {
port->parent = fw_parent_device(unit);
port->idling = true; port->idling = true;
port->next_ktime = 0;
port->error = false; port->error = false;
INIT_WORK(&port->work, midi_port_work);
return 0;
} }
static void handle_midi_tx(struct fw_card *card, struct fw_request *request, static void handle_midi_tx(struct fw_card *card, struct fw_request *request,
...@@ -324,10 +317,9 @@ int snd_tscm_transaction_register(struct snd_tscm *tscm) ...@@ -324,10 +317,9 @@ int snd_tscm_transaction_register(struct snd_tscm *tscm)
goto error; goto error;
for (i = 0; i < TSCM_MIDI_OUT_PORT_MAX; i++) { for (i = 0; i < TSCM_MIDI_OUT_PORT_MAX; i++) {
err = snd_fw_async_midi_port_init( tscm->out_ports[i].parent = fw_parent_device(tscm->unit);
&tscm->out_ports[i], tscm->unit); tscm->out_ports[i].next_ktime = 0;
if (err < 0) INIT_WORK(&tscm->out_ports[i].work, midi_port_work);
goto error;
} }
return err; return err;
......
...@@ -146,8 +146,7 @@ void snd_tscm_stream_lock_changed(struct snd_tscm *tscm); ...@@ -146,8 +146,7 @@ void snd_tscm_stream_lock_changed(struct snd_tscm *tscm);
int snd_tscm_stream_lock_try(struct snd_tscm *tscm); int snd_tscm_stream_lock_try(struct snd_tscm *tscm);
void snd_tscm_stream_lock_release(struct snd_tscm *tscm); void snd_tscm_stream_lock_release(struct snd_tscm *tscm);
int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port, void snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port);
struct fw_unit *unit);
static inline void static inline void
snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port, snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment