Lines Matching refs:pcm
2 * \file pcm/pcm_ioplug.c
50 static int snd_pcm_ioplug_drop(snd_pcm_t *pcm);
51 static int snd_pcm_ioplug_poll_descriptors_count(snd_pcm_t *pcm);
52 static int snd_pcm_ioplug_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space);
53 static int snd_pcm_ioplug_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);
57 static void snd_pcm_ioplug_hw_ptr_update(snd_pcm_t *pcm)
59 ioplug_priv_t *io = pcm->private_data;
72 pcm->boundary : pcm->buffer_size;
75 snd_pcm_mmap_hw_forward(io->data->pcm, delta);
78 avail = snd_pcm_mmap_avail(pcm);
79 if (avail >= pcm->buffer_size)
80 snd_pcm_ioplug_drop(pcm);
85 snd_pcm_ioplug_drop(pcm);
91 static int snd_pcm_ioplug_info(snd_pcm_t *pcm, snd_pcm_info_t *info)
94 info->stream = pcm->stream;
96 if (pcm->name) {
97 snd_strlcpy((char *)info->id, pcm->name, sizeof(info->id));
98 snd_strlcpy((char *)info->name, pcm->name, sizeof(info->name));
99 snd_strlcpy((char *)info->subname, pcm->name, sizeof(info->subname));
105 static int snd_pcm_ioplug_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *info)
107 return snd_pcm_channel_info_shm(pcm, info, -1);
110 static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
112 ioplug_priv_t *io = pcm->private_data;
118 snd_pcm_ioplug_hw_ptr_update(pcm);
119 *delayp = snd_pcm_mmap_delay(pcm);
124 static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
126 ioplug_priv_t *io = pcm->private_data;
130 snd_pcm_ioplug_hw_ptr_update(pcm);
133 gettimestamp(&status->tstamp, pcm->tstamp_type);
134 status->avail = snd_pcm_mmap_avail(pcm);
136 status->appl_ptr = *pcm->appl.ptr;
137 status->hw_ptr = *pcm->hw.ptr;
138 if (snd_pcm_ioplug_delay(pcm, &sd) < 0)
139 sd = snd_pcm_mmap_delay(pcm);
144 static snd_pcm_state_t snd_pcm_ioplug_state(snd_pcm_t *pcm)
146 ioplug_priv_t *io = pcm->private_data;
150 static int snd_pcm_ioplug_hwsync(snd_pcm_t *pcm)
152 snd_pcm_ioplug_hw_ptr_update(pcm);
156 static int snd_pcm_ioplug_reset(snd_pcm_t *pcm)
158 ioplug_priv_t *io = pcm->private_data;
167 static int snd_pcm_ioplug_prepare(snd_pcm_t *pcm)
169 ioplug_priv_t *io = pcm->private_data;
172 snd_pcm_ioplug_reset(pcm);
174 snd_pcm_unlock(pcm); /* to avoid deadlock */
176 snd_pcm_lock(pcm);
285 static int snd_pcm_ioplug_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
288 ioplug_priv_t *io = pcm->private_data;
314 err = snd_pcm_hw_refine_soft(pcm, params);
431 static int snd_pcm_ioplug_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
433 ioplug_priv_t *io = pcm->private_data;
456 static int snd_pcm_ioplug_hw_free(snd_pcm_t *pcm)
458 ioplug_priv_t *io = pcm->private_data;
465 static int snd_pcm_ioplug_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
467 ioplug_priv_t *io = pcm->private_data;
473 snd_pcm_unlock(pcm); /* to avoid deadlock */
475 snd_pcm_lock(pcm);
481 static int snd_pcm_ioplug_start(snd_pcm_t *pcm)
483 ioplug_priv_t *io = pcm->private_data;
493 gettimestamp(&io->trigger_tstamp, pcm->tstamp_type);
499 static int snd_pcm_ioplug_drop(snd_pcm_t *pcm)
501 ioplug_priv_t *io = pcm->private_data;
508 gettimestamp(&io->trigger_tstamp, pcm->tstamp_type);
514 static int ioplug_drain_via_poll(snd_pcm_t *pcm)
516 ioplug_priv_t *io = pcm->private_data;
519 snd_pcm_ioplug_hw_ptr_update(pcm);
525 if (snd_pcm_wait_nocheck(pcm, SND_PCM_WAIT_DRAIN) < 0)
533 static int snd_pcm_ioplug_drain(snd_pcm_t *pcm)
535 ioplug_priv_t *io = pcm->private_data;
538 snd_pcm_lock(pcm);
543 snd_pcm_unlock(pcm);
546 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
548 err = snd_pcm_ioplug_start(pcm);
564 snd_pcm_unlock(pcm); /* let plugin own locking */
566 snd_pcm_lock(pcm);
568 err = ioplug_drain_via_poll(pcm);
574 snd_pcm_ioplug_drop(pcm);
575 snd_pcm_unlock(pcm);
579 static int snd_pcm_ioplug_pause(snd_pcm_t *pcm, int enable)
581 ioplug_priv_t *io = pcm->private_data;
600 static snd_pcm_sframes_t snd_pcm_ioplug_rewindable(snd_pcm_t *pcm)
602 return snd_pcm_mmap_hw_rewindable(pcm);
605 static snd_pcm_sframes_t snd_pcm_ioplug_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
607 snd_pcm_mmap_appl_backward(pcm, frames);
611 static snd_pcm_sframes_t snd_pcm_ioplug_forwardable(snd_pcm_t *pcm)
613 return snd_pcm_mmap_avail(pcm);
616 static snd_pcm_sframes_t snd_pcm_ioplug_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
618 snd_pcm_mmap_appl_forward(pcm, frames);
623 static int snd_pcm_ioplug_resume(snd_pcm_t *pcm)
625 ioplug_priv_t *io = pcm->private_data;
633 static snd_pcm_sframes_t ioplug_priv_transfer_areas(snd_pcm_t *pcm,
638 ioplug_priv_t *io = pcm->private_data;
648 snd_pcm_mmap_appl_forward(pcm, result);
652 static snd_pcm_sframes_t snd_pcm_ioplug_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size)
654 if (pcm->mmap_rw)
655 return snd_pcm_mmap_writei(pcm, buffer, size);
657 snd_pcm_channel_area_t areas[pcm->channels];
658 snd_pcm_areas_from_buf(pcm, areas, (void*)buffer);
659 return snd_pcm_write_areas(pcm, areas, 0, size,
664 static snd_pcm_sframes_t snd_pcm_ioplug_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
666 if (pcm->mmap_rw)
667 return snd_pcm_mmap_writen(pcm, bufs, size);
669 snd_pcm_channel_area_t areas[pcm->channels];
670 snd_pcm_areas_from_bufs(pcm, areas, bufs);
671 return snd_pcm_write_areas(pcm, areas, 0, size,
676 static snd_pcm_sframes_t snd_pcm_ioplug_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size)
678 if (pcm->mmap_rw)
679 return snd_pcm_mmap_readi(pcm, buffer, size);
681 snd_pcm_channel_area_t areas[pcm->channels];
682 snd_pcm_areas_from_buf(pcm, areas, buffer);
683 return snd_pcm_read_areas(pcm, areas, 0, size,
688 static snd_pcm_sframes_t snd_pcm_ioplug_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
690 if (pcm->mmap_rw)
691 return snd_pcm_mmap_readn(pcm, bufs, size);
693 snd_pcm_channel_area_t areas[pcm->channels];
694 snd_pcm_areas_from_bufs(pcm, areas, bufs);
695 return snd_pcm_read_areas(pcm, areas, 0, size,
700 static int snd_pcm_ioplug_mmap_begin_capture(snd_pcm_t *pcm,
705 ioplug_priv_t *io = pcm->private_data;
708 err = __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
713 pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
714 pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
724 static int snd_pcm_ioplug_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
727 if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
728 return __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
729 return snd_pcm_ioplug_mmap_begin_capture(pcm, areas, offset, frames);
732 static snd_pcm_sframes_t snd_pcm_ioplug_mmap_commit(snd_pcm_t *pcm,
736 if (pcm->stream == SND_PCM_STREAM_PLAYBACK &&
737 pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
738 pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
742 __snd_pcm_mmap_begin_generic(pcm, &areas, &ofs, &frames);
745 return ioplug_priv_transfer_areas(pcm, areas, offset, frames);
748 snd_pcm_mmap_appl_forward(pcm, size);
752 static snd_pcm_sframes_t snd_pcm_ioplug_avail_update(snd_pcm_t *pcm)
754 ioplug_priv_t *io = pcm->private_data;
757 snd_pcm_ioplug_hw_ptr_update(pcm);
761 avail = snd_pcm_mmap_avail(pcm);
767 static int snd_pcm_ioplug_nonblock(snd_pcm_t *pcm, int nonblock)
769 ioplug_priv_t *io = pcm->private_data;
775 static int snd_pcm_ioplug_poll_descriptors_count(snd_pcm_t *pcm)
777 ioplug_priv_t *io = pcm->private_data;
781 snd_pcm_unlock(pcm); /* to avoid deadlock */
783 snd_pcm_lock(pcm);
788 static int snd_pcm_ioplug_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space)
790 ioplug_priv_t *io = pcm->private_data;
794 snd_pcm_unlock(pcm); /* to avoid deadlock */
796 snd_pcm_lock(pcm);
799 if (pcm->poll_fd < 0)
802 pfds->fd = pcm->poll_fd;
803 pfds->events = pcm->poll_events | POLLERR | POLLNVAL;
810 static int snd_pcm_ioplug_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
812 ioplug_priv_t *io = pcm->private_data;
816 snd_pcm_unlock(pcm); /* to avoid deadlock */
818 snd_pcm_lock(pcm);
826 static int snd_pcm_ioplug_mmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
831 static int snd_pcm_ioplug_async(snd_pcm_t *pcm ATTRIBUTE_UNUSED,
838 static int snd_pcm_ioplug_munmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
843 static snd_pcm_chmap_query_t **snd_pcm_ioplug_query_chmaps(snd_pcm_t *pcm)
845 ioplug_priv_t *io = pcm->private_data;
853 static snd_pcm_chmap_t *snd_pcm_ioplug_get_chmap(snd_pcm_t *pcm)
855 ioplug_priv_t *io = pcm->private_data;
863 static int snd_pcm_ioplug_set_chmap(snd_pcm_t *pcm, const snd_pcm_chmap_t *map)
865 ioplug_priv_t *io = pcm->private_data;
873 static void snd_pcm_ioplug_dump(snd_pcm_t *pcm, snd_output_t *out)
875 ioplug_priv_t *io = pcm->private_data;
884 if (pcm->setup) {
886 snd_pcm_dump_setup(pcm, out);
898 static int snd_pcm_ioplug_close(snd_pcm_t *pcm)
900 ioplug_priv_t *io = pcm->private_data;
1008 The rest fields are filled by #snd_pcm_ioplug_create(). The pcm field
1079 snd_pcm_t *pcm;
1102 err = snd_pcm_new(&pcm, SND_PCM_TYPE_IOPLUG, name, stream, mode);
1108 ioplug->pcm = pcm;
1109 pcm->ops = &snd_pcm_ioplug_ops;
1110 pcm->fast_ops = &snd_pcm_ioplug_fast_ops;
1111 pcm->private_data = io;
1113 snd_pcm_set_hw_ptr(pcm, &ioplug->hw_ptr, -1, 0);
1114 snd_pcm_set_appl_ptr(pcm, &ioplug->appl_ptr, -1, 0);
1128 return snd_pcm_close(ioplug->pcm);
1140 ioplug_priv_t *io = ioplug->pcm->private_data;
1157 ioplug_priv_t *io = ioplug->pcm->private_data;
1181 ioplug_priv_t *io = ioplug->pcm->private_data;
1206 ioplug->pcm->poll_fd = ioplug->poll_fd;
1207 ioplug->pcm->poll_events = ioplug->poll_events;
1209 ioplug->pcm->tstamp_type = SND_PCM_TSTAMP_TYPE_MONOTONIC;
1211 ioplug->pcm->tstamp_type = SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY;
1212 ioplug->pcm->mmap_rw = ioplug->mmap_rw;
1227 return snd_pcm_mmap_areas(ioplug->pcm);
1259 return __snd_pcm_avail(ioplug->pcm, hw_ptr, appl_ptr);
1281 if (user_avail > ioplug->pcm->buffer_size) {
1286 return ioplug->pcm->buffer_size - user_avail;