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 #define HST_LOG_TAG "HdiAuUtils"
17 
18 #include "hdi_au_utils.h"
19 
20 #include <utility>
21 #include <map>
22 
23 namespace OHOS {
24 namespace Media {
25 namespace Plugin {
26 namespace HosLite {
27 namespace {
28 struct PluginHdiAudioFormatTable {
29     AudioFormat hFormat;
30     bool isSigned;
31     bool isInterleaved;
32     bool isBigEndian;
33     OHOS::Media::Plugin::AudioSampleFormat pFormat;
34 };
35 
36 PluginHdiAudioFormatTable g_phft[] = {
37     {AUDIO_FORMAT_TYPE_PCM_8_BIT, false, true, false, OHOS::Media::Plugin::AudioSampleFormat::U8},
38     {AUDIO_FORMAT_TYPE_PCM_8_BIT, false, false, false, OHOS::Media::Plugin::AudioSampleFormat::U8P},
39     {AUDIO_FORMAT_TYPE_PCM_8_BIT, true, true, false, OHOS::Media::Plugin::AudioSampleFormat::S8},
40     {AUDIO_FORMAT_TYPE_PCM_8_BIT, true, false, false, OHOS::Media::Plugin::AudioSampleFormat::S8P},
41     {AUDIO_FORMAT_TYPE_PCM_16_BIT, false, true, false, OHOS::Media::Plugin::AudioSampleFormat::U16},
42     {AUDIO_FORMAT_TYPE_PCM_16_BIT, false, false, false, OHOS::Media::Plugin::AudioSampleFormat::U16P},
43     {AUDIO_FORMAT_TYPE_PCM_16_BIT, true, true, false, OHOS::Media::Plugin::AudioSampleFormat::S16},
44     {AUDIO_FORMAT_TYPE_PCM_16_BIT, true, false, false, OHOS::Media::Plugin::AudioSampleFormat::S16P},
45     {AUDIO_FORMAT_TYPE_PCM_32_BIT, false, true, false, OHOS::Media::Plugin::AudioSampleFormat::U32},
46     {AUDIO_FORMAT_TYPE_PCM_32_BIT, false, false, false, OHOS::Media::Plugin::AudioSampleFormat::U32P},
47     {AUDIO_FORMAT_TYPE_PCM_32_BIT, true, true, false, OHOS::Media::Plugin::AudioSampleFormat::S32},
48     {AUDIO_FORMAT_TYPE_PCM_32_BIT, true, false, false, OHOS::Media::Plugin::AudioSampleFormat::S32P},
49 };
50 
51 std::pair<uint32_t, AudioSampleRatesMask> g_phst[] = {
52     {0, AUDIO_SAMPLE_RATE_MASK_INVALID},
53     {8000, AUDIO_SAMPLE_RATE_MASK_8000},
54     {12000, AUDIO_SAMPLE_RATE_MASK_12000},
55     {11025, AUDIO_SAMPLE_RATE_MASK_11025},
56     {16000, AUDIO_SAMPLE_RATE_MASK_16000},
57     {22050, AUDIO_SAMPLE_RATE_MASK_22050},
58     {24000, AUDIO_SAMPLE_RATE_MASK_24000},
59     {32000, AUDIO_SAMPLE_RATE_MASK_32000},
60     {44100, AUDIO_SAMPLE_RATE_MASK_44100},
61     {48000, AUDIO_SAMPLE_RATE_MASK_48000},
62     {64000, AUDIO_SAMPLE_RATE_MASK_64000},
63     {96000, AUDIO_SAMPLE_RATE_MASK_96000},
64 };
65 
66 std::pair<OHOS::Media::Plugin::AudioChannelLayout, AudioChannelMask> g_phcmt[] = {
67     {OHOS::Media::Plugin::AudioChannelLayout::MONO, AUDIO_CHANNEL_MONO},
68     {OHOS::Media::Plugin::AudioChannelLayout::STEREO, AUDIO_CHANNEL_STEREO}
69 };
70 } // namespace
71 
PluginAuFormat2HdiAttrs(OHOS::Media::Plugin::AudioSampleFormat pFormat,AudioSampleAttributes & attrs)72 bool PluginAuFormat2HdiAttrs(OHOS::Media::Plugin::AudioSampleFormat pFormat, AudioSampleAttributes& attrs)
73 {
74     for (const auto& item : g_phft) {
75         if (item.pFormat == pFormat) {
76             attrs.format = item.hFormat;
77             attrs.isSignedData = item.isSigned;
78             attrs.isBigEndian = item.isBigEndian;
79             attrs.interleaved = item.isInterleaved;
80             return true;
81         }
82     }
83     return false;
84 }
85 
HdiAuFormat2PluginFormat(::AudioSampleFormat hdiAudioFormat,OHOS::Media::Plugin::AudioSampleFormat & pluginFormat)86 bool HdiAuFormat2PluginFormat(::AudioSampleFormat hdiAudioFormat, OHOS::Media::Plugin::AudioSampleFormat& pluginFormat)
87 {
88     using PluginAudioSampleFormat = OHOS::Media::Plugin::AudioSampleFormat;
89     static const std::map<::AudioSampleFormat, PluginAudioSampleFormat> formatMap = {
90         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U8, PluginAudioSampleFormat::U8},
91         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U8P, PluginAudioSampleFormat::U8P},
92         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S8, PluginAudioSampleFormat::S8},
93         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S8P, PluginAudioSampleFormat::S8P},
94         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U16, PluginAudioSampleFormat::U16},
95         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U16P, PluginAudioSampleFormat::U16P},
96         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S16, PluginAudioSampleFormat::S16},
97         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S16P, PluginAudioSampleFormat::S16P},
98         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U24, PluginAudioSampleFormat::U24},
99         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U24, PluginAudioSampleFormat::U24P},
100         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S24, PluginAudioSampleFormat::S24},
101         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S24P, PluginAudioSampleFormat::S24P},
102         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U32, PluginAudioSampleFormat::U32},
103         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U32P, PluginAudioSampleFormat::U32P},
104         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S32, PluginAudioSampleFormat::S32},
105         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S32P, PluginAudioSampleFormat::S32P},
106         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U64, PluginAudioSampleFormat::U64},
107         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_U64P, PluginAudioSampleFormat::U64P},
108         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S64, PluginAudioSampleFormat::S64},
109         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_S64, PluginAudioSampleFormat::S64P},
110         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_F32, PluginAudioSampleFormat::F32},
111         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_F32P, PluginAudioSampleFormat::F32P},
112         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_F64, PluginAudioSampleFormat::F64},
113         {::AudioSampleFormat::AUDIO_SAMPLE_FORMAT_F64P, PluginAudioSampleFormat::F64P},
114     };
115     if (formatMap.count(hdiAudioFormat) == 0) {
116         return false;
117     }
118     pluginFormat = formatMap.find(hdiAudioFormat)->second;
119     return true;
120 }
121 
HdiAttrs2PluginAuFormat(AudioSampleAttributes attrs,OHOS::Media::Plugin::AudioSampleFormat & pFormat)122 bool HdiAttrs2PluginAuFormat(AudioSampleAttributes attrs, OHOS::Media::Plugin::AudioSampleFormat& pFormat)
123 {
124     for (const auto& item : g_phft) {
125         if (attrs.format == item.hFormat && attrs.isSignedData == item.isSigned &&
126             attrs.interleaved == item.isInterleaved && attrs.isBigEndian == item.isBigEndian) {
127             pFormat = item.pFormat;
128             return true;
129         }
130     }
131     return false;
132 }
133 
PluginSampleRate2HdiRate(uint32_t pRate,AudioSampleRatesMask & mask)134 bool PluginSampleRate2HdiRate(uint32_t pRate, AudioSampleRatesMask& mask)
135 {
136     for (const auto& item : g_phst) {
137         if (item.first == pRate) {
138             mask = item.second;
139             return true;
140         }
141     }
142     mask = AUDIO_SAMPLE_RATE_MASK_INVALID;
143     return false;
144 }
145 
HdiSampleRatesMask2PluginRates(uint32_t mask)146 std::vector<uint32_t> HdiSampleRatesMask2PluginRates(uint32_t mask)
147 {
148     std::vector<uint32_t> ret;
149     for (const auto& pairKey : g_phst) {
150         if ((static_cast<uint32_t>(pairKey.second) & mask) != 0) {
151             ret.emplace_back(pairKey.first);
152         }
153     }
154     return ret;
155 }
156 
HdiRate2PluginSampleRate(AudioSampleRatesMask mask,uint32_t & pRate)157 bool HdiRate2PluginSampleRate(AudioSampleRatesMask mask, uint32_t& pRate)
158 {
159     for (const auto& item : g_phst) {
160         if (item.second == mask) {
161             pRate = item.first;
162             return true;
163         }
164     }
165     return false;
166 }
167 
PluginChannelLayout2HdiMask(OHOS::Media::Plugin::AudioChannelLayout layout,AudioChannelMask & mask)168 bool PluginChannelLayout2HdiMask(OHOS::Media::Plugin::AudioChannelLayout layout, AudioChannelMask& mask)
169 {
170     for (const auto& item : g_phcmt) {
171         if (item.first == layout) {
172             mask = item.second;
173             return true;
174         }
175     }
176     return false;
177 }
HdiMask2PluginChannelLayout(AudioChannelMask mask,OHOS::Media::Plugin::AudioChannelLayout & layout)178 bool HdiMask2PluginChannelLayout(AudioChannelMask mask, OHOS::Media::Plugin::AudioChannelLayout& layout)
179 {
180     for (const auto& item : g_phcmt) {
181         if (item.second == mask) {
182             layout = item.first;
183             return true;
184         }
185     }
186     return false;
187 }
GetPcmBytes(AudioFormat format)188 int32_t GetPcmBytes(AudioFormat format)
189 {
190     switch (format) {
191         case AUDIO_FORMAT_TYPE_PCM_8_BIT:
192             return 1;
193         case AUDIO_FORMAT_TYPE_PCM_16_BIT:
194             return 2; // 2
195         case AUDIO_FORMAT_TYPE_PCM_24_BIT:
196             return 3; // 3
197         case AUDIO_FORMAT_TYPE_PCM_32_BIT:
198             return 4; // 4
199         default:
200             return 0;
201     }
202 }
203 } // namespace HosLite
204 } // namespace Plugin
205 } // namespace Media
206 } // namespace OHOS
207