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