Lines Matching refs:pcm
2 * \file pcm/pcm_hw.c
82 static snd_pcm_sframes_t snd_pcm_hw_avail_update(snd_pcm_t *pcm);
131 struct timespec snd_pcm_hw_fast_tstamp(snd_pcm_t *pcm)
134 snd_pcm_hw_t *hw = pcm->private_data;
229 static int snd_pcm_hw_poll_descriptors_count(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
234 static int snd_pcm_hw_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space)
236 snd_pcm_hw_t *hw = pcm->private_data;
241 pfds[0].events = pcm->poll_events | POLLERR | POLLNVAL;
247 static int snd_pcm_hw_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned nfds, unsigned short *revents)
249 snd_pcm_hw_t *hw = pcm->private_data;
257 events |= pcm->poll_events & ~(POLLERR|POLLNVAL);
263 static int snd_pcm_hw_nonblock(snd_pcm_t *pcm, int nonblock)
266 snd_pcm_hw_t *hw = pcm->private_data;
286 static int snd_pcm_hw_async(snd_pcm_t *pcm, int sig, pid_t pid)
289 snd_pcm_hw_t *hw = pcm->private_data;
321 static int snd_pcm_hw_info(snd_pcm_t *pcm, snd_pcm_info_t * info)
323 snd_pcm_hw_t *hw = pcm->private_data;
344 static int snd_pcm_hw_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
346 snd_pcm_hw_t *hw = pcm->private_data;
375 if (pcm->tstamp_type != SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY)
406 static int snd_pcm_hw_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params)
408 snd_pcm_hw_t *hw = pcm->private_data;
416 if (pcm->tstamp_type != SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY)
431 static int snd_pcm_hw_change_timer(snd_pcm_t *pcm, int enable)
433 snd_pcm_hw_t *hw = pcm->private_data;
440 "hw-pcm-period-event",
443 (hw->subdevice << 1) | (pcm->stream & 1),
447 "hw-pcm-period-event",
450 (hw->subdevice << 1) | (pcm->stream & 1),
502 pcm->fast_ops = &snd_pcm_hw_fast_ops_timer;
505 pcm->fast_ops = &snd_pcm_hw_fast_ops;
511 static int snd_pcm_hw_hw_free(snd_pcm_t *pcm)
513 snd_pcm_hw_t *hw = pcm->private_data;
515 snd_pcm_hw_change_timer(pcm, 0);
524 static int snd_pcm_hw_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params)
526 snd_pcm_hw_t *hw = pcm->private_data;
530 if ((snd_pcm_tstamp_t) params->tstamp_mode == pcm->tstamp_mode &&
531 (snd_pcm_tstamp_type_t) params->tstamp_type == pcm->tstamp_type &&
532 params->period_step == pcm->period_step &&
533 params->start_threshold == pcm->start_threshold &&
534 params->stop_threshold == pcm->stop_threshold &&
535 params->silence_threshold == pcm->silence_threshold &&
536 params->silence_size == pcm->silence_size &&
560 if ((snd_pcm_tstamp_type_t) params->tstamp_type != pcm->tstamp_type) {
570 pcm->tstamp_type = params->tstamp_type;
574 err = snd_pcm_hw_change_timer(pcm, old_period_event);
584 static int snd_pcm_hw_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t * info)
586 snd_pcm_hw_t *hw = pcm->private_data;
605 static int snd_pcm_hw_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
607 snd_pcm_hw_t *hw = pcm->private_data;
629 static snd_pcm_state_t snd_pcm_hw_state(snd_pcm_t *pcm)
631 snd_pcm_hw_t *hw = pcm->private_data;
639 static int snd_pcm_hw_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
641 snd_pcm_hw_t *hw = pcm->private_data;
651 static int snd_pcm_hw_hwsync(snd_pcm_t *pcm)
653 snd_pcm_hw_t *hw = pcm->private_data;
669 int err = snd_pcm_hw_delay(pcm, &delay);
683 static int snd_pcm_hw_prepare(snd_pcm_t *pcm)
685 snd_pcm_hw_t *hw = pcm->private_data;
690 snd_pcm_sw_params_current_no_lock(pcm, &sw_params);
706 static int snd_pcm_hw_reset(snd_pcm_t *pcm)
708 snd_pcm_hw_t *hw = pcm->private_data;
718 static int snd_pcm_hw_start(snd_pcm_t *pcm)
720 snd_pcm_hw_t *hw = pcm->private_data;
723 assert(pcm->stream != SND_PCM_STREAM_PLAYBACK ||
724 snd_pcm_mmap_playback_hw_avail(pcm) > 0);
732 SNDERR("PCM state = %s", snd_pcm_state_name(snd_pcm_hw_state(pcm)));
739 static int snd_pcm_hw_drop(snd_pcm_t *pcm)
741 snd_pcm_hw_t *hw = pcm->private_data;
752 static int snd_pcm_hw_drain(snd_pcm_t *pcm)
754 snd_pcm_hw_t *hw = pcm->private_data;
759 if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
762 if (pcm->period_size == 0)
766 snd_pcm_sw_params_current_no_lock(pcm, &sw_params);
768 silence_size = (pcm->rate * hw->drain_silence) / 1000;
772 if ((pcm->boundary % pcm->period_size) == 0) {
773 silence_size = pcm->period_size - (*pcm->appl.ptr % pcm->period_size);
774 if (silence_size == pcm->period_size)
781 silence_size = pcm->period_size;
783 silence_size += pcm->rate / 10; /* 1/10th of second */
789 sw_params.silence_threshold = pcm->buffer_size;
790 if (silence_size > pcm->buffer_size)
791 silence_size = pcm->buffer_size;
809 static int snd_pcm_hw_pause(snd_pcm_t *pcm, int enable)
811 snd_pcm_hw_t *hw = pcm->private_data;
821 static snd_pcm_sframes_t snd_pcm_hw_rewindable(snd_pcm_t *pcm)
823 return snd_pcm_mmap_hw_rewindable(pcm);
826 static snd_pcm_sframes_t snd_pcm_hw_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
828 snd_pcm_hw_t *hw = pcm->private_data;
841 static snd_pcm_sframes_t snd_pcm_hw_forwardable(snd_pcm_t *pcm)
843 return snd_pcm_mmap_avail(pcm);
846 static snd_pcm_sframes_t snd_pcm_hw_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
848 snd_pcm_hw_t *hw = pcm->private_data;
874 avail = snd_pcm_mmap_avail(pcm);
879 snd_pcm_mmap_appl_forward(pcm, frames);
884 static int snd_pcm_hw_resume(snd_pcm_t *pcm)
886 snd_pcm_hw_t *hw = pcm->private_data;
907 static int snd_pcm_hw_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master)
913 return hw_link(master, pcm);
926 static int snd_pcm_hw_unlink(snd_pcm_t *pcm)
928 snd_pcm_hw_t *hw = pcm->private_data;
937 static snd_pcm_sframes_t snd_pcm_hw_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size)
940 snd_pcm_hw_t *hw = pcm->private_data;
954 return snd_pcm_check_error(pcm, err);
958 static snd_pcm_sframes_t snd_pcm_hw_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
961 snd_pcm_hw_t *hw = pcm->private_data;
975 return snd_pcm_check_error(pcm, err);
979 static snd_pcm_sframes_t snd_pcm_hw_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size)
982 snd_pcm_hw_t *hw = pcm->private_data;
996 return snd_pcm_check_error(pcm, err);
1000 static snd_pcm_sframes_t snd_pcm_hw_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
1003 snd_pcm_hw_t *hw = pcm->private_data;
1017 return snd_pcm_check_error(pcm, err);
1072 static int map_status_and_control_data(snd_pcm_t *pcm, bool force_fallback)
1074 snd_pcm_hw_t *hw = pcm->private_data;
1100 if (!(pcm->mode & SND_PCM_APPEND)) {
1105 snd_pcm_set_hw_ptr(pcm, &hw->mmap_status->hw_ptr, hw->fd,
1108 snd_pcm_set_appl_ptr(pcm, &hw->mmap_control->appl_ptr, hw->fd,
1115 if (pcm->mode & SND_PCM_APPEND)
1159 static int snd_pcm_hw_mmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
1164 static int snd_pcm_hw_munmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
1169 static int snd_pcm_hw_close(snd_pcm_t *pcm)
1171 snd_pcm_hw_t *hw = pcm->private_data;
1184 static snd_pcm_sframes_t snd_pcm_hw_mmap_commit(snd_pcm_t *pcm,
1188 snd_pcm_hw_t *hw = pcm->private_data;
1190 snd_pcm_mmap_appl_forward(pcm, size);
1193 fprintf(stderr, "appl_forward: hw_ptr = %li, appl_ptr = %li, size = %li\n", *pcm->hw.ptr, *pcm->appl.ptr, size);
1198 static snd_pcm_sframes_t snd_pcm_hw_avail_update(snd_pcm_t *pcm)
1200 snd_pcm_hw_t *hw = pcm->private_data;
1204 avail = snd_pcm_mmap_avail(pcm);
1207 if (avail >= pcm->stop_threshold) {
1225 static int snd_pcm_hw_htimestamp(snd_pcm_t *pcm, snd_pcm_uframes_t *avail,
1233 avail1 = snd_pcm_hw_avail_update(pcm);
1239 *tstamp = snd_pcm_hw_fast_tstamp(pcm);
1257 static void fill_chmap_ctl_id(snd_pcm_t *pcm, snd_ctl_elem_id_t *id)
1259 snd_pcm_hw_t *hw = pcm->private_data;
1260 __fill_chmap_ctl_id(id, hw->device, hw->subdevice, pcm->stream);
1379 static snd_pcm_chmap_query_t **snd_pcm_hw_query_chmaps(snd_pcm_t *pcm)
1381 snd_pcm_hw_t *hw = pcm->private_data;
1391 hw->subdevice, pcm->stream);
1399 static snd_pcm_chmap_t *snd_pcm_hw_get_chmap(snd_pcm_t *pcm)
1401 snd_pcm_hw_t *hw = pcm->private_data;
1410 return _snd_pcm_choose_fixed_chmap(pcm, hw->chmap_override);
1428 map = malloc(pcm->channels * sizeof(map->pos[0]) + sizeof(*map));
1431 map->channels = pcm->channels;
1439 fill_chmap_ctl_id(pcm, &id);
1449 for (i = 0; i < pcm->channels; i++)
1455 static int snd_pcm_hw_set_chmap(snd_pcm_t *pcm, const snd_pcm_chmap_t *map)
1457 snd_pcm_hw_t *hw = pcm->private_data;
1486 fill_chmap_ctl_id(pcm, &id);
1503 static void snd_pcm_hw_dump(snd_pcm_t *pcm, snd_output_t *out)
1505 snd_pcm_hw_t *hw = pcm->private_data;
1515 if (pcm->setup) {
1517 snd_pcm_dump_setup(pcm, out);
1620 snd_pcm_t *pcm = NULL;
1707 ret = snd_pcm_new(&pcm, SND_PCM_TYPE_HW, name, info.stream, mode);
1714 pcm->ops = &snd_pcm_hw_ops;
1715 pcm->fast_ops = &snd_pcm_hw_fast_ops;
1716 pcm->private_data = hw;
1717 pcm->poll_fd = fd;
1718 pcm->poll_events = info.stream == SND_PCM_STREAM_PLAYBACK ? POLLOUT : POLLIN;
1719 pcm->tstamp_type = tstamp_type;
1721 pcm->need_lock = 0; /* hw plugin is thread-safe */
1723 pcm->own_state_check = 1; /* skip the common state check */
1725 ret = map_status_and_control_data(pcm, !!sync_ptr_ioctl);
1727 snd_pcm_close(pcm);
1731 *pcmp = pcm;
1841 pcm.name {
1893 /* look for defaults.pcm.nonblock definition */
1894 if (snd_config_search(root, "defaults.pcm.nonblock", &n) >= 0) {