| 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 #ifndef CONTENT_RENDERER_MEDIA_AUDIO_MESSAGE_FILTER_H_ | 5 #ifndef CONTENT_RENDERER_MEDIA_AUDIO_MESSAGE_FILTER_H_ |
| 6 #define CONTENT_RENDERER_MEDIA_AUDIO_MESSAGE_FILTER_H_ | 6 #define CONTENT_RENDERER_MEDIA_AUDIO_MESSAGE_FILTER_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| 11 | 11 |
| 12 #include "base/gtest_prod_util.h" | 12 #include "base/gtest_prod_util.h" |
| 13 #include "base/id_map.h" | 13 #include "base/id_map.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/memory/shared_memory.h" | 15 #include "base/memory/shared_memory.h" |
| 16 #include "base/sync_socket.h" | 16 #include "base/sync_socket.h" |
| 17 #include "base/synchronization/lock.h" | 17 #include "base/synchronization/lock.h" |
| 18 #include "content/common/content_export.h" | 18 #include "content/common/content_export.h" |
| 19 #include "content/renderer/media/audio_output_client.h" |
| 19 #include "ipc/message_filter.h" | 20 #include "ipc/message_filter.h" |
| 20 #include "media/audio/audio_output_ipc.h" | 21 #include "media/audio/audio_output_ipc.h" |
| 21 #include "media/base/audio_hardware_config.h" | 22 #include "media/base/audio_hardware_config.h" |
| 23 #include "media/mojo/interfaces/audio_output.mojom.h" |
| 22 | 24 |
| 23 namespace base { | 25 namespace base { |
| 24 class SingleThreadTaskRunner; | 26 class SingleThreadTaskRunner; |
| 25 } | 27 } |
| 26 | 28 |
| 27 namespace content { | 29 namespace content { |
| 28 | 30 |
| 29 // MessageFilter that handles audio messages and delegates them to audio | 31 // MessageFilter that handles audio messages and delegates them to audio |
| 30 // renderers. Created on render thread, AudioMessageFilter is operated on | 32 // renderers. Created on render thread, AudioMessageFilter is operated on |
| 31 // IO thread (secondary thread of render process) it intercepts audio messages | 33 // IO thread (secondary thread of render process) it intercepts audio messages |
| 32 // and process them on IO thread since these messages are time critical. | 34 // and process them on IO thread since these messages are time critical. |
| 33 class CONTENT_EXPORT AudioMessageFilter : public IPC::MessageFilter { | 35 class CONTENT_EXPORT AudioMessageFilter : public IPC::MessageFilter { |
| 34 public: | 36 public: |
| 35 explicit AudioMessageFilter( | 37 explicit AudioMessageFilter( |
| 36 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner); | 38 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner); |
| 37 | 39 |
| 38 // Getter for the one AudioMessageFilter object. | 40 // Getter for the one AudioMessageFilter object. |
| 39 static AudioMessageFilter* Get(); | 41 static AudioMessageFilter* Get(); |
| 40 | 42 |
| 41 // Create an AudioOutputIPC to be owned by one delegate. |render_frame_id| is | 43 // Create an AudioOutputIPC to be owned by one delegate. |render_frame_id| is |
| 42 // the RenderFrame containing the entity producing the audio. | 44 // the RenderFrame containing the entity producing the audio. |
| 43 // | 45 // |
| 44 // The returned object is not thread-safe, and must be used on | 46 // The returned object is not thread-safe, and must be used on |
| 45 // |io_task_runner|. | 47 // |io_task_runner|. |
| 46 std::unique_ptr<media::AudioOutputIPC> CreateAudioOutputIPC( | 48 std::unique_ptr<media::AudioOutputIPC> CreateAudioOutputIPC( |
| 47 int render_frame_id); | 49 int render_frame_id); |
| 48 | 50 |
| 51 virtual void CloseStream(int stream_id); |
| 52 |
| 49 // IO task runner associated with this message filter. | 53 // IO task runner associated with this message filter. |
| 50 base::SingleThreadTaskRunner* io_task_runner() const { | 54 base::SingleThreadTaskRunner* io_task_runner() const { |
| 51 return io_task_runner_.get(); | 55 return io_task_runner_.get(); |
| 52 } | 56 } |
| 53 | 57 |
| 58 // Received when browser process has created an audio output stream. |
| 59 virtual void StreamCreated( |
| 60 int stream_id, |
| 61 base::SharedMemoryHandle handle, |
| 62 base::SyncSocket::TransitDescriptor socket_descriptor, |
| 63 uint32_t length); |
| 64 |
| 65 // Received when internal state of browser process' audio output device has |
| 66 // changed. |
| 67 virtual void OnStreamStateChanged(int stream_id, |
| 68 media::AudioOutputIPCDelegateState state); |
| 69 |
| 70 // Register |audio_output_client_| for a frame. |
| 71 void RegisterAudioOutputClient( |
| 72 int id, |
| 73 scoped_refptr<content::AudioOutputClient> audio_output_client) { |
| 74 audio_output_clients_.insert(std::make_pair(id, audio_output_client)); |
| 75 } |
| 76 |
| 54 protected: | 77 protected: |
| 55 ~AudioMessageFilter() override; | 78 ~AudioMessageFilter() override; |
| 56 | 79 |
| 57 private: | 80 private: |
| 58 FRIEND_TEST_ALL_PREFIXES(AudioMessageFilterTest, Basic); | 81 FRIEND_TEST_ALL_PREFIXES(AudioMessageFilterTest, Basic); |
| 59 FRIEND_TEST_ALL_PREFIXES(AudioMessageFilterTest, Delegates); | 82 FRIEND_TEST_ALL_PREFIXES(AudioMessageFilterTest, Delegates); |
| 60 | 83 |
| 61 // Implementation of media::AudioOutputIPC which augments IPC calls with | 84 // Implementation of media::AudioOutputIPC which augments IPC calls with |
| 62 // stream_id and the source render_frame_id. | 85 // stream_id and the source render_frame_id. |
| 63 class AudioOutputIPCImpl; | 86 class AudioOutputIPCImpl; |
| 64 | 87 |
| 65 // Sends an IPC message using |sender_|. | 88 // Sends an IPC message using |sender_|. |
| 66 void Send(IPC::Message* message); | 89 void Send(IPC::Message* message); |
| 67 | 90 |
| 68 // IPC::MessageFilter override. Called on |io_task_runner_|. | 91 // IPC::MessageFilter override. Called on |io_task_runner_|. |
| 69 bool OnMessageReceived(const IPC::Message& message) override; | 92 bool OnMessageReceived(const IPC::Message& message) override; |
| 70 void OnFilterAdded(IPC::Sender* sender) override; | 93 void OnFilterAdded(IPC::Sender* sender) override; |
| 71 void OnFilterRemoved() override; | 94 void OnFilterRemoved() override; |
| 72 void OnChannelClosing() override; | 95 void OnChannelClosing() override; |
| 73 | 96 |
| 74 // Received when the browser process has checked authorization to use an | 97 // Received when the browser process has checked authorization to use an |
| 75 // audio output device. | 98 // audio output device. |
| 76 void OnDeviceAuthorized(int stream_id, | 99 void OnDeviceAuthorized(int stream_id, |
| 77 media::OutputDeviceStatus device_status, | 100 media::OutputDeviceStatus device_status, |
| 78 const media::AudioParameters& output_params, | 101 const media::AudioParameters& output_params, |
| 79 const std::string& matched_device_id); | 102 const std::string& matched_device_id); |
| 80 | 103 |
| 81 // Received when browser process has created an audio output stream. | |
| 82 void OnStreamCreated(int stream_id, | |
| 83 base::SharedMemoryHandle handle, | |
| 84 base::SyncSocket::TransitDescriptor socket_descriptor, | |
| 85 uint32_t length); | |
| 86 | |
| 87 // Received when internal state of browser process' audio output device has | |
| 88 // changed. | |
| 89 void OnStreamStateChanged(int stream_id, | |
| 90 media::AudioOutputIPCDelegateState state); | |
| 91 | |
| 92 // IPC sender for Send(); must only be accessed on |io_task_runner_|. | 104 // IPC sender for Send(); must only be accessed on |io_task_runner_|. |
| 93 IPC::Sender* sender_; | 105 IPC::Sender* sender_; |
| 94 | 106 |
| 95 // A map of stream ids to delegates; must only be accessed on | 107 // A map of stream ids to delegates; must only be accessed on |
| 96 // |io_task_runner_|. | 108 // |io_task_runner_|. |
| 97 IDMap<media::AudioOutputIPCDelegate> delegates_; | 109 IDMap<media::AudioOutputIPCDelegate> delegates_; |
| 110 std::map<int, scoped_refptr<content::AudioOutputClient>> |
| 111 audio_output_clients_; |
| 98 | 112 |
| 99 // Task runner on which IPC calls are executed. | 113 // Task runner on which IPC calls are executed. |
| 100 const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; | 114 const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; |
| 101 | 115 |
| 102 // The singleton instance for this filter. | 116 // The singleton instance for this filter. |
| 103 static AudioMessageFilter* g_filter; | 117 static AudioMessageFilter* g_filter; |
| 104 | 118 |
| 105 DISALLOW_COPY_AND_ASSIGN(AudioMessageFilter); | 119 DISALLOW_COPY_AND_ASSIGN(AudioMessageFilter); |
| 106 }; | 120 }; |
| 107 | 121 |
| 108 } // namespace content | 122 } // namespace content |
| 109 | 123 |
| 110 #endif // CONTENT_RENDERER_MEDIA_AUDIO_MESSAGE_FILTER_H_ | 124 #endif // CONTENT_RENDERER_MEDIA_AUDIO_MESSAGE_FILTER_H_ |
| OLD | NEW |