Lines Matching refs:substream
103 static bool snd_rawmidi_ready(struct snd_rawmidi_substream *substream) in snd_rawmidi_ready() argument
105 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_ready()
115 static inline int snd_rawmidi_ready_append(struct snd_rawmidi_substream *substream, in snd_rawmidi_ready_append() argument
118 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_ready_append()
121 (!substream->append || runtime->avail >= count); in snd_rawmidi_ready_append()
130 runtime->event(runtime->substream); in snd_rawmidi_input_event_work()
144 static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream) in snd_rawmidi_runtime_create() argument
151 runtime->substream = substream; in snd_rawmidi_runtime_create()
158 if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT) in snd_rawmidi_runtime_create()
168 substream->runtime = runtime; in snd_rawmidi_runtime_create()
172 static int snd_rawmidi_runtime_free(struct snd_rawmidi_substream *substream) in snd_rawmidi_runtime_free() argument
174 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_runtime_free()
178 substream->runtime = NULL; in snd_rawmidi_runtime_free()
182 static inline void snd_rawmidi_output_trigger(struct snd_rawmidi_substream *substream, int up) in snd_rawmidi_output_trigger() argument
184 if (!substream->opened) in snd_rawmidi_output_trigger()
186 substream->ops->trigger(substream, up); in snd_rawmidi_output_trigger()
189 static void snd_rawmidi_input_trigger(struct snd_rawmidi_substream *substream, int up) in snd_rawmidi_input_trigger() argument
191 if (!substream->opened) in snd_rawmidi_input_trigger()
193 substream->ops->trigger(substream, up); in snd_rawmidi_input_trigger()
195 cancel_work_sync(&substream->runtime->event_work); in snd_rawmidi_input_trigger()
216 int snd_rawmidi_drop_output(struct snd_rawmidi_substream *substream) in snd_rawmidi_drop_output() argument
218 snd_rawmidi_output_trigger(substream, 0); in snd_rawmidi_drop_output()
219 reset_runtime_ptrs(substream->runtime, false); in snd_rawmidi_drop_output()
224 int snd_rawmidi_drain_output(struct snd_rawmidi_substream *substream) in snd_rawmidi_drain_output() argument
228 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_drain_output()
238 rmidi_warn(substream->rmidi, in snd_rawmidi_drain_output()
246 if (substream->ops->drain) in snd_rawmidi_drain_output()
247 substream->ops->drain(substream); in snd_rawmidi_drain_output()
250 snd_rawmidi_drop_output(substream); in snd_rawmidi_drain_output()
256 int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream) in snd_rawmidi_drain_input() argument
258 snd_rawmidi_input_trigger(substream, 0); in snd_rawmidi_drain_input()
259 reset_runtime_ptrs(substream->runtime, true); in snd_rawmidi_drain_input()
271 struct snd_rawmidi_substream *substream; in assign_substream() local
283 list_for_each_entry(substream, &s->substreams, list) { in assign_substream()
284 if (substream->opened) { in assign_substream()
287 !substream->append) in assign_substream()
290 if (subdevice < 0 || subdevice == substream->number) { in assign_substream()
291 *sub_ret = substream; in assign_substream()
300 struct snd_rawmidi_substream *substream, in open_substream() argument
305 if (substream->use_count == 0) { in open_substream()
306 err = snd_rawmidi_runtime_create(substream); in open_substream()
309 err = substream->ops->open(substream); in open_substream()
311 snd_rawmidi_runtime_free(substream); in open_substream()
314 substream->opened = 1; in open_substream()
315 substream->active_sensing = 0; in open_substream()
317 substream->append = 1; in open_substream()
318 substream->pid = get_pid(task_pid(current)); in open_substream()
319 rmidi->streams[substream->stream].substream_opened++; in open_substream()
321 substream->use_count++; in open_substream()
326 struct snd_rawmidi_substream *substream,
504 struct snd_rawmidi_substream *substream, in close_substream() argument
507 if (--substream->use_count) in close_substream()
511 if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT) in close_substream()
512 snd_rawmidi_input_trigger(substream, 0); in close_substream()
514 if (substream->active_sensing) { in close_substream()
519 snd_rawmidi_kernel_write(substream, &buf, 1); in close_substream()
521 if (snd_rawmidi_drain_output(substream) == -ERESTARTSYS) in close_substream()
522 snd_rawmidi_output_trigger(substream, 0); in close_substream()
525 substream->ops->close(substream); in close_substream()
526 if (substream->runtime->private_free) in close_substream()
527 substream->runtime->private_free(substream); in close_substream()
528 snd_rawmidi_runtime_free(substream); in close_substream()
529 substream->opened = 0; in close_substream()
530 substream->append = 0; in close_substream()
531 put_pid(substream->pid); in close_substream()
532 substream->pid = NULL; in close_substream()
533 rmidi->streams[substream->stream].substream_opened--; in close_substream()
586 static int snd_rawmidi_info(struct snd_rawmidi_substream *substream, in snd_rawmidi_info() argument
591 if (substream == NULL) in snd_rawmidi_info()
593 rmidi = substream->rmidi; in snd_rawmidi_info()
597 info->subdevice = substream->number; in snd_rawmidi_info()
598 info->stream = substream->stream; in snd_rawmidi_info()
602 strcpy(info->subname, substream->name); in snd_rawmidi_info()
603 info->subdevices_count = substream->pstr->substream_count; in snd_rawmidi_info()
604 info->subdevices_avail = (substream->pstr->substream_count - in snd_rawmidi_info()
605 substream->pstr->substream_opened); in snd_rawmidi_info()
609 static int snd_rawmidi_info_user(struct snd_rawmidi_substream *substream, in snd_rawmidi_info_user() argument
615 err = snd_rawmidi_info(substream, &info); in snd_rawmidi_info_user()
628 struct snd_rawmidi_substream *substream; in __snd_rawmidi_info_select() local
641 list_for_each_entry(substream, &pstr->substreams, list) { in __snd_rawmidi_info_select()
642 if ((unsigned int)substream->number == info->subdevice) in __snd_rawmidi_info_select()
643 return snd_rawmidi_info(substream, info); in __snd_rawmidi_info_select()
713 int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, in snd_rawmidi_output_params() argument
716 if (substream->append && substream->use_count > 1) in snd_rawmidi_output_params()
718 snd_rawmidi_drain_output(substream); in snd_rawmidi_output_params()
719 substream->active_sensing = !params->no_active_sensing; in snd_rawmidi_output_params()
720 return resize_runtime_buffer(substream->runtime, params, false); in snd_rawmidi_output_params()
724 int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, in snd_rawmidi_input_params() argument
737 snd_rawmidi_drain_input(substream); in snd_rawmidi_input_params()
738 err = resize_runtime_buffer(substream->runtime, params, true); in snd_rawmidi_input_params()
742 substream->framing = framing; in snd_rawmidi_input_params()
743 substream->clock_type = clock_type; in snd_rawmidi_input_params()
748 static int snd_rawmidi_output_status(struct snd_rawmidi_substream *substream, in snd_rawmidi_output_status() argument
751 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_output_status()
761 static int snd_rawmidi_input_status(struct snd_rawmidi_substream *substream, in snd_rawmidi_input_status() argument
764 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_input_status()
995 static int receive_with_tstamp_framing(struct snd_rawmidi_substream *substream, in receive_with_tstamp_framing() argument
998 struct snd_rawmidi_runtime *runtime = substream->runtime; in receive_with_tstamp_framing()
1033 static struct timespec64 get_framing_tstamp(struct snd_rawmidi_substream *substream) in get_framing_tstamp() argument
1037 switch (substream->clock_type) { in get_framing_tstamp()
1061 int snd_rawmidi_receive(struct snd_rawmidi_substream *substream, in snd_rawmidi_receive() argument
1065 struct timespec64 ts64 = get_framing_tstamp(substream); in snd_rawmidi_receive()
1067 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_receive()
1069 if (!substream->opened) in snd_rawmidi_receive()
1072 rmidi_dbg(substream->rmidi, in snd_rawmidi_receive()
1078 if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) { in snd_rawmidi_receive()
1079 result = receive_with_tstamp_framing(substream, buffer, count, &ts64); in snd_rawmidi_receive()
1081 substream->bytes++; in snd_rawmidi_receive()
1091 substream->bytes += count; in snd_rawmidi_receive()
1129 static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream, in snd_rawmidi_kernel_read1() argument
1135 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_kernel_read1()
1174 long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream, in snd_rawmidi_kernel_read() argument
1177 snd_rawmidi_input_trigger(substream, 1); in snd_rawmidi_kernel_read()
1178 return snd_rawmidi_kernel_read1(substream, NULL/*userbuf*/, buf, count); in snd_rawmidi_kernel_read()
1188 struct snd_rawmidi_substream *substream; in snd_rawmidi_read() local
1192 substream = rfile->input; in snd_rawmidi_read()
1193 if (substream == NULL) in snd_rawmidi_read()
1195 runtime = substream->runtime; in snd_rawmidi_read()
1196 snd_rawmidi_input_trigger(substream, 1); in snd_rawmidi_read()
1224 count1 = snd_rawmidi_kernel_read1(substream, in snd_rawmidi_read()
1243 int snd_rawmidi_transmit_empty(struct snd_rawmidi_substream *substream) in snd_rawmidi_transmit_empty() argument
1245 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_transmit_empty()
1250 rmidi_dbg(substream->rmidi, in snd_rawmidi_transmit_empty()
1269 int __snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream, in __snd_rawmidi_transmit_peek() argument
1273 struct snd_rawmidi_runtime *runtime = substream->runtime; in __snd_rawmidi_transmit_peek()
1276 rmidi_dbg(substream->rmidi, in __snd_rawmidi_transmit_peek()
1323 int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream, in snd_rawmidi_transmit_peek() argument
1326 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_transmit_peek()
1331 result = __snd_rawmidi_transmit_peek(substream, buffer, count); in snd_rawmidi_transmit_peek()
1344 int __snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count) in __snd_rawmidi_transmit_ack() argument
1346 struct snd_rawmidi_runtime *runtime = substream->runtime; in __snd_rawmidi_transmit_ack()
1349 rmidi_dbg(substream->rmidi, in __snd_rawmidi_transmit_ack()
1357 substream->bytes += count; in __snd_rawmidi_transmit_ack()
1377 int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count) in snd_rawmidi_transmit_ack() argument
1379 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_transmit_ack()
1384 result = __snd_rawmidi_transmit_ack(substream, count); in snd_rawmidi_transmit_ack()
1400 int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream, in snd_rawmidi_transmit() argument
1403 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_transmit()
1408 if (!substream->opened) in snd_rawmidi_transmit()
1411 count = __snd_rawmidi_transmit_peek(substream, buffer, count); in snd_rawmidi_transmit()
1415 result = __snd_rawmidi_transmit_ack(substream, count); in snd_rawmidi_transmit()
1428 int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream) in snd_rawmidi_proceed() argument
1430 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_proceed()
1437 __snd_rawmidi_transmit_ack(substream, count); in snd_rawmidi_proceed()
1444 static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream, in snd_rawmidi_kernel_write1() argument
1451 struct snd_rawmidi_runtime *runtime = substream->runtime; in snd_rawmidi_kernel_write1()
1461 if (substream->append) { in snd_rawmidi_kernel_write1()
1502 snd_rawmidi_output_trigger(substream, 1); in snd_rawmidi_kernel_write1()
1506 long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream, in snd_rawmidi_kernel_write() argument
1509 return snd_rawmidi_kernel_write1(substream, NULL, buf, count); in snd_rawmidi_kernel_write()
1520 struct snd_rawmidi_substream *substream; in snd_rawmidi_write() local
1523 substream = rfile->output; in snd_rawmidi_write()
1524 runtime = substream->runtime; in snd_rawmidi_write()
1526 if (substream->append && count > runtime->buffer_size) in snd_rawmidi_write()
1531 while (!snd_rawmidi_ready_append(substream, count)) { in snd_rawmidi_write()
1555 count1 = snd_rawmidi_kernel_write1(substream, buf, NULL, count); in snd_rawmidi_write()
1630 struct snd_rawmidi_substream *substream; in snd_rawmidi_proc_info_read() local
1640 list_for_each_entry(substream, in snd_rawmidi_proc_info_read()
1646 substream->number, in snd_rawmidi_proc_info_read()
1647 (unsigned long) substream->bytes); in snd_rawmidi_proc_info_read()
1648 if (substream->opened) { in snd_rawmidi_proc_info_read()
1651 pid_vnr(substream->pid)); in snd_rawmidi_proc_info_read()
1652 runtime = substream->runtime; in snd_rawmidi_proc_info_read()
1667 list_for_each_entry(substream, in snd_rawmidi_proc_info_read()
1673 substream->number, in snd_rawmidi_proc_info_read()
1674 (unsigned long) substream->bytes); in snd_rawmidi_proc_info_read()
1675 if (substream->opened) { in snd_rawmidi_proc_info_read()
1678 pid_vnr(substream->pid)); in snd_rawmidi_proc_info_read()
1679 runtime = substream->runtime; in snd_rawmidi_proc_info_read()
1690 if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) { in snd_rawmidi_proc_info_read()
1691 clock_type = substream->clock_type >> SNDRV_RAWMIDI_MODE_CLOCK_SHIFT; in snd_rawmidi_proc_info_read()
1725 struct snd_rawmidi_substream *substream; in snd_rawmidi_alloc_substreams() local
1729 substream = kzalloc(sizeof(*substream), GFP_KERNEL); in snd_rawmidi_alloc_substreams()
1730 if (!substream) in snd_rawmidi_alloc_substreams()
1732 substream->stream = direction; in snd_rawmidi_alloc_substreams()
1733 substream->number = idx; in snd_rawmidi_alloc_substreams()
1734 substream->rmidi = rmidi; in snd_rawmidi_alloc_substreams()
1735 substream->pstr = stream; in snd_rawmidi_alloc_substreams()
1736 list_add_tail(&substream->list, &stream->substreams); in snd_rawmidi_alloc_substreams()
1822 struct snd_rawmidi_substream *substream; in snd_rawmidi_free_substreams() local
1825 substream = list_entry(stream->substreams.next, struct snd_rawmidi_substream, list); in snd_rawmidi_free_substreams()
1826 list_del(&substream->list); in snd_rawmidi_free_substreams()
1827 kfree(substream); in snd_rawmidi_free_substreams()
2006 struct snd_rawmidi_substream *substream; in snd_rawmidi_set_ops() local
2008 list_for_each_entry(substream, &rmidi->streams[stream].substreams, list) in snd_rawmidi_set_ops()
2009 substream->ops = ops; in snd_rawmidi_set_ops()