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