openharmony标准系统移植之音频工作流程分析

首先可以知道js上层应用是通过napi去调用底层函数,首先是通过类似如下的函数去注册一个模块提供给上层app使用。

extern "C" __attribute__((constructor)) void AppRegister()
{
   
    napi_module_register(&appModule);
}

那么我们寻找多媒体相关的注册模块函数,源码在foundation/multimedia/media_standard/frameworks/kitsimpl/js/player/native_module_ohos_media.cpp文件中,

static napi_value Export(napi_env env, napi_value exports)
{
   
    MEDIA_LOGD("Export() is called");
    OHOS::Media::AudioDecoderNapi::Init(env, exports);
    OHOS::Media::AudioEncoderNapi::Init(env, exports);
    OHOS::Media::AudioPlayerNapi::Init(env, exports);
    OHOS::Media::AudioRecorderNapi::Init(env, exports);
    OHOS::Media::MediaCapsNapi::Init(env, exports);
    OHOS::Media::MediaVideoCapsNapi::Init(env, exports);
    OHOS::Media::MediaDataSourceNapi::Init(env, exports);
    OHOS::Media::VideoDecoderNapi::Init(env, exports);
    OHOS::Media::VideoEncoderNapi::Init(env, exports);
    OHOS::Media::VideoPlayerNapi::Init(env, exports);
    OHOS::Media::VideoRecorderNapi::Init(env, exports);
    OHOS::Media::MediaEnumNapi::Init(env, exports);
    return exports;
}

/*
 * module define
 */
static napi_module g_module = {
   
    .nm_version = 1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Export, // 模块导出入口函数
    .nm_modname = "multimedia.media",
    .nm_priv = ((void*)0),
    .reserved = {
   0}
};

/*
 * module register
 */
extern "C" __attribute__((constructor)) void RegisterModule(void)
{
   
    MEDIA_LOGD("RegisterModule() is called");
    napi_module_register(&g_module);
}

系统启动后,使用hilog查看,可以看到注册成功了。
在这里插入图片描述
我们是想确定音频播放的流程,所以我们只关心OHOS::Media::AudioPlayerNapi::Init(env, exports);这个初始化过程。那么我们查找这个类foundation/multimedia/media_standard/interfaces/kits/js/media/include/audio_player_napi.h定义在这个头文件中,

namespace OHOS {
    // 这里是c++的命名空间 OHOS
namespace Media {
    // 这里是c++的命名空间 Media 
class AudioPlayerNapi {
    // 这里是声明类 AudioPlayerNapi
public:
    static napi_value Init(napi_env env, napi_value exports);

private:
    static napi_value Constructor(napi_env env, napi_callback_info info);
    static void Destructor(napi_env env, void *nativeObject, void *finalize);
    static napi_value CreateAudioPlayer(napi_env env, napi_callback_info info);
    static napi_value CreateAudioPlayerAsync(napi_env env, napi_callback_info info);
    static napi_value Play(napi_env env, napi_callback_info info);
    static napi_value Pause(napi_env env, napi_callback_info info);
    static napi_value Stop(napi_env env, napi_callback_info info);
    static napi_value Reset(napi_env env, napi_callback_info info);
    static napi_value Seek(napi_env env, napi_callback_info info);
    static napi_value SetVolume(napi_env env, napi_callback_info info);
    static napi_value Release(napi_env env, napi_callback_info info);
    static napi_value On(napi_env env, napi_callback_info info);
    static napi_value SetSrc(napi_env env, napi_callback_info info);
    static napi_value GetSrc(napi_env env, napi_callback_info info);
    static napi_value GetMediaDataSrc(napi_env env, napi_callback_info info);
    static napi_value SetMediaDataSrc(napi_env env, napi_callback_info info);
    static napi_value SetFdSrc(napi_env env, napi_callback_info info);
    static napi_value GetFdSrc(napi_env env, napi_callback_info info);
    static napi_value SetLoop(napi_env env, napi_callback_info info);
    static napi_value GetLoop(napi_env env, napi_callback_info info);
    static napi_value GetCurrentTime(napi_env env, napi_callback_info info);
    static napi_value GetDuration(napi_env env, napi_callback_info info);
    static napi_value GetState(napi_env env, napi_callback_info info);
    static napi_value GetTrackDescription(napi_env env, napi_callback_info info);
    static void AsyncGetTrackDescription(napi_env env, void *data);
    void ErrorCallback(MediaServiceExtErrCode errCode);
    AudioPlayerNapi();
    ~AudioPlayerNapi();

    static napi_ref constructor_;
    std::shared_ptr<MediaDataSourceCallback> dataSrcCallBack_ = nullptr;
    napi_env env_ = nullptr;
    napi_ref wrapper_ = nullptr;
    std::shared_ptr<Player> nativePlayer_ = nullptr;
    std::shared_ptr<PlayerCallback> callbackNapi_ = nullptr;
    std::string uri_ = "";
    std::vector<Format> audioTrackInfoVec_;
    AVFileDescriptor rawFd_;
};
} // namespace Media
} // namespace OHOS

具体实现的方法定义在文件foundation/multimedia/media_standard/frameworks/kitsimpl/js/player/audio_player_napi.cpp中,init方法内容如下

napi_value AudioPlayerNapi::Init(<

你可能感兴趣的:(openharmony,音视频,openharmony)