# [Deepin 25] 控制中心「没有找到声音输入设备」——唯一输入端口被绑到耳机孔检测，未插外接麦即被视为不可用

> 本文为**脱敏版**报障草稿。所有个人信息（用户名、家目录、主机名、机型整机串、声卡 long_card_name、
> PulseAudio Cookie、邮件地址、截图）均已移除。发送前请再逐字过目一遍。

## 1. 问题概要

在仅有**单路输入端口**的笔记本上，该端口如果绑定了耳机孔麦克风检测（`Mic Jack`），
则**未插外接麦时该端口会被判为 `not available`**；Deepin 的音频服务只登记"可用"端口，
于是控制中心「声音 → 输入设备」与依赖系统设备列表的应用（如语音记事本）都得到**空清单**，
提示"没有找到声音输入设备"——**而此时内置麦克风其实存在且完全可用**。

## 2. 环境

| 项目 | 值 |
|---|---|
| 发行版 | Deepin 25 |
| 内核 | 6.18.48-amd64-desktop-rolling |
| 音频栈 | PipeWire（libpipewire 1.6.4）+ WirePlumber（libwireplumber 0.5.14），非 PulseAudio 原生 |
| 声卡 | HDA-Intel，codec **Realtek ALC256**（PCI 地址 `0000:c1:00.6`） |
| 平台 | AMD STX 系列笔记本（机型名已隐去） |
| 另有一路 | `acp-pdm-mach`（AMD ACP DMIC，见第 5 节） |

## 3. 复现步骤

1. 使用上述环境（单输入端口 + 该端口绑定 `Mic Jack` 的机型），**不插任何外接麦克风**。
2. 打开「控制中心 → 声音 → 输入」。
3. 观察：提示"没有找到声音输入设备"，输入设备列表为空。

对照实验：用 `pactl` 直接按设备名录音**可以正常录到声音**，说明采集通路是好的。

## 4. 证据链（逐层）

**① ALSA 层——唯一的输入端口被判为不可用：**

```
$ pactl list cards
        [In] Mic2: 立体声麦克风（Stereo Microphone）
                available: not available        # ← 关键
```

**② 该端口为何不可用——绑定了耳机孔检测：**

```
$ amixer -c<N> cget name="Mic Jack"
  values=off                                     # 未插外接麦
$ amixer -c<N> cget name="Internal Mic Phantom Jack"
  values=on                                      # 内置麦检测恒为 on
```

而 `/usr/share/alsa/ucm2/HDA/HiFi-mic.conf` 中：

```
Define.MicJackControl ""
...
	True.Define.MicJackControl "Mic Jack"        # ← 这里决定了端口可用性
```

`MicJackControl` 会作为 `DeviceMicJack` 传给各 `SectionDevice`，即**端口的可用性完全取决于
耳机孔检测**；本机唯一的输入端口（内置立体声麦）因此被一同判为不可用。

**③ 桌面服务层——空端口表：**

```
$ gdbus call --session --dest org.deepin.dde.Audio1 \
      --object-path /org/deepin/dde/Audio1 \
      --method org.freedesktop.DBus.Properties.Get org.deepin.dde.Audio1 Cards
# 结果：[In] Mic2 的 Direction/Enabled 未被登记为可用输入端口

$ cat ~/.config/deepin/dde-daemon/priorities.json
  "Input": { "Ports": {} }                       # ← 输入端口登记表为空
```

**④ 界面层：** 控制中心与语音记事本读到的就是这份空清单 → "没有找到声音输入设备"。

## 5. 附带发现：一路指向未驱动的 AMD ACP DMIC 的坏端口

同一 UCM 中 `HiFi-acp.conf` 定义了一个 `Digital Microphone` 设备，其

```
CapturePCM "hw:${var:AcpCardId}"
```

指向 `acp-pdm-mach`（AMD ACP DMIC）。本机该通路未被驱动
（`snd_sof_amd_acp70` 引用计数为 0），录音仅得到**恒定直流/饱和信号**（实测
DC offset ≈ −0.83、过零数接近 0），即一路**看似存在但只能产出垃圾数据**的输入设备。
建议：在该通路未就绪时不要把它注册为可选输入端口，或至少标记为不可用。

## 6. 建议修复

**A. UCM 侧（根因所在，`/usr/share/alsa/ucm2/HDA/HiFi-mic.conf`）**
对"内置麦与外接麦共用同一路 ADC、且唯一输入端口"的机型，可用性判据不应只绑
`Mic Jack`。可考虑：
- 当机器存在 `Internal Mic Phantom Jack` 时，把它纳入可用性判据（本项目采用的方案）；或
- 提供机型/quirks 覆盖机制，避免通用模板把"唯一输入端口"判死。

**B. 桌面服务/控制中心侧（容错）**
`dde-daemon` 在生成端口登记表时，若**所有输入端口都不可用但存在物理输入设备**，
不应输出空清单；控制中心也应给出可操作的提示（而非"没有找到声音输入设备"），
例如回退列出物理设备或提示检查插孔绑定。

## 7. 本项目采用的临时方案（已验证）

1. 以 `ALSA_CONFIG_UCM2` 指向 `~/.config/alsa/ucm2` 作为用户级 UCM 覆盖目录；
2. 在副本中把 `HiFi-mic.conf` 的
   `True.Define.MicJackControl "Mic Jack"`
   改为
   `True.Define.MicJackControl "Internal Mic Phantom Jack"`
   → 端口恢复 `available`；
3. 移除副本 `HiFi.conf` 中对 `HiFi-acp.conf` 的引用（隐去第 5 节那路坏端口）；
4. 收尾：`systemctl --user restart wireplumber` 后，端口、默认源、DDE 登记表**全部自动恢复**。

**验证结果：** 端口 `available`；`priorities.json` 自动重新登记 `[In] Mic2`；
录音实测 DC offset ≈ −0.02、过零数 4 万+、最大变化 2.6 万（真实声音）；
整条音频服务链重启后配置保持。

**还原方式：** 删除 `~/.config/alsa/ucm2` 与 `~/.config/environment.d/99-alsa-ucm2.conf`
即可回到发行版默认（本改动**不修改任何系统文件**）。

## 8. 相关记录

Deepin 论坛已有同类现象的报告（Realtek ALC233，机制相同：引脚检测恒为未插入 →
端口可用性恒为 not available → 控制中心隐藏输入设备）：
<https://bbs.deepin.org/post/300632>

本报告可作为该问题的**根因定位 + 通用修复建议**补充，并额外指出"唯一输入端口"这一
更窄也更致命的触发条件。
