我正在使用
QSoundEffect
循环播放一些短 .wav
文件。这个类是我的解决方案,因为它允许我们播放低延迟的声音。
一切都很好,但现在我需要选择输出设备,但我还没有找到使用
QSoundEffect
执行此操作的方法。我知道使用 QAudioDeviceInfo
我可以获取可用设备的列表,并在 QAudioOutput
对象的构造函数中使用其中之一来播放 wav 文件,但 QAudioOutput
不允许我们进行低延迟循环。
所以问题是,我需要选择
QAudioOutput
和QAudioDeviceInfo
的音频输出设备的功能,但需要QSoundEffect
提供的播放低延迟循环的功能。
换句话说,我拥有所需解决方案的所有部分,但我不知道如何将它们组合在一起。
从 Qt5.7 开始,alsa qt 插件 (libqtaudio_alsa.so) 使用“默认”设备,您可以在 /etc/asound.cfg 或 ~/.asoundrc 中配置 在下面的示例中,我选择 dmix 插件作为默认设备:
pcm.dmixed {
type dmix
ipc_key 1024
ipc_key_add_uid 0
slave.pcm "hw:0,0"
}
pcm.dsnooped {
type dsnoop
ipc_key 1025
slave.pcm "hw:0,0"
}
pcm.duplex {
type asym
playback.pcm "dmixed"
capture.pcm "dsnooped"
}
pcm.!default {
type plug
slave.pcm "duplex"
}
ctl.!default {
type hw
card 0
}
我之前用 QT 5.1.1 解决了这个问题,如下所示:
QByteArray audio_data;
inputFile.seek(44); // skip wav header
audio_data = inputFile.readAll();
for(int i=0;i<4;i++){
audio_data.append(audio_data);
}
QBuffer* audio_buffer = new QBuffer(&audio_data);
audio_buffer->open(QIODevice::ReadOnly);
audioOutput->start(audio_buffer);//start test playback
connect(audioOutput,SIGNAL(stateChanged(QAudio::State)),this,SLOT(finishedPlaying(QAudio::State)));
while(audioOutput->state() == QAudio::ActiveState){
qeloop.exec();
}
audio_data.clear();