diff --git a/ijkmedia/ijksdl/Android.mk b/ijkmedia/ijksdl/Android.mk index 326d27af0905587748820660ee2086f339c9a567..3bb6d8bf7ae8bba0f7c04d7ce355659429df0bd1 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 85d66c59516c7bb7e30e174a5e9bb1ba5675bdf2..a82adb739d1748129f7904876ba2707447b45237 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 9dc52be695c630d73aa031923729ec9ac7d1868b..fed6194e92183a5f88a7d245c60ec3122fcf1b3d 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 b3ad2dea185bf6ffab023a915cd65635b8e2dde7..3fe4c1d6db169a2c6c77eb1bb0787367e952fe7e 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 0000000000000000000000000000000000000000..002ce2948e8bbdea003e35de3ea9eed8d3bcce03 --- /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 0000000000000000000000000000000000000000..8070735745bd1c691e477c249d101da24c3796c6 --- /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 19b8538823da4ad01b547844cea3df339b8f5972..31bf9da260ee0039b5d7b577f0197c497e5db501 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 ee88241ee15bc773623737742ec4c1cf8d6b2351..ad69ff4734e9e7da6ebd5ef49eb594c1992dcbac 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 0000000000000000000000000000000000000000..932a3857ec643f0dbcf8a5be49fffd7f75f88c93 --- /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 0000000000000000000000000000000000000000..cb822cb8a5ab396c4790c215667489aa7593f596 --- /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 dc824d946f921b345391c3694f21f4749e90fd6c..c3ddb2a0229db14fcb1b43b6d5fd0d359d2612c8 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 e13a4697ddfc245082afb16be8444f08c9805a24..f8605c13ed057ff3b27473f1e1c1fa513d930284 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 54f5e966b30bdb131464d5161d15714be75460be..6e0561da28aaa7acd9e6f94614b1bc2178712877 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 7cfb4224e79f10fe395bd928b252c6dfa2cfe568..7e2b739ac3a5ad0826635b201d6fffdb8c51b14a 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 d9a1761fabfee82489301fa4f7742392b78ea6d8..3590ff0c0e523cf2f0119c14cf9aaeedfdb48f57 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 899bc651a78722bdeef7cd184b228b794a353dd9..2dba8c6a92c827f4a54d5e0c985541b16bdf7faf 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 aafac029453a579259f77fd64ce1c65471c956a0..1350a227edf118e3602bc7a895ccbd761ab2741c 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 0000000000000000000000000000000000000000..27e7306ba292d051d4510240632a4f9587b56c95 --- /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 198986a23f329365eb2413130aaedeeb74db12b3..58a9d817ffab9599ad4b8dbfb33f9e5c0337199d 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 2abc8e3a674cf349cf7f19dec1c9442032e3364a..0e42e269844dfc4bf3c91f748bc4fc6b87a7d003 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)