alsa: throw timing data away after device resume
[pulseaudio-mirror.git] / src / modules / alsa / alsa-source.c
blobed9c148045dbb1b5dfcd3a94cae70f042a002c74
1 /***
2 This file is part of PulseAudio.
4 Copyright 2004-2008 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2.1 of the License,
10 or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 USA.
21 ***/
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
27 #include <stdio.h>
29 #include <asoundlib.h>
31 #include <pulse/i18n.h>
32 #include <pulse/rtclock.h>
33 #include <pulse/timeval.h>
34 #include <pulse/util.h>
35 #include <pulse/xmalloc.h>
37 #include <pulsecore/core-error.h>
38 #include <pulsecore/core.h>
39 #include <pulsecore/module.h>
40 #include <pulsecore/memchunk.h>
41 #include <pulsecore/sink.h>
42 #include <pulsecore/modargs.h>
43 #include <pulsecore/core-rtclock.h>
44 #include <pulsecore/core-util.h>
45 #include <pulsecore/sample-util.h>
46 #include <pulsecore/log.h>
47 #include <pulsecore/macro.h>
48 #include <pulsecore/thread.h>
49 #include <pulsecore/core-error.h>
50 #include <pulsecore/thread-mq.h>
51 #include <pulsecore/rtpoll.h>
52 #include <pulsecore/time-smoother.h>
54 #include <modules/reserve-wrap.h>
56 #include "alsa-util.h"
57 #include "alsa-source.h"
59 /* #define DEBUG_TIMING */
61 #define DEFAULT_DEVICE "default"
62 #define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s */
63 #define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms */
64 #define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
65 #define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
66 #define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */
68 struct userdata {
69 pa_core *core;
70 pa_module *module;
71 pa_source *source;
73 pa_thread *thread;
74 pa_thread_mq thread_mq;
75 pa_rtpoll *rtpoll;
77 snd_pcm_t *pcm_handle;
79 pa_alsa_fdlist *mixer_fdl;
80 snd_mixer_t *mixer_handle;
81 pa_alsa_path_set *mixer_path_set;
82 pa_alsa_path *mixer_path;
84 pa_cvolume hardware_volume;
86 size_t
87 frame_size,
88 fragment_size,
89 hwbuf_size,
90 tsched_watermark,
91 hwbuf_unused,
92 min_sleep,
93 min_wakeup,
94 watermark_step;
96 unsigned nfragments;
98 char *device_name;
99 char *control_device;
101 pa_bool_t use_mmap:1, use_tsched:1;
103 pa_rtpoll_item *alsa_rtpoll_item;
105 snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST];
107 pa_smoother *smoother;
108 uint64_t read_count;
110 pa_reserve_wrapper *reserve;
111 pa_hook_slot *reserve_slot;
112 pa_reserve_monitor_wrapper *monitor;
113 pa_hook_slot *monitor_slot;
116 static void userdata_free(struct userdata *u);
118 static pa_hook_result_t reserve_cb(pa_reserve_wrapper *r, void *forced, struct userdata *u) {
119 pa_assert(r);
120 pa_assert(u);
122 if (pa_source_suspend(u->source, TRUE, PA_SUSPEND_APPLICATION) < 0)
123 return PA_HOOK_CANCEL;
125 return PA_HOOK_OK;
128 static void reserve_done(struct userdata *u) {
129 pa_assert(u);
131 if (u->reserve_slot) {
132 pa_hook_slot_free(u->reserve_slot);
133 u->reserve_slot = NULL;
136 if (u->reserve) {
137 pa_reserve_wrapper_unref(u->reserve);
138 u->reserve = NULL;
142 static void reserve_update(struct userdata *u) {
143 const char *description;
144 pa_assert(u);
146 if (!u->source || !u->reserve)
147 return;
149 if ((description = pa_proplist_gets(u->source->proplist, PA_PROP_DEVICE_DESCRIPTION)))
150 pa_reserve_wrapper_set_application_device_name(u->reserve, description);
153 static int reserve_init(struct userdata *u, const char *dname) {
154 char *rname;
156 pa_assert(u);
157 pa_assert(dname);
159 if (u->reserve)
160 return 0;
162 if (pa_in_system_mode())
163 return 0;
165 /* We are resuming, try to lock the device */
166 if (!(rname = pa_alsa_get_reserve_name(dname)))
167 return 0;
169 u->reserve = pa_reserve_wrapper_get(u->core, rname);
170 pa_xfree(rname);
172 if (!(u->reserve))
173 return -1;
175 reserve_update(u);
177 pa_assert(!u->reserve_slot);
178 u->reserve_slot = pa_hook_connect(pa_reserve_wrapper_hook(u->reserve), PA_HOOK_NORMAL, (pa_hook_cb_t) reserve_cb, u);
180 return 0;
183 static pa_hook_result_t monitor_cb(pa_reserve_monitor_wrapper *w, void* busy, struct userdata *u) {
184 pa_bool_t b;
186 pa_assert(w);
187 pa_assert(u);
189 b = PA_PTR_TO_UINT(busy) && !u->reserve;
191 pa_source_suspend(u->source, b, PA_SUSPEND_APPLICATION);
192 return PA_HOOK_OK;
195 static void monitor_done(struct userdata *u) {
196 pa_assert(u);
198 if (u->monitor_slot) {
199 pa_hook_slot_free(u->monitor_slot);
200 u->monitor_slot = NULL;
203 if (u->monitor) {
204 pa_reserve_monitor_wrapper_unref(u->monitor);
205 u->monitor = NULL;
209 static int reserve_monitor_init(struct userdata *u, const char *dname) {
210 char *rname;
212 pa_assert(u);
213 pa_assert(dname);
215 if (pa_in_system_mode())
216 return 0;
218 /* We are resuming, try to lock the device */
219 if (!(rname = pa_alsa_get_reserve_name(dname)))
220 return 0;
222 u->monitor = pa_reserve_monitor_wrapper_get(u->core, rname);
223 pa_xfree(rname);
225 if (!(u->monitor))
226 return -1;
228 pa_assert(!u->monitor_slot);
229 u->monitor_slot = pa_hook_connect(pa_reserve_monitor_wrapper_hook(u->monitor), PA_HOOK_NORMAL, (pa_hook_cb_t) monitor_cb, u);
231 return 0;
234 static void fix_min_sleep_wakeup(struct userdata *u) {
235 size_t max_use, max_use_2;
236 pa_assert(u);
238 max_use = u->hwbuf_size - u->hwbuf_unused;
239 max_use_2 = pa_frame_align(max_use/2, &u->source->sample_spec);
241 u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->source->sample_spec);
242 u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2);
244 u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->source->sample_spec);
245 u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2);
248 static void fix_tsched_watermark(struct userdata *u) {
249 size_t max_use;
250 pa_assert(u);
252 max_use = u->hwbuf_size - u->hwbuf_unused;
254 if (u->tsched_watermark > max_use - u->min_sleep)
255 u->tsched_watermark = max_use - u->min_sleep;
257 if (u->tsched_watermark < u->min_wakeup)
258 u->tsched_watermark = u->min_wakeup;
261 static void adjust_after_overrun(struct userdata *u) {
262 size_t old_watermark;
263 pa_usec_t old_min_latency, new_min_latency;
265 pa_assert(u);
266 pa_assert(u->use_tsched);
268 /* First, just try to increase the watermark */
269 old_watermark = u->tsched_watermark;
270 u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_step);
272 fix_tsched_watermark(u);
274 if (old_watermark != u->tsched_watermark) {
275 pa_log_notice("Increasing wakeup watermark to %0.2f ms",
276 (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC);
277 return;
280 /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */
281 old_min_latency = u->source->thread_info.min_latency;
282 new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_STEP_USEC);
283 new_min_latency = PA_MIN(new_min_latency, u->source->thread_info.max_latency);
285 if (old_min_latency != new_min_latency) {
286 pa_log_notice("Increasing minimal latency to %0.2f ms",
287 (double) new_min_latency / PA_USEC_PER_MSEC);
289 pa_source_set_latency_range_within_thread(u->source, new_min_latency, u->source->thread_info.max_latency);
290 return;
293 /* When we reach this we're officialy fucked! */
296 static pa_usec_t hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) {
297 pa_usec_t wm, usec;
299 pa_assert(u);
301 usec = pa_source_get_requested_latency_within_thread(u->source);
303 if (usec == (pa_usec_t) -1)
304 usec = pa_bytes_to_usec(u->hwbuf_size, &u->source->sample_spec);
306 wm = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec);
308 if (wm > usec)
309 wm = usec/2;
311 *sleep_usec = usec - wm;
312 *process_usec = wm;
314 #ifdef DEBUG_TIMING
315 pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms",
316 (unsigned long) (usec / PA_USEC_PER_MSEC),
317 (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC),
318 (unsigned long) (*process_usec / PA_USEC_PER_MSEC));
319 #endif
321 return usec;
324 static int try_recover(struct userdata *u, const char *call, int err) {
325 pa_assert(u);
326 pa_assert(call);
327 pa_assert(err < 0);
329 pa_log_debug("%s: %s", call, pa_alsa_strerror(err));
331 pa_assert(err != -EAGAIN);
333 if (err == -EPIPE)
334 pa_log_debug("%s: Buffer overrun!", call);
336 if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) {
337 pa_log("%s: %s", call, pa_alsa_strerror(err));
338 return -1;
341 snd_pcm_start(u->pcm_handle);
342 return 0;
345 static size_t check_left_to_record(struct userdata *u, size_t n_bytes) {
346 size_t left_to_record;
347 size_t rec_space = u->hwbuf_size - u->hwbuf_unused;
349 /* We use <= instead of < for this check here because an overrun
350 * only happens after the last sample was processed, not already when
351 * it is removed from the buffer. This is particularly important
352 * when block transfer is used. */
354 if (n_bytes <= rec_space) {
355 left_to_record = rec_space - n_bytes;
357 #ifdef DEBUG_TIMING
358 pa_log_debug("%0.2f ms left to record", (double) pa_bytes_to_usec(left_to_record, &u->source->sample_spec) / PA_USEC_PER_MSEC);
359 #endif
361 } else {
362 left_to_record = 0;
364 #ifdef DEBUG_TIMING
365 PA_DEBUG_TRAP;
366 #endif
368 if (pa_log_ratelimit())
369 pa_log_info("Overrun!");
371 if (u->use_tsched)
372 adjust_after_overrun(u);
375 return left_to_record;
378 static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled) {
379 pa_bool_t work_done = FALSE;
380 pa_usec_t max_sleep_usec = 0, process_usec = 0;
381 size_t left_to_record;
382 unsigned j = 0;
384 pa_assert(u);
385 pa_source_assert_ref(u->source);
387 if (u->use_tsched)
388 hw_sleep_time(u, &max_sleep_usec, &process_usec);
390 for (;;) {
391 snd_pcm_sframes_t n;
392 size_t n_bytes;
393 int r;
394 pa_bool_t after_avail = TRUE;
396 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
398 if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
399 continue;
401 return r;
404 n_bytes = (size_t) n * u->frame_size;
406 #ifdef DEBUG_TIMING
407 pa_log_debug("avail: %lu", (unsigned long) n_bytes);
408 #endif
410 left_to_record = check_left_to_record(u, n_bytes);
412 if (u->use_tsched)
413 if (!polled &&
414 pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) {
415 #ifdef DEBUG_TIMING
416 pa_log_debug("Not reading, because too early.");
417 #endif
418 break;
421 if (PA_UNLIKELY(n_bytes <= 0)) {
423 if (polled)
424 PA_ONCE_BEGIN {
425 char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle);
426 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
427 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
428 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."),
429 pa_strnull(dn));
430 pa_xfree(dn);
431 } PA_ONCE_END;
433 #ifdef DEBUG_TIMING
434 pa_log_debug("Not reading, because not necessary.");
435 #endif
436 break;
439 if (++j > 10) {
440 #ifdef DEBUG_TIMING
441 pa_log_debug("Not filling up, because already too many iterations.");
442 #endif
444 break;
447 polled = FALSE;
449 #ifdef DEBUG_TIMING
450 pa_log_debug("Reading");
451 #endif
453 for (;;) {
454 int err;
455 const snd_pcm_channel_area_t *areas;
456 snd_pcm_uframes_t offset, frames;
457 pa_memchunk chunk;
458 void *p;
459 snd_pcm_sframes_t sframes;
461 frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size);
463 /* pa_log_debug("%lu frames to read", (unsigned long) frames); */
465 if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
467 if (!after_avail && err == -EAGAIN)
468 break;
470 if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0)
471 continue;
473 return r;
476 /* Make sure that if these memblocks need to be copied they will fit into one slot */
477 if (frames > pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size)
478 frames = pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size;
480 if (!after_avail && frames == 0)
481 break;
483 pa_assert(frames > 0);
484 after_avail = FALSE;
486 /* Check these are multiples of 8 bit */
487 pa_assert((areas[0].first & 7) == 0);
488 pa_assert((areas[0].step & 7)== 0);
490 /* We assume a single interleaved memory buffer */
491 pa_assert((areas[0].first >> 3) == 0);
492 pa_assert((areas[0].step >> 3) == u->frame_size);
494 p = (uint8_t*) areas[0].addr + (offset * u->frame_size);
496 chunk.memblock = pa_memblock_new_fixed(u->core->mempool, p, frames * u->frame_size, TRUE);
497 chunk.length = pa_memblock_get_length(chunk.memblock);
498 chunk.index = 0;
500 pa_source_post(u->source, &chunk);
501 pa_memblock_unref_fixed(chunk.memblock);
503 if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) {
505 if ((r = try_recover(u, "snd_pcm_mmap_commit", (int) sframes)) == 0)
506 continue;
508 return r;
511 work_done = TRUE;
513 u->read_count += frames * u->frame_size;
515 #ifdef DEBUG_TIMING
516 pa_log_debug("Read %lu bytes (of possible %lu bytes)", (unsigned long) (frames * u->frame_size), (unsigned long) n_bytes);
517 #endif
519 if ((size_t) frames * u->frame_size >= n_bytes)
520 break;
522 n_bytes -= (size_t) frames * u->frame_size;
526 *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
528 if (*sleep_usec > process_usec)
529 *sleep_usec -= process_usec;
530 else
531 *sleep_usec = 0;
533 return work_done ? 1 : 0;
536 static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled) {
537 int work_done = FALSE;
538 pa_usec_t max_sleep_usec = 0, process_usec = 0;
539 size_t left_to_record;
540 unsigned j = 0;
542 pa_assert(u);
543 pa_source_assert_ref(u->source);
545 if (u->use_tsched)
546 hw_sleep_time(u, &max_sleep_usec, &process_usec);
548 for (;;) {
549 snd_pcm_sframes_t n;
550 size_t n_bytes;
551 int r;
552 pa_bool_t after_avail = TRUE;
554 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
556 if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
557 continue;
559 return r;
562 n_bytes = (size_t) n * u->frame_size;
563 left_to_record = check_left_to_record(u, n_bytes);
565 if (u->use_tsched)
566 if (!polled &&
567 pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2)
568 break;
570 if (PA_UNLIKELY(n_bytes <= 0)) {
572 if (polled)
573 PA_ONCE_BEGIN {
574 char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle);
575 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
576 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
577 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."),
578 pa_strnull(dn));
579 pa_xfree(dn);
580 } PA_ONCE_END;
582 break;
585 if (++j > 10) {
586 #ifdef DEBUG_TIMING
587 pa_log_debug("Not filling up, because already too many iterations.");
588 #endif
590 break;
593 polled = FALSE;
595 for (;;) {
596 void *p;
597 snd_pcm_sframes_t frames;
598 pa_memchunk chunk;
600 chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) -1);
602 frames = (snd_pcm_sframes_t) (pa_memblock_get_length(chunk.memblock) / u->frame_size);
604 if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size))
605 frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size);
607 /* pa_log_debug("%lu frames to read", (unsigned long) n); */
609 p = pa_memblock_acquire(chunk.memblock);
610 frames = snd_pcm_readi(u->pcm_handle, (uint8_t*) p, (snd_pcm_uframes_t) frames);
611 pa_memblock_release(chunk.memblock);
613 if (PA_UNLIKELY(frames < 0)) {
614 pa_memblock_unref(chunk.memblock);
616 if (!after_avail && (int) frames == -EAGAIN)
617 break;
619 if ((r = try_recover(u, "snd_pcm_readi", (int) frames)) == 0)
620 continue;
622 return r;
625 if (!after_avail && frames == 0) {
626 pa_memblock_unref(chunk.memblock);
627 break;
630 pa_assert(frames > 0);
631 after_avail = FALSE;
633 chunk.index = 0;
634 chunk.length = (size_t) frames * u->frame_size;
636 pa_source_post(u->source, &chunk);
637 pa_memblock_unref(chunk.memblock);
639 work_done = TRUE;
641 u->read_count += frames * u->frame_size;
643 /* pa_log_debug("read %lu frames", (unsigned long) frames); */
645 if ((size_t) frames * u->frame_size >= n_bytes)
646 break;
648 n_bytes -= (size_t) frames * u->frame_size;
652 *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
654 if (*sleep_usec > process_usec)
655 *sleep_usec -= process_usec;
656 else
657 *sleep_usec = 0;
659 return work_done ? 1 : 0;
662 static void update_smoother(struct userdata *u) {
663 snd_pcm_sframes_t delay = 0;
664 uint64_t position;
665 int err;
666 pa_usec_t now1 = 0, now2;
667 snd_pcm_status_t *status;
669 snd_pcm_status_alloca(&status);
671 pa_assert(u);
672 pa_assert(u->pcm_handle);
674 /* Let's update the time smoother */
676 if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, &delay, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
677 pa_log_warn("Failed to get delay: %s", pa_alsa_strerror(err));
678 return;
681 if (PA_UNLIKELY((err = snd_pcm_status(u->pcm_handle, status)) < 0))
682 pa_log_warn("Failed to get timestamp: %s", pa_alsa_strerror(err));
683 else {
684 snd_htimestamp_t htstamp = { 0, 0 };
685 snd_pcm_status_get_htstamp(status, &htstamp);
686 now1 = pa_timespec_load(&htstamp);
689 position = u->read_count + ((uint64_t) delay * (uint64_t) u->frame_size);
691 /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */
692 if (now1 <= 0)
693 now1 = pa_rtclock_now();
695 now2 = pa_bytes_to_usec(position, &u->source->sample_spec);
697 pa_smoother_put(u->smoother, now1, now2);
700 static pa_usec_t source_get_latency(struct userdata *u) {
701 int64_t delay;
702 pa_usec_t now1, now2;
704 pa_assert(u);
706 now1 = pa_rtclock_now();
707 now2 = pa_smoother_get(u->smoother, now1);
709 delay = (int64_t) now2 - (int64_t) pa_bytes_to_usec(u->read_count, &u->source->sample_spec);
711 return delay >= 0 ? (pa_usec_t) delay : 0;
714 static int build_pollfd(struct userdata *u) {
715 pa_assert(u);
716 pa_assert(u->pcm_handle);
718 if (u->alsa_rtpoll_item)
719 pa_rtpoll_item_free(u->alsa_rtpoll_item);
721 if (!(u->alsa_rtpoll_item = pa_alsa_build_pollfd(u->pcm_handle, u->rtpoll)))
722 return -1;
724 return 0;
727 static int suspend(struct userdata *u) {
728 pa_assert(u);
729 pa_assert(u->pcm_handle);
731 pa_smoother_pause(u->smoother, pa_rtclock_now());
733 /* Let's suspend */
734 snd_pcm_close(u->pcm_handle);
735 u->pcm_handle = NULL;
737 if (u->alsa_rtpoll_item) {
738 pa_rtpoll_item_free(u->alsa_rtpoll_item);
739 u->alsa_rtpoll_item = NULL;
742 pa_log_info("Device suspended...");
744 return 0;
747 static int update_sw_params(struct userdata *u) {
748 snd_pcm_uframes_t avail_min;
749 int err;
751 pa_assert(u);
753 /* Use the full buffer if noone asked us for anything specific */
754 u->hwbuf_unused = 0;
756 if (u->use_tsched) {
757 pa_usec_t latency;
759 if ((latency = pa_source_get_requested_latency_within_thread(u->source)) != (pa_usec_t) -1) {
760 size_t b;
762 pa_log_debug("latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC);
764 b = pa_usec_to_bytes(latency, &u->source->sample_spec);
766 /* We need at least one sample in our buffer */
768 if (PA_UNLIKELY(b < u->frame_size))
769 b = u->frame_size;
771 u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0;
774 fix_min_sleep_wakeup(u);
775 fix_tsched_watermark(u);
778 pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused);
780 avail_min = 1;
782 if (u->use_tsched) {
783 pa_usec_t sleep_usec, process_usec;
785 hw_sleep_time(u, &sleep_usec, &process_usec);
786 avail_min += pa_usec_to_bytes(sleep_usec, &u->source->sample_spec) / u->frame_size;
789 pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min);
791 if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min)) < 0) {
792 pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err));
793 return err;
796 return 0;
799 static int unsuspend(struct userdata *u) {
800 pa_sample_spec ss;
801 int err;
802 pa_bool_t b, d;
803 unsigned nfrags;
804 snd_pcm_uframes_t period_size;
806 pa_assert(u);
807 pa_assert(!u->pcm_handle);
809 pa_log_info("Trying resume...");
811 if ((err = snd_pcm_open(&u->pcm_handle, u->device_name, SND_PCM_STREAM_CAPTURE,
812 /*SND_PCM_NONBLOCK|*/
813 SND_PCM_NO_AUTO_RESAMPLE|
814 SND_PCM_NO_AUTO_CHANNELS|
815 SND_PCM_NO_AUTO_FORMAT)) < 0) {
816 pa_log("Error opening PCM device %s: %s", u->device_name, pa_alsa_strerror(err));
817 goto fail;
820 ss = u->source->sample_spec;
821 nfrags = u->nfragments;
822 period_size = u->fragment_size / u->frame_size;
823 b = u->use_mmap;
824 d = u->use_tsched;
826 if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &nfrags, &period_size, u->hwbuf_size / u->frame_size, &b, &d, TRUE)) < 0) {
827 pa_log("Failed to set hardware parameters: %s", pa_alsa_strerror(err));
828 goto fail;
831 if (b != u->use_mmap || d != u->use_tsched) {
832 pa_log_warn("Resume failed, couldn't get original access mode.");
833 goto fail;
836 if (!pa_sample_spec_equal(&ss, &u->source->sample_spec)) {
837 pa_log_warn("Resume failed, couldn't restore original sample settings.");
838 goto fail;
841 if (nfrags != u->nfragments || period_size*u->frame_size != u->fragment_size) {
842 pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %lu*%lu, New %lu*%lu)",
843 (unsigned long) u->nfragments, (unsigned long) u->fragment_size,
844 (unsigned long) nfrags, period_size * u->frame_size);
845 goto fail;
848 if (update_sw_params(u) < 0)
849 goto fail;
851 if (build_pollfd(u) < 0)
852 goto fail;
854 /* FIXME: We need to reload the volume somehow */
856 snd_pcm_start(u->pcm_handle);
858 u->read_count = 0;
859 pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);
861 pa_log_info("Resumed successfully...");
863 return 0;
865 fail:
866 if (u->pcm_handle) {
867 snd_pcm_close(u->pcm_handle);
868 u->pcm_handle = NULL;
871 return -1;
874 static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
875 struct userdata *u = PA_SOURCE(o)->userdata;
877 switch (code) {
879 case PA_SOURCE_MESSAGE_GET_LATENCY: {
880 pa_usec_t r = 0;
882 if (u->pcm_handle)
883 r = source_get_latency(u);
885 *((pa_usec_t*) data) = r;
887 return 0;
890 case PA_SOURCE_MESSAGE_SET_STATE:
892 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
894 case PA_SOURCE_SUSPENDED:
895 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
897 if (suspend(u) < 0)
898 return -1;
900 break;
902 case PA_SOURCE_IDLE:
903 case PA_SOURCE_RUNNING:
905 if (u->source->thread_info.state == PA_SOURCE_INIT) {
906 if (build_pollfd(u) < 0)
907 return -1;
909 snd_pcm_start(u->pcm_handle);
912 if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) {
913 if (unsuspend(u) < 0)
914 return -1;
917 break;
919 case PA_SOURCE_UNLINKED:
920 case PA_SOURCE_INIT:
921 case PA_SOURCE_INVALID_STATE:
925 break;
928 return pa_source_process_msg(o, code, data, offset, chunk);
931 /* Called from main context */
932 static int source_set_state_cb(pa_source *s, pa_source_state_t new_state) {
933 pa_source_state_t old_state;
934 struct userdata *u;
936 pa_source_assert_ref(s);
937 pa_assert_se(u = s->userdata);
939 old_state = pa_source_get_state(u->source);
941 if (PA_SINK_IS_OPENED(old_state) && new_state == PA_SINK_SUSPENDED)
942 reserve_done(u);
943 else if (old_state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(new_state))
944 if (reserve_init(u, u->device_name) < 0)
945 return -1;
947 return 0;
950 static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
951 struct userdata *u = snd_mixer_elem_get_callback_private(elem);
953 pa_assert(u);
954 pa_assert(u->mixer_handle);
956 if (mask == SND_CTL_EVENT_MASK_REMOVE)
957 return 0;
959 if (mask & SND_CTL_EVENT_MASK_VALUE) {
960 pa_source_get_volume(u->source, TRUE);
961 pa_source_get_mute(u->source, TRUE);
964 return 0;
967 static void source_get_volume_cb(pa_source *s) {
968 struct userdata *u = s->userdata;
969 pa_cvolume r;
970 char t[PA_CVOLUME_SNPRINT_MAX];
972 pa_assert(u);
973 pa_assert(u->mixer_path);
974 pa_assert(u->mixer_handle);
976 if (pa_alsa_path_get_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0)
977 return;
979 /* Shift down by the base volume, so that 0dB becomes maximum volume */
980 pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume);
982 pa_log_debug("Read hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &r));
984 if (pa_cvolume_equal(&u->hardware_volume, &r))
985 return;
987 s->virtual_volume = u->hardware_volume = r;
989 if (u->mixer_path->has_dB) {
990 pa_cvolume reset;
992 /* Hmm, so the hardware volume changed, let's reset our software volume */
993 pa_cvolume_reset(&reset, s->sample_spec.channels);
994 pa_source_set_soft_volume(s, &reset);
998 static void source_set_volume_cb(pa_source *s) {
999 struct userdata *u = s->userdata;
1000 pa_cvolume r;
1001 char t[PA_CVOLUME_SNPRINT_MAX];
1003 pa_assert(u);
1004 pa_assert(u->mixer_path);
1005 pa_assert(u->mixer_handle);
1007 /* Shift up by the base volume */
1008 pa_sw_cvolume_divide_scalar(&r, &s->virtual_volume, s->base_volume);
1010 if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0)
1011 return;
1013 /* Shift down by the base volume, so that 0dB becomes maximum volume */
1014 pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume);
1016 u->hardware_volume = r;
1018 if (u->mixer_path->has_dB) {
1020 /* Match exactly what the user requested by software */
1021 pa_sw_cvolume_divide(&s->soft_volume, &s->virtual_volume, &u->hardware_volume);
1023 pa_log_debug("Requested volume: %s", pa_cvolume_snprint(t, sizeof(t), &s->virtual_volume));
1024 pa_log_debug("Got hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &u->hardware_volume));
1025 pa_log_debug("Calculated software volume: %s", pa_cvolume_snprint(t, sizeof(t), &s->soft_volume));
1027 } else {
1028 pa_log_debug("Wrote hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &r));
1030 /* We can't match exactly what the user requested, hence let's
1031 * at least tell the user about it */
1033 s->virtual_volume = r;
1037 static void source_get_mute_cb(pa_source *s) {
1038 struct userdata *u = s->userdata;
1039 pa_bool_t b;
1041 pa_assert(u);
1042 pa_assert(u->mixer_path);
1043 pa_assert(u->mixer_handle);
1045 if (pa_alsa_path_get_mute(u->mixer_path, u->mixer_handle, &b) < 0)
1046 return;
1048 s->muted = b;
1051 static void source_set_mute_cb(pa_source *s) {
1052 struct userdata *u = s->userdata;
1054 pa_assert(u);
1055 pa_assert(u->mixer_path);
1056 pa_assert(u->mixer_handle);
1058 pa_alsa_path_set_mute(u->mixer_path, u->mixer_handle, s->muted);
1061 static int source_set_port_cb(pa_source *s, pa_device_port *p) {
1062 struct userdata *u = s->userdata;
1063 pa_alsa_port_data *data;
1065 pa_assert(u);
1066 pa_assert(p);
1067 pa_assert(u->mixer_handle);
1069 data = PA_DEVICE_PORT_DATA(p);
1071 pa_assert_se(u->mixer_path = data->path);
1072 pa_alsa_path_select(u->mixer_path, u->mixer_handle);
1074 if (u->mixer_path->has_volume && u->mixer_path->has_dB) {
1075 s->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB);
1076 s->n_volume_steps = PA_VOLUME_NORM+1;
1078 if (u->mixer_path->max_dB > 0.0)
1079 pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume));
1080 else
1081 pa_log_info("No particular base volume set, fixing to 0 dB");
1082 } else {
1083 s->base_volume = PA_VOLUME_NORM;
1084 s->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1;
1087 if (data->setting)
1088 pa_alsa_setting_select(data->setting, u->mixer_handle);
1090 if (s->set_mute)
1091 s->set_mute(s);
1092 if (s->set_volume)
1093 s->set_volume(s);
1095 return 0;
1098 static void source_update_requested_latency_cb(pa_source *s) {
1099 struct userdata *u = s->userdata;
1100 pa_assert(u);
1102 if (!u->pcm_handle)
1103 return;
1105 update_sw_params(u);
1108 static void thread_func(void *userdata) {
1109 struct userdata *u = userdata;
1110 unsigned short revents = 0;
1112 pa_assert(u);
1114 pa_log_debug("Thread starting up");
1116 if (u->core->realtime_scheduling)
1117 pa_make_realtime(u->core->realtime_priority);
1119 pa_thread_mq_install(&u->thread_mq);
1121 for (;;) {
1122 int ret;
1124 #ifdef DEBUG_TIMING
1125 pa_log_debug("Loop");
1126 #endif
1128 /* Read some data and pass it to the sources */
1129 if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
1130 int work_done;
1131 pa_usec_t sleep_usec = 0;
1133 if (u->use_mmap)
1134 work_done = mmap_read(u, &sleep_usec, revents & POLLIN);
1135 else
1136 work_done = unix_read(u, &sleep_usec, revents & POLLIN);
1138 if (work_done < 0)
1139 goto fail;
1141 /* pa_log_debug("work_done = %i", work_done); */
1143 if (work_done)
1144 update_smoother(u);
1146 if (u->use_tsched) {
1147 pa_usec_t cusec;
1149 /* OK, the capture buffer is now empty, let's
1150 * calculate when to wake up next */
1152 /* pa_log_debug("Waking up in %0.2fms (sound card clock).", (double) sleep_usec / PA_USEC_PER_MSEC); */
1154 /* Convert from the sound card time domain to the
1155 * system time domain */
1156 cusec = pa_smoother_translate(u->smoother, pa_rtclock_now(), sleep_usec);
1158 /* pa_log_debug("Waking up in %0.2fms (system clock).", (double) cusec / PA_USEC_PER_MSEC); */
1160 /* We don't trust the conversion, so we wake up whatever comes first */
1161 pa_rtpoll_set_timer_relative(u->rtpoll, PA_MIN(sleep_usec, cusec));
1163 } else if (u->use_tsched)
1165 /* OK, we're in an invalid state, let's disable our timers */
1166 pa_rtpoll_set_timer_disabled(u->rtpoll);
1168 /* Hmm, nothing to do. Let's sleep */
1169 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
1170 goto fail;
1172 if (ret == 0)
1173 goto finish;
1175 /* Tell ALSA about this and process its response */
1176 if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
1177 struct pollfd *pollfd;
1178 int err;
1179 unsigned n;
1181 pollfd = pa_rtpoll_item_get_pollfd(u->alsa_rtpoll_item, &n);
1183 if ((err = snd_pcm_poll_descriptors_revents(u->pcm_handle, pollfd, n, &revents)) < 0) {
1184 pa_log("snd_pcm_poll_descriptors_revents() failed: %s", pa_alsa_strerror(err));
1185 goto fail;
1188 if (revents & ~POLLIN) {
1189 if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0)
1190 goto fail;
1192 snd_pcm_start(u->pcm_handle);
1193 } else if (revents && u->use_tsched && pa_log_ratelimit())
1194 pa_log_debug("Wakeup from ALSA!");
1196 } else
1197 revents = 0;
1200 fail:
1201 /* If this was no regular exit from the loop we have to continue
1202 * processing messages until we received PA_MESSAGE_SHUTDOWN */
1203 pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
1204 pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
1206 finish:
1207 pa_log_debug("Thread shutting down");
1210 static void set_source_name(pa_source_new_data *data, pa_modargs *ma, const char *device_id, const char *device_name, pa_alsa_mapping *mapping) {
1211 const char *n;
1212 char *t;
1214 pa_assert(data);
1215 pa_assert(ma);
1216 pa_assert(device_name);
1218 if ((n = pa_modargs_get_value(ma, "source_name", NULL))) {
1219 pa_source_new_data_set_name(data, n);
1220 data->namereg_fail = TRUE;
1221 return;
1224 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1225 data->namereg_fail = TRUE;
1226 else {
1227 n = device_id ? device_id : device_name;
1228 data->namereg_fail = FALSE;
1231 if (mapping)
1232 t = pa_sprintf_malloc("alsa_input.%s.%s", n, mapping->name);
1233 else
1234 t = pa_sprintf_malloc("alsa_input.%s", n);
1236 pa_source_new_data_set_name(data, t);
1237 pa_xfree(t);
1240 static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char *element, pa_bool_t ignore_dB) {
1242 if (!mapping && !element)
1243 return;
1245 if (!(u->mixer_handle = pa_alsa_open_mixer_for_pcm(u->pcm_handle, &u->control_device))) {
1246 pa_log_info("Failed to find a working mixer device.");
1247 return;
1250 if (element) {
1252 if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_INPUT)))
1253 goto fail;
1255 if (pa_alsa_path_probe(u->mixer_path, u->mixer_handle, ignore_dB) < 0)
1256 goto fail;
1258 pa_log_debug("Probed mixer path %s:", u->mixer_path->name);
1259 pa_alsa_path_dump(u->mixer_path);
1260 } else {
1262 if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_INPUT)))
1263 goto fail;
1265 pa_alsa_path_set_probe(u->mixer_path_set, u->mixer_handle, ignore_dB);
1267 pa_log_debug("Probed mixer paths:");
1268 pa_alsa_path_set_dump(u->mixer_path_set);
1271 return;
1273 fail:
1275 if (u->mixer_path_set) {
1276 pa_alsa_path_set_free(u->mixer_path_set);
1277 u->mixer_path_set = NULL;
1278 } else if (u->mixer_path) {
1279 pa_alsa_path_free(u->mixer_path);
1280 u->mixer_path = NULL;
1283 if (u->mixer_handle) {
1284 snd_mixer_close(u->mixer_handle);
1285 u->mixer_handle = NULL;
1289 static int setup_mixer(struct userdata *u, pa_bool_t ignore_dB) {
1290 pa_assert(u);
1292 if (!u->mixer_handle)
1293 return 0;
1295 if (u->source->active_port) {
1296 pa_alsa_port_data *data;
1298 /* We have a list of supported paths, so let's activate the
1299 * one that has been chosen as active */
1301 data = PA_DEVICE_PORT_DATA(u->source->active_port);
1302 u->mixer_path = data->path;
1304 pa_alsa_path_select(data->path, u->mixer_handle);
1306 if (data->setting)
1307 pa_alsa_setting_select(data->setting, u->mixer_handle);
1309 } else {
1311 if (!u->mixer_path && u->mixer_path_set)
1312 u->mixer_path = u->mixer_path_set->paths;
1314 if (u->mixer_path) {
1315 /* Hmm, we have only a single path, then let's activate it */
1317 pa_alsa_path_select(u->mixer_path, u->mixer_handle);
1319 if (u->mixer_path->settings)
1320 pa_alsa_setting_select(u->mixer_path->settings, u->mixer_handle);
1321 } else
1322 return 0;
1325 if (!u->mixer_path->has_volume)
1326 pa_log_info("Driver does not support hardware volume control, falling back to software volume control.");
1327 else {
1329 if (u->mixer_path->has_dB) {
1330 pa_log_info("Hardware volume ranges from %0.2f dB to %0.2f dB.", u->mixer_path->min_dB, u->mixer_path->max_dB);
1332 u->source->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB);
1333 u->source->n_volume_steps = PA_VOLUME_NORM+1;
1335 if (u->mixer_path->max_dB > 0.0)
1336 pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->source->base_volume));
1337 else
1338 pa_log_info("No particular base volume set, fixing to 0 dB");
1340 } else {
1341 pa_log_info("Hardware volume ranges from %li to %li.", u->mixer_path->min_volume, u->mixer_path->max_volume);
1342 u->source->base_volume = PA_VOLUME_NORM;
1343 u->source->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1;
1346 u->source->get_volume = source_get_volume_cb;
1347 u->source->set_volume = source_set_volume_cb;
1349 u->source->flags |= PA_SOURCE_HW_VOLUME_CTRL | (u->mixer_path->has_dB ? PA_SOURCE_DECIBEL_VOLUME : 0);
1350 pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->mixer_path->has_dB ? "supported" : "not supported");
1353 if (!u->mixer_path->has_mute) {
1354 pa_log_info("Driver does not support hardware mute control, falling back to software mute control.");
1355 } else {
1356 u->source->get_mute = source_get_mute_cb;
1357 u->source->set_mute = source_set_mute_cb;
1358 u->source->flags |= PA_SOURCE_HW_MUTE_CTRL;
1359 pa_log_info("Using hardware mute control.");
1362 u->mixer_fdl = pa_alsa_fdlist_new();
1364 if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, u->core->mainloop) < 0) {
1365 pa_log("Failed to initialize file descriptor monitoring");
1366 return -1;
1369 if (u->mixer_path_set)
1370 pa_alsa_path_set_set_callback(u->mixer_path_set, u->mixer_handle, mixer_callback, u);
1371 else
1372 pa_alsa_path_set_callback(u->mixer_path, u->mixer_handle, mixer_callback, u);
1374 return 0;
1377 pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping) {
1379 struct userdata *u = NULL;
1380 const char *dev_id = NULL;
1381 pa_sample_spec ss, requested_ss;
1382 pa_channel_map map;
1383 uint32_t nfrags, hwbuf_size, frag_size, tsched_size, tsched_watermark;
1384 snd_pcm_uframes_t period_frames, tsched_frames;
1385 size_t frame_size;
1386 pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE;
1387 pa_source_new_data data;
1388 pa_alsa_profile_set *profile_set = NULL;
1390 pa_assert(m);
1391 pa_assert(ma);
1393 ss = m->core->default_sample_spec;
1394 map = m->core->default_channel_map;
1395 if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) {
1396 pa_log("Failed to parse sample specification");
1397 goto fail;
1400 requested_ss = ss;
1401 frame_size = pa_frame_size(&ss);
1403 nfrags = m->core->default_n_fragments;
1404 frag_size = (uint32_t) pa_usec_to_bytes(m->core->default_fragment_size_msec*PA_USEC_PER_MSEC, &ss);
1405 if (frag_size <= 0)
1406 frag_size = (uint32_t) frame_size;
1407 tsched_size = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_BUFFER_USEC, &ss);
1408 tsched_watermark = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_WATERMARK_USEC, &ss);
1410 if (pa_modargs_get_value_u32(ma, "fragments", &nfrags) < 0 ||
1411 pa_modargs_get_value_u32(ma, "fragment_size", &frag_size) < 0 ||
1412 pa_modargs_get_value_u32(ma, "tsched_buffer_size", &tsched_size) < 0 ||
1413 pa_modargs_get_value_u32(ma, "tsched_buffer_watermark", &tsched_watermark) < 0) {
1414 pa_log("Failed to parse buffer metrics");
1415 goto fail;
1418 hwbuf_size = frag_size * nfrags;
1419 period_frames = frag_size/frame_size;
1420 tsched_frames = tsched_size/frame_size;
1422 if (pa_modargs_get_value_boolean(ma, "mmap", &use_mmap) < 0) {
1423 pa_log("Failed to parse mmap argument.");
1424 goto fail;
1427 if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) {
1428 pa_log("Failed to parse timer_scheduling argument.");
1429 goto fail;
1432 if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) {
1433 pa_log("Failed to parse ignore_dB argument.");
1434 goto fail;
1437 if (use_tsched && !pa_rtclock_hrtimer()) {
1438 pa_log_notice("Disabling timer-based scheduling because high-resolution timers are not available from the kernel.");
1439 use_tsched = FALSE;
1442 u = pa_xnew0(struct userdata, 1);
1443 u->core = m->core;
1444 u->module = m;
1445 u->use_mmap = use_mmap;
1446 u->use_tsched = use_tsched;
1447 u->rtpoll = pa_rtpoll_new();
1448 pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
1450 u->smoother = pa_smoother_new(
1451 DEFAULT_TSCHED_WATERMARK_USEC*2,
1452 DEFAULT_TSCHED_WATERMARK_USEC*2,
1453 TRUE,
1454 TRUE,
1456 pa_rtclock_now(),
1457 FALSE);
1459 dev_id = pa_modargs_get_value(
1460 ma, "device_id",
1461 pa_modargs_get_value(ma, "device", DEFAULT_DEVICE));
1463 if (reserve_init(u, dev_id) < 0)
1464 goto fail;
1466 if (reserve_monitor_init(u, dev_id) < 0)
1467 goto fail;
1469 b = use_mmap;
1470 d = use_tsched;
1472 if (mapping) {
1474 if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
1475 pa_log("device_id= not set");
1476 goto fail;
1479 if (!(u->pcm_handle = pa_alsa_open_by_device_id_mapping(
1480 dev_id,
1481 &u->device_name,
1482 &ss, &map,
1483 SND_PCM_STREAM_CAPTURE,
1484 &nfrags, &period_frames, tsched_frames,
1485 &b, &d, mapping)))
1486 goto fail;
1488 } else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
1490 if (!(profile_set = pa_alsa_profile_set_new(NULL, &map)))
1491 goto fail;
1493 if (!(u->pcm_handle = pa_alsa_open_by_device_id_auto(
1494 dev_id,
1495 &u->device_name,
1496 &ss, &map,
1497 SND_PCM_STREAM_CAPTURE,
1498 &nfrags, &period_frames, tsched_frames,
1499 &b, &d, profile_set, &mapping)))
1500 goto fail;
1502 } else {
1504 if (!(u->pcm_handle = pa_alsa_open_by_device_string(
1505 pa_modargs_get_value(ma, "device", DEFAULT_DEVICE),
1506 &u->device_name,
1507 &ss, &map,
1508 SND_PCM_STREAM_CAPTURE,
1509 &nfrags, &period_frames, tsched_frames,
1510 &b, &d, FALSE)))
1511 goto fail;
1514 pa_assert(u->device_name);
1515 pa_log_info("Successfully opened device %s.", u->device_name);
1517 if (pa_alsa_pcm_is_modem(u->pcm_handle)) {
1518 pa_log_notice("Device %s is modem, refusing further initialization.", u->device_name);
1519 goto fail;
1522 if (mapping)
1523 pa_log_info("Selected mapping '%s' (%s).", mapping->description, mapping->name);
1525 if (use_mmap && !b) {
1526 pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode.");
1527 u->use_mmap = use_mmap = FALSE;
1530 if (use_tsched && (!b || !d)) {
1531 pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling.");
1532 u->use_tsched = use_tsched = FALSE;
1535 if (use_tsched && !pa_alsa_pcm_is_hw(u->pcm_handle)) {
1536 pa_log_info("Device is not a hardware device, disabling timer-based scheduling.");
1537 u->use_tsched = use_tsched = FALSE;
1540 if (u->use_mmap)
1541 pa_log_info("Successfully enabled mmap() mode.");
1543 if (u->use_tsched)
1544 pa_log_info("Successfully enabled timer-based scheduling mode.");
1546 /* ALSA might tweak the sample spec, so recalculate the frame size */
1547 frame_size = pa_frame_size(&ss);
1549 find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB);
1551 pa_source_new_data_init(&data);
1552 data.driver = driver;
1553 data.module = m;
1554 data.card = card;
1555 set_source_name(&data, ma, dev_id, u->device_name, mapping);
1556 pa_source_new_data_set_sample_spec(&data, &ss);
1557 pa_source_new_data_set_channel_map(&data, &map);
1559 pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle);
1560 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name);
1561 pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (period_frames * frame_size * nfrags));
1562 pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size));
1563 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, u->use_tsched ? "mmap+timer" : (u->use_mmap ? "mmap" : "serial"));
1565 if (mapping) {
1566 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name);
1567 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description);
1570 pa_alsa_init_description(data.proplist);
1572 if (u->control_device)
1573 pa_alsa_init_proplist_ctl(data.proplist, u->control_device);
1575 if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1576 pa_log("Invalid properties");
1577 pa_source_new_data_done(&data);
1578 goto fail;
1581 if (u->mixer_path_set)
1582 pa_alsa_add_ports(&data.ports, u->mixer_path_set);
1584 u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY|(u->use_tsched ? PA_SOURCE_DYNAMIC_LATENCY : 0));
1585 pa_source_new_data_done(&data);
1587 if (!u->source) {
1588 pa_log("Failed to create source object");
1589 goto fail;
1592 u->source->parent.process_msg = source_process_msg;
1593 u->source->update_requested_latency = source_update_requested_latency_cb;
1594 u->source->set_state = source_set_state_cb;
1595 u->source->set_port = source_set_port_cb;
1596 u->source->userdata = u;
1598 pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
1599 pa_source_set_rtpoll(u->source, u->rtpoll);
1601 u->frame_size = frame_size;
1602 u->fragment_size = frag_size = (uint32_t) (period_frames * frame_size);
1603 u->nfragments = nfrags;
1604 u->hwbuf_size = u->fragment_size * nfrags;
1605 u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, &requested_ss), &u->source->sample_spec);
1606 pa_cvolume_mute(&u->hardware_volume, u->source->sample_spec.channels);
1608 pa_log_info("Using %u fragments of size %lu bytes, buffer time is %0.2fms",
1609 nfrags, (long unsigned) u->fragment_size,
1610 (double) pa_bytes_to_usec(u->hwbuf_size, &ss) / PA_USEC_PER_MSEC);
1612 if (u->use_tsched) {
1613 u->watermark_step = pa_usec_to_bytes(TSCHED_WATERMARK_STEP_USEC, &u->source->sample_spec);
1615 fix_min_sleep_wakeup(u);
1616 fix_tsched_watermark(u);
1618 pa_source_set_latency_range(u->source,
1620 pa_bytes_to_usec(u->hwbuf_size, &ss));
1622 pa_log_info("Time scheduling watermark is %0.2fms",
1623 (double) pa_bytes_to_usec(u->tsched_watermark, &ss) / PA_USEC_PER_MSEC);
1624 } else
1625 pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->hwbuf_size, &ss));
1627 reserve_update(u);
1629 if (update_sw_params(u) < 0)
1630 goto fail;
1632 if (setup_mixer(u, ignore_dB) < 0)
1633 goto fail;
1635 pa_alsa_dump(PA_LOG_DEBUG, u->pcm_handle);
1637 if (!(u->thread = pa_thread_new(thread_func, u))) {
1638 pa_log("Failed to create thread.");
1639 goto fail;
1641 /* Get initial mixer settings */
1642 if (data.volume_is_set) {
1643 if (u->source->set_volume)
1644 u->source->set_volume(u->source);
1645 } else {
1646 if (u->source->get_volume)
1647 u->source->get_volume(u->source);
1650 if (data.muted_is_set) {
1651 if (u->source->set_mute)
1652 u->source->set_mute(u->source);
1653 } else {
1654 if (u->source->get_mute)
1655 u->source->get_mute(u->source);
1658 pa_source_put(u->source);
1660 if (profile_set)
1661 pa_alsa_profile_set_free(profile_set);
1663 return u->source;
1665 fail:
1667 if (u)
1668 userdata_free(u);
1670 if (profile_set)
1671 pa_alsa_profile_set_free(profile_set);
1673 return NULL;
1676 static void userdata_free(struct userdata *u) {
1677 pa_assert(u);
1679 if (u->source)
1680 pa_source_unlink(u->source);
1682 if (u->thread) {
1683 pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
1684 pa_thread_free(u->thread);
1687 pa_thread_mq_done(&u->thread_mq);
1689 if (u->source)
1690 pa_source_unref(u->source);
1692 if (u->alsa_rtpoll_item)
1693 pa_rtpoll_item_free(u->alsa_rtpoll_item);
1695 if (u->rtpoll)
1696 pa_rtpoll_free(u->rtpoll);
1698 if (u->pcm_handle) {
1699 snd_pcm_drop(u->pcm_handle);
1700 snd_pcm_close(u->pcm_handle);
1703 if (u->mixer_fdl)
1704 pa_alsa_fdlist_free(u->mixer_fdl);
1706 if (u->mixer_path_set)
1707 pa_alsa_path_set_free(u->mixer_path_set);
1708 else if (u->mixer_path)
1709 pa_alsa_path_free(u->mixer_path);
1711 if (u->mixer_handle)
1712 snd_mixer_close(u->mixer_handle);
1714 if (u->smoother)
1715 pa_smoother_free(u->smoother);
1717 reserve_done(u);
1718 monitor_done(u);
1720 pa_xfree(u->device_name);
1721 pa_xfree(u->control_device);
1722 pa_xfree(u);
1725 void pa_alsa_source_free(pa_source *s) {
1726 struct userdata *u;
1728 pa_source_assert_ref(s);
1729 pa_assert_se(u = s->userdata);
1731 userdata_free(u);