audio_record_input.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2013 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 MEDIA_AUDIO_ANDROID_AUDIO_RECORD_INPUT_H_ 6#define MEDIA_AUDIO_ANDROID_AUDIO_RECORD_INPUT_H_ 7 8#include "base/android/jni_android.h" 9#include "base/threading/thread_checker.h" 10#include "media/audio/audio_io.h" 11#include "media/audio/audio_parameters.h" 12 13namespace media { 14 15class AudioManagerAndroid; 16 17// Implements PCM audio input support for Android using the Java AudioRecord 18// interface. Most of the work is done by its Java counterpart in 19// AudioRecordInput.java. This class is created and lives on the Audio Manager 20// thread but recorded audio buffers are delivered on a thread managed by 21// the Java class. 22// 23// The Java class makes use of AudioEffect features which are first available 24// in Jelly Bean. It should not be instantiated running against earlier SDKs. 25class MEDIA_EXPORT AudioRecordInputStream : public AudioInputStream { 26 public: 27 AudioRecordInputStream(AudioManagerAndroid* manager, 28 const AudioParameters& params); 29 30 virtual ~AudioRecordInputStream(); 31 32 // Implementation of AudioInputStream. 33 virtual bool Open() OVERRIDE; 34 virtual void Start(AudioInputCallback* callback) OVERRIDE; 35 virtual void Stop() OVERRIDE; 36 virtual void Close() OVERRIDE; 37 virtual double GetMaxVolume() OVERRIDE; 38 virtual void SetVolume(double volume) OVERRIDE; 39 virtual double GetVolume() OVERRIDE; 40 virtual void SetAutomaticGainControl(bool enabled) OVERRIDE; 41 virtual bool GetAutomaticGainControl() OVERRIDE; 42 43 static bool RegisterAudioRecordInput(JNIEnv* env); 44 45 // Called from Java when data is available. 46 void OnData(JNIEnv* env, jobject obj, jint size, jint hardware_delay_bytes); 47 48 // Called from Java so that we can cache the address of the Java-managed 49 // |byte_buffer| in |direct_buffer_address_|. 50 void CacheDirectBufferAddress(JNIEnv* env, jobject obj, jobject byte_buffer); 51 52 private: 53 base::ThreadChecker thread_checker_; 54 AudioManagerAndroid* audio_manager_; 55 56 // Java AudioRecordInput instance. 57 base::android::ScopedJavaGlobalRef<jobject> j_audio_record_; 58 59 // This is the only member accessed by both the Audio Manager and Java 60 // threads. Explanations for why we do not require explicit synchronization 61 // are given in the implementation. 62 AudioInputCallback* callback_; 63 64 // Owned by j_audio_record_. 65 uint8* direct_buffer_address_; 66 67 DISALLOW_COPY_AND_ASSIGN(AudioRecordInputStream); 68}; 69 70} // namespace media 71 72#endif // MEDIA_AUDIO_ANDROID_AUDIO_RECORD_INPUT_H_ 73