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