1 /* 2 * Copyright (c) 2022-2022 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_AU_SERVER_SINK_PLUGIN_H 17 #define HISTREAMER_AU_SERVER_SINK_PLUGIN_H 18 19 #include <atomic> 20 #include <memory> 21 #include <unordered_map> 22 23 #include "audio_info.h" 24 #include "audio_renderer.h" 25 #include "foundation/osal/thread/mutex.h" 26 #include "plugin/common/plugin_audio_tags.h" 27 #include "plugin/convert/ffmpeg_convert.h" 28 #include "plugin/interface/audio_sink_plugin.h" 29 #include "plugins/ffmpeg_adapter/utils/ffmpeg_utils.h" 30 #include "timestamp.h" 31 32 namespace OHOS { 33 namespace Media { 34 namespace Plugin { 35 namespace AuSrSinkPlugin { 36 class AudioServerSinkPlugin : public Plugin::AudioSinkPlugin { 37 public: 38 explicit AudioServerSinkPlugin(std::string name); 39 40 ~AudioServerSinkPlugin() override; 41 42 Status Init() override; 43 44 Status Deinit() override; 45 46 Status Prepare() override; 47 48 Status Reset() override; 49 50 Status Start() override; 51 52 Status Stop() override; 53 54 Status GetParameter(Tag tag, ValueType& para) override; 55 56 Status SetParameter(Tag tag, const ValueType& para) override; 57 GetAllocator()58 std::shared_ptr<Allocator> GetAllocator() override 59 { 60 return nullptr; 61 } 62 SetCallback(Callback * cb)63 Status SetCallback(Callback* cb) override 64 { 65 callback_ = cb; 66 return Status::OK; 67 } 68 GetMute(bool & mute)69 Status GetMute(bool& mute) override 70 { 71 return Status::OK; 72 } 73 SetMute(bool mute)74 Status SetMute(bool mute) override 75 { 76 return Status::OK; 77 } 78 79 Status GetVolume(float& volume) override; 80 81 Status SetVolume(float volume) override; 82 GetSpeed(float & speed)83 Status GetSpeed(float& speed) override 84 { 85 return Status::OK; 86 } 87 SetSpeed(float speed)88 Status SetSpeed(float speed) override 89 { 90 return Status::OK; 91 } 92 93 Status Pause() override; 94 95 Status Resume() override; 96 97 Status GetLatency(uint64_t& hstTime) override; 98 GetFrameSize(size_t & size)99 Status GetFrameSize(size_t& size) override 100 { 101 return Status::OK; 102 } 103 GetFrameCount(uint32_t & count)104 Status GetFrameCount(uint32_t& count) override 105 { 106 return Status::OK; 107 } 108 109 Status Write(const std::shared_ptr<Buffer>& input) override; 110 111 Status Flush() override; 112 113 Status Drain() override; 114 private: 115 class AudioRendererCallbackImpl : public OHOS::AudioStandard::AudioRendererCallback { 116 public: 117 AudioRendererCallbackImpl(Callback* cb, const bool& isPaused); 118 void OnInterrupt(const OHOS::AudioStandard::InterruptEvent& interruptEvent) override; 119 void OnStateChange(const OHOS::AudioStandard::RendererState state, 120 const OHOS::AudioStandard::StateChangeCmdType cmdType) override; 121 private: 122 Callback* callback_ {}; 123 bool isPaused_ {false}; 124 }; 125 void ReleaseRender(); 126 bool StopRender(); 127 bool AssignSampleRateIfSupported(uint32_t sampleRate); 128 bool AssignChannelNumIfSupported(uint32_t channelNum); 129 bool AssignSampleFmtIfSupported(AudioSampleFormat sampleFormat); 130 void SetInterruptMode(AudioStandard::InterruptMode interruptMode); 131 132 void SetUpParamsSetterMap(); 133 void SetUpSampleRateSetter(); 134 void SetUpAudioOutputChannelsSetter(); 135 void SetUpMediaBitRateSetter(); 136 void SetUpAudioSampleFormatSetter(); 137 void SetUpAudioOutputChannelLayoutSetter(); 138 void SetUpAudioSamplePerFrameSetter(); 139 void SetUpBitsPerCodedSampleSetter(); 140 void SetUpMediaSeekableSetter(); 141 void SetUpAppPidSetter(); 142 void SetUpAppUidSetter(); 143 void SetUpAudioRenderInfoSetter(); 144 void SetUpAudioInterruptModeSetter(); 145 146 OSAL::Mutex renderMutex_ {}; 147 Callback* callback_ {}; 148 AudioRenderInfo audioRenderInfo_ {}; 149 AudioStandard::AudioRendererOptions rendererOptions_ {}; 150 AudioStandard::InterruptMode audioInterruptMode_ {AudioStandard::InterruptMode::SHARE_MODE}; 151 std::unique_ptr<AudioStandard::AudioRenderer> audioRenderer_ {nullptr}; 152 std::shared_ptr<OHOS::AudioStandard::AudioRendererCallback> audioRendererCallback_ {nullptr}; 153 AudioStandard::AudioRendererParams rendererParams_ {}; 154 155 bool fmtSupported_ {false}; 156 bool isForcePaused_ {false}; 157 AVSampleFormat reSrcFfFmt_ {AV_SAMPLE_FMT_NONE}; 158 const AudioStandard::AudioSampleFormat reStdDestFmt_ {AudioStandard::AudioSampleFormat::SAMPLE_S16LE}; 159 const AVSampleFormat reFfDestFmt_ {AV_SAMPLE_FMT_S16}; 160 AudioChannelLayout channelLayout_ {}; 161 uint32_t channels_ {}; 162 uint32_t samplesPerFrame_ {}; 163 uint32_t bitsPerSample_ {0}; 164 uint32_t sampleRate_ {}; 165 int64_t bitRate_ {0}; 166 int32_t appPid_ {0}; 167 int32_t appUid_ {0}; 168 bool needReformat_ {false}; 169 Plugin::Seekable seekable_ {Plugin::Seekable::INVALID}; 170 std::shared_ptr<Ffmpeg::Resample> resample_ {nullptr}; 171 172 std::unordered_map<Tag, std::function<Status(const ValueType& para)>> paramsSetterMap_; 173 }; 174 } // AuSrSinkPlugin 175 } // Plugin 176 } // Media 177 } // OHOS 178 #endif // HISTREAMER_AU_SERVER_SINK_PLUGIN_H 179