select 使用 QSoundEffect 时的音频输出驱动

select audio output divece when using QSoundEffect

我正在使用 QSoundEffect 循环播放一些 .wav 短文件。这个 class 是我的解决方案,因为它允许我们播放低延迟声音。

一切都很好,但现在我需要 select 输出设备,但我还没有找到使用 QSoundEffect 执行此操作的方法。我知道使用 QAudioDeviceInfo 我可以获得可用设备的列表并在 QAudioOutput 对象的构造函数中使用其中一个来播放 wav 文件但是 QAudioOutput 不允许我们制作低延迟循环。

所以问题是我需要 select 音频输出设备的功能 QAudioOutputQAudioDeviceInfo 但播放低延迟循环的能力 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();