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