commodore64: slightly better sound sampling routine for non-sync provider, placeholder until I can get the resampler to work

This commit is contained in:
saxxonpike 2012-12-03 06:47:14 +00:00
parent be37d1dc53
commit 0191b1e507
3 changed files with 26 additions and 8 deletions

View File

@ -17,12 +17,30 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
public void GetSamples(short[] samples) public void GetSamples(short[] samples)
{ {
bool overrun = false;
uint count = (uint)samples.Length; uint count = (uint)samples.Length;
for (uint i = 0; i < count; i++) uint overrunOffset;
if (bufferIndex == 0)
overrunOffset = bufferLength - 1;
else
overrunOffset = bufferIndex - 1;
uint i = 0;
while (i < count)
{ {
samples[i] = buffer[bufferReadOffset]; if (bufferReadOffset == bufferIndex)
if (bufferReadOffset != bufferIndex) overrun = true;
bufferReadOffset++; if (!overrun)
{
samples[i++] = buffer[bufferReadOffset++];
samples[i++] = buffer[bufferReadOffset++];
}
else
{
samples[i++] = buffer[overrunOffset];
samples[i++] = buffer[overrunOffset];
}
if (bufferReadOffset == bufferLength) if (bufferReadOffset == bufferLength)
bufferReadOffset = 0; bufferReadOffset = 0;
} }

View File

@ -571,11 +571,10 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
{ {
switch (newRegion) switch (newRegion)
{ {
case Region.NTSC: cyclesPerSec = 14318181 / 14; break; case Region.NTSC: cyclesPerSec = 14318181 / 14; bufferLength = (newSampleRate / 60) * 4; break;
case Region.PAL: cyclesPerSec = 17734472 / 18; break; case Region.PAL: cyclesPerSec = 17734472 / 18; bufferLength = (newSampleRate / 50) * 4; break;
} }
bufferFrequency = cyclesPerSec / newSampleRate; bufferFrequency = cyclesPerSec / newSampleRate;
bufferLength = newSampleRate * 2;
buffer = new short[bufferLength]; buffer = new short[bufferLength];
waveformTable = newWaveformTable; waveformTable = newWaveformTable;

View File

@ -600,6 +600,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
{ {
uint pixel; uint pixel;
uint pixelData; uint pixelData;
bool renderEnabled = bufRect.Contains(bufPoint);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
@ -621,7 +622,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
pixel = pixelBuffer[pixelBufferIndex]; pixel = pixelBuffer[pixelBufferIndex];
// plot pixel if within viewing area // plot pixel if within viewing area
if (bufRect.Contains(bufPoint)) if (renderEnabled)
{ {
buf[bufOffset] = palette[pixel]; buf[bufOffset] = palette[pixel];
bufOffset++; bufOffset++;