1*b9df5ad1SAndroid Build Coastguard Worker /*
2*b9df5ad1SAndroid Build Coastguard Worker * Copyright 2020 The Android Open Source Project
3*b9df5ad1SAndroid Build Coastguard Worker *
4*b9df5ad1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b9df5ad1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b9df5ad1SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b9df5ad1SAndroid Build Coastguard Worker *
8*b9df5ad1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b9df5ad1SAndroid Build Coastguard Worker *
10*b9df5ad1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b9df5ad1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b9df5ad1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b9df5ad1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b9df5ad1SAndroid Build Coastguard Worker * limitations under the License.
15*b9df5ad1SAndroid Build Coastguard Worker */
16*b9df5ad1SAndroid Build Coastguard Worker
17*b9df5ad1SAndroid Build Coastguard Worker #include <string.h>
18*b9df5ad1SAndroid Build Coastguard Worker #include <errno.h>
19*b9df5ad1SAndroid Build Coastguard Worker
20*b9df5ad1SAndroid Build Coastguard Worker #include <audio_utils/Metadata.h>
21*b9df5ad1SAndroid Build Coastguard Worker
22*b9df5ad1SAndroid Build Coastguard Worker using namespace android::audio_utils::metadata;
23*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_create()24*b9df5ad1SAndroid Build Coastguard Worker audio_metadata_t *audio_metadata_create() {
25*b9df5ad1SAndroid Build Coastguard Worker return reinterpret_cast<audio_metadata_t *>
26*b9df5ad1SAndroid Build Coastguard Worker (new(std::nothrow) Data());
27*b9df5ad1SAndroid Build Coastguard Worker }
28*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_put_int32(audio_metadata_t * metadata,const char * key,int32_t value)29*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_put_int32(audio_metadata_t *metadata, const char *key, int32_t value) {
30*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr) {
31*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
32*b9df5ad1SAndroid Build Coastguard Worker }
33*b9df5ad1SAndroid Build Coastguard Worker reinterpret_cast<Data *>(metadata)->emplace(key, value);
34*b9df5ad1SAndroid Build Coastguard Worker return 0;
35*b9df5ad1SAndroid Build Coastguard Worker }
36*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_put_int64(audio_metadata_t * metadata,const char * key,int64_t value)37*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_put_int64(audio_metadata_t *metadata, const char *key, int64_t value) {
38*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr) {
39*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
40*b9df5ad1SAndroid Build Coastguard Worker }
41*b9df5ad1SAndroid Build Coastguard Worker reinterpret_cast<Data *>(metadata)->emplace(key, value);
42*b9df5ad1SAndroid Build Coastguard Worker return 0;
43*b9df5ad1SAndroid Build Coastguard Worker }
44*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_put_float(audio_metadata_t * metadata,const char * key,float value)45*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_put_float(audio_metadata_t *metadata, const char *key, float value) {
46*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr) {
47*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
48*b9df5ad1SAndroid Build Coastguard Worker }
49*b9df5ad1SAndroid Build Coastguard Worker reinterpret_cast<Data *>(metadata)->emplace(key, value);
50*b9df5ad1SAndroid Build Coastguard Worker return 0;
51*b9df5ad1SAndroid Build Coastguard Worker }
52*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_put_double(audio_metadata_t * metadata,const char * key,double value)53*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_put_double(audio_metadata_t *metadata, const char *key, double value) {
54*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr) {
55*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
56*b9df5ad1SAndroid Build Coastguard Worker }
57*b9df5ad1SAndroid Build Coastguard Worker reinterpret_cast<Data *>(metadata)->emplace(key, value);
58*b9df5ad1SAndroid Build Coastguard Worker return 0;
59*b9df5ad1SAndroid Build Coastguard Worker }
60*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_put_string(audio_metadata_t * metadata,const char * key,const char * value)61*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_put_string(audio_metadata_t *metadata, const char *key, const char *value) {
62*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
63*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
64*b9df5ad1SAndroid Build Coastguard Worker }
65*b9df5ad1SAndroid Build Coastguard Worker reinterpret_cast<Data *>(metadata)->emplace(key, value);
66*b9df5ad1SAndroid Build Coastguard Worker return 0;
67*b9df5ad1SAndroid Build Coastguard Worker }
68*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_put_data(audio_metadata_t * metadata,const char * key,audio_metadata_t * value)69*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_put_data(
70*b9df5ad1SAndroid Build Coastguard Worker audio_metadata_t *metadata, const char *key, audio_metadata_t *value) {
71*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
72*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
73*b9df5ad1SAndroid Build Coastguard Worker }
74*b9df5ad1SAndroid Build Coastguard Worker reinterpret_cast<Data *>(metadata)->emplace(key, *reinterpret_cast<Data *>(value));
75*b9df5ad1SAndroid Build Coastguard Worker return 0;
76*b9df5ad1SAndroid Build Coastguard Worker }
77*b9df5ad1SAndroid Build Coastguard Worker
78*b9df5ad1SAndroid Build Coastguard Worker // audio_metadata_put_unknown() is declared but not implemented
79*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_get_int32(audio_metadata_t * metadata,const char * key,int32_t * value)80*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_get_int32(audio_metadata_t *metadata, const char *key, int32_t *value) {
81*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
82*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
83*b9df5ad1SAndroid Build Coastguard Worker }
84*b9df5ad1SAndroid Build Coastguard Worker int32_t *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<int32_t>(key));
85*b9df5ad1SAndroid Build Coastguard Worker if (val == nullptr) {
86*b9df5ad1SAndroid Build Coastguard Worker return -ENOENT;
87*b9df5ad1SAndroid Build Coastguard Worker }
88*b9df5ad1SAndroid Build Coastguard Worker *value = *val;
89*b9df5ad1SAndroid Build Coastguard Worker return 0;
90*b9df5ad1SAndroid Build Coastguard Worker }
91*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_get_int64(audio_metadata_t * metadata,const char * key,int64_t * value)92*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_get_int64(audio_metadata_t *metadata, const char *key, int64_t *value) {
93*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
94*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
95*b9df5ad1SAndroid Build Coastguard Worker }
96*b9df5ad1SAndroid Build Coastguard Worker int64_t *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<int64_t>(key));
97*b9df5ad1SAndroid Build Coastguard Worker if (val == nullptr) {
98*b9df5ad1SAndroid Build Coastguard Worker return -ENOENT;
99*b9df5ad1SAndroid Build Coastguard Worker }
100*b9df5ad1SAndroid Build Coastguard Worker *value = *val;
101*b9df5ad1SAndroid Build Coastguard Worker return 0;
102*b9df5ad1SAndroid Build Coastguard Worker }
103*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_get_float(audio_metadata_t * metadata,const char * key,float * value)104*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_get_float(audio_metadata_t *metadata, const char *key, float *value) {
105*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
106*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
107*b9df5ad1SAndroid Build Coastguard Worker }
108*b9df5ad1SAndroid Build Coastguard Worker float *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<float>(key));
109*b9df5ad1SAndroid Build Coastguard Worker if (val == nullptr) {
110*b9df5ad1SAndroid Build Coastguard Worker return -ENOENT;
111*b9df5ad1SAndroid Build Coastguard Worker }
112*b9df5ad1SAndroid Build Coastguard Worker *value = *val;
113*b9df5ad1SAndroid Build Coastguard Worker return 0;
114*b9df5ad1SAndroid Build Coastguard Worker }
115*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_get_double(audio_metadata_t * metadata,const char * key,double * value)116*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_get_double(audio_metadata_t *metadata, const char *key, double *value) {
117*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
118*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
119*b9df5ad1SAndroid Build Coastguard Worker }
120*b9df5ad1SAndroid Build Coastguard Worker double *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<double>(key));
121*b9df5ad1SAndroid Build Coastguard Worker if (val == nullptr) {
122*b9df5ad1SAndroid Build Coastguard Worker return -ENOENT;
123*b9df5ad1SAndroid Build Coastguard Worker }
124*b9df5ad1SAndroid Build Coastguard Worker *value = *val;
125*b9df5ad1SAndroid Build Coastguard Worker return 0;
126*b9df5ad1SAndroid Build Coastguard Worker }
127*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_get_string(audio_metadata_t * metadata,const char * key,char ** value)128*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_get_string(audio_metadata_t *metadata, const char *key, char **value) {
129*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
130*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
131*b9df5ad1SAndroid Build Coastguard Worker }
132*b9df5ad1SAndroid Build Coastguard Worker std::string *valueStr = reinterpret_cast<Data *>(metadata)->get_ptr(Key<std::string>(key));
133*b9df5ad1SAndroid Build Coastguard Worker if (valueStr == nullptr) {
134*b9df5ad1SAndroid Build Coastguard Worker return -ENOENT;
135*b9df5ad1SAndroid Build Coastguard Worker }
136*b9df5ad1SAndroid Build Coastguard Worker *value = strdup(valueStr->c_str());
137*b9df5ad1SAndroid Build Coastguard Worker return *value == nullptr ? -ENOMEM : 0;
138*b9df5ad1SAndroid Build Coastguard Worker }
139*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_get_data(audio_metadata_t * metadata,const char * key,audio_metadata_t ** value)140*b9df5ad1SAndroid Build Coastguard Worker int audio_metadata_get_data(
141*b9df5ad1SAndroid Build Coastguard Worker audio_metadata_t *metadata, const char *key, audio_metadata_t **value) {
142*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr || value == nullptr) {
143*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
144*b9df5ad1SAndroid Build Coastguard Worker }
145*b9df5ad1SAndroid Build Coastguard Worker Data *valueData = reinterpret_cast<Data *>(metadata)->get_ptr(Key<Data>(key));
146*b9df5ad1SAndroid Build Coastguard Worker if (valueData == nullptr) {
147*b9df5ad1SAndroid Build Coastguard Worker *value = nullptr;
148*b9df5ad1SAndroid Build Coastguard Worker return -ENOENT;
149*b9df5ad1SAndroid Build Coastguard Worker }
150*b9df5ad1SAndroid Build Coastguard Worker *value = reinterpret_cast<audio_metadata_t *>(
151*b9df5ad1SAndroid Build Coastguard Worker new(std::nothrow) Data(*valueData));
152*b9df5ad1SAndroid Build Coastguard Worker return *value == nullptr ? -ENOMEM : 0;
153*b9df5ad1SAndroid Build Coastguard Worker }
154*b9df5ad1SAndroid Build Coastguard Worker
155*b9df5ad1SAndroid Build Coastguard Worker // audio_metadata_get_unknown() is declared but not implemented
156*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_erase(audio_metadata_t * metadata,const char * key)157*b9df5ad1SAndroid Build Coastguard Worker ssize_t audio_metadata_erase(audio_metadata_t *metadata, const char *key) {
158*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || key == nullptr) {
159*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
160*b9df5ad1SAndroid Build Coastguard Worker }
161*b9df5ad1SAndroid Build Coastguard Worker return reinterpret_cast<Data *>(metadata)->erase(key);
162*b9df5ad1SAndroid Build Coastguard Worker }
163*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_destroy(audio_metadata_t * metadata)164*b9df5ad1SAndroid Build Coastguard Worker void audio_metadata_destroy(audio_metadata_t *metadata) {
165*b9df5ad1SAndroid Build Coastguard Worker delete reinterpret_cast<Data *>(metadata);
166*b9df5ad1SAndroid Build Coastguard Worker }
167*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_from_byte_string(const uint8_t * byteString,size_t length)168*b9df5ad1SAndroid Build Coastguard Worker audio_metadata_t *audio_metadata_from_byte_string(const uint8_t *byteString, size_t length) {
169*b9df5ad1SAndroid Build Coastguard Worker if (byteString == nullptr) {
170*b9df5ad1SAndroid Build Coastguard Worker return nullptr;
171*b9df5ad1SAndroid Build Coastguard Worker }
172*b9df5ad1SAndroid Build Coastguard Worker return reinterpret_cast<audio_metadata_t *>(
173*b9df5ad1SAndroid Build Coastguard Worker new(std::nothrow) Data(dataFromByteString(ByteString(byteString,
174*b9df5ad1SAndroid Build Coastguard Worker byteString + length))));
175*b9df5ad1SAndroid Build Coastguard Worker }
176*b9df5ad1SAndroid Build Coastguard Worker
byte_string_from_audio_metadata(audio_metadata_t * metadata,uint8_t ** byteString)177*b9df5ad1SAndroid Build Coastguard Worker ssize_t byte_string_from_audio_metadata(audio_metadata_t *metadata, uint8_t **byteString) {
178*b9df5ad1SAndroid Build Coastguard Worker if (metadata == nullptr || byteString == nullptr) {
179*b9df5ad1SAndroid Build Coastguard Worker return -EINVAL;
180*b9df5ad1SAndroid Build Coastguard Worker }
181*b9df5ad1SAndroid Build Coastguard Worker ByteString bs = byteStringFromData(*reinterpret_cast<Data *>(metadata));
182*b9df5ad1SAndroid Build Coastguard Worker *byteString = (uint8_t *) malloc(bs.size());
183*b9df5ad1SAndroid Build Coastguard Worker if (*byteString == nullptr) {
184*b9df5ad1SAndroid Build Coastguard Worker return -ENOMEM;
185*b9df5ad1SAndroid Build Coastguard Worker }
186*b9df5ad1SAndroid Build Coastguard Worker memcpy(*byteString, bs.data(), bs.size());
187*b9df5ad1SAndroid Build Coastguard Worker return bs.size();
188*b9df5ad1SAndroid Build Coastguard Worker }
189*b9df5ad1SAndroid Build Coastguard Worker
audio_metadata_byte_string_len(const uint8_t * byteString)190*b9df5ad1SAndroid Build Coastguard Worker size_t audio_metadata_byte_string_len(const uint8_t *byteString) {
191*b9df5ad1SAndroid Build Coastguard Worker return dataByteStringLen(byteString);
192*b9df5ad1SAndroid Build Coastguard Worker }
193