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.

230 lines
7.4 KiB

/*
* Copyright (C) 2018 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.
*/
#ifndef ANDROID_MICROPHONE_INFO_H
#define ANDROID_MICROPHONE_INFO_H
#include <android/media/MicrophoneInfoData.h>
#include <binder/Parcel.h>
#include <binder/Parcelable.h>
#include <media/AidlConversionUtil.h>
#include <system/audio.h>
namespace android {
namespace media {
class MicrophoneInfo : public Parcelable {
public:
MicrophoneInfo() = default;
MicrophoneInfo(const MicrophoneInfo& microphoneInfo) = default;
MicrophoneInfo(audio_microphone_characteristic_t& characteristic) {
mDeviceId = std::string(&characteristic.device_id[0]);
mPortId = characteristic.id;
mType = characteristic.device;
mAddress = std::string(&characteristic.address[0]);
mDeviceLocation = characteristic.location;
mDeviceGroup = characteristic.group;
mIndexInTheGroup = characteristic.index_in_the_group;
mGeometricLocation.push_back(characteristic.geometric_location.x);
mGeometricLocation.push_back(characteristic.geometric_location.y);
mGeometricLocation.push_back(characteristic.geometric_location.z);
mOrientation.push_back(characteristic.orientation.x);
mOrientation.push_back(characteristic.orientation.y);
mOrientation.push_back(characteristic.orientation.z);
std::vector<float> frequencies;
std::vector<float> responses;
for (size_t i = 0; i < characteristic.num_frequency_responses; i++) {
frequencies.push_back(characteristic.frequency_responses[0][i]);
responses.push_back(characteristic.frequency_responses[1][i]);
}
mFrequencyResponses.push_back(frequencies);
mFrequencyResponses.push_back(responses);
for (size_t i = 0; i < AUDIO_CHANNEL_COUNT_MAX; i++) {
mChannelMapping.push_back(characteristic.channel_mapping[i]);
}
mSensitivity = characteristic.sensitivity;
mMaxSpl = characteristic.max_spl;
mMinSpl = characteristic.min_spl;
mDirectionality = characteristic.directionality;
}
virtual ~MicrophoneInfo() = default;
virtual status_t writeToParcel(Parcel* parcel) const {
MicrophoneInfoData parcelable;
return writeToParcelable(&parcelable)
?: parcelable.writeToParcel(parcel);
}
virtual status_t writeToParcelable(MicrophoneInfoData* parcelable) const {
parcelable->deviceId = mDeviceId;
parcelable->portId = mPortId;
parcelable->type = VALUE_OR_RETURN_STATUS(convertReinterpret<int32_t>(mType));
parcelable->address = mAddress;
parcelable->deviceGroup = mDeviceGroup;
parcelable->indexInTheGroup = mIndexInTheGroup;
parcelable->geometricLocation = mGeometricLocation;
parcelable->orientation = mOrientation;
if (mFrequencyResponses.size() != 2) {
return BAD_VALUE;
}
parcelable->frequencies = mFrequencyResponses[0];
parcelable->frequencyResponses = mFrequencyResponses[1];
parcelable->channelMapping = mChannelMapping;
parcelable->sensitivity = mSensitivity;
parcelable->maxSpl = mMaxSpl;
parcelable->minSpl = mMinSpl;
parcelable->directionality = mDirectionality;
return OK;
}
virtual status_t readFromParcel(const Parcel* parcel) {
MicrophoneInfoData data;
return data.readFromParcel(parcel)
?: readFromParcelable(data);
}
virtual status_t readFromParcelable(const MicrophoneInfoData& parcelable) {
mDeviceId = parcelable.deviceId;
mPortId = parcelable.portId;
mType = VALUE_OR_RETURN_STATUS(convertReinterpret<uint32_t>(parcelable.type));
mAddress = parcelable.address;
mDeviceLocation = parcelable.deviceLocation;
mDeviceGroup = parcelable.deviceGroup;
mIndexInTheGroup = parcelable.indexInTheGroup;
if (parcelable.geometricLocation.size() != 3) {
return BAD_VALUE;
}
mGeometricLocation = parcelable.geometricLocation;
if (parcelable.orientation.size() != 3) {
return BAD_VALUE;
}
mOrientation = parcelable.orientation;
if (parcelable.frequencies.size() != parcelable.frequencyResponses.size()) {
return BAD_VALUE;
}
mFrequencyResponses.push_back(parcelable.frequencies);
mFrequencyResponses.push_back(parcelable.frequencyResponses);
if (parcelable.channelMapping.size() != AUDIO_CHANNEL_COUNT_MAX) {
return BAD_VALUE;
}
mChannelMapping = parcelable.channelMapping;
mSensitivity = parcelable.sensitivity;
mMaxSpl = parcelable.maxSpl;
mMinSpl = parcelable.minSpl;
mDirectionality = parcelable.directionality;
return OK;
}
std::string getDeviceId() const {
return mDeviceId;
}
int getPortId() const {
return mPortId;
}
unsigned int getType() const {
return mType;
}
std::string getAddress() const {
return mAddress;
}
int getDeviceLocation() const {
return mDeviceLocation;
}
int getDeviceGroup() const {
return mDeviceGroup;
}
int getIndexInTheGroup() const {
return mIndexInTheGroup;
}
const std::vector<float>& getGeometricLocation() const {
return mGeometricLocation;
}
const std::vector<float>& getOrientation() const {
return mOrientation;
}
const std::vector<std::vector<float>>& getFrequencyResponses() const {
return mFrequencyResponses;
}
const std::vector<int>& getChannelMapping() const {
return mChannelMapping;
}
float getSensitivity() const {
return mSensitivity;
}
float getMaxSpl() const {
return mMaxSpl;
}
float getMinSpl() const {
return mMinSpl;
}
int getDirectionality() const {
return mDirectionality;
}
private:
std::string mDeviceId;
int32_t mPortId;
uint32_t mType;
std::string mAddress;
int32_t mDeviceLocation;
int32_t mDeviceGroup;
int32_t mIndexInTheGroup;
std::vector<float> mGeometricLocation;
std::vector<float> mOrientation;
std::vector<std::vector<float>> mFrequencyResponses;
std::vector<int> mChannelMapping;
float mSensitivity;
float mMaxSpl;
float mMinSpl;
int32_t mDirectionality;
};
// Conversion routines, according to AidlConversion.h conventions.
inline ConversionResult<MicrophoneInfo>
aidl2legacy_MicrophoneInfo(const media::MicrophoneInfoData& aidl) {
MicrophoneInfo legacy;
RETURN_IF_ERROR(legacy.readFromParcelable(aidl));
return legacy;
}
inline ConversionResult<media::MicrophoneInfoData>
legacy2aidl_MicrophoneInfo(const MicrophoneInfo& legacy) {
media::MicrophoneInfoData aidl;
RETURN_IF_ERROR(legacy.writeToParcelable(&aidl));
return aidl;
}
} // namespace media
} // namespace android
#endif