xref: /aosp_15_r20/frameworks/av/media/audioaidlconversion/AidlConversionNdk.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #include <sstream>
18*ec779b8eSAndroid Build Coastguard Worker #include <utility>
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h>
21*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "AidlConversionNdk"
22*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
23*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h>
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversionCppNdk.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversionNdk.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <Utils.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////
31*ec779b8eSAndroid Build Coastguard Worker // AIDL NDK backend to legacy audio data structure conversion utilities.
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker namespace aidl {
34*ec779b8eSAndroid Build Coastguard Worker namespace android {
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker using hardware::audio::common::PlaybackTrackMetadata;
37*ec779b8eSAndroid Build Coastguard Worker using hardware::audio::common::RecordTrackMetadata;
38*ec779b8eSAndroid Build Coastguard Worker using hardware::audio::common::SourceMetadata;
39*ec779b8eSAndroid Build Coastguard Worker using ::android::BAD_VALUE;
40*ec779b8eSAndroid Build Coastguard Worker using ::android::OK;
41*ec779b8eSAndroid Build Coastguard Worker 
42*ec779b8eSAndroid Build Coastguard Worker namespace {
43*ec779b8eSAndroid Build Coastguard Worker 
combineString(const std::vector<std::string> & v,char separator,std::string * result)44*ec779b8eSAndroid Build Coastguard Worker ::android::status_t combineString(
45*ec779b8eSAndroid Build Coastguard Worker         const std::vector<std::string>& v, char separator, std::string* result) {
46*ec779b8eSAndroid Build Coastguard Worker     std::ostringstream oss;
47*ec779b8eSAndroid Build Coastguard Worker     for (const auto& s : v) {
48*ec779b8eSAndroid Build Coastguard Worker         if (oss.tellp() > 0) {
49*ec779b8eSAndroid Build Coastguard Worker             oss << separator;
50*ec779b8eSAndroid Build Coastguard Worker         }
51*ec779b8eSAndroid Build Coastguard Worker         if (s.find(separator) == std::string::npos) {
52*ec779b8eSAndroid Build Coastguard Worker             oss << s;
53*ec779b8eSAndroid Build Coastguard Worker         } else {
54*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: string \"%s\" contains separator character \"%c\"",
55*ec779b8eSAndroid Build Coastguard Worker                     __func__, s.c_str(), separator);
56*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
57*ec779b8eSAndroid Build Coastguard Worker         }
58*ec779b8eSAndroid Build Coastguard Worker     }
59*ec779b8eSAndroid Build Coastguard Worker     *result = oss.str();
60*ec779b8eSAndroid Build Coastguard Worker     return OK;
61*ec779b8eSAndroid Build Coastguard Worker }
62*ec779b8eSAndroid Build Coastguard Worker 
splitString(const std::string & s,char separator)63*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> splitString(const std::string& s, char separator) {
64*ec779b8eSAndroid Build Coastguard Worker     std::istringstream iss(s);
65*ec779b8eSAndroid Build Coastguard Worker     std::string t;
66*ec779b8eSAndroid Build Coastguard Worker     std::vector<std::string> result;
67*ec779b8eSAndroid Build Coastguard Worker     while (std::getline(iss, t, separator)) {
68*ec779b8eSAndroid Build Coastguard Worker         result.push_back(std::move(t));
69*ec779b8eSAndroid Build Coastguard Worker     }
70*ec779b8eSAndroid Build Coastguard Worker     return result;
71*ec779b8eSAndroid Build Coastguard Worker }
72*ec779b8eSAndroid Build Coastguard Worker 
filterOutNonVendorTags(const std::vector<std::string> & tags)73*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> filterOutNonVendorTags(const std::vector<std::string>& tags) {
74*ec779b8eSAndroid Build Coastguard Worker     std::vector<std::string> result;
75*ec779b8eSAndroid Build Coastguard Worker     std::copy_if(tags.begin(), tags.end(), std::back_inserter(result),
76*ec779b8eSAndroid Build Coastguard Worker             ::aidl::android::hardware::audio::common::maybeVendorExtension);
77*ec779b8eSAndroid Build Coastguard Worker     return result;
78*ec779b8eSAndroid Build Coastguard Worker }
79*ec779b8eSAndroid Build Coastguard Worker 
80*ec779b8eSAndroid Build Coastguard Worker }  // namespace
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker // buffer_provider_t is not supported thus skipped
aidl2legacy_AudioConfig_buffer_config_t(const media::audio::common::AudioConfig & aidl,bool isInput)83*ec779b8eSAndroid Build Coastguard Worker ConversionResult<buffer_config_t> aidl2legacy_AudioConfig_buffer_config_t(
84*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioConfig& aidl, bool isInput) {
85*ec779b8eSAndroid Build Coastguard Worker     buffer_config_t legacy;
86*ec779b8eSAndroid Build Coastguard Worker 
87*ec779b8eSAndroid Build Coastguard Worker     legacy.samplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.base.sampleRate));
88*ec779b8eSAndroid Build Coastguard Worker     legacy.mask |= EFFECT_CONFIG_SMP_RATE;
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker     legacy.channels = VALUE_OR_RETURN(
91*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.base.channelMask, isInput));
92*ec779b8eSAndroid Build Coastguard Worker     legacy.mask |= EFFECT_CONFIG_CHANNELS;
93*ec779b8eSAndroid Build Coastguard Worker 
94*ec779b8eSAndroid Build Coastguard Worker     legacy.format =
95*ec779b8eSAndroid Build Coastguard Worker             VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.base.format));
96*ec779b8eSAndroid Build Coastguard Worker     legacy.mask |= EFFECT_CONFIG_FORMAT;
97*ec779b8eSAndroid Build Coastguard Worker     legacy.buffer.frameCount = aidl.frameCount;
98*ec779b8eSAndroid Build Coastguard Worker 
99*ec779b8eSAndroid Build Coastguard Worker     // TODO: add accessMode and mask
100*ec779b8eSAndroid Build Coastguard Worker     return legacy;
101*ec779b8eSAndroid Build Coastguard Worker }
102*ec779b8eSAndroid Build Coastguard Worker 
103*ec779b8eSAndroid Build Coastguard Worker ConversionResult<media::audio::common::AudioConfig>
legacy2aidl_buffer_config_t_AudioConfig(const buffer_config_t & legacy,bool isInput)104*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_buffer_config_t_AudioConfig(const buffer_config_t& legacy, bool isInput) {
105*ec779b8eSAndroid Build Coastguard Worker     media::audio::common::AudioConfig aidl;
106*ec779b8eSAndroid Build Coastguard Worker 
107*ec779b8eSAndroid Build Coastguard Worker     if (legacy.mask & EFFECT_CONFIG_SMP_RATE) {
108*ec779b8eSAndroid Build Coastguard Worker         aidl.base.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.samplingRate));
109*ec779b8eSAndroid Build Coastguard Worker     }
110*ec779b8eSAndroid Build Coastguard Worker     if (legacy.mask & EFFECT_CONFIG_CHANNELS) {
111*ec779b8eSAndroid Build Coastguard Worker         aidl.base.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
112*ec779b8eSAndroid Build Coastguard Worker                 static_cast<audio_channel_mask_t>(legacy.channels), isInput));
113*ec779b8eSAndroid Build Coastguard Worker     }
114*ec779b8eSAndroid Build Coastguard Worker     if (legacy.mask & EFFECT_CONFIG_FORMAT) {
115*ec779b8eSAndroid Build Coastguard Worker         aidl.base.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(
116*ec779b8eSAndroid Build Coastguard Worker                 static_cast<audio_format_t>(legacy.format)));
117*ec779b8eSAndroid Build Coastguard Worker     }
118*ec779b8eSAndroid Build Coastguard Worker     aidl.frameCount = legacy.buffer.frameCount;
119*ec779b8eSAndroid Build Coastguard Worker 
120*ec779b8eSAndroid Build Coastguard Worker     // TODO: add accessMode and mask
121*ec779b8eSAndroid Build Coastguard Worker     return aidl;
122*ec779b8eSAndroid Build Coastguard Worker }
123*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioAttributesTags(const std::vector<std::string> & aidl,char * legacy)124*ec779b8eSAndroid Build Coastguard Worker ::android::status_t aidl2legacy_AudioAttributesTags(
125*ec779b8eSAndroid Build Coastguard Worker         const std::vector<std::string>& aidl, char* legacy) {
126*ec779b8eSAndroid Build Coastguard Worker     std::string aidlTags;
127*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(combineString(
128*ec779b8eSAndroid Build Coastguard Worker                     filterOutNonVendorTags(aidl), AUDIO_ATTRIBUTES_TAGS_SEPARATOR, &aidlTags));
129*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(aidl2legacy_string(aidlTags, legacy, AUDIO_ATTRIBUTES_TAGS_MAX_SIZE));
130*ec779b8eSAndroid Build Coastguard Worker     return OK;
131*ec779b8eSAndroid Build Coastguard Worker }
132*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_AudioAttributesTags(const char * legacy)133*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::vector<std::string>> legacy2aidl_AudioAttributesTags(const char* legacy) {
134*ec779b8eSAndroid Build Coastguard Worker     std::string legacyTags = VALUE_OR_RETURN(legacy2aidl_string(
135*ec779b8eSAndroid Build Coastguard Worker                     legacy, AUDIO_ATTRIBUTES_TAGS_MAX_SIZE));
136*ec779b8eSAndroid Build Coastguard Worker     return filterOutNonVendorTags(splitString(legacyTags, AUDIO_ATTRIBUTES_TAGS_SEPARATOR));
137*ec779b8eSAndroid Build Coastguard Worker }
138*ec779b8eSAndroid Build Coastguard Worker 
139*ec779b8eSAndroid Build Coastguard Worker ConversionResult<playback_track_metadata_v7>
aidl2legacy_PlaybackTrackMetadata_playback_track_metadata_v7(const PlaybackTrackMetadata & aidl)140*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_PlaybackTrackMetadata_playback_track_metadata_v7(const PlaybackTrackMetadata& aidl) {
141*ec779b8eSAndroid Build Coastguard Worker     playback_track_metadata_v7 legacy;
142*ec779b8eSAndroid Build Coastguard Worker     legacy.base.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
143*ec779b8eSAndroid Build Coastguard Worker     legacy.base.content_type = VALUE_OR_RETURN(aidl2legacy_AudioContentType_audio_content_type_t(
144*ec779b8eSAndroid Build Coastguard Worker                     aidl.contentType));
145*ec779b8eSAndroid Build Coastguard Worker     legacy.base.gain = aidl.gain;
146*ec779b8eSAndroid Build Coastguard Worker     legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
147*ec779b8eSAndroid Build Coastguard Worker                     aidl.channelMask, false /*isInput*/));
148*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_AudioAttributesTags(aidl.tags, legacy.tags));
149*ec779b8eSAndroid Build Coastguard Worker     return legacy;
150*ec779b8eSAndroid Build Coastguard Worker }
151*ec779b8eSAndroid Build Coastguard Worker 
152*ec779b8eSAndroid Build Coastguard Worker ConversionResult<PlaybackTrackMetadata>
legacy2aidl_playback_track_metadata_v7_PlaybackTrackMetadata(const playback_track_metadata_v7 & legacy)153*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_playback_track_metadata_v7_PlaybackTrackMetadata(
154*ec779b8eSAndroid Build Coastguard Worker         const playback_track_metadata_v7& legacy) {
155*ec779b8eSAndroid Build Coastguard Worker     PlaybackTrackMetadata aidl;
156*ec779b8eSAndroid Build Coastguard Worker     aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.base.usage));
157*ec779b8eSAndroid Build Coastguard Worker     aidl.contentType = VALUE_OR_RETURN(legacy2aidl_audio_content_type_t_AudioContentType(
158*ec779b8eSAndroid Build Coastguard Worker                     legacy.base.content_type));
159*ec779b8eSAndroid Build Coastguard Worker     aidl.gain = legacy.base.gain;
160*ec779b8eSAndroid Build Coastguard Worker     aidl.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
161*ec779b8eSAndroid Build Coastguard Worker                     legacy.channel_mask, false /*isInput*/));
162*ec779b8eSAndroid Build Coastguard Worker     aidl.tags = VALUE_OR_RETURN(legacy2aidl_AudioAttributesTags(legacy.tags));
163*ec779b8eSAndroid Build Coastguard Worker     return aidl;
164*ec779b8eSAndroid Build Coastguard Worker }
165*ec779b8eSAndroid Build Coastguard Worker 
166*ec779b8eSAndroid Build Coastguard Worker ConversionResult<record_track_metadata_v7>
aidl2legacy_RecordTrackMetadata_record_track_metadata_v7(const RecordTrackMetadata & aidl)167*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_RecordTrackMetadata_record_track_metadata_v7(const RecordTrackMetadata& aidl) {
168*ec779b8eSAndroid Build Coastguard Worker     record_track_metadata_v7 legacy;
169*ec779b8eSAndroid Build Coastguard Worker     legacy.base.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(aidl.source));
170*ec779b8eSAndroid Build Coastguard Worker     legacy.base.gain = aidl.gain;
171*ec779b8eSAndroid Build Coastguard Worker     if (aidl.destinationDevice.has_value()) {
172*ec779b8eSAndroid Build Coastguard Worker         RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(aidl.destinationDevice.value(),
173*ec779b8eSAndroid Build Coastguard Worker                         &legacy.base.dest_device, legacy.base.dest_device_address));
174*ec779b8eSAndroid Build Coastguard Worker     } else {
175*ec779b8eSAndroid Build Coastguard Worker         legacy.base.dest_device = AUDIO_DEVICE_NONE;
176*ec779b8eSAndroid Build Coastguard Worker     }
177*ec779b8eSAndroid Build Coastguard Worker     legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
178*ec779b8eSAndroid Build Coastguard Worker                     aidl.channelMask, true /*isInput*/));
179*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_AudioAttributesTags(aidl.tags, legacy.tags));
180*ec779b8eSAndroid Build Coastguard Worker     return legacy;
181*ec779b8eSAndroid Build Coastguard Worker }
182*ec779b8eSAndroid Build Coastguard Worker 
183*ec779b8eSAndroid Build Coastguard Worker ConversionResult<RecordTrackMetadata>
legacy2aidl_record_track_metadata_v7_RecordTrackMetadata(const record_track_metadata_v7 & legacy)184*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_record_track_metadata_v7_RecordTrackMetadata(const record_track_metadata_v7& legacy) {
185*ec779b8eSAndroid Build Coastguard Worker     RecordTrackMetadata aidl;
186*ec779b8eSAndroid Build Coastguard Worker     aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.base.source));
187*ec779b8eSAndroid Build Coastguard Worker     aidl.gain = legacy.base.gain;
188*ec779b8eSAndroid Build Coastguard Worker     if (legacy.base.dest_device != AUDIO_DEVICE_NONE) {
189*ec779b8eSAndroid Build Coastguard Worker         aidl.destinationDevice = VALUE_OR_RETURN(legacy2aidl_audio_device_AudioDevice(
190*ec779b8eSAndroid Build Coastguard Worker                         legacy.base.dest_device, legacy.base.dest_device_address));
191*ec779b8eSAndroid Build Coastguard Worker     }
192*ec779b8eSAndroid Build Coastguard Worker     aidl.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
193*ec779b8eSAndroid Build Coastguard Worker                     legacy.channel_mask, true /*isInput*/));
194*ec779b8eSAndroid Build Coastguard Worker     aidl.tags = VALUE_OR_RETURN(legacy2aidl_AudioAttributesTags(legacy.tags));
195*ec779b8eSAndroid Build Coastguard Worker     return aidl;
196*ec779b8eSAndroid Build Coastguard Worker }
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker // static
199*ec779b8eSAndroid Build Coastguard Worker ConversionResult<SourceMetadata>
legacy2aidl_playback_track_metadata_v7_SourceMetadata(const std::vector<playback_track_metadata_v7_t> & legacy)200*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_playback_track_metadata_v7_SourceMetadata(
201*ec779b8eSAndroid Build Coastguard Worker         const std::vector<playback_track_metadata_v7_t>& legacy) {
202*ec779b8eSAndroid Build Coastguard Worker     SourceMetadata aidl;
203*ec779b8eSAndroid Build Coastguard Worker     aidl.tracks = VALUE_OR_RETURN(
204*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<PlaybackTrackMetadata>>(
205*ec779b8eSAndroid Build Coastguard Worker                     legacy,
206*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_playback_track_metadata_v7_PlaybackTrackMetadata));
207*ec779b8eSAndroid Build Coastguard Worker     return aidl;
208*ec779b8eSAndroid Build Coastguard Worker }
209*ec779b8eSAndroid Build Coastguard Worker 
210*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
211*ec779b8eSAndroid Build Coastguard Worker }  // aidl
212