Lines Matching refs:stream

65 	struct snd_compr_stream stream;  member
121 data->stream.ops = compr->ops; in snd_compr_open()
122 data->stream.direction = dirn; in snd_compr_open()
123 data->stream.private_data = compr->private_data; in snd_compr_open()
124 data->stream.device = compr; in snd_compr_open()
133 data->stream.runtime = runtime; in snd_compr_open()
136 ret = compr->ops->open(&data->stream); in snd_compr_open()
149 struct snd_compr_runtime *runtime = data->stream.runtime; in snd_compr_free()
155 data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP); in snd_compr_free()
161 data->stream.ops->free(&data->stream); in snd_compr_free()
162 kfree(data->stream.runtime->buffer); in snd_compr_free()
163 kfree(data->stream.runtime); in snd_compr_free()
168 static int snd_compr_update_tstamp(struct snd_compr_stream *stream, in snd_compr_update_tstamp() argument
171 if (!stream->ops->pointer) in snd_compr_update_tstamp()
173 stream->ops->pointer(stream, tstamp); in snd_compr_update_tstamp()
176 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_update_tstamp()
177 stream->runtime->total_bytes_transferred = tstamp->copied_total; in snd_compr_update_tstamp()
179 stream->runtime->total_bytes_available = tstamp->copied_total; in snd_compr_update_tstamp()
183 static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, in snd_compr_calc_avail() argument
187 snd_compr_update_tstamp(stream, &avail->tstamp); in snd_compr_calc_avail()
190 if (stream->runtime->total_bytes_available == 0 && in snd_compr_calc_avail()
191 stream->runtime->state == SNDRV_PCM_STATE_SETUP && in snd_compr_calc_avail()
192 stream->direction == SND_COMPRESS_PLAYBACK) { in snd_compr_calc_avail()
194 return stream->runtime->buffer_size; in snd_compr_calc_avail()
197 stream->runtime->total_bytes_available, in snd_compr_calc_avail()
198 stream->runtime->total_bytes_transferred); in snd_compr_calc_avail()
199 if (stream->runtime->total_bytes_available == in snd_compr_calc_avail()
200 stream->runtime->total_bytes_transferred) { in snd_compr_calc_avail()
201 if (stream->direction == SND_COMPRESS_PLAYBACK) { in snd_compr_calc_avail()
203 return stream->runtime->buffer_size; in snd_compr_calc_avail()
210 avail->avail = stream->runtime->total_bytes_available - in snd_compr_calc_avail()
211 stream->runtime->total_bytes_transferred; in snd_compr_calc_avail()
212 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_calc_avail()
213 avail->avail = stream->runtime->buffer_size - avail->avail; in snd_compr_calc_avail()
219 static inline size_t snd_compr_get_avail(struct snd_compr_stream *stream) in snd_compr_get_avail() argument
223 return snd_compr_calc_avail(stream, &avail); in snd_compr_get_avail()
227 snd_compr_ioctl_avail(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_ioctl_avail() argument
232 avail = snd_compr_calc_avail(stream, &ioctl_avail); in snd_compr_ioctl_avail()
241 static int snd_compr_write_data(struct snd_compr_stream *stream, in snd_compr_write_data() argument
246 struct snd_compr_runtime *runtime = stream->runtime; in snd_compr_write_data()
267 if (stream->ops->ack) in snd_compr_write_data()
268 stream->ops->ack(stream, count); in snd_compr_write_data()
276 struct snd_compr_stream *stream; in snd_compr_write() local
283 stream = &data->stream; in snd_compr_write()
284 mutex_lock(&stream->device->lock); in snd_compr_write()
286 if (stream->runtime->state != SNDRV_PCM_STATE_SETUP && in snd_compr_write()
287 stream->runtime->state != SNDRV_PCM_STATE_RUNNING) { in snd_compr_write()
288 mutex_unlock(&stream->device->lock); in snd_compr_write()
292 avail = snd_compr_get_avail(stream); in snd_compr_write()
298 if (stream->ops->copy) { in snd_compr_write()
300 retval = stream->ops->copy(stream, cbuf, avail); in snd_compr_write()
302 retval = snd_compr_write_data(stream, buf, avail); in snd_compr_write()
305 stream->runtime->total_bytes_available += retval; in snd_compr_write()
309 if (stream->runtime->state == SNDRV_PCM_STATE_SETUP) { in snd_compr_write()
310 stream->runtime->state = SNDRV_PCM_STATE_PREPARED; in snd_compr_write()
314 mutex_unlock(&stream->device->lock); in snd_compr_write()
323 struct snd_compr_stream *stream; in snd_compr_read() local
330 stream = &data->stream; in snd_compr_read()
331 mutex_lock(&stream->device->lock); in snd_compr_read()
337 switch (stream->runtime->state) { in snd_compr_read()
347 avail = snd_compr_get_avail(stream); in snd_compr_read()
353 if (stream->ops->copy) { in snd_compr_read()
354 retval = stream->ops->copy(stream, buf, avail); in snd_compr_read()
360 stream->runtime->total_bytes_transferred += retval; in snd_compr_read()
363 mutex_unlock(&stream->device->lock); in snd_compr_read()
372 static inline int snd_compr_get_poll(struct snd_compr_stream *stream) in snd_compr_get_poll() argument
374 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_get_poll()
383 struct snd_compr_stream *stream; in snd_compr_poll() local
389 stream = &data->stream; in snd_compr_poll()
390 if (snd_BUG_ON(!stream)) in snd_compr_poll()
393 mutex_lock(&stream->device->lock); in snd_compr_poll()
394 if (stream->runtime->state == SNDRV_PCM_STATE_OPEN) { in snd_compr_poll()
398 poll_wait(f, &stream->runtime->sleep, wait); in snd_compr_poll()
400 avail = snd_compr_get_avail(stream); in snd_compr_poll()
403 switch (stream->runtime->state) { in snd_compr_poll()
408 retval = snd_compr_get_poll(stream); in snd_compr_poll()
409 stream->runtime->state = SNDRV_PCM_STATE_SETUP; in snd_compr_poll()
414 if (avail >= stream->runtime->fragment_size) in snd_compr_poll()
415 retval = snd_compr_get_poll(stream); in snd_compr_poll()
418 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_poll()
425 mutex_unlock(&stream->device->lock); in snd_compr_poll()
430 snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_caps() argument
435 if (!stream->ops->get_caps) in snd_compr_get_caps()
439 retval = stream->ops->get_caps(stream, &caps); in snd_compr_get_caps()
450 snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_codec_caps() argument
455 if (!stream->ops->get_codec_caps) in snd_compr_get_codec_caps()
462 retval = stream->ops->get_codec_caps(stream, caps); in snd_compr_get_codec_caps()
475 static int snd_compr_allocate_buffer(struct snd_compr_stream *stream, in snd_compr_allocate_buffer() argument
482 if (stream->ops->copy) { in snd_compr_allocate_buffer()
492 stream->runtime->fragment_size = params->buffer.fragment_size; in snd_compr_allocate_buffer()
493 stream->runtime->fragments = params->buffer.fragments; in snd_compr_allocate_buffer()
494 stream->runtime->buffer = buffer; in snd_compr_allocate_buffer()
495 stream->runtime->buffer_size = buffer_size; in snd_compr_allocate_buffer()
517 snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_set_params() argument
522 if (stream->runtime->state == SNDRV_PCM_STATE_OPEN) { in snd_compr_set_params()
539 retval = snd_compr_allocate_buffer(stream, params); in snd_compr_set_params()
545 retval = stream->ops->set_params(stream, params); in snd_compr_set_params()
549 stream->metadata_set = false; in snd_compr_set_params()
550 stream->next_track = false; in snd_compr_set_params()
552 if (stream->direction == SND_COMPRESS_PLAYBACK) in snd_compr_set_params()
553 stream->runtime->state = SNDRV_PCM_STATE_SETUP; in snd_compr_set_params()
555 stream->runtime->state = SNDRV_PCM_STATE_PREPARED; in snd_compr_set_params()
565 snd_compr_get_params(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_params() argument
570 if (!stream->ops->get_params) in snd_compr_get_params()
576 retval = stream->ops->get_params(stream, params); in snd_compr_get_params()
588 snd_compr_get_metadata(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_get_metadata() argument
593 if (!stream->ops->get_metadata) in snd_compr_get_metadata()
599 retval = stream->ops->get_metadata(stream, &metadata); in snd_compr_get_metadata()
610 snd_compr_set_metadata(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_set_metadata() argument
615 if (!stream->ops->set_metadata) in snd_compr_set_metadata()
624 retval = stream->ops->set_metadata(stream, &metadata); in snd_compr_set_metadata()
625 stream->metadata_set = true; in snd_compr_set_metadata()
631 snd_compr_tstamp(struct snd_compr_stream *stream, unsigned long arg) in snd_compr_tstamp() argument
636 ret = snd_compr_update_tstamp(stream, &tstamp); in snd_compr_tstamp()
643 static int snd_compr_pause(struct snd_compr_stream *stream) in snd_compr_pause() argument
647 if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) in snd_compr_pause()
649 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_PUSH); in snd_compr_pause()
651 stream->runtime->state = SNDRV_PCM_STATE_PAUSED; in snd_compr_pause()
655 static int snd_compr_resume(struct snd_compr_stream *stream) in snd_compr_resume() argument
659 if (stream->runtime->state != SNDRV_PCM_STATE_PAUSED) in snd_compr_resume()
661 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_PAUSE_RELEASE); in snd_compr_resume()
663 stream->runtime->state = SNDRV_PCM_STATE_RUNNING; in snd_compr_resume()
667 static int snd_compr_start(struct snd_compr_stream *stream) in snd_compr_start() argument
671 if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED) in snd_compr_start()
673 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START); in snd_compr_start()
675 stream->runtime->state = SNDRV_PCM_STATE_RUNNING; in snd_compr_start()
679 static int snd_compr_stop(struct snd_compr_stream *stream) in snd_compr_stop() argument
683 if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || in snd_compr_stop()
684 stream->runtime->state == SNDRV_PCM_STATE_SETUP) in snd_compr_stop()
686 retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); in snd_compr_stop()
688 snd_compr_drain_notify(stream); in snd_compr_stop()
689 stream->runtime->total_bytes_available = 0; in snd_compr_stop()
690 stream->runtime->total_bytes_transferred = 0; in snd_compr_stop()
695 static int snd_compress_wait_for_drain(struct snd_compr_stream *stream) in snd_compress_wait_for_drain() argument
707 stream->runtime->state = SNDRV_PCM_STATE_DRAINING; in snd_compress_wait_for_drain()
708 mutex_unlock(&stream->device->lock); in snd_compress_wait_for_drain()
716 ret = wait_event_interruptible(stream->runtime->sleep, in snd_compress_wait_for_drain()
717 (stream->runtime->state != SNDRV_PCM_STATE_DRAINING)); in snd_compress_wait_for_drain()
724 wake_up(&stream->runtime->sleep); in snd_compress_wait_for_drain()
725 mutex_lock(&stream->device->lock); in snd_compress_wait_for_drain()
730 static int snd_compr_drain(struct snd_compr_stream *stream) in snd_compr_drain() argument
734 if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || in snd_compr_drain()
735 stream->runtime->state == SNDRV_PCM_STATE_SETUP) in snd_compr_drain()
738 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); in snd_compr_drain()
741 wake_up(&stream->runtime->sleep); in snd_compr_drain()
745 return snd_compress_wait_for_drain(stream); in snd_compr_drain()
748 static int snd_compr_next_track(struct snd_compr_stream *stream) in snd_compr_next_track() argument
753 if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) in snd_compr_next_track()
759 if (stream->metadata_set == false) in snd_compr_next_track()
762 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_NEXT_TRACK); in snd_compr_next_track()
765 stream->metadata_set = false; in snd_compr_next_track()
766 stream->next_track = true; in snd_compr_next_track()
770 static int snd_compr_partial_drain(struct snd_compr_stream *stream) in snd_compr_partial_drain() argument
773 if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || in snd_compr_partial_drain()
774 stream->runtime->state == SNDRV_PCM_STATE_SETUP) in snd_compr_partial_drain()
777 if (stream->next_track == false) in snd_compr_partial_drain()
780 retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN); in snd_compr_partial_drain()
783 wake_up(&stream->runtime->sleep); in snd_compr_partial_drain()
787 stream->next_track = false; in snd_compr_partial_drain()
788 return snd_compress_wait_for_drain(stream); in snd_compr_partial_drain()
794 struct snd_compr_stream *stream; in snd_compr_ioctl() local
799 stream = &data->stream; in snd_compr_ioctl()
800 if (snd_BUG_ON(!stream)) in snd_compr_ioctl()
802 mutex_lock(&stream->device->lock); in snd_compr_ioctl()
809 retval = snd_compr_get_caps(stream, arg); in snd_compr_ioctl()
813 retval = snd_compr_get_codec_caps(stream, arg); in snd_compr_ioctl()
817 retval = snd_compr_set_params(stream, arg); in snd_compr_ioctl()
820 retval = snd_compr_get_params(stream, arg); in snd_compr_ioctl()
823 retval = snd_compr_set_metadata(stream, arg); in snd_compr_ioctl()
826 retval = snd_compr_get_metadata(stream, arg); in snd_compr_ioctl()
829 retval = snd_compr_tstamp(stream, arg); in snd_compr_ioctl()
832 retval = snd_compr_ioctl_avail(stream, arg); in snd_compr_ioctl()
835 retval = snd_compr_pause(stream); in snd_compr_ioctl()
838 retval = snd_compr_resume(stream); in snd_compr_ioctl()
841 retval = snd_compr_start(stream); in snd_compr_ioctl()
844 retval = snd_compr_stop(stream); in snd_compr_ioctl()
847 retval = snd_compr_drain(stream); in snd_compr_ioctl()
850 retval = snd_compr_partial_drain(stream); in snd_compr_ioctl()
853 retval = snd_compr_next_track(stream); in snd_compr_ioctl()
857 mutex_unlock(&stream->device->lock); in snd_compr_ioctl()