Lines Matching refs:pcm

2  * \file pcm/pcm.c
16 * See the \ref pcm page for more details.
39 /*! \page pcm PCM (digital audio) interface
534 defaults.pcm.card 0
535 defaults.pcm.device 0
536 defaults.pcm.subdevice -1
638 \link example_test_pcm alsa-lib/test/pcm.c \endlink
655 \example ../../test/pcm.c
708 static int bad_pcm_state(snd_pcm_t *pcm, unsigned int supported_states,
714 if (pcm->own_state_check)
716 state = snd_pcm_state(pcm);
730 * \param pcm PCM handle
736 const char *snd_pcm_name(snd_pcm_t *pcm)
738 assert(pcm);
739 return pcm->name;
744 * \param pcm PCM handle
749 snd_pcm_type_t snd_pcm_type(snd_pcm_t *pcm)
751 assert(pcm);
752 return pcm->type;
757 * \param pcm PCM handle
762 snd_pcm_stream_t snd_pcm_stream(snd_pcm_t *pcm)
764 assert(pcm);
765 return pcm->stream;
770 * \param pcm PCM handle
776 int snd_pcm_close(snd_pcm_t *pcm)
779 assert(pcm);
780 if (pcm->setup && !pcm->donot_close) {
781 snd_pcm_drop(pcm);
782 err = snd_pcm_hw_free(pcm);
786 if (pcm->mmap_channels)
787 snd_pcm_munmap(pcm);
788 while (!list_empty(&pcm->async_handlers)) {
789 snd_async_handler_t *h = list_entry(pcm->async_handlers.next, snd_async_handler_t, hlist);
792 if (pcm->ops->close)
793 err = pcm->ops->close(pcm->op_arg);
798 err = snd_pcm_free(pcm);
806 * \param pcm PCM handle
812 int snd_pcm_nonblock(snd_pcm_t *pcm, int nonblock)
816 assert(pcm);
820 /* __snd_pcm_lock(pcm->op_arg); */ /* forced lock due to pcm field change */
821 if (pcm->ops->nonblock)
822 err = pcm->ops->nonblock(pcm->op_arg, nonblock);
828 pcm->mode |= SND_PCM_ABORT;
832 pcm->mode |= SND_PCM_NONBLOCK;
834 if (pcm->hw_flags & SND_PCM_HW_PARAMS_NO_PERIOD_WAKEUP)
837 pcm->mode &= ~SND_PCM_NONBLOCK;
840 /* __snd_pcm_unlock(pcm->op_arg); */ /* FIXME: see above */
847 * \param pcm PCM handle
854 int snd_pcm_async(snd_pcm_t *pcm, int sig, pid_t pid)
858 assert(pcm);
866 pcm->lock_enabled = 0;
868 if (pcm->ops->async)
869 err = pcm->ops->async(pcm->op_arg, sig, pid);
878 * \param pcm PCM handle
882 int snd_pcm_info(snd_pcm_t *pcm, snd_pcm_info_t *info)
886 assert(pcm && info);
887 if (pcm->ops->info)
888 err = pcm->ops->info(pcm->op_arg, info);
895 * \param pcm PCM handle
900 int snd_pcm_hw_params_current(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
904 assert(pcm && params);
905 if (!pcm->setup)
908 params->flags = pcm->hw_flags;
909 snd_mask_set(&params->masks[SND_PCM_HW_PARAM_ACCESS - SND_PCM_HW_PARAM_FIRST_MASK], pcm->access);
910 snd_mask_set(&params->masks[SND_PCM_HW_PARAM_FORMAT - SND_PCM_HW_PARAM_FIRST_MASK], pcm->format);
911 snd_mask_set(&params->masks[SND_PCM_HW_PARAM_SUBFORMAT - SND_PCM_HW_PARAM_FIRST_MASK], pcm->subformat);
912 frame_bits = snd_pcm_format_physical_width(pcm->format) * pcm->channels;
914 snd_interval_set_value(&params->intervals[SND_PCM_HW_PARAM_CHANNELS - SND_PCM_HW_PARAM_FIRST_INTERVAL], pcm->channels);
915 snd_interval_set_value(&params->intervals[SND_PCM_HW_PARAM_RATE - SND_PCM_HW_PARAM_FIRST_INTERVAL], pcm->rate);
916 snd_interval_set_value(&params->intervals[SND_PCM_HW_PARAM_PERIOD_TIME - SND_PCM_HW_PARAM_FIRST_INTERVAL], pcm->period_time);
917 snd_interval_set_value(&params->intervals[SND_PCM_HW_PARAM_PERIOD_SIZE - SND_PCM_HW_PARAM_FIRST_INTERVAL], pcm->period_size);
918 snd_interval_copy(&params->intervals[SND_PCM_HW_PARAM_PERIODS - SND_PCM_HW_PARAM_FIRST_INTERVAL], &pcm->periods);
919 snd_interval_copy(&params->intervals[SND_PCM_HW_PARAM_BUFFER_TIME - SND_PCM_HW_PARAM_FIRST_INTERVAL], &pcm->buffer_time);
920 snd_interval_set_value(&params->intervals[SND_PCM_HW_PARAM_BUFFER_SIZE - SND_PCM_HW_PARAM_FIRST_INTERVAL], pcm->buffer_size);
921 snd_interval_set_value(&params->intervals[SND_PCM_HW_PARAM_BUFFER_BYTES - SND_PCM_HW_PARAM_FIRST_INTERVAL], (pcm->buffer_size * frame_bits) / 8);
922 params->info = pcm->info;
923 params->msbits = pcm->msbits;
924 params->rate_num = pcm->rate_num;
925 params->rate_den = pcm->rate_den;
926 params->fifo_size = pcm->fifo_size;
931 * \param pcm PCM handle
951 int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
954 assert(pcm && params);
955 err = _snd_pcm_hw_params_internal(pcm, params);
958 err = snd_pcm_prepare(pcm);
963 * \param pcm PCM handle
968 int snd_pcm_hw_free(snd_pcm_t *pcm)
971 if (! pcm->setup)
973 if (pcm->mmap_channels) {
974 err = snd_pcm_munmap(pcm);
978 // assert(snd_pcm_state(pcm) == SND_PCM_STATE_SETUP ||
979 // snd_pcm_state(pcm) == SND_PCM_STATE_PREPARED);
980 if (pcm->ops->hw_free)
981 err = pcm->ops->hw_free(pcm->op_arg);
984 pcm->setup = 0;
991 * \param pcm PCM handle
1001 int snd_pcm_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
1005 if (CHECK_SANITY(! pcm->setup)) {
1017 if (params->start_threshold <= pcm->buffer_size &&
1018 params->start_threshold > (pcm->buffer_size / params->avail_min) * params->avail_min) {
1023 __snd_pcm_lock(pcm->op_arg); /* forced lock due to pcm field change */
1024 if (pcm->ops->sw_params)
1025 err = pcm->ops->sw_params(pcm->op_arg, params);
1029 __snd_pcm_unlock(pcm->op_arg);
1032 pcm->tstamp_mode = params->tstamp_mode;
1033 pcm->tstamp_type = params->tstamp_type;
1034 pcm->period_step = params->period_step;
1035 pcm->avail_min = params->avail_min;
1036 pcm->period_event = sw_get_period_event(params);
1037 pcm->start_threshold = params->start_threshold;
1038 pcm->stop_threshold = params->stop_threshold;
1039 pcm->silence_threshold = params->silence_threshold;
1040 pcm->silence_size = params->silence_size;
1041 pcm->boundary = params->boundary;
1042 __snd_pcm_unlock(pcm->op_arg);
1048 * \param pcm PCM handle
1054 int snd_pcm_status(snd_pcm_t *pcm, snd_pcm_status_t *status)
1058 assert(pcm && status);
1059 snd_pcm_lock(pcm->fast_op_arg);
1060 if (pcm->fast_ops->status)
1061 err = pcm->fast_ops->status(pcm->fast_op_arg, status);
1064 snd_pcm_unlock(pcm->fast_op_arg);
1071 * \param pcm PCM handle
1083 snd_pcm_state_t snd_pcm_state(snd_pcm_t *pcm)
1087 assert(pcm);
1088 snd_pcm_lock(pcm->fast_op_arg);
1089 state = __snd_pcm_state(pcm);
1090 snd_pcm_unlock(pcm->fast_op_arg);
1096 * \param pcm PCM handle
1107 int snd_pcm_hwsync(snd_pcm_t *pcm)
1111 assert(pcm);
1112 if (CHECK_SANITY(! pcm->setup)) {
1116 snd_pcm_lock(pcm->fast_op_arg);
1117 err = __snd_pcm_hwsync(pcm);
1118 snd_pcm_unlock(pcm->fast_op_arg);
1124 * \param pcm PCM handle
1152 int snd_pcm_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
1156 assert(pcm);
1157 if (CHECK_SANITY(! pcm->setup)) {
1161 snd_pcm_lock(pcm->fast_op_arg);
1162 err = __snd_pcm_delay(pcm, delayp);
1163 snd_pcm_unlock(pcm->fast_op_arg);
1169 * \param pcm PCM handle
1181 int snd_pcm_resume(snd_pcm_t *pcm)
1185 assert(pcm);
1186 if (CHECK_SANITY(! pcm->setup)) {
1191 if (pcm->fast_ops->resume)
1192 err = pcm->fast_ops->resume(pcm->fast_op_arg);
1200 * \param pcm PCM handle
1210 int snd_pcm_htimestamp(snd_pcm_t *pcm, snd_pcm_uframes_t *avail, snd_htimestamp_t *tstamp)
1214 assert(pcm);
1215 if (CHECK_SANITY(! pcm->setup)) {
1219 snd_pcm_lock(pcm->fast_op_arg);
1220 if (pcm->fast_ops->htimestamp)
1221 err = pcm->fast_ops->htimestamp(pcm->fast_op_arg, avail, tstamp);
1224 snd_pcm_unlock(pcm->fast_op_arg);
1230 * \param pcm PCM handle
1235 int snd_pcm_prepare(snd_pcm_t *pcm)
1239 assert(pcm);
1240 if (CHECK_SANITY(! pcm->setup)) {
1244 err = bad_pcm_state(pcm, ~P_STATE(DISCONNECTED), 0);
1247 snd_pcm_lock(pcm->fast_op_arg);
1248 if (pcm->fast_ops->prepare)
1249 err = pcm->fast_ops->prepare(pcm->fast_op_arg);
1252 snd_pcm_unlock(pcm->fast_op_arg);
1258 * \param pcm PCM handle
1265 int snd_pcm_reset(snd_pcm_t *pcm)
1269 assert(pcm);
1270 if (CHECK_SANITY(! pcm->setup)) {
1274 snd_pcm_lock(pcm->fast_op_arg);
1275 if (pcm->fast_ops->reset)
1276 err = pcm->fast_ops->reset(pcm->fast_op_arg);
1279 snd_pcm_unlock(pcm->fast_op_arg);
1285 * \param pcm PCM handle
1290 int snd_pcm_start(snd_pcm_t *pcm)
1294 assert(pcm);
1295 if (CHECK_SANITY(! pcm->setup)) {
1299 err = bad_pcm_state(pcm, P_STATE(PREPARED), 0);
1302 snd_pcm_lock(pcm->fast_op_arg);
1303 err = __snd_pcm_start(pcm);
1304 snd_pcm_unlock(pcm->fast_op_arg);
1310 * \param pcm PCM handle
1321 int snd_pcm_drop(snd_pcm_t *pcm)
1325 assert(pcm);
1326 if (CHECK_SANITY(! pcm->setup)) {
1330 err = bad_pcm_state(pcm, P_STATE_RUNNABLE | P_STATE(SETUP) |
1334 snd_pcm_lock(pcm->fast_op_arg);
1335 if (pcm->fast_ops->drop)
1336 err = pcm->fast_ops->drop(pcm->fast_op_arg);
1339 snd_pcm_unlock(pcm->fast_op_arg);
1345 * \param pcm PCM handle
1358 int snd_pcm_drain(snd_pcm_t *pcm)
1362 assert(pcm);
1363 if (CHECK_SANITY(! pcm->setup)) {
1367 err = bad_pcm_state(pcm, P_STATE_RUNNABLE | P_STATE(SETUP), P_STATE(SETUP));
1373 if (pcm->fast_ops->drain)
1374 err = pcm->fast_ops->drain(pcm->fast_op_arg);
1382 * \param pcm PCM handle
1392 int snd_pcm_pause(snd_pcm_t *pcm, int enable)
1396 assert(pcm);
1397 if (CHECK_SANITY(! pcm->setup)) {
1401 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1404 snd_pcm_lock(pcm->fast_op_arg);
1405 if (pcm->fast_ops->pause)
1406 err = pcm->fast_ops->pause(pcm->fast_op_arg, enable);
1409 snd_pcm_unlock(pcm->fast_op_arg);
1415 * \param pcm PCM handle
1424 snd_pcm_sframes_t snd_pcm_rewindable(snd_pcm_t *pcm)
1429 assert(pcm);
1430 if (CHECK_SANITY(! pcm->setup)) {
1434 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1437 snd_pcm_lock(pcm->fast_op_arg);
1438 if (pcm->fast_ops->rewindable)
1439 result = pcm->fast_ops->rewindable(pcm->fast_op_arg);
1442 snd_pcm_unlock(pcm->fast_op_arg);
1448 * \param pcm PCM handle
1455 snd_pcm_sframes_t snd_pcm_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1460 assert(pcm);
1461 if (CHECK_SANITY(! pcm->setup)) {
1467 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1470 snd_pcm_lock(pcm->fast_op_arg);
1471 if (pcm->fast_ops->rewind)
1472 result = pcm->fast_ops->rewind(pcm->fast_op_arg, frames);
1475 snd_pcm_unlock(pcm->fast_op_arg);
1481 * \param pcm PCM handle
1490 snd_pcm_sframes_t snd_pcm_forwardable(snd_pcm_t *pcm)
1495 assert(pcm);
1496 if (CHECK_SANITY(! pcm->setup)) {
1500 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1503 snd_pcm_lock(pcm->fast_op_arg);
1504 if (pcm->fast_ops->forwardable)
1505 result = pcm->fast_ops->forwardable(pcm->fast_op_arg);
1508 snd_pcm_unlock(pcm->fast_op_arg);
1514 * \param pcm PCM handle
1522 EXPORT_SYMBOL snd_pcm_sframes_t INTERNAL(snd_pcm_forward)(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1524 snd_pcm_sframes_t snd_pcm_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
1530 assert(pcm);
1531 if (CHECK_SANITY(! pcm->setup)) {
1537 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1540 snd_pcm_lock(pcm->fast_op_arg);
1541 if (pcm->fast_ops->forward)
1542 result = pcm->fast_ops->forward(pcm->fast_op_arg, frames);
1545 snd_pcm_unlock(pcm->fast_op_arg);
1552 * \param pcm PCM handle
1569 snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size)
1573 assert(pcm);
1575 if (CHECK_SANITY(! pcm->setup)) {
1579 if (pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED) {
1580 SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
1583 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1586 return _snd_pcm_writei(pcm, buffer, size);
1591 * \param pcm PCM handle
1608 snd_pcm_sframes_t snd_pcm_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
1612 assert(pcm);
1614 if (CHECK_SANITY(! pcm->setup)) {
1618 if (pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
1619 SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
1622 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1625 return _snd_pcm_writen(pcm, bufs, size);
1630 * \param pcm PCM handle
1647 snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size)
1651 assert(pcm);
1653 if (CHECK_SANITY(! pcm->setup)) {
1657 if (pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED) {
1658 SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
1661 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1664 return _snd_pcm_readi(pcm, buffer, size);
1669 * \param pcm PCM handle
1686 snd_pcm_sframes_t snd_pcm_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
1690 assert(pcm);
1692 if (CHECK_SANITY(! pcm->setup)) {
1696 if (pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
1697 SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
1700 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
1703 return _snd_pcm_readn(pcm, bufs, size);
1729 * \param pcm PCM handle
1732 int snd_pcm_unlink(snd_pcm_t *pcm)
1736 assert(pcm);
1737 if (pcm->fast_ops->unlink)
1738 err = pcm->fast_ops->unlink(pcm->fast_op_arg);
1745 static int __snd_pcm_poll_descriptors_count(snd_pcm_t *pcm)
1747 if (pcm->fast_ops->poll_descriptors_count)
1748 return pcm->fast_ops->poll_descriptors_count(pcm->fast_op_arg);
1749 return pcm->poll_fd_count;
1754 * \param pcm PCM handle
1759 int snd_pcm_poll_descriptors_count(snd_pcm_t *pcm)
1763 assert(pcm);
1764 snd_pcm_lock(pcm->fast_op_arg);
1765 count = __snd_pcm_poll_descriptors_count(pcm);
1766 snd_pcm_unlock(pcm->fast_op_arg);
1771 static int __snd_pcm_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds,
1774 if (pcm->fast_ops->poll_descriptors)
1775 return pcm->fast_ops->poll_descriptors(pcm->fast_op_arg, pfds, space);
1776 if (pcm->poll_fd < 0) {
1781 pfds->fd = pcm->poll_fd;
1782 pfds->events = pcm->poll_events | POLLERR | POLLNVAL;
1791 * \param pcm PCM handle
1823 int snd_pcm_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space)
1827 assert(pcm && pfds);
1828 snd_pcm_lock(pcm->fast_op_arg);
1829 err = __snd_pcm_poll_descriptors(pcm, pfds, space);
1830 snd_pcm_unlock(pcm->fast_op_arg);
1834 static int __snd_pcm_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds,
1839 * \param pcm PCM handle
1865 int snd_pcm_poll_descriptors_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
1869 assert(pcm && pfds && revents);
1870 snd_pcm_lock(pcm->fast_op_arg);
1871 err = __snd_pcm_poll_revents(pcm, pfds, nfds, revents);
1872 snd_pcm_unlock(pcm->fast_op_arg);
1876 static int __snd_pcm_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds,
1879 if (pcm->fast_ops->poll_revents)
1880 return pcm->fast_ops->poll_revents(pcm->fast_op_arg, pfds, nfds, revents);
2334 * \param pcm PCM handle
2338 int snd_pcm_dump_hw_setup(snd_pcm_t *pcm, snd_output_t *out)
2340 assert(pcm);
2342 if (CHECK_SANITY(! pcm->setup)) {
2346 snd_output_printf(out, " stream : %s\n", snd_pcm_stream_name(pcm->stream));
2347 snd_output_printf(out, " access : %s\n", snd_pcm_access_name(pcm->access));
2348 snd_output_printf(out, " format : %s\n", snd_pcm_format_name(pcm->format));
2349 snd_output_printf(out, " subformat : %s\n", snd_pcm_subformat_name(pcm->subformat));
2350 snd_output_printf(out, " channels : %u\n", pcm->channels);
2351 snd_output_printf(out, " rate : %u\n", pcm->rate);
2353 (pcm->rate_den ? ((double) pcm->rate_num / pcm->rate_den) : 0.0),
2354 pcm->rate_num, pcm->rate_den);
2355 snd_output_printf(out, " msbits : %u\n", pcm->msbits);
2356 snd_output_printf(out, " buffer_size : %lu\n", pcm->buffer_size);
2357 snd_output_printf(out, " period_size : %lu\n", pcm->period_size);
2358 snd_output_printf(out, " period_time : %u\n", pcm->period_time);
2364 * \param pcm PCM handle
2368 int snd_pcm_dump_sw_setup(snd_pcm_t *pcm, snd_output_t *out)
2370 assert(pcm);
2372 if (CHECK_SANITY(! pcm->setup)) {
2376 snd_output_printf(out, " tstamp_mode : %s\n", snd_pcm_tstamp_mode_name(pcm->tstamp_mode));
2377 snd_output_printf(out, " tstamp_type : %s\n", snd_pcm_tstamp_type_name(pcm->tstamp_type));
2378 snd_output_printf(out, " period_step : %d\n", pcm->period_step);
2379 snd_output_printf(out, " avail_min : %ld\n", pcm->avail_min);
2380 snd_output_printf(out, " period_event : %i\n", pcm->period_event);
2381 snd_output_printf(out, " start_threshold : %ld\n", pcm->start_threshold);
2382 snd_output_printf(out, " stop_threshold : %ld\n", pcm->stop_threshold);
2383 snd_output_printf(out, " silence_threshold: %ld\n", pcm->silence_threshold);
2384 snd_output_printf(out, " silence_size : %ld\n", pcm->silence_size);
2385 snd_output_printf(out, " boundary : %ld\n", pcm->boundary);
2391 * \param pcm PCM handle
2395 int snd_pcm_dump_setup(snd_pcm_t *pcm, snd_output_t *out)
2397 snd_pcm_dump_hw_setup(pcm, out);
2398 snd_pcm_dump_sw_setup(pcm, out);
2425 * \param pcm PCM handle
2429 int snd_pcm_dump(snd_pcm_t *pcm, snd_output_t *out)
2433 assert(pcm);
2435 if (pcm->ops->dump)
2436 pcm->ops->dump(pcm->op_arg, out);
2444 * \param pcm PCM handle
2448 snd_pcm_sframes_t snd_pcm_bytes_to_frames(snd_pcm_t *pcm, ssize_t bytes)
2450 assert(pcm);
2451 if (CHECK_SANITY(! pcm->setup)) {
2455 return bytes * 8 / pcm->frame_bits;
2460 * \param pcm PCM handle
2464 ssize_t snd_pcm_frames_to_bytes(snd_pcm_t *pcm, snd_pcm_sframes_t frames)
2466 assert(pcm);
2467 if (CHECK_SANITY(! pcm->setup)) {
2471 return frames * pcm->frame_bits / 8;
2476 * \param pcm PCM handle
2480 long snd_pcm_bytes_to_samples(snd_pcm_t *pcm, ssize_t bytes)
2482 assert(pcm);
2483 if (CHECK_SANITY(! pcm->setup)) {
2487 return bytes * 8 / pcm->sample_bits;
2492 * \param pcm PCM handle
2496 ssize_t snd_pcm_samples_to_bytes(snd_pcm_t *pcm, long samples)
2498 assert(pcm);
2499 if (CHECK_SANITY(! pcm->setup)) {
2503 return samples * pcm->sample_bits / 8;
2509 * \param pcm PCM handle
2516 int snd_async_add_pcm_handler(snd_async_handler_t **handler, snd_pcm_t *pcm,
2522 err = snd_async_add_handler(&h, _snd_pcm_async_descriptor(pcm),
2527 h->u.pcm = pcm;
2528 was_empty = list_empty(&pcm->async_handlers);
2529 list_add_tail(&h->hlist, &pcm->async_handlers);
2531 err = snd_pcm_async(pcm, snd_async_handler_get_signo(h), getpid());
2552 return handler->u.pcm;
2687 err = snd_config_search(pcm_root, "defaults.pcm.compat", &tmp);
2699 err = snd_config_search(pcm_root, "defaults.pcm.minperiodtime", &tmp);
2720 err = snd_config_search_definition(root, "pcm", name, &pcm_conf);
2810 snd_pcm_t *pcm;
2815 pcm = calloc(1, sizeof(*pcm));
2816 if (!pcm)
2818 pcm->type = type;
2820 pcm->name = strdup(name);
2821 pcm->stream = stream;
2822 pcm->mode = mode;
2823 pcm->poll_fd_count = 1;
2824 pcm->poll_fd = -1;
2825 pcm->op_arg = pcm;
2826 pcm->fast_op_arg = pcm;
2827 INIT_LIST_HEAD(&pcm->async_handlers);
2833 pthread_mutex_init(&pcm->lock, &attr);
2838 pcm->need_lock = 1;
2841 pcm->lock_enabled = 0;
2851 pcm->lock_enabled = do_lock_enable;
2854 *pcmp = pcm;
2858 int snd_pcm_free(snd_pcm_t *pcm)
2860 assert(pcm);
2861 free(pcm->name);
2862 free(pcm->hw.link_dst);
2863 free(pcm->appl.link_dst);
2864 snd_dlobj_cache_put(pcm->open_func);
2866 pthread_mutex_destroy(&pcm->lock);
2868 free(pcm);
2891 * \param pcm PCM handle
2903 int snd_pcm_wait(snd_pcm_t *pcm, int timeout)
2907 __snd_pcm_lock(pcm->fast_op_arg); /* forced lock */
2908 err = __snd_pcm_wait_in_lock(pcm, timeout);
2909 __snd_pcm_unlock(pcm->fast_op_arg);
2915 int __snd_pcm_wait_in_lock(snd_pcm_t *pcm, int timeout)
2920 if (__snd_pcm_state(pcm) != SND_PCM_STATE_DRAINING &&
2921 !snd_pcm_may_wait_for_avail_min(pcm, snd_pcm_mmap_avail(pcm))) {
2923 err = pcm_state_to_error(__snd_pcm_state(pcm));
2926 return snd_pcm_wait_nocheck(pcm, timeout);
2929 static int __snd_pcm_wait_io_timeout(snd_pcm_t *pcm)
2934 timeout = (pcm->period_size * 1000ULL) / pcm->rate;
2943 static int __snd_pcm_wait_drain_timeout(snd_pcm_t *pcm)
2948 if (snd_pcm_stream(pcm) == SND_PCM_STREAM_CAPTURE)
2951 timeout = (snd_pcm_mmap_playback_delay(pcm) * 1000LL) / pcm->rate;
2965 * This function is called inside pcm lock.
2967 int snd_pcm_wait_nocheck(snd_pcm_t *pcm, int timeout)
2973 npfds = __snd_pcm_poll_descriptors_count(pcm);
2979 err = __snd_pcm_poll_descriptors(pcm, pfd, npfds);
2987 timeout = __snd_pcm_wait_io_timeout(pcm);
2989 timeout = __snd_pcm_wait_drain_timeout(pcm);
2993 __snd_pcm_unlock(pcm->fast_op_arg);
2995 __snd_pcm_lock(pcm->fast_op_arg);
2997 if (errno == EINTR && !PCMINABORT(pcm) && !(pcm->mode & SND_PCM_EINTR))
3003 err = __snd_pcm_poll_revents(pcm, pfd, npfds, &revents);
3008 err = pcm_state_to_error(__snd_pcm_state(pcm));
3015 __snd_pcm_hwsync(pcm);
3016 avail_update = __snd_pcm_avail_update(pcm);
3017 if (avail_update < (snd_pcm_sframes_t)pcm->avail_min) {
3019 printf("avail_min = %li, avail_update = %li\n", pcm->avail_min, avail_update);
3029 * \param pcm PCM handle
3050 snd_pcm_sframes_t snd_pcm_avail_update(snd_pcm_t *pcm)
3054 snd_pcm_lock(pcm->fast_op_arg);
3055 result = __snd_pcm_avail_update(pcm);
3056 snd_pcm_unlock(pcm->fast_op_arg);
3062 * \param pcm PCM handle
3074 snd_pcm_sframes_t snd_pcm_avail(snd_pcm_t *pcm)
3079 assert(pcm);
3080 if (CHECK_SANITY(! pcm->setup)) {
3084 snd_pcm_lock(pcm->fast_op_arg);
3085 err = __snd_pcm_hwsync(pcm);
3089 result = __snd_pcm_avail_update(pcm);
3090 snd_pcm_unlock(pcm->fast_op_arg);
3096 * \param pcm PCM handle
3105 int snd_pcm_avail_delay(snd_pcm_t *pcm,
3112 assert(pcm && availp && delayp);
3113 if (CHECK_SANITY(! pcm->setup)) {
3117 snd_pcm_lock(pcm->fast_op_arg);
3118 err = __snd_pcm_hwsync(pcm);
3121 sf = __snd_pcm_avail_update(pcm);
3126 err = __snd_pcm_delay(pcm, delayp);
3132 snd_pcm_unlock(pcm->fast_op_arg);
3953 * \param pcm PCM handle
3964 int snd_pcm_hw_params_any(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
3967 return snd_pcm_hw_refine(pcm, params);
4343 * \param pcm PCM handle
4348 int snd_pcm_hw_params_test_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t access)
4350 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_ACCESS, access, 0);
4355 * \param pcm PCM handle
4360 int snd_pcm_hw_params_set_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t access)
4362 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_ACCESS, access, 0);
4367 * \param pcm PCM handle
4373 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_access_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *access)
4375 int snd_pcm_hw_params_set_access_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *access)
4378 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_ACCESS, access, NULL);
4383 * \param pcm PCM handle
4389 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_access_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *access)
4391 int snd_pcm_hw_params_set_access_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *access)
4394 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_ACCESS, access, NULL);
4399 * \param pcm PCM handle
4404 int snd_pcm_hw_params_set_access_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_mask_t *mask)
4406 return snd_pcm_hw_param_set_mask(pcm, params, SND_TRY, SND_PCM_HW_PARAM_ACCESS, (snd_mask_t *) mask);
4440 * \param pcm PCM handle
4445 int snd_pcm_hw_params_test_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t format)
4447 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_FORMAT, format, 0);
4452 * \param pcm PCM handle
4457 int snd_pcm_hw_params_set_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t format)
4459 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_FORMAT, format, 0);
4464 * \param pcm PCM handle
4470 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_format_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format)
4472 int snd_pcm_hw_params_set_format_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format)
4475 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_FORMAT, (unsigned int *)format, NULL);
4480 * \param pcm PCM handle
4486 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_format_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format)
4488 int snd_pcm_hw_params_set_format_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format)
4491 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_FORMAT, (unsigned int *)format, NULL);
4496 * \param pcm PCM handle
4501 int snd_pcm_hw_params_set_format_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_mask_t *mask)
4503 return snd_pcm_hw_param_set_mask(pcm, params, SND_TRY, SND_PCM_HW_PARAM_FORMAT, (snd_mask_t *) mask);
4534 * \param pcm PCM handle
4539 int snd_pcm_hw_params_test_subformat(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t subformat)
4541 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_SUBFORMAT, subformat, 0);
4546 * \param pcm PCM handle
4551 int snd_pcm_hw_params_set_subformat(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t subformat)
4553 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_SUBFORMAT, subformat, 0);
4558 * \param pcm PCM handle
4564 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_subformat_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat)
4566 int snd_pcm_hw_params_set_subformat_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat)
4569 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_SUBFORMAT, (unsigned int *)subformat, NULL);
4574 * \param pcm PCM handle
4580 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_subformat_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat)
4582 int snd_pcm_hw_params_set_subformat_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat)
4585 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_SUBFORMAT, (unsigned int *)subformat, NULL);
4590 * \param pcm PCM handle
4595 int snd_pcm_hw_params_set_subformat_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_mask_t *mask)
4597 return snd_pcm_hw_param_set_mask(pcm, params, SND_TRY, SND_PCM_HW_PARAM_SUBFORMAT, (snd_mask_t *) mask);
4658 * \param pcm PCM handle
4663 int snd_pcm_hw_params_test_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val)
4665 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_CHANNELS, val, 0);
4670 * \param pcm PCM handle
4675 int snd_pcm_hw_params_set_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val)
4677 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_CHANNELS, val, 0);
4682 * \param pcm PCM handle
4687 int snd_pcm_hw_params_set_channels_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4689 return snd_pcm_hw_param_set_min(pcm, params, SND_TRY, SND_PCM_HW_PARAM_CHANNELS, val, NULL);
4694 * \param pcm PCM handle
4699 int snd_pcm_hw_params_set_channels_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4701 return snd_pcm_hw_param_set_max(pcm, params, SND_TRY, SND_PCM_HW_PARAM_CHANNELS, val, NULL);
4706 * \param pcm PCM handle
4712 int snd_pcm_hw_params_set_channels_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, unsigned int *max)
4714 return snd_pcm_hw_param_set_minmax(pcm, params, SND_TRY, SND_PCM_HW_PARAM_CHANNELS, min, NULL, max, NULL);
4719 * \param pcm PCM handle
4725 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_channels_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4727 int snd_pcm_hw_params_set_channels_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4730 return snd_pcm_hw_param_set_near(pcm, params, SND_PCM_HW_PARAM_CHANNELS, val, NULL);
4735 * \param pcm PCM handle
4741 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_channels_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4743 int snd_pcm_hw_params_set_channels_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4746 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_CHANNELS, val, NULL);
4751 * \param pcm PCM handle
4757 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_channels_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4759 int snd_pcm_hw_params_set_channels_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4762 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_CHANNELS, val, NULL);
4822 * \param pcm PCM handle
4830 int snd_pcm_hw_params_test_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
4832 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_RATE, val, dir);
4837 * \param pcm PCM handle
4845 int snd_pcm_hw_params_set_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
4847 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_RATE, val, dir);
4852 * \param pcm PCM handle
4860 int snd_pcm_hw_params_set_rate_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4862 return snd_pcm_hw_param_set_min(pcm, params, SND_TRY, SND_PCM_HW_PARAM_RATE, val, dir);
4867 * \param pcm PCM handle
4875 int snd_pcm_hw_params_set_rate_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4877 return snd_pcm_hw_param_set_max(pcm, params, SND_TRY, SND_PCM_HW_PARAM_RATE, val, dir);
4882 * \param pcm PCM handle
4892 int snd_pcm_hw_params_set_rate_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir)
4894 return snd_pcm_hw_param_set_minmax(pcm, params, SND_TRY, SND_PCM_HW_PARAM_RATE, min, mindir, max, maxdir);
4899 * \param pcm PCM handle
4908 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_rate_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4910 int snd_pcm_hw_params_set_rate_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4913 return snd_pcm_hw_param_set_near(pcm, params, SND_PCM_HW_PARAM_RATE, val, dir);
4918 * \param pcm PCM handle
4927 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_rate_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4929 int snd_pcm_hw_params_set_rate_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4932 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_RATE, val, dir);
4937 * \param pcm PCM handle
4946 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_rate_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4948 int snd_pcm_hw_params_set_rate_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
4951 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_RATE, val, dir);
4956 * \param pcm PCM handle
4961 int snd_pcm_hw_params_set_rate_resample(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val)
4963 assert(pcm && params);
4969 return snd_pcm_hw_refine(pcm, params);
4974 * \param pcm PCM handle
4979 int snd_pcm_hw_params_get_rate_resample(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
4981 assert(pcm && params && val);
4988 * \param pcm PCM handle
4993 int snd_pcm_hw_params_set_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val)
4995 assert(pcm && params);
5001 return snd_pcm_hw_refine(pcm, params);
5006 * \param pcm PCM handle
5011 int snd_pcm_hw_params_get_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
5013 assert(pcm && params && val);
5020 * \param pcm PCM handle
5040 int snd_pcm_hw_params_set_period_wakeup(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val)
5042 assert(pcm && params);
5045 if (!(pcm->mode & SND_PCM_NONBLOCK))
5052 return snd_pcm_hw_refine(pcm, params);
5057 * \param pcm PCM handle
5062 int snd_pcm_hw_params_get_period_wakeup(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
5064 assert(pcm && params && val);
5071 * \param pcm PCM handle
5081 int snd_pcm_hw_params_set_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val)
5083 assert(pcm && params);
5089 return snd_pcm_hw_refine(pcm, params);
5094 * \param pcm PCM handle
5099 int snd_pcm_hw_params_get_drain_silence(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val)
5101 assert(pcm && params && val);
5162 * \param pcm PCM handle
5170 int snd_pcm_hw_params_test_period_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
5172 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_PERIOD_TIME, val, dir);
5177 * \param pcm PCM handle
5185 int snd_pcm_hw_params_set_period_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
5187 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_TIME, val, dir);
5193 * \param pcm PCM handle
5201 int snd_pcm_hw_params_set_period_time_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5203 return snd_pcm_hw_param_set_min(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_TIME, val, dir);
5208 * \param pcm PCM handle
5216 int snd_pcm_hw_params_set_period_time_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5218 return snd_pcm_hw_param_set_max(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_TIME, val, dir);
5223 * \param pcm PCM handle
5233 int snd_pcm_hw_params_set_period_time_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir)
5235 return snd_pcm_hw_param_set_minmax(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_TIME, min, mindir, max, maxdir);
5240 * \param pcm PCM handle
5249 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_period_time_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5251 int snd_pcm_hw_params_set_period_time_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5254 return snd_pcm_hw_param_set_near(pcm, params, SND_PCM_HW_PARAM_PERIOD_TIME, val, dir);
5259 * \param pcm PCM handle
5268 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_period_time_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5270 int snd_pcm_hw_params_set_period_time_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5273 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_PERIOD_TIME, val, dir);
5278 * \param pcm PCM handle
5285 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_period_time_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5287 int snd_pcm_hw_params_set_period_time_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5290 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_PERIOD_TIME, val, dir);
5362 * \param pcm PCM handle
5370 int snd_pcm_hw_params_test_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir)
5372 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_PERIOD_SIZE, val, dir);
5377 * \param pcm PCM handle
5385 int snd_pcm_hw_params_set_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir)
5387 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_SIZE, val, dir);
5392 * \param pcm PCM handle
5400 int snd_pcm_hw_params_set_period_size_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5403 int err = snd_pcm_hw_param_set_min(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_SIZE, &_val, dir);
5411 * \param pcm PCM handle
5419 int snd_pcm_hw_params_set_period_size_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5422 int err = snd_pcm_hw_param_set_max(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_SIZE, &_val, dir);
5430 * \param pcm PCM handle
5440 int snd_pcm_hw_params_set_period_size_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *min, int *mindir, snd_pcm_uframes_t *max, int *maxdir)
5444 int err = snd_pcm_hw_param_set_minmax(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_SIZE, &_min, mindir, &_max, maxdir);
5452 * \param pcm PCM handle
5461 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_period_size_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5463 int snd_pcm_hw_params_set_period_size_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5467 int err = snd_pcm_hw_param_set_near(pcm, params, SND_PCM_HW_PARAM_PERIOD_SIZE, &_val, dir);
5475 * \param pcm PCM handle
5484 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_period_size_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5486 int snd_pcm_hw_params_set_period_size_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5490 int err = snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_PERIOD_SIZE, &_val, dir);
5498 * \param pcm PCM handle
5507 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_period_size_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5509 int snd_pcm_hw_params_set_period_size_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
5513 int err = snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_PERIOD_SIZE, &_val, dir);
5521 * \param pcm PCM handle
5525 int snd_pcm_hw_params_set_period_size_integer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
5527 return snd_pcm_hw_param_set_integer(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIOD_SIZE);
5587 * \param pcm PCM handle
5595 int snd_pcm_hw_params_test_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
5597 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_PERIODS, val, dir);
5602 * \param pcm PCM handle
5610 int snd_pcm_hw_params_set_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
5612 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIODS, val, dir);
5617 * \param pcm PCM handle
5625 int snd_pcm_hw_params_set_periods_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5627 return snd_pcm_hw_param_set_min(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIODS, val, dir);
5632 * \param pcm PCM handle
5640 int snd_pcm_hw_params_set_periods_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5642 return snd_pcm_hw_param_set_max(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIODS, val, dir);
5647 * \param pcm PCM handle
5657 int snd_pcm_hw_params_set_periods_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir)
5659 return snd_pcm_hw_param_set_minmax(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIODS, min, mindir, max, maxdir);
5664 * \param pcm PCM handle
5673 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_periods_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5675 int snd_pcm_hw_params_set_periods_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5678 return snd_pcm_hw_param_set_near(pcm, params, SND_PCM_HW_PARAM_PERIODS, val, dir);
5683 * \param pcm PCM handle
5692 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_periods_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5694 int snd_pcm_hw_params_set_periods_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5697 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_PERIODS, val, dir);
5702 * \param pcm PCM handle
5711 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_periods_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5713 int snd_pcm_hw_params_set_periods_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5716 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_PERIODS, val, dir);
5721 * \param pcm PCM handle
5725 int snd_pcm_hw_params_set_periods_integer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
5727 return snd_pcm_hw_param_set_integer(pcm, params, SND_TRY, SND_PCM_HW_PARAM_PERIODS);
5787 * \param pcm PCM handle
5795 int snd_pcm_hw_params_test_buffer_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
5797 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_BUFFER_TIME, val, dir);
5802 * \param pcm PCM handle
5810 int snd_pcm_hw_params_set_buffer_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir)
5812 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_TIME, val, dir);
5817 * \param pcm PCM handle
5825 int snd_pcm_hw_params_set_buffer_time_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5827 return snd_pcm_hw_param_set_min(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_TIME, val, dir);
5832 * \param pcm PCM handle
5840 int snd_pcm_hw_params_set_buffer_time_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5842 return snd_pcm_hw_param_set_max(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_TIME, val, dir);
5847 * \param pcm PCM handle
5857 int snd_pcm_hw_params_set_buffer_time_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir)
5859 return snd_pcm_hw_param_set_minmax(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_TIME, min, mindir, max, maxdir);
5864 * \param pcm PCM handle
5873 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5875 int snd_pcm_hw_params_set_buffer_time_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5878 return snd_pcm_hw_param_set_near(pcm, params, SND_PCM_HW_PARAM_BUFFER_TIME, val, dir);
5883 * \param pcm PCM handle
5892 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_buffer_time_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5894 int snd_pcm_hw_params_set_buffer_time_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5897 return snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_BUFFER_TIME, val, dir);
5902 * \param pcm PCM handle
5911 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_buffer_time_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5913 int snd_pcm_hw_params_set_buffer_time_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
5916 return snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_BUFFER_TIME, val, dir);
5981 * \param pcm PCM handle
5988 int snd_pcm_hw_params_test_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val)
5990 return snd_pcm_hw_param_set(pcm, params, SND_TEST, SND_PCM_HW_PARAM_BUFFER_SIZE, val, 0);
5995 * \param pcm PCM handle
6002 int snd_pcm_hw_params_set_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val)
6004 return snd_pcm_hw_param_set(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_SIZE, val, 0);
6009 * \param pcm PCM handle
6014 int snd_pcm_hw_params_set_buffer_size_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6017 int err = snd_pcm_hw_param_set_min(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_SIZE, &_val, NULL);
6025 * \param pcm PCM handle
6030 int snd_pcm_hw_params_set_buffer_size_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6033 int err = snd_pcm_hw_param_set_max(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_SIZE, &_val, NULL);
6041 * \param pcm PCM handle
6047 int snd_pcm_hw_params_set_buffer_size_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *min, snd_pcm_uframes_t *max)
6051 int err = snd_pcm_hw_param_set_minmax(pcm, params, SND_TRY, SND_PCM_HW_PARAM_BUFFER_SIZE, &_min, NULL, &_max, NULL);
6059 * \param pcm PCM handle
6065 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_buffer_size_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6067 int snd_pcm_hw_params_set_buffer_size_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6071 int err = snd_pcm_hw_param_set_near(pcm, params, SND_PCM_HW_PARAM_BUFFER_SIZE, &_val, NULL);
6079 * \param pcm PCM handle
6085 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_buffer_size_first)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6087 int snd_pcm_hw_params_set_buffer_size_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6091 int err = snd_pcm_hw_param_set_first(pcm, params, SND_PCM_HW_PARAM_BUFFER_SIZE, &_val, NULL);
6099 * \param pcm PCM handle
6105 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_buffer_size_last)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6107 int snd_pcm_hw_params_set_buffer_size_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
6111 int err = snd_pcm_hw_param_set_last(pcm, params, SND_PCM_HW_PARAM_BUFFER_SIZE, &_val, NULL);
6177 * \param pcm PCM handle
6185 int snd_pcm_hw_params_test_tick_time(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int val, int dir ATTRIBUTE_UNUSED)
6192 * \param pcm PCM handle
6200 int snd_pcm_hw_params_set_tick_time(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int val ATTRIBUTE_UNUSED, int dir ATTRIBUTE_UNUSED)
6207 * \param pcm PCM handle
6215 int snd_pcm_hw_params_set_tick_time_min(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int *val ATTRIBUTE_UNUSED, int *dir ATTRIBUTE_UNUSED)
6222 * \param pcm PCM handle
6230 int snd_pcm_hw_params_set_tick_time_max(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int *val ATTRIBUTE_UNUSED, int *dir ATTRIBUTE_UNUSED)
6237 * \param pcm PCM handle
6247 int snd_pcm_hw_params_set_tick_time_minmax(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int *min ATTRIBUTE_UNUSED, int *mindir ATTRIBUTE_UNUSED, unsigned int *max ATTRIBUTE_UNUSED, int *maxdir ATTRIBUTE_UNUSED)
6254 * \param pcm PCM handle
6263 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_tick_time_near)(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int *val ATTRIBUTE_UNUSED, int *dir ATTRIBUTE_UNUSED)
6265 int snd_pcm_hw_params_set_tick_time_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
6273 * \param pcm PCM handle
6282 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_tick_time_first)(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int *val ATTRIBUTE_UNUSED, int *dir ATTRIBUTE_UNUSED)
6284 int snd_pcm_hw_params_set_tick_time_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
6292 * \param pcm PCM handle
6301 EXPORT_SYMBOL int INTERNAL(snd_pcm_hw_params_set_tick_time_last)(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED, unsigned int *val ATTRIBUTE_UNUSED, int *dir ATTRIBUTE_UNUSED)
6303 int snd_pcm_hw_params_set_tick_time_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
6339 void snd_pcm_sw_params_current_no_lock(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
6342 params->tstamp_mode = pcm->tstamp_mode;
6343 params->tstamp_type = pcm->tstamp_type;
6344 params->period_step = pcm->period_step;
6346 params->avail_min = pcm->avail_min;
6347 sw_set_period_event(params, pcm->period_event);
6349 params->start_threshold = pcm->start_threshold;
6350 params->stop_threshold = pcm->stop_threshold;
6351 params->silence_threshold = pcm->silence_threshold;
6352 params->silence_size = pcm->silence_size;
6353 params->boundary = pcm->boundary;
6359 * \param pcm PCM handle
6365 int snd_pcm_sw_params_current(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
6367 assert(pcm && params);
6368 if (CHECK_SANITY(! pcm->setup)) {
6372 __snd_pcm_lock(pcm); /* forced lock due to pcm field changes */
6373 snd_pcm_sw_params_current_no_lock(pcm, params);
6374 __snd_pcm_unlock(pcm);
6456 * \param pcm PCM handle
6461 int snd_pcm_sw_params_set_start_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_start_t val)
6463 assert(pcm && params);
6469 params->start_threshold = pcm->boundary;
6500 * \param pcm PCM handle
6506 int snd_pcm_sw_params_set_xrun_mode(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params, snd_pcm_xrun_t val)
6508 int snd_pcm_sw_params_set_xrun_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_xrun_t val)
6511 assert(pcm && params);
6514 params->stop_threshold = pcm->buffer_size;
6517 params->stop_threshold = pcm->boundary;
6548 * \param pcm PCM handle
6554 int snd_pcm_sw_params_set_tstamp_mode(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params, snd_pcm_tstamp_t val)
6556 int snd_pcm_sw_params_set_tstamp_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_tstamp_t val)
6559 assert(pcm && params);
6587 * \param pcm PCM handle
6592 int snd_pcm_sw_params_set_tstamp_type(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_tstamp_type_t val)
6594 assert(pcm && params);
6618 * \param pcm PCM handle
6624 int snd_pcm_sw_params_set_sleep_min(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params ATTRIBUTE_UNUSED, unsigned int val ATTRIBUTE_UNUSED)
6626 int snd_pcm_sw_params_set_sleep_min(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, unsigned int val)
6650 * \param pcm PCM handle
6663 EXPORT_SYMBOL int snd_pcm_sw_params_set_avail_min(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6665 int snd_pcm_sw_params_set_avail_min(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6668 assert(pcm && params);
6673 if (val < pcm->period_size)
6674 val = pcm->period_size;
6701 * \param pcm PCM handle
6708 int snd_pcm_sw_params_set_period_event(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, int val)
6710 assert(pcm && params);
6730 * \param pcm PCM handle
6736 EXPORT_SYMBOL int snd_pcm_sw_params_set_xfer_align(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params ATTRIBUTE_UNUSED, snd_pcm_uframes_t val ATTRIBUTE_UNUSED)
6738 int snd_pcm_sw_params_set_xfer_align(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6762 * \param pcm PCM handle
6771 EXPORT_SYMBOL int snd_pcm_sw_params_set_start_threshold(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6773 int snd_pcm_sw_params_set_start_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6776 assert(pcm && params);
6804 * \param pcm PCM handle
6815 EXPORT_SYMBOL int snd_pcm_sw_params_set_stop_threshold(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6817 int snd_pcm_sw_params_set_stop_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6820 assert(pcm && params);
6850 * \param pcm PCM handle
6860 EXPORT_SYMBOL int snd_pcm_sw_params_set_silence_threshold(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6862 int snd_pcm_sw_params_set_silence_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6865 assert(pcm && params);
6866 if (CHECK_SANITY(val >= pcm->buffer_size)) {
6868 val, pcm->buffer_size);
6899 * \param pcm PCM handle
6918 EXPORT_SYMBOL int snd_pcm_sw_params_set_silence_size(snd_pcm_t *pcm ATTRIBUTE_UNUSED, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6920 int snd_pcm_sw_params_set_silence_size(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val)
6923 assert(pcm && params);
6924 if (CHECK_SANITY(val < pcm->boundary && val > pcm->buffer_size)) {
6926 val, pcm->boundary, pcm->buffer_size);
7382 * \param pcm PCM handle
7400 int snd_pcm_mmap_begin(snd_pcm_t *pcm,
7407 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
7410 snd_pcm_lock(pcm->fast_op_arg);
7411 err = __snd_pcm_mmap_begin(pcm, areas, offset, frames);
7412 snd_pcm_unlock(pcm->fast_op_arg);
7417 int __snd_pcm_mmap_begin_generic(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
7425 assert(pcm && areas && offset && frames);
7428 xareas = snd_pcm_mmap_areas(pcm);
7432 *offset = *pcm->appl.ptr % pcm->buffer_size;
7433 avail = snd_pcm_mmap_avail(pcm);
7434 if (avail > pcm->buffer_size)
7435 avail = pcm->buffer_size;
7436 cont = pcm->buffer_size - *offset;
7447 int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
7450 assert(pcm && areas && offset && frames);
7452 if (pcm->fast_ops->mmap_begin)
7453 return pcm->fast_ops->mmap_begin(pcm->fast_op_arg, areas, offset, frames);
7455 return __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
7461 * \param pcm PCM handle
7481 avail = snd_pcm_avail_update(pcm);
7513 snd_pcm_sframes_t snd_pcm_mmap_commit(snd_pcm_t *pcm,
7520 err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
7523 snd_pcm_lock(pcm->fast_op_arg);
7524 result = __snd_pcm_mmap_commit(pcm, offset, frames);
7525 snd_pcm_unlock(pcm->fast_op_arg);
7531 snd_pcm_sframes_t __snd_pcm_mmap_commit(snd_pcm_t *pcm,
7535 assert(pcm);
7536 if (CHECK_SANITY(offset != *pcm->appl.ptr % pcm->buffer_size)) {
7538 offset, *pcm->appl.ptr, pcm->buffer_size);
7541 if (CHECK_SANITY(frames > snd_pcm_mmap_avail(pcm))) {
7543 snd_pcm_mmap_avail(pcm));
7546 if (pcm->fast_ops->mmap_commit)
7547 return pcm->fast_ops->mmap_commit(pcm->fast_op_arg, offset, frames);
7552 int _snd_pcm_poll_descriptor(snd_pcm_t *pcm)
7554 assert(pcm);
7555 return pcm->poll_fd;
7558 void snd_pcm_areas_from_buf(snd_pcm_t *pcm, snd_pcm_channel_area_t *areas,
7564 snd_pcm_lock(pcm);
7565 channels = pcm->channels;
7568 areas->first = channel * pcm->sample_bits;
7569 areas->step = pcm->frame_bits;
7571 snd_pcm_unlock(pcm);
7574 void snd_pcm_areas_from_bufs(snd_pcm_t *pcm, snd_pcm_channel_area_t *areas,
7580 snd_pcm_lock(pcm);
7581 channels = pcm->channels;
7585 areas->step = pcm->sample_bits;
7587 snd_pcm_unlock(pcm);
7590 snd_pcm_sframes_t snd_pcm_read_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_t *areas,
7601 __snd_pcm_lock(pcm->fast_op_arg); /* forced lock */
7606 state = __snd_pcm_state(pcm);
7609 err = __snd_pcm_start(pcm);
7614 err = __snd_pcm_hwsync(pcm);
7627 avail = __snd_pcm_avail_update(pcm);
7635 if (pcm->mode & SND_PCM_NONBLOCK) {
7640 err = __snd_pcm_wait_in_lock(pcm, SND_PCM_WAIT_IO);
7651 err = func(pcm, areas, offset, frames);
7660 __snd_pcm_unlock(pcm->fast_op_arg);
7661 return xfer > 0 ? (snd_pcm_sframes_t) xfer : snd_pcm_check_error(pcm, err);
7664 snd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_t *areas,
7675 __snd_pcm_lock(pcm->fast_op_arg); /* forced lock */
7680 state = __snd_pcm_state(pcm);
7686 err = __snd_pcm_hwsync(pcm);
7696 avail = __snd_pcm_avail_update(pcm);
7703 if (snd_pcm_may_wait_for_avail_min(pcm, avail)) {
7704 if (pcm->mode & SND_PCM_NONBLOCK) {
7709 err = snd_pcm_wait_nocheck(pcm, SND_PCM_WAIT_IO);
7717 avail = __snd_pcm_avail_update(pcm);
7728 err = func(pcm, areas, offset, frames);
7733 snd_pcm_sframes_t hw_avail = pcm->buffer_size - avail;
7736 state = __snd_pcm_state(pcm);
7739 (snd_pcm_uframes_t) hw_avail >= pcm->start_threshold) {
7740 err = __snd_pcm_start(pcm);
7750 __snd_pcm_unlock(pcm->fast_op_arg);
7751 return xfer > 0 ? (snd_pcm_sframes_t) xfer : snd_pcm_check_error(pcm, err);
7754 snd_pcm_uframes_t _snd_pcm_mmap_hw_ptr(snd_pcm_t *pcm)
7756 return *pcm->hw.ptr;
7759 snd_pcm_uframes_t _snd_pcm_boundary(snd_pcm_t *pcm)
7761 return pcm->boundary;
7827 if (strcmp(id, "pcm") == 0) {
7890 SNDERR("missing field pcm");
7912 static void snd_pcm_set_ptr(snd_pcm_t *pcm, snd_pcm_rbptr_t *rbptr,
7920 rbptr->changed(pcm, NULL);
7923 void snd_pcm_set_hw_ptr(snd_pcm_t *pcm, volatile snd_pcm_uframes_t *hw_ptr, int fd, off_t offset)
7925 assert(pcm);
7927 snd_pcm_set_ptr(pcm, &pcm->hw, hw_ptr, fd, offset);
7930 void snd_pcm_set_appl_ptr(snd_pcm_t *pcm, volatile snd_pcm_uframes_t *appl_ptr, int fd, off_t offset)
7932 assert(pcm);
7934 snd_pcm_set_ptr(pcm, &pcm->appl, appl_ptr, fd, offset);
7937 static void snd_pcm_link_ptr(snd_pcm_t *pcm, snd_pcm_rbptr_t *pcm_rbptr,
7946 a[idx] = pcm;
7956 a[slave_rbptr->link_dst_count++] = pcm;
7964 pcm_rbptr->changed(pcm, slave);
7967 static void snd_pcm_unlink_ptr(snd_pcm_t *pcm, snd_pcm_rbptr_t *pcm_rbptr,
7975 if (a[idx] == pcm) {
7989 pcm_rbptr->changed(pcm, slave);
7992 void snd_pcm_link_hw_ptr(snd_pcm_t *pcm, snd_pcm_t *slave)
7994 assert(pcm);
7996 snd_pcm_link_ptr(pcm, &pcm->hw, slave, &slave->hw);
7999 void snd_pcm_link_appl_ptr(snd_pcm_t *pcm, snd_pcm_t *slave)
8001 assert(pcm);
8003 snd_pcm_link_ptr(pcm, &pcm->appl, slave, &slave->appl);
8006 void snd_pcm_unlink_hw_ptr(snd_pcm_t *pcm, snd_pcm_t *slave)
8008 assert(pcm);
8010 snd_pcm_unlink_ptr(pcm, &pcm->hw, slave, &slave->hw);
8013 void snd_pcm_unlink_appl_ptr(snd_pcm_t *pcm, snd_pcm_t *slave)
8015 assert(pcm);
8017 snd_pcm_unlink_ptr(pcm, &pcm->appl, slave, &slave->appl);
8093 EXPORT_SYMBOL ret_type pfx##name(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, ret_type val) \
8095 if (INTERNAL(name)(pcm, params, &val) < 0) \
8101 EXPORT_SYMBOL ret_type pfx##name(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, ret_type val, int *dir) \
8103 if (INTERNAL(name)(pcm, params, &val, dir) < 0) \
8121 EXPORT_SYMBOL ret_type pfx##name(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) \
8124 if (INTERNAL(name)(pcm, params, &val) < 0) \
8130 EXPORT_SYMBOL ret_type pfx##name(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, int *dir) \
8133 if (INTERNAL(name)(pcm, params, &val, dir) < 0) \
8273 * \param pcm PCM handle to query
8283 snd_pcm_chmap_query_t **snd_pcm_query_chmaps(snd_pcm_t *pcm)
8285 if (!pcm->ops->query_chmaps)
8287 return pcm->ops->query_chmaps(pcm);
8306 * \param pcm PCM instance
8311 snd_pcm_chmap_t *snd_pcm_get_chmap(snd_pcm_t *pcm)
8313 if (!pcm->ops->get_chmap)
8315 return pcm->ops->get_chmap(pcm);
8320 * \param pcm PCM instance
8324 int snd_pcm_set_chmap(snd_pcm_t *pcm, const snd_pcm_chmap_t *map)
8329 oldmap = snd_pcm_get_chmap(pcm);
8335 if (!pcm->ops->set_chmap)
8337 return pcm->ops->set_chmap(pcm, map);
8657 _snd_pcm_choose_fixed_chmap(snd_pcm_t *pcm, snd_pcm_chmap_query_t * const *maps)
8662 if ((*p)->map.channels == pcm->channels)
8723 * \param pcm PCM handle
8737 int snd_pcm_recover(snd_pcm_t *pcm, int err, int silent)
8745 if (snd_pcm_stream(pcm) == SND_PCM_STREAM_PLAYBACK)
8751 err = snd_pcm_prepare(pcm);
8759 while ((err = snd_pcm_resume(pcm)) == -EAGAIN)
8763 err = snd_pcm_prepare(pcm);
8776 * \param pcm PCM handle
8785 int snd_pcm_set_params(snd_pcm_t *pcm,
8795 const char *s = snd_pcm_stream_name(snd_pcm_stream(pcm));
8800 assert(pcm);
8802 err = snd_pcm_hw_params_any(pcm, &params);
8809 err = snd_pcm_hw_params_set_rate_resample(pcm, &params, soft_resample);
8816 err = snd_pcm_hw_params_set_access(pcm, &params, access);
8823 err = snd_pcm_hw_params_set_format(pcm, &params, format);
8830 err = snd_pcm_hw_params_set_channels(pcm, &params, channels);
8838 err = INTERNAL(snd_pcm_hw_params_set_rate_near)(pcm, &params, &rrate,
8852 err = INTERNAL(snd_pcm_hw_params_set_buffer_time_near)(pcm, &params,
8859 err = INTERNAL(snd_pcm_hw_params_set_period_time_near)(pcm,
8874 err = INTERNAL(snd_pcm_hw_params_set_buffer_size_near)(pcm,
8906 err = INTERNAL(snd_pcm_hw_params_set_period_time_near)(pcm,
8922 err = snd_pcm_hw_params(pcm, &params);
8930 err = snd_pcm_sw_params_current(pcm, &swparams);
8940 err = snd_pcm_sw_params_set_start_threshold(pcm, &swparams,
8951 err = snd_pcm_sw_params_set_avail_min(pcm, &swparams, period_size);
8958 err = snd_pcm_sw_params(pcm, &swparams);
8969 * \param pcm PCM handle
8974 int snd_pcm_get_params(snd_pcm_t *pcm,
8981 assert(pcm);
8982 err = snd_pcm_hw_params_current(pcm, &params);