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