summaryrefslogtreecommitdiff
path: root/chromium/media/audio/win
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/audio/win')
-rw-r--r--chromium/media/audio/win/audio_device_listener_win.cc2
-rw-r--r--chromium/media/audio/win/audio_device_listener_win.h2
-rw-r--r--chromium/media/audio/win/audio_device_listener_win_unittest.cc2
-rw-r--r--chromium/media/audio/win/audio_edid_scan_win.cc185
-rw-r--r--chromium/media/audio/win/audio_edid_scan_win.h36
-rw-r--r--chromium/media/audio/win/audio_low_latency_input_win.cc22
-rw-r--r--chromium/media/audio/win/audio_low_latency_input_win.h2
-rw-r--r--chromium/media/audio/win/audio_low_latency_input_win_unittest.cc12
-rw-r--r--chromium/media/audio/win/audio_low_latency_output_win.cc50
-rw-r--r--chromium/media/audio/win/audio_low_latency_output_win.h5
-rw-r--r--chromium/media/audio/win/audio_low_latency_output_win_unittest.cc7
-rw-r--r--chromium/media/audio/win/audio_manager_win.cc103
-rw-r--r--chromium/media/audio/win/audio_manager_win.h16
-rw-r--r--chromium/media/audio/win/audio_output_win_unittest.cc40
-rw-r--r--chromium/media/audio/win/audio_session_event_listener_win.cc2
-rw-r--r--chromium/media/audio/win/audio_session_event_listener_win.h2
-rw-r--r--chromium/media/audio/win/audio_session_event_listener_win_unittest.cc2
-rw-r--r--chromium/media/audio/win/avrt_wrapper_win.cc2
-rw-r--r--chromium/media/audio/win/avrt_wrapper_win.h2
-rw-r--r--chromium/media/audio/win/core_audio_util_win.cc26
-rw-r--r--chromium/media/audio/win/core_audio_util_win.h2
-rw-r--r--chromium/media/audio/win/core_audio_util_win_unittest.cc2
-rw-r--r--chromium/media/audio/win/device_enumeration_win.cc2
-rw-r--r--chromium/media/audio/win/device_enumeration_win.h2
-rw-r--r--chromium/media/audio/win/device_enumeration_win_unittest.cc2
-rw-r--r--chromium/media/audio/win/volume_range_util.cc2
-rw-r--r--chromium/media/audio/win/volume_range_util.h2
-rw-r--r--chromium/media/audio/win/volume_range_util_unittest.cc2
-rw-r--r--chromium/media/audio/win/waveout_output_win.cc2
-rw-r--r--chromium/media/audio/win/waveout_output_win.h2
30 files changed, 438 insertions, 102 deletions
diff --git a/chromium/media/audio/win/audio_device_listener_win.cc b/chromium/media/audio/win/audio_device_listener_win.cc
index cdf7bec9061..c83f2128968 100644
--- a/chromium/media/audio/win/audio_device_listener_win.cc
+++ b/chromium/media/audio/win/audio_device_listener_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/audio_device_listener_win.h b/chromium/media/audio/win/audio_device_listener_win.h
index 5d6b3b490c2..f605959f37f 100644
--- a/chromium/media/audio/win/audio_device_listener_win.h
+++ b/chromium/media/audio/win/audio_device_listener_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/audio_device_listener_win_unittest.cc b/chromium/media/audio/win/audio_device_listener_win_unittest.cc
index 92adc71f2c9..964e7263ec7 100644
--- a/chromium/media/audio/win/audio_device_listener_win_unittest.cc
+++ b/chromium/media/audio/win/audio_device_listener_win_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/audio_edid_scan_win.cc b/chromium/media/audio/win/audio_edid_scan_win.cc
new file mode 100644
index 00000000000..9527596f8ce
--- /dev/null
+++ b/chromium/media/audio/win/audio_edid_scan_win.cc
@@ -0,0 +1,185 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/audio/win/audio_edid_scan_win.h"
+
+#include <objbase.h>
+#include <oleauto.h>
+#include <string.h>
+
+#include "base/logging.h"
+#include "base/win/scoped_bstr.h"
+#include "base/win/scoped_variant.h"
+#include "base/win/wmi.h"
+
+namespace media {
+
+// Short Audio Descriptor values defined in ANSI/CEA-861
+enum {
+ kEdidAudioLpcm = 1,
+ kEdidAudioDts = 7,
+ kEdidAudioDtsHd = 11,
+};
+
+namespace {
+
+uint32_t EdidParseBlocks(const uint8_t* data, int data_size) {
+ const uint8_t *block = data, *block_end = data + data_size;
+ static constexpr uint8_t kBaseHeader[] = {0, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0};
+ constexpr uint8_t kEdidAudio = 1;
+ constexpr uint8_t kExtensionTagCea = 2;
+ constexpr int kBlockSize = 128;
+ constexpr uint8_t kSadSize = 3;
+ uint32_t bitstream_mask = 0;
+
+ // http://crbug.com/1371473
+ // TODO(dcheng): Use base::BufferIterator to parse EDID block
+ // Skip base EDID structure if present
+ if (block + kBlockSize <= block_end &&
+ (memcmp(block, kBaseHeader, sizeof(kBaseHeader)) == 0)) {
+ block += kBlockSize;
+ }
+
+ // Process CEA EDID (tag 2) extension blocks
+ for (; block + kBlockSize <= block_end; block += kBlockSize) {
+ if (block[0] != kExtensionTagCea)
+ continue;
+
+ // Process the audio data blocks containing Short Audio Descriptors (SADs),
+ // which are three bytes each. SADs start at byte 4 and end before the
+ // byte specified in block[2].
+ const uint8_t *db = block + 4, *db_end = block + block[2];
+ if (db_end > block_end)
+ continue;
+ for (; db + kSadSize <= db_end && db[0]; db += (db[0] & 0x1F) + 1) {
+ if ((db[0] >> 5) != kEdidAudio)
+ continue;
+
+ const int len = 1 + (db[0] & 0x1F);
+ if (db + len > db_end)
+ continue;
+
+ for (int i = 1; i < len; i += 3) {
+ switch ((db[i] >> 3) & 15) {
+ case kEdidAudioLpcm:
+ bitstream_mask |= kAudioBitstreamPcmLinear;
+ break;
+ case kEdidAudioDts:
+ bitstream_mask |= kAudioBitstreamDts;
+ break;
+ case kEdidAudioDtsHd:
+ bitstream_mask |= kAudioBitstreamDts;
+ bitstream_mask |= kAudioBitstreamDtsHd;
+ break;
+ }
+ }
+ }
+ }
+
+ DVLOG(1) << "SERVICE: EdidParseBlocks bitstream mask " << bitstream_mask;
+ return bitstream_mask;
+}
+
+} // namespace
+
+uint32_t ScanEdidBitstreams() {
+ // The WMI service allows the querying of monitor-type devices which report
+ // Extended Display Identification Data (EDID). The WMI service can be
+ // queried for a list of COM objects which represent the "paths" which
+ // are associated with individual EDID devices. Querying each of those
+ // paths using the WmiGetMonitorRawEEdidV1Block method returns the EDID
+ // blocks for those devices. We query the extended blocks which contain
+ // the Short Audio Descriptor (SAD), and parse them to obtain a bitmask
+ // indicating which audio content is supported. The mask consists of
+ // AudioParameters::Format flags. If multiple EDID devices are present,
+ // the intersection of flags is reported.
+ Microsoft::WRL::ComPtr<IWbemServices> wmi_services =
+ base::win::CreateWmiConnection(true, L"ROOT\\WMI");
+ if (!wmi_services)
+ return 0;
+
+ Microsoft::WRL::ComPtr<IWbemClassObject> get_edid_block;
+ if (!base::win::CreateWmiClassMethodObject(
+ wmi_services.Get(), L"WmiMonitorDescriptorMethods",
+ L"WmiGetMonitorRawEEdidV1Block", &get_edid_block)) {
+ return 0;
+ }
+
+ Microsoft::WRL::ComPtr<IEnumWbemClassObject> wmi_enumerator;
+ HRESULT hr = wmi_services->CreateInstanceEnum(
+ base::win::ScopedBstr(L"WmiMonitorDescriptorMethods").Get(),
+ WBEM_FLAG_FORWARD_ONLY, nullptr, &wmi_enumerator);
+ if (FAILED(hr))
+ return 0;
+
+ base::win::ScopedVariant block_id(1);
+ bool first = true;
+ uint32_t bitstream_mask = 0;
+
+ while (true) {
+ Microsoft::WRL::ComPtr<IWbemClassObject> class_object;
+ ULONG items_returned = 0;
+ hr = wmi_enumerator->Next(WBEM_INFINITE, 1, &class_object, &items_returned);
+ if (FAILED(hr) || hr == WBEM_S_FALSE || items_returned == 0)
+ break;
+
+ base::win::ScopedVariant path;
+ class_object->Get(L"__PATH", 0, path.Receive(), nullptr, nullptr);
+
+ if (FAILED(get_edid_block->Put(L"BlockId", 0, block_id.AsInput(), 0)))
+ break;
+
+ Microsoft::WRL::ComPtr<IWbemClassObject> out_params;
+ hr = wmi_services->ExecMethod(
+ V_BSTR(path.ptr()),
+ base::win::ScopedBstr(L"WmiGetMonitorRawEEdidV1Block").Get(), 0,
+ nullptr, get_edid_block.Get(), &out_params, nullptr);
+ if (FAILED(hr))
+ break;
+
+ base::win::ScopedVariant block_type;
+ if (FAILED(out_params->Get(L"BlockType", 0, block_type.Receive(), nullptr,
+ 0))) {
+ continue;
+ }
+
+ base::win::ScopedVariant block_content;
+ if (FAILED(out_params->Get(L"BlockContent", 0, block_content.Receive(),
+ nullptr, 0))) {
+ continue;
+ }
+
+ if (V_I4(block_type.ptr()) != 255)
+ continue;
+
+ if (block_content.type() != (VT_ARRAY | VT_UI1))
+ continue;
+
+ SAFEARRAY* array = V_ARRAY(block_content.ptr());
+ if (SafeArrayGetDim(array) != 1)
+ continue;
+
+ long lower_bound = 0;
+ long upper_bound = 0;
+ SafeArrayGetLBound(array, 1, &lower_bound);
+ SafeArrayGetUBound(array, 1, &upper_bound);
+ if (lower_bound || upper_bound <= lower_bound)
+ continue;
+
+ uint8_t* block = nullptr;
+ SafeArrayAccessData(array, reinterpret_cast<void**>(&block));
+ if (first) {
+ first = false;
+ bitstream_mask = EdidParseBlocks(block, upper_bound + 1);
+ } else {
+ bitstream_mask &= EdidParseBlocks(block, upper_bound + 1);
+ }
+ SafeArrayUnaccessData(array);
+ }
+
+ return bitstream_mask;
+}
+
+} // namespace media
diff --git a/chromium/media/audio/win/audio_edid_scan_win.h b/chromium/media/audio/win/audio_edid_scan_win.h
new file mode 100644
index 00000000000..f57275e6ea2
--- /dev/null
+++ b/chromium/media/audio/win/audio_edid_scan_win.h
@@ -0,0 +1,36 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_AUDIO_WIN_AUDIO_EDID_SCAN_WIN_H_
+#define MEDIA_AUDIO_WIN_AUDIO_EDID_SCAN_WIN_H_
+
+#include <stdint.h>
+
+#include "media/base/media_export.h"
+
+namespace media {
+
+// The WMI service allows the querying of monitor-type devices which report
+// Extended Display Identification Data (EDID). The WMI service can be
+// queried for a list of COM objects which represent the "paths" which
+// are associated with individual EDID devices. Querying each of those
+// paths using the WmiGetMonitorRawEEdidV1Block method returns the EDID
+// blocks for those devices. We query the extended blocks which contain
+// the Short Audio Descriptor (SAD), and parse them to obtain a bitmask
+// indicating which audio content is supported. The mask consists of
+// AudioParameters::Format flags. If multiple EDID devices are present,
+// the intersection of flags is reported.
+MEDIA_EXPORT uint32_t ScanEdidBitstreams();
+
+// Bitmask returned by ScanEdidBitstreams. Set bits indicate detected
+// audio passthrough support.
+enum : uint32_t {
+ kAudioBitstreamPcmLinear = 0x001, // PCM is 'raw' amplitude samples.
+ kAudioBitstreamDts = 0x002, // Compressed DTS bitstream.
+ kAudioBitstreamDtsHd = 0x004, // Compressed DTS-HD bitstream.
+};
+
+} // namespace media
+
+#endif // MEDIA_AUDIO_WIN_AUDIO_EDID_SCAN_WIN_H_
diff --git a/chromium/media/audio/win/audio_low_latency_input_win.cc b/chromium/media/audio/win/audio_low_latency_input_win.cc
index b95f1b5319c..23372ebe4e4 100644
--- a/chromium/media/audio/win/audio_low_latency_input_win.cc
+++ b/chromium/media/audio/win/audio_low_latency_input_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -14,7 +14,6 @@
#include <memory>
#include <utility>
-#include "base/command_line.h"
#include "base/logging.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
@@ -424,9 +423,8 @@ AudioInputStream::OpenOutcome WASAPIAudioInputStream::Open() {
}
}
- const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
use_fake_audio_capture_timestamps_ =
- cmd_line->HasSwitch(switches::kUseFakeAudioCaptureTimestamps);
+ base::FeatureList::IsEnabled(media::kUseFakeAudioCaptureTimestamps);
if (use_fake_audio_capture_timestamps_) {
SendLogMessage("%s => (WARNING: capture timestamps will be fake)",
__func__);
@@ -651,15 +649,13 @@ void WASAPIAudioInputStream::Close() {
base::UmaHistogramBoolean("Media.Audio.RawProcessingSupportedWin",
raw_processing_supported_);
+ // These UMAs are deprecated but keep adding the information as text logs
+ // for debugging purposes.
for (auto const& type : default_effect_types_) {
- base::UmaHistogramSparse("Media.Audio.Capture.Win.DefaultEffectType",
- type);
SendLogMessage("%s => (Media.Audio.Capture.Win.DefaultEffectType=%s)",
__func__, EffectTypeToString(type));
}
-
for (auto const& type : raw_effect_types_) {
- base::UmaHistogramSparse("Media.Audio.Capture.Win.RawEffectType", type);
SendLogMessage("%s => (Media.Audio.Capture.Win.RawEffectType=%s)",
__func__, EffectTypeToString(type));
}
@@ -1464,10 +1460,12 @@ void WASAPIAudioInputStream::SetupConverterAndStoreFormatInfo() {
double new_frames_per_buffer =
input_format_.Format.nSamplesPerSec / buffer_ratio;
- const auto input_layout = GuessChannelLayout(input_format_.Format.nChannels);
- DCHECK_NE(CHANNEL_LAYOUT_UNSUPPORTED, input_layout);
- const auto output_layout = GuessChannelLayout(output_format_.nChannels);
- DCHECK_NE(CHANNEL_LAYOUT_UNSUPPORTED, output_layout);
+ const auto input_layout =
+ ChannelLayoutConfig::Guess(input_format_.Format.nChannels);
+ DCHECK_NE(CHANNEL_LAYOUT_UNSUPPORTED, input_layout.channel_layout());
+ const auto output_layout =
+ ChannelLayoutConfig::Guess(output_format_.nChannels);
+ DCHECK_NE(CHANNEL_LAYOUT_UNSUPPORTED, output_layout.channel_layout());
const AudioParameters input(AudioParameters::AUDIO_PCM_LOW_LATENCY,
input_layout, input_format_.Format.nSamplesPerSec,
diff --git a/chromium/media/audio/win/audio_low_latency_input_win.h b/chromium/media/audio/win/audio_low_latency_input_win.h
index 26c7e379473..3357e5b7bb7 100644
--- a/chromium/media/audio/win/audio_low_latency_input_win.h
+++ b/chromium/media/audio/win/audio_low_latency_input_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
diff --git a/chromium/media/audio/win/audio_low_latency_input_win_unittest.cc b/chromium/media/audio/win/audio_low_latency_input_win_unittest.cc
index 6553abc1336..a4daa049897 100644
--- a/chromium/media/audio/win/audio_low_latency_input_win_unittest.cc
+++ b/chromium/media/audio/win/audio_low_latency_input_win_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -615,12 +615,12 @@ TEST_F(WinAudioInputTest, DISABLED_WASAPIAudioInputStreamResampleToFile) {
struct TestData {
const int rate;
const int frames;
- ChannelLayout layout;
+ ChannelLayoutConfig layout;
} tests[] = {
- {8000, 80, CHANNEL_LAYOUT_MONO},
- {8000, 80, CHANNEL_LAYOUT_STEREO},
- {44100, 441, CHANNEL_LAYOUT_MONO},
- {44100, 1024, CHANNEL_LAYOUT_STEREO},
+ {8000, 80, media::ChannelLayoutConfig::Mono()},
+ {8000, 80, media::ChannelLayoutConfig::Stereo()},
+ {44100, 441, media::ChannelLayoutConfig::Mono()},
+ {44100, 1024, media::ChannelLayoutConfig::Stereo()},
};
for (const auto& test : tests) {
diff --git a/chromium/media/audio/win/audio_low_latency_output_win.cc b/chromium/media/audio/win/audio_low_latency_output_win.cc
index c3a4facf84d..5767a6bafa1 100644
--- a/chromium/media/audio/win/audio_low_latency_output_win.cc
+++ b/chromium/media/audio/win/audio_low_latency_output_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -89,6 +89,7 @@ WASAPIAudioOutputStream::WASAPIAudioOutputStream(
manager_(manager),
glitch_reporter_(SystemGlitchReporter::StreamType::kRender),
format_(),
+ params_(params),
opened_(false),
volume_(1.0),
packet_size_frames_(0),
@@ -102,6 +103,10 @@ WASAPIAudioOutputStream::WASAPIAudioOutputStream(
source_(nullptr),
log_callback_(std::move(log_callback)) {
DCHECK(manager_);
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ if (params.format() == AudioParameters::AUDIO_BITSTREAM_DTS)
+ DCHECK_EQ(GetShareMode(), AUDCLNT_SHAREMODE_EXCLUSIVE);
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
// The empty string is used to indicate a default device and the
// |device_role_| member controls whether that's the default or default
@@ -138,13 +143,28 @@ WASAPIAudioOutputStream::WASAPIAudioOutputStream(
format_.Samples.wValidBitsPerSample = format->wBitsPerSample;
format_.dwChannelMask = CoreAudioUtil::GetChannelConfig(device_id, eRender);
format_.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
- SendLogMessage("%s => (audio engine format=[%s])", __func__,
- CoreAudioUtil::WaveFormatToString(&format_).c_str());
// Store size (in different units) of audio packets which we expect to
// get from the audio endpoint device in each render event.
packet_size_frames_ = params.frames_per_buffer();
packet_size_bytes_ = params.GetBytesPerBuffer(kSampleFormatF32);
+
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ if (params.format() == AudioParameters::AUDIO_BITSTREAM_DTS) {
+ format_.SubFormat = KSDATAFORMAT_SUBTYPE_IEC61937_DTS;
+ format->wBitsPerSample = 16;
+ format->nChannels = 2;
+ format_.dwChannelMask = KSAUDIO_SPEAKER_STEREO;
+ format_.Samples.wValidBitsPerSample = format->wBitsPerSample;
+ format->nBlockAlign = (format->wBitsPerSample / 8) * format->nChannels;
+ format->nAvgBytesPerSec = format->nSamplesPerSec * format->nBlockAlign;
+ packet_size_frames_ = 512;
+ packet_size_bytes_ = params.GetBytesPerBuffer(kSampleFormatS16);
+ }
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ SendLogMessage("%s => (audio engine format=[%s])", __func__,
+ CoreAudioUtil::WaveFormatToString(&format_).c_str());
+
SendLogMessage("%s => (packet size=[%zu bytes/%zu audio frames/%.3f ms])",
__func__, packet_size_bytes_, packet_size_frames_,
params.GetBufferDuration().InMillisecondsF());
@@ -462,6 +482,10 @@ void WASAPIAudioOutputStream::Close() {
void WASAPIAudioOutputStream::Flush() {}
void WASAPIAudioOutputStream::SetVolume(double volume) {
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ if (params_.format() == AudioParameters::AUDIO_BITSTREAM_DTS)
+ return;
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
SendLogMessage("%s({volume=%.2f})", __func__, volume);
float volume_float = static_cast<float>(volume);
if (volume_float < 0.0f || volume_float > 1.0f) {
@@ -707,11 +731,29 @@ bool WASAPIAudioOutputStream::RenderAudioFromSource(UINT64 device_frequency) {
// Read a data packet from the registered client source and
// deliver a delay estimate in the same callback to the client.
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ if (params_.format() == AudioParameters::AUDIO_BITSTREAM_DTS) {
+ std::unique_ptr<AudioBus> audio_bus(
+ AudioBus::WrapMemory(params_, audio_data));
+ audio_bus_->set_is_bitstream_format(true);
+ int frames_filled =
+ source_->OnMoreData(delay, delay_timestamp, 0, audio_bus.get());
+
+ // During pause/seek, keep the pipeline filled with zero'ed frames.
+ if (!frames_filled)
+ memset(audio_data, 0, packet_size_frames_);
+
+ // Release the buffer space acquired in the GetBuffer() call.
+ // Render silence if we were not able to fill up the buffer totally.
+ audio_render_client_->ReleaseBuffer(packet_size_frames_, 0);
+ num_written_frames_ += packet_size_frames_;
+ return true;
+ }
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
int frames_filled =
source_->OnMoreData(delay, delay_timestamp, 0, audio_bus_.get());
uint32_t num_filled_bytes = frames_filled * format_.Format.nBlockAlign;
DCHECK_LE(num_filled_bytes, packet_size_bytes_);
-
audio_bus_->Scale(volume_);
// We skip clipping since that occurs at the shared memory boundary.
diff --git a/chromium/media/audio/win/audio_low_latency_output_win.h b/chromium/media/audio/win/audio_low_latency_output_win.h
index 27c9b1ea79c..19950f18971 100644
--- a/chromium/media/audio/win/audio_low_latency_output_win.h
+++ b/chromium/media/audio/win/audio_low_latency_output_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -207,6 +207,9 @@ class MEDIA_EXPORT WASAPIAudioOutputStream
// Use this for multiple channel and hi-resolution PCM data.
WAVEFORMATPCMEX format_;
+ // AudioParameters from the constructor.
+ const AudioParameters params_;
+
// Set to true when stream is successfully opened.
bool opened_;
diff --git a/chromium/media/audio/win/audio_low_latency_output_win_unittest.cc b/chromium/media/audio/win/audio_low_latency_output_win_unittest.cc
index b91239aceeb..e1495c783aa 100644
--- a/chromium/media/audio/win/audio_low_latency_output_win_unittest.cc
+++ b/chromium/media/audio/win/audio_low_latency_output_win_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -204,11 +204,8 @@ class AudioOutputStreamWrapper {
private:
AudioOutputStream* CreateOutputStream() {
- AudioParameters params(format_, channel_layout_, sample_rate_,
+ AudioParameters params(format_, {channel_layout_, channels_}, sample_rate_,
samples_per_packet_);
- if (channel_layout_ == CHANNEL_LAYOUT_DISCRETE) {
- params.set_channels_for_discrete(channels_);
- }
DVLOG(1) << params.AsHumanReadableString();
AudioOutputStream* aos = audio_man_->MakeAudioOutputStream(
params, std::string(), AudioManager::LogCallback());
diff --git a/chromium/media/audio/win/audio_manager_win.cc b/chromium/media/audio/win/audio_manager_win.cc
index 370edec9e9f..611e3006d4a 100644
--- a/chromium/media/audio/win/audio_manager_win.cc
+++ b/chromium/media/audio/win/audio_manager_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -13,7 +13,6 @@
#include <setupapi.h>
#include <stddef.h>
-#include <memory>
#include <utility>
#include "base/bind.h"
@@ -35,6 +34,10 @@
#include "media/base/limits.h"
#include "media/base/media_switches.h"
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+#include "media/audio/win/audio_edid_scan_win.h"
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+
// The following are defined in various DDK headers, and we (re)define them here
// to avoid adding the DDK as a chrome dependency.
#define DRV_QUERYDEVICEINTERFACE 0x80c
@@ -66,7 +69,26 @@ constexpr int kWinMaxChannels = 8;
// determined from the system
constexpr int kFallbackBufferSize = 2048;
-static int NumberOfWaveOutBuffers() {
+namespace {
+
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+// Passthrough flags as defined in audio_edid_scan_win.h
+uint32_t bitstream_passthrough_bitmask_;
+
+// Convert result from ScanEdidBitstreams to AudioParameters::Format values
+uint32_t ConvertEdidScanToAudioBitstreamFlags(uint32_t edid_scan) {
+ uint32_t bitstream_codecs = 0;
+ if (edid_scan & kAudioBitstreamPcmLinear)
+ bitstream_codecs |= AudioParameters::AUDIO_PCM_LINEAR;
+ if (edid_scan & kAudioBitstreamDts)
+ bitstream_codecs |= AudioParameters::AUDIO_BITSTREAM_DTS;
+ if (edid_scan & kAudioBitstreamDtsHd)
+ bitstream_codecs |= AudioParameters::AUDIO_BITSTREAM_DTS_HD;
+ return bitstream_codecs;
+}
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+
+int NumberOfWaveOutBuffers() {
// Use the user provided buffer count if provided.
int buffers = 0;
std::string buffers_str(
@@ -79,6 +101,8 @@ static int NumberOfWaveOutBuffers() {
return 3;
}
+} // namespace
+
AudioManagerWin::AudioManagerWin(std::unique_ptr<AudioThread> audio_thread,
AudioLogFactory* audio_log_factory)
: AudioManagerBase(std::move(audio_thread), audio_log_factory) {
@@ -183,9 +207,9 @@ AudioParameters AudioManagerWin::GetInputStreamParameters(
// unavailable device. We should track down those code paths (it is likely
// that they actually don't need a real device but depend on the audio
// code path somehow for a configuration - e.g. tab capture).
- parameters =
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
- CHANNEL_LAYOUT_STEREO, 48000, kFallbackBufferSize);
+ parameters = AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Stereo(), 48000,
+ kFallbackBufferSize);
}
int user_buffer_size = GetUserBufferSize();
@@ -218,6 +242,17 @@ AudioOutputStream* AudioManagerWin::MakeLinearOutputStream(
WAVE_MAPPER);
}
+AudioOutputStream* AudioManagerWin::MakeBitstreamOutputStream(
+ const AudioParameters& params,
+ const std::string& device_id,
+ const LogCallback& log_callback) {
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ return MakeLowLatencyOutputStream(params, device_id, log_callback);
+#else // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ return nullptr;
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+}
+
// Factory for the implementations of AudioOutputStream for
// AUDIO_PCM_LOW_LATENCY mode. Two implementations should suffice most
// windows user's needs.
@@ -227,7 +262,14 @@ AudioOutputStream* AudioManagerWin::MakeLowLatencyOutputStream(
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) {
- DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format());
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ DCHECK(params.format() == AudioParameters::AUDIO_BITSTREAM_DTS ||
+ params.format() == AudioParameters::AUDIO_PCM_LOW_LATENCY)
+ << params.format();
+#else
+ DCHECK_EQ(params.format(), AudioParameters::AUDIO_PCM_LOW_LATENCY);
+#endif
+
if (params.channels() > kWinMaxChannels)
return nullptr;
@@ -290,16 +332,13 @@ AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters(
const std::string& output_device_id,
const AudioParameters& input_params) {
const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
- int channels = 0;
- ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
+ ChannelLayoutConfig channel_layout_config = ChannelLayoutConfig::Stereo();
int sample_rate = 48000;
int buffer_size = kFallbackBufferSize;
int effects = AudioParameters::NO_EFFECTS;
int min_buffer_size = 0;
int max_buffer_size = 0;
- // TODO(henrika): Remove kEnableExclusiveAudio and related code. It doesn't
- // look like it's used.
if (cmd_line->HasSwitch(switches::kEnableExclusiveAudio)) {
// TODO(rtoy): tune these values for best possible WebAudio
// performance. WebRTC works well at 48kHz and a buffer size of 480
@@ -309,7 +348,7 @@ AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters(
sample_rate = 48000;
buffer_size = 256;
if (input_params.IsValid())
- channel_layout = input_params.channel_layout();
+ channel_layout_config = input_params.channel_layout_config();
} else {
AudioParameters params;
HRESULT hr = CoreAudioUtil::GetPreferredAudioParameters(
@@ -329,9 +368,8 @@ AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters(
DVLOG(1) << params.AsHumanReadableString();
DCHECK(params.IsValid());
- channels = params.channels();
+ channel_layout_config = params.channel_layout_config();
buffer_size = params.frames_per_buffer();
- channel_layout = params.channel_layout();
sample_rate = params.sample_rate();
effects = params.effects();
@@ -347,12 +385,13 @@ AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters(
// have a valid channel layout yet, try to use the input layout. See bugs
// http://crbug.com/259165 and http://crbug.com/311906 for more details.
if (cmd_line->HasSwitch(switches::kTrySupportedChannelLayouts) ||
- channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) {
+ channel_layout_config.channel_layout() == CHANNEL_LAYOUT_UNSUPPORTED) {
// Check if it is possible to open up at the specified input channel
// layout but avoid checking if the specified layout is the same as the
// hardware (preferred) layout. We do this extra check to avoid the
// CoreAudioUtil::IsChannelLayoutSupported() overhead in most cases.
- if (input_params.channel_layout() != channel_layout) {
+ if (input_params.channel_layout() !=
+ channel_layout_config.channel_layout()) {
// TODO(henrika): Internally, IsChannelLayoutSupported does many of the
// operations that have already been done such as opening up a client
// and fetching the WAVEFORMATPCMEX format. Ideally we should only do
@@ -363,9 +402,10 @@ AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters(
input_params.channel_layout())) {
// Open up using the same channel layout as the source if it is
// supported by the hardware.
- channel_layout = input_params.channel_layout();
+ channel_layout_config = input_params.channel_layout_config();
DVLOG(1) << "Hardware channel layout is not used; using same layout"
- << " as the source instead (" << channel_layout << ")";
+ << " as the source instead ("
+ << channel_layout_config.channel_layout() << ")";
}
}
}
@@ -384,14 +424,21 @@ AudioParameters AudioManagerWin::GetPreferredOutputStreamParameters(
if (user_buffer_size)
buffer_size = user_buffer_size;
- AudioParameters params(
- AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, sample_rate,
- buffer_size,
- AudioParameters::HardwareCapabilities(min_buffer_size, max_buffer_size));
- params.set_effects(effects);
- if (channel_layout == CHANNEL_LAYOUT_DISCRETE) {
- params.set_channels_for_discrete(channels);
+ AudioParameters::HardwareCapabilities hardware_capabilities(min_buffer_size,
+ max_buffer_size);
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ hardware_capabilities.bitstream_formats = 0;
+ hardware_capabilities.require_encapsulation = false;
+ if (WASAPIAudioOutputStream::GetShareMode() == AUDCLNT_SHAREMODE_EXCLUSIVE) {
+ hardware_capabilities.bitstream_formats =
+ ConvertEdidScanToAudioBitstreamFlags(bitstream_passthrough_bitmask_);
+ hardware_capabilities.require_encapsulation = true;
}
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ AudioParameters params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+ channel_layout_config, sample_rate, buffer_size,
+ hardware_capabilities);
+ params.set_effects(effects);
DCHECK(params.IsValid());
return params;
}
@@ -404,4 +451,10 @@ std::unique_ptr<AudioManager> CreateAudioManager(
audio_log_factory);
}
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+void AudioManagerWin::SetBitstreamPassthroughBitmask(uint32_t bitmask) {
+ bitstream_passthrough_bitmask_ = bitmask;
+}
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+
} // namespace media
diff --git a/chromium/media/audio/win/audio_manager_win.h b/chromium/media/audio/win/audio_manager_win.h
index d6b0774307d..2f6bf87907d 100644
--- a/chromium/media/audio/win/audio_manager_win.h
+++ b/chromium/media/audio/win/audio_manager_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -9,6 +9,7 @@
#include <string>
#include "media/audio/audio_manager_base.h"
+#include "media/media_buildflags.h"
namespace media {
@@ -54,11 +55,20 @@ class MEDIA_EXPORT AudioManagerWin : public AudioManagerBase {
const AudioParameters& params,
const std::string& device_id,
const LogCallback& log_callback) override;
+ AudioOutputStream* MakeBitstreamOutputStream(
+ const AudioParameters& params,
+ const std::string& device_id,
+ const LogCallback& log_callback) override;
std::string GetDefaultInputDeviceID() override;
std::string GetDefaultOutputDeviceID() override;
std::string GetCommunicationsInputDeviceID() override;
std::string GetCommunicationsOutputDeviceID() override;
+#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+ // Bitmask indicating which audio codecs are playable using passthrough.
+ static void SetBitstreamPassthroughBitmask(uint32_t bitmask);
+#endif // BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
+
protected:
void ShutdownOnAudioThread() override;
AudioParameters GetPreferredOutputStreamParameters(
@@ -75,6 +85,10 @@ class MEDIA_EXPORT AudioManagerWin : public AudioManagerBase {
void GetAudioDeviceNamesImpl(bool input, AudioDeviceNames* device_names);
+ AudioOutputStream* MakeOutputStream(const AudioParameters& params,
+ const std::string& device_id,
+ const LogCallback& log_callback);
+
// Listen for output device changes.
std::unique_ptr<AudioDeviceListenerWin> output_device_listener_;
};
diff --git a/chromium/media/audio/win/audio_output_win_unittest.cc b/chromium/media/audio/win/audio_output_win_unittest.cc
index fa193d5aa8d..9b537b97cce 100644
--- a/chromium/media/audio/win/audio_output_win_unittest.cc
+++ b/chromium/media/audio/win/audio_output_win_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -184,8 +184,8 @@ TEST_F(WinAudioTest, PCMWaveStreamGetAndClose) {
ABORT_AUDIO_TEST_IF_NOT(audio_manager_device_info_->HasAudioOutputDevices());
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
- 8000, 256),
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Stereo(), 8000, 256),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
oas->Close();
@@ -196,8 +196,8 @@ TEST_F(WinAudioTest, PCMWaveStreamOpenAndClose) {
ABORT_AUDIO_TEST_IF_NOT(audio_manager_device_info_->HasAudioOutputDevices());
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO,
- 8000, 256),
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Stereo(), 8000, 256),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
EXPECT_TRUE(oas->Open());
@@ -211,8 +211,8 @@ TEST_F(WinAudioTest, PCMWaveSlowSource) {
ABORT_AUDIO_TEST_IF_NOT(audio_manager_device_info_->HasAudioOutputDevices());
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
- 16000, 256),
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(), 16000, 256),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
TestSourceLaggy test_laggy(90);
@@ -236,7 +236,8 @@ TEST_F(WinAudioTest, PCMWaveStreamPlaySlowLoop) {
uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10;
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(),
AudioParameters::kAudioCDSampleRate, samples_100_ms),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
@@ -266,7 +267,8 @@ TEST_F(WinAudioTest, PCMWaveStreamPlay200HzTone44Kss) {
uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10;
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(),
AudioParameters::kAudioCDSampleRate, samples_100_ms),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
@@ -290,7 +292,8 @@ TEST_F(WinAudioTest, PCMWaveStreamPlay200HzTone22Kss) {
uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 20;
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(),
AudioParameters::kAudioCDSampleRate / 2, samples_100_ms),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
@@ -326,8 +329,8 @@ TEST_F(WinAudioTest, PushSourceFile16KHz) {
source.CapSamples(kSamples100ms);
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
- kSampleRate, kSamples100ms),
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(), kSampleRate, kSamples100ms),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
@@ -359,7 +362,8 @@ TEST_F(WinAudioTest, PCMWaveStreamPlayTwice200HzTone44Kss) {
uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10;
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(),
AudioParameters::kAudioCDSampleRate, samples_100_ms),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
@@ -398,7 +402,7 @@ TEST_F(WinAudioTest, PCMWaveStreamPlay200HzToneLowLatency) {
uint32_t samples_10_ms = sample_rate / 100;
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
- CHANNEL_LAYOUT_MONO, sample_rate, samples_10_ms),
+ ChannelLayoutConfig::Mono(), sample_rate, samples_10_ms),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
@@ -427,7 +431,8 @@ TEST_F(WinAudioTest, PCMWaveStreamPendingBytes) {
uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10;
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
- AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+ AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(),
AudioParameters::kAudioCDSampleRate, samples_100_ms),
std::string(), AudioManager::LogCallback());
ASSERT_TRUE(NULL != oas);
@@ -599,8 +604,9 @@ TEST_F(WinAudioTest, SyncSocketBasic) {
// We want 2 seconds of audio, which means we need 100 packets as each packet
// contains 20ms worth of audio samples.
static const int kPackets2s = 100;
- AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
- sample_rate, kSamples20ms);
+ AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR,
+ ChannelLayoutConfig::Mono(), sample_rate,
+ kSamples20ms);
AudioOutputStream* oas = audio_manager_->MakeAudioOutputStream(
params, std::string(), AudioManager::LogCallback());
diff --git a/chromium/media/audio/win/audio_session_event_listener_win.cc b/chromium/media/audio/win/audio_session_event_listener_win.cc
index d344295c077..35f6fe3abb4 100644
--- a/chromium/media/audio/win/audio_session_event_listener_win.cc
+++ b/chromium/media/audio/win/audio_session_event_listener_win.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/audio_session_event_listener_win.h b/chromium/media/audio/win/audio_session_event_listener_win.h
index b3d9ec4ba14..753ee3dee1a 100644
--- a/chromium/media/audio/win/audio_session_event_listener_win.h
+++ b/chromium/media/audio/win/audio_session_event_listener_win.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/audio_session_event_listener_win_unittest.cc b/chromium/media/audio/win/audio_session_event_listener_win_unittest.cc
index 8ee545e808f..7723fc01860 100644
--- a/chromium/media/audio/win/audio_session_event_listener_win_unittest.cc
+++ b/chromium/media/audio/win/audio_session_event_listener_win_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/avrt_wrapper_win.cc b/chromium/media/audio/win/avrt_wrapper_win.cc
index bde2f462eac..13956d330d7 100644
--- a/chromium/media/audio/win/avrt_wrapper_win.cc
+++ b/chromium/media/audio/win/avrt_wrapper_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/avrt_wrapper_win.h b/chromium/media/audio/win/avrt_wrapper_win.h
index 0b3462a8556..7a95f8603ab 100644
--- a/chromium/media/audio/win/avrt_wrapper_win.h
+++ b/chromium/media/audio/win/avrt_wrapper_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
diff --git a/chromium/media/audio/win/core_audio_util_win.cc b/chromium/media/audio/win/core_audio_util_win.cc
index 6bd66dec2fc..7ee461a911e 100644
--- a/chromium/media/audio/win/core_audio_util_win.cc
+++ b/chromium/media/audio/win/core_audio_util_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -25,6 +25,7 @@
#include "base/win/windows_version.h"
#include "media/audio/audio_device_description.h"
#include "media/audio/audio_features.h"
+#include "media/base/channel_layout.h"
#include "media/base/media_switches.h"
#include "media/base/win/mf_helpers.h"
@@ -564,14 +565,8 @@ HRESULT GetPreferredAudioParametersInternal(IAudioClient* client,
// Retrieve the current channel configuration (e.g. CHANNEL_LAYOUT_STEREO).
ChannelLayout channel_layout = GetChannelLayout(format);
-
- AudioParameters audio_params(
- AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, sample_rate,
- frames_per_buffer,
- AudioParameters::HardwareCapabilities(min_frames_per_buffer,
- max_frames_per_buffer));
-
- if (audio_params.channel_layout() == CHANNEL_LAYOUT_DISCRETE) {
+ int channels = ChannelLayoutToChannelCount(channel_layout);
+ if (channel_layout == CHANNEL_LAYOUT_DISCRETE) {
if (!is_output_device) {
// Set the number of channels explicitly to two for input devices if
// the channel layout is discrete to ensure that the parameters are valid
@@ -580,7 +575,7 @@ HRESULT GetPreferredAudioParametersInternal(IAudioClient* client,
// input stream implementation instead.
// See crbug.com/868026 for examples where this approach is needed.
DVLOG(1) << "Forcing number of channels to 2 for CHANNEL_LAYOUT_DISCRETE";
- audio_params.set_channels_for_discrete(2);
+ channels = 2;
} else {
// Some output devices return CHANNEL_LAYOUT_DISCRETE. Keep this channel
// format but update the number of channels with the correct value. The
@@ -588,9 +583,16 @@ HRESULT GetPreferredAudioParametersInternal(IAudioClient* client,
// See crbug.com/957886 for more details.
DVLOG(1) << "Setting number of channels to " << format->nChannels
<< " for CHANNEL_LAYOUT_DISCRETE";
- audio_params.set_channels_for_discrete(format->nChannels);
+ channels = format->nChannels;
}
}
+
+ AudioParameters audio_params(
+ AudioParameters::AUDIO_PCM_LOW_LATENCY, {channel_layout, channels},
+ sample_rate, frames_per_buffer,
+ AudioParameters::HardwareCapabilities(min_frames_per_buffer,
+ max_frames_per_buffer));
+
DVLOG(1) << audio_params.AsHumanReadableString();
DCHECK(audio_params.IsValid());
*params = audio_params;
@@ -1086,7 +1088,7 @@ HRESULT CoreAudioUtil::GetPreferredAudioParameters(const std::string& device_id,
params->channel_layout() != CHANNEL_LAYOUT_DISCRETE) {
DLOG(WARNING)
<< "Replacing existing audio parameter with predefined version";
- params->Reset(params->format(), CHANNEL_LAYOUT_STEREO,
+ params->Reset(params->format(), media::ChannelLayoutConfig::Stereo(),
params->sample_rate(), params->frames_per_buffer());
}
diff --git a/chromium/media/audio/win/core_audio_util_win.h b/chromium/media/audio/win/core_audio_util_win.h
index 0e9a55e6059..441678f9edc 100644
--- a/chromium/media/audio/win/core_audio_util_win.h
+++ b/chromium/media/audio/win/core_audio_util_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/core_audio_util_win_unittest.cc b/chromium/media/audio/win/core_audio_util_win_unittest.cc
index 61f74af3404..3d095ddbfd4 100644
--- a/chromium/media/audio/win/core_audio_util_win_unittest.cc
+++ b/chromium/media/audio/win/core_audio_util_win_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/device_enumeration_win.cc b/chromium/media/audio/win/device_enumeration_win.cc
index df2ad518c86..11b1678768a 100644
--- a/chromium/media/audio/win/device_enumeration_win.cc
+++ b/chromium/media/audio/win/device_enumeration_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/device_enumeration_win.h b/chromium/media/audio/win/device_enumeration_win.h
index 25c162b96ea..d6f73a84244 100644
--- a/chromium/media/audio/win/device_enumeration_win.h
+++ b/chromium/media/audio/win/device_enumeration_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/device_enumeration_win_unittest.cc b/chromium/media/audio/win/device_enumeration_win_unittest.cc
index 0585df46e4b..4de39f7244b 100644
--- a/chromium/media/audio/win/device_enumeration_win_unittest.cc
+++ b/chromium/media/audio/win/device_enumeration_win_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/volume_range_util.cc b/chromium/media/audio/win/volume_range_util.cc
index 086660309c9..06af2063d38 100644
--- a/chromium/media/audio/win/volume_range_util.cc
+++ b/chromium/media/audio/win/volume_range_util.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2021 The Chromium Authors. All rights reserved.
+// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/volume_range_util.h b/chromium/media/audio/win/volume_range_util.h
index 29d0d62c1fa..5dfb07e3215 100644
--- a/chromium/media/audio/win/volume_range_util.h
+++ b/chromium/media/audio/win/volume_range_util.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2021 The Chromium Authors. All rights reserved.
+// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
diff --git a/chromium/media/audio/win/volume_range_util_unittest.cc b/chromium/media/audio/win/volume_range_util_unittest.cc
index cc3098eb69f..ce92863f140 100644
--- a/chromium/media/audio/win/volume_range_util_unittest.cc
+++ b/chromium/media/audio/win/volume_range_util_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2021 The Chromium Authors. All rights reserved.
+// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/waveout_output_win.cc b/chromium/media/audio/win/waveout_output_win.cc
index 09d65e73d31..81222be288a 100644
--- a/chromium/media/audio/win/waveout_output_win.cc
+++ b/chromium/media/audio/win/waveout_output_win.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
diff --git a/chromium/media/audio/win/waveout_output_win.h b/chromium/media/audio/win/waveout_output_win.h
index d99b2757eae..644de74a455 100644
--- a/chromium/media/audio/win/waveout_output_win.h
+++ b/chromium/media/audio/win/waveout_output_win.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.