Lines Matching refs:vmidi

58 static void snd_virmidi_init_event(struct snd_virmidi *vmidi,  in snd_virmidi_init_event()  argument
62 ev->source.port = vmidi->port; in snd_virmidi_init_event()
63 switch (vmidi->seq_mode) { in snd_virmidi_init_event()
69 ev->dest.client = vmidi->client; in snd_virmidi_init_event()
70 ev->dest.port = vmidi->port; in snd_virmidi_init_event()
83 struct snd_virmidi *vmidi; in snd_virmidi_dev_receive_event() local
91 list_for_each_entry(vmidi, &rdev->filelist, list) { in snd_virmidi_dev_receive_event()
92 if (!READ_ONCE(vmidi->trigger)) in snd_virmidi_dev_receive_event()
97 snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream); in snd_virmidi_dev_receive_event()
99 len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev); in snd_virmidi_dev_receive_event()
101 snd_rawmidi_receive(vmidi->substream, msg, len); in snd_virmidi_dev_receive_event()
131 struct snd_virmidi *vmidi = substream->runtime->private_data; in snd_virmidi_input_trigger() local
133 WRITE_ONCE(vmidi->trigger, !!up); in snd_virmidi_input_trigger()
141 struct snd_virmidi *vmidi; in snd_vmidi_output_work() local
146 vmidi = container_of(work, struct snd_virmidi, output_work); in snd_vmidi_output_work()
147 substream = vmidi->substream; in snd_vmidi_output_work()
150 if (vmidi->seq_mode == SNDRV_VIRMIDI_SEQ_DISPATCH && in snd_vmidi_output_work()
151 !(vmidi->rdev->flags & SNDRV_VIRMIDI_SUBSCRIBE)) { in snd_vmidi_output_work()
158 while (READ_ONCE(vmidi->trigger)) { in snd_vmidi_output_work()
161 if (!snd_midi_event_encode_byte(vmidi->parser, input, in snd_vmidi_output_work()
162 &vmidi->event)) in snd_vmidi_output_work()
164 if (vmidi->event.type != SNDRV_SEQ_EVENT_NONE) { in snd_vmidi_output_work()
165 ret = snd_seq_kernel_client_dispatch(vmidi->client, in snd_vmidi_output_work()
166 &vmidi->event, in snd_vmidi_output_work()
168 vmidi->event.type = SNDRV_SEQ_EVENT_NONE; in snd_vmidi_output_work()
182 struct snd_virmidi *vmidi = substream->runtime->private_data; in snd_virmidi_output_trigger() local
184 WRITE_ONCE(vmidi->trigger, !!up); in snd_virmidi_output_trigger()
186 queue_work(system_highpri_wq, &vmidi->output_work); in snd_virmidi_output_trigger()
196 struct snd_virmidi *vmidi; in snd_virmidi_input_open() local
198 vmidi = kzalloc(sizeof(*vmidi), GFP_KERNEL); in snd_virmidi_input_open()
199 if (vmidi == NULL) in snd_virmidi_input_open()
201 vmidi->substream = substream; in snd_virmidi_input_open()
202 if (snd_midi_event_new(0, &vmidi->parser) < 0) { in snd_virmidi_input_open()
203 kfree(vmidi); in snd_virmidi_input_open()
206 vmidi->seq_mode = rdev->seq_mode; in snd_virmidi_input_open()
207 vmidi->client = rdev->client; in snd_virmidi_input_open()
208 vmidi->port = rdev->port; in snd_virmidi_input_open()
209 runtime->private_data = vmidi; in snd_virmidi_input_open()
212 list_add_tail(&vmidi->list, &rdev->filelist); in snd_virmidi_input_open()
215 vmidi->rdev = rdev; in snd_virmidi_input_open()
226 struct snd_virmidi *vmidi; in snd_virmidi_output_open() local
228 vmidi = kzalloc(sizeof(*vmidi), GFP_KERNEL); in snd_virmidi_output_open()
229 if (vmidi == NULL) in snd_virmidi_output_open()
231 vmidi->substream = substream; in snd_virmidi_output_open()
232 if (snd_midi_event_new(MAX_MIDI_EVENT_BUF, &vmidi->parser) < 0) { in snd_virmidi_output_open()
233 kfree(vmidi); in snd_virmidi_output_open()
236 vmidi->seq_mode = rdev->seq_mode; in snd_virmidi_output_open()
237 vmidi->client = rdev->client; in snd_virmidi_output_open()
238 vmidi->port = rdev->port; in snd_virmidi_output_open()
239 snd_virmidi_init_event(vmidi, &vmidi->event); in snd_virmidi_output_open()
240 vmidi->rdev = rdev; in snd_virmidi_output_open()
241 INIT_WORK(&vmidi->output_work, snd_vmidi_output_work); in snd_virmidi_output_open()
242 runtime->private_data = vmidi; in snd_virmidi_output_open()
252 struct snd_virmidi *vmidi = substream->runtime->private_data; in snd_virmidi_input_close() local
256 list_del(&vmidi->list); in snd_virmidi_input_close()
259 snd_midi_event_free(vmidi->parser); in snd_virmidi_input_close()
261 kfree(vmidi); in snd_virmidi_input_close()
270 struct snd_virmidi *vmidi = substream->runtime->private_data; in snd_virmidi_output_close() local
272 WRITE_ONCE(vmidi->trigger, false); /* to be sure */ in snd_virmidi_output_close()
273 cancel_work_sync(&vmidi->output_work); in snd_virmidi_output_close()
274 snd_midi_event_free(vmidi->parser); in snd_virmidi_output_close()
276 kfree(vmidi); in snd_virmidi_output_close()