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_HDI_SINK_H 17 #define HISTREAMER_HDI_SINK_H 18 19 #include <atomic> 20 #include <vector> 21 #include "audio_manager.h" 22 #include "audio_types.h" 23 #include "foundation/osal/thread/condition_variable.h" 24 #include "foundation/osal/thread/mutex.h" 25 #include "foundation/osal/thread/task.h" 26 #include "plugin/interface/audio_sink_plugin.h" 27 28 struct AudioAdapter; 29 struct AudioRender; 30 struct AudioPort; 31 namespace OHOS { 32 namespace Media { 33 namespace HosLitePlugin { 34 class RingBuffer; 35 36 class HdiSink : public std::enable_shared_from_this<HdiSink>, public OHOS::Media::Plugin::AudioSinkPlugin { 37 public: 38 explicit HdiSink(std::string name); 39 40 ~HdiSink() override = default; 41 42 Media::Plugin::Status Init() override; 43 44 Media::Plugin::Status Deinit() override; 45 46 Media::Plugin::Status Prepare() override; 47 48 Media::Plugin::Status Reset() override; 49 50 Media::Plugin::Status Start() override; 51 52 Media::Plugin::Status Stop() override; 53 54 bool IsParameterSupported(Media::Plugin::Tag tag) override; 55 56 Media::Plugin::Status GetParameter(Media::Plugin::Tag tag, Media::Plugin::ValueType& value) override; 57 58 Media::Plugin::Status SetParameter(Media::Plugin::Tag tag, const Media::Plugin::ValueType& value) override; 59 60 std::shared_ptr<OHOS::Media::Plugin::Allocator> GetAllocator() override; 61 62 Media::Plugin::Status SetCallback(OHOS::Media::Plugin::Callback* cb) override; 63 64 Media::Plugin::Status GetMute(bool& mute) override; 65 66 Media::Plugin::Status SetMute(bool mute) override; 67 68 Media::Plugin::Status GetVolume(float& volume) override; 69 70 Media::Plugin::Status SetVolume(float volume) override; 71 72 Media::Plugin::Status GetSpeed(float& speed) override; 73 74 Media::Plugin::Status SetSpeed(float speed) override; 75 76 Media::Plugin::Status Pause() override; 77 78 Media::Plugin::Status Resume() override; 79 80 Media::Plugin::Status GetLatency(uint64_t& ms) override; 81 82 Media::Plugin::Status GetFrameSize(size_t& size) override; 83 84 Media::Plugin::Status GetFrameCount(uint32_t& count) override; 85 86 Media::Plugin::Status Write(const std::shared_ptr<Media::Plugin::Buffer>& input) override; 87 88 Media::Plugin::Status Flush() override; 89 90 private: 91 Media::Plugin::Status ReleaseRender(); 92 93 void Deinterleave8(uint8_t* inData, uint8_t* outData, int32_t frameCnt); 94 95 void Deinterleave16(uint8_t* inData, uint8_t* outData, int32_t frameCnt); 96 97 void Deinterleave32(uint8_t* inData, uint8_t* outData, int32_t frameCnt); 98 99 bool HandleInterleaveData(uint8_t* origData, int32_t frameCnt); 100 101 void RenderFrame(const std::shared_ptr<Plugin::Buffer>& input); 102 103 Media::Plugin::Status ProcessInputSampleFormat(const Media::Plugin::ValueType& value); 104 105 private: 106 OHOS::Media::OSAL::Mutex renderMutex_ {}; 107 AudioManager* audioManager_ {nullptr}; 108 AudioAdapterDescriptor adapterDescriptor_ {}; 109 AudioAdapter* audioAdapter_ {nullptr}; 110 AudioRender* audioRender_ {nullptr}; 111 AudioDeviceDescriptor deviceDescriptor_ {}; 112 AudioSampleAttributes sampleAttributes_ {}; 113 bool isInputInterleaved_{false}; 114 AudioChannelMask channelMask_{AUDIO_CHANNEL_MONO}; 115 OHOS::Media::Plugin::Callback* eventCallback_ {}; 116 std::vector<uint8_t> cacheData_; 117 bool usingDefaultInCaps_ {true}; // if true pass hdi with S16P pcm data and convert input into non-interleaved 118 std::atomic<bool> processing_; 119 OSAL::ConditionVariable renderCond_; 120 }; 121 } // namespace HosLitePlugin 122 } // namespace Media 123 } // namespace OHOS 124 #endif 125