Chromium Code Reviews| Index: media/audio/win/audio_device_listener_win.cc |
| diff --git a/media/audio/win/audio_device_listener_win.cc b/media/audio/win/audio_device_listener_win.cc |
| index 624c0ccd7ab0762c147452dad0542600e108a335..ac293bb755d311cc1e255ba2db470e2fcd52f5e8 100644 |
| --- a/media/audio/win/audio_device_listener_win.cc |
| +++ b/media/audio/win/audio_device_listener_win.cc |
| @@ -68,13 +68,6 @@ AudioDeviceListenerWin::AudioDeviceListenerWin(const base::Closure& listener_cb) |
| } |
| device_enumerator_ = device_enumerator; |
| - |
| - default_render_device_id_ = GetDeviceId(eRender, eConsole); |
|
henrika_webrtc
2015/07/21 09:42:24
Nice to get rid of all these ;-)
|
| - default_capture_device_id_ = GetDeviceId(eCapture, eConsole); |
| - default_communications_render_device_id_ = |
| - GetDeviceId(eRender, eCommunications); |
| - default_communications_capture_device_id_ = |
| - GetDeviceId(eCapture, eCommunications); |
| } |
| AudioDeviceListenerWin::~AudioDeviceListenerWin() { |
| @@ -140,41 +133,35 @@ STDMETHODIMP AudioDeviceListenerWin::OnDefaultDeviceChanged( |
| return S_OK; |
| } |
| - // Grab a pointer to the appropriate ID member. |
| - // Note that there are three "?:"'s here to select the right ID. |
| - std::string* current_device_id = |
| - flow == eRender ? ( |
| - role == eConsole ? |
| - &default_render_device_id_ : |
| - &default_communications_render_device_id_ |
| - ) : ( |
| - role == eConsole ? |
| - &default_capture_device_id_ : |
| - &default_communications_capture_device_id_ |
| - ); |
| - |
| // If no device is now available, |new_default_device_id| will be NULL. |
| std::string new_device_id; |
| if (new_default_device_id) |
| new_device_id = base::WideToUTF8(new_default_device_id); |
| + // Only output device changes should be forwarded. Do not attempt to filter |
| + // changes based on device id since some devices may not change their device |
| + // id and instead trigger some internal flow change: http://crbug.com/506712 |
| + // |
| + // We rate limit device changes to avoid a single device change causing back |
| + // to back changes for eCommunications and eConsole; this is worth doing as |
| + // it provides a substantially faster resumption of playback. |
| + bool did_run_listener_cb = false; |
| + const base::TimeTicks now = base::TimeTicks::Now(); |
| + if (flow == eRender && |
| + now - last_device_change_time_ > base::TimeDelta::FromMilliseconds(250)) { |
|
henrika_webrtc
2015/07/21 09:42:23
How did you come up with 250?
DaleCurtis
2015/07/21 19:03:36
Dice roll! Well actually... I physically couldn't
henrika (OOO until Aug 14)
2015/07/22 07:58:20
Acknowledged.
|
| + last_device_change_time_ = now; |
| + listener_cb_.Run(); |
| + did_run_listener_cb = true; |
|
henrika_webrtc
2015/07/21 09:42:23
Is did_run_listener_cb ever used?
DaleCurtis
2015/07/21 19:03:36
In the DVLOG() below.
henrika (OOO until Aug 14)
2015/07/22 07:58:20
Acknowledged.
|
| + } |
| + |
| DVLOG(1) << "OnDefaultDeviceChanged() " |
| << "new_default_device: " |
| - << (new_default_device_id ? |
| - CoreAudioUtil::GetFriendlyName(new_device_id) : "No device") |
| + << (new_default_device_id |
| + ? CoreAudioUtil::GetFriendlyName(new_device_id) |
| + : "no device") |
| << ", flow: " << FlowToString(flow) |
| - << ", role: " << RoleToString(role); |
| - |
| - // Only fire a state change event if the device has actually changed. |
| - // TODO(dalecurtis): This still seems to fire an extra event on my machine for |
| - // an unplug event (probably others too); e.g., we get two transitions to a |
| - // new default device id. |
| - if (new_device_id.compare(*current_device_id) == 0) |
| - return S_OK; |
| - |
| - // Store the new id in the member variable (that current_device_id points to). |
| - *current_device_id = new_device_id; |
| - listener_cb_.Run(); |
| + << ", role: " << RoleToString(role) |
| + << ", notified manager: " << (did_run_listener_cb ? "Yes" : "No"); |
| return S_OK; |
| } |