1/* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#ifndef WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_RECORD_JNI_H_ 12#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_RECORD_JNI_H_ 13 14#include <jni.h> 15 16#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 17#include "webrtc/modules/audio_device/include/audio_device_defines.h" 18#include "webrtc/modules/audio_device/audio_device_generic.h" 19 20namespace webrtc { 21 22class EventWrapper; 23class ThreadWrapper; 24class PlayoutDelayProvider; 25 26const uint32_t N_REC_SAMPLES_PER_SEC = 16000; // Default is 16 kHz 27const uint32_t N_REC_CHANNELS = 1; // default is mono recording 28const uint32_t REC_BUF_SIZE_IN_SAMPLES = 480; // Handle max 10 ms @ 48 kHz 29 30class AudioRecordJni { 31 public: 32 static int32_t SetAndroidAudioDeviceObjects(void* javaVM, void* env, 33 void* context); 34 static void ClearAndroidAudioDeviceObjects(); 35 36 AudioRecordJni(const int32_t id, PlayoutDelayProvider* delay_provider); 37 ~AudioRecordJni(); 38 39 // Main initializaton and termination 40 int32_t Init(); 41 int32_t Terminate(); 42 bool Initialized() const { return _initialized; } 43 44 // Device enumeration 45 int16_t RecordingDevices() { return 1; } // There is one device only 46 int32_t RecordingDeviceName(uint16_t index, 47 char name[kAdmMaxDeviceNameSize], 48 char guid[kAdmMaxGuidSize]); 49 50 // Device selection 51 int32_t SetRecordingDevice(uint16_t index); 52 int32_t SetRecordingDevice( 53 AudioDeviceModule::WindowsDeviceType device); 54 55 // Audio transport initialization 56 int32_t RecordingIsAvailable(bool& available); // NOLINT 57 int32_t InitRecording(); 58 bool RecordingIsInitialized() const { return _recIsInitialized; } 59 60 // Audio transport control 61 int32_t StartRecording(); 62 int32_t StopRecording(); 63 bool Recording() const { return _recording; } 64 65 // Microphone Automatic Gain Control (AGC) 66 int32_t SetAGC(bool enable); 67 bool AGC() const { return _AGC; } 68 69 // Audio mixer initialization 70 int32_t InitMicrophone(); 71 bool MicrophoneIsInitialized() const { return _micIsInitialized; } 72 73 // Microphone volume controls 74 int32_t MicrophoneVolumeIsAvailable(bool& available); // NOLINT 75 // TODO(leozwang): Add microphone volume control when OpenSL APIs 76 // are available. 77 int32_t SetMicrophoneVolume(uint32_t volume); 78 int32_t MicrophoneVolume(uint32_t& volume) const; // NOLINT 79 int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; // NOLINT 80 int32_t MinMicrophoneVolume(uint32_t& minVolume) const; // NOLINT 81 int32_t MicrophoneVolumeStepSize( 82 uint16_t& stepSize) const; // NOLINT 83 84 // Microphone mute control 85 int32_t MicrophoneMuteIsAvailable(bool& available); // NOLINT 86 int32_t SetMicrophoneMute(bool enable); 87 int32_t MicrophoneMute(bool& enabled) const; // NOLINT 88 89 // Microphone boost control 90 int32_t MicrophoneBoostIsAvailable(bool& available); // NOLINT 91 int32_t SetMicrophoneBoost(bool enable); 92 int32_t MicrophoneBoost(bool& enabled) const; // NOLINT 93 94 // Stereo support 95 int32_t StereoRecordingIsAvailable(bool& available); // NOLINT 96 int32_t SetStereoRecording(bool enable); 97 int32_t StereoRecording(bool& enabled) const; // NOLINT 98 99 // Delay information and control 100 int32_t RecordingDelay(uint16_t& delayMS) const; // NOLINT 101 102 bool RecordingWarning() const; 103 bool RecordingError() const; 104 void ClearRecordingWarning(); 105 void ClearRecordingError(); 106 107 // Attach audio buffer 108 void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); 109 110 int32_t SetRecordingSampleRate(const uint32_t samplesPerSec); 111 112 private: 113 void Lock() EXCLUSIVE_LOCK_FUNCTION(_critSect) { 114 _critSect.Enter(); 115 } 116 void UnLock() UNLOCK_FUNCTION(_critSect) { 117 _critSect.Leave(); 118 } 119 120 int32_t InitJavaResources(); 121 int32_t InitSampleRate(); 122 123 static bool RecThreadFunc(void*); 124 bool RecThreadProcess(); 125 126 // TODO(leozwang): Android holds only one JVM, all these jni handling 127 // will be consolidated into a single place to make it consistant and 128 // reliable. Chromium has a good example at base/android. 129 static JavaVM* globalJvm; 130 static JNIEnv* globalJNIEnv; 131 static jobject globalContext; 132 static jclass globalScClass; 133 134 JavaVM* _javaVM; // denotes a Java VM 135 JNIEnv* _jniEnvRec; // The JNI env for recording thread 136 jclass _javaScClass; // AudioDeviceAndroid class 137 jobject _javaScObj; // AudioDeviceAndroid object 138 jobject _javaRecBuffer; 139 void* _javaDirectRecBuffer; // Direct buffer pointer to rec buffer 140 jmethodID _javaMidRecAudio; // Method ID of rec in AudioDeviceAndroid 141 142 AudioDeviceBuffer* _ptrAudioBuffer; 143 CriticalSectionWrapper& _critSect; 144 int32_t _id; 145 PlayoutDelayProvider* _delay_provider; 146 bool _initialized; 147 148 EventWrapper& _timeEventRec; 149 EventWrapper& _recStartStopEvent; 150 ThreadWrapper* _ptrThreadRec; 151 uint32_t _recThreadID; 152 bool _recThreadIsInitialized; 153 bool _shutdownRecThread; 154 155 int8_t _recBuffer[2 * REC_BUF_SIZE_IN_SAMPLES]; 156 bool _recordingDeviceIsSpecified; 157 158 bool _recording; 159 bool _recIsInitialized; 160 bool _micIsInitialized; 161 162 bool _startRec; 163 164 uint16_t _recWarning; 165 uint16_t _recError; 166 167 uint16_t _delayRecording; 168 169 bool _AGC; 170 171 uint16_t _samplingFreqIn; // Sampling frequency for Mic 172 int _recAudioSource; 173 174}; 175 176} // namespace webrtc 177 178#endif // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_RECORD_JNI_H_ 179