From 810aa36189f82f77403826defa76a4f9f1f01454 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Tue, 29 Dec 2015 06:00:14 +0530 Subject: alsa: Don't disable timer-based scheduling on USB devices This isn't a great fix, but we need ALSA API to do this right. In the mean time, USB devices work fine with timer-based scheduling, so there's no reason to force a large minimum latency by disabling tsched on them. --- src/modules/alsa/alsa-util.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'src/modules/alsa') diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c index bb79e7134..a4bb4491e 100644 --- a/src/modules/alsa/alsa-util.c +++ b/src/modules/alsa/alsa-util.c @@ -261,8 +261,25 @@ int pa_alsa_set_hw_params( /* The PCM pointer is only updated with period granularity */ if (snd_pcm_hw_params_is_batch(hwparams)) { - pa_log_info("Disabling tsched mode since BATCH flag is set"); - _use_tsched = false; + bool is_usb = false; + const char *id; + snd_pcm_info_t* pcm_info; + snd_pcm_info_alloca(&pcm_info); + + if (snd_pcm_info(pcm_handle, pcm_info) == 0 && + (id = snd_pcm_info_get_id(pcm_info))) { + /* This horrible hack makes sure we don't disable tsched on USB + * devices, which have a low enough transfer size for timer-based + * scheduling to work. This can go away when the ALSA API supprots + * querying the block transfer size. */ + if (pa_streq(id, "USB Audio")) + is_usb = true; + } + + if (!is_usb) { + pa_log_info("Disabling tsched mode since BATCH flag is set"); + _use_tsched = false; + } } #if (SND_LIB_VERSION >= ((1<<16)|(0<<8)|24)) /* API additions in 1.0.24 */ -- cgit v1.2.3