audio_input_renderer_host.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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 3// found in the LICENSE file. 4// 5// AudioInputRendererHost serves audio related requests from audio capturer 6// which lives inside the render process and provide access to audio hardware. 7// 8// Create stream sequence (AudioInputController = AIC): 9// 10// AudioInputHostMsg_CreateStream -> OnCreateStream -> AIC::CreateLowLatency -> 11// <- AudioInputMsg_NotifyStreamCreated <- DoCompleteCreation <- OnCreated <- 12// 13// Close stream sequence: 14// 15// AudioInputHostMsg_CloseStream -> OnCloseStream -> AIC::Close -> 16// 17// This class is owned by BrowserRenderProcessHost and instantiated on UI 18// thread. All other operations and method calls happen on IO thread, so we 19// need to be extra careful about the lifetime of this object. 20// 21// To ensure low latency audio, a SyncSocket pair is used to signal buffer 22// readiness without having to route messages using the IO thread. 23 24#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_INPUT_RENDERER_HOST_H_ 25#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_INPUT_RENDERER_HOST_H_ 26 27#include <map> 28#include <string> 29 30#include "base/compiler_specific.h" 31#include "base/gtest_prod_util.h" 32#include "base/memory/ref_counted.h" 33#include "base/memory/scoped_ptr.h" 34#include "base/memory/shared_memory.h" 35#include "base/process/process.h" 36#include "base/sequenced_task_runner_helpers.h" 37#include "content/common/media/audio_messages.h" 38#include "content/public/browser/browser_message_filter.h" 39#include "content/public/browser/browser_thread.h" 40#include "media/audio/audio_input_controller.h" 41#include "media/audio/audio_io.h" 42#include "media/audio/simple_sources.h" 43 44namespace media { 45class AudioManager; 46class AudioParameters; 47class UserInputMonitor; 48} 49 50namespace content { 51class AudioMirroringManager; 52class MediaStreamManager; 53 54class CONTENT_EXPORT AudioInputRendererHost 55 : public BrowserMessageFilter, 56 public media::AudioInputController::EventHandler { 57 public: 58 // Called from UI thread from the owner of this object. 59 // |user_input_monitor| is used for typing detection and can be NULL. 60 AudioInputRendererHost(media::AudioManager* audio_manager, 61 MediaStreamManager* media_stream_manager, 62 AudioMirroringManager* audio_mirroring_manager, 63 media::UserInputMonitor* user_input_monitor); 64 65 // BrowserMessageFilter implementation. 66 virtual void OnChannelClosing() OVERRIDE; 67 virtual void OnDestruct() const OVERRIDE; 68 virtual bool OnMessageReceived(const IPC::Message& message, 69 bool* message_was_ok) OVERRIDE; 70 71 // AudioInputController::EventHandler implementation. 72 virtual void OnCreated(media::AudioInputController* controller) OVERRIDE; 73 virtual void OnRecording(media::AudioInputController* controller) OVERRIDE; 74 virtual void OnError(media::AudioInputController* controller) OVERRIDE; 75 virtual void OnData(media::AudioInputController* controller, 76 const uint8* data, 77 uint32 size) OVERRIDE; 78 79 private: 80 // TODO(henrika): extend test suite (compare AudioRenderHost) 81 friend class BrowserThread; 82 friend class TestAudioInputRendererHost; 83 friend class base::DeleteHelper<AudioInputRendererHost>; 84 85 struct AudioEntry; 86 typedef std::map<int, AudioEntry*> AudioEntryMap; 87 88 virtual ~AudioInputRendererHost(); 89 90 // Methods called on IO thread ---------------------------------------------- 91 92 // Audio related IPC message handlers. 93 94 // Creates an audio input stream with the specified format whose data is 95 // consumed by an entity in the render view referenced by |render_view_id|. 96 // |session_id| is used to find out which device to be used for the stream. 97 // Upon success/failure, the peer is notified via the 98 // NotifyStreamCreated message. 99 void OnCreateStream(int stream_id, 100 int render_view_id, 101 int session_id, 102 const AudioInputHostMsg_CreateStream_Config& config); 103 104 // Record the audio input stream referenced by |stream_id|. 105 void OnRecordStream(int stream_id); 106 107 // Close the audio stream referenced by |stream_id|. 108 void OnCloseStream(int stream_id); 109 110 // Set the volume of the audio stream referenced by |stream_id|. 111 void OnSetVolume(int stream_id, double volume); 112 113 // Complete the process of creating an audio input stream. This will set up 114 // the shared memory or shared socket in low latency mode and send the 115 // NotifyStreamCreated message to the peer. 116 void DoCompleteCreation(media::AudioInputController* controller); 117 118 // Send a state change message to the renderer. 119 void DoSendRecordingMessage(media::AudioInputController* controller); 120 121 // Handle error coming from audio stream. 122 void DoHandleError(media::AudioInputController* controller); 123 124 // Send an error message to the renderer. 125 void SendErrorMessage(int stream_id); 126 127 // Delete all audio entry and all audio streams 128 void DeleteEntries(); 129 130 // Closes the stream. The stream is then deleted in DeleteEntry() after it 131 // is closed. 132 void CloseAndDeleteStream(AudioEntry* entry); 133 134 // Delete an audio entry and close the related audio stream. 135 void DeleteEntry(AudioEntry* entry); 136 137 // Delete audio entry and close the related audio input stream. 138 void DeleteEntryOnError(AudioEntry* entry); 139 140 // A helper method to look up a AudioEntry identified by |stream_id|. 141 // Returns NULL if not found. 142 AudioEntry* LookupById(int stream_id); 143 144 // Search for a AudioEntry having the reference to |controller|. 145 // This method is used to look up an AudioEntry after a controller 146 // event is received. 147 AudioEntry* LookupByController(media::AudioInputController* controller); 148 149 // Used to create an AudioInputController. 150 media::AudioManager* audio_manager_; 151 152 // Used to access to AudioInputDeviceManager. 153 MediaStreamManager* media_stream_manager_; 154 155 AudioMirroringManager* audio_mirroring_manager_; 156 157 // A map of stream IDs to audio sources. 158 AudioEntryMap audio_entries_; 159 160 // Raw pointer of the UserInputMonitor. 161 media::UserInputMonitor* user_input_monitor_; 162 163 DISALLOW_COPY_AND_ASSIGN(AudioInputRendererHost); 164}; 165 166} // namespace content 167 168#endif // CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_INPUT_RENDERER_HOST_H_ 169