1 /* 2 * Copyright (c) 2021-2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef HISTREAMER_PLUGIN_INTF_AUDIO_SINK_PLUGIN_H 17 #define HISTREAMER_PLUGIN_INTF_AUDIO_SINK_PLUGIN_H 18 19 #include "buffer/avbuffer.h" 20 #include "filter/filter.h" 21 #include "plugin/plugin_caps.h" 22 #include "plugin/plugin_base.h" 23 #include "plugin/plugin_definition.h" 24 25 namespace OHOS { 26 namespace Media { 27 namespace Plugins { 28 /** 29 * @brief Audio Sink Plugin. 30 * 31 * Component that receives media streams. 32 * 33 * @since 1.0 34 * @version 1.0 35 */ 36 struct AudioSinkPlugin : public Plugins::PluginBase { 37 /// constructor AudioSinkPluginAudioSinkPlugin38 explicit AudioSinkPlugin(std::string name): PluginBase(std::move(name)) {} 39 /** 40 * @brief Get the mute operation set for the audio. 41 * 42 * This function can be called in any state except DESTROYED and INVALID. 43 * 44 * @param mute Indicates the mute operation set for the audio. 45 * Value true means that the audio is muted, and false means the opposite. 46 * @return Execution status return 47 * @retval OK: Plugin GetMute succeeded. 48 */ 49 virtual Status GetMute(bool& mute) = 0; 50 51 /** 52 * @brief Set the mute operation for the audio. 53 * 54 * This function can be called in any state except DESTROYED and INVALID. 55 * 56 * @param mute Indicates the mute operation set for the audio. 57 * Value true means that the audio is muted, and false means the opposite. 58 * @return Execution status return 59 * @retval OK: Plugin SetMute succeeded. 60 */ 61 virtual Status SetMute(bool mute) = 0; 62 63 /** 64 * @brief Get the audio volume. 65 * 66 * This function can be called in any state except DESTROYED and INVALID. 67 * 68 * @param volume Indicates the volume to set. The value ranges from 0.0 to 1.0. 69 * @return Execution status return 70 * @retval OK: Plugin GetVolume succeeded. 71 */ 72 virtual Status GetVolume(float& volume) = 0; 73 74 /** 75 * @brief Set the audio volume. 76 * 77 * This function can be called in any state except DESTROYED and INVALID. 78 * 79 * @param volume Indicates the volume to set. The value ranges from 0.0 to 1.0. 80 * @return Execution status return 81 * @retval OK: Plugin SetVolume succeeded. 82 * @retval ERROR_INVALID_DATA: The value is not in the valid range. 83 */ 84 virtual Status SetVolume(float volume) = 0; 85 86 /** 87 * @brief Get the current audio rendering speed. 88 * 89 * This function can be called in any state except DESTROYED and INVALID. 90 * 91 * @param speed Indicates the pointer to the current rendering speed to obtain. 92 * @return Execution status return 93 * @retval OK: Plugin GetSpeed succeeded. 94 */ 95 virtual Status GetSpeed(float& speed) = 0; 96 97 /** 98 * @brief Set the audio rendering speed. 99 * 100 * This function can be called in any state except DESTROYED and INVALID. 101 * 102 * @param speed speed Indicates the pointer to the current rendering speed to obtain. 103 * @return Execution status return 104 * @retval OK: Plugin SetSpeed succeeded. 105 * @retval ERROR_INVALID_DATA: The value is not in the valid range. 106 */ 107 virtual Status SetSpeed(float speed) = 0; 108 109 /** 110 * @brief Get the audioeffect mode. 111 * 112 * This function can be called in any state except DESTROYED and INVALID. 113 * 114 * @param effectMode speed Indicates the pointer to the current audioeffect mode to obtain. 115 * @return Execution status return 116 * @retval OK: Plugin GetAudioEffectMode succeeded. 117 * @retval ERROR_INVALID_DATA: The value is not in the valid range. 118 */ 119 virtual Status GetAudioEffectMode(int32_t &effectMode) = 0; 120 121 /** 122 * @brief Set the audio audioeffect mode. 123 * 124 * This function can be called in any state except DESTROYED and INVALID. 125 * 126 * @param effectMode speed Indicates the pointer to the current audioeffect mode to obtain. 127 * @return Execution status return 128 * @retval OK: Plugin SetAudioEffectMode succeeded. 129 * @retval ERROR_INVALID_DATA: The value is not in the valid range. 130 */ 131 virtual Status SetAudioEffectMode(int32_t effectMode) = 0; 132 133 /** 134 * @brief Pauses audio rendering 135 * 136 * The function is valid only in the RUNNING state. If the pause is successful, 137 * the plugin enters the PAUSED state. 138 * 139 * @return Execution status return 140 * @retval OK: Plugin Pause succeeded. 141 */ 142 virtual Status Pause() = 0; 143 144 /** 145 * @brief Pauses audio rendering without clear device lists 146 * 147 * The function is valid only in the RUNNING state. If the pause is successful, 148 * the plugin enters the PAUSED state. 149 * 150 * @return Execution status return 151 * @retval OK: Plugin Pause succeeded. 152 */ 153 virtual Status PauseTransitent() = 0; 154 155 /** 156 * @brief Resumes audio rendering 157 * 158 * The function is valid only in the PAUSED state. If the resume is successful, 159 * the plugin enters the RUNNING state. 160 * 161 * @return Execution status return 162 * @retval OK: Plugin Resume succeeded. 163 */ 164 virtual Status Resume() = 0; 165 166 /** 167 * @brief Get the estimated latency of the audio device driver. 168 * 169 * The function is valid only in the after PREPARED state. 170 * 171 * @param hstTime latency times based on {@link HST_TIME_BASE}. 172 * @return Execution status return 173 * @retval OK: Plugin GetLatency succeeded. 174 */ 175 virtual Status GetLatency(uint64_t& hstTime) = 0; 176 177 /** 178 * @brief Get the audio frame size, that is, the length (in bytes) of a frame. 179 * 180 * The function is valid only in the RUNNING state. 181 * 182 * @param size size Indicates the pointer to the audio frame size (in bytes). 183 * @return Execution status return 184 * @retval OK: Plugin GetFrameSize succeeded. 185 */ 186 virtual Status GetFrameSize(size_t& size) = 0; 187 188 /** 189 * @brief Get the number of audio frames in the audio buffer. 190 * 191 * The function is valid only in the RUNNING state. 192 * 193 * @param count Indicates the pointer to the number of audio frames in the audio buffer. 194 * @return Execution status return 195 * @retval OK: Plugin GetFrameCount succeeded. 196 */ 197 virtual Status GetFrameCount(uint32_t& count) = 0; 198 199 /** 200 * @brief Writes a frame of output data into the audio driver for rendering. 201 * 202 * The function is valid only in the RUNNING state. 203 * 204 * @param input Indicates the pointer to the frame to write. 205 * @return Execution status return 206 * @retval OK: Plugin Write succeeded. 207 */ 208 virtual Status Write(const std::shared_ptr<AVBuffer>& input) = 0; 209 210 /** 211 * @brief Flushes data in the audio buffer. 212 * 213 * The function is valid only in after RUNNING state. 214 * 215 * @return Execution status return 216 * @retval OK: Plugin Flush succeeded. 217 */ 218 virtual Status Flush() = 0; 219 220 /** 221 * @brief Drain data to make sure all the data processed. 222 * 223 * The function is valid only in RUNNING state. 224 * 225 * @return Execution status return 226 * @retval OK: Plugin Drain succeeded. 227 */ 228 virtual Status Drain() = 0; 229 230 virtual int64_t GetPlayedOutDurationUs(int64_t nowUs) = 0; 231 232 virtual Status GetFramePosition(int32_t &framePosition) = 0; 233 234 virtual void SetEventReceiver(const std::shared_ptr<Pipeline::EventReceiver>& receiver) = 0; 235 236 virtual int32_t SetVolumeWithRamp(float targetVolume, int32_t duration) = 0; 237 238 virtual Status SetMuted(bool isMuted) = 0; GetSampleFormatAudioSinkPlugin239 virtual AudioSampleFormat GetSampleFormat() 240 { 241 return INVALID_WIDTH; 242 } 243 244 /** 245 * @brief Get time consuming of writing buffer, unit is ms 246 * 247 * The function is valid only in after RUNNING state. 248 * 249 * @return Time consuming of writing buffer, unit is ms 250 */ GetWriteDurationMsAudioSinkPlugin251 virtual int64_t GetWriteDurationMs() { return 0; }; 252 }; 253 254 /// Audio sink plugin api major number. 255 #define AUDIO_SINK_API_VERSION_MAJOR (1) 256 257 /// Audio sink plugin api minor number 258 #define AUDIO_SINK_API_VERSION_MINOR (0) 259 260 /// Audio sink plugin version 261 #define AUDIO_SINK_API_VERSION MAKE_VERSION(AUDIO_SINK_API_VERSION_MAJOR, AUDIO_SINK_API_VERSION_MINOR) 262 263 /** 264 * @brief Describes the audio sink plugin information. 265 * 266 * @since 1.0 267 * @version 1.0 268 */ 269 struct AudioSinkPluginDef : public Plugins::PluginDefBase { AudioSinkPluginDefAudioSinkPluginDef270 AudioSinkPluginDef() 271 { 272 apiVersion = AUDIO_SINK_API_VERSION; ///< Audio sink plugin version. 273 pluginType = Plugins::PluginType::AUDIO_SINK; ///< Plugin type, MUST be AUDIO_SINK. 274 } 275 }; 276 } // namespace Plugin 277 } // namespace Media 278 } // namespace OHOS 279 #endif // HISTREAMER_PLUGIN_INTF_AUDIO_SINK_PLUGIN_H 280