1 /*
2  * Copyright (c) 2022-2023 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 I_AUDIO_RENDERER_SINK_H
17 #define I_AUDIO_RENDERER_SINK_H
18 
19 #include <string>
20 #include "audio_info.h"
21 #include "audio_hdiadapter_info.h"
22 
23 namespace OHOS {
24 namespace AudioStandard {
25 
26 typedef struct IAudioSinkAttr {
27     const char *adapterName = nullptr;
28     uint32_t openMicSpeaker = 0;
29     HdiAdapterFormat format = HdiAdapterFormat::INVALID_WIDTH;
30     uint32_t sampleRate = 0;
31     uint32_t channel = 0;
32     float volume = 0.0f;
33     const char *filePath = nullptr;
34     const char *deviceNetworkId = nullptr;
35     int32_t deviceType = 0;
36     uint64_t channelLayout = 0;
37     int32_t audioStreamFlag = 0;
38     std::string address;
39     const char *aux;
40 } IAudioSinkAttr;
41 
42 class IAudioSinkCallback {
43 public:
44     virtual void OnAudioSinkParamChange(const std::string &netWorkId, const AudioParamKey key,
45         const std::string &condition, const std::string &value) = 0;
46 };
47 
48 typedef void OnRenderCallback(const RenderCallbackType type, int8_t *userdata);
49 class IAudioRendererSink {
50 public:
51     static IAudioRendererSink *GetInstance(const char *devceClass, const char *deviceNetworkId);
52 
53     virtual ~IAudioRendererSink() = default;
54 
55     virtual int32_t Init(const IAudioSinkAttr &attr) = 0;
56     virtual bool IsInited(void) = 0;
57     virtual void DeInit(void) = 0;
58 
59     virtual int32_t Flush(void) = 0;
60     virtual int32_t Pause(void) = 0;
61     virtual int32_t Reset(void) = 0;
62     virtual int32_t Resume(void) = 0;
63     virtual int32_t Start(void) = 0;
64     virtual int32_t Stop(void) = 0;
65 
66     virtual int32_t SuspendRenderSink(void) = 0;
67     virtual int32_t RestoreRenderSink(void) = 0;
68 
69     virtual int32_t RenderFrame(char &data, uint64_t len, uint64_t &writeLen) = 0;
70     virtual int32_t GetLatency(uint32_t *latency) = 0;
71 
72     virtual int32_t SetVolume(float left, float right) = 0;
73     virtual int32_t GetVolume(float &left, float &right) = 0;
74     virtual int32_t SetVoiceVolume(float volume) = 0;
75 
76     virtual int32_t GetTransactionId(uint64_t *transactionId) = 0;
77 
78     virtual int32_t SetAudioScene(AudioScene audioScene, std::vector<DeviceType> &activeDevices) = 0;
79     virtual int32_t SetOutputRoutes(std::vector<DeviceType> &outputDevices) = 0;
80 
81     virtual void SetAudioParameter(const AudioParamKey key, const std::string &condition, const std::string &value) = 0;
82     virtual std::string GetAudioParameter(const AudioParamKey key, const std::string &condition) = 0;
83     virtual void RegisterParameterCallback(IAudioSinkCallback* callback) = 0;
84 
85     virtual void SetAudioMonoState(bool audioMono) = 0;
86     virtual void SetAudioBalanceValue(float audioBalance) = 0;
87 
88     virtual int32_t GetPresentationPosition(uint64_t &frames, int64_t &timeSec, int64_t &timeNanoSec) = 0;
89     virtual float GetMaxAmplitude() = 0;
90 
Preload(const std::string & usbInfoStr)91     virtual int32_t Preload(const std::string &usbInfoStr)
92     {
93         return 0;
94     }
95 
96     virtual void ResetOutputRouteForDisconnect(DeviceType device) = 0;
97     virtual int32_t SetPaPower(int32_t flag) = 0;
98     virtual int32_t SetPriPaPower() = 0;
99 
100     virtual int32_t UpdateAppsUid(const int32_t appsUid[MAX_MIX_CHANNELS],
101         const size_t size) = 0;
102 
103     virtual int32_t UpdateAppsUid(const std::vector<int32_t> &appsUid) = 0;
104 
SetRenderEmpty(int32_t durationUs)105     virtual int32_t SetRenderEmpty(int32_t durationUs)
106     {
107         // Only operate on primary for now
108         return 0;
109     }
110 
SetSinkMuteForSwitchDevice(bool mute)111     virtual int32_t SetSinkMuteForSwitchDevice(bool mute)
112     {
113         return 0;
114     }
115 };
116 
117 class IMmapAudioRendererSink : public IAudioRendererSink {
118 public:
119     IMmapAudioRendererSink() = default;
120     virtual ~IMmapAudioRendererSink() = default;
121     virtual int32_t GetMmapBufferInfo(int &fd, uint32_t &totalSizeInframe, uint32_t &spanSizeInframe,
122         uint32_t &byteSizePerFrame) = 0;
123     virtual int32_t GetMmapHandlePosition(uint64_t &frames, int64_t &timeSec, int64_t &timeNanoSec) = 0;
124 };
125 
126 enum AudioDrainType {
127     AUDIO_DRAIN_EARLY_NOTIFY,
128     AUDIO_DRAIN_ALL
129 };
130 
131 class IOffloadAudioRendererSink : public IAudioRendererSink {
132 public:
133     IOffloadAudioRendererSink() = default;
134     virtual ~IOffloadAudioRendererSink() = default;
135     virtual int32_t RegisterRenderCallback(OnRenderCallback (*callback), int8_t *userdata) = 0;
136     virtual int32_t Drain(AudioDrainType type) = 0;
137     virtual int32_t SetBufferSize(uint32_t sizeMs) = 0;
138 
139     virtual int32_t OffloadRunningLockInit(void) = 0;
140     virtual int32_t OffloadRunningLockLock(void) = 0;
141     virtual int32_t OffloadRunningLockUnlock(void) = 0;
142 };
143 class IRemoteAudioRendererSink : public IAudioRendererSink {
144 public:
145     virtual int32_t SplitRenderFrame(char &data, uint64_t len, uint64_t &writeLen, char *streamType) = 0;
146 };
147 }  // namespace AudioStandard
148 }  // namespace OHOS
149 #endif // I_AUDIO_RENDERER_SINK_H
150