Fix up according to Coding Style
[pulseaudio-mirror.git] / src / modules / alsa / alsa-source.c
blob6d18e60755a3418919de9dbd56e9e8a68958e86c
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"
63 #define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s */
64 #define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms */
66 #define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
67 #define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms */
68 #define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s */
69 #define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms */
70 #define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms */
71 #define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
73 #define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
74 #define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */
76 #define SMOOTHER_WINDOW_USEC (10*PA_USEC_PER_SEC) /* 10s */
77 #define SMOOTHER_ADJUST_USEC (1*PA_USEC_PER_SEC) /* 1s */
79 #define SMOOTHER_MIN_INTERVAL (2*PA_USEC_PER_MSEC) /* 2ms */
80 #define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms */
82 #define VOLUME_ACCURACY (PA_VOLUME_NORM/100)
84 struct userdata {
85 pa_core *core;
86 pa_module *module;
87 pa_source *source;
89 pa_thread *thread;
90 pa_thread_mq thread_mq;
91 pa_rtpoll *rtpoll;
93 snd_pcm_t *pcm_handle;
95 pa_alsa_fdlist *mixer_fdl;
96 snd_mixer_t *mixer_handle;
97 pa_alsa_path_set *mixer_path_set;
98 pa_alsa_path *mixer_path;
100 pa_cvolume hardware_volume;
102 size_t
103 frame_size,
104 fragment_size,
105 hwbuf_size,
106 tsched_watermark,
107 hwbuf_unused,
108 min_sleep,
109 min_wakeup,
110 watermark_inc_step,
111 watermark_dec_step,
112 watermark_inc_threshold,
113 watermark_dec_threshold;
115 pa_usec_t watermark_dec_not_before;
117 char *device_name;
118 char *control_device;
120 pa_bool_t use_mmap:1, use_tsched:1;
122 pa_bool_t first;
124 pa_rtpoll_item *alsa_rtpoll_item;
126 snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST];
128 pa_smoother *smoother;
129 uint64_t read_count;
130 pa_usec_t smoother_interval;
131 pa_usec_t last_smoother_update;
133 pa_reserve_wrapper *reserve;
134 pa_hook_slot *reserve_slot;
135 pa_reserve_monitor_wrapper *monitor;
136 pa_hook_slot *monitor_slot;
139 static void userdata_free(struct userdata *u);
141 static pa_hook_result_t reserve_cb(pa_reserve_wrapper *r, void *forced, struct userdata *u) {
142 pa_assert(r);
143 pa_assert(u);
145 if (pa_source_suspend(u->source, TRUE, PA_SUSPEND_APPLICATION) < 0)
146 return PA_HOOK_CANCEL;
148 return PA_HOOK_OK;
151 static void reserve_done(struct userdata *u) {
152 pa_assert(u);
154 if (u->reserve_slot) {
155 pa_hook_slot_free(u->reserve_slot);
156 u->reserve_slot = NULL;
159 if (u->reserve) {
160 pa_reserve_wrapper_unref(u->reserve);
161 u->reserve = NULL;
165 static void reserve_update(struct userdata *u) {
166 const char *description;
167 pa_assert(u);
169 if (!u->source || !u->reserve)
170 return;
172 if ((description = pa_proplist_gets(u->source->proplist, PA_PROP_DEVICE_DESCRIPTION)))
173 pa_reserve_wrapper_set_application_device_name(u->reserve, description);
176 static int reserve_init(struct userdata *u, const char *dname) {
177 char *rname;
179 pa_assert(u);
180 pa_assert(dname);
182 if (u->reserve)
183 return 0;
185 if (pa_in_system_mode())
186 return 0;
188 /* We are resuming, try to lock the device */
189 if (!(rname = pa_alsa_get_reserve_name(dname)))
190 return 0;
192 u->reserve = pa_reserve_wrapper_get(u->core, rname);
193 pa_xfree(rname);
195 if (!(u->reserve))
196 return -1;
198 reserve_update(u);
200 pa_assert(!u->reserve_slot);
201 u->reserve_slot = pa_hook_connect(pa_reserve_wrapper_hook(u->reserve), PA_HOOK_NORMAL, (pa_hook_cb_t) reserve_cb, u);
203 return 0;
206 static pa_hook_result_t monitor_cb(pa_reserve_monitor_wrapper *w, void* busy, struct userdata *u) {
207 pa_bool_t b;
209 pa_assert(w);
210 pa_assert(u);
212 b = PA_PTR_TO_UINT(busy) && !u->reserve;
214 pa_source_suspend(u->source, b, PA_SUSPEND_APPLICATION);
215 return PA_HOOK_OK;
218 static void monitor_done(struct userdata *u) {
219 pa_assert(u);
221 if (u->monitor_slot) {
222 pa_hook_slot_free(u->monitor_slot);
223 u->monitor_slot = NULL;
226 if (u->monitor) {
227 pa_reserve_monitor_wrapper_unref(u->monitor);
228 u->monitor = NULL;
232 static int reserve_monitor_init(struct userdata *u, const char *dname) {
233 char *rname;
235 pa_assert(u);
236 pa_assert(dname);
238 if (pa_in_system_mode())
239 return 0;
241 /* We are resuming, try to lock the device */
242 if (!(rname = pa_alsa_get_reserve_name(dname)))
243 return 0;
245 u->monitor = pa_reserve_monitor_wrapper_get(u->core, rname);
246 pa_xfree(rname);
248 if (!(u->monitor))
249 return -1;
251 pa_assert(!u->monitor_slot);
252 u->monitor_slot = pa_hook_connect(pa_reserve_monitor_wrapper_hook(u->monitor), PA_HOOK_NORMAL, (pa_hook_cb_t) monitor_cb, u);
254 return 0;
257 static void fix_min_sleep_wakeup(struct userdata *u) {
258 size_t max_use, max_use_2;
259 pa_assert(u);
260 pa_assert(u->use_tsched);
262 max_use = u->hwbuf_size - u->hwbuf_unused;
263 max_use_2 = pa_frame_align(max_use/2, &u->source->sample_spec);
265 u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->source->sample_spec);
266 u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2);
268 u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->source->sample_spec);
269 u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2);
272 static void fix_tsched_watermark(struct userdata *u) {
273 size_t max_use;
274 pa_assert(u);
275 pa_assert(u->use_tsched);
277 max_use = u->hwbuf_size - u->hwbuf_unused;
279 if (u->tsched_watermark > max_use - u->min_sleep)
280 u->tsched_watermark = max_use - u->min_sleep;
282 if (u->tsched_watermark < u->min_wakeup)
283 u->tsched_watermark = u->min_wakeup;
286 static void increase_watermark(struct userdata *u) {
287 size_t old_watermark;
288 pa_usec_t old_min_latency, new_min_latency;
290 pa_assert(u);
291 pa_assert(u->use_tsched);
293 /* First, just try to increase the watermark */
294 old_watermark = u->tsched_watermark;
295 u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_inc_step);
296 fix_tsched_watermark(u);
298 if (old_watermark != u->tsched_watermark) {
299 pa_log_info("Increasing wakeup watermark to %0.2f ms",
300 (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC);
301 return;
304 /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */
305 old_min_latency = u->source->thread_info.min_latency;
306 new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_INC_STEP_USEC);
307 new_min_latency = PA_MIN(new_min_latency, u->source->thread_info.max_latency);
309 if (old_min_latency != new_min_latency) {
310 pa_log_info("Increasing minimal latency to %0.2f ms",
311 (double) new_min_latency / PA_USEC_PER_MSEC);
313 pa_source_set_latency_range_within_thread(u->source, new_min_latency, u->source->thread_info.max_latency);
316 /* When we reach this we're officialy fucked! */
319 static void decrease_watermark(struct userdata *u) {
320 size_t old_watermark;
321 pa_usec_t now;
323 pa_assert(u);
324 pa_assert(u->use_tsched);
326 now = pa_rtclock_now();
328 if (u->watermark_dec_not_before <= 0)
329 goto restart;
331 if (u->watermark_dec_not_before > now)
332 return;
334 old_watermark = u->tsched_watermark;
336 if (u->tsched_watermark < u->watermark_dec_step)
337 u->tsched_watermark = u->tsched_watermark / 2;
338 else
339 u->tsched_watermark = PA_MAX(u->tsched_watermark / 2, u->tsched_watermark - u->watermark_dec_step);
341 fix_tsched_watermark(u);
343 if (old_watermark != u->tsched_watermark)
344 pa_log_info("Decreasing wakeup watermark to %0.2f ms",
345 (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC);
347 /* We don't change the latency range*/
349 restart:
350 u->watermark_dec_not_before = now + TSCHED_WATERMARK_VERIFY_AFTER_USEC;
353 static pa_usec_t hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) {
354 pa_usec_t wm, usec;
356 pa_assert(sleep_usec);
357 pa_assert(process_usec);
359 pa_assert(u);
360 pa_assert(u->use_tsched);
362 usec = pa_source_get_requested_latency_within_thread(u->source);
364 if (usec == (pa_usec_t) -1)
365 usec = pa_bytes_to_usec(u->hwbuf_size, &u->source->sample_spec);
367 wm = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec);
369 if (wm > usec)
370 wm = usec/2;
372 *sleep_usec = usec - wm;
373 *process_usec = wm;
375 #ifdef DEBUG_TIMING
376 pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms",
377 (unsigned long) (usec / PA_USEC_PER_MSEC),
378 (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC),
379 (unsigned long) (*process_usec / PA_USEC_PER_MSEC));
380 #endif
382 return usec;
385 static int try_recover(struct userdata *u, const char *call, int err) {
386 pa_assert(u);
387 pa_assert(call);
388 pa_assert(err < 0);
390 pa_log_debug("%s: %s", call, pa_alsa_strerror(err));
392 pa_assert(err != -EAGAIN);
394 if (err == -EPIPE)
395 pa_log_debug("%s: Buffer overrun!", call);
397 if (err == -ESTRPIPE)
398 pa_log_debug("%s: System suspended!", call);
400 if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) {
401 pa_log("%s: %s", call, pa_alsa_strerror(err));
402 return -1;
405 u->first = TRUE;
406 return 0;
409 static size_t check_left_to_record(struct userdata *u, size_t n_bytes, pa_bool_t on_timeout) {
410 size_t left_to_record;
411 size_t rec_space = u->hwbuf_size - u->hwbuf_unused;
412 pa_bool_t overrun = FALSE;
414 /* We use <= instead of < for this check here because an overrun
415 * only happens after the last sample was processed, not already when
416 * it is removed from the buffer. This is particularly important
417 * when block transfer is used. */
419 if (n_bytes <= rec_space)
420 left_to_record = rec_space - n_bytes;
421 else {
423 /* We got a dropout. What a mess! */
424 left_to_record = 0;
425 overrun = TRUE;
427 #ifdef DEBUG_TIMING
428 PA_DEBUG_TRAP;
429 #endif
431 if (pa_log_ratelimit(PA_LOG_INFO))
432 pa_log_info("Overrun!");
435 #ifdef DEBUG_TIMING
436 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);
437 #endif
439 if (u->use_tsched) {
440 pa_bool_t reset_not_before = TRUE;
442 if (overrun || left_to_record < u->watermark_inc_threshold)
443 increase_watermark(u);
444 else if (left_to_record > u->watermark_dec_threshold) {
445 reset_not_before = FALSE;
447 /* We decrease the watermark only if have actually been
448 * woken up by a timeout. If something else woke us up
449 * it's too easy to fulfill the deadlines... */
451 if (on_timeout)
452 decrease_watermark(u);
455 if (reset_not_before)
456 u->watermark_dec_not_before = 0;
459 return left_to_record;
462 static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) {
463 pa_bool_t work_done = FALSE;
464 pa_usec_t max_sleep_usec = 0, process_usec = 0;
465 size_t left_to_record;
466 unsigned j = 0;
468 pa_assert(u);
469 pa_source_assert_ref(u->source);
471 if (u->use_tsched)
472 hw_sleep_time(u, &max_sleep_usec, &process_usec);
474 for (;;) {
475 snd_pcm_sframes_t n;
476 size_t n_bytes;
477 int r;
478 pa_bool_t after_avail = TRUE;
480 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
482 if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
483 continue;
485 return r;
488 n_bytes = (size_t) n * u->frame_size;
490 #ifdef DEBUG_TIMING
491 pa_log_debug("avail: %lu", (unsigned long) n_bytes);
492 #endif
494 left_to_record = check_left_to_record(u, n_bytes, on_timeout);
495 on_timeout = FALSE;
497 if (u->use_tsched)
498 if (!polled &&
499 pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) {
500 #ifdef DEBUG_TIMING
501 pa_log_debug("Not reading, because too early.");
502 #endif
503 break;
506 if (PA_UNLIKELY(n_bytes <= 0)) {
508 if (polled)
509 PA_ONCE_BEGIN {
510 char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle);
511 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
512 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
513 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."),
514 pa_strnull(dn));
515 pa_xfree(dn);
516 } PA_ONCE_END;
518 #ifdef DEBUG_TIMING
519 pa_log_debug("Not reading, because not necessary.");
520 #endif
521 break;
524 if (++j > 10) {
525 #ifdef DEBUG_TIMING
526 pa_log_debug("Not filling up, because already too many iterations.");
527 #endif
529 break;
532 polled = FALSE;
534 #ifdef DEBUG_TIMING
535 pa_log_debug("Reading");
536 #endif
538 for (;;) {
539 int err;
540 const snd_pcm_channel_area_t *areas;
541 snd_pcm_uframes_t offset, frames;
542 pa_memchunk chunk;
543 void *p;
544 snd_pcm_sframes_t sframes;
546 frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size);
548 /* pa_log_debug("%lu frames to read", (unsigned long) frames); */
550 if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
552 if (!after_avail && err == -EAGAIN)
553 break;
555 if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0)
556 continue;
558 return r;
561 /* Make sure that if these memblocks need to be copied they will fit into one slot */
562 if (frames > pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size)
563 frames = pa_mempool_block_size_max(u->source->core->mempool)/u->frame_size;
565 if (!after_avail && frames == 0)
566 break;
568 pa_assert(frames > 0);
569 after_avail = FALSE;
571 /* Check these are multiples of 8 bit */
572 pa_assert((areas[0].first & 7) == 0);
573 pa_assert((areas[0].step & 7)== 0);
575 /* We assume a single interleaved memory buffer */
576 pa_assert((areas[0].first >> 3) == 0);
577 pa_assert((areas[0].step >> 3) == u->frame_size);
579 p = (uint8_t*) areas[0].addr + (offset * u->frame_size);
581 chunk.memblock = pa_memblock_new_fixed(u->core->mempool, p, frames * u->frame_size, TRUE);
582 chunk.length = pa_memblock_get_length(chunk.memblock);
583 chunk.index = 0;
585 pa_source_post(u->source, &chunk);
586 pa_memblock_unref_fixed(chunk.memblock);
588 if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) {
590 if ((r = try_recover(u, "snd_pcm_mmap_commit", (int) sframes)) == 0)
591 continue;
593 return r;
596 work_done = TRUE;
598 u->read_count += frames * u->frame_size;
600 #ifdef DEBUG_TIMING
601 pa_log_debug("Read %lu bytes (of possible %lu bytes)", (unsigned long) (frames * u->frame_size), (unsigned long) n_bytes);
602 #endif
604 if ((size_t) frames * u->frame_size >= n_bytes)
605 break;
607 n_bytes -= (size_t) frames * u->frame_size;
611 if (u->use_tsched) {
612 *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
614 if (*sleep_usec > process_usec)
615 *sleep_usec -= process_usec;
616 else
617 *sleep_usec = 0;
620 return work_done ? 1 : 0;
623 static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) {
624 int work_done = FALSE;
625 pa_usec_t max_sleep_usec = 0, process_usec = 0;
626 size_t left_to_record;
627 unsigned j = 0;
629 pa_assert(u);
630 pa_source_assert_ref(u->source);
632 if (u->use_tsched)
633 hw_sleep_time(u, &max_sleep_usec, &process_usec);
635 for (;;) {
636 snd_pcm_sframes_t n;
637 size_t n_bytes;
638 int r;
639 pa_bool_t after_avail = TRUE;
641 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
643 if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
644 continue;
646 return r;
649 n_bytes = (size_t) n * u->frame_size;
650 left_to_record = check_left_to_record(u, n_bytes, on_timeout);
651 on_timeout = FALSE;
653 if (u->use_tsched)
654 if (!polled &&
655 pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2)
656 break;
658 if (PA_UNLIKELY(n_bytes <= 0)) {
660 if (polled)
661 PA_ONCE_BEGIN {
662 char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle);
663 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
664 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
665 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."),
666 pa_strnull(dn));
667 pa_xfree(dn);
668 } PA_ONCE_END;
670 break;
673 if (++j > 10) {
674 #ifdef DEBUG_TIMING
675 pa_log_debug("Not filling up, because already too many iterations.");
676 #endif
678 break;
681 polled = FALSE;
683 for (;;) {
684 void *p;
685 snd_pcm_sframes_t frames;
686 pa_memchunk chunk;
688 chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) -1);
690 frames = (snd_pcm_sframes_t) (pa_memblock_get_length(chunk.memblock) / u->frame_size);
692 if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size))
693 frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size);
695 /* pa_log_debug("%lu frames to read", (unsigned long) n); */
697 p = pa_memblock_acquire(chunk.memblock);
698 frames = snd_pcm_readi(u->pcm_handle, (uint8_t*) p, (snd_pcm_uframes_t) frames);
699 pa_memblock_release(chunk.memblock);
701 if (PA_UNLIKELY(frames < 0)) {
702 pa_memblock_unref(chunk.memblock);
704 if (!after_avail && (int) frames == -EAGAIN)
705 break;
707 if ((r = try_recover(u, "snd_pcm_readi", (int) frames)) == 0)
708 continue;
710 return r;
713 if (!after_avail && frames == 0) {
714 pa_memblock_unref(chunk.memblock);
715 break;
718 pa_assert(frames > 0);
719 after_avail = FALSE;
721 chunk.index = 0;
722 chunk.length = (size_t) frames * u->frame_size;
724 pa_source_post(u->source, &chunk);
725 pa_memblock_unref(chunk.memblock);
727 work_done = TRUE;
729 u->read_count += frames * u->frame_size;
731 /* pa_log_debug("read %lu frames", (unsigned long) frames); */
733 if ((size_t) frames * u->frame_size >= n_bytes)
734 break;
736 n_bytes -= (size_t) frames * u->frame_size;
740 if (u->use_tsched) {
741 *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
743 if (*sleep_usec > process_usec)
744 *sleep_usec -= process_usec;
745 else
746 *sleep_usec = 0;
749 return work_done ? 1 : 0;
752 static void update_smoother(struct userdata *u) {
753 snd_pcm_sframes_t delay = 0;
754 uint64_t position;
755 int err;
756 pa_usec_t now1 = 0, now2;
757 snd_pcm_status_t *status;
759 snd_pcm_status_alloca(&status);
761 pa_assert(u);
762 pa_assert(u->pcm_handle);
764 /* Let's update the time smoother */
766 if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, &delay, u->hwbuf_size, &u->source->sample_spec, TRUE)) < 0)) {
767 pa_log_warn("Failed to get delay: %s", pa_alsa_strerror(err));
768 return;
771 if (PA_UNLIKELY((err = snd_pcm_status(u->pcm_handle, status)) < 0))
772 pa_log_warn("Failed to get timestamp: %s", pa_alsa_strerror(err));
773 else {
774 snd_htimestamp_t htstamp = { 0, 0 };
775 snd_pcm_status_get_htstamp(status, &htstamp);
776 now1 = pa_timespec_load(&htstamp);
779 /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */
780 if (now1 <= 0)
781 now1 = pa_rtclock_now();
783 /* check if the time since the last update is bigger than the interval */
784 if (u->last_smoother_update > 0)
785 if (u->last_smoother_update + u->smoother_interval > now1)
786 return;
788 position = u->read_count + ((uint64_t) delay * (uint64_t) u->frame_size);
789 now2 = pa_bytes_to_usec(position, &u->source->sample_spec);
791 pa_smoother_put(u->smoother, now1, now2);
793 u->last_smoother_update = now1;
794 /* exponentially increase the update interval up to the MAX limit */
795 u->smoother_interval = PA_MIN (u->smoother_interval * 2, SMOOTHER_MAX_INTERVAL);
798 static pa_usec_t source_get_latency(struct userdata *u) {
799 int64_t delay;
800 pa_usec_t now1, now2;
802 pa_assert(u);
804 now1 = pa_rtclock_now();
805 now2 = pa_smoother_get(u->smoother, now1);
807 delay = (int64_t) now2 - (int64_t) pa_bytes_to_usec(u->read_count, &u->source->sample_spec);
809 return delay >= 0 ? (pa_usec_t) delay : 0;
812 static int build_pollfd(struct userdata *u) {
813 pa_assert(u);
814 pa_assert(u->pcm_handle);
816 if (u->alsa_rtpoll_item)
817 pa_rtpoll_item_free(u->alsa_rtpoll_item);
819 if (!(u->alsa_rtpoll_item = pa_alsa_build_pollfd(u->pcm_handle, u->rtpoll)))
820 return -1;
822 return 0;
825 static int suspend(struct userdata *u) {
826 pa_assert(u);
827 pa_assert(u->pcm_handle);
829 pa_smoother_pause(u->smoother, pa_rtclock_now());
831 /* Let's suspend */
832 snd_pcm_close(u->pcm_handle);
833 u->pcm_handle = NULL;
835 if (u->alsa_rtpoll_item) {
836 pa_rtpoll_item_free(u->alsa_rtpoll_item);
837 u->alsa_rtpoll_item = NULL;
840 pa_log_info("Device suspended...");
842 return 0;
845 static int update_sw_params(struct userdata *u) {
846 snd_pcm_uframes_t avail_min;
847 int err;
849 pa_assert(u);
851 /* Use the full buffer if noone asked us for anything specific */
852 u->hwbuf_unused = 0;
854 if (u->use_tsched) {
855 pa_usec_t latency;
857 if ((latency = pa_source_get_requested_latency_within_thread(u->source)) != (pa_usec_t) -1) {
858 size_t b;
860 pa_log_debug("latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC);
862 b = pa_usec_to_bytes(latency, &u->source->sample_spec);
864 /* We need at least one sample in our buffer */
866 if (PA_UNLIKELY(b < u->frame_size))
867 b = u->frame_size;
869 u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0;
872 fix_min_sleep_wakeup(u);
873 fix_tsched_watermark(u);
876 pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused);
878 avail_min = 1;
880 if (u->use_tsched) {
881 pa_usec_t sleep_usec, process_usec;
883 hw_sleep_time(u, &sleep_usec, &process_usec);
884 avail_min += pa_usec_to_bytes(sleep_usec, &u->source->sample_spec) / u->frame_size;
887 pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min);
889 if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) {
890 pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err));
891 return err;
894 return 0;
897 static int unsuspend(struct userdata *u) {
898 pa_sample_spec ss;
899 int err;
900 pa_bool_t b, d;
901 snd_pcm_uframes_t period_size, buffer_size;
903 pa_assert(u);
904 pa_assert(!u->pcm_handle);
906 pa_log_info("Trying resume...");
908 if ((err = snd_pcm_open(&u->pcm_handle, u->device_name, SND_PCM_STREAM_CAPTURE,
909 SND_PCM_NONBLOCK|
910 SND_PCM_NO_AUTO_RESAMPLE|
911 SND_PCM_NO_AUTO_CHANNELS|
912 SND_PCM_NO_AUTO_FORMAT)) < 0) {
913 pa_log("Error opening PCM device %s: %s", u->device_name, pa_alsa_strerror(err));
914 goto fail;
917 ss = u->source->sample_spec;
918 period_size = u->fragment_size / u->frame_size;
919 buffer_size = u->hwbuf_size / u->frame_size;
920 b = u->use_mmap;
921 d = u->use_tsched;
923 if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &period_size, &buffer_size, 0, &b, &d, TRUE)) < 0) {
924 pa_log("Failed to set hardware parameters: %s", pa_alsa_strerror(err));
925 goto fail;
928 if (b != u->use_mmap || d != u->use_tsched) {
929 pa_log_warn("Resume failed, couldn't get original access mode.");
930 goto fail;
933 if (!pa_sample_spec_equal(&ss, &u->source->sample_spec)) {
934 pa_log_warn("Resume failed, couldn't restore original sample settings.");
935 goto fail;
938 if (period_size*u->frame_size != u->fragment_size ||
939 buffer_size*u->frame_size != u->hwbuf_size) {
940 pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %lu/%lu, New %lu/%lu)",
941 (unsigned long) u->hwbuf_size, (unsigned long) u->fragment_size,
942 (unsigned long) (buffer_size*u->frame_size), (unsigned long) (period_size*u->frame_size));
943 goto fail;
946 if (update_sw_params(u) < 0)
947 goto fail;
949 if (build_pollfd(u) < 0)
950 goto fail;
952 /* FIXME: We need to reload the volume somehow */
954 u->read_count = 0;
955 pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);
956 u->smoother_interval = SMOOTHER_MIN_INTERVAL;
957 u->last_smoother_update = 0;
959 u->first = TRUE;
961 pa_log_info("Resumed successfully...");
963 return 0;
965 fail:
966 if (u->pcm_handle) {
967 snd_pcm_close(u->pcm_handle);
968 u->pcm_handle = NULL;
971 return -PA_ERR_IO;
974 static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
975 struct userdata *u = PA_SOURCE(o)->userdata;
977 switch (code) {
979 case PA_SOURCE_MESSAGE_GET_LATENCY: {
980 pa_usec_t r = 0;
982 if (u->pcm_handle)
983 r = source_get_latency(u);
985 *((pa_usec_t*) data) = r;
987 return 0;
990 case PA_SOURCE_MESSAGE_SET_STATE:
992 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
994 case PA_SOURCE_SUSPENDED: {
995 int r;
996 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
998 if ((r = suspend(u)) < 0)
999 return r;
1001 break;
1004 case PA_SOURCE_IDLE:
1005 case PA_SOURCE_RUNNING: {
1006 int r;
1008 if (u->source->thread_info.state == PA_SOURCE_INIT) {
1009 if (build_pollfd(u) < 0)
1010 return -PA_ERR_IO;
1013 if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) {
1014 if ((r = unsuspend(u)) < 0)
1015 return r;
1018 break;
1021 case PA_SOURCE_UNLINKED:
1022 case PA_SOURCE_INIT:
1023 case PA_SOURCE_INVALID_STATE:
1027 break;
1030 return pa_source_process_msg(o, code, data, offset, chunk);
1033 /* Called from main context */
1034 static int source_set_state_cb(pa_source *s, pa_source_state_t new_state) {
1035 pa_source_state_t old_state;
1036 struct userdata *u;
1038 pa_source_assert_ref(s);
1039 pa_assert_se(u = s->userdata);
1041 old_state = pa_source_get_state(u->source);
1043 if (PA_SOURCE_IS_OPENED(old_state) && new_state == PA_SOURCE_SUSPENDED)
1044 reserve_done(u);
1045 else if (old_state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(new_state))
1046 if (reserve_init(u, u->device_name) < 0)
1047 return -PA_ERR_BUSY;
1049 return 0;
1052 static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
1053 struct userdata *u = snd_mixer_elem_get_callback_private(elem);
1055 pa_assert(u);
1056 pa_assert(u->mixer_handle);
1058 if (mask == SND_CTL_EVENT_MASK_REMOVE)
1059 return 0;
1061 if (u->source->suspend_cause & PA_SUSPEND_SESSION)
1062 return 0;
1064 if (mask & SND_CTL_EVENT_MASK_VALUE) {
1065 pa_source_get_volume(u->source, TRUE);
1066 pa_source_get_mute(u->source, TRUE);
1069 return 0;
1072 static void source_get_volume_cb(pa_source *s) {
1073 struct userdata *u = s->userdata;
1074 pa_cvolume r;
1075 char vol_str_pcnt[PA_CVOLUME_SNPRINT_MAX];
1077 pa_assert(u);
1078 pa_assert(u->mixer_path);
1079 pa_assert(u->mixer_handle);
1081 if (pa_alsa_path_get_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0)
1082 return;
1084 /* Shift down by the base volume, so that 0dB becomes maximum volume */
1085 pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume);
1087 pa_log_debug("Read hardware volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &r));
1089 if (u->mixer_path->has_dB) {
1090 char vol_str_db[PA_SW_CVOLUME_SNPRINT_DB_MAX];
1092 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &r));
1095 if (pa_cvolume_equal(&u->hardware_volume, &r))
1096 return;
1098 s->volume = u->hardware_volume = r;
1100 /* Hmm, so the hardware volume changed, let's reset our software volume */
1101 if (u->mixer_path->has_dB)
1102 pa_source_set_soft_volume(s, NULL);
1105 static void source_set_volume_cb(pa_source *s) {
1106 struct userdata *u = s->userdata;
1107 pa_cvolume r;
1108 char vol_str_pcnt[PA_CVOLUME_SNPRINT_MAX];
1110 pa_assert(u);
1111 pa_assert(u->mixer_path);
1112 pa_assert(u->mixer_handle);
1114 /* Shift up by the base volume */
1115 pa_sw_cvolume_divide_scalar(&r, &s->volume, s->base_volume);
1117 if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, TRUE) < 0)
1118 return;
1120 /* Shift down by the base volume, so that 0dB becomes maximum volume */
1121 pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume);
1123 u->hardware_volume = r;
1125 if (u->mixer_path->has_dB) {
1126 pa_cvolume new_soft_volume;
1127 pa_bool_t accurate_enough;
1128 char vol_str_db[PA_SW_CVOLUME_SNPRINT_DB_MAX];
1130 /* Match exactly what the user requested by software */
1131 pa_sw_cvolume_divide(&new_soft_volume, &s->volume, &u->hardware_volume);
1133 /* If the adjustment to do in software is only minimal we
1134 * can skip it. That saves us CPU at the expense of a bit of
1135 * accuracy */
1136 accurate_enough =
1137 (pa_cvolume_min(&new_soft_volume) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) &&
1138 (pa_cvolume_max(&new_soft_volume) <= (PA_VOLUME_NORM + VOLUME_ACCURACY));
1140 pa_log_debug("Requested volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &s->volume));
1141 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &s->volume));
1142 pa_log_debug("Got hardware volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &u->hardware_volume));
1143 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &u->hardware_volume));
1144 pa_log_debug("Calculated software volume: %s (accurate-enough=%s)",
1145 pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &new_soft_volume),
1146 pa_yes_no(accurate_enough));
1147 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &new_soft_volume));
1149 if (!accurate_enough)
1150 s->soft_volume = new_soft_volume;
1152 } else {
1153 pa_log_debug("Wrote hardware volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &r));
1155 /* We can't match exactly what the user requested, hence let's
1156 * at least tell the user about it */
1158 s->volume = r;
1162 static void source_get_mute_cb(pa_source *s) {
1163 struct userdata *u = s->userdata;
1164 pa_bool_t b;
1166 pa_assert(u);
1167 pa_assert(u->mixer_path);
1168 pa_assert(u->mixer_handle);
1170 if (pa_alsa_path_get_mute(u->mixer_path, u->mixer_handle, &b) < 0)
1171 return;
1173 s->muted = b;
1176 static void source_set_mute_cb(pa_source *s) {
1177 struct userdata *u = s->userdata;
1179 pa_assert(u);
1180 pa_assert(u->mixer_path);
1181 pa_assert(u->mixer_handle);
1183 pa_alsa_path_set_mute(u->mixer_path, u->mixer_handle, s->muted);
1186 static int source_set_port_cb(pa_source *s, pa_device_port *p) {
1187 struct userdata *u = s->userdata;
1188 pa_alsa_port_data *data;
1190 pa_assert(u);
1191 pa_assert(p);
1192 pa_assert(u->mixer_handle);
1194 data = PA_DEVICE_PORT_DATA(p);
1196 pa_assert_se(u->mixer_path = data->path);
1197 pa_alsa_path_select(u->mixer_path, u->mixer_handle);
1199 if (u->mixer_path->has_volume && u->mixer_path->has_dB) {
1200 s->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB);
1201 s->n_volume_steps = PA_VOLUME_NORM+1;
1203 pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(s->base_volume));
1204 } else {
1205 s->base_volume = PA_VOLUME_NORM;
1206 s->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1;
1209 if (data->setting)
1210 pa_alsa_setting_select(data->setting, u->mixer_handle);
1212 if (s->set_mute)
1213 s->set_mute(s);
1214 if (s->set_volume)
1215 s->set_volume(s);
1217 return 0;
1220 static void source_update_requested_latency_cb(pa_source *s) {
1221 struct userdata *u = s->userdata;
1222 pa_assert(u);
1223 pa_assert(u->use_tsched);
1225 if (!u->pcm_handle)
1226 return;
1228 update_sw_params(u);
1231 static void thread_func(void *userdata) {
1232 struct userdata *u = userdata;
1233 unsigned short revents = 0;
1235 pa_assert(u);
1237 pa_log_debug("Thread starting up");
1239 if (u->core->realtime_scheduling)
1240 pa_make_realtime(u->core->realtime_priority);
1242 pa_thread_mq_install(&u->thread_mq);
1244 for (;;) {
1245 int ret;
1247 #ifdef DEBUG_TIMING
1248 pa_log_debug("Loop");
1249 #endif
1251 /* Read some data and pass it to the sources */
1252 if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
1253 int work_done;
1254 pa_usec_t sleep_usec = 0;
1255 pa_bool_t on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll);
1257 if (u->first) {
1258 pa_log_info("Starting capture.");
1259 snd_pcm_start(u->pcm_handle);
1261 pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE);
1263 u->first = FALSE;
1266 if (u->use_mmap)
1267 work_done = mmap_read(u, &sleep_usec, revents & POLLIN, on_timeout);
1268 else
1269 work_done = unix_read(u, &sleep_usec, revents & POLLIN, on_timeout);
1271 if (work_done < 0)
1272 goto fail;
1274 /* pa_log_debug("work_done = %i", work_done); */
1276 if (work_done)
1277 update_smoother(u);
1279 if (u->use_tsched) {
1280 pa_usec_t cusec;
1282 /* OK, the capture buffer is now empty, let's
1283 * calculate when to wake up next */
1285 /* pa_log_debug("Waking up in %0.2fms (sound card clock).", (double) sleep_usec / PA_USEC_PER_MSEC); */
1287 /* Convert from the sound card time domain to the
1288 * system time domain */
1289 cusec = pa_smoother_translate(u->smoother, pa_rtclock_now(), sleep_usec);
1291 /* pa_log_debug("Waking up in %0.2fms (system clock).", (double) cusec / PA_USEC_PER_MSEC); */
1293 /* We don't trust the conversion, so we wake up whatever comes first */
1294 pa_rtpoll_set_timer_relative(u->rtpoll, PA_MIN(sleep_usec, cusec));
1296 } else if (u->use_tsched)
1298 /* OK, we're in an invalid state, let's disable our timers */
1299 pa_rtpoll_set_timer_disabled(u->rtpoll);
1301 /* Hmm, nothing to do. Let's sleep */
1302 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
1303 goto fail;
1305 if (ret == 0)
1306 goto finish;
1308 /* Tell ALSA about this and process its response */
1309 if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
1310 struct pollfd *pollfd;
1311 int err;
1312 unsigned n;
1314 pollfd = pa_rtpoll_item_get_pollfd(u->alsa_rtpoll_item, &n);
1316 if ((err = snd_pcm_poll_descriptors_revents(u->pcm_handle, pollfd, n, &revents)) < 0) {
1317 pa_log("snd_pcm_poll_descriptors_revents() failed: %s", pa_alsa_strerror(err));
1318 goto fail;
1321 if (revents & ~POLLIN) {
1322 if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0)
1323 goto fail;
1325 u->first = TRUE;
1326 } else if (revents && u->use_tsched && pa_log_ratelimit(PA_LOG_DEBUG))
1327 pa_log_debug("Wakeup from ALSA!");
1329 } else
1330 revents = 0;
1333 fail:
1334 /* If this was no regular exit from the loop we have to continue
1335 * processing messages until we received PA_MESSAGE_SHUTDOWN */
1336 pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
1337 pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
1339 finish:
1340 pa_log_debug("Thread shutting down");
1343 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) {
1344 const char *n;
1345 char *t;
1347 pa_assert(data);
1348 pa_assert(ma);
1349 pa_assert(device_name);
1351 if ((n = pa_modargs_get_value(ma, "source_name", NULL))) {
1352 pa_source_new_data_set_name(data, n);
1353 data->namereg_fail = TRUE;
1354 return;
1357 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1358 data->namereg_fail = TRUE;
1359 else {
1360 n = device_id ? device_id : device_name;
1361 data->namereg_fail = FALSE;
1364 if (mapping)
1365 t = pa_sprintf_malloc("alsa_input.%s.%s", n, mapping->name);
1366 else
1367 t = pa_sprintf_malloc("alsa_input.%s", n);
1369 pa_source_new_data_set_name(data, t);
1370 pa_xfree(t);
1373 static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char *element, pa_bool_t ignore_dB) {
1375 if (!mapping && !element)
1376 return;
1378 if (!(u->mixer_handle = pa_alsa_open_mixer_for_pcm(u->pcm_handle, &u->control_device))) {
1379 pa_log_info("Failed to find a working mixer device.");
1380 return;
1383 if (element) {
1385 if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_INPUT)))
1386 goto fail;
1388 if (pa_alsa_path_probe(u->mixer_path, u->mixer_handle, ignore_dB) < 0)
1389 goto fail;
1391 pa_log_debug("Probed mixer path %s:", u->mixer_path->name);
1392 pa_alsa_path_dump(u->mixer_path);
1393 } else {
1395 if (!(u->mixer_path_set = pa_alsa_path_set_new(mapping, PA_ALSA_DIRECTION_INPUT)))
1396 goto fail;
1398 pa_alsa_path_set_probe(u->mixer_path_set, u->mixer_handle, ignore_dB);
1400 pa_log_debug("Probed mixer paths:");
1401 pa_alsa_path_set_dump(u->mixer_path_set);
1404 return;
1406 fail:
1408 if (u->mixer_path_set) {
1409 pa_alsa_path_set_free(u->mixer_path_set);
1410 u->mixer_path_set = NULL;
1411 } else if (u->mixer_path) {
1412 pa_alsa_path_free(u->mixer_path);
1413 u->mixer_path = NULL;
1416 if (u->mixer_handle) {
1417 snd_mixer_close(u->mixer_handle);
1418 u->mixer_handle = NULL;
1422 static int setup_mixer(struct userdata *u, pa_bool_t ignore_dB) {
1423 pa_assert(u);
1425 if (!u->mixer_handle)
1426 return 0;
1428 if (u->source->active_port) {
1429 pa_alsa_port_data *data;
1431 /* We have a list of supported paths, so let's activate the
1432 * one that has been chosen as active */
1434 data = PA_DEVICE_PORT_DATA(u->source->active_port);
1435 u->mixer_path = data->path;
1437 pa_alsa_path_select(data->path, u->mixer_handle);
1439 if (data->setting)
1440 pa_alsa_setting_select(data->setting, u->mixer_handle);
1442 } else {
1444 if (!u->mixer_path && u->mixer_path_set)
1445 u->mixer_path = u->mixer_path_set->paths;
1447 if (u->mixer_path) {
1448 /* Hmm, we have only a single path, then let's activate it */
1450 pa_alsa_path_select(u->mixer_path, u->mixer_handle);
1452 if (u->mixer_path->settings)
1453 pa_alsa_setting_select(u->mixer_path->settings, u->mixer_handle);
1454 } else
1455 return 0;
1458 if (!u->mixer_path->has_volume)
1459 pa_log_info("Driver does not support hardware volume control, falling back to software volume control.");
1460 else {
1462 if (u->mixer_path->has_dB) {
1463 pa_log_info("Hardware volume ranges from %0.2f dB to %0.2f dB.", u->mixer_path->min_dB, u->mixer_path->max_dB);
1465 u->source->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB);
1466 u->source->n_volume_steps = PA_VOLUME_NORM+1;
1468 if (u->mixer_path->max_dB > 0.0)
1469 pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->source->base_volume));
1470 else
1471 pa_log_info("No particular base volume set, fixing to 0 dB");
1473 } else {
1474 pa_log_info("Hardware volume ranges from %li to %li.", u->mixer_path->min_volume, u->mixer_path->max_volume);
1475 u->source->base_volume = PA_VOLUME_NORM;
1476 u->source->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1;
1479 u->source->get_volume = source_get_volume_cb;
1480 u->source->set_volume = source_set_volume_cb;
1482 u->source->flags |= PA_SOURCE_HW_VOLUME_CTRL | (u->mixer_path->has_dB ? PA_SOURCE_DECIBEL_VOLUME : 0);
1483 pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->mixer_path->has_dB ? "supported" : "not supported");
1486 if (!u->mixer_path->has_mute) {
1487 pa_log_info("Driver does not support hardware mute control, falling back to software mute control.");
1488 } else {
1489 u->source->get_mute = source_get_mute_cb;
1490 u->source->set_mute = source_set_mute_cb;
1491 u->source->flags |= PA_SOURCE_HW_MUTE_CTRL;
1492 pa_log_info("Using hardware mute control.");
1495 u->mixer_fdl = pa_alsa_fdlist_new();
1497 if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, u->core->mainloop) < 0) {
1498 pa_log("Failed to initialize file descriptor monitoring");
1499 return -1;
1502 if (u->mixer_path_set)
1503 pa_alsa_path_set_set_callback(u->mixer_path_set, u->mixer_handle, mixer_callback, u);
1504 else
1505 pa_alsa_path_set_callback(u->mixer_path, u->mixer_handle, mixer_callback, u);
1507 return 0;
1510 pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping) {
1512 struct userdata *u = NULL;
1513 const char *dev_id = NULL;
1514 pa_sample_spec ss, requested_ss;
1515 pa_channel_map map;
1516 uint32_t nfrags, frag_size, buffer_size, tsched_size, tsched_watermark;
1517 snd_pcm_uframes_t period_frames, buffer_frames, tsched_frames;
1518 size_t frame_size;
1519 pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE, namereg_fail = FALSE;
1520 pa_source_new_data data;
1521 pa_alsa_profile_set *profile_set = NULL;
1523 pa_assert(m);
1524 pa_assert(ma);
1526 ss = m->core->default_sample_spec;
1527 map = m->core->default_channel_map;
1528 if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) {
1529 pa_log("Failed to parse sample specification");
1530 goto fail;
1533 requested_ss = ss;
1534 frame_size = pa_frame_size(&ss);
1536 nfrags = m->core->default_n_fragments;
1537 frag_size = (uint32_t) pa_usec_to_bytes(m->core->default_fragment_size_msec*PA_USEC_PER_MSEC, &ss);
1538 if (frag_size <= 0)
1539 frag_size = (uint32_t) frame_size;
1540 tsched_size = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_BUFFER_USEC, &ss);
1541 tsched_watermark = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_WATERMARK_USEC, &ss);
1543 if (pa_modargs_get_value_u32(ma, "fragments", &nfrags) < 0 ||
1544 pa_modargs_get_value_u32(ma, "fragment_size", &frag_size) < 0 ||
1545 pa_modargs_get_value_u32(ma, "tsched_buffer_size", &tsched_size) < 0 ||
1546 pa_modargs_get_value_u32(ma, "tsched_buffer_watermark", &tsched_watermark) < 0) {
1547 pa_log("Failed to parse buffer metrics");
1548 goto fail;
1551 buffer_size = nfrags * frag_size;
1553 period_frames = frag_size/frame_size;
1554 buffer_frames = buffer_size/frame_size;
1555 tsched_frames = tsched_size/frame_size;
1557 if (pa_modargs_get_value_boolean(ma, "mmap", &use_mmap) < 0) {
1558 pa_log("Failed to parse mmap argument.");
1559 goto fail;
1562 if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) {
1563 pa_log("Failed to parse timer_scheduling argument.");
1564 goto fail;
1567 if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) {
1568 pa_log("Failed to parse ignore_dB argument.");
1569 goto fail;
1572 use_tsched = pa_alsa_may_tsched(use_tsched);
1574 u = pa_xnew0(struct userdata, 1);
1575 u->core = m->core;
1576 u->module = m;
1577 u->use_mmap = use_mmap;
1578 u->use_tsched = use_tsched;
1579 u->first = TRUE;
1580 u->rtpoll = pa_rtpoll_new();
1581 pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
1583 u->smoother = pa_smoother_new(
1584 SMOOTHER_ADJUST_USEC,
1585 SMOOTHER_WINDOW_USEC,
1586 TRUE,
1587 TRUE,
1589 pa_rtclock_now(),
1590 TRUE);
1591 u->smoother_interval = SMOOTHER_MIN_INTERVAL;
1593 dev_id = pa_modargs_get_value(
1594 ma, "device_id",
1595 pa_modargs_get_value(ma, "device", DEFAULT_DEVICE));
1597 if (reserve_init(u, dev_id) < 0)
1598 goto fail;
1600 if (reserve_monitor_init(u, dev_id) < 0)
1601 goto fail;
1603 b = use_mmap;
1604 d = use_tsched;
1606 if (mapping) {
1608 if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
1609 pa_log("device_id= not set");
1610 goto fail;
1613 if (!(u->pcm_handle = pa_alsa_open_by_device_id_mapping(
1614 dev_id,
1615 &u->device_name,
1616 &ss, &map,
1617 SND_PCM_STREAM_CAPTURE,
1618 &period_frames, &buffer_frames, tsched_frames,
1619 &b, &d, mapping)))
1620 goto fail;
1622 } else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
1624 if (!(profile_set = pa_alsa_profile_set_new(NULL, &map)))
1625 goto fail;
1627 if (!(u->pcm_handle = pa_alsa_open_by_device_id_auto(
1628 dev_id,
1629 &u->device_name,
1630 &ss, &map,
1631 SND_PCM_STREAM_CAPTURE,
1632 &period_frames, &buffer_frames, tsched_frames,
1633 &b, &d, profile_set, &mapping)))
1634 goto fail;
1636 } else {
1638 if (!(u->pcm_handle = pa_alsa_open_by_device_string(
1639 pa_modargs_get_value(ma, "device", DEFAULT_DEVICE),
1640 &u->device_name,
1641 &ss, &map,
1642 SND_PCM_STREAM_CAPTURE,
1643 &period_frames, &buffer_frames, tsched_frames,
1644 &b, &d, FALSE)))
1645 goto fail;
1648 pa_assert(u->device_name);
1649 pa_log_info("Successfully opened device %s.", u->device_name);
1651 if (pa_alsa_pcm_is_modem(u->pcm_handle)) {
1652 pa_log_notice("Device %s is modem, refusing further initialization.", u->device_name);
1653 goto fail;
1656 if (mapping)
1657 pa_log_info("Selected mapping '%s' (%s).", mapping->description, mapping->name);
1659 if (use_mmap && !b) {
1660 pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode.");
1661 u->use_mmap = use_mmap = FALSE;
1664 if (use_tsched && (!b || !d)) {
1665 pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling.");
1666 u->use_tsched = use_tsched = FALSE;
1669 if (u->use_mmap)
1670 pa_log_info("Successfully enabled mmap() mode.");
1672 if (u->use_tsched)
1673 pa_log_info("Successfully enabled timer-based scheduling mode.");
1675 /* ALSA might tweak the sample spec, so recalculate the frame size */
1676 frame_size = pa_frame_size(&ss);
1678 find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB);
1680 pa_source_new_data_init(&data);
1681 data.driver = driver;
1682 data.module = m;
1683 data.card = card;
1684 set_source_name(&data, ma, dev_id, u->device_name, mapping);
1686 /* We need to give pa_modargs_get_value_boolean() a pointer to a local
1687 * variable instead of using &data.namereg_fail directly, because
1688 * data.namereg_fail is a bitfield and taking the address of a bitfield
1689 * variable is impossible. */
1690 namereg_fail = data.namereg_fail;
1691 if (pa_modargs_get_value_boolean(ma, "namereg_fail", &namereg_fail) < 0) {
1692 pa_log("Failed to parse boolean argument namereg_fail.");
1693 pa_source_new_data_done(&data);
1694 goto fail;
1696 data.namereg_fail = namereg_fail;
1698 pa_source_new_data_set_sample_spec(&data, &ss);
1699 pa_source_new_data_set_channel_map(&data, &map);
1701 pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle);
1702 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name);
1703 pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (buffer_frames * frame_size));
1704 pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size));
1705 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, u->use_tsched ? "mmap+timer" : (u->use_mmap ? "mmap" : "serial"));
1707 if (mapping) {
1708 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name);
1709 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description);
1712 pa_alsa_init_description(data.proplist);
1714 if (u->control_device)
1715 pa_alsa_init_proplist_ctl(data.proplist, u->control_device);
1717 if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1718 pa_log("Invalid properties");
1719 pa_source_new_data_done(&data);
1720 goto fail;
1723 if (u->mixer_path_set)
1724 pa_alsa_add_ports(&data.ports, u->mixer_path_set);
1726 u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY|(u->use_tsched ? PA_SOURCE_DYNAMIC_LATENCY : 0));
1727 pa_source_new_data_done(&data);
1729 if (!u->source) {
1730 pa_log("Failed to create source object");
1731 goto fail;
1734 u->source->parent.process_msg = source_process_msg;
1735 if (u->use_tsched)
1736 u->source->update_requested_latency = source_update_requested_latency_cb;
1737 u->source->set_state = source_set_state_cb;
1738 u->source->set_port = source_set_port_cb;
1739 u->source->userdata = u;
1741 pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
1742 pa_source_set_rtpoll(u->source, u->rtpoll);
1744 u->frame_size = frame_size;
1745 u->fragment_size = frag_size = (size_t) (period_frames * frame_size);
1746 u->hwbuf_size = buffer_size = (size_t) (buffer_frames * frame_size);
1747 pa_cvolume_mute(&u->hardware_volume, u->source->sample_spec.channels);
1749 pa_log_info("Using %0.1f fragments of size %lu bytes (%0.2fms), buffer size is %lu bytes (%0.2fms)",
1750 (double) u->hwbuf_size / (double) u->fragment_size,
1751 (long unsigned) u->fragment_size,
1752 (double) pa_bytes_to_usec(u->fragment_size, &ss) / PA_USEC_PER_MSEC,
1753 (long unsigned) u->hwbuf_size,
1754 (double) pa_bytes_to_usec(u->hwbuf_size, &ss) / PA_USEC_PER_MSEC);
1756 if (u->use_tsched) {
1757 u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, &requested_ss), &u->source->sample_spec);
1759 u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->source->sample_spec);
1760 u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->source->sample_spec);
1762 u->watermark_inc_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_INC_THRESHOLD_USEC, &u->source->sample_spec);
1763 u->watermark_dec_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_DEC_THRESHOLD_USEC, &u->source->sample_spec);
1765 fix_min_sleep_wakeup(u);
1766 fix_tsched_watermark(u);
1768 pa_source_set_latency_range(u->source,
1770 pa_bytes_to_usec(u->hwbuf_size, &ss));
1772 pa_log_info("Time scheduling watermark is %0.2fms",
1773 (double) pa_bytes_to_usec(u->tsched_watermark, &ss) / PA_USEC_PER_MSEC);
1774 } else
1775 pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->hwbuf_size, &ss));
1777 reserve_update(u);
1779 if (update_sw_params(u) < 0)
1780 goto fail;
1782 if (setup_mixer(u, ignore_dB) < 0)
1783 goto fail;
1785 pa_alsa_dump(PA_LOG_DEBUG, u->pcm_handle);
1787 if (!(u->thread = pa_thread_new("alsa-source", thread_func, u))) {
1788 pa_log("Failed to create thread.");
1789 goto fail;
1791 /* Get initial mixer settings */
1792 if (data.volume_is_set) {
1793 if (u->source->set_volume)
1794 u->source->set_volume(u->source);
1795 } else {
1796 if (u->source->get_volume)
1797 u->source->get_volume(u->source);
1800 if (data.muted_is_set) {
1801 if (u->source->set_mute)
1802 u->source->set_mute(u->source);
1803 } else {
1804 if (u->source->get_mute)
1805 u->source->get_mute(u->source);
1808 pa_source_put(u->source);
1810 if (profile_set)
1811 pa_alsa_profile_set_free(profile_set);
1813 return u->source;
1815 fail:
1817 if (u)
1818 userdata_free(u);
1820 if (profile_set)
1821 pa_alsa_profile_set_free(profile_set);
1823 return NULL;
1826 static void userdata_free(struct userdata *u) {
1827 pa_assert(u);
1829 if (u->source)
1830 pa_source_unlink(u->source);
1832 if (u->thread) {
1833 pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
1834 pa_thread_free(u->thread);
1837 pa_thread_mq_done(&u->thread_mq);
1839 if (u->source)
1840 pa_source_unref(u->source);
1842 if (u->alsa_rtpoll_item)
1843 pa_rtpoll_item_free(u->alsa_rtpoll_item);
1845 if (u->rtpoll)
1846 pa_rtpoll_free(u->rtpoll);
1848 if (u->pcm_handle) {
1849 snd_pcm_drop(u->pcm_handle);
1850 snd_pcm_close(u->pcm_handle);
1853 if (u->mixer_fdl)
1854 pa_alsa_fdlist_free(u->mixer_fdl);
1856 if (u->mixer_path_set)
1857 pa_alsa_path_set_free(u->mixer_path_set);
1858 else if (u->mixer_path)
1859 pa_alsa_path_free(u->mixer_path);
1861 if (u->mixer_handle)
1862 snd_mixer_close(u->mixer_handle);
1864 if (u->smoother)
1865 pa_smoother_free(u->smoother);
1867 reserve_done(u);
1868 monitor_done(u);
1870 pa_xfree(u->device_name);
1871 pa_xfree(u->control_device);
1872 pa_xfree(u);
1875 void pa_alsa_source_free(pa_source *s) {
1876 struct userdata *u;
1878 pa_source_assert_ref(s);
1879 pa_assert_se(u = s->userdata);
1881 userdata_free(u);