aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2015-10-10 23:30:19 -0400
committerTakashi Iwai <tiwai@suse.de>2015-10-11 12:26:21 -0400
commite8bd577ae6df59160cd6fd82b8d3562bbbdd3c1d (patch)
tree2489112d68bef46f33c0c3b385a54a3c8df0f31a
parentb47f525f760f29c4689a7d9bf768c28fcaac2281 (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.c61
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