1b3db213eb55acb661e4b9ea40bcc00af4b76fab9Glenn Kasten/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "AudioSystem" 19c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <utils/Log.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <jni.h> 22c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <JNIHelp.h> 23c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <android_runtime/AndroidRuntime.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioSystem.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2734bb419e5946ab28112e9e27a4d1b3928d31e0e2Dima Zavin#include <system/audio.h> 28290029d19a9d314e925b73e19453ab0497602f80Dima Zavin#include <system/audio_policy.h> 2924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kastenstatic const char* const kClassPathName = "android/media/AudioSystem"; 35ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kasten 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum AudioError { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kAudioStatusOk = 0, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kAudioStatusError = 1, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kAudioStatusMediaServerDied = 100 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int check_AudioSystem_Command(status_t status) 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 44dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent switch (status) { 45dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent case DEAD_OBJECT: 46dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent return kAudioStatusMediaServerDied; 47dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent case NO_ERROR: 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return kAudioStatusOk; 49dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent default: 50dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent break; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent return kAudioStatusError; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioSystem_muteMicrophone(JNIEnv *env, jobject thiz, jboolean on) 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return check_AudioSystem_Command(AudioSystem::muteMicrophone(on)); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioSystem_isMicrophoneMuted(JNIEnv *env, jobject thiz) 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool state = false; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioSystem::isMicrophoneMuted(&state); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 7025101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurentandroid_media_AudioSystem_isStreamActive(JNIEnv *env, jobject thiz, jint stream, jint inPastMs) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool state = false; 73bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten AudioSystem::isStreamActive((audio_stream_type_t) stream, &state, inPastMs); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivistatic jboolean 78679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Triviandroid_media_AudioSystem_isStreamActiveRemotely(JNIEnv *env, jobject thiz, jint stream, 79679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi jint inPastMs) 80679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi{ 81679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi bool state = false; 82679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi AudioSystem::isStreamActiveRemotely((audio_stream_type_t) stream, &state, inPastMs); 83679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi return state; 84679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi} 85679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi 86679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivistatic jboolean 87d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Triviandroid_media_AudioSystem_isSourceActive(JNIEnv *env, jobject thiz, jint source) 88d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi{ 89d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi bool state = false; 90d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi AudioSystem::isSourceActive((audio_source_t) source, &state); 91d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi return state; 92d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi} 93d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi 94a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 95a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setParameters(JNIEnv *env, jobject thiz, jstring keyValuePairs) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 97a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const jchar* c_keyValuePairs = env->GetStringCritical(keyValuePairs, 0); 98a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 c_keyValuePairs8; 99a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (keyValuePairs) { 100a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_keyValuePairs8 = String8(c_keyValuePairs, env->GetStringLength(keyValuePairs)); 101a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringCritical(keyValuePairs, c_keyValuePairs); 102a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 103a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int status = check_AudioSystem_Command(AudioSystem::setParameters(0, c_keyValuePairs8)); 104a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return status; 105a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 106a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 107a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic jstring 108a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_getParameters(JNIEnv *env, jobject thiz, jstring keys) 109a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 110a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const jchar* c_keys = env->GetStringCritical(keys, 0); 111a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 c_keys8; 112a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (keys) { 113a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_keys8 = String8(c_keys, env->GetStringLength(keys)); 114a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringCritical(keys, c_keys); 115a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return env->NewStringUTF(AudioSystem::getParameters(0, c_keys8).string()); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kastenstatic void 120ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kastenandroid_media_AudioSystem_error_callback(status_t err) 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 122539719a7af34be96743a4f408aedf6437f441bbfEric Laurent JNIEnv *env = AndroidRuntime::getJNIEnv(); 1230e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent if (env == NULL) { 1240e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent return; 1250e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent } 1260e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent 127ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kasten jclass clazz = env->FindClass(kClassPathName); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 129dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, 130dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent "errorCallbackFromNative","(I)V"), 131dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent check_AudioSystem_Command(err)); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 134a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 135a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address) 136a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 137a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *c_address = env->GetStringUTFChars(device_address, NULL); 13824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin int status = check_AudioSystem_Command(AudioSystem::setDeviceConnectionState(static_cast <audio_devices_t>(device), 13924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin static_cast <audio_policy_dev_state_t>(state), 140a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_address)); 141a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringUTFChars(device_address, c_address); 142a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return status; 143a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 144a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 145a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 146a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_getDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jstring device_address) 147a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 148a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *c_address = env->GetStringUTFChars(device_address, NULL); 14924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin int state = static_cast <int>(AudioSystem::getDeviceConnectionState(static_cast <audio_devices_t>(device), 150a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_address)); 151a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringUTFChars(device_address, c_address); 152a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return state; 153a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 154a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 155a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 156a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setPhoneState(JNIEnv *env, jobject thiz, jint state) 157a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 158accb114e59ca51f2a7d370f64de8e98bde158c51Glenn Kasten return check_AudioSystem_Command(AudioSystem::setPhoneState((audio_mode_t) state)); 159a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 160a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 161a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 162a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setForceUse(JNIEnv *env, jobject thiz, jint usage, jint config) 163a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 16424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return check_AudioSystem_Command(AudioSystem::setForceUse(static_cast <audio_policy_force_use_t>(usage), 16524fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin static_cast <audio_policy_forced_cfg_t>(config))); 166a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 167a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 168a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 169a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_getForceUse(JNIEnv *env, jobject thiz, jint usage) 170a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 17124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return static_cast <int>(AudioSystem::getForceUse(static_cast <audio_policy_force_use_t>(usage))); 172a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 173a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 174a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 175a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_initStreamVolume(JNIEnv *env, jobject thiz, jint stream, jint indexMin, jint indexMax) 176a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 17724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return check_AudioSystem_Command(AudioSystem::initStreamVolume(static_cast <audio_stream_type_t>(stream), 178a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent indexMin, 179a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent indexMax)); 180a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 182a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 1839bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurentandroid_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, 1849bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jobject thiz, 1859bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint stream, 1869bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint index, 1879bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint device) 188a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 1899bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent return check_AudioSystem_Command( 1909bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent AudioSystem::setStreamVolumeIndex(static_cast <audio_stream_type_t>(stream), 1919bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent index, 1929bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent (audio_devices_t)device)); 193a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 194a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 195a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 1969bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurentandroid_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env, 1979bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jobject thiz, 1989bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint stream, 1999bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint device) 200a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 201a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int index; 2029bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent if (AudioSystem::getStreamVolumeIndex(static_cast <audio_stream_type_t>(stream), 2039bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent &index, 2049bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent (audio_devices_t)device) 2059bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent != NO_ERROR) { 206a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent index = -1; 207a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 208a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return index; 209a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 211cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic int 212cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jfloat value) 213cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 214cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return check_AudioSystem_Command(AudioSystem::setMasterVolume(value)); 215cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 216cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 217cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic jfloat 218cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_getMasterVolume(JNIEnv *env, jobject thiz) 219cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 220cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood float value; 221cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood if (AudioSystem::getMasterVolume(&value) != NO_ERROR) { 222cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood value = -1.0; 223cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 224cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return value; 225cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 226cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 227cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic int 228cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_setMasterMute(JNIEnv *env, jobject thiz, jboolean mute) 229cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 230cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return check_AudioSystem_Command(AudioSystem::setMasterMute(mute)); 231cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 232cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 233cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic jfloat 234cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_getMasterMute(JNIEnv *env, jobject thiz) 235cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 236cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood bool mute; 237cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood if (AudioSystem::getMasterMute(&mute) != NO_ERROR) { 238cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood mute = false; 239cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 240cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return mute; 241cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 242cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 2438b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kastenstatic jint 2448b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kastenandroid_media_AudioSystem_getDevicesForStream(JNIEnv *env, jobject thiz, jint stream) 2458b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten{ 24624fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return (jint) AudioSystem::getDevicesForStream(static_cast <audio_stream_type_t>(stream)); 2478b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten} 2488b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 249c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenstatic jint 250c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenandroid_media_AudioSystem_getPrimaryOutputSamplingRate(JNIEnv *env, jobject clazz) 251c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten{ 252c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return (jint) AudioSystem::getPrimaryOutputSamplingRate(); 253c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten} 254c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten 255c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenstatic jint 256c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenandroid_media_AudioSystem_getPrimaryOutputFrameCount(JNIEnv *env, jobject clazz) 257c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten{ 258c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return (jint) AudioSystem::getPrimaryOutputFrameCount(); 259c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten} 260c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten 26161dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodmanstatic jint 26261dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodmanandroid_media_AudioSystem_getOutputLatency(JNIEnv *env, jobject clazz, jint stream) 26361dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman{ 26461dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman uint32_t afLatency; 26561dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman if (AudioSystem::getOutputLatency(&afLatency, static_cast <audio_stream_type_t>(stream)) 26661dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman != NO_ERROR) { 26761dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman afLatency = -1; 26861dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman } 26961dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman return (jint) afLatency; 27061dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman} 27161dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman 272fd116ad1ab02f6060a0b2201f018317fa32e28b4Glenn Kastenstatic jint 273fd116ad1ab02f6060a0b2201f018317fa32e28b4Glenn Kastenandroid_media_AudioSystem_setLowRamDevice(JNIEnv *env, jobject clazz, jboolean isLowRamDevice) 274fd116ad1ab02f6060a0b2201f018317fa32e28b4Glenn Kasten{ 275fd116ad1ab02f6060a0b2201f018317fa32e28b4Glenn Kasten return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice); 276fd116ad1ab02f6060a0b2201f018317fa32e28b4Glenn Kasten} 277fd116ad1ab02f6060a0b2201f018317fa32e28b4Glenn Kasten 278dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurentstatic int 279dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurentandroid_media_AudioSystem_checkAudioFlinger(JNIEnv *env, jobject clazz) 280dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent{ 281dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent return check_AudioSystem_Command(AudioSystem::checkAudioFlinger()); 282dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent} 283dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 287a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setParameters", "(Ljava/lang/String;)I", (void *)android_media_AudioSystem_setParameters}, 288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"getParameters", "(Ljava/lang/String;)Ljava/lang/String;", (void *)android_media_AudioSystem_getParameters}, 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"muteMicrophone", "(Z)I", (void *)android_media_AudioSystem_muteMicrophone}, 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isMicrophoneMuted", "()Z", (void *)android_media_AudioSystem_isMicrophoneMuted}, 291d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi {"isStreamActive", "(II)Z", (void *)android_media_AudioSystem_isStreamActive}, 292679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi {"isStreamActiveRemotely","(II)Z", (void *)android_media_AudioSystem_isStreamActiveRemotely}, 293d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi {"isSourceActive", "(I)Z", (void *)android_media_AudioSystem_isSourceActive}, 294a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setDeviceConnectionState", "(IILjava/lang/String;)I", (void *)android_media_AudioSystem_setDeviceConnectionState}, 295a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"getDeviceConnectionState", "(ILjava/lang/String;)I", (void *)android_media_AudioSystem_getDeviceConnectionState}, 296a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setPhoneState", "(I)I", (void *)android_media_AudioSystem_setPhoneState}, 297a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setForceUse", "(II)I", (void *)android_media_AudioSystem_setForceUse}, 298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"getForceUse", "(I)I", (void *)android_media_AudioSystem_getForceUse}, 299a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"initStreamVolume", "(III)I", (void *)android_media_AudioSystem_initStreamVolume}, 3009bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent {"setStreamVolumeIndex","(III)I", (void *)android_media_AudioSystem_setStreamVolumeIndex}, 3019bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent {"getStreamVolumeIndex","(II)I", (void *)android_media_AudioSystem_getStreamVolumeIndex}, 302cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"setMasterVolume", "(F)I", (void *)android_media_AudioSystem_setMasterVolume}, 303cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"getMasterVolume", "()F", (void *)android_media_AudioSystem_getMasterVolume}, 304cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"setMasterMute", "(Z)I", (void *)android_media_AudioSystem_setMasterMute}, 305cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"getMasterMute", "()Z", (void *)android_media_AudioSystem_getMasterMute}, 3068b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten {"getDevicesForStream", "(I)I", (void *)android_media_AudioSystem_getDevicesForStream}, 307c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten {"getPrimaryOutputSamplingRate", "()I", (void *)android_media_AudioSystem_getPrimaryOutputSamplingRate}, 308c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten {"getPrimaryOutputFrameCount", "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount}, 30961dcdf3764b614c6f01e77cb4342d192e3101f8aOliver Woodman {"getOutputLatency", "(I)I", (void *)android_media_AudioSystem_getOutputLatency}, 310fd116ad1ab02f6060a0b2201f018317fa32e28b4Glenn Kasten {"setLowRamDevice", "(Z)I", (void *)android_media_AudioSystem_setLowRamDevice}, 311dfb881f96af7898151940a4bbc52e45e6043d38bEric Laurent {"checkAudioFlinger", "()I", (void *)android_media_AudioSystem_checkAudioFlinger}, 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_AudioSystem(JNIEnv *env) 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioSystem::setErrorCallback(android_media_AudioSystem_error_callback); 31718db49a46259020387c40fff36d92edc1087a366Glenn Kasten 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 319ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kasten kClassPathName, gMethods, NELEM(gMethods)); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 321