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; 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnStateChanged(media::AudioInputIPCDelegate::State state) 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 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) 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool Initialize(const base::WeakPtr<RenderViewImpl>& render_view, 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& device_id, 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const GURL& document_url, 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int sample_rate, 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int frames_per_buffer, 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PepperAudioInputHost* client); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // I/O thread backends to above functions. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitializeOnIOThread(int session_id); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartCaptureOnIOThread(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StopCaptureOnIOThread(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutDownOnIOThread(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void OnDeviceOpened(int request_id, bool succeeded, const std::string& label); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseDevice(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyStreamCreationFailed(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperMediaDeviceManager* GetMediaDeviceManager(); 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The client to notify when the stream is created. THIS MUST ONLY BE 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ACCESSED ON THE MAIN THREAD. 100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperAudioInputHost* client_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // I/O THREAD. 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<media::AudioInputIPC> ipc_; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) scoped_refptr<base::MessageLoopProxy> main_message_loop_proxy_; 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD. 110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::WeakPtr<RenderViewImpl> render_view_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The unique ID to identify the opened device. THIS MUST ONLY BE ACCESSED ON 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // THE MAIN THREAD. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string label_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialized on the main thread and accessed on the I/O thread afterwards. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media::AudioParameters params_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Whether we have tried to create an audio stream. THIS MUST ONLY BE ACCESSED 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // ON THE I/O THREAD. 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool create_stream_sent_; 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Whether we have a pending request to open a device. We have to make sure 124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // there isn't any pending request before this object goes away. 125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD. 126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool pending_open_device_; 127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD. 128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int pending_open_device_id_; 129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISALLOW_COPY_AND_ASSIGN(PepperPlatformAudioInput); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_ 136