blob: 5bf13e95642b40d45ed5d1fd37f8bc0babab0218 [file] [log] [blame]
Lajos Molnarb3d5fd22015-04-22 13:14:34 -07001/*
2 * Copyright 2015, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Wei Jia2d61e2b2015-05-08 15:23:28 -070017#ifndef _ANDROID_MEDIA_PLAYBACK_PARAMS_H_
18#define _ANDROID_MEDIA_PLAYBACK_PARAMS_H_
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070019
20#include <media/AudioResamplerPublic.h>
21
22namespace android {
23
24// This entire class is inline as it is used from both core and media
Wei Jia2d61e2b2015-05-08 15:23:28 -070025struct PlaybackParams {
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070026 AudioPlaybackRate audioRate;
27 bool speedSet;
28 bool pitchSet;
29 bool audioFallbackModeSet;
30 bool audioStretchModeSet;
31
32 struct fields_t {
33 jclass clazz;
34 jmethodID constructID;
35
36 jfieldID speed;
37 jfieldID pitch;
38 jfieldID audio_fallback_mode;
39 jfieldID audio_stretch_mode;
40 jfieldID set;
41 jint set_speed;
42 jint set_pitch;
43 jint set_audio_fallback_mode;
44 jint set_audio_stretch_mode;
45
46 void init(JNIEnv *env) {
Wei Jia2d61e2b2015-05-08 15:23:28 -070047 jclass lclazz = env->FindClass("android/media/PlaybackParams");
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070048 if (lclazz == NULL) {
49 return;
50 }
51
52 clazz = (jclass)env->NewGlobalRef(lclazz);
53 if (clazz == NULL) {
54 return;
55 }
56
57 constructID = env->GetMethodID(clazz, "<init>", "()V");
58
59 speed = env->GetFieldID(clazz, "mSpeed", "F");
60 pitch = env->GetFieldID(clazz, "mPitch", "F");
61 audio_fallback_mode = env->GetFieldID(clazz, "mAudioFallbackMode", "I");
62 audio_stretch_mode = env->GetFieldID(clazz, "mAudioStretchMode", "I");
63 set = env->GetFieldID(clazz, "mSet", "I");
64
65 set_speed =
66 env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "SET_SPEED", "I"));
67 set_pitch =
68 env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "SET_PITCH", "I"));
69 set_audio_fallback_mode = env->GetStaticIntField(
70 clazz, env->GetStaticFieldID(clazz, "SET_AUDIO_FALLBACK_MODE", "I"));
71 set_audio_stretch_mode = env->GetStaticIntField(
72 clazz, env->GetStaticFieldID(clazz, "SET_AUDIO_STRETCH_MODE", "I"));
73
74 env->DeleteLocalRef(lclazz);
75 }
76
77 void exit(JNIEnv *env) {
78 env->DeleteGlobalRef(clazz);
79 clazz = NULL;
80 }
81 };
82
Wei Jia2d61e2b2015-05-08 15:23:28 -070083 void fillFromJobject(JNIEnv *env, const fields_t& fields, jobject params) {
84 audioRate.mSpeed = env->GetFloatField(params, fields.speed);
85 audioRate.mPitch = env->GetFloatField(params, fields.pitch);
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070086 audioRate.mFallbackMode =
Wei Jia2d61e2b2015-05-08 15:23:28 -070087 (AudioTimestretchFallbackMode)env->GetIntField(params, fields.audio_fallback_mode);
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070088 audioRate.mStretchMode =
Wei Jia2d61e2b2015-05-08 15:23:28 -070089 (AudioTimestretchStretchMode)env->GetIntField(params, fields.audio_stretch_mode);
90 int set = env->GetIntField(params, fields.set);
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070091
92 speedSet = set & fields.set_speed;
93 pitchSet = set & fields.set_pitch;
94 audioFallbackModeSet = set & fields.set_audio_fallback_mode;
95 audioStretchModeSet = set & fields.set_audio_stretch_mode;
96 }
97
98 jobject asJobject(JNIEnv *env, const fields_t& fields) {
Wei Jia2d61e2b2015-05-08 15:23:28 -070099 jobject params = env->NewObject(fields.clazz, fields.constructID);
100 if (params == NULL) {
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700101 return NULL;
102 }
Wei Jia2d61e2b2015-05-08 15:23:28 -0700103 env->SetFloatField(params, fields.speed, (jfloat)audioRate.mSpeed);
104 env->SetFloatField(params, fields.pitch, (jfloat)audioRate.mPitch);
105 env->SetIntField(params, fields.audio_fallback_mode, (jint)audioRate.mFallbackMode);
106 env->SetIntField(params, fields.audio_stretch_mode, (jint)audioRate.mStretchMode);
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700107 env->SetIntField(
Wei Jia2d61e2b2015-05-08 15:23:28 -0700108 params, fields.set,
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700109 (speedSet ? fields.set_speed : 0)
110 | (pitchSet ? fields.set_pitch : 0)
111 | (audioFallbackModeSet ? fields.set_audio_fallback_mode : 0)
112 | (audioStretchModeSet ? fields.set_audio_stretch_mode : 0));
113
Wei Jia2d61e2b2015-05-08 15:23:28 -0700114 return params;
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700115 }
116};
117
118} // namespace android
119
Wei Jia2d61e2b2015-05-08 15:23:28 -0700120#endif // _ANDROID_MEDIA_PLAYBACK_PARAMS_H_