-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPlayerExample.cpp
executable file
·155 lines (141 loc) · 5.08 KB
/
PlayerExample.cpp
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <jni.h>
#include <string>
#include <android/log.h>
#include <AndroidIO/SuperpoweredAndroidAudioIO.h>
#include <SuperpoweredAdvancedAudioPlayer.h>
#include <SuperpoweredSimple.h>
#include <SuperpoweredCPU.h>
#include <malloc.h>
#include <SLES/OpenSLES_AndroidConfiguration.h>
#include <SLES/OpenSLES.h>
#define log_print __android_log_print
static SuperpoweredAndroidAudioIO *audioIO;
static SuperpoweredAdvancedAudioPlayer *player;
static float *floatBuffer;
// This is called periodically by the audio engine.
static bool audioProcessing (
void * __unused clientdata, // custom pointer
short int *audio, // buffer of interleaved samples
int numberOfFrames, // number of frames to process
int __unused samplerate // sampling rate
) {
if (player->process(floatBuffer, false, (unsigned int)numberOfFrames)) {
SuperpoweredFloatToShortInt(floatBuffer, audio, (unsigned int)numberOfFrames);
return true;
} else {
return false;
}
}
// Called by the player.
static void playerEventCallback (
void * __unused clientData,
SuperpoweredAdvancedAudioPlayerEvent event,
void *value
) {
switch (event) {
case SuperpoweredAdvancedAudioPlayerEvent_LoadSuccess:
break;
case SuperpoweredAdvancedAudioPlayerEvent_LoadError:
log_print(ANDROID_LOG_ERROR, "PlayerExample", "Open error: %s", (char *)value);
break;
case SuperpoweredAdvancedAudioPlayerEvent_EOF:
player->seek(0); // loop track
break;
default:;
};
}
// StartAudio - Start audio engine and initialize player.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_StartAudio (
JNIEnv * __unused env,
jobject __unused obj,
jint samplerate,
jint buffersize
) {
// Allocate audio buffer.
floatBuffer = (float *)malloc(sizeof(float) * 2 * buffersize);
// Initialize player and pass callback function.
player = new SuperpoweredAdvancedAudioPlayer (
NULL, // clientData
playerEventCallback, // callback function
(unsigned int)samplerate, // sampling rate
0 // cachedPointCount
);
// Initialize audio with audio callback function.
audioIO = new SuperpoweredAndroidAudioIO (
samplerate, // sampling rate
buffersize, // buffer size
false, // enableInput
true, // enableOutput
audioProcessing, // process callback function
NULL, // clientData
-1, // inputStreamType (-1 = default)
SL_ANDROID_STREAM_MEDIA // outputStreamType (-1 = default)
);
}
// OpenFile - Open file in player, specifying offset and length.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_OpenFile (
JNIEnv *env,
jobject __unused obj,
jstring path, // path to APK file
jint offset, // offset of audio file
jint length // length of audio file
) {
const char *str = env->GetStringUTFChars(path, 0);
player->open(str, offset, length);
env->ReleaseStringUTFChars(path, str);
}
// TogglePlayback - Toggle Play/Pause state of the player.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_TogglePlayback (
JNIEnv * __unused env,
jobject __unused obj
) {
player->togglePlayback();
SuperpoweredCPU::setSustainedPerformanceMode(player->playing); // prevent dropouts
}
// onSpeedSlider - Handle TimeStretching events.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_onSpeedSlider (
JNIEnv * __unused env,
jobject __unused obj,
jint value
) {
player->setTempo((value/10000.0), true);
}
// onPitchSlider - Handle PitchShifting events.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_onPitchSlider (
JNIEnv * __unused env,
jobject __unused obj,
jint value
) {
player->setPitchShift(value);
}
// onBackground - Put audio processing to sleep.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_onBackground (
JNIEnv * __unused env,
jobject __unused obj
) {
audioIO->onBackground();
}
// onForeground - Resume audio processing.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_onForeground (
JNIEnv * __unused env,
jobject __unused obj
) {
audioIO->onForeground();
}
// Cleanup - Free resources.
extern "C" JNIEXPORT void
Java_com_superpowered_playerexample_MainActivity_Cleanup (
JNIEnv * __unused env,
jobject __unused obj
) {
delete audioIO;
delete player;
free(floatBuffer);
}