summaryrefslogtreecommitdiff
path: root/src/modules/alsa
diff options
context:
space:
mode:
authorArun Raghavan <git@arunraghavan.net>2015-12-29 06:00:14 +0530
committerArun Raghavan <git@arunraghavan.net>2015-12-29 06:00:14 +0530
commit810aa36189f82f77403826defa76a4f9f1f01454 (patch)
treeacf72a251d7ee64ec864384c054e4cf3d68f6b22 /src/modules/alsa
parent5e8161448edad13d6613191133e0f4b498882917 (diff)
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.
Diffstat (limited to 'src/modules/alsa')
-rw-r--r--src/modules/alsa/alsa-util.c21
1 files changed, 19 insertions, 2 deletions
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 */