问题描述
我正在编写一个模拟器,要求我不断将生成的原始音频样本推送到QAudioOutput
。这是通过像这样将字节写入基础qiodevice
来实现的:
Qt_speaker::Qt_speaker()
{
QAudioFormat fmt;
fmt.setSampleRate(44100);
fmt.setChannelCount(1);
fmt.setSampleSize(sizeof(uint8_t)*8);
fmt.setCodec("audio/pcm");
fmt.setByteOrder(QAudioFormat::LittleEndian);
fmt.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(fmt)) {
qWarning() << "Raw audio format not supported by backend,cannot play audio.\n"
"If you're running a Debian system,try manually installing Qt's"
"multimedia plugins with\n"
"\t'sudo apt-get install libqt5multimedia5-plugins'";
toggle(false);
return;
}
output_ = new QAudioOutput(fmt,nullptr);
output_->setBufferSize(44100);
//connect(output_,SIGNAL(stateChanged(QAudio::State)),//this,SLOT(output_state_changed(QAudio::State)));
device_ = output_->start();
}
void Qt_speaker::push_samples(const gameboy::Raw_audio &a)
{
device_->write(reinterpret_cast<const char *>(a.data()),a.size());
}
我想跟踪排队的样本数,因为声音会加快仿真速度,因此会加快生成的原始音频样本的速度。尝试致电qiodevice::read()
总是返回0。我该怎么办?
解决方法
我认为您应该通知QAudioInput信号,以便根据QAudioInput“消耗”的样本进行操作。