diff options
Diffstat (limited to 'chromium/media/audio/win')
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. |