2015-04-08 15 views
5

Używam QSoundEffect do odtwarzania pętli niektórych krótkich plików .wav. Ta klasa była dla mnie rozwiązaniem, ponieważ pozwala nam grać dźwiękami o niskim opóźnieniu.Wybierz divece wyjścia audio przy użyciu QSoundEffect

Wszystko było w porządku, ale teraz muszę wybrać urządzenie wyjściowe, ale nie znalazłem sposobu, aby to zrobić z QSoundEffect. Wiem, że używając QAudioDeviceInfo mogę uzyskać listę dostępnych urządzeń i użyć jednego z nich w konstruktorze obiektu QAudioOutput do odtworzenia pliku wav, ale QAudioOutput nie pozwala nam tworzyć pętli o małym opóźnieniu.

Chodzi o to, że potrzebuję funkcji wyboru urządzenia wyjściowego audio, które ma QAudioOutput i QAudioDeviceInfo, ale możliwość grania w pętle o małym opóźnieniu, które oferuje QSoundEffect.

Innymi słowy Mam wszystkie elementy pożądanego rozwiązania, ale nie wiem, jak je połączyć.

Odpowiedz

1

Od Qt5.7 wtyczka alsa qt (libqtaudio_alsa.so) używa urządzenia "default", które można skonfigurować w /etc/asound.cfg lub ~/.asoundrc W poniższym przykładzie wybieram dmix wtyczkę jako urządzenie domyślne:

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

I rozwiązać ten problem czas temu z Qt 5.1.1 tak:

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(); 
Powiązane problemy