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