On Sat, 22 Aug 2015 11:19:40 +0200, Takashi Sakamoto wrote:
This commit adds MIDI functionality to transfer/receive MIDI messages.
Console models supports virtual MIDI ports additional to physical MIDI ports. Once physical controls are assigned to the virtual MIDI ports, userspace applications can receive/transmit MIDI messages from/to the MIDI ports. Additionally, without assignment, physical controls can transmit control events in isochronous packets. This messages are supported in later commit.
Signed-off-by: Takashi Sakamoto o-takashi@sakamocchi.jp
sound/firewire/tascam/Makefile | 3 +- sound/firewire/tascam/tascam-midi.c | 162 ++++++++++++++++++++++++++++++++++++ sound/firewire/tascam/tascam.c | 4 + sound/firewire/tascam/tascam.h | 3 + 4 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 sound/firewire/tascam/tascam-midi.c
diff --git a/sound/firewire/tascam/Makefile b/sound/firewire/tascam/Makefile index 2c3d101..905fdc1 100644 --- a/sound/firewire/tascam/Makefile +++ b/sound/firewire/tascam/Makefile @@ -1,3 +1,4 @@ snd-firewire-tascam-objs := tascam-proc.o amdtp-tascam.o tascam-stream.o \
tascam-pcm.o tascam-transaction.o tascam.o
tascam-pcm.o tascam-transaction.o tascam-midi.o \
tascam.o
obj-$(CONFIG_SND_FIREWIRE_TASCAM) += snd-firewire-tascam.o diff --git a/sound/firewire/tascam/tascam-midi.c b/sound/firewire/tascam/tascam-midi.c new file mode 100644 index 0000000..f0344b3 --- /dev/null +++ b/sound/firewire/tascam/tascam-midi.c @@ -0,0 +1,162 @@ +/*
- tascam-midi.c - a part of driver for TASCAM FireWire series
- Copyright (c) 2015 Takashi Sakamoto
- Licensed under the terms of the GNU General Public License, version 2.
- */
+#include "tascam.h"
+static int midi_capture_open(struct snd_rawmidi_substream *substream) +{
- /* TODO: pick up hardware control messages as MIDI? */
- if (substream->pstr->substream_count == substream->number)
return -1;
No error code?
- return 0;
+}
+static int midi_playback_open(struct snd_rawmidi_substream *substream) +{
- struct snd_tscm *tscm = substream->rmidi->private_data;
- /* Initialize internal status. */
- tscm->running_status[substream->number] = 0;
- tscm->on_sysex[substream->number] = 0;
- return 0;
+}
+static int midi_capture_close(struct snd_rawmidi_substream *substream) +{
- /* TODO: pick up hardware control messages as MIDI? */
- if (substream->pstr->substream_count == substream->number)
return -1;
Ditto.
- return 0;
+}
+static int midi_playback_close(struct snd_rawmidi_substream *substream) +{
- struct snd_tscm *tscm = substream->rmidi->private_data;
- snd_fw_async_midi_port_finish(&tscm->out_ports[substream->number]);
- return 0;
+}
+static void midi_capture_trigger(struct snd_rawmidi_substream *substrm, int up) +{
- struct snd_tscm *tscm = substrm->rmidi->private_data;
- unsigned long flags;
- spin_lock_irqsave(&tscm->lock, flags);
- /* TODO: pick up hardware control messages as MIDI? */
- if (substrm->pstr->substream_count == substrm->number) {
return;
Missing spin unlock.
- } else {
if (up)
tscm->tx_midi_substreams[substrm->number] = substrm;
else
tscm->tx_midi_substreams[substrm->number] = NULL;
- }
- spin_unlock_irqrestore(&tscm->lock, flags);
+}
(snip)
diff --git a/sound/firewire/tascam/tascam.h b/sound/firewire/tascam/tascam.h index 920bf30..0c0b753 100644 --- a/sound/firewire/tascam/tascam.h +++ b/sound/firewire/tascam/tascam.h @@ -46,6 +46,7 @@ struct snd_tscm { struct fw_unit *unit;
struct mutex mutex;
- spinlock_t lock;
Where is it initialized?
Takashi