Lines Matching refs:stream

53 	struct snd_compr_stream stream;  member
59 static void snd_compr_task_free_all(struct snd_compr_stream *stream);
61 static inline void snd_compr_task_free_all(struct snd_compr_stream *stream) { } in snd_compr_task_free_all() argument
123 INIT_DELAYED_WORK(&data->stream.error_work, error_delayed_work); in snd_compr_open()
125 data->stream.ops = compr->ops; in snd_compr_open()
126 data->stream.direction = dirn; in snd_compr_open()
127 data->stream.private_data = compr->private_data; in snd_compr_open()
128 data->stream.device = compr; in snd_compr_open()
140 data->stream.runtime = runtime; in snd_compr_open()
143 ret = compr->ops->open(&data->stream); in snd_compr_open()
155 struct snd_compr_runtime *runtime = data->stream.runtime; in snd_compr_free()
157 cancel_delayed_work_sync(&data->stream.error_work); in snd_compr_free()
163 data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP); in snd_compr_free()
169 snd_compr_task_free_all(&data->stream); in snd_compr_free()
171 data->stream.ops->free(&data->stream); in snd_compr_free()
172 if (!data->stream.runtime->dma_buffer_p) in snd_compr_free()
173 kfree(data->stream.runtime->buffer); in snd_compr_free()
174 kfree(data->stream.runtime); in snd_compr_free()
190 static int snd_compr_update_tstamp(struct snd_compr_stream *stream, in snd_compr_update_tstamp() argument
193 if (!stream->ops->pointer) in snd_compr_update_tstamp()
195 stream->ops->pointer(stream, tstamp); in snd_compr_update_tstamp()
198 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_update_tstamp()
199 stream->runtime->total_bytes_transferred = tstamp->copied_total; in snd_compr_update_tstamp()
201 stream->runtime->total_bytes_available = tstamp->copied_total; in snd_compr_update_tstamp()
205 static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, in snd_compr_calc_avail() argument
209 snd_compr_update_tstamp(stream, &avail->tstamp); in snd_compr_calc_avail()
212 if (stream->runtime->total_bytes_available == 0 && in snd_compr_calc_avail()
213 stream->runtime->state == SNDRV_PCM_STATE_SETUP && in snd_compr_calc_avail()
214 stream->direction == SND_COMPRESS_PLAYBACK) { in snd_compr_calc_avail()
216 return stream->runtime->buffer_size; in snd_compr_calc_avail()
219 stream->runtime->total_bytes_available, in snd_compr_calc_avail()
220 stream->runtime->total_bytes_transferred); in snd_compr_calc_avail()
221 if (stream->runtime->total_bytes_available == in snd_compr_calc_avail()
222 stream->runtime->total_bytes_transferred) { in snd_compr_calc_avail()
223 if (stream->direction == SND_COMPRESS_PLAYBACK) { in snd_compr_calc_avail()
225 return stream->runtime->buffer_size; in snd_compr_calc_avail()
232 avail->avail = stream->runtime->total_bytes_available - in snd_compr_calc_avail()
233 stream->runtime->total_bytes_transferred; in snd_compr_calc_avail()
234 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_calc_avail()
235 avail->avail = stream->runtime->buffer_size - avail->avail; in snd_compr_calc_avail()
241 static inline size_t snd_compr_get_avail(struct snd_compr_stream *stream) in snd_compr_get_avail() argument
245 return snd_compr_calc_avail(stream, &avail); in snd_compr_get_avail()
255 static int snd_compr_ioctl_avail(struct snd_compr_stream *stream, in snd_compr_ioctl_avail() argument
264 if (stream->direction == SND_COMPRESS_ACCEL) in snd_compr_ioctl_avail()
267 avail = snd_compr_calc_avail(stream, &ioctl_avail64); in snd_compr_ioctl_avail()
275 switch (stream->runtime->state) { in snd_compr_ioctl_avail()
289 static int snd_compr_write_data(struct snd_compr_stream *stream, in snd_compr_write_data() argument
294 struct snd_compr_runtime *runtime = stream->runtime; in snd_compr_write_data()
314 if (stream->ops->ack) in snd_compr_write_data()
315 stream->ops->ack(stream, count); in snd_compr_write_data()
323 struct snd_compr_stream *stream; in snd_compr_write() local
330 stream = &data->stream; in snd_compr_write()
331 if (stream->direction == SND_COMPRESS_ACCEL) in snd_compr_write()
333 guard(mutex)(&stream->device->lock); in snd_compr_write()
335 switch (stream->runtime->state) { in snd_compr_write()
344 avail = snd_compr_get_avail(stream); in snd_compr_write()
350 if (stream->ops->copy) { in snd_compr_write()
352 retval = stream->ops->copy(stream, cbuf, avail); in snd_compr_write()
354 retval = snd_compr_write_data(stream, buf, avail); in snd_compr_write()
357 stream->runtime->total_bytes_available += retval; in snd_compr_write()
361 if (stream->runtime->state == SNDRV_PCM_STATE_SETUP) { in snd_compr_write()
362 stream->runtime->state = SNDRV_PCM_STATE_PREPARED; in snd_compr_write()
374 struct snd_compr_stream *stream; in snd_compr_read() local
381 stream = &data->stream; in snd_compr_read()
382 if (stream->direction == SND_COMPRESS_ACCEL) in snd_compr_read()
384 guard(mutex)(&stream->device->lock); in snd_compr_read()
390 switch (stream->runtime->state) { in snd_compr_read()
400 avail = snd_compr_get_avail(stream); in snd_compr_read()
406 if (stream->ops->copy) in snd_compr_read()
407 retval = stream->ops->copy(stream, buf, avail); in snd_compr_read()
411 stream->runtime->total_bytes_transferred += retval; in snd_compr_read()
421 static __poll_t snd_compr_get_poll(struct snd_compr_stream *stream) in snd_compr_get_poll() argument
423 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_get_poll()
432 struct snd_compr_stream *stream; in snd_compr_poll() local
440 stream = &data->stream; in snd_compr_poll()
441 runtime = stream->runtime; in snd_compr_poll()
443 guard(mutex)(&stream->device->lock); in snd_compr_poll()
448 return snd_compr_get_poll(stream) | EPOLLERR; in snd_compr_poll()
456 if (stream->direction == SND_COMPRESS_ACCEL) { in snd_compr_poll()
469 avail = snd_compr_get_avail(stream); in snd_compr_poll()
477 retval = snd_compr_get_poll(stream); in snd_compr_poll()
484 retval = snd_compr_get_poll(stream); in snd_compr_poll()
487 return snd_compr_get_poll(stream) | EPOLLERR; in snd_compr_poll()
494 snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_caps() argument
499 if (!stream->ops->get_caps) in snd_compr_get_caps()
503 retval = stream->ops->get_caps(stream, &caps); in snd_compr_get_caps()
514 snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_codec_caps() argument
519 if (!stream->ops->get_codec_caps) in snd_compr_get_codec_caps()
526 retval = stream->ops->get_codec_caps(stream, caps); in snd_compr_get_codec_caps()
535 int snd_compr_malloc_pages(struct snd_compr_stream *stream, size_t size) in snd_compr_malloc_pages() argument
540 if (snd_BUG_ON(!(stream) || !(stream)->runtime)) in snd_compr_malloc_pages()
545 dmab->dev = stream->dma_buffer.dev; in snd_compr_malloc_pages()
552 snd_compr_set_runtime_buffer(stream, dmab); in snd_compr_malloc_pages()
553 stream->runtime->dma_bytes = size; in snd_compr_malloc_pages()
558 int snd_compr_free_pages(struct snd_compr_stream *stream) in snd_compr_free_pages() argument
562 if (snd_BUG_ON(!(stream) || !(stream)->runtime)) in snd_compr_free_pages()
564 runtime = stream->runtime; in snd_compr_free_pages()
567 if (runtime->dma_buffer_p != &stream->dma_buffer) { in snd_compr_free_pages()
573 snd_compr_set_runtime_buffer(stream, NULL); in snd_compr_free_pages()
579 static int snd_compr_allocate_buffer(struct snd_compr_stream *stream, in snd_compr_allocate_buffer() argument
585 if (stream->direction == SND_COMPRESS_ACCEL) in snd_compr_allocate_buffer()
589 if (stream->ops->copy) { in snd_compr_allocate_buffer()
595 if (stream->runtime->dma_buffer_p) { in snd_compr_allocate_buffer()
597 if (buffer_size > stream->runtime->dma_buffer_p->bytes) in snd_compr_allocate_buffer()
598 dev_err(stream->device->dev, in snd_compr_allocate_buffer()
601 buffer = stream->runtime->dma_buffer_p->area; in snd_compr_allocate_buffer()
611 stream->runtime->buffer = buffer; in snd_compr_allocate_buffer()
612 stream->runtime->buffer_size = buffer_size; in snd_compr_allocate_buffer()
614 stream->runtime->fragment_size = params->buffer.fragment_size; in snd_compr_allocate_buffer()
615 stream->runtime->fragments = params->buffer.fragments; in snd_compr_allocate_buffer()
620 snd_compress_check_input(struct snd_compr_stream *stream, struct snd_compr_params *params) in snd_compress_check_input() argument
628 if (stream->direction == SND_COMPRESS_ACCEL) in snd_compress_check_input()
648 snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_set_params() argument
653 if (stream->runtime->state == SNDRV_PCM_STATE_OPEN || stream->next_track) { in snd_compr_set_params()
662 retval = snd_compress_check_input(stream, params); in snd_compr_set_params()
666 retval = snd_compr_allocate_buffer(stream, params); in snd_compr_set_params()
670 retval = stream->ops->set_params(stream, params); in snd_compr_set_params()
674 if (stream->next_track) in snd_compr_set_params()
677 stream->metadata_set = false; in snd_compr_set_params()
678 stream->next_track = false; in snd_compr_set_params()
680 stream->runtime->state = SNDRV_PCM_STATE_SETUP; in snd_compr_set_params()
688 snd_compr_get_params(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_params() argument
693 if (!stream->ops->get_params) in snd_compr_get_params()
699 retval = stream->ops->get_params(stream, params); in snd_compr_get_params()
708 snd_compr_get_metadata(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_metadata() argument
713 if (!stream->ops->get_metadata) in snd_compr_get_metadata()
719 retval = stream->ops->get_metadata(stream, &metadata); in snd_compr_get_metadata()
730 snd_compr_set_metadata(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_set_metadata() argument
735 if (!stream->ops->set_metadata) in snd_compr_set_metadata()
744 retval = stream->ops->set_metadata(stream, &metadata); in snd_compr_set_metadata()
745 stream->metadata_set = true; in snd_compr_set_metadata()
750 static inline int snd_compr_tstamp(struct snd_compr_stream *stream, in snd_compr_tstamp() argument
759 ret = snd_compr_update_tstamp(stream, &tstamp64); in snd_compr_tstamp()
773 static int snd_compr_pause(struct snd_compr_stream *stream) in snd_compr_pause() argument
777 switch (stream->runtime->state) { in snd_compr_pause()
779 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_PUSH); in snd_compr_pause()
781 stream->runtime->state = SNDRV_PCM_STATE_PAUSED; in snd_compr_pause()
784 if (!stream->device->use_pause_in_draining) in snd_compr_pause()
786 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_PUSH); in snd_compr_pause()
788 stream->pause_in_draining = true; in snd_compr_pause()
796 static int snd_compr_resume(struct snd_compr_stream *stream) in snd_compr_resume() argument
800 switch (stream->runtime->state) { in snd_compr_resume()
802 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_RELEASE); in snd_compr_resume()
804 stream->runtime->state = SNDRV_PCM_STATE_RUNNING; in snd_compr_resume()
807 if (!stream->pause_in_draining) in snd_compr_resume()
809 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_RELEASE); in snd_compr_resume()
811 stream->pause_in_draining = false; in snd_compr_resume()
819 static int snd_compr_start(struct snd_compr_stream *stream) in snd_compr_start() argument
823 switch (stream->runtime->state) { in snd_compr_start()
825 if (stream->direction != SND_COMPRESS_CAPTURE) in snd_compr_start()
834 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START); in snd_compr_start()
836 stream->runtime->state = SNDRV_PCM_STATE_RUNNING; in snd_compr_start()
840 static int snd_compr_stop(struct snd_compr_stream *stream) in snd_compr_stop() argument
844 switch (stream->runtime->state) { in snd_compr_stop()
853 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); in snd_compr_stop()
856 stream->partial_drain = false; in snd_compr_stop()
857 stream->metadata_set = false; in snd_compr_stop()
858 stream->pause_in_draining = false; in snd_compr_stop()
859 snd_compr_drain_notify(stream); in snd_compr_stop()
860 stream->runtime->total_bytes_available = 0; in snd_compr_stop()
861 stream->runtime->total_bytes_transferred = 0; in snd_compr_stop()
868 struct snd_compr_stream *stream; in error_delayed_work() local
870 stream = container_of(work, struct snd_compr_stream, error_work.work); in error_delayed_work()
872 guard(mutex)(&stream->device->lock); in error_delayed_work()
874 stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); in error_delayed_work()
875 wake_up(&stream->runtime->sleep); in error_delayed_work()
889 int snd_compr_stop_error(struct snd_compr_stream *stream, in snd_compr_stop_error() argument
892 if (stream->runtime->state == state) in snd_compr_stop_error()
895 stream->runtime->state = state; in snd_compr_stop_error()
899 queue_delayed_work(system_power_efficient_wq, &stream->error_work, 0); in snd_compr_stop_error()
905 static int snd_compress_wait_for_drain(struct snd_compr_stream *stream) in snd_compress_wait_for_drain() argument
917 stream->runtime->state = SNDRV_PCM_STATE_DRAINING; in snd_compress_wait_for_drain()
918 mutex_unlock(&stream->device->lock); in snd_compress_wait_for_drain()
926 ret = wait_event_interruptible(stream->runtime->sleep, in snd_compress_wait_for_drain()
927 (stream->runtime->state != SNDRV_PCM_STATE_DRAINING)); in snd_compress_wait_for_drain()
934 wake_up(&stream->runtime->sleep); in snd_compress_wait_for_drain()
935 mutex_lock(&stream->device->lock); in snd_compress_wait_for_drain()
940 static int snd_compr_drain(struct snd_compr_stream *stream) in snd_compr_drain() argument
944 switch (stream->runtime->state) { in snd_compr_drain()
956 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); in snd_compr_drain()
959 wake_up(&stream->runtime->sleep); in snd_compr_drain()
963 return snd_compress_wait_for_drain(stream); in snd_compr_drain()
966 static int snd_compr_next_track(struct snd_compr_stream *stream) in snd_compr_next_track() argument
971 if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) in snd_compr_next_track()
975 if (stream->direction == SND_COMPRESS_CAPTURE) in snd_compr_next_track()
981 if (stream->metadata_set == false) in snd_compr_next_track()
984 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_NEXT_TRACK); in snd_compr_next_track()
987 stream->metadata_set = false; in snd_compr_next_track()
988 stream->next_track = true; in snd_compr_next_track()
992 static int snd_compr_partial_drain(struct snd_compr_stream *stream) in snd_compr_partial_drain() argument
996 switch (stream->runtime->state) { in snd_compr_partial_drain()
1009 if (stream->direction == SND_COMPRESS_CAPTURE) in snd_compr_partial_drain()
1013 if (stream->next_track == false) in snd_compr_partial_drain()
1016 stream->partial_drain = true; in snd_compr_partial_drain()
1017 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN); in snd_compr_partial_drain()
1020 wake_up(&stream->runtime->sleep); in snd_compr_partial_drain()
1024 stream->next_track = false; in snd_compr_partial_drain()
1025 return snd_compress_wait_for_drain(stream); in snd_compr_partial_drain()
1031 snd_compr_find_task(struct snd_compr_stream *stream, __u64 seqno) in snd_compr_find_task() argument
1035 list_for_each_entry(task, &stream->runtime->tasks, list) { in snd_compr_find_task()
1051 static u64 snd_compr_seqno_next(struct snd_compr_stream *stream) in snd_compr_seqno_next() argument
1053 u64 seqno = ++stream->runtime->task_seqno; in snd_compr_seqno_next()
1055 seqno = ++stream->runtime->task_seqno; in snd_compr_seqno_next()
1059 static int snd_compr_task_new(struct snd_compr_stream *stream, struct snd_compr_task *utask) in snd_compr_task_new() argument
1064 if (stream->runtime->total_tasks >= stream->runtime->fragments) in snd_compr_task_new()
1071 task->seqno = utask->seqno = snd_compr_seqno_next(stream); in snd_compr_task_new()
1073 retval = stream->ops->task_create(stream, task); in snd_compr_task_new()
1097 list_add_tail(&task->list, &stream->runtime->tasks); in snd_compr_task_new()
1098 stream->runtime->total_tasks++; in snd_compr_task_new()
1105 static int snd_compr_task_create(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_task_create() argument
1110 if (stream->runtime->state != SNDRV_PCM_STATE_SETUP) in snd_compr_task_create()
1115 retval = snd_compr_task_new(stream, task); in snd_compr_task_create()
1137 static int snd_compr_task_start(struct snd_compr_stream *stream, struct snd_compr_task *utask) in snd_compr_task_start() argument
1143 task = snd_compr_find_task(stream, utask->origin_seqno); in snd_compr_task_start()
1147 task->seqno = utask->seqno = snd_compr_seqno_next(stream); in snd_compr_task_start()
1149 list_move_tail(&task->list, &stream->runtime->tasks); in snd_compr_task_start()
1151 task = snd_compr_find_task(stream, utask->seqno); in snd_compr_task_start()
1158 retval = stream->ops->task_start(stream, task); in snd_compr_task_start()
1161 stream->runtime->active_tasks++; in snd_compr_task_start()
1166 static int snd_compr_task_start_ioctl(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_task_start_ioctl() argument
1171 if (stream->runtime->state != SNDRV_PCM_STATE_SETUP) in snd_compr_task_start_ioctl()
1176 retval = snd_compr_task_start(stream, task); in snd_compr_task_start_ioctl()
1183 static void snd_compr_task_stop_one(struct snd_compr_stream *stream, in snd_compr_task_stop_one() argument
1188 stream->ops->task_stop(stream, task); in snd_compr_task_stop_one()
1189 if (!snd_BUG_ON(stream->runtime->active_tasks == 0)) in snd_compr_task_stop_one()
1190 stream->runtime->active_tasks--; in snd_compr_task_stop_one()
1191 list_move_tail(&task->list, &stream->runtime->tasks); in snd_compr_task_stop_one()
1195 static void snd_compr_task_free_one(struct snd_compr_stream *stream, in snd_compr_task_free_one() argument
1198 snd_compr_task_stop_one(stream, task); in snd_compr_task_free_one()
1199 stream->ops->task_free(stream, task); in snd_compr_task_free_one()
1202 stream->runtime->total_tasks--; in snd_compr_task_free_one()
1205 static void snd_compr_task_free_all(struct snd_compr_stream *stream) in snd_compr_task_free_all() argument
1209 list_for_each_entry_safe_reverse(task, temp, &stream->runtime->tasks, list) in snd_compr_task_free_all()
1210 snd_compr_task_free_one(stream, task); in snd_compr_task_free_all()
1213 typedef void (*snd_compr_seq_func_t)(struct snd_compr_stream *stream,
1216 static int snd_compr_task_seq(struct snd_compr_stream *stream, unsigned long arg, in snd_compr_task_seq() argument
1223 if (stream->runtime->state != SNDRV_PCM_STATE_SETUP) in snd_compr_task_seq()
1230 list_for_each_entry_safe_reverse(task, temp, &stream->runtime->tasks, list) in snd_compr_task_seq()
1231 fcn(stream, task); in snd_compr_task_seq()
1233 task = snd_compr_find_task(stream, seqno); in snd_compr_task_seq()
1237 fcn(stream, task); in snd_compr_task_seq()
1243 static int snd_compr_task_status(struct snd_compr_stream *stream, in snd_compr_task_status() argument
1248 task = snd_compr_find_task(stream, status->seqno); in snd_compr_task_status()
1257 static int snd_compr_task_status_ioctl(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_task_status_ioctl() argument
1262 if (stream->runtime->state != SNDRV_PCM_STATE_SETUP) in snd_compr_task_status_ioctl()
1267 retval = snd_compr_task_status(stream, status); in snd_compr_task_status_ioctl()
1281 void snd_compr_task_finished(struct snd_compr_stream *stream, in snd_compr_task_finished() argument
1284 guard(mutex)(&stream->device->lock); in snd_compr_task_finished()
1285 if (!snd_BUG_ON(stream->runtime->active_tasks == 0)) in snd_compr_task_finished()
1286 stream->runtime->active_tasks--; in snd_compr_task_finished()
1288 wake_up(&stream->runtime->sleep); in snd_compr_task_finished()
1298 struct snd_compr_stream *stream; in snd_compr_ioctl() local
1303 stream = &data->stream; in snd_compr_ioctl()
1305 guard(mutex)(&stream->device->lock); in snd_compr_ioctl()
1311 return snd_compr_get_caps(stream, arg); in snd_compr_ioctl()
1314 return snd_compr_get_codec_caps(stream, arg); in snd_compr_ioctl()
1317 return snd_compr_set_params(stream, arg); in snd_compr_ioctl()
1319 return snd_compr_get_params(stream, arg); in snd_compr_ioctl()
1321 return snd_compr_set_metadata(stream, arg); in snd_compr_ioctl()
1323 return snd_compr_get_metadata(stream, arg); in snd_compr_ioctl()
1326 if (stream->direction == SND_COMPRESS_ACCEL) { in snd_compr_ioctl()
1330 return snd_compr_task_create(stream, arg); in snd_compr_ioctl()
1332 return snd_compr_task_seq(stream, arg, snd_compr_task_free_one); in snd_compr_ioctl()
1334 return snd_compr_task_start_ioctl(stream, arg); in snd_compr_ioctl()
1336 return snd_compr_task_seq(stream, arg, snd_compr_task_stop_one); in snd_compr_ioctl()
1338 return snd_compr_task_status_ioctl(stream, arg); in snd_compr_ioctl()
1346 return snd_compr_tstamp(stream, arg, true); in snd_compr_ioctl()
1348 return snd_compr_tstamp(stream, arg, false); in snd_compr_ioctl()
1350 return snd_compr_ioctl_avail(stream, arg, true); in snd_compr_ioctl()
1352 return snd_compr_ioctl_avail(stream, arg, false); in snd_compr_ioctl()
1354 return snd_compr_pause(stream); in snd_compr_ioctl()
1356 return snd_compr_resume(stream); in snd_compr_ioctl()
1358 return snd_compr_start(stream); in snd_compr_ioctl()
1360 return snd_compr_stop(stream); in snd_compr_ioctl()
1362 return snd_compr_drain(stream); in snd_compr_ioctl()
1364 return snd_compr_partial_drain(stream); in snd_compr_ioctl()
1366 return snd_compr_next_track(stream); in snd_compr_ioctl()