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