android_media_AudioSystem.cpp revision 539719a7af34be96743a4f408aedf6437f441bbf
15e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala/*
25e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala**
35e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** Copyright 2006, The Android Open Source Project
45e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala**
55e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** Licensed under the Apache License, Version 2.0 (the "License");
65e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** you may not use this file except in compliance with the License.
75e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** You may obtain a copy of the License at
85e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala**
95e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala**     http://www.apache.org/licenses/LICENSE-2.0
105e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala**
115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** Unless required by applicable law or agreed to in writing, software
125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** distributed under the License is distributed on an "AS IS" BASIS,
135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** See the License for the specific language governing permissions and
155e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala** limitations under the License.
165e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala*/
175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#define LOG_TAG "AudioSystem"
195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#include <utils/Log.h>
205e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
215e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#include <jni.h>
225e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#include <JNIHelp.h>
237b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <android_runtime/AndroidRuntime.h>
247b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
255e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#include <media/AudioSystem.h>
265e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
275e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#include <system/audio.h>
285e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala#include <system/audio_policy.h>
295e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
305e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala// ----------------------------------------------------------------------------
315e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
325e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalausing namespace android;
335e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
345e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic const char* const kClassPathName = "android/media/AudioSystem";
355e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
365e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaenum AudioError {
375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    kAudioStatusOk = 0,
38ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    kAudioStatusError = 1,
39ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    kAudioStatusMediaServerDied = 100
40ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala};
41a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin
42ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalastatic int check_AudioSystem_Command(status_t status)
43ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala{
445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    if (status == NO_ERROR) {
455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        return kAudioStatusOk;
465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    } else {
475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        return kAudioStatusError;
48f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_muteMicrophone(JNIEnv *env, jobject thiz, jboolean on)
535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return check_AudioSystem_Command(AudioSystem::muteMicrophone(on));
555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
57a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkinstatic jboolean
585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_isMicrophoneMuted(JNIEnv *env, jobject thiz)
595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    bool state = false;
615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    AudioSystem::isMicrophoneMuted(&state);
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return state;
63f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
64ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
65ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalastatic jboolean
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaandroid_media_AudioSystem_isStreamActive(JNIEnv *env, jobject thiz, jint stream, jint inPastMs)
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
68ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    bool state = false;
69ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    AudioSystem::isStreamActive((audio_stream_type_t) stream, &state, inPastMs);
70ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    return state;
71ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala}
72ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
73ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalastatic jboolean
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaandroid_media_AudioSystem_isStreamActiveRemotely(JNIEnv *env, jobject thiz, jint stream,
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        jint inPastMs)
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    bool state = false;
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    AudioSystem::isStreamActiveRemotely((audio_stream_type_t) stream, &state, inPastMs);
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return state;
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
8244f120fa169cb3131ec853c638ea9c88a9b33b97Igor Murashkinstatic jboolean
83b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun Heandroid_media_AudioSystem_isSourceActive(JNIEnv *env, jobject thiz, jint source)
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    bool state = false;
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    AudioSystem::isSourceActive((audio_source_t) source, &state);
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return state;
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
89377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatic int
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaandroid_media_AudioSystem_setParameters(JNIEnv *env, jobject thiz, jstring keyValuePairs)
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const jchar* c_keyValuePairs = env->GetStringCritical(keyValuePairs, 0);
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    String8 c_keyValuePairs8;
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (keyValuePairs) {
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        c_keyValuePairs8 = String8(c_keyValuePairs, env->GetStringLength(keyValuePairs));
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        env->ReleaseStringCritical(keyValuePairs, c_keyValuePairs);
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    int status = check_AudioSystem_Command(AudioSystem::setParameters(0, c_keyValuePairs8));
1005e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return status;
1015e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1025e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1035e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jstring
1045e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getParameters(JNIEnv *env, jobject thiz, jstring keys)
1055e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1065e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    const jchar* c_keys = env->GetStringCritical(keys, 0);
1075e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    String8 c_keys8;
1085e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    if (keys) {
1095e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        c_keys8 = String8(c_keys, env->GetStringLength(keys));
1105e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        env->ReleaseStringCritical(keys, c_keys);
1115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    }
1125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return env->NewStringUTF(AudioSystem::getParameters(0, c_keys8).string());
1135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1155e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic void
1165e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_error_callback(status_t err)
1175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    JNIEnv *env = AndroidRuntime::getJNIEnv();
1195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    if (env == NULL) {
1205e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        return;
12144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    }
1225e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1235e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    jclass clazz = env->FindClass(kClassPathName);
1245e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
125fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin    int error;
126fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin
127fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin    switch (err) {
128fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin    case DEAD_OBJECT:
129fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin        error = kAudioStatusMediaServerDied;
130fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin        break;
131fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin    case NO_ERROR:
132fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin        error = kAudioStatusOk;
133fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin        break;
134fcf5fea2ac99e6359998078d09fd7e21269dca4aIgor Murashkin    default:
1355e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        error = kAudioStatusError;
1365e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        break;
1375e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    }
1385e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    env->CallStaticVoidMethod(clazz, env->GetStaticMethodID(clazz, "errorCallbackFromNative","(I)V"), error);
1405e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
142c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvalastatic int
1435e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address)
1445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    const char *c_address = env->GetStringUTFChars(device_address, NULL);
1465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    int status = check_AudioSystem_Command(AudioSystem::setDeviceConnectionState(static_cast <audio_devices_t>(device),
1475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                          static_cast <audio_policy_dev_state_t>(state),
1485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                          c_address));
1495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    env->ReleaseStringUTFChars(device_address, c_address);
1505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return status;
1515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
1545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jstring device_address)
1555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    const char *c_address = env->GetStringUTFChars(device_address, NULL);
1575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    int state = static_cast <int>(AudioSystem::getDeviceConnectionState(static_cast <audio_devices_t>(device),
1585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                          c_address));
1595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    env->ReleaseStringUTFChars(device_address, c_address);
1605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return state;
1615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1625e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1635e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
1645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_setPhoneState(JNIEnv *env, jobject thiz, jint state)
1655e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1665e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return check_AudioSystem_Command(AudioSystem::setPhoneState((audio_mode_t) state));
1675e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1685e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1695e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
1705e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_setForceUse(JNIEnv *env, jobject thiz, jint usage, jint config)
1715e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1725e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return check_AudioSystem_Command(AudioSystem::setForceUse(static_cast <audio_policy_force_use_t>(usage),
1735e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                                           static_cast <audio_policy_forced_cfg_t>(config)));
1745e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1755e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1765e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
1775e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getForceUse(JNIEnv *env, jobject thiz, jint usage)
1785e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return static_cast <int>(AudioSystem::getForceUse(static_cast <audio_policy_force_use_t>(usage)));
1805e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1815e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
1825e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
1835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_initStreamVolume(JNIEnv *env, jobject thiz, jint stream, jint indexMin, jint indexMax)
1845e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1855e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return check_AudioSystem_Command(AudioSystem::initStreamVolume(static_cast <audio_stream_type_t>(stream),
1865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                                                   indexMin,
18744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                                                                   indexMax));
1885e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
1895e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
19044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatic int
1915e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env,
1925e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                               jobject thiz,
1935e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                               jint stream,
1945e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                               jint index,
1955e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                               jint device)
1965e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
1975e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return check_AudioSystem_Command(
1985e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala            AudioSystem::setStreamVolumeIndex(static_cast <audio_stream_type_t>(stream),
1995e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                              index,
2005e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                              (audio_devices_t)device));
2015e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2025e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2035e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
2045e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env,
2055e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                               jobject thiz,
2065e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                               jint stream,
20744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                                               jint device)
20844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin{
2095e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    int index;
2105e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    if (AudioSystem::getStreamVolumeIndex(static_cast <audio_stream_type_t>(stream),
2115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                          &index,
2125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                                          (audio_devices_t)device)
2135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala            != NO_ERROR) {
2145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        index = -1;
21544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    }
2165e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return index;
2175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
2205e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jfloat value)
2215e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2225e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return check_AudioSystem_Command(AudioSystem::setMasterVolume(value));
2235e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2245e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2255e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jfloat
2265e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getMasterVolume(JNIEnv *env, jobject thiz)
2275e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2285e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    float value;
2295e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    if (AudioSystem::getMasterVolume(&value) != NO_ERROR) {
2305e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        value = -1.0;
2315e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    }
2325e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return value;
2335e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2345e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2355e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic int
2365e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_setMasterMute(JNIEnv *env, jobject thiz, jboolean mute)
237c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala{
238c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    return check_AudioSystem_Command(AudioSystem::setMasterMute(mute));
2395e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2405e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2415e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jfloat
2425e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getMasterMute(JNIEnv *env, jobject thiz)
2435e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2445e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    bool mute;
2455e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    if (AudioSystem::getMasterMute(&mute) != NO_ERROR) {
2465e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        mute = false;
2475e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    }
2485e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return mute;
2495e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2505e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2515e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jint
2525e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getDevicesForStream(JNIEnv *env, jobject thiz, jint stream)
2535e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2545e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return (jint) AudioSystem::getDevicesForStream(static_cast <audio_stream_type_t>(stream));
2555e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2565e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2575e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jint
2585e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getPrimaryOutputSamplingRate(JNIEnv *env, jobject clazz)
2595e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2605e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return (jint) AudioSystem::getPrimaryOutputSamplingRate();
2615e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2625e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2635e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jint
2645e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getPrimaryOutputFrameCount(JNIEnv *env, jobject clazz)
2655e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2665e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return (jint) AudioSystem::getPrimaryOutputFrameCount();
2675e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2685e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2695e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jint
2705e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_getOutputLatency(JNIEnv *env, jobject clazz, jint stream)
2715e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2725e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    uint32_t afLatency;
2735e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    if (AudioSystem::getOutputLatency(&afLatency, static_cast <audio_stream_type_t>(stream))
2745e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala            != NO_ERROR) {
2755e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala        afLatency = -1;
2765e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    }
2775e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return (jint) afLatency;
2785e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2795e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2805e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic jint
2815e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaandroid_media_AudioSystem_setLowRamDevice(JNIEnv *env, jobject clazz, jboolean isLowRamDevice)
2825e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
2835e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice);
2845e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
2855e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala// ----------------------------------------------------------------------------
2875e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
2885e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalastatic JNINativeMethod gMethods[] = {
2895e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setParameters",        "(Ljava/lang/String;)I", (void *)android_media_AudioSystem_setParameters},
2905e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getParameters",        "(Ljava/lang/String;)Ljava/lang/String;", (void *)android_media_AudioSystem_getParameters},
2915e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"muteMicrophone",      "(Z)I",     (void *)android_media_AudioSystem_muteMicrophone},
2925e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"isMicrophoneMuted",   "()Z",      (void *)android_media_AudioSystem_isMicrophoneMuted},
2935e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"isStreamActive",      "(II)Z",    (void *)android_media_AudioSystem_isStreamActive},
2945e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"isStreamActiveRemotely","(II)Z",  (void *)android_media_AudioSystem_isStreamActiveRemotely},
2955e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"isSourceActive",      "(I)Z",     (void *)android_media_AudioSystem_isSourceActive},
2965e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setDeviceConnectionState", "(IILjava/lang/String;)I", (void *)android_media_AudioSystem_setDeviceConnectionState},
2975e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getDeviceConnectionState", "(ILjava/lang/String;)I",  (void *)android_media_AudioSystem_getDeviceConnectionState},
2985e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setPhoneState",       "(I)I",     (void *)android_media_AudioSystem_setPhoneState},
2995e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setForceUse",         "(II)I",    (void *)android_media_AudioSystem_setForceUse},
3005e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getForceUse",         "(I)I",     (void *)android_media_AudioSystem_getForceUse},
3015e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"initStreamVolume",    "(III)I",   (void *)android_media_AudioSystem_initStreamVolume},
3025e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setStreamVolumeIndex","(III)I",   (void *)android_media_AudioSystem_setStreamVolumeIndex},
3035e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getStreamVolumeIndex","(II)I",    (void *)android_media_AudioSystem_getStreamVolumeIndex},
3045e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setMasterVolume",     "(F)I",     (void *)android_media_AudioSystem_setMasterVolume},
3055e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getMasterVolume",     "()F",      (void *)android_media_AudioSystem_getMasterVolume},
3065e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setMasterMute",       "(Z)I",     (void *)android_media_AudioSystem_setMasterMute},
3075e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getMasterMute",       "()Z",      (void *)android_media_AudioSystem_getMasterMute},
3085e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getDevicesForStream", "(I)I",     (void *)android_media_AudioSystem_getDevicesForStream},
3095e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getPrimaryOutputSamplingRate", "()I", (void *)android_media_AudioSystem_getPrimaryOutputSamplingRate},
3105e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getPrimaryOutputFrameCount",   "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount},
3115e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"getOutputLatency",    "(I)I",     (void *)android_media_AudioSystem_getOutputLatency},
3125e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    {"setLowRamDevice",     "(Z)I",     (void *)android_media_AudioSystem_setLowRamDevice},
3135e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala};
3145e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
3155e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvalaint register_android_media_AudioSystem(JNIEnv *env)
3165e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala{
3175e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    AudioSystem::setErrorCallback(android_media_AudioSystem_error_callback);
3185e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala
3195e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala    return AndroidRuntime::registerNativeMethods(env,
3205e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala                kClassPathName, gMethods, NELEM(gMethods));
3215e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala}
3221ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala