* Fwd: [PATCH] ALSA: hda/generic: Add mic autoswitch support for dyn_adc_switch mode
[not found] <5b215802-4c94-4f94-9cee-f8e497b31337@kylinos.cn>
@ 2026-05-06 7:03 ` Zhang Heng
2026-05-07 15:05 ` Takashi Iwai
0 siblings, 1 reply; 4+ messages in thread
From: Zhang Heng @ 2026-05-06 7:03 UTC (permalink / raw)
To: perex, tiwai, linux-sound, linux-kernel
-------- 转发的消息 --------
主题: Re: [PATCH] ALSA: hda/generic: Add mic autoswitch support for
dyn_adc_switch mode
日期: Wed, 6 May 2026 14:19:14 +0800
发件人: Zhang Heng <zhangheng@kylinos.cn>
收件人: Takashi Iwai <tiwai@suse.de>
在 2026/5/5 0:25, Takashi Iwai 写道:
> On Sun, 03 May 2026 13:45:12 +0200,
> Zhang Heng wrote:
>> When auto_mic is not available but dyn_adc_switch mode is enabled
>> (e.g., on laptops with both front and rear mic jacks), this patch
>> enables automatic microphone switching based on jack detection.
>>
>> The patch includes three changes:
>>
>> 1. In check_dyn_adc_switch(): Register jack detect callbacks for
>> all input pins when dyn_adc_switch is enabled and auto_mic is
>> not available.
>>
>> 2. In call_mic_autoswitch(): Add handling for dyn_adc_switch mode
>> to check imux_pins[] for jack presence, searching from back to
>> front (last inserted wins).
>>
>> 3. In mux_select(): Notify Capture Source controls after switching
>> to sync with user-space (PulseAudio/PipeWire).
>>
>> Problem description:
>> On Ubuntu 20.04 (with older PulseAudio/PipeWire):
>> - Front mic is unplugged
>> - Plug in rear mic
>> - Jack event is reported correctly
>> - Volume control (PulseAudio/PipeWire) recognizes the rear mic
>> - But alsamixer does NOT switch to rear mic
>> - Codec also does NOT perform the switch
>>
>> The root cause is that in dyn_adc_switch mode without auto_mic,
>> the jack detect callback was not properly set up to trigger the
>> mic autoswitch. The call_mic_autoswitch() function only calls
>> mic_autoswitch_hook or snd_hda_gen_mic_autoswitch(), which rely
>> on auto_mic being enabled.
>>
>> Additionally, after mux_select() performs the switch, user-space
>> (PulseAudio/PipeWire) may not be aware of the path change,
>> causing Capture Switch to show 'off'.
>>
>> This patch fixes both issues by:
>> 1. Registering jack detect callbacks for all input pins in
>> dyn_adc_switch mode
>> 2. Notifying Capture Source controls after switching
>>
>> Tested on SN6186 codec with Ubuntu 20.04 and 25.10.
>>
>> Question to the community: Is this approach correct? Should additional
>> changes be made to handle mute state preservation, or is this purely
>> a user-space issue that requires updating PulseAudio/PipeWire?
>>
>> Testing and feedback are welcome.
> I think the basic idea is OK. We can treat the auto-mic with dynamic
> ADC switches, too.
>
> But it's not clear what's the actual intent in your code changes:
>
>
>> Signed-off-by: Zhang Heng <zhangheng@kylinos.cn>
>> ---
>> sound/hda/codecs/generic.c | 82 ++++++++++++++++++++++++++++++++++++--
>> 1 file changed, 79 insertions(+), 3 deletions(-)
>>
>> diff --git a/sound/hda/codecs/generic.c b/sound/hda/codecs/generic.c
>> index 660a9f2c0ded..c536de10d8b8 100644
>> --- a/sound/hda/codecs/generic.c
>> +++ b/sound/hda/codecs/generic.c
>> @@ -27,6 +27,10 @@
>> #include "hda_beep.h"
>> #include "generic.h"
>> +/* Forward declaration */
>> +static void call_mic_autoswitch(struct hda_codec *codec,
>> + struct hda_jack_callback *jack);
>> +
>> /**
>> * snd_hda_gen_spec_init - initialize hda_gen_spec struct
>> @@ -3238,6 +3242,19 @@ static int check_dyn_adc_switch(struct
>> hda_codec *codec)
>> if (!spec->dyn_adc_switch && spec->multi_cap_vol)
>> spec->num_adc_nids = 1;
>> + /* Enable mic autoswitch for dyn_adc_switch mode when auto_mic is
>> not available */
>> + if (!spec->auto_mic && imux->num_items > 1) {
>> + int i;
>> + for (i = 0; i < imux->num_items; i++) {
>> + hda_nid_t pin = spec->imux_pins[i];
>> + if (!is_jack_detectable(codec, pin))
>> + continue;
>> + snd_hda_jack_detect_enable_callback(codec, pin,
>> + call_mic_autoswitch);
>> + }
>> + codec_dbg(codec, "Enable mic autoswitch for input sources\n");
>> + }
> IMO, this should be rather put at auto_mic_check_imux() instead,
> something like:
>
> @@ -4789,13 +4789,15 @@ static bool auto_mic_check_imux(struct
> hda_codec *codec)
> const struct hda_input_mux *imux;
> int i;
> - imux = &spec->input_mux;
> - for (i = 0; i < spec->am_num_entries; i++) {
> - spec->am_entry[i].idx =
> - find_idx_in_nid_list(spec->am_entry[i].pin,
> - spec->imux_pins, imux->num_items);
> - if (spec->am_entry[i].idx < 0)
> - return false; /* no corresponding imux */
> + if (!spec->dyn_adc_switch) {
> + imux = &spec->input_mux;
> + for (i = 0; i < spec->am_num_entries; i++) {
> + spec->am_entry[i].idx =
> + find_idx_in_nid_list(spec->am_entry[i].pin,
> + spec->imux_pins, imux->num_items);
> + if (spec->am_entry[i].idx < 0)
> + return false; /* no corresponding imux */
> + }
> }
> /* we don't need the jack detection for the first pin */
>
In fact, auto_ic_check_imux cannot be executed on desktop computers at
all. You can take a look at the check_outo_ic_availability section
for (int i = 0; i < cfg->num_inputs; i++) {
hda_nid_t nid = cfg->inputs[i].pin;
unsigned int attr;
attr = snd_hda_codec_get_pincfg(codec, nid);
attr = snd_hda_get_input_pin_attr(attr);
if (types & (1 << attr)) For desktop computers, the rear mic
and line are an attr, which will be directly returned here.
return 0; /* already occupied */
}
>> return 0;
>> }
>> @@ -4107,9 +4124,38 @@ static int mux_select(struct hda_codec *codec,
>> unsigned int adc_idx,
>> path = get_input_path(codec, adc_idx, idx);
>> if (!path)
>> return 0;
>> - if (path->active)
>> - return 0;
>> - snd_hda_activate_path(codec, path, true, false);
>> + if (path->active) {
>> + codec_err(codec, "[MUX] mux_select: path already active, skip
>> activate but still notify\n");
>> + } else {
>> + snd_hda_activate_path(codec, path, true, false);
>> + }
>> +
>> + /* Notify Input Source / Capture Source controls that the path has
>> changed */
>> + if (!spec->auto_mic && spec->input_mux.num_items > 1) {
>> + struct snd_card *card = codec->card;
>> + struct snd_kcontrol *kctl;
>> + struct snd_ctl_elem_id id;
>> + int notified = 0;
>> +
>> + codec_err(codec, "[MUX] mux_select: notifying controls,
>> num_items=%d\n", spec->input_mux.num_items);
>> +
>> + if (card) {
>> + list_for_each_entry(kctl, &card->controls, list) {
>> + if (kctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER)
>> + continue;
>> + codec_err(codec, "[MUX] mux_select: found control '%s'\n",
>> kctl->id.name);
>> + if (strncmp(kctl->id.name, "Capture Source", 14) == 0) {
>> + id = kctl->id;
>> + snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &id);
>> + codec_err(codec, "[MUX] mux_select: notified '%s'\n", kctl->id.name);
>> + notified = 1;
>> + }
>> + }
>> + }
>> + if (!notified)
>> + codec_err(codec, "[MUX] mux_select: no Input/Capture Source control
>> found!\n");
>> + }
>> +
> Hmm, I can't follow the logic here. What does this code change try to
> achieve...?
If I open Alsamixer first without adding snd_ctl_notify, the ADC
switching caused
by inserting and unplugging mic will not notify Alsamixer in real time,
resulting
in asynchronous information and still retaining the state when it was
opened.
I will create another patch for this notification later to prevent
confusion in understanding.
>> if (spec->cap_sync_hook)
>> spec->cap_sync_hook(codec, NULL, NULL);
>> path_power_down_sync(codec, old_path);
>> @@ -4602,6 +4648,36 @@ static void call_mic_autoswitch(struct
>> hda_codec *codec,
>> struct hda_jack_callback *jack)
>> {
>> struct hda_gen_spec *spec = codec->spec;
>> + const struct hda_input_mux *imux;
>> + int i;
>> +
>> + /* Handle dyn_adc_switch mode - use imux_pins[] */
>> + if (!spec->auto_mic && spec->dyn_adc_switch) {
>> + imux = &spec->input_mux;
>> + if (imux->num_items <= 1)
>> + goto fallback;
>> +
>> + codec_err(codec, "[AUTO_MIC] call_mic_autoswitch: dyn_adc_switch
>> mode, checking %d inputs\n", imux->num_items);
>> +
>> + /* Search from back to front (last inserted wins) */
>> + for (i = imux->num_items - 1; i >= 0; i--) {
>> + hda_nid_t pin = spec->imux_pins[i];
>> + int det = is_jack_detectable(codec, pin);
>> + int state = snd_hda_jack_detect_state(codec, pin);
>> + codec_err(codec, "[AUTO_MIC] call_mic_autoswitch: imux[%d]
>> pin=0x%02x, det=%d, state=%s\n",
>> + i, pin, det, state == HDA_JACK_PRESENT ? "PRESENT" : "ABSENT");
>> + if (det && state == HDA_JACK_PRESENT) {
>> + codec_err(codec, "[AUTO_MIC] call_mic_autoswitch: switching to imux
>> %d\n", i);
>> + mux_select(codec, 0, i);
>> + return;
>> + }
>> + }
>> + /* No jack present, keep current selection (don't switch to imux 0) */
>> + codec_err(codec, "[AUTO_MIC] call_mic_autoswitch: no jack present,
>> keeping current\n");
>> + return;
>> + }
>> +
>> +fallback:
>> if (spec->mic_autoswitch_hook)
>> spec->mic_autoswitch_hook(codec, jack);
>> else
> Ditto. Something too complex here.
> mux_select() should handle the dynamic ADC switching, per se.
>
> And, with the auto-mic mode, the driver shouldn't expose the Capture
> Source mixer control. That said, enabling the auto-mic would have a
> clear downside for the user of PA/PW, too.
I have added a lot of debugging information here, which will be
simplified when submitting v2 later.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Fwd: [PATCH] ALSA: hda/generic: Add mic autoswitch support for dyn_adc_switch mode
2026-05-06 7:03 ` Fwd: [PATCH] ALSA: hda/generic: Add mic autoswitch support for dyn_adc_switch mode Zhang Heng
@ 2026-05-07 15:05 ` Takashi Iwai
2026-05-08 2:21 ` Zhang Heng
0 siblings, 1 reply; 4+ messages in thread
From: Takashi Iwai @ 2026-05-07 15:05 UTC (permalink / raw)
To: Zhang Heng; +Cc: perex, tiwai, linux-sound, linux-kernel
On Wed, 06 May 2026 09:03:52 +0200,
Zhang Heng wrote:
>
>
>
>
> -------- 转发的消息 --------
> 主题: Re: [PATCH] ALSA: hda/generic: Add mic autoswitch support for
> dyn_adc_switch mode
> 日期: Wed, 6 May 2026 14:19:14 +0800
> 发件人: Zhang Heng <zhangheng@kylinos.cn>
> 收件人: Takashi Iwai <tiwai@suse.de>
>
>
>
>
> 在 2026/5/5 0:25, Takashi Iwai 写道:
> > On Sun, 03 May 2026 13:45:12 +0200,
> > Zhang Heng wrote:
> >> When auto_mic is not available but dyn_adc_switch mode is enabled
> >> (e.g., on laptops with both front and rear mic jacks), this patch
> >> enables automatic microphone switching based on jack detection.
> >>
> >> The patch includes three changes:
> >>
> >> 1. In check_dyn_adc_switch(): Register jack detect callbacks for
> >> all input pins when dyn_adc_switch is enabled and auto_mic is
> >> not available.
> >>
> >> 2. In call_mic_autoswitch(): Add handling for dyn_adc_switch mode
> >> to check imux_pins[] for jack presence, searching from back to
> >> front (last inserted wins).
> >>
> >> 3. In mux_select(): Notify Capture Source controls after switching
> >> to sync with user-space (PulseAudio/PipeWire).
> >>
> >> Problem description:
> >> On Ubuntu 20.04 (with older PulseAudio/PipeWire):
> >> - Front mic is unplugged
> >> - Plug in rear mic
> >> - Jack event is reported correctly
> >> - Volume control (PulseAudio/PipeWire) recognizes the rear mic
> >> - But alsamixer does NOT switch to rear mic
> >> - Codec also does NOT perform the switch
> >>
> >> The root cause is that in dyn_adc_switch mode without auto_mic,
> >> the jack detect callback was not properly set up to trigger the
> >> mic autoswitch. The call_mic_autoswitch() function only calls
> >> mic_autoswitch_hook or snd_hda_gen_mic_autoswitch(), which rely
> >> on auto_mic being enabled.
> >>
> >> Additionally, after mux_select() performs the switch, user-space
> >> (PulseAudio/PipeWire) may not be aware of the path change,
> >> causing Capture Switch to show 'off'.
> >>
> >> This patch fixes both issues by:
> >> 1. Registering jack detect callbacks for all input pins in
> >> dyn_adc_switch mode
> >> 2. Notifying Capture Source controls after switching
> >>
> >> Tested on SN6186 codec with Ubuntu 20.04 and 25.10.
> >>
> >> Question to the community: Is this approach correct? Should additional
> >> changes be made to handle mute state preservation, or is this purely
> >> a user-space issue that requires updating PulseAudio/PipeWire?
> >>
> >> Testing and feedback are welcome.
> > I think the basic idea is OK. We can treat the auto-mic with dynamic
> > ADC switches, too.
> >
> > But it's not clear what's the actual intent in your code changes:
> >
> >
> >> Signed-off-by: Zhang Heng <zhangheng@kylinos.cn>
> >> ---
> >> sound/hda/codecs/generic.c | 82 ++++++++++++++++++++++++++++++++++++--
> >> 1 file changed, 79 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/sound/hda/codecs/generic.c b/sound/hda/codecs/generic.c
> >> index 660a9f2c0ded..c536de10d8b8 100644
> >> --- a/sound/hda/codecs/generic.c
> >> +++ b/sound/hda/codecs/generic.c
> >> @@ -27,6 +27,10 @@
> >> #include "hda_beep.h"
> >> #include "generic.h"
> >> +/* Forward declaration */
> >> +static void call_mic_autoswitch(struct hda_codec *codec,
> >> + struct hda_jack_callback *jack);
> >> +
> >> /**
> >> * snd_hda_gen_spec_init - initialize hda_gen_spec struct
> >> @@ -3238,6 +3242,19 @@ static int check_dyn_adc_switch(struct
> >> hda_codec *codec)
> >> if (!spec->dyn_adc_switch && spec->multi_cap_vol)
> >> spec->num_adc_nids = 1;
> >> + /* Enable mic autoswitch for dyn_adc_switch mode when auto_mic is
> >> not available */
> >> + if (!spec->auto_mic && imux->num_items > 1) {
> >> + int i;
> >> + for (i = 0; i < imux->num_items; i++) {
> >> + hda_nid_t pin = spec->imux_pins[i];
> >> + if (!is_jack_detectable(codec, pin))
> >> + continue;
> >> + snd_hda_jack_detect_enable_callback(codec, pin,
> >> + call_mic_autoswitch);
> >> + }
> >> + codec_dbg(codec, "Enable mic autoswitch for input sources\n");
> >> + }
> > IMO, this should be rather put at auto_mic_check_imux() instead,
> > something like:
> >
> > @@ -4789,13 +4789,15 @@ static bool auto_mic_check_imux(struct
> > hda_codec *codec)
> > const struct hda_input_mux *imux;
> > int i;
> > - imux = &spec->input_mux;
> > - for (i = 0; i < spec->am_num_entries; i++) {
> > - spec->am_entry[i].idx =
> > - find_idx_in_nid_list(spec->am_entry[i].pin,
> > - spec->imux_pins, imux->num_items);
> > - if (spec->am_entry[i].idx < 0)
> > - return false; /* no corresponding imux */
> > + if (!spec->dyn_adc_switch) {
> > + imux = &spec->input_mux;
> > + for (i = 0; i < spec->am_num_entries; i++) {
> > + spec->am_entry[i].idx =
> > + find_idx_in_nid_list(spec->am_entry[i].pin,
> > + spec->imux_pins, imux->num_items);
> > + if (spec->am_entry[i].idx < 0)
> > + return false; /* no corresponding imux */
> > + }
> > }
> > /* we don't need the jack detection for the first pin */
> >
> In fact, auto_ic_check_imux cannot be executed on desktop computers at
> all. You can take a look at the check_outo_ic_availability section
> for (int i = 0; i < cfg->num_inputs; i++) {
> hda_nid_t nid = cfg->inputs[i].pin;
> unsigned int attr;
> attr = snd_hda_codec_get_pincfg(codec, nid);
> attr = snd_hda_get_input_pin_attr(attr);
> if (types & (1 << attr)) For desktop computers, the rear
> mic and line are an attr, which will be directly returned here.
Do you mean that the mic is no built-in mic? If so, the auto-mic
isn't the way to go.
The driver can't judge which one has a higher priority between an mic
jack and a line jack. OTOH, in the case of built-in mic vs mic jack,
it's clear who should win, and the driver provides the auto-mic
feature. So, unless this condition is met, leaving the choice to
user-space is the designed behavior.
thanks,
Takashi
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Fwd: [PATCH] ALSA: hda/generic: Add mic autoswitch support for dyn_adc_switch mode
2026-05-07 15:05 ` Takashi Iwai
@ 2026-05-08 2:21 ` Zhang Heng
2026-05-08 2:50 ` Zhang Heng
0 siblings, 1 reply; 4+ messages in thread
From: Zhang Heng @ 2026-05-08 2:21 UTC (permalink / raw)
To: Takashi Iwai; +Cc: perex, tiwai, linux-sound, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 0 bytes --]
[-- Attachment #2: reply.txt --]
[-- Type: text/plain, Size: 3808 bytes --]
My idea is to dynamically switch ADC connections to different input pins.
For desktop designs, sometimes there is only one ADC or no ADC that can
connect to all input pins. For example, my SN6186:
Node 0x13 [Audio Input] wcaps 0x10051b: Stereo Amp-In
Control: name="Capture Volume", index=0, device=0
ControlAmp: chs=3, dir=In, idx=1, ofs=0
Control: name="Capture Switch", index=0, device=0
ControlAmp: chs=3, dir=In, idx=1, ofs=0
Device: name="SN6186 Analog", type="Audio", device=0
Amp-In caps: ofs=0x4a, nsteps=0x50, stepsize=0x03, mute=1
Amp-In vals: [0x80 0x80] [0x50 0x50] [0x50 0x50] [0x80 0x80] [0x80 0x80]
Converter: stream=1, channel=0
SDI-Select: 0
PCM:
rates [0x540]: 48000 96000 192000
bits [0xe]: 16 20 24
formats [0x1]: PCM
Power states: D0 D1 D2 D3 EPSS
Power: setting=D0, actual=D0
Connection: 5
0x18 0x24 0x19* 0x25 0x1f
Node 0x14 [Audio Input] wcaps 0x10051b: Stereo Amp-In
Amp-In caps: ofs=0x4a, nsteps=0x50, stepsize=0x03, mute=1
Amp-In vals: [0x80 0x80] [0x50 0x50] [0x80 0x80] [0x80 0x80] [0x80 0x80]
Converter: stream=0, channel=0
SDI-Select: 0
PCM:
rates [0x540]: 48000 96000 192000
bits [0xe]: 16 20 24
formats [0x1]: PCM
Power states: D0 D1 D2 D3 EPSS
Power: setting=D0, actual=D0
Connection: 5
0x18* 0x1a 0x24 0x25 0x1f
On this machine, 0x1a is LINE IN, 0x19 is Mic, 0x24 is Rear Mic.
Therefore, a "Capture Source" control is generated.
After deleting the current user config and rebooting (rm -rf ~/.config/pulse/*
~/.config/audio.json, Ubuntu 20.04 does not need to delete user config
to reproduce this issue), this situation occurs: even after inserting
the rear mic or LINE, neither alsamixer nor the codec switches to the
corresponding input path.
Node 0x19 [Pin Complex] wcaps 0x40048b: Stereo Amp-In
Amp-In caps: ofs=0x00, nsteps=0x07, stepsize=0x17, mute=1
Amp-In vals: [0x06 0x06]
Pincap 0x00003324: IN Detect
Vref caps: HIZ 50 80 100
Pin Default 0x02a1104e: [Jack] Mic at Ext Front
Conn = 1/8, Color = Black
DefAssociation = 0x4, Sequence = 0xe
Pin-ctls: 0x25: IN VREF_100
Unsolicited: tag=03, enabled=1
Power states: D0 D1 D2 D3 EPSS
Power: setting=D0, actual=D0
Node 0x24 [Pin Complex] wcaps 0x40058b: Stereo Amp-In
Amp-In caps: ofs=0x00, nsteps=0x07, stepsize=0x17, mute=1
Amp-In vals: [0x80 0x80]
Pincap 0x00013334: IN OUT EAPD Detect
Vref caps: HIZ 50 80 100
EAPD 0x0:
Pin Default 0x01a19040: [Jack] Mic at Ext Rear
Conn = 1/8, Color = Pink
DefAssociation = 0x4, Sequence = 0x0
Pin-ctls: 0x24: IN VREF_80
Unsolicited: tag=04, enabled=1
Power states: D0 D1 D2 D3 EPSS
Power: setting=D0, actual=D0
Connection: 3
0x10* 0x11 0x23
The information below will always be preserved. Even after inserting
the rear mic and rechecking the codec info, it remains the same.
This is related to upper-layer design, but I have no research in this
area, so I am very confused. My opinion is that the kernel should at
least support dynamic switching of ADC and paths. If user-space handles
this, could you please let me know which component?
In create_capture_mixers:
- if (spec->dyn_adc_switch)
- nums = 1;
- else
nums = spec->num_adc_nids;
After this, dynamic switching works. Although the generated control is
forced to "Input Source", at least it is usable. So the next step is
to look at this part of the code.
I have another desktop with SN6186 that has only one ADC capable of
connecting to all input pins, which results in nums=1, so the generated
control is still "Capture Source"...
Due to my lack of understanding of the upper layer, I really do not
know whether this should be handled by the kernel or user-space. But
I will first examine the kernel's handling of this with a critical eye.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Fwd: [PATCH] ALSA: hda/generic: Add mic autoswitch support for dyn_adc_switch mode
2026-05-08 2:21 ` Zhang Heng
@ 2026-05-08 2:50 ` Zhang Heng
0 siblings, 0 replies; 4+ messages in thread
From: Zhang Heng @ 2026-05-08 2:50 UTC (permalink / raw)
To: Takashi Iwai; +Cc: perex, tiwai, linux-sound, linux-kernel
I tested this change:
In create_capture_mixers in generic.c:
- name = nums > 1 ? "Input Source" : "Capture Source";
+ name = "Input Source";
And it also works normally. It seems that user-space does not handle
"Capture Source" very well. So should we just remove "Capture Source"?
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-05-08 2:50 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <5b215802-4c94-4f94-9cee-f8e497b31337@kylinos.cn>
2026-05-06 7:03 ` Fwd: [PATCH] ALSA: hda/generic: Add mic autoswitch support for dyn_adc_switch mode Zhang Heng
2026-05-07 15:05 ` Takashi Iwai
2026-05-08 2:21 ` Zhang Heng
2026-05-08 2:50 ` Zhang Heng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox