From 88790fa4e840d697a8e05c8e4fb38d24c8b9a462 Mon Sep 17 00:00:00 2001 From: Zhang Rui Date: Fri, 18 Dec 2015 17:45:28 +0800 Subject: [PATCH] android/jjk: add android.media.PlaybackParams --- ijkmedia/ijksdl/Android.mk | 2 + ijkmedia/ijksdl/android/jjk/Makefile | 1 + .../android/jjk/c/android/media/AudioTrack.c | 66 +++++++++++++ .../android/jjk/c/android/media/AudioTrack.h | 9 ++ .../jjk/c/android/media/AudioTrack.util.c | 67 +++++++++++++ .../jjk/c/android/media/AudioTrack.util.h | 35 +++++++ .../android/jjk/c/android/media/MediaCodec.h | 2 + .../android/jjk/c/android/media/MediaFormat.h | 2 + .../jjk/c/android/media/PlaybackParams.c | 97 +++++++++++++++++++ .../jjk/c/android/media/PlaybackParams.h | 33 +++++++ .../ijksdl/android/jjk/c/android/os/Bundle.h | 2 + .../android/jjk/c/java/util/ArrayList.h | 2 + .../danmaku/ijk/media/player/IjkMediaPlayer.h | 2 + .../ijk/media/player/misc/IMediaDataSource.h | 2 + .../android/jjk/internal/jjk_allclasses.c | 10 +- .../android/jjk/internal/jjk_internal.h | 2 +- .../jjk/java/android/media/AudioTrack.java | 6 ++ .../java/android/media/PlaybackParams.java | 7 ++ .../jjk/parser/ast/ast_compilation_unit.cpp | 4 +- .../android/jjk/parser/ast/ast_method.cpp | 12 +++ 20 files changed, 357 insertions(+), 6 deletions(-) create mode 100644 ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.c create mode 100644 ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.h create mode 100644 ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.c create mode 100644 ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.h create mode 100644 ijkmedia/ijksdl/android/jjk/java/android/media/PlaybackParams.java diff --git a/ijkmedia/ijksdl/Android.mk b/ijkmedia/ijksdl/Android.mk index 326d27af..3bb6d8bf 100644 --- a/ijkmedia/ijksdl/Android.mk +++ b/ijkmedia/ijksdl/Android.mk @@ -61,8 +61,10 @@ LOCAL_SRC_FILES += android/ijksdl_vout_overlay_android_mediacodec.c LOCAL_SRC_FILES += android/jjk/internal/jjk_allclasses.c LOCAL_SRC_FILES += android/jjk/internal/jjk_internal.c LOCAL_SRC_FILES += android/jjk/c/android/media/AudioTrack.c +LOCAL_SRC_FILES += android/jjk/c/android/media/AudioTrack.util.c LOCAL_SRC_FILES += android/jjk/c/android/media/MediaCodec.c LOCAL_SRC_FILES += android/jjk/c/android/media/MediaFormat.c +LOCAL_SRC_FILES += android/jjk/c/android/media/PlaybackParams.c LOCAL_SRC_FILES += android/jjk/c/android/os/Build.c LOCAL_SRC_FILES += android/jjk/c/android/os/Bundle.c LOCAL_SRC_FILES += android/jjk/c/java/nio/Buffer.c diff --git a/ijkmedia/ijksdl/android/jjk/Makefile b/ijkmedia/ijksdl/android/jjk/Makefile index 85d66c59..a82adb73 100644 --- a/ijkmedia/ijksdl/android/jjk/Makefile +++ b/ijkmedia/ijksdl/android/jjk/Makefile @@ -4,6 +4,7 @@ ALL_SRC = \ c/android/media/AudioTrack.c \ c/android/media/MediaCodec.c \ c/android/media/MediaFormat.c \ + c/android/media/PlaybackParams.c \ c/android/os/Build.c \ c/android/os/Bundle.c \ c/java/nio/Buffer.c \ diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.c b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.c index 9dc52be6..fed6194e 100644 --- a/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.c +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.c @@ -36,6 +36,8 @@ typedef struct JJKC_AudioTrack { jmethodID method_write; jmethodID method_setStereoVolume; jmethodID method_getAudioSessionId; + jmethodID method_getPlaybackParams; + jmethodID method_setPlaybackParams; } JJKC_AudioTrack; static JJKC_AudioTrack class_JJKC_AudioTrack; @@ -234,6 +236,52 @@ jint JJKC_AudioTrack__getAudioSessionId__catchAll(JNIEnv *env, jobject thiz) return ret_value; } +jobject JJKC_AudioTrack__getPlaybackParams(JNIEnv *env, jobject thiz) +{ + return (*env)->CallObjectMethod(env, thiz, class_JJKC_AudioTrack.method_getPlaybackParams); +} + +jobject JJKC_AudioTrack__getPlaybackParams__catchAll(JNIEnv *env, jobject thiz) +{ + jobject ret_object = JJKC_AudioTrack__getPlaybackParams(env, thiz); + if (JJK_ExceptionCheck__catchAll(env) || !ret_object) { + return NULL; + } + + return ret_object; +} + +jobject JJKC_AudioTrack__getPlaybackParams__asGlobalRef__catchAll(JNIEnv *env, jobject thiz) +{ + jobject ret_object = NULL; + jobject local_object = JJKC_AudioTrack__getPlaybackParams__catchAll(env, thiz); + if (JJK_ExceptionCheck__catchAll(env) || !local_object) { + ret_object = NULL; + goto fail; + } + + ret_object = JJK_NewGlobalRef__catchAll(env, local_object); + if (!ret_object) { + ret_object = NULL; + goto fail; + } + +fail: + JJK_DeleteLocalRef__p(env, &local_object); + return ret_object; +} + +void JJKC_AudioTrack__setPlaybackParams(JNIEnv *env, jobject thiz, jobject params) +{ + (*env)->CallVoidMethod(env, thiz, class_JJKC_AudioTrack.method_setPlaybackParams, params); +} + +void JJKC_AudioTrack__setPlaybackParams__catchAll(JNIEnv *env, jobject thiz, jobject params) +{ + JJKC_AudioTrack__setPlaybackParams(env, thiz, params); + JJK_ExceptionCheck__catchAll(env); +} + int JJK_loadClass__JJKC_AudioTrack(JNIEnv *env) { int ret = -1; @@ -338,6 +386,24 @@ int JJK_loadClass__JJKC_AudioTrack(JNIEnv *env) if (class_JJKC_AudioTrack.method_getAudioSessionId == NULL) goto fail; + if (JJK_GetSystemAndroidApiLevel(env) >= 23) { + class_id = class_JJKC_AudioTrack.id; + name = "getPlaybackParams"; + sign = "()Landroid/media/PlaybackParams;"; + class_JJKC_AudioTrack.method_getPlaybackParams = JJK_GetMethodID__catchAll(env, class_id, name, sign); + if (class_JJKC_AudioTrack.method_getPlaybackParams == NULL) + goto fail; + } + + if (JJK_GetSystemAndroidApiLevel(env) >= 23) { + class_id = class_JJKC_AudioTrack.id; + name = "setPlaybackParams"; + sign = "(Landroid/media/PlaybackParams;)V"; + class_JJKC_AudioTrack.method_setPlaybackParams = JJK_GetMethodID__catchAll(env, class_id, name, sign); + if (class_JJKC_AudioTrack.method_setPlaybackParams == NULL) + goto fail; + } + ALOGD("JJKLoader: OK: '%s' loaded\n", "android.media.AudioTrack"); ret = 0; fail: diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.h b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.h index b3ad2dea..3fe4c1d6 100644 --- a/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.h +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.h @@ -50,6 +50,15 @@ jint JJKC_AudioTrack__setStereoVolume(JNIEnv *env, jobject thiz, jfloat leftGain jint JJKC_AudioTrack__setStereoVolume__catchAll(JNIEnv *env, jobject thiz, jfloat leftGain, jfloat rightGain); jint JJKC_AudioTrack__getAudioSessionId(JNIEnv *env, jobject thiz); jint JJKC_AudioTrack__getAudioSessionId__catchAll(JNIEnv *env, jobject thiz); +jobject JJKC_AudioTrack__getPlaybackParams(JNIEnv *env, jobject thiz); +jobject JJKC_AudioTrack__getPlaybackParams__catchAll(JNIEnv *env, jobject thiz); +jobject JJKC_AudioTrack__getPlaybackParams__asGlobalRef__catchAll(JNIEnv *env, jobject thiz); +void JJKC_AudioTrack__setPlaybackParams(JNIEnv *env, jobject thiz, jobject params); +void JJKC_AudioTrack__setPlaybackParams__catchAll(JNIEnv *env, jobject thiz, jobject params); int JJK_loadClass__JJKC_AudioTrack(JNIEnv *env); +#define JJK_HAVE__JJKC_AudioTrack + +#include "AudioTrack.util.h" + #endif//JJK__android_media_AudioTrack__H diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.c b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.c new file mode 100644 index 00000000..002ce294 --- /dev/null +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.c @@ -0,0 +1,67 @@ +/* + * copyright (c) 2015 Zhang Rui + * + * This file is part of ijkPlayer. + * + * ijkPlayer is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * ijkPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with ijkPlayer; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "AudioTrack.h" +#include "AudioTrack.util.h" +#include "PlaybackParams.h" + +#ifdef JJK_HAVE__JJKC_AudioTrack +#define CALL_METHOD(method__) JJKC_AudioTrack__##method__ +#else +#define CALL_METHOD(method__) JJKC_android_media_AudioTrack__##method__ +#endif + +void JJKC_android_media_AudioTrack__setSpeed(JNIEnv *env, jobject thiz, jfloat speed) +{ + if (JJK_GetSystemAndroidApiLevel(env) < 23) + return; + + jobject temp = NULL; + jobject params = CALL_METHOD(getPlaybackParams)(env, thiz); + if (JJK_ExceptionCheck__throwAny(env) || !params) + goto fail; + +#ifdef JJK_HAVE__JJKC_PlaybackParams + temp = JJKC_PlaybackParams__setSpeed(env, params, speed); +#else + temp = JJKC_android_media_PlaybackParams__setSpeed(env, params, speed); +#endif + JJK_DeleteLocalRef__p(env, &temp); + if (JJK_ExceptionCheck__throwAny(env)) + goto fail; + + ALOGE("%s %f", __func__, (double)speed); + CALL_METHOD(setPlaybackParams)(env, thiz, params); + if (JJK_ExceptionCheck__throwAny(env)) + goto fail; + +fail: + JJK_DeleteLocalRef__p(env, ¶ms); +} + +void JJKC_android_media_AudioTrack__setSpeed__catchAll(JNIEnv *env, jobject thiz, jfloat speed) +{ + ALOGE("%s", __func__); + JJKC_android_media_AudioTrack__setSpeed(env, thiz, speed); + if (JJK_ExceptionCheck__catchAll(env)) + return; + + return; +} diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.h b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.h new file mode 100644 index 00000000..80707357 --- /dev/null +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/AudioTrack.util.h @@ -0,0 +1,35 @@ +/* + * copyright (c) 2015 Zhang Rui + * + * This file is part of ijkPlayer. + * + * ijkPlayer is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * ijkPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with ijkPlayer; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef JJK__android_media_AudioTrack__UTIL__H +#define JJK__android_media_AudioTrack__UTIL__H + +#include "ijksdl/android/jjk/internal/jjk_internal.h" +#include "AudioTrack.h" + +void JJKC_android_media_AudioTrack__setSpeed(JNIEnv *env, jobject thiz, jfloat speed); +void JJKC_android_media_AudioTrack__setSpeed__catchAll(JNIEnv *env, jobject thiz, jfloat speed); + +#ifdef JJK_HAVE__JJKC_AudioTrack +inline static void JJKC_AudioTrack__setSpeed(JNIEnv *env, jobject thiz, jfloat speed) {JJKC_android_media_AudioTrack__setSpeed(env, thiz, speed);} +inline static void JJKC_AudioTrack__setSpeed__catchAll(JNIEnv *env, jobject thiz, jfloat speed) {JJKC_android_media_AudioTrack__setSpeed__catchAll(env, thiz, speed);} +#endif + +#endif diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/MediaCodec.h b/ijkmedia/ijksdl/android/jjk/c/android/media/MediaCodec.h index 19b85388..31bf9da2 100644 --- a/ijkmedia/ijksdl/android/jjk/c/android/media/MediaCodec.h +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/MediaCodec.h @@ -74,4 +74,6 @@ void JJKC_MediaCodec__release(JNIEnv *env, jobject thiz); void JJKC_MediaCodec__release__catchAll(JNIEnv *env, jobject thiz); int JJK_loadClass__JJKC_MediaCodec(JNIEnv *env); +#define JJK_HAVE__JJKC_MediaCodec + #endif//JJK__android_media_MediaCodec__H diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/MediaFormat.h b/ijkmedia/ijksdl/android/jjk/c/android/media/MediaFormat.h index ee88241e..ad69ff47 100644 --- a/ijkmedia/ijksdl/android/jjk/c/android/media/MediaFormat.h +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/MediaFormat.h @@ -46,4 +46,6 @@ void JJKC_MediaFormat__setByteBuffer__withCString(JNIEnv *env, jobject thiz, con void JJKC_MediaFormat__setByteBuffer__withCString__catchAll(JNIEnv *env, jobject thiz, const char *name_cstr__, jobject bytes); int JJK_loadClass__JJKC_MediaFormat(JNIEnv *env); +#define JJK_HAVE__JJKC_MediaFormat + #endif//JJK__android_media_MediaFormat__H diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.c b/ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.c new file mode 100644 index 00000000..932a3857 --- /dev/null +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.c @@ -0,0 +1,97 @@ +/* + * copyright (c) 2015 Zhang Rui + * + * This file is part of ijkPlayer. + * + * ijkPlayer is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * ijkPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with ijkPlayer; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "PlaybackParams.h" + +typedef struct JJKC_PlaybackParams { + jclass id; + + jmethodID method_setSpeed; +} JJKC_PlaybackParams; +static JJKC_PlaybackParams class_JJKC_PlaybackParams; + +jobject JJKC_PlaybackParams__setSpeed(JNIEnv *env, jobject thiz, jfloat speed) +{ + return (*env)->CallObjectMethod(env, thiz, class_JJKC_PlaybackParams.method_setSpeed, speed); +} + +jobject JJKC_PlaybackParams__setSpeed__catchAll(JNIEnv *env, jobject thiz, jfloat speed) +{ + jobject ret_object = JJKC_PlaybackParams__setSpeed(env, thiz, speed); + if (JJK_ExceptionCheck__catchAll(env) || !ret_object) { + return NULL; + } + + return ret_object; +} + +jobject JJKC_PlaybackParams__setSpeed__asGlobalRef__catchAll(JNIEnv *env, jobject thiz, jfloat speed) +{ + jobject ret_object = NULL; + jobject local_object = JJKC_PlaybackParams__setSpeed__catchAll(env, thiz, speed); + if (JJK_ExceptionCheck__catchAll(env) || !local_object) { + ret_object = NULL; + goto fail; + } + + ret_object = JJK_NewGlobalRef__catchAll(env, local_object); + if (!ret_object) { + ret_object = NULL; + goto fail; + } + +fail: + JJK_DeleteLocalRef__p(env, &local_object); + return ret_object; +} + +int JJK_loadClass__JJKC_PlaybackParams(JNIEnv *env) +{ + int ret = -1; + const char *JJK_UNUSED(name) = NULL; + const char *JJK_UNUSED(sign) = NULL; + jclass JJK_UNUSED(class_id) = NULL; + int JJK_UNUSED(api_level) = 0; + + api_level = JJK_GetSystemAndroidApiLevel(env); + + if (api_level < 23) { + ALOGW("JJKLoader: Ignore: '%s' need API %d\n", "android.media.PlaybackParams", api_level); + goto ignore; + } + + sign = "android/media/PlaybackParams"; + class_JJKC_PlaybackParams.id = JJK_FindClass__asGlobalRef__catchAll(env, sign); + if (class_JJKC_PlaybackParams.id == NULL) + goto fail; + + class_id = class_JJKC_PlaybackParams.id; + name = "setSpeed"; + sign = "(F)Landroid/media/PlaybackParams;"; + class_JJKC_PlaybackParams.method_setSpeed = JJK_GetMethodID__catchAll(env, class_id, name, sign); + if (class_JJKC_PlaybackParams.method_setSpeed == NULL) + goto fail; + + ALOGD("JJKLoader: OK: '%s' loaded\n", "android.media.PlaybackParams"); +ignore: + ret = 0; +fail: + return ret; +} diff --git a/ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.h b/ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.h new file mode 100644 index 00000000..cb822cb8 --- /dev/null +++ b/ijkmedia/ijksdl/android/jjk/c/android/media/PlaybackParams.h @@ -0,0 +1,33 @@ +/* + * copyright (c) 2015 Zhang Rui + * + * This file is part of ijkPlayer. + * + * ijkPlayer is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * ijkPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with ijkPlayer; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef JJK__android_media_PlaybackParams__H +#define JJK__android_media_PlaybackParams__H + +#include "ijksdl/android/jjk/internal/jjk_internal.h" + +jobject JJKC_PlaybackParams__setSpeed(JNIEnv *env, jobject thiz, jfloat speed); +jobject JJKC_PlaybackParams__setSpeed__catchAll(JNIEnv *env, jobject thiz, jfloat speed); +jobject JJKC_PlaybackParams__setSpeed__asGlobalRef__catchAll(JNIEnv *env, jobject thiz, jfloat speed); +int JJK_loadClass__JJKC_PlaybackParams(JNIEnv *env); + +#define JJK_HAVE__JJKC_PlaybackParams + +#endif//JJK__android_media_PlaybackParams__H diff --git a/ijkmedia/ijksdl/android/jjk/c/android/os/Bundle.h b/ijkmedia/ijksdl/android/jjk/c/android/os/Bundle.h index dc824d94..c3ddb2a0 100644 --- a/ijkmedia/ijksdl/android/jjk/c/android/os/Bundle.h +++ b/ijkmedia/ijksdl/android/jjk/c/android/os/Bundle.h @@ -54,4 +54,6 @@ void JJKC_Bundle__putParcelableArrayList__withCString(JNIEnv *env, jobject thiz, void JJKC_Bundle__putParcelableArrayList__withCString__catchAll(JNIEnv *env, jobject thiz, const char *key_cstr__, jobject value); int JJK_loadClass__JJKC_Bundle(JNIEnv *env); +#define JJK_HAVE__JJKC_Bundle + #endif//JJK__android_os_Bundle__H diff --git a/ijkmedia/ijksdl/android/jjk/c/java/util/ArrayList.h b/ijkmedia/ijksdl/android/jjk/c/java/util/ArrayList.h index e13a4697..f8605c13 100644 --- a/ijkmedia/ijksdl/android/jjk/c/java/util/ArrayList.h +++ b/ijkmedia/ijksdl/android/jjk/c/java/util/ArrayList.h @@ -30,4 +30,6 @@ jboolean JJKC_ArrayList__add(JNIEnv *env, jobject thiz, jobject object); jboolean JJKC_ArrayList__add__catchAll(JNIEnv *env, jobject thiz, jobject object); int JJK_loadClass__JJKC_ArrayList(JNIEnv *env); +#define JJK_HAVE__JJKC_ArrayList + #endif//JJK__java_util_ArrayList__H diff --git a/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/IjkMediaPlayer.h b/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/IjkMediaPlayer.h index 54f5e966..6e0561da 100644 --- a/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/IjkMediaPlayer.h +++ b/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/IjkMediaPlayer.h @@ -47,4 +47,6 @@ jboolean JJKC_IjkMediaPlayer__onNativeInvoke(JNIEnv *env, jobject weakThiz, jint jboolean JJKC_IjkMediaPlayer__onNativeInvoke__catchAll(JNIEnv *env, jobject weakThiz, jint what, jobject args); int JJK_loadClass__JJKC_IjkMediaPlayer(JNIEnv *env); +#define JJK_HAVE__JJKC_IjkMediaPlayer + #endif//JJK__tv_danmaku_ijk_media_player_IjkMediaPlayer__H diff --git a/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/misc/IMediaDataSource.h b/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/misc/IMediaDataSource.h index 7cfb4224..7e2b739a 100644 --- a/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/misc/IMediaDataSource.h +++ b/ijkmedia/ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/misc/IMediaDataSource.h @@ -31,4 +31,6 @@ void JJKC_IMediaDataSource__close(JNIEnv *env, jobject thiz); void JJKC_IMediaDataSource__close__catchAll(JNIEnv *env, jobject thiz); int JJK_loadClass__JJKC_IMediaDataSource(JNIEnv *env); +#define JJK_HAVE__JJKC_IMediaDataSource + #endif//JJK__tv_danmaku_ijk_media_player_misc_IMediaDataSource__H diff --git a/ijkmedia/ijksdl/android/jjk/internal/jjk_allclasses.c b/ijkmedia/ijksdl/android/jjk/internal/jjk_allclasses.c index d9a1761f..3590ff0c 100644 --- a/ijkmedia/ijksdl/android/jjk/internal/jjk_allclasses.c +++ b/ijkmedia/ijksdl/android/jjk/internal/jjk_allclasses.c @@ -25,6 +25,7 @@ #include "ijksdl/android/jjk/c/android/media/AudioTrack.h" #include "ijksdl/android/jjk/c/android/media/MediaCodec.h" #include "ijksdl/android/jjk/c/android/media/MediaFormat.h" +#include "ijksdl/android/jjk/c/android/media/PlaybackParams.h" #include "ijksdl/android/jjk/c/android/os/Bundle.h" #include "ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/IjkMediaPlayer.h" #include "ijksdl/android/jjk/c/tv/danmaku/ijk/media/player/misc/IMediaDataSource.h" @@ -46,10 +47,11 @@ int JJK_LoadAll__catchAll(JNIEnv *env) // must load before all other android classes JJK_LOAD_CLASS(android_os_Build); - JJK_LOAD_CLASS(AudioTrack); // android_media_AudioTrack - JJK_LOAD_CLASS(MediaCodec); // android_media_MediaCodec - JJK_LOAD_CLASS(MediaFormat); // android_media_MediaFormat - JJK_LOAD_CLASS(Bundle); // android_os_Bundle + JJK_LOAD_CLASS(AudioTrack); // android_media_AudioTrack + JJK_LOAD_CLASS(MediaCodec); // android_media_MediaCodec + JJK_LOAD_CLASS(MediaFormat); // android_media_MediaFormat + JJK_LOAD_CLASS(PlaybackParams); // android_media_PlaybackParams + JJK_LOAD_CLASS(Bundle); // android_os_Bundle JJK_LOAD_CLASS(IjkMediaPlayer); // tv_danmaku_ijk_media_player_IjkMediaPlayer JJK_LOAD_CLASS(IMediaDataSource); // tv_danmaku_ijk_media_player_misc_IMediaDataSource diff --git a/ijkmedia/ijksdl/android/jjk/internal/jjk_internal.h b/ijkmedia/ijksdl/android/jjk/internal/jjk_internal.h index 899bc651..2dba8c6a 100644 --- a/ijkmedia/ijksdl/android/jjk/internal/jjk_internal.h +++ b/ijkmedia/ijksdl/android/jjk/internal/jjk_internal.h @@ -77,6 +77,6 @@ jfieldID JJK_GetStaticFieldID__catchAll(JNIEnv *env, jclass clazz, const char *f jbyteArray JJK_NewByteArray__catchAll(JNIEnv *env, jsize capacity); jbyteArray JJK_NewByteArray__asGlobalRef__catchAll(JNIEnv *env, jsize capacity); -int JJK_GetSystemAndroidApiLevel(); +int JJK_GetSystemAndroidApiLevel(JNIEnv *env); #endif//JJK_INTERNAL_H diff --git a/ijkmedia/ijksdl/android/jjk/java/android/media/AudioTrack.java b/ijkmedia/ijksdl/android/jjk/java/android/media/AudioTrack.java index aafac029..1350a227 100644 --- a/ijkmedia/ijksdl/android/jjk/java/android/media/AudioTrack.java +++ b/ijkmedia/ijksdl/android/jjk/java/android/media/AudioTrack.java @@ -1,6 +1,7 @@ package android.media; @SimpleCClassName +@IncludeUtil public class AudioTrack { public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode); @@ -19,4 +20,9 @@ public class AudioTrack { public int setStereoVolume(float leftGain, float rightGain); public int getAudioSessionId(); + + @MinApi(23) + public PlaybackParams getPlaybackParams(); + @MinApi(23) + void setPlaybackParams(PlaybackParams params); } diff --git a/ijkmedia/ijksdl/android/jjk/java/android/media/PlaybackParams.java b/ijkmedia/ijksdl/android/jjk/java/android/media/PlaybackParams.java new file mode 100644 index 00000000..27e7306b --- /dev/null +++ b/ijkmedia/ijksdl/android/jjk/java/android/media/PlaybackParams.java @@ -0,0 +1,7 @@ +package android.media; + +@SimpleCClassName +@MinApi(23) +public class PlaybackParams { + public PlaybackParams setSpeed(float speed); +} diff --git a/ijkmedia/ijksdl/android/jjk/parser/ast/ast_compilation_unit.cpp b/ijkmedia/ijksdl/android/jjk/parser/ast/ast_compilation_unit.cpp index 198986a2..58a9d817 100644 --- a/ijkmedia/ijksdl/android/jjk/parser/ast/ast_compilation_unit.cpp +++ b/ijkmedia/ijksdl/android/jjk/parser/ast/ast_compilation_unit.cpp @@ -66,9 +66,11 @@ void CompilationUnit::do_build(std::ostream &h_os, std::ostream &c_os) clazz->build_c_func_decl(h_os); h_os << std::endl; - if (clazz->is_include_util()) { + if (clazz->is_simple_c_class_name()) { h_os << "#define JJK_HAVE__" << clazz->get_c_class_name() << std::endl; h_os << std::endl; + } + if (clazz->is_include_util()) { h_os << "#include \"" << clazz->get_name() << ".util.h\"" << std::endl; h_os << std::endl; } diff --git a/ijkmedia/ijksdl/android/jjk/parser/ast/ast_method.cpp b/ijkmedia/ijksdl/android/jjk/parser/ast/ast_method.cpp index 2abc8e3a..0e42e269 100644 --- a/ijkmedia/ijksdl/android/jjk/parser/ast/ast_method.cpp +++ b/ijkmedia/ijksdl/android/jjk/parser/ast/ast_method.cpp @@ -244,6 +244,13 @@ void Method::build_c_member_id_decl(std::ostream &os) void Method::build_c_member_id_load(std::ostream &os) { os << std::endl; + + Annotation *annotation = get_annotation_at("MinApi"); + if (annotation) { + os << build_indent() << "if (JJK_GetSystemAndroidApiLevel(env) >= " << annotation->get_value() << ") {" << std::endl; + increase_build_indent(4); + } + os << build_indent() << "class_id = " << get_this_class()->get_c_jni_id() << ";\n"; os << build_indent() << "name = \"" << get_c_jni_method_name() << "\";\n"; os << build_indent() << "sign = \"" << get_c_jni_sign() << "\";\n"; @@ -251,6 +258,11 @@ void Method::build_c_member_id_load(std::ostream &os) << "(env, class_id, name, sign);\n"; os << build_indent() << "if (" << get_c_jni_id() << " == NULL)\n"; os << build_indent() << " goto fail;\n"; + + if (annotation) { + increase_build_indent(-4); + os << build_indent() << "}" << std::endl; + } } void Method::_build_c_func_string_argument_cast_statements(std::ostream &os, int flags) -- GitLab