Android万能音频播放器05

电脑杂谈  发布时间:2019-12-24 17:02:35  来源:网络整理

万能播放器java版_wifi万能解锁器苹果版_传世万能登陆器

加载:判断队列前面能否有数据万能播放器java版,没有的话就是加载状态,否则是播放状况。

主要是C++调用Java方式。

暂停:

(*pcmPlayerPlay)->SetPlayState(pcmPlayerPlay, SL_PLAYSTATE_PAUSED);

播放:

(*pcmPlayerPlay)->SetPlayState(pcmPlayerPlay, SL_PLAYSTATE_PLAYING);

传世万能登陆器_万能播放器java版_wifi万能解锁器苹果版

C++调用Java方法

底层与UI进行交互,先实现接口层:

public interface JfOnLoadingListener {
    /**
     * 加载回调
     * @param loading true :加载中
     *                 false :
     */
    void onLoading(boolean loading);
}

JfPlayer.java

private JfOnLoadingListener jfOnLoadingListener;
public void setJfOnLoadingListener(JfOnLoadingListener jfOnLoadingListener) {
    this.jfOnLoadingListener = jfOnLoadingListener;
}
public void onCallLoading(boolean loading){
    if (jfOnLoadingListener != null) {
        jfOnLoadingListener.onLoading(loading);
    }
}

C++层先实现调用Java代码:

wifi万能解锁器苹果版_传世万能登陆器_万能播放器java版

先在JfCallJava.cpp的构造方式中得到方法ID

jmid_loading = env->GetMethodID(jclz,"onCallLoading","(Z)V");

实现调用Java层方式的技巧:

void JfCallJava::onCallLoading(int threadType, bool loading) {
    if (threadType == MAIN_THREAD){
        jniEnv->CallVoidMethod(jobj,jmid_loading,loading);
    } else if (threadType == CHILD_THREAD){
        JNIEnv *jniEnv;
        if (javaVM->AttachCurrentThread(&jniEnv,0) != JNI_OK){
            if (LOG_DEBUG) {
                LOGE("GET CHILD THREAD JNIENV ERROR");
                return;
            }
        }
        jniEnv->CallVoidMethod(jobj,jmid_loading,loading);
        javaVM->DetachCurrentThread();
    }
}

在JfAudio中调用:

添加头文件后,创建JfCallJava指针,然后从构造方式中传入:

wifi万能解锁器苹果版_万能播放器java版_传世万能登陆器

#include "JfCallJava.h"
JfCallJava *callJava;
JfAudio(JfPlayStatus *playStatus,int sample_rate,JfCallJava *callJava);

然后在JfPlayStatus添加一个全局状况-loading,判断是否在读取状态,JfAudio::resampleAudio()中显示加载:

if (queue->getQueueSize() == 0){//加载状态
    if (!playStatus->loading){
        playStatus->loading = true;
        callJava->onCallLoading(CHILD_THREAD,playStatus->loading);
    }
    continue;
} else {//播放状态
    if (playStatus->loading){
        playStatus->loading = false;
        callJava->onCallLoading(CHILD_THREAD,playStatus->loading);
    }
}

在MainActivity.java中修改:

jfPlayer.setJfOnLoadingListener(new JfOnLoadingListener() {
    @Override
    public void onLoading(boolean loading) {
        if (loading) {
            JfLog.d("加载中。。。");
        } else {
            JfLog.d("播放中。。。");
        }
    }
});

Java层代码,声明native方法,调用native方法万能播放器java版,设置:

传世万能登陆器_万能播放器java版_wifi万能解锁器苹果版

/**
 * 暂停播放
 */
public void pause(){
    n_pause();
    if (jfOnPauseResumeListener != null) {
        jfOnPauseResumeListener.onPause(true);
    }
}
/**
 * 继续播放
 */
public void resume(){
    n_resume();
    if (jfOnPauseResumeListener != null) {
        jfOnPauseResumeListener.onPause(false);
    }
}
private native void n_pause();
private native void n_resume();

native层,

首先,native-lib.cpp调用JfFFmpeg的方式;

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myplayer_player_JfPlayer_n_1pause(JNIEnv *env, jobject instance) {
    // TODO
    if (ffmpeg != NULL){
        ffmpeg->pause();
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myplayer_player_JfPlayer_n_1resume(JNIEnv *env, jobject instance) {
    // TODO
    if (ffmpeg != NULL){
        ffmpeg->resume();
    }
}

然后,JfFFmpeg调用JfAudio方法;

void JfFFmpeg::pause() {
    if (audio != NULL){
        audio->pause();
    }
}
void JfFFmpeg::resume() {
    if (audio != NULL){
        audio->resume();
    }
}

最后,JfAudio.cpp中实现:

void JfAudio::pause() {
    if (pcmPlayerObject != NULL){
        (*pcmPlayerPlay)->SetPlayState(pcmPlayerPlay,  SL_PLAYSTATE_PAUSED);
    }
}
void JfAudio::resume() {
    if (pcmPlayerObject != NULL){
        (*pcmPlayerPlay)->SetPlayState(pcmPlayerPlay,  SL_PLAYSTATE_PLAYING);
    }
}

到此处就完成了加载、暂停播放和再次播放的流程!


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-134506-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 姒文命
        姒文命

        领海的一切来犯之敌要痛击

      • 赵小颖
        赵小颖

        自相矛盾前后不一似是而非的东西多的是

      热点图片
      拼命载入中...