Takashi Iwai
82de13ad5c
- Fix the crash with Intel LPE HDMI audio (bsc#1083195): 0001-alsa-fix-infinite-loop-with-Intel-HDMI-LPE.patch 0002-alsa-mixer-add-hw_device_index-to-pa_alsa_mapping.patch 0003-alsa-mixer-autodetect-the-HDMI-jack-PCM-device.patch 0004-alsa-mixer-autodetect-the-ELD-device.patch OBS-URL: https://build.opensuse.org/request/show/581681 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/pulseaudio?expand=0&rev=185
90 lines
3.1 KiB
Diff
90 lines
3.1 KiB
Diff
From 09ff3fca2fa9fe928990b3f0effeb1ddfbba0df1 Mon Sep 17 00:00:00 2001
|
|
From: Tanu Kaskinen <tanuk@iki.fi>
|
|
Date: Sun, 8 Oct 2017 19:48:24 +0300
|
|
Subject: [PATCH] alsa-mixer: add hw_device_index to pa_alsa_mapping
|
|
|
|
We have so far assumed that HDMI always uses device indexes 3, 7, 8, 9,
|
|
10, 11, 12 and 13. These values are hardcoded in the path configuration.
|
|
The Intel HDMI LPE driver, however, uses different device numbering
|
|
scheme. Since the indexes aren't always the same, we need to query the
|
|
hw device index from ALSA.
|
|
|
|
Later patches will use the queried index for HDMI jack detection and ELD
|
|
information reading.
|
|
|
|
BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=100488
|
|
---
|
|
src/modules/alsa/alsa-mixer.c | 26 ++++++++++++++++++++++++++
|
|
src/modules/alsa/alsa-mixer.h | 4 ++++
|
|
2 files changed, 30 insertions(+)
|
|
|
|
--- a/src/modules/alsa/alsa-mixer.c
|
|
+++ b/src/modules/alsa/alsa-mixer.c
|
|
@@ -3504,6 +3504,7 @@ pa_alsa_mapping *pa_alsa_mapping_get(pa_
|
|
pa_sample_spec_init(&m->sample_spec);
|
|
pa_channel_map_init(&m->channel_map);
|
|
m->proplist = pa_proplist_new();
|
|
+ m->hw_device_index = -1;
|
|
|
|
pa_hashmap_put(ps->mappings, m->name, m);
|
|
|
|
@@ -4531,6 +4532,25 @@ static int add_profiles_to_probe(
|
|
return i;
|
|
}
|
|
|
|
+static void mapping_query_hw_device(pa_alsa_mapping *mapping, snd_pcm_t *pcm) {
|
|
+ int r;
|
|
+ snd_pcm_info_t* pcm_info;
|
|
+ snd_pcm_info_alloca(&pcm_info);
|
|
+
|
|
+ r = snd_pcm_info(pcm, pcm_info);
|
|
+ if (r < 0) {
|
|
+ pa_log("Mapping %s: snd_pcm_info() failed %s: ", mapping->name, pa_alsa_strerror(r));
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* XXX: It's not clear what snd_pcm_info_get_device() does if the device is
|
|
+ * not backed by a hw device or if it's backed by multiple hw devices. We
|
|
+ * only use hw_device_index for HDMI devices, however, and for those the
|
|
+ * return value is expected to be always valid, so this shouldn't be a
|
|
+ * significant problem. */
|
|
+ mapping->hw_device_index = snd_pcm_info_get_device(pcm_info);
|
|
+}
|
|
+
|
|
void pa_alsa_profile_set_probe(
|
|
pa_alsa_profile_set *ps,
|
|
const char *dev_id,
|
|
@@ -4621,6 +4641,9 @@ void pa_alsa_profile_set_probe(
|
|
}
|
|
break;
|
|
}
|
|
+
|
|
+ if (m->hw_device_index < 0)
|
|
+ mapping_query_hw_device(m, m->output_pcm);
|
|
}
|
|
|
|
if (p->input_mappings && p->supported)
|
|
@@ -4642,6 +4665,9 @@ void pa_alsa_profile_set_probe(
|
|
}
|
|
break;
|
|
}
|
|
+
|
|
+ if (m->hw_device_index < 0)
|
|
+ mapping_query_hw_device(m, m->input_pcm);
|
|
}
|
|
|
|
last = p;
|
|
--- a/src/modules/alsa/alsa-mixer.h
|
|
+++ b/src/modules/alsa/alsa-mixer.h
|
|
@@ -275,6 +275,10 @@ struct pa_alsa_mapping {
|
|
bool exact_channels:1;
|
|
bool fallback:1;
|
|
|
|
+ /* The "y" in "hw:x,y". This is set to -1 before the device index has been
|
|
+ * queried, or if the query failed. */
|
|
+ int hw_device_index;
|
|
+
|
|
/* Temporarily used during probing */
|
|
snd_pcm_t *input_pcm;
|
|
snd_pcm_t *output_pcm;
|