Improved performance by reducing signals emitted for sound
This commit is contained in:
@@ -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
|
||||
|
@@ -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 };
|
||||
};
|
||||
|
@@ -178,6 +178,6 @@ const Ppu &NesEmulator::ppu() const
|
||||
|
||||
void NesEmulator::frameFinished()
|
||||
{
|
||||
m_apu.setTimer(0.);
|
||||
m_apu.flush();
|
||||
m_frameFinished = true;
|
||||
}
|
||||
|
@@ -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);
|
||||
});
|
||||
|
Reference in New Issue
Block a user