2 * tascam-midi.c - a part of driver for TASCAM FireWire series
4 * Copyright (c) 2015 Takashi Sakamoto
6 * Licensed under the terms of the GNU General Public License, version 2.
11 static int midi_capture_open(struct snd_rawmidi_substream
*substream
)
17 static int midi_playback_open(struct snd_rawmidi_substream
*substream
)
19 struct snd_tscm
*tscm
= substream
->rmidi
->private_data
;
21 /* Initialize internal status. */
22 tscm
->running_status
[substream
->number
] = 0;
23 tscm
->on_sysex
[substream
->number
] = 0;
27 static int midi_capture_close(struct snd_rawmidi_substream
*substream
)
33 static int midi_playback_close(struct snd_rawmidi_substream
*substream
)
35 struct snd_tscm
*tscm
= substream
->rmidi
->private_data
;
37 snd_fw_async_midi_port_finish(&tscm
->out_ports
[substream
->number
]);
42 static void midi_capture_trigger(struct snd_rawmidi_substream
*substrm
, int up
)
44 struct snd_tscm
*tscm
= substrm
->rmidi
->private_data
;
47 spin_lock_irqsave(&tscm
->lock
, flags
);
50 tscm
->tx_midi_substreams
[substrm
->number
] = substrm
;
52 tscm
->tx_midi_substreams
[substrm
->number
] = NULL
;
54 spin_unlock_irqrestore(&tscm
->lock
, flags
);
57 static void midi_playback_trigger(struct snd_rawmidi_substream
*substrm
, int up
)
59 struct snd_tscm
*tscm
= substrm
->rmidi
->private_data
;
62 spin_lock_irqsave(&tscm
->lock
, flags
);
65 snd_fw_async_midi_port_run(&tscm
->out_ports
[substrm
->number
],
68 spin_unlock_irqrestore(&tscm
->lock
, flags
);
71 int snd_tscm_create_midi_devices(struct snd_tscm
*tscm
)
73 static const struct snd_rawmidi_ops capture_ops
= {
74 .open
= midi_capture_open
,
75 .close
= midi_capture_close
,
76 .trigger
= midi_capture_trigger
,
78 static const struct snd_rawmidi_ops playback_ops
= {
79 .open
= midi_playback_open
,
80 .close
= midi_playback_close
,
81 .trigger
= midi_playback_trigger
,
83 struct snd_rawmidi
*rmidi
;
84 struct snd_rawmidi_str
*stream
;
85 struct snd_rawmidi_substream
*subs
;
88 err
= snd_rawmidi_new(tscm
->card
, tscm
->card
->driver
, 0,
89 tscm
->spec
->midi_playback_ports
,
90 tscm
->spec
->midi_capture_ports
,
95 snprintf(rmidi
->name
, sizeof(rmidi
->name
),
96 "%s MIDI", tscm
->card
->shortname
);
97 rmidi
->private_data
= tscm
;
99 rmidi
->info_flags
|= SNDRV_RAWMIDI_INFO_INPUT
;
100 snd_rawmidi_set_ops(rmidi
, SNDRV_RAWMIDI_STREAM_INPUT
,
102 stream
= &rmidi
->streams
[SNDRV_RAWMIDI_STREAM_INPUT
];
104 /* Set port names for MIDI input. */
105 list_for_each_entry(subs
, &stream
->substreams
, list
) {
106 /* TODO: support virtual MIDI ports. */
107 if (subs
->number
< tscm
->spec
->midi_capture_ports
) {
108 /* Hardware MIDI ports. */
109 snprintf(subs
->name
, sizeof(subs
->name
),
111 tscm
->card
->shortname
, subs
->number
+ 1);
115 rmidi
->info_flags
|= SNDRV_RAWMIDI_INFO_OUTPUT
;
116 snd_rawmidi_set_ops(rmidi
, SNDRV_RAWMIDI_STREAM_OUTPUT
,
118 stream
= &rmidi
->streams
[SNDRV_RAWMIDI_STREAM_OUTPUT
];
120 /* Set port names for MIDI ourput. */
121 list_for_each_entry(subs
, &stream
->substreams
, list
) {
122 if (subs
->number
< tscm
->spec
->midi_playback_ports
) {
123 /* Hardware MIDI ports only. */
124 snprintf(subs
->name
, sizeof(subs
->name
),
126 tscm
->card
->shortname
, subs
->number
+ 1);
130 rmidi
->info_flags
|= SNDRV_RAWMIDI_INFO_DUPLEX
;