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