diff --git a/nescorelib/emu/apu.cpp b/nescorelib/emu/apu.cpp index 3adf916..93cdb73 100644 --- a/nescorelib/emu/apu.cpp +++ b/nescorelib/emu/apu.cpp @@ -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 diff --git a/nescorelib/emu/apu.h b/nescorelib/emu/apu.h index 9a88918..cbe361a 100644 --- a/nescorelib/emu/apu.h +++ b/nescorelib/emu/apu.h @@ -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 m_sqDurationTable; Q_SIGNALS: - void sampleFinished(qint32 sample); + void samplesFinished(const QVector &samples); private: NesEmulator &m_emu; @@ -145,5 +145,6 @@ private: bool m_inputStrobe {}; + QVector m_samples; qint32 m_sampleRate { 44100 }; }; diff --git a/nescorelib/nesemulator.cpp b/nescorelib/nesemulator.cpp index 3814f95..4d69f03 100644 --- a/nescorelib/nesemulator.cpp +++ b/nescorelib/nesemulator.cpp @@ -178,6 +178,6 @@ const Ppu &NesEmulator::ppu() const void NesEmulator::frameFinished() { - m_apu.setTimer(0.); + m_apu.flush(); m_frameFinished = true; } diff --git a/nesemu/main.cpp b/nesemu/main.cpp index 426cbf1..f790edb 100644 --- a/nesemu/main.cpp +++ b/nesemu/main.cpp @@ -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 &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); });