9cfd6bea6c6ae6689819ae7840065e7423b42b93
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_device / win / audio_device_utility_win.cc
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