我正在编写一个模拟器,需要我不断地将生成的原始音频样本推送到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。我该怎么做?