diff options
author | Takashi Sakamoto <o-takashi@sakamocchi.jp> | 2015-10-10 23:30:19 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-10-11 12:26:21 -0400 |
commit | e8bd577ae6df59160cd6fd82b8d3562bbbdd3c1d (patch) | |
tree | 2489112d68bef46f33c0c3b385a54a3c8df0f31a | |
parent | b47f525f760f29c4689a7d9bf768c28fcaac2281 (diff) |
ALSA: firewire-digi00x: add support for MIDI ports for physical controls
In former commits, asynchronous transactions are supported for physical
controls. This commit adds a pair of MIDI ports for them.
This driver already adds diferrent number of ALSA MIDI ports for physical
MIDI ports, and the number of in/out ports are different. As seeing as
'amidi' program in alsa-utils package, a pair of in/out MIDI ports is
expected with the same name. Therefore, this commit adds a pair of new
ports to the first.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | sound/firewire/digi00x/digi00x-midi.c | 61 |
1 files changed, 45 insertions, 16 deletions
diff --git a/sound/firewire/digi00x/digi00x-midi.c b/sound/firewire/digi00x/digi00x-midi.c index 4e258ac8438b..9aa8b4623108 100644 --- a/sound/firewire/digi00x/digi00x-midi.c +++ b/sound/firewire/digi00x/digi00x-midi.c | |||
@@ -13,6 +13,10 @@ static int midi_open(struct snd_rawmidi_substream *substream) | |||
13 | struct snd_dg00x *dg00x = substream->rmidi->private_data; | 13 | struct snd_dg00x *dg00x = substream->rmidi->private_data; |
14 | int err; | 14 | int err; |
15 | 15 | ||
16 | /* This port is for asynchronous transaction. */ | ||
17 | if (substream->number == 0) | ||
18 | return 0; | ||
19 | |||
16 | err = snd_dg00x_stream_lock_try(dg00x); | 20 | err = snd_dg00x_stream_lock_try(dg00x); |
17 | if (err < 0) | 21 | if (err < 0) |
18 | return err; | 22 | return err; |
@@ -31,6 +35,10 @@ static int midi_close(struct snd_rawmidi_substream *substream) | |||
31 | { | 35 | { |
32 | struct snd_dg00x *dg00x = substream->rmidi->private_data; | 36 | struct snd_dg00x *dg00x = substream->rmidi->private_data; |
33 | 37 | ||
38 | /* This port is for asynchronous transaction. */ | ||
39 | if (substream->number == 0) | ||
40 | return 0; | ||
41 | |||
34 | mutex_lock(&dg00x->mutex); | 42 | mutex_lock(&dg00x->mutex); |
35 | dg00x->substreams_counter--; | 43 | dg00x->substreams_counter--; |
36 | snd_dg00x_stream_stop_duplex(dg00x); | 44 | snd_dg00x_stream_stop_duplex(dg00x); |
@@ -47,12 +55,20 @@ static void midi_capture_trigger(struct snd_rawmidi_substream *substrm, int up) | |||
47 | 55 | ||
48 | spin_lock_irqsave(&dg00x->lock, flags); | 56 | spin_lock_irqsave(&dg00x->lock, flags); |
49 | 57 | ||
50 | if (up) | 58 | /* This port is for asynchronous transaction. */ |
51 | amdtp_dot_midi_trigger(&dg00x->tx_stream, | 59 | if (substrm->number == 0) { |
52 | substrm->number, substrm); | 60 | if (up) |
53 | else | 61 | dg00x->in_control = substrm; |
54 | amdtp_dot_midi_trigger(&dg00x->tx_stream, | 62 | else |
55 | substrm->number, NULL); | 63 | dg00x->in_control = NULL; |
64 | } else { | ||
65 | if (up) | ||
66 | amdtp_dot_midi_trigger(&dg00x->tx_stream, | ||
67 | substrm->number - 1, substrm); | ||
68 | else | ||
69 | amdtp_dot_midi_trigger(&dg00x->tx_stream, | ||
70 | substrm->number - 1, NULL); | ||
71 | } | ||
56 | 72 | ||
57 | spin_unlock_irqrestore(&dg00x->lock, flags); | 73 | spin_unlock_irqrestore(&dg00x->lock, flags); |
58 | } | 74 | } |
@@ -64,12 +80,19 @@ static void midi_playback_trigger(struct snd_rawmidi_substream *substrm, int up) | |||
64 | 80 | ||
65 | spin_lock_irqsave(&dg00x->lock, flags); | 81 | spin_lock_irqsave(&dg00x->lock, flags); |
66 | 82 | ||
67 | if (up) | 83 | /* This port is for asynchronous transaction. */ |
68 | amdtp_dot_midi_trigger(&dg00x->rx_stream, | 84 | if (substrm->number == 0) { |
69 | substrm->number, substrm); | 85 | if (up) |
70 | else | 86 | snd_fw_async_midi_port_run(&dg00x->out_control, |
71 | amdtp_dot_midi_trigger(&dg00x->rx_stream, | 87 | substrm); |
72 | substrm->number, NULL); | 88 | } else { |
89 | if (up) | ||
90 | amdtp_dot_midi_trigger(&dg00x->rx_stream, | ||
91 | substrm->number - 1, substrm); | ||
92 | else | ||
93 | amdtp_dot_midi_trigger(&dg00x->rx_stream, | ||
94 | substrm->number - 1, NULL); | ||
95 | } | ||
73 | 96 | ||
74 | spin_unlock_irqrestore(&dg00x->lock, flags); | 97 | spin_unlock_irqrestore(&dg00x->lock, flags); |
75 | } | 98 | } |
@@ -92,9 +115,15 @@ static void set_midi_substream_names(struct snd_dg00x *dg00x, | |||
92 | struct snd_rawmidi_substream *subs; | 115 | struct snd_rawmidi_substream *subs; |
93 | 116 | ||
94 | list_for_each_entry(subs, &str->substreams, list) { | 117 | list_for_each_entry(subs, &str->substreams, list) { |
95 | snprintf(subs->name, sizeof(subs->name), | 118 | if (subs->number > 0) |
96 | "%s MIDI %d", | 119 | snprintf(subs->name, sizeof(subs->name), |
97 | dg00x->card->shortname, subs->number + 1); | 120 | "%s MIDI %d", |
121 | dg00x->card->shortname, subs->number); | ||
122 | else | ||
123 | /* This port is for asynchronous transaction. */ | ||
124 | snprintf(subs->name, sizeof(subs->name), | ||
125 | "%s control", | ||
126 | dg00x->card->shortname); | ||
98 | } | 127 | } |
99 | } | 128 | } |
100 | 129 | ||
@@ -105,7 +134,7 @@ int snd_dg00x_create_midi_devices(struct snd_dg00x *dg00x) | |||
105 | int err; | 134 | int err; |
106 | 135 | ||
107 | err = snd_rawmidi_new(dg00x->card, dg00x->card->driver, 0, | 136 | err = snd_rawmidi_new(dg00x->card, dg00x->card->driver, 0, |
108 | DOT_MIDI_OUT_PORTS, DOT_MIDI_IN_PORTS, &rmidi); | 137 | DOT_MIDI_OUT_PORTS + 1, DOT_MIDI_IN_PORTS + 1, &rmidi); |
109 | if (err < 0) | 138 | if (err < 0) |
110 | return err; | 139 | return err; |
111 | 140 | ||