2012-08-22 2 views
0

내가 이렇게 내 코드에서 오디오를 재생하고 있습니다 : 디코더 루틴이 무거운 때문에메인 스레드에서 QAudioOutput :: start()를 호출해야합니까?

// decode routine 

QAudioFormat format; 
format.setFrequency(aCodecCtx->sample_rate); 
format.setChannels(2); 
format.setSampleSize(16); 
format.setCodec("audio/pcm"); 
format.setByteOrder(QAudioFormat::LittleEndian); 
format.setSampleType(QAudioFormat::SignedInt); 
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); 
if (!info.isFormatSupported(format)) { 
    cout<<"raw audio format not supported by backend, cannot play audio." <<endl; 
    format = info.nearestFormat(format); 
} 
QAudioOutput * audio = new QAudioOutput(format); 
connect(audio,SIGNAL(stateChanged(QAudio::State)),SLOT(stateChanged(QAudio::State))); 
if(!buffer->open(QBuffer::ReadWrite)) 
    cout << "Couldnt open Buffer" << endl; 
cout << "buffer.size()=" << buffer->size() <<endl; 
audio->start(buffer); 

나는 작업자 스레드에서이 코드를 실행했다. 그러나 소리가 들리지 않았습니다. 나는이 코드를 주 스레드로 옮겼고 모든 것이 잘 동작한다.

왜 이렇게됩니까? QAudioOutput 문서가 실행해야하는 스레드에 대해 아무 것도 말하지 않습니다.

답변

0

작업자 스레드에서 이벤트 루프를 시작하는 것을 잊었습니다. 그렇지 않으면 스레드가 종료되고 그 이유는 오디오가 재생되지 않습니다.

관련 문제