/* CXAudio2::SetupSound applies current sound settings by recreating the voice objects and buffers ----- returns true if successful, false otherwise */ bool CXAudio2::SetupSound() { if(!initDone) return false; DeInitVoices(); blockCount = 8; UINT32 blockTime = 64 / blockCount; singleBufferSamples = (Settings.SoundPlaybackRate * blockTime * (Settings.Stereo ? 2 : 1)) / 1000; singleBufferBytes = singleBufferSamples * (Settings.SixteenBitSound ? 2 : 1); sum_bufferSize = singleBufferBytes * blockCount; if (InitVoices()) { soundBuffer = new uint8[sum_bufferSize]; writeOffset = 0; } else { DeInitVoices(); return false; } bufferCount = 0; BeginPlayback(); return true; }
void CTestMmfAclntCaps0014::DoProcess(TInt aError) { if (aError == KErrNone) { InternalState nextState = iState; switch (iState) { case EWaitingForServer: CreatePlayer(); nextState = EInitPlayer; break; case EInitPlayer : BeginPlayback(); nextState = EPlaying; break; case EPlaying : iVerdict = EPass; CActiveScheduler::Stop(); break; } iState = nextState; } else { iVerdict = EFail; INFO_PRINTF2(_L("Unexpected failure in test, error code %d"), aError); CActiveScheduler::Stop(); } }
void CASW_Video::ReturnToLoopVideo( void ) { if ( !m_bIsLoopVideo ) { m_bIsLoopVideo = true; BeginPlayback( m_nLoopVideo ); } }
void CASW_Video::OnVideoOver() { if ( m_bIsTransition ) { m_bIsTransition = false; BeginPlayback( m_nLastTempVideo ); } else if ( !m_bIsLoopVideo ) { m_bIsLoopVideo = true; BeginPlayback( m_nLoopVideo ); } else if ( m_nNumLoopAlternatives > 0 && RandomFloat() < m_fAlternateChance ) { PlayTempVideo( m_nLoopVideo + RandomInt( 1, m_nNumLoopAlternatives ) ); } else { bik->SetFrame( GetVideoFaceBIKHandles()->GetBIKHandle( m_nLoopVideo ), 0.0f ); } }
void PlaybackInput(Win32State* state, GameController* input) { DWORD bytesRead = 0; if(ReadFile(state->playbackHandle, input, sizeof(*input), &bytesRead, 0)) { if(bytesRead == 0) { u32 playbackIndex = state->playbackIndex; EndPlayback(state); BeginPlayback(state, playbackIndex); ReadFile(state->playbackHandle, input, sizeof(*input), &bytesRead, 0); } } }
void CASW_Video::PlayTempVideo( int nFaceType, int nTransitionFaceType /*= -1*/ ) { if ( GetCurrentVideo() == nFaceType ) { return; } m_nLastTempVideo = nFaceType; m_nTransitionVideo = nTransitionFaceType; m_bIsLoopVideo = false; m_bIsTransition = ( m_nTransitionVideo != -1 ); BeginPlayback( m_bIsTransition ? m_nTransitionVideo : m_nLastTempVideo ); }
void CASW_Video::SetLoopVideo( int nFaceType, int nNumLoopAlternatives /*= 0*/, float fAlternateChance /*= 1.0f*/ ) { m_nNumLoopAlternatives = nNumLoopAlternatives; m_fAlternateChance = fAlternateChance; if ( m_nLoopVideo == nFaceType ) { return; } m_nLoopVideo = nFaceType; if ( m_bIsLoopVideo && m_bStarted ) { BeginPlayback( m_nLoopVideo ); } }
void CASW_Video::Update() { #if !defined( _X360 ) || defined( BINK_ENABLED_FOR_X360 ) if ( !m_bStarted ) { BeginPlayback( m_nLoopVideo ); } // Update our frame GetVideoFaceBIKHandles()->Buffer(); if ( bik->Update( GetVideoFaceBIKHandles()->GetBIKHandle( GetCurrentVideo() ) ) == false ) { // Issue a close command OnVideoOver(); } #endif }
static NTSTATUS InitDevice( IN PWSTR RegistryPath, IN PVOID Context) { // PDEVICE_INSTANCE Instance = Context; PDEVICE_OBJECT DeviceObject; // = Context; PDEVICE_EXTENSION Parameters; // = DeviceObject->DeviceExtension; UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\WaveOut0"); // CHANGE THESE? UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\WaveOut0"); // CONFIG Config; RTL_QUERY_REGISTRY_TABLE Table[2]; NTSTATUS s; USHORT DSP_Version = 0; UCHAR DSP_Major = 0, DSP_Minor = 0; // This is TEMPORARY, to ensure that we don't process more than 1 device. // This limitation should be removed in future. if (DeviceCount > 0) { DPRINT("Sorry - only 1 device supported by Sound Blaster driver at present :(\n"); return STATUS_NOT_IMPLEMENTED; } DPRINT("Creating IO device\n"); s = IoCreateDevice(Context, // driverobject sizeof(DEVICE_EXTENSION), &DeviceName, FILE_DEVICE_SOUND, // Correct? 0, FALSE, &DeviceObject); if (!NT_SUCCESS(s)) return s; DPRINT("Device Extension at 0x%x\n", DeviceObject->DeviceExtension); Parameters = DeviceObject->DeviceExtension; DPRINT("Creating DOS link\n"); /* Create the dos device link */ s = IoCreateSymbolicLink(&SymlinkName, &DeviceName); if (!NT_SUCCESS(s)) { IoDeleteDevice(DeviceObject); return s; } DPRINT("Initializing device\n"); // DPRINT("Allocating memory for parameters structure\n"); // Bodged: // Parameters = (PDEVICE_EXTENSION)ExAllocatePool(NonPagedPool, sizeof(DEVICE_EXTENSION)); // DeviceObject->DeviceExtension = Parameters; // Parameters = Instance->DriverObject->DriverExtension; DPRINT("DeviceObject at 0x%x, DeviceExtension at 0x%x\n", DeviceObject, Parameters); if (! Parameters) { DPRINT("NULL POINTER!\n"); return STATUS_INSUFFICIENT_RESOURCES; } // Instance->DriverObject->DriverExtension = Parameters; DPRINT("Setting reg path\n"); Parameters->RegistryPath = RegistryPath; // Parameters->DriverObject = Instance->DriverObject; DPRINT("Zeroing table memory and setting query routine\n"); RtlZeroMemory(Table, sizeof(Table)); Table[0].QueryRoutine = LoadSettings; DPRINT("Setting port and IRQ defaults\n"); Parameters->Port = DEFAULT_PORT; Parameters->IRQ = DEFAULT_IRQ; Parameters->DMA = DEFAULT_DMA; Parameters->BufferSize = DEFAULT_BUFSIZE; // Only to be enabled once we can get support for multiple cards working :) /* DPRINT("Loading settings from: %S\n", RegistryPath); s = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, RegistryPath, Table, &Parameters, NULL); if (! NT_SUCCESS(s)) return s; */ DPRINT("Port 0x%x IRQ %d DMA %d\n", Parameters->Port, Parameters->IRQ, Parameters->DMA); // Instance->P // Initialize the card DSP_Version = InitSoundCard(Parameters->Port); if (! DSP_Version) { DPRINT("Sound card initialization FAILED!\n"); // Set state indication somehow // Failure - what error code do we give?! // return STATUS_???? IoDeleteDevice(DeviceObject); return STATUS_UNSUCCESSFUL; } DSP_Major = DSP_Version / 256; DSP_Minor = DSP_Version % 256; // Do stuff related to version here... DPRINT("Allocating DMA\n"); if (! CreateDMA(DeviceObject)) DPRINT("FAILURE!\n"); // TEMPORARY TESTING STUFF: should be in BlasterCreate EnableSpeaker(Parameters->Port, TRUE); SetOutputSampleRate(Parameters->Port, 2205); BeginPlayback(Parameters->Port, 16, 2, Parameters->BufferSize); DeviceCount ++; return STATUS_SUCCESS; }
// WINDOWS MAIN FUNCTION // hInst = current instance of the program // hPrevInst = previous instance which is not used anymore. // cmdLine = holds command line arguments to be passed in to the program // cmdShow = holds an integer to specify if we want to show this window. int CALLBACK WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int cmdShow) { WNDCLASS wc = {0}; wc.style = CS_HREDRAW | CS_VREDRAW; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)COLOR_WINDOW; wc.lpszClassName = wndClassName; wc.hCursor = 0; //TODO: Add cursors and icons to this program. wc.hIcon = 0; wc.lpfnWndProc = (WNDPROC)wndProc; RegisterClass(&wc); HWND window = CreateWindow(wndClassName, wndTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, wndWidth, wndHeight, 0, 0, hInst, 0); if(window) { ShowWindow(window, SW_SHOW); UpdateWindow(window); // NOTE: Initializing SDL if(SDL_Init(SDL_INIT_VIDEO) != 0 ) { DestroyWindow(window); return -2; } IMG_Init(IMG_INIT_JPG | IMG_INIT_PNG); sdlWindow = SDL_CreateWindowFrom((void*)window); char error[MAX_PATH]; stringCopy(error, SDL_GetError()); OutputDebugStringA(error); if(!sdlWindow) { SDL_Quit(); DestroyWindow(window); return -3; } renderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if(!renderer) { SDL_DestroyWindow(sdlWindow); SDL_Quit(); DestroyWindow(window); return -4; } i32 RefreshRate = 0; HDC dc = GetDC(window); i32 winRefreshRate = GetDeviceCaps(dc, VREFRESH); if( winRefreshRate > 1 ) { RefreshRate = winRefreshRate / 2; } else { RefreshRate = 30; } r32 targetSecsPerFrame = 1.0f / RefreshRate; GameMemory memory = {}; memory.permanentSize = Megabytes(64); memory.transientSize = Megabytes(64); memory.totalSize = memory.permanentSize + memory.transientSize; gameMemoryBlock = VirtualAlloc( 0, memory.totalSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if(!gameMemoryBlock) { SDL_DestroyRenderer(renderer); SDL_DestroyWindow(sdlWindow); SDL_Quit(); DestroyWindow(window); return -5; } memory.permanentBlock = gameMemoryBlock; memory.transientBlock = (i8*)gameMemoryBlock + memory.permanentSize; memory.readEntireFile = ReadEntireFile; memory.freeFile = FreeFile; memory.writeEntireFile = WriteEntireFile; Win32Dims windowDims = GetWindowDimensions(window); Render render = {}; render.renderer = renderer; render.screenW = windowDims.width; render.screenH = windowDims.height; GameController input = {0}; input.dt = targetSecsPerFrame; Win32State state = {0}; state.memoryBlock = gameMemoryBlock; state.memorySize = memory.totalSize; GameCodeDLL gameCode = Win32LoadGameCode("Game.dll", "Game_temp.dll", "lock.tmp"); isRunning = true; r32 sleepIsGranular = (timeBeginPeriod(1) == TIMERR_NOERROR); LARGE_INTEGER lastCounter = Win32GetClock(); i64 lastCycles = __rdtsc(); LARGE_INTEGER performanceFreqPerSecRes; QueryPerformanceFrequency(&performanceFreqPerSecRes); globalPerformanceCountFreq = performanceFreqPerSecRes.QuadPart; // NOTE: PROGRAM LOOP!! while(isRunning) { // NOTE: compare File times for us to be able to reload the new game code FILETIME currentFileTime = Win32GetLastWriteTime("Game.dll"); if(CompareFileTime(¤tFileTime, &gameCode.lastWriteTime) != 0) { Win32UnloadGameCode(&gameCode); gameCode = Win32LoadGameCode("Game.dll", "Game_temp.dll", "lock.tmp"); } MSG msg = {0}; while(PeekMessage(&msg, window, 0, 0, PM_REMOVE)) { switch(msg.message) { case WM_CLOSE: { isRunning = false; }break; case WM_KEYUP: case WM_KEYDOWN: case WM_SYSKEYUP: case WM_SYSKEYDOWN: { u32 vkCode = (u32)msg.wParam; // This contains the keycode for the key that the user pressed. bool isDown = ((msg.lParam & (1 << 31)) == 0); // Check to see if the key is down now. bool wasDown = ((msg.lParam & (1 << 30)) != 0); // Check to see if the key was down previously. if(isDown != wasDown) { if(vkCode == 'W') { input.moveUp.isDown = isDown; } else if(vkCode == 'S') { input.moveDown.isDown = isDown; } else if(vkCode == 'A') { input.moveLeft.isDown = isDown; } else if(vkCode == 'D') { input.moveRight.isDown = isDown; } if(vkCode == VK_UP) { input.actionUp.isDown = isDown; } else if(vkCode == VK_DOWN) { input.actionDown.isDown = isDown; } else if(vkCode == VK_LEFT) { input.actionLeft.isDown = isDown; } else if(vkCode == VK_RIGHT) { input.actionRight.isDown = isDown; } else if(vkCode == VK_ESCAPE) { input.back.isDown = isDown; } else if(vkCode == 'O') { if(isDown) { if(state.recordingIndex == 0) { BeginRecording(&state, 1); } else { EndRecording(&state); BeginPlayback(&state, 1); } } } else if(vkCode == 'P') { if(isDown) { if(state.playbackIndex > 0) { EndPlayback(&state); ZeroMemory(&input, sizeof(input)); } } } } if(isDown) { bool AltKeyWasDown = ((msg.lParam & (1 << 29)) != 0); if(vkCode == VK_RETURN && AltKeyWasDown) { if(msg.hwnd) { isFullscreen = !isFullscreen; Win32FullscreenToggle(msg.hwnd); } } } }break; default: { TranslateMessage(&msg); DispatchMessage(&msg); } } } if(input.back.isDown) { isRunning = false; PostQuitMessage(0); } if(state.recordingIndex > 0) { RecordingInput(&state, &input); } else if(state.playbackIndex > 0) { PlaybackInput(&state, &input); } Win32Dims windowDims = GetWindowDimensions(window); Win32UpdateWindow(windowDims, (i32*)&render.screenW, (i32*)&render.screenH); if(gameCode.UpdateRender) { gameCode.UpdateRender(&memory, &input, &render); } LARGE_INTEGER workCounter = Win32GetClock(); r32 workSecsElapsed = Win32GetSecondsElapsed(lastCounter, workCounter); r32 secondsElapsed = workSecsElapsed; if(secondsElapsed < targetSecsPerFrame) { if(sleepIsGranular) { DWORD sleepMS = (DWORD)(1000.0f * (targetSecsPerFrame - secondsElapsed)); if(sleepMS > 0) { Sleep(sleepMS); } } r32 testSecsElapsed = Win32GetSecondsElapsed(lastCounter, Win32GetClock()); if(testSecsElapsed < targetSecsPerFrame) { //TODO: LOG MISSED SLEEP HERE!! } while(secondsElapsed < targetSecsPerFrame) { secondsElapsed = Win32GetSecondsElapsed(lastCounter, Win32GetClock()); } } else { //TODO: MISSED FRAME RATE!! } LARGE_INTEGER endCounter = Win32GetClock(); i64 endCycles = __rdtsc(); r64 elapsedCounts = (r64)(endCounter.QuadPart - lastCounter.QuadPart); r64 elapsedCycles = (r64)(endCycles - lastCycles); r32 MSperFrame = ((1000.0f * Win32GetSecondsElapsed(lastCounter, endCounter))); r32 FPS = (r32)(globalPerformanceCountFreq / elapsedCounts); r32 MegaCyclesPerFrame = (r32)(elapsedCycles / (1000.0f * 1000.0f)); char buffer[256]; sprintf_s(buffer, "%.02fms, %.02ffps, %.02fmcpf\n", MSperFrame, FPS, MegaCyclesPerFrame); OutputDebugStringA(buffer); lastCounter = endCounter; lastCycles = endCycles; } // NOTE: END OF WHILE LOOP //IMPORTANT: Unload this when we exit the program. Win32UnloadGameCode(&gameCode); } else { // TODO: Handle Error Loggin here!! return -1; } if(gameMemoryBlock) { VirtualFree(gameMemoryBlock, 0, MEM_RELEASE); } //Close SDL_DestroyRenderer(renderer); SDL_DestroyWindow(sdlWindow); IMG_Quit(); SDL_Quit(); DestroyWindow(window); return 0; }