Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ed851bd authored by Eric Laurent's avatar Eric Laurent Committed by Android Git Automerger
Browse files

am f2e19a36: Merge "AudioManager: add audio port gain control" into lmp-preview-dev

* commit 'f2e19a36973331bbc09284993f772bf6981c10da':
  AudioManager: add audio port gain control
parents 086995c6 54b5e5bd
Loading
Loading
Loading
Loading
+61 −22
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
** limitations under the License.
*/

//#define LOG_NDEBUG 0

#define LOG_TAG "AudioSystem-JNI"
#include <utils/Log.h>

@@ -64,6 +66,7 @@ static struct {
    jfieldID    mChannelMask;
    jfieldID    mFormat;
    jfieldID    mGain;
    jfieldID    mConfigMask;
} gAudioPortConfigFields;

static jclass gAudioDevicePortClass;
@@ -437,6 +440,35 @@ static bool useInChannelMask(audio_port_type_t type, audio_port_role_t role)
                ((type == AUDIO_PORT_TYPE_MIX) && (role == AUDIO_PORT_ROLE_SINK));
}

static void convertAudioGainConfigToNative(JNIEnv *env,
                                               struct audio_gain_config *nAudioGainConfig,
                                               const jobject jAudioGainConfig,
                                               bool useInMask)
{
    nAudioGainConfig->index = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mIndex);
    nAudioGainConfig->mode = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mMode);
    ALOGV("convertAudioGainConfigToNative got gain index %d", nAudioGainConfig->index);
    jint jMask = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mChannelMask);
    audio_channel_mask_t nMask;
    if (useInMask) {
        nMask = inChannelMaskToNative(jMask);
        ALOGV("convertAudioGainConfigToNative IN mask java %x native %x", jMask, nMask);
    } else {
        nMask = outChannelMaskToNative(jMask);
        ALOGV("convertAudioGainConfigToNative OUT mask java %x native %x", jMask, nMask);
    }
    nAudioGainConfig->channel_mask = nMask;
    nAudioGainConfig->ramp_duration_ms = env->GetIntField(jAudioGainConfig,
                                                       gAudioGainConfigFields.mRampDurationMs);
    jintArray jValues = (jintArray)env->GetObjectField(jAudioGainConfig,
                                                       gAudioGainConfigFields.mValues);
    int *nValues = env->GetIntArrayElements(jValues, NULL);
    size_t size = env->GetArrayLength(jValues);
    memcpy(nAudioGainConfig->values, nValues, size * sizeof(int));
    env->DeleteLocalRef(jValues);
}


static jint convertAudioPortConfigToNative(JNIEnv *env,
                                               struct audio_port_config *nAudioPortConfig,
                                               const jobject jAudioPortConfig)
@@ -480,32 +512,15 @@ static jint convertAudioPortConfigToNative(JNIEnv *env,
    nAudioPortConfig->format = nFormat;
    jobject jGain = env->GetObjectField(jAudioPortConfig, gAudioPortConfigFields.mGain);
    if (jGain != NULL) {
        nAudioPortConfig->gain.index = env->GetIntField(jGain, gAudioGainConfigFields.mIndex);
        nAudioPortConfig->gain.mode = env->GetIntField(jGain, gAudioGainConfigFields.mMode);
        ALOGV("convertAudioPortConfigToNative got gain index %d", nAudioPortConfig->gain.index);
        jMask = env->GetIntField(jGain, gAudioGainConfigFields.mChannelMask);
        if (useInMask) {
            nMask = inChannelMaskToNative(jMask);
            ALOGV("convertAudioPortConfigToNative IN mask java %x native %x", jMask, nMask);
        } else {
            nMask = outChannelMaskToNative(jMask);
            ALOGV("convertAudioPortConfigToNative OUT mask java %x native %x", jMask, nMask);
        }

        nAudioPortConfig->gain.channel_mask = nMask;
        nAudioPortConfig->gain.ramp_duration_ms = env->GetIntField(jGain,
                                                           gAudioGainConfigFields.mRampDurationMs);

        jintArray jValues = (jintArray)env->GetObjectField(jGain, gAudioGainConfigFields.mValues);
        int *values = env->GetIntArrayElements(jValues, NULL);
        size_t size = env->GetArrayLength(jValues);
        memcpy(nAudioPortConfig->gain.values, values, size * sizeof(int));
        env->DeleteLocalRef(jValues);
        convertAudioGainConfigToNative(env, &nAudioPortConfig->gain, jGain, useInMask);
        env->DeleteLocalRef(jGain);
    } else {
        ALOGV("convertAudioPortConfigToNative no gain");
        nAudioPortConfig->gain.index = -1;
    }
    nAudioPortConfig->config_mask = env->GetIntField(jAudioPortConfig,
                                                     gAudioPortConfigFields.mConfigMask);

    env->DeleteLocalRef(jAudioPort);
    env->DeleteLocalRef(jHandle);
    return (jint)AUDIO_JAVA_SUCCESS;
@@ -688,7 +703,6 @@ exit:
    return jStatus;
}


