2015-04-08 2 views
5

Я использую QSoundEffect, чтобы воспроизвести петли некоторых коротких .wav файлов. Этот класс был для меня решением, потому что он позволяет нам играть с низкими латентными звуками.выберите аудиовыход divece при использовании QSoundEffect

Все было хорошо, но теперь мне нужно выбрать устройство вывода, но я не нашел способ сделать это с помощью QSoundEffect. Я знаю, что с помощью QAudioDeviceInfo я могу получить список доступных устройств и использовать один из них в конструкторе объекта QAudioOutput для воспроизведения wav-файла, но QAudioOutput не позволяет нам создавать петли с низкой задержкой.

Так дело в том, что мне нужна функциональность выбора устройства вывода звука, который QAudioOutput и QAudioDeviceInfo но способность играть играть низкую латентность петли, QSoundEffect предложения.

Другими словами, у меня есть все части моего желаемого решения, но я не знаю, как их собрать.

ответ

1

С 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 
} 
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(); 
Смежные вопросы