提交 3a8e8e61 编写于 作者: C ctiao 提交者: Xinzheng Zhang

android: support setSpeed for pre-M(api<23) versions

Signed-off-by: NXinzheng Zhang <zhangxzheng@gmail.com>
上级 89baebdc
......@@ -715,12 +715,10 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer {
private native int _getLoopCount();
@TargetApi(Build.VERSION_CODES.M)
public void setSpeed(float speed) {
_setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed);
}
@TargetApi(Build.VERSION_CODES.M)
public float getSpeed(float speed) {
return _getPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, .0f);
}
......
......@@ -39,6 +39,10 @@ typedef struct J4AC_android_media_AudioTrack {
jmethodID method_getAudioSessionId;
jmethodID method_getPlaybackParams;
jmethodID method_setPlaybackParams;
jmethodID method_getStreamType;
jmethodID method_getSampleRate;
jmethodID method_getPlaybackRate;
jmethodID method_setPlaybackRate;
} J4AC_android_media_AudioTrack;
static J4AC_android_media_AudioTrack class_J4AC_android_media_AudioTrack;
......@@ -283,6 +287,66 @@ void J4AC_android_media_AudioTrack__setPlaybackParams__catchAll(JNIEnv *env, job
J4A_ExceptionCheck__catchAll(env);
}
jint J4AC_android_media_AudioTrack__getStreamType(JNIEnv *env, jobject thiz)
{
return (*env)->CallIntMethod(env, thiz, class_J4AC_android_media_AudioTrack.method_getStreamType);
}
jint J4AC_android_media_AudioTrack__getStreamType__catchAll(JNIEnv *env, jobject thiz)
{
jint ret_value = J4AC_android_media_AudioTrack__getStreamType(env, thiz);
if (J4A_ExceptionCheck__catchAll(env)) {
return 0;
}
return ret_value;
}
jint J4AC_android_media_AudioTrack__getSampleRate(JNIEnv *env, jobject thiz)
{
return (*env)->CallIntMethod(env, thiz, class_J4AC_android_media_AudioTrack.method_getSampleRate);
}
jint J4AC_android_media_AudioTrack__getSampleRate__catchAll(JNIEnv *env, jobject thiz)
{
jint ret_value = J4AC_android_media_AudioTrack__getSampleRate(env, thiz);
if (J4A_ExceptionCheck__catchAll(env)) {
return 0;
}
return ret_value;
}
jint J4AC_android_media_AudioTrack__getPlaybackRate(JNIEnv *env, jobject thiz)
{
return (*env)->CallIntMethod(env, thiz, class_J4AC_android_media_AudioTrack.method_getPlaybackRate);
}
jint J4AC_android_media_AudioTrack__getPlaybackRate__catchAll(JNIEnv *env, jobject thiz)
{
jint ret_value = J4AC_android_media_AudioTrack__getPlaybackRate(env, thiz);
if (J4A_ExceptionCheck__catchAll(env)) {
return 0;
}
return ret_value;
}
jint J4AC_android_media_AudioTrack__setPlaybackRate(JNIEnv *env, jobject thiz, jint sampleRateInHz)
{
return (*env)->CallIntMethod(env, thiz, class_J4AC_android_media_AudioTrack.method_setPlaybackRate, sampleRateInHz);
}
jint J4AC_android_media_AudioTrack__setPlaybackRate__catchAll(JNIEnv *env, jobject thiz, jint sampleRateInHz)
{
jint ret_value = J4AC_android_media_AudioTrack__setPlaybackRate(env, thiz, sampleRateInHz);
if (J4A_ExceptionCheck__catchAll(env)) {
return 0;
}
return ret_value;
}
int J4A_loadClass__J4AC_android_media_AudioTrack(JNIEnv *env)
{
int ret = -1;
......@@ -408,6 +472,34 @@ int J4A_loadClass__J4AC_android_media_AudioTrack(JNIEnv *env)
goto fail;
}
class_id = class_J4AC_android_media_AudioTrack.id;
name = "getStreamType";
sign = "()I";
class_J4AC_android_media_AudioTrack.method_getStreamType = J4A_GetMethodID__catchAll(env, class_id, name, sign);
if (class_J4AC_android_media_AudioTrack.method_getStreamType == NULL)
goto fail;
class_id = class_J4AC_android_media_AudioTrack.id;
name = "getSampleRate";
sign = "()I";
class_J4AC_android_media_AudioTrack.method_getSampleRate = J4A_GetMethodID__catchAll(env, class_id, name, sign);
if (class_J4AC_android_media_AudioTrack.method_getSampleRate == NULL)
goto fail;
class_id = class_J4AC_android_media_AudioTrack.id;
name = "getPlaybackRate";
sign = "()I";
class_J4AC_android_media_AudioTrack.method_getPlaybackRate = J4A_GetMethodID__catchAll(env, class_id, name, sign);
if (class_J4AC_android_media_AudioTrack.method_getPlaybackRate == NULL)
goto fail;
class_id = class_J4AC_android_media_AudioTrack.id;
name = "setPlaybackRate";
sign = "(I)I";
class_J4AC_android_media_AudioTrack.method_setPlaybackRate = J4A_GetMethodID__catchAll(env, class_id, name, sign);
if (class_J4AC_android_media_AudioTrack.method_setPlaybackRate == NULL)
goto fail;
J4A_ALOGD("J4ALoader: OK: '%s' loaded\n", "android.media.AudioTrack");
ret = 0;
fail:
......
......@@ -56,6 +56,14 @@ jobject J4AC_android_media_AudioTrack__getPlaybackParams__catchAll(JNIEnv *env,
jobject J4AC_android_media_AudioTrack__getPlaybackParams__asGlobalRef__catchAll(JNIEnv *env, jobject thiz);
void J4AC_android_media_AudioTrack__setPlaybackParams(JNIEnv *env, jobject thiz, jobject params);
void J4AC_android_media_AudioTrack__setPlaybackParams__catchAll(JNIEnv *env, jobject thiz, jobject params);
jint J4AC_android_media_AudioTrack__getStreamType(JNIEnv *env, jobject thiz);
jint J4AC_android_media_AudioTrack__getStreamType__catchAll(JNIEnv *env, jobject thiz);
jint J4AC_android_media_AudioTrack__getSampleRate(JNIEnv *env, jobject thiz);
jint J4AC_android_media_AudioTrack__getSampleRate__catchAll(JNIEnv *env, jobject thiz);
jint J4AC_android_media_AudioTrack__getPlaybackRate(JNIEnv *env, jobject thiz);
jint J4AC_android_media_AudioTrack__getPlaybackRate__catchAll(JNIEnv *env, jobject thiz);
jint J4AC_android_media_AudioTrack__setPlaybackRate(JNIEnv *env, jobject thiz, jint sampleRateInHz);
jint J4AC_android_media_AudioTrack__setPlaybackRate__catchAll(JNIEnv *env, jobject thiz, jint sampleRateInHz);
int J4A_loadClass__J4AC_android_media_AudioTrack(JNIEnv *env);
#define J4A_HAVE_SIMPLE__J4AC_android_media_AudioTrack
......@@ -92,6 +100,14 @@ int J4A_loadClass__J4AC_android_media_AudioTrack(JNIEnv *env);
#define J4AC_AudioTrack__getPlaybackParams__catchAll J4AC_android_media_AudioTrack__getPlaybackParams__catchAll
#define J4AC_AudioTrack__setPlaybackParams J4AC_android_media_AudioTrack__setPlaybackParams
#define J4AC_AudioTrack__setPlaybackParams__catchAll J4AC_android_media_AudioTrack__setPlaybackParams__catchAll
#define J4AC_AudioTrack__getStreamType J4AC_android_media_AudioTrack__getStreamType
#define J4AC_AudioTrack__getStreamType__catchAll J4AC_android_media_AudioTrack__getStreamType__catchAll
#define J4AC_AudioTrack__getSampleRate J4AC_android_media_AudioTrack__getSampleRate
#define J4AC_AudioTrack__getSampleRate__catchAll J4AC_android_media_AudioTrack__getSampleRate__catchAll
#define J4AC_AudioTrack__getPlaybackRate J4AC_android_media_AudioTrack__getPlaybackRate
#define J4AC_AudioTrack__getPlaybackRate__catchAll J4AC_android_media_AudioTrack__getPlaybackRate__catchAll
#define J4AC_AudioTrack__setPlaybackRate J4AC_android_media_AudioTrack__setPlaybackRate
#define J4AC_AudioTrack__setPlaybackRate__catchAll J4AC_android_media_AudioTrack__setPlaybackRate__catchAll
#define J4A_loadClass__J4AC_AudioTrack J4A_loadClass__J4AC_android_media_AudioTrack
#endif//J4A__android_media_AudioTrack__H
......@@ -21,10 +21,21 @@
#include "AudioTrack.util.h"
#include "j4a/class/android/media/PlaybackParams.h"
#ifndef STREAM_MUSIC
#define STREAM_MUSIC 3
#endif
void J4AC_android_media_AudioTrack__setSpeed(JNIEnv *env, jobject thiz, jfloat speed)
{
if (J4A_GetSystemAndroidApiLevel(env) < 23)
if (J4A_GetSystemAndroidApiLevel(env) < 23) {
jint sample_rate = J4AC_android_media_AudioTrack__getNativeOutputSampleRate__catchAll(env,
STREAM_MUSIC);
if (J4A_ExceptionCheck__throwAny(env)) {
return;
}
J4AC_android_media_AudioTrack__setPlaybackRate__catchAll(env, thiz,
(jint) (sample_rate * speed));
return;
}
jobject temp = NULL;
jobject params = J4AC_android_media_AudioTrack__getPlaybackParams(env, thiz);
......
......@@ -8,7 +8,7 @@ public class AudioTrack {
public static int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat);
public static float getMaxVolume();
public static float getMinVolume();
public static int getNativeOutputSampleRate (int streamType);
public static int getNativeOutputSampleRate(int streamType);
public void play();
public void pause();
......@@ -25,4 +25,10 @@ public class AudioTrack {
public PlaybackParams getPlaybackParams();
@MinApi(23)
void setPlaybackParams(PlaybackParams params);
int getStreamType();
int getSampleRate();
int getPlaybackRate();
int setPlaybackRate(int sampleRateInHz);
}
......@@ -209,10 +209,8 @@ SDL_Android_AudioTrack *SDL_Android_AudioTrack_new_from_spec(JNIEnv *env, SDL_An
return NULL;
}
if (J4A_GetSystemAndroidApiLevel(env) >= 23) {
// for fast playback
min_buffer_size *= 2;
}
// for fast playback
min_buffer_size *= AUDIOTRACK_PLAYBACK_MAXSPEED;
atrack->thiz = J4AC_AudioTrack__AudioTrack__asGlobalRef__catchAll(env,
atrack->spec.stream_type,
......
......@@ -29,6 +29,8 @@
#include "../ijksdl_audio.h"
#include "../ijksdl_aout.h"
#define AUDIOTRACK_PLAYBACK_MAXSPEED (2)
typedef struct SDL_Android_AudioTrack_Spec {
enum StreamType {
STREAM_VOICE_CALL = 0,
......
......@@ -105,9 +105,7 @@ static int aout_thread_n(JNIEnv *env, SDL_Aout *aout)
}
if (opaque->speed_changed) {
opaque->speed_changed = 0;
if (J4A_GetSystemAndroidApiLevel(env) >= 23) {
SDL_Android_AudioTrack_setSpeed(env, atrack, opaque->speed);
}
SDL_Android_AudioTrack_setSpeed(env, atrack, opaque->speed);
}
SDL_UnlockMutex(opaque->wakeup_mutex);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册