首先可以知道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