1b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar/*
2b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * Copyright 2015, The Android Open Source Project
3b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar *
4b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
5b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * you may not use this file except in compliance with the License.
6b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * You may obtain a copy of the License at
7b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar *
8b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar *     http://www.apache.org/licenses/LICENSE-2.0
9b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar *
10b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * Unless required by applicable law or agreed to in writing, software
11b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
12b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * See the License for the specific language governing permissions and
14b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar * limitations under the License.
15b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar */
16b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
172d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#ifndef _ANDROID_MEDIA_PLAYBACK_PARAMS_H_
182d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#define _ANDROID_MEDIA_PLAYBACK_PARAMS_H_
19b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
20b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar#include <media/AudioResamplerPublic.h>
21b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
22b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnarnamespace android {
23b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
24b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar// This entire class is inline as it is used from both core and media
252d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastruct PlaybackParams {
26b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    AudioPlaybackRate audioRate;
27b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    bool speedSet;
28b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    bool pitchSet;
29b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    bool audioFallbackModeSet;
30b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    bool audioStretchModeSet;
31b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
32b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    struct fields_t {
33b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jclass      clazz;
34b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jmethodID   constructID;
35b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
36b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jfieldID    speed;
37b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jfieldID    pitch;
38b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jfieldID    audio_fallback_mode;
39b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jfieldID    audio_stretch_mode;
40b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jfieldID    set;
41b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jint        set_speed;
42b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jint        set_pitch;
43b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jint        set_audio_fallback_mode;
44b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jint        set_audio_stretch_mode;
45b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
46b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        void init(JNIEnv *env) {
472d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            jclass lclazz = env->FindClass("android/media/PlaybackParams");
48b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            if (lclazz == NULL) {
49b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                return;
50b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            }
51b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
52b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            clazz = (jclass)env->NewGlobalRef(lclazz);
53b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            if (clazz == NULL) {
54b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                return;
55b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            }
56b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
57b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            constructID = env->GetMethodID(clazz, "<init>", "()V");
58b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
59b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            speed = env->GetFieldID(clazz, "mSpeed", "F");
60b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            pitch = env->GetFieldID(clazz, "mPitch", "F");
61b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            audio_fallback_mode = env->GetFieldID(clazz, "mAudioFallbackMode", "I");
62b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            audio_stretch_mode = env->GetFieldID(clazz, "mAudioStretchMode", "I");
63b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            set = env->GetFieldID(clazz, "mSet", "I");
64b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
65b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            set_speed =
66b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "SET_SPEED", "I"));
67b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            set_pitch =
68b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "SET_PITCH", "I"));
69b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            set_audio_fallback_mode = env->GetStaticIntField(
70b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                    clazz, env->GetStaticFieldID(clazz, "SET_AUDIO_FALLBACK_MODE", "I"));
71b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            set_audio_stretch_mode = env->GetStaticIntField(
72b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                    clazz, env->GetStaticFieldID(clazz, "SET_AUDIO_STRETCH_MODE", "I"));
73b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
74b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            env->DeleteLocalRef(lclazz);
75b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        }
76b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
77b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        void exit(JNIEnv *env) {
78b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            env->DeleteGlobalRef(clazz);
79b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            clazz = NULL;
80b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        }
81b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    };
82b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
832d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    void fillFromJobject(JNIEnv *env, const fields_t& fields, jobject params) {
842d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        audioRate.mSpeed = env->GetFloatField(params, fields.speed);
852d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        audioRate.mPitch = env->GetFloatField(params, fields.pitch);
86b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        audioRate.mFallbackMode =
872d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            (AudioTimestretchFallbackMode)env->GetIntField(params, fields.audio_fallback_mode);
88b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        audioRate.mStretchMode =
892d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            (AudioTimestretchStretchMode)env->GetIntField(params, fields.audio_stretch_mode);
902d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        int set = env->GetIntField(params, fields.set);
91b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
92b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        speedSet = set & fields.set_speed;
93b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        pitchSet = set & fields.set_pitch;
94b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        audioFallbackModeSet = set & fields.set_audio_fallback_mode;
95b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        audioStretchModeSet = set & fields.set_audio_stretch_mode;
96b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    }
97b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
98b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    jobject asJobject(JNIEnv *env, const fields_t& fields) {
992d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        jobject params = env->NewObject(fields.clazz, fields.constructID);
1002d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (params == NULL) {
101b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            return NULL;
102b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        }
1032d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        env->SetFloatField(params, fields.speed, (jfloat)audioRate.mSpeed);
1042d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        env->SetFloatField(params, fields.pitch, (jfloat)audioRate.mPitch);
1052d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        env->SetIntField(params, fields.audio_fallback_mode, (jint)audioRate.mFallbackMode);
1062d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        env->SetIntField(params, fields.audio_stretch_mode, (jint)audioRate.mStretchMode);
107b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        env->SetIntField(
1082d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia                params, fields.set,
109b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                (speedSet ? fields.set_speed : 0)
110b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                        | (pitchSet ? fields.set_pitch : 0)
111b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                        | (audioFallbackModeSet ? fields.set_audio_fallback_mode : 0)
112b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar                        | (audioStretchModeSet  ? fields.set_audio_stretch_mode : 0));
113b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
1142d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        return params;
115b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    }
116b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar};
117b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
118b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar}  // namespace android
119b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
1202d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#endif  // _ANDROID_MEDIA_PLAYBACK_PARAMS_H_
121