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 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <jni.h> 27c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <JNIHelp.h> 28c81d31c3f801ba3d559a22c27b926ace38a7ab49Glenn Kasten#include <android_runtime/AndroidRuntime.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioSystem.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3234bb419e5946ab28112e9e27a4d1b3928d31e0e2Dima Zavin#include <system/audio.h> 33290029d19a9d314e925b73e19453ab0497602f80Dima Zavin#include <system/audio_policy.h> 3424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kastenstatic const char* const kClassPathName = "android/media/AudioSystem"; 40ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kasten 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum AudioError { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kAudioStatusOk = 0, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kAudioStatusError = 1, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kAudioStatusMediaServerDied = 100 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int check_AudioSystem_Command(status_t status) 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status == NO_ERROR) { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return kAudioStatusOk; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return kAudioStatusError; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioSystem_muteMicrophone(JNIEnv *env, jobject thiz, jboolean on) 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return check_AudioSystem_Command(AudioSystem::muteMicrophone(on)); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_AudioSystem_isMicrophoneMuted(JNIEnv *env, jobject thiz) 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool state = false; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioSystem::isMicrophoneMuted(&state); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 7125101b0b9a84571ead15b26e9f4cd9c4298d7823Eric Laurentandroid_media_AudioSystem_isStreamActive(JNIEnv *env, jobject thiz, jint stream, jint inPastMs) 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool state = false; 74bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten AudioSystem::isStreamActive((audio_stream_type_t) stream, &state, inPastMs); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivistatic jboolean 79679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Triviandroid_media_AudioSystem_isStreamActiveRemotely(JNIEnv *env, jobject thiz, jint stream, 80679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi jint inPastMs) 81679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi{ 82679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi bool state = false; 83679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi AudioSystem::isStreamActiveRemotely((audio_stream_type_t) stream, &state, inPastMs); 84679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi return state; 85679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi} 86679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi 87679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivistatic jboolean 88d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Triviandroid_media_AudioSystem_isSourceActive(JNIEnv *env, jobject thiz, jint source) 89d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi{ 90d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi bool state = false; 91d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi AudioSystem::isSourceActive((audio_source_t) source, &state); 92d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi return state; 93d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi} 94d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi 95a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 96a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setParameters(JNIEnv *env, jobject thiz, jstring keyValuePairs) 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 98a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const jchar* c_keyValuePairs = env->GetStringCritical(keyValuePairs, 0); 99a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 c_keyValuePairs8; 100a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (keyValuePairs) { 101a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_keyValuePairs8 = String8(c_keyValuePairs, env->GetStringLength(keyValuePairs)); 102a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringCritical(keyValuePairs, c_keyValuePairs); 103a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 104a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int status = check_AudioSystem_Command(AudioSystem::setParameters(0, c_keyValuePairs8)); 105a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return status; 106a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 107a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 108a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic jstring 109a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_getParameters(JNIEnv *env, jobject thiz, jstring keys) 110a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 111a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const jchar* c_keys = env->GetStringCritical(keys, 0); 112a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent String8 c_keys8; 113a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent if (keys) { 114a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_keys8 = String8(c_keys, env->GetStringLength(keys)); 115a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringCritical(keys, c_keys); 116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 117a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return env->NewStringUTF(AudioSystem::getParameters(0, c_keys8).string()); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 120ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kastenstatic void 121ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kastenandroid_media_AudioSystem_error_callback(status_t err) 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 1240e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent if (env == NULL) { 1250e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent return; 1260e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent } 1270e7a4d9edcee63c6b770db9b6fe792abad5d7b53Eric Laurent 128ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kasten jclass clazz = env->FindClass(kClassPathName); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int error; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (err) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DEAD_OBJECT: 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project error = kAudioStatusMediaServerDied; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_ERROR: 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project error = kAudioStatusOk; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project error = kAudioStatusError; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, "errorCallbackFromNative","(I)V"), error); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 147a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 148a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address) 149a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 150a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *c_address = env->GetStringUTFChars(device_address, NULL); 15124fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin int status = check_AudioSystem_Command(AudioSystem::setDeviceConnectionState(static_cast <audio_devices_t>(device), 15224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin static_cast <audio_policy_dev_state_t>(state), 153a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_address)); 154a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringUTFChars(device_address, c_address); 155a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return status; 156a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 157a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 158a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 159a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_getDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jstring device_address) 160a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 161a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const char *c_address = env->GetStringUTFChars(device_address, NULL); 16224fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin int state = static_cast <int>(AudioSystem::getDeviceConnectionState(static_cast <audio_devices_t>(device), 163a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent c_address)); 164a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent env->ReleaseStringUTFChars(device_address, c_address); 165a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return state; 166a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 167a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 168a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 169a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setPhoneState(JNIEnv *env, jobject thiz, jint state) 170a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 171accb114e59ca51f2a7d370f64de8e98bde158c51Glenn Kasten return check_AudioSystem_Command(AudioSystem::setPhoneState((audio_mode_t) state)); 172a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 173a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 174a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 175a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_setForceUse(JNIEnv *env, jobject thiz, jint usage, jint config) 176a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 17724fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return check_AudioSystem_Command(AudioSystem::setForceUse(static_cast <audio_policy_force_use_t>(usage), 17824fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin static_cast <audio_policy_forced_cfg_t>(config))); 179a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 180a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 182a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_getForceUse(JNIEnv *env, jobject thiz, jint usage) 183a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 18424fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return static_cast <int>(AudioSystem::getForceUse(static_cast <audio_policy_force_use_t>(usage))); 185a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 186a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 187a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 188a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentandroid_media_AudioSystem_initStreamVolume(JNIEnv *env, jobject thiz, jint stream, jint indexMin, jint indexMax) 189a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 19024fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return check_AudioSystem_Command(AudioSystem::initStreamVolume(static_cast <audio_stream_type_t>(stream), 191a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent indexMin, 192a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent indexMax)); 193a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 194a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 195a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 1969bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurentandroid_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, 1979bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jobject thiz, 1989bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint stream, 1999bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint index, 2009bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint device) 201a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 2029bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent return check_AudioSystem_Command( 2039bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent AudioSystem::setStreamVolumeIndex(static_cast <audio_stream_type_t>(stream), 2049bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent index, 2059bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent (audio_devices_t)device)); 206a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 207a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 208a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentstatic int 2099bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurentandroid_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env, 2109bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jobject thiz, 2119bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint stream, 2129bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent jint device) 213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent{ 214a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int index; 2159bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent if (AudioSystem::getStreamVolumeIndex(static_cast <audio_stream_type_t>(stream), 2169bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent &index, 2179bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent (audio_devices_t)device) 2189bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent != NO_ERROR) { 219a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent index = -1; 220a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 221a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return index; 222a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent} 223a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 224cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic int 225cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jfloat value) 226cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 227cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return check_AudioSystem_Command(AudioSystem::setMasterVolume(value)); 228cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 229cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 230cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic jfloat 231cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_getMasterVolume(JNIEnv *env, jobject thiz) 232cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 233cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood float value; 234cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood if (AudioSystem::getMasterVolume(&value) != NO_ERROR) { 235cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood value = -1.0; 236cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 237cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return value; 238cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 239cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 240cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic int 241cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_setMasterMute(JNIEnv *env, jobject thiz, jboolean mute) 242cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 243cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return check_AudioSystem_Command(AudioSystem::setMasterMute(mute)); 244cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 245cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 246cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodstatic jfloat 247cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwoodandroid_media_AudioSystem_getMasterMute(JNIEnv *env, jobject thiz) 248cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood{ 249cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood bool mute; 250cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood if (AudioSystem::getMasterMute(&mute) != NO_ERROR) { 251cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood mute = false; 252cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood } 253cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood return mute; 254cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood} 255cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood 2568b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kastenstatic jint 2578b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kastenandroid_media_AudioSystem_getDevicesForStream(JNIEnv *env, jobject thiz, jint stream) 2588b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten{ 25924fc2fb1c541e954b83fd31ea9f786a5e9b45501Dima Zavin return (jint) AudioSystem::getDevicesForStream(static_cast <audio_stream_type_t>(stream)); 2608b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten} 2618b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten 262c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenstatic jint 263c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenandroid_media_AudioSystem_getPrimaryOutputSamplingRate(JNIEnv *env, jobject clazz) 264c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten{ 265c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return (jint) AudioSystem::getPrimaryOutputSamplingRate(); 266c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten} 267c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten 268c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenstatic jint 269c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kastenandroid_media_AudioSystem_getPrimaryOutputFrameCount(JNIEnv *env, jobject clazz) 270c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten{ 271c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten return (jint) AudioSystem::getPrimaryOutputFrameCount(); 272c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten} 273c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten 274e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodmanstatic jint 275e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodmanandroid_media_AudioSystem_getOutputLatency(JNIEnv *env, jobject clazz, jint stream) 276e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman{ 277e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman uint32_t afLatency; 278e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman if (AudioSystem::getOutputLatency(&afLatency, static_cast <audio_stream_type_t>(stream)) 279e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman != NO_ERROR) { 280e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman afLatency = -1; 281e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman } 282e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman return (jint) afLatency; 283e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman} 284e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setParameters", "(Ljava/lang/String;)I", (void *)android_media_AudioSystem_setParameters}, 289a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"getParameters", "(Ljava/lang/String;)Ljava/lang/String;", (void *)android_media_AudioSystem_getParameters}, 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"muteMicrophone", "(Z)I", (void *)android_media_AudioSystem_muteMicrophone}, 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isMicrophoneMuted", "()Z", (void *)android_media_AudioSystem_isMicrophoneMuted}, 292d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi {"isStreamActive", "(II)Z", (void *)android_media_AudioSystem_isStreamActive}, 293679d5046f245ea8b39f9b5596195f3468808dd54Jean-Michel Trivi {"isStreamActiveRemotely","(II)Z", (void *)android_media_AudioSystem_isStreamActiveRemotely}, 294d677054ca63f55abaa1c478ea3c50f6be665a979Jean-Michel Trivi {"isSourceActive", "(I)Z", (void *)android_media_AudioSystem_isSourceActive}, 295a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setDeviceConnectionState", "(IILjava/lang/String;)I", (void *)android_media_AudioSystem_setDeviceConnectionState}, 296a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"getDeviceConnectionState", "(ILjava/lang/String;)I", (void *)android_media_AudioSystem_getDeviceConnectionState}, 297a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setPhoneState", "(I)I", (void *)android_media_AudioSystem_setPhoneState}, 298a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"setForceUse", "(II)I", (void *)android_media_AudioSystem_setForceUse}, 299a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"getForceUse", "(I)I", (void *)android_media_AudioSystem_getForceUse}, 300a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent {"initStreamVolume", "(III)I", (void *)android_media_AudioSystem_initStreamVolume}, 3019bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent {"setStreamVolumeIndex","(III)I", (void *)android_media_AudioSystem_setStreamVolumeIndex}, 3029bc8358ddaa01c3490f9709991989633a6a3dd42Eric Laurent {"getStreamVolumeIndex","(II)I", (void *)android_media_AudioSystem_getStreamVolumeIndex}, 303cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"setMasterVolume", "(F)I", (void *)android_media_AudioSystem_setMasterVolume}, 304cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"getMasterVolume", "()F", (void *)android_media_AudioSystem_getMasterVolume}, 305cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"setMasterMute", "(Z)I", (void *)android_media_AudioSystem_setMasterMute}, 306cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762Mike Lockwood {"getMasterMute", "()Z", (void *)android_media_AudioSystem_getMasterMute}, 3078b4b97a14ad9b5b982d8fe92755efabec8ad0076Glenn Kasten {"getDevicesForStream", "(I)I", (void *)android_media_AudioSystem_getDevicesForStream}, 308c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten {"getPrimaryOutputSamplingRate", "()I", (void *)android_media_AudioSystem_getPrimaryOutputSamplingRate}, 309c6c4365ddb0213c548b055f257dc8077389224fbGlenn Kasten {"getPrimaryOutputFrameCount", "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount}, 310e64716ad01e52a9ce034369142c41d0333dd8dd4Oliver Woodman {"getOutputLatency", "(I)I", (void *)android_media_AudioSystem_getOutputLatency}, 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_AudioSystem(JNIEnv *env) 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioSystem::setErrorCallback(android_media_AudioSystem_error_callback); 31618db49a46259020387c40fff36d92edc1087a366Glenn Kasten 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 318ed0079ddddd4070f3369b13b274222da2e69f4b9Glenn Kasten kClassPathName, gMethods, NELEM(gMethods)); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 320