lsnes/libgambatte-patches/svn537/0004-Fix-sound-DC-levels.patch

109 lines
4.6 KiB
Diff

From 607d3e252c43d67cea54ec222ef1767a86b3660b Mon Sep 17 00:00:00 2001
From: Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
Date: Thu, 5 Dec 2013 08:48:21 +0200
Subject: [PATCH 4/5] Fix sound DC levels
This was causing popping in Mega Man (I)
---
libgambatte/src/sound/channel1.cpp | 6 +++---
libgambatte/src/sound/channel2.cpp | 6 +++---
libgambatte/src/sound/channel3.cpp | 8 ++++----
libgambatte/src/sound/channel4.cpp | 4 ++--
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/libgambatte/src/sound/channel1.cpp b/libgambatte/src/sound/channel1.cpp
index c517965..dd83894 100644
--- a/libgambatte/src/sound/channel1.cpp
+++ b/libgambatte/src/sound/channel1.cpp
@@ -218,13 +218,13 @@ void Channel1::loadState(SaveState const &state) {
void Channel1::update(uint_least32_t *buf, unsigned const soBaseVol, unsigned cycles) {
unsigned const outBase = envelopeUnit_.dacIsOn() ? soBaseVol & soMask_ : 0;
- unsigned const outLow = outBase * (0 - 15ul);
unsigned const endCycles = cycleCounter_ + cycles;
for (;;) {
unsigned const outHigh = master_
- ? outBase * (envelopeUnit_.getVolume() * 2 - 15ul)
- : outLow;
+ ? outBase * (envelopeUnit_.getVolume())
+ : 0;
+ unsigned const outLow = -outHigh;
unsigned const nextMajorEvent = std::min(nextEventUnit_->counter(), endCycles);
unsigned out = dutyUnit_.isHighState() ? outHigh : outLow;
diff --git a/libgambatte/src/sound/channel2.cpp b/libgambatte/src/sound/channel2.cpp
index f154249..6024d79 100644
--- a/libgambatte/src/sound/channel2.cpp
+++ b/libgambatte/src/sound/channel2.cpp
@@ -122,13 +122,13 @@ void Channel2::loadState(SaveState const &state) {
void Channel2::update(uint_least32_t *buf, unsigned const soBaseVol, unsigned cycles) {
unsigned const outBase = envelopeUnit_.dacIsOn() ? soBaseVol & soMask_ : 0;
- unsigned const outLow = outBase * (0 - 15ul);
unsigned const endCycles = cycleCounter_ + cycles;
for (;;) {
unsigned const outHigh = master_
- ? outBase * (envelopeUnit_.getVolume() * 2 - 15ul)
- : outLow;
+ ? outBase * (envelopeUnit_.getVolume())
+ : 0;
+ unsigned const outLow = -outHigh;
unsigned const nextMajorEvent = std::min(nextEventUnit->counter(), endCycles);
unsigned out = dutyUnit_.isHighState() ? outHigh : outLow;
diff --git a/libgambatte/src/sound/channel3.cpp b/libgambatte/src/sound/channel3.cpp
index c583949..f25c96d 100644
--- a/libgambatte/src/sound/channel3.cpp
+++ b/libgambatte/src/sound/channel3.cpp
@@ -156,8 +156,8 @@ void Channel3::update(uint_least32_t *buf, unsigned const soBaseVol, unsigned cy
unsigned const nextMajorEvent =
std::min(lengthCounter_.counter(), endCycles);
unsigned out = master_
- ? ((sampleBuf_ >> (~wavePos_ << 2 & 4) & 0xF) >> rshift_) * 2 - 15ul
- : 0 - 15ul;
+ ? ((sampleBuf_ >> (~wavePos_ << 2 & 4) & 0xF) >> rshift_) * 2 - (15 >> rshift_)
+ : 0;
out *= outBase;
while (waveCounter_ <= nextMajorEvent) {
@@ -171,7 +171,7 @@ void Channel3::update(uint_least32_t *buf, unsigned const soBaseVol, unsigned cy
++wavePos_;
wavePos_ &= 0x1F;
sampleBuf_ = waveRam_[wavePos_ >> 1];
- out = ((sampleBuf_ >> (~wavePos_ << 2 & 4) & 0xF) >> rshift_) * 2 - 15ul;
+ out = ((sampleBuf_ >> (~wavePos_ << 2 & 4) & 0xF) >> rshift_) * 2 - (15 >> rshift_);
out *= outBase;
}
@@ -188,7 +188,7 @@ void Channel3::update(uint_least32_t *buf, unsigned const soBaseVol, unsigned cy
break;
}
} else {
- unsigned const out = outBase * (0 - 15ul);
+ unsigned const out = 0;
*buf += out - prevOut_;
prevOut_ = out;
cycleCounter_ += cycles;
diff --git a/libgambatte/src/sound/channel4.cpp b/libgambatte/src/sound/channel4.cpp
index bc0a312..0abd4fb 100644
--- a/libgambatte/src/sound/channel4.cpp
+++ b/libgambatte/src/sound/channel4.cpp
@@ -224,11 +224,11 @@ void Channel4::loadState(SaveState const &state) {
void Channel4::update(uint_least32_t *buf, unsigned const soBaseVol, unsigned cycles) {
unsigned const outBase = envelopeUnit_.dacIsOn() ? soBaseVol & soMask_ : 0;
- unsigned const outLow = outBase * (0 - 15ul);
unsigned const endCycles = cycleCounter_ + cycles;
for (;;) {
- unsigned const outHigh = outBase * (envelopeUnit_.getVolume() * 2 - 15ul);
+ unsigned const outHigh = outBase * (envelopeUnit_.getVolume());
+ unsigned const outLow = -outHigh;
unsigned const nextMajorEvent = std::min(nextEventUnit_->counter(), endCycles);
unsigned out = lfsr_.isHighState() ? outHigh : outLow;
--
1.9.rc1