summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2010-09-06 15:26:19 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2010-09-07 12:22:51 +0200
commite382589d846f3ef6650359601ac1cdd82b82106f (patch)
tree6db0a3c0340f3ffd2381d60d51e0a70597637a9d
parent2ee7cd15b3cbfbde466b9edb0eb87f6b32a14dbb (diff)
alsa-source: refactor smoother and device start
Move the code to start the capture and the smoother closer together to improve smoother accuracy. Rework things to look more like the alsa sink where the device is started in only one place.
-rw-r--r--src/modules/alsa/alsa-source.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 8ed300b50..dbaa305e0 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -116,6 +116,8 @@ struct userdata {
pa_bool_t use_mmap:1, use_tsched:1;
+ pa_bool_t first;
+
pa_rtpoll_item *alsa_rtpoll_item;
snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST];
@@ -397,7 +399,7 @@ static int try_recover(struct userdata *u, const char *call, int err) {
return -1;
}
- snd_pcm_start(u->pcm_handle);
+ u->first = TRUE;
return 0;
}
@@ -946,13 +948,13 @@ static int unsuspend(struct userdata *u) {
/* FIXME: We need to reload the volume somehow */
- snd_pcm_start(u->pcm_handle);
-
u->read_count = 0;
- pa_smoother_reset(u->smoother, pa_rtclock_now(), FALSE);
+ pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);
u->smoother_interval = SMOOTHER_MIN_INTERVAL;
u->last_smoother_update = 0;
+ u->first = TRUE;
+
pa_log_info("Resumed successfully...");
return 0;
@@ -1003,8 +1005,6 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
if (u->source->thread_info.state == PA_SOURCE_INIT) {
if (build_pollfd(u) < 0)
return -PA_ERR_IO;
-
- snd_pcm_start(u->pcm_handle);
}
if (u->source->thread_info.state == PA_SOURCE_SUSPENDED) {
@@ -1240,6 +1240,15 @@ static void thread_func(void *userdata) {
pa_usec_t sleep_usec = 0;
pa_bool_t on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll);
+ if (u->first) {
+ pa_log_info("Starting capture.");
+ snd_pcm_start(u->pcm_handle);
+
+ pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE);
+
+ u->first = FALSE;
+ }
+
if (u->use_mmap)
work_done = mmap_read(u, &sleep_usec, revents & POLLIN, on_timeout);
else
@@ -1299,7 +1308,7 @@ static void thread_func(void *userdata) {
if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0)
goto fail;
- snd_pcm_start(u->pcm_handle);
+ u->first = TRUE;
} else if (revents && u->use_tsched && pa_log_ratelimit())
pa_log_debug("Wakeup from ALSA!");
@@ -1553,6 +1562,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
u->module = m;
u->use_mmap = use_mmap;
u->use_tsched = use_tsched;
+ u->first = TRUE;
u->rtpoll = pa_rtpoll_new();
pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
@@ -1563,7 +1573,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
TRUE,
5,
pa_rtclock_now(),
- FALSE);
+ TRUE);
u->smoother_interval = SMOOTHER_MIN_INTERVAL;
dev_id = pa_modargs_get_value(