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

Side by Side Diff: content/renderer/media/audio_debug_recorder.cc

Issue 1246283003: Split out audio debug recording from RenderProcessHostImpl. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/audio_debug_recorder.h"
6
7 #include "base/files/file.h"
8 #include "content/common/media/audio_debug_recording.mojom.h"
9 #include "content/public/common/service_registry.h"
10 #include "content/renderer/media/webrtc_logging.h"
11 #include "third_party/mojo/src/mojo/edk/embedder/embedder.h"
12 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"
13
14 namespace {
15 const int kInvalidDelegateId = -1;
16 }
17
18 namespace content {
19
20 AudioDebugRecorder* AudioDebugRecorder::g_filter = NULL;
21
22 class AudioDebugRecorder::Observer : public AudioDebugRecordingObserver {
23 public:
24 Observer(int id, mojo::InterfaceRequest<AudioDebugRecordingObserver> request);
25 ~Observer() override = default;
26
27 // AudioDebugRecordingObserver implementation.
28 void Enable(mojo::ScopedHandle file_handle) override;
29 void Disable() override;
30
31 private:
32 const int id_;
33 mojo::Binding<AudioDebugRecordingObserver> binding_;
34
35 DISALLOW_COPY_AND_ASSIGN(Observer);
36 };
37
38 AudioDebugRecorder::Observer::Observer(
39 int id,
40 mojo::InterfaceRequest<AudioDebugRecordingObserver> request)
41 : id_(id), binding_(this, request.Pass()) {}
42
43 void AudioDebugRecorder::Observer::Enable(mojo::ScopedHandle file_handle) {
44 mojo::embedder::ScopedPlatformHandle scoped_platform_handle;
45 MojoResult result = mojo::embedder::PassWrappedPlatformHandle(
46 file_handle.release().value(), &scoped_platform_handle);
47 if (result != MOJO_RESULT_OK)
48 return;
49
50 DCHECK(scoped_platform_handle.is_valid());
51 base::PlatformFile platform_handle;
52 #if defined(OS_POSIX)
53 platform_handle = scoped_platform_handle.release().fd;
54 #elif defined(OS_WIN)
55 platform_handle = scoped_platform_handle.release().handle;
56 #else
57 #error "Platform not yet supported."
58 #endif
59
60 AudioDebugRecorder::Get()->DoEnableAecDump(id_, platform_handle);
61 }
62
63 void AudioDebugRecorder::Observer::Disable() {
64 AudioDebugRecorder::Get()->DoDisableAecDump();
65 }
66
67 AudioDebugRecorder::AudioDebugRecorder(ServiceRegistry* service_registry)
68 : delegate_id_counter_(1) {
69 DCHECK(!g_filter);
70 g_filter = this;
71
72 service_registry->ConnectToRemoteService(mojo::GetProxy(&service_));
73 service_.set_connection_error_handler(base::Bind(
74 &AudioDebugRecorder::OnConnectionError, base::Unretained(this)));
75 }
76
77 AudioDebugRecorder::~AudioDebugRecorder() {
78 DCHECK(thread_checker_.CalledOnValidThread());
79 DCHECK_EQ(g_filter, this);
80 g_filter = NULL;
81 }
82
83 // static
84 scoped_refptr<AudioDebugRecorder> AudioDebugRecorder::Get() {
85 return g_filter;
86 }
87
88 void AudioDebugRecorder::OnConnectionError() {
89 DCHECK(thread_checker_.CalledOnValidThread());
90 for (DelegateMap::iterator it = delegates_.begin(); it != delegates_.end();
91 ++it) {
92 it->second->OnIpcClosing();
93 }
94 delegates_.clear();
95 observers_.clear();
96 }
97
98 void AudioDebugRecorder::AddDelegate(
99 AudioDebugRecorder::AecDumpDelegate* delegate) {
100 DCHECK(thread_checker_.CalledOnValidThread());
101 DCHECK(delegate);
102 DCHECK_EQ(kInvalidDelegateId, GetIdForDelegate(delegate));
103
104 int id = delegate_id_counter_++;
105 delegates_[id] = delegate;
106
107 AudioDebugRecordingObserverPtr observer;
108 observers_.set(id,
109 make_scoped_ptr(new Observer(id, mojo::GetProxy(&observer))));
110 service_->RegisterObserver(id, observer.Pass());
111 }
112
113 void AudioDebugRecorder::RemoveDelegate(
114 AudioDebugRecorder::AecDumpDelegate* delegate) {
115 DCHECK(thread_checker_.CalledOnValidThread());
116 DCHECK(delegate);
117
118 int id = GetIdForDelegate(delegate);
119 DCHECK_NE(kInvalidDelegateId, id);
120 delegates_.erase(id);
121
122 auto it = observers_.find(id);
123 DCHECK(it != observers_.end());
124 observers_.erase(it);
125 }
126
127 void AudioDebugRecorder::DoEnableAecDump(int id,
128 base::PlatformFile file_handle) {
129 DCHECK(thread_checker_.CalledOnValidThread());
130 DelegateMap::iterator it = delegates_.find(id);
131 if (it != delegates_.end()) {
132 it->second->OnAecDumpFile(file_handle);
133 } else {
134 // Delegate has been removed, we must close the file.
135 base::File file(file_handle);
136 DCHECK(file.IsValid());
137 file.Close();
138 }
139 }
140
141 void AudioDebugRecorder::DoDisableAecDump() {
142 DCHECK(thread_checker_.CalledOnValidThread());
143 for (DelegateMap::iterator it = delegates_.begin(); it != delegates_.end();
144 ++it) {
145 it->second->OnDisableAecDump();
146 }
147 }
148
149 int AudioDebugRecorder::GetIdForDelegate(
150 AudioDebugRecorder::AecDumpDelegate* delegate) {
151 DCHECK(thread_checker_.CalledOnValidThread());
152 for (DelegateMap::iterator it = delegates_.begin(); it != delegates_.end();
153 ++it) {
154 if (it->second == delegate)
155 return it->first;
156 }
157 return kInvalidDelegateId;
158 }
159
160 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698