• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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