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 = m_lowPassFilter.doFiltering(audioDcY);// 14 KHz
audioDcY = std::clamp(audioDcY, double(-EmuSettings::Audio::internalPeekLimit), double(EmuSettings::Audio::internalPeekLimit)); audioDcY = std::clamp(audioDcY, double(-EmuSettings::Audio::internalPeekLimit), double(EmuSettings::Audio::internalPeekLimit));
Q_EMIT sampleFinished(audioDcY); m_samples.append(audioDcY);
m_audioY = 0; m_audioY = 0;
m_audioYClocks = 0; m_audioYClocks = 0;
@@ -499,9 +499,11 @@ void Apu::readState(QDataStream &dataStream)
m_dmc.apuDmcReadState(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 bool Apu::oddCycle() const

View File

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

View File

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

View File

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