Skip to content

Commit

Permalink
ALSA: oxfw: calculating MIDI ports in stream discover
Browse files Browse the repository at this point in the history
Current OXFW driver calculates the number of MIDI ports just before adding
ALSA MIDI ports. It's convenient for some devices with quirks to move
these codes before handling quirks.

This commit implements this idea.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
takaswie authored and tiwai committed Oct 19, 2015
1 parent 56b1c72 commit 3205604
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 22 deletions.
24 changes: 3 additions & 21 deletions sound/firewire/oxfw/oxfw-midi.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,29 +142,11 @@ static void set_midi_substream_names(struct snd_oxfw *oxfw,

int snd_oxfw_create_midi(struct snd_oxfw *oxfw)
{
struct snd_oxfw_stream_formation formation;
struct snd_rawmidi *rmidi;
struct snd_rawmidi_str *str;
u8 *format;
int i, err;

/* If its stream has MIDI conformant data channel, add one MIDI port */
for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
format = oxfw->tx_stream_formats[i];
if (format != NULL) {
err = snd_oxfw_stream_parse_format(format, &formation);
if (err >= 0 && formation.midi > 0)
oxfw->midi_input_ports = 1;
}

format = oxfw->rx_stream_formats[i];
if (format != NULL) {
err = snd_oxfw_stream_parse_format(format, &formation);
if (err >= 0 && formation.midi > 0)
oxfw->midi_output_ports = 1;
}
}
if ((oxfw->midi_input_ports == 0) && (oxfw->midi_output_ports == 0))
int err;

if (oxfw->midi_input_ports == 0 && oxfw->midi_output_ports == 0)
return 0;

/* create midi ports */
Expand Down
35 changes: 34 additions & 1 deletion sound/firewire/oxfw/oxfw-stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -629,6 +629,9 @@ static int fill_stream_formats(struct snd_oxfw *oxfw,
int snd_oxfw_stream_discover(struct snd_oxfw *oxfw)
{
u8 plugs[AVC_PLUG_INFO_BUF_BYTES];
struct snd_oxfw_stream_formation formation;
u8 *format;
unsigned int i;
int err;

/* the number of plugs for isoc in/out, ext in/out */
Expand All @@ -648,12 +651,42 @@ int snd_oxfw_stream_discover(struct snd_oxfw *oxfw)
err = fill_stream_formats(oxfw, AVC_GENERAL_PLUG_DIR_OUT, 0);
if (err < 0)
goto end;

for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
format = oxfw->tx_stream_formats[i];
if (format == NULL)
continue;
err = snd_oxfw_stream_parse_format(format, &formation);
if (err < 0)
continue;

/* Add one MIDI port. */
if (formation.midi > 0)
oxfw->midi_input_ports = 1;
}

oxfw->has_output = true;
}

/* use iPCR[0] if exists */
if (plugs[0] > 0)
if (plugs[0] > 0) {
err = fill_stream_formats(oxfw, AVC_GENERAL_PLUG_DIR_IN, 0);
if (err < 0)
goto end;

for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) {
format = oxfw->rx_stream_formats[i];
if (format == NULL)
continue;
err = snd_oxfw_stream_parse_format(format, &formation);
if (err < 0)
continue;

/* Add one MIDI port. */
if (formation.midi > 0)
oxfw->midi_output_ports = 1;
}
}
end:
return err;
}
Expand Down

0 comments on commit 3205604

Please sign in to comment.