Lines Matching refs:substream

106 static bool snd_rawmidi_ready(struct snd_rawmidi_substream *substream)
108 guard(spinlock_irqsave)(&substream->lock);
109 return __snd_rawmidi_ready(substream->runtime);
112 static inline int snd_rawmidi_ready_append(struct snd_rawmidi_substream *substream,
115 struct snd_rawmidi_runtime *runtime = substream->runtime;
118 (!substream->append || runtime->avail >= count);
127 runtime->event(runtime->substream);
130 /* buffer refcount management: call with substream->lock held */
141 static void snd_rawmidi_buffer_ref_sync(struct snd_rawmidi_substream *substream)
145 spin_lock_irq(&substream->lock);
146 while (substream->runtime->buffer_ref) {
147 spin_unlock_irq(&substream->lock);
149 rmidi_err(substream->rmidi, "Buffer ref sync timeout\n");
153 spin_lock_irq(&substream->lock);
155 spin_unlock_irq(&substream->lock);
158 static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream)
165 runtime->substream = substream;
171 if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT)
181 substream->runtime = runtime;
182 if (rawmidi_is_ump(substream->rmidi))
199 static int snd_rawmidi_runtime_free(struct snd_rawmidi_substream *substream)
201 struct snd_rawmidi_runtime *runtime = substream->runtime;
205 substream->runtime = NULL;
209 static inline void snd_rawmidi_output_trigger(struct snd_rawmidi_substream *substream, int up)
211 if (!substream->opened)
213 substream->ops->trigger(substream, up);
216 static void snd_rawmidi_input_trigger(struct snd_rawmidi_substream *substream, int up)
218 if (!substream->opened)
220 substream->ops->trigger(substream, up);
222 cancel_work_sync(&substream->runtime->event_work);
233 static void reset_runtime_ptrs(struct snd_rawmidi_substream *substream,
236 guard(spinlock_irqsave)(&substream->lock);
237 if (substream->opened && substream->runtime)
238 __reset_runtime_ptrs(substream->runtime, is_input);
241 int snd_rawmidi_drop_output(struct snd_rawmidi_substream *substream)
243 snd_rawmidi_output_trigger(substream, 0);
244 reset_runtime_ptrs(substream, false);
249 int snd_rawmidi_drain_output(struct snd_rawmidi_substream *substream)
255 scoped_guard(spinlock_irq, &substream->lock) {
256 runtime = substream->runtime;
257 if (!substream->opened || !runtime || !runtime->buffer)
267 scoped_guard(spinlock_irq, &substream->lock) {
271 rmidi_warn(substream->rmidi,
281 if (substream->ops->drain)
282 substream->ops->drain(substream);
285 snd_rawmidi_drop_output(substream);
288 scoped_guard(spinlock_irq, &substream->lock)
295 int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream)
297 snd_rawmidi_input_trigger(substream, 0);
298 reset_runtime_ptrs(substream, true);
303 /* look for an available substream for the given stream direction;
310 struct snd_rawmidi_substream *substream;
322 list_for_each_entry(substream, &s->substreams, list) {
323 if (substream->opened) {
326 !substream->append)
329 if (subdevice < 0 || subdevice == substream->number) {
330 *sub_ret = substream;
337 /* open and do ref-counting for the given substream */
339 struct snd_rawmidi_substream *substream,
344 if (substream->use_count == 0) {
345 err = snd_rawmidi_runtime_create(substream);
348 err = substream->ops->open(substream);
350 snd_rawmidi_runtime_free(substream);
353 guard(spinlock_irq)(&substream->lock);
354 substream->opened = 1;
355 substream->active_sensing = 0;
357 substream->append = 1;
358 substream->pid = get_pid(task_pid(current));
359 rmidi->streams[substream->stream].substream_opened++;
361 substream->use_count++;
366 struct snd_rawmidi_substream *substream,
534 struct snd_rawmidi_substream *substream,
537 if (--substream->use_count)
541 if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT)
542 snd_rawmidi_input_trigger(substream, 0);
544 if (substream->active_sensing) {
549 snd_rawmidi_kernel_write(substream, &buf, 1);
551 if (snd_rawmidi_drain_output(substream) == -ERESTARTSYS)
552 snd_rawmidi_output_trigger(substream, 0);
554 snd_rawmidi_buffer_ref_sync(substream);
556 scoped_guard(spinlock_irq, &substream->lock) {
557 substream->opened = 0;
558 substream->append = 0;
560 substream->ops->close(substream);
561 if (substream->runtime->private_free)
562 substream->runtime->private_free(substream);
563 snd_rawmidi_runtime_free(substream);
564 put_pid(substream->pid);
565 substream->pid = NULL;
566 rmidi->streams[substream->stream].substream_opened--;
618 static int snd_rawmidi_info(struct snd_rawmidi_substream *substream,
623 if (substream == NULL)
625 rmidi = substream->rmidi;
629 info->subdevice = substream->number;
630 info->stream = substream->stream;
634 strcpy(info->subname, substream->name);
635 info->subdevices_count = substream->pstr->substream_count;
636 info->subdevices_avail = (substream->pstr->substream_count -
637 substream->pstr->substream_opened);
641 static int snd_rawmidi_info_user(struct snd_rawmidi_substream *substream,
647 err = snd_rawmidi_info(substream, &info);
660 struct snd_rawmidi_substream *substream;
673 list_for_each_entry(substream, &pstr->substreams, list) {
674 if ((unsigned int)substream->number == info->subdevice)
675 return snd_rawmidi_info(substream, info);
707 static int resize_runtime_buffer(struct snd_rawmidi_substream *substream,
711 struct snd_rawmidi_runtime *runtime = substream->runtime;
727 guard(spinlock_irq)(&substream->lock);
742 int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream,
747 snd_rawmidi_drain_output(substream);
748 guard(mutex)(&substream->rmidi->open_mutex);
749 if (substream->append && substream->use_count > 1)
751 err = resize_runtime_buffer(substream, params, false);
753 substream->active_sensing = !params->no_active_sensing;
758 int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream,
765 snd_rawmidi_drain_input(substream);
766 guard(mutex)(&substream->rmidi->open_mutex);
774 err = resize_runtime_buffer(substream, params, true);
777 substream->framing = framing;
778 substream->clock_type = clock_type;
784 static int snd_rawmidi_output_status(struct snd_rawmidi_substream *substream,
787 struct snd_rawmidi_runtime *runtime = substream->runtime;
791 guard(spinlock_irq)(&substream->lock);
796 static int snd_rawmidi_input_status(struct snd_rawmidi_substream *substream,
799 struct snd_rawmidi_runtime *runtime = substream->runtime;
803 guard(spinlock_irq)(&substream->lock);
1071 static int receive_with_tstamp_framing(struct snd_rawmidi_substream *substream,
1074 struct snd_rawmidi_runtime *runtime = substream->runtime;
1110 static struct timespec64 get_framing_tstamp(struct snd_rawmidi_substream *substream)
1114 switch (substream->clock_type) {
1130 * @substream: the rawmidi substream
1138 int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
1141 struct timespec64 ts64 = get_framing_tstamp(substream);
1145 guard(spinlock_irqsave)(&substream->lock);
1146 if (!substream->opened)
1148 runtime = substream->runtime;
1150 rmidi_dbg(substream->rmidi,
1159 if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) {
1160 result = receive_with_tstamp_framing(substream, buffer, count, &ts64);
1162 substream->bytes++;
1172 substream->bytes += count;
1212 static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream,
1218 struct snd_rawmidi_runtime *runtime = substream->runtime;
1222 spin_lock_irqsave(&substream->lock, flags);
1240 spin_unlock_irqrestore(&substream->lock, flags);
1244 spin_lock_irqsave(&substream->lock, flags);
1253 spin_unlock_irqrestore(&substream->lock, flags);
1257 long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
1260 snd_rawmidi_input_trigger(substream, 1);
1261 return snd_rawmidi_kernel_read1(substream, NULL/*userbuf*/, buf, count);
1271 struct snd_rawmidi_substream *substream;
1275 substream = rfile->input;
1276 if (substream == NULL)
1278 runtime = substream->runtime;
1279 snd_rawmidi_input_trigger(substream, 1);
1282 spin_lock_irq(&substream->lock);
1287 spin_unlock_irq(&substream->lock);
1293 spin_unlock_irq(&substream->lock);
1300 spin_lock_irq(&substream->lock);
1302 spin_unlock_irq(&substream->lock);
1306 spin_unlock_irq(&substream->lock);
1307 count1 = snd_rawmidi_kernel_read1(substream,
1322 * @substream: the rawmidi substream
1326 int snd_rawmidi_transmit_empty(struct snd_rawmidi_substream *substream)
1330 guard(spinlock_irqsave)(&substream->lock);
1331 runtime = substream->runtime;
1332 if (!substream->opened || !runtime || !runtime->buffer) {
1333 rmidi_dbg(substream->rmidi,
1343 * @substream: the rawmidi substream
1349 static int __snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
1353 struct snd_rawmidi_runtime *runtime = substream->runtime;
1356 rmidi_dbg(substream->rmidi,
1396 * @substream: the rawmidi substream
1408 int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
1411 guard(spinlock_irqsave)(&substream->lock);
1412 if (!substream->opened || !substream->runtime)
1414 return __snd_rawmidi_transmit_peek(substream, buffer, count);
1420 * @substream: the rawmidi substream
1425 static int __snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream,
1428 struct snd_rawmidi_runtime *runtime = substream->runtime;
1431 rmidi_dbg(substream->rmidi,
1440 substream->bytes += count;
1450 * @substream: the rawmidi substream
1459 int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count)
1461 guard(spinlock_irqsave)(&substream->lock);
1462 if (!substream->opened || !substream->runtime)
1464 return __snd_rawmidi_transmit_ack(substream, count);
1470 * @substream: the rawmidi substream
1478 int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
1481 guard(spinlock_irqsave)(&substream->lock);
1482 if (!substream->opened)
1484 count = __snd_rawmidi_transmit_peek(substream, buffer, count);
1487 return __snd_rawmidi_transmit_ack(substream, count);
1493 * @substream: rawmidi substream
1497 int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream)
1502 guard(spinlock_irqsave)(&substream->lock);
1503 runtime = substream->runtime;
1504 if (substream->opened && runtime &&
1507 __snd_rawmidi_transmit_ack(substream, count);
1513 static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream,
1520 struct snd_rawmidi_runtime *runtime = substream->runtime;
1529 spin_lock_irqsave(&substream->lock, flags);
1530 if (substream->append) {
1532 spin_unlock_irqrestore(&substream->lock, flags);
1554 spin_unlock_irqrestore(&substream->lock, flags);
1557 spin_lock_irqsave(&substream->lock, flags);
1561 spin_lock_irqsave(&substream->lock, flags);
1569 spin_unlock_irqrestore(&substream->lock, flags);
1571 snd_rawmidi_output_trigger(substream, 1);
1575 long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
1578 return snd_rawmidi_kernel_write1(substream, NULL, buf, count);
1589 struct snd_rawmidi_substream *substream;
1592 substream = rfile->output;
1593 runtime = substream->runtime;
1595 if (substream->append && count > runtime->buffer_size)
1599 spin_lock_irq(&substream->lock);
1600 while (!snd_rawmidi_ready_append(substream, count)) {
1604 spin_unlock_irq(&substream->lock);
1610 spin_unlock_irq(&substream->lock);
1617 spin_lock_irq(&substream->lock);
1619 spin_unlock_irq(&substream->lock);
1623 spin_unlock_irq(&substream->lock);
1624 count1 = snd_rawmidi_kernel_write1(substream, buf, NULL, count);
1634 spin_lock_irq(&substream->lock);
1642 spin_unlock_irq(&substream->lock);
1649 spin_lock_irq(&substream->lock);
1651 spin_unlock_irq(&substream->lock);
1699 struct snd_rawmidi_substream *substream;
1714 list_for_each_entry(substream,
1720 substream->number,
1721 (unsigned long) substream->bytes);
1722 if (substream->opened) {
1725 pid_vnr(substream->pid));
1726 runtime = substream->runtime;
1727 scoped_guard(spinlock_irq, &substream->lock) {
1741 list_for_each_entry(substream,
1747 substream->number,
1748 (unsigned long) substream->bytes);
1749 if (substream->opened) {
1752 pid_vnr(substream->pid));
1753 runtime = substream->runtime;
1754 scoped_guard(spinlock_irq, &substream->lock) {
1764 if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) {
1765 clock_type = substream->clock_type >> SNDRV_RAWMIDI_MODE_CLOCK_SHIFT;
1798 struct snd_rawmidi_substream *substream;
1802 substream = kzalloc(sizeof(*substream), GFP_KERNEL);
1803 if (!substream)
1805 substream->stream = direction;
1806 substream->number = idx;
1807 substream->rmidi = rmidi;
1808 substream->pstr = stream;
1809 spin_lock_init(&substream->lock);
1810 list_add_tail(&substream->list, &stream->substreams);
1907 struct snd_rawmidi_substream *substream;
1910 substream = list_entry(stream->substreams.next, struct snd_rawmidi_substream, list);
1911 list_del(&substream->list);
1912 kfree(substream);
2092 struct snd_rawmidi_substream *substream;
2094 list_for_each_entry(substream, &rmidi->streams[stream].substreams, list)
2095 substream->ops = ops;