summaryrefslogtreecommitdiffstats
path: root/core/jni/android_media_AudioSystem.cpp
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
commit54b6cfa9a9e5b861a9930af873580d6dc20f773c (patch)
tree35051494d2af230dce54d6b31c6af8fc24091316 /core/jni/android_media_AudioSystem.cpp
downloadframeworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.zip
frameworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.tar.gz
frameworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.tar.bz2
Initial Contribution
Diffstat (limited to 'core/jni/android_media_AudioSystem.cpp')
-rw-r--r--core/jni/android_media_AudioSystem.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
new file mode 100644
index 0000000..99785a2
--- /dev/null
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -0,0 +1,186 @@
+/* //device/libs/android_runtime/android_media_AudioSystem.cpp
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#define LOG_TAG "AudioSystem"
+#include "utils/Log.h"
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <math.h>
+
+#include "jni.h"
+#include "JNIHelp.h"
+#include "android_runtime/AndroidRuntime.h"
+
+#include <media/AudioSystem.h>
+#include <media/AudioTrack.h>
+
+// ----------------------------------------------------------------------------
+
+using namespace android;
+
+enum AudioError {
+ kAudioStatusOk = 0,
+ kAudioStatusError = 1,
+ kAudioStatusMediaServerDied = 100
+};
+
+static int check_AudioSystem_Command(status_t status)
+{
+ if (status == NO_ERROR) {
+ return kAudioStatusOk;
+ } else {
+ return kAudioStatusError;
+ }
+}
+
+static int
+android_media_AudioSystem_setVolume(JNIEnv *env, jobject clazz, jint type, jint volume)
+{
+ LOGV("setVolume(%d)", int(volume));
+ if (int(type) == AudioTrack::VOICE_CALL) {
+ return check_AudioSystem_Command(AudioSystem::setStreamVolume(type, float(volume) / 100.0));
+ } else {
+ return check_AudioSystem_Command(AudioSystem::setStreamVolume(type, AudioSystem::linearToLog(volume)));
+ }
+}
+
+static int
+android_media_AudioSystem_getVolume(JNIEnv *env, jobject clazz, jint type)
+{
+ float v;
+ int v_int = -1;
+ if (AudioSystem::getStreamVolume(int(type), &v) == NO_ERROR) {
+ // voice call volume is converted to log scale in the hardware
+ if (int(type) == AudioTrack::VOICE_CALL) {
+ v_int = lrint(v * 100.0);
+ } else {
+ v_int = AudioSystem::logToLinear(v);
+ }
+ }
+ return v_int;
+}
+
+static int
+android_media_AudioSystem_muteMicrophone(JNIEnv *env, jobject thiz, jboolean on)
+{
+ return check_AudioSystem_Command(AudioSystem::muteMicrophone(on));
+}
+
+static jboolean
+android_media_AudioSystem_isMicrophoneMuted(JNIEnv *env, jobject thiz)
+{
+ bool state = false;
+ AudioSystem::isMicrophoneMuted(&state);
+ return state;
+}
+
+static int
+android_media_AudioSystem_setRouting(JNIEnv *env, jobject clazz, jint mode, jint routes, jint mask)
+{
+ return check_AudioSystem_Command(AudioSystem::setRouting(mode, uint32_t(routes), uint32_t(mask)));
+}
+
+static jint
+android_media_AudioSystem_getRouting(JNIEnv *env, jobject clazz, jint mode)
+{
+ uint32_t routes = -1;
+ AudioSystem::getRouting(mode, &routes);
+ return jint(routes);
+}
+
+static int
+android_media_AudioSystem_setMode(JNIEnv *env, jobject clazz, jint mode)
+{
+ return check_AudioSystem_Command(AudioSystem::setMode(mode));
+}
+
+static jint
+android_media_AudioSystem_getMode(JNIEnv *env, jobject clazz)
+{
+ int mode = AudioSystem::MODE_INVALID;
+ AudioSystem::getMode(&mode);
+ return jint(mode);
+}
+
+static jboolean
+android_media_AudioSystem_isMusicActive(JNIEnv *env, jobject thiz)
+{
+ bool state = false;
+ AudioSystem::isMusicActive(&state);
+ return state;
+}
+
+// Temporary interface, do not use
+// TODO: Replace with a more generic key:value get/set mechanism
+static void
+android_media_AudioSystem_setParameter(JNIEnv *env, jobject thiz, jstring key, jstring value)
+{
+ const char *c_key = env->GetStringUTFChars(key, NULL);
+ const char *c_value = env->GetStringUTFChars(value, NULL);
+ AudioSystem::setParameter(c_key, c_value);
+ env->ReleaseStringUTFChars(key, c_key);
+ env->ReleaseStringUTFChars(value, c_value);
+}
+
+void android_media_AudioSystem_error_callback(status_t err)
+{
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ jclass clazz = env->FindClass("android/media/AudioSystem");
+
+ int error;
+
+ switch (err) {
+ case DEAD_OBJECT:
+ error = kAudioStatusMediaServerDied;
+ break;
+ case NO_ERROR:
+ error = kAudioStatusOk;
+ break;
+ default:
+ error = kAudioStatusError;
+ break;
+ }
+
+ env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, "errorCallbackFromNative","(I)V"), error);
+}
+
+// ----------------------------------------------------------------------------
+
+static JNINativeMethod gMethods[] = {
+ {"setVolume", "(II)I", (void *)android_media_AudioSystem_setVolume},
+ {"getVolume", "(I)I", (void *)android_media_AudioSystem_getVolume},
+ {"setParameter", "(Ljava/lang/String;Ljava/lang/String;)V", (void *)android_media_AudioSystem_setParameter},
+ {"muteMicrophone", "(Z)I", (void *)android_media_AudioSystem_muteMicrophone},
+ {"isMicrophoneMuted", "()Z", (void *)android_media_AudioSystem_isMicrophoneMuted},
+ {"setRouting", "(III)I", (void *)android_media_AudioSystem_setRouting},
+ {"getRouting", "(I)I", (void *)android_media_AudioSystem_getRouting},
+ {"setMode", "(I)I", (void *)android_media_AudioSystem_setMode},
+ {"getMode", "()I", (void *)android_media_AudioSystem_getMode},
+ {"isMusicActive", "()Z", (void *)android_media_AudioSystem_isMusicActive},
+};
+
+const char* const kClassPathName = "android/media/AudioSystem";
+
+int register_android_media_AudioSystem(JNIEnv *env)
+{
+ AudioSystem::setErrorCallback(android_media_AudioSystem_error_callback);
+
+ return AndroidRuntime::registerNativeMethods(env,
+ "android/media/AudioSystem", gMethods, NELEM(gMethods));
+}