Lines Matching refs:hw
126 #define FAST_PCM_STATE(hw) \
127 ((snd_pcm_state_t) (hw)->mmap_status->state)
128 #define FAST_PCM_TSTAMP(hw) \
129 ((hw)->mmap_status->tstamp)
134 snd_pcm_hw_t *hw = pcm->private_data;
135 res = FAST_PCM_TSTAMP(hw);
136 if (SNDRV_PROTOCOL_VERSION(2, 0, 5) > hw->version)
142 static int sync_ptr1(snd_pcm_hw_t *hw, unsigned int flags)
145 hw->sync_ptr->flags = flags;
146 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_SYNC_PTR, hw->sync_ptr) < 0) {
154 static int issue_avail_min(snd_pcm_hw_t *hw)
156 if (!hw->mmap_control_fallbacked)
160 return sync_ptr1(hw, SNDRV_PCM_SYNC_PTR_APPL);
163 static int issue_applptr(snd_pcm_hw_t *hw)
165 if (!hw->mmap_control_fallbacked)
169 return sync_ptr1(hw, SNDRV_PCM_SYNC_PTR_AVAIL_MIN);
172 static int request_hwsync(snd_pcm_hw_t *hw)
174 if (!hw->mmap_status_fallbacked)
181 return sync_ptr1(hw,
187 static int query_status_and_control_data(snd_pcm_hw_t *hw)
189 if (!hw->mmap_control_fallbacked)
196 return sync_ptr1(hw,
201 static int query_status_data(snd_pcm_hw_t *hw)
203 if (!hw->mmap_status_fallbacked)
210 return sync_ptr1(hw,
215 static int snd_pcm_hw_clear_timer_queue(snd_pcm_hw_t *hw)
217 if (hw->period_timer_need_poll) {
218 while (poll(&hw->period_timer_pfd, 1, 0) > 0) {
220 snd_timer_read(hw->period_timer, rbuf, sizeof(rbuf));
224 snd_timer_read(hw->period_timer, rbuf, sizeof(rbuf));
236 snd_pcm_hw_t *hw = pcm->private_data;
240 pfds[0].fd = hw->fd;
242 pfds[1].fd = hw->period_timer_pfd.fd;
249 snd_pcm_hw_t *hw = pcm->private_data;
252 if (nfds != 2 || pfds[0].fd != hw->fd || pfds[1].fd != hw->period_timer_pfd.fd)
256 snd_pcm_hw_clear_timer_queue(hw);
266 snd_pcm_hw_t *hw = pcm->private_data;
267 int fd = hw->fd, err;
289 snd_pcm_hw_t *hw = pcm->private_data;
290 int fd = hw->fd, err;
323 snd_pcm_hw_t *hw = pcm->private_data;
324 int fd = hw->fd, err;
346 snd_pcm_hw_t *hw = pcm->private_data;
349 if (hw->format != SND_PCM_FORMAT_UNKNOWN) {
350 err = _snd_pcm_hw_params_set_format(params, hw->format);
354 if (hw->channels > 0) {
356 hw->channels, 0);
360 if (hw->rates.min > 0) {
362 hw->rates.min, 0, hw->rates.max + 1, -1);
367 if (hw_refine_call(hw, params) < 0) {
408 snd_pcm_hw_t *hw = pcm->private_data;
410 if (hw_params_call(hw, params) < 0) {
418 hw->perfect_drain = !!(params->info & SND_PCM_INFO_PERFECT_DRAIN) ||
420 return query_status_data(hw);
423 static void snd_pcm_hw_close_timer(snd_pcm_hw_t *hw)
425 if (hw->period_timer) {
426 snd_timer_close(hw->period_timer);
427 hw->period_timer = NULL;
433 snd_pcm_hw_t *hw = pcm->private_data;
439 err = snd_timer_hw_open(&hw->period_timer,
440 "hw-pcm-period-event",
442 hw->card, hw->device,
443 (hw->subdevice << 1) | (pcm->stream & 1),
446 err = snd_timer_hw_open(&hw->period_timer,
447 "hw-pcm-period-event",
449 hw->card, hw->device,
450 (hw->subdevice << 1) | (pcm->stream & 1),
454 if (snd_timer_poll_descriptors_count(hw->period_timer) != 1) {
455 snd_pcm_hw_close_timer(hw);
458 hw->period_timer_pfd.events = POLLIN;
459 hw->period_timer_pfd.revents = 0;
460 snd_timer_poll_descriptors(hw->period_timer,
461 &hw->period_timer_pfd, 1);
462 hw->period_timer_need_poll = 0;
470 ioctl(hw->period_timer_pfd.fd,
478 hw->period_timer_need_poll = 1;
492 err = snd_timer_params(hw->period_timer, ¶ms);
494 snd_pcm_hw_close_timer(hw);
497 err = snd_timer_start(hw->period_timer);
499 snd_pcm_hw_close_timer(hw);
504 snd_pcm_hw_close_timer(hw);
506 hw->period_event = 0;
513 snd_pcm_hw_t *hw = pcm->private_data;
514 int fd = hw->fd, err;
526 snd_pcm_hw_t *hw = pcm->private_data;
527 int fd = hw->fd, err = 0;
537 old_period_event == hw->period_event) {
538 hw->mmap_control->avail_min = params->avail_min;
539 err = issue_avail_min(hw);
543 hw->version < SNDRV_PROTOCOL_VERSION(2, 0, 12)) {
549 hw->version < SNDRV_PROTOCOL_VERSION(2, 0, 5)) {
559 hw->prepare_reset_sw_params = false;
561 if (hw->version < SNDRV_PROTOCOL_VERSION(2, 0, 12)) {
572 hw->mmap_control->avail_min = params->avail_min;
573 if (hw->period_event != old_period_event) {
577 hw->period_event = old_period_event;
586 snd_pcm_hw_t *hw = pcm->private_data;
588 int fd = hw->fd, err;
607 snd_pcm_hw_t *hw = pcm->private_data;
608 int fd = hw->fd, err;
609 if (SNDRV_PROTOCOL_VERSION(2, 0, 13) > hw->version) {
622 if (SNDRV_PROTOCOL_VERSION(2, 0, 5) > hw->version) {
631 snd_pcm_hw_t *hw = pcm->private_data;
634 if (query_status_data(hw) == -ENODEV)
636 return (snd_pcm_state_t) hw->mmap_status->state;
641 snd_pcm_hw_t *hw = pcm->private_data;
642 int fd = hw->fd, err;
653 snd_pcm_hw_t *hw = pcm->private_data;
654 int fd = hw->fd, err;
655 if (SNDRV_PROTOCOL_VERSION(2, 0, 3) <= hw->version) {
656 if (hw->mmap_status_fallbacked) {
657 err = request_hwsync(hw);
671 switch (FAST_PCM_STATE(hw)) {
685 snd_pcm_hw_t *hw = pcm->private_data;
687 int fd = hw->fd, err;
689 if (hw->prepare_reset_sw_params) {
691 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_SW_PARAMS, &sw_params) < 0) {
696 hw->prepare_reset_sw_params = false;
703 return query_status_and_control_data(hw);
708 snd_pcm_hw_t *hw = pcm->private_data;
709 int fd = hw->fd, err;
715 return query_status_and_control_data(hw);
720 snd_pcm_hw_t *hw = pcm->private_data;
726 issue_applptr(hw);
727 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_START) < 0) {
741 snd_pcm_hw_t *hw = pcm->private_data;
743 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_DROP) < 0) {
754 snd_pcm_hw_t *hw = pcm->private_data;
764 if (hw->drain_silence == 0 || hw->perfect_drain)
767 if (hw->drain_silence > 0) {
768 silence_size = (pcm->rate * hw->drain_silence) / 1000;
793 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_SW_PARAMS, &sw_params) < 0) {
798 hw->prepare_reset_sw_params = true;
801 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_DRAIN) < 0) {
811 snd_pcm_hw_t *hw = pcm->private_data;
813 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_PAUSE, enable) < 0) {
828 snd_pcm_hw_t *hw = pcm->private_data;
830 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_REWIND, &frames) < 0) {
835 err = query_status_and_control_data(hw);
848 snd_pcm_hw_t *hw = pcm->private_data;
850 if (SNDRV_PROTOCOL_VERSION(2, 0, 4) <= hw->version) {
851 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_FORWARD, &frames) < 0) {
856 err = query_status_and_control_data(hw);
863 switch (FAST_PCM_STATE(hw)) {
886 snd_pcm_hw_t *hw = pcm->private_data;
887 int fd = hw->fd, err;
928 snd_pcm_hw_t *hw = pcm->private_data;
930 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_UNLINK) < 0) {
940 snd_pcm_hw_t *hw = pcm->private_data;
941 int fd = hw->fd;
949 err = query_status_and_control_data(hw);
961 snd_pcm_hw_t *hw = pcm->private_data;
962 int fd = hw->fd;
970 err = query_status_and_control_data(hw);
982 snd_pcm_hw_t *hw = pcm->private_data;
983 int fd = hw->fd;
991 err = query_status_and_control_data(hw);
1003 snd_pcm_hw_t *hw = pcm->private_data;
1004 int fd = hw->fd;
1012 err = query_status_and_control_data(hw);
1021 static bool map_status_data(snd_pcm_hw_t *hw, struct snd_pcm_sync_ptr *sync_ptr,
1031 hw->fd, SNDRV_PCM_MMAP_OFFSET_STATUS);
1041 hw->mmap_status = mmap_status;
1046 static bool map_control_data(snd_pcm_hw_t *hw,
1057 hw->fd, SNDRV_PCM_MMAP_OFFSET_CONTROL);
1067 hw->mmap_control = mmap_control;
1074 snd_pcm_hw_t *hw = pcm->private_data;
1084 hw->mmap_status_fallbacked =
1085 map_status_data(hw, sync_ptr, force_fallback);
1086 hw->mmap_control_fallbacked =
1087 map_control_data(hw, sync_ptr, force_fallback);
1090 if (hw->mmap_status_fallbacked || hw->mmap_control_fallbacked) {
1091 hw->sync_ptr = sync_ptr;
1094 hw->sync_ptr = NULL;
1102 hw->mmap_control->appl_ptr = 0;
1103 hw->mmap_control->avail_min = 1;
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,
1110 if (hw->mmap_control_fallbacked) {
1118 err = sync_ptr1(hw, flags);
1126 static void unmap_status_data(snd_pcm_hw_t *hw)
1128 if (!hw->mmap_status_fallbacked) {
1129 if (munmap((void *)hw->mmap_status,
1130 page_align(sizeof(*hw->mmap_status))) < 0)
1135 static void unmap_control_data(snd_pcm_hw_t *hw)
1137 if (!hw->mmap_control_fallbacked) {
1138 if (munmap((void *)hw->mmap_control,
1139 page_align(sizeof(*hw->mmap_control))) < 0)
1144 static void unmap_status_and_control_data(snd_pcm_hw_t *hw)
1146 unmap_status_data(hw);
1147 unmap_control_data(hw);
1149 if (hw->mmap_status_fallbacked || hw->mmap_control_fallbacked)
1150 free(hw->sync_ptr);
1152 hw->mmap_status = NULL;
1153 hw->mmap_control = NULL;
1154 hw->mmap_status_fallbacked = false;
1155 hw->mmap_control_fallbacked = false;
1156 hw->sync_ptr = NULL;
1171 snd_pcm_hw_t *hw = pcm->private_data;
1173 if (close(hw->fd)) {
1178 unmap_status_and_control_data(hw);
1180 free(hw);
1188 snd_pcm_hw_t *hw = pcm->private_data;
1191 issue_applptr(hw);
1193 fprintf(stderr, "appl_forward: hw_ptr = %li, appl_ptr = %li, size = %li\n", *pcm->hw.ptr, *pcm->appl.ptr, size);
1200 snd_pcm_hw_t *hw = pcm->private_data;
1203 query_status_data(hw);
1205 switch (FAST_PCM_STATE(hw)) {
1209 if (SNDRV_PROTOCOL_VERSION(2, 0, 1) <= hw->version) {
1210 if (ioctl(hw->fd, SNDRV_PCM_IOCTL_XRUN) < 0)
1259 snd_pcm_hw_t *hw = pcm->private_data;
1260 __fill_chmap_ctl_id(id, hw->device, hw->subdevice, pcm->stream);
1282 * As the parameters stand, the query is performed only to the hw PCM
1360 static int chmap_caps(snd_pcm_hw_t *hw, int type)
1362 if (hw->chmap_caps & (1 << type))
1364 if (hw->chmap_caps & (1 << (type + 8)))
1369 static void chmap_caps_set_ok(snd_pcm_hw_t *hw, int type)
1371 hw->chmap_caps |= (1 << type);
1374 static void chmap_caps_set_error(snd_pcm_hw_t *hw, int type)
1376 hw->chmap_caps |= (1 << (type + 8));
1381 snd_pcm_hw_t *hw = pcm->private_data;
1384 if (hw->chmap_override)
1385 return _snd_pcm_copy_chmap_query(hw->chmap_override);
1387 if (!chmap_caps(hw, CHMAP_CTL_QUERY))
1390 map = snd_pcm_query_chmaps_from_hw(hw->card, hw->device,
1391 hw->subdevice, pcm->stream);
1393 chmap_caps_set_ok(hw, CHMAP_CTL_QUERY);
1395 chmap_caps_set_error(hw, CHMAP_CTL_QUERY);
1401 snd_pcm_hw_t *hw = pcm->private_data;
1409 if (hw->chmap_override)
1410 return _snd_pcm_choose_fixed_chmap(pcm, hw->chmap_override);
1412 if (!chmap_caps(hw, CHMAP_CTL_GET))
1415 switch (FAST_PCM_STATE(hw)) {
1425 snd_pcm_state_name(FAST_PCM_STATE(hw)));
1432 ret = snd_ctl_hw_open(&ctl, NULL, hw->card, 0);
1436 chmap_caps_set_error(hw, CHMAP_CTL_GET);
1446 chmap_caps_set_error(hw, CHMAP_CTL_GET);
1451 chmap_caps_set_ok(hw, CHMAP_CTL_GET);
1457 snd_pcm_hw_t *hw = pcm->private_data;
1464 if (hw->chmap_override)
1467 if (!chmap_caps(hw, CHMAP_CTL_SET))
1474 if (FAST_PCM_STATE(hw) != SNDRV_PCM_STATE_PREPARED) {
1476 snd_pcm_state_name(FAST_PCM_STATE(hw)));
1479 ret = snd_ctl_hw_open(&ctl, NULL, hw->card, 0);
1482 chmap_caps_set_error(hw, CHMAP_CTL_SET);
1493 chmap_caps_set_ok(hw, CHMAP_CTL_SET);
1495 chmap_caps_set_error(hw, CHMAP_CTL_SET);
1505 snd_pcm_hw_t *hw = pcm->private_data;
1507 int err = snd_card_get_name(hw->card, &name);
1513 hw->card, name, hw->device, hw->subdevice);
1518 snd_output_printf(out, " appl_ptr : %li\n", hw->mmap_control->appl_ptr);
1519 snd_output_printf(out, " hw_ptr : %li\n", hw->mmap_status->hw_ptr);
1604 * \brief Creates a new hw PCM
1621 snd_pcm_hw_t *hw = NULL;
1691 hw = calloc(1, sizeof(snd_pcm_hw_t));
1692 if (!hw) {
1697 hw->version = ver;
1698 hw->card = info.card;
1699 hw->device = info.device;
1700 hw->subdevice = info.subdevice;
1701 hw->fd = fd;
1703 hw->format = SND_PCM_FORMAT_UNKNOWN;
1704 hw->rates.min = hw->rates.max = 0;
1705 hw->channels = 0;
1709 free(hw);
1716 pcm->private_data = hw;
1721 pcm->need_lock = 0; /* hw plugin is thread-safe */
1736 * \brief Creates a new hw PCM
1828 \section pcm_plugins_hw Plugin: hw
1842 type hw # Kernel PCM
1867 * \brief Creates a new hw PCM
1871 * \param conf Configuration node with hw PCM description
1891 snd_pcm_hw_t *hw;
2068 hw = (*pcmp)->private_data;
2070 hw->format = format;
2072 hw->channels = channels;
2074 hw->rates.min = min_rate;
2075 hw->rates.max = max_rate;
2078 hw->chmap_override = chmap;
2079 hw->drain_silence = drain_silence;