Lines Matching refs:stream

67 	struct snd_compr_stream stream;  member
129 INIT_DELAYED_WORK(&data->stream.error_work, error_delayed_work); in snd_compr_open()
131 data->stream.ops = compr->ops; in snd_compr_open()
132 data->stream.direction = dirn; in snd_compr_open()
133 data->stream.private_data = compr->private_data; in snd_compr_open()
134 data->stream.device = compr; in snd_compr_open()
143 data->stream.runtime = runtime; in snd_compr_open()
146 ret = compr->ops->open(&data->stream); in snd_compr_open()
159 struct snd_compr_runtime *runtime = data->stream.runtime; in snd_compr_free()
161 cancel_delayed_work_sync(&data->stream.error_work); in snd_compr_free()
167 data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP); in snd_compr_free()
173 data->stream.ops->free(&data->stream); in snd_compr_free()
174 kfree(data->stream.runtime->buffer); in snd_compr_free()
175 kfree(data->stream.runtime); in snd_compr_free()
180 static int snd_compr_update_tstamp(struct snd_compr_stream *stream, in snd_compr_update_tstamp() argument
183 if (!stream->ops->pointer) in snd_compr_update_tstamp()
185 stream->ops->pointer(stream, tstamp); in snd_compr_update_tstamp()
188 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_update_tstamp()
189 stream->runtime->total_bytes_transferred = tstamp->copied_total; in snd_compr_update_tstamp()
191 stream->runtime->total_bytes_available = tstamp->copied_total; in snd_compr_update_tstamp()
195 static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, in snd_compr_calc_avail() argument
199 snd_compr_update_tstamp(stream, &avail->tstamp); in snd_compr_calc_avail()
202 if (stream->runtime->total_bytes_available == 0 && in snd_compr_calc_avail()
203 stream->runtime->state == SNDRV_PCM_STATE_SETUP && in snd_compr_calc_avail()
204 stream->direction == SND_COMPRESS_PLAYBACK) { in snd_compr_calc_avail()
206 return stream->runtime->buffer_size; in snd_compr_calc_avail()
209 stream->runtime->total_bytes_available, in snd_compr_calc_avail()
210 stream->runtime->total_bytes_transferred); in snd_compr_calc_avail()
211 if (stream->runtime->total_bytes_available == in snd_compr_calc_avail()
212 stream->runtime->total_bytes_transferred) { in snd_compr_calc_avail()
213 if (stream->direction == SND_COMPRESS_PLAYBACK) { in snd_compr_calc_avail()
215 return stream->runtime->buffer_size; in snd_compr_calc_avail()
222 avail->avail = stream->runtime->total_bytes_available - in snd_compr_calc_avail()
223 stream->runtime->total_bytes_transferred; in snd_compr_calc_avail()
224 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_calc_avail()
225 avail->avail = stream->runtime->buffer_size - avail->avail; in snd_compr_calc_avail()
231 static inline size_t snd_compr_get_avail(struct snd_compr_stream *stream) in snd_compr_get_avail() argument
235 return snd_compr_calc_avail(stream, &avail); in snd_compr_get_avail()
239 snd_compr_ioctl_avail(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_ioctl_avail() argument
244 avail = snd_compr_calc_avail(stream, &ioctl_avail); in snd_compr_ioctl_avail()
247 switch (stream->runtime->state) { in snd_compr_ioctl_avail()
262 static int snd_compr_write_data(struct snd_compr_stream *stream, in snd_compr_write_data() argument
267 struct snd_compr_runtime *runtime = stream->runtime; in snd_compr_write_data()
288 if (stream->ops->ack) in snd_compr_write_data()
289 stream->ops->ack(stream, count); in snd_compr_write_data()
297 struct snd_compr_stream *stream; in snd_compr_write() local
304 stream = &data->stream; in snd_compr_write()
305 mutex_lock(&stream->device->lock); in snd_compr_write()
307 switch (stream->runtime->state) { in snd_compr_write()
313 mutex_unlock(&stream->device->lock); in snd_compr_write()
317 avail = snd_compr_get_avail(stream); in snd_compr_write()
323 if (stream->ops->copy) { in snd_compr_write()
325 retval = stream->ops->copy(stream, cbuf, avail); in snd_compr_write()
327 retval = snd_compr_write_data(stream, buf, avail); in snd_compr_write()
330 stream->runtime->total_bytes_available += retval; in snd_compr_write()
334 if (stream->runtime->state == SNDRV_PCM_STATE_SETUP) { in snd_compr_write()
335 stream->runtime->state = SNDRV_PCM_STATE_PREPARED; in snd_compr_write()
339 mutex_unlock(&stream->device->lock); in snd_compr_write()
348 struct snd_compr_stream *stream; in snd_compr_read() local
355 stream = &data->stream; in snd_compr_read()
356 mutex_lock(&stream->device->lock); in snd_compr_read()
362 switch (stream->runtime->state) { in snd_compr_read()
374 avail = snd_compr_get_avail(stream); in snd_compr_read()
380 if (stream->ops->copy) { in snd_compr_read()
381 retval = stream->ops->copy(stream, buf, avail); in snd_compr_read()
387 stream->runtime->total_bytes_transferred += retval; in snd_compr_read()
390 mutex_unlock(&stream->device->lock); in snd_compr_read()
399 static __poll_t snd_compr_get_poll(struct snd_compr_stream *stream) in snd_compr_get_poll() argument
401 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_get_poll()
410 struct snd_compr_stream *stream; in snd_compr_poll() local
417 stream = &data->stream; in snd_compr_poll()
419 mutex_lock(&stream->device->lock); in snd_compr_poll()
421 switch (stream->runtime->state) { in snd_compr_poll()
424 retval = snd_compr_get_poll(stream) | EPOLLERR; in snd_compr_poll()
430 poll_wait(f, &stream->runtime->sleep, wait); in snd_compr_poll()
432 avail = snd_compr_get_avail(stream); in snd_compr_poll()
435 switch (stream->runtime->state) { in snd_compr_poll()
440 retval = snd_compr_get_poll(stream); in snd_compr_poll()
441 stream->runtime->state = SNDRV_PCM_STATE_SETUP; in snd_compr_poll()
446 if (avail >= stream->runtime->fragment_size) in snd_compr_poll()
447 retval = snd_compr_get_poll(stream); in snd_compr_poll()
450 retval = snd_compr_get_poll(stream) | EPOLLERR; in snd_compr_poll()
454 mutex_unlock(&stream->device->lock); in snd_compr_poll()
459 snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_caps() argument
464 if (!stream->ops->get_caps) in snd_compr_get_caps()
468 retval = stream->ops->get_caps(stream, &caps); in snd_compr_get_caps()
479 snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_codec_caps() argument
484 if (!stream->ops->get_codec_caps) in snd_compr_get_codec_caps()
491 retval = stream->ops->get_codec_caps(stream, caps); in snd_compr_get_codec_caps()
504 static int snd_compr_allocate_buffer(struct snd_compr_stream *stream, in snd_compr_allocate_buffer() argument
511 if (stream->ops->copy) { in snd_compr_allocate_buffer()
521 stream->runtime->fragment_size = params->buffer.fragment_size; in snd_compr_allocate_buffer()
522 stream->runtime->fragments = params->buffer.fragments; in snd_compr_allocate_buffer()
523 stream->runtime->buffer = buffer; in snd_compr_allocate_buffer()
524 stream->runtime->buffer_size = buffer_size; in snd_compr_allocate_buffer()
546 snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_set_params() argument
551 if (stream->runtime->state == SNDRV_PCM_STATE_OPEN) { in snd_compr_set_params()
564 retval = snd_compr_allocate_buffer(stream, params); in snd_compr_set_params()
570 retval = stream->ops->set_params(stream, params); in snd_compr_set_params()
574 stream->metadata_set = false; in snd_compr_set_params()
575 stream->next_track = false; in snd_compr_set_params()
577 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_set_params()
578 stream->runtime->state = SNDRV_PCM_STATE_SETUP; in snd_compr_set_params()
580 stream->runtime->state = SNDRV_PCM_STATE_PREPARED; in snd_compr_set_params()
590 snd_compr_get_params(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_params() argument
595 if (!stream->ops->get_params) in snd_compr_get_params()
601 retval = stream->ops->get_params(stream, params); in snd_compr_get_params()
613 snd_compr_get_metadata(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_metadata() argument
618 if (!stream->ops->get_metadata) in snd_compr_get_metadata()
624 retval = stream->ops->get_metadata(stream, &metadata); in snd_compr_get_metadata()
635 snd_compr_set_metadata(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_set_metadata() argument
640 if (!stream->ops->set_metadata) in snd_compr_set_metadata()
649 retval = stream->ops->set_metadata(stream, &metadata); in snd_compr_set_metadata()
650 stream->metadata_set = true; in snd_compr_set_metadata()
656 snd_compr_tstamp(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_tstamp() argument
661 ret = snd_compr_update_tstamp(stream, &tstamp); in snd_compr_tstamp()
668 static int snd_compr_pause(struct snd_compr_stream *stream) in snd_compr_pause() argument
672 if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) in snd_compr_pause()
674 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_PUSH); in snd_compr_pause()
676 stream->runtime->state = SNDRV_PCM_STATE_PAUSED; in snd_compr_pause()
680 static int snd_compr_resume(struct snd_compr_stream *stream) in snd_compr_resume() argument
684 if (stream->runtime->state != SNDRV_PCM_STATE_PAUSED) in snd_compr_resume()
686 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_RELEASE); in snd_compr_resume()
688 stream->runtime->state = SNDRV_PCM_STATE_RUNNING; in snd_compr_resume()
692 static int snd_compr_start(struct snd_compr_stream *stream) in snd_compr_start() argument
696 if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED) in snd_compr_start()
698 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START); in snd_compr_start()
700 stream->runtime->state = SNDRV_PCM_STATE_RUNNING; in snd_compr_start()
704 static int snd_compr_stop(struct snd_compr_stream *stream) in snd_compr_stop() argument
708 if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || in snd_compr_stop()
709 stream->runtime->state == SNDRV_PCM_STATE_SETUP) in snd_compr_stop()
711 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); in snd_compr_stop()
713 snd_compr_drain_notify(stream); in snd_compr_stop()
714 stream->runtime->total_bytes_available = 0; in snd_compr_stop()
715 stream->runtime->total_bytes_transferred = 0; in snd_compr_stop()
722 struct snd_compr_stream *stream; in error_delayed_work() local
724 stream = container_of(work, struct snd_compr_stream, error_work.work); in error_delayed_work()
726 mutex_lock(&stream->device->lock); in error_delayed_work()
728 stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); in error_delayed_work()
729 wake_up(&stream->runtime->sleep); in error_delayed_work()
731 mutex_unlock(&stream->device->lock); in error_delayed_work()
743 int snd_compr_stop_error(struct snd_compr_stream *stream, in snd_compr_stop_error() argument
746 if (stream->runtime->state == state) in snd_compr_stop_error()
749 stream->runtime->state = state; in snd_compr_stop_error()
753 queue_delayed_work(system_power_efficient_wq, &stream->error_work, 0); in snd_compr_stop_error()
759 static int snd_compress_wait_for_drain(struct snd_compr_stream *stream) in snd_compress_wait_for_drain() argument
771 stream->runtime->state = SNDRV_PCM_STATE_DRAINING; in snd_compress_wait_for_drain()
772 mutex_unlock(&stream->device->lock); in snd_compress_wait_for_drain()
780 ret = wait_event_interruptible(stream->runtime->sleep, in snd_compress_wait_for_drain()
781 (stream->runtime->state != SNDRV_PCM_STATE_DRAINING)); in snd_compress_wait_for_drain()
788 wake_up(&stream->runtime->sleep); in snd_compress_wait_for_drain()
789 mutex_lock(&stream->device->lock); in snd_compress_wait_for_drain()
794 static int snd_compr_drain(struct snd_compr_stream *stream) in snd_compr_drain() argument
798 if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || in snd_compr_drain()
799 stream->runtime->state == SNDRV_PCM_STATE_SETUP) in snd_compr_drain()
802 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); in snd_compr_drain()
805 wake_up(&stream->runtime->sleep); in snd_compr_drain()
809 return snd_compress_wait_for_drain(stream); in snd_compr_drain()
812 static int snd_compr_next_track(struct snd_compr_stream *stream) in snd_compr_next_track() argument
817 if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) in snd_compr_next_track()
823 if (stream->metadata_set == false) in snd_compr_next_track()
826 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_NEXT_TRACK); in snd_compr_next_track()
829 stream->metadata_set = false; in snd_compr_next_track()
830 stream->next_track = true; in snd_compr_next_track()
834 static int snd_compr_partial_drain(struct snd_compr_stream *stream) in snd_compr_partial_drain() argument
837 if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || in snd_compr_partial_drain()
838 stream->runtime->state == SNDRV_PCM_STATE_SETUP) in snd_compr_partial_drain()
841 if (stream->next_track == false) in snd_compr_partial_drain()
844 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN); in snd_compr_partial_drain()
847 wake_up(&stream->runtime->sleep); in snd_compr_partial_drain()
851 stream->next_track = false; in snd_compr_partial_drain()
852 return snd_compress_wait_for_drain(stream); in snd_compr_partial_drain()
858 struct snd_compr_stream *stream; in snd_compr_ioctl() local
864 stream = &data->stream; in snd_compr_ioctl()
866 mutex_lock(&stream->device->lock); in snd_compr_ioctl()
873 retval = snd_compr_get_caps(stream, arg); in snd_compr_ioctl()
877 retval = snd_compr_get_codec_caps(stream, arg); in snd_compr_ioctl()
881 retval = snd_compr_set_params(stream, arg); in snd_compr_ioctl()
884 retval = snd_compr_get_params(stream, arg); in snd_compr_ioctl()
887 retval = snd_compr_set_metadata(stream, arg); in snd_compr_ioctl()
890 retval = snd_compr_get_metadata(stream, arg); in snd_compr_ioctl()
893 retval = snd_compr_tstamp(stream, arg); in snd_compr_ioctl()
896 retval = snd_compr_ioctl_avail(stream, arg); in snd_compr_ioctl()
899 retval = snd_compr_pause(stream); in snd_compr_ioctl()
902 retval = snd_compr_resume(stream); in snd_compr_ioctl()
905 retval = snd_compr_start(stream); in snd_compr_ioctl()
908 retval = snd_compr_stop(stream); in snd_compr_ioctl()
911 retval = snd_compr_drain(stream); in snd_compr_ioctl()
914 retval = snd_compr_partial_drain(stream); in snd_compr_ioctl()
917 retval = snd_compr_next_track(stream); in snd_compr_ioctl()
921 mutex_unlock(&stream->device->lock); in snd_compr_ioctl()