From e9a0ea979bab54d713111d0747a1b75126cea9d0 Mon Sep 17 00:00:00 2001 From: Gloria Date: Mon, 19 Sep 2022 15:39:44 +0800 Subject: [PATCH] add av_session (EN) Signed-off-by: wusongqing --- en/native_sdk/media/av_session/av_session.h | 225 +++++ .../media/av_session/avcontrol_command.h | 262 ++++++ en/native_sdk/media/av_session/avmeta_data.h | 783 ++++++++++++++++++ .../media/av_session/avplayback_state.h | 467 +++++++++++ .../media/av_session/avsession_controller.h | 211 +++++ .../media/av_session/avsession_descriptor.h | 146 ++++ .../media/av_session/avsession_errors.h | 91 ++ .../media/av_session/avsession_info.h | 330 ++++++++ .../media/av_session/avsession_manager.h | 200 +++++ .../media/av_session/avsession_pixel_map.h | 151 ++++ 10 files changed, 2866 insertions(+) create mode 100644 en/native_sdk/media/av_session/av_session.h create mode 100644 en/native_sdk/media/av_session/avcontrol_command.h create mode 100644 en/native_sdk/media/av_session/avmeta_data.h create mode 100644 en/native_sdk/media/av_session/avplayback_state.h create mode 100644 en/native_sdk/media/av_session/avsession_controller.h create mode 100644 en/native_sdk/media/av_session/avsession_descriptor.h create mode 100644 en/native_sdk/media/av_session/avsession_errors.h create mode 100644 en/native_sdk/media/av_session/avsession_info.h create mode 100644 en/native_sdk/media/av_session/avsession_manager.h create mode 100644 en/native_sdk/media/av_session/avsession_pixel_map.h diff --git a/en/native_sdk/media/av_session/av_session.h b/en/native_sdk/media/av_session/av_session.h new file mode 100644 index 00000000..807b4d58 --- /dev/null +++ b/en/native_sdk/media/av_session/av_session.h @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVSESSION_H +#define OHOS_AVSESSION_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file av_session.h + * + * @brief 会话的设置、获取等声明。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include + +#include "avsession_info.h" +#include "want_agent.h" +#include "avsession_controller.h" + +namespace OHOS::AVSession { +/** + * @brief 会话对象,支持配置会话属性,并可主动更新播放状态和会话元数据。 + */ +class AVSession { +public: + + /** + * @brief 会话类型的枚举。 + * + * @since 9 + * @version 1.0 + */ + enum { + /** 无效会话 */ + SESSION_TYPE_INVALID = -1, + /** 音频会话 */ + SESSION_TYPE_AUDIO = 0, + /** 视频会话 */ + SESSION_TYPE_VIDEO = 1 + }; + + /** + * @brief 获取会话的标识。 + * + * @return 返回会话的标识。 + * @since 9 + * @version 1.0 + */ + virtual std::string GetSessionId() = 0; + + /** + * @brief 获取会话元数据。 + * + * @param meta 用于保存会话的元数据{@link AVMetaData}对象。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see SetAVMetaData + * @since 9 + * @version 1.0 + */ + virtual int32_t GetAVMetaData(AVMetaData& meta) = 0; + + /** + * @brief 设置会话元数据。 + * + * @param meta 用于修改会话的元数据{@link AVMetaData}对象。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see GetAVMetaData + * @since 9 + * @version 1.0 + */ + virtual int32_t SetAVMetaData(const AVMetaData& meta) = 0; + + /** + * @brief 获取音视频的播放状态。 + * + * @param state 用于保存播放状态的{@link AVPlaybackState}对象。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see SetAVPlaybackState + * @since 9 + * @version 1.0 + */ + virtual int32_t GetAVPlaybackState(AVPlaybackState& state) = 0; + + /** + * @brief 设置音视频的播放状态。 + * + * @param state 用于修改播放状态的{@link AVPlaybackState}对象。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see GetAVPlaybackState + * @since 9 + * @version 1.0 + */ + virtual int32_t SetAVPlaybackState(const AVPlaybackState& state) = 0; + + /** + * @brief 设置一个WantAgent用于启动会话的Ability。 + * + * @param ability 具体的应用对应的能力,类型为{@link AbilityRuntime::WantAgent::WantAgent}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see AVSessionController#GetLaunchAbility + * @since 9 + * @version 1.0 + */ + virtual int32_t SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent& ability) = 0; + + /** + * @brief 获取会话控制器。 + * + * @return 返回会话控制器,{@link AVSessionController}类型智能指针。 + * @since 9 + * @version 1.0 + */ + virtual std::shared_ptr GetController() = 0; + + /** + * @brief 注册会话回调。 + * + * @param callback 用于注册会话回调的{@link AVSessionCallback}对象。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t RegisterCallback(const std::shared_ptr& callback) = 0; + + /** + * @brief 激活会话。 + * + * 激活成功后,会话才可以接收控制指令。 + * + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see Deactivate + * @see IsActive + * @since 9 + * @version 1.0 + */ + virtual int32_t Activate() = 0; + + /** + * @brief 去激活会话。 + * + * 去激活成功后,表示会话还不能接收控制指令。 + * + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see Activate + * @see IsActive + * @since 9 + * @version 1.0 + */ + virtual int32_t Deactivate() = 0; + + /** + * @brief 获取会话是否被激活。 + * + * @return 如果是激活状态,则返回true;否则返回false。 + * @see Activate + * @see Deactivate + * @since 9 + * @version 1.0 + */ + virtual bool IsActive() = 0; + + /** + * @brief 销毁会话。 + * + * 如果应用要创建一个新会话,必须要销毁之前的会话,否则会创建失败。 + * + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t Destroy() = 0; + + /** + * @brief 添加支持的控制命令。 + * + * @param cmd 待添加的控制命令,范围为{@link #SESSION_CMD_INVALID}到{@link #SESSION_CMD_MAX}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t AddSupportCommand(const int32_t cmd) = 0; + + /** + * @brief 删除支持的控制命令。 + * + * @param cmd 待删除的控制命令,范围为{@link #SESSION_CMD_INVALID}到{@link #SESSION_CMD_MAX}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t DeleteSupportCommand(const int32_t cmd) = 0; + + virtual ~AVSession() = default; +}; +} // namespace OHOS::AVSession +/** @} */ +#endif // OHOS_AVSESSION_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avcontrol_command.h b/en/native_sdk/media/av_session/avcontrol_command.h new file mode 100644 index 00000000..285c7b66 --- /dev/null +++ b/en/native_sdk/media/av_session/avcontrol_command.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVCONTROL_COMMAND_H +#define OHOS_AVCONTROL_COMMAND_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avcontrol_command.h + * + * @brief 音视频控制指令的设置、获取、拷贝等声明。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include +#include +#include + +#include "parcel.h" + +namespace OHOS::AVSession { +/** + * @brief 用于描述音视频播控命令工具类,播控命令的封装对象,支持设置和获取控制命令。 + */ +class AVControlCommand : public Parcelable { +public: + /** + * @brief 操作指令。 + */ + enum { + /** 无效指令,内部用于判断指令是否有效 */ + SESSION_CMD_INVALID = -1, + /** 播放 */ + SESSION_CMD_PLAY = 0, + /** 暂停 */ + SESSION_CMD_PAUSE = 1, + /** 停止 */ + SESSION_CMD_STOP = 2, + /** 播放下一首 */ + SESSION_CMD_PLAY_NEXT = 3, + /** 播放上一首 */ + SESSION_CMD_PLAY_PREVIOUS = 4, + /** 快进 */ + SESSION_CMD_FAST_FORWARD = 5, + /** 快退 */ + SESSION_CMD_REWIND = 6, + /** 跳播 */ + SESSION_CMD_SEEK = 7, + /** 设置播放倍数 */ + SESSION_CMD_SET_SPEED = 8, + /** 设置循环模式 */ + SESSION_CMD_SET_LOOP_MODE = 9, + /** 收藏 */ + SESSION_CMD_TOGGLE_FAVORITE = 10, + /** 无效指令,内部用于判断指令是否有效 */ + SESSION_CMD_MAX = 11 + }; + + AVControlCommand(); + ~AVControlCommand() override; + + /** + * @brief IPC通信数据反序列化。 + * + * @param data 序列化对象{@link Parcel}。 + * @return 返回AVControlCommand的函数指针。 + * @see Marshalling + * @since 9 + * @version 1.0 + */ + static AVControlCommand *Unmarshalling(Parcel &data); + + /** + * @brief IPC通信数据序列化。 + * + * @param parcel 保存序列化值的对象{@link Parcel}。 + * @return 成功返回true;否则,返回false。 + * @see Unmarshalling + * @since 9 + * @version 1.0 + */ + bool Marshalling(Parcel &parcel) const override; + + /** + * @brief 判断当前指令是否在有效范围内。 + * + * @return 如果cmd_在有效范围内,范围在{@link #SESSION_CMD_INVALID}到@{link #SESSION_CMD_MAX}之间, + * 返回true;否则,返回false。 + * @since 9 + * @version 1.0 + */ + bool IsValid() const; + + /** + * @brief 设置操作指令。 + * + * @param cmd 操作指令,范围在{@link #SESSION_CMD_INVALID}到{@link #SESSION_CMD_MAX}之间。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see GetCommand + * @since 9 + * @version 1.0 + */ + int32_t SetCommand(int32_t cmd); + + /** + * @brief 获取操作指令。 + * + * @return 返回操作指令,范围在{@link #SESSION_CMD_INVALID}到{@link #SESSION_CMD_MAX}之间。 + * @see SetCommand + * @since 9 + * @version 1.0 + */ + int32_t GetCommand() const; + + /** + * @brief 设置媒体播放倍数。 + * + * @param speed 媒体播放倍数,需大于0。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see GetSpeed + * @since 9 + * @version 1.0 + */ + int32_t SetSpeed(double speed); + + /** + * @brief 获取媒体播放倍数 + * + * @param speed 媒体播放倍数,返回值。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see SetSpeed + * @since 9 + * @version 1.0 + */ + int32_t GetSpeed(double &speed) const; + + /** + * @brief 设置媒体跳播时间。 + * + * @param time 媒体资源的位置,从媒体资源开头开始计算,单位为ms。取值需大于等于0。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see GetSeekTime + * @since 9 + * @version 1.0 + */ + int32_t SetSeekTime(int64_t time); + + /** + * @brief 获取媒体跳播时间。 + * + * @param time 媒体资源的位置,从媒体资源开头开始计算,单位为ms。取值需大于等于0。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see SetSeekTime + * @since 9 + * @version 1.0 + */ + int32_t GetSeekTime(int64_t &time) const; + + /** + * @brief 设置媒体循环模式。 + * + * @param mode 媒体循环模式, + * 取值在 {@link AVPlaybackState#LOOP_MODE_SEQUENCE}到{@link AVPlaybackState#LOOP_MODE_SHUFFLE}之间。 + * @see GetLoopMode + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + int32_t SetLoopMode(int32_t mode); + + /** + * @brief 获取媒体循环模式。 + * + * @param mode 保存媒体循环模式。 + * 取值在 {@link AVPlaybackState#LOOP_MODE_SEQUENCE}到{@link AVPlaybackState#LOOP_MODE_SHUFFLE}之间。 + * @see SetLoopMode + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + int32_t GetLoopMode(int32_t &mode) const; + + /** + * @brief 设置媒体id。 + * + * @param assetId 媒体id,不可为空。 + * @see GetAssetId + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + int32_t SetAssetId(const std::string &assetId); + + /** + * @brief 获取媒体id。 + * + * @param assetId 保存媒体id。 + * @see SetAssetId + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + int32_t GetAssetId(std::string &assetId) const; + + /** + * @brief 命令数组,用于分布式业务,判断是否支持某个命令。 + * + * @since 9 + * @version 1.0 + */ + const static inline std::vector localCapability { + SESSION_CMD_PLAY, + SESSION_CMD_PAUSE, + SESSION_CMD_STOP, + SESSION_CMD_PLAY_NEXT, + SESSION_CMD_PLAY_PREVIOUS, + SESSION_CMD_FAST_FORWARD, + SESSION_CMD_REWIND, + SESSION_CMD_SEEK, + SESSION_CMD_SET_SPEED, + SESSION_CMD_SET_LOOP_MODE, + SESSION_CMD_TOGGLE_FAVORITE, + }; + +private: + /** 操作指令{@link #SESSION_CMD_INVALID} */ + int32_t cmd_ = SESSION_CMD_INVALID; + /** 操作指令对应的值,分别对应 + * {@link #SetLoopMode},{@link #SetSeekTime},{@link #SetSpeed},{@link #SetAssetId} + */ + std::variant param_; +}; +} +/** @} */ +#endif // OHOS_AVCONTROL_COMMAND_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avmeta_data.h b/en/native_sdk/media/av_session/avmeta_data.h new file mode 100644 index 00000000..e4b96ea3 --- /dev/null +++ b/en/native_sdk/media/av_session/avmeta_data.h @@ -0,0 +1,783 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVMETA_DATA_H +#define OHOS_AVMETA_DATA_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avmeta_data.h + * + * @brief 会话元数据设置、获取、拷贝等接口声明。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include +#include +#include +#include "parcel.h" +#include "avsession_pixel_map.h" + +#if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM) +#include +#endif + +namespace OHOS::AVSession { +/** + * @brief 会话元数据类,提供获取metadata进程间传递的序列化和反序列话及数据拷贝的接口方法。 + */ +class AVMetaData : public Parcelable { +public: + + /** + * @brief 持续时间全局变量宏定义。 + * + * @since 9 + * @version 1.0 + */ + static constexpr std::int64_t DURATION_ALWAYS_PLAY = -1; + + /** + * @brief 会话元数据具体枚举项。 + */ + enum { + /** 曲目ID */ + META_KEY_ASSET_ID = 0, + /** 标题 */ + META_KEY_TITLE = 1, + /** 艺术家 */ + META_KEY_ARTIST = 2, + /** 制作人 */ + META_KEY_AUTHOR = 3, + /** 专辑 */ + META_KEY_ALBUM = 4, + /** 作词 */ + META_KEY_WRITER = 5, + /** 作曲 */ + META_KEY_COMPOSER = 6, + /** 媒体时长 */ + META_KEY_DURATION = 7, + /** 媒体影像 */ + META_KEY_MEDIA_IMAGE = 8, + /** 媒体影像路径 */ + META_KEY_MEDIA_IMAGE_URI = 9, + /** 曲目发布日期 */ + META_KEY_PUBLISH_DATE = 10, + /** 子标题 */ + META_KEY_SUBTITLE = 11, + /** 曲目描述 */ + META_KEY_DESCRIPTION = 12, + /** 歌词 */ + META_KEY_LYRIC = 13, + /** 上一曲 */ + META_KEY_PREVIOUS_ASSET_ID = 14, + /** 下一曲 */ + META_KEY_NEXT_ASSET_ID = 15, + /** 无效指令,内部用来判断会话元数据是否有效 */ + META_KEY_MAX = 16 + }; + + /** + * @brief 引入掩码标记需要拷贝的会话元数据。 + * + * @since 9 + * @version 1.0 + */ + using MetaMaskType = std::bitset; + + /** + * @brief 会话元数据默认构造函数。 + * @since 9 + * @version 1.0 + */ + AVMetaData() = default; + + /** + * @brief 会话元数据默认析构函数。 + * @since 9 + * @version 1.0 + */ + ~AVMetaData() override = default; + { +#if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM) +#if defined(__BIONIC__) + mallopt(M_PURGE, 0); +#endif +#endif + } + + /** + * @brief 实现会话元数据进程间传递的反序列化。 + * + * @param data 序列化对象{@link Parcel}。 + * @return 如果反序列化成功,返回AVMetaData类型指针;失败则返回nullptr。 + * @see Marshalling + * @since 9 + * @version 1.0 + */ + static AVMetaData *Unmarshalling(Parcel& data); + + /** + * @brief 实现会话元数据进程间传递的序列化。 + * + * @param data 保存序列化值的对象{@link Parcel}。 + * @return 如果序列化成功,则返回true;如果操作失败,则返回false。 + * @see Unmarshalling + * @since 9 + * @version 1.0 + */ + bool Marshalling(Parcel& data) const override; + + /** + * @brief 设置曲目ID。 + * + * @param assetId 曲目ID,不可为空。 + * @see GetAssetId + * @since 9 + * @version 1.0 + */ + void SetAssetId(const std::string& assetId); + + /** + * @brief 获取曲目ID。 + * + * @return 返回曲目ID。 + * @see SetAssetId + * @since 9 + * @version 1.0 + */ + std::string GetAssetId() const; + + /** + * @brief 设置标题。 + * + * @param title 标题。 + * @see GetTitle + * @since 9 + * @version 1.0 + */ + void SetTitle(const std::string& title); + + /** + * @brief 获取标题。 + * + * @return 返回标题。 + * @see SetTitle + * @since 9 + * @version 1.0 + */ + std::string GetTitle() const; + + /** + * @brief 设置艺术家名称。 + * + * @param artist 艺术家名称。 + * @see GetArtist + * @since 9 + * @version 1.0 + */ + void SetArtist(const std::string& artist); + + /** + * @brief 获取艺术家名称。 + * + * @return 返回艺术家名称。 + * @see SetArtist + * @since 9 + * @version 1.0 + */ + std::string GetArtist() const; + + /** + * @brief 设置制作人名称。 + * + * @param author 制作人名称。 + * @see GetArtist + * @since 9 + * @version 1.0 + */ + void SetAuthor(const std::string& author); + + /** + * @brief 获取制作人名称。 + * + * @return 返回制作人名称。 + * @see SetAuthor + * @since 9 + * @version 1.0 + */ + std::string GetAuthor() const; + + /** + * @brief 设置专辑名称。 + * + * @param album 专辑名称。 + * @see GetAlbum + * @since 9 + * @version 1.0 + */ + void SetAlbum(const std::string& album); + + /** + * @brief 获取专辑名称。 + * + * @return 返回专辑名称。 + * @see SetAlbum + * @since 9 + * @version 1.0 + */ + std::string GetAlbum() const; + + /** + * @brief 设置作词名称。 + * + * @param writer 作词名称。 + * @see GetWriter + * @since 9 + * @version 1.0 + */ + void SetWriter(const std::string& writer); + + /** + * @brief 获取作词名称。 + * + * @return 返回作词名称。 + * @see SetWriter + * @since 9 + * @version 1.0 + */ + std::string GetWriter() const; + + /** + * @brief 设置作曲名称。 + * + * @param composer 作曲名称。 + * @see GetComposer + * @since 9 + * @version 1.0 + */ + void SetComposer(const std::string& composer); + + /** + * @brief 获取作曲名称。 + * + * @return 返回作曲名称。 + * @see SetComposer + * @since 9 + * @version 1.0 + */ + std::string GetComposer() const; + + /** + * @brief 设置媒体时长。 + * + * @param duration 媒体时长,必须大于等于-1,单位为ms 。 + * @see GetDuration + * @since 9 + * @version 1.0 + */ + void SetDuration(int64_t duration); + + /** + * @brief 获取媒体时长。 + * + * @return 返回媒体时长,单位为ms。 + * @see SetDuration + * @since 9 + * @version 1.0 + */ + int64_t GetDuration() const; + + /** + * @brief 设置媒体图片。 + * + * @param mediaImage 媒体图片{@link AVSessionPixelMap}。 + * @see GetMediaImage + * @since 9 + * @version 1.0 + */ + void SetMediaImage(const std::shared_ptr& mediaImage); + + /** + * @brief 获取媒体图片。 + * + * @return 返回媒体图片{@link AVSessionPixelMap}。 + * @see SetMediaImage + * @since 9 + * @version 1.0 + */ + std::shared_ptr GetMediaImage() const; + + /** + * @brief 设置媒体图片url。 + * + * @param mediaImageUri 媒体图片url。 + * @see GetMediaImageUri + * @since 9 + * @version 1.0 + */ + void SetMediaImageUri(const std::string& mediaImageUri); + + /** + * @brief 获取媒体图片url。 + * + * @return 返回媒体图片url。 + * @see SetMediaImageUri + * @since 9 + * @version 1.0 + */ + std::string GetMediaImageUri() const; + + /** + * @brief 设置曲目发布日期,时间戳,单位为ms。 + * + * @param date 曲目发布日期,时间戳,单位为ms。 + * @see GetPublishDate + * @since 9 + * @version 1.0 + */ + void SetPublishDate(double date); + + /** + * @brief 获取曲目发布日期,时间戳,单位为ms。 + * + * @return 返回曲目发布日期,时间戳,单位为ms。 + * @see SetPublishDate + * @since 9 + * @version 1.0 + */ + double GetPublishDate() const; + + /** + * @brief 设置子标题。 + * + * @param subTitle 子标题。 + * @see GetSubTitle + * @since 9 + * @version 1.0 + */ + void SetSubTitle(const std::string& subTitle); + + /** + * @brief 获取子标题。 + * + * @return 返回子标题。 + * @see SetSubTitle + * @since 9 + * @version 1.0 + */ + std::string GetSubTitle() const; + + /** + * @brief 设置曲目描述。 + * + * @param description 曲目描述。 + * @see GetDescription + * @since 9 + * @version 1.0 + */ + void SetDescription(const std::string& description); + + /** + * @brief 获取曲目描述。 + * + * @return 返回曲目描述。 + * @see SetDescription + * @since 9 + * @version 1.0 + */ + std::string GetDescription() const; + + /** + * @brief 设置歌词。 + * + * @param lyric 歌词。 + * @see GetLyric + * @since 9 + * @version 1.0 + */ + void SetLyric(const std::string& lyric); + + /** + * @brief 获取歌词。 + * + * @return 返回歌词。 + * @see SetLyric + * @since 9 + * @version 1.0 + */ + std::string GetLyric() const; + + /** + * @brief 设置上一曲曲目ID。 + * + * @param assetId 上一曲曲目ID。 + * @see GetPreviousAssetId + * @since 9 + * @version 1.0 + */ + void SetPreviousAssetId(const std::string& assetId); + + /** + * @brief 获取上一曲曲目ID。 + * + * @return 返回上一曲曲目ID。 + * @see SetPreviousAssetId + * @since 9 + * @version 1.0 + */ + std::string GetPreviousAssetId() const; + + /** + * @brief 设置下一曲曲目ID。 + * + * @param assetId 下一曲曲目ID。 + * @see GetNextAssetId + * @since 9 + * @version 1.0 + */ + void SetNextAssetId(const std::string& assetId); + + /** + * @brief 获取下一曲曲目ID。 + * + * @return 返回下一曲曲目ID。 + * @see SetNextAssetId + * @since 9 + * @version 1.0 + */ + std::string GetNextAssetId() const; + + /** + * @brief 重置所有会话元数据项。 + * + * @since 9 + * @version 1.0 + */ + void Reset(); + + /** + * @brief 获取掩码。 + * + * @return 返回掩码{@link MetaMaskType}。 + * @since 9 + * @version 1.0 + */ + MetaMaskType GetMetaMask() const; + + /** + * @brief 根据metadata掩码,将metadata项复制到metaOut。 + * + * @param mask metadata掩码{@link MetaMaskType}。 + * @param metaOut metadata已拷贝成功的出参{@link AVMetaData}。 + * @return 成功返回true;失败则返回false。 + * @since 9 + * @version 1.0 + */ + bool CopyToByMask(MetaMaskType& mask, AVMetaData& metaOut) const; + + /** + * @brief 根据metaIn元掩码的设置位从metaIn复制metadata项。 + * + * @param metaIn:会话元数据将要拷贝的入参{@link AVMetaData}。 + * @return 成功返回true;失败则返回false。 + * @since 9 + * @version 1.0 + */ + bool CopyFrom(const AVMetaData& metaIn); + + /** + * @brief 会话元数据有效性判断。 + * + * @return 有效返回true;无效则返回false。 + * @since 9 + * @version 1.0 + */ + bool IsValid() const; + + /** + * @brief 会话元数据数组,用于分布式业务,设置会话属性。 + * + * @since 9 + * @version 1.0 + */ + const static inline std::vector localCapability { + META_KEY_ASSET_ID, + META_KEY_TITLE, + META_KEY_ARTIST, + META_KEY_AUTHOR, + META_KEY_ALBUM, + META_KEY_WRITER, + META_KEY_COMPOSER, + META_KEY_DURATION, + META_KEY_MEDIA_IMAGE, + META_KEY_MEDIA_IMAGE_URI, + META_KEY_PUBLISH_DATE, + META_KEY_SUBTITLE, + META_KEY_DESCRIPTION, + META_KEY_LYRIC, + META_KEY_PREVIOUS_ASSET_ID, + META_KEY_NEXT_ASSET_ID, + }; + +private: + /** 用于记录会话元数据掩码{@link MetaMaskType} */ + MetaMaskType metaMask_; + /** 曲目ID */ + std::string assetId_ = ""; + /** 标题 */ + std::string title_ = ""; + /** 艺术家 */ + std::string artist_ = ""; + /** 制作人 */ + std::string author_ = ""; + /** 专辑 */ + std::string album_ = ""; + /** 作词 */ + std::string writer_ = ""; + /** 作曲 */ + std::string composer_ = ""; + /** 媒体时长 */ + int64_t duration_ = 0; + /** 媒体影像{@link AVSessionPixelMap} */ + std::shared_ptr mediaImage_ = nullptr; + /** 媒体影像路径 */ + std::string mediaImageUri_ = ""; + /** 曲目发布日期,时间戳,单位为ms */ + double publishDate_ = 0; + /** 子标题 */ + std::string subTitle_ = ""; + /** 曲目描述 */ + std::string description_ = ""; + /** 歌词 */ + std::string lyric_ = ""; + /** 上一曲 */ + std::string previousAssetId_ = ""; + /** 下一曲 */ + std::string nextAssetId_ = ""; + + /** + * @brief 将源会话元数据的曲目ID拷贝至目标元数据的曲目ID。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneAssetId(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的标题拷贝至目标会话元数据的标题。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneTitle(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的艺术家拷贝至目标会话元数据的艺术家。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneArtist(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的制作人拷贝至目标会话元数据的制作人。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneAuthor(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的专辑名称拷贝至目标会话元数据的专辑名称。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneAlbum(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的作词拷贝至目标会话元数据的作词。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneWriter(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的作曲人名称拷贝至目标会话元数据的作曲人名称。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneComposer(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的媒体时长拷贝至目标会话元数据的媒体时长。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneDuration(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的图片拷贝至目标会话元数据的图片。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneMediaImage(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的图片url拷贝至目标会话元数据的图片url。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneMediaImageUri(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的发布日期拷贝至目标会话元数据的发布日期。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void ClonePublishData(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的子标题拷贝至目标会话元数据的子标题。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneSubTitle(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的曲目描述拷贝至目标会话元数据的曲目描述。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneDescription(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的歌词拷贝至目标会话元数据的歌词。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @since 9 + * @version 1.0 + */ + static void CloneLyric(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的上一曲拷贝至目标元会话数据的上一曲。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @see CloneNextAssetId + * @since 9 + * @version 1.0 + */ + static void ClonePreviousAssetId(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 将源会话元数据的下一曲拷贝至目标会话元数据的下一曲。 + * + * @param from 源会话元数据{@link AVMetaData}。 + * @param to 目标会话元数据{@link AVMetaData}。 + * @see ClonePreviousAssetId + * @since 9 + * @version 1.0 + */ + static void CloneNextAssetId(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 用于重定义会话元数据拷贝函数指针类型。 + * + * @since 9 + * @version 1.0 + */ + using CloneActionType = void(*)(const AVMetaData& from, AVMetaData& to); + + /** + * @brief 内联函数指针数组中根据具体索引进行对应会话元数据项操作。 + * + * @since 9 + * @version 1.0 + */ + static inline CloneActionType cloneActions[META_KEY_MAX] = { + [META_KEY_ASSET_ID] = &AVMetaData::CloneAssetId, + [META_KEY_TITLE] = &AVMetaData::CloneTitle, + [META_KEY_ARTIST] = &AVMetaData::CloneArtist, + [META_KEY_AUTHOR] = &AVMetaData::CloneAuthor, + [META_KEY_ALBUM] = &AVMetaData::CloneAlbum, + [META_KEY_WRITER] = &AVMetaData::CloneWriter, + [META_KEY_COMPOSER] = &AVMetaData::CloneComposer, + [META_KEY_DURATION] = &AVMetaData::CloneDuration, + [META_KEY_MEDIA_IMAGE] = &AVMetaData::CloneMediaImage, + [META_KEY_MEDIA_IMAGE_URI] = &AVMetaData::CloneMediaImageUri, + [META_KEY_PUBLISH_DATE] = &AVMetaData::ClonePublishData, + [META_KEY_SUBTITLE] = &AVMetaData::CloneSubTitle, + [META_KEY_DESCRIPTION] = &AVMetaData::CloneDescription, + [META_KEY_LYRIC] = &AVMetaData::CloneLyric, + [META_KEY_PREVIOUS_ASSET_ID] = &AVMetaData::ClonePreviousAssetId, + [META_KEY_NEXT_ASSET_ID] = &AVMetaData::CloneNextAssetId, + }; +}; +} // namespace OHOS::AVSession +/** @}*/ +#endif // OHOS_AVMETA_DATA_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avplayback_state.h b/en/native_sdk/media/av_session/avplayback_state.h new file mode 100644 index 00000000..cd925d88 --- /dev/null +++ b/en/native_sdk/media/av_session/avplayback_state.h @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVPLAYBACK_STATE_H +#define OHOS_AVPLAYBACK_STATE_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avplayback_state.h + * + * @brief 音视频播放状态声明。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include + +namespace OHOS::AVSession { +/** + * @brief 音视频播放状态类,提供获取和设置播放界面的信息。 + */ +class AVPlaybackState : public Parcelable { +public: + + /** + * @brief 描述播放状态的枚举。 + * + */ + enum { + /** 初始状态*/ + PLAYBACK_STATE_INITIAL = 0, + /** 缓冲状态*/ + PLAYBACK_STATE_PREPARING = 1, + /** 播放状态*/ + PLAYBACK_STATE_PLAYING = 2, + /** 暂停状态*/ + PLAYBACK_STATE_PAUSED = 3, + /** 快进状态*/ + PLAYBACK_STATE_FAST_FORWARD = 4, + /** 快退状态*/ + PLAYBACK_STATE_REWIND = 5, + /** 停止状态*/ + PLAYBACK_STATE_STOP = 6, + /** 无效类型,内部用于判断状态是否有效 */ + PLAYBACK_STATE_MAX = 7 + }; + + /** + * @brief 播放界面信息的枚举。 + * + */ + enum { + /** 播放状态,包括正在播放、暂停、快进等*/ + PLAYBACK_KEY_STATE = 0, + /** 播放倍数*/ + PLAYBACK_KEY_SPEED = 1, + /** 播放位置*/ + PLAYBACK_KEY_POSITION = 2, + /** 缓冲时间*/ + PLAYBACK_KEY_BUFFERED_TIME = 3, + /** 循环模式*/ + PLAYBACK_KEY_LOOP_MODE = 4, + /** 设置喜欢(收藏)*/ + PLAYBACK_KEY_IS_FAVORITE = 5, + /** 无效类型,内部用于判断key是否有效 */ + PLAYBACK_KEY_MAX = 6 + }; + + /** + * @brief 循环模式的枚举。 + * + */ + enum { + /** 顺序播放*/ + LOOP_MODE_SEQUENCE = 0, + /** 单曲循环*/ + LOOP_MODE_SINGLE = 1, + /** 列表循环*/ + LOOP_MODE_LIST = 2, + /** 随机播放*/ + LOOP_MODE_SHUFFLE = 3 + }; + + /** + * @brief 播放位置的相关信息。 + * + * @since 9 + * @version 1.0 + */ + struct Position { + /** 媒体已经播放的时间点,第x ms,单位为ms */ + int64_t elapsedTime_ {}; + /** 更新的时间戳,单位为ms */ + int64_t updateTime_ {}; + }; + + using PlaybackStateMaskType = std::bitset; + + AVPlaybackState(); + ~AVPlaybackState() override = default; + + /** + * @brief IPC通信数据反序列化。 + * + * 将通过IPC接收的{@link Parcel}类型的信息,反序列化为AVPlaybackState类型的信息。 + * + * @param parcel 序列化对象{@link Parcel}。 + * @return 如果反序列化成功,则返回AVPlaybackState对象; + * 如果反序列化失败,则返回nullptr。 + * @see Marshalling + * @since 9 + * @version 1.0 + */ + static AVPlaybackState* Unmarshalling(Parcel& parcel); + + /** + * @brief IPC通信数据序列化。 + * + * 将AVPlaybackState类型的信息,序列化为{@link Parcel}类型的信息,用来进行IPC通信。 + * + * @param parcel 保存序列化值的对象{@link Parcel}。 + * @return 成功返回true;失败返回false。 + * @see Unmarshalling + * @since 9 + * @version 1.0 + */ + bool Marshalling(Parcel& parcel) const override; + + /** + * @brief 验证当前信息的有效性。 + * + * @return 有效返回true;无效则返回false。 + * @since 9 + * @version 1.0 + */ + bool IsValid() const; + + /** + * @brief 设置音视频的播放状态。 + * + * @param state 音视频的播放状态,范围{@link #PLAYBACK_STATE_INITIAL}到{@link #PLAYBACK_STATE_MAX}之间。 + * @see GetState + * @since 9 + * @version 1.0 + */ + void SetState(int32_t state); + + /** + * @brief 获取当前音视频的播放状态。 + * + * @return 返回当前音视频的播放状态,范围{@link #PLAYBACK_STATE_INITIAL}到{@link #PLAYBACK_STATE_MAX}之间。 + * @see SetState + * @since 9 + * @version 1.0 + */ + int32_t GetState() const; + + /** + * @brief 设置播放倍速。 + * + * @param speed 播放倍速。 + * @see SetSpeed + * @since 9 + * @version 1.0 + */ + void SetSpeed(double speed); + + /** + * @brief 获取当前播放倍速。 + * + * @return 返回当前播放倍速。 + * @see SetSpeed + * @since 9 + * @version 1.0 + */ + double GetSpeed() const; + + /** + * @brief 设置播放位置,通过更新时间与经过时间来计算,单位ms。 + * + * @param position 播放位置{@link Position}。 + * @see GetPosition + * @since 9 + * @version 1.0 + */ + void SetPosition(const Position& position); + + /** + * @brief 获取播放位置。 + * + * @return 返回播放位置{@link Position}。 + * @see SetPosition + * @since 9 + * @version 1.0 + */ + Position GetPosition() const; + + /** + * @brief 设置缓冲时间,单位为ms。 + * + * @param time 缓冲时间。 + * @see GetBufferedTime + * @since 9 + * @version 1.0 + */ + void SetBufferedTime(int64_t time); + + /** + * @brief 获取当前缓冲时间,单位为ms。 + * + * @return 返回缓冲时间。 + * @see SetBufferedTime + * @since 9 + * @version 1.0 + */ + int64_t GetBufferedTime() const; + + /** + * @brief 设置循环模式。 + * + * @param mode 循环模式,范围{@link #LOOP_MODE_SEQUENCE}到{@link #LOOP_MODE_SHUFFLE}之间。 + * @see GetLoopMode + * @since 9 + * @version 1.0 + */ + void SetLoopMode(int32_t mode); + + /** + * @brief 获取当前循环模式。 + * + * @return 返回循环模式,范围{@link #LOOP_MODE_SEQUENCE}到{@link #LOOP_MODE_SHUFFLE}之间。 + * @see SetLoopMode + * @since 9 + * @version 1.0 + */ + int32_t GetLoopMode() const; + + /** + * @brief 设置是否收藏。 + * + * @param isFavorite 是否收藏,是则为true,否则false。 + * @see GetFavorite + * @since 9 + * @version 1.0 + */ + void SetFavorite(bool isFavorite); + + /** + * @brief 获取是否收藏。 + * + * @return 是否收藏,是则返回true,否则返回false。 + * @see SetFavorite + * @since 9 + * @version 1.0 + */ + bool GetFavorite() const; + + /** + * @brief 获取掩码。 + * + * @return 返回播放界面信息的掩码{@link PlaybackStateMaskType}。 + * @see CopyFrom + * @since 9 + * @version 1.0 + */ + PlaybackStateMaskType GetMask() const; + + /** + * @brief 通过掩码拷贝信息到新的AVPlaybackState对象。 + * + * mask对应位上有值的对象拷贝给out。 + * + * @param mask 输入的掩码@{@link PlaybackStateMaskType}。 + * @param out 输出的音视频的播放状态{@link AVPlaybackState}。 + * @return 如果有至少一个播放界面信息被拷贝,返回true;如果一个播放界面信息都没有被拷贝,返回false。 + * @see CopyFrom + * @since 9 + * @version 1.0 + */ + bool CopyToByMask(PlaybackStateMaskType& mask, AVPlaybackState& out) const; + + /** + * @brief 根据当前对象的mask_掩码,将输入的AVPlaybackState类型的信息复制到当前对象。 + * + * @param in AVPlaybackState类型的引用{@link AVPlaybackState}。 + * @return 如果有至少一个播放界面信息被拷贝,返回true;如果一个播放界面信息都没有被拷贝,返回false。 + * @see CopyToByMask + * @see GetMask + * @since 9 + * @version 1.0 + */ + bool CopyFrom(const AVPlaybackState& in); + + /** + * @brief 内联函数指针数组{@link AVPlaybackState},用于分布式业务,设置播放界面信息。 + * + * @since 9 + * @version 1.0 + */ + const static inline std::vector localCapability { + PLAYBACK_KEY_STATE, + PLAYBACK_KEY_SPEED, + PLAYBACK_KEY_POSITION, + PLAYBACK_KEY_BUFFERED_TIME, + PLAYBACK_KEY_LOOP_MODE, + PLAYBACK_KEY_IS_FAVORITE, + }; + +private: + + /** + * @brief 播放界面信息的掩码。 + * + * 对应位置的掩码为1,就说明当前对象包含了这项界面信息{@link PlaybackStateMaskType}。 + */ + PlaybackStateMaskType mask_; + + /** + * @brief 音视频的播放状态{@link #PLAYBACK_STATE_INITIAL}。 + * + */ + int32_t state_ = PLAYBACK_STATE_INITIAL; + + /** + * @brief 播放倍速。 + * + */ + double speed_ = 1.0; + + /** + * @brief 播放位置{@link Position}。 + * + */ + Position position_; + + /** + * @brief 缓冲时间。 + * + */ + int64_t bufferedTime_ {}; + + /** + * @brief 循环模式{@link #LOOP_MODE_SEQUENCE}。 + * + */ + int32_t loopMode_ = LOOP_MODE_SEQUENCE; + + /** + * @brief 是否收藏。 + * + */ + bool isFavorite_ {}; + + /** + * @brief 拷贝音视频的播放状态信息。 + * + * @param from 源{@link AVPlaybackState}。 + * @param to 目标{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + static void CloneState(const AVPlaybackState& from, AVPlaybackState& to); + + /** + * @brief 拷贝播放倍速的信息。 + * + * @param from 源{@link AVPlaybackState}。 + * @param to 目标{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + static void CloneSpeed(const AVPlaybackState& from, AVPlaybackState& to); + + /** + * @brief 拷贝播放位置的信息。 + * + * @param from 源{@link AVPlaybackState}。 + * @param to 目标{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + static void ClonePosition(const AVPlaybackState& from, AVPlaybackState& to); + + /** + * @brief 拷贝缓冲时间的信息法。 + * + * @param from 源{@link AVPlaybackState}。 + * @param to 目标{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + static void CloneBufferedTime(const AVPlaybackState& from, AVPlaybackState& to); + + /** + * @brief 拷贝循环模式的信息。 + * + * @param from 源{@link AVPlaybackState}。 + * @param to 目标{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + static void CloneLoopMode(const AVPlaybackState& from, AVPlaybackState& to); + + /** + * @brief 拷贝是否喜欢的信息。 + * + * @param from 源{@link AVPlaybackState}。 + * @param to 目标{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + static void CloneIsFavorite(const AVPlaybackState& from, AVPlaybackState& to); + + /** + * @brief 定义拷贝信息的函数指针。 + * + * @param from 源{@link AVPlaybackState}。 + * @param to 目标{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + using CloneActionType = void(*)(const AVPlaybackState& from, AVPlaybackState& to); + + /** + * @brief 内联函数指针数组{@link AVPlaybackState}, {@link CloneActionType}。 + * + * 通过访问cloneActions[i]来调用对应的拷贝函数。 + * + */ + static inline CloneActionType cloneActions[PLAYBACK_KEY_MAX] = { + [PLAYBACK_KEY_STATE] = &AVPlaybackState::CloneState, + [PLAYBACK_KEY_SPEED] = &AVPlaybackState::CloneSpeed, + [PLAYBACK_KEY_POSITION] = &AVPlaybackState::ClonePosition, + [PLAYBACK_KEY_BUFFERED_TIME] = &AVPlaybackState::CloneBufferedTime, + [PLAYBACK_KEY_LOOP_MODE] = &AVPlaybackState::CloneLoopMode, + [PLAYBACK_KEY_IS_FAVORITE] = &AVPlaybackState::CloneIsFavorite, + }; +}; +} // namespace OHOS::AVSession +/** @} */ +#endif // OHOS_AVPLAYBACK_STATE_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avsession_controller.h b/en/native_sdk/media/av_session/avsession_controller.h new file mode 100644 index 00000000..5de29603 --- /dev/null +++ b/en/native_sdk/media/av_session/avsession_controller.h @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVSESSION_CONTROLLER_H +#define OHOS_AVSESSION_CONTROLLER_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avsession_controller.h + * + * @brief 控制器对象的描述,可获取会话的播放状态和会话元数据,远程发送控制命令到会话端也可以通过订阅监听会话段的更新事件。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include +#include +#include + +#include "avcontrol_command.h" +#include "avsession_info.h" +#include "key_event.h" +#include "want_agent.h" + +namespace OHOS::AVSession { +/** + * @brief 控制器对象,可获取会话的播放状态和会话元数据,远程发送控制命令到会话端也可以通过订阅监听会话段的更新事件。 + */ +class AVSessionController { +public: + + /** + * @brief 获取音视频的播放状态。 + * + * @param state 音视频的播放状态{@link AVPlaybackState}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see AVSession#SetAVPlaybackState + * @see AVSession#GetAVPlaybackState + * @since 9 + * @version 1.0 + */ + virtual int32_t GetAVPlaybackState(AVPlaybackState &state) = 0; + + /** + * @brief 获取会话元数据。 + * + * @param data 会话元数据{@link AVMetaData}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see AVSession#SetAVMetaData + * @see AVSession#GetAVMetaData + * @since 9 + * @version 1.0 + */ + virtual int32_t GetAVMetaData(AVMetaData &data) = 0; + + /** + * @brief 发送系统按键事件。 + * + * @param keyEvent 按键事件码,类型为{@link MMI::KeyEvent}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see AVSessionManager#SendSystemAVKeyEvent + * @since 9 + * @version 1.0 + */ + virtual int32_t SendAVKeyEvent(const MMI::KeyEvent& keyEvent) = 0; + + /** + * @brief 获取Ability。 + * + * @param ability 类型为{@link AbilityRuntime::WantAgent::WantAgent}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see AVSession#SetLaunchAbility + * @since 9 + * @version 1.0 + */ + virtual int32_t GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent &ability) = 0; + + /** + * @brief 获取媒体有效的指令。 + * + * @param cmds 媒体有效的指令列表,范围为{@link #SESSION_CMD_INVALID}到{@link #SESSION_CMD_MAX}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see SendControlCommand + * @see AVSession#AddSupportCommand + * @see AVSession#DeleteSupportCommand + * @since 9 + * @version 1.0 + */ + virtual int32_t GetValidCommands(std::vector &cmds) = 0; + + /** + * @brief 获取session的激活状态。 + * + * @param isActive session是否激活,类型为{@link AVSessionController}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see AVSession#Activate + * @see AVSession#Deactivate + * @see AVSession#IsActive + * @since 9 + * @version 1.0 + */ + virtual int32_t IsSessionActive(bool &isActive) = 0; + + /** + * @brief 发送媒体控制指令。 + * + * @param cmd 媒体控制指令,类型为{@link AVControlCommand}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see GetValidCommands + * @since 9 + * @version 1.0 + */ + virtual int32_t SendControlCommand(const AVControlCommand &cmd) = 0; + + /** + * @brief 注册回调。 + * + * @param callback 需要注册的回调,类型为{@link AVControllerCallback}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t RegisterCallback(const std::shared_ptr &callback) = 0; + + /** + * @brief 设置会话元数据过滤。 + * + * @param filter 会话元数据过滤,类型为{@link AVMetaData#MetaMaskType}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t SetMetaFilter(const AVMetaData::MetaMaskType &filter) = 0; + + /** + * @brief 设置音视频的播放状态回调过滤。 + * + * @param filter 音视频播放状态回调过滤,类型为{@link AVPlaybackState#PlaybackStateMaskType}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType &filter) = 0; + + /** + * @brief 释放控制器。 + * + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t Destroy() = 0; + + /** + * @brief 获取sessionId。 + * + * @return 返回sessionId。 + * @since 9 + * @version 1.0 + */ + virtual std::string GetSessionId() = 0; + + /** + * @brief 获取播放的实时位置,第 x ms。 + * + * @return 返回播放的实时位置,第x ms,经过校正过的时间,单位为ms。 + * @since 9 + * @version 1.0 + */ + virtual int64_t GetRealPlaybackPosition() = 0; + + /** + * @brief 是否释放控制器。 + * + * @return true:释放;false:不释放。 + * @since 9 + * @version 1.0 + */ + virtual bool IsDestroy() = 0; + + virtual ~AVSessionController() = default; +}; +} // namespace OHOS::AVSession +/** @} */ +#endif // OHOS_AVSESSION_CONTROLLER_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avsession_descriptor.h b/en/native_sdk/media/av_session/avsession_descriptor.h new file mode 100644 index 00000000..d5f6f9d0 --- /dev/null +++ b/en/native_sdk/media/av_session/avsession_descriptor.h @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVSESSION_DESCRIPTOR_H +#define OHOS_AVSESSION_DESCRIPTOR_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avsession_descriptor.h + * + * @brief 会话的相关描述信息。 + * + * @since 9 + * @version 1.0 + */ + +#include "parcel.h" +#include "element_name.h" + +namespace OHOS::AVSession { +/** + * @brief 描述分布式设备的相关信息。 + * + * @since 9 + * @version 1.0 + */ +struct OutputDeviceInfo { + /** 是否连接 */ + bool isRemote_ {}; + /** 分布式设备的id集合 */ + std::vector deviceIds_; + /** 分布式设备的名称集合 */ + std::vector deviceNames_; +}; + +/** + * @brief 会话的相关描述信息。 + * + * @since 9 + * @version 1.0 + */ +struct AVSessionDescriptor { + /** + * @brief 将会话相关描述信息写进包里。 + * + * @param out 写入的会话相关描述信息对象{@link Parcel}。 + * @return 成功返回true;失败则返回false。 + * @see ReadFromParcel + * @since 9 + * @version 1.0 + */ + bool WriteToParcel(Parcel& out) const; + /** + * @brief 对会话相关描述信息进行解包。 + * + * @param in 读出的会话相关描述信息对象{@link Parcel}。 + * @return 成功返回true;失败则返回false。 + * @see WriteToParcel + * @since 9 + * @version 1.0 + */ + bool ReadFromParcel(Parcel &in); + /** 会话的id */ + std::string sessionId_; + /** 会话的类型 */ + int32_t sessionType_ {}; + /** 会话的自定义名称 */ + std::string sessionTag_; + /** 会话所属应用的信息包含bundleName,abilityName等 */ + AppExecFwk::ElementName elementName_; + /** 进程id */ + pid_t pid_ {}; + /** 用户id */ + pid_t uid_ {}; + /** 会话是否为激活状态 */ + bool isActive_ {}; + /** 会话是否是最新的会话 */ + bool isTopSession_ {}; + /** 是否是第三方应用 */ + bool isThirdPartyApp_ {}; + /** 分布式设备相关信息 */ + OutputDeviceInfo outputDeviceInfo_; +}; + +/** + * @brief 会话基础信息描述。 + * + * @since 9 + * @version 1.0 + */ +struct AVSessionBasicInfo { + /** 设备名称 */ + std::string deviceName_ {}; + /** 设备id */ + std::string deviceId_ {}; + /** 供应商id */ + std::string vendorId_ {}; + /** 设备类型 */ + std::string deviceType_ {}; + /** 系统版本 */ + std::string systemVersion_ {}; + /** 会话版本 */ + int32_t sessionVersion_ {}; + /** 备注信息*/ + std::vector reserve_ {}; + /** 特征信息 */ + std::vector feature_ {}; + /** 会话元数据 */ + std::vector metaDataCap_ {}; + /** 支持播放状态数组 */ + std::vector playBackStateCap_ {}; + /** 系统控制命令 */ + std::vector controlCommandCap_ {}; + /** 扩展能力 */ + std::vector extendCapability_ {}; + /** 系统时间 */ + int32_t systemTime_ {}; + /** 扩展信息 */ + std::vector extend_ {}; +}; +} // namespace OHOS::AVSession +#endif // OHOS_AVSESSION_DESCRIPTOR_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avsession_errors.h b/en/native_sdk/media/av_session/avsession_errors.h new file mode 100644 index 00000000..ea5ba604 --- /dev/null +++ b/en/native_sdk/media/av_session/avsession_errors.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVSESSION_ERRORS_H +#define OHOS_AVSESSION_ERRORS_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avsession_errors.h + * + * @brief 定义了avsession错误码。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include "errors.h" + +namespace OHOS::AVSession { +/** 存在错误 */ +constexpr int32_t AVSESSION_ERROR = -1; +/** 操作成功 */ +constexpr int32_t AVSESSION_SUCCESS = 0; +/** avsession错误码的基定义 */ +constexpr int32_t AVSESSION_ERROR_BASE = 1000; +/** 无可用内存 */ +constexpr int32_t ERR_NO_MEMORY = -(AVSESSION_ERROR_BASE + 1); +/** 传递的参数无效 */ +constexpr int32_t ERR_INVALID_PARAM = -(AVSESSION_ERROR_BASE + 2); +/** 服务不存在 */ +constexpr int32_t ERR_SERVICE_NOT_EXIST = -(AVSESSION_ERROR_BASE + 3); +/** Session监听器已存在 */ +constexpr int32_t ERR_SESSION_LISTENER_EXIST = -(AVSESSION_ERROR_BASE + 4); +/** 数据序列化操作错误 */ +constexpr int32_t ERR_MARSHALLING = -(AVSESSION_ERROR_BASE + 5); +/** 数据反序列化操作错误 */ +constexpr int32_t ERR_UNMARSHALLING = -(AVSESSION_ERROR_BASE + 6); +/** IPC发送数据失败 */ +constexpr int32_t ERR_IPC_SEND_REQUEST = -(AVSESSION_ERROR_BASE + 7); +/** 超过允许会话最大数量 */ +constexpr int32_t ERR_SESSION_EXCEED_MAX = -(AVSESSION_ERROR_BASE + 8); +/** 会话不存在 */ +constexpr int32_t ERR_SESSION_NOT_EXIST = -(AVSESSION_ERROR_BASE + 9); +/** 会话命令不支持 */ +constexpr int32_t ERR_COMMAND_NOT_SUPPORT = -(AVSESSION_ERROR_BASE + 10); +/** 控制器不存在 */ +constexpr int32_t ERR_CONTROLLER_NOT_EXIST = -(AVSESSION_ERROR_BASE + 11); +/** 无权限 */ +constexpr int32_t ERR_NO_PERMISSION = -(AVSESSION_ERROR_BASE + 12); +/** 会话未激活 */ +constexpr int32_t ERR_SESSION_DEACTIVE = -(AVSESSION_ERROR_BASE + 13); +/** 控制器存在 */ +constexpr int32_t ERR_CONTROLLER_IS_EXIST = -(AVSESSION_ERROR_BASE + 14); +/** 元能力正在运行 */ +constexpr int32_t ERR_START_ABILITY_IS_RUNNING = -(AVSESSION_ERROR_BASE + 15); +/** 元能力启动超失败 */ +constexpr int32_t ERR_ABILITY_NOT_AVALIABLE = -(AVSESSION_ERROR_BASE + 16); +/** 元能力启动超时 */ +constexpr int32_t ERR_START_ABILITY_TIMEOUT = -(AVSESSION_ERROR_BASE + 17); +/** 指令发送次数超过最大值 */ +constexpr int32_t ERR_COMMAND_SEND_EXCEED_MAX = -(AVSESSION_ERROR_BASE + 18); +/** RPC发送数据失败 */ +constexpr int32_t ERR_RPC_SEND_REQUEST = -(AVSESSION_ERROR_BASE + 19); +} // namespace OHOS::AVSession +/** @} */ +#endif // OHOS_AVSESSION_ERRORS_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avsession_info.h b/en/native_sdk/media/av_session/avsession_info.h new file mode 100644 index 00000000..5c652644 --- /dev/null +++ b/en/native_sdk/media/av_session/avsession_info.h @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVSESSION_INFO_H +#define OHOS_AVSESSION_INFO_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avsession_info.h + * + * @brief 定义了与avsession相关的监听器以及回调功能的实现。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include "avmeta_data.h" +#include "avplayback_state.h" +#include "avsession_descriptor.h" +#include "key_event.h" + +namespace OHOS::AVSession { +/** AVSession死亡回调 */ +using DeathCallback = std::function; + +/** + * @brief 定义与AVSession相关监听器的类的实现。 + * + * @since 9 + * @version 1.0 + */ +class SessionListener { +public: + /** + * @brief 创建AVSession会话的抽象的接口回调方法。 + * + * @param descriptor AVSession的会话描述对象,类型为{@link AVSessionDescriptor}。 + * @see OnSessionRelease + * @since 9 + * @version 1.0 + */ + virtual void OnSessionCreate(const AVSessionDescriptor& descriptor) = 0; + + /** + * @brief 释放AVSession会话的抽象的接口回调方法。 + * + * @param descriptor AVSession的会话描述对象,类型为{@link AVSessionDescriptor}。 + * @see OnSessionCreate + * @since 9 + * @version 1.0 + */ + virtual void OnSessionRelease(const AVSessionDescriptor& descriptor) = 0; + + /** + * @brief AVSession的TOP会话发生变化的抽象的接口回调方法。 + * + * @param descriptor AVSession的会话描述对象,类型为{@link AVSessionDescriptor}。 + * @since 9 + * @version 1.0 + */ + virtual void OnTopSessionChange(const AVSessionDescriptor& descriptor) = 0; + + /** + * @brief SessionListener的默认的析构函数。 + * + * @since 9 + * @version 1.0 + */ + virtual ~SessionListener() = default; +}; + +/** + * @brief 定义AVSession回调类的实现 + * + * @since 9 + * @version 1.0 + */ +class AVSessionCallback { +public: + /** + * @brief AVSession多媒体播放的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnPlay() = 0; + + /** + * @brief AVSession多媒体播放暂停的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnPause() = 0; + + /** + * @brief AVSession多媒体播放停止的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnStop() = 0; + + /** + * @brief AVSession播放下一首多媒体的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnPlayNext() = 0; + + /** + * @brief AVSession播放上一首多媒体的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnPlayPrevious() = 0; + + /** + * @brief AVSession快进播放多媒体的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnFastForward() = 0; + + /** + * @brief AVSession多媒体快退的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnRewind() = 0; + + /** + * @brief AVSession多媒体跳播操作的抽象的回调方法。 + * + * @param time 媒体资源的位置,从媒体资源开头开始计算,单位为ms。取值需大于等于0。 + * @since 9 + * @version 1.0 + */ + virtual void OnSeek(int64_t time) = 0; + + /** + * @brief AVSession设置多媒体倍速播放操作的抽象的回调方法。 + * + * @param speed 多媒体播放的倍速值。 + * @since 9 + * @version 1.0 + */ + virtual void OnSetSpeed(double speed) = 0; + + /** + * @brief AVSession设置多媒体循环播放模式的抽象的回调方法。 + * + * @param loopMode 多媒体循环播放模式, + * 范围在 {@link AVPlaybackState#LOOP_MODE_SEQUENCE}到{@link AVPlaybackState#LOOP_MODE_SHUFFLE}之间。 + * @since 9 + * @version 1.0 + */ + virtual void OnSetLoopMode(int32_t loopMode) = 0; + + /** + * @brief AVSession设置多媒体切换收藏操作的抽象的回调方法。 + * + * @param mediald 多媒体ID号标识。 + * @since 9 + * @version 1.0 + */ + virtual void OnToggleFavorite(const std::string& mediald) = 0; + + /** + * @brief AVSession多媒体按键事件处理的抽象的回调方法。 + * + * @param keyEvent 按键事件码,类型为{@link MMI::KeyEvent}。 + * @since 9 + * @version 1.0 + */ + virtual void OnMediaKeyEvent(const MMI::KeyEvent& keyEvent) = 0; + + /** + * @brief 注册会话输出设备变更监听。 + * + * @param outputDeviceInfo 输出设备信息 {@link OutputDeviceInfo}。 + * @since 9 + * @version 1.0 + */ + virtual void OnOutputDeviceChange(const OutputDeviceInfo& outputDeviceInfo) = 0; + /** + * @brief AVSessionCallback的默认的析构函数。 + * + * @since 9 + * @version 1.0 + */ + virtual ~AVSessionCallback() = default; +}; + +/** + * @brief 定义控制器相关回调操作的类的实现。 + * + * @since 9 + * @version 1.0 + */ +class AVControllerCallback { +public: + /** + * @brief AVSession会话销毁的抽象的回调方法。 + * + * @since 9 + * @version 1.0 + */ + virtual void OnSessionDestroy() = 0; + + /** + * @brief 音视频的播放状态发生改变的抽象的回调方法。 + * + * @param state 音视频的播放状态的枚举值,类型为{@link AVPlaybackState}。 + * @since 9 + * @version 1.0 + */ + virtual void OnPlaybackStateChange(const AVPlaybackState &state) = 0; + + /** + * @brief 会话元数据内容发生变化的抽象的回调方法。 + * + * @param data 会话元数据内容,类型为{@link AVMetaData}。 + * @see AVMetaData + * @since 9 + * @version 1.0 + */ + virtual void OnMetaDataChange(const AVMetaData &data) = 0; + + /** + * @brief 当前会话激活状态发生改变的抽象的回调方法。 + * + * @param isActive 表示是否激活。 + * @since 9 + * @version 1.0 + */ + virtual void OnActiveStateChange(bool isActive) = 0; + + /** + * @brief 控制命令的有效性发生变化的抽象的回调方法。 + * + * @param cmds,媒体有效的指令列表,范围为{@link #SESSION_CMD_INVALID}到{@link #SESSION_CMD_MAX}。 + * @since 9 + * @version 1.0 + */ + virtual void OnValidCommandChange(const std::vector &cmds) = 0; + + /** + * @brief 注册会话输出设备更改。 + * + * @param outputDeviceInfo 输出设备信息 {@link OutputDeviceInfo}。 + * @since 9 + * @version 1.0 + */ + virtual void OnOutputDeviceChange(const OutputDeviceInfo &outputDeviceInfo) = 0; + + /** + * @brief AVControllerCallback的默认的析构函数。 + * + * @since 9 + * @version 1.0 + */ + virtual ~AVControllerCallback() = default; +}; + +/** + * @brief 会话令牌的信息。 + * + * @since 9 + * @version 1.0 + */ +struct SessionToken { + /** 会话id */ + std::string sessionId; + /** 会话的进程id */ + pid_t pid; + /** 用户id */ + uid_t uid; +}; + +/** + * @brief 会话元数据处理标识 + * + * @since 9 + * @version 1.0 + */ +enum SessionDataCategory { + /** 无效类型,内部用于类型是否有效 */ + SESSION_DATA_CATEGORY_INVALID = -1, + /** 会话元数据 */ + SESSION_DATA_META = 0, + /** 会话播放状态 */ + SESSION_DATA_PLAYBACK_STATE = 1, + /** 会话控制命令 */ + SESSION_DATA_CONTROL_COMMAND = 2, + /** 会话数据类型的数量 */ + SESSION_DATA_CATEGORY_MAX = 3, +}; +} // namespace OHOS::AVSession +/** @} */ +#endif // OHOS_AVSESSION_INFO_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avsession_manager.h b/en/native_sdk/media/av_session/avsession_manager.h new file mode 100644 index 00000000..73da20fb --- /dev/null +++ b/en/native_sdk/media/av_session/avsession_manager.h @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AVSESSION_MANAGER_H +#define OHOS_AVSESSION_MANAGER_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avsession_manager.h + * + * @brief 定义了会话管理器对外接口的功能的实现。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include +#include + +#include "audio_system_manager.h" +#include "av_session.h" +#include "avsession_controller.h" +#include "avsession_info.h" +#include "key_event.h" + +namespace OHOS::AVSession { +/** + * @brief 实现会话管理器对外接口功能的类的实现。 + * + * @since 9 + * @version 1.0 + */ +class AVSessionManager { +public: + /** + * @brief 获取会话管理器实例。 + * + * @return 返回会话管理器实例。 + * @since 9 + * @version 1.0 + */ + static AVSessionManager& GetInstance(); + + /** + * @brief 创建AVSession会话的接口方法。 + * + * @param tag AVSession的会话标签,不可为空。 + * @param type AVSession的会话类型, + * 入参为{@link AVSession#SESSION_TYPE_AUDIO},{@link AVSession#SESSION_TYPE_VIDEO}。 + * @param elementName AVSession的会话名称{@link AppExecFwk::ElementName}。 + * @return 返回已创建的会话对象的智能指针。 + * @since 9 + * @version 1.0 + */ + virtual std::shared_ptr CreateSession(const std::string& tag, int32_t type, + const AppExecFwk::ElementName& elementName) = 0; + + /** + * @brief 获取AVSession全部的会话描述的接口方法。 + * + * @return 返回已存在的会话描述对象的数组{@link AVSessionDescriptor}。 + * @since 9 + * @version 1.0 + */ + virtual std::vector GetAllSessionDescriptors() = 0; + + /** + * @brief 获取AVSession全部处于活动状态的会话描述的接口方法。 + * + * @return 返回已存在的处于活动状态的会话描述对象的数组{@link AVSessionDescriptor}。 + * @since 9 + * @version 1.0 + */ + virtual std::vector GetActivatedSessionDescriptors() = 0; + + /** + * @brief 通过会话ID获得会话描述的方法。 + * + * @param sessionId AVSession的会话标签。 + * @param descriptor AVSession的会话类型,类型为{@link AVSessionDescriptor}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t GetSessionDescriptorsBySessionId(const std::string& sessionId, AVSessionDescriptor& descriptor) = 0; + + /** + * @brief 创建AVSession会话控制器的接口方法。 + * + * @param sessionld AVSession的会话ID。 + * @param controller 会话控制器实例,类型为{@link AVSessionController}。 + * @return 返回成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t CreateController(const std::string& sessionId, + std::shared_ptr& controller) = 0; + + /** + * @brief 注册AVSession会话监听器的接口方法。 + * + * @param listener 会话监听器的智能指针,类型为{@link SessionListener}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t RegisterSessionListener(const std::shared_ptr& listener) = 0; + + /** + * @brief 注册AVSession服务器的死亡回调的接口方法。 + * + * @param callback 死亡回调的方法,类型为{@link DeathCallback}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see UnregisterServiceDeathCallback + * @since 9 + * @version 1.0 + */ + virtual int32_t RegisterServiceDeathCallback(const DeathCallback& callback) = 0; + + /** + * @brief 注销AVSession服务器的死亡回调的接口方法。 + * + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @see RegisterServiceDeathCallback + * @since 9 + * @version 1.0 + */ + + virtual int32_t UnregisterServiceDeathCallback() = 0; + + /** + * @brief 发送系统按键事件的接口方法。 + * + * @param keyEvent 按键事件码,类型为{@link MMI::KeyEvent}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t SendSystemAVKeyEvent(const MMI::KeyEvent& keyEvent) = 0; + + /** + * @brief 发送系统控制命令的接口方法。 + * + * @param command 系统控制命令{@link AVControlCommand}。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t SendSystemControlCommand(const AVControlCommand& command) = 0; + + /** + * @brief 将媒体会话投射到远程设备或投射回本地设备。 + * + * @param token 需要投播的会话令牌。 + * @param descriptors 指定要转换的音频设备。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t CastAudio(const SessionToken& token, + const std::vector& descriptors) = 0; + + /** + * @brief 将此设备的所有媒体会话投播到远程设备。 + * + * @param descriptors 指定要转换的音频设备。 + * @return 成功返回{@link #AVSESSION_SUCCESS};失败则返回对应错误码。 + * @since 9 + * @version 1.0 + */ + virtual int32_t CastAudioForAll(const std::vector& descriptors) = 0; +}; +} // namespace OHOS::AVSession +/** @} */ +#endif // OHOS_AVSESSION_MANAGER_H \ No newline at end of file diff --git a/en/native_sdk/media/av_session/avsession_pixel_map.h b/en/native_sdk/media/av_session/avsession_pixel_map.h new file mode 100644 index 00000000..96d1fc1d --- /dev/null +++ b/en/native_sdk/media/av_session/avsession_pixel_map.h @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef OHOS_AVSESSION_PIXEL_MAP_H +#define OHOS_AVSESSION_PIXEL_MAP_H + +/** + * @addtogroup avsession + * @{ + * + * @brief 音视频媒体会话,提供系统内媒体的统一控制能力。 + * + * 功能包括媒体会话,媒体会话管理,媒体会话控制。 + * + * @syscap SystemCapability.Multimedia.AVSession.Core + * @since 9 + * @version 1.0 + */ + +/** + * @file avsession_pixel_map.h + * + * @brief 读取、设置图片及图片信息。 + * + * @since 9 + * @version 1.0 + */ + +#include +#include "parcel.h" + +#if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM) +#include +#endif + +namespace OHOS::AVSession { +/** 初始化容器大小为160KB */ +constexpr size_t DEFAULT_BUFFER_SIZE = 160 * 1024; + +/** + * @brief 读取、设置图片及图片信息。 + * + */ +class AVSessionPixelMap : public Parcelable { +public: + AVSessionPixelMap() = default; + ~AVSessionPixelMap() + { +#if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM) +#if defined(__BIONIC__) + mallopt(M_PURGE, 0); +#endif +#endif + } + + /** + * @brief 实现图片及图片信息的序列化。 + * + * @param data 保存序列化值的对象{@link Parcel}。 + * @return 如果序列化成功,则返回true;失败则返回false。 + * @see Unmarshalling + * @since 9 + * @version 1.0 + */ + bool Marshalling(Parcel &data) const override; + + /** + * @brief 实现图片及图片信息的反序列化。 + * + * @param data 保存反序列化值的对象{@link Parcel}。 + * @return 如果反序列化成功,则返回true;失败则返回false。 + * @see Marshalling + * @since 9 + * @version 1.0 + */ + static AVSessionPixelMap *Unmarshalling(Parcel &data); + + /** + * @brief 获取图片数据。 + * + * @return 返回图片数据。 + * @see SetPixelData + * @since 9 + * @version 1.0 + */ + std::vector GetPixelData() const + { + return data_; + } + + /** + * @brief 设置图片数据。 + * + * @param data 图片数据。 + * @see GetPixelData + * @since 9 + * @version 1.0 + */ + void SetPixelData(const std::vector &data) + { + data_.clear(); + data_ = data; + } + + /** + * @brief 获取图片信息。 + * + * @return 返回图片信息。 + * @see SetImageInfo + * @since 9 + * @version 1.0 + */ + std::vector GetImageInfo() const + { + return imageInfo_; + } + + /** + * @brief 设置图片信息。 + * + * @param imageInfo 图片信息。 + * @see GetImageInfo + * @since 9 + * @version 1.0 + */ + void SetImageInfo(const std::vector &imageInfo) + { + imageInfo_.clear(); + imageInfo_ = imageInfo; + } + +private: + /** 图片数据 */ + std::vector data_ = std::vector(DEFAULT_BUFFER_SIZE); + /** 图片信息 */ + std::vector imageInfo_; +}; +} // namespace OHOS::AVSession +/** @} */ +#endif // OHOS_AVSESSION_PIXEL_MAP_H \ No newline at end of file -- Gitee