You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.0 KiB
192 lines
6.0 KiB
/*
|
|
* Copyright 2020 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
|
|
#include <audio_utils/Metadata.h>
|
|
|
|
using namespace android::audio_utils::metadata;
|
|
|
|
audio_metadata_t *audio_metadata_create() {
|
|
return reinterpret_cast<audio_metadata_t *>
|
|
(new(std::nothrow) Data());
|
|
}
|
|
|
|
int audio_metadata_put_int32(audio_metadata_t *metadata, const char *key, int32_t value) {
|
|
if (metadata == nullptr || key == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
reinterpret_cast<Data *>(metadata)->emplace(key, value);
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_put_int64(audio_metadata_t *metadata, const char *key, int64_t value) {
|
|
if (metadata == nullptr || key == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
reinterpret_cast<Data *>(metadata)->emplace(key, value);
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_put_float(audio_metadata_t *metadata, const char *key, float value) {
|
|
if (metadata == nullptr || key == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
reinterpret_cast<Data *>(metadata)->emplace(key, value);
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_put_double(audio_metadata_t *metadata, const char *key, double value) {
|
|
if (metadata == nullptr || key == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
reinterpret_cast<Data *>(metadata)->emplace(key, value);
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_put_string(audio_metadata_t *metadata, const char *key, const char *value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
reinterpret_cast<Data *>(metadata)->emplace(key, value);
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_put_data(
|
|
audio_metadata_t *metadata, const char *key, audio_metadata_t *value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
reinterpret_cast<Data *>(metadata)->emplace(key, *reinterpret_cast<Data *>(value));
|
|
return 0;
|
|
}
|
|
|
|
// audio_metadata_put_unknown() is declared but not implemented
|
|
|
|
int audio_metadata_get_int32(audio_metadata_t *metadata, const char *key, int32_t *value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
int32_t *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<int32_t>(key));
|
|
if (val == nullptr) {
|
|
return -ENOENT;
|
|
}
|
|
*value = *val;
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_get_int64(audio_metadata_t *metadata, const char *key, int64_t *value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
int64_t *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<int64_t>(key));
|
|
if (val == nullptr) {
|
|
return -ENOENT;
|
|
}
|
|
*value = *val;
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_get_float(audio_metadata_t *metadata, const char *key, float *value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
float *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<float>(key));
|
|
if (val == nullptr) {
|
|
return -ENOENT;
|
|
}
|
|
*value = *val;
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_get_double(audio_metadata_t *metadata, const char *key, double *value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
double *val = reinterpret_cast<Data *>(metadata)->get_ptr(Key<double>(key));
|
|
if (val == nullptr) {
|
|
return -ENOENT;
|
|
}
|
|
*value = *val;
|
|
return 0;
|
|
}
|
|
|
|
int audio_metadata_get_string(audio_metadata_t *metadata, const char *key, char **value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
std::string *valueStr = reinterpret_cast<Data *>(metadata)->get_ptr(Key<std::string>(key));
|
|
if (valueStr == nullptr) {
|
|
return -ENOENT;
|
|
}
|
|
*value = strdup(valueStr->c_str());
|
|
return *value == nullptr ? -ENOMEM : 0;
|
|
}
|
|
|
|
int audio_metadata_get_data(
|
|
audio_metadata_t *metadata, const char *key, audio_metadata_t **value) {
|
|
if (metadata == nullptr || key == nullptr || value == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
Data *valueData = reinterpret_cast<Data *>(metadata)->get_ptr(Key<Data>(key));
|
|
if (valueData == nullptr) {
|
|
*value = nullptr;
|
|
return -ENOENT;
|
|
}
|
|
*value = reinterpret_cast<audio_metadata_t *>(
|
|
new(std::nothrow) Data(*valueData));
|
|
return *value == nullptr ? -ENOMEM : 0;
|
|
}
|
|
|
|
// audio_metadata_get_unknown() is declared but not implemented
|
|
|
|
ssize_t audio_metadata_erase(audio_metadata_t *metadata, const char *key) {
|
|
if (metadata == nullptr || key == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
return reinterpret_cast<Data *>(metadata)->erase(key);
|
|
}
|
|
|
|
void audio_metadata_destroy(audio_metadata_t *metadata) {
|
|
delete reinterpret_cast<Data *>(metadata);
|
|
}
|
|
|
|
audio_metadata_t *audio_metadata_from_byte_string(const uint8_t *byteString, size_t length) {
|
|
if (byteString == nullptr) {
|
|
return nullptr;
|
|
}
|
|
return reinterpret_cast<audio_metadata_t *>(
|
|
new(std::nothrow) Data(dataFromByteString(ByteString(byteString, length))));
|
|
}
|
|
|
|
ssize_t byte_string_from_audio_metadata(audio_metadata_t *metadata, uint8_t **byteString) {
|
|
if (metadata == nullptr || byteString == nullptr) {
|
|
return -EINVAL;
|
|
}
|
|
ByteString bs = byteStringFromData(*reinterpret_cast<Data *>(metadata));
|
|
*byteString = (uint8_t *) malloc(bs.size());
|
|
if (*byteString == nullptr) {
|
|
return -ENOMEM;
|
|
}
|
|
memcpy(*byteString, bs.c_str(), bs.size());
|
|
return bs.size();
|
|
}
|
|
|
|
size_t audio_metadata_byte_string_len(const uint8_t *byteString) {
|
|
return dataByteStringLen(byteString);
|
|
}
|