update
This commit is contained in:
@@ -224,6 +224,8 @@ struct Win32SoundOutput {
|
|||||||
uint32 runningSampleIndex;
|
uint32 runningSampleIndex;
|
||||||
int bytesPerSample;
|
int bytesPerSample;
|
||||||
int secondaryBufferSize;
|
int secondaryBufferSize;
|
||||||
|
real32 tSine;
|
||||||
|
int latencySampleCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
internal void win32FillSoundBuffer(Win32SoundOutput *soundOutput, DWORD byteToLock, DWORD bytesToWrite) {
|
internal void win32FillSoundBuffer(Win32SoundOutput *soundOutput, DWORD byteToLock, DWORD bytesToWrite) {
|
||||||
@@ -236,19 +238,19 @@ internal void win32FillSoundBuffer(Win32SoundOutput *soundOutput, DWORD byteToLo
|
|||||||
DWORD region1SampleCount = region1Size/soundOutput->bytesPerSample;
|
DWORD region1SampleCount = region1Size/soundOutput->bytesPerSample;
|
||||||
int16 *sampleOut = (int16*)region1;
|
int16 *sampleOut = (int16*)region1;
|
||||||
for (DWORD sampleIndex = 0; sampleIndex < region1SampleCount; sampleIndex++) {
|
for (DWORD sampleIndex = 0; sampleIndex < region1SampleCount; sampleIndex++) {
|
||||||
real32 t = 2.0f * PI32 * (real32)soundOutput->runningSampleIndex / (real32)soundOutput->wavePeriod;
|
int16 sampleValue = (int16)(sin(soundOutput->tSine) * (real32)soundOutput->toneVolume);
|
||||||
int16 sampleValue = (int16)(sin(t) * (real32)soundOutput->toneVolume);
|
|
||||||
*sampleOut++ = sampleValue;
|
*sampleOut++ = sampleValue;
|
||||||
*sampleOut++ = sampleValue;
|
*sampleOut++ = sampleValue;
|
||||||
|
soundOutput->tSine += 2.0f * PI32 / (real32)soundOutput->wavePeriod;
|
||||||
soundOutput->runningSampleIndex++;
|
soundOutput->runningSampleIndex++;
|
||||||
}
|
}
|
||||||
DWORD region2SampleCount = region2Size/soundOutput->bytesPerSample;
|
DWORD region2SampleCount = region2Size/soundOutput->bytesPerSample;
|
||||||
sampleOut = (int16*)region2;
|
sampleOut = (int16*)region2;
|
||||||
for (DWORD sampleIndex = 0; sampleIndex < region2SampleCount; sampleIndex++) {
|
for (DWORD sampleIndex = 0; sampleIndex < region2SampleCount; sampleIndex++) {
|
||||||
real32 t = 2.0f * PI32 * (real32)soundOutput->runningSampleIndex / (real32)soundOutput->wavePeriod;
|
int16 sampleValue = (int16)(sin(soundOutput->tSine) * (real32)soundOutput->toneVolume);
|
||||||
int16 sampleValue = (int16)(sin(t) * soundOutput->toneVolume);
|
|
||||||
*sampleOut++ = sampleValue;
|
*sampleOut++ = sampleValue;
|
||||||
*sampleOut++ = sampleValue;
|
*sampleOut++ = sampleValue;
|
||||||
|
soundOutput->tSine += 2.0f * PI32 / (real32)soundOutput->wavePeriod;
|
||||||
soundOutput->runningSampleIndex++;
|
soundOutput->runningSampleIndex++;
|
||||||
}
|
}
|
||||||
globalSecondaryBuffer->Unlock(region1, region1Size, region2, region2Size);
|
globalSecondaryBuffer->Unlock(region1, region1Size, region2, region2Size);
|
||||||
@@ -305,11 +307,12 @@ int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prevInstance, PSTR commandLin
|
|||||||
soundOutput.runningSampleIndex = 0;
|
soundOutput.runningSampleIndex = 0;
|
||||||
soundOutput.bytesPerSample = sizeof(int16)*2;
|
soundOutput.bytesPerSample = sizeof(int16)*2;
|
||||||
soundOutput.secondaryBufferSize = soundOutput.samplesPerSecond*soundOutput.bytesPerSample;
|
soundOutput.secondaryBufferSize = soundOutput.samplesPerSecond*soundOutput.bytesPerSample;
|
||||||
|
soundOutput.latencySampleCount = soundOutput.samplesPerSecond / 15.0f;
|
||||||
|
|
||||||
win32LoadXInput();
|
win32LoadXInput();
|
||||||
win32InitSound(window, soundOutput.samplesPerSecond, soundOutput.secondaryBufferSize);
|
win32InitSound(window, soundOutput.samplesPerSecond, soundOutput.secondaryBufferSize);
|
||||||
|
|
||||||
win32FillSoundBuffer(&soundOutput, 0, soundOutput.secondaryBufferSize);
|
win32FillSoundBuffer(&soundOutput, 0, soundOutput.latencySampleCount*soundOutput.bytesPerSample);
|
||||||
globalSecondaryBuffer->Play(0, 0, DSBPLAY_LOOPING);
|
globalSecondaryBuffer->Play(0, 0, DSBPLAY_LOOPING);
|
||||||
|
|
||||||
LARGE_INTEGER lastCounter;
|
LARGE_INTEGER lastCounter;
|
||||||
@@ -361,6 +364,9 @@ int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prevInstance, PSTR commandLin
|
|||||||
yOffset += stickY/5000.0 * factor;
|
yOffset += stickY/5000.0 * factor;
|
||||||
xOffset -= stickX/5000.0 * factor;
|
xOffset -= stickX/5000.0 * factor;
|
||||||
|
|
||||||
|
soundOutput.toneHz = 220 + (stickYNorm + 1.0)/2.0 * 220.0;
|
||||||
|
soundOutput.wavePeriod = soundOutput.samplesPerSecond / soundOutput.toneHz;
|
||||||
|
|
||||||
GameOffscreenBuffer buffer = {};
|
GameOffscreenBuffer buffer = {};
|
||||||
buffer.memory = globalBackBuffer.memory;
|
buffer.memory = globalBackBuffer.memory;
|
||||||
buffer.width = globalBackBuffer.width;
|
buffer.width = globalBackBuffer.width;
|
||||||
@@ -376,13 +382,14 @@ int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prevInstance, PSTR commandLin
|
|||||||
DWORD writeCursor;
|
DWORD writeCursor;
|
||||||
if (SUCCEEDED(globalSecondaryBuffer->GetCurrentPosition(&playCursor, &writeCursor))) {
|
if (SUCCEEDED(globalSecondaryBuffer->GetCurrentPosition(&playCursor, &writeCursor))) {
|
||||||
DWORD byteToLock = (soundOutput.runningSampleIndex*soundOutput.bytesPerSample) % soundOutput.secondaryBufferSize;
|
DWORD byteToLock = (soundOutput.runningSampleIndex*soundOutput.bytesPerSample) % soundOutput.secondaryBufferSize;
|
||||||
|
DWORD targetCursor = (playCursor + soundOutput.latencySampleCount*soundOutput.bytesPerSample) % soundOutput.secondaryBufferSize;
|
||||||
DWORD bytesToWrite;
|
DWORD bytesToWrite;
|
||||||
if (byteToLock == playCursor) {
|
if (byteToLock == targetCursor) {
|
||||||
bytesToWrite = 0;
|
bytesToWrite = 0;
|
||||||
} else if (byteToLock > playCursor) {
|
} else if (byteToLock > targetCursor) {
|
||||||
bytesToWrite = soundOutput.secondaryBufferSize - byteToLock + playCursor;
|
bytesToWrite = soundOutput.secondaryBufferSize - byteToLock + targetCursor;
|
||||||
} else {
|
} else {
|
||||||
bytesToWrite = playCursor - byteToLock;
|
bytesToWrite = targetCursor - byteToLock;
|
||||||
}
|
}
|
||||||
win32FillSoundBuffer(&soundOutput, byteToLock, bytesToWrite);
|
win32FillSoundBuffer(&soundOutput, byteToLock, bytesToWrite);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user