2012-04-06 8 views
7

Mi código actual es:¿Cómo usar QtMultimedia para reproducir un archivo wav?

void Sound::run() { 
    QFile audio_file(mResourcePath); 
    if(audio_file.open(QIODevice::ReadOnly)) { 
     audio_file.seek(44); // skip wav header 
     QByteArray audio_data = audio_file.readAll(); 
     audio_file.close(); 

     QBuffer* audio_buffer = new QBuffer(&audio_data); 
     qDebug() << audio_buffer->size(); 

     QAudioFormat format; 

     format.setSampleSize(16); 
     format.setSampleRate(44100); 
     format.setChannelCount(2); 
     format.setCodec("audio/pcm"); 
     format.setByteOrder(QAudioFormat::LittleEndian); 
     format.setSampleType(QAudioFormat::UnSignedInt); 

     QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); 
     if (!info.isFormatSupported(format)) { 
      qWarning()<<"raw audio format not supported by backend, cannot play audio."; 
      return; 
     } 
     qDebug() << info.deviceName(); 

     QAudioOutput* output = new QAudioOutput(info, format); 
     output->start(audio_buffer); 
    } 
} 

Esta cosa entera se inicia como un QRunnable en un QThreadPool y esa parte funciona bien. El problema es que nunca recibo ningún audio. Mi dispositivo de sonido está en funcionamiento, el buffer está lleno. No se lo que está mal. Yo uso app.exec(). Ayuda apreciada.

Respuesta

5
  1. El dispositivo (QBuffer) tiene que ser abierto:

    QBuffer audio_buffer(&audio_data);   
    audio_buffer.open(QIODevice::ReadOnly); 
    
  2. QAudioOutput necesita un bucle de eventos para reproducir cualquier cosa, y que bucle tiene que estar en ejecución en el hilo al que pertenece. Que es el hilo que fue creado cuando no se mueven de forma explícita a otro hilo:

    // Create the device and start playing... 
    QAudioOutput output(info, format); 
    output.start(&audio_buffer);  
    
    // ...then wait for the sound to finish 
    QEventLoop loop; 
    QObject::connect(&output, SIGNAL(stateChanged(QAudio::State)), &loop, SLOT(quit())); 
    do { 
        loop.exec();    
    } while(output.state() == QAudio::ActiveState);   
    
  3. Todo lo que se debe asignar desasignado cuando el sonido haya terminado de jugar, o que tendría una pérdida de memoria, y el bucle de evento ahora se ejecutará dentro de la función, por lo que puede asignar todo localmente.

Cuestiones relacionadas