1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/modules/audio_device/win/audio_device_utility_win.h" 12 13 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 14 #include "webrtc/system_wrappers/interface/trace.h" 15 16 #include <windows.h> 17 #include <tchar.h> 18 #include <strsafe.h> 19 20 #define STRING_MAX_SIZE 256 21 22 typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 23 typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD); 24 25 namespace webrtc 26 { 27 28 // ============================================================================ 29 // Construction & Destruction 30 // ============================================================================ 31 32 // ---------------------------------------------------------------------------- 33 // AudioDeviceUtilityWindows() - ctor 34 // ---------------------------------------------------------------------------- 35 36 AudioDeviceUtilityWindows::AudioDeviceUtilityWindows(const int32_t id) : 37 _critSect(*CriticalSectionWrapper::CreateCriticalSection()), 38 _id(id), 39 _lastError(AudioDeviceModule::kAdmErrNone) 40 { 41 WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, id, "%s created", __FUNCTION__); 42 } 43 44 // ---------------------------------------------------------------------------- 45 // AudioDeviceUtilityWindows() - dtor 46 // ---------------------------------------------------------------------------- 47 48 AudioDeviceUtilityWindows::~AudioDeviceUtilityWindows() 49 { 50 WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, _id, "%s destroyed", __FUNCTION__); 51 { 52 CriticalSectionScoped lock(&_critSect); 53 54 // free stuff here... 55 } 56 57 delete &_critSect; 58 } 59 60 // ============================================================================ 61 // API 62 // ============================================================================ 63 64 // ---------------------------------------------------------------------------- 65 // Init() 66 // ---------------------------------------------------------------------------- 67 68 int32_t AudioDeviceUtilityWindows::Init() 69 { 70 71 TCHAR szOS[STRING_MAX_SIZE]; 72 73 if (GetOSDisplayString(szOS)) 74 { 75 #ifdef _UNICODE 76 char os[STRING_MAX_SIZE]; 77 if (WideCharToMultiByte(CP_UTF8, 0, szOS, -1, os, STRING_MAX_SIZE, NULL, NULL) == 0) 78 { 79 strncpy(os, "Could not get OS info", STRING_MAX_SIZE); 80 } 81 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, " OS info: %s", os); 82 #else 83 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, " OS info: %s", szOS); 84 #endif 85 } 86 87 return 0; 88 } 89 90 // ============================================================================ 91 // Private Methods 92 // ============================================================================ 93 94 BOOL AudioDeviceUtilityWindows::GetOSDisplayString(LPTSTR pszOS) 95 { 96 OSVERSIONINFOEX osvi; 97 SYSTEM_INFO si; 98 PGNSI pGNSI; 99 BOOL bOsVersionInfoEx; 100 101 ZeroMemory(&si, sizeof(SYSTEM_INFO)); 102 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 103 104 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 105 106 // Retrieve information about the current operating system 107 // 108 bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) &osvi); 109 if (!bOsVersionInfoEx) 110 return FALSE; 111 112 // Parse our OS version string 113 // 114 if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && osvi.dwMajorVersion > 4) 115 { 116 StringCchCopy(pszOS, STRING_MAX_SIZE, TEXT("Microsoft ")); 117 118 // Test for the specific product 119 // 120 // Operating system Version number 121 // -------------------------------------- 122 // Windows 7 6.1 123 // Windows Server 2008 R2 6.1 124 // Windows Server 2008 6.0 125 // Windows Vista 6.0 126 // - - - - - - - - - - - - - - - - - - - 127 // Windows Server 2003 R2 5.2 128 // Windows Server 2003 5.2 129 // Windows XP 5.1 130 // Windows 2000 5.0 131 // 132 // see http://msdn.microsoft.com/en-us/library/ms724832(VS.85).aspx for details 133 // 134 if (osvi.dwMajorVersion == 6) 135 { 136 if (osvi.dwMinorVersion == 0) 137 { 138 // Windows Vista or Server 2008 139 if (osvi.wProductType == VER_NT_WORKSTATION) 140 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT("Windows Vista ")); 141 else 142 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT("Windows Server 2008 " )); 143 } 144 145 if (osvi.dwMinorVersion == 1) 146 { 147 // Windows 7 or Server 2008 R2 148 if (osvi.wProductType == VER_NT_WORKSTATION) 149 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT("Windows 7 ")); 150 else 151 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT("Windows Server 2008 R2 " )); 152 } 153 } 154 155 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) 156 { 157 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT("Windows Server 2003")); 158 } 159 160 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) 161 { 162 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT("Windows XP ")); 163 if (osvi.wSuiteMask & VER_SUITE_PERSONAL) 164 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT( "Home Edition" )); 165 else 166 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT( "Professional" )); 167 } 168 169 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) 170 { 171 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT("Windows 2000 ")); 172 173 if (osvi.wProductType == VER_NT_WORKSTATION ) 174 { 175 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT( "Professional" )); 176 } 177 else 178 { 179 if (osvi.wSuiteMask & VER_SUITE_DATACENTER) 180 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT( "Datacenter Server" )); 181 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) 182 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT( "Advanced Server" )); 183 else StringCchCat(pszOS, STRING_MAX_SIZE, TEXT( "Server" )); 184 } 185 } 186 187 // Include service pack (if any) 188 // 189 if (_tcslen(osvi.szCSDVersion) > 0) 190 { 191 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT(" ")); 192 StringCchCat(pszOS, STRING_MAX_SIZE, osvi.szCSDVersion); 193 } 194 195 TCHAR buf[80]; 196 197 // Include build number 198 // 199 StringCchPrintf( buf, 80, TEXT(" (build %d)"), osvi.dwBuildNumber); 200 StringCchCat(pszOS, STRING_MAX_SIZE, buf); 201 202 // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise 203 // 204 pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); 205 if (NULL != pGNSI) 206 pGNSI(&si); 207 else 208 GetSystemInfo(&si); 209 210 // Add 64-bit or 32-bit for OS versions "later than" Vista 211 // 212 if (osvi.dwMajorVersion >= 6) 213 { 214 if ((si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) || 215 (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)) 216 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT( ", 64-bit" )); 217 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL ) 218 StringCchCat(pszOS, STRING_MAX_SIZE, TEXT(", 32-bit")); 219 } 220 221 return TRUE; 222 } 223 else 224 { 225 return FALSE; 226 } 227 } 228 229 } // namespace webrtc 230