提交 88790fa4 编写于 作者: Z Zhang Rui

android/jjk: add android.media.PlaybackParams

上级 c8da1aa0
......@@ -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
......
......@@ -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 \
......
......@@ -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:
......
......@@ -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
/*
* copyright (c) 2015 Zhang Rui <bbcallen@gmail.com>
*
* 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, &params);
}
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;
}
/*
* copyright (c) 2015 Zhang Rui <bbcallen@gmail.com>
*
* 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
......@@ -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
......@@ -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
/*
* copyright (c) 2015 Zhang Rui <bbcallen@gmail.com>
*
* 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;
}
/*
* copyright (c) 2015 Zhang Rui <bbcallen@gmail.com>
*
* 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
......@@ -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
......@@ -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
......@@ -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
......@@ -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
......@@ -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
......
......@@ -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
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);
}
package android.media;
@SimpleCClassName
@MinApi(23)
public class PlaybackParams {
public PlaybackParams setSpeed(float speed);
}
......@@ -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;
}
......
......@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册