在我的 RasPi 板 Debian Linux 上,USB 麦克风偶尔会被锁定,以至于没有人可以使用它。麦克风有一个 LED,它通常会闪烁,当它锁定时,它会关闭。
该实用程序arecord对其进行了如下描述:
card 1: Device [DYNEX USB MIC Device], device 0:USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
Run Code Online (Sandbox Code Playgroud)
当麦克风停止工作时,arecord给出如下诊断:
> arecord -D plughw:1,0 > recording.wav
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
arecord: set_params:1145: Unable to install hw_params:
ACCESS: RW_INTERLEAVED
FORMAT: U8
etc...
Run Code Online (Sandbox Code Playgroud)
拔下和插入麦克风修复它,只是因为当前的下降迫使 RasPi 重新启动!不是理想的情况。
有没有办法从命令行或 C 可执行文件解决这个问题?
我还尝试使用ioctl(fd, USBDEVFS_RESET, 0)from 的输出lsusb来提供总线和设备编号。这会使 LED 重新亮起,但这太过分了。必须使用 alsamixer 重新设置设备。
我有一个 USB 音频设备,配置为卡 0 的默认设备。
我有一个 3rd 方应用程序试图播放 wav 文件,但失败并显示以下内容:
Playing WAVE 'sound.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
aplay: set_params:1239: Channels count non available
Run Code Online (Sandbox Code Playgroud)
如果我尝试手动播放相同的 wav,我不会出错,但也没有声音:
aplay sound.wav
Playing WAVE 'sound.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
Run Code Online (Sandbox Code Playgroud)
如果我指定 device plughw:0,0,声音播放正确!
aplay -D plughw:0,0 sound.wav
Playing WAVE 'sound.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
Run Code Online (Sandbox Code Playgroud)
我尝试了各种尝试将配置~/.asoundrc设置plughw:0,0为默认值,但没有成功。
如何-D plughw:0,0将默认设置应用于所有声音播放?
aplay每当用户与界面交互时,我都会播放简短的音效。
我注意到的是,我可以按任何顺序播放任何声音,只要两个声音在 5 秒内播放,过渡就很清晰,但如果间隔超过 5 秒,就会出现可怕的爆裂声!
请注意,我所有的声音文件的持续时间都小于 1 秒。
为了解决这个问题,我所做的是创建一个 5 秒长的低采样率 silent.wav 文件,该文件在 .sh 脚本中循环(这绝对不是一个长期解决方案):
无声的蛮力:
#!/bin/bash
while [ 1 ] ; do
aplay sounds/blank.wav
done
Run Code Online (Sandbox Code Playgroud)
爆裂声现在很少,如果有的话。
所以我想不通的是,为什么在这 5 秒内发生了一些变化以导致爆裂声?如何配置我的音频以保持长时间延迟播放声音时不会弹出的状态?
我已经尝试过 /etc/pulse/default.pa 和 /etc/pulse/daemon.config 但取得了零进展。
请注意,我使用的是单核 raspberry pi,但是如果通过静音进行暴力破解有帮助,那么还有希望吗??
[更新]
我遇到了一种稍微更优雅的方法来持续对设备进行暴力静音:
aplay /dev/zero
Playing raw data '/dev/zero' : Unsigned 8 bit, Rate 8000 Hz, Mono
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,它会产生高频音调。是否有类似的方法可以做到这一点?
[更新]
aplay -r 8000 -f S16_LE /dev/zero
Run Code Online (Sandbox Code Playgroud)
这样做可以解决问题,不断运行线程以保持打开状态的一些开销。但是现在非常干净的音频。
[编辑]
此功能与pulseaudio模块module-suspend-on-idle有关。也可以禁用此模块。先尝试临时:
pactl unload-module module-suspend-on-idle
Run Code Online (Sandbox Code Playgroud)
如果您满意,那么您可以在pulseaudio 配置文件中临时设置此设置。
我有使用 USB 进行交互的硬件。它是一个USB声卡 配置文件需要这样的:
devstr=1-1.3.1:1.0
Run Code Online (Sandbox Code Playgroud)
lsusb看起来像这样:
Bus 001 Device 004: ID 0d8c:0012 C-Media Electronics, Inc.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Run Code Online (Sandbox Code Playgroud)
我需要Bus 001 Device 004: ID 0d8c:0012 C-Media Electronics, Inc. to在配置文件中引用此设备。
更新 这里是/var/log/messages(重启后)
Nov 17 12:33:52 44249 kernel: [ 3.658983] usb 1-1.2: New USB device found, idVendor=0d8c, idProduct=0012 …Run Code Online (Sandbox Code Playgroud)