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