select 使用 QSoundEffect 时的音频输出驱动
select audio output divece when using QSoundEffect
我正在使用 QSoundEffect
循环播放一些 .wav
短文件。这个 class 是我的解决方案,因为它允许我们播放低延迟声音。
一切都很好,但现在我需要 select 输出设备,但我还没有找到使用 QSoundEffect
执行此操作的方法。我知道使用 QAudioDeviceInfo
我可以获得可用设备的列表并在 QAudioOutput
对象的构造函数中使用其中一个来播放 wav 文件但是 QAudioOutput
不允许我们制作低延迟循环。
所以问题是我需要 select 音频输出设备的功能 QAudioOutput
和 QAudioDeviceInfo
但播放低延迟循环的能力 QSoundEffect
优惠。
换句话说,我拥有我想要的所有解决方案,但我不知道如何将它们组合在一起。
因为Qt5.7 alsa qt插件(libqtaudio_alsa.so)正在使用设备"default",你可以在/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();
我正在使用 QSoundEffect
循环播放一些 .wav
短文件。这个 class 是我的解决方案,因为它允许我们播放低延迟声音。
一切都很好,但现在我需要 select 输出设备,但我还没有找到使用 QSoundEffect
执行此操作的方法。我知道使用 QAudioDeviceInfo
我可以获得可用设备的列表并在 QAudioOutput
对象的构造函数中使用其中一个来播放 wav 文件但是 QAudioOutput
不允许我们制作低延迟循环。
所以问题是我需要 select 音频输出设备的功能 QAudioOutput
和 QAudioDeviceInfo
但播放低延迟循环的能力 QSoundEffect
优惠。
换句话说,我拥有我想要的所有解决方案,但我不知道如何将它们组合在一起。
因为Qt5.7 alsa qt插件(libqtaudio_alsa.so)正在使用设备"default",你可以在/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();