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