static jint convertAudioPortFromNative(JNIEnv *env,
                                           jobject *jAudioPort, const struct audio_port *nAudioPort)
{
@@ -1225,6 +1239,28 @@ exit:
    return jStatus;
}

static jint
android_media_AudioSystem_setAudioPortConfig(JNIEnv *env, jobject clazz,
                                 jobject jAudioPortConfig)
{
    ALOGV("setAudioPortConfig");
    if (jAudioPortConfig == NULL) {
        return AUDIO_JAVA_BAD_VALUE;
    }
    if (!env->IsInstanceOf(jAudioPortConfig, gAudioPortConfigClass)) {
        return AUDIO_JAVA_BAD_VALUE;
    }
    struct audio_port_config nAudioPortConfig;
    jint jStatus = convertAudioPortConfigToNative(env, &nAudioPortConfig, jAudioPortConfig);
    if (jStatus != AUDIO_JAVA_SUCCESS) {
        return jStatus;
    }
    status_t status = AudioSystem::setAudioPortConfig(&nAudioPortConfig);
    ALOGV("AudioSystem::setAudioPortConfig() returned %d", status);
    jStatus = nativeToJavaStatus(status);
    return jStatus;
}

static void
android_media_AudioSystem_eventHandlerSetup(JNIEnv *env, jobject thiz, jobject weak_this)
{
@@ -1281,6 +1317,8 @@ static JNINativeMethod gMethods[] = {
                                            (void *)android_media_AudioSystem_releaseAudioPatch},
    {"listAudioPatches",    "(Ljava/util/ArrayList;[I)I",
                                                (void *)android_media_AudioSystem_listAudioPatches},
    {"setAudioPortConfig",   "(Landroid/media/AudioPortConfig;)I",
                                            (void *)android_media_AudioSystem_setAudioPortConfig},
};


@@ -1330,6 +1368,7 @@ int register_android_media_AudioSystem(JNIEnv *env)
    gAudioPortConfigFields.mFormat = env->GetFieldID(audioPortConfigClass, "mFormat", "I");
    gAudioPortConfigFields.mGain = env->GetFieldID(audioPortConfigClass, "mGain",
                                                   "Landroid/media/AudioGainConfig;");
    gAudioPortConfigFields.mConfigMask = env->GetFieldID(audioPortConfigClass, "mConfigMask", "I");

    jclass audioDevicePortConfigClass = env->FindClass("android/media/AudioDevicePortConfig");
    gAudioDevicePortConfigClass = (jclass) env->NewGlobalRef(audioDevicePortConfigClass);
+8 −1
Original line number Diff line number Diff line
@@ -3091,7 +3091,14 @@ public class AudioManager {
     * @hide
     */
    public int setAudioPortGain(AudioPort port, AudioGainConfig gain) {
        return ERROR_INVALID_OPERATION;
        if (port == null || gain == null) {
            return ERROR_BAD_VALUE;
        }
        AudioPortConfig activeConfig = port.activeConfig();
        AudioPortConfig config = new AudioPortConfig(port, activeConfig.samplingRate(),
                                        activeConfig.channelMask(), activeConfig.format(), gain);
        config.mConfigMask = AudioPortConfig.GAIN;
        return AudioSystem.setAudioPortConfig(config);
    }

    /**
+3 −0
Original line number Diff line number Diff line
@@ -133,6 +133,9 @@ public class AudioPort {
     * Get the gain descriptor at a given index
     */
    AudioGain gain(int index) {
        if (index < mGains.length) {
            return null;
        }
        return mGains[index];
    }

+1 −0
Original line number Diff line number Diff line
@@ -466,5 +466,6 @@ public class AudioSystem
                                            AudioPortConfig[] sources, AudioPortConfig[] sinks);
    public static native int releaseAudioPatch(AudioPatch patch);
    public static native int listAudioPatches(ArrayList<AudioPatch> patches, int[] generation);
    public static native int setAudioPortConfig(AudioPortConfig config);
}