1f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org/* 2f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * 4f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org */ 10f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 11f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// Android APIs used to access Java functionality needed to enable low latency 12f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org// audio. 13f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 14f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_MANAGER_JNI_H_ 15f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_MANAGER_JNI_H_ 16f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 17f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#include <jni.h> 18f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 19f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgnamespace webrtc { 20f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 21f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.orgclass AudioManagerJni { 22f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org public: 23f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org AudioManagerJni(); 24f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org ~AudioManagerJni() {} 25f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 26f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // SetAndroidAudioDeviceObjects must only be called once unless there has 27f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // been a successive call to ClearAndroidAudioDeviceObjects. For each 28f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // call to ClearAndroidAudioDeviceObjects, SetAndroidAudioDeviceObjects may be 29f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // called once. 30f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // This function must be called by a Java thread as calling it from a thread 31f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // created by the native application will prevent FindClass from working. See 32f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // http://developer.android.com/training/articles/perf-jni.html#faq_FindClass 33f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // for more details. 34f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // It has to be called for this class' APIs to be successful. Calling 35f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // ClearAndroidAudioDeviceObjects will prevent this class' APIs to be called 36f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // successfully if SetAndroidAudioDeviceObjects is not called after it. 37f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org static void SetAndroidAudioDeviceObjects(void* jvm, void* env, 38f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org void* context); 39f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // This function must be called when the AudioManagerJni class is no 40f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // longer needed. It frees up the global references acquired in 41f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // SetAndroidAudioDeviceObjects. 42f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org static void ClearAndroidAudioDeviceObjects(); 43f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 446583dff82bf8452c9834d55e2731b957d9ca8b10henrike@webrtc.org bool low_latency_supported() const { return low_latency_supported_; } 456583dff82bf8452c9834d55e2731b957d9ca8b10henrike@webrtc.org int native_output_sample_rate() const { return native_output_sample_rate_; } 466583dff82bf8452c9834d55e2731b957d9ca8b10henrike@webrtc.org int native_buffer_size() const { return native_buffer_size_; } 47f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 48f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org private: 49f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org bool HasDeviceObjects(); 50f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 51f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // Following functions assume that the calling thread has been attached. 52f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org void SetLowLatencySupported(JNIEnv* env); 53f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org void SetNativeOutputSampleRate(JNIEnv* env); 54f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org void SetNativeFrameSize(JNIEnv* env); 55f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 56f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org jmethodID LookUpMethodId(JNIEnv* env, const char* method_name, 57f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org const char* method_signature); 58f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 59f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org void CreateInstance(JNIEnv* env); 60f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 61f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // Whether or not low latency audio is supported, the native output sample 62f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // rate and the audio buffer size do not change. I.e the values might as well 63f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org // just be cached when initializing. 64f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org bool low_latency_supported_; 65f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int native_output_sample_rate_; 66f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int native_buffer_size_; 67f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org}; 68f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 69f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org} // namespace webrtc 70f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org 71f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org#endif // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_MANAGER_JNI_H_ 72