Lines Matching refs:pcm
2 * \file pcm/pcm_share.c
77 snd_pcm_t *pcm;
103 snd_pcm_t *pcm;
119 static void _snd_pcm_share_stop(snd_pcm_t *pcm, snd_pcm_state_t state);
124 snd_pcm_t *pcm = slave->pcm;
125 avail = slave->hw_ptr - *pcm->appl.ptr;
126 if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
127 avail += pcm->buffer_size;
129 avail += pcm->boundary;
130 else if ((snd_pcm_uframes_t) avail >= pcm->boundary)
131 avail -= pcm->boundary;
146 buffer_size = slave->pcm->buffer_size;
151 snd_pcm_t *pcm = share->pcm;
156 if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
162 avail = snd_pcm_mmap_avail(pcm);
197 static snd_pcm_uframes_t _snd_pcm_share_missing(snd_pcm_t *pcm)
199 snd_pcm_share_t *share = pcm->private_data;
201 snd_pcm_t *spcm = slave->pcm;
209 // printf("state=%s hw_ptr=%ld appl_ptr=%ld slave appl_ptr=%ld safety=%ld silence=%ld\n", snd_pcm_state_name(share->state), slave->hw_ptr, share->appl_ptr, *slave->pcm->appl_ptr, slave->safety_threshold, slave->silence_frames);
214 if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
221 avail = snd_pcm_mmap_avail(pcm);
222 if (avail >= pcm->stop_threshold) {
223 _snd_pcm_share_stop(pcm, share->state == SND_PCM_STATE_DRAINING ? SND_PCM_STATE_SETUP : SND_PCM_STATE_XRUN);
256 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
258 _snd_pcm_share_stop(pcm, SND_PCM_STATE_SETUP);
268 if (avail >= pcm->stop_threshold) {
269 _snd_pcm_share_stop(pcm, SND_PCM_STATE_XRUN);
272 snd_pcm_uframes_t xrun_missing = pcm->stop_threshold - avail;
276 ready_missing = pcm->avail_min - avail;
293 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
315 if (pcm->stream == SND_PCM_STREAM_PLAYBACK &&
328 snd_pcm_areas_silence(pcm->running_areas, offset, pcm->channels, frames, pcm->format);
350 /* snd_pcm_sframes_t avail = */ snd_pcm_avail_update(slave->pcm);
351 slave->hw_ptr = *slave->pcm->hw.ptr;
354 snd_pcm_t *pcm = share->pcm;
355 snd_pcm_uframes_t m = _snd_pcm_share_missing(pcm);
365 snd_pcm_t *spcm = slave->pcm;
428 static void _snd_pcm_share_update(snd_pcm_t *pcm)
430 snd_pcm_share_t *share = pcm->private_data;
432 snd_pcm_t *spcm = slave->pcm;
435 slave->hw_ptr = *slave->pcm->hw.ptr;
436 missing = _snd_pcm_share_missing(pcm);
467 static int snd_pcm_share_nonblock(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int nonblock ATTRIBUTE_UNUSED)
472 static int snd_pcm_share_async(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int sig ATTRIBUTE_UNUSED, pid_t pid ATTRIBUTE_UNUSED)
477 static int snd_pcm_share_info(snd_pcm_t *pcm, snd_pcm_info_t *info)
479 snd_pcm_share_t *share = pcm->private_data;
480 return snd_pcm_info(share->slave->pcm, info);
483 static int snd_pcm_share_hw_refine_cprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
485 snd_pcm_share_t *share = pcm->private_data;
527 static int snd_pcm_share_hw_refine_sprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *sparams)
529 snd_pcm_share_t *share = pcm->private_data;
540 static int snd_pcm_share_hw_refine_schange(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params,
570 static int snd_pcm_share_hw_refine_cchange(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params,
601 static int snd_pcm_share_hw_refine_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
603 snd_pcm_share_t *share = pcm->private_data;
604 return snd_pcm_hw_refine(share->slave->pcm, params);
607 static int snd_pcm_share_hw_params_slave(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
609 snd_pcm_share_t *share = pcm->private_data;
610 return _snd_pcm_hw_params_internal(share->slave->pcm, params);
613 static int snd_pcm_share_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
615 return snd_pcm_hw_refine_slave(pcm, params,
623 static int snd_pcm_share_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
625 snd_pcm_share_t *share = pcm->private_data;
627 snd_pcm_t *spcm = slave->pcm;
656 err = snd_pcm_hw_params_slave(pcm, params,
663 snd_pcm_sw_params_current(slave->pcm, &slave->sw_params);
665 slave->safety_threshold = slave->pcm->rate * 30 / 1000;
666 slave->safety_threshold += slave->pcm->period_size - 1;
667 slave->safety_threshold -= slave->safety_threshold % slave->pcm->period_size;
669 if (slave->pcm->stream == SND_PCM_STREAM_PLAYBACK)
670 snd_pcm_areas_silence(slave->pcm->running_areas, 0, slave->pcm->channels, slave->pcm->buffer_size, slave->pcm->format);
679 static int snd_pcm_share_hw_free(snd_pcm_t *pcm)
681 snd_pcm_share_t *share = pcm->private_data;
687 err = snd_pcm_hw_free(slave->pcm);
693 static int snd_pcm_share_sw_params(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params ATTRIBUTE_UNUSED)
698 static int snd_pcm_share_status(snd_pcm_t *pcm, snd_pcm_status_t *status)
700 snd_pcm_share_t *share = pcm->private_data;
705 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
706 status->avail = snd_pcm_mmap_playback_avail(pcm);
710 d = pcm->buffer_size - status->avail;
712 status->avail = snd_pcm_mmap_capture_avail(pcm);
717 err = snd_pcm_delay(slave->pcm, &sd);
723 status->appl_ptr = *pcm->appl.ptr;
724 status->hw_ptr = *pcm->hw.ptr;
731 static snd_pcm_state_t snd_pcm_share_state(snd_pcm_t *pcm)
733 snd_pcm_share_t *share = pcm->private_data;
737 static int _snd_pcm_share_hwsync(snd_pcm_t *pcm)
739 snd_pcm_share_t *share = pcm->private_data;
747 return snd_pcm_hwsync(slave->pcm);
750 static int snd_pcm_share_hwsync(snd_pcm_t *pcm)
752 snd_pcm_share_t *share = pcm->private_data;
756 err = _snd_pcm_share_hwsync(pcm);
761 static int _snd_pcm_share_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
763 snd_pcm_share_t *share = pcm->private_data;
771 if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
777 return snd_pcm_delay(slave->pcm, delayp);
780 static int snd_pcm_share_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
782 snd_pcm_share_t *share = pcm->private_data;
786 err = _snd_pcm_share_delay(pcm, delayp);
791 static snd_pcm_sframes_t snd_pcm_share_avail_update(snd_pcm_t *pcm)
793 snd_pcm_share_t *share = pcm->private_data;
798 avail = snd_pcm_avail_update(slave->pcm);
803 share->hw_ptr = *slave->pcm->hw.ptr;
806 avail = snd_pcm_mmap_avail(pcm);
807 if ((snd_pcm_uframes_t)avail > pcm->buffer_size)
812 static int snd_pcm_share_htimestamp(snd_pcm_t *pcm, snd_pcm_uframes_t *avail,
815 snd_pcm_share_t *share = pcm->private_data;
819 err = snd_pcm_htimestamp(slave->pcm, avail, tstamp);
825 static snd_pcm_sframes_t _snd_pcm_share_mmap_commit(snd_pcm_t *pcm,
829 snd_pcm_share_t *share = pcm->private_data;
831 snd_pcm_t *spcm = slave->pcm;
834 if (pcm->stream == SND_PCM_STREAM_PLAYBACK &&
837 if (frames > (snd_pcm_sframes_t)pcm->buffer_size)
838 frames -= pcm->boundary;
839 else if (frames < -(snd_pcm_sframes_t)pcm->buffer_size)
840 frames += pcm->boundary;
848 snd_pcm_mmap_appl_forward(pcm, size);
863 _snd_pcm_share_update(pcm);
868 static snd_pcm_sframes_t snd_pcm_share_mmap_commit(snd_pcm_t *pcm,
872 snd_pcm_share_t *share = pcm->private_data;
876 ret = _snd_pcm_share_mmap_commit(pcm, offset, size);
881 static int snd_pcm_share_prepare(snd_pcm_t *pcm)
883 snd_pcm_share_t *share = pcm->private_data;
901 err = snd_pcm_prepare(slave->pcm);
914 static int snd_pcm_share_reset(snd_pcm_t *pcm)
916 snd_pcm_share_t *share = pcm->private_data;
921 snd_pcm_areas_silence(pcm->running_areas, 0, pcm->channels, pcm->buffer_size, pcm->format);
922 share->hw_ptr = *slave->pcm->hw.ptr;
928 static int snd_pcm_share_start(snd_pcm_t *pcm)
930 snd_pcm_share_t *share = pcm->private_data;
932 snd_pcm_t *spcm = slave->pcm;
938 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
939 snd_pcm_uframes_t hw_avail = snd_pcm_mmap_playback_hw_avail(pcm);
959 snd_pcm_uframes_t offset = snd_pcm_mmap_offset(pcm);
960 snd_pcm_uframes_t cont = pcm->buffer_size - offset;
963 if (pcm->stopped_areas != NULL)
964 snd_pcm_areas_copy(pcm->running_areas, offset,
965 pcm->stopped_areas, xfer,
966 pcm->channels, frames,
967 pcm->format);
970 snd_pcm_mmap_appl_forward(pcm, hw_avail);
987 _snd_pcm_share_update(pcm);
988 gettimestamp(&share->trigger_tstamp, pcm->tstamp_type);
994 static int snd_pcm_share_pause(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int enable ATTRIBUTE_UNUSED)
999 static int snd_pcm_share_resume(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
1004 static int snd_pcm_share_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *info)
1006 snd_pcm_share_t *share = pcm->private_data;
1012 err = snd_pcm_channel_info(slave->pcm, info);
1017 static snd_pcm_sframes_t _snd_pcm_share_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1019 snd_pcm_share_t *share = pcm->private_data;
1026 if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
1030 if (pcm->stream != SND_PCM_STREAM_CAPTURE)
1038 n = snd_pcm_mmap_hw_avail(pcm);
1043 snd_pcm_sframes_t ret = snd_pcm_rewind(slave->pcm, frames);
1048 snd_pcm_mmap_appl_backward(pcm, frames);
1049 _snd_pcm_share_update(pcm);
1053 static snd_pcm_sframes_t snd_pcm_share_rewindable(snd_pcm_t *pcm)
1055 snd_pcm_share_t *share = pcm->private_data;
1059 ret = snd_pcm_rewindable(slave->pcm);
1064 static snd_pcm_sframes_t snd_pcm_share_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1066 snd_pcm_share_t *share = pcm->private_data;
1070 ret = _snd_pcm_share_rewind(pcm, frames);
1075 static snd_pcm_sframes_t _snd_pcm_share_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1077 snd_pcm_share_t *share = pcm->private_data;
1084 if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
1088 if (pcm->stream != SND_PCM_STREAM_CAPTURE)
1096 n = snd_pcm_mmap_avail(pcm);
1100 snd_pcm_sframes_t ret = INTERNAL(snd_pcm_forward)(slave->pcm, frames);
1105 snd_pcm_mmap_appl_forward(pcm, frames);
1106 _snd_pcm_share_update(pcm);
1110 static snd_pcm_sframes_t snd_pcm_share_forwardable(snd_pcm_t *pcm)
1112 snd_pcm_share_t *share = pcm->private_data;
1116 ret = snd_pcm_forwardable(slave->pcm);
1121 static snd_pcm_sframes_t snd_pcm_share_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1123 snd_pcm_share_t *share = pcm->private_data;
1127 ret = _snd_pcm_share_forward(pcm, frames);
1133 static void _snd_pcm_share_stop(snd_pcm_t *pcm, snd_pcm_state_t state)
1135 snd_pcm_share_t *share = pcm->private_data;
1138 if (!pcm->mmap_channels) {
1143 gettimestamp(&share->trigger_tstamp, pcm->tstamp_type);
1144 if (pcm->stream == SND_PCM_STREAM_CAPTURE) {
1145 snd_pcm_areas_copy(pcm->stopped_areas, 0,
1146 pcm->running_areas, 0,
1147 pcm->channels, pcm->buffer_size,
1148 pcm->format);
1152 snd_pcm_areas_silence(pcm->running_areas, 0, pcm->channels,
1153 pcm->buffer_size, pcm->format);
1154 err = snd_pcm_delay(slave->pcm, &delay);
1156 snd_pcm_rewind(slave->pcm, delay);
1163 int err = snd_pcm_drop(slave->pcm);
1168 static int snd_pcm_share_drain(snd_pcm_t *pcm)
1170 snd_pcm_share_t *share = pcm->private_data;
1186 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
1194 _snd_pcm_share_update(pcm);
1196 if (!(pcm->mode & SND_PCM_NONBLOCK))
1197 snd_pcm_wait(pcm, SND_PCM_WAIT_DRAIN);
1206 _snd_pcm_share_stop(pcm, SND_PCM_STATE_DRAINING);
1207 _snd_pcm_share_update(pcm);
1211 if (snd_pcm_mmap_capture_avail(pcm) <= 0)
1226 static int snd_pcm_share_drop(snd_pcm_t *pcm)
1228 snd_pcm_share_t *share = pcm->private_data;
1239 if (pcm->stream == SND_PCM_STREAM_CAPTURE) {
1245 _snd_pcm_share_stop(pcm, SND_PCM_STATE_SETUP);
1246 _snd_pcm_share_update(pcm);
1263 static int snd_pcm_share_close(snd_pcm_t *pcm)
1265 snd_pcm_share_t *share = pcm->private_data;
1277 err = snd_pcm_close(slave->pcm);
1295 static int snd_pcm_share_mmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
1300 static int snd_pcm_share_munmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
1305 static void snd_pcm_share_dump(snd_pcm_t *pcm, snd_output_t *out)
1307 snd_pcm_share_t *share = pcm->private_data;
1314 if (pcm->setup) {
1316 snd_pcm_dump_setup(pcm, out);
1319 snd_pcm_dump(slave->pcm, out);
1388 snd_pcm_t *pcm;
1425 err = snd_pcm_new(&pcm, SND_PCM_TYPE_SHARE, name, stream, mode);
1433 snd_pcm_free(pcm);
1459 snd_pcm_free(pcm);
1468 if (s->pcm->name && strcmp(s->pcm->name, sname) == 0) {
1480 snd_pcm_free(pcm);
1493 snd_pcm_free(pcm);
1499 slave->pcm = spcm;
1523 snd_pcm_free(pcm);
1533 share->pcm = pcm;
1537 pcm->mmap_rw = 1;
1538 pcm->ops = &snd_pcm_share_ops;
1539 pcm->fast_ops = &snd_pcm_share_fast_ops;
1540 pcm->private_data = share;
1541 pcm->poll_fd = share->client_socket;
1542 pcm->poll_events = stream == SND_PCM_STREAM_PLAYBACK ? POLLOUT : POLLIN;
1543 pcm->tstamp_type = slave->pcm->tstamp_type;
1544 snd_pcm_set_hw_ptr(pcm, &share->hw_ptr, -1, 0);
1545 snd_pcm_set_appl_ptr(pcm, &share->appl_ptr, -1, 0);
1552 *pcmp = pcm;
1571 pcm.name {
1576 pcm STR # Slave PCM name
1668 SNDERR("slave.pcm is not a string");