ALSA:将"Dsnoop"型与"fifo"型相结合



我正试图让我的Linux音频系统通过ALSA处理音频。这些是的要求

  1. 处理回声消除-我正在使用https://github.com/voice-engine/ec,遵循上述步骤,它可以独立工作,没有问题
  2. 将回声消除流除以2
  3. 一个进入降噪插件的插件再次独立工作,它的音频输出由不同的程序使用
  4. 另一个到压缩器,这个音频输出将是默认设备

问题

我在使用";dsnoop";以将音频流分成两部分。当dsnoop-plugins的slave被设置为FIFO时,它会抛出一个错误。

已执行:

sudo arecord -D default -f cd defRecording.wav -c 1 -r 32000

错误:

ALSA lib pcm_direct.c:1809:(_snd_pcm_direct_get_slave_ipc_offset) Invalid type 'fifo' for slave PCM
arecord: main:828: audio open error: Invalid argument

这是当前的asound.conf设置

asound.conf

pcm.!default {
type asym
playback.pcm "playback"
capture.pcm "capture"
}
pcm.playback {
type plug
slave.pcm "eci"
}
# Stream Output 1: Final
pcm.capture {
type plug
slave.pcm "compressor"
}
# Stream Output 2: Final
pcm.capture2 {
type plug
slave.pcm "werman"
}
# Stream output 2: Noise Cancellation
pcm.werman {
type ladspa
slave.pcm "array";
path "/usr/lib/ladspa";
plugins [{
label noise_suppressor_mono
input {
# VAD Threshold %
controls [ 1  ]
}
}]
}
# Stream output 1: Compressor
pcm.compressor {
type ladspa
slave.pcm "array";
path "/usr/lib/ladspa";
plugins [{
label dysonCompress
input {
#peak limit, release time, fast ratio, ratio
controls [0 1 0.5 0.99]
}
}]
}
# Used to share the record device
pcm.array {
type dsnoop
slave {
pcm "eco"
channels 1
}
ipc_key 666666
}
# Writes audio coming from any sort of player to ec.input, this is read by the echo
# cancellation software.
pcm.eci {
type plug
slave {
format S16_LE
rate 32000
channels 1
pcm {
type file
slave.pcm null
file "/tmp/ec.input"
format "raw"
}
}
}
# Read FIFO output which contains echo cancelled audio
pcm.eco {
type plug
slave.pcm {
type fifo
infile "/tmp/ec.output"
rate 32000
format S16_LE
channels 1
}
#ipc_key 666666
}

注:eco用于读取FIFO文件,该文件包含来自取消软件的回声取消音频。该软件的输入是hw:0,直接从麦克风记录音频,然后处理并将其传递给ec.output

当slave.pcm是一个硬件设备时,Dsnoop工作得很好,但一旦我指向其他设备,它就会失败。是否有解决此问题的变通方法或任何其他解决方案?

Dsnoop只能有一个硬件从属,因此不能将FIFO插件作为输入。为了解决这个问题,我让回声消除软件将数据输出到两个不同的FIFO文件中,然后通过ALSA读取。

相关内容

  • 没有找到相关文章

最新更新