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 = 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
|
||||||
|
@@ -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 };
|
||||||
};
|
};
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user