Lines Matching refs:pcm

2  * \file pcm/pcm_rate.c
58 snd_pcm_channel_area_t *pareas; /* areas for splitted period (rate pcm) */
59 snd_pcm_channel_area_t *sareas; /* areas for splitted period (slave pcm) */
121 static int snd_pcm_rate_hw_refine_cprepare(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params)
123 snd_pcm_rate_t *rate = pcm->private_data;
154 static int snd_pcm_rate_hw_refine_sprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *sparams)
156 snd_pcm_rate_t *rate = pcm->private_data;
170 static int snd_pcm_rate_hw_refine_schange(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
173 snd_pcm_rate_t *rate = pcm->private_data;
199 static int snd_pcm_rate_hw_refine_cchange(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
202 snd_pcm_rate_t *rate = pcm->private_data;
269 static int snd_pcm_rate_hw_refine(snd_pcm_t *pcm,
272 return snd_pcm_hw_refine_slave(pcm, params,
351 static int snd_pcm_rate_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params)
353 snd_pcm_rate_t *rate = pcm->private_data;
358 int err = snd_pcm_hw_params_slave(pcm, params,
366 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
478 static int snd_pcm_rate_hw_free(snd_pcm_t *pcm)
480 snd_pcm_rate_t *rate = pcm->private_data;
491 static void recalc(snd_pcm_t *pcm, snd_pcm_uframes_t *val)
493 snd_pcm_rate_t *rate = pcm->private_data;
497 if (*val == pcm->buffer_size) {
500 div = *val / pcm->period_size;
501 if (div * pcm->period_size == *val)
504 *val = muldiv_near(*val, slave->period_size, pcm->period_size);
508 static int snd_pcm_rate_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params)
510 snd_pcm_rate_t *rate = pcm->private_data;
522 boundary1 = pcm->buffer_size;
524 while (boundary1 * 2 <= LONG_MAX - pcm->buffer_size &&
535 recalc(pcm, &sparams->avail_min);
537 recalc(pcm, &sparams->start_threshold);
546 recalc(pcm, &sparams->stop_threshold);
548 recalc(pcm, &sparams->silence_threshold);
552 recalc(pcm, &sparams->silence_size);
557 static int snd_pcm_rate_init(snd_pcm_t *pcm)
559 snd_pcm_rate_t *rate = pcm->private_data;
612 snd_pcm_rate_write_areas1(snd_pcm_t *pcm,
618 snd_pcm_rate_t *rate = pcm->private_data;
620 areas, offset, pcm->period_size,
621 pcm->channels, rate);
625 snd_pcm_rate_read_areas1(snd_pcm_t *pcm,
631 snd_pcm_rate_t *rate = pcm->private_data;
632 do_convert(areas, offset, pcm->period_size,
634 pcm->channels, rate);
637 static inline void snd_pcm_rate_sync_hwptr0(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr)
643 if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
646 rate = pcm->private_data;
656 * rate->hw_ptr += [ (no. of updated slave periods * pcm rate period size) -
661 (((last_slave_hw_ptr_frac + slave_hw_ptr_diff) / rate->gen.slave->period_size) * pcm->period_size) -
666 rate->hw_ptr %= pcm->boundary;
669 static inline void snd_pcm_rate_sync_hwptr(snd_pcm_t *pcm)
671 snd_pcm_rate_t *rate = pcm->private_data;
672 snd_pcm_rate_sync_hwptr0(pcm, *rate->gen.slave->hw.ptr);
675 static int snd_pcm_rate_hwsync(snd_pcm_t *pcm)
677 snd_pcm_rate_t *rate = pcm->private_data;
681 snd_pcm_rate_sync_hwptr(pcm);
685 static snd_pcm_uframes_t snd_pcm_rate_playback_internal_delay(snd_pcm_t *pcm)
687 snd_pcm_rate_t *rate = pcm->private_data;
689 return pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
692 static int snd_pcm_rate_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
694 snd_pcm_rate_t *rate = pcm->private_data;
698 snd_pcm_rate_hwsync(pcm);
705 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
707 + snd_pcm_rate_playback_internal_delay(pcm);
710 + snd_pcm_mmap_capture_delay(pcm);
715 static int snd_pcm_rate_prepare(snd_pcm_t *pcm)
717 snd_pcm_rate_t *rate = pcm->private_data;
723 *pcm->hw.ptr = 0;
724 *pcm->appl.ptr = 0;
726 err = snd_pcm_rate_init(pcm);
732 static int snd_pcm_rate_reset(snd_pcm_t *pcm)
734 snd_pcm_rate_t *rate = pcm->private_data;
739 *pcm->hw.ptr = 0;
740 *pcm->appl.ptr = 0;
742 err = snd_pcm_rate_init(pcm);
748 static snd_pcm_sframes_t snd_pcm_rate_rewindable(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
753 static snd_pcm_sframes_t snd_pcm_rate_forwardable(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
758 static snd_pcm_sframes_t snd_pcm_rate_rewind(snd_pcm_t *pcm ATTRIBUTE_UNUSED,
764 static snd_pcm_sframes_t snd_pcm_rate_forward(snd_pcm_t *pcm ATTRIBUTE_UNUSED,
770 static int snd_pcm_rate_commit_area(snd_pcm_t *pcm, snd_pcm_rate_t *rate,
775 snd_pcm_uframes_t cont = pcm->buffer_size - appl_offset;
782 areas = snd_pcm_mmap_areas(pcm);
787 if (cont >= pcm->period_size) {
796 snd_pcm_rate_write_areas1(pcm, areas, appl_offset, rate->sareas, 0);
799 snd_pcm_rate_write_areas1(pcm, areas, appl_offset,
814 pcm->channels, cont,
815 pcm->format);
818 pcm->channels, pcm->period_size - cont,
819 pcm->format);
821 snd_pcm_rate_write_areas1(pcm, rate->pareas, 0, rate->sareas, 0);
833 pcm->channels, cont,
863 pcm->channels, cont,
885 static int snd_pcm_rate_commit_next_period(snd_pcm_t *pcm, snd_pcm_uframes_t appl_offset)
887 snd_pcm_rate_t *rate = pcm->private_data;
889 return snd_pcm_rate_commit_area(pcm, rate, appl_offset, pcm->period_size,
893 static int snd_pcm_rate_grab_next_period(snd_pcm_t *pcm, snd_pcm_uframes_t hw_offset)
895 snd_pcm_rate_t *rate = pcm->private_data;
896 snd_pcm_uframes_t cont = pcm->buffer_size - hw_offset;
903 areas = snd_pcm_mmap_areas(pcm);
904 if (cont >= pcm->period_size) {
910 snd_pcm_rate_read_areas1(pcm, areas, hw_offset,
932 pcm->channels, cont,
962 pcm->channels, cont,
975 cont = pcm->buffer_size - hw_offset;
976 if (cont >= pcm->period_size) {
977 snd_pcm_rate_read_areas1(pcm, areas, hw_offset,
980 snd_pcm_rate_read_areas1(pcm,
985 pcm->channels, cont,
986 pcm->format);
989 pcm->channels, pcm->period_size - cont,
990 pcm->format);
996 static int snd_pcm_rate_sync_playback_area(snd_pcm_t *pcm, snd_pcm_uframes_t appl_ptr)
998 snd_pcm_rate_t *rate = pcm->private_data;
1008 xfer = pcm_frame_diff(appl_ptr, rate->last_commit_ptr, pcm->boundary);
1009 while (xfer >= pcm->period_size &&
1011 err = snd_pcm_rate_commit_next_period(pcm, rate->last_commit_ptr % pcm->buffer_size);
1016 xfer -= pcm->period_size;
1018 rate->last_commit_ptr += pcm->period_size;
1019 if (rate->last_commit_ptr >= pcm->boundary)
1020 rate->last_commit_ptr -= pcm->boundary;
1025 static snd_pcm_sframes_t snd_pcm_rate_mmap_commit(snd_pcm_t *pcm,
1029 snd_pcm_rate_t *rate = pcm->private_data;
1034 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
1035 err = snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr + size);
1039 snd_pcm_mmap_appl_forward(pcm, size);
1043 static snd_pcm_sframes_t snd_pcm_rate_avail_update_capture(snd_pcm_t *pcm,
1046 snd_pcm_rate_t *rate = pcm->private_data;
1050 xfer = snd_pcm_mmap_capture_avail(pcm);
1051 size = pcm->buffer_size - xfer;
1052 hw_offset = snd_pcm_mmap_hw_offset(pcm);
1053 while (size >= pcm->period_size &&
1055 int err = snd_pcm_rate_grab_next_period(pcm, hw_offset);
1060 xfer += pcm->period_size;
1061 size -= pcm->period_size;
1063 hw_offset += pcm->period_size;
1064 hw_offset %= pcm->buffer_size;
1065 snd_pcm_mmap_hw_forward(pcm, pcm->period_size);
1070 static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
1072 snd_pcm_rate_t *rate = pcm->private_data;
1079 if (pcm->stream == SND_PCM_STREAM_CAPTURE)
1080 return snd_pcm_rate_avail_update_capture(pcm, slave_size);
1082 snd_pcm_rate_sync_hwptr(pcm);
1083 snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
1084 return snd_pcm_mmap_avail(pcm);
1087 static int snd_pcm_rate_htimestamp(snd_pcm_t *pcm,
1091 snd_pcm_rate_t *rate = pcm->private_data;
1098 avail1 = snd_pcm_avail_update(pcm);
1113 static int snd_pcm_rate_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
1115 snd_pcm_rate_t *rate = pcm->private_data;
1116 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
1118 snd_pcm_rate_hwsync(pcm);
1119 snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
1125 static int snd_pcm_rate_drain(snd_pcm_t *pcm)
1127 snd_pcm_rate_t *rate = pcm->private_data;
1129 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
1135 __snd_pcm_lock(pcm);
1142 size = pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
1143 ofs = rate->last_commit_ptr % pcm->buffer_size;
1151 if (size > pcm->period_size) {
1152 psize = pcm->period_size;
1160 commit_err = snd_pcm_rate_commit_area(pcm, rate, ofs,
1164 if (rate->last_commit_ptr >= pcm->boundary)
1165 rate->last_commit_ptr -= pcm->boundary;
1167 if (pcm->mode & SND_PCM_NONBLOCK) {
1175 ofs = (ofs + psize) % pcm->buffer_size;
1180 __snd_pcm_unlock(pcm);
1187 static snd_pcm_state_t snd_pcm_rate_state(snd_pcm_t *pcm)
1189 snd_pcm_rate_t *rate = pcm->private_data;
1196 static int snd_pcm_rate_start(snd_pcm_t *pcm)
1198 snd_pcm_rate_t *rate = pcm->private_data;
1201 if (pcm->stream == SND_PCM_STREAM_CAPTURE)
1207 gettimestamp(&rate->trigger_tstamp, pcm->tstamp_type);
1222 static int snd_pcm_rate_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
1224 snd_pcm_rate_t *rate = pcm->private_data;
1230 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
1235 snd_pcm_rate_sync_hwptr0(pcm, status->hw_ptr);
1236 status->appl_ptr = *pcm->appl.ptr;
1237 status->hw_ptr = *pcm->hw.ptr;
1238 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
1240 + snd_pcm_rate_playback_internal_delay(pcm);
1241 status->avail = snd_pcm_mmap_playback_avail(pcm);
1245 + snd_pcm_mmap_capture_delay(pcm);
1246 status->avail = snd_pcm_mmap_capture_avail(pcm);
1252 static void snd_pcm_rate_dump(snd_pcm_t *pcm, snd_output_t *out)
1254 snd_pcm_rate_t *rate = pcm->private_data;
1265 if (pcm->setup) {
1267 snd_pcm_dump_setup(pcm, out);
1273 static int snd_pcm_rate_close(snd_pcm_t *pcm)
1275 snd_pcm_rate_t *rate = pcm->private_data;
1281 return snd_pcm_generic_close(pcm);
1285 * \brief Convert rate pcm frames to corresponding rate slave pcm frames
1286 * \param pcm PCM handle
1290 static snd_pcm_uframes_t snd_pcm_rate_slave_frames(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1293 snd_pcm_rate_t *rate = pcm->private_data;
1295 if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
1303 static int snd_pcm_rate_may_wait_for_avail_min(snd_pcm_t *pcm,
1306 return snd_pcm_plugin_may_wait_for_avail_min_conv(pcm, avail,
1366 if (snd_config_search(root, "defaults.pcm.rate_converter", &n) >= 0)
1500 snd_pcm_t *pcm;
1526 err = snd_pcm_new(&pcm, SND_PCM_TYPE_RATE, name, slave->stream, slave->mode);
1569 snd_pcm_free(pcm);
1576 snd_pcm_free(pcm);
1582 snd_pcm_free(pcm);
1591 snd_pcm_free(pcm);
1600 snd_pcm_free(pcm);
1607 pcm->ops = &snd_pcm_rate_ops;
1608 pcm->fast_ops = &snd_pcm_rate_fast_ops;
1609 pcm->private_data = rate;
1610 pcm->poll_fd = slave->poll_fd;
1611 pcm->poll_events = slave->poll_events;
1612 pcm->mmap_rw = 1;
1613 pcm->tstamp_type = slave->tstamp_type;
1614 snd_pcm_set_hw_ptr(pcm, &rate->hw_ptr, -1, 0);
1615 snd_pcm_set_appl_ptr(pcm, &rate->appl_ptr, -1, 0);
1616 *pcmp = pcm;
1628 pcm.name {
1633 pcm STR # Slave PCM name
1635 pcm { } # Slave PCM definition
1643 # defaults.pcm.rate_converter