Index: media/audio/win/audio_manager_win.cc |
diff --git a/media/audio/win/audio_manager_win.cc b/media/audio/win/audio_manager_win.cc |
index 84dba63249c8d3c5cbb5fb1c11e488394cb7b783..4a361727d281d468029cf7a747b55bd44c1c3bbf 100644 |
--- a/media/audio/win/audio_manager_win.cc |
+++ b/media/audio/win/audio_manager_win.cc |
@@ -47,42 +47,46 @@ const int kWinMaxInputChannels = 2; |
// play. |
const int kNumInputBuffers = 3; |
+int GetVersionPartAsInt(DWORDLONG num) { |
+ return static_cast<int>(num & 0xffff); |
+} |
+ |
// Returns a string containing the given device's description and installed |
// driver version. |
string16 GetDeviceAndDriverInfo(HDEVINFO device_info, |
SP_DEVINFO_DATA* device_data) { |
- // Save the old install params setting and set a flag for the |
- // SetupDiBuildDriverInfoList below to return only the installed drivers. |
- SP_DEVINSTALL_PARAMS old_device_install_params; |
- old_device_install_params.cbSize = sizeof(old_device_install_params); |
- SetupDiGetDeviceInstallParams(device_info, device_data, |
- &old_device_install_params); |
- SP_DEVINSTALL_PARAMS device_install_params = old_device_install_params; |
- device_install_params.FlagsEx |= DI_FLAGSEX_INSTALLEDDRIVER; |
- SetupDiSetDeviceInstallParams(device_info, device_data, |
- &device_install_params); |
- |
- SP_DRVINFO_DATA driver_data; |
- driver_data.cbSize = sizeof(driver_data); |
- string16 device_and_driver_info; |
- if (SetupDiBuildDriverInfoList(device_info, device_data, |
- SPDIT_COMPATDRIVER)) { |
- if (SetupDiEnumDriverInfo(device_info, device_data, SPDIT_COMPATDRIVER, 0, |
- &driver_data)) { |
- DWORDLONG version = driver_data.DriverVersion; |
- device_and_driver_info = string16(driver_data.Description) + L" v" + |
- base::IntToString16((version >> 48) & 0xffff) + L"." + |
- base::IntToString16((version >> 32) & 0xffff) + L"." + |
- base::IntToString16((version >> 16) & 0xffff) + L"." + |
- base::IntToString16(version & 0xffff); |
- } |
- SetupDiDestroyDriverInfoList(device_info, device_data, SPDIT_COMPATDRIVER); |
- } |
- |
- SetupDiSetDeviceInstallParams(device_info, device_data, |
- &old_device_install_params); |
- |
- return device_and_driver_info; |
+ // Save the old install params setting and set a flag for the |
+ // SetupDiBuildDriverInfoList below to return only the installed drivers. |
+ SP_DEVINSTALL_PARAMS old_device_install_params; |
+ old_device_install_params.cbSize = sizeof(old_device_install_params); |
+ SetupDiGetDeviceInstallParams(device_info, device_data, |
+ &old_device_install_params); |
+ SP_DEVINSTALL_PARAMS device_install_params = old_device_install_params; |
+ device_install_params.FlagsEx |= DI_FLAGSEX_INSTALLEDDRIVER; |
+ SetupDiSetDeviceInstallParams(device_info, device_data, |
+ &device_install_params); |
+ |
+ SP_DRVINFO_DATA driver_data; |
+ driver_data.cbSize = sizeof(driver_data); |
+ string16 device_and_driver_info; |
+ if (SetupDiBuildDriverInfoList(device_info, device_data, |
+ SPDIT_COMPATDRIVER)) { |
+ if (SetupDiEnumDriverInfo(device_info, device_data, SPDIT_COMPATDRIVER, 0, |
+ &driver_data)) { |
+ DWORDLONG version = driver_data.DriverVersion; |
+ device_and_driver_info = string16(driver_data.Description) + L" v" + |
+ base::IntToString16(GetVersionPartAsInt((version >> 48))) + L"." + |
+ base::IntToString16(GetVersionPartAsInt((version >> 32))) + L"." + |
+ base::IntToString16(GetVersionPartAsInt((version >> 16))) + L"." + |
+ base::IntToString16(GetVersionPartAsInt(version)); |
+ } |
+ SetupDiDestroyDriverInfoList(device_info, device_data, SPDIT_COMPATDRIVER); |
+ } |
+ |
+ SetupDiSetDeviceInstallParams(device_info, device_data, |
+ &old_device_install_params); |
+ |
+ return device_and_driver_info; |
} |
} // namespace |
@@ -151,61 +155,61 @@ AudioManagerWin::~AudioManagerWin() { |
string16 AudioManagerWin::GetAudioInputDeviceModel() { |
// Get the default audio capture device and its device interface name. |
- DWORD device_id = 0; |
- waveInMessage(reinterpret_cast<HWAVEIN>(WAVE_MAPPER), |
- DRVM_MAPPER_PREFERRED_GET, |
- reinterpret_cast<DWORD_PTR>(&device_id), NULL); |
- ULONG device_interface_name_size = 0; |
- waveInMessage(reinterpret_cast<HWAVEIN>(device_id), |
- DRV_QUERYDEVICEINTERFACESIZE, |
- reinterpret_cast<DWORD_PTR>(&device_interface_name_size), 0); |
- string16 device_interface_name; |
- string16::value_type* name_ptr = WriteInto(&device_interface_name, |
- device_interface_name_size / sizeof(string16::value_type)); |
- waveInMessage(reinterpret_cast<HWAVEIN>(device_id), |
- DRV_QUERYDEVICEINTERFACE, |
- reinterpret_cast<DWORD_PTR>(name_ptr), |
- static_cast<DWORD_PTR>(device_interface_name_size)); |
- |
- // Enumerate all audio devices and find the one matching the above device |
- // interface name. |
- HDEVINFO device_info = SetupDiGetClassDevs( |
- &AM_KSCATEGORY_AUDIO, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); |
- if (device_info == INVALID_HANDLE_VALUE) |
- return string16(); |
- |
- DWORD interface_index = 0; |
- SP_DEVICE_INTERFACE_DATA interface_data; |
- interface_data.cbSize = sizeof(interface_data); |
- while (SetupDiEnumDeviceInterfaces(device_info, 0, &AM_KSCATEGORY_AUDIO, |
- interface_index++, &interface_data)) { |
- // Query the size of the struct, allocate it and then query the data. |
- SP_DEVINFO_DATA device_data; |
- device_data.cbSize = sizeof(device_data); |
- DWORD interface_detail_size = 0; |
- SetupDiGetDeviceInterfaceDetail(device_info, &interface_data, 0, 0, |
- &interface_detail_size, &device_data); |
- if (!interface_detail_size) |
- continue; |
- |
- scoped_array<char> interface_detail_buffer(new char[interface_detail_size]); |
- SP_DEVICE_INTERFACE_DETAIL_DATA* interface_detail = |
- reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA*>( |
- interface_detail_buffer.get()); |
- interface_detail->cbSize = interface_detail_size; |
- if (!SetupDiGetDeviceInterfaceDetail(device_info, &interface_data, |
- interface_detail, |
- interface_detail_size, NULL, |
- &device_data)) |
- return string16(); |
- |
- bool device_found = (device_interface_name == interface_detail->DevicePath); |
- |
- if (device_found) |
- return GetDeviceAndDriverInfo(device_info, &device_data); |
- } |
- |
- return string16(); |
+ DWORD device_id = 0; |
+ waveInMessage(reinterpret_cast<HWAVEIN>(WAVE_MAPPER), |
+ DRVM_MAPPER_PREFERRED_GET, |
+ reinterpret_cast<DWORD_PTR>(&device_id), NULL); |
+ ULONG device_interface_name_size = 0; |
+ waveInMessage(reinterpret_cast<HWAVEIN>(device_id), |
+ DRV_QUERYDEVICEINTERFACESIZE, |
+ reinterpret_cast<DWORD_PTR>(&device_interface_name_size), 0); |
+ string16 device_interface_name; |
+ string16::value_type* name_ptr = WriteInto(&device_interface_name, |
+ device_interface_name_size / sizeof(string16::value_type)); |
+ waveInMessage(reinterpret_cast<HWAVEIN>(device_id), |
+ DRV_QUERYDEVICEINTERFACE, |
+ reinterpret_cast<DWORD_PTR>(name_ptr), |
+ static_cast<DWORD_PTR>(device_interface_name_size)); |
+ |
+ // Enumerate all audio devices and find the one matching the above device |
+ // interface name. |
+ HDEVINFO device_info = SetupDiGetClassDevs( |
+ &AM_KSCATEGORY_AUDIO, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); |
+ if (device_info == INVALID_HANDLE_VALUE) |
+ return string16(); |
+ |
+ DWORD interface_index = 0; |
+ SP_DEVICE_INTERFACE_DATA interface_data; |
+ interface_data.cbSize = sizeof(interface_data); |
+ while (SetupDiEnumDeviceInterfaces(device_info, 0, &AM_KSCATEGORY_AUDIO, |
+ interface_index++, &interface_data)) { |
+ // Query the size of the struct, allocate it and then query the data. |
+ SP_DEVINFO_DATA device_data; |
+ device_data.cbSize = sizeof(device_data); |
+ DWORD interface_detail_size = 0; |
+ SetupDiGetDeviceInterfaceDetail(device_info, &interface_data, 0, 0, |
+ &interface_detail_size, &device_data); |
+ if (!interface_detail_size) |
+ continue; |
+ |
+ scoped_array<char> interface_detail_buffer(new char[interface_detail_size]); |
+ SP_DEVICE_INTERFACE_DETAIL_DATA* interface_detail = |
+ reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA*>( |
+ interface_detail_buffer.get()); |
+ interface_detail->cbSize = interface_detail_size; |
+ if (!SetupDiGetDeviceInterfaceDetail(device_info, &interface_data, |
+ interface_detail, |
+ interface_detail_size, NULL, |
+ &device_data)) |
+ return string16(); |
+ |
+ bool device_found = (device_interface_name == interface_detail->DevicePath); |
+ |
+ if (device_found) |
+ return GetDeviceAndDriverInfo(device_info, &device_data); |
+ } |
+ |
+ return string16(); |
} |
// static |