summaryrefslogtreecommitdiff
path: root/chromium/services/audio
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-08-30 10:22:43 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-08-30 12:36:28 +0000
commit271a6c3487a14599023a9106329505597638d793 (patch)
treee040d58ffc86c1480b79ca8528020ca9ec919bf8 /chromium/services/audio
parent7b2ffa587235a47d4094787d72f38102089f402a (diff)
downloadqtwebengine-chromium-271a6c3487a14599023a9106329505597638d793.tar.gz
BASELINE: Update Chromium to 77.0.3865.59
Change-Id: I1e89a5f3b009a9519a6705102ad65c92fe736f21 Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/services/audio')
-rw-r--r--chromium/services/audio/group_coordinator-impl.h4
-rw-r--r--chromium/services/audio/group_coordinator_unittest.cc16
-rw-r--r--chromium/services/audio/input_controller_unittest.cc2
-rw-r--r--chromium/services/audio/loopback_stream.cc72
-rw-r--r--chromium/services/audio/loopback_stream_unittest.cc2
-rw-r--r--chromium/services/audio/output_controller.cc2
-rw-r--r--chromium/services/audio/output_controller_unittest.cc7
-rw-r--r--chromium/services/audio/service.cc9
-rw-r--r--chromium/services/audio/service.h5
-rw-r--r--chromium/services/audio/service_factory.cc7
-rw-r--r--chromium/services/audio/sync_reader.cc6
11 files changed, 81 insertions, 51 deletions
diff --git a/chromium/services/audio/group_coordinator-impl.h b/chromium/services/audio/group_coordinator-impl.h
index 6e10c3bbc3f..5c3b5407599 100644
--- a/chromium/services/audio/group_coordinator-impl.h
+++ b/chromium/services/audio/group_coordinator-impl.h
@@ -42,7 +42,7 @@ void GroupCoordinator<Member>::RegisterMember(
const auto it = FindGroup(group_id);
std::vector<Member*>& members = it->second.members;
- DCHECK(!base::ContainsValue(members, member));
+ DCHECK(!base::Contains(members, member));
members.push_back(member);
DCHECK_INCREMENT_MUTATION_COUNT();
DCHECK_REMEMBER_CURRENT_MUTATION_COUNT();
@@ -84,7 +84,7 @@ void GroupCoordinator<Member>::AddObserver(
DCHECK(observer);
std::vector<Observer*>& observers = FindGroup(group_id)->second.observers;
- DCHECK(!base::ContainsValue(observers, observer));
+ DCHECK(!base::Contains(observers, observer));
observers.push_back(observer);
DCHECK_INCREMENT_MUTATION_COUNT();
}
diff --git a/chromium/services/audio/group_coordinator_unittest.cc b/chromium/services/audio/group_coordinator_unittest.cc
index 91b81c5598c..8dbdfb944f7 100644
--- a/chromium/services/audio/group_coordinator_unittest.cc
+++ b/chromium/services/audio/group_coordinator_unittest.cc
@@ -72,8 +72,8 @@ TEST(GroupCoordinatorTest, RegistersMembersInSameGroup) {
const std::vector<MockGroupMember*>& members =
coordinator.GetCurrentMembers(group_id);
EXPECT_EQ(2u, members.size());
- EXPECT_TRUE(base::ContainsValue(members, &member1));
- EXPECT_TRUE(base::ContainsValue(members, &member2));
+ EXPECT_TRUE(base::Contains(members, &member1));
+ EXPECT_TRUE(base::Contains(members, &member2));
EXPECT_TRUE(
coordinator.GetCurrentMembers(UnguessableToken::Create()).empty());
@@ -120,8 +120,8 @@ TEST(GroupCoordinatorTest, RegistersMembersInDifferentGroups) {
const std::vector<MockGroupMember*>& members_a =
coordinator.GetCurrentMembers(group_id_a);
EXPECT_EQ(2u, members_a.size());
- EXPECT_TRUE(base::ContainsValue(members_a, &member_a_1));
- EXPECT_TRUE(base::ContainsValue(members_a, &member_a_2));
+ EXPECT_TRUE(base::Contains(members_a, &member_a_1));
+ EXPECT_TRUE(base::Contains(members_a, &member_a_2));
EXPECT_EQ(std::vector<MockGroupMember*>({&member_b_1}),
coordinator.GetCurrentMembers(group_id_b));
EXPECT_TRUE(
@@ -155,8 +155,8 @@ TEST(GroupCoordinatorTest, TracksMembersWithoutAnObserverPresent) {
const std::vector<MockGroupMember*>& members =
coordinator.GetCurrentMembers(group_id);
EXPECT_EQ(2u, members.size());
- EXPECT_TRUE(base::ContainsValue(members, &member1));
- EXPECT_TRUE(base::ContainsValue(members, &member2));
+ EXPECT_TRUE(base::Contains(members, &member1));
+ EXPECT_TRUE(base::Contains(members, &member2));
EXPECT_TRUE(
coordinator.GetCurrentMembers(UnguessableToken::Create()).empty());
@@ -191,8 +191,8 @@ TEST(GroupCoordinatorTest, NotifiesOnlyWhileObserving) {
const std::vector<MockGroupMember*>& members =
coordinator.GetCurrentMembers(group_id);
EXPECT_EQ(2u, members.size());
- EXPECT_TRUE(base::ContainsValue(members, &member1));
- EXPECT_TRUE(base::ContainsValue(members, &member2));
+ EXPECT_TRUE(base::Contains(members, &member1));
+ EXPECT_TRUE(base::Contains(members, &member2));
coordinator.UnregisterMember(group_id, &member1);
EXPECT_EQ(std::vector<MockGroupMember*>({&member2}),
diff --git a/chromium/services/audio/input_controller_unittest.cc b/chromium/services/audio/input_controller_unittest.cc
index de779c8fe7f..02a7e1c7fd2 100644
--- a/chromium/services/audio/input_controller_unittest.cc
+++ b/chromium/services/audio/input_controller_unittest.cc
@@ -109,7 +109,7 @@ class InputControllerTest : public ::testing::TestWithParam<bool> {
public:
InputControllerTest()
: task_environment_(
- base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
+ base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME),
audio_manager_(std::make_unique<media::FakeAudioManager>(
std::make_unique<media::TestAudioThread>(false),
&log_factory_)),
diff --git a/chromium/services/audio/loopback_stream.cc b/chromium/services/audio/loopback_stream.cc
index fed7bb1d524..c30ec22e718 100644
--- a/chromium/services/audio/loopback_stream.cc
+++ b/chromium/services/audio/loopback_stream.cc
@@ -68,43 +68,32 @@ LoopbackStream::LoopbackStream(
observer_.set_disconnect_handler(
base::BindOnce(&LoopbackStream::OnError, base::Unretained(this)));
- // As of this writing, only machines older than about 10 years won't be able
- // to produce high-resolution timestamps. In order to avoid adding extra
- // complexity to the implementation, simply refuse to operate without that
- // basic level of hardware support.
- //
// Construct the components of the AudioDataPipe, for delivering the data to
// the consumer. If successful, create the FlowNetwork too.
- if (base::TimeTicks::IsHighResolution()) {
- base::CancelableSyncSocket foreign_socket;
- std::unique_ptr<InputSyncWriter> writer = InputSyncWriter::Create(
- base::BindRepeating(
- [](const std::string& message) { VLOG(1) << message; }),
- shared_memory_count, params, &foreign_socket);
- if (writer) {
- base::ReadOnlySharedMemoryRegion shared_memory_region =
- writer->TakeSharedMemoryRegion();
- mojo::ScopedHandle socket_handle;
- if (shared_memory_region.IsValid()) {
- socket_handle = mojo::WrapPlatformFile(foreign_socket.Release());
- if (socket_handle.is_valid()) {
- std::move(created_callback)
- .Run({base::in_place, std::move(shared_memory_region),
- std::move(socket_handle)});
- network_.reset(new FlowNetwork(std::move(flow_task_runner), params,
- std::move(writer)));
- return; // Success!
- }
+ base::CancelableSyncSocket foreign_socket;
+ std::unique_ptr<InputSyncWriter> writer = InputSyncWriter::Create(
+ base::BindRepeating(
+ [](const std::string& message) { VLOG(1) << message; }),
+ shared_memory_count, params, &foreign_socket);
+ if (writer) {
+ base::ReadOnlySharedMemoryRegion shared_memory_region =
+ writer->TakeSharedMemoryRegion();
+ mojo::ScopedHandle socket_handle;
+ if (shared_memory_region.IsValid()) {
+ socket_handle = mojo::WrapPlatformFile(foreign_socket.Release());
+ if (socket_handle.is_valid()) {
+ std::move(created_callback)
+ .Run({base::in_place, std::move(shared_memory_region),
+ std::move(socket_handle)});
+ network_.reset(new FlowNetwork(std::move(flow_task_runner), params,
+ std::move(writer)));
+ return; // Success!
}
}
- } else /* if (!base::TimeTicks::IsHighResolution()) */ {
- LOG(ERROR) << "Refusing to start loop-back because this machine cannot "
- "provide high-resolution timestamps.";
}
- // If this point is reached, either the TimeTicks clock is not high resolution
- // or one or more AudioDataPipe components failed to initialize. Report the
- // error.
+ // If this point is reached, one or more AudioDataPipe components failed to
+ // initialize. Report the error.
std::move(created_callback).Run(nullptr);
OnError();
}
@@ -174,6 +163,17 @@ void LoopbackStream::OnMemberJoinedGroup(LoopbackGroupMember* member) {
return;
}
+ if (!base::TimeTicks::IsHighResolution()) {
+ // As of this writing, only machines manufactured before 2008 won't be able
+ // to produce high-resolution timestamps. Since the buffer management logic
+ // (to mitigate overruns/underruns) depends on them to function correctly,
+ // simply return early (i.e., never start snooping on the |member|).
+ TRACE_EVENT_INSTANT0("audio",
+ "LoopbackStream::OnMemberJoinedGroup Rejected",
+ TRACE_EVENT_SCOPE_THREAD);
+ return;
+ }
+
TRACE_EVENT1("audio", "LoopbackStream::OnMemberJoinedGroup", "member",
member);
@@ -194,10 +194,14 @@ void LoopbackStream::OnMemberLeftGroup(LoopbackGroupMember* member) {
return;
}
+ const auto snoop_it = snoopers_.find(member);
+ if (snoop_it == snoopers_.end()) {
+ // See comments about "high-resolution timestamps" in OnMemberJoinedGroup().
+ return;
+ }
+
TRACE_EVENT1("audio", "LoopbackStream::OnMemberLeftGroup", "member", member);
- const auto snoop_it = snoopers_.find(member);
- DCHECK(snoop_it != snoopers_.end());
SnooperNode* const snooper = &(snoop_it->second);
member->StopSnooping(snooper);
network_->RemoveInput(snooper);
@@ -262,7 +266,7 @@ void LoopbackStream::FlowNetwork::AddInput(SnooperNode* node) {
if (inputs_.empty()) {
HelpDiagnoseCauseOfLoopbackCrash("adding first input");
}
- DCHECK(!base::ContainsValue(inputs_, node));
+ DCHECK(!base::Contains(inputs_, node));
inputs_.push_back(node);
}
diff --git a/chromium/services/audio/loopback_stream_unittest.cc b/chromium/services/audio/loopback_stream_unittest.cc
index 924bb6b7b82..860eab3793b 100644
--- a/chromium/services/audio/loopback_stream_unittest.cc
+++ b/chromium/services/audio/loopback_stream_unittest.cc
@@ -252,7 +252,7 @@ class LoopbackStreamTest : public testing::Test {
private:
base::test::ScopedTaskEnvironment scoped_task_environment_{
- base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME};
+ base::test::ScopedTaskEnvironment::TimeSource::MOCK_TIME};
LoopbackCoordinator coordinator_;
const base::UnguessableToken group_id_;
std::vector<std::unique_ptr<FakeLoopbackGroupMember>> sources_;
diff --git a/chromium/services/audio/output_controller.cc b/chromium/services/audio/output_controller.cc
index cf047970e48..faf7e5570e4 100644
--- a/chromium/services/audio/output_controller.cc
+++ b/chromium/services/audio/output_controller.cc
@@ -498,7 +498,7 @@ void OutputController::StartSnooping(Snooper* snooper) {
// The list will only update on this thread, and only be read on the realtime
// audio thread.
- DCHECK(!base::ContainsValue(snoopers_, snooper));
+ DCHECK(!base::Contains(snoopers_, snooper));
base::AutoLock lock(snooper_lock_);
snoopers_.push_back(snooper);
}
diff --git a/chromium/services/audio/output_controller_unittest.cc b/chromium/services/audio/output_controller_unittest.cc
index f3da4563bf6..d837b60a020 100644
--- a/chromium/services/audio/output_controller_unittest.cc
+++ b/chromium/services/audio/output_controller_unittest.cc
@@ -22,6 +22,7 @@
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_piece.h"
+#include "base/test/gmock_callback_support.h"
#include "base/test/test_message_loop.h"
#include "base/threading/thread.h"
#include "base/time/time.h"
@@ -32,7 +33,6 @@
#include "media/audio/test_audio_thread.h"
#include "media/base/audio_bus.h"
#include "media/base/audio_parameters.h"
-#include "media/base/gmock_callback_support.h"
#include "services/audio/loopback_group_member.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -49,8 +49,9 @@ using media::AudioBus;
using media::AudioManager;
using media::AudioOutputStream;
using media::AudioParameters;
-using media::RunClosure;
-using media::RunOnceClosure;
+
+using base::test::RunClosure;
+using base::test::RunOnceClosure;
namespace audio {
namespace {
diff --git a/chromium/services/audio/service.cc b/chromium/services/audio/service.cc
index 37ebf55513a..aa1551c5941 100644
--- a/chromium/services/audio/service.cc
+++ b/chromium/services/audio/service.cc
@@ -7,8 +7,10 @@
#include <utility>
#include "base/bind.h"
+#include "base/deferred_sequenced_task_runner.h"
#include "base/logging.h"
#include "base/macros.h"
+#include "base/no_destructor.h"
#include "base/single_thread_task_runner.h"
#include "base/system/system_monitor.h"
#include "base/time/default_tick_clock.h"
@@ -83,6 +85,13 @@ Service::~Service() {
magic_bytes_ = 0xDEADBEEFu;
}
+// static
+base::DeferredSequencedTaskRunner* Service::GetInProcessTaskRunner() {
+ static base::NoDestructor<scoped_refptr<base::DeferredSequencedTaskRunner>>
+ instance(base::MakeRefCounted<base::DeferredSequencedTaskRunner>());
+ return instance->get();
+}
+
void Service::OnStart() {
CHECK_EQ(magic_bytes_, 0x600DC0DEu);
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/chromium/services/audio/service.h b/chromium/services/audio/service.h
index 66ec0d703c5..b37b5393755 100644
--- a/chromium/services/audio/service.h
+++ b/chromium/services/audio/service.h
@@ -27,6 +27,7 @@
#include "services/service_manager/public/mojom/service.mojom.h"
namespace base {
+class DeferredSequencedTaskRunner;
class SystemMonitor;
}
@@ -77,6 +78,10 @@ class Service : public service_manager::Service {
mojo::PendingReceiver<service_manager::mojom::Service> receiver);
~Service() final;
+ // Returns a DeferredSequencedTaskRunner to be used to run the audio service
+ // when launched in the browser process.
+ static base::DeferredSequencedTaskRunner* GetInProcessTaskRunner();
+
// service_manager::Service implementation.
void OnStart() final;
void OnBindInterface(const service_manager::BindSourceInfo& source_info,
diff --git a/chromium/services/audio/service_factory.cc b/chromium/services/audio/service_factory.cc
index 965e5313d95..f6c45a2347c 100644
--- a/chromium/services/audio/service_factory.cc
+++ b/chromium/services/audio/service_factory.cc
@@ -13,6 +13,7 @@
#include "base/optional.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
+#include "build/build_config.h"
#include "media/audio/audio_manager.h"
#include "media/base/media_switches.h"
#include "services/audio/in_process_audio_manager_accessor.h"
@@ -51,7 +52,13 @@ base::Optional<base::TimeDelta> GetQuitTimeout() {
if (auto timeout = GetExperimentalQuitTimeout())
return *timeout >= base::TimeDelta() ? timeout : base::nullopt;
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ // On platforms where the audio service have launched, use default timeout
+ // instead of no lifetime management.
+ return base::TimeDelta::FromMinutes(15);
+#else
return base::nullopt;
+#endif
}
} // namespace
diff --git a/chromium/services/audio/sync_reader.cc b/chromium/services/audio/sync_reader.cc
index ed3b6a92bc0..17889fb4b83 100644
--- a/chromium/services/audio/sync_reader.cc
+++ b/chromium/services/audio/sync_reader.cc
@@ -218,8 +218,12 @@ void SyncReader::Read(media::AudioBus* dest) {
}
output_bus_->SetBitstreamDataSize(data_size);
output_bus_->SetBitstreamFrames(bitstream_frames);
+ output_bus_->CopyTo(dest);
+ return;
}
- output_bus_->CopyTo(dest);
+
+ // Copy and clip data coming across the shared memory since it's untrusted.
+ output_bus_->CopyAndClipTo(dest);
}
void SyncReader::Close() {