summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Src/Mixer.cpp
diff options
context:
space:
mode:
authormylek4 <mylek4@gmail.com>2010-11-12 03:39:07 +0000
committermylek4 <mylek4@gmail.com>2010-11-12 03:39:07 +0000
commit67f850dd37893de6ef1544b024ea298033047dfd (patch)
treec722013098f6b982b06a7f7a422541a36ea5cc13 /Source/Core/AudioCommon/Src/Mixer.cpp
parentc6d95c90876ed03768092a0385821b7d47135fea (diff)
DSPHLE: Added an option for 48khz output and supporting upsampling code.
Games that have higher frequency sounds and music should sound a bit better using 48k. I don't have any games that use DTKMusic so that upsampling code untested. If you get strange sounds only at 48k try toggling dtk music to see if that isolates the problem and let me know. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6383 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/AudioCommon/Src/Mixer.cpp')
-rw-r--r--Source/Core/AudioCommon/Src/Mixer.cpp111
1 files changed, 38 insertions, 73 deletions
diff --git a/Source/Core/AudioCommon/Src/Mixer.cpp b/Source/Core/AudioCommon/Src/Mixer.cpp
index b4f1be935d..d914f634c5 100644
--- a/Source/Core/AudioCommon/Src/Mixer.cpp
+++ b/Source/Core/AudioCommon/Src/Mixer.cpp
@@ -57,74 +57,39 @@ unsigned int CMixer::Mix(short* samples, unsigned int numSamples)
samples[i] = Common::swap16(m_buffer[(m_indexR + i) & INDEX_MASK]);
m_indexR += numLeft * 2;
}
- else
+ else //linear interpolation
{
- // AyuanX: Up-sampling is not implemented yet
- PanicAlert("Mixer: Up-sampling is not implemented yet!");
-/*
- static int PV1l=0,PV2l=0,PV3l=0,PV4l=0;
- static int PV1r=0,PV2r=0,PV3r=0,PV4r=0;
- static int acc=0;
-
- while (num_stereo_samples) {
- acc += core_sample_rate;
- while (num_stereo_samples && (acc >= 48000)) {
- PV4l=PV3l;
- PV3l=PV2l;
- PV2l=PV1l;
- PV1l=*(samples++); //32bit processing
- PV4r=PV3r;
- PV3r=PV2r;
- PV2r=PV1r;
- PV1r=*(samples++); //32bit processing
- num_stereo_samples--;
- acc-=48000;
- }
-
- // defaults to nearest
- s32 DataL = PV1l;
- s32 DataR = PV1r;
-
- if (m_mode == 1) { //linear
-
- DataL = PV1l + ((PV2l - PV1l)*acc)/48000;
- DataR = PV1r + ((PV2r - PV1r)*acc)/48000;
- }
- else if (m_mode == 2) {//cubic
- s32 a0l = PV1l - PV2l - PV4l + PV3l;
- s32 a0r = PV1r - PV2r - PV4r + PV3r;
- s32 a1l = PV4l - PV3l - a0l;
- s32 a1r = PV4r - PV3r - a0r;
- s32 a2l = PV1l - PV4l;
- s32 a2r = PV1r - PV4r;
- s32 a3l = PV2l;
- s32 a3r = PV2r;
-
- s32 t0l = ((a0l )*acc)/48000;
- s32 t0r = ((a0r )*acc)/48000;
- s32 t1l = ((t0l+a1l)*acc)/48000;
- s32 t1r = ((t0r+a1r)*acc)/48000;
- s32 t2l = ((t1l+a2l)*acc)/48000;
- s32 t2r = ((t1r+a2r)*acc)/48000;
- s32 t3l = ((t2l+a3l));
- s32 t3r = ((t2r+a3r));
-
- DataL = t3l;
- DataR = t3r;
- }
-
- int l = DataL, r = DataR;
- if (l < -32767) l = -32767;
- if (r < -32767) r = -32767;
- if (l > 32767) l = 32767;
- if (r > 32767) r = 32767;
- sample_queue.push(l);
- sample_queue.push(r);
- m_queueSize += 2;
- }
-*/
+ //render numleft sample pairs to samples[]
+ //advance m_indexR with sample position
+ //remember fractional offset
+
+ static u32 frac = 0;
+ const u32 ratio = (u32)( 65536.0f * 32000.0f / (float)m_sampleRate );
+
+ for (u32 i = 0; i < numLeft * 2; i+=2) {
+ u32 m_indexR2 = m_indexR + 2; //next sample
+ if ((m_indexR2 & INDEX_MASK) == (m_indexW & INDEX_MASK)) //..if it exists
+ m_indexR2 = m_indexR;
+
+
+ s16 l1 = Common::swap16(m_buffer[m_indexR & INDEX_MASK]); //current
+ s16 l2 = Common::swap16(m_buffer[m_indexR2 & INDEX_MASK]); //next
+ int sampleL = (l1 << 16) + (l2 - l1) * (u16)frac >> 16;
+ samples[i] = sampleL;
+
+ s16 r1 = Common::swap16(m_buffer[(m_indexR + 1) & INDEX_MASK]); //current
+ s16 r2 = Common::swap16(m_buffer[(m_indexR2 + 1) & INDEX_MASK]); //next
+ int sampleR = (r1 << 16) + (r2 - r1) * (u16)frac >> 16;
+ samples[i+1] = sampleR;
+
+ frac += ratio;
+ m_indexR += 2 * (u16)(frac >> 16);
+ frac &= 0xffff;
+ }
}
+
+
} else {
numLeft = 0;
}
@@ -154,7 +119,7 @@ void CMixer::PushSamples(short *samples, unsigned int num_samples)
if (m_throttle)
{
// The auto throttle function. This loop will put a ceiling on the CPU MHz.
- while (Common::AtomicLoad(m_numSamples) >= MAX_SAMPLES - RESERVED_SAMPLES)
+ while (Common::AtomicLoad(m_numSamples) + RESERVED_SAMPLES >= MAX_SAMPLES)
{
if (g_dspInitialize.pEmulatorState)
{
@@ -171,7 +136,7 @@ void CMixer::PushSamples(short *samples, unsigned int num_samples)
}
// Check if we have enough free space
- if (num_samples > MAX_SAMPLES - Common::AtomicLoad(m_numSamples))
+ if (num_samples + Common::AtomicLoad(m_numSamples) > MAX_SAMPLES)
return;
// AyuanX: Actual re-sampling work has been moved to sound thread
@@ -190,12 +155,12 @@ void CMixer::PushSamples(short *samples, unsigned int num_samples)
m_indexW += num_samples * 2;
- if (m_sampleRate != 32000)
- {
- PanicAlert("Mixer: Up-sampling is not implemented yet!");
- }
-
- Common::AtomicAdd(m_numSamples, num_samples);
+ if (m_sampleRate == 32000)
+ Common::AtomicAdd(m_numSamples, num_samples);
+ else if (m_sampleRate == 48000)
+ Common::AtomicAdd(m_numSamples, num_samples * 1.5);
+ else
+ PanicAlert("Mixer: Unsupported sample rate.");
return;
}