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