56a701aeeb7341fdf7f182a7e6c1f353ff1857fb
[platform/framework/web/crosswalk.git] / src / content / renderer / pepper / pepper_platform_audio_input.h
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 #ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
6 #define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
7
8 #include <string>
9
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"
17
18 class GURL;
19
20 namespace base {
21 class MessageLoopProxy;
22 }
23
24 namespace media {
25 class AudioParameters;
26 }
27
28 namespace content {
29
30 class PepperAudioInputHost;
31 class PepperMediaDeviceManager;
32 class RenderViewImpl;
33
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.
40
41 class PepperPlatformAudioInput
42     : public media::AudioInputIPCDelegate,
43       public base::RefCountedThreadSafe<PepperPlatformAudioInput> {
44  public:
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,
51       int sample_rate,
52       int frames_per_buffer,
53       PepperAudioInputHost* client);
54
55   // Called on main thread.
56   void StartCapture();
57   void StopCapture();
58   // Closes the stream. Make sure to call this before the object is destructed.
59   void ShutDown();
60
61   // media::AudioInputIPCDelegate.
62   virtual void OnStreamCreated(base::SharedMemoryHandle handle,
63                                base::SyncSocket::Handle socket_handle,
64                                int length,
65                                int total_segments) OVERRIDE;
66   virtual void OnVolume(double volume) OVERRIDE;
67   virtual void OnStateChanged(media::AudioInputIPCDelegate::State state)
68       OVERRIDE;
69   virtual void OnIPCClosed() OVERRIDE;
70
71  protected:
72   virtual ~PepperPlatformAudioInput();
73
74  private:
75   friend class base::RefCountedThreadSafe<PepperPlatformAudioInput>;
76
77   PepperPlatformAudioInput();
78
79   bool Initialize(const base::WeakPtr<RenderViewImpl>& render_view,
80                   const std::string& device_id,
81                   const GURL& document_url,
82                   int sample_rate,
83                   int frames_per_buffer,
84                   PepperAudioInputHost* client);
85
86   // I/O thread backends to above functions.
87   void InitializeOnIOThread(int session_id);
88   void StartCaptureOnIOThread();
89   void StopCaptureOnIOThread();
90   void ShutDownOnIOThread();
91
92   void OnDeviceOpened(int request_id, bool succeeded, const std::string& label);
93   void CloseDevice();
94   void NotifyStreamCreationFailed();
95
96   PepperMediaDeviceManager* GetMediaDeviceManager();
97
98   // The client to notify when the stream is created. THIS MUST ONLY BE
99   // ACCESSED ON THE MAIN THREAD.
100   PepperAudioInputHost* client_;
101
102   // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE
103   // I/O THREAD.
104   scoped_ptr<media::AudioInputIPC> ipc_;
105
106   scoped_refptr<base::MessageLoopProxy> main_message_loop_proxy_;
107   scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
108
109   // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
110   base::WeakPtr<RenderViewImpl> render_view_;
111
112   // The unique ID to identify the opened device. THIS MUST ONLY BE ACCESSED ON
113   // THE MAIN THREAD.
114   std::string label_;
115
116   // Initialized on the main thread and accessed on the I/O thread afterwards.
117   media::AudioParameters params_;
118
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_;
122
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_;
129
130   DISALLOW_COPY_AND_ASSIGN(PepperPlatformAudioInput);
131 };
132
133 }  // namespace content
134
135 #endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_