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