2015-04-08 5 views
5

Ich verwende QSoundEffect, um Loops einiger kurzer .wav Dateien wiederzugeben. Diese Klasse war die Lösung für mich, weil wir damit Latenz mit niedriger Latenz spielen können.Wählen Sie den Audioausgang aus, wenn Sie QSoundEffect verwenden

Alles war in Ordnung, aber jetzt muss ich das Ausgabegerät auswählen, aber ich habe nicht den Weg gefunden, dies mit QSoundEffect zu tun. Ich weiß, dass mit QAudioDeviceInfo Ich kann eine Liste der verfügbaren Geräte und verwenden Sie eine von ihnen im Konstruktor eines QAudioOutput Objekts, um eine WAV-Datei zu spielen, aber QAudioOutput ermöglicht es uns nicht, Low-Latenz-Schleifen zu machen.

So ist die Sache, dass ich die Funktionalität der Auswahl des Audioausgabegerätes benötigen, die QAudioOutput und QAudioDeviceInfo aber die Fähigkeit, spielen Low-Latency-Loops, die QSoundEffect Angebote zu spielen.

Mit anderen Worten, ich habe alle Teile meiner gewünschten Lösung, aber ich weiß nicht, wie man sie zusammenfügt.

Antwort

1

Seit Qt5.7 verwendet das alsa qt Plugin (libqtaudio_alsa.so) das Gerät "default", das können Sie in /etc/asound.cfg oder ~/.asoundrc konfigurieren. Im Beispiel unten wähle ich dmix Plugin als Standardgerät:

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

ich löste vor diesem Problem Zeit mit QT 5.1.1 wie folgt aus:

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(); 
Verwandte Themen