15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/memory/ref_counted.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/audio/audio_input_ipc.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_parameters.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class GURL;
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace base {
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass MessageLoopProxy;
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioParameters;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PepperAudioInputHost;
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PepperMediaDeviceManager;
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass RenderViewImpl;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// PepperPlatformAudioInput is operated on two threads: the main thread (the
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread on which objects are created) and the I/O thread. All public methods,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// except the destructor, must be called on the main thread. The notifications
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// to the users of this class (i.e. PepperAudioInputHost) are also sent on the
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// main thread. Internally, this class sends audio input IPC messages and
39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// receives media::AudioInputIPCDelegate notifications on the I/O thread.
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PepperPlatformAudioInput
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : public media::AudioInputIPCDelegate,
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      public base::RefCountedThreadSafe<PepperPlatformAudioInput> {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Factory function, returns NULL on failure. StreamCreated() will be called
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the stream is created.
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  static PepperPlatformAudioInput* Create(
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      const base::WeakPtr<RenderViewImpl>& render_view,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& device_id,
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& document_url,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int sample_rate,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int frames_per_buffer,
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      PepperAudioInputHost* client);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Called on main thread.
56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void StartCapture();
57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void StopCapture();
58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Closes the stream. Make sure to call this before the object is destructed.
59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void ShutDown();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // media::AudioInputIPCDelegate.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStreamCreated(base::SharedMemoryHandle handle,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               base::SyncSocket::Handle socket_handle,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               int length,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               int total_segments) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnVolume(double volume) OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStateChanged(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::AudioInputIPCDelegate::State state) OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnIPCClosed() OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~PepperPlatformAudioInput();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  friend class base::RefCountedThreadSafe<PepperPlatformAudioInput>;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PepperPlatformAudioInput();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Initialize(
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      const base::WeakPtr<RenderViewImpl>& render_view,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& device_id,
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& document_url,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int sample_rate,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int frames_per_buffer,
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      PepperAudioInputHost* client);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // I/O thread backends to above functions.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitializeOnIOThread(int session_id);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartCaptureOnIOThread();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopCaptureOnIOThread();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutDownOnIOThread();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDeviceOpened(int request_id,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool succeeded,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string& label);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseDevice();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyStreamCreationFailed();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PepperMediaDeviceManager* GetMediaDeviceManager();
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The client to notify when the stream is created. THIS MUST ONLY BE
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ACCESSED ON THE MAIN THREAD.
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  PepperAudioInputHost* client_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // I/O THREAD.
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<media::AudioInputIPC> ipc_;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> main_message_loop_proxy_;
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::WeakPtr<RenderViewImpl> render_view_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique ID to identify the opened device. THIS MUST ONLY BE ACCESSED ON
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // THE MAIN THREAD.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string label_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialized on the main thread and accessed on the I/O thread afterwards.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media::AudioParameters params_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Whether we have tried to create an audio stream. THIS MUST ONLY BE ACCESSED
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // ON THE I/O THREAD.
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool create_stream_sent_;
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Whether we have a pending request to open a device. We have to make sure
127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // there isn't any pending request before this object goes away.
128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool pending_open_device_;
130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int pending_open_device_id_;
132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(PepperPlatformAudioInput);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
139