]> code.delx.au - pulseaudio/blob - src/modules/alsa/alsa-source.c
alsa-sink/source: Better thread names
[pulseaudio] / src / modules / alsa / alsa-source.c
1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2004-2008 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
6
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.
11
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.
16
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 ***/
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <signal.h>
28 #include <stdio.h>
29
30 #include <asoundlib.h>
31
32 #include <pulse/rtclock.h>
33 #include <pulse/timeval.h>
34 #include <pulse/volume.h>
35 #include <pulse/xmalloc.h>
36
37 #include <pulsecore/core.h>
38 #include <pulsecore/i18n.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/thread-mq.h>
50 #include <pulsecore/rtpoll.h>
51 #include <pulsecore/time-smoother.h>
52
53 #include <modules/reserve-wrap.h>
54
55 #include "alsa-util.h"
56 #include "alsa-source.h"
57
58 /* #define DEBUG_TIMING */
59
60 #define DEFAULT_DEVICE "default"
61
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
65 #define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
66 #define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms */
67 #define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s */
68 #define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms */
69 #define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms */
70 #define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
71
72 #define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */
73 #define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */
74
75 #define SMOOTHER_WINDOW_USEC (10*PA_USEC_PER_SEC) /* 10s */
76 #define SMOOTHER_ADJUST_USEC (1*PA_USEC_PER_SEC) /* 1s */
77
78 #define SMOOTHER_MIN_INTERVAL (2*PA_USEC_PER_MSEC) /* 2ms */
79 #define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms */
80
81 #define VOLUME_ACCURACY (PA_VOLUME_NORM/100)
82
83 struct userdata {
84 pa_core *core;
85 pa_module *module;
86 pa_source *source;
87
88 pa_thread *thread;
89 pa_thread_mq thread_mq;
90 pa_rtpoll *rtpoll;
91
92 snd_pcm_t *pcm_handle;
93
94 char *paths_dir;
95 pa_alsa_fdlist *mixer_fdl;
96 pa_alsa_mixer_pdata *mixer_pd;
97 snd_mixer_t *mixer_handle;
98 pa_alsa_path_set *mixer_path_set;
99 pa_alsa_path *mixer_path;
100
101 pa_cvolume hardware_volume;
102
103 unsigned int *rates;
104
105 size_t
106 frame_size,
107 fragment_size,
108 hwbuf_size,
109 tsched_watermark,
110 tsched_watermark_ref,
111 hwbuf_unused,
112 min_sleep,
113 min_wakeup,
114 watermark_inc_step,
115 watermark_dec_step,
116 watermark_inc_threshold,
117 watermark_dec_threshold;
118
119 pa_usec_t watermark_dec_not_before;
120 pa_usec_t min_latency_ref;
121
122 char *device_name; /* name of the PCM device */
123 char *control_device; /* name of the control device */
124
125 pa_bool_t use_mmap:1, use_tsched:1, deferred_volume:1, fixed_latency_range:1;
126
127 pa_bool_t first;
128
129 pa_rtpoll_item *alsa_rtpoll_item;
130
131 pa_smoother *smoother;
132 uint64_t read_count;
133 pa_usec_t smoother_interval;
134 pa_usec_t last_smoother_update;
135
136 pa_reserve_wrapper *reserve;
137 pa_hook_slot *reserve_slot;
138 pa_reserve_monitor_wrapper *monitor;
139 pa_hook_slot *monitor_slot;
140
141 /* ucm context */
142 pa_alsa_ucm_mapping_context *ucm_context;
143 };
144
145 static void userdata_free(struct userdata *u);
146
147 static pa_hook_result_t reserve_cb(pa_reserve_wrapper *r, void *forced, struct userdata *u) {
148 pa_assert(r);
149 pa_assert(u);
150
151 pa_log_debug("Suspending source %s, because another application requested us to release the device.", u->source->name);
152
153 if (pa_source_suspend(u->source, TRUE, PA_SUSPEND_APPLICATION) < 0)
154 return PA_HOOK_CANCEL;
155
156 return PA_HOOK_OK;
157 }
158
159 static void reserve_done(struct userdata *u) {
160 pa_assert(u);
161
162 if (u->reserve_slot) {
163 pa_hook_slot_free(u->reserve_slot);
164 u->reserve_slot = NULL;
165 }
166
167 if (u->reserve) {
168 pa_reserve_wrapper_unref(u->reserve);
169 u->reserve = NULL;
170 }
171 }
172
173 static void reserve_update(struct userdata *u) {
174 const char *description;
175 pa_assert(u);
176
177 if (!u->source || !u->reserve)
178 return;
179
180 if ((description = pa_proplist_gets(u->source->proplist, PA_PROP_DEVICE_DESCRIPTION)))
181 pa_reserve_wrapper_set_application_device_name(u->reserve, description);
182 }
183
184 static int reserve_init(struct userdata *u, const char *dname) {
185 char *rname;
186
187 pa_assert(u);
188 pa_assert(dname);
189
190 if (u->reserve)
191 return 0;
192
193 if (pa_in_system_mode())
194 return 0;
195
196 if (!(rname = pa_alsa_get_reserve_name(dname)))
197 return 0;
198
199 /* We are resuming, try to lock the device */
200 u->reserve = pa_reserve_wrapper_get(u->core, rname);
201 pa_xfree(rname);
202
203 if (!(u->reserve))
204 return -1;
205
206 reserve_update(u);
207
208 pa_assert(!u->reserve_slot);
209 u->reserve_slot = pa_hook_connect(pa_reserve_wrapper_hook(u->reserve), PA_HOOK_NORMAL, (pa_hook_cb_t) reserve_cb, u);
210
211 return 0;
212 }
213
214 static pa_hook_result_t monitor_cb(pa_reserve_monitor_wrapper *w, void* busy, struct userdata *u) {
215 pa_assert(w);
216 pa_assert(u);
217
218 if (PA_PTR_TO_UINT(busy) && !u->reserve) {
219 pa_log_debug("Suspending source %s, because another application is blocking the access to the device.", u->source->name);
220 pa_source_suspend(u->source, true, PA_SUSPEND_APPLICATION);
221 } else {
222 pa_log_debug("Resuming source %s, because other applications aren't blocking access to the device any more.", u->source->name);
223 pa_source_suspend(u->source, false, PA_SUSPEND_APPLICATION);
224 }
225
226 return PA_HOOK_OK;
227 }
228
229 static void monitor_done(struct userdata *u) {
230 pa_assert(u);
231
232 if (u->monitor_slot) {
233 pa_hook_slot_free(u->monitor_slot);
234 u->monitor_slot = NULL;
235 }
236
237 if (u->monitor) {
238 pa_reserve_monitor_wrapper_unref(u->monitor);
239 u->monitor = NULL;
240 }
241 }
242
243 static int reserve_monitor_init(struct userdata *u, const char *dname) {
244 char *rname;
245
246 pa_assert(u);
247 pa_assert(dname);
248
249 if (pa_in_system_mode())
250 return 0;
251
252 if (!(rname = pa_alsa_get_reserve_name(dname)))
253 return 0;
254
255 /* We are resuming, try to lock the device */
256 u->monitor = pa_reserve_monitor_wrapper_get(u->core, rname);
257 pa_xfree(rname);
258
259 if (!(u->monitor))
260 return -1;
261
262 pa_assert(!u->monitor_slot);
263 u->monitor_slot = pa_hook_connect(pa_reserve_monitor_wrapper_hook(u->monitor), PA_HOOK_NORMAL, (pa_hook_cb_t) monitor_cb, u);
264
265 return 0;
266 }
267
268 static void fix_min_sleep_wakeup(struct userdata *u) {
269 size_t max_use, max_use_2;
270
271 pa_assert(u);
272 pa_assert(u->use_tsched);
273
274 max_use = u->hwbuf_size - u->hwbuf_unused;
275 max_use_2 = pa_frame_align(max_use/2, &u->source->sample_spec);
276
277 u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->source->sample_spec);
278 u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2);
279
280 u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->source->sample_spec);
281 u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2);
282 }
283
284 static void fix_tsched_watermark(struct userdata *u) {
285 size_t max_use;
286 pa_assert(u);
287 pa_assert(u->use_tsched);
288
289 max_use = u->hwbuf_size - u->hwbuf_unused;
290
291 if (u->tsched_watermark > max_use - u->min_sleep)
292 u->tsched_watermark = max_use - u->min_sleep;
293
294 if (u->tsched_watermark < u->min_wakeup)
295 u->tsched_watermark = u->min_wakeup;
296 }
297
298 static void increase_watermark(struct userdata *u) {
299 size_t old_watermark;
300 pa_usec_t old_min_latency, new_min_latency;
301
302 pa_assert(u);
303 pa_assert(u->use_tsched);
304
305 /* First, just try to increase the watermark */
306 old_watermark = u->tsched_watermark;
307 u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_inc_step);
308 fix_tsched_watermark(u);
309
310 if (old_watermark != u->tsched_watermark) {
311 pa_log_info("Increasing wakeup watermark to %0.2f ms",
312 (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC);
313 return;
314 }
315
316 /* Hmm, we cannot increase the watermark any further, hence let's
317 raise the latency unless doing so was disabled in
318 configuration */
319 if (u->fixed_latency_range)
320 return;
321
322 old_min_latency = u->source->thread_info.min_latency;
323 new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_INC_STEP_USEC);
324 new_min_latency = PA_MIN(new_min_latency, u->source->thread_info.max_latency);
325
326 if (old_min_latency != new_min_latency) {
327 pa_log_info("Increasing minimal latency to %0.2f ms",
328 (double) new_min_latency / PA_USEC_PER_MSEC);
329
330 pa_source_set_latency_range_within_thread(u->source, new_min_latency, u->source->thread_info.max_latency);
331 }
332
333 /* When we reach this we're officialy fucked! */
334 }
335
336 static void decrease_watermark(struct userdata *u) {
337 size_t old_watermark;
338 pa_usec_t now;
339
340 pa_assert(u);
341 pa_assert(u->use_tsched);
342
343 now = pa_rtclock_now();
344
345 if (u->watermark_dec_not_before <= 0)
346 goto restart;
347
348 if (u->watermark_dec_not_before > now)
349 return;
350
351 old_watermark = u->tsched_watermark;
352
353 if (u->tsched_watermark < u->watermark_dec_step)
354 u->tsched_watermark = u->tsched_watermark / 2;
355 else
356 u->tsched_watermark = PA_MAX(u->tsched_watermark / 2, u->tsched_watermark - u->watermark_dec_step);
357
358 fix_tsched_watermark(u);
359
360 if (old_watermark != u->tsched_watermark)
361 pa_log_info("Decreasing wakeup watermark to %0.2f ms",
362 (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC);
363
364 /* We don't change the latency range*/
365
366 restart:
367 u->watermark_dec_not_before = now + TSCHED_WATERMARK_VERIFY_AFTER_USEC;
368 }
369
370 static void hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) {
371 pa_usec_t wm, usec;
372
373 pa_assert(sleep_usec);
374 pa_assert(process_usec);
375
376 pa_assert(u);
377 pa_assert(u->use_tsched);
378
379 usec = pa_source_get_requested_latency_within_thread(u->source);
380
381 if (usec == (pa_usec_t) -1)
382 usec = pa_bytes_to_usec(u->hwbuf_size, &u->source->sample_spec);
383
384 wm = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec);
385
386 if (wm > usec)
387 wm = usec/2;
388
389 *sleep_usec = usec - wm;
390 *process_usec = wm;
391
392 #ifdef DEBUG_TIMING
393 pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms",
394 (unsigned long) (usec / PA_USEC_PER_MSEC),
395 (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC),
396 (unsigned long) (*process_usec / PA_USEC_PER_MSEC));
397 #endif
398 }
399
400 static int try_recover(struct userdata *u, const char *call, int err) {
401 pa_assert(u);
402 pa_assert(call);
403 pa_assert(err < 0);
404
405 pa_log_debug("%s: %s", call, pa_alsa_strerror(err));
406
407 pa_assert(err != -EAGAIN);
408
409 if (err == -EPIPE)
410 pa_log_debug("%s: Buffer overrun!", call);
411
412 if (err == -ESTRPIPE)
413 pa_log_debug("%s: System suspended!", call);
414
415 if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) {
416 pa_log("%s: %s", call, pa_alsa_strerror(err));
417 return -1;
418 }
419
420 u->first = TRUE;
421 return 0;
422 }
423
424 static size_t check_left_to_record(struct userdata *u, size_t n_bytes, pa_bool_t on_timeout) {
425 size_t left_to_record;
426 size_t rec_space = u->hwbuf_size - u->hwbuf_unused;
427 pa_bool_t overrun = FALSE;
428
429 /* We use <= instead of < for this check here because an overrun
430 * only happens after the last sample was processed, not already when
431 * it is removed from the buffer. This is particularly important
432 * when block transfer is used. */
433
434 if (n_bytes <= rec_space)
435 left_to_record = rec_space - n_bytes;
436 else {
437
438 /* We got a dropout. What a mess! */
439 left_to_record = 0;
440 overrun = TRUE;
441
442 #ifdef DEBUG_TIMING
443 PA_DEBUG_TRAP;
444 #endif
445
446 if (pa_log_ratelimit(PA_LOG_INFO))
447 pa_log_info("Overrun!");
448 }
449
450 #ifdef DEBUG_TIMING
451 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);
452 #endif
453
454 if (u->use_tsched) {
455 pa_bool_t reset_not_before = TRUE;
456
457 if (overrun || left_to_record < u->watermark_inc_threshold)
458 increase_watermark(u);
459 else if (left_to_record > u->watermark_dec_threshold) {
460 reset_not_before = FALSE;
461
462 /* We decrease the watermark only if have actually
463 * been woken up by a timeout. If something else woke
464 * us up it's too easy to fulfill the deadlines... */
465
466 if (on_timeout)
467 decrease_watermark(u);
468 }
469
470 if (reset_not_before)
471 u->watermark_dec_not_before = 0;
472 }
473
474 return left_to_record;
475 }
476
477 static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) {
478 pa_bool_t work_done = FALSE;
479 pa_usec_t max_sleep_usec = 0, process_usec = 0;
480 size_t left_to_record;
481 unsigned j = 0;
482
483 pa_assert(u);
484 pa_source_assert_ref(u->source);
485
486 if (u->use_tsched)
487 hw_sleep_time(u, &max_sleep_usec, &process_usec);
488
489 for (;;) {
490 snd_pcm_sframes_t n;
491 size_t n_bytes;
492 int r;
493 pa_bool_t after_avail = TRUE;
494
495 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
496
497 if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
498 continue;
499
500 return r;
501 }
502
503 n_bytes = (size_t) n * u->frame_size;
504
505 #ifdef DEBUG_TIMING
506 pa_log_debug("avail: %lu", (unsigned long) n_bytes);
507 #endif
508
509 left_to_record = check_left_to_record(u, n_bytes, on_timeout);
510 on_timeout = FALSE;
511
512 if (u->use_tsched)
513 if (!polled &&
514 pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) {
515 #ifdef DEBUG_TIMING
516 pa_log_debug("Not reading, because too early.");
517 #endif
518 break;
519 }
520
521 if (PA_UNLIKELY(n_bytes <= 0)) {
522
523 if (polled)
524 PA_ONCE_BEGIN {
525 char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle);
526 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
527 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
528 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."),
529 pa_strnull(dn));
530 pa_xfree(dn);
531 } PA_ONCE_END;
532
533 #ifdef DEBUG_TIMING
534 pa_log_debug("Not reading, because not necessary.");
535 #endif
536 break;
537 }
538
539
540 if (++j > 10) {
541 #ifdef DEBUG_TIMING
542 pa_log_debug("Not filling up, because already too many iterations.");
543 #endif
544
545 break;
546 }
547
548 polled = FALSE;
549
550 #ifdef DEBUG_TIMING
551 pa_log_debug("Reading");
552 #endif
553
554 for (;;) {
555 pa_memchunk chunk;
556 void *p;
557 int err;
558 const snd_pcm_channel_area_t *areas;
559 snd_pcm_uframes_t offset, frames;
560 snd_pcm_sframes_t sframes;
561
562 frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size);
563 /* pa_log_debug("%lu frames to read", (unsigned long) frames); */
564
565 if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
566
567 if (!after_avail && err == -EAGAIN)
568 break;
569
570 if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0)
571 continue;
572
573 return r;
574 }
575
576 /* Make sure that if these memblocks need to be copied they will fit into one slot */
577 if (frames > pa_mempool_block_size_max(u->core->mempool)/u->frame_size)
578 frames = pa_mempool_block_size_max(u->core->mempool)/u->frame_size;
579
580 if (!after_avail && frames == 0)
581 break;
582
583 pa_assert(frames > 0);
584 after_avail = FALSE;
585
586 /* Check these are multiples of 8 bit */
587 pa_assert((areas[0].first & 7) == 0);
588 pa_assert((areas[0].step & 7)== 0);
589
590 /* We assume a single interleaved memory buffer */
591 pa_assert((areas[0].first >> 3) == 0);
592 pa_assert((areas[0].step >> 3) == u->frame_size);
593
594 p = (uint8_t*) areas[0].addr + (offset * u->frame_size);
595
596 chunk.memblock = pa_memblock_new_fixed(u->core->mempool, p, frames * u->frame_size, TRUE);
597 chunk.length = pa_memblock_get_length(chunk.memblock);
598 chunk.index = 0;
599
600 pa_source_post(u->source, &chunk);
601 pa_memblock_unref_fixed(chunk.memblock);
602
603 if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) {
604
605 if ((r = try_recover(u, "snd_pcm_mmap_commit", (int) sframes)) == 0)
606 continue;
607
608 return r;
609 }
610
611 work_done = TRUE;
612
613 u->read_count += frames * u->frame_size;
614
615 #ifdef DEBUG_TIMING
616 pa_log_debug("Read %lu bytes (of possible %lu bytes)", (unsigned long) (frames * u->frame_size), (unsigned long) n_bytes);
617 #endif
618
619 if ((size_t) frames * u->frame_size >= n_bytes)
620 break;
621
622 n_bytes -= (size_t) frames * u->frame_size;
623 }
624 }
625
626 if (u->use_tsched) {
627 *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
628 process_usec = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec);
629
630 if (*sleep_usec > process_usec)
631 *sleep_usec -= process_usec;
632 else
633 *sleep_usec = 0;
634 }
635
636 return work_done ? 1 : 0;
637 }
638
639 static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled, pa_bool_t on_timeout) {
640 int work_done = FALSE;
641 pa_usec_t max_sleep_usec = 0, process_usec = 0;
642 size_t left_to_record;
643 unsigned j = 0;
644
645 pa_assert(u);
646 pa_source_assert_ref(u->source);
647
648 if (u->use_tsched)
649 hw_sleep_time(u, &max_sleep_usec, &process_usec);
650
651 for (;;) {
652 snd_pcm_sframes_t n;
653 size_t n_bytes;
654 int r;
655 pa_bool_t after_avail = TRUE;
656
657 if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
658
659 if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
660 continue;
661
662 return r;
663 }
664
665 n_bytes = (size_t) n * u->frame_size;
666 left_to_record = check_left_to_record(u, n_bytes, on_timeout);
667 on_timeout = FALSE;
668
669 if (u->use_tsched)
670 if (!polled &&
671 pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2)
672 break;
673
674 if (PA_UNLIKELY(n_bytes <= 0)) {
675
676 if (polled)
677 PA_ONCE_BEGIN {
678 char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle);
679 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
680 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
681 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."),
682 pa_strnull(dn));
683 pa_xfree(dn);
684 } PA_ONCE_END;
685
686 break;
687 }
688
689 if (++j > 10) {
690 #ifdef DEBUG_TIMING
691 pa_log_debug("Not filling up, because already too many iterations.");
692 #endif
693
694 break;
695 }
696
697 polled = FALSE;
698
699 for (;;) {
700 void *p;
701 snd_pcm_sframes_t frames;
702 pa_memchunk chunk;
703
704 chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) -1);
705
706 frames = (snd_pcm_sframes_t) (pa_memblock_get_length(chunk.memblock) / u->frame_size);
707
708 if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size))
709 frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size);
710
711 /* pa_log_debug("%lu frames to read", (unsigned long) n); */
712
713 p = pa_memblock_acquire(chunk.memblock);
714 frames = snd_pcm_readi(u->pcm_handle, (uint8_t*) p, (snd_pcm_uframes_t) frames);
715 pa_memblock_release(chunk.memblock);
716
717 if (PA_UNLIKELY(frames < 0)) {
718 pa_memblock_unref(chunk.memblock);
719
720 if (!after_avail && (int) frames == -EAGAIN)
721 break;
722
723 if ((r = try_recover(u, "snd_pcm_readi", (int) frames)) == 0)
724 continue;
725
726 return r;
727 }
728
729 if (!after_avail && frames == 0) {
730 pa_memblock_unref(chunk.memblock);
731 break;
732 }
733
734 pa_assert(frames > 0);
735 after_avail = FALSE;
736
737 chunk.index = 0;
738 chunk.length = (size_t) frames * u->frame_size;
739
740 pa_source_post(u->source, &chunk);
741 pa_memblock_unref(chunk.memblock);
742
743 work_done = TRUE;
744
745 u->read_count += frames * u->frame_size;
746
747 /* pa_log_debug("read %lu frames", (unsigned long) frames); */
748
749 if ((size_t) frames * u->frame_size >= n_bytes)
750 break;
751
752 n_bytes -= (size_t) frames * u->frame_size;
753 }
754 }
755
756 if (u->use_tsched) {
757 *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec);
758 process_usec = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec);
759
760 if (*sleep_usec > process_usec)
761 *sleep_usec -= process_usec;
762 else
763 *sleep_usec = 0;
764 }
765
766 return work_done ? 1 : 0;
767 }
768
769 static void update_smoother(struct userdata *u) {
770 snd_pcm_sframes_t delay = 0;
771 uint64_t position;
772 int err;
773 pa_usec_t now1 = 0, now2;
774 snd_pcm_status_t *status;
775 snd_htimestamp_t htstamp = { 0, 0 };
776
777 snd_pcm_status_alloca(&status);
778
779 pa_assert(u);
780 pa_assert(u->pcm_handle);
781
782 /* Let's update the time smoother */
783
784 if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, status, &delay, u->hwbuf_size, &u->source->sample_spec, TRUE)) < 0)) {
785 pa_log_warn("Failed to get delay: %s", pa_alsa_strerror(err));
786 return;
787 }
788
789 snd_pcm_status_get_htstamp(status, &htstamp);
790 now1 = pa_timespec_load(&htstamp);
791
792 /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */
793 if (now1 <= 0)
794 now1 = pa_rtclock_now();
795
796 /* check if the time since the last update is bigger than the interval */
797 if (u->last_smoother_update > 0)
798 if (u->last_smoother_update + u->smoother_interval > now1)
799 return;
800
801 position = u->read_count + ((uint64_t) delay * (uint64_t) u->frame_size);
802 now2 = pa_bytes_to_usec(position, &u->source->sample_spec);
803
804 pa_smoother_put(u->smoother, now1, now2);
805
806 u->last_smoother_update = now1;
807 /* exponentially increase the update interval up to the MAX limit */
808 u->smoother_interval = PA_MIN (u->smoother_interval * 2, SMOOTHER_MAX_INTERVAL);
809 }
810
811 static pa_usec_t source_get_latency(struct userdata *u) {
812 int64_t delay;
813 pa_usec_t now1, now2;
814
815 pa_assert(u);
816
817 now1 = pa_rtclock_now();
818 now2 = pa_smoother_get(u->smoother, now1);
819
820 delay = (int64_t) now2 - (int64_t) pa_bytes_to_usec(u->read_count, &u->source->sample_spec);
821
822 return delay >= 0 ? (pa_usec_t) delay : 0;
823 }
824
825 static int build_pollfd(struct userdata *u) {
826 pa_assert(u);
827 pa_assert(u->pcm_handle);
828
829 if (u->alsa_rtpoll_item)
830 pa_rtpoll_item_free(u->alsa_rtpoll_item);
831
832 if (!(u->alsa_rtpoll_item = pa_alsa_build_pollfd(u->pcm_handle, u->rtpoll)))
833 return -1;
834
835 return 0;
836 }
837
838 /* Called from IO context */
839 static int suspend(struct userdata *u) {
840 pa_assert(u);
841 pa_assert(u->pcm_handle);
842
843 pa_smoother_pause(u->smoother, pa_rtclock_now());
844
845 /* Let's suspend */
846 snd_pcm_close(u->pcm_handle);
847 u->pcm_handle = NULL;
848
849 if (u->alsa_rtpoll_item) {
850 pa_rtpoll_item_free(u->alsa_rtpoll_item);
851 u->alsa_rtpoll_item = NULL;
852 }
853
854 pa_log_info("Device suspended...");
855
856 return 0;
857 }
858
859 /* Called from IO context */
860 static int update_sw_params(struct userdata *u) {
861 snd_pcm_uframes_t avail_min;
862 int err;
863
864 pa_assert(u);
865
866 /* Use the full buffer if no one asked us for anything specific */
867 u->hwbuf_unused = 0;
868
869 if (u->use_tsched) {
870 pa_usec_t latency;
871
872 if ((latency = pa_source_get_requested_latency_within_thread(u->source)) != (pa_usec_t) -1) {
873 size_t b;
874
875 pa_log_debug("latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC);
876
877 b = pa_usec_to_bytes(latency, &u->source->sample_spec);
878
879 /* We need at least one sample in our buffer */
880
881 if (PA_UNLIKELY(b < u->frame_size))
882 b = u->frame_size;
883
884 u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0;
885 }
886
887 fix_min_sleep_wakeup(u);
888 fix_tsched_watermark(u);
889 }
890
891 pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused);
892
893 avail_min = 1;
894
895 if (u->use_tsched) {
896 pa_usec_t sleep_usec, process_usec;
897
898 hw_sleep_time(u, &sleep_usec, &process_usec);
899 avail_min += pa_usec_to_bytes(sleep_usec, &u->source->sample_spec) / u->frame_size;
900 }
901
902 pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min);
903
904 if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) {
905 pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err));
906 return err;
907 }
908
909 return 0;
910 }
911
912 /* Called from IO Context on unsuspend or from main thread when creating source */
913 static void reset_watermark(struct userdata *u, size_t tsched_watermark, pa_sample_spec *ss,
914 pa_bool_t in_thread)
915 {
916 u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, ss),
917 &u->source->sample_spec);
918
919 u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->source->sample_spec);
920 u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->source->sample_spec);
921
922 u->watermark_inc_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_INC_THRESHOLD_USEC, &u->source->sample_spec);
923 u->watermark_dec_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_DEC_THRESHOLD_USEC, &u->source->sample_spec);
924
925 fix_min_sleep_wakeup(u);
926 fix_tsched_watermark(u);
927
928 if (in_thread)
929 pa_source_set_latency_range_within_thread(u->source,
930 u->min_latency_ref,
931 pa_bytes_to_usec(u->hwbuf_size, ss));
932 else {
933 pa_source_set_latency_range(u->source,
934 0,
935 pa_bytes_to_usec(u->hwbuf_size, ss));
936
937 /* work-around assert in pa_source_set_latency_within_thead,
938 keep track of min_latency and reuse it when
939 this routine is called from IO context */
940 u->min_latency_ref = u->source->thread_info.min_latency;
941 }
942
943 pa_log_info("Time scheduling watermark is %0.2fms",
944 (double) pa_bytes_to_usec(u->tsched_watermark, ss) / PA_USEC_PER_MSEC);
945 }
946
947 /* Called from IO context */
948 static int unsuspend(struct userdata *u) {
949 pa_sample_spec ss;
950 int err;
951 pa_bool_t b, d;
952 snd_pcm_uframes_t period_size, buffer_size;
953
954 pa_assert(u);
955 pa_assert(!u->pcm_handle);
956
957 pa_log_info("Trying resume...");
958
959 if ((err = snd_pcm_open(&u->pcm_handle, u->device_name, SND_PCM_STREAM_CAPTURE,
960 SND_PCM_NONBLOCK|
961 SND_PCM_NO_AUTO_RESAMPLE|
962 SND_PCM_NO_AUTO_CHANNELS|
963 SND_PCM_NO_AUTO_FORMAT)) < 0) {
964 pa_log("Error opening PCM device %s: %s", u->device_name, pa_alsa_strerror(err));
965 goto fail;
966 }
967
968 ss = u->source->sample_spec;
969 period_size = u->fragment_size / u->frame_size;
970 buffer_size = u->hwbuf_size / u->frame_size;
971 b = u->use_mmap;
972 d = u->use_tsched;
973
974 if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &period_size, &buffer_size, 0, &b, &d, TRUE)) < 0) {
975 pa_log("Failed to set hardware parameters: %s", pa_alsa_strerror(err));
976 goto fail;
977 }
978
979 if (b != u->use_mmap || d != u->use_tsched) {
980 pa_log_warn("Resume failed, couldn't get original access mode.");
981 goto fail;
982 }
983
984 if (!pa_sample_spec_equal(&ss, &u->source->sample_spec)) {
985 pa_log_warn("Resume failed, couldn't restore original sample settings.");
986 goto fail;
987 }
988
989 if (period_size*u->frame_size != u->fragment_size ||
990 buffer_size*u->frame_size != u->hwbuf_size) {
991 pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %lu/%lu, New %lu/%lu)",
992 (unsigned long) u->hwbuf_size, (unsigned long) u->fragment_size,
993 (unsigned long) (buffer_size*u->frame_size), (unsigned long) (period_size*u->frame_size));
994 goto fail;
995 }
996
997 if (update_sw_params(u) < 0)
998 goto fail;
999
1000 if (build_pollfd(u) < 0)
1001 goto fail;
1002
1003 /* FIXME: We need to reload the volume somehow */
1004
1005 u->read_count = 0;
1006 pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);
1007 u->smoother_interval = SMOOTHER_MIN_INTERVAL;
1008 u->last_smoother_update = 0;
1009
1010 u->first = TRUE;
1011
1012 /* reset the watermark to the value defined when source was created */
1013 if (u->use_tsched)
1014 reset_watermark(u, u->tsched_watermark_ref, &u->source->sample_spec, TRUE);
1015
1016 pa_log_info("Resumed successfully...");
1017
1018 return 0;
1019
1020 fail:
1021 if (u->pcm_handle) {
1022 snd_pcm_close(u->pcm_handle);
1023 u->pcm_handle = NULL;
1024 }
1025
1026 return -PA_ERR_IO;
1027 }
1028
1029 /* Called from IO context */
1030 static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
1031 struct userdata *u = PA_SOURCE(o)->userdata;
1032
1033 switch (code) {
1034
1035 case PA_SOURCE_MESSAGE_GET_LATENCY: {
1036 pa_usec_t r = 0;
1037
1038 if (u->pcm_handle)
1039 r = source_get_latency(u);
1040
1041 *((pa_usec_t*) data) = r;
1042
1043 return 0;
1044 }
1045
1046 case PA_SOURCE_MESSAGE_SET_STATE:
1047
1048 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
1049
1050 case PA_SOURCE_SUSPENDED: {
1051 int r;
1052
1053 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
1054
1055 if ((r = suspend(u)) < 0)
1056 return r;
1057
1058 break;
1059 }
1060
1061 case PA_SOURCE_IDLE:
1062 case PA_SOURCE_RUNNING: {
1063 int r;
1064
1065 if (u->source->thread_info.state == PA_SOURCE_INIT) {
1066 if (build_pollfd(u) < 0)
1067 return -PA_ERR_IO;
1068 }
1069
1070 if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) {
1071 if ((r = unsuspend(u)) < 0)
1072 return r;
1073 }
1074
1075 break;
1076 }
1077
1078 case PA_SOURCE_UNLINKED:
1079 case PA_SOURCE_INIT:
1080 case PA_SOURCE_INVALID_STATE:
1081 ;
1082 }
1083
1084 break;
1085 }
1086
1087 return pa_source_process_msg(o, code, data, offset, chunk);
1088 }
1089
1090 /* Called from main context */
1091 static int source_set_state_cb(pa_source *s, pa_source_state_t new_state) {
1092 pa_source_state_t old_state;
1093 struct userdata *u;
1094
1095 pa_source_assert_ref(s);
1096 pa_assert_se(u = s->userdata);
1097
1098 old_state = pa_source_get_state(u->source);
1099
1100 if (PA_SOURCE_IS_OPENED(old_state) && new_state == PA_SOURCE_SUSPENDED)
1101 reserve_done(u);
1102 else if (old_state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(new_state))
1103 if (reserve_init(u, u->device_name) < 0)
1104 return -PA_ERR_BUSY;
1105
1106 return 0;
1107 }
1108
1109 static int ctl_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
1110 struct userdata *u = snd_mixer_elem_get_callback_private(elem);
1111
1112 pa_assert(u);
1113 pa_assert(u->mixer_handle);
1114
1115 if (mask == SND_CTL_EVENT_MASK_REMOVE)
1116 return 0;
1117
1118 if (!PA_SOURCE_IS_LINKED(u->source->state))
1119 return 0;
1120
1121 if (u->source->suspend_cause & PA_SUSPEND_SESSION) {
1122 pa_source_set_mixer_dirty(u->source, TRUE);
1123 return 0;
1124 }
1125
1126 if (mask & SND_CTL_EVENT_MASK_VALUE) {
1127 pa_source_get_volume(u->source, TRUE);
1128 pa_source_get_mute(u->source, TRUE);
1129 }
1130
1131 return 0;
1132 }
1133
1134 static int io_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
1135 struct userdata *u = snd_mixer_elem_get_callback_private(elem);
1136
1137 pa_assert(u);
1138 pa_assert(u->mixer_handle);
1139
1140 if (mask == SND_CTL_EVENT_MASK_REMOVE)
1141 return 0;
1142
1143 if (u->source->suspend_cause & PA_SUSPEND_SESSION) {
1144 pa_source_set_mixer_dirty(u->source, TRUE);
1145 return 0;
1146 }
1147
1148 if (mask & SND_CTL_EVENT_MASK_VALUE)
1149 pa_source_update_volume_and_mute(u->source);
1150
1151 return 0;
1152 }
1153
1154 static void source_get_volume_cb(pa_source *s) {
1155 struct userdata *u = s->userdata;
1156 pa_cvolume r;
1157 char vol_str_pcnt[PA_CVOLUME_SNPRINT_MAX];
1158
1159 pa_assert(u);
1160 pa_assert(u->mixer_path);
1161 pa_assert(u->mixer_handle);
1162
1163 if (pa_alsa_path_get_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0)
1164 return;
1165
1166 /* Shift down by the base volume, so that 0dB becomes maximum volume */
1167 pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume);
1168
1169 pa_log_debug("Read hardware volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &r));
1170
1171 if (u->mixer_path->has_dB) {
1172 char vol_str_db[PA_SW_CVOLUME_SNPRINT_DB_MAX];
1173
1174 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &r));
1175 }
1176
1177 if (pa_cvolume_equal(&u->hardware_volume, &r))
1178 return;
1179
1180 s->real_volume = u->hardware_volume = r;
1181
1182 /* Hmm, so the hardware volume changed, let's reset our software volume */
1183 if (u->mixer_path->has_dB)
1184 pa_source_set_soft_volume(s, NULL);
1185 }
1186
1187 static void source_set_volume_cb(pa_source *s) {
1188 struct userdata *u = s->userdata;
1189 pa_cvolume r;
1190 char vol_str_pcnt[PA_CVOLUME_SNPRINT_MAX];
1191 pa_bool_t deferred_volume = !!(s->flags & PA_SOURCE_DEFERRED_VOLUME);
1192
1193 pa_assert(u);
1194 pa_assert(u->mixer_path);
1195 pa_assert(u->mixer_handle);
1196
1197 /* Shift up by the base volume */
1198 pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume);
1199
1200 if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, deferred_volume, !deferred_volume) < 0)
1201 return;
1202
1203 /* Shift down by the base volume, so that 0dB becomes maximum volume */
1204 pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume);
1205
1206 u->hardware_volume = r;
1207
1208 if (u->mixer_path->has_dB) {
1209 pa_cvolume new_soft_volume;
1210 pa_bool_t accurate_enough;
1211 char vol_str_db[PA_SW_CVOLUME_SNPRINT_DB_MAX];
1212
1213 /* Match exactly what the user requested by software */
1214 pa_sw_cvolume_divide(&new_soft_volume, &s->real_volume, &u->hardware_volume);
1215
1216 /* If the adjustment to do in software is only minimal we
1217 * can skip it. That saves us CPU at the expense of a bit of
1218 * accuracy */
1219 accurate_enough =
1220 (pa_cvolume_min(&new_soft_volume) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) &&
1221 (pa_cvolume_max(&new_soft_volume) <= (PA_VOLUME_NORM + VOLUME_ACCURACY));
1222
1223 pa_log_debug("Requested volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &s->real_volume));
1224 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &s->real_volume));
1225 pa_log_debug("Got hardware volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &u->hardware_volume));
1226 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &u->hardware_volume));
1227 pa_log_debug("Calculated software volume: %s (accurate-enough=%s)",
1228 pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &new_soft_volume),
1229 pa_yes_no(accurate_enough));
1230 pa_log_debug(" in dB: %s", pa_sw_cvolume_snprint_dB(vol_str_db, sizeof(vol_str_db), &new_soft_volume));
1231
1232 if (!accurate_enough)
1233 s->soft_volume = new_soft_volume;
1234
1235 } else {
1236 pa_log_debug("Wrote hardware volume: %s", pa_cvolume_snprint(vol_str_pcnt, sizeof(vol_str_pcnt), &r));
1237
1238 /* We can't match exactly what the user requested, hence let's
1239 * at least tell the user about it */
1240
1241 s->real_volume = r;
1242 }
1243 }
1244
1245 static void source_write_volume_cb(pa_source *s) {
1246 struct userdata *u = s->userdata;
1247 pa_cvolume hw_vol = s->thread_info.current_hw_volume;
1248
1249 pa_assert(u);
1250 pa_assert(u->mixer_path);
1251 pa_assert(u->mixer_handle);
1252 pa_assert(s->flags & PA_SOURCE_DEFERRED_VOLUME);
1253
1254 /* Shift up by the base volume */
1255 pa_sw_cvolume_divide_scalar(&hw_vol, &hw_vol, s->base_volume);
1256
1257 if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &hw_vol, TRUE, TRUE) < 0)
1258 pa_log_error("Writing HW volume failed");
1259 else {
1260 pa_cvolume tmp_vol;
1261 pa_bool_t accurate_enough;
1262
1263 /* Shift down by the base volume, so that 0dB becomes maximum volume */
1264 pa_sw_cvolume_multiply_scalar(&hw_vol, &hw_vol, s->base_volume);
1265
1266 pa_sw_cvolume_divide(&tmp_vol, &hw_vol, &s->thread_info.current_hw_volume);
1267 accurate_enough =
1268 (pa_cvolume_min(&tmp_vol) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) &&
1269 (pa_cvolume_max(&tmp_vol) <= (PA_VOLUME_NORM + VOLUME_ACCURACY));
1270
1271 if (!accurate_enough) {
1272 union {
1273 char db[2][PA_SW_CVOLUME_SNPRINT_DB_MAX];
1274 char pcnt[2][PA_CVOLUME_SNPRINT_MAX];
1275 } vol;
1276
1277 pa_log_debug("Written HW volume did not match with the request: %s (request) != %s",
1278 pa_cvolume_snprint(vol.pcnt[0], sizeof(vol.pcnt[0]), &s->thread_info.current_hw_volume),
1279 pa_cvolume_snprint(vol.pcnt[1], sizeof(vol.pcnt[1]), &hw_vol));
1280 pa_log_debug(" in dB: %s (request) != %s",
1281 pa_sw_cvolume_snprint_dB(vol.db[0], sizeof(vol.db[0]), &s->thread_info.current_hw_volume),
1282 pa_sw_cvolume_snprint_dB(vol.db[1], sizeof(vol.db[1]), &hw_vol));
1283 }
1284 }
1285 }
1286
1287 static void source_get_mute_cb(pa_source *s) {
1288 struct userdata *u = s->userdata;
1289 pa_bool_t b;
1290
1291 pa_assert(u);
1292 pa_assert(u->mixer_path);
1293 pa_assert(u->mixer_handle);
1294
1295 if (pa_alsa_path_get_mute(u->mixer_path, u->mixer_handle, &b) < 0)
1296 return;
1297
1298 s->muted = b;
1299 }
1300
1301 static void source_set_mute_cb(pa_source *s) {
1302 struct userdata *u = s->userdata;
1303
1304 pa_assert(u);
1305 pa_assert(u->mixer_path);
1306 pa_assert(u->mixer_handle);
1307
1308 pa_alsa_path_set_mute(u->mixer_path, u->mixer_handle, s->muted);
1309 }
1310
1311 static void mixer_volume_init(struct userdata *u) {
1312 pa_assert(u);
1313
1314 if (!u->mixer_path->has_volume) {
1315 pa_source_set_write_volume_callback(u->source, NULL);
1316 pa_source_set_get_volume_callback(u->source, NULL);
1317 pa_source_set_set_volume_callback(u->source, NULL);
1318
1319 pa_log_info("Driver does not support hardware volume control, falling back to software volume control.");
1320 } else {
1321 pa_source_set_get_volume_callback(u->source, source_get_volume_cb);
1322 pa_source_set_set_volume_callback(u->source, source_set_volume_cb);
1323
1324 if (u->mixer_path->has_dB && u->deferred_volume) {
1325 pa_source_set_write_volume_callback(u->source, source_write_volume_cb);
1326 pa_log_info("Successfully enabled deferred volume.");
1327 } else
1328 pa_source_set_write_volume_callback(u->source, NULL);
1329
1330 if (u->mixer_path->has_dB) {
1331 pa_source_enable_decibel_volume(u->source, TRUE);
1332 pa_log_info("Hardware volume ranges from %0.2f dB to %0.2f dB.", u->mixer_path->min_dB, u->mixer_path->max_dB);
1333
1334 u->source->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB);
1335 u->source->n_volume_steps = PA_VOLUME_NORM+1;
1336
1337 pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->source->base_volume));
1338 } else {
1339 pa_source_enable_decibel_volume(u->source, FALSE);
1340 pa_log_info("Hardware volume ranges from %li to %li.", u->mixer_path->min_volume, u->mixer_path->max_volume);
1341
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;
1344 }
1345
1346 pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->mixer_path->has_dB ? "supported" : "not supported");
1347 }
1348
1349 if (!u->mixer_path->has_mute) {
1350 pa_source_set_get_mute_callback(u->source, NULL);
1351 pa_source_set_set_mute_callback(u->source, NULL);
1352 pa_log_info("Driver does not support hardware mute control, falling back to software mute control.");
1353 } else {
1354 pa_source_set_get_mute_callback(u->source, source_get_mute_cb);
1355 pa_source_set_set_mute_callback(u->source, source_set_mute_cb);
1356 pa_log_info("Using hardware mute control.");
1357 }
1358 }
1359
1360 static int source_set_port_ucm_cb(pa_source *s, pa_device_port *p) {
1361 struct userdata *u = s->userdata;
1362
1363 pa_assert(u);
1364 pa_assert(p);
1365 pa_assert(u->ucm_context);
1366
1367 return pa_alsa_ucm_set_port(u->ucm_context, p, FALSE);
1368 }
1369
1370 static int source_set_port_cb(pa_source *s, pa_device_port *p) {
1371 struct userdata *u = s->userdata;
1372 pa_alsa_port_data *data;
1373
1374 pa_assert(u);
1375 pa_assert(p);
1376 pa_assert(u->mixer_handle);
1377
1378 data = PA_DEVICE_PORT_DATA(p);
1379
1380 pa_assert_se(u->mixer_path = data->path);
1381 pa_alsa_path_select(u->mixer_path, data->setting, u->mixer_handle, s->muted);
1382
1383 mixer_volume_init(u);
1384
1385 if (s->set_mute)
1386 s->set_mute(s);
1387 if (s->flags & PA_SOURCE_DEFERRED_VOLUME) {
1388 if (s->write_volume)
1389 s->write_volume(s);
1390 } else {
1391 if (s->set_volume)
1392 s->set_volume(s);
1393 }
1394
1395 return 0;
1396 }
1397
1398 static void source_update_requested_latency_cb(pa_source *s) {
1399 struct userdata *u = s->userdata;
1400 pa_assert(u);
1401 pa_assert(u->use_tsched); /* only when timer scheduling is used
1402 * we can dynamically adjust the
1403 * latency */
1404
1405 if (!u->pcm_handle)
1406 return;
1407
1408 update_sw_params(u);
1409 }
1410
1411 static pa_bool_t source_update_rate_cb(pa_source *s, uint32_t rate)
1412 {
1413 struct userdata *u = s->userdata;
1414 int i;
1415 pa_bool_t supported = FALSE;
1416
1417 pa_assert(u);
1418
1419 for (i = 0; u->rates[i]; i++) {
1420 if (u->rates[i] == rate) {
1421 supported = TRUE;
1422 break;
1423 }
1424 }
1425
1426 if (!supported) {
1427 pa_log_info("Sink does not support sample rate of %d Hz", rate);
1428 return FALSE;
1429 }
1430
1431 if (!PA_SOURCE_IS_OPENED(s->state)) {
1432 pa_log_info("Updating rate for device %s, new rate is %d", u->device_name, rate);
1433 u->source->sample_spec.rate = rate;
1434 return TRUE;
1435 }
1436
1437 return FALSE;
1438 }
1439
1440 static void thread_func(void *userdata) {
1441 struct userdata *u = userdata;
1442 unsigned short revents = 0;
1443
1444 pa_assert(u);
1445
1446 pa_log_debug("Thread starting up");
1447
1448 if (u->core->realtime_scheduling)
1449 pa_make_realtime(u->core->realtime_priority);
1450
1451 pa_thread_mq_install(&u->thread_mq);
1452
1453 for (;;) {
1454 int ret;
1455 pa_usec_t rtpoll_sleep = 0, real_sleep;
1456
1457 #ifdef DEBUG_TIMING
1458 pa_log_debug("Loop");
1459 #endif
1460
1461 /* Read some data and pass it to the sources */
1462 if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
1463 int work_done;
1464 pa_usec_t sleep_usec = 0;
1465 pa_bool_t on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll);
1466
1467 if (u->first) {
1468 pa_log_info("Starting capture.");
1469 snd_pcm_start(u->pcm_handle);
1470
1471 pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE);
1472
1473 u->first = FALSE;
1474 }
1475
1476 if (u->use_mmap)
1477 work_done = mmap_read(u, &sleep_usec, revents & POLLIN, on_timeout);
1478 else
1479 work_done = unix_read(u, &sleep_usec, revents & POLLIN, on_timeout);
1480
1481 if (work_done < 0)
1482 goto fail;
1483
1484 /* pa_log_debug("work_done = %i", work_done); */
1485
1486 if (work_done)
1487 update_smoother(u);
1488
1489 if (u->use_tsched) {
1490 pa_usec_t cusec;
1491
1492 /* OK, the capture buffer is now empty, let's
1493 * calculate when to wake up next */
1494
1495 /* pa_log_debug("Waking up in %0.2fms (sound card clock).", (double) sleep_usec / PA_USEC_PER_MSEC); */
1496
1497 /* Convert from the sound card time domain to the
1498 * system time domain */
1499 cusec = pa_smoother_translate(u->smoother, pa_rtclock_now(), sleep_usec);
1500
1501 /* pa_log_debug("Waking up in %0.2fms (system clock).", (double) cusec / PA_USEC_PER_MSEC); */
1502
1503 /* We don't trust the conversion, so we wake up whatever comes first */
1504 rtpoll_sleep = PA_MIN(sleep_usec, cusec);
1505 }
1506 }
1507
1508 if (u->source->flags & PA_SOURCE_DEFERRED_VOLUME) {
1509 pa_usec_t volume_sleep;
1510 pa_source_volume_change_apply(u->source, &volume_sleep);
1511 if (volume_sleep > 0) {
1512 if (rtpoll_sleep > 0)
1513 rtpoll_sleep = PA_MIN(volume_sleep, rtpoll_sleep);
1514 else
1515 rtpoll_sleep = volume_sleep;
1516 }
1517 }
1518
1519 if (rtpoll_sleep > 0) {
1520 pa_rtpoll_set_timer_relative(u->rtpoll, rtpoll_sleep);
1521 real_sleep = pa_rtclock_now();
1522 }
1523 else
1524 pa_rtpoll_set_timer_disabled(u->rtpoll);
1525
1526 /* Hmm, nothing to do. Let's sleep */
1527 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
1528 goto fail;
1529
1530 if (rtpoll_sleep > 0) {
1531 real_sleep = pa_rtclock_now() - real_sleep;
1532 #ifdef DEBUG_TIMING
1533 pa_log_debug("Expected sleep: %0.2fms, real sleep: %0.2fms (diff %0.2f ms)",
1534 (double) rtpoll_sleep / PA_USEC_PER_MSEC, (double) real_sleep / PA_USEC_PER_MSEC,
1535 (double) ((int64_t) real_sleep - (int64_t) rtpoll_sleep) / PA_USEC_PER_MSEC);
1536 #endif
1537 if (u->use_tsched && real_sleep > rtpoll_sleep + u->tsched_watermark)
1538 pa_log_info("Scheduling delay of %0.2fms, you might want to investigate this to improve latency...",
1539 (double) (real_sleep - rtpoll_sleep) / PA_USEC_PER_MSEC);
1540 }
1541
1542 if (u->source->flags & PA_SOURCE_DEFERRED_VOLUME)
1543 pa_source_volume_change_apply(u->source, NULL);
1544
1545 if (ret == 0)
1546 goto finish;
1547
1548 /* Tell ALSA about this and process its response */
1549 if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
1550 struct pollfd *pollfd;
1551 int err;
1552 unsigned n;
1553
1554 pollfd = pa_rtpoll_item_get_pollfd(u->alsa_rtpoll_item, &n);
1555
1556 if ((err = snd_pcm_poll_descriptors_revents(u->pcm_handle, pollfd, n, &revents)) < 0) {
1557 pa_log("snd_pcm_poll_descriptors_revents() failed: %s", pa_alsa_strerror(err));
1558 goto fail;
1559 }
1560
1561 if (revents & ~POLLIN) {
1562 if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0)
1563 goto fail;
1564
1565 u->first = TRUE;
1566 revents = 0;
1567 } else if (revents && u->use_tsched && pa_log_ratelimit(PA_LOG_DEBUG))
1568 pa_log_debug("Wakeup from ALSA!");
1569
1570 } else
1571 revents = 0;
1572 }
1573
1574 fail:
1575 /* If this was no regular exit from the loop we have to continue
1576 * processing messages until we received PA_MESSAGE_SHUTDOWN */
1577 pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
1578 pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
1579
1580 finish:
1581 pa_log_debug("Thread shutting down");
1582 }
1583
1584 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) {
1585 const char *n;
1586 char *t;
1587
1588 pa_assert(data);
1589 pa_assert(ma);
1590 pa_assert(device_name);
1591
1592 if ((n = pa_modargs_get_value(ma, "source_name", NULL))) {
1593 pa_source_new_data_set_name(data, n);
1594 data->namereg_fail = TRUE;
1595 return;
1596 }
1597
1598 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1599 data->namereg_fail = TRUE;
1600 else {
1601 n = device_id ? device_id : device_name;
1602 data->namereg_fail = FALSE;
1603 }
1604
1605 if (mapping)
1606 t = pa_sprintf_malloc("alsa_input.%s.%s", n, mapping->name);
1607 else
1608 t = pa_sprintf_malloc("alsa_input.%s", n);
1609
1610 pa_source_new_data_set_name(data, t);
1611 pa_xfree(t);
1612 }
1613
1614 static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char *element, pa_bool_t ignore_dB) {
1615 snd_hctl_t *hctl;
1616
1617 if (!mapping && !element)
1618 return;
1619
1620 if (!(u->mixer_handle = pa_alsa_open_mixer_for_pcm(u->pcm_handle, &u->control_device, &hctl))) {
1621 pa_log_info("Failed to find a working mixer device.");
1622 return;
1623 }
1624
1625 if (element) {
1626
1627 if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_INPUT)))
1628 goto fail;
1629
1630 if (pa_alsa_path_probe(u->mixer_path, u->mixer_handle, hctl, ignore_dB) < 0)
1631 goto fail;
1632
1633 pa_log_debug("Probed mixer path %s:", u->mixer_path->name);
1634 pa_alsa_path_dump(u->mixer_path);
1635 } else if (!(u->mixer_path_set = mapping->input_path_set))
1636 goto fail;
1637
1638 return;
1639
1640 fail:
1641
1642 if (u->mixer_path) {
1643 pa_alsa_path_free(u->mixer_path);
1644 u->mixer_path = NULL;
1645 }
1646
1647 if (u->mixer_handle) {
1648 snd_mixer_close(u->mixer_handle);
1649 u->mixer_handle = NULL;
1650 }
1651 }
1652
1653 static int setup_mixer(struct userdata *u, pa_bool_t ignore_dB) {
1654 pa_bool_t need_mixer_callback = FALSE;
1655
1656 pa_assert(u);
1657
1658 if (!u->mixer_handle)
1659 return 0;
1660
1661 if (u->source->active_port) {
1662 pa_alsa_port_data *data;
1663
1664 /* We have a list of supported paths, so let's activate the
1665 * one that has been chosen as active */
1666
1667 data = PA_DEVICE_PORT_DATA(u->source->active_port);
1668 u->mixer_path = data->path;
1669
1670 pa_alsa_path_select(data->path, data->setting, u->mixer_handle, u->source->muted);
1671
1672 } else {
1673
1674 if (!u->mixer_path && u->mixer_path_set)
1675 u->mixer_path = pa_hashmap_first(u->mixer_path_set->paths);
1676
1677 if (u->mixer_path) {
1678 /* Hmm, we have only a single path, then let's activate it */
1679
1680 pa_alsa_path_select(u->mixer_path, u->mixer_path->settings, u->mixer_handle, u->source->muted);
1681 } else
1682 return 0;
1683 }
1684
1685 mixer_volume_init(u);
1686
1687 /* Will we need to register callbacks? */
1688 if (u->mixer_path_set && u->mixer_path_set->paths) {
1689 pa_alsa_path *p;
1690 void *state;
1691
1692 PA_HASHMAP_FOREACH(p, u->mixer_path_set->paths, state) {
1693 if (p->has_volume || p->has_mute)
1694 need_mixer_callback = TRUE;
1695 }
1696 }
1697 else if (u->mixer_path)
1698 need_mixer_callback = u->mixer_path->has_volume || u->mixer_path->has_mute;
1699
1700 if (need_mixer_callback) {
1701 int (*mixer_callback)(snd_mixer_elem_t *, unsigned int);
1702 if (u->source->flags & PA_SOURCE_DEFERRED_VOLUME) {
1703 u->mixer_pd = pa_alsa_mixer_pdata_new();
1704 mixer_callback = io_mixer_callback;
1705
1706 if (pa_alsa_set_mixer_rtpoll(u->mixer_pd, u->mixer_handle, u->rtpoll) < 0) {
1707 pa_log("Failed to initialize file descriptor monitoring");
1708 return -1;
1709 }
1710 } else {
1711 u->mixer_fdl = pa_alsa_fdlist_new();
1712 mixer_callback = ctl_mixer_callback;
1713
1714 if (pa_alsa_fdlist_set_handle(u->mixer_fdl, u->mixer_handle, NULL, u->core->mainloop) < 0) {
1715 pa_log("Failed to initialize file descriptor monitoring");
1716 return -1;
1717 }
1718 }
1719
1720 if (u->mixer_path_set)
1721 pa_alsa_path_set_set_callback(u->mixer_path_set, u->mixer_handle, mixer_callback, u);
1722 else
1723 pa_alsa_path_set_callback(u->mixer_path, u->mixer_handle, mixer_callback, u);
1724 }
1725
1726 return 0;
1727 }
1728
1729 pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping) {
1730
1731 struct userdata *u = NULL;
1732 const char *dev_id = NULL, *key, *mod_name;
1733 pa_sample_spec ss;
1734 char *thread_name = NULL;
1735 uint32_t alternate_sample_rate;
1736 pa_channel_map map;
1737 uint32_t nfrags, frag_size, buffer_size, tsched_size, tsched_watermark;
1738 snd_pcm_uframes_t period_frames, buffer_frames, tsched_frames;
1739 size_t frame_size;
1740 pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE, namereg_fail = FALSE, deferred_volume = FALSE, fixed_latency_range = FALSE;
1741 pa_source_new_data data;
1742 pa_alsa_profile_set *profile_set = NULL;
1743 void *state = NULL;
1744
1745 pa_assert(m);
1746 pa_assert(ma);
1747
1748 ss = m->core->default_sample_spec;
1749 map = m->core->default_channel_map;
1750 if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) {
1751 pa_log("Failed to parse sample specification and channel map");
1752 goto fail;
1753 }
1754
1755 alternate_sample_rate = m->core->alternate_sample_rate;
1756 if (pa_modargs_get_alternate_sample_rate(ma, &alternate_sample_rate) < 0) {
1757 pa_log("Failed to parse alternate sample rate");
1758 goto fail;
1759 }
1760
1761 frame_size = pa_frame_size(&ss);
1762
1763 nfrags = m->core->default_n_fragments;
1764 frag_size = (uint32_t) pa_usec_to_bytes(m->core->default_fragment_size_msec*PA_USEC_PER_MSEC, &ss);
1765 if (frag_size <= 0)
1766 frag_size = (uint32_t) frame_size;
1767 tsched_size = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_BUFFER_USEC, &ss);
1768 tsched_watermark = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_WATERMARK_USEC, &ss);
1769
1770 if (pa_modargs_get_value_u32(ma, "fragments", &nfrags) < 0 ||
1771 pa_modargs_get_value_u32(ma, "fragment_size", &frag_size) < 0 ||
1772 pa_modargs_get_value_u32(ma, "tsched_buffer_size", &tsched_size) < 0 ||
1773 pa_modargs_get_value_u32(ma, "tsched_buffer_watermark", &tsched_watermark) < 0) {
1774 pa_log("Failed to parse buffer metrics");
1775 goto fail;
1776 }
1777
1778 buffer_size = nfrags * frag_size;
1779
1780 period_frames = frag_size/frame_size;
1781 buffer_frames = buffer_size/frame_size;
1782 tsched_frames = tsched_size/frame_size;
1783
1784 if (pa_modargs_get_value_boolean(ma, "mmap", &use_mmap) < 0) {
1785 pa_log("Failed to parse mmap argument.");
1786 goto fail;
1787 }
1788
1789 if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) {
1790 pa_log("Failed to parse tsched argument.");
1791 goto fail;
1792 }
1793
1794 if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) {
1795 pa_log("Failed to parse ignore_dB argument.");
1796 goto fail;
1797 }
1798
1799 deferred_volume = m->core->deferred_volume;
1800 if (pa_modargs_get_value_boolean(ma, "deferred_volume", &deferred_volume) < 0) {
1801 pa_log("Failed to parse deferred_volume argument.");
1802 goto fail;
1803 }
1804
1805 if (pa_modargs_get_value_boolean(ma, "fixed_latency_range", &fixed_latency_range) < 0) {
1806 pa_log("Failed to parse fixed_latency_range argument.");
1807 goto fail;
1808 }
1809
1810 use_tsched = pa_alsa_may_tsched(use_tsched);
1811
1812 u = pa_xnew0(struct userdata, 1);
1813 u->core = m->core;
1814 u->module = m;
1815 u->use_mmap = use_mmap;
1816 u->use_tsched = use_tsched;
1817 u->deferred_volume = deferred_volume;
1818 u->fixed_latency_range = fixed_latency_range;
1819 u->first = TRUE;
1820 u->rtpoll = pa_rtpoll_new();
1821 pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
1822
1823 u->smoother = pa_smoother_new(
1824 SMOOTHER_ADJUST_USEC,
1825 SMOOTHER_WINDOW_USEC,
1826 TRUE,
1827 TRUE,
1828 5,
1829 pa_rtclock_now(),
1830 TRUE);
1831 u->smoother_interval = SMOOTHER_MIN_INTERVAL;
1832
1833 /* use ucm */
1834 if (mapping && mapping->ucm_context.ucm)
1835 u->ucm_context = &mapping->ucm_context;
1836
1837 dev_id = pa_modargs_get_value(
1838 ma, "device_id",
1839 pa_modargs_get_value(ma, "device", DEFAULT_DEVICE));
1840
1841 u->paths_dir = pa_xstrdup(pa_modargs_get_value(ma, "paths_dir", NULL));
1842
1843 if (reserve_init(u, dev_id) < 0)
1844 goto fail;
1845
1846 if (reserve_monitor_init(u, dev_id) < 0)
1847 goto fail;
1848
1849 b = use_mmap;
1850 d = use_tsched;
1851
1852 if (mapping) {
1853
1854 if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
1855 pa_log("device_id= not set");
1856 goto fail;
1857 }
1858
1859 if ((mod_name = pa_proplist_gets(mapping->proplist, PA_ALSA_PROP_UCM_MODIFIER))) {
1860 if (snd_use_case_set(u->ucm_context->ucm->ucm_mgr, "_enamod", mod_name) < 0)
1861 pa_log("Failed to enable ucm modifier %s", mod_name);
1862 else
1863 pa_log_debug("Enabled ucm modifier %s", mod_name);
1864 }
1865
1866 if (!(u->pcm_handle = pa_alsa_open_by_device_id_mapping(
1867 dev_id,
1868 &u->device_name,
1869 &ss, &map,
1870 SND_PCM_STREAM_CAPTURE,
1871 &period_frames, &buffer_frames, tsched_frames,
1872 &b, &d, mapping)))
1873 goto fail;
1874
1875 } else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
1876
1877 if (!(profile_set = pa_alsa_profile_set_new(NULL, &map)))
1878 goto fail;
1879
1880 if (!(u->pcm_handle = pa_alsa_open_by_device_id_auto(
1881 dev_id,
1882 &u->device_name,
1883 &ss, &map,
1884 SND_PCM_STREAM_CAPTURE,
1885 &period_frames, &buffer_frames, tsched_frames,
1886 &b, &d, profile_set, &mapping)))
1887 goto fail;
1888
1889 } else {
1890
1891 if (!(u->pcm_handle = pa_alsa_open_by_device_string(
1892 pa_modargs_get_value(ma, "device", DEFAULT_DEVICE),
1893 &u->device_name,
1894 &ss, &map,
1895 SND_PCM_STREAM_CAPTURE,
1896 &period_frames, &buffer_frames, tsched_frames,
1897 &b, &d, FALSE)))
1898 goto fail;
1899 }
1900
1901 pa_assert(u->device_name);
1902 pa_log_info("Successfully opened device %s.", u->device_name);
1903
1904 if (pa_alsa_pcm_is_modem(u->pcm_handle)) {
1905 pa_log_notice("Device %s is modem, refusing further initialization.", u->device_name);
1906 goto fail;
1907 }
1908
1909 if (mapping)
1910 pa_log_info("Selected mapping '%s' (%s).", mapping->description, mapping->name);
1911
1912 if (use_mmap && !b) {
1913 pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode.");
1914 u->use_mmap = use_mmap = FALSE;
1915 }
1916
1917 if (use_tsched && (!b || !d)) {
1918 pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling.");
1919 u->use_tsched = use_tsched = FALSE;
1920 }
1921
1922 if (u->use_mmap)
1923 pa_log_info("Successfully enabled mmap() mode.");
1924
1925 if (u->use_tsched) {
1926 pa_log_info("Successfully enabled timer-based scheduling mode.");
1927 if (u->fixed_latency_range)
1928 pa_log_info("Disabling latency range changes on overrun");
1929 }
1930
1931 u->rates = pa_alsa_get_supported_rates(u->pcm_handle, ss.rate);
1932 if (!u->rates) {
1933 pa_log_error("Failed to find any supported sample rates.");
1934 goto fail;
1935 }
1936
1937 /* ALSA might tweak the sample spec, so recalculate the frame size */
1938 frame_size = pa_frame_size(&ss);
1939
1940 if (!u->ucm_context)
1941 find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB);
1942
1943 pa_source_new_data_init(&data);
1944 data.driver = driver;
1945 data.module = m;
1946 data.card = card;
1947 set_source_name(&data, ma, dev_id, u->device_name, mapping);
1948
1949 /* We need to give pa_modargs_get_value_boolean() a pointer to a local
1950 * variable instead of using &data.namereg_fail directly, because
1951 * data.namereg_fail is a bitfield and taking the address of a bitfield
1952 * variable is impossible. */
1953 namereg_fail = data.namereg_fail;
1954 if (pa_modargs_get_value_boolean(ma, "namereg_fail", &namereg_fail) < 0) {
1955 pa_log("Failed to parse namereg_fail argument.");
1956 pa_source_new_data_done(&data);
1957 goto fail;
1958 }
1959 data.namereg_fail = namereg_fail;
1960
1961 pa_source_new_data_set_sample_spec(&data, &ss);
1962 pa_source_new_data_set_channel_map(&data, &map);
1963 pa_source_new_data_set_alternate_sample_rate(&data, alternate_sample_rate);
1964
1965 pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle);
1966 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name);
1967 pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (buffer_frames * frame_size));
1968 pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size));
1969 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, u->use_tsched ? "mmap+timer" : (u->use_mmap ? "mmap" : "serial"));
1970
1971 if (mapping) {
1972 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name);
1973 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description);
1974
1975 while ((key = pa_proplist_iterate(mapping->proplist, &state)))
1976 pa_proplist_sets(data.proplist, key, pa_proplist_gets(mapping->proplist, key));
1977 }
1978
1979 pa_alsa_init_description(data.proplist);
1980
1981 if (u->control_device)
1982 pa_alsa_init_proplist_ctl(data.proplist, u->control_device);
1983
1984 if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
1985 pa_log("Invalid properties");
1986 pa_source_new_data_done(&data);
1987 goto fail;
1988 }
1989
1990 if (u->ucm_context)
1991 pa_alsa_ucm_add_ports(&data.ports, data.proplist, u->ucm_context, FALSE, card);
1992 else if (u->mixer_path_set)
1993 pa_alsa_add_ports(&data, u->mixer_path_set, card);
1994
1995 u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY|(u->use_tsched ? PA_SOURCE_DYNAMIC_LATENCY : 0));
1996 pa_source_new_data_done(&data);
1997
1998 if (!u->source) {
1999 pa_log("Failed to create source object");
2000 goto fail;
2001 }
2002
2003 if (pa_modargs_get_value_u32(ma, "deferred_volume_safety_margin",
2004 &u->source->thread_info.volume_change_safety_margin) < 0) {
2005 pa_log("Failed to parse deferred_volume_safety_margin parameter");
2006 goto fail;
2007 }
2008
2009 if (pa_modargs_get_value_s32(ma, "deferred_volume_extra_delay",
2010 &u->source->thread_info.volume_change_extra_delay) < 0) {
2011 pa_log("Failed to parse deferred_volume_extra_delay parameter");
2012 goto fail;
2013 }
2014
2015 u->source->parent.process_msg = source_process_msg;
2016 if (u->use_tsched)
2017 u->source->update_requested_latency = source_update_requested_latency_cb;
2018 u->source->set_state = source_set_state_cb;
2019 if (u->ucm_context)
2020 u->source->set_port = source_set_port_ucm_cb;
2021 else
2022 u->source->set_port = source_set_port_cb;
2023 if (u->source->alternate_sample_rate)
2024 u->source->update_rate = source_update_rate_cb;
2025 u->source->userdata = u;
2026
2027 pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
2028 pa_source_set_rtpoll(u->source, u->rtpoll);
2029
2030 u->frame_size = frame_size;
2031 u->fragment_size = frag_size = (size_t) (period_frames * frame_size);
2032 u->hwbuf_size = buffer_size = (size_t) (buffer_frames * frame_size);
2033 pa_cvolume_mute(&u->hardware_volume, u->source->sample_spec.channels);
2034
2035 pa_log_info("Using %0.1f fragments of size %lu bytes (%0.2fms), buffer size is %lu bytes (%0.2fms)",
2036 (double) u->hwbuf_size / (double) u->fragment_size,
2037 (long unsigned) u->fragment_size,
2038 (double) pa_bytes_to_usec(u->fragment_size, &ss) / PA_USEC_PER_MSEC,
2039 (long unsigned) u->hwbuf_size,
2040 (double) pa_bytes_to_usec(u->hwbuf_size, &ss) / PA_USEC_PER_MSEC);
2041
2042 if (u->use_tsched) {
2043 u->tsched_watermark_ref = tsched_watermark;
2044 reset_watermark(u, u->tsched_watermark_ref, &ss, FALSE);
2045 }
2046 else
2047 pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->hwbuf_size, &ss));
2048
2049 reserve_update(u);
2050
2051 if (update_sw_params(u) < 0)
2052 goto fail;
2053
2054 if (u->ucm_context) {
2055 if (u->source->active_port && pa_alsa_ucm_set_port(u->ucm_context, u->source->active_port, FALSE) < 0)
2056 goto fail;
2057 } else if (setup_mixer(u, ignore_dB) < 0)
2058 goto fail;
2059
2060 pa_alsa_dump(PA_LOG_DEBUG, u->pcm_handle);
2061
2062 thread_name = pa_sprintf_malloc("alsa-source-%s", pa_strnull(pa_proplist_gets(u->source->proplist, "alsa.id")));
2063 if (!(u->thread = pa_thread_new(thread_name, thread_func, u))) {
2064 pa_log("Failed to create thread.");
2065 goto fail;
2066 }
2067 pa_xfree(thread_name);
2068 thread_name = NULL;
2069
2070 /* Get initial mixer settings */
2071 if (data.volume_is_set) {
2072 if (u->source->set_volume)
2073 u->source->set_volume(u->source);
2074 } else {
2075 if (u->source->get_volume)
2076 u->source->get_volume(u->source);
2077 }
2078
2079 if (data.muted_is_set) {
2080 if (u->source->set_mute)
2081 u->source->set_mute(u->source);
2082 } else {
2083 if (u->source->get_mute)
2084 u->source->get_mute(u->source);
2085 }
2086
2087 if ((data.volume_is_set || data.muted_is_set) && u->source->write_volume)
2088 u->source->write_volume(u->source);
2089
2090 pa_source_put(u->source);
2091
2092 if (profile_set)
2093 pa_alsa_profile_set_free(profile_set);
2094
2095 return u->source;
2096
2097 fail:
2098 pa_xfree(thread_name);
2099
2100 if (u)
2101 userdata_free(u);
2102
2103 if (profile_set)
2104 pa_alsa_profile_set_free(profile_set);
2105
2106 return NULL;
2107 }
2108
2109 static void userdata_free(struct userdata *u) {
2110 pa_assert(u);
2111
2112 if (u->source)
2113 pa_source_unlink(u->source);
2114
2115 if (u->thread) {
2116 pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
2117 pa_thread_free(u->thread);
2118 }
2119
2120 pa_thread_mq_done(&u->thread_mq);
2121
2122 if (u->source)
2123 pa_source_unref(u->source);
2124
2125 if (u->mixer_pd)
2126 pa_alsa_mixer_pdata_free(u->mixer_pd);
2127
2128 if (u->alsa_rtpoll_item)
2129 pa_rtpoll_item_free(u->alsa_rtpoll_item);
2130
2131 if (u->rtpoll)
2132 pa_rtpoll_free(u->rtpoll);
2133
2134 if (u->pcm_handle) {
2135 snd_pcm_drop(u->pcm_handle);
2136 snd_pcm_close(u->pcm_handle);
2137 }
2138
2139 if (u->mixer_fdl)
2140 pa_alsa_fdlist_free(u->mixer_fdl);
2141
2142 if (u->mixer_path && !u->mixer_path_set)
2143 pa_alsa_path_free(u->mixer_path);
2144
2145 if (u->mixer_handle)
2146 snd_mixer_close(u->mixer_handle);
2147
2148 if (u->smoother)
2149 pa_smoother_free(u->smoother);
2150
2151 if (u->rates)
2152 pa_xfree(u->rates);
2153
2154 reserve_done(u);
2155 monitor_done(u);
2156
2157 pa_xfree(u->device_name);
2158 pa_xfree(u->control_device);
2159 pa_xfree(u->paths_dir);
2160 pa_xfree(u);
2161 }
2162
2163 void pa_alsa_source_free(pa_source *s) {
2164 struct userdata *u;
2165
2166 pa_source_assert_ref(s);
2167 pa_assert_se(u = s->userdata);
2168
2169 userdata_free(u);
2170 }