diff --git a/VBA.sln b/VBA.sln
index bc9d02eb..2e9c9bff 100644
--- a/VBA.sln
+++ b/VBA.sln
@@ -13,8 +13,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng\libpng.vcp
{34DC39BF-F93A-4573-85BF-789B90B63179} = {34DC39BF-F93A-4573-85BF-789B90B63179}
EndProjectSection
EndProject
-Project("{4CAA2610-1955-4629-BDC1-8133FE0B2087}") = "profiler", "..\profiler\profiler.aqt", "{7260A190-9B72-4227-B01C-29E53BA53413}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
diff --git a/VBA.vcproj b/VBA.vcproj
index d8954eff..63b67a77 100644
--- a/VBA.vcproj
+++ b/VBA.vcproj
@@ -1632,6 +1632,14 @@
+
+
+
rate(calc_rate(soundDSATimer));
+ interp[1]->rate(calc_rate(soundDSBTimer));
+}
+
void interp_reset(int ch)
{
setSoundFn();
-#ifdef ENHANCED_RATE
interp[ch]->reset();
-#else
- interp[ch]->reset(calc_rate(ch ? soundDSATimer : soundDSBTimer));
-#endif
+ interp_rate();
}
@@ -588,7 +592,6 @@ void soundEvent(u32 address, u16 data)
data &= 0xFF0F;
soundControl = data & 0x770F;;
if(data & 0x0800) {
- interp_reset(0);
soundDSFifoAWriteIndex = 0;
soundDSFifoAIndex = 0;
soundDSFifoACount = 0;
@@ -598,7 +601,6 @@ void soundEvent(u32 address, u16 data)
soundDSAEnabled = (data & 0x0300) ? true : false;
soundDSATimer = (data & 0x0400) ? 1 : 0;
if(data & 0x8000) {
- interp_reset(1);
soundDSFifoBWriteIndex = 0;
soundDSFifoBIndex = 0;
soundDSFifoBCount = 0;
@@ -607,7 +609,12 @@ void soundEvent(u32 address, u16 data)
}
soundDSBEnabled = (data & 0x3000) ? true : false;
soundDSBTimer = (data & 0x4000) ? 1 : 0;
- *((u16 *)&ioMem[address]) = data;
+ if (data & 0x8000)
+ {
+ interp_reset(0);
+ interp_reset(1);
+ }
+ *((u16 *)&ioMem[address]) = data;
break;
case FIFOA_L:
case FIFOA_H:
@@ -704,7 +711,6 @@ void soundDirectSoundATimer()
soundEvent(FIFOA_H, (u16)0);
}
}
-
soundDSAValue = (soundDSFifoA[soundDSFifoAIndex]);
interp_push(0, (s8)soundDSAValue << 8);
soundDSFifoAIndex = (++soundDSFifoAIndex) & 31;
diff --git a/src/Sound.h b/src/Sound.h
index 5a1ea3e2..d02d3838 100644
--- a/src/Sound.h
+++ b/src/Sound.h
@@ -96,5 +96,7 @@ extern Gb_Apu * apu;
extern const BOOST::uint8_t sound_data [Gb_Apu::register_count];
+extern void interp_rate();
+
#endif // VBA_SOUND_H
diff --git a/src/snd_interp.cpp b/src/snd_interp.cpp
index 193cb43c..06ccc352 100644
--- a/src/snd_interp.cpp
+++ b/src/snd_interp.cpp
@@ -202,20 +202,14 @@ public:
foo_null() : sample(0) {}
~foo_null() {}
-#ifdef ENHANCED_RATE
void reset() {}
-#endif
void push(int psample)
{
sample = psample;
}
-#ifdef ENHANCED_RATE
- int pop(double rate)
-#else
int pop()
-#endif
{
return sample;
}
@@ -240,14 +234,8 @@ public:
~foo_linear() {}
-#ifdef ENHANCED_RATE
void reset()
{
-#else
- void reset(double rate)
- {
- foo_interpolate::reset(rate);
-#endif
position = 0;
samples.clear();
}
@@ -258,14 +246,8 @@ public:
samples.push_back(sample);
}
-#ifdef ENHANCED_RATE
- int pop(double rate)
- {
- int lrate;
-#else
int pop()
{
-#endif
int ret;
if (position > 0x7fff)
@@ -281,18 +263,9 @@ public:
ret += smp(1) * position;
ret >>= 15;
-#ifdef ENHANCED_RATE
// wahoo, takes care of drifting
- if (samples.size() > 2)
- {
- rate += (.5 / 32768.);
- }
-
- lrate = (int)(32768. * rate);
-#else
if (samples.size() > 2)
position+=1;
-#endif
position += lrate;
return ret;
@@ -332,14 +305,8 @@ public:
samples.push_back(sample);
}
-#ifdef ENHANCED_RATE
- int pop(double rate)
- {
- int lrate;
-#else
int pop()
{
-#endif
int ret;
if (position > 0x7fff)
@@ -368,14 +335,8 @@ public:
// wahoo, takes care of drifting
if (samples.size() > 8)
{
-#ifdef ENHANCED_RATE
- rate += (.5 / 32768.);
- }
- lrate = (int)(32768. * rate);
-#else
position+=1;
}
-#endif
position += lrate;
return ret;
@@ -401,14 +362,8 @@ public:
~foo_fir() {}
-#ifdef ENHANCED_RATE
void reset()
{
-#else
- void reset(double rate)
- {
- foo_interpolate::reset(rate);
-#endif
position = 0;
samples.clear();
}
@@ -418,14 +373,8 @@ public:
samples.push_back(sample);
}
-#ifdef ENHANCED_RATE
- int pop(double rate)
- {
- int lrate;
-#else
int pop()
{
-#endif
int ret;
if (position > 0x7fff)
@@ -450,21 +399,11 @@ public:
if (ret > 32767) ret = 32767;
else if (ret < -32768) ret = -32768;
-#ifdef ENHANCED_RATE
// wahoo, takes care of drifting
- if (samples.size() > 16)
- {
- rate += (.5 / 32768.);
- }
-
- lrate = (int)(32768. * rate);
- position += lrate;
-#else
if (samples.size() > 16)
position+=1;
- position+=9929;
-#endif
+ position+=lrate;
return ret;
}
};
@@ -483,22 +422,11 @@ public:
~foo_libresample()
{
-#ifdef ENHANCED_RATE
reset();
-#else
- reset(1);
-#endif
-
}
-#ifdef ENHANCED_RATE
void reset()
{
-#else
- void reset(double rate)
- {
- foo_interpolate::reset(rate);
-#endif
samples.clear();
if (resampler)
{
@@ -512,13 +440,8 @@ public:
samples.push_back(float(sample));
}
-#ifdef ENHANCED_RATE
- int pop(double rate)
- {
-#else
int pop()
{
-#endif
int ret;
if (!resampler)
{
@@ -536,11 +459,7 @@ public:
in[used] = samples[used];
}
-#ifdef ENHANCED_RATE
- returned = resample_process(resampler, 1. / rate, in, count, 0, &used, &out, 1);
-#else
- returned = resample_process(resampler, lrate / 32767, in, count, 0, &used, &out, 1);
-#endif
+ returned = resample_process(resampler, 32767 / lrate, in, count, 0, &used, &out, 1);
if (used)
{
samples.erase(used);
diff --git a/src/snd_interp.h b/src/snd_interp.h
index 96efcc75..97a3377d 100644
--- a/src/snd_interp.h
+++ b/src/snd_interp.h
@@ -1,8 +1,8 @@
#ifndef __SND_INTERP_H__
#define __SND_INTERP_H__
-// simple interface that could easily be recycled
-#define ENHANCED_RATE
+#include
+#include
class foo_interpolate
{
@@ -10,24 +10,17 @@ public:
foo_interpolate() {}
virtual ~foo_interpolate() {};
-#ifdef ENHANCED_RATE
virtual void reset() = 0;
-#else
+
long lrate;
- virtual void reset(double rate)
+ virtual void rate(double rate)
{
lrate = (int)(32768. * rate);
};
-#endif
virtual void push(int sample) = 0;
-#ifdef ENHANCED_RATE
- virtual int pop(double rate) = 0;
-#else
virtual int pop() = 0;
-#endif
-
};
extern foo_interpolate * get_filter(int which);