Improved performance by reducing signals emitted for sound

This commit is contained in:
Daniel Brunner
2018-12-17 21:58:37 +01:00
parent cb45893c1e
commit f480276243
4 changed files with 15 additions and 11 deletions

View File

@@ -468,7 +468,7 @@ void Apu::updatePlayback()
audioDcY = m_lowPassFilter.doFiltering(audioDcY);// 14 KHz
audioDcY = std::clamp(audioDcY, double(-EmuSettings::Audio::internalPeekLimit), double(EmuSettings::Audio::internalPeekLimit));
Q_EMIT sampleFinished(audioDcY);
m_samples.append(audioDcY);
m_audioY = 0;
m_audioYClocks = 0;
@@ -499,9 +499,11 @@ void Apu::readState(QDataStream &dataStream)
m_dmc.apuDmcReadState(dataStream);
}
void Apu::setTimer(double timer)
void Apu::flush()
{
m_timer = timer;
m_timer = 0;
Q_EMIT samplesFinished(m_samples);
m_samples.clear();
}
bool Apu::oddCycle() const

View File

@@ -56,7 +56,7 @@ public:
void writeState(QDataStream &dataStream) const;
void readState(QDataStream &dataStream);
void setTimer(double timer);
void flush();
bool oddCycle() const;
@@ -92,7 +92,7 @@ public:
static const std::array<quint8, 32> m_sqDurationTable;
Q_SIGNALS:
void sampleFinished(qint32 sample);
void samplesFinished(const QVector<qint32> &samples);
private:
NesEmulator &m_emu;
@@ -145,5 +145,6 @@ private:
bool m_inputStrobe {};
QVector<qint32> m_samples;
qint32 m_sampleRate { 44100 };
};

View File

@@ -178,6 +178,6 @@ const Ppu &NesEmulator::ppu() const
void NesEmulator::frameFinished()
{
m_apu.setTimer(0.);
m_apu.flush();
m_frameFinished = true;
}

View File

@@ -45,20 +45,21 @@ int main(int argc, char **argv)
// Audio recorder
WaveRecorder recorder(1, emulator.apu().sampleRate(), "sound.wav");
QObject::connect(&emulator.apu(), &Apu::sampleFinished, &recorder, &WaveRecorder::addSample);
QObject::connect(&emulator.apu(), &Apu::samplesFinished, &recorder, &WaveRecorder::addSamples);
// Live audio playback
FifoStream stream;
QObject::connect(&emulator.apu(), &Apu::sampleFinished, [&stream](qint32 sample){
QObject::connect(&emulator.apu(), &Apu::samplesFinished, [&stream](const QVector<qint32> &samples){
QByteArray buf;
buf.reserve(sizeof(qint32));
buf.reserve(samples.size() * sizeof(qint32));
QDataStream dataStream(&buf, QIODevice::WriteOnly);
dataStream.setByteOrder(QDataStream::BigEndian);
dataStream << sample;
for(auto sample : samples)
dataStream << sample;
Q_ASSERT(buf.size() == sizeof(qint32));
Q_ASSERT(buf.size() == samples.size() * sizeof(qint32));
stream.write(buf);
});