Lines Matching refs:rate

58 	snd_pcm_channel_area_t *pareas;	/* areas for splitted period (rate pcm) */
79 #define SND_PCM_RATE_PLUGIN_VERSION_OLD 0x010001 /* old rate plugin */
123 snd_pcm_rate_t *rate = pcm->private_data;
138 if (rate->rate_min) {
140 rate->rate_min, 0);
144 if (rate->rate_max) {
146 rate->rate_max, 0);
156 snd_pcm_rate_t *rate = pcm->private_data;
161 if (rate->sformat != SND_PCM_FORMAT_UNKNOWN) {
162 _snd_pcm_hw_params_set_format(sparams, rate->sformat);
166 rate->srate, 0, rate->srate + 1, -1);
173 snd_pcm_rate_t *rate = pcm->private_data;
180 if (rate->sformat == SND_PCM_FORMAT_UNKNOWN)
202 snd_pcm_rate_t *rate = pcm->private_data;
213 if (rate->sformat == SND_PCM_FORMAT_UNKNOWN)
314 static int choose_preferred_format(snd_pcm_rate_t *rate)
316 uint64_t in_mask = rate->in_formats;
317 uint64_t out_mask = rate->out_formats;
323 if (rate->orig_in_format == rate->orig_out_format)
324 if (in_mask & out_mask & (1ULL << rate->orig_in_format))
328 in = get_best_format(in_mask, rate->orig_in_format);
329 out = get_best_format(out_mask, rate->orig_out_format);
333 if ((rate->format_flags & SND_PCM_RATE_FLAG_SYNC_FORMATS) &&
346 rate->info.in.format = in;
347 rate->info.out.format = out;
353 snd_pcm_rate_t *rate = pcm->private_data;
354 snd_pcm_t *slave = rate->gen.slave;
367 cinfo = &rate->info.in;
368 sinfo = &rate->info.out;
370 sinfo = &rate->info.in;
371 cinfo = &rate->info.out;
376 err = INTERNAL(snd_pcm_hw_params_get_rate)(params, &cinfo->rate, 0);
392 rate->info.channels = channels;
394 sinfo->rate = slave->rate;
398 if (CHECK_SANITY(rate->pareas)) {
399 SNDMSG("rate plugin already in use");
403 rate->pareas = rate_alloc_tmp_buf(cinfo->format, channels,
405 rate->sareas = rate_alloc_tmp_buf(sinfo->format, channels,
407 if (!rate->pareas || !rate->sareas) {
412 rate->orig_in_format = rate->info.in.format;
413 rate->orig_out_format = rate->info.out.format;
414 if (choose_preferred_format(rate) < 0) {
415 SNDERR("No matching format in rate plugin");
420 err = rate->ops.init(rate->obj, &rate->info);
424 rate_free_tmp_buf(&rate->src_buf);
425 rate_free_tmp_buf(&rate->dst_buf);
429 if ((rate->format_flags & SND_PCM_RATE_FLAG_INTERLEAVED) &&
434 if (rate->orig_in_format != rate->info.in.format)
436 if (rate->orig_out_format != rate->info.out.format)
441 rate->src_conv_idx =
442 snd_pcm_linear_convert_index(rate->orig_in_format,
443 rate->info.in.format);
444 rate->src_buf = rate_alloc_tmp_buf(rate->info.in.format,
445 channels, rate->info.in.period_size);
446 if (!rate->src_buf) {
453 rate->dst_conv_idx =
454 snd_pcm_linear_convert_index(rate->info.out.format,
455 rate->orig_out_format);
456 rate->dst_buf = rate_alloc_tmp_buf(rate->info.out.format,
457 channels, rate->info.out.period_size);
458 if (!rate->dst_buf) {
467 rate_free_tmp_buf(&rate->src_buf);
468 rate_free_tmp_buf(&rate->dst_buf);
470 if (rate->ops.free)
471 rate->ops.free(rate->obj);
473 rate_free_tmp_buf(&rate->pareas);
474 rate_free_tmp_buf(&rate->sareas);
480 snd_pcm_rate_t *rate = pcm->private_data;
482 rate_free_tmp_buf(&rate->pareas);
483 rate_free_tmp_buf(&rate->sareas);
484 if (rate->ops.free)
485 rate->ops.free(rate->obj);
486 rate_free_tmp_buf(&rate->src_buf);
487 rate_free_tmp_buf(&rate->dst_buf);
488 return snd_pcm_hw_free(rate->gen.slave);
493 snd_pcm_rate_t *rate = pcm->private_data;
494 snd_pcm_t *slave = rate->gen.slave;
510 snd_pcm_rate_t *rate = pcm->private_data;
511 snd_pcm_t *slave = rate->gen.slave;
516 sparams = &rate->sw_params;
532 if (rate->ops.adjust_pitch)
533 rate->ops.adjust_pitch(rate->obj, &rate->info);
536 rate->orig_avail_min = sparams->avail_min;
559 snd_pcm_rate_t *rate = pcm->private_data;
561 if (rate->ops.reset)
562 rate->ops.reset(rate->obj);
563 rate->last_commit_ptr = 0;
564 rate->start_pending = 0;
573 snd_pcm_rate_t *rate)
578 if (rate->dst_buf) {
579 out_areas = rate->dst_buf;
586 if (rate->src_buf) {
587 snd_pcm_linear_convert(rate->src_buf, 0,
590 rate->src_conv_idx);
591 src_areas = rate->src_buf;
595 if (rate->ops.convert)
596 rate->ops.convert(rate->obj, out_areas, out_offset, dst_frames,
599 rate->ops.convert_s16(rate->obj,
604 if (rate->dst_buf)
606 rate->dst_buf, 0,
608 rate->dst_conv_idx);
618 snd_pcm_rate_t *rate = pcm->private_data;
619 do_convert(slave_areas, slave_offset, rate->gen.slave->period_size,
621 pcm->channels, rate);
631 snd_pcm_rate_t *rate = pcm->private_data;
633 slave_areas, slave_offset, rate->gen.slave->period_size,
634 pcm->channels, rate);
639 snd_pcm_rate_t *rate;
646 rate = pcm->private_data;
647 slave_hw_ptr_diff = pcm_frame_diff(slave_hw_ptr, rate->last_slave_hw_ptr, rate->gen.slave->boundary);
650 last_slave_hw_ptr_frac = rate->last_slave_hw_ptr % rate->gen.slave->period_size;
653 * To eliminate rounding issue on rate->hw_ptr, subtract last rounded
654 * value from rate->hw_ptr and add new rounded value of present
655 * slave_hw_ptr fraction part to rate->hw_ptr. Hence,
656 * rate->hw_ptr += [ (no. of updated slave periods * pcm rate period size) -
660 rate->hw_ptr += (
661 (((last_slave_hw_ptr_frac + slave_hw_ptr_diff) / rate->gen.slave->period_size) * pcm->period_size) -
662 rate->ops.input_frames(rate->obj, last_slave_hw_ptr_frac) +
663 rate->ops.input_frames(rate->obj, (last_slave_hw_ptr_frac + slave_hw_ptr_diff) % rate->gen.slave->period_size));
664 rate->last_slave_hw_ptr = slave_hw_ptr;
666 rate->hw_ptr %= pcm->boundary;
671 snd_pcm_rate_t *rate = pcm->private_data;
672 snd_pcm_rate_sync_hwptr0(pcm, *rate->gen.slave->hw.ptr);
677 snd_pcm_rate_t *rate = pcm->private_data;
678 int err = snd_pcm_hwsync(rate->gen.slave);
687 snd_pcm_rate_t *rate = pcm->private_data;
689 return pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
694 snd_pcm_rate_t *rate = pcm->private_data;
700 err = snd_pcm_delay(rate->gen.slave, &slave_delay);
706 *delayp = rate->ops.input_frames(rate->obj, slave_delay)
709 *delayp = rate->ops.output_frames(rate->obj, slave_delay)
717 snd_pcm_rate_t *rate = pcm->private_data;
720 err = snd_pcm_prepare(rate->gen.slave);
725 rate->last_slave_hw_ptr = 0;
734 snd_pcm_rate_t *rate = pcm->private_data;
736 err = snd_pcm_reset(rate->gen.slave);
741 rate->last_slave_hw_ptr = 0;
770 static int snd_pcm_rate_commit_area(snd_pcm_t *pcm, snd_pcm_rate_t *rate,
788 result = snd_pcm_mmap_begin(rate->gen.slave, &slave_areas, &slave_offset, &slave_frames);
795 if (slave_frames < rate->gen.slave->period_size) {
796 snd_pcm_rate_write_areas1(pcm, areas, appl_offset, rate->sareas, 0);
802 result = snd_pcm_mmap_commit(rate->gen.slave, slave_offset, slave_size);
806 result = snd_pcm_rewind(rate->gen.slave, result);
812 snd_pcm_areas_copy(rate->pareas, 0,
816 snd_pcm_areas_copy(rate->pareas, cont,
821 snd_pcm_rate_write_areas1(pcm, rate->pareas, 0, rate->sareas, 0);
824 result = snd_pcm_mmap_begin(rate->gen.slave, &slave_areas, &slave_offset, &slave_frames);
832 rate->sareas, 0,
834 rate->gen.slave->format);
835 result = snd_pcm_mmap_commit(rate->gen.slave, slave_offset, cont);
839 result = snd_pcm_rewind(rate->gen.slave, result);
852 result = snd_pcm_mmap_begin(rate->gen.slave, &slave_areas, &slave_offset, &slave_frames);
862 rate->sareas, xfer,
864 rate->gen.slave->format);
865 result = snd_pcm_mmap_commit(rate->gen.slave, slave_offset, cont);
869 result = snd_pcm_rewind(rate->gen.slave, result + xfer);
877 if (rate->start_pending) {
879 snd_pcm_start(rate->gen.slave);
880 rate->start_pending = 0;
887 snd_pcm_rate_t *rate = pcm->private_data;
889 return snd_pcm_rate_commit_area(pcm, rate, appl_offset, pcm->period_size,
890 rate->gen.slave->period_size);
895 snd_pcm_rate_t *rate = pcm->private_data;
905 result = snd_pcm_mmap_begin(rate->gen.slave, &slave_areas, &slave_offset, &slave_frames);
908 if (slave_frames < rate->gen.slave->period_size)
912 result = snd_pcm_mmap_commit(rate->gen.slave, slave_offset, rate->gen.slave->period_size);
913 if (result < (snd_pcm_sframes_t)rate->gen.slave->period_size) {
916 result = snd_pcm_rewind(rate->gen.slave, result);
923 result = snd_pcm_mmap_begin(rate->gen.slave, &slave_areas, &slave_offset, &slave_frames);
928 if (cont > rate->gen.slave->period_size)
929 cont = rate->gen.slave->period_size;
930 snd_pcm_areas_copy(rate->sareas, 0,
933 rate->gen.slave->format);
934 result = snd_pcm_mmap_commit(rate->gen.slave, slave_offset, cont);
938 result = snd_pcm_rewind(rate->gen.slave, result);
945 if (xfer == rate->gen.slave->period_size)
949 cont = rate->gen.slave->period_size - cont;
951 result = snd_pcm_mmap_begin(rate->gen.slave, &slave_areas, &slave_offset, &slave_frames);
960 snd_pcm_areas_copy(rate->sareas, xfer,
963 rate->gen.slave->format);
964 result = snd_pcm_mmap_commit(rate->gen.slave, slave_offset, cont);
968 result = snd_pcm_rewind(rate->gen.slave, result + xfer);
978 rate->sareas, 0);
981 rate->pareas, 0,
982 rate->sareas, 0);
984 rate->pareas, 0,
988 rate->pareas, cont,
998 snd_pcm_rate_t *rate = pcm->private_data;
999 snd_pcm_t *slave = rate->gen.slave;
1008 xfer = pcm_frame_diff(appl_ptr, rate->last_commit_ptr, pcm->boundary);
1010 (snd_pcm_uframes_t)slave_size >= rate->gen.slave->period_size) {
1011 err = snd_pcm_rate_commit_next_period(pcm, rate->last_commit_ptr % pcm->buffer_size);
1017 slave_size -= rate->gen.slave->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;
1029 snd_pcm_rate_t *rate = pcm->private_data;
1035 err = snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr + size);
1046 snd_pcm_rate_t *rate = pcm->private_data;
1047 snd_pcm_t *slave = rate->gen.slave;
1072 snd_pcm_rate_t *rate = pcm->private_data;
1075 slave_size = snd_pcm_avail_update(rate->gen.slave);
1083 snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
1091 snd_pcm_rate_t *rate = pcm->private_data;
1105 err = snd_pcm_htimestamp(rate->gen.slave, &tmp, tstamp);
1115 snd_pcm_rate_t *rate = pcm->private_data;
1119 snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
1121 return snd_pcm_poll_descriptors_revents(rate->gen.slave, pfds, nfds, revents);
1127 snd_pcm_rate_t *rate = pcm->private_data;
1137 sw_params = rate->sw_params;
1140 snd_pcm_sw_params(rate->gen.slave, &sw_params);
1142 size = pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
1143 ofs = rate->last_commit_ptr % pcm->buffer_size;
1148 err = __snd_pcm_wait_in_lock(rate->gen.slave, SND_PCM_WAIT_DRAIN);
1153 spsize = rate->gen.slave->period_size;
1156 spsize = rate->ops.output_frames(rate->obj, size);
1160 commit_err = snd_pcm_rate_commit_area(pcm, rate, ofs,
1163 rate->last_commit_ptr += psize;
1164 if (rate->last_commit_ptr >= pcm->boundary)
1165 rate->last_commit_ptr -= pcm->boundary;
1179 snd_pcm_sw_params(rate->gen.slave, &sw_params);
1184 return snd_pcm_drain(rate->gen.slave);
1189 snd_pcm_rate_t *rate = pcm->private_data;
1190 if (rate->start_pending) /* pseudo-state */
1192 return snd_pcm_state(rate->gen.slave);
1198 snd_pcm_rate_t *rate = pcm->private_data;
1202 return snd_pcm_start(rate->gen.slave);
1204 if (snd_pcm_state(rate->gen.slave) != SND_PCM_STATE_PREPARED)
1207 gettimestamp(&rate->trigger_tstamp, pcm->tstamp_type);
1209 avail = snd_pcm_mmap_playback_hw_avail(rate->gen.slave);
1215 rate->start_pending = 1;
1218 rate->start_pending = 0;
1219 return snd_pcm_start(rate->gen.slave);
1224 snd_pcm_rate_t *rate = pcm->private_data;
1227 err = snd_pcm_status(rate->gen.slave, status);
1231 if (rate->start_pending)
1233 status->trigger_tstamp = rate->trigger_tstamp;
1239 status->delay = rate->ops.input_frames(rate->obj, status->delay)
1242 status->avail_max = rate->ops.input_frames(rate->obj, status->avail_max);
1244 status->delay = rate->ops.output_frames(rate->obj, status->delay)
1247 status->avail_max = rate->ops.output_frames(rate->obj, status->avail_max);
1254 snd_pcm_rate_t *rate = pcm->private_data;
1255 if (rate->sformat == SND_PCM_FORMAT_UNKNOWN)
1257 rate->srate);
1260 rate->srate,
1261 snd_pcm_format_name(rate->sformat));
1262 if (rate->ops.dump)
1263 rate->ops.dump(rate->obj, out);
1264 snd_output_printf(out, "Protocol version: %x\n", rate->plugin_version);
1270 snd_pcm_dump(rate->gen.slave, out);
1275 snd_pcm_rate_t *rate = pcm->private_data;
1277 if (rate->ops.close)
1278 rate->ops.close(rate->obj);
1279 if (rate->open_func)
1280 snd_dlobj_cache_put(rate->open_func);
1285 * \brief Convert rate pcm frames to corresponding rate slave pcm frames
1293 snd_pcm_rate_t *rate = pcm->private_data;
1296 sframes = rate->ops.output_frames(rate->obj, frames);
1298 sframes = rate->ops.input_frames(rate->obj, frames);
1371 static void rate_initial_setup(snd_pcm_rate_t *rate)
1373 if (rate->plugin_version == SND_PCM_RATE_PLUGIN_VERSION)
1374 rate->plugin_version = rate->ops.version;
1376 if (rate->plugin_version >= 0x010002 &&
1377 rate->ops.get_supported_rates)
1378 rate->ops.get_supported_rates(rate->obj,
1379 &rate->rate_min,
1380 &rate->rate_max);
1382 if (rate->plugin_version >= 0x010003 &&
1383 rate->ops.get_supported_formats) {
1384 rate->ops.get_supported_formats(rate->obj,
1385 &rate->in_formats,
1386 &rate->out_formats,
1387 &rate->format_flags);
1388 } else if (!rate->ops.convert && rate->ops.convert_s16) {
1389 rate->in_formats = rate->out_formats =
1391 rate->format_flags = SND_PCM_RATE_FLAG_INTERLEAVED;
1405 static int rate_open_func(snd_pcm_rate_t *rate, const char *type, const snd_config_t *converter_conf, int verbose)
1423 &rate->obj, &rate->ops, converter_conf);
1425 rate->open_func = open_conf_func;
1437 rate->open_func = open_func;
1439 err = open_func(SND_PCM_RATE_PLUGIN_VERSION, &rate->obj, &rate->ops);
1444 rate->plugin_version = SND_PCM_RATE_PLUGIN_VERSION_OLD;
1446 &rate->obj, &rate->ops);
1451 rate->open_func = NULL;
1482 * \brief Creates a new rate PCM
1486 * \param srate Slave rate
1501 snd_pcm_rate_t *rate;
1513 rate = calloc(1, sizeof(snd_pcm_rate_t));
1514 if (!rate) {
1517 rate->gen.slave = slave;
1518 rate->gen.close_slave = close_slave;
1519 rate->srate = srate;
1520 rate->sformat = sformat;
1522 rate->rate_min = SND_PCM_PLUGIN_RATE_MIN;
1523 rate->rate_max = SND_PCM_PLUGIN_RATE_MAX;
1524 rate->plugin_version = SND_PCM_RATE_PLUGIN_VERSION;
1528 free(rate);
1537 err = rate_open_func(rate, *types, NULL, 0);
1544 err = rate_open_func(rate, type, NULL, 1);
1551 err = rate_open_func(rate, type, NULL, 0);
1568 SNDERR("No name given for rate converter");
1570 free(rate);
1573 err = rate_open_func(rate, type, converter, 1);
1575 SNDERR("Invalid type for rate converter");
1577 free(rate);
1581 SNDERR("Cannot find rate converter");
1583 free(rate);
1589 err = open_func(SND_PCM_RATE_PLUGIN_VERSION, &rate->obj, &rate->ops);
1592 free(rate);
1597 if (! rate->ops.init || ! (rate->ops.convert || rate->ops.convert_s16) ||
1598 ! rate->ops.input_frames || ! rate->ops.output_frames) {
1599 SNDERR("Inproper rate plugin %s initialization", type);
1601 free(rate);
1605 rate_initial_setup(rate);
1609 pcm->private_data = rate;
1614 snd_pcm_set_hw_ptr(pcm, &rate->hw_ptr, -1, 0);
1615 snd_pcm_set_appl_ptr(pcm, &rate->appl_ptr, -1, 0);
1625 This plugin converts a stream rate. The input and output formats must be linear.
1629 type rate # Rate PCM
1636 rate INT # Slave rate
1662 * \brief Creates a new rate PCM
1666 * \param conf Configuration node with rate PCM description