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