Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Side by Side Diff: media/audio/win/audio_low_latency_input_win.cc

Issue 367923004: Turn audio ducking on by default on Windows again. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/win/audio_low_latency_input_win.h" 5 #include "media/audio/win/audio_low_latency_input_win.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "media/audio/win/audio_manager_win.h" 10 #include "media/audio/win/audio_manager_win.h"
11 #include "media/audio/win/avrt_wrapper_win.h" 11 #include "media/audio/win/avrt_wrapper_win.h"
12 #include "media/audio/win/core_audio_util_win.h"
12 #include "media/base/audio_bus.h" 13 #include "media/base/audio_bus.h"
13 14
14 using base::win::ScopedComPtr; 15 using base::win::ScopedComPtr;
15 using base::win::ScopedCOMInitializer; 16 using base::win::ScopedCOMInitializer;
16 17
17 namespace media { 18 namespace media {
18 namespace { 19 namespace {
19 20
20 // Returns true if |device| represents the default communication capture device. 21 // Returns true if |device| represents the default communication capture device.
21 bool IsDefaultCommunicationDevice(IMMDeviceEnumerator* enumerator, 22 bool IsDefaultCommunicationDevice(IMMDeviceEnumerator* enumerator,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 91
91 LARGE_INTEGER performance_frequency; 92 LARGE_INTEGER performance_frequency;
92 if (QueryPerformanceFrequency(&performance_frequency)) { 93 if (QueryPerformanceFrequency(&performance_frequency)) {
93 perf_count_to_100ns_units_ = 94 perf_count_to_100ns_units_ =
94 (10000000.0 / static_cast<double>(performance_frequency.QuadPart)); 95 (10000000.0 / static_cast<double>(performance_frequency.QuadPart));
95 } else { 96 } else {
96 DLOG(ERROR) << "High-resolution performance counters are not supported."; 97 DLOG(ERROR) << "High-resolution performance counters are not supported.";
97 } 98 }
98 } 99 }
99 100
100 WASAPIAudioInputStream::~WASAPIAudioInputStream() {} 101 WASAPIAudioInputStream::~WASAPIAudioInputStream() {
102 DCHECK(CalledOnValidThread());
103 }
101 104
102 bool WASAPIAudioInputStream::Open() { 105 bool WASAPIAudioInputStream::Open() {
103 DCHECK(CalledOnValidThread()); 106 DCHECK(CalledOnValidThread());
104 // Verify that we are not already opened. 107 // Verify that we are not already opened.
105 if (opened_) 108 if (opened_)
106 return false; 109 return false;
107 110
108 // Obtain a reference to the IMMDevice interface of the capturing 111 // Obtain a reference to the IMMDevice interface of the capturing
109 // device with the specified unique identifier or role which was 112 // device with the specified unique identifier or role which was
110 // set at construction. 113 // set at construction.
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 // to be valid matches. 508 // to be valid matches.
506 hr = enumerator->GetDefaultAudioEndpoint(eCapture, eCommunications, 509 hr = enumerator->GetDefaultAudioEndpoint(eCapture, eCommunications,
507 endpoint_device_.Receive()); 510 endpoint_device_.Receive());
508 if (endpoint_device_ && device_id_ != AudioManagerBase::kDefaultDeviceId) { 511 if (endpoint_device_ && device_id_ != AudioManagerBase::kDefaultDeviceId) {
509 base::win::ScopedCoMem<WCHAR> communications_id; 512 base::win::ScopedCoMem<WCHAR> communications_id;
510 endpoint_device_->GetId(&communications_id); 513 endpoint_device_->GetId(&communications_id);
511 if (device_id_ != 514 if (device_id_ !=
512 base::WideToUTF8(static_cast<WCHAR*>(communications_id))) { 515 base::WideToUTF8(static_cast<WCHAR*>(communications_id))) {
513 DLOG(WARNING) << "Ducking has been requested for a non-default device." 516 DLOG(WARNING) << "Ducking has been requested for a non-default device."
514 "Not supported."; 517 "Not supported.";
518 // We can't honor the requested effect flag, so turn it off and
519 // continue. We'll check this flag later to see if we've actually
520 // opened up the communications device, so it's important that it
521 // reflects the active state.
522 effects_ &= ~AudioParameters::DUCKING;
515 endpoint_device_.Release(); // Fall back on code below. 523 endpoint_device_.Release(); // Fall back on code below.
516 } 524 }
517 } 525 }
518 } 526 }
519 527
520 if (!endpoint_device_) { 528 if (!endpoint_device_) {
521 if (device_id_ == AudioManagerBase::kDefaultDeviceId) { 529 if (device_id_ == AudioManagerBase::kDefaultDeviceId) {
522 // Retrieve the default capture audio endpoint for the specified role. 530 // Retrieve the default capture audio endpoint for the specified role.
523 // Note that, in Windows Vista, the MMDevice API supports device roles 531 // Note that, in Windows Vista, the MMDevice API supports device roles
524 // but the system-supplied user interface programs do not. 532 // but the system-supplied user interface programs do not.
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 flags = 640 flags =
633 AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST; 641 AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST;
634 } 642 }
635 643
636 // Initialize the audio stream between the client and the device. 644 // Initialize the audio stream between the client and the device.
637 // We connect indirectly through the audio engine by using shared mode. 645 // We connect indirectly through the audio engine by using shared mode.
638 // Note that, |hnsBufferDuration| is set of 0, which ensures that the 646 // Note that, |hnsBufferDuration| is set of 0, which ensures that the
639 // buffer is never smaller than the minimum buffer size needed to ensure 647 // buffer is never smaller than the minimum buffer size needed to ensure
640 // that glitches do not occur between the periodic processing passes. 648 // that glitches do not occur between the periodic processing passes.
641 // This setting should lead to lowest possible latency. 649 // This setting should lead to lowest possible latency.
642 HRESULT hr = audio_client_->Initialize(AUDCLNT_SHAREMODE_SHARED, 650 HRESULT hr = audio_client_->Initialize(
643 flags, 651 AUDCLNT_SHAREMODE_SHARED,
644 0, // hnsBufferDuration 652 flags,
645 0, 653 0, // hnsBufferDuration
646 &format_, 654 0,
647 NULL); 655 &format_,
656 (effects_ & AudioParameters::DUCKING) ? &kCommunicationsSessionId : NULL);
657
648 if (FAILED(hr)) 658 if (FAILED(hr))
649 return hr; 659 return hr;
650 660
651 // Retrieve the length of the endpoint buffer shared between the client 661 // Retrieve the length of the endpoint buffer shared between the client
652 // and the audio engine. The buffer length determines the maximum amount 662 // and the audio engine. The buffer length determines the maximum amount
653 // of capture data that the audio engine can read from the endpoint buffer 663 // of capture data that the audio engine can read from the endpoint buffer
654 // during a single processing pass. 664 // during a single processing pass.
655 // A typical value is 960 audio frames <=> 20ms @ 48kHz sample rate. 665 // A typical value is 960 audio frames <=> 20ms @ 48kHz sample rate.
656 hr = audio_client_->GetBufferSize(&endpoint_buffer_size_frames_); 666 hr = audio_client_->GetBufferSize(&endpoint_buffer_size_frames_);
657 if (FAILED(hr)) 667 if (FAILED(hr))
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 return hr; 741 return hr;
732 742
733 // Obtain a reference to the ISimpleAudioVolume interface which enables 743 // Obtain a reference to the ISimpleAudioVolume interface which enables
734 // us to control the master volume level of an audio session. 744 // us to control the master volume level of an audio session.
735 hr = audio_client_->GetService(__uuidof(ISimpleAudioVolume), 745 hr = audio_client_->GetService(__uuidof(ISimpleAudioVolume),
736 simple_audio_volume_.ReceiveVoid()); 746 simple_audio_volume_.ReceiveVoid());
737 return hr; 747 return hr;
738 } 748 }
739 749
740 } // namespace media 750 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698