2015-04-08 16 views
5

Sto utilizzando QSoundEffect per riprodurre loop di alcuni file .wav brevi. Questa classe è stata la soluzione per me perché ci consente di riprodurre suoni a bassa latenza.seleziona audio output divece quando si utilizza QSoundEffect

Tutto andava bene, ma ora ho bisogno di selezionare il dispositivo di uscita, ma non ho trovato il modo di farlo con QSoundEffect. So che usando QAudioDeviceInfo posso ottenere un elenco dei dispositivi disponibili e usarne uno nel costruttore di un oggetto QAudioOutput per riprodurre un file wav ma lo QAudioOutput non ci consente di creare loop a bassa latenza.

Quindi la cosa è che ho bisogno della funzionalità di selezione del dispositivo di uscita audio che QAudioOutput e QAudioDeviceInfo ma la capacità di giocare il gioco a bassa latenza cicli che QSoundEffect offerte.

In altre parole, ho tutti i pezzi della mia soluzione desiderata ma non so come metterli insieme.

risposta

1

A partire da Qt5.7 il plug-in alsqt (libqtaudio_alsa.so) utilizza il dispositivo "predefinito", questo è possibile configurare in /etc/asound.cfg o ~/.asoundrc Nell'esempio che segue sto selezionando dmix plug-in come dispositivo di default:

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

ho risolto questa volta fa problema con QT 5.1.1 in questo modo:

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(); 
Problemi correlati