summaryrefslogtreecommitdiff
path: root/chromium/media/audio
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-20 13:40:20 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-22 12:41:23 +0000
commit7961cea6d1041e3e454dae6a1da660b453efd238 (patch)
treec0eeb4a9ff9ba32986289c1653d9608e53ccb444 /chromium/media/audio
parentb7034d0803538058e5c9d904ef03cf5eab34f6ef (diff)
downloadqtwebengine-chromium-7961cea6d1041e3e454dae6a1da660b453efd238.tar.gz
BASELINE: Update Chromium to 78.0.3904.130
Change-Id: If185e0c0061b3437531c97c9c8c78f239352a68b Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/media/audio')
-rw-r--r--chromium/media/audio/BUILD.gn2
-rw-r--r--chromium/media/audio/OWNERS1
-rw-r--r--chromium/media/audio/alive_checker_unittest.cc4
-rw-r--r--chromium/media/audio/android/audio_manager_android.cc7
-rw-r--r--chromium/media/audio/android/audio_manager_android.h7
-rw-r--r--chromium/media/audio/android/opensles_output.cc26
-rw-r--r--chromium/media/audio/android/opensles_output.h11
-rw-r--r--chromium/media/audio/audio_debug_file_writer.h5
-rw-r--r--chromium/media/audio/audio_debug_file_writer_unittest.cc22
-rw-r--r--chromium/media/audio/audio_debug_recording_helper_unittest.cc6
-rw-r--r--chromium/media/audio/audio_debug_recording_manager_unittest.cc6
-rw-r--r--chromium/media/audio/audio_debug_recording_session_impl.cc4
-rw-r--r--chromium/media/audio/audio_debug_recording_session_impl_unittest.cc4
-rw-r--r--chromium/media/audio/audio_debug_recording_test.h4
-rw-r--r--chromium/media/audio/audio_device_description.cc4
-rw-r--r--chromium/media/audio/audio_device_description.h6
-rw-r--r--chromium/media/audio/audio_features.cc8
-rw-r--r--chromium/media/audio/audio_input_controller_unittest.cc4
-rw-r--r--chromium/media/audio/audio_input_device_unittest.cc8
-rw-r--r--chromium/media/audio/audio_input_ipc.h2
-rw-r--r--chromium/media/audio/audio_input_sync_writer_unittest.cc4
-rw-r--r--chromium/media/audio/audio_input_unittest.cc4
-rw-r--r--chromium/media/audio/audio_io.h3
-rw-r--r--chromium/media/audio/audio_low_latency_input_output_unittest.cc6
-rw-r--r--chromium/media/audio/audio_output_device.h2
-rw-r--r--chromium/media/audio/audio_output_device_unittest.cc53
-rw-r--r--chromium/media/audio/audio_output_ipc.h9
-rw-r--r--chromium/media/audio/audio_output_proxy_unittest.cc8
-rw-r--r--chromium/media/audio/audio_output_unittest.cc5
-rw-r--r--chromium/media/audio/audio_sink_parameters.cc5
-rw-r--r--chromium/media/audio/audio_sink_parameters.h5
-rw-r--r--chromium/media/audio/audio_source_parameters.cc3
-rw-r--r--chromium/media/audio/audio_source_parameters.h4
-rw-r--r--chromium/media/audio/audio_sync_reader_unittest.cc4
-rw-r--r--chromium/media/audio/audio_system_impl_unittest.cc5
-rw-r--r--chromium/media/audio/audio_thread_hang_monitor.cc2
-rw-r--r--chromium/media/audio/audio_thread_hang_monitor_unittest.cc8
-rw-r--r--chromium/media/audio/audio_thread_impl.cc3
-rw-r--r--chromium/media/audio/cras/cras_input.cc3
-rw-r--r--chromium/media/audio/cras/cras_unified.cc3
-rw-r--r--chromium/media/audio/fake_audio_input_stream.cc79
-rw-r--r--chromium/media/audio/fake_audio_input_stream.h13
-rw-r--r--chromium/media/audio/fuchsia/OWNERS3
-rw-r--r--chromium/media/audio/mac/audio_auhal_mac_unittest.cc4
-rw-r--r--chromium/media/audio/mac/audio_device_listener_mac_unittest.cc8
-rw-r--r--chromium/media/audio/mac/audio_low_latency_input_mac_unittest.cc12
-rw-r--r--chromium/media/audio/mac/coreaudio_dispatch_override.cc13
-rw-r--r--chromium/media/audio/power_observer_helper_unittest.cc4
-rw-r--r--chromium/media/audio/pulse/pulse_util.cc3
-rw-r--r--chromium/media/audio/win/audio_low_latency_input_win.cc31
-rw-r--r--chromium/media/audio/win/audio_low_latency_input_win_unittest.cc12
-rw-r--r--chromium/media/audio/win/audio_output_win_unittest.cc4
-rw-r--r--chromium/media/audio/win/core_audio_util_win.cc2
53 files changed, 328 insertions, 140 deletions
diff --git a/chromium/media/audio/BUILD.gn b/chromium/media/audio/BUILD.gn
index d8ae83ce63a..35fd1d7da0a 100644
--- a/chromium/media/audio/BUILD.gn
+++ b/chromium/media/audio/BUILD.gn
@@ -279,6 +279,8 @@ source_set("audio") {
"pulse/pulse_util.h",
]
+ deps += [ "//build:branding_buildflags" ]
+
if (link_pulseaudio) {
configs += [ ":libpulse" ]
} else {
diff --git a/chromium/media/audio/OWNERS b/chromium/media/audio/OWNERS
index b85a81bc9b5..c13e013dfd7 100644
--- a/chromium/media/audio/OWNERS
+++ b/chromium/media/audio/OWNERS
@@ -1,6 +1,5 @@
tommi@chromium.org
olka@chromium.org
-maxmorin@chromium.org
# Windows
henrika@chromium.org
diff --git a/chromium/media/audio/alive_checker_unittest.cc b/chromium/media/audio/alive_checker_unittest.cc
index ac2bf7342bf..a2f13bd3129 100644
--- a/chromium/media/audio/alive_checker_unittest.cc
+++ b/chromium/media/audio/alive_checker_unittest.cc
@@ -8,7 +8,7 @@
#include "base/bind.h"
#include "base/sequenced_task_runner.h"
#include "base/synchronization/waitable_event.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/threading/thread.h"
#include "media/audio/alive_checker.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -159,7 +159,7 @@ class AliveCheckerTest : public testing::Test {
}
// The test task environment.
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::TaskEnvironment task_environment_;
// The thread the checker is run on.
base::Thread alive_checker_thread_;
diff --git a/chromium/media/audio/android/audio_manager_android.cc b/chromium/media/audio/android/audio_manager_android.cc
index 79bebf1a8ff..5d74f7e662b 100644
--- a/chromium/media/audio/android/audio_manager_android.cc
+++ b/chromium/media/audio/android/audio_manager_android.cc
@@ -311,6 +311,13 @@ bool AudioManagerAndroid::HasOutputVolumeOverride(double* out_volume) const {
return output_volume_override_set_;
}
+base::TimeDelta AudioManagerAndroid::GetOutputLatency() {
+ DCHECK(GetTaskRunner()->BelongsToCurrentThread());
+ JNIEnv* env = AttachCurrentThread();
+ return base::TimeDelta::FromMilliseconds(
+ Java_AudioManagerAndroid_getOutputLatency(env, GetJavaAudioManager()));
+}
+
AudioParameters AudioManagerAndroid::GetPreferredOutputStreamParameters(
const std::string& output_device_id,
const AudioParameters& input_params) {
diff --git a/chromium/media/audio/android/audio_manager_android.h b/chromium/media/audio/android/audio_manager_android.h
index 5075ed514f1..df27f8fafe2 100644
--- a/chromium/media/audio/android/audio_manager_android.h
+++ b/chromium/media/audio/android/audio_manager_android.h
@@ -81,6 +81,13 @@ class MEDIA_EXPORT AudioManagerAndroid : public AudioManagerBase {
void SetOutputVolumeOverride(double volume);
bool HasOutputVolumeOverride(double* out_volume) const;
+ // Get the latency introduced by the hardware. It relies on
+ // AudioManager.getOutputLatency, which is both (a) hidden and (b) not
+ // guaranteed to be meaningful. Do not use this, except in the context of
+ // b/80326798 to adjust (hackily) for hardware latency that OpenSLES isn't
+ // otherwise accounting for.
+ base::TimeDelta GetOutputLatency();
+
protected:
void ShutdownOnAudioThread() override;
AudioParameters GetPreferredOutputStreamParameters(
diff --git a/chromium/media/audio/android/opensles_output.cc b/chromium/media/audio/android/opensles_output.cc
index 594174c6667..e4e9274e0cf 100644
--- a/chromium/media/audio/android/opensles_output.cc
+++ b/chromium/media/audio/android/opensles_output.cc
@@ -5,6 +5,7 @@
#include "media/audio/android/opensles_output.h"
#include "base/android/build_info.h"
+#include "base/feature_list.h"
#include "base/logging.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
@@ -13,6 +14,7 @@
#include "media/audio/android/audio_manager_android.h"
#include "media/base/audio_sample_types.h"
#include "media/base/audio_timestamp_helper.h"
+#include "media/base/media_switches.h"
#define LOG_ON_FAILURE_AND_RETURN(op, ...) \
do { \
@@ -136,6 +138,8 @@ void OpenSLESOutputStream::Start(AudioSourceCallback* callback) {
DCHECK(!callback_);
callback_ = callback;
+ CacheHardwareLatencyIfNeeded();
+
// Fill audio data with silence to avoid start-up glitches. Don't use
// FillBufferQueueNoLock() since it can trigger recursive entry if an error
// occurs while writing into the stream. See http://crbug.com/624877.
@@ -400,6 +404,7 @@ void OpenSLESOutputStream::FillBufferQueueNoLock() {
// Calculate the position relative to the number of frames written.
uint32_t position_in_ms = 0;
SLresult err = (*player_)->GetPosition(player_, &position_in_ms);
+
// Given the position of the playback head, compute the approximate number of
// frames that have been queued to the buffer but not yet played out.
// Note that the value returned by GetFramesToTarget() is negative because
@@ -409,7 +414,7 @@ void OpenSLESOutputStream::FillBufferQueueNoLock() {
const int delay_frames =
err == SL_RESULT_SUCCESS
? -delay_calculator_.GetFramesToTarget(
- base::TimeDelta::FromMilliseconds(position_in_ms))
+ AdjustPositionForHardwareLatency(position_in_ms))
: 0;
DCHECK_GE(delay_frames, 0);
@@ -480,4 +485,23 @@ void OpenSLESOutputStream::HandleError(SLresult error) {
callback_->OnError();
}
+void OpenSLESOutputStream::CacheHardwareLatencyIfNeeded() {
+ // If the feature is turned off, then leave it at its default (zero) value.
+ // In general, GetOutputLatency is not reliable.
+ if (!base::FeatureList::IsEnabled(kUseAudioLatencyFromHAL))
+ return;
+
+ hardware_latency_ = audio_manager_->GetOutputLatency();
+}
+
+base::TimeDelta OpenSLESOutputStream::AdjustPositionForHardwareLatency(
+ uint32_t position_in_ms) {
+ base::TimeDelta position = base::TimeDelta::FromMilliseconds(position_in_ms);
+
+ if (position <= hardware_latency_)
+ return base::TimeDelta::FromMilliseconds(0);
+
+ return position - hardware_latency_;
+}
+
} // namespace media
diff --git a/chromium/media/audio/android/opensles_output.h b/chromium/media/audio/android/opensles_output.h
index 4c1cec16350..aafc81657d5 100644
--- a/chromium/media/audio/android/opensles_output.h
+++ b/chromium/media/audio/android/opensles_output.h
@@ -77,6 +77,13 @@ class OpenSLESOutputStream : public MuteableAudioOutputStream {
// the attached AudioOutputCallback::OnError().
void HandleError(SLresult error);
+ // Cache |hardware_latency_in_ms_| by asking |audio_manager_| for it, if the
+ // kUseAudioLatencyFromHAL is enabled.
+ void CacheHardwareLatencyIfNeeded();
+
+ // Adjust |position_in_ms| for hardware latency, and return the result.
+ base::TimeDelta AdjustPositionForHardwareLatency(uint32_t position_in_ms);
+
base::ThreadChecker thread_checker_;
// Protects |callback_|, |active_buffer_index_|, |audio_data_|,
@@ -140,6 +147,10 @@ class OpenSLESOutputStream : public MuteableAudioOutputStream {
// Container for retrieving data from AudioSourceCallback::OnMoreData().
std::unique_ptr<AudioBus> audio_bus_;
+ // Adjustment for hardware latency. Needed for some cast targets, since
+ // OpenSLES's GetPosition doesn't properly account for HAL latency.
+ base::TimeDelta hardware_latency_;
+
DISALLOW_COPY_AND_ASSIGN(OpenSLESOutputStream);
};
diff --git a/chromium/media/audio/audio_debug_file_writer.h b/chromium/media/audio/audio_debug_file_writer.h
index 66f0f91d910..b128025dc04 100644
--- a/chromium/media/audio/audio_debug_file_writer.h
+++ b/chromium/media/audio/audio_debug_file_writer.h
@@ -63,8 +63,9 @@ class MEDIA_EXPORT AudioDebugFileWriter {
// The task runner to do file output operations on.
const scoped_refptr<base::SequencedTaskRunner> file_task_runner_ =
- base::CreateSequencedTaskRunnerWithTraits(
- {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+ base::CreateSequencedTaskRunner(
+ {base::ThreadPool(), base::MayBlock(),
+ base::TaskPriority::BEST_EFFORT,
base::TaskShutdownBehavior::BLOCK_SHUTDOWN});
AudioFileWriterUniquePtr file_writer_;
diff --git a/chromium/media/audio/audio_debug_file_writer_unittest.cc b/chromium/media/audio/audio_debug_file_writer_unittest.cc
index 4d498690b43..5f8974da252 100644
--- a/chromium/media/audio/audio_debug_file_writer_unittest.cc
+++ b/chromium/media/audio/audio_debug_file_writer_unittest.cc
@@ -11,7 +11,7 @@
#include "base/memory/ptr_util.h"
#include "base/synchronization/waitable_event.h"
#include "base/sys_byteorder.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/threading/thread.h"
#include "media/audio/audio_debug_file_writer.h"
#include "media/base/audio_bus.h"
@@ -50,10 +50,9 @@ class AudioDebugFileWriterTest
: public testing::TestWithParam<AudioDebugFileWriterTestData> {
public:
explicit AudioDebugFileWriterTest(
- base::test::ScopedTaskEnvironment::ThreadPoolExecutionMode execution_mode)
- : scoped_task_environment_(
- base::test::ScopedTaskEnvironment::MainThreadType::DEFAULT,
- execution_mode),
+ base::test::TaskEnvironment::ThreadPoolExecutionMode execution_mode)
+ : task_environment_(base::test::TaskEnvironment::MainThreadType::DEFAULT,
+ execution_mode),
params_(AudioParameters::Format::AUDIO_PCM_LINEAR,
std::get<0>(GetParam()),
std::get<1>(GetParam()),
@@ -67,8 +66,7 @@ class AudioDebugFileWriterTest
}
AudioDebugFileWriterTest()
: AudioDebugFileWriterTest(
- base::test::ScopedTaskEnvironment::ThreadPoolExecutionMode::ASYNC) {
- }
+ base::test::TaskEnvironment::ThreadPoolExecutionMode::ASYNC) {}
protected:
virtual ~AudioDebugFileWriterTest() = default;
@@ -192,7 +190,7 @@ class AudioDebugFileWriterTest
debug_writer_->Stop();
- scoped_task_environment_.RunUntilIdle();
+ task_environment_.RunUntilIdle();
VerifyRecording(file_path);
@@ -206,7 +204,7 @@ class AudioDebugFileWriterTest
protected:
// The test task environment.
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::TaskEnvironment task_environment_;
// Writer under test.
std::unique_ptr<AudioDebugFileWriter> debug_writer_;
@@ -232,8 +230,8 @@ class AudioDebugFileWriterBehavioralTest : public AudioDebugFileWriterTest {};
class AudioDebugFileWriterSingleThreadTest : public AudioDebugFileWriterTest {
public:
AudioDebugFileWriterSingleThreadTest()
- : AudioDebugFileWriterTest(base::test::ScopedTaskEnvironment::
- ThreadPoolExecutionMode::QUEUED) {}
+ : AudioDebugFileWriterTest(
+ base::test::TaskEnvironment::ThreadPoolExecutionMode::QUEUED) {}
};
TEST_P(AudioDebugFileWriterTest, WaveRecordingTest) {
@@ -256,7 +254,7 @@ TEST_P(AudioDebugFileWriterSingleThreadTest,
debug_writer_.reset();
- scoped_task_environment_.RunUntilIdle();
+ task_environment_.RunUntilIdle();
VerifyRecording(file_path);
diff --git a/chromium/media/audio/audio_debug_recording_helper_unittest.cc b/chromium/media/audio/audio_debug_recording_helper_unittest.cc
index 9bd581d8f1a..8798fb00fe2 100644
--- a/chromium/media/audio/audio_debug_recording_helper_unittest.cc
+++ b/chromium/media/audio/audio_debug_recording_helper_unittest.cc
@@ -15,7 +15,7 @@
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "media/base/audio_bus.h"
#include "media/base/audio_sample_types.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -112,7 +112,7 @@ class AudioDebugRecordingHelperTest : public ::testing::Test {
const AudioParameters& params,
base::OnceClosure on_destruction_closure) {
return std::make_unique<AudioDebugRecordingHelperUnderTest>(
- params, scoped_task_environment_.GetMainThreadTaskRunner(),
+ params, task_environment_.GetMainThreadTaskRunner(),
std::move(on_destruction_closure));
}
@@ -146,7 +146,7 @@ class AudioDebugRecordingHelperTest : public ::testing::Test {
const uint32_t id_ = 1;
// The test task environment.
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::TaskEnvironment task_environment_;
private:
DISALLOW_COPY_AND_ASSIGN(AudioDebugRecordingHelperTest);
diff --git a/chromium/media/audio/audio_debug_recording_manager_unittest.cc b/chromium/media/audio/audio_debug_recording_manager_unittest.cc
index 014491b59de..46b977fd92e 100644
--- a/chromium/media/audio/audio_debug_recording_manager_unittest.cc
+++ b/chromium/media/audio/audio_debug_recording_manager_unittest.cc
@@ -9,7 +9,7 @@
#include "base/bind.h"
#include "base/single_thread_task_runner.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "media/audio/audio_debug_recording_helper.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -114,7 +114,7 @@ class AudioDebugRecordingManagerUnderTest : public AudioDebugRecordingManager {
class AudioDebugRecordingManagerTest : public ::testing::Test {
public:
AudioDebugRecordingManagerTest()
- : manager_(scoped_task_environment_.GetMainThreadTaskRunner()) {}
+ : manager_(task_environment_.GetMainThreadTaskRunner()) {}
~AudioDebugRecordingManagerTest() override = default;
@@ -127,7 +127,7 @@ class AudioDebugRecordingManagerTest : public ::testing::Test {
protected:
// The test task environment.
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::TaskEnvironment task_environment_;
AudioDebugRecordingManagerUnderTest manager_;
diff --git a/chromium/media/audio/audio_debug_recording_session_impl.cc b/chromium/media/audio/audio_debug_recording_session_impl.cc
index 125e7a15f2f..2d433cd61d0 100644
--- a/chromium/media/audio/audio_debug_recording_session_impl.cc
+++ b/chromium/media/audio/audio_debug_recording_session_impl.cc
@@ -58,9 +58,9 @@ void CreateWavFile(const base::FilePath& debug_recording_file_path,
return;
}
- base::PostTaskWithTraitsAndReplyWithResult(
+ base::PostTaskAndReplyWithResult(
FROM_HERE,
- {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+ {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT,
base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
base::BindOnce(
[](const base::FilePath& file_name) {
diff --git a/chromium/media/audio/audio_debug_recording_session_impl_unittest.cc b/chromium/media/audio/audio_debug_recording_session_impl_unittest.cc
index 47067985e49..c5f7149ff2a 100644
--- a/chromium/media/audio/audio_debug_recording_session_impl_unittest.cc
+++ b/chromium/media/audio/audio_debug_recording_session_impl_unittest.cc
@@ -10,7 +10,7 @@
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/strings/string_number_conversions.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "media/audio/audio_debug_recording_test.h"
#include "media/audio/mock_audio_debug_recording_manager.h"
@@ -125,7 +125,7 @@ TEST_F(AudioDebugRecordingSessionImplTest, CreateWavFileCreatesExpectedFiles) {
CreateDebugRecordingSession();
// Wait for files to be created.
- scoped_task_environment_.RunUntilIdle();
+ task_environment_.RunUntilIdle();
// Check that expected files were created.
base::FilePath input_recording_filename(GetFileName(kInput, kId));
diff --git a/chromium/media/audio/audio_debug_recording_test.h b/chromium/media/audio/audio_debug_recording_test.h
index 4191b937399..1ccae83206e 100644
--- a/chromium/media/audio/audio_debug_recording_test.h
+++ b/chromium/media/audio/audio_debug_recording_test.h
@@ -7,7 +7,7 @@
#include <memory>
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "media/base/media_export.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -28,7 +28,7 @@ class AudioDebugRecordingTest : public testing::Test {
void ShutdownAudioManager();
void InitializeAudioDebugRecordingManager();
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::TaskEnvironment task_environment_;
std::unique_ptr<MockAudioManager> mock_audio_manager_;
MockAudioDebugRecordingManager* mock_debug_recording_manager_;
diff --git a/chromium/media/audio/audio_device_description.cc b/chromium/media/audio/audio_device_description.cc
index 87f8f37d366..3bdc7be1612 100644
--- a/chromium/media/audio/audio_device_description.cc
+++ b/chromium/media/audio/audio_device_description.cc
@@ -37,9 +37,9 @@ bool AudioDeviceDescription::IsLoopbackDevice(const std::string& device_id) {
// static
bool AudioDeviceDescription::UseSessionIdToSelectDevice(
- int session_id,
+ const base::UnguessableToken& session_id,
const std::string& device_id) {
- return session_id && device_id.empty();
+ return !session_id.is_empty() && device_id.empty();
}
// static
diff --git a/chromium/media/audio/audio_device_description.h b/chromium/media/audio/audio_device_description.h
index 970ec0e822d..ccba18edbbb 100644
--- a/chromium/media/audio/audio_device_description.h
+++ b/chromium/media/audio/audio_device_description.h
@@ -8,6 +8,7 @@
#include <string>
#include <vector>
+#include "base/unguessable_token.h"
#include "media/base/media_export.h"
namespace media {
@@ -50,8 +51,9 @@ struct MEDIA_EXPORT AudioDeviceDescription {
// If |device_id| is empty and |session_id| is nonzero, output device
// associated with the opened input device designated by |session_id| should
// be used.
- static bool UseSessionIdToSelectDevice(int session_id,
- const std::string& device_id);
+ static bool UseSessionIdToSelectDevice(
+ const base::UnguessableToken& session_id,
+ const std::string& device_id);
// The functions dealing with localization are not reliable in the audio
// service, and should be avoided there.
diff --git a/chromium/media/audio/audio_features.cc b/chromium/media/audio/audio_features.cc
index a36d1fcc840..dfbeaad8e21 100644
--- a/chromium/media/audio/audio_features.cc
+++ b/chromium/media/audio/audio_features.cc
@@ -9,7 +9,13 @@ namespace features {
// When the audio service in a separate process, kill it when a hang is
// detected. It will be restarted when needed.
const base::Feature kAudioServiceOutOfProcessKillAtHang{
- "AudioServiceOutOfProcessKillAtHang", base::FEATURE_DISABLED_BY_DEFAULT};
+ "AudioServiceOutOfProcessKillAtHang",
+#if defined(OS_WIN) || defined(OS_MACOSX)
+ base::FEATURE_ENABLED_BY_DEFAULT
+#else
+ base::FEATURE_DISABLED_BY_DEFAULT
+#endif
+};
// If enabled, base::DumpWithoutCrashing is called whenever an audio service
// hang is detected.
diff --git a/chromium/media/audio/audio_input_controller_unittest.cc b/chromium/media/audio/audio_input_controller_unittest.cc
index 00a3b5ab6c0..dbf5e29b31e 100644
--- a/chromium/media/audio/audio_input_controller_unittest.cc
+++ b/chromium/media/audio/audio_input_controller_unittest.cc
@@ -8,7 +8,7 @@
#include "base/macros.h"
#include "base/run_loop.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/timer/timer.h"
#include "media/audio/audio_manager.h"
#include "media/audio/fake_audio_input_stream.h"
@@ -144,7 +144,7 @@ class AudioInputControllerTest : public testing::TestWithParam<bool> {
run_loop.Run();
}
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::SingleThreadTaskEnvironment task_environment_;
// Parameterize tests to run AudioInputController either on audio thread
// (synchronously), or on a different thread (non-blocking).
diff --git a/chromium/media/audio/audio_input_device_unittest.cc b/chromium/media/audio/audio_input_device_unittest.cc
index 01fa2add753..942097505b8 100644
--- a/chromium/media/audio/audio_input_device_unittest.cc
+++ b/chromium/media/audio/audio_input_device_unittest.cc
@@ -8,12 +8,11 @@
#include "base/memory/ptr_util.h"
#include "base/memory/shared_memory.h"
-#include "base/message_loop/message_loop.h"
#include "base/process/process_handle.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/sync_socket.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gmock_mutant.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -67,7 +66,8 @@ class MockCaptureCallback : public AudioCapturerSource::CaptureCallback {
// Regular construction.
TEST(AudioInputDeviceTest, Noop) {
- base::MessageLoopForIO io_loop;
+ base::test::SingleThreadTaskEnvironment task_environment(
+ base::test::SingleThreadTaskEnvironment::MainThreadType::IO);
MockAudioInputIPC* input_ipc = new MockAudioInputIPC();
scoped_refptr<AudioInputDevice> device(new AudioInputDevice(
base::WrapUnique(input_ipc), AudioInputDevice::Purpose::kUserInput));
@@ -117,7 +117,7 @@ TEST(AudioInputDeviceTest, CreateStream) {
shared_memory.region.Duplicate();
ASSERT_TRUE(duplicated_shared_memory_region.IsValid());
- base::test::ScopedTaskEnvironment ste;
+ base::test::TaskEnvironment ste;
MockCaptureCallback callback;
MockAudioInputIPC* input_ipc = new MockAudioInputIPC();
scoped_refptr<AudioInputDevice> device(new AudioInputDevice(
diff --git a/chromium/media/audio/audio_input_ipc.h b/chromium/media/audio/audio_input_ipc.h
index 4abfcf01b6d..b8defb609bd 100644
--- a/chromium/media/audio/audio_input_ipc.h
+++ b/chromium/media/audio/audio_input_ipc.h
@@ -22,7 +22,7 @@ class AudioProcessorControls;
class MEDIA_EXPORT AudioInputIPCDelegate {
public:
// Called when an AudioInputController has been created.
- // See media/mojo/interfaces/audio_data_pipe.mojom for documentation of
+ // See media/mojo/mojom/audio_data_pipe.mojom for documentation of
// |handle| and |socket_handle|.
virtual void OnStreamCreated(
base::ReadOnlySharedMemoryRegion shared_memory_region,
diff --git a/chromium/media/audio/audio_input_sync_writer_unittest.cc b/chromium/media/audio/audio_input_sync_writer_unittest.cc
index c887c331c1b..79583f6759b 100644
--- a/chromium/media/audio/audio_input_sync_writer_unittest.cc
+++ b/chromium/media/audio/audio_input_sync_writer_unittest.cc
@@ -17,7 +17,7 @@
#include "base/memory/read_only_shared_memory_region.h"
#include "base/sync_socket.h"
#include "base/test/mock_callback.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "media/base/audio_bus.h"
@@ -155,7 +155,7 @@ class AudioInputSyncWriterTest : public testing::Test {
using MockLogger =
base::MockCallback<base::RepeatingCallback<void(const std::string&)>>;
- base::test::ScopedTaskEnvironment env_;
+ base::test::TaskEnvironment env_;
MockLogger mock_logger_;
std::unique_ptr<AudioInputSyncWriter> writer_;
MockCancelableSyncSocket* socket_;
diff --git a/chromium/media/audio/audio_input_unittest.cc b/chromium/media/audio/audio_input_unittest.cc
index 2e908188daf..3763e798e06 100644
--- a/chromium/media/audio/audio_input_unittest.cc
+++ b/chromium/media/audio/audio_input_unittest.cc
@@ -8,7 +8,7 @@
#include "base/callback.h"
#include "base/environment.h"
#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_pump_type.h"
#include "base/run_loop.h"
#include "base/test/test_message_loop.h"
#include "base/threading/platform_thread.h"
@@ -69,7 +69,7 @@ class TestInputCallback : public AudioInputStream::AudioInputCallback {
class AudioInputTest : public testing::Test {
public:
AudioInputTest()
- : message_loop_(base::MessageLoop::TYPE_UI),
+ : message_loop_(base::MessagePumpType::UI),
audio_manager_(AudioManager::CreateForTesting(
std::make_unique<TestAudioThread>())),
audio_input_stream_(NULL) {
diff --git a/chromium/media/audio/audio_io.h b/chromium/media/audio/audio_io.h
index 8f56ef08512..5ceb326205c 100644
--- a/chromium/media/audio/audio_io.h
+++ b/chromium/media/audio/audio_io.h
@@ -110,6 +110,9 @@ class MEDIA_EXPORT AudioOutputStream {
// Close the stream.
// After calling this method, the object should not be used anymore.
+ // After calling this method, no further AudioSourceCallback methods
+ // should be called on the callback object that was supplied to Start()
+ // by the AudioOutputStream implementation.
virtual void Close() = 0;
// Flushes the stream. This should only be called if the stream is not
diff --git a/chromium/media/audio/audio_low_latency_input_output_unittest.cc b/chromium/media/audio/audio_low_latency_input_output_unittest.cc
index 4ed02eccb21..c1042ccbdbc 100644
--- a/chromium/media/audio/audio_low_latency_input_output_unittest.cc
+++ b/chromium/media/audio/audio_low_latency_input_output_unittest.cc
@@ -16,7 +16,7 @@
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/synchronization/lock.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/test/test_timeouts.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
@@ -87,8 +87,8 @@ class AudioLowLatencyInputOutputTest : public testing::Test {
}
private:
- base::test::ScopedTaskEnvironment task_environment_{
- base::test::ScopedTaskEnvironment::MainThreadType::UI};
+ base::test::TaskEnvironment task_environment_{
+ base::test::TaskEnvironment::MainThreadType::UI};
std::unique_ptr<AudioManager> audio_manager_;
DISALLOW_COPY_AND_ASSIGN(AudioLowLatencyInputOutputTest);
diff --git a/chromium/media/audio/audio_output_device.h b/chromium/media/audio/audio_output_device.h
index ff0ea95e6c8..0a305332677 100644
--- a/chromium/media/audio/audio_output_device.h
+++ b/chromium/media/audio/audio_output_device.h
@@ -199,7 +199,7 @@ class MEDIA_EXPORT AudioOutputDevice : public AudioRendererSink,
// The media session ID used to identify which input device to be started.
// Only used by Unified IO.
- int session_id_;
+ base::UnguessableToken session_id_;
// ID of hardware output device to be used (provided |session_id_| is zero)
const std::string device_id_;
diff --git a/chromium/media/audio/audio_output_device_unittest.cc b/chromium/media/audio/audio_output_device_unittest.cc
index 90a51bdfe97..88ec75c89ca 100644
--- a/chromium/media/audio/audio_output_device_unittest.cc
+++ b/chromium/media/audio/audio_output_device_unittest.cc
@@ -19,7 +19,7 @@
#include "base/single_thread_task_runner.h"
#include "base/sync_socket.h"
#include "base/task_runner.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "media/audio/audio_sync_reader.h"
@@ -76,7 +76,7 @@ class MockAudioOutputIPC : public AudioOutputIPC {
MOCK_METHOD3(RequestDeviceAuthorization,
void(AudioOutputIPCDelegate* delegate,
- int session_id,
+ const base::UnguessableToken& session_id,
const std::string& device_id));
MOCK_METHOD3(
CreateStream,
@@ -109,8 +109,8 @@ class AudioOutputDeviceTest : public testing::Test {
MOCK_METHOD1(OnDeviceInfoReceived, void(OutputDeviceInfo));
protected:
- base::test::ScopedTaskEnvironment task_env_{
- base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME};
+ base::test::TaskEnvironment task_env_{
+ base::test::TaskEnvironment::TimeSource::MOCK_TIME};
AudioParameters default_audio_parameters_;
StrictMock<MockRenderCallback> callback_;
MockAudioOutputIPC* audio_output_ipc_; // owned by audio_device_
@@ -148,13 +148,14 @@ void AudioOutputDeviceTest::CreateDevice(const std::string& device_id,
audio_output_ipc_ = new NiceMock<MockAudioOutputIPC>();
audio_device_ = new AudioOutputDevice(
base::WrapUnique(audio_output_ipc_), task_env_.GetMainThreadTaskRunner(),
- AudioSinkParameters(0, device_id), timeout);
+ AudioSinkParameters(base::UnguessableToken(), device_id), timeout);
}
void AudioOutputDeviceTest::SetDevice(const std::string& device_id) {
CreateDevice(device_id);
EXPECT_CALL(*audio_output_ipc_,
- RequestDeviceAuthorization(audio_device_.get(), 0, device_id));
+ RequestDeviceAuthorization(audio_device_.get(),
+ base::UnguessableToken(), device_id));
audio_device_->RequestDeviceAuthorization();
task_env_.FastForwardBy(base::TimeDelta());
@@ -277,7 +278,8 @@ TEST_F(AudioOutputDeviceTest, NonDefaultStartStopStartStop) {
StopAudioDevice();
EXPECT_CALL(*audio_output_ipc_,
- RequestDeviceAuthorization(audio_device_.get(), 0, _));
+ RequestDeviceAuthorization(audio_device_.get(),
+ base::UnguessableToken(), _));
StartAudioDevice();
// Simulate reply from browser
ReceiveAuthorization(OUTPUT_DEVICE_STATUS_OK);
@@ -307,10 +309,12 @@ TEST_F(AudioOutputDeviceTest, AuthorizationFailsBeforeInitialize_NoError) {
audio_output_ipc_ = new NiceMock<MockAudioOutputIPC>();
audio_device_ = new AudioOutputDevice(
base::WrapUnique(audio_output_ipc_), task_env_.GetMainThreadTaskRunner(),
- AudioSinkParameters(0, kDefaultDeviceId), kAuthTimeout);
+ AudioSinkParameters(base::UnguessableToken(), kDefaultDeviceId),
+ kAuthTimeout);
EXPECT_CALL(
*audio_output_ipc_,
- RequestDeviceAuthorization(audio_device_.get(), 0, kDefaultDeviceId));
+ RequestDeviceAuthorization(audio_device_.get(), base::UnguessableToken(),
+ kDefaultDeviceId));
audio_device_->RequestDeviceAuthorization();
audio_device_->Initialize(default_audio_parameters_, &callback_);
@@ -329,7 +333,8 @@ TEST_F(AudioOutputDeviceTest, AuthorizationTimedOut) {
CreateDevice(kNonDefaultDeviceId);
EXPECT_CALL(
*audio_output_ipc_,
- RequestDeviceAuthorization(audio_device_.get(), 0, kNonDefaultDeviceId));
+ RequestDeviceAuthorization(audio_device_.get(), base::UnguessableToken(),
+ kNonDefaultDeviceId));
EXPECT_CALL(*audio_output_ipc_, CloseStream());
// Request authorization; no reply from the browser.
@@ -344,9 +349,10 @@ TEST_F(AudioOutputDeviceTest, AuthorizationTimedOut) {
TEST_F(AudioOutputDeviceTest, GetOutputDeviceInfoAsync_Error) {
CreateDevice(kUnauthorizedDeviceId, base::TimeDelta());
- EXPECT_CALL(*audio_output_ipc_,
- RequestDeviceAuthorization(audio_device_.get(), 0,
- kUnauthorizedDeviceId));
+ EXPECT_CALL(
+ *audio_output_ipc_,
+ RequestDeviceAuthorization(audio_device_.get(), base::UnguessableToken(),
+ kUnauthorizedDeviceId));
audio_device_->RequestDeviceAuthorization();
audio_device_->GetOutputDeviceInfoAsync(base::BindOnce(
&AudioOutputDeviceTest::OnDeviceInfoReceived, base::Unretained(this)));
@@ -372,7 +378,8 @@ TEST_F(AudioOutputDeviceTest, GetOutputDeviceInfoAsync_Okay) {
CreateDevice(kDefaultDeviceId, base::TimeDelta());
EXPECT_CALL(
*audio_output_ipc_,
- RequestDeviceAuthorization(audio_device_.get(), 0, kDefaultDeviceId));
+ RequestDeviceAuthorization(audio_device_.get(), base::UnguessableToken(),
+ kDefaultDeviceId));
audio_device_->RequestDeviceAuthorization();
audio_device_->GetOutputDeviceInfoAsync(base::BindOnce(
&AudioOutputDeviceTest::OnDeviceInfoReceived, base::Unretained(this)));
@@ -455,13 +462,15 @@ TEST_F(AudioOutputDeviceTest, MAYBE_VerifyDataFlow) {
auto* ipc = new MockAudioOutputIPC(); // owned by |audio_device|.
auto audio_device = base::MakeRefCounted<AudioOutputDevice>(
base::WrapUnique(ipc), task_env_.GetMainThreadTaskRunner(),
- AudioSinkParameters(0, kDefaultDeviceId), kAuthTimeout);
+ AudioSinkParameters(base::UnguessableToken(), kDefaultDeviceId),
+ kAuthTimeout);
// Start a stream.
audio_device->RequestDeviceAuthorization();
audio_device->Initialize(params, &env.callback);
audio_device->Start();
- EXPECT_CALL(*ipc, RequestDeviceAuthorization(audio_device.get(), 0,
+ EXPECT_CALL(*ipc, RequestDeviceAuthorization(audio_device.get(),
+ base::UnguessableToken(),
kDefaultDeviceId));
EXPECT_CALL(*ipc, CreateStream(audio_device.get(), _, _));
EXPECT_CALL(*ipc, PlayStream());
@@ -517,12 +526,14 @@ TEST_F(AudioOutputDeviceTest, CreateNondefaultDevice) {
auto* ipc = new MockAudioOutputIPC(); // owned by |audio_device|.
auto audio_device = base::MakeRefCounted<AudioOutputDevice>(
base::WrapUnique(ipc), task_env_.GetMainThreadTaskRunner(),
- AudioSinkParameters(0, kNonDefaultDeviceId), kAuthTimeout);
+ AudioSinkParameters(base::UnguessableToken(), kNonDefaultDeviceId),
+ kAuthTimeout);
audio_device->RequestDeviceAuthorization();
audio_device->Initialize(params, &env.callback);
audio_device->Start();
- EXPECT_CALL(*ipc, RequestDeviceAuthorization(audio_device.get(), 0,
+ EXPECT_CALL(*ipc, RequestDeviceAuthorization(audio_device.get(),
+ base::UnguessableToken(),
kNonDefaultDeviceId));
EXPECT_CALL(*ipc, CreateStream(audio_device.get(), _, _));
EXPECT_CALL(*ipc, PlayStream());
@@ -552,13 +563,15 @@ TEST_F(AudioOutputDeviceTest, CreateBitStreamStream) {
auto* ipc = new MockAudioOutputIPC(); // owned by |audio_device|.
auto audio_device = base::MakeRefCounted<AudioOutputDevice>(
base::WrapUnique(ipc), task_env_.GetMainThreadTaskRunner(),
- AudioSinkParameters(0, kNonDefaultDeviceId), kAuthTimeout);
+ AudioSinkParameters(base::UnguessableToken(), kNonDefaultDeviceId),
+ kAuthTimeout);
// Start a stream.
audio_device->RequestDeviceAuthorization();
audio_device->Initialize(params, &env.callback);
audio_device->Start();
- EXPECT_CALL(*ipc, RequestDeviceAuthorization(audio_device.get(), 0,
+ EXPECT_CALL(*ipc, RequestDeviceAuthorization(audio_device.get(),
+ base::UnguessableToken(),
kNonDefaultDeviceId));
EXPECT_CALL(*ipc, CreateStream(audio_device.get(), _, _));
EXPECT_CALL(*ipc, PlayStream());
diff --git a/chromium/media/audio/audio_output_ipc.h b/chromium/media/audio/audio_output_ipc.h
index f41054e573b..abe70531502 100644
--- a/chromium/media/audio/audio_output_ipc.h
+++ b/chromium/media/audio/audio_output_ipc.h
@@ -32,7 +32,7 @@ class MEDIA_EXPORT AudioOutputIPCDelegate {
const std::string& matched_device_id) = 0;
// Called when an audio stream has been created.
- // See media/mojo/interfaces/audio_data_pipe.mojom for documentation of
+ // See media/mojo/mojom/audio_data_pipe.mojom for documentation of
// |handle| and |socket_handle|. |playing_automatically| indicates if the
// AudioOutputIPCDelegate is playing right away due to an earlier call to
// Play();
@@ -71,9 +71,10 @@ class MEDIA_EXPORT AudioOutputIPC {
// the default device.
// Once the authorization process is complete, the implementation will
// notify |delegate| by calling OnDeviceAuthorized().
- virtual void RequestDeviceAuthorization(AudioOutputIPCDelegate* delegate,
- int session_id,
- const std::string& device_id) = 0;
+ virtual void RequestDeviceAuthorization(
+ AudioOutputIPCDelegate* delegate,
+ const base::UnguessableToken& session_id,
+ const std::string& device_id) = 0;
// Sends a request to create an AudioOutputController object in the peer
// process and configures it to use the specified audio |params| including
diff --git a/chromium/media/audio/audio_output_proxy_unittest.cc b/chromium/media/audio/audio_output_proxy_unittest.cc
index e4ba36f2852..e56d1cef484 100644
--- a/chromium/media/audio/audio_output_proxy_unittest.cc
+++ b/chromium/media/audio/audio_output_proxy_unittest.cc
@@ -11,7 +11,7 @@
#include "base/bind.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "media/audio/audio_manager.h"
@@ -488,7 +488,7 @@ class AudioOutputProxyTest : public testing::Test {
proxy->Close();
}
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::SingleThreadTaskEnvironment task_environment_;
MockAudioManager manager_;
std::unique_ptr<AudioOutputDispatcherImpl> dispatcher_impl_;
MockAudioSourceCallback callback_;
@@ -511,7 +511,7 @@ class AudioOutputResamplerTest : public AudioOutputProxyTest {
void OnStart() override {
// Let Start() run for a bit.
base::RunLoop run_loop;
- scoped_task_environment_.GetMainThreadTaskRunner()->PostDelayedTask(
+ task_environment_.GetMainThreadTaskRunner()->PostDelayedTask(
FROM_HERE, run_loop.QuitClosure(),
base::TimeDelta::FromMilliseconds(kStartRunTimeMs));
run_loop.Run();
@@ -824,7 +824,7 @@ TEST_F(AudioOutputResamplerTest, FallbackRecovery) {
// Once all proxies have been closed, AudioOutputResampler will start the
// reinitialization timer and execute it after the close delay elapses.
base::RunLoop run_loop;
- scoped_task_environment_.GetMainThreadTaskRunner()->PostDelayedTask(
+ task_environment_.GetMainThreadTaskRunner()->PostDelayedTask(
FROM_HERE, run_loop.QuitClosure(),
base::TimeDelta::FromMilliseconds(2 * kTestCloseDelayMs));
run_loop.Run();
diff --git a/chromium/media/audio/audio_output_unittest.cc b/chromium/media/audio/audio_output_unittest.cc
index 41e4aeceb06..dd67725698d 100644
--- a/chromium/media/audio/audio_output_unittest.cc
+++ b/chromium/media/audio/audio_output_unittest.cc
@@ -7,9 +7,9 @@
#include <memory>
#include "base/memory/aligned_memory.h"
-#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/test/bind_test_util.h"
+#include "base/test/task_environment.h"
#include "base/test/test_timeouts.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
@@ -56,7 +56,8 @@ class AudioOutputTest : public ::testing::Test {
}
protected:
- base::MessageLoopForIO message_loop_;
+ base::test::SingleThreadTaskEnvironment task_environment_{
+ base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
std::unique_ptr<AudioManager> audio_manager_;
std::unique_ptr<AudioDeviceInfoAccessorForTests> audio_manager_device_info_;
AudioParameters stream_params_;
diff --git a/chromium/media/audio/audio_sink_parameters.cc b/chromium/media/audio/audio_sink_parameters.cc
index 2d0b4e8a2d1..8287fa07779 100644
--- a/chromium/media/audio/audio_sink_parameters.cc
+++ b/chromium/media/audio/audio_sink_parameters.cc
@@ -7,8 +7,9 @@
namespace media {
AudioSinkParameters::AudioSinkParameters() = default;
-AudioSinkParameters::AudioSinkParameters(int session_id,
- const std::string& device_id)
+AudioSinkParameters::AudioSinkParameters(
+ const base::UnguessableToken& session_id,
+ const std::string& device_id)
: session_id(session_id), device_id(device_id) {}
AudioSinkParameters::AudioSinkParameters(const AudioSinkParameters& params) =
default;
diff --git a/chromium/media/audio/audio_sink_parameters.h b/chromium/media/audio/audio_sink_parameters.h
index 88e3fab21d3..a51f1b82bc7 100644
--- a/chromium/media/audio/audio_sink_parameters.h
+++ b/chromium/media/audio/audio_sink_parameters.h
@@ -24,11 +24,12 @@ namespace media {
// association.
struct MEDIA_EXPORT AudioSinkParameters final {
AudioSinkParameters();
- AudioSinkParameters(int session_id, const std::string& device_id);
+ AudioSinkParameters(const base::UnguessableToken& session_id,
+ const std::string& device_id);
AudioSinkParameters(const AudioSinkParameters& params);
~AudioSinkParameters();
- int session_id = 0;
+ base::UnguessableToken session_id;
std::string device_id;
base::Optional<base::UnguessableToken> processing_id;
};
diff --git a/chromium/media/audio/audio_source_parameters.cc b/chromium/media/audio/audio_source_parameters.cc
index 3f05147eeeb..b8c631af30b 100644
--- a/chromium/media/audio/audio_source_parameters.cc
+++ b/chromium/media/audio/audio_source_parameters.cc
@@ -7,7 +7,8 @@
namespace media {
AudioSourceParameters::AudioSourceParameters() = default;
-AudioSourceParameters::AudioSourceParameters(int session_id)
+AudioSourceParameters::AudioSourceParameters(
+ const base::UnguessableToken& session_id)
: session_id(session_id) {}
AudioSourceParameters::AudioSourceParameters(
const AudioSourceParameters& params) = default;
diff --git a/chromium/media/audio/audio_source_parameters.h b/chromium/media/audio/audio_source_parameters.h
index 3de2dbbbb2b..96e1c1960ab 100644
--- a/chromium/media/audio/audio_source_parameters.h
+++ b/chromium/media/audio/audio_source_parameters.h
@@ -20,11 +20,11 @@ namespace media {
// input device will be selected. This is the state when default constructed.
struct MEDIA_EXPORT AudioSourceParameters final {
AudioSourceParameters();
- explicit AudioSourceParameters(int session_id);
+ explicit AudioSourceParameters(const base::UnguessableToken& session_id);
AudioSourceParameters(const AudioSourceParameters& params);
~AudioSourceParameters();
- int session_id = 0;
+ base::UnguessableToken session_id;
struct MEDIA_EXPORT ProcessingConfig {
ProcessingConfig(base::UnguessableToken id,
diff --git a/chromium/media/audio/audio_sync_reader_unittest.cc b/chromium/media/audio/audio_sync_reader_unittest.cc
index f92eaba5794..b1416d8d7e5 100644
--- a/chromium/media/audio/audio_sync_reader_unittest.cc
+++ b/chromium/media/audio/audio_sync_reader_unittest.cc
@@ -13,7 +13,7 @@
#include "base/bind.h"
#include "base/memory/shared_memory.h"
#include "base/sync_socket.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "media/base/audio_bus.h"
#include "media/base/audio_parameters.h"
@@ -49,7 +49,7 @@ class AudioSyncReaderBitstreamTest : public TestWithParam<OverflowTestCase> {
~AudioSyncReaderBitstreamTest() override {}
private:
- base::test::ScopedTaskEnvironment env_;
+ base::test::TaskEnvironment env_;
};
TEST_P(AudioSyncReaderBitstreamTest, BitstreamBufferOverflow_DoesNotWriteOOB) {
diff --git a/chromium/media/audio/audio_system_impl_unittest.cc b/chromium/media/audio/audio_system_impl_unittest.cc
index cf85ff0036c..8375d35908c 100644
--- a/chromium/media/audio/audio_system_impl_unittest.cc
+++ b/chromium/media/audio/audio_system_impl_unittest.cc
@@ -3,7 +3,8 @@
// found in the LICENSE file.
#include "media/audio/audio_system_impl.h"
-#include "base/test/scoped_task_environment.h"
+
+#include "base/test/task_environment.h"
#include "media/audio/audio_system_test_util.h"
#include "media/audio/audio_thread_impl.h"
#include "media/audio/mock_audio_manager.h"
@@ -35,7 +36,7 @@ class AudioSystemImplTestBase : public testing::Test {
MockAudioManager* audio_manager() { return audio_manager_.get(); }
AudioSystem* audio_system() { return audio_system_.get(); }
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::SingleThreadTaskEnvironment task_environment_;
std::unique_ptr<MockAudioManager> audio_manager_;
std::unique_ptr<AudioSystem> audio_system_;
// AudioSystemTester tester_;
diff --git a/chromium/media/audio/audio_thread_hang_monitor.cc b/chromium/media/audio/audio_thread_hang_monitor.cc
index 727e198fafa..37351e1a60a 100644
--- a/chromium/media/audio/audio_thread_hang_monitor.cc
+++ b/chromium/media/audio/audio_thread_hang_monitor.cc
@@ -47,7 +47,7 @@ AudioThreadHangMonitor::Ptr AudioThreadHangMonitor::Create(
scoped_refptr<base::SingleThreadTaskRunner> audio_thread_task_runner,
scoped_refptr<base::SequencedTaskRunner> monitor_task_runner) {
if (!monitor_task_runner)
- monitor_task_runner = base::CreateSequencedTaskRunnerWithTraits({});
+ monitor_task_runner = base::CreateSequencedTaskRunner({base::ThreadPool()});
auto monitor =
Ptr(new AudioThreadHangMonitor(hang_action, hang_deadline, clock,
diff --git a/chromium/media/audio/audio_thread_hang_monitor_unittest.cc b/chromium/media/audio/audio_thread_hang_monitor_unittest.cc
index ac5b3de6c32..a173c726d5a 100644
--- a/chromium/media/audio/audio_thread_hang_monitor_unittest.cc
+++ b/chromium/media/audio/audio_thread_hang_monitor_unittest.cc
@@ -10,7 +10,7 @@
#include "base/synchronization/waitable_event.h"
#include "base/task/post_task.h"
#include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/threading/thread.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -38,13 +38,13 @@ constexpr base::TimeDelta kLongHangDeadline = base::TimeDelta::FromMinutes(30);
class AudioThreadHangMonitorTest : public Test {
public:
AudioThreadHangMonitorTest()
- : task_env_(base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME),
+ : task_env_(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
histograms_(),
audio_thread_("Audio thread"),
hang_monitor_({nullptr, base::OnTaskRunnerDeleter(nullptr)}) {
CHECK(audio_thread_.Start());
// We must inject the main thread task runner as the hang monitor task
- // runner since ScopedTaskEnvironment::FastForwardBy only works for the main
+ // runner since TaskEnvironment::FastForwardBy only works for the main
// thread.
hang_monitor_ = AudioThreadHangMonitor::Create(
HangAction::kDoNothing, base::nullopt, task_env_.GetMockTickClock(),
@@ -87,7 +87,7 @@ class AudioThreadHangMonitorTest : public Test {
MOCK_METHOD0(HangActionTerminate, void());
base::WaitableEvent event_;
- base::test::ScopedTaskEnvironment task_env_;
+ base::test::TaskEnvironment task_env_;
base::HistogramTester histograms_;
base::Thread audio_thread_;
AudioThreadHangMonitor::Ptr hang_monitor_;
diff --git a/chromium/media/audio/audio_thread_impl.cc b/chromium/media/audio/audio_thread_impl.cc
index c3dfddf7335..4f7b07c135c 100644
--- a/chromium/media/audio/audio_thread_impl.cc
+++ b/chromium/media/audio/audio_thread_impl.cc
@@ -4,6 +4,7 @@
#include "media/audio/audio_thread_impl.h"
+#include "base/message_loop/message_pump_type.h"
#include "base/optional.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/default_tick_clock.h"
@@ -20,7 +21,7 @@ AudioThreadImpl::AudioThreadImpl()
thread_.init_com_with_mta(true);
#elif defined(OS_FUCHSIA)
// FIDL-based APIs require async_t, which is initialized on IO thread.
- thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
+ thread_options.message_pump_type = base::MessagePumpType::IO;
#endif
CHECK(thread_.StartWithOptions(thread_options));
diff --git a/chromium/media/audio/cras/cras_input.cc b/chromium/media/audio/cras/cras_input.cc
index 4b4276f2fae..954fc2ad001 100644
--- a/chromium/media/audio/cras/cras_input.cc
+++ b/chromium/media/audio/cras/cras_input.cc
@@ -210,6 +210,9 @@ void CrasInputStream::Start(AudioInputCallback* callback) {
return;
}
+ cras_client_stream_params_set_client_type(stream_params,
+ CRAS_CLIENT_TYPE_CHROME);
+
if (UseCrasAec())
cras_client_stream_params_enable_aec(stream_params);
diff --git a/chromium/media/audio/cras/cras_unified.cc b/chromium/media/audio/cras/cras_unified.cc
index 0719abca359..002d611146b 100644
--- a/chromium/media/audio/cras/cras_unified.cc
+++ b/chromium/media/audio/cras/cras_unified.cc
@@ -202,6 +202,9 @@ void CrasUnifiedStream::Start(AudioSourceCallback* callback) {
return;
}
+ cras_client_stream_params_set_client_type(stream_params,
+ CRAS_CLIENT_TYPE_CHROME);
+
// Before starting the stream, save the number of bytes in a frame for use in
// the callback.
bytes_per_frame_ = cras_client_format_bytes_per_frame(audio_format);
diff --git a/chromium/media/audio/fake_audio_input_stream.cc b/chromium/media/audio/fake_audio_input_stream.cc
index 0c03c657972..ce75d1e175e 100644
--- a/chromium/media/audio/fake_audio_input_stream.cc
+++ b/chromium/media/audio/fake_audio_input_stream.cc
@@ -4,18 +4,29 @@
#include "media/audio/fake_audio_input_stream.h"
+#include <memory>
+#include <string>
+
#include "base/atomicops.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
+#include "base/macros.h"
#include "base/memory/ptr_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_split.h"
+#include "base/synchronization/lock.h"
+#include "base/thread_annotations.h"
+#include "base/threading/platform_thread.h"
+#include "base/threading/thread.h"
#include "base/time/time.h"
#include "media/audio/audio_manager_base.h"
#include "media/audio/simple_sources.h"
#include "media/base/audio_bus.h"
+#include "media/base/audio_parameters.h"
#include "media/base/media_switches.h"
namespace media {
@@ -33,15 +44,20 @@ AudioInputStream* FakeAudioInputStream::MakeFakeStream(
FakeAudioInputStream::FakeAudioInputStream(AudioManagerBase* manager,
const AudioParameters& params)
: audio_manager_(manager),
- callback_(NULL),
- fake_audio_worker_(manager->GetWorkerTaskRunner(), params),
+ callback_(nullptr),
params_(params),
- audio_bus_(AudioBus::Create(params)) {
+ audio_bus_(AudioBus::Create(params)),
+ capture_thread_(
+ nullptr,
+ base::OnTaskRunnerDeleter(manager->GetWorkerTaskRunner())) {
DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread());
}
FakeAudioInputStream::~FakeAudioInputStream() {
+ // |worker_| should be null as Stop() should have been called before.
+ DCHECK(!capture_thread_);
DCHECK(!callback_);
+ DCHECK(!fake_audio_worker_);
}
bool FakeAudioInputStream::Open() {
@@ -51,17 +67,49 @@ bool FakeAudioInputStream::Open() {
return true;
}
-void FakeAudioInputStream::Start(AudioInputCallback* callback) {
+void FakeAudioInputStream::Start(AudioInputCallback* callback) {
DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread());
- callback_ = callback;
- fake_audio_worker_.Start(base::BindRepeating(
+ DCHECK(!capture_thread_);
+ DCHECK(callback);
+ DCHECK(!fake_audio_worker_);
+
+ capture_thread_.reset(new base::Thread("FakeAudioInput"));
+ base::Thread::Options options;
+ // REALTIME_AUDIO priority is needed to avoid audio playout delays.
+ // See crbug.com/971265
+ options.priority = base::ThreadPriority::REALTIME_AUDIO;
+ CHECK(capture_thread_->StartWithOptions(options));
+
+ {
+ base::AutoLock lock(callback_lock_);
+ DCHECK(!callback_);
+ callback_ = callback;
+ }
+
+ fake_audio_worker_ = std::make_unique<FakeAudioWorker>(
+ capture_thread_->task_runner(), params_);
+ fake_audio_worker_->Start(base::BindRepeating(
&FakeAudioInputStream::ReadAudioFromSource, base::Unretained(this)));
}
void FakeAudioInputStream::Stop() {
DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread());
- fake_audio_worker_.Stop();
- callback_ = NULL;
+ // Start has not been called yet.
+ if (!capture_thread_) {
+ return;
+ }
+
+ {
+ base::AutoLock lock(callback_lock_);
+ DCHECK(callback_);
+ callback_ = nullptr;
+ }
+
+ DCHECK(fake_audio_worker_);
+ fake_audio_worker_->Stop();
+ fake_audio_worker_.reset();
+
+ capture_thread_.reset();
}
void FakeAudioInputStream::Close() {
@@ -104,8 +152,7 @@ void FakeAudioInputStream::SetOutputDeviceForAec(
void FakeAudioInputStream::ReadAudioFromSource(base::TimeTicks ideal_time,
base::TimeTicks now) {
- DCHECK(audio_manager_->GetWorkerTaskRunner()->BelongsToCurrentThread());
- DCHECK(callback_);
+ DCHECK(capture_thread_->task_runner()->BelongsToCurrentThread());
if (!audio_source_)
audio_source_ = ChooseSource();
@@ -121,13 +168,19 @@ void FakeAudioInputStream::ReadAudioFromSource(base::TimeTicks ideal_time,
//
// However, it would be pointless to add a FIFO queue here to delay the signal
// in this "fake" implementation. So, just hack the timing and carry-on.
- audio_source_->OnMoreData(base::TimeDelta(), ideal_time, 0, audio_bus_.get());
- callback_->OnData(audio_bus_.get(), ideal_time, 1.0);
+ {
+ base::AutoLock lock(callback_lock_);
+ if (audio_bus_ && callback_) {
+ audio_source_->OnMoreData(base::TimeDelta(), ideal_time, 0,
+ audio_bus_.get());
+ callback_->OnData(audio_bus_.get(), ideal_time, 1.0);
+ }
+ }
}
using AudioSourceCallback = AudioOutputStream::AudioSourceCallback;
std::unique_ptr<AudioSourceCallback> FakeAudioInputStream::ChooseSource() {
- DCHECK(audio_manager_->GetWorkerTaskRunner()->BelongsToCurrentThread());
+ DCHECK(capture_thread_->task_runner()->BelongsToCurrentThread());
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kUseFileForFakeAudioCapture)) {
diff --git a/chromium/media/audio/fake_audio_input_stream.h b/chromium/media/audio/fake_audio_input_stream.h
index 29f74dfed22..b76f12fdde5 100644
--- a/chromium/media/audio/fake_audio_input_stream.h
+++ b/chromium/media/audio/fake_audio_input_stream.h
@@ -8,10 +8,13 @@
#define MEDIA_AUDIO_FAKE_AUDIO_INPUT_STREAM_H_
#include <memory>
+#include <string>
#include <vector>
#include "base/callback_forward.h"
#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/threading/thread.h"
#include "media/audio/audio_io.h"
#include "media/base/audio_parameters.h"
#include "media/base/fake_audio_worker.h"
@@ -68,12 +71,18 @@ class MEDIA_EXPORT FakeAudioInputStream
void ReadAudioFromSource(base::TimeTicks ideal_time, base::TimeTicks now);
AudioManagerBase* audio_manager_;
- AudioInputCallback* callback_;
- FakeAudioWorker fake_audio_worker_;
+ // |callback_| needs the lock as ReadAudioFromSource reads callback_
+ // on the capture thread, while callback_ is set on the audio thread.
+ base::Lock callback_lock_;
+ AudioInputCallback* callback_ GUARDED_BY(callback_lock_);
AudioParameters params_;
+ std::unique_ptr<FakeAudioWorker> fake_audio_worker_;
std::unique_ptr<AudioOutputStream::AudioSourceCallback> audio_source_;
std::unique_ptr<media::AudioBus> audio_bus_;
+ // We will delete the capture thread on the AudioManager worker task runner
+ // since the audio thread is the main UI thread on Mac.
+ std::unique_ptr<base::Thread, base::OnTaskRunnerDeleter> capture_thread_;
DISALLOW_COPY_AND_ASSIGN(FakeAudioInputStream);
};
diff --git a/chromium/media/audio/fuchsia/OWNERS b/chromium/media/audio/fuchsia/OWNERS
index e7034eabb1e..c1b584511a6 100644
--- a/chromium/media/audio/fuchsia/OWNERS
+++ b/chromium/media/audio/fuchsia/OWNERS
@@ -1 +1,4 @@
file://build/fuchsia/OWNERS
+# COMPONENT: Fuchsia
+# OS: Fuchsia
+# TEAM: cr-fuchsia@chromium.org
diff --git a/chromium/media/audio/mac/audio_auhal_mac_unittest.cc b/chromium/media/audio/mac/audio_auhal_mac_unittest.cc
index 03eb7544f46..281b9415219 100644
--- a/chromium/media/audio/mac/audio_auhal_mac_unittest.cc
+++ b/chromium/media/audio/mac/audio_auhal_mac_unittest.cc
@@ -4,7 +4,7 @@
#include "base/bind.h"
#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_pump_type.h"
#include "base/run_loop.h"
#include "base/synchronization/waitable_event.h"
#include "base/test/test_message_loop.h"
@@ -39,7 +39,7 @@ ACTION_P3(MaybeSignalEvent, counter, signal_at_count, event) {
class AUHALStreamTest : public testing::Test {
public:
AUHALStreamTest()
- : message_loop_(base::MessageLoop::TYPE_UI),
+ : message_loop_(base::MessagePumpType::UI),
manager_(AudioManager::CreateForTesting(
std::make_unique<TestAudioThread>())),
manager_device_info_(manager_.get()) {
diff --git a/chromium/media/audio/mac/audio_device_listener_mac_unittest.cc b/chromium/media/audio/mac/audio_device_listener_mac_unittest.cc
index b222c5932a0..245a2cd4714 100644
--- a/chromium/media/audio/mac/audio_device_listener_mac_unittest.cc
+++ b/chromium/media/audio/mac/audio_device_listener_mac_unittest.cc
@@ -13,7 +13,7 @@
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "media/base/bind_to_current_loop.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -25,7 +25,7 @@ class AudioDeviceListenerMacTest : public testing::Test {
AudioDeviceListenerMacTest() {
// It's important to create the device listener from the message loop in
// order to ensure we don't end up with unbalanced TaskObserver calls.
- scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
+ task_environment_.GetMainThreadTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&AudioDeviceListenerMacTest::CreateDeviceListener,
base::Unretained(this)));
@@ -35,7 +35,7 @@ class AudioDeviceListenerMacTest : public testing::Test {
virtual ~AudioDeviceListenerMacTest() {
// It's important to destroy the device listener from the message loop in
// order to ensure we don't end up with unbalanced TaskObserver calls.
- scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
+ task_environment_.GetMainThreadTaskRunner()->PostTask(
FROM_HERE,
base::BindOnce(&AudioDeviceListenerMacTest::DestroyDeviceListener,
base::Unretained(this)));
@@ -98,7 +98,7 @@ class AudioDeviceListenerMacTest : public testing::Test {
MOCK_METHOD0(OnDeviceChange, void());
protected:
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::SingleThreadTaskEnvironment task_environment_;
std::unique_ptr<AudioDeviceListenerMac> device_listener_;
DISALLOW_COPY_AND_ASSIGN(AudioDeviceListenerMacTest);
diff --git a/chromium/media/audio/mac/audio_low_latency_input_mac_unittest.cc b/chromium/media/audio/mac/audio_low_latency_input_mac_unittest.cc
index 6f46b9f2358..cb47dae8204 100644
--- a/chromium/media/audio/mac/audio_low_latency_input_mac_unittest.cc
+++ b/chromium/media/audio/mac/audio_low_latency_input_mac_unittest.cc
@@ -11,7 +11,7 @@
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/test/test_timeouts.h"
#include "base/threading/platform_thread.h"
#include "media/audio/audio_device_description.h"
@@ -113,8 +113,8 @@ class WriteToFileAudioSink : public AudioInputStream::AudioInputCallback {
class MacAudioInputTest : public testing::Test {
protected:
MacAudioInputTest()
- : scoped_task_environment_(
- base::test::ScopedTaskEnvironment::MainThreadType::UI),
+ : task_environment_(
+ base::test::SingleThreadTaskEnvironment::MainThreadType::UI),
audio_manager_(AudioManager::CreateForTesting(
std::make_unique<TestAudioThread>())) {
// Wait for the AudioManager to finish any initialization on the audio loop.
@@ -159,7 +159,7 @@ class MacAudioInputTest : public testing::Test {
void OnLogMessage(const std::string& message) { log_message_ = message; }
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::SingleThreadTaskEnvironment task_environment_;
std::unique_ptr<AudioManager> audio_manager_;
std::string log_message_;
};
@@ -219,7 +219,7 @@ TEST_F(MacAudioInputTest, AUAudioInputStreamVerifyMonoRecording) {
EXPECT_CALL(sink, OnData(NotNull(), _, _))
.Times(AtLeast(10))
.WillRepeatedly(CheckCountAndPostQuitTask(
- &count, 10, scoped_task_environment_.GetMainThreadTaskRunner(),
+ &count, 10, task_environment_.GetMainThreadTaskRunner(),
run_loop.QuitClosure()));
ais->Start(&sink);
run_loop.Run();
@@ -255,7 +255,7 @@ TEST_F(MacAudioInputTest, AUAudioInputStreamVerifyStereoRecording) {
EXPECT_CALL(sink, OnData(NotNull(), _, _))
.Times(AtLeast(10))
.WillRepeatedly(CheckCountAndPostQuitTask(
- &count, 10, scoped_task_environment_.GetMainThreadTaskRunner(),
+ &count, 10, task_environment_.GetMainThreadTaskRunner(),
run_loop.QuitClosure()));
ais->Start(&sink);
run_loop.Run();
diff --git a/chromium/media/audio/mac/coreaudio_dispatch_override.cc b/chromium/media/audio/mac/coreaudio_dispatch_override.cc
index 2e555e16e4d..68a9618819c 100644
--- a/chromium/media/audio/mac/coreaudio_dispatch_override.cc
+++ b/chromium/media/audio/mac/coreaudio_dispatch_override.cc
@@ -97,14 +97,23 @@ bool AddressIsPauseOrResume(intptr_t address) {
DCHECK_EQ(strcmp(info.dli_fname, kCoreAudioPath), 0);
+ // Before Mac OSX 10.10, this code is not applied because dyld is not
+ // available.
+ // From Mac OSX 10.10 to 10.15 (excluded) the target functions that trigger
+ // the interposition are HALC_IOContext_ResumeIO and HALC_IOContext_PauseIO
+ // for respectively resume and pause.
+ // With MacOSX 10.15 the target functions have changed to _XIOContext_ResumeIO
+ // and _XIOContext_PauseIO for respectively resume and pause.
if (!resumeio_callsite && info.dli_sname &&
- strcmp(info.dli_sname, "HALC_IOContext_ResumeIO") == 0) {
+ (strcmp(info.dli_sname, "HALC_IOContext_ResumeIO") == 0 ||
+ strcmp(info.dli_sname, "_XIOContext_ResumeIO") == 0)) {
resumeio_callsite = address;
base::subtle::NoBarrier_CompareAndSwap(&g_resumeio_callsite, 0,
resumeio_callsite);
LogCallsiteLookupEvent(LOOKUP_RESUMEIO_CALLSITE_FOUND);
} else if (!pauseio_callsite && info.dli_sname &&
- strcmp(info.dli_sname, "HALC_IOContext_PauseIO") == 0) {
+ (strcmp(info.dli_sname, "HALC_IOContext_PauseIO") == 0 ||
+ strcmp(info.dli_sname, "_XIOContext_PauseIO") == 0)) {
pauseio_callsite = address;
base::subtle::NoBarrier_CompareAndSwap(&g_pauseio_callsite, 0,
pauseio_callsite);
diff --git a/chromium/media/audio/power_observer_helper_unittest.cc b/chromium/media/audio/power_observer_helper_unittest.cc
index 5a1f0b41c55..0d68d4ea207 100644
--- a/chromium/media/audio/power_observer_helper_unittest.cc
+++ b/chromium/media/audio/power_observer_helper_unittest.cc
@@ -6,7 +6,7 @@
#include "base/bind.h"
#include "base/synchronization/waitable_event.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/threading/thread.h"
#include "media/audio/power_observer_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -102,7 +102,7 @@ class PowerObserverHelperTest : public testing::Test {
}
// The test task environment.
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::TaskEnvironment task_environment_;
// The thread the helper is run on.
base::Thread power_observer_helper_thread_;
diff --git a/chromium/media/audio/pulse/pulse_util.cc b/chromium/media/audio/pulse/pulse_util.cc
index 97debbdbc07..66d7149bfec 100644
--- a/chromium/media/audio/pulse/pulse_util.cc
+++ b/chromium/media/audio/pulse/pulse_util.cc
@@ -13,6 +13,7 @@
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
+#include "build/branding_buildflags.h"
#include "media/audio/audio_device_description.h"
#include "media/base/audio_timestamp_helper.h"
@@ -30,7 +31,7 @@ namespace pulse {
namespace {
-#if defined(GOOGLE_CHROME_BUILD)
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
static const char kBrowserDisplayName[] = "google-chrome";
#else
static const char kBrowserDisplayName[] = "chromium-browser";
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 bacb183b324..8fc6929e4be 100644
--- a/chromium/media/audio/win/audio_low_latency_input_win.cc
+++ b/chromium/media/audio/win/audio_low_latency_input_win.cc
@@ -32,6 +32,8 @@ namespace media {
namespace {
+constexpr uint32_t KSAUDIO_SPEAKER_UNSUPPORTED = 0;
+
// Errors when initializing the audio client related to the audio format. Split
// by whether we're using format conversion or not. Used for reporting stats -
// do not renumber entries.
@@ -67,6 +69,25 @@ bool IsSupportedFormatForConversion(WAVEFORMATEXTENSIBLE* format_ex) {
return true;
}
+// Converts ChannelLayout to Microsoft's channel configuration but only discrete
+// and up to stereo is supported currently. All other multi-channel layouts
+// return KSAUDIO_SPEAKER_UNSUPPORTED.
+ChannelConfig ChannelLayoutToChannelConfig(ChannelLayout layout) {
+ switch (layout) {
+ case CHANNEL_LAYOUT_DISCRETE:
+ return KSAUDIO_SPEAKER_DIRECTOUT;
+ case CHANNEL_LAYOUT_MONO:
+ return KSAUDIO_SPEAKER_MONO;
+ case CHANNEL_LAYOUT_STEREO:
+ return KSAUDIO_SPEAKER_STEREO;
+ default:
+ LOG(WARNING) << "Unsupported channel layout: " << layout;
+ // KSAUDIO_SPEAKER_UNSUPPORTED equals 0 and corresponds to "no specific
+ // channel order".
+ return KSAUDIO_SPEAKER_UNSUPPORTED;
+ }
+}
+
} // namespace
WASAPIAudioInputStream::WASAPIAudioInputStream(
@@ -78,6 +99,10 @@ WASAPIAudioInputStream::WASAPIAudioInputStream(
DCHECK(manager_);
DCHECK(!device_id_.empty());
DCHECK(!log_callback_.is_null());
+ DCHECK_LE(params.channels(), 2);
+ DCHECK(params.channel_layout() == CHANNEL_LAYOUT_MONO ||
+ params.channel_layout() == CHANNEL_LAYOUT_STEREO ||
+ params.channel_layout() == CHANNEL_LAYOUT_DISCRETE);
// Load the Avrt DLL if not already loaded. Required to support MMCSS.
bool avrt_init = avrt::Initialize();
@@ -106,7 +131,7 @@ WASAPIAudioInputStream::WASAPIAudioInputStream(
format->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
input_format_.Samples.wValidBitsPerSample = format->wBitsPerSample;
input_format_.dwChannelMask =
- CoreAudioUtil::GetChannelConfig(device_id, eCapture);
+ ChannelLayoutToChannelConfig(params.channel_layout());
input_format_.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
DVLOG(1) << "Input: " << CoreAudioUtil::WaveFormatToString(&input_format_);
@@ -676,7 +701,7 @@ HRESULT WASAPIAudioInputStream::GetAudioEngineStreamFormat() {
hr = audio_client_->GetMixFormat(&format);
if (FAILED(hr))
return hr;
- DVLOG(2) << CoreAudioUtil::WaveFormatToString(format.get());
+ DVLOG(1) << CoreAudioUtil::WaveFormatToString(format.get());
#endif
return hr;
}
@@ -803,6 +828,8 @@ HRESULT WASAPIAudioInputStream::InitializeAudioEngine() {
// however cases when there are glitches anyway and it's avoided by setting a
// larger buffer size. The larger size does not create higher latency for
// properly implemented drivers.
+ DVLOG(1) << "Audio format used in IAudioClient::Initialize: "
+ << CoreAudioUtil::WaveFormatToString(&input_format_);
HRESULT hr = audio_client_->Initialize(
AUDCLNT_SHAREMODE_SHARED, flags,
100 * 1000 * 10, // Buffer duration, 100 ms expressed in 100-ns units.
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 3f8b8fcadf2..81cf90abdab 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
@@ -4,10 +4,10 @@
#include "media/audio/win/audio_low_latency_input_win.h"
+#include <windows.h>
#include <mmsystem.h>
#include <stddef.h>
#include <stdint.h>
-#include <windows.h>
#include <memory>
@@ -19,7 +19,7 @@
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/stringprintf.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/test/test_timeouts.h"
#include "base/win/scoped_com_initializer.h"
#include "media/audio/audio_device_description.h"
@@ -268,7 +268,7 @@ class WinAudioInputTest : public ::testing::Test {
~WinAudioInputTest() override { audio_manager_->Shutdown(); }
protected:
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::SingleThreadTaskEnvironment task_environment_;
std::unique_ptr<AudioManager> audio_manager_;
};
@@ -414,7 +414,7 @@ TEST_F(WinAudioInputTest, WASAPIAudioInputStreamTestPacketSizes) {
EXPECT_CALL(sink, OnData(NotNull(), _, _))
.Times(AtLeast(10))
.WillRepeatedly(CheckCountAndPostQuitTask(
- &count, 10, scoped_task_environment_.GetMainThreadTaskRunner(),
+ &count, 10, task_environment_.GetMainThreadTaskRunner(),
run_loop.QuitWhenIdleClosure()));
ais->Start(&sink);
run_loop.Run();
@@ -439,7 +439,7 @@ TEST_F(WinAudioInputTest, WASAPIAudioInputStreamTestPacketSizes) {
EXPECT_CALL(sink, OnData(NotNull(), _, _))
.Times(AtLeast(10))
.WillRepeatedly(CheckCountAndPostQuitTask(
- &count, 10, scoped_task_environment_.GetMainThreadTaskRunner(),
+ &count, 10, task_environment_.GetMainThreadTaskRunner(),
run_loop.QuitWhenIdleClosure()));
ais->Start(&sink);
run_loop.Run();
@@ -460,7 +460,7 @@ TEST_F(WinAudioInputTest, WASAPIAudioInputStreamTestPacketSizes) {
EXPECT_CALL(sink, OnData(NotNull(), _, _))
.Times(AtLeast(10))
.WillRepeatedly(CheckCountAndPostQuitTask(
- &count, 10, scoped_task_environment_.GetMainThreadTaskRunner(),
+ &count, 10, task_environment_.GetMainThreadTaskRunner(),
run_loop.QuitWhenIdleClosure()));
ais->Start(&sink);
run_loop.Run();
diff --git a/chromium/media/audio/win/audio_output_win_unittest.cc b/chromium/media/audio/win/audio_output_win_unittest.cc
index 07c797390b0..e4d6c633f29 100644
--- a/chromium/media/audio/win/audio_output_win_unittest.cc
+++ b/chromium/media/audio/win/audio_output_win_unittest.cc
@@ -14,7 +14,7 @@
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/sync_socket.h"
-#include "base/test/scoped_task_environment.h"
+#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "base/win/scoped_com_initializer.h"
#include "media/audio/audio_device_info_accessor_for_tests.h"
@@ -164,7 +164,7 @@ class WinAudioTest : public ::testing::Test {
~WinAudioTest() override { audio_manager_->Shutdown(); }
protected:
- base::test::ScopedTaskEnvironment scoped_task_environment_;
+ base::test::SingleThreadTaskEnvironment task_environment_;
std::unique_ptr<AudioManager> audio_manager_;
std::unique_ptr<AudioDeviceInfoAccessorForTests> audio_manager_device_info_;
};
diff --git a/chromium/media/audio/win/core_audio_util_win.cc b/chromium/media/audio/win/core_audio_util_win.cc
index 9062a3646cc..289b4042a20 100644
--- a/chromium/media/audio/win/core_audio_util_win.cc
+++ b/chromium/media/audio/win/core_audio_util_win.cc
@@ -41,7 +41,7 @@ const GUID kCommunicationsSessionId = {
namespace {
-enum { KSAUDIO_SPEAKER_UNSUPPORTED = 0 };
+constexpr uint32_t KSAUDIO_SPEAKER_UNSUPPORTED = 0xFFFFFFFF;
// Used for mapping UMA histograms with corresponding source of logging.
enum class UmaLogStep {