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