OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/audio_message_filter.h" | 5 #include "content/renderer/media/audio_message_filter.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/time.h" | 9 #include "base/time.h" |
10 #include "content/common/child_process.h" | 10 #include "content/common/child_process.h" |
11 #include "content/common/media/audio_messages.h" | 11 #include "content/common/media/audio_messages.h" |
12 #include "content/renderer/render_thread_impl.h" | 12 #include "content/renderer/render_thread_impl.h" |
13 #include "ipc/ipc_logging.h" | 13 #include "ipc/ipc_logging.h" |
14 | 14 |
15 AudioMessageFilter* AudioMessageFilter::filter_ = NULL; | 15 AudioMessageFilter* AudioMessageFilter::filter_ = NULL; |
16 | 16 |
17 // static | 17 // static |
18 AudioMessageFilter* AudioMessageFilter::Get() { | 18 AudioMessageFilter* AudioMessageFilter::Get() { |
19 return filter_; | 19 return filter_; |
20 } | 20 } |
21 | 21 |
22 AudioMessageFilter::AudioMessageFilter() | 22 AudioMessageFilter::AudioMessageFilter() |
23 : channel_(NULL) { | 23 : channel_(NULL) { |
24 DVLOG(1) << "AudioMessageFilter::AudioMessageFilter()"; | 24 DVLOG(1) << "AudioMessageFilter::AudioMessageFilter()"; |
25 DCHECK(!filter_); | 25 DCHECK(!filter_); |
26 filter_ = this; | 26 filter_ = this; |
27 } | 27 } |
28 | 28 |
29 int AudioMessageFilter::AddDelegate(media::AudioOutputIPCDelegate* delegate) { | |
30 return delegates_.Add(delegate); | |
31 } | |
32 | |
33 void AudioMessageFilter::RemoveDelegate(int id) { | |
34 delegates_.Remove(id); | |
35 } | |
36 | |
37 void AudioMessageFilter::CreateStream(int stream_id, | |
38 const media::AudioParameters& params) { | |
39 Send(new AudioHostMsg_CreateStream(stream_id, params)); | |
40 } | |
41 | |
42 void AudioMessageFilter::PlayStream(int stream_id) { | |
43 Send(new AudioHostMsg_PlayStream(stream_id)); | |
44 } | |
45 | |
46 void AudioMessageFilter::PauseStream(int stream_id) { | |
47 Send(new AudioHostMsg_PauseStream(stream_id)); | |
48 } | |
49 | |
50 void AudioMessageFilter::FlushStream(int stream_id) { | |
51 Send(new AudioHostMsg_FlushStream(stream_id)); | |
52 } | |
53 | |
54 void AudioMessageFilter::CloseStream(int stream_id) { | |
55 Send(new AudioHostMsg_CloseStream(stream_id)); | |
56 } | |
57 | |
58 void AudioMessageFilter::SetVolume(int stream_id, double volume) { | |
59 Send(new AudioHostMsg_SetVolume(stream_id, volume)); | |
60 } | |
61 | |
62 bool AudioMessageFilter::Send(IPC::Message* message) { | 29 bool AudioMessageFilter::Send(IPC::Message* message) { |
63 if (!channel_) { | 30 if (!channel_) { |
64 delete message; | 31 delete message; |
65 return false; | 32 return false; |
66 } | 33 } |
67 | 34 |
68 if (MessageLoop::current() != ChildProcess::current()->io_message_loop()) { | 35 if (MessageLoop::current() != ChildProcess::current()->io_message_loop()) { |
69 // Can only access the IPC::Channel on the IPC thread since it's not thread | 36 // Can only access the IPC::Channel on the IPC thread since it's not thread |
70 // safe. | 37 // safe. |
71 ChildProcess::current()->io_message_loop()->PostTask( | 38 ChildProcess::current()->io_message_loop()->PostTask( |
72 FROM_HERE, | 39 FROM_HERE, |
73 base::Bind(base::IgnoreResult(&AudioMessageFilter::Send), this, | 40 base::Bind(base::IgnoreResult(&AudioMessageFilter::Send), this, |
74 message)); | 41 message)); |
75 return true; | 42 return true; |
76 } | 43 } |
77 | 44 |
78 return channel_->Send(message); | 45 return channel_->Send(message); |
79 } | 46 } |
80 | 47 |
| 48 int AudioMessageFilter::AddDelegate(media::AudioOutputIPCDelegate* delegate) { |
| 49 return delegates_.Add(delegate); |
| 50 } |
| 51 |
| 52 void AudioMessageFilter::RemoveDelegate(int id) { |
| 53 delegates_.Remove(id); |
| 54 } |
| 55 |
81 bool AudioMessageFilter::OnMessageReceived(const IPC::Message& message) { | 56 bool AudioMessageFilter::OnMessageReceived(const IPC::Message& message) { |
82 bool handled = true; | 57 bool handled = true; |
83 IPC_BEGIN_MESSAGE_MAP(AudioMessageFilter, message) | 58 IPC_BEGIN_MESSAGE_MAP(AudioMessageFilter, message) |
84 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamCreated, OnStreamCreated) | 59 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamCreated, OnStreamCreated) |
85 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged, OnStreamStateChanged) | 60 IPC_MESSAGE_HANDLER(AudioMsg_NotifyStreamStateChanged, OnStreamStateChanged) |
86 IPC_MESSAGE_UNHANDLED(handled = false) | 61 IPC_MESSAGE_UNHANDLED(handled = false) |
87 IPC_END_MESSAGE_MAP() | 62 IPC_END_MESSAGE_MAP() |
88 return handled; | 63 return handled; |
89 } | 64 } |
90 | 65 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 | 115 |
141 void AudioMessageFilter::OnStreamStateChanged( | 116 void AudioMessageFilter::OnStreamStateChanged( |
142 int stream_id, media::AudioOutputIPCDelegate::State state) { | 117 int stream_id, media::AudioOutputIPCDelegate::State state) { |
143 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); | 118 media::AudioOutputIPCDelegate* delegate = delegates_.Lookup(stream_id); |
144 if (!delegate) { | 119 if (!delegate) { |
145 DLOG(WARNING) << "No delegate found for state change. " << state; | 120 DLOG(WARNING) << "No delegate found for state change. " << state; |
146 return; | 121 return; |
147 } | 122 } |
148 delegate->OnStateChanged(state); | 123 delegate->OnStateChanged(state); |
149 } | 124 } |
OLD | NEW |