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