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.
5 #ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
6 #define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/weak_ptr.h"
15 #include "media/audio/audio_input_ipc.h"
16 #include "media/audio/audio_parameters.h"
21 class MessageLoopProxy;
25 class AudioParameters;
30 class PepperAudioInputHost;
31 class PepperMediaDeviceManager;
34 // PepperPlatformAudioInput is operated on two threads: the main thread (the
35 // thread on which objects are created) and the I/O thread. All public methods,
36 // except the destructor, must be called on the main thread. The notifications
37 // to the users of this class (i.e. PepperAudioInputHost) are also sent on the
38 // main thread. Internally, this class sends audio input IPC messages and
39 // receives media::AudioInputIPCDelegate notifications on the I/O thread.
41 class PepperPlatformAudioInput
42 : public media::AudioInputIPCDelegate,
43 public base::RefCountedThreadSafe<PepperPlatformAudioInput> {
45 // Factory function, returns NULL on failure. StreamCreated() will be called
46 // when the stream is created.
47 static PepperPlatformAudioInput* Create(
48 const base::WeakPtr<RenderViewImpl>& render_view,
49 const std::string& device_id,
50 const GURL& document_url,
52 int frames_per_buffer,
53 PepperAudioInputHost* client);
55 // Called on main thread.
58 // Closes the stream. Make sure to call this before the object is destructed.
61 // media::AudioInputIPCDelegate.
62 virtual void OnStreamCreated(base::SharedMemoryHandle handle,
63 base::SyncSocket::Handle socket_handle,
65 int total_segments) OVERRIDE;
66 virtual void OnVolume(double volume) OVERRIDE;
67 virtual void OnStateChanged(media::AudioInputIPCDelegate::State state)
69 virtual void OnIPCClosed() OVERRIDE;
72 virtual ~PepperPlatformAudioInput();
75 friend class base::RefCountedThreadSafe<PepperPlatformAudioInput>;
77 PepperPlatformAudioInput();
79 bool Initialize(const base::WeakPtr<RenderViewImpl>& render_view,
80 const std::string& device_id,
81 const GURL& document_url,
83 int frames_per_buffer,
84 PepperAudioInputHost* client);
86 // I/O thread backends to above functions.
87 void InitializeOnIOThread(int session_id);
88 void StartCaptureOnIOThread();
89 void StopCaptureOnIOThread();
90 void ShutDownOnIOThread();
92 void OnDeviceOpened(int request_id, bool succeeded, const std::string& label);
94 void NotifyStreamCreationFailed();
96 PepperMediaDeviceManager* GetMediaDeviceManager();
98 // The client to notify when the stream is created. THIS MUST ONLY BE
99 // ACCESSED ON THE MAIN THREAD.
100 PepperAudioInputHost* client_;
102 // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE
104 scoped_ptr<media::AudioInputIPC> ipc_;
106 scoped_refptr<base::MessageLoopProxy> main_message_loop_proxy_;
107 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
109 // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
110 base::WeakPtr<RenderViewImpl> render_view_;
112 // The unique ID to identify the opened device. THIS MUST ONLY BE ACCESSED ON
116 // Initialized on the main thread and accessed on the I/O thread afterwards.
117 media::AudioParameters params_;
119 // Whether we have tried to create an audio stream. THIS MUST ONLY BE ACCESSED
120 // ON THE I/O THREAD.
121 bool create_stream_sent_;
123 // Whether we have a pending request to open a device. We have to make sure
124 // there isn't any pending request before this object goes away.
125 // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
126 bool pending_open_device_;
127 // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
128 int pending_open_device_id_;
130 DISALLOW_COPY_AND_ASSIGN(PepperPlatformAudioInput);
133 } // namespace content
135 #endif // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_