Commit 09b62892 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: rawmidi: Pass rawmidi directly to snd_rawmidi_kernel_open()

snd_rawmidi_kernel_open() is used only internally from ALSA sequencer,
so far, and parsing the card / device matching table at each open is
redundant, as each sequencer client already gets the rawmidi object
beforehand.

This patch optimizes the path by passing the rawmidi object directly
at snd_rawmidi_kernel_open().  This is also a preparation for the
upcoming UMP rawmidi I/O support.
Reviewed-by: default avatarJaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20230523075358.9672-2-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent f1fcbaa1
...@@ -161,7 +161,7 @@ int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream); ...@@ -161,7 +161,7 @@ int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream);
/* main midi functions */ /* main midi functions */
int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info); int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info);
int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, int snd_rawmidi_kernel_open(struct snd_rawmidi *rmidi, int subdevice,
int mode, struct snd_rawmidi_file *rfile); int mode, struct snd_rawmidi_file *rfile);
int snd_rawmidi_kernel_release(struct snd_rawmidi_file *rfile); int snd_rawmidi_kernel_release(struct snd_rawmidi_file *rfile);
int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream,
......
...@@ -406,24 +406,15 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode, ...@@ -406,24 +406,15 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode,
} }
/* called from sound/core/seq/seq_midi.c */ /* called from sound/core/seq/seq_midi.c */
int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, int snd_rawmidi_kernel_open(struct snd_rawmidi *rmidi, int subdevice,
int mode, struct snd_rawmidi_file *rfile) int mode, struct snd_rawmidi_file *rfile)
{ {
struct snd_rawmidi *rmidi; int err;
int err = 0;
if (snd_BUG_ON(!rfile)) if (snd_BUG_ON(!rfile))
return -EINVAL; return -EINVAL;
if (!try_module_get(rmidi->card->module))
mutex_lock(&register_mutex); return -ENXIO;
rmidi = snd_rawmidi_search(card, device);
if (!rmidi)
err = -ENODEV;
else if (!try_module_get(rmidi->card->module))
err = -ENXIO;
mutex_unlock(&register_mutex);
if (err < 0)
return err;
mutex_lock(&rmidi->open_mutex); mutex_lock(&rmidi->open_mutex);
err = rawmidi_open_priv(rmidi, subdevice, mode, rfile); err = rawmidi_open_priv(rmidi, subdevice, mode, rfile);
......
...@@ -38,6 +38,7 @@ MODULE_PARM_DESC(input_buffer_size, "Input buffer size in bytes."); ...@@ -38,6 +38,7 @@ MODULE_PARM_DESC(input_buffer_size, "Input buffer size in bytes.");
/* data for this midi synth driver */ /* data for this midi synth driver */
struct seq_midisynth { struct seq_midisynth {
struct snd_card *card; struct snd_card *card;
struct snd_rawmidi *rmidi;
int device; int device;
int subdevice; int subdevice;
struct snd_rawmidi_file input_rfile; struct snd_rawmidi_file input_rfile;
...@@ -168,8 +169,7 @@ static int midisynth_subscribe(void *private_data, struct snd_seq_port_subscribe ...@@ -168,8 +169,7 @@ static int midisynth_subscribe(void *private_data, struct snd_seq_port_subscribe
struct snd_rawmidi_params params; struct snd_rawmidi_params params;
/* open midi port */ /* open midi port */
err = snd_rawmidi_kernel_open(msynth->card, msynth->device, err = snd_rawmidi_kernel_open(msynth->rmidi, msynth->subdevice,
msynth->subdevice,
SNDRV_RAWMIDI_LFLG_INPUT, SNDRV_RAWMIDI_LFLG_INPUT,
&msynth->input_rfile); &msynth->input_rfile);
if (err < 0) { if (err < 0) {
...@@ -212,8 +212,7 @@ static int midisynth_use(void *private_data, struct snd_seq_port_subscribe *info ...@@ -212,8 +212,7 @@ static int midisynth_use(void *private_data, struct snd_seq_port_subscribe *info
struct snd_rawmidi_params params; struct snd_rawmidi_params params;
/* open midi port */ /* open midi port */
err = snd_rawmidi_kernel_open(msynth->card, msynth->device, err = snd_rawmidi_kernel_open(msynth->rmidi, msynth->subdevice,
msynth->subdevice,
SNDRV_RAWMIDI_LFLG_OUTPUT, SNDRV_RAWMIDI_LFLG_OUTPUT,
&msynth->output_rfile); &msynth->output_rfile);
if (err < 0) { if (err < 0) {
...@@ -328,6 +327,7 @@ snd_seq_midisynth_probe(struct device *_dev) ...@@ -328,6 +327,7 @@ snd_seq_midisynth_probe(struct device *_dev)
for (p = 0; p < ports; p++) { for (p = 0; p < ports; p++) {
ms = &msynth[p]; ms = &msynth[p];
ms->rmidi = rmidi;
if (snd_seq_midisynth_new(ms, card, device, p) < 0) if (snd_seq_midisynth_new(ms, card, device, p) < 0)
goto __nomem; goto __nomem;
......
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