obs/Source/Main.cpp
2012-08-30 21:54:15 -07:00

206 lines
6.4 KiB
C++

/********************************************************************************
Copyright (C) 2012 Hugh Bailey <obs.jim@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
********************************************************************************/
#include "Main.h"
#include <dwmapi.h>
//----------------------------
HWND hwndMain = NULL;
HWND hwndRenderFrame = NULL;
HINSTANCE hinstMain = NULL;
ConfigFile *AppConfig = NULL;
OBS *App = NULL;
//----------------------------
void InitSockets();
void TerminateSockets();
BOOL bCompositionEnabled = TRUE;
BOOL bDisableComposition = FALSE;
HANDLE hOBSMutex = NULL;
void LogSystemStats()
{
HKEY key;
TCHAR data[1024];
DWORD dwSize, dwSpeed;
zero(data, 1024);
if(RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"), &key) != ERROR_SUCCESS)
{
AppWarning(TEXT("Could not open system information registry key"));
return;
}
#ifdef _WIN64
Log(TEXT("%s - 64bit"), OBS_VERSION_STRING);
#else
Log(TEXT("%s - 32bit"), OBS_VERSION_STRING);
#endif
Log(TEXT("-------------------------------"));
dwSize = 1024;
RegQueryValueEx(key, TEXT("ProcessorNameString"), NULL, NULL, (LPBYTE)data, &dwSize);
Log(TEXT("CPU Name: %s"), sfix(data));
dwSize = 4;
RegQueryValueEx(key, TEXT("~MHz"), NULL, NULL, (LPBYTE)&dwSpeed, &dwSize);
Log(TEXT("CPU Speed: %dMHz"), dwSpeed);
RegCloseKey(key);
MEMORYSTATUS ms;
GlobalMemoryStatus(&ms);
Log(TEXT("Physical Memory: %ldMB Total, %ldMB Free"), (ms.dwTotalPhys/1048576), (ms.dwAvailPhys/1048576));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//make sure only one instance of the application can be open at a time
hOBSMutex = CreateMutex(NULL, TRUE, TEXT("OBSMutex"));
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hOBSMutex);
return 0;
}
//------------------------------------------------------------
hinstMain = hInstance;
//------------------------------------------------------------
// get the allocator from the config. problem is we need an allocator to load the config
CTSTR lpAllocatorString = TEXT("FastAlloc");
MainAllocator = new DefaultAlloc;
AppConfig = new ConfigFile;
if(AppConfig->Open(TEXT("OBS.ini")))
lpAllocatorString = AppConfig->GetStringPtr(TEXT("General"), TEXT("Allocator"), TEXT("FastAlloc"));
UINT stringSize = ssize(lpAllocatorString);
TSTR lpAllocator = (TSTR)malloc(stringSize);
mcpy(lpAllocator, lpAllocatorString, stringSize);
delete AppConfig;
delete MainAllocator;
//------------------------------------------------------------
if(InitXT(TEXT("OBS.log"), lpAllocator))
{
traceIn(Main);
EnableProfiling(TRUE);
LogSystemStats();
//CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoInitialize(0);
InitSockets();
AppConfig = new ConfigFile;
if(!AppConfig->Open(TEXT("OBS.ini")))
{
if(!AppConfig->Create(TEXT("OBS.ini")))
CrashError(TEXT("Could not open OBS.ini"));
AppConfig->SetString(TEXT("General"), TEXT("Language"), TEXT("en"));
AppConfig->SetString(TEXT("Audio"), TEXT("Device"), TEXT("Default"));
AppConfig->SetFloat (TEXT("Audio"), TEXT("MicVolume"), 1.0f);
AppConfig->SetFloat (TEXT("Audio"), TEXT("DesktopVolume"), 1.0f);
AppConfig->SetInt (TEXT("Video"), TEXT("Monitor"), 0);
AppConfig->SetInt (TEXT("Video"), TEXT("FPS"), 25);
AppConfig->SetFloat (TEXT("Video"), TEXT("Downscale"), 1.0f);
AppConfig->SetInt (TEXT("Video"), TEXT("DisableAero"), 0);
AppConfig->SetInt (TEXT("Video Encoding"), TEXT("BufferSize"), 1000);
AppConfig->SetInt (TEXT("Video Encoding"), TEXT("MaxBitrate"), 1000);
AppConfig->SetString(TEXT("Video Encoding"), TEXT("Preset"), TEXT("veryfast"));
AppConfig->SetInt (TEXT("Video Encoding"), TEXT("Quality"), 8);
AppConfig->SetInt (TEXT("Audio Encoding"), TEXT("Format"), 1);
AppConfig->SetString(TEXT("Audio Encoding"), TEXT("Bitrate"), TEXT("128"));
AppConfig->SetString(TEXT("Audio Encoding"), TEXT("Codec"), TEXT("AAC"));
AppConfig->SetInt (TEXT("Publish"), TEXT("Service"), 0);
AppConfig->SetInt (TEXT("Publish"), TEXT("Mode"), 0);
}
bDisableComposition = AppConfig->GetInt(TEXT("Video"), TEXT("DisableAero"), 0);
if(bDisableComposition)
{
DwmIsCompositionEnabled(&bCompositionEnabled);
if(bCompositionEnabled)
DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
}
App = new OBS;
HACCEL hAccel = LoadAccelerators(hinstMain, MAKEINTRESOURCE(IDR_ACCELERATOR1));
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
if(!TranslateAccelerator(hwndMain, hAccel, &msg) && !IsDialogMessage(hwndMain, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
delete App;
delete AppConfig;
if(bDisableComposition && bCompositionEnabled)
DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
TerminateSockets();
traceOutStop;
TerminateXT();
}
free(lpAllocator);
//------------------------------------------------------------
CloseHandle(hOBSMutex);
return 0;
}