я использую 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();