1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | if(windowHandle) { //NOTE: Get one DC and use it forever HDC DeviceContext = GetDC(windowHandle); //Note: Graphics test int XOffset = 0; int YOffset = 0; SoundOutput.SamplesPerSecond = 48000; SoundOutput.ToneHz = 256; SoundOutput.ToneVol = 3000; SoundOutput.RunningSampleIndex=0; SoundOutput.WavePeriod = SoundOutput.SamplesPerSecond/SoundOutput.ToneHz; //SoundOutput.HalfWavePeriod = WavePeriod/2; SoundOutput.BytesPerSample = sizeof(int16)*2; SoundOutput.SecondaryBufferSize = SoundOutput.SamplesPerSecond*SoundOutput.BytesPerSample; SoundOutput.LatencySampleCount = SoundOutput.SamplesPerSecond / 15; //Want to be head of play cursor by 1/60th of a sec //TODO Enable win32InitDSound(windowHandle, SoundOutput.SamplesPerSecond, SoundOutput.SecondaryBufferSize); win32FillSoundBuffer(&SoundOutput, 0, SoundOutput.LatencySampleCount*SoundOutput.BytesPerSample); SecondaryBuffer->Play(0, 0, DSBPLAY_LOOPING); Running = true; while(Running) { MSG Message; while(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) { if(Message.message == WM_QUIT) { Running = false; } TranslateMessage(&Message); DispatchMessageA(&Message); } //TODO: should we poll this more frequently? for (DWORD ControllerIndex=0; ControllerIndex< XUSER_MAX_COUNT; ControllerIndex++ ) { XINPUT_STATE ControllerState; if(XInputGetState(ControllerIndex, &ControllerState) == ERROR_SUCCESS) { //NOTE: this controller is plugged in XINPUT_GAMEPAD *Pad = &(ControllerState.Gamepad); bool Up = Pad->wButtons & XINPUT_GAMEPAD_DPAD_UP; bool Down = Pad->wButtons & XINPUT_GAMEPAD_DPAD_DOWN; bool Left = Pad->wButtons & XINPUT_GAMEPAD_DPAD_LEFT; bool Right = Pad->wButtons & XINPUT_GAMEPAD_DPAD_RIGHT; bool Start = Pad->wButtons & XINPUT_GAMEPAD_START; bool Back = Pad->wButtons & XINPUT_GAMEPAD_BACK; bool LeftShoulder = Pad->wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER; bool RightShoulder = Pad->wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER; bool AButton = Pad->wButtons & XINPUT_GAMEPAD_A; bool BButton = Pad->wButtons & XINPUT_GAMEPAD_B; bool XButton = Pad->wButtons & XINPUT_GAMEPAD_X; bool YButton = Pad->wButtons & XINPUT_GAMEPAD_Y; int16 StickX = Pad->sThumbLX; int16 StickY = Pad->sThumbLY; if(AButton) { ++YOffset; } } else { //The controller is not available. } } RenderWeirdGradient(&BackBuffer, XOffset,YOffset); DWORD PlayCursor; DWORD WriteCursor; if(SUCCEEDED(SecondaryBuffer->GetCurrentPosition( &PlayCursor, &WriteCursor))) { //TODO: Change this to lower latency offset from play cursor when we have sound effects. DWORD ByteToLock = (SoundOutput.RunningSampleIndex*SoundOutput.BytesPerSample) % SoundOutput.SecondaryBufferSize; DWORD TargetCursor = ((PlayCursor + (SoundOutput.LatencySampleCount*SoundOutput.BytesPerSample)) % SoundOutput.SecondaryBufferSize); DWORD BytesToWrite; if(ByteToLock > TargetCursor) { BytesToWrite = SoundOutput.SecondaryBufferSize - ByteToLock; BytesToWrite += TargetCursor; } else { BytesToWrite = TargetCursor - ByteToLock; } win32FillSoundBuffer(&SoundOutput, ByteToLock, BytesToWrite); } win32_Window_Dimensions Dimensions = GetWindowDimension(windowHandle); Win32DisplayBufferInWindow (&BackBuffer, DeviceContext, Dimensions.Width, Dimensions.Height); ++XOffset; } } |
1 | win32FillSoundBuffer(&SoundOutput, 0, SoundOutput.SecondaryBufferSize); |
1 | SoundOutput->tSine += 2.0f*Pi32*1.0f/(real32)SoundOutput->WavePeriod; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | for(DWORD SampleIndex = 0; SampleIndex < Region1SampleCount; ++SampleIndex) { /* This is the only change. */ if ( SoundOutput->tSine > 2.0f * Pi32 ) { SoundOutput->tSine -= 2.0f * Pi32; } real32 SineValue = sinf(SoundOutput->tSine); int16 SampleValue = (int16)(SineValue * SoundOutput->ToneVolume); *SampleOut++ = SampleValue; *SampleOut++ = SampleValue; SoundOutput->tSine += 2.0f*Pi32*1.0f/(real32)SoundOutput->WavePeriod; ++SoundOutput->RunningSampleIndex; ... } |