Index: content/renderer/media/aec_dump_message_filter.cc |
diff --git a/content/renderer/media/aec_dump_message_filter.cc b/content/renderer/media/aec_dump_message_filter.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..89356f2076cfea14e540c85d3970d7c905990087 |
--- /dev/null |
+++ b/content/renderer/media/aec_dump_message_filter.cc |
@@ -0,0 +1,130 @@ |
+// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/renderer/media/aec_dump_message_filter.h" |
+ |
+#include "base/message_loop/message_loop_proxy.h" |
+#include "content/common/media/aec_dump_messages.h" |
+#include "content/renderer/media/webrtc_logging.h" |
+#include "ipc/ipc_logging.h" |
+#include "ipc/ipc_sender.h" |
+ |
+namespace content { |
+ |
+AecDumpMessageFilter* AecDumpMessageFilter::g_filter = NULL; |
+ |
+AecDumpMessageFilter::AecDumpMessageFilter( |
+ const scoped_refptr<base::MessageLoopProxy>& io_message_loop, |
+ const scoped_refptr<base::MessageLoopProxy>& main_message_loop) |
+ : sender_(NULL), |
+ observer_(NULL), |
+ io_message_loop_(io_message_loop), |
+ main_message_loop_(main_message_loop) { |
+ DCHECK(!g_filter); |
+ g_filter = this; |
+} |
+ |
+AecDumpMessageFilter::~AecDumpMessageFilter() { |
+ DCHECK_EQ(g_filter, this); |
+ g_filter = NULL; |
+} |
+ |
+// static |
+scoped_refptr<AecDumpMessageFilter> AecDumpMessageFilter::Get() { |
+ return g_filter; |
no longer working on chromium
2014/06/16 18:30:55
which thread creates the AecDumpMessageFilter? and
Henrik Grunell
2014/06/17 20:21:41
It's created by the RenderThreadImpl on the main t
|
+} |
+ |
+void AecDumpMessageFilter::RegisterAecDumpConsumer(int id) { |
+ Send(new AecDumpMsg_RegisterAecDumpConsumer(id)); |
+} |
+ |
+void AecDumpMessageFilter::UnregisterAecDumpConsumer(int id) { |
+ Send(new AecDumpMsg_UnregisterAecDumpConsumer(id)); |
+} |
+ |
+void AecDumpMessageFilter::Send(IPC::Message* message) { |
+ DCHECK(io_message_loop_->BelongsToCurrentThread()); |
+ if (sender_) |
no longer working on chromium
2014/06/16 18:30:55
I am not familiar with the IPC code, could you ple
Henrik Grunell
2014/06/17 20:21:41
Sure. But the code is similar to existing code in
|
+ sender_->Send(message); |
+ else |
+ delete message; |
+} |
+ |
+bool AecDumpMessageFilter::OnMessageReceived(const IPC::Message& message) { |
+ DCHECK(io_message_loop_->BelongsToCurrentThread()); |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(AecDumpMessageFilter, message) |
+ IPC_MESSAGE_HANDLER(AecDumpMsg_EnableAecDump, OnEnableAecDump) |
+ IPC_MESSAGE_HANDLER(AecDumpMsg_DisableAecDump, OnDisableAecDump) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+void AecDumpMessageFilter::OnFilterAdded(IPC::Sender* sender) { |
+ DCHECK(io_message_loop_->BelongsToCurrentThread()); |
+ sender_ = sender; |
+} |
+ |
+void AecDumpMessageFilter::OnFilterRemoved() { |
+ DCHECK(io_message_loop_->BelongsToCurrentThread()); |
+ |
+ // Once removed, a filter will not be used again. At this time the |
+ // observer must be notified so it releases its reference. |
+ OnChannelClosing(); |
+} |
+ |
+void AecDumpMessageFilter::OnChannelClosing() { |
+ DCHECK(io_message_loop_->BelongsToCurrentThread()); |
+ sender_ = NULL; |
+ main_message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &AecDumpMessageFilter::DoChannelClosingOnObserver, |
+ this)); |
+} |
+ |
+void AecDumpMessageFilter::OnEnableAecDump( |
+ int id, |
+ IPC::PlatformFileForTransit file_handle) { |
+ DCHECK(io_message_loop_->BelongsToCurrentThread()); |
+ main_message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &AecDumpMessageFilter::DoEnableAecDump, |
+ this, |
+ id, |
+ file_handle)); |
+} |
+ |
+void AecDumpMessageFilter::OnDisableAecDump() { |
+ DCHECK(io_message_loop_->BelongsToCurrentThread()); |
+ main_message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &AecDumpMessageFilter::DoDisableAecDump, |
+ this)); |
+} |
+ |
+void AecDumpMessageFilter::DoEnableAecDump( |
+ int id, |
+ IPC::PlatformFileForTransit file_handle) { |
+ DCHECK(main_message_loop_->BelongsToCurrentThread()); |
+ if (observer_) |
+ observer_->OnAecDumpFile(id, file_handle); |
no longer working on chromium
2014/06/16 18:30:55
why not call OnEnableAecDump?
Henrik Grunell
2014/06/17 20:21:41
The observer doesn't have such a function. Not sur
|
+} |
+ |
+void AecDumpMessageFilter::DoDisableAecDump() { |
+ DCHECK(main_message_loop_->BelongsToCurrentThread()); |
+ if (observer_) |
+ observer_->OnDisableAecDump(); |
+} |
+ |
+void AecDumpMessageFilter::DoChannelClosingOnObserver() { |
+ DCHECK(main_message_loop_->BelongsToCurrentThread()); |
+ if (observer_) |
+ observer_->OnIpcClosed(); |
+} |
+ |
+} // namespace content |