Mark 24Q3 (ab/AP3A.240905.015) as merged
Bug: 347831320
Merged-In: I22393acc260d200d2e472d276c64af005a75ab6b
Change-Id: I02b9538e760df889e18fb507c100e0b84973b0e8
diff --git a/Android.bp b/Android.bp
index e437231..223a1a9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -65,7 +65,6 @@
// All the following are dependencies of any HAL definition library.
"libcutils",
"liblog",
- "libhidlbase",
"libutils",
],
cflags: [
diff --git a/audio/OWNERS b/audio/OWNERS
index 3671685..80e2765 100644
--- a/audio/OWNERS
+++ b/audio/OWNERS
@@ -2,3 +2,4 @@
elaurent@google.com
mnaganov@google.com
+yaoshunkai@google.com
diff --git a/audio/aidl/Android.bp b/audio/aidl/Android.bp
index b67b9d2..4902497 100644
--- a/audio/aidl/Android.bp
+++ b/audio/aidl/Android.bp
@@ -44,7 +44,7 @@
"android/hardware/audio/common/SinkMetadata.aidl",
"android/hardware/audio/common/SourceMetadata.aidl",
],
- frozen: true,
+ frozen: false,
backend: {
cpp: {
enabled: true,
@@ -89,7 +89,7 @@
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_audio_common = "android.hardware.audio.common-V3"
+latest_android_hardware_audio_common = "android.hardware.audio.common-V4"
// Modules that depend on android.hardware.audio.common directly can include
// the following cc_defaults to avoid explicitly managing dependency versions
@@ -198,11 +198,11 @@
// IMPORTANT: Update latest_android_hardware_audio_core every time you
// add the latest frozen version to versions_with_info
],
- frozen: true,
+ frozen: false,
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_audio_core = "android.hardware.audio.core-V2"
+latest_android_hardware_audio_core = "android.hardware.audio.core-V3"
// Modules that depend on android.hardware.audio.core directly can include
// the following cc_defaults to avoid explicitly managing dependency versions
@@ -260,11 +260,11 @@
// IMPORTANT: Update latest_android_hardware_audio_core_sounddose every time you
// add the latest frozen version to versions_with_info
],
- frozen: true,
+ frozen: false,
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_audio_core_sounddose = "android.hardware.audio.core.sounddose-V2"
+latest_android_hardware_audio_core_sounddose = "android.hardware.audio.core.sounddose-V3"
// Modules that depend on android.hardware.audio.core.sounddose directly can include
// the following cc_defaults to avoid explicitly managing dependency versions
@@ -368,11 +368,11 @@
},
],
- frozen: true,
+ frozen: false,
}
-latest_android_hardware_audio_effect = "android.hardware.audio.effect-V2"
+latest_android_hardware_audio_effect = "android.hardware.audio.effect-V3"
cc_defaults {
name: "latest_android_hardware_audio_effect_ndk_shared",
diff --git a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Processing.aidl b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Processing.aidl
index f6d6ee2..96d57d8 100644
--- a/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Processing.aidl
+++ b/audio/aidl/aidl_api/android.hardware.audio.effect/current/android/hardware/audio/effect/Processing.aidl
@@ -40,5 +40,6 @@
union Type {
android.media.audio.common.AudioStreamType streamType = android.media.audio.common.AudioStreamType.INVALID;
android.media.audio.common.AudioSource source;
+ android.media.audio.common.AudioDevice device;
}
}
diff --git a/audio/aidl/android/hardware/audio/effect/Processing.aidl b/audio/aidl/android/hardware/audio/effect/Processing.aidl
index cb77350..928ce16 100644
--- a/audio/aidl/android/hardware/audio/effect/Processing.aidl
+++ b/audio/aidl/android/hardware/audio/effect/Processing.aidl
@@ -17,6 +17,7 @@
package android.hardware.audio.effect;
import android.hardware.audio.effect.Descriptor;
+import android.media.audio.common.AudioDevice;
import android.media.audio.common.AudioSource;
import android.media.audio.common.AudioStreamType;
import android.media.audio.common.AudioUuid;
@@ -30,6 +31,7 @@
union Type {
AudioStreamType streamType = AudioStreamType.INVALID;
AudioSource source;
+ AudioDevice device;
}
/**
diff --git a/audio/aidl/common/include/Utils.h b/audio/aidl/common/include/Utils.h
index b431340..6241f44 100644
--- a/audio/aidl/common/include/Utils.h
+++ b/audio/aidl/common/include/Utils.h
@@ -26,6 +26,7 @@
#include <aidl/android/media/audio/common/AudioDeviceType.h>
#include <aidl/android/media/audio/common/AudioFormatDescription.h>
#include <aidl/android/media/audio/common/AudioInputFlags.h>
+#include <aidl/android/media/audio/common/AudioIoFlags.h>
#include <aidl/android/media/audio/common/AudioMode.h>
#include <aidl/android/media/audio/common/AudioOutputFlags.h>
#include <aidl/android/media/audio/common/PcmType.h>
@@ -191,4 +192,15 @@
return frameCountFromDurationUs(durationMs * 1000, sampleRateHz);
}
+constexpr bool hasMmapFlag(const ::aidl::android::media::audio::common::AudioIoFlags& flags) {
+ return (flags.getTag() == ::aidl::android::media::audio::common::AudioIoFlags::Tag::input &&
+ isBitPositionFlagSet(
+ flags.get<::aidl::android::media::audio::common::AudioIoFlags::Tag::input>(),
+ ::aidl::android::media::audio::common::AudioInputFlags::MMAP_NOIRQ)) ||
+ (flags.getTag() == ::aidl::android::media::audio::common::AudioIoFlags::Tag::output &&
+ isBitPositionFlagSet(
+ flags.get<::aidl::android::media::audio::common::AudioIoFlags::Tag::output>(),
+ ::aidl::android::media::audio::common::AudioOutputFlags::MMAP_NOIRQ));
+}
+
} // namespace aidl::android::hardware::audio::common
diff --git a/audio/aidl/default/Android.bp b/audio/aidl/default/Android.bp
index 844f1e9..f5b590b 100644
--- a/audio/aidl/default/Android.bp
+++ b/audio/aidl/default/Android.bp
@@ -203,6 +203,7 @@
],
vendor: true,
shared_libs: [
+ "libaudio_aidl_conversion_common_ndk",
"libaudioaidlcommon",
"libaudioutils",
"libbase",
@@ -224,6 +225,7 @@
"-Wextra",
"-Werror",
"-Wthread-safety",
+ "-DBACKEND_NDK",
],
}
diff --git a/audio/aidl/default/EffectConfig.cpp b/audio/aidl/default/EffectConfig.cpp
index eb0c015..9c335ba 100644
--- a/audio/aidl/default/EffectConfig.cpp
+++ b/audio/aidl/default/EffectConfig.cpp
@@ -18,6 +18,8 @@
#include <string>
#define LOG_TAG "AHAL_EffectConfig"
#include <android-base/logging.h>
+#include <media/AidlConversionCppNdk.h>
+#include <system/audio.h>
#include <system/audio_aidl_utils.h>
#include <system/audio_effects/audio_effects_conf.h>
#include <system/audio_effects/effect_uuid.h>
@@ -28,6 +30,10 @@
#include <android/apexsupport.h>
#endif
+using aidl::android::media::audio::common::AudioDevice;
+using aidl::android::media::audio::common::AudioDeviceAddress;
+using aidl::android::media::audio::common::AudioDeviceDescription;
+using aidl::android::media::audio::common::AudioDeviceType;
using aidl::android::media::audio::common::AudioSource;
using aidl::android::media::audio::common::AudioStreamType;
using aidl::android::media::audio::common::AudioUuid;
@@ -76,6 +82,14 @@
registerFailure(parseProcessing(Processing::Type::streamType, xmlStream));
}
}
+
+ // Parse device effect chains
+ for (auto& xmlDeviceEffects : getChildren(xmlConfig, "deviceEffects")) {
+ for (auto& xmlDevice : getChildren(xmlDeviceEffects, "device")) {
+ // AudioDevice
+ registerFailure(parseProcessing(Processing::Type::device, xmlDevice));
+ }
+ }
}
LOG(DEBUG) << __func__ << " successfully parsed " << file << ", skipping " << mSkippedElements
<< " element(s)";
@@ -195,7 +209,8 @@
}
std::optional<Processing::Type> EffectConfig::stringToProcessingType(Processing::Type::Tag typeTag,
- const std::string& type) {
+ const std::string& type,
+ const std::string& address) {
// see list of audio stream types in audio_stream_type_t:
// system/media/audio/include/system/audio_effects/audio_effects_conf.h
// AUDIO_STREAM_DEFAULT_TAG is not listed here because according to SYS_RESERVED_DEFAULT in
@@ -238,6 +253,19 @@
if (typeIter != sAudioSourceTable.end()) {
return typeIter->second;
}
+ } else if (typeTag == Processing::Type::device) {
+ audio_devices_t deviceType;
+ if (!audio_device_from_string(type.c_str(), &deviceType)) {
+ LOG(ERROR) << __func__ << "DeviceEffect: invalid type " << type;
+ return std::nullopt;
+ }
+ auto ret = ::aidl::android::legacy2aidl_audio_device_AudioDevice(deviceType, address);
+ if (!ret.ok()) {
+ LOG(ERROR) << __func__ << "DeviceEffect: Failed to get AudioDevice from type "
+ << deviceType << ", address " << address;
+ return std::nullopt;
+ }
+ return ret.value();
}
return std::nullopt;
@@ -246,7 +274,10 @@
bool EffectConfig::parseProcessing(Processing::Type::Tag typeTag, const tinyxml2::XMLElement& xml) {
LOG(VERBOSE) << __func__ << dump(xml);
const char* typeStr = xml.Attribute("type");
- auto aidlType = stringToProcessingType(typeTag, typeStr);
+ const char* addressStr = xml.Attribute("address");
+ // For device effect, device address is optional, match will be done for the given device type
+ // with empty address.
+ auto aidlType = stringToProcessingType(typeTag, typeStr, addressStr ? addressStr : "");
RETURN_VALUE_IF(!aidlType.has_value(), false, "illegalStreamType");
RETURN_VALUE_IF(0 != mProcessingMap.count(aidlType.value()), false, "duplicateStreamType");
diff --git a/audio/aidl/default/EffectContext.cpp b/audio/aidl/default/EffectContext.cpp
index 7b8cfb1..5539177 100644
--- a/audio/aidl/default/EffectContext.cpp
+++ b/audio/aidl/default/EffectContext.cpp
@@ -242,4 +242,17 @@
LOG(VERBOSE) << __func__ << " : signal client for reopen";
return RetCode::SUCCESS;
}
+
+RetCode EffectContext::enable() {
+ return RetCode::SUCCESS;
+}
+
+RetCode EffectContext::disable() {
+ return RetCode::SUCCESS;
+}
+
+RetCode EffectContext::reset() {
+ return RetCode::SUCCESS;
+}
+
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/EffectImpl.cpp b/audio/aidl/default/EffectImpl.cpp
index 7192d97..3e61335 100644
--- a/audio/aidl/default/EffectImpl.cpp
+++ b/audio/aidl/default/EffectImpl.cpp
@@ -246,7 +246,6 @@
startThread();
break;
case CommandId::STOP:
- case CommandId::RESET:
RETURN_OK_IF(mState == State::IDLE);
mState = State::IDLE;
RETURN_IF(notifyEventFlag(mDataMqNotEmptyEf) != RetCode::SUCCESS, EX_ILLEGAL_STATE,
@@ -254,6 +253,13 @@
stopThread();
RETURN_IF_ASTATUS_NOT_OK(commandImpl(command), "commandImplFailed");
break;
+ case CommandId::RESET:
+ mState = State::IDLE;
+ RETURN_IF(notifyEventFlag(mDataMqNotEmptyEf) != RetCode::SUCCESS, EX_ILLEGAL_STATE,
+ "notifyEventFlagNotEmptyFailed");
+ stopThread();
+ RETURN_IF_ASTATUS_NOT_OK(commandImpl(command), "commandImplFailed");
+ break;
default:
LOG(ERROR) << getEffectNameWithVersion() << __func__ << " instance still processing";
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
@@ -266,8 +272,22 @@
ndk::ScopedAStatus EffectImpl::commandImpl(CommandId command) {
RETURN_IF(!mImplContext, EX_NULL_POINTER, "nullContext");
- if (command == CommandId::RESET) {
- mImplContext->resetBuffer();
+ switch (command) {
+ case CommandId::START:
+ mImplContext->enable();
+ break;
+ case CommandId::STOP:
+ mImplContext->disable();
+ break;
+ case CommandId::RESET:
+ mImplContext->disable();
+ mImplContext->reset();
+ mImplContext->resetBuffer();
+ break;
+ default:
+ LOG(ERROR) << __func__ << " commandId " << toString(command) << " not supported";
+ return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+ "commandIdNotSupported");
}
return ndk::ScopedAStatus::ok();
}
diff --git a/audio/aidl/default/EffectMain.cpp b/audio/aidl/default/EffectMain.cpp
index a300cfd..7a6141a 100644
--- a/audio/aidl/default/EffectMain.cpp
+++ b/audio/aidl/default/EffectMain.cpp
@@ -38,7 +38,7 @@
candidatePath.append(apexName).append("/etc/").append(kDefaultConfigName);
LOG(DEBUG) << __func__ << " effect lib path " << candidatePath;
if (access(candidatePath.c_str(), R_OK) == 0) {
- return std::move(candidatePath);
+ return candidatePath;
}
}
} else {
diff --git a/audio/aidl/default/Module.cpp b/audio/aidl/default/Module.cpp
index 0d6151e..c14d06e 100644
--- a/audio/aidl/default/Module.cpp
+++ b/audio/aidl/default/Module.cpp
@@ -36,6 +36,7 @@
using aidl::android::hardware::audio::common::frameCountFromDurationMs;
using aidl::android::hardware::audio::common::getFrameSizeInBytes;
+using aidl::android::hardware::audio::common::hasMmapFlag;
using aidl::android::hardware::audio::common::isBitPositionFlagSet;
using aidl::android::hardware::audio::common::isValidAudioMode;
using aidl::android::hardware::audio::common::SinkMetadata;
@@ -205,35 +206,31 @@
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
const auto& flags = portConfigIt->flags.value();
- if ((flags.getTag() == AudioIoFlags::Tag::input &&
- !isBitPositionFlagSet(flags.get<AudioIoFlags::Tag::input>(),
- AudioInputFlags::MMAP_NOIRQ)) ||
- (flags.getTag() == AudioIoFlags::Tag::output &&
- !isBitPositionFlagSet(flags.get<AudioIoFlags::Tag::output>(),
- AudioOutputFlags::MMAP_NOIRQ))) {
- StreamContext::DebugParameters params{mDebug.streamTransientStateDelayMs,
- mVendorDebug.forceTransientBurst,
- mVendorDebug.forceSynchronousDrain};
- std::shared_ptr<ISoundDose> soundDose;
- if (!getSoundDose(&soundDose).isOk()) {
- LOG(ERROR) << __func__ << ": could not create sound dose instance";
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
- }
- StreamContext temp(
- std::make_unique<StreamContext::CommandMQ>(1, true /*configureEventFlagWord*/),
- std::make_unique<StreamContext::ReplyMQ>(1, true /*configureEventFlagWord*/),
- portConfigIt->format.value(), portConfigIt->channelMask.value(),
- portConfigIt->sampleRate.value().value, flags, nominalLatencyMs,
- portConfigIt->ext.get<AudioPortExt::mix>().handle,
- std::make_unique<StreamContext::DataMQ>(frameSize * in_bufferSizeFrames),
- asyncCallback, outEventCallback, mSoundDose.getInstance(), params);
- if (temp.isValid()) {
- *out_context = std::move(temp);
- } else {
- return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
- }
+ StreamContext::DebugParameters params{mDebug.streamTransientStateDelayMs,
+ mVendorDebug.forceTransientBurst,
+ mVendorDebug.forceSynchronousDrain};
+ std::unique_ptr<StreamContext::DataMQ> dataMQ = nullptr;
+ std::shared_ptr<IStreamCallback> streamAsyncCallback = nullptr;
+ std::shared_ptr<ISoundDose> soundDose;
+ if (!getSoundDose(&soundDose).isOk()) {
+ LOG(ERROR) << __func__ << ": could not create sound dose instance";
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+ }
+ if (!hasMmapFlag(flags)) {
+ dataMQ = std::make_unique<StreamContext::DataMQ>(frameSize * in_bufferSizeFrames);
+ streamAsyncCallback = asyncCallback;
+ }
+ StreamContext temp(
+ std::make_unique<StreamContext::CommandMQ>(1, true /*configureEventFlagWord*/),
+ std::make_unique<StreamContext::ReplyMQ>(1, true /*configureEventFlagWord*/),
+ portConfigIt->format.value(), portConfigIt->channelMask.value(),
+ portConfigIt->sampleRate.value().value, flags, nominalLatencyMs,
+ portConfigIt->ext.get<AudioPortExt::mix>().handle, std::move(dataMQ),
+ streamAsyncCallback, outEventCallback, mSoundDose.getInstance(), params);
+ if (temp.isValid()) {
+ *out_context = std::move(temp);
} else {
- // TODO: Implement simulation of MMAP buffer allocation
+ return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
}
return ndk::ScopedAStatus::ok();
}
@@ -373,6 +370,13 @@
return kLatencyMs;
}
+ndk::ScopedAStatus Module::createMmapBuffer(
+ const ::aidl::android::hardware::audio::core::StreamContext& context __unused,
+ ::aidl::android::hardware::audio::core::StreamDescriptor* desc __unused) {
+ LOG(ERROR) << __func__ << ": " << mType << ": is not implemented";
+ return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
std::vector<AudioRoute*> Module::getAudioRoutesForAudioPortImpl(int32_t portId) {
std::vector<AudioRoute*> result;
auto& routes = getConfig().routes;
@@ -387,7 +391,7 @@
Module::Configuration& Module::getConfig() {
if (!mConfig) {
- mConfig = std::move(initializeConfig());
+ mConfig = initializeConfig();
}
return *mConfig;
}
@@ -866,6 +870,9 @@
RETURN_STATUS_IF_ERROR(createStreamContext(in_args.portConfigId, in_args.bufferSizeFrames,
nullptr, nullptr, &context));
context.fillDescriptor(&_aidl_return->desc);
+ if (hasMmapFlag(context.getFlags())) {
+ RETURN_STATUS_IF_ERROR(createMmapBuffer(context, &_aidl_return->desc));
+ }
std::shared_ptr<StreamIn> stream;
RETURN_STATUS_IF_ERROR(createInputStream(std::move(context), in_args.sinkMetadata,
getMicrophoneInfos(), &stream));
@@ -913,6 +920,9 @@
isNonBlocking ? in_args.callback : nullptr,
in_args.eventCallback, &context));
context.fillDescriptor(&_aidl_return->desc);
+ if (hasMmapFlag(context.getFlags())) {
+ RETURN_STATUS_IF_ERROR(createMmapBuffer(context, &_aidl_return->desc));
+ }
std::shared_ptr<StreamOut> stream;
RETURN_STATUS_IF_ERROR(createOutputStream(std::move(context), in_args.sourceMetadata,
in_args.offloadInfo, &stream));
diff --git a/audio/aidl/default/Stream.cpp b/audio/aidl/default/Stream.cpp
index 31b0645..389860f 100644
--- a/audio/aidl/default/Stream.cpp
+++ b/audio/aidl/default/Stream.cpp
@@ -30,6 +30,7 @@
using aidl::android::hardware::audio::common::AudioOffloadMetadata;
using aidl::android::hardware::audio::common::getChannelCount;
using aidl::android::hardware::audio::common::getFrameSizeInBytes;
+using aidl::android::hardware::audio::common::hasMmapFlag;
using aidl::android::hardware::audio::common::isBitPositionFlagSet;
using aidl::android::hardware::audio::common::SinkMetadata;
using aidl::android::hardware::audio::common::SourceMetadata;
@@ -84,7 +85,7 @@
LOG(ERROR) << "frame size is invalid";
return false;
}
- if (mDataMQ && !mDataMQ->isValid()) {
+ if (!hasMmapFlag(mFlags) && mDataMQ && !mDataMQ->isValid()) {
LOG(ERROR) << "data FMQ is invalid";
return false;
}
@@ -116,17 +117,19 @@
std::string StreamWorkerCommonLogic::init() {
if (mContext->getCommandMQ() == nullptr) return "Command MQ is null";
if (mContext->getReplyMQ() == nullptr) return "Reply MQ is null";
- StreamContext::DataMQ* const dataMQ = mContext->getDataMQ();
- if (dataMQ == nullptr) return "Data MQ is null";
- if (sizeof(DataBufferElement) != dataMQ->getQuantumSize()) {
- return "Unexpected Data MQ quantum size: " + std::to_string(dataMQ->getQuantumSize());
- }
- mDataBufferSize = dataMQ->getQuantumCount() * dataMQ->getQuantumSize();
- mDataBuffer.reset(new (std::nothrow) DataBufferElement[mDataBufferSize]);
- if (mDataBuffer == nullptr) {
- return "Failed to allocate data buffer for element count " +
- std::to_string(dataMQ->getQuantumCount()) +
- ", size in bytes: " + std::to_string(mDataBufferSize);
+ if (!hasMmapFlag(mContext->getFlags())) {
+ StreamContext::DataMQ* const dataMQ = mContext->getDataMQ();
+ if (dataMQ == nullptr) return "Data MQ is null";
+ if (sizeof(DataBufferElement) != dataMQ->getQuantumSize()) {
+ return "Unexpected Data MQ quantum size: " + std::to_string(dataMQ->getQuantumSize());
+ }
+ mDataBufferSize = dataMQ->getQuantumCount() * dataMQ->getQuantumSize();
+ mDataBuffer.reset(new (std::nothrow) DataBufferElement[mDataBufferSize]);
+ if (mDataBuffer == nullptr) {
+ return "Failed to allocate data buffer for element count " +
+ std::to_string(dataMQ->getQuantumCount()) +
+ ", size in bytes: " + std::to_string(mDataBufferSize);
+ }
}
if (::android::status_t status = mDriver->init(); status != STATUS_OK) {
return "Failed to initialize the driver: " + std::to_string(status);
@@ -136,16 +139,26 @@
void StreamWorkerCommonLogic::populateReply(StreamDescriptor::Reply* reply,
bool isConnected) const {
+ static const StreamDescriptor::Position kUnknownPosition = {
+ .frames = StreamDescriptor::Position::UNKNOWN,
+ .timeNs = StreamDescriptor::Position::UNKNOWN};
reply->status = STATUS_OK;
if (isConnected) {
reply->observable.frames = mContext->getFrameCount();
reply->observable.timeNs = ::android::uptimeNanos();
- if (auto status = mDriver->refinePosition(&reply->observable); status == ::android::OK) {
- return;
+ if (auto status = mDriver->refinePosition(&reply->observable); status != ::android::OK) {
+ reply->observable = kUnknownPosition;
+ }
+ } else {
+ reply->observable = reply->hardware = kUnknownPosition;
+ }
+ if (hasMmapFlag(mContext->getFlags())) {
+ if (auto status = mDriver->getMmapPositionAndLatency(&reply->hardware, &reply->latencyMs);
+ status != ::android::OK) {
+ reply->hardware = kUnknownPosition;
+ reply->latencyMs = StreamDescriptor::LATENCY_UNKNOWN;
}
}
- reply->observable.frames = StreamDescriptor::Position::UNKNOWN;
- reply->observable.timeNs = StreamDescriptor::Position::UNKNOWN;
}
void StreamWorkerCommonLogic::populateReplyWrongState(
@@ -224,7 +237,9 @@
mState == StreamDescriptor::State::ACTIVE ||
mState == StreamDescriptor::State::PAUSED ||
mState == StreamDescriptor::State::DRAINING) {
- if (!read(fmqByteCount, &reply)) {
+ if (hasMmapFlag(mContext->getFlags())) {
+ populateReply(&reply, mIsConnected);
+ } else if (!read(fmqByteCount, &reply)) {
mState = StreamDescriptor::State::ERROR;
}
if (mState == StreamDescriptor::State::IDLE ||
@@ -470,7 +485,9 @@
if (mState != StreamDescriptor::State::ERROR &&
mState != StreamDescriptor::State::TRANSFERRING &&
mState != StreamDescriptor::State::TRANSFER_PAUSED) {
- if (!write(fmqByteCount, &reply)) {
+ if (hasMmapFlag(mContext->getFlags())) {
+ populateReply(&reply, mIsConnected);
+ } else if (!write(fmqByteCount, &reply)) {
mState = StreamDescriptor::State::ERROR;
}
std::shared_ptr<IStreamCallback> asyncCallback = mContext->getAsyncCallback();
@@ -657,6 +674,7 @@
const std::shared_ptr<StreamCommonInterface>& delegate) {
mCommon = ndk::SharedRefBase::make<StreamCommonDelegator>(delegate);
if (!mWorker->start()) {
+ LOG(ERROR) << __func__ << ": Worker start error: " << mWorker->getError();
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
}
if (auto flags = getContext().getFlags();
@@ -754,7 +772,7 @@
if (!isClosed()) {
stopWorker();
LOG(DEBUG) << __func__ << ": joining the worker thread...";
- mWorker->stop();
+ mWorker->join();
LOG(DEBUG) << __func__ << ": worker thread joined";
onClose(mWorker->setClosed());
return ndk::ScopedAStatus::ok();
diff --git a/audio/aidl/default/alsa/Utils.cpp b/audio/aidl/default/alsa/Utils.cpp
index c08836c..8eaf162 100644
--- a/audio/aidl/default/alsa/Utils.cpp
+++ b/audio/aidl/default/alsa/Utils.cpp
@@ -80,11 +80,8 @@
const AudioChannelCountToMaskMap& getSupportedChannelOutLayoutMap() {
static const std::set<AudioChannelLayout> supportedOutChannelLayouts = {
- DEFINE_CHANNEL_LAYOUT_MASK(MONO), DEFINE_CHANNEL_LAYOUT_MASK(STEREO),
- DEFINE_CHANNEL_LAYOUT_MASK(2POINT1), DEFINE_CHANNEL_LAYOUT_MASK(QUAD),
- DEFINE_CHANNEL_LAYOUT_MASK(PENTA), DEFINE_CHANNEL_LAYOUT_MASK(5POINT1),
- DEFINE_CHANNEL_LAYOUT_MASK(6POINT1), DEFINE_CHANNEL_LAYOUT_MASK(7POINT1),
- DEFINE_CHANNEL_LAYOUT_MASK(7POINT1POINT4), DEFINE_CHANNEL_LAYOUT_MASK(22POINT2),
+ DEFINE_CHANNEL_LAYOUT_MASK(MONO),
+ DEFINE_CHANNEL_LAYOUT_MASK(STEREO),
};
static const AudioChannelCountToMaskMap outLayouts =
make_ChannelCountToMaskMap(supportedOutChannelLayouts);
diff --git a/audio/aidl/default/android.hardware.audio.service-aidl.xml b/audio/aidl/default/android.hardware.audio.service-aidl.xml
index 5278e4f..27f48e2 100644
--- a/audio/aidl/default/android.hardware.audio.service-aidl.xml
+++ b/audio/aidl/default/android.hardware.audio.service-aidl.xml
@@ -1,39 +1,39 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.audio.core</name>
- <version>2</version>
+ <version>3</version>
<fqname>IModule/default</fqname>
</hal>
<hal format="aidl">
<name>android.hardware.audio.core</name>
- <version>2</version>
+ <version>3</version>
<fqname>IModule/r_submix</fqname>
</hal>
<hal format="aidl">
<name>android.hardware.audio.core</name>
- <version>2</version>
+ <version>3</version>
<fqname>IModule/bluetooth</fqname>
</hal>
<hal format="aidl">
<name>android.hardware.audio.core</name>
- <version>2</version>
+ <version>3</version>
<fqname>IConfig/default</fqname>
</hal>
<!-- Uncomment when these modules present in the configuration
<hal format="aidl">
<name>android.hardware.audio.core</name>
- <version>1</version>
+ <version>3</version>
<fqname>IModule/stub</fqname>
</hal>
<hal format="aidl">
<name>android.hardware.audio.core</name>
- <version>1</version>
+ <version>3</version>
<fqname>IModule/usb</fqname>
</hal>
-->
<hal format="aidl">
<name>android.hardware.audio.effect</name>
- <version>2</version>
+ <version>3</version>
<fqname>IFactory/default</fqname>
</hal>
</manifest>
diff --git a/audio/aidl/default/audio_effects_config.xml b/audio/aidl/default/audio_effects_config.xml
index c01eb3f..a54f4db 100644
--- a/audio/aidl/default/audio_effects_config.xml
+++ b/audio/aidl/default/audio_effects_config.xml
@@ -88,7 +88,6 @@
<effect name="extension_effect" library="extensioneffect" uuid="fa81dd00-588b-11ed-9b6a-0242ac120002" type="fa81de0e-588b-11ed-9b6a-0242ac120002"/>
<effect name="acoustic_echo_canceler" library="pre_processing" uuid="bb392ec0-8d4d-11e0-a896-0002a5d5c51b"/>
<effect name="noise_suppression" library="pre_processing" uuid="c06c8400-8e06-11e0-9cb6-0002a5d5c51b"/>
- <effect name="spatializer" library="spatializersw" uuid="fa81a880-588b-11ed-9b6a-0242ac120002"/>
</effects>
<preprocess>
@@ -141,4 +140,37 @@
</postprocess>
-->
+ <!-- Device pre/post processor configurations.
+ The device pre/post processor configuration is described in a deviceEffects element and
+ consists in a list of elements each describing pre/post processor settings for a given
+ device.
+ Each device element has a "type" attribute corresponding to the device type (e.g.
+ speaker, bus), an "address" attribute corresponding to the device address and contains a
+ list of "apply" elements indicating one effect to apply.
+ If the device is a source, only pre processing effects are expected, if the
+ device is a sink, only post processing effects are expected.
+ The effect to apply is designated by its name in the "effects" elements.
+ The effect will be enabled by default and the audio framework will automatically add
+ and activate the effect if the given port is involved in an audio patch.
+ If the patch is "HW", the effect must be HW accelerated.
+ Note:
+ -Device are not expected to be always attached. It may be loaded dynamically. As the device
+ effect manager is getting called on any audio patch operation, it will ensure if the given
+ device is involved in an audio patch and attach the requested effect.
+ -Address is optional. If not set, the match to instantiate the device effect will be done
+ using the given type and device (of this type) with empty address only.
+
+ <deviceEffects>
+ <device type="AUDIO_DEVICE_OUT_BUS" address="BUS00_USAGE_MAIN">
+ <apply effect="equalizer"/>
+ </device>
+ <device type="AUDIO_DEVICE_OUT_BUS" address="BUS04_USAGE_VOICE">
+ <apply effect="volume"/>
+ </device>
+ <device type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
+ <apply effect="agc"/>
+ </device>
+ </deviceEffects>
+ -->
+
</audio_effects_conf>
diff --git a/audio/aidl/default/include/core-impl/Module.h b/audio/aidl/default/include/core-impl/Module.h
index a326217..00eeb4e 100644
--- a/audio/aidl/default/include/core-impl/Module.h
+++ b/audio/aidl/default/include/core-impl/Module.h
@@ -205,6 +205,9 @@
virtual std::unique_ptr<Configuration> initializeConfig();
virtual int32_t getNominalLatencyMs(
const ::aidl::android::media::audio::common::AudioPortConfig& portConfig);
+ virtual ndk::ScopedAStatus createMmapBuffer(
+ const ::aidl::android::hardware::audio::core::StreamContext& context,
+ ::aidl::android::hardware::audio::core::StreamDescriptor* desc);
// Utility and helper functions accessible to subclasses.
static int32_t calculateBufferSizeFrames(int32_t latencyMs, int32_t sampleRateHz) {
diff --git a/audio/aidl/default/include/core-impl/Stream.h b/audio/aidl/default/include/core-impl/Stream.h
index 21e63f9..93ace96 100644
--- a/audio/aidl/default/include/core-impl/Stream.h
+++ b/audio/aidl/default/include/core-impl/Stream.h
@@ -177,6 +177,11 @@
virtual ::android::status_t refinePosition(StreamDescriptor::Position* /*position*/) {
return ::android::OK;
}
+ // Implement 'getMmapPositionAndLatency' is necessary if driver can support mmap stream.
+ virtual ::android::status_t getMmapPositionAndLatency(StreamDescriptor::Position* /*position*/,
+ int32_t* /*latency*/) {
+ return ::android::OK;
+ }
virtual void shutdown() = 0; // This function is only called once.
};
@@ -240,7 +245,8 @@
virtual StreamDescriptor::State setClosed() = 0;
virtual bool start() = 0;
virtual pid_t getTid() = 0;
- virtual void stop() = 0;
+ virtual void join() = 0;
+ virtual std::string getError() = 0;
};
template <class WorkerLogic>
@@ -259,7 +265,8 @@
return WorkerImpl::start(WorkerImpl::kThreadName, ANDROID_PRIORITY_URGENT_AUDIO);
}
pid_t getTid() override { return WorkerImpl::getTid(); }
- void stop() override { return WorkerImpl::stop(); }
+ void join() override { return WorkerImpl::join(); }
+ std::string getError() override { return WorkerImpl::getError(); }
};
class StreamInWorkerLogic : public StreamWorkerCommonLogic {
diff --git a/audio/aidl/default/include/effect-impl/EffectContext.h b/audio/aidl/default/include/effect-impl/EffectContext.h
index 275378e..02a4caa 100644
--- a/audio/aidl/default/include/effect-impl/EffectContext.h
+++ b/audio/aidl/default/include/effect-impl/EffectContext.h
@@ -82,6 +82,10 @@
virtual ::android::hardware::EventFlag* getStatusEventFlag();
+ virtual RetCode enable();
+ virtual RetCode disable();
+ virtual RetCode reset();
+
protected:
int mVersion = 0;
size_t mInputFrameSize = 0;
diff --git a/audio/aidl/default/include/effectFactory-impl/EffectConfig.h b/audio/aidl/default/include/effectFactory-impl/EffectConfig.h
index 7456b99..60bb9be 100644
--- a/audio/aidl/default/include/effectFactory-impl/EffectConfig.h
+++ b/audio/aidl/default/include/effectFactory-impl/EffectConfig.h
@@ -81,7 +81,7 @@
/* Parsed Effects result */
std::unordered_map<std::string, struct EffectLibraries> mEffectsMap;
/**
- * For parsed pre/post processing result: {key: AudioStreamType/AudioSource, value:
+ * For parsed pre/post processing result: {key: AudioStreamType/AudioSource/AudioDevice, value:
* EffectLibraries}
*/
ProcessingLibrariesMap mProcessingMap;
@@ -110,7 +110,8 @@
bool resolveLibrary(const std::string& path, std::string* resolvedPath);
std::optional<Processing::Type> stringToProcessingType(Processing::Type::Tag typeTag,
- const std::string& type);
+ const std::string& type,
+ const std::string& address);
};
} // namespace aidl::android::hardware::audio::effect
diff --git a/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp b/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp
index ca3f91a..a266b54 100644
--- a/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp
+++ b/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp
@@ -285,9 +285,12 @@
char* buff = (char*)buffer;
size_t actuallyRead = 0;
long remainingFrames = frameCount;
- const int64_t deadlineTimeNs =
- ::android::uptimeNanos() +
- getDelayInUsForFrameCount(frameCount) * NANOS_PER_MICROSECOND / 2;
+ // Try to wait as long as possible for the audio duration, but leave some time for the call to
+ // 'transfer' to complete. 'kReadAttemptSleepUs' is a good constant for this purpose because it
+ // is by definition "strictly inferior" to the typical buffer duration.
+ const long durationUs =
+ std::max(0L, getDelayInUsForFrameCount(frameCount) - kReadAttemptSleepUs);
+ const int64_t deadlineTimeNs = ::android::uptimeNanos() + durationUs * NANOS_PER_MICROSECOND;
while (remainingFrames > 0) {
ssize_t framesRead = source->read(buff, remainingFrames);
LOG(VERBOSE) << __func__ << ": frames read " << framesRead;
diff --git a/audio/aidl/sounddose/Android.bp b/audio/aidl/sounddose/Android.bp
index de3ed64..8b2d74b 100644
--- a/audio/aidl/sounddose/Android.bp
+++ b/audio/aidl/sounddose/Android.bp
@@ -56,11 +56,11 @@
// IMPORTANT: Update latest_android_hardware_audio_sounddose every time you
// add the latest frozen version to versions_with_info
],
- frozen: true,
+ frozen: false,
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_audio_sounddose = "android.hardware.audio.sounddose-V2"
+latest_android_hardware_audio_sounddose = "android.hardware.audio.sounddose-V3"
// Modules that depend on android.hardware.audio.sounddose directly can include
// the following cc_defaults to avoid explicitly managing dependency versions
diff --git a/audio/aidl/vts/EffectHelper.h b/audio/aidl/vts/EffectHelper.h
index 72a4667..0fa170f 100644
--- a/audio/aidl/vts/EffectHelper.h
+++ b/audio/aidl/vts/EffectHelper.h
@@ -92,6 +92,7 @@
ASSERT_STATUS(status, factory->createEffect(id.uuid, &effect));
if (status == EX_NONE) {
ASSERT_NE(effect, nullptr) << toString(id.uuid);
+ ASSERT_NO_FATAL_FAILURE(expectState(effect, State::INIT));
}
mIsSpatializer = id.type == getEffectTypeUuidSpatializer();
mDescriptor = desc;
@@ -111,11 +112,17 @@
ASSERT_STATUS(status, factory->destroyEffect(effect));
}
- static void open(std::shared_ptr<IEffect> effect, const Parameter::Common& common,
- const std::optional<Parameter::Specific>& specific,
- IEffect::OpenEffectReturn* ret, binder_status_t status = EX_NONE) {
+ void open(std::shared_ptr<IEffect> effect, const Parameter::Common& common,
+ const std::optional<Parameter::Specific>& specific, IEffect::OpenEffectReturn* ret,
+ binder_status_t status = EX_NONE) {
ASSERT_NE(effect, nullptr);
ASSERT_STATUS(status, effect->open(common, specific, ret));
+ if (status != EX_NONE) {
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(expectState(effect, State::IDLE));
+ updateFrameSize(common);
}
void open(std::shared_ptr<IEffect> effect, int session = 0, binder_status_t status = EX_NONE) {
@@ -125,21 +132,37 @@
ASSERT_NO_FATAL_FAILURE(open(effect, common, std::nullopt /* specific */, &ret, status));
}
+ void reopen(std::shared_ptr<IEffect> effect, const Parameter::Common& common,
+ IEffect::OpenEffectReturn* ret, binder_status_t status = EX_NONE) {
+ ASSERT_NE(effect, nullptr);
+ ASSERT_STATUS(status, effect->reopen(ret));
+ if (status != EX_NONE) {
+ return;
+ }
+ updateFrameSize(common);
+ }
+
static void closeIgnoreRet(std::shared_ptr<IEffect> effect) {
if (effect) {
effect->close();
}
}
+
static void close(std::shared_ptr<IEffect> effect, binder_status_t status = EX_NONE) {
if (effect) {
ASSERT_STATUS(status, effect->close());
+ if (status == EX_NONE) {
+ ASSERT_NO_FATAL_FAILURE(expectState(effect, State::INIT));
+ }
}
}
+
static void getDescriptor(std::shared_ptr<IEffect> effect, Descriptor& desc,
binder_status_t status = EX_NONE) {
ASSERT_NE(effect, nullptr);
ASSERT_STATUS(status, effect->getDescriptor(&desc));
}
+
static void expectState(std::shared_ptr<IEffect> effect, State expectState,
binder_status_t status = EX_NONE) {
ASSERT_NE(effect, nullptr);
@@ -147,27 +170,35 @@
ASSERT_STATUS(status, effect->getState(&state));
ASSERT_EQ(expectState, state);
}
+
static void commandIgnoreRet(std::shared_ptr<IEffect> effect, CommandId command) {
if (effect) {
effect->command(command);
}
}
+
static void command(std::shared_ptr<IEffect> effect, CommandId command,
binder_status_t status = EX_NONE) {
ASSERT_NE(effect, nullptr);
ASSERT_STATUS(status, effect->command(command));
+ if (status != EX_NONE) {
+ return;
+ }
+
+ switch (command) {
+ case CommandId::START:
+ ASSERT_NO_FATAL_FAILURE(expectState(effect, State::PROCESSING));
+ break;
+ case CommandId::STOP:
+ FALLTHROUGH_INTENDED;
+ case CommandId::RESET:
+ ASSERT_NO_FATAL_FAILURE(expectState(effect, State::IDLE));
+ break;
+ default:
+ return;
+ }
}
- static void allocateInputData(const Parameter::Common common, std::unique_ptr<DataMQ>& mq,
- std::vector<float>& buffer) {
- ASSERT_NE(mq, nullptr);
- auto frameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes(
- common.input.base.format, common.input.base.channelMask);
- const size_t floatsToWrite = mq->availableToWrite();
- ASSERT_NE(0UL, floatsToWrite);
- ASSERT_EQ(frameSize * common.input.frameCount, floatsToWrite * sizeof(float));
- buffer.resize(floatsToWrite);
- std::fill(buffer.begin(), buffer.end(), 0x5a);
- }
+
static void writeToFmq(std::unique_ptr<StatusMQ>& statusMq, std::unique_ptr<DataMQ>& dataMq,
const std::vector<float>& buffer, int version) {
const size_t available = dataMq->availableToWrite();
@@ -184,6 +215,7 @@
: kEventFlagNotEmpty);
ASSERT_EQ(::android::OK, EventFlag::deleteEventFlag(&efGroup));
}
+
static void readFromFmq(std::unique_ptr<StatusMQ>& statusMq, size_t statusNum,
std::unique_ptr<DataMQ>& dataMq, size_t expectFloats,
std::vector<float>& buffer,
@@ -204,6 +236,7 @@
ASSERT_TRUE(dataMq->read(buffer.data(), expectFloats));
}
}
+
static void expectDataMqUpdateEventFlag(std::unique_ptr<StatusMQ>& statusMq) {
EventFlag* efGroup;
ASSERT_EQ(::android::OK,
@@ -218,8 +251,10 @@
Parameter::Common createParamCommon(int session = 0, int ioHandle = -1, int iSampleRate = 48000,
int oSampleRate = 48000, long iFrameCount = 0x100,
long oFrameCount = 0x100) {
- AudioChannelLayout defaultLayout = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
+ AudioChannelLayout inputLayout = AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
AudioChannelLayout::LAYOUT_STEREO);
+ AudioChannelLayout outputLayout = inputLayout;
+
// query supported input layout and use it as the default parameter in common
if (mIsSpatializer && isRangeValid<Range::spatializer>(Spatializer::supportedChannelLayout,
mDescriptor.capability)) {
@@ -229,12 +264,14 @@
layoutRange &&
0 != (layouts = layoutRange->min.get<Spatializer::supportedChannelLayout>())
.size()) {
- defaultLayout = layouts[0];
+ inputLayout = layouts[0];
}
}
+
return createParamCommon(session, ioHandle, iSampleRate, oSampleRate, iFrameCount,
- oFrameCount, defaultLayout, defaultLayout);
+ oFrameCount, inputLayout, outputLayout);
}
+
static Parameter::Common createParamCommon(int session, int ioHandle, int iSampleRate,
int oSampleRate, long iFrameCount, long oFrameCount,
AudioChannelLayout inputChannelLayout,
@@ -333,33 +370,38 @@
static void processAndWriteToOutput(std::vector<float>& inputBuffer,
std::vector<float>& outputBuffer,
- const std::shared_ptr<IEffect>& mEffect,
- IEffect::OpenEffectReturn* mOpenEffectReturn) {
+ const std::shared_ptr<IEffect>& effect,
+ IEffect::OpenEffectReturn* openEffectReturn,
+ int version = -1, int times = 1) {
// Initialize AidlMessagequeues
- auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(mOpenEffectReturn->statusMQ);
+ auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(openEffectReturn->statusMQ);
ASSERT_TRUE(statusMQ->isValid());
- auto inputMQ = std::make_unique<EffectHelper::DataMQ>(mOpenEffectReturn->inputDataMQ);
+ auto inputMQ = std::make_unique<EffectHelper::DataMQ>(openEffectReturn->inputDataMQ);
ASSERT_TRUE(inputMQ->isValid());
- auto outputMQ = std::make_unique<EffectHelper::DataMQ>(mOpenEffectReturn->outputDataMQ);
+ auto outputMQ = std::make_unique<EffectHelper::DataMQ>(openEffectReturn->outputDataMQ);
ASSERT_TRUE(outputMQ->isValid());
// Enabling the process
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
+ ASSERT_NO_FATAL_FAILURE(command(effect, CommandId::START));
// Write from buffer to message queues and calling process
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, inputBuffer, [&]() {
- int version = 0;
- return (mEffect && mEffect->getInterfaceVersion(&version).isOk()) ? version : 0;
- }()));
+ if (version == -1) {
+ ASSERT_IS_OK(effect->getInterfaceVersion(&version));
+ }
- // Read the updated message queues into buffer
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 1, outputMQ,
- outputBuffer.size(), outputBuffer));
+ for (int i = 0; i < times; i++) {
+ EXPECT_NO_FATAL_FAILURE(
+ EffectHelper::writeToFmq(statusMQ, inputMQ, inputBuffer, version));
+ // Read the updated message queues into buffer
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 1, outputMQ,
+ outputBuffer.size(), outputBuffer));
+ }
// Disable the process
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
+ ASSERT_NO_FATAL_FAILURE(command(effect, CommandId::STOP));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, outputBuffer));
+
+ ASSERT_NO_FATAL_FAILURE(command(effect, CommandId::RESET));
}
// Find FFT bin indices for testFrequencies and get bin center frequencies
@@ -403,6 +445,17 @@
return bufferMag;
}
+ void updateFrameSize(const Parameter::Common& common) {
+ mInputFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes(
+ common.input.base.format, common.input.base.channelMask);
+ mInputSamples = common.input.frameCount * mInputFrameSize / sizeof(float);
+ mOutputFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes(
+ common.output.base.format, common.output.base.channelMask);
+ mOutputSamples = common.output.frameCount * mOutputFrameSize / sizeof(float);
+ }
+
bool mIsSpatializer;
Descriptor mDescriptor;
+ size_t mInputFrameSize, mOutputFrameSize;
+ size_t mInputSamples, mOutputSamples;
};
diff --git a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
index d576c7c..bbc4caf 100644
--- a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
@@ -56,6 +56,7 @@
using namespace android;
using aidl::android::hardware::audio::common::AudioOffloadMetadata;
using aidl::android::hardware::audio::common::getChannelCount;
+using aidl::android::hardware::audio::common::hasMmapFlag;
using aidl::android::hardware::audio::common::isAnyBitPositionFlagSet;
using aidl::android::hardware::audio::common::isBitPositionFlagSet;
using aidl::android::hardware::audio::common::isTelephonyDeviceType;
@@ -637,19 +638,39 @@
mCommandMQ(new CommandMQ(descriptor.command)),
mReplyMQ(new ReplyMQ(descriptor.reply)),
mBufferSizeFrames(descriptor.bufferSizeFrames),
- mDataMQ(maybeCreateDataMQ(descriptor)) {}
+ mDataMQ(maybeCreateDataMQ(descriptor)),
+ mIsMmapped(isMmapped(descriptor)),
+ mSharedMemoryFd(maybeGetMmapFd(descriptor)) {
+ if (isMmapped()) {
+ mSharedMemory = (int8_t*)mmap(nullptr, getBufferSizeBytes(), PROT_READ | PROT_WRITE,
+ MAP_SHARED, mSharedMemoryFd, 0);
+ if (mSharedMemory == MAP_FAILED) {
+ PLOG(ERROR) << __func__ << ": mmap() failed.";
+ mSharedMemory = nullptr;
+ }
+ }
+ }
+ ~StreamContext() {
+ if (mSharedMemory != nullptr) {
+ munmap(mSharedMemory, getBufferSizeBytes());
+ }
+ }
void checkIsValid() const {
EXPECT_NE(0UL, mFrameSizeBytes);
ASSERT_NE(nullptr, mCommandMQ);
EXPECT_TRUE(mCommandMQ->isValid());
ASSERT_NE(nullptr, mReplyMQ);
EXPECT_TRUE(mReplyMQ->isValid());
- if (mDataMQ != nullptr) {
- EXPECT_TRUE(mDataMQ->isValid());
- EXPECT_GE(mDataMQ->getQuantumCount() * mDataMQ->getQuantumSize(),
- mFrameSizeBytes * mBufferSizeFrames)
- << "Data MQ actual buffer size is "
- "less than the buffer size as specified by the descriptor";
+ if (isMmapped()) {
+ ASSERT_NE(nullptr, mSharedMemory);
+ } else {
+ if (mDataMQ != nullptr) {
+ EXPECT_TRUE(mDataMQ->isValid());
+ EXPECT_GE(mDataMQ->getQuantumCount() * mDataMQ->getQuantumSize(),
+ mFrameSizeBytes * mBufferSizeFrames)
+ << "Data MQ actual buffer size is "
+ "less than the buffer size as specified by the descriptor";
+ }
}
}
size_t getBufferSizeBytes() const { return mFrameSizeBytes * mBufferSizeFrames; }
@@ -658,6 +679,8 @@
DataMQ* getDataMQ() const { return mDataMQ.get(); }
size_t getFrameSizeBytes() const { return mFrameSizeBytes; }
ReplyMQ* getReplyMQ() const { return mReplyMQ.get(); }
+ bool isMmapped() const { return mIsMmapped; }
+ int8_t* getMmapMemory() const { return mSharedMemory; }
private:
static std::unique_ptr<DataMQ> maybeCreateDataMQ(const StreamDescriptor& descriptor) {
@@ -667,12 +690,26 @@
}
return nullptr;
}
+ static bool isMmapped(const StreamDescriptor& descriptor) {
+ using Tag = StreamDescriptor::AudioBuffer::Tag;
+ return descriptor.audio.getTag() == Tag::mmap;
+ }
+ static int32_t maybeGetMmapFd(const StreamDescriptor& descriptor) {
+ using Tag = StreamDescriptor::AudioBuffer::Tag;
+ if (descriptor.audio.getTag() == Tag::mmap) {
+ return descriptor.audio.get<Tag::mmap>().sharedMemory.fd.get();
+ }
+ return -1;
+ }
const size_t mFrameSizeBytes;
std::unique_ptr<CommandMQ> mCommandMQ;
std::unique_ptr<ReplyMQ> mReplyMQ;
const size_t mBufferSizeFrames;
std::unique_ptr<DataMQ> mDataMQ;
+ const bool mIsMmapped;
+ const int32_t mSharedMemoryFd;
+ int8_t* mSharedMemory = nullptr;
};
struct StreamEventReceiver {
@@ -868,12 +905,15 @@
mDataMQ(context.getDataMQ()),
mData(context.getBufferSizeBytes()),
mDriver(driver),
- mEventReceiver(eventReceiver) {}
+ mEventReceiver(eventReceiver),
+ mIsMmapped(context.isMmapped()),
+ mSharedMemory(context.getMmapMemory()) {}
StreamContext::CommandMQ* getCommandMQ() const { return mCommandMQ; }
StreamContext::ReplyMQ* getReplyMQ() const { return mReplyMQ; }
StreamContext::DataMQ* getDataMQ() const { return mDataMQ; }
StreamLogicDriver* getDriver() const { return mDriver; }
StreamEventReceiver* getEventReceiver() const { return mEventReceiver; }
+ bool isMmapped() const { return mIsMmapped; }
std::string init() override {
LOG(DEBUG) << __func__;
@@ -914,6 +954,22 @@
LOG(ERROR) << __func__ << ": writing of " << mData.size() << " bytes to MQ failed";
return false;
}
+ bool readDataFromMmap(size_t readCount) {
+ if (mSharedMemory != nullptr) {
+ std::memcpy(mData.data(), mSharedMemory, readCount);
+ return true;
+ }
+ LOG(ERROR) << __func__ << ": reading of " << readCount << " bytes from mmap failed";
+ return false;
+ }
+ bool writeDataToMmap() {
+ if (mSharedMemory != nullptr) {
+ std::memcpy(mSharedMemory, mData.data(), mData.size());
+ return true;
+ }
+ LOG(ERROR) << __func__ << ": writing of " << mData.size() << " bytes to mmap failed";
+ return false;
+ }
private:
StreamContext::CommandMQ* mCommandMQ;
@@ -923,6 +979,8 @@
StreamLogicDriver* const mDriver;
StreamEventReceiver* const mEventReceiver;
int mLastEventSeq = StreamEventReceiver::kEventSeqInit;
+ const bool mIsMmapped;
+ int8_t* mSharedMemory = nullptr;
};
class StreamReaderLogic : public StreamCommonLogic {
@@ -970,7 +1028,8 @@
<< ": received invalid byte count in the reply: " << reply.fmqByteCount;
return Status::ABORT;
}
- if (static_cast<size_t>(reply.fmqByteCount) != getDataMQ()->availableToRead()) {
+ if (!isMmapped() &&
+ static_cast<size_t>(reply.fmqByteCount) != getDataMQ()->availableToRead()) {
LOG(ERROR) << __func__
<< ": the byte count in the reply is not the same as the amount of "
<< "data available in the MQ: " << reply.fmqByteCount
@@ -991,8 +1050,10 @@
return Status::ABORT;
}
const bool acceptedReply = getDriver()->processValidReply(reply);
- if (const size_t readCount = getDataMQ()->availableToRead(); readCount > 0) {
- if (readDataFromMQ(readCount)) {
+ if (const size_t readCount =
+ !isMmapped() ? getDataMQ()->availableToRead() : reply.fmqByteCount;
+ readCount > 0) {
+ if (isMmapped() ? readDataFromMmap(readCount) : readDataFromMQ(readCount)) {
goto checkAcceptedReply;
}
LOG(ERROR) << __func__ << ": reading of " << readCount << " data bytes from MQ failed";
@@ -1028,8 +1089,10 @@
LOG(ERROR) << __func__ << ": no next command";
return Status::ABORT;
}
- if (actualSize != 0 && !writeDataToMQ()) {
- return Status::ABORT;
+ if (actualSize != 0) {
+ if (isMmapped() ? !writeDataToMmap() : !writeDataToMQ()) {
+ return Status::ABORT;
+ }
}
LOG(DEBUG) << "Writing command: " << command.toString();
if (!getCommandMQ()->writeBlocking(&command, 1)) {
@@ -1058,7 +1121,7 @@
return Status::ABORT;
}
// It is OK for the implementation to leave data in the MQ when the stream is paused.
- if (reply.state != StreamDescriptor::State::PAUSED &&
+ if (!isMmapped() && reply.state != StreamDescriptor::State::PAUSED &&
getDataMQ()->availableToWrite() != getDataMQ()->getQuantumCount()) {
LOG(ERROR) << __func__ << ": the HAL module did not consume all data from the data MQ: "
<< "available to write " << getDataMQ()->availableToWrite()
@@ -2904,15 +2967,24 @@
class StreamLogicDefaultDriver : public StreamLogicDriver {
public:
- StreamLogicDefaultDriver(std::shared_ptr<StateSequence> commands, size_t frameSizeBytes)
- : mCommands(commands), mFrameSizeBytes(frameSizeBytes) {
+ StreamLogicDefaultDriver(std::shared_ptr<StateSequence> commands, size_t frameSizeBytes,
+ bool isMmap)
+ : mCommands(commands), mFrameSizeBytes(frameSizeBytes), mIsMmap(isMmap) {
mCommands->rewind();
}
- // The three methods below is intended to be called after the worker
+ // The five methods below is intended to be called after the worker
// thread has joined, thus no extra synchronization is needed.
bool hasObservablePositionIncrease() const { return mObservablePositionIncrease; }
- bool hasRetrogradeObservablePosition() const { return mRetrogradeObservablePosition; }
+ bool hasObservableRetrogradePosition() const { return mRetrogradeObservablePosition; }
+ bool hasHardwarePositionIncrease() const {
+ // For non-MMap, always return true to pass the validation.
+ return mIsMmap ? mHardwarePositionIncrease : true;
+ }
+ bool hasHardwareRetrogradePosition() const {
+ // For non-MMap, always return false to pass the validation.
+ return mIsMmap ? mRetrogradeHardwarePosition : false;
+ }
std::string getUnexpectedStateTransition() const { return mUnexpectedTransition; }
bool done() override { return mCommands->done(); }
@@ -2940,14 +3012,24 @@
bool interceptRawReply(const StreamDescriptor::Reply&) override { return false; }
bool processValidReply(const StreamDescriptor::Reply& reply) override {
if (reply.observable.frames != StreamDescriptor::Position::UNKNOWN) {
- if (mPreviousFrames.has_value()) {
- if (reply.observable.frames > mPreviousFrames.value()) {
+ if (mPreviousObservableFrames.has_value()) {
+ if (reply.observable.frames > mPreviousObservableFrames.value()) {
mObservablePositionIncrease = true;
- } else if (reply.observable.frames < mPreviousFrames.value()) {
+ } else if (reply.observable.frames < mPreviousObservableFrames.value()) {
mRetrogradeObservablePosition = true;
}
}
- mPreviousFrames = reply.observable.frames;
+ mPreviousObservableFrames = reply.observable.frames;
+ }
+ if (mIsMmap) {
+ if (mPreviousHardwareFrames.has_value()) {
+ if (reply.hardware.frames > mPreviousHardwareFrames.value()) {
+ mHardwarePositionIncrease = true;
+ } else if (reply.hardware.frames < mPreviousHardwareFrames.value()) {
+ mRetrogradeHardwarePosition = true;
+ }
+ }
+ mPreviousHardwareFrames = reply.hardware.frames;
}
auto expected = mCommands->getExpectedStates();
@@ -2974,10 +3056,14 @@
protected:
std::shared_ptr<StateSequence> mCommands;
const size_t mFrameSizeBytes;
+ const bool mIsMmap;
std::optional<StreamDescriptor::State> mPreviousState;
- std::optional<int64_t> mPreviousFrames;
+ std::optional<int64_t> mPreviousObservableFrames;
bool mObservablePositionIncrease = false;
bool mRetrogradeObservablePosition = false;
+ std::optional<int64_t> mPreviousHardwareFrames;
+ bool mHardwarePositionIncrease = false;
+ bool mRetrogradeHardwarePosition = false;
std::string mUnexpectedTransition;
};
@@ -2988,8 +3074,8 @@
static bool skipStreamIoTestForMixPortConfig(const AudioPortConfig& portConfig) {
return (portConfig.flags.value().getTag() == AudioIoFlags::input &&
isAnyBitPositionFlagSet(portConfig.flags.value().template get<AudioIoFlags::input>(),
- {AudioInputFlags::MMAP_NOIRQ, AudioInputFlags::VOIP_TX,
- AudioInputFlags::HW_HOTWORD, AudioInputFlags::HOTWORD_TAP})) ||
+ {AudioInputFlags::VOIP_TX, AudioInputFlags::HW_HOTWORD,
+ AudioInputFlags::HOTWORD_TAP})) ||
(portConfig.flags.value().getTag() == AudioIoFlags::output &&
isAnyBitPositionFlagSet(
portConfig.flags.value().template get<AudioIoFlags::output>(),
@@ -3029,8 +3115,8 @@
void StartWorkerToSendBurstCommands() {
const StreamContext* context = mStream->getStreamContext();
- mWorkerDriver = std::make_unique<StreamLogicDefaultDriver>(makeBurstCommands(mIsSync),
- context->getFrameSizeBytes());
+ mWorkerDriver = std::make_unique<StreamLogicDefaultDriver>(
+ makeBurstCommands(mIsSync), context->getFrameSizeBytes(), context->isMmapped());
mWorker = std::make_unique<typename IOTraits<Stream>::Worker>(
*context, mWorkerDriver.get(), mStream->getStreamEventReceiver());
LOG(DEBUG) << __func__ << ": starting " << IOTraits<Stream>::directionStr << " worker...";
@@ -3047,10 +3133,13 @@
EXPECT_FALSE(mWorker->hasError()) << mWorker->getError();
EXPECT_EQ("", mWorkerDriver->getUnexpectedStateTransition());
if (validatePosition) {
- if (IOTraits<Stream>::is_input) {
+ if (IOTraits<Stream>::is_input &&
+ !mStream->getStreamContext()->isMmapped() /*TODO(b/274456992) remove*/) {
EXPECT_TRUE(mWorkerDriver->hasObservablePositionIncrease());
+ EXPECT_TRUE(mWorkerDriver->hasHardwarePositionIncrease());
}
- EXPECT_FALSE(mWorkerDriver->hasRetrogradeObservablePosition());
+ EXPECT_FALSE(mWorkerDriver->hasObservableRetrogradePosition());
+ EXPECT_FALSE(mWorkerDriver->hasHardwareRetrogradePosition());
}
mWorker.reset();
mWorkerDriver.reset();
@@ -3984,7 +4073,7 @@
}
}
- bool ValidateObservablePosition(const AudioDevice& device) {
+ bool ValidatePosition(const AudioDevice& device) {
return !isTelephonyDeviceType(device.type.type);
}
@@ -3998,7 +4087,8 @@
if (skipStreamIoTestForDevice(stream.getDevice())) return;
ASSERT_EQ("", stream.skipTestReason());
StreamLogicDefaultDriver driver(commandsAndStates,
- stream.getStreamContext()->getFrameSizeBytes());
+ stream.getStreamContext()->getFrameSizeBytes(),
+ stream.getStreamContext()->isMmapped());
typename IOTraits<Stream>::Worker worker(*stream.getStreamContext(), &driver,
stream.getStreamEventReceiver());
@@ -4008,11 +4098,14 @@
worker.join();
EXPECT_FALSE(worker.hasError()) << worker.getError();
EXPECT_EQ("", driver.getUnexpectedStateTransition());
- if (ValidateObservablePosition(stream.getDevice())) {
- if (validatePositionIncrease) {
+ if (ValidatePosition(stream.getDevice())) {
+ if (validatePositionIncrease &&
+ !stream.getStreamContext()->isMmapped() /*TODO(b/274456992) remove*/) {
EXPECT_TRUE(driver.hasObservablePositionIncrease());
+ EXPECT_TRUE(driver.hasHardwarePositionIncrease());
}
- EXPECT_FALSE(driver.hasRetrogradeObservablePosition());
+ EXPECT_FALSE(driver.hasObservableRetrogradePosition());
+ EXPECT_FALSE(driver.hasHardwareRetrogradePosition());
}
}
@@ -4028,7 +4121,8 @@
ASSERT_EQ("", stream.skipTestReason());
ASSERT_NO_FATAL_FAILURE(stream.TeardownPatchSetUpStream(module.get()));
StreamLogicDefaultDriver driver(commandsAndStates,
- stream.getStreamContext()->getFrameSizeBytes());
+ stream.getStreamContext()->getFrameSizeBytes(),
+ stream.getStreamContext()->isMmapped());
typename IOTraits<Stream>::Worker worker(*stream.getStreamContext(), &driver,
stream.getStreamEventReceiver());
ASSERT_NO_FATAL_FAILURE(stream.ReconnectPatch(module.get()));
@@ -4039,11 +4133,14 @@
worker.join();
EXPECT_FALSE(worker.hasError()) << worker.getError();
EXPECT_EQ("", driver.getUnexpectedStateTransition());
- if (ValidateObservablePosition(stream.getDevice())) {
- if (validatePositionIncrease) {
+ if (ValidatePosition(stream.getDevice())) {
+ if (validatePositionIncrease &&
+ !stream.getStreamContext()->isMmapped() /*TODO(b/274456992) remove*/) {
EXPECT_TRUE(driver.hasObservablePositionIncrease());
+ EXPECT_TRUE(driver.hasHardwarePositionIncrease());
}
- EXPECT_FALSE(driver.hasRetrogradeObservablePosition());
+ EXPECT_FALSE(driver.hasObservableRetrogradePosition());
+ EXPECT_FALSE(driver.hasHardwareRetrogradePosition());
}
}
};
diff --git a/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp b/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
index 2f47d07..d23bdc9 100644
--- a/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAudioEffectTargetTest.cpp
@@ -200,7 +200,6 @@
// An effect instance is in INIT state by default after it was created.
TEST_P(AudioEffectTest, InitStateAfterCreation) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -208,7 +207,6 @@
TEST_P(AudioEffectTest, IdleStateAfterOpen) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -216,11 +214,8 @@
// An effect instance is in PROCESSING state after it receive an START command.
TEST_P(AudioEffectTest, ProcessingStateAfterStart) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
@@ -231,9 +226,7 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -243,9 +236,7 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -257,7 +248,6 @@
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -274,9 +264,7 @@
TEST_P(AudioEffectTest, StopCommandInIdleStateNoOp) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -285,9 +273,7 @@
TEST_P(AudioEffectTest, ResetCommandInIdleStateNoOp) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -296,16 +282,11 @@
TEST_P(AudioEffectTest, RepeatStartAndStop) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -314,16 +295,10 @@
TEST_P(AudioEffectTest, RepeatStartAndReset) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
-
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -332,14 +307,11 @@
TEST_P(AudioEffectTest, CloseProcessingStateEffects) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(close(mEffect, EX_ILLEGAL_STATE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -348,8 +320,6 @@
TEST_P(AudioEffectTest, DestroyOpenEffects) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
-
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
// cleanup
@@ -361,32 +331,22 @@
TEST_P(AudioEffectTest, DestroyProcessingEffects) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
-
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
// cleanup
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
TEST_P(AudioEffectTest, NormalSequenceStates) {
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -430,7 +390,6 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Parameter::Common common = createParamCommon(0 /* session */, 1 /* ioHandle */,
44100 /* iSampleRate */, 44100 /* oSampleRate */);
@@ -447,9 +406,7 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Parameter::Common common = createParamCommon(0 /* session */, 1 /* ioHandle */,
44100 /* iSampleRate */, 44100 /* oSampleRate */);
@@ -465,7 +422,6 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Parameter::Common common = createParamCommon(0 /* session */, 1 /* ioHandle */,
44100 /* iSampleRate */, 44100 /* oSampleRate */);
@@ -473,7 +429,6 @@
ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -484,7 +439,6 @@
ASSERT_NO_FATAL_FAILURE(open(mEffect));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Parameter::Common common = createParamCommon(0 /* session */, 1 /* ioHandle */,
44100 /* iSampleRate */, 44100 /* oSampleRate */);
@@ -492,12 +446,10 @@
ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -511,9 +463,7 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
-
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
std::vector<AudioDeviceDescription> deviceDescs = {
{.type = AudioDeviceType::IN_DEFAULT,
@@ -525,7 +475,6 @@
setAndGetParameter(id, Parameter::make<Parameter::deviceDescription>(deviceDescs)));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -541,7 +490,6 @@
ASSERT_NO_FATAL_FAILURE(open(mEffect));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::mode);
ASSERT_NO_FATAL_FAILURE(
@@ -550,7 +498,6 @@
setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::IN_COMMUNICATION)));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -564,9 +511,7 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
-
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::source);
ASSERT_NO_FATAL_FAILURE(
@@ -575,7 +520,6 @@
id, Parameter::make<Parameter::source>(AudioSource::VOICE_RECOGNITION)));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -589,9 +533,7 @@
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
ASSERT_NO_FATAL_FAILURE(open(mEffect));
-
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::volumeStereo);
Parameter::VolumeStereo volume = {.left = 10.0, .right = 10.0};
@@ -605,7 +547,6 @@
}
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -638,7 +579,7 @@
ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
ASSERT_TRUE(statusMQ->isValid());
expectDataMqUpdateEventFlag(statusMQ);
- EXPECT_IS_OK(mEffect->reopen(&ret));
+ ASSERT_NO_FATAL_FAILURE(reopen(mEffect, common, &ret));
inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
ASSERT_TRUE(statusMQ->isValid());
@@ -649,7 +590,7 @@
ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
ASSERT_TRUE(statusMQ->isValid());
expectDataMqUpdateEventFlag(statusMQ);
- EXPECT_IS_OK(mEffect->reopen(&ret));
+ ASSERT_NO_FATAL_FAILURE(reopen(mEffect, common, &ret));
inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
ASSERT_TRUE(statusMQ->isValid());
@@ -671,26 +612,9 @@
kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
IEffect::OpenEffectReturn ret;
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
- auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
- ASSERT_TRUE(statusMQ->isValid());
- auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
- ASSERT_TRUE(inputMQ->isValid());
- auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
- ASSERT_TRUE(outputMQ->isValid());
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
-
- std::vector<float> buffer;
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
-
+ std::vector<float> inputBuffer(mInputSamples), outputBuffer(mOutputSamples);
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -705,31 +629,12 @@
kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
IEffect::OpenEffectReturn ret;
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
- auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
- ASSERT_TRUE(statusMQ->isValid());
- auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
- ASSERT_TRUE(inputMQ->isValid());
- auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
- ASSERT_TRUE(outputMQ->isValid());
- std::vector<float> buffer;
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 0, outputMQ, buffer.size(), buffer));
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
-
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
+ std::vector<float> inputBuffer(mInputSamples), outputBuffer(mOutputSamples);
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion));
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
@@ -751,18 +656,10 @@
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
ASSERT_TRUE(statusMQ->isValid());
- auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
- ASSERT_TRUE(inputMQ->isValid());
- auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
- ASSERT_TRUE(outputMQ->isValid());
- std::vector<float> buffer;
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
+ std::vector<float> inputBuffer(mInputSamples), outputBuffer(mOutputSamples);
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion));
// set a new common parameter with different IO frameCount, reopen
Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
@@ -771,22 +668,12 @@
ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
ASSERT_TRUE(statusMQ->isValid());
expectDataMqUpdateEventFlag(statusMQ);
- EXPECT_IS_OK(mEffect->reopen(&ret));
- inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
- outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
- ASSERT_TRUE(statusMQ->isValid());
- ASSERT_TRUE(inputMQ->isValid());
- ASSERT_TRUE(outputMQ->isValid());
+ ASSERT_NO_FATAL_FAILURE(reopen(mEffect, common, &ret));
- // verify data consume again
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
+ inputBuffer.resize(mInputSamples);
+ outputBuffer.resize(mOutputSamples);
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
@@ -809,19 +696,15 @@
auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
ASSERT_TRUE(outputMQ->isValid());
- std::vector<float> buffer;
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
+ std::vector<float> inputBuffer(mInputSamples), outputBuffer(mOutputSamples);
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, inputBuffer, mVersion));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
-
EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
+ EffectHelper::readFromFmq(statusMQ, 1, outputMQ, outputBuffer.size(), outputBuffer));
ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
-
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -836,31 +719,10 @@
kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
IEffect::OpenEffectReturn ret;
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
- auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
- ASSERT_TRUE(statusMQ->isValid());
- auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
- ASSERT_TRUE(inputMQ->isValid());
- auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
- ASSERT_TRUE(outputMQ->isValid());
+ std::vector<float> inputBuffer(mInputSamples), outputBuffer(mOutputSamples);
- std::vector<float> buffer;
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
-
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion, 2));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
@@ -876,33 +738,12 @@
kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
IEffect::OpenEffectReturn ret;
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
- auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
- ASSERT_TRUE(statusMQ->isValid());
- auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
- ASSERT_TRUE(inputMQ->isValid());
- auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
- ASSERT_TRUE(outputMQ->isValid());
+ std::vector<float> inputBuffer(mInputSamples), outputBuffer(mOutputSamples);
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
- std::vector<float> buffer;
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
-
- ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion, 2));
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer, outputBuffer, mEffect, &ret, mVersion, 2));
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
@@ -918,6 +759,7 @@
kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
IEffect::OpenEffectReturn ret;
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
+ std::vector<float> inputBuffer(mInputSamples), outputBuffer(mOutputSamples);
ASSERT_NO_FATAL_FAILURE(close(mEffect));
auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
@@ -927,10 +769,8 @@
auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
ASSERT_TRUE(outputMQ->isValid());
- std::vector<float> buffer;
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer, mVersion));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, inputBuffer, mVersion));
+ EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, outputBuffer));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
@@ -951,42 +791,19 @@
IEffect::OpenEffectReturn ret1, ret2;
ASSERT_NO_FATAL_FAILURE(open(effect1, common1, std::nullopt /* specific */, &ret1, EX_NONE));
ASSERT_NO_FATAL_FAILURE(open(effect2, common2, std::nullopt /* specific */, &ret2, EX_NONE));
- ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::PROCESSING));
- ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::START));
- ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::PROCESSING));
+ std::vector<float> inputBuffer1(kInputFrameCount * mInputFrameSize / sizeof(float)),
+ outputBuffer1(kOutputFrameCount * mOutputFrameSize / sizeof(float));
+ std::vector<float> inputBuffer2(2 * kInputFrameCount * mInputFrameSize / sizeof(float)),
+ outputBuffer2(2 * kOutputFrameCount * mOutputFrameSize / sizeof(float));
- auto statusMQ1 = std::make_unique<EffectHelper::StatusMQ>(ret1.statusMQ);
- ASSERT_TRUE(statusMQ1->isValid());
- auto inputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.inputDataMQ);
- ASSERT_TRUE(inputMQ1->isValid());
- auto outputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.outputDataMQ);
- ASSERT_TRUE(outputMQ1->isValid());
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer1, outputBuffer1, effect1, &ret1, mVersion, 2));
+ ASSERT_NO_FATAL_FAILURE(
+ processAndWriteToOutput(inputBuffer2, outputBuffer2, effect2, &ret2, mVersion, 2));
- std::vector<float> buffer1, buffer2;
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common1, inputMQ1, buffer1));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ1, inputMQ1, buffer1, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ1, 1, outputMQ1, buffer1.size(), buffer1));
-
- auto statusMQ2 = std::make_unique<EffectHelper::StatusMQ>(ret2.statusMQ);
- ASSERT_TRUE(statusMQ2->isValid());
- auto inputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.inputDataMQ);
- ASSERT_TRUE(inputMQ2->isValid());
- auto outputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.outputDataMQ);
- ASSERT_TRUE(outputMQ2->isValid());
- EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common2, inputMQ2, buffer2));
- EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ2, inputMQ2, buffer2, mVersion));
- EXPECT_NO_FATAL_FAILURE(
- EffectHelper::readFromFmq(statusMQ2, 1, outputMQ2, buffer2.size(), buffer2));
-
- ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(effect1));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
- ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::STOP));
- ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::IDLE));
ASSERT_NO_FATAL_FAILURE(close(effect2));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
}
diff --git a/audio/aidl/vts/VtsHalAudioTargetTestTemplate.xml b/audio/aidl/vts/VtsHalAudioTargetTestTemplate.xml
index c92e852..4170b4c 100644
--- a/audio/aidl/vts/VtsHalAudioTargetTestTemplate.xml
+++ b/audio/aidl/vts/VtsHalAudioTargetTestTemplate.xml
@@ -33,6 +33,6 @@
<test class="com.android.tradefed.testtype.GTest" >
<option name="native-test-device-path" value="/data/local/tmp" />
<option name="module-name" value="{MODULE}" />
- <option name="native-test-timeout" value="10m" />
+ <option name="native-test-timeout" value="30m" />
</test>
</configuration>
diff --git a/audio/aidl/vts/VtsHalDownmixTargetTest.cpp b/audio/aidl/vts/VtsHalDownmixTargetTest.cpp
index 844a340..a1491e6 100644
--- a/audio/aidl/vts/VtsHalDownmixTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalDownmixTargetTest.cpp
@@ -96,8 +96,7 @@
Parameter::Specific specific = getDefaultParamSpecific();
Parameter::Common common = EffectHelper::createParamCommon(
0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
- kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */,
- inputChannelLayout,
+ kFrameCount /* iFrameCount */, kFrameCount /* oFrameCount */, inputChannelLayout,
AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
AudioChannelLayout::LAYOUT_STEREO));
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &mOpenEffectReturn, EX_NONE));
@@ -139,14 +138,14 @@
}
void setDataTestParams(int32_t layoutType) {
- mInputBuffer.resize(kBufferSize);
-
// Get the number of channels used
mInputChannelCount = getChannelCount(
AudioChannelLayout::make<AudioChannelLayout::layoutMask>(layoutType));
+ mInputBufferSize = kFrameCount * mInputChannelCount;
+ mInputBuffer.resize(mInputBufferSize);
// In case of downmix, output is always configured to stereo layout.
- mOutputBufferSize = (mInputBuffer.size() / mInputChannelCount) * kOutputChannelCount;
+ mOutputBufferSize = kFrameCount * kOutputChannelCount;
mOutputBuffer.resize(mOutputBufferSize);
}
@@ -173,7 +172,12 @@
return true;
}
- static constexpr long kInputFrameCount = 100, kOutputFrameCount = 100;
+ static const long kFrameCount = 256;
+ static constexpr float kMaxDownmixSample = 1;
+ static constexpr int kOutputChannelCount = 2;
+ // Mask for layouts greater than MAX_INPUT_CHANNELS_SUPPORTED
+ static constexpr int32_t kMaxChannelMask =
+ ~((1 << ChannelMix<AUDIO_CHANNEL_OUT_STEREO>::MAX_INPUT_CHANNELS_SUPPORTED) - 1);
std::shared_ptr<IFactory> mFactory;
Descriptor mDescriptor;
std::shared_ptr<IEffect> mEffect;
@@ -183,12 +187,7 @@
std::vector<float> mOutputBuffer;
size_t mInputChannelCount;
size_t mOutputBufferSize;
- static constexpr size_t kBufferSize = 128;
- static constexpr float kMaxDownmixSample = 1;
- static constexpr int kOutputChannelCount = 2;
- // Mask for layouts greater than MAX_INPUT_CHANNELS_SUPPORTED
- static constexpr int32_t kMaxChannelMask =
- ~((1 << ChannelMix<AUDIO_CHANNEL_OUT_STEREO>::MAX_INPUT_CHANNELS_SUPPORTED) - 1);
+ size_t mInputBufferSize;
};
/**
@@ -401,9 +400,9 @@
void TearDown() override { TearDownDownmix(); }
void validateOutput() {
- ASSERT_EQ(kBufferSize, mInputBuffer.size());
- ASSERT_GE(kBufferSize, mOutputBufferSize);
- for (size_t i = 0, j = 0; i < kBufferSize && j < mOutputBufferSize;
+ ASSERT_EQ(mInputBufferSize, mInputBuffer.size());
+ ASSERT_GE(mInputBufferSize, mOutputBufferSize);
+ for (size_t i = 0, j = 0; i < mInputBufferSize && j < mOutputBufferSize;
i += mInputChannelCount, j += kOutputChannelCount) {
ASSERT_EQ(mOutputBuffer[j], mInputBuffer[i]);
ASSERT_EQ(mOutputBuffer[j + 1], mInputBuffer[i + 1]);
diff --git a/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp b/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp
index c7c6505..e31aae6 100644
--- a/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalEnvironmentalReverbTargetTest.cpp
@@ -17,7 +17,9 @@
#define LOG_TAG "VtsHalEnvironmentalReverbTest"
#include <android-base/logging.h>
#include <audio_utils/power.h>
+#include <audio_utils/primitives.h>
#include <system/audio.h>
+#include <numeric>
#include "EffectHelper.h"
@@ -39,7 +41,6 @@
static constexpr int kMinDelay = 0;
static const std::vector<TagVectorPair> kParamsIncreasingVector = {
-
{EnvironmentalReverb::roomLevelMb, {-3500, -2800, -2100, -1400, -700, 0}},
{EnvironmentalReverb::roomHfLevelMb, {-4000, -3200, -2400, -1600, -800, 0}},
{EnvironmentalReverb::decayTimeMs, {800, 1600, 2400, 3200, 4000}},
@@ -47,6 +48,11 @@
{EnvironmentalReverb::levelMb, {-3500, -2800, -2100, -1400, -700, 0}},
};
+static const TagVectorPair kDiffusionParam = {EnvironmentalReverb::diffusionPm,
+ {200, 400, 600, 800, 1000}};
+static const TagVectorPair kDensityParam = {EnvironmentalReverb::densityPm,
+ {0, 200, 400, 600, 800, 1000}};
+
static const std::vector<TagValuePair> kParamsMinimumValue = {
{EnvironmentalReverb::roomLevelMb, kMinRoomLevel},
{EnvironmentalReverb::decayTimeMs, kMinDecayTime},
@@ -347,8 +353,14 @@
mInput.resize(kBufferSize);
generateSineWaveInput(mInput);
}
- void SetUp() override { SetUpReverb(); }
- void TearDown() override { TearDownReverb(); }
+ void SetUp() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ SetUpReverb();
+ }
+ void TearDown() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ TearDownReverb();
+ }
void assertEnergyIncreasingWithParameter(bool bypass) {
createEnvParam(EnvironmentalReverb::bypass, bypass);
@@ -412,12 +424,16 @@
std::tie(mTag, mValue) = std::get<TAG_VALUE_PAIR>(GetParam());
}
void SetUp() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
SetUpReverb();
createEnvParam(EnvironmentalReverb::roomLevelMb, kMinRoomLevel);
ASSERT_NO_FATAL_FAILURE(
setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::roomLevelMb));
}
- void TearDown() override { TearDownReverb(); }
+ void TearDown() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ TearDownReverb();
+ }
EnvironmentalReverb::Tag mTag;
int mValue;
@@ -452,6 +468,151 @@
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbMinimumParamTest);
+class EnvironmentalReverbDiffusionTest
+ : public ::testing::TestWithParam<
+ std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagVectorPair>>,
+ public EnvironmentalReverbHelper {
+ public:
+ EnvironmentalReverbDiffusionTest()
+ : EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
+ std::tie(mTag, mParamValues) = std::get<TAG_VALUE_PAIR>(GetParam());
+ mInput.resize(kBufferSize);
+ generateSineWaveInput(mInput);
+ }
+ void SetUp() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ SetUpReverb();
+ }
+ void TearDown() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ TearDownReverb();
+ }
+
+ float getMean(std::vector<float>& buffer) {
+ return std::accumulate(buffer.begin(), buffer.end(), 0.0) / buffer.size();
+ }
+
+ float getVariance(std::vector<float>& buffer) {
+ if (isAuxiliary()) {
+ accumulate_float(buffer.data(), mInput.data(), buffer.size());
+ }
+ float mean = getMean(buffer);
+ float squaredDeltas =
+ std::accumulate(buffer.begin(), buffer.end(), 0.0,
+ [mean](float a, float b) { return a + pow(b - mean, 2); });
+
+ return squaredDeltas / buffer.size();
+ }
+
+ EnvironmentalReverb::Tag mTag;
+ std::vector<int> mParamValues;
+ std::vector<float> mInput;
+};
+
+TEST_P(EnvironmentalReverbDiffusionTest, DecreasingVarianceTest) {
+ std::vector<float> baseOutput(kBufferSize);
+ setParameterAndProcess(mInput, baseOutput, kMinDiffusion, mTag);
+ ASSERT_EQ(baseOutput.size(),
+ static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
+ float baseVariance = getVariance(baseOutput);
+ for (int value : mParamValues) {
+ std::vector<float> output(kBufferSize);
+ setParameterAndProcess(mInput, output, value, mTag);
+ ASSERT_EQ(output.size(),
+ static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
+ float variance = getVariance(output);
+ ASSERT_LT(variance, baseVariance);
+ baseVariance = variance;
+ }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ EnvironmentalReverbTest, EnvironmentalReverbDiffusionTest,
+ ::testing::Combine(
+ testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
+ IFactory::descriptor, getEffectTypeUuidEnvReverb())),
+ testing::Values(kDiffusionParam)),
+ [](const testing::TestParamInfo<EnvironmentalReverbDiffusionTest::ParamType>& info) {
+ auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
+ auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
+ std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag);
+ return name;
+ });
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDiffusionTest);
+
+enum ParamDensityTest { DESCRIPTOR, TAG_DENSITY_VALUE, PARAM_DENSITY_VALUE, IS_INPUT_MUTE };
+
+class EnvironmentalReverbDensityTest
+ : public ::testing::TestWithParam<std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
+ EnvironmentalReverb::Tag, int, bool>>,
+ public EnvironmentalReverbHelper {
+ public:
+ EnvironmentalReverbDensityTest() : EnvironmentalReverbHelper(std::get<DESCRIPTOR>(GetParam())) {
+ mTag = std::get<TAG_DENSITY_VALUE>(GetParam());
+ mParamValues = std::get<PARAM_DENSITY_VALUE>(GetParam());
+ mIsInputMute = (std::get<IS_INPUT_MUTE>(GetParam()));
+ mInput.resize(kBufferSize);
+ if (mIsInputMute) {
+ std::fill(mInput.begin(), mInput.end(), 0);
+ } else {
+ generateSineWaveInput(mInput);
+ }
+ }
+ void SetUp() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ SetUpReverb();
+ }
+ void TearDown() override {
+ SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
+ TearDownReverb();
+ }
+
+ EnvironmentalReverb::Tag mTag;
+ int mParamValues;
+ std::vector<float> mInput;
+ bool mIsInputMute;
+};
+
+TEST_P(EnvironmentalReverbDensityTest, DensityOutput) {
+ float inputRmse =
+ audio_utils_compute_energy_mono(mInput.data(), AUDIO_FORMAT_PCM_FLOAT, mInput.size());
+
+ std::vector<float> output(kBufferSize);
+ setParameterAndProcess(mInput, output, mParamValues, mTag);
+
+ if (isAuxiliary() && !mIsInputMute) {
+ accumulate_float(output.data(), mInput.data(), output.size());
+ }
+
+ float outputRmse =
+ audio_utils_compute_energy_mono(output.data(), AUDIO_FORMAT_PCM_FLOAT, output.size());
+ if (inputRmse != 0) {
+ EXPECT_GT(outputRmse, 0);
+ } else {
+ EXPECT_EQ(outputRmse, inputRmse);
+ }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ EnvironmentalReverbTest, EnvironmentalReverbDensityTest,
+ ::testing::Combine(
+ testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
+ IFactory::descriptor, getEffectTypeUuidEnvReverb())),
+ testing::Values(kDensityParam.first), testing::ValuesIn(kDensityParam.second),
+ testing::Bool()),
+ [](const testing::TestParamInfo<EnvironmentalReverbDensityTest::ParamType>& info) {
+ auto descriptor = std::get<DESCRIPTOR>(info.param).second;
+ auto tag = std::get<TAG_DENSITY_VALUE>(info.param);
+ auto value = std::get<PARAM_DENSITY_VALUE>(info.param);
+ std::string isInputMute = std::to_string(std::get<IS_INPUT_MUTE>(info.param));
+ std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag) + "_Value_" +
+ std::to_string(value) + "_isInputMute_" + isInputMute;
+ return name;
+ });
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDensityTest);
+
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
diff --git a/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp b/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp
index 3c72dfa..1fe8beb 100644
--- a/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalLoudnessEnhancerTargetTest.cpp
@@ -23,6 +23,7 @@
using namespace android;
+using aidl::android::hardware::audio::common::getChannelCount;
using aidl::android::hardware::audio::effect::Descriptor;
using aidl::android::hardware::audio::effect::getEffectTypeUuidLoudnessEnhancer;
using aidl::android::hardware::audio::effect::IEffect;
@@ -50,7 +51,7 @@
Parameter::Specific specific = getDefaultParamSpecific();
Parameter::Common common = createParamCommon(
0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
- kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
+ kFrameCount /* iFrameCount */, kFrameCount /* oFrameCount */);
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &mOpenEffectReturn, EX_NONE));
ASSERT_NE(nullptr, mEffect);
mVersion = EffectFactoryHelper::getHalVersion(mFactory);
@@ -110,7 +111,7 @@
<< "\ngetParam:" << getParam.toString();
}
- static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
+ static const long kFrameCount = 256;
IEffect::OpenEffectReturn mOpenEffectReturn;
std::shared_ptr<IFactory> mFactory;
std::shared_ptr<IEffect> mEffect;
@@ -153,8 +154,12 @@
public:
LoudnessEnhancerDataTest() {
std::tie(mFactory, mDescriptor) = GetParam();
+ mBufferSize = kFrameCount *
+ getChannelCount(AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
+ AudioChannelLayout::LAYOUT_STEREO));
generateInputBuffer();
- mOutputBuffer.resize(kBufferSize);
+
+ mOutputBuffer.resize(mBufferSize);
}
void SetUp() override {
@@ -174,7 +179,7 @@
// Fill inputBuffer with random values between -kMaxAudioSample to kMaxAudioSample
void generateInputBuffer() {
- for (size_t i = 0; i < kBufferSize; i++) {
+ for (size_t i = 0; i < mBufferSize; i++) {
mInputBuffer.push_back(((static_cast<float>(std::rand()) / RAND_MAX) * 2 - 1) *
kMaxAudioSample);
}
@@ -215,7 +220,7 @@
}
void assertSequentialGains(const std::vector<int>& gainValues, bool isIncreasing) {
- std::vector<float> baseOutput(kBufferSize);
+ std::vector<float> baseOutput(mBufferSize);
// Process a reference output buffer with 0 gain which gives compressed input values
binder_exception_t expected;
@@ -252,7 +257,7 @@
std::vector<float> mInputBuffer;
std::vector<float> mOutputBuffer;
- static constexpr float kBufferSize = 128;
+ size_t mBufferSize;
};
TEST_P(LoudnessEnhancerDataTest, IncreasingGains) {
diff --git a/audio/common/all-versions/default/7.0/HidlUtils.cpp b/audio/common/all-versions/default/7.0/HidlUtils.cpp
index f89c898..bc056e2 100644
--- a/audio/common/all-versions/default/7.0/HidlUtils.cpp
+++ b/audio/common/all-versions/default/7.0/HidlUtils.cpp
@@ -1025,7 +1025,7 @@
result = BAD_VALUE;
}
}
- std::string fullHalTags{std::move(halTagsBuffer.str())};
+ std::string fullHalTags{halTagsBuffer.str()};
strncpy(halTags, fullHalTags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE);
CONVERT_CHECKED(fullHalTags.length() <= AUDIO_ATTRIBUTES_TAGS_MAX_SIZE ? NO_ERROR : BAD_VALUE,
result);
diff --git a/automotive/audiocontrol/aidl/Android.bp b/automotive/audiocontrol/aidl/Android.bp
index 0eb17fe..edb29c9 100644
--- a/automotive/audiocontrol/aidl/Android.bp
+++ b/automotive/audiocontrol/aidl/Android.bp
@@ -62,12 +62,12 @@
},
],
- frozen: true,
+ frozen: false,
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_automotive_audiocontrol = "android.hardware.automotive.audiocontrol-V4"
+latest_android_hardware_automotive_audiocontrol = "android.hardware.automotive.audiocontrol-V5"
cc_defaults {
name: "latest_android_hardware_automotive_audiocontrol_cpp_static",
diff --git a/automotive/evs/1.1/default/EvsCamera.cpp b/automotive/evs/1.1/default/EvsCamera.cpp
index 520670a..fb598ff 100644
--- a/automotive/evs/1.1/default/EvsCamera.cpp
+++ b/automotive/evs/1.1/default/EvsCamera.cpp
@@ -495,7 +495,7 @@
}
if (!stored) {
// Add a BufferRecord wrapping this handle to our set of available buffers
- mBuffers.push_back(std::move(BufferRecord(memHandle)));
+ mBuffers.push_back(BufferRecord(memHandle));
}
mFramesAllowed++;
diff --git a/automotive/evs/aidl/impl/default/src/ConfigManager.cpp b/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
index ba4cdc0..d8961d0 100644
--- a/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
+++ b/automotive/evs/aidl/impl/default/src/ConfigManager.cpp
@@ -199,8 +199,8 @@
CameraParam aParam;
if (ConfigManagerUtil::convertToEvsCameraParam(nameAttr, aParam)) {
- aCamera->controls.insert_or_assign(
- aParam, std::move(std::make_tuple(minVal, maxVal, stepVal)));
+ aCamera->controls.insert_or_assign(aParam,
+ std::make_tuple(minVal, maxVal, stepVal));
}
ctrlElem = ctrlElem->NextSiblingElement("control");
@@ -583,8 +583,8 @@
CameraCtrl* ptr = reinterpret_cast<CameraCtrl*>(p);
for (size_t idx = 0; idx < sz; ++idx) {
CameraCtrl temp = *ptr++;
- aCamera->controls.insert_or_assign(
- temp.cid, std::move(std::make_tuple(temp.min, temp.max, temp.step)));
+ aCamera->controls.insert_or_assign(temp.cid,
+ std::make_tuple(temp.min, temp.max, temp.step));
}
p = reinterpret_cast<char*>(ptr);
@@ -689,8 +689,8 @@
CameraCtrl* ptr = reinterpret_cast<CameraCtrl*>(p);
for (size_t idx = 0; idx < sz; ++idx) {
CameraCtrl temp = *ptr++;
- aCamera->controls.insert_or_assign(
- temp.cid, std::move(std::make_tuple(temp.min, temp.max, temp.step)));
+ aCamera->controls.insert_or_assign(temp.cid,
+ std::make_tuple(temp.min, temp.max, temp.step));
}
p = reinterpret_cast<char*>(ptr);
diff --git a/automotive/evs/aidl/impl/default/src/EvsGlDisplay.cpp b/automotive/evs/aidl/impl/default/src/EvsGlDisplay.cpp
index 5b5cbcc..cf94e38 100644
--- a/automotive/evs/aidl/impl/default/src/EvsGlDisplay.cpp
+++ b/automotive/evs/aidl/impl/default/src/EvsGlDisplay.cpp
@@ -353,7 +353,7 @@
.buffer =
{
.description = mBuffer.description,
- .handle = std::move(::android::dupToAidl(mBuffer.handle)),
+ .handle = ::android::dupToAidl(mBuffer.handle),
},
.pixelSizeBytes = 4, // RGBA_8888 is 4-byte-per-pixel format
.bufferId = mBuffer.fingerprint,
diff --git a/automotive/evs/aidl/vts/FrameHandler.cpp b/automotive/evs/aidl/vts/FrameHandler.cpp
index e51be67..88c3643 100644
--- a/automotive/evs/aidl/vts/FrameHandler.cpp
+++ b/automotive/evs/aidl/vts/FrameHandler.cpp
@@ -50,12 +50,12 @@
}
} else {
for (auto i = 0; i < handle.fds.size(); ++i) {
- dup.fds[i] = std::move(handle.fds[i].dup());
+ dup.fds[i] = handle.fds[i].dup();
}
}
dup.ints = handle.ints;
- return std::move(dup);
+ return dup;
}
HardwareBuffer dupHardwareBuffer(const HardwareBuffer& buffer, bool doDup) {
@@ -64,7 +64,7 @@
.handle = dupNativeHandle(buffer.handle, doDup),
};
- return std::move(dup);
+ return dup;
}
BufferDesc dupBufferDesc(const BufferDesc& src, bool doDup) {
@@ -77,7 +77,7 @@
.metadata = src.metadata,
};
- return std::move(dup);
+ return dup;
}
bool comparePayload(const EvsEventDesc& l, const EvsEventDesc& r) {
diff --git a/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp b/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
index 477de31..dc78ed6 100644
--- a/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
+++ b/automotive/evs/aidl/vts/VtsHalEvsTargetTest.cpp
@@ -317,12 +317,20 @@
// Verify methods for extended info
const auto id = 0xFFFFFFFF; // meaningless id
std::vector<uint8_t> values;
+ bool isSupported = false;
auto status = pCam->setExtendedInfo(id, values);
if (isLogicalCam) {
EXPECT_TRUE(!status.isOk() && status.getServiceSpecificError() ==
static_cast<int>(EvsResult::NOT_SUPPORTED));
} else {
- EXPECT_TRUE(status.isOk());
+ if (status.isOk()) {
+ // 0xFFFFFFFF is valid for EVS HAL implementation under
+ // test.
+ isSupported = true;
+ } else {
+ EXPECT_TRUE(status.getServiceSpecificError() ==
+ static_cast<int>(EvsResult::INVALID_ARG));
+ }
}
status = pCam->getExtendedInfo(id, &values);
@@ -330,7 +338,12 @@
EXPECT_TRUE(!status.isOk() && status.getServiceSpecificError() ==
static_cast<int>(EvsResult::NOT_SUPPORTED));
} else {
- EXPECT_TRUE(status.isOk());
+ if (isSupported) {
+ EXPECT_TRUE(status.isOk());
+ } else {
+ EXPECT_TRUE(!status.isOk() && status.getServiceSpecificError() ==
+ static_cast<int>(EvsResult::INVALID_ARG));
+ }
}
// Explicitly close the camera so resources are released right away
diff --git a/automotive/vehicle/2.0/default/Android.bp b/automotive/vehicle/2.0/default/Android.bp
index 94a5882..76d44f8 100644
--- a/automotive/vehicle/2.0/default/Android.bp
+++ b/automotive/vehicle/2.0/default/Android.bp
@@ -290,7 +290,8 @@
],
fuzz_config: {
cc: [
- "android-media-fuzzing-reports@google.com",
+ "ericjeong@google.com",
+ "shanyu@google.com",
],
componentid: 533764,
hotlists: [
diff --git a/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp b/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp
index e34e692..3d6e475 100644
--- a/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp
+++ b/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp
@@ -583,12 +583,12 @@
while (*index < options.size()) {
std::string option = options[*index];
if (kSetPropOptions.find(option) != kSetPropOptions.end()) {
- return std::move(values);
+ return values;
}
values.push_back(option);
(*index)++;
}
- return std::move(values);
+ return values;
}
bool VehicleHalManager::parseSetPropOptions(int fd, const hidl_vec<hidl_string>& options,
diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.cpp
index 4704917..86fc70a 100644
--- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.cpp
+++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.cpp
@@ -509,7 +509,7 @@
int64_t timestamp;
int32_t areaId = 0;
if (options[1] == "--setint") {
- updatedPropValue = std::move(createVehiclePropValue(VehiclePropertyType::INT32, 1));
+ updatedPropValue = createVehiclePropValue(VehiclePropertyType::INT32, 1);
if (!android::base::ParseInt(options[3], &intValue)) {
result.buffer += "failed to parse value as int: \"" + options[3] + "\"\n";
result.buffer += getHelpInfo();
@@ -517,7 +517,7 @@
}
updatedPropValue->value.int32Values[0] = intValue;
} else if (options[1] == "--setbool") {
- updatedPropValue = std::move(createVehiclePropValue(VehiclePropertyType::BOOLEAN, 1));
+ updatedPropValue = createVehiclePropValue(VehiclePropertyType::BOOLEAN, 1);
if (options[3] == "true" || options[3] == "True") {
updatedPropValue->value.int32Values[0] = 1;
} else if (options[3] == "false" || options[3] == "False") {
@@ -529,7 +529,7 @@
return result;
}
} else {
- updatedPropValue = std::move(createVehiclePropValue(VehiclePropertyType::FLOAT, 1));
+ updatedPropValue = createVehiclePropValue(VehiclePropertyType::FLOAT, 1);
if (!android::base::ParseFloat(options[3], &floatValue)) {
result.buffer += "failed to parse value as float: \"" + options[3] + "\"\n";
result.buffer += getHelpInfo();
diff --git a/automotive/vehicle/TEST_MAPPING b/automotive/vehicle/TEST_MAPPING
index 77629a9..d848774 100644
--- a/automotive/vehicle/TEST_MAPPING
+++ b/automotive/vehicle/TEST_MAPPING
@@ -45,6 +45,9 @@
"name": "FakeVehicleHardwareTest"
},
{
+ "name": "GRPCVehicleHardwareUnitTest"
+ },
+ {
"name": "CarServiceUnitTest",
"options" : [
{
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h b/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
index 79d3e77..ec69894 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/include/FakeVehicleHardware.h
@@ -327,6 +327,8 @@
static android::base::Result<float> safelyParseFloat(int index, const std::string& s);
static android::base::Result<int32_t> parsePropId(const std::vector<std::string>& options,
size_t index);
+ static android::base::Result<int32_t> parseAreaId(const std::vector<std::string>& options,
+ size_t index, int32_t propId);
};
} // namespace fake
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp b/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
index 4f060e2..54dcca2 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/src/FakeVehicleHardware.cpp
@@ -1902,6 +1902,37 @@
return safelyParseInt<int32_t>(index, propIdStr);
}
+// Parses areaId option ("-a"). It can be an Integer or a string in the form of "AREA_1" or
+// "AREA_1 | AREA_2 | ..."
+Result<int32_t> FakeVehicleHardware::parseAreaId(const std::vector<std::string>& options,
+ size_t index, int32_t propId) {
+ const std::string& areaIdStr = options[index];
+ auto result = safelyParseInt<int32_t>(index, areaIdStr);
+ if (result.ok()) {
+ return result;
+ }
+
+ // Check for pattern matching "AREA_1 | AREA_2 | AREA_3".
+ std::regex pattern(R"(^\w+(?:( )?\|( )?\w+)*$)");
+ std::smatch match;
+ int32_t areaId = 0;
+ if (!std::regex_match(areaIdStr, match, pattern)) {
+ return result;
+ }
+ pattern = R"(\w+)";
+
+ std::sregex_iterator end;
+ for (std::sregex_iterator it(areaIdStr.begin(), areaIdStr.end(), pattern); it != end; it++) {
+ // Parse each areas contained in this areaId.
+ auto result = stringToArea(it->str(), propId);
+ if (!result.ok()) {
+ return result;
+ }
+ areaId |= result.value();
+ }
+ return areaId;
+}
+
std::string FakeVehicleHardware::dumpSpecificProperty(const std::vector<std::string>& options) {
if (auto result = checkArgumentsSize(options, /*minSize=*/2); !result.ok()) {
return getErrorMsg(result);
@@ -1958,6 +1989,7 @@
prop.status = VehiclePropertyStatus::AVAILABLE;
optionIndex++;
std::unordered_set<std::string> parsedOptions;
+ int32_t areaIdIndex = -1;
while (optionIndex < options.size()) {
std::string argType = options[optionIndex];
@@ -2032,13 +2064,7 @@
if (argValuesSize != 1) {
return Error() << "Expect exact one value when using \"-a\"\n";
}
- auto int32Result = safelyParseInt<int32_t>(currentIndex, argValues[0]);
- if (!int32Result.ok()) {
- return Error() << StringPrintf("Area ID: \"%s\" is not a valid int: %s\n",
- argValues[0].c_str(),
- getErrorMsg(int32Result).c_str());
- }
- prop.areaId = int32Result.value();
+ areaIdIndex = currentIndex;
} else if (EqualsIgnoreCase(argType, "-t")) {
if (argValuesSize != 1) {
return Error() << "Expect exact one value when using \"-t\"\n";
@@ -2055,6 +2081,17 @@
}
}
+ if (areaIdIndex != -1) {
+ auto int32Result = parseAreaId(options, areaIdIndex, prop.prop);
+ if (!int32Result.ok()) {
+ return Error() << StringPrintf(
+ "Area ID: \"%s\" is not a valid int or "
+ "one or more area names: %s\n",
+ options[areaIdIndex].c_str(), getErrorMsg(int32Result).c_str());
+ }
+ prop.areaId = int32Result.value();
+ }
+
return prop;
}
diff --git a/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp b/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
index 0924360..95647df 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/hardware/test/FakeVehicleHardwareTest.cpp
@@ -77,6 +77,7 @@
using ::aidl::android::hardware::automotive::vehicle::VehicleApPowerStateReq;
using ::aidl::android::hardware::automotive::vehicle::VehicleApPowerStateShutdownParam;
using ::aidl::android::hardware::automotive::vehicle::VehicleAreaMirror;
+using ::aidl::android::hardware::automotive::vehicle::VehicleAreaSeat;
using ::aidl::android::hardware::automotive::vehicle::VehicleHwKeyInputAction;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropConfig;
using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
@@ -1870,7 +1871,7 @@
TEST_F(FakeVehicleHardwareTest, testGetHvacPropNotAvailable) {
FakeVehicleHardwareTestHelper helper(getHardware());
- auto hvacPowerOnConfig = std::move(getVehiclePropConfig(toInt(VehicleProperty::HVAC_POWER_ON)));
+ auto hvacPowerOnConfig = getVehiclePropConfig(toInt(VehicleProperty::HVAC_POWER_ON));
EXPECT_NE(hvacPowerOnConfig, nullptr);
for (auto& hvacPowerOnAreaConfig : hvacPowerOnConfig->areaConfigs) {
int hvacPowerAreaId = hvacPowerOnAreaConfig.areaId;
@@ -1881,7 +1882,7 @@
EXPECT_EQ(status, StatusCode::OK);
for (auto& powerPropId : helper.getHvacPowerDependentProps()) {
- auto powerPropConfig = std::move(getVehiclePropConfig(powerPropId));
+ auto powerPropConfig = getVehiclePropConfig(powerPropId);
EXPECT_NE(powerPropConfig, nullptr);
if (powerPropConfig->access == VehiclePropertyAccess::WRITE) {
continue;
@@ -1917,7 +1918,7 @@
TEST_F(FakeVehicleHardwareTest, testSetHvacPropNotAvailable) {
FakeVehicleHardwareTestHelper helper(getHardware());
- auto hvacPowerOnConfig = std::move(getVehiclePropConfig(toInt(VehicleProperty::HVAC_POWER_ON)));
+ auto hvacPowerOnConfig = getVehiclePropConfig(toInt(VehicleProperty::HVAC_POWER_ON));
EXPECT_NE(hvacPowerOnConfig, nullptr);
for (auto& hvacPowerOnAreaConfig : hvacPowerOnConfig->areaConfigs) {
int hvacPowerAreaId = hvacPowerOnAreaConfig.areaId;
@@ -1928,7 +1929,7 @@
EXPECT_EQ(status, StatusCode::OK);
for (auto& powerPropId : helper.getHvacPowerDependentProps()) {
- auto powerPropConfig = std::move(getVehiclePropConfig(powerPropId));
+ auto powerPropConfig = getVehiclePropConfig(powerPropId);
EXPECT_NE(powerPropConfig, nullptr);
if (powerPropConfig->access == VehiclePropertyAccess::READ) {
continue;
@@ -1967,7 +1968,7 @@
TEST_F(FakeVehicleHardwareTest, testHvacPowerOnSendCurrentHvacPropValues) {
FakeVehicleHardwareTestHelper helper(getHardware());
- auto hvacPowerOnConfig = std::move(getVehiclePropConfig(toInt(VehicleProperty::HVAC_POWER_ON)));
+ auto hvacPowerOnConfig = getVehiclePropConfig(toInt(VehicleProperty::HVAC_POWER_ON));
EXPECT_NE(hvacPowerOnConfig, nullptr);
for (auto& hvacPowerOnAreaConfig : hvacPowerOnConfig->areaConfigs) {
int hvacPowerAreaId = hvacPowerOnAreaConfig.areaId;
@@ -2006,9 +2007,9 @@
}
TEST_F(FakeVehicleHardwareTest, testHvacDualOnSynchronizesTemp) {
- auto hvacDualOnConfig = std::move(getVehiclePropConfig(toInt(VehicleProperty::HVAC_DUAL_ON)));
+ auto hvacDualOnConfig = getVehiclePropConfig(toInt(VehicleProperty::HVAC_DUAL_ON));
auto hvacTemperatureSetConfig =
- std::move(getVehiclePropConfig(toInt(VehicleProperty::HVAC_TEMPERATURE_SET)));
+ getVehiclePropConfig(toInt(VehicleProperty::HVAC_TEMPERATURE_SET));
EXPECT_NE(hvacDualOnConfig, nullptr);
EXPECT_NE(hvacTemperatureSetConfig, nullptr);
for (auto& hvacTemperatureSetConfig : hvacTemperatureSetConfig->areaConfigs) {
@@ -2781,6 +2782,8 @@
std::vector<SetPropTestCase> GenSetPropParams() {
std::string infoMakeProperty = std::to_string(toInt(VehicleProperty::INFO_MAKE));
+ std::string testVendorProperty =
+ std::to_string(toInt(TestVendorProperty::VENDOR_EXTENSION_FLOAT_PROPERTY));
return {
{"success_set_string", {"--set", infoMakeProperty, "-s", CAR_MAKE}, true},
{"success_set_with_name", {"--set", "INFO_MAKE", "-s", CAR_MAKE}, true},
@@ -2889,6 +2892,14 @@
{"--set", infoMakeProperty, "-a", "-s", CAR_MAKE},
false,
"Expect exact one value"},
+ {"fail_invalid_area_name",
+ {"--set", testVendorProperty, "-a", "ROW_1_LEFT|NO_SUCH_AREA", "-f", "1.234"},
+ false,
+ "not a valid int or one or more area names"},
+ {"fail_invalid_area_format",
+ {"--set", testVendorProperty, "-a", "ROW_1_LEFT|||ROW_2_LEFT", "-f", "1.234"},
+ false,
+ "not a valid int or one or more area names"},
};
}
@@ -2933,6 +2944,86 @@
ASSERT_EQ(3.402823466E+38f, value.value.floatValues[2]);
}
+TEST_F(FakeVehicleHardwareTest, SetPropertyWithPropertyNameAreaId) {
+ int32_t areaId = toInt(VehicleAreaSeat::ROW_1_LEFT);
+ getHardware()->dump(
+ {"--set", "HVAC_TEMPERATURE_SET", "-a", std::to_string(areaId), "-f", "22.345"});
+
+ VehiclePropValue requestProp;
+ requestProp.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_SET);
+ requestProp.areaId = areaId;
+ auto result = getValue(requestProp);
+
+ ASSERT_TRUE(result.ok());
+ VehiclePropValue value = result.value();
+ ASSERT_EQ(value.prop, toInt(VehicleProperty::HVAC_TEMPERATURE_SET));
+ ASSERT_EQ(value.areaId, areaId);
+ ASSERT_EQ(1u, value.value.floatValues.size());
+ ASSERT_EQ(22.345f, value.value.floatValues[0]);
+}
+
+TEST_F(FakeVehicleHardwareTest, SetPropertyWithPropertyNameAreaName) {
+ int32_t areaId = toInt(VehicleAreaSeat::ROW_1_LEFT);
+ getHardware()->dump({"--set", "HVAC_TEMPERATURE_SET", "-a", "ROW_1_LEFT", "-f", "22.345"});
+
+ VehiclePropValue requestProp;
+ requestProp.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_SET);
+ requestProp.areaId = areaId;
+ auto result = getValue(requestProp);
+
+ ASSERT_TRUE(result.ok());
+ VehiclePropValue value = result.value();
+ ASSERT_EQ(value.prop, toInt(VehicleProperty::HVAC_TEMPERATURE_SET));
+ ASSERT_EQ(value.areaId, areaId);
+ ASSERT_EQ(1u, value.value.floatValues.size());
+ ASSERT_EQ(22.345f, value.value.floatValues[0]);
+}
+
+TEST_F(FakeVehicleHardwareTest, GetPropertyWithPropertyNameAreaName) {
+ auto result = getHardware()->dump({"--get", "HVAC_TEMPERATURE_SET", "-a", "ROW_1_LEFT"});
+
+ // Default value is 17
+ ASSERT_THAT(result.buffer, ContainsRegex("17"));
+
+ getHardware()->dump({"--set", "HVAC_TEMPERATURE_SET", "-a", "ROW_1_LEFT", "-f", "22"});
+ result = getHardware()->dump({"--get", "HVAC_TEMPERATURE_SET", "-a", "ROW_1_LEFT"});
+
+ ASSERT_THAT(result.buffer, ContainsRegex("22"));
+}
+
+TEST_F(FakeVehicleHardwareTest, SetPropertyWithPropertyNameTwoAreasInOneId) {
+ int32_t propId = toInt(TestVendorProperty::VENDOR_EXTENSION_FLOAT_PROPERTY);
+ std::string testVendorProperty = std::to_string(propId);
+ getHardware()->dump({"--set", testVendorProperty, "-a", "ROW_1_LEFT|ROW_2_LEFT|ROW_2_CENTER",
+ "-f", "1.234"});
+
+ VehiclePropValue requestProp;
+ requestProp.prop = propId;
+ int32_t areaId = toInt(VehicleAreaSeat::ROW_1_LEFT) | toInt(VehicleAreaSeat::ROW_2_LEFT) |
+ toInt(VehicleAreaSeat::ROW_2_CENTER);
+ requestProp.areaId = areaId;
+ auto result = getValue(requestProp);
+
+ ASSERT_TRUE(result.ok());
+ VehiclePropValue value = result.value();
+ ASSERT_EQ(value.prop, propId);
+ ASSERT_EQ(value.areaId, areaId);
+ ASSERT_EQ(1u, value.value.floatValues.size());
+ ASSERT_EQ(1.234f, value.value.floatValues[0]);
+
+ // Ignore space between two areas.
+ getHardware()->dump({"--set", testVendorProperty, "-a",
+ "ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER", "-f", "2.345"});
+ result = getValue(requestProp);
+
+ ASSERT_TRUE(result.ok());
+ value = result.value();
+ ASSERT_EQ(value.prop, propId);
+ ASSERT_EQ(value.areaId, areaId);
+ ASSERT_EQ(1u, value.value.floatValues.size());
+ ASSERT_EQ(2.345f, value.value.floatValues[0]);
+}
+
struct OptionsTestCase {
std::string name;
std::vector<std::string> options;
@@ -3514,7 +3605,7 @@
// Config array values from HVAC_TEMPERATURE_SET in DefaultProperties.json
auto configs = getHardware()->getAllPropertyConfigs();
auto hvacTemperatureSetConfig =
- std::move(getVehiclePropConfig(toInt(VehicleProperty::HVAC_TEMPERATURE_SET)));
+ getVehiclePropConfig(toInt(VehicleProperty::HVAC_TEMPERATURE_SET));
EXPECT_NE(hvacTemperatureSetConfig, nullptr);
auto& hvacTemperatureSetConfigArray = hvacTemperatureSetConfig->configArray;
diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp
index f44573a..73bb521 100644
--- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp
+++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.cpp
@@ -20,6 +20,7 @@
#include <android-base/logging.h>
#include <grpc++/grpc++.h>
+#include <utils/SystemClock.h>
#include <cstdlib>
#include <mutex>
@@ -28,11 +29,16 @@
namespace android::hardware::automotive::vehicle::virtualization {
-static std::shared_ptr<::grpc::ChannelCredentials> getChannelCredentials() {
- // TODO(chenhaosjtuacm): get secured credentials here
+namespace {
+
+constexpr size_t MAX_RETRY_COUNT = 5;
+
+std::shared_ptr<::grpc::ChannelCredentials> getChannelCredentials() {
return ::grpc::InsecureChannelCredentials();
}
+} // namespace
+
GRPCVehicleHardware::GRPCVehicleHardware(std::string service_addr)
: mServiceAddr(std::move(service_addr)),
mGrpcChannel(::grpc::CreateChannel(mServiceAddr, getChannelCredentials())),
@@ -40,11 +46,13 @@
mValuePollingThread([this] { ValuePollingLoop(); }) {}
// Only used for unit testing.
-GRPCVehicleHardware::GRPCVehicleHardware(std::unique_ptr<proto::VehicleServer::StubInterface> stub)
- : mServiceAddr(""),
- mGrpcChannel(nullptr),
- mGrpcStub(std::move(stub)),
- mValuePollingThread([] {}) {}
+GRPCVehicleHardware::GRPCVehicleHardware(std::unique_ptr<proto::VehicleServer::StubInterface> stub,
+ bool startValuePollingLoop)
+ : mServiceAddr(""), mGrpcChannel(nullptr), mGrpcStub(std::move(stub)) {
+ if (startValuePollingLoop) {
+ mValuePollingThread = std::thread([this] { ValuePollingLoop(); });
+ }
+}
GRPCVehicleHardware::~GRPCVehicleHardware() {
{
@@ -52,7 +60,9 @@
mShuttingDownFlag.store(true);
}
mShutdownCV.notify_all();
- mValuePollingThread.join();
+ if (mValuePollingThread.joinable()) {
+ mValuePollingThread.join();
+ }
}
std::vector<aidlvhal::VehiclePropConfig> GRPCVehicleHardware::getAllPropertyConfigs() const {
@@ -109,36 +119,117 @@
aidlvhal::StatusCode GRPCVehicleHardware::getValues(
std::shared_ptr<const GetValuesCallback> callback,
const std::vector<aidlvhal::GetValueRequest>& requests) const {
- ::grpc::ClientContext context;
+ std::vector<aidlvhal::GetValueResult> results;
+ auto status = getValuesWithRetry(requests, &results, /*retryCount=*/0);
+ if (status != aidlvhal::StatusCode::OK) {
+ return status;
+ }
+ if (!results.empty()) {
+ (*callback)(std::move(results));
+ }
+ return status;
+}
+
+aidlvhal::StatusCode GRPCVehicleHardware::getValuesWithRetry(
+ const std::vector<aidlvhal::GetValueRequest>& requests,
+ std::vector<aidlvhal::GetValueResult>* results, size_t retryCount) const {
+ if (retryCount == MAX_RETRY_COUNT) {
+ LOG(ERROR) << __func__ << ": GRPC GetValues Failed, failed to get the latest value after "
+ << retryCount << " retries";
+ return aidlvhal::StatusCode::TRY_AGAIN;
+ }
+
proto::VehiclePropValueRequests protoRequests;
- proto::GetValueResults protoResults;
+ std::unordered_map<int64_t, const aidlvhal::GetValueRequest*> requestById;
for (const auto& request : requests) {
auto& protoRequest = *protoRequests.add_requests();
protoRequest.set_request_id(request.requestId);
proto_msg_converter::aidlToProto(request.prop, protoRequest.mutable_value());
+ requestById[request.requestId] = &request;
}
+
// TODO(chenhaosjtuacm): Make it Async.
+ ::grpc::ClientContext context;
+ proto::GetValueResults protoResults;
auto grpc_status = mGrpcStub->GetValues(&context, protoRequests, &protoResults);
if (!grpc_status.ok()) {
LOG(ERROR) << __func__ << ": GRPC GetValues Failed: " << grpc_status.error_message();
return aidlvhal::StatusCode::INTERNAL_ERROR;
}
- std::vector<aidlvhal::GetValueResult> results;
+
+ std::vector<aidlvhal::GetValueRequest> retryRequests;
for (const auto& protoResult : protoResults.results()) {
- auto& result = results.emplace_back();
- result.requestId = protoResult.request_id();
- result.status = static_cast<aidlvhal::StatusCode>(protoResult.status());
- if (protoResult.has_value()) {
- aidlvhal::VehiclePropValue value;
- proto_msg_converter::protoToAidl(protoResult.value(), &value);
- result.prop = std::move(value);
+ int64_t requestId = protoResult.request_id();
+ auto it = requestById.find(requestId);
+ if (it == requestById.end()) {
+ LOG(ERROR) << __func__
+ << "Invalid getValue request with unknown request ID: " << requestId
+ << ", ignore";
+ continue;
}
+
+ if (!protoResult.has_value()) {
+ auto& result = results->emplace_back();
+ result.requestId = requestId;
+ result.status = static_cast<aidlvhal::StatusCode>(protoResult.status());
+ continue;
+ }
+
+ aidlvhal::VehiclePropValue value;
+ proto_msg_converter::protoToAidl(protoResult.value(), &value);
+
+ // VHAL proxy server uses a different timestamp then AAOS timestamp, so we have to reset
+ // the timestamp.
+ // TODO(b/350822044): Remove this once we use timestamp from proxy server.
+ if (!setAndroidTimestamp(&value)) {
+ // This is a rare case when we receive a property update event reflecting a new value
+ // for the property before we receive the get value result. This means that the result
+ // is already outdated, hence we should retry getting the latest value again.
+ LOG(WARNING) << __func__ << "getValue result for propId: " << value.prop
+ << " areaId: " << value.areaId << " is oudated, retry";
+ retryRequests.push_back(*(it->second));
+ continue;
+ }
+
+ auto& result = results->emplace_back();
+ result.requestId = requestId;
+ result.status = static_cast<aidlvhal::StatusCode>(protoResult.status());
+ result.prop = std::move(value);
}
- (*callback)(std::move(results));
+
+ if (retryRequests.size() != 0) {
+ return getValuesWithRetry(retryRequests, results, retryCount++);
+ }
return aidlvhal::StatusCode::OK;
}
+bool GRPCVehicleHardware::setAndroidTimestamp(aidlvhal::VehiclePropValue* propValue) const {
+ PropIdAreaId propIdAreaId = {
+ .propId = propValue->prop,
+ .areaId = propValue->areaId,
+ };
+ int64_t now = elapsedRealtimeNano();
+ int64_t externalTimestamp = propValue->timestamp;
+
+ {
+ std::lock_guard lck(mLatestUpdateTimestampsMutex);
+ auto it = mLatestUpdateTimestamps.find(propIdAreaId);
+ if (it == mLatestUpdateTimestamps.end() || externalTimestamp > (it->second).first) {
+ mLatestUpdateTimestamps[propIdAreaId].first = externalTimestamp;
+ mLatestUpdateTimestamps[propIdAreaId].second = now;
+ propValue->timestamp = now;
+ return true;
+ }
+ if (externalTimestamp == (it->second).first) {
+ propValue->timestamp = (it->second).second;
+ return true;
+ }
+ }
+ // externalTimestamp < (it->second).first, the value is outdated.
+ return false;
+}
+
void GRPCVehicleHardware::registerOnPropertyChangeEvent(
std::unique_ptr<const PropertyChangeCallback> callback) {
std::lock_guard lck(mCallbackMutex);
@@ -248,46 +339,61 @@
void GRPCVehicleHardware::ValuePollingLoop() {
while (!mShuttingDownFlag.load()) {
- ::grpc::ClientContext context;
-
- bool rpc_stopped{false};
- std::thread shuttingdown_watcher([this, &rpc_stopped, &context]() {
- std::unique_lock<std::mutex> lck(mShutdownMutex);
- mShutdownCV.wait(lck, [this, &rpc_stopped]() {
- return rpc_stopped || mShuttingDownFlag.load();
- });
- context.TryCancel();
- });
-
- auto value_stream =
- mGrpcStub->StartPropertyValuesStream(&context, ::google::protobuf::Empty());
- LOG(INFO) << __func__ << ": GRPC Value Streaming Started";
- proto::VehiclePropValues protoValues;
- while (!mShuttingDownFlag.load() && value_stream->Read(&protoValues)) {
- std::vector<aidlvhal::VehiclePropValue> values;
- for (const auto protoValue : protoValues.values()) {
- values.push_back(aidlvhal::VehiclePropValue());
- proto_msg_converter::protoToAidl(protoValue, &values.back());
- }
- std::shared_lock lck(mCallbackMutex);
- if (mOnPropChange) {
- (*mOnPropChange)(values);
- }
- }
-
- {
- std::lock_guard lck(mShutdownMutex);
- rpc_stopped = true;
- }
- mShutdownCV.notify_all();
- shuttingdown_watcher.join();
-
- auto grpc_status = value_stream->Finish();
- // never reach here until connection lost
- LOG(ERROR) << __func__ << ": GRPC Value Streaming Failed: " << grpc_status.error_message();
-
+ pollValue();
// try to reconnect
}
}
+void GRPCVehicleHardware::pollValue() {
+ ::grpc::ClientContext context;
+
+ bool rpc_stopped{false};
+ std::thread shuttingdown_watcher([this, &rpc_stopped, &context]() {
+ std::unique_lock<std::mutex> lck(mShutdownMutex);
+ mShutdownCV.wait(
+ lck, [this, &rpc_stopped]() { return rpc_stopped || mShuttingDownFlag.load(); });
+ context.TryCancel();
+ });
+
+ auto value_stream = mGrpcStub->StartPropertyValuesStream(&context, ::google::protobuf::Empty());
+ LOG(INFO) << __func__ << ": GRPC Value Streaming Started";
+ proto::VehiclePropValues protoValues;
+ while (!mShuttingDownFlag.load() && value_stream->Read(&protoValues)) {
+ std::vector<aidlvhal::VehiclePropValue> values;
+ for (const auto protoValue : protoValues.values()) {
+ aidlvhal::VehiclePropValue aidlValue = {};
+ proto_msg_converter::protoToAidl(protoValue, &aidlValue);
+
+ // VHAL proxy server uses a different timestamp then AAOS timestamp, so we have to
+ // reset the timestamp.
+ // TODO(b/350822044): Remove this once we use timestamp from proxy server.
+ if (!setAndroidTimestamp(&aidlValue)) {
+ LOG(WARNING) << __func__ << ": property event for propId: " << aidlValue.prop
+ << " areaId: " << aidlValue.areaId << " is outdated, ignore";
+ continue;
+ }
+
+ values.push_back(std::move(aidlValue));
+ }
+ if (values.empty()) {
+ continue;
+ }
+ std::shared_lock lck(mCallbackMutex);
+ if (mOnPropChange) {
+ (*mOnPropChange)(values);
+ }
+ }
+
+ {
+ std::lock_guard lck(mShutdownMutex);
+ rpc_stopped = true;
+ }
+ mShutdownCV.notify_all();
+ shuttingdown_watcher.join();
+
+ auto grpc_status = value_stream->Finish();
+ // never reach here until connection lost
+ LOG(ERROR) << __func__ << ": GRPC Value Streaming Failed: " << grpc_status.error_message();
+}
+
} // namespace android::hardware::automotive::vehicle::virtualization
diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.h b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.h
index 9750f62..1edf658 100644
--- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.h
+++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleHardware.h
@@ -20,6 +20,7 @@
#include <VehicleHalTypes.h>
#include <VehicleUtils.h>
#include <android-base/result.h>
+#include <android-base/thread_annotations.h>
#include "VehicleServer.grpc.pb.h"
#include "VehicleServer.pb.h"
@@ -33,6 +34,7 @@
#include <shared_mutex>
#include <string>
#include <thread>
+#include <unordered_map>
#include <vector>
namespace android::hardware::automotive::vehicle::virtualization {
@@ -43,9 +45,6 @@
public:
explicit GRPCVehicleHardware(std::string service_addr);
- // Only used for unit testing.
- explicit GRPCVehicleHardware(std::unique_ptr<proto::VehicleServer::StubInterface> stub);
-
~GRPCVehicleHardware();
// Get all the property configs.
@@ -94,7 +93,7 @@
std::unique_ptr<const PropertyChangeCallback> mOnPropChange;
private:
- void ValuePollingLoop();
+ friend class GRPCVehicleHardwareUnitTest;
std::string mServiceAddr;
std::shared_ptr<::grpc::Channel> mGrpcChannel;
@@ -106,6 +105,31 @@
std::mutex mShutdownMutex;
std::condition_variable mShutdownCV;
std::atomic<bool> mShuttingDownFlag{false};
+
+ mutable std::mutex mLatestUpdateTimestampsMutex;
+
+ // A map from [propId, areaId] to the latest timestamp this property is updated.
+ // The key is a tuple, the first element is the external timestamp (timestamp set by VHAL
+ // server), the second element is the Android timestamp (elapsedRealtimeNano).
+ mutable std::unordered_map<PropIdAreaId, std::pair<int64_t, int64_t>,
+ PropIdAreaIdHash> mLatestUpdateTimestamps
+ GUARDED_BY(mLatestUpdateTimestampsMutex);
+
+ // Only used for unit testing.
+ GRPCVehicleHardware(std::unique_ptr<proto::VehicleServer::StubInterface> stub,
+ bool startValuePollingLoop);
+
+ void ValuePollingLoop();
+ void pollValue();
+
+ aidlvhal::StatusCode getValuesWithRetry(const std::vector<aidlvhal::GetValueRequest>& requests,
+ std::vector<aidlvhal::GetValueResult>* results,
+ size_t retryCount) const;
+
+ // Check the external timestamp of propValue against the latest updated external timestamp, if
+ // this is an outdated value, return false. Otherwise, update the external timestamp to the
+ // Android timestamp and return true.
+ bool setAndroidTimestamp(aidlvhal::VehiclePropValue* propValue) const;
};
} // namespace android::hardware::automotive::vehicle::virtualization
diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp
index a6abfa3..d7cbe1b 100644
--- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp
+++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.cpp
@@ -40,7 +40,11 @@
GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::string serverAddr,
std::unique_ptr<IVehicleHardware>&& hardware)
- : mServiceAddr(std::move(serverAddr)), mHardware(std::move(hardware)) {
+ : GrpcVehicleProxyServer(std::vector<std::string>({serverAddr}), std::move(hardware)){};
+
+GrpcVehicleProxyServer::GrpcVehicleProxyServer(std::vector<std::string> serverAddrs,
+ std::unique_ptr<IVehicleHardware>&& hardware)
+ : mServiceAddrs(std::move(serverAddrs)), mHardware(std::move(hardware)) {
mHardware->registerOnPropertyChangeEvent(
std::make_unique<const IVehicleHardware::PropertyChangeCallback>(
[this](std::vector<aidlvhal::VehiclePropValue> values) {
@@ -65,10 +69,13 @@
const proto::VehiclePropValueRequests* requests,
proto::SetValueResults* results) {
std::vector<aidlvhal::SetValueRequest> aidlRequests;
+ std::unordered_set<int64_t> requestIds;
for (const auto& protoRequest : requests->requests()) {
auto& aidlRequest = aidlRequests.emplace_back();
- aidlRequest.requestId = protoRequest.request_id();
+ int64_t requestId = protoRequest.request_id();
+ aidlRequest.requestId = requestId;
proto_msg_converter::protoToAidl(protoRequest.value(), &aidlRequest.value);
+ requestIds.insert(requestId);
}
auto waitMtx = std::make_shared<std::mutex>();
auto waitCV = std::make_shared<std::condition_variable>();
@@ -76,19 +83,27 @@
auto tmpResults = std::make_shared<proto::SetValueResults>();
auto aidlStatus = mHardware->setValues(
std::make_shared<const IVehicleHardware::SetValuesCallback>(
- [waitMtx, waitCV, complete,
- tmpResults](std::vector<aidlvhal::SetValueResult> setValueResults) {
- for (const auto& aidlResult : setValueResults) {
- auto& protoResult = *tmpResults->add_results();
- protoResult.set_request_id(aidlResult.requestId);
- protoResult.set_status(
- static_cast<proto::StatusCode>(aidlResult.status));
- }
+ [waitMtx, waitCV, complete, tmpResults,
+ &requestIds](std::vector<aidlvhal::SetValueResult> setValueResults) {
+ bool receivedAllResults = false;
{
std::lock_guard lck(*waitMtx);
- *complete = true;
+ for (const auto& aidlResult : setValueResults) {
+ auto& protoResult = *tmpResults->add_results();
+ int64_t requestIdForResult = aidlResult.requestId;
+ protoResult.set_request_id(requestIdForResult);
+ protoResult.set_status(
+ static_cast<proto::StatusCode>(aidlResult.status));
+ requestIds.erase(requestIdForResult);
+ }
+ if (requestIds.empty()) {
+ receivedAllResults = true;
+ *complete = true;
+ }
}
- waitCV->notify_all();
+ if (receivedAllResults) {
+ waitCV->notify_all();
+ }
}),
aidlRequests);
if (aidlStatus != aidlvhal::StatusCode::OK) {
@@ -110,10 +125,13 @@
const proto::VehiclePropValueRequests* requests,
proto::GetValueResults* results) {
std::vector<aidlvhal::GetValueRequest> aidlRequests;
+ std::unordered_set<int64_t> requestIds;
for (const auto& protoRequest : requests->requests()) {
auto& aidlRequest = aidlRequests.emplace_back();
- aidlRequest.requestId = protoRequest.request_id();
+ int64_t requestId = protoRequest.request_id();
+ aidlRequest.requestId = requestId;
proto_msg_converter::protoToAidl(protoRequest.value(), &aidlRequest.prop);
+ requestIds.insert(requestId);
}
auto waitMtx = std::make_shared<std::mutex>();
auto waitCV = std::make_shared<std::condition_variable>();
@@ -121,23 +139,31 @@
auto tmpResults = std::make_shared<proto::GetValueResults>();
auto aidlStatus = mHardware->getValues(
std::make_shared<const IVehicleHardware::GetValuesCallback>(
- [waitMtx, waitCV, complete,
- tmpResults](std::vector<aidlvhal::GetValueResult> getValueResults) {
- for (const auto& aidlResult : getValueResults) {
- auto& protoResult = *tmpResults->add_results();
- protoResult.set_request_id(aidlResult.requestId);
- protoResult.set_status(
- static_cast<proto::StatusCode>(aidlResult.status));
- if (aidlResult.prop) {
- auto* valuePtr = protoResult.mutable_value();
- proto_msg_converter::aidlToProto(*aidlResult.prop, valuePtr);
- }
- }
+ [waitMtx, waitCV, complete, tmpResults,
+ &requestIds](std::vector<aidlvhal::GetValueResult> getValueResults) {
+ bool receivedAllResults = false;
{
std::lock_guard lck(*waitMtx);
- *complete = true;
+ for (const auto& aidlResult : getValueResults) {
+ auto& protoResult = *tmpResults->add_results();
+ int64_t requestIdForResult = aidlResult.requestId;
+ protoResult.set_request_id(requestIdForResult);
+ protoResult.set_status(
+ static_cast<proto::StatusCode>(aidlResult.status));
+ if (aidlResult.prop) {
+ auto* valuePtr = protoResult.mutable_value();
+ proto_msg_converter::aidlToProto(*aidlResult.prop, valuePtr);
+ }
+ requestIds.erase(requestIdForResult);
+ }
+ if (requestIds.empty()) {
+ receivedAllResults = true;
+ *complete = true;
+ }
}
- waitCV->notify_all();
+ if (receivedAllResults) {
+ waitCV->notify_all();
+ }
}),
aidlRequests);
if (aidlStatus != aidlvhal::StatusCode::OK) {
@@ -254,7 +280,9 @@
}
::grpc::ServerBuilder builder;
builder.RegisterService(this);
- builder.AddListeningPort(mServiceAddr, getServerCredentials());
+ for (const std::string& serviceAddr : mServiceAddrs) {
+ builder.AddListeningPort(serviceAddr, getServerCredentials());
+ }
mServer = builder.BuildAndStart();
CHECK(mServer) << __func__ << ": failed to create the GRPC server, "
<< "please make sure the configuration and permissions are correct";
diff --git a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h
index dd9e2aa..5ffb531 100644
--- a/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h
+++ b/automotive/vehicle/aidl/impl/grpc/GRPCVehicleProxyServer.h
@@ -41,6 +41,9 @@
public:
GrpcVehicleProxyServer(std::string serverAddr, std::unique_ptr<IVehicleHardware>&& hardware);
+ GrpcVehicleProxyServer(std::vector<std::string> serverAddrs,
+ std::unique_ptr<IVehicleHardware>&& hardware);
+
::grpc::Status GetAllPropertyConfig(
::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
::grpc::ServerWriter<proto::VehiclePropConfig>* stream) override;
@@ -116,7 +119,7 @@
static std::atomic<uint64_t> connection_id_counter_;
};
- std::string mServiceAddr;
+ std::vector<std::string> mServiceAddrs;
std::unique_ptr<::grpc::Server> mServer{nullptr};
std::unique_ptr<IVehicleHardware> mHardware;
diff --git a/automotive/vehicle/aidl/impl/grpc/test/GRPCVehicleHardwareUnitTest.cpp b/automotive/vehicle/aidl/impl/grpc/test/GRPCVehicleHardwareUnitTest.cpp
index 3bd7e0e..20af231 100644
--- a/automotive/vehicle/aidl/impl/grpc/test/GRPCVehicleHardwareUnitTest.cpp
+++ b/automotive/vehicle/aidl/impl/grpc/test/GRPCVehicleHardwareUnitTest.cpp
@@ -19,8 +19,10 @@
#include <gmock/gmock.h>
#include <grpc++/grpc++.h>
+#include <grpcpp/test/mock_stream.h>
#include <gtest/gtest.h>
+#include <utils/SystemClock.h>
#include <chrono>
#include <memory>
#include <string>
@@ -31,98 +33,48 @@
using ::testing::_;
using ::testing::DoAll;
+using ::testing::ElementsAre;
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::SaveArg;
using ::testing::SetArgPointee;
+using ::testing::SizeIs;
+
+using ::grpc::testing::MockClientReader;
using proto::MockVehicleServerStub;
-const std::string kFakeServerAddr = "0.0.0.0:54321";
-
-class FakeVehicleServer : public proto::VehicleServer::Service {
- public:
- ::grpc::Status StartPropertyValuesStream(
- ::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
- ::grpc::ServerWriter<proto::VehiclePropValues>* stream) override {
- stream->Write(proto::VehiclePropValues());
- // A fake disconnection.
- return ::grpc::Status(::grpc::StatusCode::ABORTED, "Connection lost.");
- }
-
- // Functions that we do not care.
- ::grpc::Status GetAllPropertyConfig(
- ::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
- ::grpc::ServerWriter<proto::VehiclePropConfig>* stream) override {
- return ::grpc::Status::OK;
- }
-
- ::grpc::Status SetValues(::grpc::ServerContext* context,
- const proto::VehiclePropValueRequests* requests,
- proto::SetValueResults* results) override {
- return ::grpc::Status::OK;
- }
-
- ::grpc::Status GetValues(::grpc::ServerContext* context,
- const proto::VehiclePropValueRequests* requests,
- proto::GetValueResults* results) override {
- return ::grpc::Status::OK;
- }
-};
-
-TEST(GRPCVehicleHardwareUnitTest, Reconnect) {
- auto receivedUpdate = std::make_shared<std::atomic<int>>(0);
- auto vehicleHardware = std::make_unique<GRPCVehicleHardware>(kFakeServerAddr);
- vehicleHardware->registerOnPropertyChangeEvent(
- std::make_unique<const IVehicleHardware::PropertyChangeCallback>(
- [receivedUpdate](const auto&) { receivedUpdate->fetch_add(1); }));
-
- constexpr size_t kServerRestartTimes = 5;
- for (size_t serverStart = 0; serverStart < kServerRestartTimes; ++serverStart) {
- EXPECT_EQ(receivedUpdate->load(), 0);
- auto fakeServer = std::make_unique<FakeVehicleServer>();
- ::grpc::ServerBuilder builder;
- builder.RegisterService(fakeServer.get());
- builder.AddListeningPort(kFakeServerAddr, ::grpc::InsecureServerCredentials());
- auto grpcServer = builder.BuildAndStart();
-
- // Wait until the vehicle hardware received the second update (after one fake
- // disconnection).
- constexpr auto kMaxWaitTime = std::chrono::seconds(5);
- auto startTime = std::chrono::steady_clock::now();
- while (receivedUpdate->load() <= 1 &&
- std::chrono::steady_clock::now() - startTime < kMaxWaitTime)
- ;
-
- grpcServer->Shutdown();
- grpcServer->Wait();
- EXPECT_GT(receivedUpdate->load(), 1);
-
- // Reset for the next round.
- receivedUpdate->store(0);
- }
-}
-
-class GRPCVehicleHardwareMockServerUnitTest : public ::testing::Test {
+class GRPCVehicleHardwareUnitTest : public ::testing::Test {
protected:
NiceMock<MockVehicleServerStub>* mGrpcStub;
std::unique_ptr<GRPCVehicleHardware> mHardware;
void SetUp() override {
auto stub = std::make_unique<NiceMock<MockVehicleServerStub>>();
- ;
mGrpcStub = stub.get();
- mHardware = std::make_unique<GRPCVehicleHardware>(std::move(stub));
+ // Cannot use make_unique here since the constructor is a private method.
+ mHardware = std::unique_ptr<GRPCVehicleHardware>(
+ new GRPCVehicleHardware(std::move(stub), /*startValuePollingLoop=*/false));
}
void TearDown() override { mHardware.reset(); }
+
+ // Access GRPCVehicleHardware private method.
+ void pollValue() { mHardware->pollValue(); }
+
+ void startValuePollingLoop(std::unique_ptr<proto::VehicleServer::StubInterface> stub) {
+ mHardware = std::unique_ptr<GRPCVehicleHardware>(
+ new GRPCVehicleHardware(std::move(stub), /*startValuePollingLoop=*/true));
+ }
+
+ void generatePropertyUpdateEvent(int32_t propId, int64_t timestamp);
};
MATCHER_P(RepeatedInt32Eq, expected_values, "") {
return std::vector<int32_t>(arg.begin(), arg.end()) == expected_values;
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, Subscribe) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestSubscribe) {
proto::VehicleHalCallStatus protoStatus;
protoStatus.set_status_code(proto::StatusCode::OK);
proto::SubscribeRequest actualRequest;
@@ -147,7 +99,7 @@
EXPECT_EQ(protoOptions.enable_variable_update_rate(), true);
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, SubscribeLegacyServer) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestSubscribeLegacyServer) {
EXPECT_CALL(*mGrpcStub, Subscribe(_, _, _))
.WillOnce(Return(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")));
@@ -157,7 +109,7 @@
EXPECT_EQ(status, aidlvhal::StatusCode::OK);
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, SubscribeGrpcFailure) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestSubscribeGrpcFailure) {
EXPECT_CALL(*mGrpcStub, Subscribe(_, _, _))
.WillOnce(Return(::grpc::Status(::grpc::StatusCode::INTERNAL, "GRPC Error")));
@@ -167,7 +119,7 @@
EXPECT_EQ(status, aidlvhal::StatusCode::INTERNAL_ERROR);
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, SubscribeProtoFailure) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestSubscribeProtoFailure) {
proto::VehicleHalCallStatus protoStatus;
protoStatus.set_status_code(proto::StatusCode::NOT_AVAILABLE_SPEED_LOW);
@@ -181,7 +133,7 @@
EXPECT_EQ(status, aidlvhal::StatusCode::NOT_AVAILABLE_SPEED_LOW);
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, Unsubscribe) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestUnsubscribe) {
proto::VehicleHalCallStatus protoStatus;
protoStatus.set_status_code(proto::StatusCode::OK);
proto::UnsubscribeRequest actualRequest;
@@ -199,7 +151,7 @@
EXPECT_EQ(actualRequest.area_id(), areaId);
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, UnsubscribeLegacyServer) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestUnsubscribeLegacyServer) {
EXPECT_CALL(*mGrpcStub, Unsubscribe(_, _, _))
.WillOnce(Return(::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "")));
@@ -208,7 +160,7 @@
EXPECT_EQ(status, aidlvhal::StatusCode::OK);
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, UnsubscribeGrpcFailure) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestUnsubscribeGrpcFailure) {
EXPECT_CALL(*mGrpcStub, Unsubscribe(_, _, _))
.WillOnce(Return(::grpc::Status(::grpc::StatusCode::INTERNAL, "GRPC Error")));
@@ -217,7 +169,7 @@
EXPECT_EQ(status, aidlvhal::StatusCode::INTERNAL_ERROR);
}
-TEST_F(GRPCVehicleHardwareMockServerUnitTest, UnsubscribeProtoFailure) {
+TEST_F(GRPCVehicleHardwareUnitTest, TestUnsubscribeProtoFailure) {
proto::VehicleHalCallStatus protoStatus;
protoStatus.set_status_code(proto::StatusCode::NOT_AVAILABLE_SPEED_LOW);
@@ -230,4 +182,264 @@
EXPECT_EQ(status, aidlvhal::StatusCode::NOT_AVAILABLE_SPEED_LOW);
}
+TEST_F(GRPCVehicleHardwareUnitTest, TestPollValue) {
+ int64_t testTimestamp = 12345;
+ int32_t testPropId = 54321;
+ int64_t startTimestamp = elapsedRealtimeNano();
+
+ // This will be converted to a unique_ptr in StartPropertyValuesStream. The ownership is passed
+ // there.
+ auto clientReader = new MockClientReader<proto::VehiclePropValues>();
+ EXPECT_CALL(*mGrpcStub, StartPropertyValuesStreamRaw(_, _)).WillOnce(Return(clientReader));
+ EXPECT_CALL(*clientReader, Read(_))
+ .WillOnce([testTimestamp, testPropId](proto::VehiclePropValues* values) {
+ values->Clear();
+ auto value = values->add_values();
+ value->set_timestamp(testTimestamp);
+ value->set_prop(testPropId);
+ return true;
+ })
+ .WillOnce(Return(false));
+ EXPECT_CALL(*clientReader, Finish()).WillOnce(Return(::grpc::Status::OK));
+
+ std::vector<aidlvhal::VehiclePropValue> propertyEvents;
+
+ mHardware->registerOnPropertyChangeEvent(
+ std::make_unique<GRPCVehicleHardware::PropertyChangeCallback>(
+ [&propertyEvents](const std::vector<aidlvhal::VehiclePropValue>& events) {
+ for (const auto& event : events) {
+ propertyEvents.push_back(event);
+ }
+ }));
+
+ pollValue();
+
+ ASSERT_THAT(propertyEvents, SizeIs(1));
+ EXPECT_EQ(propertyEvents[0].prop, testPropId);
+ EXPECT_GT(propertyEvents[0].timestamp, startTimestamp)
+ << "Timestamp must be updated to Android timestamp";
+ EXPECT_LT(propertyEvents[0].timestamp, elapsedRealtimeNano())
+ << "Timestamp must be updated to Android timestamp";
+}
+
+TEST_F(GRPCVehicleHardwareUnitTest, TestPollValueIgnoreOutdatedValue) {
+ int64_t testTimestamp1 = 12345;
+ int32_t value1 = 1324;
+ int64_t testTimestamp2 = 12340;
+ int32_t value2 = 1423;
+ int32_t testPropId = 54321;
+ int64_t startTimestamp = elapsedRealtimeNano();
+
+ // This will be converted to a unique_ptr in StartPropertyValuesStream. The ownership is passed
+ // there.
+ auto clientReader = new MockClientReader<proto::VehiclePropValues>();
+ EXPECT_CALL(*mGrpcStub, StartPropertyValuesStreamRaw(_, _)).WillOnce(Return(clientReader));
+ EXPECT_CALL(*clientReader, Read(_))
+ .WillOnce([testTimestamp1, value1, testPropId](proto::VehiclePropValues* values) {
+ values->Clear();
+ auto value = values->add_values();
+ value->set_timestamp(testTimestamp1);
+ value->set_prop(testPropId);
+ value->add_int32_values(value1);
+ return true;
+ })
+ .WillOnce([testTimestamp2, value2, testPropId](proto::VehiclePropValues* values) {
+ values->Clear();
+ // This event is outdated, must be ignored.
+ auto value = values->add_values();
+ value->set_timestamp(testTimestamp2);
+ value->set_prop(testPropId);
+ value->add_int32_values(value2);
+ return true;
+ })
+ .WillOnce(Return(false));
+ EXPECT_CALL(*clientReader, Finish()).WillOnce(Return(::grpc::Status::OK));
+
+ std::vector<aidlvhal::VehiclePropValue> propertyEvents;
+
+ mHardware->registerOnPropertyChangeEvent(
+ std::make_unique<GRPCVehicleHardware::PropertyChangeCallback>(
+ [&propertyEvents](const std::vector<aidlvhal::VehiclePropValue>& events) {
+ for (const auto& event : events) {
+ propertyEvents.push_back(event);
+ }
+ }));
+
+ pollValue();
+
+ ASSERT_THAT(propertyEvents, SizeIs(1)) << "Outdated event must be ignored";
+ EXPECT_EQ(propertyEvents[0].prop, testPropId);
+ EXPECT_GT(propertyEvents[0].timestamp, startTimestamp);
+ EXPECT_LT(propertyEvents[0].timestamp, elapsedRealtimeNano());
+ EXPECT_THAT(propertyEvents[0].value.int32Values, ElementsAre(value1));
+}
+
+TEST_F(GRPCVehicleHardwareUnitTest, TestValuePollingLoop) {
+ int64_t testTimestamp = 12345;
+ int32_t testPropId = 54321;
+ auto stub = std::make_unique<NiceMock<MockVehicleServerStub>>();
+
+ // This will be converted to a unique_ptr in StartPropertyValuesStream. The ownership is passed
+ // there.
+ auto clientReader = new MockClientReader<proto::VehiclePropValues>();
+ EXPECT_CALL(*stub, StartPropertyValuesStreamRaw(_, _)).WillOnce(Return(clientReader));
+ EXPECT_CALL(*clientReader, Read(_))
+ .WillRepeatedly([testTimestamp, testPropId](proto::VehiclePropValues* values) {
+ // Sleep for 10ms and always return the same property event.
+ std::this_thread::sleep_for(std::chrono::milliseconds(10));
+ values->Clear();
+ auto value = values->add_values();
+ value->set_timestamp(testTimestamp);
+ value->set_prop(testPropId);
+ return true;
+ });
+ EXPECT_CALL(*clientReader, Finish()).WillOnce(Return(::grpc::Status::OK));
+
+ startValuePollingLoop(std::move(stub));
+
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
+ // This must stop the loop and wait for the thread to finish.
+ mHardware.reset();
+}
+
+TEST_F(GRPCVehicleHardwareUnitTest, TestGetValues) {
+ int64_t testRequestId = 1234;
+ int32_t testPropId = 4321;
+ int32_t testValue = 123456;
+ proto::VehiclePropValueRequests gotRequests;
+ EXPECT_CALL(*mGrpcStub, GetValues(_, _, _))
+ .WillOnce([&gotRequests, testRequestId, testPropId, testValue](
+ ::grpc::ClientContext* context,
+ const proto::VehiclePropValueRequests& request,
+ proto::GetValueResults* response) {
+ gotRequests = request;
+ response->Clear();
+ auto* resultPtr = response->add_results();
+ resultPtr->set_request_id(testRequestId);
+ resultPtr->set_status(proto::StatusCode::OK);
+ auto* valuePtr = resultPtr->mutable_value();
+ valuePtr->set_prop(testPropId);
+ valuePtr->add_int32_values(testValue);
+ return ::grpc::Status::OK;
+ });
+
+ std::vector<aidlvhal::GetValueRequest> requests;
+ requests.push_back(aidlvhal::GetValueRequest{.requestId = testRequestId,
+ .prop = {
+ .prop = testPropId,
+ }});
+
+ std::vector<aidlvhal::GetValueResult> gotResults;
+
+ auto status = mHardware->getValues(
+ std::make_shared<GRPCVehicleHardware::GetValuesCallback>(
+ [&gotResults](std::vector<aidlvhal::GetValueResult> results) {
+ for (const auto& result : results) {
+ gotResults.push_back(result);
+ }
+ }),
+ requests);
+
+ ASSERT_EQ(status, aidlvhal::StatusCode::OK);
+ ASSERT_THAT(gotRequests.requests(), SizeIs(1));
+ EXPECT_THAT(gotRequests.requests(0).request_id(), testRequestId);
+ EXPECT_THAT(gotRequests.requests(0).value().prop(), testPropId);
+
+ ASSERT_THAT(gotResults, SizeIs(1));
+ EXPECT_EQ(gotResults[0].requestId, testRequestId);
+ EXPECT_EQ(gotResults[0].status, aidlvhal::StatusCode::OK);
+ EXPECT_EQ(gotResults[0].prop->prop, testPropId);
+ EXPECT_THAT(gotResults[0].prop->value.int32Values, ElementsAre(testValue));
+}
+
+void GRPCVehicleHardwareUnitTest::generatePropertyUpdateEvent(int32_t propId, int64_t timestamp) {
+ // This will be converted to a unique_ptr in StartPropertyValuesStream. The ownership is passed
+ // there.
+ auto clientReader = new MockClientReader<proto::VehiclePropValues>();
+ EXPECT_CALL(*mGrpcStub, StartPropertyValuesStreamRaw(_, _)).WillOnce(Return(clientReader));
+ EXPECT_CALL(*clientReader, Read(_))
+ .WillOnce([timestamp, propId](proto::VehiclePropValues* values) {
+ values->Clear();
+ auto value = values->add_values();
+ value->set_timestamp(timestamp);
+ value->set_prop(propId);
+ return true;
+ })
+ .WillOnce(Return(false));
+ EXPECT_CALL(*clientReader, Finish()).WillOnce(Return(::grpc::Status::OK));
+
+ pollValue();
+}
+
+TEST_F(GRPCVehicleHardwareUnitTest, TestGetValuesOutdatedRetry) {
+ int64_t startTimestamp = elapsedRealtimeNano();
+ int64_t testRequestId = 1234;
+ int32_t testPropId = 4321;
+ int32_t testValue1 = 123456;
+ int32_t testValue2 = 654321;
+ int32_t testTimestamp1 = 1000;
+ int32_t testTimestamp2 = 2000;
+
+ // A property update event for testTimestamp2 happens before getValues returns.
+ generatePropertyUpdateEvent(testPropId, testTimestamp2);
+
+ // GetValues first returns an outdated result, then an up-to-date result.
+ EXPECT_CALL(*mGrpcStub, GetValues(_, _, _))
+ .WillOnce([testRequestId, testPropId, testValue1, testTimestamp1](
+ ::grpc::ClientContext* context,
+ const proto::VehiclePropValueRequests& request,
+ proto::GetValueResults* response) {
+ response->Clear();
+ auto* resultPtr = response->add_results();
+ resultPtr->set_request_id(testRequestId);
+ resultPtr->set_status(proto::StatusCode::OK);
+ auto* valuePtr = resultPtr->mutable_value();
+ valuePtr->set_prop(testPropId);
+ valuePtr->set_timestamp(testTimestamp1);
+ valuePtr->add_int32_values(testValue1);
+ return ::grpc::Status::OK;
+ })
+ .WillOnce([testRequestId, testPropId, testValue2, testTimestamp2](
+ ::grpc::ClientContext* context,
+ const proto::VehiclePropValueRequests& request,
+ proto::GetValueResults* response) {
+ response->Clear();
+ auto* resultPtr = response->add_results();
+ resultPtr->set_request_id(testRequestId);
+ resultPtr->set_status(proto::StatusCode::OK);
+ auto* valuePtr = resultPtr->mutable_value();
+ valuePtr->set_prop(testPropId);
+ valuePtr->set_timestamp(testTimestamp2);
+ valuePtr->add_int32_values(testValue2);
+ return ::grpc::Status::OK;
+ });
+
+ std::vector<aidlvhal::GetValueRequest> requests;
+ requests.push_back(aidlvhal::GetValueRequest{.requestId = testRequestId,
+ .prop = {
+ .prop = testPropId,
+ }});
+
+ std::vector<aidlvhal::GetValueResult> gotResults;
+
+ auto status = mHardware->getValues(
+ std::make_shared<GRPCVehicleHardware::GetValuesCallback>(
+ [&gotResults](std::vector<aidlvhal::GetValueResult> results) {
+ for (const auto& result : results) {
+ gotResults.push_back(result);
+ }
+ }),
+ requests);
+
+ ASSERT_EQ(status, aidlvhal::StatusCode::OK);
+ ASSERT_THAT(gotResults, SizeIs(1));
+ EXPECT_EQ(gotResults[0].requestId, testRequestId);
+ EXPECT_EQ(gotResults[0].status, aidlvhal::StatusCode::OK);
+ EXPECT_EQ(gotResults[0].prop->prop, testPropId);
+ EXPECT_THAT(gotResults[0].prop->value.int32Values, ElementsAre(testValue2));
+ EXPECT_GT(gotResults[0].prop->timestamp, startTimestamp);
+ EXPECT_LT(gotResults[0].prop->timestamp, elapsedRealtimeNano());
+}
+
} // namespace android::hardware::automotive::vehicle::virtualization
diff --git a/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h b/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h
index f48bb2a..90a7c46 100644
--- a/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h
+++ b/automotive/vehicle/aidl/impl/utils/common/include/VehicleUtils.h
@@ -337,6 +337,9 @@
// This is for debug purpose only.
android::base::Result<int32_t> stringToPropId(const std::string& propName);
+// This is for debug purpose only. Converts an area's name to its enum definition.
+android::base::Result<int32_t> stringToArea(const std::string& areaName, int32_t propId);
+
template <typename T>
void roundToNearestResolution(std::vector<T>& arrayToSanitize, float resolution) {
if (resolution == 0) {
diff --git a/automotive/vehicle/aidl/impl/utils/common/src/VehiclePropertyStore.cpp b/automotive/vehicle/aidl/impl/utils/common/src/VehiclePropertyStore.cpp
index a7caeb1..c3a46c6 100644
--- a/automotive/vehicle/aidl/impl/utils/common/src/VehiclePropertyStore.cpp
+++ b/automotive/vehicle/aidl/impl/utils/common/src/VehiclePropertyStore.cpp
@@ -289,7 +289,7 @@
for (auto const& [_, record] : mRecordsByPropId) {
for (auto const& [_, value] : record.values) {
- allValues.push_back(std::move(mValuePool->obtain(*value)));
+ allValues.push_back(mValuePool->obtain(*value));
}
}
@@ -308,7 +308,7 @@
}
for (auto const& [_, value] : record->values) {
- values.push_back(std::move(mValuePool->obtain(*value)));
+ values.push_back(mValuePool->obtain(*value));
}
return values;
}
diff --git a/automotive/vehicle/aidl/impl/utils/common/src/VehicleUtils.cpp b/automotive/vehicle/aidl/impl/utils/common/src/VehicleUtils.cpp
index 4d06e4e..7814c99 100644
--- a/automotive/vehicle/aidl/impl/utils/common/src/VehicleUtils.cpp
+++ b/automotive/vehicle/aidl/impl/utils/common/src/VehicleUtils.cpp
@@ -25,7 +25,13 @@
using ::aidl::android::hardware::automotive::vehicle::StatusCode;
using ::aidl::android::hardware::automotive::vehicle::toString;
+using ::aidl::android::hardware::automotive::vehicle::VehicleArea;
using ::aidl::android::hardware::automotive::vehicle::VehicleAreaConfig;
+using ::aidl::android::hardware::automotive::vehicle::VehicleAreaDoor;
+using ::aidl::android::hardware::automotive::vehicle::VehicleAreaMirror;
+using ::aidl::android::hardware::automotive::vehicle::VehicleAreaSeat;
+using ::aidl::android::hardware::automotive::vehicle::VehicleAreaWheel;
+using ::aidl::android::hardware::automotive::vehicle::VehicleAreaWindow;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropConfig;
using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyGroup;
@@ -44,7 +50,7 @@
return instance;
}
- Result<int32_t> getPropertyId(const std::string& name) {
+ Result<int32_t> getPropertyId(const std::string& name) const {
auto it = mPropertyIdByName.find(name);
if (it == mPropertyIdByName.end()) {
return Error();
@@ -66,6 +72,52 @@
}
};
+class AreaByNameSingleton {
+ public:
+ static AreaByNameSingleton& getInstance() {
+ static AreaByNameSingleton instance;
+ return instance;
+ }
+
+ Result<int32_t> getArea(const std::string& name, int32_t propId) const {
+ VehicleArea areaType = getPropArea(propId);
+
+ auto mapIt = mAreaByNameByAreaType.find(areaType);
+ if (mapIt == mAreaByNameByAreaType.end()) {
+ return Error() << "Invalid area type for property ID: " << propIdToString(propId);
+ }
+
+ const auto& areaByName = mapIt->second;
+ auto it = areaByName.find(name);
+ if (it == areaByName.end()) {
+ return Error() << "Invalid area name for property " << propIdToString(propId) << ": "
+ << name;
+ }
+ return it->second;
+ }
+
+ AreaByNameSingleton(AreaByNameSingleton const&) = delete;
+ void operator=(AreaByNameSingleton const&) = delete;
+
+ private:
+ std::unordered_map<VehicleArea, std::unordered_map<std::string, int32_t>> mAreaByNameByAreaType;
+
+ AreaByNameSingleton() {
+ populateMap(VehicleArea::WINDOW, ndk::internal::enum_values<VehicleAreaWindow>);
+ populateMap(VehicleArea::MIRROR, ndk::internal::enum_values<VehicleAreaMirror>);
+ populateMap(VehicleArea::SEAT, ndk::internal::enum_values<VehicleAreaSeat>);
+ populateMap(VehicleArea::DOOR, ndk::internal::enum_values<VehicleAreaDoor>);
+ populateMap(VehicleArea::WHEEL, ndk::internal::enum_values<VehicleAreaWheel>);
+ }
+
+ template <class T, std::size_t N>
+ void populateMap(VehicleArea areaType, std::array<T, N> values) {
+ for (unsigned int i = 0; i < values.size(); i++) {
+ mAreaByNameByAreaType[areaType].emplace(toString(values[i]), toInt(values[i]));
+ }
+ }
+};
+
} // namespace
Result<void> checkPropValue(const VehiclePropValue& value, const VehiclePropConfig* config) {
@@ -254,6 +306,10 @@
return PropertyIdByNameSingleton::getInstance().getPropertyId(propName);
}
+Result<int32_t> stringToArea(const std::string& areaName, int32_t propId) {
+ return AreaByNameSingleton::getInstance().getArea(areaName, propId);
+}
+
} // namespace vehicle
} // namespace automotive
} // namespace hardware
diff --git a/automotive/vehicle/aidl/impl/utils/common/test/VehiclePropertyStoreTest.cpp b/automotive/vehicle/aidl/impl/utils/common/test/VehiclePropertyStoreTest.cpp
index 6646b7e..22f5c73 100644
--- a/automotive/vehicle/aidl/impl/utils/common/test/VehiclePropertyStoreTest.cpp
+++ b/automotive/vehicle/aidl/impl/utils/common/test/VehiclePropertyStoreTest.cpp
@@ -328,7 +328,7 @@
TEST_F(VehiclePropertyStoreTest, testRemoveValuesForProperty) {
auto values = getTestPropValues();
for (const auto& value : values) {
- ASSERT_RESULT_OK(mStore->writeValue(std::move(mValuePool->obtain(value))));
+ ASSERT_RESULT_OK(mStore->writeValue(mValuePool->obtain(value)));
}
mStore->removeValuesForProperty(toInt(VehicleProperty::INFO_FUEL_CAPACITY));
diff --git a/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp b/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
index 608a328..fb3c8cd 100644
--- a/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
+++ b/automotive/vehicle/vts/src/VtsHalAutomotiveVehicle_TargetTest.cpp
@@ -95,7 +95,7 @@
std::lock_guard<std::mutex> lockGuard(mLock);
for (auto& value : values) {
int32_t propId = value->getPropId();
- mEvents[propId].push_back(std::move(value->clone()));
+ mEvents[propId].push_back(value->clone());
}
}
mEventCond.notify_one();
@@ -122,7 +122,7 @@
return events;
}
for (const auto& eventPtr : mEvents[propId]) {
- events.push_back(std::move(eventPtr->clone()));
+ events.push_back(eventPtr->clone());
}
return events;
}
diff --git a/bluetooth/a2dp/1.0/Android.bp b/bluetooth/a2dp/1.0/Android.bp
deleted file mode 100644
index 6ffbefa..0000000
--- a/bluetooth/a2dp/1.0/Android.bp
+++ /dev/null
@@ -1,28 +0,0 @@
-// This file is autogenerated by hidl-gen -Landroidbp.
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-hidl_interface {
- name: "android.hardware.bluetooth.a2dp@1.0",
- root: "android.hardware",
- srcs: [
- "types.hal",
- "IBluetoothAudioHost.hal",
- "IBluetoothAudioOffload.hal",
- ],
- interfaces: [
- "android.hidl.base@1.0",
- ],
- gen_java: false,
- apex_available: [
- "//apex_available:platform",
- "com.android.btservices",
- ],
-}
diff --git a/bluetooth/a2dp/1.0/IBluetoothAudioHost.hal b/bluetooth/a2dp/1.0/IBluetoothAudioHost.hal
deleted file mode 100644
index 666419d..0000000
--- a/bluetooth/a2dp/1.0/IBluetoothAudioHost.hal
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.
- */
-
-package android.hardware.bluetooth.a2dp@1.0;
-
-/**
- * HAL interface for Bluetooth A2DP Offload functionality where
- * the encoding of the A2DP data packets is offloaded to platform
- * specific encoders. The A2DP control path is maintained in the
- * Bluetooth stack.
- *
- * This interface is from HAL server to HAL client.
- *
- * The HAL server must call into the IBluetoothAudioHost to initiate
- * the start, suspend and stop of the streaming operation. These
- * calls return immediately and the results, if any, are send over
- * the IBluetoothAudioOffload interface.
- */
-
-interface IBluetoothAudioHost {
- /**
- * Invoked when the start stream is requested from HAL server
- * to HAL client. This indicates that the HAL server
- * has initialized the platform for streaming use case, and the
- * HAL client can proceed with the streaming procedure. The
- * result of the operation must be provided by the HAL
- * client using the IBluetoothAudioOffload interface.
- */
- oneway startStream();
-
- /**
- * Invoked when the suspend stream is requested from HAL server
- * to HAL client. This indicates that the HAL server
- * wants to suspend the streaming procedure. The result of the
- * operation must be provided by the HAL client using the
- * IBluetoothAudioOffload interface.
- */
- oneway suspendStream();
-
- /**
- * Invoked when the stop stream is requested from HAL server
- * to HAL client. This indicates that the HAL server wants to
- * stop and reset the streaming procedure. There is no result
- * provided by the HAL client for this call.
- */
- oneway stopStream();
-
-};
diff --git a/bluetooth/a2dp/1.0/IBluetoothAudioOffload.hal b/bluetooth/a2dp/1.0/IBluetoothAudioOffload.hal
deleted file mode 100644
index 52a580f..0000000
--- a/bluetooth/a2dp/1.0/IBluetoothAudioOffload.hal
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.
- */
-
-package android.hardware.bluetooth.a2dp@1.0;
-
-import IBluetoothAudioHost;
-
-/**
- * HAL interface for Bluetooth A2DP Offload functionality where
- * the encoding of the A2DP data packets is offloaded to platform
- * specific encoders. The A2DP control path is maintained in the
- * Bluetooth stack.
- *
- * This interface is from HAL client to HAL server.
- *
- * The HAL client must provide the handle of IBluetoothAudioHost as well
- * as codec configuration to the HAL server, when its connected to an
- * active A2DP Sink device. HAL Server, based on the feedback from the Audio
- * framework must call into the commands provided by the IBluetoothAudioHost.
- * HAL client must call into IBluetoothAudioOffload to provide the status of
- * these commands. Once the device becomes inactive, the HAL client must
- * call the endSession to terminate the session with the HAL server.
- */
-interface IBluetoothAudioOffload {
-
- /**
- * Indicates that the HAL client is connected to an A2DP Sink device
- * and is ready to stream audio. This function is also used to register
- * the BluetoothAudioHost interface and the provide the current negotiated
- * codec.
- *
- * |endSession| must be called to unregister the interface.
- *
- * @param hostIf interface used to request stream control
- * @param codecConfig Codec configuration as negotiated with the A2DP Sink
- * device
- * @return status one of the following
- * SUCCESS if HAL server successfully initializes the platform with the
- * given codec configuration
- * UNSUPPORTED_CODEC_CONFIGURATION if HAL server cannot initialize the
- * platform with the given codec configuration
- * FAILURE if HAL server cannot initialize the platform for any other
- * reason
- */
- startSession(IBluetoothAudioHost hostIf, CodecConfiguration codecConfig) generates (Status status);
-
- /**
- * Updates status for start stream request. The HAL client may need
- * to communicate to Bluetooth Controller and remote Sink device, in which
- * case it must update with PENDING status. Once the operation is
- * completed, it must return with either SUCCESS or FAILURE.
- *
- * @param status SUCCESS, FAILURE or PENDING
- */
- oneway streamStarted(Status status);
-
- /**
- * Updates status for suspend stream request. The HAL client may need
- * to communicate to Bluetooth Controller and remote device, in which case
- * it must update with PENDING status. Once the operation is completed, it
- * must return with either SUCCESS or FAILURE.
- *
- * @param status SUCCESS, FAILURE or PENDING
- */
- oneway streamSuspended(Status status);
-
- /**
- * Ends the current A2DP offload session and unregisters the
- * BluetoothAudioHost interface.
- */
- oneway endSession();
-};
diff --git a/bluetooth/a2dp/1.0/default/Android.bp b/bluetooth/a2dp/1.0/default/Android.bp
deleted file mode 100644
index f368dd4..0000000
--- a/bluetooth/a2dp/1.0/default/Android.bp
+++ /dev/null
@@ -1,22 +0,0 @@
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_library_shared {
- name: "android.hardware.bluetooth.a2dp@1.0-impl.mock",
- relative_install_path: "hw",
- vendor: true,
- srcs: [
- "BluetoothAudioOffload.cpp",
- ],
- shared_libs: [
- "libhidlbase",
- "libutils",
- "android.hardware.bluetooth.a2dp@1.0",
- ],
-}
diff --git a/bluetooth/a2dp/1.0/default/BluetoothAudioOffload.cpp b/bluetooth/a2dp/1.0/default/BluetoothAudioOffload.cpp
deleted file mode 100644
index 9abb88d..0000000
--- a/bluetooth/a2dp/1.0/default/BluetoothAudioOffload.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.
- */
-
-#include "BluetoothAudioOffload.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace a2dp {
-namespace V1_0 {
-namespace implementation {
-
-IBluetoothAudioOffload* HIDL_FETCH_IBluetoothAudioOffload(
- const char* /* name */) {
- return new BluetoothAudioOffload();
-}
-
-// Methods from
-// ::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioOffload follow.
-Return<::android::hardware::bluetooth::a2dp::V1_0::Status>
-BluetoothAudioOffload::startSession(
- const sp<::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioHost>&
- hostIf __unused,
- const ::android::hardware::bluetooth::a2dp::V1_0::CodecConfiguration&
- codecConfig __unused) {
- /**
- * Initialize the audio platform if codecConfiguration is supported.
- * Save the the IBluetoothAudioHost interface, so that it can be used
- * later to send stream control commands to the HAL client, based on
- * interaction with Audio framework.
- */
- return ::android::hardware::bluetooth::a2dp::V1_0::Status::FAILURE;
-}
-
-Return<void> BluetoothAudioOffload::streamStarted(
- ::android::hardware::bluetooth::a2dp::V1_0::Status status __unused) {
- /**
- * Streaming on control path has started,
- * HAL server should start the streaming on data path.
- */
- return Void();
-}
-
-Return<void> BluetoothAudioOffload::streamSuspended(
- ::android::hardware::bluetooth::a2dp::V1_0::Status status __unused) {
- /**
- * Streaming on control path has suspend,
- * HAL server should suspend the streaming on data path.
- */
- return Void();
-}
-
-Return<void> BluetoothAudioOffload::endSession() {
- /**
- * Cleanup the audio platform as remote A2DP Sink device is no
- * longer active
- */
- return Void();
-}
-
-} // namespace implementation
-} // namespace V1_0
-} // namespace a2dp
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/a2dp/1.0/default/BluetoothAudioOffload.h b/bluetooth/a2dp/1.0/default/BluetoothAudioOffload.h
deleted file mode 100644
index 16a83c2..0000000
--- a/bluetooth/a2dp/1.0/default/BluetoothAudioOffload.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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_HARDWARE_BLUETOOTH_A2DP_V1_0_BLUETOOTHAUDIOOFFLOAD_H
-#define ANDROID_HARDWARE_BLUETOOTH_A2DP_V1_0_BLUETOOTHAUDIOOFFLOAD_H
-
-#include <android/hardware/bluetooth/a2dp/1.0/IBluetoothAudioOffload.h>
-#include <hidl/MQDescriptor.h>
-#include <hidl/Status.h>
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace a2dp {
-namespace V1_0 {
-namespace implementation {
-
-using ::android::sp;
-using ::android::hardware::hidl_array;
-using ::android::hardware::hidl_memory;
-using ::android::hardware::hidl_string;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-
-struct BluetoothAudioOffload : public IBluetoothAudioOffload {
- BluetoothAudioOffload() {}
- // Methods from
- // ::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioOffload follow.
- Return<::android::hardware::bluetooth::a2dp::V1_0::Status> startSession(
- const sp<::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioHost>&
- hostIf,
- const ::android::hardware::bluetooth::a2dp::V1_0::CodecConfiguration&
- codecConfig) override;
- Return<void> streamStarted(
- ::android::hardware::bluetooth::a2dp::V1_0::Status status) override;
- Return<void> streamSuspended(
- ::android::hardware::bluetooth::a2dp::V1_0::Status status) override;
- Return<void> endSession() override;
-};
-
-extern "C" IBluetoothAudioOffload* HIDL_FETCH_IBluetoothAudioOffload(
- const char* name);
-
-} // namespace implementation
-} // namespace V1_0
-} // namespace a2dp
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
-
-#endif // ANDROID_HARDWARE_BLUETOOTH_A2DP_V1_0_BLUETOOTHAUDIOOFFLOAD_H
diff --git a/bluetooth/a2dp/1.0/types.hal b/bluetooth/a2dp/1.0/types.hal
deleted file mode 100644
index 6a430f0..0000000
--- a/bluetooth/a2dp/1.0/types.hal
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.
- */
-
-package android.hardware.bluetooth.a2dp@1.0;
-
-enum Status : uint8_t {
- SUCCESS,
- FAILURE,
- /** codec configuration not supported by the audio platform */
- UNSUPPORTED_CODEC_CONFIGURATION ,
- /** operation is pending */
- PENDING,
-};
-
-enum CodecType : uint32_t {
- UNKNOWN = 0x00,
- SBC = 0x01,
- AAC = 0x02,
- APTX = 0x04,
- APTX_HD = 0x08,
- LDAC = 0x10,
-};
-enum SampleRate : uint32_t {
- RATE_UNKNOWN = 0x00,
- RATE_44100 = 0x01,
- RATE_48000 = 0x02,
- RATE_88200 = 0x04,
- RATE_96000 = 0x08,
- RATE_176400 = 0x10,
- RATE_192000 = 0x20,
-};
-enum BitsPerSample : uint8_t {
- BITS_UNKNOWN = 0x00,
- BITS_16 = 0x01,
- BITS_24 = 0x02,
- BITS_32 = 0x04,
-};
-enum ChannelMode : uint8_t {
- UNKNOWN = 0x00,
- MONO = 0x01,
- STEREO = 0x02,
-};
-struct CodecConfiguration {
- /** Bluetooth A2DP codec */
- CodecType codecType;
- /** Sampling rate for encoder */
- SampleRate sampleRate;
- /** Bits per sample for encoder */
- BitsPerSample bitsPerSample;
- /** Channel mode for encoder */
- ChannelMode channelMode;
- /**
- * The encoded audio bitrate in bits / second.
- * 0x00000000 - The audio bitrate is not specified / unused
- * 0x00000001 - 0x00FFFFFF - Encoded audio bitrate in bits/second
- * 0x01000000 - 0xFFFFFFFF - Reserved
- */
- uint32_t encodedAudioBitrate;
- /** Peer MTU (in octets) */
- uint16_t peerMtu;
- union CodecSpecific {
- /**
- * SBC Codec specific information
- * Refer to SBC Codec specific information elements in A2DP v1.3
- * Profile Specification.
- */
- struct SbcData {
- /** Block length: 4 bits | Subbands: 2 bits | Allocation Method: 2 bits */
- uint8_t codecParameters;
- /** Minimum bitpool value */
- uint8_t minBitpool;
- /** Maximum bitpool value */
- uint8_t maxBitpool;
- } sbcData;
- struct LdacData {
- /**
- * LDAC bitrate index value:
- * 0x00 - High
- * 0x01 - Mid
- * 0x02 - Low
- * 0x7F - ABR (Adaptive Bit Rate)
- */
- uint8_t bitrateIndex;
- } ldacData;
- } codecSpecific;
-};
diff --git a/bluetooth/a2dp/1.0/vts/OWNERS b/bluetooth/a2dp/1.0/vts/OWNERS
deleted file mode 100644
index d3aab51..0000000
--- a/bluetooth/a2dp/1.0/vts/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# Bug component: 27441
-include platform/packages/modules/Bluetooth:/OWNERS
-
-cheneyni@google.com
diff --git a/bluetooth/a2dp/1.0/vts/functional/Android.bp b/bluetooth/a2dp/1.0/vts/functional/Android.bp
deleted file mode 100644
index 0d393bc..0000000
--- a/bluetooth/a2dp/1.0/vts/functional/Android.bp
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// 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.
-//
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_test {
- name: "VtsHalBluetoothA2dpV1_0TargetTest",
- defaults: ["VtsHalTargetTestDefaults"],
- srcs: ["VtsHalBluetoothA2dpV1_0TargetTest.cpp"],
- static_libs: [
- "android.hardware.bluetooth@1.0",
- "android.hardware.bluetooth.a2dp@1.0",
- "libbluetooth-types",
- ],
- test_suites: ["general-tests", "vts"],
-}
diff --git a/bluetooth/a2dp/1.0/vts/functional/VtsHalBluetoothA2dpV1_0TargetTest.cpp b/bluetooth/a2dp/1.0/vts/functional/VtsHalBluetoothA2dpV1_0TargetTest.cpp
deleted file mode 100644
index f7fdf31..0000000
--- a/bluetooth/a2dp/1.0/vts/functional/VtsHalBluetoothA2dpV1_0TargetTest.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.
- */
-
-#define LOG_TAG "bluetooth_a2dp_hidl_hal_test"
-
-#include <android-base/logging.h>
-#include <android/hardware/bluetooth/a2dp/1.0/IBluetoothAudioHost.h>
-#include <android/hardware/bluetooth/a2dp/1.0/IBluetoothAudioOffload.h>
-#include <gtest/gtest.h>
-#include <hardware/bluetooth.h>
-#include <hidl/GtestPrinter.h>
-#include <hidl/MQDescriptor.h>
-#include <hidl/ServiceManagement.h>
-#include <utils/Log.h>
-
-#include <VtsHalHidlTargetCallbackBase.h>
-
-using ::android::sp;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::bluetooth::a2dp::V1_0::BitsPerSample;
-using ::android::hardware::bluetooth::a2dp::V1_0::ChannelMode;
-using ::android::hardware::bluetooth::a2dp::V1_0::CodecConfiguration;
-using ::android::hardware::bluetooth::a2dp::V1_0::CodecType;
-using ::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioHost;
-using ::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioOffload;
-using ::android::hardware::bluetooth::a2dp::V1_0::SampleRate;
-using ::android::hardware::bluetooth::a2dp::V1_0::Status;
-
-// The main test class for Bluetooth A2DP HIDL HAL.
-class BluetoothA2dpHidlTest : public ::testing::TestWithParam<std::string> {
- public:
- virtual void SetUp() override {
- // currently test passthrough mode only
- audio_offload = IBluetoothAudioOffload::getService(GetParam());
- ASSERT_NE(audio_offload, nullptr);
-
- audio_host = new BluetoothAudioHost(*this);
- ASSERT_NE(audio_host, nullptr);
-
- codec.codecType = CodecType::AAC;
- codec.sampleRate = SampleRate::RATE_44100;
- codec.bitsPerSample = BitsPerSample::BITS_16;
- codec.channelMode = ChannelMode::STEREO;
- codec.encodedAudioBitrate = 320000;
- codec.peerMtu = 1000;
- }
-
- virtual void TearDown() override {}
-
- // A simple test implementation of IBluetoothAudioHost.
- class BluetoothAudioHost
- : public ::testing::VtsHalHidlTargetCallbackBase<BluetoothA2dpHidlTest>,
- public IBluetoothAudioHost {
- BluetoothA2dpHidlTest& parent_;
-
- public:
- BluetoothAudioHost(BluetoothA2dpHidlTest& parent) : parent_(parent){};
- virtual ~BluetoothAudioHost() = default;
-
- Return<void> startStream() override {
- parent_.audio_offload->streamStarted(Status::SUCCESS);
- return Void();
- };
-
- Return<void> suspendStream() override {
- parent_.audio_offload->streamSuspended(Status::SUCCESS);
- return Void();
- };
-
- Return<void> stopStream() override { return Void(); };
- };
-
- // audio_host is for the Audio HAL to send stream start/suspend/stop commands
- // to Bluetooth
- sp<IBluetoothAudioHost> audio_host;
- // audio_offload is for the Bluetooth HAL to report session started/ended and
- // handled audio stream started/suspended
- sp<IBluetoothAudioOffload> audio_offload;
- // codec is the currently used codec
- CodecConfiguration codec;
-};
-
-// Empty test: Initialize()/Close() are called in SetUp()/TearDown().
-TEST_P(BluetoothA2dpHidlTest, InitializeAndClose) {}
-
-// Test start and end session
-TEST_P(BluetoothA2dpHidlTest, StartAndEndSession) {
- EXPECT_EQ(Status::SUCCESS, audio_offload->startSession(audio_host, codec));
- audio_offload->endSession();
-}
-
-INSTANTIATE_TEST_SUITE_P(
- PerInstance, BluetoothA2dpHidlTest,
- testing::ValuesIn(android::hardware::getAllHalInstanceNames(
- IBluetoothAudioOffload::descriptor)),
- android::hardware::PrintInstanceNameToString);
-
-GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BluetoothA2dpHidlTest);
diff --git a/bluetooth/aidl/vts/VtsHalBluetoothTargetTest.cpp b/bluetooth/aidl/vts/VtsHalBluetoothTargetTest.cpp
index aaf436f..dcb5fac 100644
--- a/bluetooth/aidl/vts/VtsHalBluetoothTargetTest.cpp
+++ b/bluetooth/aidl/vts/VtsHalBluetoothTargetTest.cpp
@@ -27,7 +27,6 @@
#include <android/binder_process.h>
#include <binder/IServiceManager.h>
-#include <atomic>
#include <chrono>
#include <condition_variable>
#include <future>
@@ -68,8 +67,8 @@
using ::bluetooth::hci::ReadLocalVersionInformationBuilder;
using ::bluetooth::hci::ReadLocalVersionInformationCompleteView;
-static constexpr uint8_t kMinLeAdvSetForBt5 = 16;
-static constexpr uint8_t kMinLeAdvSetForBt5FoTv = 10;
+static constexpr uint8_t kMinLeAdvSetForBt5 = 10;
+static constexpr uint8_t kMinLeAdvSetForBt5ForTv = 10;
static constexpr uint8_t kMinLeResolvingListForBt5 = 8;
static constexpr size_t kNumHciCommandsBandwidth = 100;
@@ -1036,7 +1035,7 @@
auto num_adv_set = num_adv_set_view.GetNumberSupportedAdvertisingSets();
if (isTv() && get_vsr_api_level() == __ANDROID_API_U__) {
- ASSERT_GE(num_adv_set, kMinLeAdvSetForBt5FoTv);
+ ASSERT_GE(num_adv_set, kMinLeAdvSetForBt5ForTv);
} else {
ASSERT_GE(num_adv_set, kMinLeAdvSetForBt5);
}
diff --git a/bluetooth/audio/aidl/Android.bp b/bluetooth/audio/aidl/Android.bp
index f273c7a..ae55fa9 100644
--- a/bluetooth/audio/aidl/Android.bp
+++ b/bluetooth/audio/aidl/Android.bp
@@ -85,12 +85,12 @@
},
],
- frozen: true,
+ frozen: false,
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_bluetooth_audio = "android.hardware.bluetooth.audio-V4"
+latest_android_hardware_bluetooth_audio = "android.hardware.bluetooth.audio-V5"
cc_defaults {
name: "latest_android_hardware_bluetooth_audio_ndk_shared",
diff --git a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp
index 6783c0f..61c29d3 100644
--- a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp
+++ b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp
@@ -121,6 +121,40 @@
return (sessionType == session_type_);
}
+std::string getSettingOutputString(
+ IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting) {
+ std::stringstream ss;
+ std::string name = "";
+ if (!setting.sinkAseConfiguration.has_value() &&
+ !setting.sourceAseConfiguration.has_value())
+ return "";
+ std::vector<
+ std::optional<LeAudioAseConfigurationSetting::AseDirectionConfiguration>>*
+ directionAseConfiguration;
+ if (setting.sinkAseConfiguration.has_value() &&
+ !setting.sinkAseConfiguration.value().empty())
+ directionAseConfiguration = &setting.sinkAseConfiguration.value();
+ else
+ directionAseConfiguration = &setting.sourceAseConfiguration.value();
+ for (auto& aseConfiguration : *directionAseConfiguration) {
+ if (aseConfiguration.has_value() &&
+ aseConfiguration.value().aseConfiguration.metadata.has_value()) {
+ for (auto& meta :
+ aseConfiguration.value().aseConfiguration.metadata.value()) {
+ if (meta.has_value() &&
+ meta.value().getTag() == MetadataLtv::vendorSpecific) {
+ auto k = meta.value().get<MetadataLtv::vendorSpecific>().opaqueValue;
+ name = std::string(k.begin(), k.end());
+ break;
+ }
+ }
+ }
+ }
+
+ ss << "setting name: " << name << ", setting: " << setting.toString();
+ return ss.str();
+}
+
ndk::ScopedAStatus LeAudioOffloadAudioProvider::startSession(
const std::shared_ptr<IBluetoothAudioPort>& host_if,
const AudioConfiguration& audio_config,
@@ -218,15 +252,24 @@
return false;
}
+int getCountFromBitmask(int bitmask) {
+ return std::bitset<32>(bitmask).count();
+}
+
bool LeAudioOffloadAudioProvider::isMatchedAudioChannel(
- CodecSpecificConfigurationLtv::AudioChannelAllocation&
- /*cfg_channel*/,
+ CodecSpecificConfigurationLtv::AudioChannelAllocation& cfg_channel,
CodecSpecificCapabilitiesLtv::SupportedAudioChannelCounts&
- /*capability_channel*/) {
- // Simply ignore.
- // Later can use additional capabilities to match requirement.
- bool isMatched = true;
- return isMatched;
+ capability_channel) {
+ int count = getCountFromBitmask(cfg_channel.bitmask);
+ if (count == 1 &&
+ !(capability_channel.bitmask &
+ CodecSpecificCapabilitiesLtv::SupportedAudioChannelCounts::ONE))
+ return false;
+ if (count == 2 &&
+ !(capability_channel.bitmask &
+ CodecSpecificCapabilitiesLtv::SupportedAudioChannelCounts::TWO))
+ return false;
+ return true;
}
bool LeAudioOffloadAudioProvider::isMatchedCodecFramesPerSDU(
@@ -322,12 +365,6 @@
return true;
}
-bool isMonoConfig(
- CodecSpecificConfigurationLtv::AudioChannelAllocation allocation) {
- auto channel_count = std::bitset<32>(allocation.bitmask);
- return (channel_count.count() <= 1);
-}
-
bool LeAudioOffloadAudioProvider::filterMatchedAseConfiguration(
LeAudioAseConfiguration& setting_cfg,
const LeAudioAseConfiguration& requirement_cfg) {
@@ -337,9 +374,6 @@
if (!setting_cfg.codecId.has_value()) return false;
if (!isMatchedValidCodec(setting_cfg.codecId.value(),
requirement_cfg.codecId.value())) {
- LOG(WARNING) << __func__ << ": Doesn't match valid codec, cfg = "
- << setting_cfg.codecId.value().toString()
- << ", req = " << requirement_cfg.codecId.value().toString();
return false;
}
}
@@ -347,9 +381,6 @@
if (requirement_cfg.targetLatency !=
LeAudioAseConfiguration::TargetLatency::UNDEFINED &&
setting_cfg.targetLatency != requirement_cfg.targetLatency) {
- LOG(WARNING) << __func__ << ": Doesn't match target latency, cfg = "
- << int(setting_cfg.targetLatency)
- << ", req = " << int(requirement_cfg.targetLatency);
return false;
}
// Ignore PHY requirement
@@ -365,8 +396,6 @@
auto cfg = cfg_tag_map.find(requirement_cfg.getTag());
// Config not found for this requirement, cannot match
if (cfg == cfg_tag_map.end()) {
- LOG(WARNING) << __func__ << ": Config not found for the requirement "
- << requirement_cfg.toString();
return false;
}
@@ -377,10 +406,6 @@
continue;
if (cfg->second != requirement_cfg) {
- LOG(WARNING) << __func__
- << ": Config doesn't match the requirement, cfg = "
- << cfg->second.toString()
- << ", req = " << requirement_cfg.toString();
return false;
}
}
@@ -437,10 +462,6 @@
return 0;
}
-int getCountFromBitmask(int bitmask) {
- return std::bitset<32>(bitmask).count();
-}
-
std::optional<AseDirectionConfiguration> findValidMonoConfig(
std::vector<AseDirectionConfiguration>& valid_direction_configurations,
int bitmask) {
@@ -505,14 +526,13 @@
return {};
}
+// Check and filter each index to see if it's a match.
void LeAudioOffloadAudioProvider::filterRequirementAseDirectionConfiguration(
std::optional<std::vector<std::optional<AseDirectionConfiguration>>>&
direction_configurations,
const std::vector<std::optional<AseDirectionRequirement>>& requirements,
std::optional<std::vector<std::optional<AseDirectionConfiguration>>>&
- valid_direction_configurations,
- bool is_exact) {
- // For every requirement, find the matched ase configuration
+ valid_direction_configurations) {
if (!direction_configurations.has_value()) return;
if (!valid_direction_configurations.has_value()) {
@@ -520,38 +540,55 @@
std::vector<std::optional<AseDirectionConfiguration>>();
}
- for (auto& requirement : requirements) {
- if (!requirement.has_value()) continue;
- auto req_allocation_bitmask = getLeAudioAseConfigurationAllocationBitmask(
- requirement.value().aseConfiguration);
- auto req_channel_count = getCountFromBitmask(req_allocation_bitmask);
-
- auto temp = std::vector<AseDirectionConfiguration>();
-
- for (auto direction_configuration : direction_configurations.value()) {
- if (!direction_configuration.has_value()) continue;
- if (!filterMatchedAseConfiguration(
- direction_configuration.value().aseConfiguration,
- requirement.value().aseConfiguration))
- continue;
- // Valid if match any requirement.
- temp.push_back(direction_configuration.value());
- }
-
- // Get the best matching config based on channel allocation
- auto total_cfg_channel_count = 0;
- auto req_valid_configs = getValidConfigurationsFromAllocation(
- req_allocation_bitmask, temp, is_exact);
- // Count and check required channel counts
- for (auto& cfg : req_valid_configs) {
- total_cfg_channel_count += getCountFromBitmask(
- getLeAudioAseConfigurationAllocationBitmask(cfg.aseConfiguration));
- valid_direction_configurations.value().push_back(cfg);
- }
- if (total_cfg_channel_count != req_channel_count) {
+ // Exact matching process
+ // Need to respect the number of device
+ for (int i = 0; i < requirements.size(); ++i) {
+ auto requirement = requirements[i];
+ auto direction_configuration = direction_configurations.value()[i];
+ if (!direction_configuration.has_value()) {
valid_direction_configurations = std::nullopt;
return;
}
+ auto cfg = direction_configuration.value();
+ if (!filterMatchedAseConfiguration(cfg.aseConfiguration,
+ requirement.value().aseConfiguration)) {
+ valid_direction_configurations = std::nullopt;
+ return; // No way to match
+ }
+ // For exact match, we require this direction to have the same allocation.
+ // If stereo, need stereo.
+ // If mono, need mono (modified to the correct required allocation)
+ auto req_allocation_bitmask = getLeAudioAseConfigurationAllocationBitmask(
+ requirement.value().aseConfiguration);
+ int req_channel_count = getCountFromBitmask(req_allocation_bitmask);
+ int cfg_bitmask =
+ getLeAudioAseConfigurationAllocationBitmask(cfg.aseConfiguration);
+ int cfg_channel_count = getCountFromBitmask(cfg_bitmask);
+ if (req_channel_count <= 1) {
+ // MONO case, is a match if also mono, modify to the same allocation
+ if (cfg_channel_count > 1) {
+ valid_direction_configurations = std::nullopt;
+ return; // Not a match
+ }
+ // Modify the bitmask to be the same as the requirement
+ for (auto& codec_cfg : cfg.aseConfiguration.codecConfiguration) {
+ if (codec_cfg.getTag() ==
+ CodecSpecificConfigurationLtv::Tag::audioChannelAllocation) {
+ codec_cfg
+ .get<CodecSpecificConfigurationLtv::Tag::audioChannelAllocation>()
+ .bitmask = req_allocation_bitmask;
+ break;
+ }
+ }
+ } else {
+ // STEREO case, is a match if same allocation
+ if (req_allocation_bitmask != cfg_bitmask) {
+ valid_direction_configurations = std::nullopt;
+ return; // Not a match
+ }
+ }
+ // Push to list if valid
+ valid_direction_configurations.value().push_back(cfg);
}
}
@@ -564,7 +601,6 @@
const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities,
uint8_t direction) {
// Create a new LeAudioAseConfigurationSetting and return
- // For other direction will contain all settings
LeAudioAseConfigurationSetting filtered_setting{
.audioContext = setting.audioContext,
.sinkAseConfiguration = setting.sinkAseConfiguration,
@@ -612,27 +648,39 @@
std::optional<LeAudioAseConfigurationSetting>
LeAudioOffloadAudioProvider::getRequirementMatchedAseConfigurationSettings(
IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
- const IBluetoothAudioProvider::LeAudioConfigurationRequirement& requirement,
- bool is_exact) {
- // Try to match context in metadata.
- if ((setting.audioContext.bitmask & requirement.audioContext.bitmask) !=
- requirement.audioContext.bitmask)
- return std::nullopt;
-
- // Further filter setting's context
- setting.audioContext.bitmask &= requirement.audioContext.bitmask;
-
+ const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
+ requirement) {
// Create a new LeAudioAseConfigurationSetting to return
+ // Make context the same as the requirement
LeAudioAseConfigurationSetting filtered_setting{
- .audioContext = setting.audioContext,
+ .audioContext = requirement.audioContext,
.packing = setting.packing,
.flags = setting.flags,
};
+ // The number of AseDirectionRequirement in the requirement
+ // is the number of device.
+
+ // The exact matching process is as follow:
+ // 1. Setting direction has the same number of cfg (ignore when null require)
+ // 2. For each index, it's a 1-1 filter / mapping.
+
+ if (requirement.sinkAseRequirement.has_value() &&
+ requirement.sinkAseRequirement.value().size() !=
+ setting.sinkAseConfiguration.value().size()) {
+ return std::nullopt;
+ }
+
+ if (requirement.sourceAseRequirement.has_value() &&
+ requirement.sourceAseRequirement.value().size() !=
+ setting.sourceAseConfiguration.value().size()) {
+ return std::nullopt;
+ }
+
if (requirement.sinkAseRequirement.has_value()) {
filterRequirementAseDirectionConfiguration(
setting.sinkAseConfiguration, requirement.sinkAseRequirement.value(),
- filtered_setting.sinkAseConfiguration, is_exact);
+ filtered_setting.sinkAseConfiguration);
if (!filtered_setting.sinkAseConfiguration.has_value()) {
return std::nullopt;
}
@@ -642,7 +690,7 @@
filterRequirementAseDirectionConfiguration(
setting.sourceAseConfiguration,
requirement.sourceAseRequirement.value(),
- filtered_setting.sourceAseConfiguration, is_exact);
+ filtered_setting.sourceAseConfiguration);
if (!filtered_setting.sourceAseConfiguration.has_value()) {
return std::nullopt;
}
@@ -651,47 +699,44 @@
return filtered_setting;
}
-std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
+std::optional<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
LeAudioOffloadAudioProvider::matchWithRequirement(
std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>&
matched_ase_configuration_settings,
- const std::vector<IBluetoothAudioProvider::LeAudioConfigurationRequirement>&
- in_requirements,
- bool is_exact) {
- // Each requirement will match with a valid setting
- std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting> result;
- for (auto& requirement : in_requirements) {
- LOG(INFO) << __func__ << ": Trying to match for the requirement "
- << requirement.toString();
- bool is_matched = false;
-
- for (auto& setting : matched_ase_configuration_settings) {
- auto filtered_ase_configuration_setting =
- getRequirementMatchedAseConfigurationSettings(setting, requirement,
- is_exact);
- if (filtered_ase_configuration_setting.has_value()) {
- result.push_back(filtered_ase_configuration_setting.value());
- LOG(INFO) << __func__ << ": Result = "
- << filtered_ase_configuration_setting.value().toString();
- // Found a matched setting, ignore other settings
- is_matched = true;
- break;
- }
+ const IBluetoothAudioProvider::LeAudioConfigurationRequirement& requirement,
+ bool isMatchContext) {
+ LOG(INFO) << __func__ << ": Trying to match for the requirement "
+ << requirement.toString() << ", match context = " << isMatchContext;
+ for (auto& setting : matched_ase_configuration_settings) {
+ // Try to match context in metadata.
+ if (isMatchContext) {
+ if ((setting.audioContext.bitmask & requirement.audioContext.bitmask) !=
+ requirement.audioContext.bitmask)
+ continue;
+ LOG(DEBUG) << __func__ << ": Setting with matched context: "
+ << getSettingOutputString(setting);
}
- if (!is_matched) {
- // If cannot satisfy this requirement, return an empty result
- LOG(WARNING) << __func__ << ": Cannot match the requirement "
- << requirement.toString();
- result.clear();
- break;
+
+ auto filtered_ase_configuration_setting =
+ getRequirementMatchedAseConfigurationSettings(setting, requirement);
+ if (filtered_ase_configuration_setting.has_value()) {
+ LOG(INFO) << __func__ << ": Result found: "
+ << getSettingOutputString(
+ filtered_ase_configuration_setting.value());
+ // Found a matched setting, ignore other settings
+ return filtered_ase_configuration_setting;
}
}
- return result;
+ // If cannot satisfy this requirement, return nullopt
+ LOG(WARNING) << __func__ << ": Cannot match the requirement "
+ << requirement.toString()
+ << ", match context = " << isMatchContext;
+ return std::nullopt;
}
// For each requirement, a valid ASE configuration will satify:
-// - matched with any sink capability (if presented)
-// - OR matched with any source capability (if presented)
+// - matched with the sink capability (if presented)
+// - AND matched with the source capability (if presented)
// - and the setting need to pass the requirement
ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(
const std::optional<std::vector<
@@ -714,19 +759,15 @@
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
}
- // Split out preferred and non-preferred settings based on context
- // An example: preferred = MEDIA, available: MEDIA | CONVERSATION
- // -> preferred list will have settings with MEDIA context
- // -> non-preferred list will have settings with any context
- // We want to match requirement with preferred context settings first
+ // Matched ASE configuration with ignored audio context
+ std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
+ sink_matched_ase_configuration_settings;
std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
matched_ase_configuration_settings;
- // Matched ASE configuration with non-preferred audio context
- std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
- non_prefer_matched_ase_configuration_settings;
- if (in_remoteSinkAudioCapabilities.has_value())
- // Matching each setting with any remote capabilities
+ // A setting must match both source and sink.
+ // First filter all setting matched with sink capability
+ if (in_remoteSinkAudioCapabilities.has_value()) {
for (auto& setting : ase_configuration_settings)
for (auto& capability : in_remoteSinkAudioCapabilities.value()) {
if (!capability.has_value()) continue;
@@ -734,81 +775,64 @@
getCapabilitiesMatchedAseConfigurationSettings(
setting, capability.value(), kLeAudioDirectionSink);
if (filtered_ase_configuration_setting.has_value()) {
- // Push to non-prefer first for the broadest matching possible
- non_prefer_matched_ase_configuration_settings.push_back(
+ sink_matched_ase_configuration_settings.push_back(
filtered_ase_configuration_setting.value());
- // Try to filter out prefer context to another vector.
- if (filterCapabilitiesMatchedContext(
- filtered_ase_configuration_setting.value().audioContext,
- capability.value())) {
- matched_ase_configuration_settings.push_back(
- filtered_ase_configuration_setting.value());
- }
}
}
+ } else {
+ sink_matched_ase_configuration_settings = ase_configuration_settings;
+ }
// Combine filter every source capability
- if (in_remoteSourceAudioCapabilities.has_value())
- // Matching each setting with any remote capabilities
- for (auto& setting : ase_configuration_settings)
+ if (in_remoteSourceAudioCapabilities.has_value()) {
+ for (auto& setting : sink_matched_ase_configuration_settings)
for (auto& capability : in_remoteSourceAudioCapabilities.value()) {
if (!capability.has_value()) continue;
auto filtered_ase_configuration_setting =
getCapabilitiesMatchedAseConfigurationSettings(
setting, capability.value(), kLeAudioDirectionSource);
if (filtered_ase_configuration_setting.has_value()) {
- // Put into the same list
- // possibly duplicated, filtered by requirement later
- // Push to non-prefer first for the broadest matching possible
- non_prefer_matched_ase_configuration_settings.push_back(
+ matched_ase_configuration_settings.push_back(
filtered_ase_configuration_setting.value());
- // Try to filter out prefer context to another vector.
- if (filterCapabilitiesMatchedContext(
- filtered_ase_configuration_setting.value().audioContext,
- capability.value())) {
- matched_ase_configuration_settings.push_back(
- filtered_ase_configuration_setting.value());
- }
}
}
+ } else {
+ matched_ase_configuration_settings =
+ sink_matched_ase_configuration_settings;
+ }
- // Matching priority list:
- // Preferred context - exact match with allocation
- // Any context - exact match with allocation
- // Preferred context - loose match with allocation
- // Any context - loose match with allocation
+ std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting> result;
+ for (auto& requirement : in_requirements) {
+ // For each requirement, try to match with a setting.
+ // If we cannot match, return an empty result.
- // A loose match will attempt to return 2 settings with the
- // combined allocation bitmask equal the required allocation.
- // For example, we can return 2 link (left link and right link) when
- // the requirement required 1 (left + right) link.
- auto result = matchWithRequirement(matched_ase_configuration_settings,
- in_requirements, true);
- if (result.empty()) {
- LOG(WARNING)
- << __func__
- << ": Cannot match with preferred context settings - exact match";
- result = matchWithRequirement(non_prefer_matched_ase_configuration_settings,
- in_requirements, true);
+ // Matching priority list:
+ // Preferred context - exact match with allocation
+ // Any context - exact match with allocation
+
+ auto matched_setting_with_context = matchWithRequirement(
+ matched_ase_configuration_settings, requirement, true);
+ if (matched_setting_with_context.has_value()) {
+ result.push_back(matched_setting_with_context.value());
+ } else {
+ auto matched_setting = matchWithRequirement(
+ matched_ase_configuration_settings, requirement, false);
+ if (matched_setting.has_value()) {
+ result.push_back(matched_setting.value());
+ } else {
+ // Cannot find a match for this requirement
+ // Immediately return
+ LOG(ERROR)
+ << __func__
+ << ": Cannot find any match for this requirement, exitting...";
+ result.clear();
+ *_aidl_return = result;
+ return ndk::ScopedAStatus::ok();
+ }
+ }
}
- if (result.empty()) {
- LOG(WARNING)
- << __func__
- << ": Cannot match with non-preferred context settings - exact match";
- result = matchWithRequirement(matched_ase_configuration_settings,
- in_requirements, false);
- }
- if (result.empty()) {
- LOG(WARNING) << __func__
- << ": Cannot match with preferred context settings - "
- "non-exact match";
- result = matchWithRequirement(non_prefer_matched_ase_configuration_settings,
- in_requirements, false);
- }
- if (result.empty())
- LOG(ERROR) << __func__
- << ": Cannot match with non preferred context settings - "
- "non-exact match";
+
+ LOG(INFO) << __func__ << ": Found matches for all requirements!";
*_aidl_return = result;
return ndk::ScopedAStatus::ok();
};
diff --git a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h
index 043d923..798f183 100644
--- a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h
+++ b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h
@@ -139,8 +139,7 @@
direction_configurations,
const std::vector<std::optional<AseDirectionRequirement>>& requirements,
std::optional<std::vector<std::optional<AseDirectionConfiguration>>>&
- valid_direction_configurations,
- bool is_exact);
+ valid_direction_configurations);
std::optional<LeAudioAseConfigurationSetting>
getCapabilitiesMatchedAseConfigurationSettings(
IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
@@ -150,8 +149,7 @@
getRequirementMatchedAseConfigurationSettings(
IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
- requirement,
- bool is_exact);
+ requirement);
bool isMatchedQosRequirement(LeAudioAseQosConfiguration setting_qos,
AseQosDirectionRequirement requirement_qos);
std::optional<LeAudioBroadcastConfigurationSetting>
@@ -169,14 +167,13 @@
AudioContext requirement_context,
IBluetoothAudioProvider::BroadcastQuality quality,
LeAudioBroadcastSubgroupConfiguration configuration);
- std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
+ std::optional<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
matchWithRequirement(
std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>&
matched_ase_configuration_settings,
- const std::vector<
- IBluetoothAudioProvider::LeAudioConfigurationRequirement>&
- in_requirements,
- bool is_exact);
+ const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
+ requirements,
+ bool isMatchContext);
};
class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider {
diff --git a/bluetooth/audio/aidl/default/bluetooth_audio.xml b/bluetooth/audio/aidl/default/bluetooth_audio.xml
index 3561dd1..767bf8f 100644
--- a/bluetooth/audio/aidl/default/bluetooth_audio.xml
+++ b/bluetooth/audio/aidl/default/bluetooth_audio.xml
@@ -1,7 +1,7 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.bluetooth.audio</name>
- <version>4</version>
+ <version>5</version>
<fqname>IBluetoothAudioProviderFactory/default</fqname>
</hal>
</manifest>
diff --git a/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp b/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
index e83cb9e..4481238 100644
--- a/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
+++ b/bluetooth/audio/aidl/vts/VtsHalBluetoothAudioTargetTest.cpp
@@ -142,6 +142,7 @@
VERSION_AIDL_V2,
VERSION_AIDL_V3,
VERSION_AIDL_V4,
+ VERSION_AIDL_V5,
};
// Some valid configs for HFP PCM configuration (software sessions)
@@ -195,6 +196,17 @@
}
}
+static std::optional<CodecSpecificConfigurationLtv> GetConfigurationLtv(
+ const std::vector<CodecSpecificConfigurationLtv>& configurationLtvs,
+ CodecSpecificConfigurationLtv::Tag tag) {
+ for (const auto ltv : configurationLtvs) {
+ if (ltv.getTag() == tag) {
+ return ltv;
+ }
+ }
+ return std::nullopt;
+}
+
class BluetoothAudioPort : public BnBluetoothAudioPort {
public:
BluetoothAudioPort() {}
@@ -672,6 +684,8 @@
return BluetoothAudioHalVersion::VERSION_AIDL_V3;
case 4:
return BluetoothAudioHalVersion::VERSION_AIDL_V4;
+ case 5:
+ return BluetoothAudioHalVersion::VERSION_AIDL_V5;
default:
return BluetoothAudioHalVersion::VERSION_UNAVAILABLE;
}
@@ -2393,17 +2407,6 @@
return capability;
}
- std::optional<CodecSpecificConfigurationLtv> GetConfigurationLtv(
- const std::vector<CodecSpecificConfigurationLtv>& configurationLtvs,
- CodecSpecificConfigurationLtv::Tag tag) {
- for (const auto ltv : configurationLtvs) {
- if (ltv.getTag() == tag) {
- return ltv;
- }
- }
- return std::nullopt;
- }
-
bool IsAseRequirementSatisfiedWithUnknownChannelCount(
const std::vector<std::optional<AseDirectionRequirement>>&
ase_requirements,
@@ -2560,6 +2563,67 @@
return (num_of_satisfied_ase_requirements == ase_requirements.size());
}
+ static void VerifyCodecParameters(
+ ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
+ LeAudioAseConfigurationSetting::AseDirectionConfiguration config) {
+ ASSERT_NE(config.aseConfiguration.codecConfiguration.size(), 0lu);
+ ASSERT_TRUE(config.qosConfiguration.has_value());
+
+ int32_t frame_blocks = 1; // by default 1 if not set
+ int8_t frame_duration = 0;
+ int32_t octets_per_frame = 0;
+ std::bitset<32> allocation_bitmask = 0;
+
+ for (auto const& param : config.aseConfiguration.codecConfiguration) {
+ if (param.getTag() ==
+ ::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::codecFrameBlocksPerSDU) {
+ frame_blocks = param
+ .get<::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::
+ codecFrameBlocksPerSDU>()
+ .value;
+ } else if (param.getTag() ==
+ ::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::frameDuration) {
+ frame_duration = static_cast<int8_t>(
+ param.get<::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::frameDuration>());
+ } else if (param.getTag() ==
+ ::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::octetsPerCodecFrame) {
+ octets_per_frame = static_cast<int32_t>(
+ param
+ .get<::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::
+ octetsPerCodecFrame>()
+ .value);
+ } else if (param.getTag() == ::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::
+ audioChannelAllocation) {
+ allocation_bitmask = static_cast<int32_t>(
+ param
+ .get<::aidl::android::hardware::bluetooth::audio::
+ CodecSpecificConfigurationLtv::Tag::
+ audioChannelAllocation>()
+ .bitmask);
+ }
+ }
+
+ ASSERT_NE(frame_blocks, 0);
+ ASSERT_NE(frame_duration, 0);
+ ASSERT_NE(octets_per_frame, 0);
+
+ auto const num_channels_per_cis = allocation_bitmask.count();
+ ASSERT_NE(num_channels_per_cis, 0);
+
+ // Verify if QoS takes the codec frame blocks per SDU into the account
+ ASSERT_TRUE(config.qosConfiguration->sduIntervalUs >=
+ frame_blocks * frame_duration);
+ ASSERT_TRUE(config.qosConfiguration->maxSdu >=
+ (frame_blocks * num_channels_per_cis * octets_per_frame));
+ }
+
void VerifyIfRequirementsSatisfied(
const std::vector<LeAudioConfigurationRequirement>& requirements,
const std::vector<LeAudioAseConfigurationSetting>& configurations) {
@@ -2592,32 +2656,52 @@
continue;
}
+ bool sink_req_satisfied = false;
+ if (req.sinkAseRequirement) {
+ ASSERT_TRUE(conf.sinkAseConfiguration.has_value());
+ sink_req_satisfied = IsAseRequirementSatisfied(
+ *req.sinkAseRequirement, *conf.sinkAseConfiguration);
+
+ ASSERT_NE(conf.sinkAseConfiguration->size(), 0lu);
+ for (auto const& cfg : conf.sinkAseConfiguration.value()) {
+ ASSERT_TRUE(cfg.has_value());
+ VerifyCodecParameters(cfg.value());
+ }
+ }
+
+ bool source_req_satisfied = false;
+ if (req.sourceAseRequirement) {
+ ASSERT_TRUE(conf.sourceAseConfiguration.has_value());
+ source_req_satisfied = IsAseRequirementSatisfied(
+ *req.sourceAseRequirement, *conf.sourceAseConfiguration);
+
+ ASSERT_NE(conf.sourceAseConfiguration->size(), 0lu);
+ for (auto const& cfg : conf.sourceAseConfiguration.value()) {
+ ASSERT_TRUE(cfg.has_value());
+ VerifyCodecParameters(cfg.value());
+ }
+ }
+
if (req.sinkAseRequirement && req.sourceAseRequirement) {
if (!conf.sinkAseConfiguration || !conf.sourceAseConfiguration) {
continue;
}
- if (!IsAseRequirementSatisfied(*req.sinkAseRequirement,
- *conf.sinkAseConfiguration) ||
- !IsAseRequirementSatisfied(*req.sourceAseRequirement,
- *conf.sourceAseConfiguration)) {
+ if (!sink_req_satisfied || !source_req_satisfied) {
continue;
}
num_of_satisfied_requirements +=
std::bitset<32>(req.audioContext.bitmask).count();
-
break;
} else if (req.sinkAseRequirement) {
- if (!IsAseRequirementSatisfied(*req.sinkAseRequirement,
- *conf.sinkAseConfiguration)) {
+ if (!sink_req_satisfied) {
continue;
}
num_of_satisfied_requirements +=
std::bitset<32>(req.audioContext.bitmask).count();
break;
} else if (req.sourceAseRequirement) {
- if (!IsAseRequirementSatisfied(*req.sourceAseRequirement,
- *conf.sourceAseConfiguration)) {
+ if (!source_req_satisfied) {
continue;
}
num_of_satisfied_requirements +=
@@ -4089,17 +4173,6 @@
return media_audio_context;
}
- std::optional<CodecSpecificConfigurationLtv> GetConfigurationLtv(
- const std::vector<CodecSpecificConfigurationLtv>& configurationLtvs,
- CodecSpecificConfigurationLtv::Tag tag) {
- for (const auto ltv : configurationLtvs) {
- if (ltv.getTag() == tag) {
- return ltv;
- }
- }
- return std::nullopt;
- }
-
std::optional<CodecSpecificConfigurationLtv::SamplingFrequency>
GetBisSampleFreq(const LeAudioBisConfiguration& bis_conf) {
auto sample_freq_ltv = GetConfigurationLtv(
diff --git a/bluetooth/audio/utils/Android.bp b/bluetooth/audio/utils/Android.bp
index 1661362..d931c4d 100644
--- a/bluetooth/audio/utils/Android.bp
+++ b/bluetooth/audio/utils/Android.bp
@@ -81,9 +81,9 @@
],
required: [
"aidl_audio_set_configurations_bfbs",
- "aidl_audio_set_configurations_json",
+ "aidl_default_audio_set_configurations_json",
"aidl_audio_set_scenarios_bfbs",
- "aidl_audio_set_scenarios_json",
+ "aidl_default_audio_set_scenarios_json",
"hfp_codec_capabilities_xml",
],
}
@@ -215,9 +215,9 @@
}
prebuilt_etc {
- name: "aidl_audio_set_scenarios_json",
+ name: "aidl_default_audio_set_scenarios_json",
src: "le_audio_configuration_set/audio_set_scenarios.json",
- filename: "aidl_audio_set_scenarios.json",
+ filename: "aidl_default_audio_set_scenarios.json",
sub_dir: "aidl/le_audio",
vendor: true,
}
@@ -239,9 +239,9 @@
}
prebuilt_etc {
- name: "aidl_audio_set_configurations_json",
+ name: "aidl_default_audio_set_configurations_json",
src: "le_audio_configuration_set/audio_set_configurations.json",
- filename: "aidl_audio_set_configurations.json",
+ filename: "aidl_default_audio_set_configurations.json",
sub_dir: "aidl/le_audio",
vendor: true,
}
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
index c25b102..db2528e 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
@@ -61,7 +61,7 @@
static const AacCapabilities kDefaultOffloadAacCapability = {
.objectType = {AacObjectType::MPEG2_LC},
- .sampleRateHz = {44100},
+ .sampleRateHz = {44100, 48000},
.channelMode = {ChannelMode::STEREO},
.variableBitRateSupported = true,
.bitsPerSample = {16}};
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp
index d0f2a26..a458c5b 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp
@@ -139,21 +139,36 @@
<< toString(session_type_);
return;
}
+ } else if(session_type_ == SessionType::HFP_HARDWARE_OFFLOAD_DATAPATH) {
+ if (audio_config.getTag() != AudioConfiguration::hfpConfig) {
+ LOG(ERROR) << __func__ << " invalid audio config type for SessionType ="
+ << toString(session_type_);
+ return;
+ }
} else {
LOG(ERROR) << __func__ << " invalid SessionType ="
<< toString(session_type_);
return;
}
} else {
- if (session_type_ !=
- SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
- session_type_ !=
+ if (session_type_ ==
+ SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
+ session_type_ ==
SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
- return;
- }
- if (audio_config.getTag() != AudioConfiguration::leAudioConfig) {
- LOG(ERROR) << __func__ << " invalid audio config type for SessionType ="
- << toString(session_type_);
+ if (audio_config.getTag() != AudioConfiguration::leAudioConfig) {
+ LOG(ERROR) << __func__ << " invalid audio config type for SessionType ="
+ << toString(session_type_);
+ return;
+ }
+ } else if(session_type_ == SessionType::HFP_HARDWARE_OFFLOAD_DATAPATH) {
+ if (audio_config.getTag() != AudioConfiguration::hfpConfig) {
+ LOG(ERROR) << __func__ << " invalid audio config type for SessionType ="
+ << toString(session_type_);
+ return;
+ }
+ } else {
+ LOG(ERROR) << __func__
+ << " invalid SessionType =" << toString(session_type_);
return;
}
}
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp
index 780154a..37812fa 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp
@@ -240,18 +240,31 @@
CodecSpecificConfigurationLtv::AudioChannelAllocation::RIGHT_SURROUND},
};
+// Set configuration and scenario files with fallback default
static const std::vector<
std::pair<const char* /*schema*/, const char* /*content*/>>
- kLeAudioSetConfigs = {{"/vendor/etc/aidl/le_audio/"
- "aidl_audio_set_configurations.bfbs",
- "/vendor/etc/aidl/le_audio/"
- "aidl_audio_set_configurations.json"}};
+ kLeAudioSetConfigs = {
+ {"/vendor/etc/aidl/le_audio/"
+ "aidl_audio_set_configurations.bfbs",
+ "/vendor/etc/aidl/le_audio/"
+ "aidl_audio_set_configurations.json"},
+
+ {"/vendor/etc/aidl/le_audio/"
+ "aidl_audio_set_configurations.bfbs",
+ "/vendor/etc/aidl/le_audio/"
+ "aidl_default_audio_set_configurations.json"},
+};
static const std::vector<
std::pair<const char* /*schema*/, const char* /*content*/>>
kLeAudioSetScenarios = {{"/vendor/etc/aidl/le_audio/"
"aidl_audio_set_scenarios.bfbs",
"/vendor/etc/aidl/le_audio/"
- "aidl_audio_set_scenarios.json"}};
+ "aidl_audio_set_scenarios.json"},
+
+ {"/vendor/etc/aidl/le_audio/"
+ "aidl_audio_set_scenarios.bfbs",
+ "/vendor/etc/aidl/le_audio/"
+ "aidl_default_audio_set_scenarios.json"}};
/* Implementation */
@@ -374,7 +387,7 @@
}
void AudioSetConfigurationProviderJson::populateAseConfiguration(
- LeAudioAseConfiguration& ase,
+ const std::string& name, LeAudioAseConfiguration& ase,
const le_audio::AudioSetSubConfiguration* flat_subconfig,
const le_audio::QosConfiguration* qos_cfg) {
// Target latency
@@ -411,20 +424,36 @@
}
// Codec configuration data
populateConfigurationData(ase, flat_subconfig->codec_configuration());
+ // Populate the config name for easier debug
+ auto meta = std::vector<std::optional<MetadataLtv>>();
+ MetadataLtv::VendorSpecific cfg_name;
+ cfg_name.opaqueValue = std::vector<uint8_t>(name.begin(), name.end());
+ meta.push_back(cfg_name);
+ ase.metadata = meta;
}
void AudioSetConfigurationProviderJson::populateAseQosConfiguration(
LeAudioAseQosConfiguration& qos, const le_audio::QosConfiguration* qos_cfg,
- LeAudioAseConfiguration& ase) {
+ LeAudioAseConfiguration& ase, uint8_t ase_channel_cnt) {
std::optional<CodecSpecificConfigurationLtv::CodecFrameBlocksPerSDU>
frameBlock = std::nullopt;
std::optional<CodecSpecificConfigurationLtv::FrameDuration> frameDuration =
std::nullopt;
- std::optional<CodecSpecificConfigurationLtv::AudioChannelAllocation>
- allocation = std::nullopt;
std::optional<CodecSpecificConfigurationLtv::OctetsPerCodecFrame> octet =
std::nullopt;
+ // Hack to put back allocation
+ CodecSpecificConfigurationLtv::AudioChannelAllocation allocation =
+ CodecSpecificConfigurationLtv::AudioChannelAllocation();
+ if (ase_channel_cnt == 1) {
+ allocation.bitmask |=
+ CodecSpecificConfigurationLtv::AudioChannelAllocation::FRONT_CENTER;
+
+ } else {
+ allocation.bitmask |=
+ CodecSpecificConfigurationLtv::AudioChannelAllocation::FRONT_LEFT |
+ CodecSpecificConfigurationLtv::AudioChannelAllocation::FRONT_RIGHT;
+ }
for (auto& cfg_ltv : ase.codecConfiguration) {
auto tag = cfg_ltv.getTag();
if (tag == CodecSpecificConfigurationLtv::codecFrameBlocksPerSDU) {
@@ -433,11 +462,12 @@
} else if (tag == CodecSpecificConfigurationLtv::frameDuration) {
frameDuration =
cfg_ltv.get<CodecSpecificConfigurationLtv::frameDuration>();
- } else if (tag == CodecSpecificConfigurationLtv::audioChannelAllocation) {
- allocation =
- cfg_ltv.get<CodecSpecificConfigurationLtv::audioChannelAllocation>();
} else if (tag == CodecSpecificConfigurationLtv::octetsPerCodecFrame) {
octet = cfg_ltv.get<CodecSpecificConfigurationLtv::octetsPerCodecFrame>();
+ } else if (tag == CodecSpecificConfigurationLtv::audioChannelAllocation) {
+ // Change to the old hack allocation
+ cfg_ltv.set<CodecSpecificConfigurationLtv::audioChannelAllocation>(
+ allocation);
}
}
@@ -445,9 +475,8 @@
if (frameBlock.has_value()) frameBlockValue = frameBlock.value().value;
// Populate maxSdu
- if (allocation.has_value() && octet.has_value()) {
- auto channel_count = std::bitset<32>(allocation.value().bitmask).count();
- qos.maxSdu = channel_count * octet.value().value * frameBlockValue;
+ if (octet.has_value()) {
+ qos.maxSdu = ase_channel_cnt * octet.value().value * frameBlockValue;
}
// Populate sduIntervalUs
if (frameDuration.has_value()) {
@@ -468,6 +497,7 @@
// Parse into AseDirectionConfiguration
AseDirectionConfiguration
AudioSetConfigurationProviderJson::SetConfigurationFromFlatSubconfig(
+ const std::string& name,
const le_audio::AudioSetSubConfiguration* flat_subconfig,
const le_audio::QosConfiguration* qos_cfg, CodecLocation location) {
AseDirectionConfiguration direction_conf;
@@ -477,10 +507,11 @@
LeAudioDataPathConfiguration path;
// Translate into LeAudioAseConfiguration
- populateAseConfiguration(ase, flat_subconfig, qos_cfg);
+ populateAseConfiguration(name, ase, flat_subconfig, qos_cfg);
// Translate into LeAudioAseQosConfiguration
- populateAseQosConfiguration(qos, qos_cfg, ase);
+ populateAseQosConfiguration(qos, qos_cfg, ase,
+ flat_subconfig->ase_channel_cnt());
// Translate location to data path id
switch (location) {
@@ -510,13 +541,18 @@
// Parse into AseDirectionConfiguration and the ConfigurationFlags
// and put them in the given list.
void AudioSetConfigurationProviderJson::processSubconfig(
+ const std::string& name,
const le_audio::AudioSetSubConfiguration* subconfig,
const le_audio::QosConfiguration* qos_cfg,
std::vector<std::optional<AseDirectionConfiguration>>&
directionAseConfiguration,
CodecLocation location) {
- directionAseConfiguration.push_back(
- SetConfigurationFromFlatSubconfig(subconfig, qos_cfg, location));
+ auto ase_cnt = subconfig->ase_cnt();
+ auto config =
+ SetConfigurationFromFlatSubconfig(name, subconfig, qos_cfg, location);
+ directionAseConfiguration.push_back(config);
+ // Put the same setting again.
+ if (ase_cnt == 2) directionAseConfiguration.push_back(config);
}
void AudioSetConfigurationProviderJson::PopulateAseConfigurationFromFlat(
@@ -587,11 +623,11 @@
/* Load subconfigurations */
for (auto subconfig : *codec_cfg->subconfigurations()) {
if (subconfig->direction() == kLeAudioDirectionSink) {
- processSubconfig(subconfig, qos_sink_cfg, sinkAseConfiguration,
- location);
+ processSubconfig(flat_cfg->name()->str(), subconfig, qos_sink_cfg,
+ sinkAseConfiguration, location);
} else {
- processSubconfig(subconfig, qos_source_cfg, sourceAseConfiguration,
- location);
+ processSubconfig(flat_cfg->name()->str(), subconfig, qos_source_cfg,
+ sourceAseConfiguration, location);
}
}
} else {
@@ -742,9 +778,6 @@
LOG(DEBUG) << "Updating " << flat_scenarios->size() << " scenarios.";
for (auto const& scenario : *flat_scenarios) {
- LOG(DEBUG) << "Scenario " << scenario->name()->c_str()
- << " configs: " << scenario->configurations()->size();
-
if (!scenario->configurations()) continue;
std::string scenario_name = scenario->name()->c_str();
AudioContext context;
@@ -758,6 +791,9 @@
context = AudioContext(game_context);
else if (scenario_name == "VoiceAssistants")
context = AudioContext(voice_assistants_context);
+ LOG(DEBUG) << "Scenario " << scenario->name()->c_str()
+ << " configs: " << scenario->configurations()->size()
+ << " context: " << context.toString();
for (auto it = scenario->configurations()->begin();
it != scenario->configurations()->end(); ++it) {
@@ -790,14 +826,22 @@
std::vector<std::pair<const char* /*schema*/, const char* /*content*/>>
scenario_files,
CodecLocation location) {
+ bool is_loaded_config = false;
for (auto [schema, content] : config_files) {
- if (!LoadConfigurationsFromFiles(schema, content, location)) return false;
+ if (LoadConfigurationsFromFiles(schema, content, location)) {
+ is_loaded_config = true;
+ break;
+ }
}
+ bool is_loaded_scenario = false;
for (auto [schema, content] : scenario_files) {
- if (!LoadScenariosFromFiles(schema, content)) return false;
+ if (LoadScenariosFromFiles(schema, content)) {
+ is_loaded_scenario = true;
+ break;
+ }
}
- return true;
+ return is_loaded_config && is_loaded_scenario;
}
} // namespace audio
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.h b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.h
index 6639009..fac6152 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.h
+++ b/bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.h
@@ -73,19 +73,22 @@
flat_codec_specific_params);
static void populateAseConfiguration(
- LeAudioAseConfiguration& ase,
+ const std::string& name, LeAudioAseConfiguration& ase,
const le_audio::AudioSetSubConfiguration* flat_subconfig,
const le_audio::QosConfiguration* qos_cfg);
static void populateAseQosConfiguration(
LeAudioAseQosConfiguration& qos,
- const le_audio::QosConfiguration* qos_cfg, LeAudioAseConfiguration& ase);
+ const le_audio::QosConfiguration* qos_cfg, LeAudioAseConfiguration& ase,
+ uint8_t ase_channel_cnt);
static AseDirectionConfiguration SetConfigurationFromFlatSubconfig(
+ const std::string& name,
const le_audio::AudioSetSubConfiguration* flat_subconfig,
const le_audio::QosConfiguration* qos_cfg, CodecLocation location);
static void processSubconfig(
+ const std::string& name,
const le_audio::AudioSetSubConfiguration* subconfig,
const le_audio::QosConfiguration* qos_cfg,
std::vector<std::optional<AseDirectionConfiguration>>&
diff --git a/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.fbs b/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.fbs
index bde467d..ed9ad49 100644
--- a/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.fbs
+++ b/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.fbs
@@ -56,10 +56,9 @@
HIGH_RELIABILITY = 0x03,
}
table AudioSetSubConfiguration {
- device_cnt: ubyte;
+ ase_channel_cnt: ubyte;
ase_cnt: ubyte;
direction: AudioSetConfigurationDirection = SINK;
- configuration_strategy: AudioSetConfigurationStrategy;
codec_id : CodecId (required);
codec_configuration: [CodecSpecificConfiguration] (required);
}
diff --git a/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.json b/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.json
index 404a48a..fbfa3f9 100644
--- a/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.json
+++ b/bluetooth/audio/utils/le_audio_configuration_set/audio_set_configurations.json
@@ -13,16 +13,11 @@
" Codec Configuration parameter types:",
" SUPPORTED_SAMPLING_FREQUENCY = 1",
" SUPPORTED_FRAME_DURATION = 2",
- " SUPPORTED_AUDIO_CHANNEL_ALLOCATION = 3",
" SUPPORTED_OCTETS_PER_CODEC_FRAME = 4",
" SUPPORTED_CODEC_FRAME_BLOCKS_PER_SDU = 5",
" Example values which can be used as 'codec_configuration.compound_value'",
" Codec Coding formats:",
" LC3 = 6",
- " ASE Configuration strategies:",
- " MONO_ONE_CIS_PER_DEVICE = 0",
- " STEREO_TWO_CISES_PER_DEVICE = 1",
- " STEREO_ONE_CIS_PER_DEVICE = 2",
" Sampling Frequencies: ",
" 8000Hz = 1",
" 11025Hz = 2",
@@ -43,1177 +38,1135 @@
],
"configurations": [
{
- "name": "DualDev_OneChanStereoSnk_16_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_1_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_1_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_1_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_2_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_2_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_1_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_1_1",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_1_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_2_1",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_2_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_1_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_1_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_1_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_2_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_2_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_32_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_32_1",
+ "name": "One-OneChan-SnkAse-Lc3_32_1_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_32_1_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_32_1",
+ "name": "One-OneChan-SnkAse-Lc3_32_1_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_1",
"qos_config_name": [
"QoS_Config_32_1_1"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_32_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_32_1_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_1",
+ "qos_config_name": [
+ "QoS_Config_32_1_2"
+ ]
+ },
+ {
+ "name": "One-OneChan-SnkAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_32_2_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_32_2_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_32_2_1"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_16_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_16_1",
+ "name": "One-OneChan-SnkAse-Lc3_32_2_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_2",
+ "qos_config_name": [
+ "QoS_Config_32_2_2"
+ ]
+ },
+ {
+ "name": "One-OneChan-SnkAse-Lc3_16_1_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_16_1_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_16_1",
+ "name": "One-OneChan-SnkAse-Lc3_16_1_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_16_1_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_16_1",
+ "name": "One-OneChan-SnkAse-Lc3_16_1_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "DualDev_OneChanMonoSnk_16_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanMonoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_16_2_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_16_2_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_16_2_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_16_2_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_1",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
- "qos_config_name": [
- "QoS_Config_16_1_1"
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2",
- "qos_config_name": [
- "QoS_Config_Low_Latency"
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_32_2_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_2",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
- "qos_config_name": [
- "QoS_Config_16_1_2"
- ]
- },
- {
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_1",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
- "qos_config_name": [
- "QoS_Config_16_2_1"
- ]
- },
- {
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_2",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
- "qos_config_name": [
- "QoS_Config_16_2_2"
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
- "qos_config_name": [
- "QoS_Config_Low_Latency"
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1",
+ "name": "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1",
+ "name": "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_1"
]
},
{
- "name": "DualDev_OneChanMonoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSrc_16_2",
+ "name": "Two-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_4_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_48_4",
+ "name": "One-OneChan-SrcAse-Lc3_48_4_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_3_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_48_3",
+ "name": "One-OneChan-SrcAse-Lc3_48_3_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_48_2",
+ "name": "One-OneChan-SrcAse-Lc3_48_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_48_1",
+ "name": "One-OneChan-SrcAse-Lc3_48_1_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_32_2",
+ "name": "One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_32_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_32_1",
+ "name": "One-OneChan-SrcAse-Lc3_32_1_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_32_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_24_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_24_2",
+ "name": "One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_24_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_24_1",
+ "name": "One-OneChan-SrcAse-Lc3_24_1_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_24_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_16_2",
+ "name": "One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSrc_16_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSrc_16_1",
+ "name": "One-OneChan-SrcAse-Lc3_16_1_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1",
+ "name": "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"qos_config_name": [
"QoS_Config_16_1_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_1"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_16_2_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_24_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_24_1",
+ "name": "Two-OneChan-SnkAse-Lc3_24_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_24_1_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_24_1",
+ "name": "One-TwoChan-SnkAse-Lc3_24_1_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_24_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_24_1_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_24_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_24_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_24_2_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_24_2_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_24_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_24_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_24_2_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_24_2_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_24_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_24_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_24_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_24_2_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_24_2_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_24_2_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_24_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_24_2",
+ "name": "One-OneChan-SnkAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_24_2_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_24_2",
+ "name": "One-OneChan-SnkAse-Lc3_24_2_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_24_2_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_32_2_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_32_2_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_32_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_32_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_32_1",
+ "name": "Two-OneChan-SnkAse-Lc3_32_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_32_1_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_32_1",
+ "name": "One-TwoChan-SnkAse-Lc3_32_1_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_32_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_32_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_32_1_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_32_1",
+ "name": "Two-OneChan-SnkAse-Lc3_32_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_1",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_32_2_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_32_2_1"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
- "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_32_2_1"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_32_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2",
- "qos_config_name": [
- "QoS_Config_32_2_1"
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_32_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_32_2",
- "qos_config_name": [
- "QoS_Config_Low_Latency"
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_48_4_High_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_1",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_1"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_3_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_3",
+ "name": "Two-OneChan-SnkAse-Lc3_48_3_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_3_High_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_3",
+ "name": "Two-OneChan-SnkAse-Lc3_48_3_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_3_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_3",
+ "name": "Two-OneChan-SnkAse-Lc3_48_3_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_48_3_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_2_High_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_2_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_2_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_48_2_2"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_1",
+ "name": "Two-OneChan-SnkAse-Lc3_48_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_1_High_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_1",
+ "name": "Two-OneChan-SnkAse-Lc3_48_1_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_1_2",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_1",
+ "name": "Two-OneChan-SnkAse-Lc3_48_1_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_48_1_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_High_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_4",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_1",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_4",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4_1",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_1"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_4",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_3_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_3",
+ "name": "Two-OneChan-SnkAse-Lc3_48_3_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_3_High_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_3",
+ "name": "Two-OneChan-SnkAse-Lc3_48_3_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_3_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_3",
+ "name": "Two-OneChan-SnkAse-Lc3_48_3_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_48_3_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_2_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_2_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_2_High_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_2_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_2_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_2_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_48_2_2"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_1_Low_Latency",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_1",
+ "name": "Two-OneChan-SnkAse-Lc3_48_1_Low_Latency",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_1_High_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_1",
+ "name": "Two-OneChan-SnkAse-Lc3_48_1_High_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_1_2",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_1",
+ "name": "Two-OneChan-SnkAse-Lc3_48_1_2",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_48_1_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_High_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4_High_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_1",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4_1",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_1"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_3_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_3",
+ "name": "One-TwoChan-SnkAse-Lc3_48_3_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_3_High_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_3",
+ "name": "One-TwoChan-SnkAse-Lc3_48_3_High_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_3_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_3",
+ "name": "One-TwoChan-SnkAse-Lc3_48_3_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_48_3_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_2_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_2_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_2_High_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_2_High_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_2_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_2_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_48_2_2"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_1_Low_Latency",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_1",
+ "name": "One-TwoChan-SnkAse-Lc3_48_1_Low_Latency",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_1_High_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_1",
+ "name": "One-TwoChan-SnkAse-Lc3_48_1_High_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_1_2",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_1",
+ "name": "One-TwoChan-SnkAse-Lc3_48_1_2",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_48_1_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_4_High_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_4",
+ "name": "One-OneChan-SnkAse-Lc3_48_4_High_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_4_1",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_4",
+ "name": "One-OneChan-SnkAse-Lc3_48_4_1",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_1"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_4_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_4",
+ "name": "One-OneChan-SnkAse-Lc3_48_4_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_4",
"qos_config_name": [
"QoS_Config_48_4_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_3_High_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_3",
+ "name": "One-OneChan-SnkAse-Lc3_48_3_High_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_3_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_3",
+ "name": "One-OneChan-SnkAse-Lc3_48_3_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_3",
"qos_config_name": [
"QoS_Config_48_3_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_2_High_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_2_High_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_2_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_2_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_48_2_2"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_1_High_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_1",
+ "name": "One-OneChan-SnkAse-Lc3_48_1_High_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_High_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_1_2",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_1",
+ "name": "One-OneChan-SnkAse-Lc3_48_1_2",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_48_1_2"
]
@@ -1289,176 +1242,155 @@
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_24_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_24_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_1_OneChanMonoSrc_24_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_1_OneChanMonoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_1_OneChanMonoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_1_OneChanMonoSrc_24_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_1_OneChanMonoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "codec_config_name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_4_1_OneChanMonoSrc_32_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_32_2",
- "qos_config_name": [
- "QoS_Config_Balanced_Reliability"
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_4_1_OneChanMonoSrc_24_2_1_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_24_2",
- "qos_config_name": [
- "QoS_Config_Balanced_Reliability"
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_4_1_OneChanMonoSrc_16_2_Balanced_Reliability",
- "codec_config_name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_16_2",
- "qos_config_name": [
- "QoS_Config_Balanced_Reliability"
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1",
+ "name": "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1_Low_Latency",
+ "codec_config_name": "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1",
+ "name": "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1_Balanced_Reliability",
+ "codec_config_name": "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Low_Latency",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2",
+ "name": "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2_Low_Latency",
+ "codec_config_name": "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_Low_Latency"
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Balanced_Reliability",
- "codec_config_name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2",
+ "name": "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2_Balanced_Reliability",
+ "codec_config_name": "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2",
"qos_config_name": [
"QoS_Config_Balanced_Reliability"
]
@@ -1495,13 +1427,11 @@
],
"codec_configurations": [
{
- "name": "DualDev_OneChanStereoSnk_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -1527,18 +1457,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -1557,18 +1475,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_16_1",
+ "name": "Two-OneChan-SnkAse-Lc3_16_1",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -1594,18 +1511,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -1624,152 +1529,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanStereoSnk_16_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_16_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -1795,18 +1565,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -1825,18 +1583,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -1862,18 +1619,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -1892,18 +1637,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_OneChanStereoSrc_16_2",
+ "name": "Two-OneChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 2,
"direction": "SOURCE",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -1929,18 +1673,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -1959,15 +1691,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_24_2",
+ "name": "One-OneChan-SrcAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -1995,13 +1727,109 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
+ "name": "octets_per_codec_frame",
+ "type": 4,
"compound_value": {
"value": [
- 1,
- 0,
- 0,
+ 60,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_32_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_32_1",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
0
]
}
@@ -2025,18 +1853,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_32_2",
"subconfigurations": [
{
- "device_cnt": 2,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -2062,18 +1889,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -2092,18 +1907,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_32_1",
+ "name": "One-OneChan-SnkAse-Lc3_32_1",
"subconfigurations": [
{
- "device_cnt": 2,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -2129,18 +1943,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -2159,18 +1961,537 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSnk_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 40,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-OneChan-SnkAse-Lc3_16_1",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 40,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 40,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 40,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 2,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 40,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 2,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -2196,18 +2517,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -2226,344 +2535,10 @@
]
}
}
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_32_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 60,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanMonoSnk_16_2",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_16_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_16_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -2577,710 +2552,6 @@
"type": 1,
"compound_value": {
"value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 4,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 4,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
6
]
}
@@ -3295,18 +2566,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -3325,847 +2584,15 @@
]
}
}
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 40,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 30,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
"codec_id": {
@@ -4193,18 +2620,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4223,10 +2638,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4254,18 +2669,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4284,15 +2687,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1",
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
"codec_id": {
@@ -4320,18 +2723,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4350,10 +2741,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4381,18 +2772,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4411,16 +2790,65 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "DualDev_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 2,
- "ase_cnt": 2,
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 40,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 2
+ },
+ {
+ "ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
"coding_format": 6,
@@ -4447,18 +2875,163 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
+ "name": "octets_per_codec_frame",
+ "type": 4,
"compound_value": {
"value": [
- 1,
- 0,
- 0,
+ 40,
0
]
}
},
{
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 2
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4477,15 +3050,167 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 40,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_4",
+ "name": "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1",
"subconfigurations": [
{
- "device_cnt": 1,
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 3
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 0
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 30,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-OneChan-SrcAse-Lc3_48_4",
+ "subconfigurations": [
+ {
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4513,18 +3238,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4543,15 +3256,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_3",
+ "name": "One-OneChan-SrcAse-Lc3_48_3",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4579,18 +3292,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4609,15 +3310,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_2",
+ "name": "One-OneChan-SrcAse-Lc3_48_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4645,18 +3346,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4675,15 +3364,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_48_1",
+ "name": "One-OneChan-SrcAse-Lc3_48_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4711,18 +3400,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4741,15 +3418,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_32_2",
+ "name": "One-OneChan-SrcAse-Lc3_32_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4777,18 +3454,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4807,15 +3472,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_32_1",
+ "name": "One-OneChan-SrcAse-Lc3_32_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4843,18 +3508,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -4873,15 +3526,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_24_2",
+ "name": "One-OneChan-SrcAse-Lc3_24_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -4904,84 +3557,6 @@
"type": 2,
"compound_value": {
"value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 60,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSrc_24_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 5
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
0
]
}
@@ -5005,15 +3580,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_16_2",
+ "name": "One-OneChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -5041,18 +3616,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5071,15 +3634,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSrc_16_1",
+ "name": "One-OneChan-SrcAse-Lc3_16_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -5107,18 +3670,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5137,18 +3688,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5174,18 +3724,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5204,18 +3742,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_3",
+ "name": "Two-OneChan-SnkAse-Lc3_48_3",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5241,18 +3778,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5271,18 +3796,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5308,18 +3832,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5338,18 +3850,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_1",
+ "name": "Two-OneChan-SnkAse-Lc3_48_1",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5375,18 +3886,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5405,18 +3904,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5442,18 +3940,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5472,18 +3958,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_3",
+ "name": "One-TwoChan-SnkAse-Lc3_48_3",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5509,18 +3994,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5539,18 +4012,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_2",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5576,18 +4048,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5606,18 +4066,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_1",
+ "name": "One-TwoChan-SnkAse-Lc3_48_1",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5643,18 +4102,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5673,18 +4120,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4",
+ "name": "One-OneChan-SnkAse-Lc3_48_4",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5710,18 +4156,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5740,18 +4174,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_3",
+ "name": "One-OneChan-SnkAse-Lc3_48_3",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5777,18 +4210,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5807,18 +4228,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5844,18 +4264,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5874,18 +4282,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_1",
+ "name": "One-OneChan-SnkAse-Lc3_48_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -5911,18 +4318,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -5941,275 +4336,8 @@
]
}
}
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_4",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 120,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_3",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 90,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 100,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 75,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
@@ -6217,10 +4345,8 @@
"name": "VND_SingleDev_TwoChanStereoSnk_48khz_100octs_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -6246,18 +4372,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6276,7 +4390,8 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
@@ -6284,10 +4399,8 @@
"name": "VND_DualDev_OneChanStereoSnk_48khz_100octs_1",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -6313,18 +4426,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6343,7 +4444,8 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
@@ -6351,10 +4453,8 @@
"name": "VND_SingleDev_OneChanStereoSnk_48khz_100octs_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -6380,18 +4480,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6410,7 +4498,8 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
@@ -6418,10 +4507,8 @@
"name": "VND_SingleDev_TwoChanStereoSnk_48khz_75octs_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -6447,18 +4534,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6477,15 +4552,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_32_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
"codec_id": {
@@ -6513,18 +4588,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6543,10 +4606,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SOURCE",
"codec_id": {
@@ -6574,18 +4637,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6604,15 +4655,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
"codec_id": {
@@ -6640,18 +4691,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6670,10 +4709,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SOURCE",
"codec_id": {
@@ -6701,23 +4740,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 60,
0
]
}
@@ -6731,15 +4758,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
"codec_id": {
@@ -6767,18 +4794,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6797,10 +4812,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SOURCE",
"codec_id": {
@@ -6828,23 +4843,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 40,
0
]
}
@@ -6858,15 +4861,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
"codec_id": {
@@ -6894,18 +4897,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6924,10 +4915,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -6955,18 +4946,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -6985,15 +4964,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
"codec_id": {
@@ -7021,18 +5000,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -7051,10 +5018,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -7082,23 +5049,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 60,
0
]
}
@@ -7112,15 +5067,15 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
"codec_id": {
@@ -7148,18 +5103,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -7178,10 +5121,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -7209,23 +5152,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 40,
0
]
}
@@ -7239,18 +5170,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_32_2",
"subconfigurations": [
{
- "device_cnt": 2,
- "ase_cnt": 4,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -7276,18 +5206,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -7306,10 +5224,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -7337,18 +5255,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -7367,18 +5273,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 2,
- "ase_cnt": 4,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -7404,18 +5309,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -7434,10 +5327,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -7465,23 +5358,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 60,
0
]
}
@@ -7495,18 +5376,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 2,
- "ase_cnt": 4,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -7532,18 +5412,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -7562,10 +5430,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -7593,23 +5461,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 40,
0
]
}
@@ -7623,18 +5479,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_32_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -7660,18 +5515,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -7690,397 +5533,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_24_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 120,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 5
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 120,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 120,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -8108,18 +5564,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -8138,18 +5582,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -8175,18 +5618,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -8205,10 +5636,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -8236,23 +5667,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 60,
0
]
}
@@ -8266,18 +5685,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -8303,18 +5721,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -8333,10 +5739,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -8364,23 +5770,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 40,
0
]
}
@@ -8394,18 +5788,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -8431,18 +5824,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -8461,10 +5842,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -8492,18 +5873,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -8522,18 +5891,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -8559,18 +5927,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -8589,10 +5945,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -8620,23 +5976,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 60,
0
]
}
@@ -8650,18 +5994,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2",
+ "name": "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -8687,18 +6030,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -8717,10 +6048,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -8748,23 +6079,11 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
"value": [
- 80,
+ 40,
0
]
}
@@ -8778,399 +6097,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_32_2",
+ "name": "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 120,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_24_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 120,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 5
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_16_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 8
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 120,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 3
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1",
- "subconfigurations": [
- {
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9196,18 +6133,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9226,13 +6151,12 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9258,18 +6182,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9288,18 +6200,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2",
+ "name": "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9325,18 +6236,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9355,13 +6254,12 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9387,18 +6285,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9417,7 +6303,8 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
@@ -9425,10 +6312,8 @@
"name": "VND_SingleDev_TwoChanStereoSrc_48khz_100octs_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9454,18 +6339,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9484,7 +6357,8 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
@@ -9492,10 +6366,8 @@
"name": "VND_SingleDev_TwoChanStereoSnk_OneChanStereoSrc_32khz_60octs_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9521,18 +6393,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9551,10 +6411,10 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
"codec_id": {
@@ -9582,18 +6442,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9612,7 +6460,8 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
@@ -9620,10 +6469,8 @@
"name": "VND_SingleDev_TwoChanStereoSnk_48khz_75octs_TwoChanStereoSrc_16khz_30octs_1",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9649,18 +6496,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9679,13 +6514,12 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
},
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SOURCE",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9711,18 +6545,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9741,18 +6563,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_24_2",
+ "name": "Two-OneChan-SnkAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9778,18 +6599,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9808,18 +6617,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "DualDev_OneChanStereoSnk_24_1",
+ "name": "Two-OneChan-SnkAse-Lc3_24_1",
"subconfigurations": [
{
- "device_cnt": 2,
"ase_cnt": 2,
"direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9845,18 +6653,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9875,18 +6671,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 1
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_24_2",
+ "name": "One-TwoChan-SnkAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9912,18 +6707,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -9942,18 +6725,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_OneChanStereoSnk_24_1",
+ "name": "One-TwoChan-SnkAse-Lc3_24_1",
"subconfigurations": [
{
- "device_cnt": 1,
- "ase_cnt": 2,
+ "ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -9979,18 +6761,6 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
"name": "octets_per_codec_frame",
"type": 4,
"compound_value": {
@@ -10009,18 +6779,17 @@
]
}
}
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
},
{
- "name": "SingleDev_TwoChanStereoSnk_24_2",
+ "name": "One-OneChan-SnkAse-Lc3_24_2",
"subconfigurations": [
{
- "device_cnt": 1,
"ase_cnt": 1,
"direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
"codec_id": {
"coding_format": 6,
"vendor_company_id": 0,
@@ -10046,13 +6815,521 @@
}
},
{
- "name": "audio_channel_allocation",
- "type": 3,
+ "name": "octets_per_codec_frame",
+ "type": 4,
"compound_value": {
"value": [
- 3,
- 0,
- 0,
+ 60,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 2,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 2,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 2
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ },
+ {
+ "ase_cnt": 1,
+ "direction": "SOURCE",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 1
+ }
+ ]
+ },
+ {
+ "name": "One-TwoChan-SnkAse-Lc3_32_2",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ },
+ {
+ "name": "octets_per_codec_frame",
+ "type": 4,
+ "compound_value": {
+ "value": [
+ 80,
+ 0
+ ]
+ }
+ },
+ {
+ "name": "codec_frame_blocks_per_sdu",
+ "type": 5,
+ "compound_value": {
+ "value": [
+ 1
+ ]
+ }
+ }
+ ],
+ "ase_channel_cnt": 2
+ }
+ ]
+ },
+ {
+ "name": "One-TwoChan-SnkAse-Lc3_32_1",
+ "subconfigurations": [
+ {
+ "ase_cnt": 1,
+ "direction": "SINK",
+ "codec_id": {
+ "coding_format": 6,
+ "vendor_company_id": 0,
+ "vendor_codec_id": 0
+ },
+ "codec_configuration": [
+ {
+ "name": "sampling_frequency",
+ "type": 1,
+ "compound_value": {
+ "value": [
+ 6
+ ]
+ }
+ },
+ {
+ "name": "frame_duration",
+ "type": 2,
+ "compound_value": {
+ "value": [
0
]
}
@@ -10076,1174 +7353,8 @@
]
}
}
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_24_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 5
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 45,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_24_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "MONO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 5
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 60,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 2,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 2,
- "ase_cnt": 4,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- },
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SOURCE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_32_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_TwoChanStereoSnk_32_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 1,
- "direction": "SINK",
- "configuration_strategy": "STEREO_ONE_CIS_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 3,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 60,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanStereoSnk_32_2",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 1
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 80,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
- }
- ]
- },
- {
- "name": "SingleDev_OneChanStereoSnk_32_1",
- "subconfigurations": [
- {
- "device_cnt": 1,
- "ase_cnt": 2,
- "direction": "SINK",
- "configuration_strategy": "STEREO_TWO_CISES_PER_DEVICE",
- "codec_id": {
- "coding_format": 6,
- "vendor_company_id": 0,
- "vendor_codec_id": 0
- },
- "codec_configuration": [
- {
- "name": "sampling_frequency",
- "type": 1,
- "compound_value": {
- "value": [
- 6
- ]
- }
- },
- {
- "name": "frame_duration",
- "type": 2,
- "compound_value": {
- "value": [
- 0
- ]
- }
- },
- {
- "name": "audio_channel_allocation",
- "type": 3,
- "compound_value": {
- "value": [
- 1,
- 0,
- 0,
- 0
- ]
- }
- },
- {
- "name": "octets_per_codec_frame",
- "type": 4,
- "compound_value": {
- "value": [
- 60,
- 0
- ]
- }
- },
- {
- "name": "codec_frame_blocks_per_sdu",
- "type": 5,
- "compound_value": {
- "value": [
- 1
- ]
- }
- }
- ]
+ ],
+ "ase_channel_cnt": 2
}
]
}
@@ -11377,6 +7488,5 @@
"retransmission_number": 0,
"max_transport_latency": 0
}
-
]
}
diff --git a/bluetooth/audio/utils/le_audio_configuration_set/audio_set_scenarios.json b/bluetooth/audio/utils/le_audio_configuration_set/audio_set_scenarios.json
index a28c6cd..448adca 100644
--- a/bluetooth/audio/utils/le_audio_configuration_set/audio_set_scenarios.json
+++ b/bluetooth/audio/utils/le_audio_configuration_set/audio_set_scenarios.json
@@ -8,251 +8,206 @@
{
"name": "Conversational",
"configurations": [
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_2",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_2",
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_1",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_1",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_2",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_2",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
- "DualDev_OneChanMonoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_48_4_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_48_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_48_3_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_48_1_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_32_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_32_1_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_24_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_24_1_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_16_1_Balanced_Reliability",
- "VND_SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32khz_Server_Prefered_1",
- "VND_SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32khz_60oct_R3_L22_1",
- "DualDev_OneChanMonoSnk_16_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSnk_16_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_16_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_16_2_Balanced_Reliability"
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_1",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_2",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_1",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_2",
+ "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_2",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_1",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_2",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "Two-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_48_4_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_48_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_48_3_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_48_1_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_32_1_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_24_1_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_16_1_Balanced_Reliability",
+ "VND_SingleDev_TwoChanStereoSnk_OneChanStereoSrc_32khz_60oct_R3_L22_1",
+ "Two-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability"
]
},
{
"name": "Media",
"configurations": [
- "DualDev_OneChanStereoSnk_48_4_High_Reliability",
- "DualDev_OneChanStereoSnk_48_4_2",
- "DualDev_OneChanStereoSnk_48_2_High_Reliability",
- "DualDev_OneChanStereoSnk_48_2_2",
- "DualDev_OneChanStereoSnk_48_3_High_Reliability",
- "DualDev_OneChanStereoSnk_48_3_2",
- "DualDev_OneChanStereoSnk_48_1_High_Reliability",
- "DualDev_OneChanStereoSnk_48_1_2",
- "DualDev_OneChanStereoSnk_24_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_24_2_2",
- "DualDev_OneChanStereoSnk_16_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_16_2_2",
- "DualDev_OneChanStereoSnk_16_1_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_16_1_2",
- "SingleDev_OneChanStereoSnk_48_4_High_Reliability",
- "SingleDev_OneChanStereoSnk_48_4_2",
- "SingleDev_OneChanStereoSnk_48_2_High_Reliability",
- "SingleDev_OneChanStereoSnk_48_2_2",
- "SingleDev_OneChanStereoSnk_48_3_High_Reliability",
- "SingleDev_OneChanStereoSnk_48_3_2",
- "SingleDev_OneChanStereoSnk_48_1_High_Reliability",
- "SingleDev_OneChanStereoSnk_48_1_2",
- "SingleDev_OneChanStereoSnk_24_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSnk_24_2_2",
- "SingleDev_OneChanStereoSnk_16_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSnk_16_2_2",
- "SingleDev_OneChanStereoSnk_16_1_Balanced_Reliability",
- "SingleDev_OneChanStereoSnk_16_1_2",
- "SingleDev_TwoChanStereoSnk_48_4_High_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_2",
- "SingleDev_TwoChanStereoSnk_48_4_High_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_2",
- "SingleDev_TwoChanStereoSnk_48_2_High_Reliability",
- "SingleDev_TwoChanStereoSnk_48_2_2",
- "SingleDev_TwoChanStereoSnk_48_3_High_Reliability",
- "SingleDev_TwoChanStereoSnk_48_3_2",
- "SingleDev_TwoChanStereoSnk_48_1_High_Reliability",
- "SingleDev_TwoChanStereoSnk_48_1_2",
- "SingleDev_TwoChanStereoSnk_24_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_24_2_2",
- "SingleDev_TwoChanStereoSnk_16_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_16_2_2",
- "SingleDev_TwoChanStereoSnk_16_1_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_16_1_2",
- "SingleDev_OneChanMonoSnk_48_4_High_Reliability",
- "SingleDev_OneChanMonoSnk_48_4_2",
- "SingleDev_OneChanMonoSnk_48_2_High_Reliability",
- "SingleDev_OneChanMonoSnk_48_2_2",
- "SingleDev_OneChanMonoSnk_48_3_High_Reliability",
- "SingleDev_OneChanMonoSnk_48_3_2",
- "SingleDev_OneChanMonoSnk_48_1_High_Reliability",
- "SingleDev_OneChanMonoSnk_48_1_2",
- "SingleDev_OneChanMonoSnk_32_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_32_2_2",
- "SingleDev_OneChanMonoSnk_32_1_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_32_1_2",
- "SingleDev_OneChanMonoSnk_24_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_24_2_2",
- "SingleDev_OneChanMonoSnk_16_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_16_2_2",
- "SingleDev_OneChanMonoSnk_16_1_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_16_1_2",
+ "Two-OneChan-SnkAse-Lc3_48_4_High_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_4_2",
+ "Two-OneChan-SnkAse-Lc3_48_2_High_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_2_2",
+ "Two-OneChan-SnkAse-Lc3_48_3_High_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_3_2",
+ "Two-OneChan-SnkAse-Lc3_48_1_High_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_1_2",
+ "Two-OneChan-SnkAse-Lc3_24_2_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_24_2_2",
+ "Two-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_16_2_2",
+ "Two-OneChan-SnkAse-Lc3_16_1_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_16_1_2",
+ "One-TwoChan-SnkAse-Lc3_48_4_High_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_4_2",
+ "One-TwoChan-SnkAse-Lc3_48_2_High_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_2_2",
+ "One-TwoChan-SnkAse-Lc3_48_3_High_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_3_2",
+ "One-TwoChan-SnkAse-Lc3_48_1_High_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_1_2",
+ "One-TwoChan-SnkAse-Lc3_24_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_24_2_2",
+ "One-TwoChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_16_2_2",
+ "One-TwoChan-SnkAse-Lc3_16_1_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_16_1_2",
+ "One-OneChan-SnkAse-Lc3_48_4_High_Reliability",
+ "One-OneChan-SnkAse-Lc3_48_4_2",
+ "One-OneChan-SnkAse-Lc3_48_2_High_Reliability",
+ "One-OneChan-SnkAse-Lc3_48_2_2",
+ "One-OneChan-SnkAse-Lc3_48_3_High_Reliability",
+ "One-OneChan-SnkAse-Lc3_48_3_2",
+ "One-OneChan-SnkAse-Lc3_48_1_High_Reliability",
+ "One-OneChan-SnkAse-Lc3_48_1_2",
+ "One-OneChan-SnkAse-Lc3_32_2_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_32_2_2",
+ "One-OneChan-SnkAse-Lc3_32_1_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_32_1_2",
+ "One-OneChan-SnkAse-Lc3_24_2_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_24_2_2",
+ "One-OneChan-SnkAse-Lc3_16_2_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_16_2_2",
+ "One-OneChan-SnkAse-Lc3_16_1_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_16_1_2",
"VND_DualDev_OneChanStereoSnk_48khz_100octs_High_Reliability_1",
"VND_DualDev_OneChanStereoSnk_48khz_100octs_R15_L70_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_100octs_High_Reliability_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_100octs_R15_L70_1",
"VND_SingleDev_OneChanStereoSnk_48khz_100octs_High_Reliability_1",
"VND_SingleDev_OneChanStereoSnk_48khz_100octs_R15_L70_1",
- "DualDev_OneChanMonoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_16_2_Balanced_Reliability"
+ "Two-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability"
]
},
{
"name": "Game",
"configurations": [
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2_Low_Latency",
+ "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_TwoChanStereoSrc_16khz_30octs_Balanced_Reliability_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_R5_L12_TwoChanStereoSrc_16khz_30octs_R3_L12_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_High_Reliability_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_R5_L12_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "DualDev_OneChanStereoSnk_48_2_Low_Latency",
- "DualDev_OneChanStereoSnk_48_3_Low_Latency",
- "DualDev_OneChanStereoSnk_48_1_Low_Latency",
- "DualDev_OneChanStereoSnk_32_2_Low_Latency",
- "DualDev_OneChanStereoSnk_32_1_Low_Latency",
- "DualDev_OneChanStereoSnk_24_2_Low_Latency",
- "DualDev_OneChanStereoSnk_24_1_Low_Latency",
- "DualDev_OneChanStereoSnk_16_2_Low_Latency",
- "DualDev_OneChanStereoSnk_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_48_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_48_3_Low_Latency",
- "SingleDev_TwoChanStereoSnk_48_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_32_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_24_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_24_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_16_1_Low_Latency",
- "SingleDev_OneChanStereoSnk_48_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_48_3_Low_Latency",
- "SingleDev_OneChanStereoSnk_48_1_Low_Latency",
- "SingleDev_OneChanStereoSnk_32_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_32_1_Low_Latency",
- "SingleDev_OneChanStereoSnk_24_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_24_1_Low_Latency",
- "SingleDev_OneChanStereoSnk_16_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_16_1_Low_Latency"
+ "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_48_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_48_3_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_48_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_32_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_24_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_24_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_48_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_48_3_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_48_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_24_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_24_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1_Low_Latency"
]
},
{
"name": "VoiceAssistants",
"configurations": [
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
- "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_16_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_24_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_32_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
- "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
- "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
- "DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_16_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_24_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_32_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
- "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability"
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_1",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_1",
+ "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2_Balanced_Reliability",
+ "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_1",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_4-Two-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "Two-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_4-One-TwoChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_24_2_Balanced_Reliability",
+ "One-OneChan-SnkAse-Lc3_48_4-One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability"
]
},
{
@@ -260,44 +215,44 @@
"configurations": [
"VND_SingleDev_TwoChanStereoSrc_48khz_100octs_Balanced_Reliability_1",
"VND_SingleDev_TwoChanStereoSrc_48khz_100octs_R11_L40_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Balanced_Reliability",
- "DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Balanced_Reliability",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
- "SingleDev_OneChanMonoSrc_48_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_48_1_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_32_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_32_1_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_16_2_Balanced_Reliability",
- "SingleDev_OneChanMonoSrc_16_1_Balanced_Reliability"
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-Two-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-Two-OneChan-SrcAse-Lc3_16_2_1",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1-Two-OneChan-SrcAse-Lc3_16_1_1",
+ "Two-TwoChan-SnkAse-Lc3_48_2-Two-TwoChan-SrcAse-Lc3_48_2_Balanced_Reliability",
+ "Two-TwoChan-SnkAse-Lc3_48_1-Two-TwoChan-SrcAse-Lc3_48_1_Balanced_Reliability",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-TwoChan-SrcAse-Lc3_32_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-TwoChan-SrcAse-Lc3_16_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-TwoChan-SrcAse-Lc3_16_1_1",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-TwoChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "Two-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "Two-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_32_2-One-OneChan-SrcAse-Lc3_32_2_1",
+ "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_2-One-OneChan-SrcAse-Lc3_16_2_1",
+ "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_Low_Latency",
+ "One-OneChan-SnkAse-Lc3_16_1-One-OneChan-SrcAse-Lc3_16_1_1",
+ "One-OneChan-SrcAse-Lc3_48_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_48_1_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_32_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_32_1_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_16_2_Balanced_Reliability",
+ "One-OneChan-SrcAse-Lc3_16_1_Balanced_Reliability"
]
}
]
diff --git a/broadcastradio/aidl/vts/Android.bp b/broadcastradio/aidl/vts/Android.bp
index 78c377d..9cfca42 100644
--- a/broadcastradio/aidl/vts/Android.bp
+++ b/broadcastradio/aidl/vts/Android.bp
@@ -44,4 +44,5 @@
"general-tests",
"vts",
],
+ disable_framework: true,
}
diff --git a/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl b/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl
index 24ae1a0..f5489d4 100644
--- a/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl
+++ b/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl
@@ -40,6 +40,9 @@
* as timestamp, and for a rolling shutter sensor, the value must be
* timestamp + exposureTime + t_crop_top where t_crop_top is the exposure time
* skew of the cropped lines on the top.
+ *
+ * If ANDROID_SENSOR_READOUT_TIMESTAMP is set to NOT_SUPPORTED, this field
+ * will be ignored by the camera framework.
*/
long readoutTimestamp;
}
diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp
index 1ad5af9..f905011 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.cpp
+++ b/camera/provider/aidl/vts/camera_aidl_test.cpp
@@ -456,6 +456,22 @@
return ret;
}
+bool CameraAidlTest::isReadoutTimestampSupported(const camera_metadata_t* staticMeta) {
+ camera_metadata_ro_entry readoutTimestampEntry;
+ int rc = find_camera_metadata_ro_entry(staticMeta, ANDROID_SENSOR_READOUT_TIMESTAMP,
+ &readoutTimestampEntry);
+ if (rc != 0) {
+ ALOGI("%s: Failed to find ANDROID_SENSOR_READOUT_TIMESTAMP", __FUNCTION__);
+ return true;
+ }
+ if (readoutTimestampEntry.count == 1 && !readoutTimestampEntry.data.u8[0]) {
+ ALOGI("%s: readout timestamp not supported", __FUNCTION__);
+ return false;
+ }
+ ALOGI("%s: readout timestamp supported", __FUNCTION__);
+ return true;
+}
+
void CameraAidlTest::verifyLogicalCameraResult(const camera_metadata_t* staticMetadata,
const std::vector<uint8_t>& resultMetadata) {
camera_metadata_t* metadata = (camera_metadata_t*)resultMetadata.data();
@@ -2383,13 +2399,13 @@
ASSERT_NE(inflightReq->resultOutputBuffers.size(), 0u);
ASSERT_EQ(testStream.id, inflightReq->resultOutputBuffers[0].buffer.streamId);
- // shutterReadoutTimestamp must be available, and it must
+ // shutterReadoutTimestamp, if supported, must
// be >= shutterTimestamp + exposureTime,
// and < shutterTimestamp + exposureTime + rollingShutterSkew / 2.
- ASSERT_TRUE(inflightReq->shutterReadoutTimestampValid);
ASSERT_FALSE(inflightReq->collectedResult.isEmpty());
- if (inflightReq->collectedResult.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
+ if (mSupportReadoutTimestamp &&
+ inflightReq->collectedResult.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
camera_metadata_entry_t exposureTimeResult =
inflightReq->collectedResult.find(ANDROID_SENSOR_EXPOSURE_TIME);
nsecs_t exposureToReadout =
@@ -2904,13 +2920,14 @@
ASSERT_FALSE(inflightReq->errorCodeValid);
ASSERT_NE(inflightReq->resultOutputBuffers.size(), 0u);
ASSERT_EQ(testStream.id, inflightReq->resultOutputBuffers[0].buffer.streamId);
- ASSERT_TRUE(inflightReq->shutterReadoutTimestampValid);
- nsecs_t readoutTimestamp = inflightReq->shutterReadoutTimestamp;
+ nsecs_t captureTimestamp = mSupportReadoutTimestamp
+ ? inflightReq->shutterReadoutTimestamp
+ : inflightReq->shutterTimestamp;
if (previewStabilizationOn) {
// Here we collect the time difference between the buffer ready
- // timestamp - notify readout timestamp.
- // timeLag = buffer ready timestamp - notify readout timestamp.
+ // timestamp - notify timestamp.
+ // timeLag = buffer ready timestamp - notify timestamp.
// timeLag(previewStabilization) must be <=
// timeLag(stabilization off) + 1 frame duration.
auto it = cameraDeviceToTimeLag.find(name);
@@ -2921,12 +2938,12 @@
ASSERT_TRUE(it != cameraDeviceToTimeLag.end());
nsecs_t previewStabOnLagTime =
- inflightReq->resultOutputBuffers[0].timeStamp - readoutTimestamp;
+ inflightReq->resultOutputBuffers[0].timeStamp - captureTimestamp;
ASSERT_TRUE(previewStabOnLagTime <= (it->second + frameDuration));
} else {
// Fill in the buffer ready timestamp - notify timestamp;
cameraDeviceToTimeLag[std::string(name)] =
- inflightReq->resultOutputBuffers[0].timeStamp - readoutTimestamp;
+ inflightReq->resultOutputBuffers[0].timeStamp - captureTimestamp;
}
}
diff --git a/camera/provider/aidl/vts/camera_aidl_test.h b/camera/provider/aidl/vts/camera_aidl_test.h
index 782794b..9edbf41 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.h
+++ b/camera/provider/aidl/vts/camera_aidl_test.h
@@ -346,6 +346,8 @@
static Status isOfflineSessionSupported(const camera_metadata_t* staticMeta);
+ static bool isReadoutTimestampSupported(const camera_metadata_t* staticMeta);
+
static Status getPhysicalCameraIds(const camera_metadata_t* staticMeta,
std::unordered_set<std::string>* physicalIds /*out*/);
@@ -456,8 +458,6 @@
struct InFlightRequest {
// Set by notify() SHUTTER call.
nsecs_t shutterTimestamp;
-
- bool shutterReadoutTimestampValid;
nsecs_t shutterReadoutTimestamp;
bool errorCodeValid;
@@ -523,7 +523,6 @@
InFlightRequest()
: shutterTimestamp(0),
- shutterReadoutTimestampValid(false),
shutterReadoutTimestamp(0),
errorCodeValid(false),
errorCode(ErrorCode::ERROR_BUFFER),
@@ -541,7 +540,6 @@
InFlightRequest(ssize_t numBuffers, bool hasInput, bool partialResults,
int32_t partialCount, std::shared_ptr<ResultMetadataQueue> queue = nullptr)
: shutterTimestamp(0),
- shutterReadoutTimestampValid(false),
shutterReadoutTimestamp(0),
errorCodeValid(false),
errorCode(ErrorCode::ERROR_BUFFER),
@@ -561,7 +559,6 @@
const std::unordered_set<std::string>& extraPhysicalResult,
std::shared_ptr<ResultMetadataQueue> queue = nullptr)
: shutterTimestamp(0),
- shutterReadoutTimestampValid(false),
shutterReadoutTimestamp(0),
errorCodeValid(false),
errorCode(ErrorCode::ERROR_BUFFER),
@@ -631,6 +628,8 @@
HandleImporter mHandleImporter;
+ bool mSupportReadoutTimestamp;
+
friend class DeviceCb;
friend class SimpleDeviceCb;
friend class TorchProviderCb;
diff --git a/camera/provider/aidl/vts/device_cb.cpp b/camera/provider/aidl/vts/device_cb.cpp
index 8a8b925..bfd1cd1 100644
--- a/camera/provider/aidl/vts/device_cb.cpp
+++ b/camera/provider/aidl/vts/device_cb.cpp
@@ -32,10 +32,11 @@
DeviceCb::DeviceCb(CameraAidlTest* parent, camera_metadata_t* staticMeta) : mParent(parent) {
mStaticMetadata = staticMeta;
+ parent->mSupportReadoutTimestamp = CameraAidlTest::isReadoutTimestampSupported(staticMeta);
}
ScopedAStatus DeviceCb::notify(const std::vector<NotifyMsg>& msgs) {
- std::vector<std::pair<bool, nsecs_t>> readoutTimestamps;
+ std::vector<nsecs_t> readoutTimestamps;
size_t count = msgs.size();
readoutTimestamps.resize(count);
@@ -44,11 +45,11 @@
const NotifyMsg& msg = msgs[i];
switch (msg.getTag()) {
case NotifyMsg::Tag::error:
- readoutTimestamps[i] = {false, 0};
+ readoutTimestamps[i] = 0;
break;
case NotifyMsg::Tag::shutter:
const auto& shutter = msg.get<NotifyMsg::Tag::shutter>();
- readoutTimestamps[i] = {true, shutter.readoutTimestamp};
+ readoutTimestamps[i] = shutter.readoutTimestamp;
break;
}
}
@@ -446,9 +447,8 @@
return notify;
}
-ScopedAStatus DeviceCb::notifyHelper(
- const std::vector<NotifyMsg>& msgs,
- const std::vector<std::pair<bool, nsecs_t>>& readoutTimestamps) {
+ScopedAStatus DeviceCb::notifyHelper(const std::vector<NotifyMsg>& msgs,
+ const std::vector<nsecs_t>& readoutTimestamps) {
std::lock_guard<std::mutex> l(mParent->mLock);
for (size_t i = 0; i < msgs.size(); i++) {
@@ -514,8 +514,7 @@
}
auto& r = itr->second;
r->shutterTimestamp = msg.get<NotifyMsg::Tag::shutter>().timestamp;
- r->shutterReadoutTimestampValid = readoutTimestamps[i].first;
- r->shutterReadoutTimestamp = readoutTimestamps[i].second;
+ r->shutterReadoutTimestamp = readoutTimestamps[i];
break;
}
}
diff --git a/camera/provider/aidl/vts/device_cb.h b/camera/provider/aidl/vts/device_cb.h
index 3ae7d10..d839ab4 100644
--- a/camera/provider/aidl/vts/device_cb.h
+++ b/camera/provider/aidl/vts/device_cb.h
@@ -60,7 +60,7 @@
bool processCaptureResultLocked(const CaptureResult& results,
std::vector<PhysicalCameraMetadata> physicalCameraMetadata);
ScopedAStatus notifyHelper(const std::vector<NotifyMsg>& msgs,
- const std::vector<std::pair<bool, nsecs_t>>& readoutTimestamps);
+ const std::vector<nsecs_t>& readoutTimestamps);
CameraAidlTest* mParent; // Parent object
diff --git a/cas/1.2/default/android.hardware.cas@1.2-service-lazy.xml b/cas/1.2/default/android.hardware.cas@1.2-service-lazy.xml
index 9b36406..87c9e02 100644
--- a/cas/1.2/default/android.hardware.cas@1.2-service-lazy.xml
+++ b/cas/1.2/default/android.hardware.cas@1.2-service-lazy.xml
@@ -1,5 +1,5 @@
<manifest version="1.0" type="device">
- <hal format="hidl">
+ <hal format="hidl" max-level="7">
<name>android.hardware.cas</name>
<transport>hwbinder</transport>
<version>1.2</version>
diff --git a/cas/1.2/default/android.hardware.cas@1.2-service.xml b/cas/1.2/default/android.hardware.cas@1.2-service.xml
index 9b36406..87c9e02 100644
--- a/cas/1.2/default/android.hardware.cas@1.2-service.xml
+++ b/cas/1.2/default/android.hardware.cas@1.2-service.xml
@@ -1,5 +1,5 @@
<manifest version="1.0" type="device">
- <hal format="hidl">
+ <hal format="hidl" max-level="7">
<name>android.hardware.cas</name>
<transport>hwbinder</transport>
<version>1.2</version>
diff --git a/common/aidl/Android.bp b/common/aidl/Android.bp
index 1f5742d..904a3d9 100644
--- a/common/aidl/Android.bp
+++ b/common/aidl/Android.bp
@@ -20,16 +20,18 @@
backend: {
java: {
sdk_version: "module_current",
+ apex_available: [
+ "//apex_available:anyapex",
+ "//apex_available:platform",
+ ],
},
cpp: {
enabled: false,
},
ndk: {
apex_available: [
+ "//apex_available:anyapex",
"//apex_available:platform",
- "com.android.btservices",
- "com.android.media.swcodec",
- "com.android.neuralnetworks",
],
min_sdk_version: "29",
},
diff --git a/common/fmq/aidl/Android.bp b/common/fmq/aidl/Android.bp
index 9c1b45d..4a3658e 100644
--- a/common/fmq/aidl/Android.bp
+++ b/common/fmq/aidl/Android.bp
@@ -35,8 +35,7 @@
ndk: {
apex_available: [
"//apex_available:platform",
- "com.android.btservices",
- "com.android.media.swcodec",
+ "//apex_available:anyapex",
],
min_sdk_version: "29",
},
diff --git a/common/support/Android.bp b/common/support/Android.bp
index 56700fa..aba5d6b 100644
--- a/common/support/Android.bp
+++ b/common/support/Android.bp
@@ -24,9 +24,8 @@
"libcutils",
],
apex_available: [
+ "//apex_available:anyapex",
"//apex_available:platform",
- "com.android.neuralnetworks",
- "com.android.media.swcodec",
],
min_sdk_version: "29",
}
diff --git a/compatibility_matrices/bump.py b/compatibility_matrices/bump.py
index a5a453b..35633c1 100755
--- a/compatibility_matrices/bump.py
+++ b/compatibility_matrices/bump.py
@@ -21,7 +21,7 @@
import argparse
import os
import pathlib
-import shutil
+import re
import subprocess
import textwrap
@@ -44,6 +44,7 @@
self.current_level = cmdline_args.current_level
self.current_letter = cmdline_args.current_letter
+ self.current_version = cmdline_args.platform_version
self.current_module_name = f"framework_compatibility_matrix.{self.current_level}.xml"
self.current_xml = self.interfaces_dir / f"compatibility_matrices/compatibility_matrix.{self.current_level}.xml"
self.device_module_name = "framework_compatibility_matrix.device.xml"
@@ -58,12 +59,13 @@
self.copy_matrix()
self.edit_android_bp()
self.edit_android_mk()
+ self.bump_libvintf()
def bump_kernel_configs(self):
check_call([
self.top / "kernel/configs/tools/bump.py",
- self.current_letter,
- self.next_letter,
+ self.current_letter.lower(),
+ self.next_letter.lower(),
])
def copy_matrix(self):
@@ -87,7 +89,7 @@
next_kernel_configs = check_output(
"""grep -rh name: | sed -E 's/^.*"(.*)".*/\\1/g'""",
cwd=self.top / "kernel/configs" /
- self.next_letter,
+ self.next_letter.lower(),
text=True,
shell=True,
).splitlines()
@@ -128,21 +130,69 @@
with open(android_mk, "w") as f:
f.write("".join(lines))
+ def bump_libvintf(self):
+ if not self.current_version:
+ print("Skip libvintf update...")
+ return
+ try:
+ check_call(["grep", "-h",
+ f"{self.current_letter.upper()} = {self.current_level}",
+ "system/libvintf/include/vintf/Level.h"])
+ except subprocess.CalledProcessError:
+ print("Adding new API level to libvintf")
+ add_lines_above("system/libvintf/analyze_matrix/analyze_matrix.cpp",
+ " case Level::UNSPECIFIED:",
+ textwrap.indent(textwrap.dedent(f"""\
+ case Level::{self.current_letter.upper()}:
+ return "Android {self.current_version} ({self.current_letter.upper()})";"""),
+ " "*2))
+ add_lines_above("system/libvintf/include/vintf/Level.h",
+ " // To add new values:",
+ f" {self.current_letter.upper()} = {self.current_level},")
+ add_lines_above("system/libvintf/include/vintf/Level.h",
+ " Level::UNSPECIFIED,",
+ f" Level::{self.current_letter.upper()},")
+ add_lines_above("system/libvintf/RuntimeInfo.cpp",
+ " // Add more levels above this line.",
+ textwrap.indent(textwrap.dedent(f"""\
+ case {self.current_version}: {{
+ ret = Level::{self.current_letter.upper()};
+ }} break;"""),
+ " "*3))
+
+
+def add_lines_above(file, pattern, lines):
+ with open(file, 'r+') as f:
+ text = f.read()
+ split_text = re.split(rf"\n{pattern}\n", text)
+ if len(split_text) != 2:
+ # Only one pattern must be found, otherwise the source must be
+ # changed unexpectedly.
+ raise Exception(
+ f'Pattern "{pattern}" not found or multiple patterns found in {file}')
+ f.seek(0)
+ f.write(f"\n{lines}\n{pattern}\n".join(split_text))
+ f.truncate()
+
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("current_level",
type=str,
- help="VINTF level of the current version (e.g. 9)")
+ help="VINTF level of the current version (e.g. 202404)")
parser.add_argument("next_level",
type=str,
- help="VINTF level of the next version (e.g. 10)")
+ help="VINTF level of the next version (e.g. 202504)")
parser.add_argument("current_letter",
type=str,
help="Letter of the API level of the current version (e.g. v)")
parser.add_argument("next_letter",
type=str,
help="Letter of the API level of the next version (e.g. w)")
+ parser.add_argument("platform_version",
+ type=str,
+ nargs="?",
+ help="Android release version number number (e.g. 15)")
cmdline_args = parser.parse_args()
Bump(cmdline_args).run()
diff --git a/compatibility_matrices/clear_vars.mk b/compatibility_matrices/clear_vars.mk
index 0e53885..3c62377 100644
--- a/compatibility_matrices/clear_vars.mk
+++ b/compatibility_matrices/clear_vars.mk
@@ -16,10 +16,6 @@
# Clear input variables to BUILD_FRAMEWORK_COMPATIBILITY_MATRIX
LOCAL_ADD_VBMETA_VERSION :=
-LOCAL_ADD_VBMETA_VERSION_OVERRIDE :=
LOCAL_ASSEMBLE_VINTF_ENV_VARS :=
-LOCAL_ASSEMBLE_VINTF_ENV_VARS_OVERRIDE :=
-LOCAL_ASSEMBLE_VINTF_ERROR_MESSAGE :=
LOCAL_ASSEMBLE_VINTF_FLAGS :=
-LOCAL_KERNEL_CONFIG_DATA_PATHS :=
LOCAL_GEN_FILE_DEPENDENCIES :=
diff --git a/compatibility_matrices/compatibility_matrix.202504.xml b/compatibility_matrices/compatibility_matrix.202504.xml
index 0e714a4..5f9d41f 100644
--- a/compatibility_matrices/compatibility_matrix.202504.xml
+++ b/compatibility_matrices/compatibility_matrix.202504.xml
@@ -1,7 +1,7 @@
<compatibility-matrix version="1.0" type="framework" level="202504">
<hal format="aidl">
<name>android.hardware.audio.core</name>
- <version>1-2</version>
+ <version>1-3</version>
<interface>
<name>IModule</name>
<instance>default</instance>
@@ -20,7 +20,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.audio.effect</name>
- <version>1-2</version>
+ <version>1-3</version>
<interface>
<name>IFactory</name>
<instance>default</instance>
@@ -28,7 +28,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.audio.sounddose</name>
- <version>1-2</version>
+ <version>1-3</version>
<interface>
<name>ISoundDoseFactory</name>
<instance>default</instance>
@@ -44,7 +44,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.automotive.audiocontrol</name>
- <version>2-4</version>
+ <version>2-5</version>
<interface>
<name>IAudioControl</name>
<instance>default</instance>
@@ -132,7 +132,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.bluetooth.audio</name>
- <version>3-4</version>
+ <version>3-5</version>
<interface>
<name>IBluetoothAudioProviderFactory</name>
<instance>default</instance>
@@ -372,6 +372,7 @@
</hal>
<hal format="aidl" updatable-via-apex="true">
<name>android.hardware.nfc</name>
+ <version>1-2</version>
<interface>
<name>INfc</name>
<instance>default</instance>
@@ -542,7 +543,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.soundtrigger3</name>
- <version>1-2</version>
+ <version>1-3</version>
<interface>
<name>ISoundTriggerHw</name>
<instance>default</instance>
diff --git a/compatibility_matrices/compatibility_matrix.mk b/compatibility_matrices/compatibility_matrix.mk
index d22e510..64cd645 100644
--- a/compatibility_matrices/compatibility_matrix.mk
+++ b/compatibility_matrices/compatibility_matrix.mk
@@ -29,11 +29,7 @@
# (corresponds to <avb><vbmeta-version> tag)
# LOCAL_ASSEMBLE_VINTF_ENV_VARS: Add a list of environment variable names from global variables in
# the build system that is lazily evaluated (e.g. PRODUCT_ENFORCE_VINTF_MANIFEST).
-# LOCAL_ASSEMBLE_VINTF_ENV_VARS_OVERRIDE: Add a list of environment variables that is local to
-# assemble_vintf invocation. Format is "VINTF_ENFORCE_NO_UNUSED_HALS=true".
# LOCAL_ASSEMBLE_VINTF_FLAGS: Add additional command line arguments to assemble_vintf invocation.
-# LOCAL_KERNEL_CONFIG_DATA_PATHS: Paths to search for kernel config requirements. Format for each is
-# <kernel version x.y.z>:<path that contains android-base*.config>.
# LOCAL_GEN_FILE_DEPENDENCIES: A list of additional dependencies for the generated file.
ifndef LOCAL_MODULE
@@ -64,15 +60,11 @@
ifeq (true,$(strip $(LOCAL_ADD_VBMETA_VERSION)))
ifeq (true,$(BOARD_AVB_ENABLE))
$(GEN): $(AVBTOOL)
-# INTERNAL_AVB_SYSTEM_SIGNING_ARGS consists of BOARD_AVB_SYSTEM_KEY_PATH and
-# BOARD_AVB_SYSTEM_ALGORITHM. We should add the dependency of key path, which
-# is a file, here.
$(GEN): $(BOARD_AVB_SYSTEM_KEY_PATH)
# Use deferred assignment (=) instead of immediate assignment (:=).
# Otherwise, cannot get INTERNAL_AVB_SYSTEM_SIGNING_ARGS.
$(GEN): FRAMEWORK_VBMETA_VERSION = $$("$(AVBTOOL)" add_hashtree_footer \
--print_required_libavb_version \
- $(INTERNAL_AVB_SYSTEM_SIGNING_ARGS) \
$(BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS))
else
$(GEN): FRAMEWORK_VBMETA_VERSION := 0.0
@@ -80,43 +72,17 @@
$(GEN): PRIVATE_ENV_VARS += FRAMEWORK_VBMETA_VERSION
endif # LOCAL_ADD_VBMETA_VERSION
-ifeq (true,$(strip $(LOCAL_ADD_VBMETA_VERSION_OVERRIDE)))
-ifneq ($(BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE),)
-$(GEN): FRAMEWORK_VBMETA_VERSION_OVERRIDE := $(BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE)
-$(GEN): PRIVATE_ENV_VARS += FRAMEWORK_VBMETA_VERSION_OVERRIDE
-endif
-endif
-
-ifneq (,$(strip $(LOCAL_KERNEL_CONFIG_DATA_PATHS)))
-$(GEN): PRIVATE_KERNEL_CONFIG_DATA_PATHS := $(LOCAL_KERNEL_CONFIG_DATA_PATHS)
-$(GEN): $(foreach pair,$(LOCAL_KERNEL_CONFIG_DATA_PATHS),\
- $(wildcard $(call word-colon,2,$(pair))/android-base*.config))
-$(GEN): PRIVATE_FLAGS += $(foreach pair,$(PRIVATE_KERNEL_CONFIG_DATA_PATHS),\
- --kernel=$(call word-colon,1,$(pair)):$(call normalize-path-list,\
- $(wildcard $(call word-colon,2,$(pair))/android-base*.config)))
-endif
-
my_matrix_src_files := \
$(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) \
$(LOCAL_GENERATED_SOURCES)
-$(GEN): PRIVATE_ADDITIONAL_ENV_VARS := $(LOCAL_ASSEMBLE_VINTF_ENV_VARS_OVERRIDE)
-
-ifneq (,$(strip $(LOCAL_ASSEMBLE_VINTF_ERROR_MESSAGE)))
-$(GEN): PRIVATE_COMMAND_TAIL := || (echo $(strip $(LOCAL_ASSEMBLE_VINTF_ERROR_MESSAGE)) && false)
-endif
-
$(GEN): PRIVATE_SRC_FILES := $(my_matrix_src_files)
$(GEN): $(my_matrix_src_files) $(HOST_OUT_EXECUTABLES)/assemble_vintf
- $(foreach varname,$(PRIVATE_ENV_VARS),\
- $(if $(findstring $(varname),$(PRIVATE_ADDITIONAL_ENV_VARS)),\
- $(error $(varname) should not be overridden by LOCAL_ASSEMBLE_VINTF_ENV_VARS_OVERRIDE.)))
$(foreach varname,$(PRIVATE_ENV_VARS),$(varname)="$($(varname))") \
- $(PRIVATE_ADDITIONAL_ENV_VARS) \
$(HOST_OUT_EXECUTABLES)/assemble_vintf \
-i $(call normalize-path-list,$(PRIVATE_SRC_FILES)) \
-o $@ \
- $(PRIVATE_FLAGS) $(PRIVATE_COMMAND_TAIL)
+ $(PRIVATE_FLAGS)
LOCAL_PREBUILT_MODULE_FILE := $(GEN)
LOCAL_SRC_FILES :=
diff --git a/compatibility_matrices/exclude/fcm_exclude.cpp b/compatibility_matrices/exclude/fcm_exclude.cpp
index 08ef49b..fca9e1c 100644
--- a/compatibility_matrices/exclude/fcm_exclude.cpp
+++ b/compatibility_matrices/exclude/fcm_exclude.cpp
@@ -164,6 +164,7 @@
// AIDL
"android.hardware.audio.core.sounddose@1",
"android.hardware.audio.core.sounddose@2",
+ "android.hardware.audio.core.sounddose@3",
// Deprecated HALs.
"android.hardware.bluetooth.audio@1",
diff --git a/graphics/common/aidl/Android.bp b/graphics/common/aidl/Android.bp
index 4f5c3d9..c28da4c 100644
--- a/graphics/common/aidl/Android.bp
+++ b/graphics/common/aidl/Android.bp
@@ -24,15 +24,18 @@
java: {
enabled: true,
platform_apis: true,
+ apex_available: [
+ "//apex_available:anyapex",
+ "//apex_available:platform",
+ ],
},
cpp: {
enabled: false,
},
ndk: {
apex_available: [
+ "//apex_available:anyapex",
"//apex_available:platform",
- "com.android.media.swcodec",
- "com.android.neuralnetworks",
],
min_sdk_version: "29",
},
diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
index ba15421..eaf23b5 100644
--- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
+++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_TargetTest.cpp
@@ -1845,7 +1845,7 @@
writer.setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 0.5f, -1.f);
execute();
const auto errors = mReader.takeErrors();
- EXPECT_EQ(1, errors.size());
+ ASSERT_EQ(1, errors.size());
EXPECT_EQ(IComposerClient::EX_UNSUPPORTED, errors[0].errorCode);
GTEST_SUCCEED() << "SetDisplayBrightness is not supported";
return;
diff --git a/health/2.1/default/Android.bp b/health/2.1/default/Android.bp
index b7bcea5..00d89e2 100644
--- a/health/2.1/default/Android.bp
+++ b/health/2.1/default/Android.bp
@@ -81,7 +81,7 @@
],
vintf_fragments: [
- "android.hardware.health@2.1.xml"
+ "android.hardware.health@2.1.xml",
],
overrides: [
diff --git a/health/utils/libhealthloop/Android.bp b/health/utils/libhealthloop/Android.bp
index 7aaf905..4ebc575 100644
--- a/health/utils/libhealthloop/Android.bp
+++ b/health/utils/libhealthloop/Android.bp
@@ -21,6 +21,17 @@
default_applicable_licenses: ["hardware_interfaces_license"],
}
+bpf {
+ name: "filterPowerSupplyEvents.o",
+ srcs: ["filterPowerSupplyEvents.c"],
+ // "vendor: true" because all binaries that use this BPF filter are vendor
+ // binaries.
+ vendor: true,
+}
+
+// Since "required" sections are ignored in static library definitions,
+// filterPowerSupplyEvents.o has been added in
+// build/make/target/product/base_vendor.mk.
cc_library_static {
name: "libhealthloop",
vendor_available: true,
@@ -30,10 +41,11 @@
"utils.cpp",
],
shared_libs: [
- "libcutils",
"libbase",
+ "libcutils",
],
header_libs: [
+ "bpf_headers",
"libbatteryservice_headers",
"libhealthd_headers",
"libutils_headers",
@@ -42,3 +54,30 @@
"include",
],
}
+
+genrule {
+ name: "filterPowerSupplyEvents.h",
+ out: ["filterPowerSupplyEvents.h"],
+ srcs: [":filterPowerSupplyEvents.o"],
+ cmd: "cat $(in) | od -v -tx1 | cut -c9- | grep -v '^$$' | sed 's/^/0x/;s/ /, 0x/g;s/^, //;s/$$/,/' > $(out)",
+}
+
+cc_test_host {
+ name: "filterPowerSupplyEventsTest",
+ team: "trendy_team_pixel_system_sw_storage",
+ srcs: [
+ "filterPowerSupplyEventsTest.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbpf",
+ ],
+ static_libs: [
+ "libgmock",
+ ],
+ generated_headers: [
+ "filterPowerSupplyEvents.h",
+ "libbpf_headers",
+ ],
+ compile_multilib: "64",
+}
diff --git a/health/utils/libhealthloop/HealthLoop.cpp b/health/utils/libhealthloop/HealthLoop.cpp
index 4190769..70b7745 100644
--- a/health/utils/libhealthloop/HealthLoop.cpp
+++ b/health/utils/libhealthloop/HealthLoop.cpp
@@ -20,23 +20,22 @@
#include <health/HealthLoop.h>
#include <errno.h>
-#include <libgen.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/epoll.h>
+#include <sys/epoll.h> // epoll_create1(), epoll_ctl(), epoll_wait()
#include <sys/timerfd.h>
-#include <unistd.h>
+#include <unistd.h> // read()
#include <android-base/logging.h>
#include <batteryservice/BatteryService.h>
-#include <cutils/klog.h>
+#include <cutils/klog.h> // KLOG_*()
#include <cutils/uevent.h>
#include <healthd/healthd.h>
-#include <utils/Errors.h>
+#include <BpfSyscallWrappers.h>
#include <health/utils.h>
+using android::base::ErrnoError;
+using android::base::Result;
+using android::base::unique_fd;
using namespace android;
using namespace std::chrono_literals;
@@ -57,19 +56,18 @@
int HealthLoop::RegisterEvent(int fd, BoundFunction func, EventWakeup wakeup) {
CHECK(!reject_event_register_);
- auto* event_handler =
- event_handlers_
- .emplace_back(std::make_unique<EventHandler>(EventHandler{this, fd, func}))
- .get();
+ auto* event_handler = event_handlers_
+ .emplace_back(std::make_unique<EventHandler>(
+ EventHandler{this, fd, std::move(func)}))
+ .get();
- struct epoll_event ev;
-
- ev.events = EPOLLIN;
+ struct epoll_event ev = {
+ .events = EPOLLIN | EPOLLERR,
+ .data.ptr = reinterpret_cast<void*>(event_handler),
+ };
if (wakeup == EVENT_WAKEUP_FD) ev.events |= EPOLLWAKEUP;
- ev.data.ptr = reinterpret_cast<void*>(event_handler);
-
if (epoll_ctl(epollfd_, EPOLL_CTL_ADD, fd, &ev) == -1) {
KLOG_ERROR(LOG_TAG, "epoll_ctl failed; errno=%d\n", errno);
return -1;
@@ -122,11 +120,16 @@
ScheduleBatteryUpdate();
}
-// TODO(b/140330870): Use BPF instead.
#define UEVENT_MSG_LEN 2048
-void HealthLoop::UeventEvent(uint32_t /*epevents*/) {
+void HealthLoop::UeventEvent(uint32_t epevents) {
// No need to lock because uevent_fd_ is guaranteed to be initialized.
+ if (epevents & EPOLLERR) {
+ // The netlink receive buffer overflowed.
+ ScheduleBatteryUpdate();
+ return;
+ }
+
char msg[UEVENT_MSG_LEN + 2];
char* cp;
int n;
@@ -152,8 +155,26 @@
}
}
+// Attach a BPF filter to the @uevent_fd file descriptor. This fails in recovery mode because BPF is
+// not supported in recovery mode. This fails for kernel versions 5.4 and before because the BPF
+// program is rejected by the BPF verifier of older kernels.
+Result<void> HealthLoop::AttachFilter(int uevent_fd) {
+ static const char prg[] =
+ "/sys/fs/bpf/vendor/prog_filterPowerSupplyEvents_skfilter_power_supply";
+ int filter_fd(bpf::retrieveProgram(prg));
+ if (filter_fd < 0) {
+ return ErrnoError() << "failed to load BPF program " << prg;
+ }
+ if (setsockopt(uevent_fd, SOL_SOCKET, SO_ATTACH_BPF, &filter_fd, sizeof(filter_fd)) < 0) {
+ close(filter_fd);
+ return ErrnoError() << "failed to attach BPF program";
+ }
+ close(filter_fd);
+ return {};
+}
+
void HealthLoop::UeventInit(void) {
- uevent_fd_.reset(uevent_open_socket(64 * 1024, true));
+ uevent_fd_.reset(uevent_create_socket(64 * 1024, true));
if (uevent_fd_ < 0) {
KLOG_ERROR(LOG_TAG, "uevent_init: uevent_open_socket failed\n");
@@ -161,8 +182,25 @@
}
fcntl(uevent_fd_, F_SETFL, O_NONBLOCK);
+
+ Result<void> attach_result = AttachFilter(uevent_fd_);
+ if (!attach_result.ok()) {
+ std::string error_msg = attach_result.error().message();
+ error_msg +=
+ ". This is expected in recovery mode and also for kernel versions before 5.10.";
+ KLOG_WARNING(LOG_TAG, "%s", error_msg.c_str());
+ } else {
+ KLOG_INFO(LOG_TAG, "Successfully attached the BPF filter to the uevent socket");
+ }
+
if (RegisterEvent(uevent_fd_, &HealthLoop::UeventEvent, EVENT_WAKEUP_FD))
KLOG_ERROR(LOG_TAG, "register for uevent events failed\n");
+
+ if (uevent_bind(uevent_fd_.get()) < 0) {
+ uevent_fd_.reset();
+ KLOG_ERROR(LOG_TAG, "uevent_init: binding socket failed\n");
+ return;
+ }
}
void HealthLoop::WakeAlarmEvent(uint32_t /*epevents*/) {
diff --git a/health/utils/libhealthloop/filterPowerSupplyEvents.c b/health/utils/libhealthloop/filterPowerSupplyEvents.c
new file mode 100644
index 0000000..5296993
--- /dev/null
+++ b/health/utils/libhealthloop/filterPowerSupplyEvents.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2024 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 <bpf_helpers.h> // load_word()
+#include <linux/bpf.h> // struct __sk_buff
+#include <linux/netlink.h> // struct nlmsghdr
+#include <stdint.h> // uint32_t
+
+// M4: match 4 bytes. Returns 0 if all bytes match.
+static inline uint32_t M4(struct __sk_buff* skb, unsigned int offset, uint8_t c0, uint8_t c1,
+ uint8_t c2, uint8_t c3) {
+ return load_word(skb, offset) ^ ((c0 << 24) | (c1 << 16) | (c2 << 8) | c3);
+}
+
+// M2: match 2 bytes. Returns 0 if all bytes match.
+static inline uint16_t M2(struct __sk_buff* skb, unsigned int offset, uint8_t c0, uint8_t c1) {
+ return load_half(skb, offset) ^ ((c0 << 8) | c1);
+}
+
+// M1: match 1 byte. Returns 0 in case of a match.
+static inline uint8_t M1(struct __sk_buff* skb, unsigned int offset, uint8_t c0) {
+ return load_byte(skb, offset) ^ c0;
+}
+
+// Match "\0SUBSYSTEM=". Returns 0 in case of a match.
+#define MATCH_SUBSYSTEM_LENGTH 11
+static inline uint32_t match_subsystem(struct __sk_buff* skb, unsigned int offset) {
+ return M4(skb, offset + 0, '\0', 'S', 'U', 'B') | M4(skb, offset + 4, 'S', 'Y', 'S', 'T') |
+ M2(skb, offset + 8, 'E', 'M') | M1(skb, offset + 10, '=');
+}
+
+// Match "power_supply\0". Returns 0 in case of a match.
+#define MATCH_POWER_SUPPLY_LENGTH 13
+static inline uint32_t match_power_supply(struct __sk_buff* skb, unsigned int offset) {
+ return M4(skb, offset + 0, 'p', 'o', 'w', 'e') | M4(skb, offset + 4, 'r', '_', 's', 'u') |
+ M4(skb, offset + 8, 'p', 'p', 'l', 'y') | M1(skb, offset + 12, '\0');
+}
+
+// The Linux kernel 5.4 BPF verifier rejects this program, probably because of its size. Hence the
+// restriction that the kernel version must be at least 5.10.
+DEFINE_BPF_PROG_KVER("skfilter/power_supply", AID_ROOT, AID_SYSTEM, filterPowerSupplyEvents,
+ KVER(5, 10, 0))
+(struct __sk_buff* skb) {
+ uint32_t i;
+
+ // The first character matched by match_subsystem() is a '\0'. Starting
+ // right past the netlink message header is fine since the SUBSYSTEM= text
+ // never occurs at the start. See also the kobject_uevent_env() implementation:
+ // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/kobject_uevent.c?#n473
+ // The upper bound of this loop has been chosen not to exceed the maximum
+ // number of instructions in a BPF program (BPF loops are unrolled).
+ for (i = sizeof(struct nlmsghdr); i < 256; ++i) {
+ if (i + MATCH_SUBSYSTEM_LENGTH > skb->len) {
+ break;
+ }
+ if (match_subsystem(skb, i) == 0) {
+ goto found_subsystem;
+ }
+ }
+
+ // The SUBSYSTEM= text has not been found in the bytes that have been
+ // examined: let the user space software perform filtering.
+ return skb->len;
+
+found_subsystem:
+ i += MATCH_SUBSYSTEM_LENGTH;
+ if (i + MATCH_POWER_SUPPLY_LENGTH <= skb->len && match_power_supply(skb, i) == 0) {
+ return skb->len;
+ }
+ return 0;
+}
+
+LICENSE("Apache 2.0");
+CRITICAL("healthd");
diff --git a/health/utils/libhealthloop/filterPowerSupplyEventsTest.cpp b/health/utils/libhealthloop/filterPowerSupplyEventsTest.cpp
new file mode 100644
index 0000000..e885f0b
--- /dev/null
+++ b/health/utils/libhealthloop/filterPowerSupplyEventsTest.cpp
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2024 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 <android-base/unique_fd.h>
+#include <bpf/libbpf.h>
+#include <gtest/gtest.h>
+#include <linux/bpf.h> // SO_ATTACH_BPF
+#include <linux/netlink.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <sys/socket.h>
+#include <string>
+#include <string_view>
+
+#define ASSERT_UNIX_OK(e) ASSERT_GE(e, 0) << strerror(errno)
+
+// TODO(bvanassche): remove the code below. See also b/357099095.
+#ifndef SO_ATTACH_BPF
+#define SO_ATTACH_BPF 50 // From <asm-generic/socket.h>.
+#endif
+
+using ::android::base::unique_fd;
+using ::testing::ScopedTrace;
+
+struct test_data {
+ bool discarded;
+ std::string_view str;
+};
+
+static const uint8_t binary_bpf_prog[] = {
+#include "filterPowerSupplyEvents.h"
+};
+
+static std::vector<std::unique_ptr<ScopedTrace>>* msg_vec;
+
+std::ostream& operator<<(std::ostream& os, const test_data& td) {
+ os << "{.discarded=" << td.discarded << ", .str=";
+ for (auto c : td.str) {
+ if (isprint(c)) {
+ os << c;
+ } else {
+ os << ".";
+ }
+ }
+ return os << '}';
+}
+
+#define RECORD_ERR_MSG(fmt, ...) \
+ do { \
+ char* str; \
+ if (asprintf(&str, fmt, ##__VA_ARGS__) < 0) break; \
+ auto st = std::make_unique<ScopedTrace>(__FILE__, __LINE__, str); \
+ msg_vec->emplace_back(std::move(st)); \
+ free(str); \
+ } while (0)
+
+int libbpf_print_fn(enum libbpf_print_level, const char* fmt, va_list args) {
+ char* str;
+ if (vasprintf(&str, fmt, args) < 0) {
+ return 0;
+ }
+ msg_vec->emplace_back(std::make_unique<ScopedTrace>(__FILE__, -1, str));
+ free(str);
+ return 0;
+}
+
+static void record_libbpf_output() {
+ libbpf_set_print(libbpf_print_fn);
+}
+
+class filterPseTest : public testing::TestWithParam<test_data> {};
+
+struct ConnectedSockets {
+ unique_fd write_fd;
+ unique_fd read_fd;
+};
+
+// socketpair() only supports AF_UNIX sockets. AF_UNIX sockets do not
+// support BPF filters. Hence connect two TCP sockets with each other.
+static ConnectedSockets ConnectSockets(int domain, int type, int protocol) {
+ int _server_fd = socket(domain, type, protocol);
+ if (_server_fd < 0) {
+ return {};
+ }
+ unique_fd server_fd(_server_fd);
+
+ int _write_fd = socket(domain, type, protocol);
+ if (_write_fd < 0) {
+ RECORD_ERR_MSG("socket: %s", strerror(errno));
+ return {};
+ }
+ unique_fd write_fd(_write_fd);
+
+ struct sockaddr_in sa = {.sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY};
+ if (bind(_server_fd, (const struct sockaddr*)&sa, sizeof(sa)) < 0) {
+ RECORD_ERR_MSG("bind: %s", strerror(errno));
+ return {};
+ }
+ if (listen(_server_fd, 1) < 0) {
+ RECORD_ERR_MSG("listen: %s", strerror(errno));
+ return {};
+ }
+ socklen_t addr_len = sizeof(sa);
+ if (getsockname(_server_fd, (struct sockaddr*)&sa, &addr_len) < 0) {
+ RECORD_ERR_MSG("getsockname: %s", strerror(errno));
+ return {};
+ }
+ errno = 0;
+ if (connect(_write_fd, (const struct sockaddr*)&sa, sizeof(sa)) < 0 && errno != EINPROGRESS) {
+ RECORD_ERR_MSG("connect: %s", strerror(errno));
+ return {};
+ }
+ int _read_fd = accept(_server_fd, NULL, NULL);
+ if (_read_fd < 0) {
+ RECORD_ERR_MSG("accept: %s", strerror(errno));
+ return {};
+ }
+ unique_fd read_fd(_read_fd);
+
+ return {.write_fd = std::move(write_fd), .read_fd = std::move(read_fd)};
+}
+
+TEST_P(filterPseTest, filterPse) {
+ if (getuid() != 0) {
+ GTEST_SKIP() << "Must be run as root.";
+ return;
+ }
+ if (!msg_vec) {
+ msg_vec = new typeof(*msg_vec);
+ }
+ std::unique_ptr<int, void (*)(int*)> clear_msg_vec_at_end_of_scope(new int, [](int* p) {
+ msg_vec->clear();
+ delete p;
+ });
+ record_libbpf_output();
+
+ auto connected_sockets = ConnectSockets(AF_INET, SOCK_STREAM, 0);
+ unique_fd write_fd = std::move(connected_sockets.write_fd);
+ unique_fd read_fd = std::move(connected_sockets.read_fd);
+
+ ASSERT_UNIX_OK(fcntl(read_fd, F_SETFL, O_NONBLOCK));
+
+ bpf_object* obj = bpf_object__open_mem(binary_bpf_prog, sizeof(binary_bpf_prog), NULL);
+ ASSERT_TRUE(obj) << "bpf_object__open() failed" << strerror(errno);
+
+ // Find the BPF program within the object.
+ bpf_program* prog = bpf_object__find_program_by_name(obj, "filterPowerSupplyEvents");
+ ASSERT_TRUE(prog);
+
+ ASSERT_UNIX_OK(bpf_program__set_type(prog, BPF_PROG_TYPE_SOCKET_FILTER));
+
+ ASSERT_UNIX_OK(bpf_object__load(obj));
+
+ int filter_fd = bpf_program__fd(prog);
+ ASSERT_UNIX_OK(filter_fd);
+
+ int setsockopt_result =
+ setsockopt(read_fd, SOL_SOCKET, SO_ATTACH_BPF, &filter_fd, sizeof(filter_fd));
+ ASSERT_UNIX_OK(setsockopt_result);
+
+ const test_data param = GetParam();
+ const std::string header(sizeof(struct nlmsghdr), '\0');
+ ASSERT_EQ(header.length(), sizeof(struct nlmsghdr));
+ const std::string data = header + std::string(param.str);
+ const size_t len = data.length();
+ std::cerr.write(data.data(), data.length());
+ std::cerr << ")\n";
+ ASSERT_EQ(write(write_fd, data.data(), len), len);
+ std::array<uint8_t, 512> read_buf;
+ int bytes_read = read(read_fd, read_buf.data(), read_buf.size());
+ if (bytes_read < 0) {
+ ASSERT_EQ(errno, EAGAIN);
+ bytes_read = 0;
+ } else {
+ ASSERT_LT(bytes_read, read_buf.size());
+ }
+ EXPECT_EQ(bytes_read, param.discarded ? 0 : len);
+
+ bpf_object__close(obj);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ filterPse, filterPseTest,
+ testing::Values(test_data{false, "a"},
+ test_data{true, std::string_view("abc\0SUBSYSTEM=block\0", 20)},
+ test_data{true, std::string_view("\0SUBSYSTEM=block", 16)},
+ test_data{true, std::string_view("\0SUBSYSTEM=power_supply", 23)},
+ test_data{false, std::string_view("\0SUBSYSTEM=power_supply\0", 24)},
+ test_data{
+ false,
+ "012345678901234567890123456789012345678901234567890123456789012345"
+ "678901234567890123456789012345678901234567890123456789012345678901"
+ "234567890123456789012345678901234567890123456789012345678901234567"
+ "890123456789012345678901234567890123456789\0SUBSYSTEM=block\0"}));
diff --git a/health/utils/libhealthloop/include/health/HealthLoop.h b/health/utils/libhealthloop/include/health/HealthLoop.h
index fc3066e..1af7274 100644
--- a/health/utils/libhealthloop/include/health/HealthLoop.h
+++ b/health/utils/libhealthloop/include/health/HealthLoop.h
@@ -20,6 +20,7 @@
#include <mutex>
#include <vector>
+#include <android-base/result.h>
#include <android-base/unique_fd.h>
#include <healthd/healthd.h>
@@ -87,6 +88,7 @@
};
int InitInternal();
+ static android::base::Result<void> AttachFilter(int uevent_fd);
void MainLoop();
void WakeAlarmInit();
void WakeAlarmEvent(uint32_t);
diff --git a/keymaster/3.0/default/Android.bp b/keymaster/3.0/default/Android.bp
new file mode 100644
index 0000000..4018cc0
--- /dev/null
+++ b/keymaster/3.0/default/Android.bp
@@ -0,0 +1,57 @@
+// Copyright (C) 2024 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.
+
+package {
+ // See: http://go/android-license-faq
+ default_applicable_licenses: [
+ "hardware_interfaces_license",
+ ],
+}
+
+cc_library_shared {
+ name: "android.hardware.keymaster@3.0-impl",
+ proprietary: true,
+ relative_install_path: "hw",
+ srcs: ["KeymasterDevice.cpp"],
+ shared_libs: [
+ "android.hardware.keymaster@3.0",
+ "libcrypto",
+ "libhardware",
+ "libhidlbase",
+ "libkeymaster_portable",
+ "libkeymaster3device",
+ "liblog",
+ "libpuresoftkeymasterdevice",
+ "libsoftkeymasterdevice",
+ "libutils",
+ ],
+}
+
+cc_binary {
+ name: "android.hardware.keymaster@3.0-service",
+ relative_install_path: "hw",
+ proprietary: true,
+ init_rc: ["android.hardware.keymaster@3.0-service.rc"],
+ srcs: ["service.cpp"],
+ shared_libs: [
+ "android.hardware.keymaster@3.0",
+ "libbase",
+ "libcutils",
+ "libdl",
+ "libhardware",
+ "libhidlbase",
+ "liblog",
+ "libutils",
+ ],
+}
diff --git a/keymaster/3.0/default/Android.mk b/keymaster/3.0/default/Android.mk
deleted file mode 100644
index 053ad67..0000000
--- a/keymaster/3.0/default/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android.hardware.keymaster@3.0-impl
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../NOTICE
-LOCAL_PROPRIETARY_MODULE := true
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_SRC_FILES := \
- KeymasterDevice.cpp \
-
-LOCAL_SHARED_LIBRARIES := \
- liblog \
- libsoftkeymasterdevice \
- libcrypto \
- libkeymaster_portable \
- libpuresoftkeymasterdevice \
- libkeymaster3device \
- libhidlbase \
- libutils \
- libhardware \
- android.hardware.keymaster@3.0
-
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_PROPRIETARY_MODULE := true
-LOCAL_MODULE := android.hardware.keymaster@3.0-service
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../NOTICE
-LOCAL_INIT_RC := android.hardware.keymaster@3.0-service.rc
-LOCAL_SRC_FILES := \
- service.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- liblog \
- libcutils \
- libdl \
- libbase \
- libutils \
- libhardware \
- libhidlbase \
- android.hardware.keymaster@3.0
-
-include $(BUILD_EXECUTABLE)
diff --git a/media/bufferpool/aidl/default/Accessor.cpp b/media/bufferpool/aidl/default/Accessor.cpp
index 423fd84..81e8eac 100644
--- a/media/bufferpool/aidl/default/Accessor.cpp
+++ b/media/bufferpool/aidl/default/Accessor.cpp
@@ -444,7 +444,7 @@
std::map<const std::weak_ptr<Accessor>, nsecs_t, std::owner_less<>> &accessors,
std::mutex &mutex,
std::condition_variable &cv) {
- std::list<const std::weak_ptr<Accessor>> evictList;
+ std::list<std::weak_ptr<Accessor>> evictList;
while (true) {
int expired = 0;
int evicted = 0;
diff --git a/memtrack/OWNERS b/memtrack/OWNERS
index a182ed9..8017da6 100644
--- a/memtrack/OWNERS
+++ b/memtrack/OWNERS
@@ -1,2 +1,3 @@
-# Bug component: 30545
-connoro@google.com
+# Bug component: 356484
+kaleshsingh@google.com
+surenb@google.com
diff --git a/neuralnetworks/1.2/utils/test/DeviceTest.cpp b/neuralnetworks/1.2/utils/test/DeviceTest.cpp
index 0d8c141..0e855c4 100644
--- a/neuralnetworks/1.2/utils/test/DeviceTest.cpp
+++ b/neuralnetworks/1.2/utils/test/DeviceTest.cpp
@@ -54,6 +54,10 @@
.execTime = std::numeric_limits<float>::max(),
.powerUsage = std::numeric_limits<float>::max()};
+// FIXME: This function causes Clang to hang indefinitely when building with
+// -O1. Turn off optimization as a temporary workaround.
+// http://b/296850773
+#pragma clang optimize off
template <typename... Args>
auto makeCallbackReturn(Args&&... args) {
return [argPack = std::make_tuple(std::forward<Args>(args)...)](const auto& cb) {
@@ -61,6 +65,7 @@
return Void();
};
}
+#pragma clang optimize on
sp<MockDevice> createMockDevice() {
const auto mockDevice = MockDevice::create();
diff --git a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
index 2fc9e65..6d4936b 100644
--- a/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
+++ b/nfc/1.0/vts/functional/VtsHalNfcV1_0TargetTest.cpp
@@ -108,7 +108,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
@@ -118,7 +118,7 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_RESET_RSP
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_GE(6ul, res.args->last_data_.size());
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
if (res.args->last_data_.size() == 6) {
@@ -127,7 +127,7 @@
EXPECT_EQ(4ul, res.args->last_data_.size());
nci_version = NCI_VERSION_2;
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
}
/*
@@ -137,14 +137,14 @@
EXPECT_EQ(NfcStatus::OK, nfc_->close());
// Wait for CLOSE_CPLT event
res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
@@ -153,7 +153,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->close());
// Wait for CLOSE_CPLT event
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
@@ -186,7 +186,7 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_RESET_RSP
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
/* The response/notification format for CORE_RESET_CMD differs
* with NCI 1.0 and 2.0. */
@@ -200,7 +200,7 @@
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
// Wait for CORE_RESET_NTF
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
// Check if reset trigger was due to CORE_RESET_CMD
EXPECT_LE(8ul, res.args->last_data_.size());
EXPECT_EQ(2ul, res.args->last_data_[3]);
@@ -221,7 +221,7 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_RESET_RSP
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
/* The response/notification format for CORE_RESET_CMD differs
* with NCI 1.0 and 2.0. */
@@ -235,7 +235,7 @@
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
// Wait for CORE_RESET_NTF
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
// Check if reset trigger was due to CORE_RESET_CMD
EXPECT_LE(8ul, res.args->last_data_.size());
EXPECT_EQ(2ul, res.args->last_data_[3]);
@@ -257,7 +257,7 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for RSP
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(4ul, res.args->last_data_.size());
EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
}
@@ -277,14 +277,14 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_RESET_RSP
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
/* NCI 2.0 sends CORE_RESET_NTF everytime. */
if (nci_version == NCI_VERSION_2) {
// Wait for CORE_RESET_NTF
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
cmd = CORE_INIT_CMD_NCI20;
} else {
cmd = CORE_INIT_CMD;
@@ -294,7 +294,7 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_INIT_RSP
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
// Send an Error Data Packet
cmd = INVALID_COMMAND;
@@ -307,7 +307,7 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for response with SYNTAX_ERROR
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(4ul, res.args->last_data_.size());
EXPECT_EQ(SYNTAX_ERROR, res.args->last_data_[3]);
}
@@ -317,7 +317,7 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_CONN_CREATE_RSP
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(7ul, res.args->last_data_.size());
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
}
@@ -335,14 +335,14 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_RESET_RSP
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
/* NCI 2.0 sends CORE_RESET_NTF everytime. */
if (nci_version == NCI_VERSION_2) {
// Wait for CORE_RESET_NTF
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
cmd = CORE_INIT_CMD_NCI20;
} else {
cmd = CORE_INIT_CMD;
@@ -352,15 +352,15 @@
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_INIT_RSP
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
cmd = CORE_CONN_CREATE_CMD;
data = cmd;
EXPECT_EQ(data.size(), nfc_->write(data));
// Wait for CORE_CONN_CREATE_RSP
res = nfc_cb_->WaitForCallback(kCallbackNameSendData);
- EXPECT_TRUE(res.no_timeout);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(7ul, res.args->last_data_.size());
EXPECT_EQ((int)NfcStatus::OK, res.args->last_data_[3]);
uint8_t conn_id = res.args->last_data_[6];
@@ -414,7 +414,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->powerCycle());
// Wait for NfcEvent.OPEN_CPLT
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
@@ -428,7 +428,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->close());
// Wait for CLOSE_CPLT event
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
@@ -437,7 +437,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
@@ -464,7 +464,7 @@
EXPECT_EQ(NfcStatus::OK, status);
// Wait for NfcEvent.POST_INIT_CPLT
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::POST_INIT_CPLT, res.args->last_event_);
}
}
@@ -487,7 +487,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->close());
// Wait for CLOSE_CPLT event
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
@@ -496,7 +496,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
@@ -518,7 +518,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->close());
// Wait for CLOSE_CPLT event
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
@@ -527,7 +527,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
@@ -541,7 +541,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->close());
// Wait for CLOSE_CPLT event
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::CLOSE_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
@@ -550,7 +550,7 @@
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
@@ -564,14 +564,14 @@
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
auto res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
EXPECT_EQ(NfcStatus::OK, nfc_->open(nfc_cb_));
// Wait for OPEN_CPLT event
res = nfc_cb_->WaitForCallback(kCallbackNameSendEvent);
- EXPECT_TRUE(res.no_timeout);
+ ASSERT_TRUE(res.no_timeout);
EXPECT_EQ(NfcEvent::OPEN_CPLT, res.args->last_event_);
EXPECT_EQ(NfcStatus::OK, res.args->last_status_);
}
diff --git a/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/INfc.aidl b/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/INfc.aidl
index 7a0ae54..220912e 100644
--- a/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/INfc.aidl
+++ b/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/INfc.aidl
@@ -44,4 +44,5 @@
int write(in byte[] data);
void setEnableVerboseLogging(in boolean enable);
boolean isVerboseLoggingEnabled();
+ android.hardware.nfc.NfcStatus controlGranted();
}
diff --git a/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/NfcEvent.aidl b/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/NfcEvent.aidl
index dda258e..aebe836 100644
--- a/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/NfcEvent.aidl
+++ b/nfc/aidl/aidl_api/android.hardware.nfc/current/android/hardware/nfc/NfcEvent.aidl
@@ -40,4 +40,6 @@
PRE_DISCOVER_CPLT = 3,
HCI_NETWORK_RESET = 4,
ERROR = 5,
+ REQUEST_CONTROL = 6,
+ RELEASE_CONTROL = 7,
}
diff --git a/nfc/aidl/android/hardware/nfc/INfc.aidl b/nfc/aidl/android/hardware/nfc/INfc.aidl
index 662f8d4..1d18b9e 100644
--- a/nfc/aidl/android/hardware/nfc/INfc.aidl
+++ b/nfc/aidl/android/hardware/nfc/INfc.aidl
@@ -140,4 +140,13 @@
* @return true if verbose logging flag value is enabled, false if disabled.
*/
boolean isVerboseLoggingEnabled();
+
+ /**
+ * Requests control of NFCC to libnfc-nci.
+ * If an API request is sent when the framework has no control of NFCC, the request will be
+ * queued until the control is released from HAL.
+ * The control will be taken out of the framework for at most 2 seconds.
+ * @return NfcStatus::OK on success and NfcStatus::FAILED on error.
+ */
+ NfcStatus controlGranted();
}
diff --git a/nfc/aidl/android/hardware/nfc/NfcEvent.aidl b/nfc/aidl/android/hardware/nfc/NfcEvent.aidl
index a78b1cd..7e0231a 100644
--- a/nfc/aidl/android/hardware/nfc/NfcEvent.aidl
+++ b/nfc/aidl/android/hardware/nfc/NfcEvent.aidl
@@ -50,4 +50,14 @@
* Error event to notify upper layer when there's an unknown error.
*/
ERROR = 5,
+ /**
+ * Request control event to notify upper layer when HAL
+ * request control of NFCC to libnfc-nci
+ */
+ REQUEST_CONTROL = 6,
+ /**
+ * Release control event to notify upper layer when HAL
+ * release control of NFCC to libnfc-nci.
+ */
+ RELEASE_CONTROL = 7,
}
diff --git a/nfc/aidl/vts/functional/Android.bp b/nfc/aidl/vts/functional/Android.bp
index d0b684b..82ce026 100644
--- a/nfc/aidl/vts/functional/Android.bp
+++ b/nfc/aidl/vts/functional/Android.bp
@@ -38,7 +38,7 @@
"libbinder_ndk",
],
static_libs: [
- "android.hardware.nfc-V1-ndk",
+ "android.hardware.nfc-V2-ndk",
],
test_suites: [
"general-tests",
@@ -71,7 +71,7 @@
"libstatssocket",
],
static_libs: [
- "android.hardware.nfc-V1-ndk",
+ "android.hardware.nfc-V2-ndk",
"android.hardware.nfc@1.0",
"android.hardware.nfc@1.1",
"android.hardware.nfc@1.2",
diff --git a/nfc/aidl/vts/functional/VtsAidlHalNfcTargetTest.cpp b/nfc/aidl/vts/functional/VtsAidlHalNfcTargetTest.cpp
index 977b25c..12f4364 100644
--- a/nfc/aidl/vts/functional/VtsAidlHalNfcTargetTest.cpp
+++ b/nfc/aidl/vts/functional/VtsAidlHalNfcTargetTest.cpp
@@ -440,6 +440,16 @@
EXPECT_TRUE(!enabled);
}
+TEST_P(NfcAidl, CheckControlGrantedStatus) {
+ int interface_version;
+ EXPECT_TRUE(infc_->getInterfaceVersion(&interface_version).isOk());
+ if (interface_version > 1) {
+ NfcStatus status;
+ EXPECT_TRUE(infc_->controlGranted(&status).isOk());
+ EXPECT_EQ(status, NfcStatus::OK);
+ }
+}
+
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NfcAidl);
INSTANTIATE_TEST_SUITE_P(Nfc, NfcAidl,
testing::ValuesIn(::android::getAidlHalInstanceNames(INfc::descriptor)),
diff --git a/radio/aidl/vts/radio_network_test.cpp b/radio/aidl/vts/radio_network_test.cpp
index b214401..ec2a29c 100644
--- a/radio/aidl/vts/radio_network_test.cpp
+++ b/radio/aidl/vts/radio_network_test.cpp
@@ -2494,24 +2494,27 @@
{RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
- // Assert the value has changed
- serial = GetRandomSerialNumber();
- ndk::ScopedAStatus res = radio_network->isCellularIdentifierTransparencyEnabled(serial);
+ if (radioRsp_network->rspInfo.error == RadioError::NONE) {
+ // Assert the value has changed
+ serial = GetRandomSerialNumber();
+ ndk::ScopedAStatus res = radio_network->isCellularIdentifierTransparencyEnabled(serial);
- ASSERT_OK(res);
- EXPECT_EQ(std::cv_status::no_timeout, wait());
- EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
- EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
- ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
- {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
- RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
- EXPECT_EQ(valueToSet, radioRsp_network->isCellularIdentifierTransparencyEnabled);
+ ASSERT_OK(res);
+ EXPECT_EQ(std::cv_status::no_timeout, wait());
+ EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
+ EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
+ ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
+ {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
+ RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
+ EXPECT_EQ(valueToSet, radioRsp_network->isCellularIdentifierTransparencyEnabled);
- // Reset original state
- radio_network->setCellularIdentifierTransparencyEnabled(serial, originalTransparencySetting);
- EXPECT_EQ(std::cv_status::no_timeout, wait());
- EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
- EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
+ // Reset original state
+ radio_network->setCellularIdentifierTransparencyEnabled(serial,
+ originalTransparencySetting);
+ EXPECT_EQ(std::cv_status::no_timeout, wait());
+ EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
+ EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
+ }
}
/*
@@ -2547,24 +2550,26 @@
{RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
- // Assert the value has changed
- serial = GetRandomSerialNumber();
- ndk::ScopedAStatus res = radio_network->isSecurityAlgorithmsUpdatedEnabled(serial);
+ if (radioRsp_network->rspInfo.error == RadioError::NONE) {
+ // Assert the value has changed
+ serial = GetRandomSerialNumber();
+ ndk::ScopedAStatus res = radio_network->isSecurityAlgorithmsUpdatedEnabled(serial);
- ASSERT_OK(res);
- EXPECT_EQ(std::cv_status::no_timeout, wait());
- EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
- EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
- ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
- {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
- RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
- EXPECT_EQ(valueToSet, radioRsp_network->isSecurityAlgorithmsUpdatedEnabled);
+ ASSERT_OK(res);
+ EXPECT_EQ(std::cv_status::no_timeout, wait());
+ EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
+ EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
+ ASSERT_TRUE(CheckAnyOfErrors(radioRsp_network->rspInfo.error,
+ {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
+ RadioError::MODEM_ERR, RadioError::REQUEST_NOT_SUPPORTED}));
+ EXPECT_EQ(valueToSet, radioRsp_network->isSecurityAlgorithmsUpdatedEnabled);
- // Reset original state
- radio_network->setSecurityAlgorithmsUpdatedEnabled(serial, originalSecuritySetting);
- EXPECT_EQ(std::cv_status::no_timeout, wait());
- EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
- EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
+ // Reset original state
+ radio_network->setSecurityAlgorithmsUpdatedEnabled(serial, originalSecuritySetting);
+ EXPECT_EQ(std::cv_status::no_timeout, wait());
+ EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_network->rspInfo.type);
+ EXPECT_EQ(serial, radioRsp_network->rspInfo.serial);
+ }
}
/**
diff --git a/radio/aidl/vts/radio_sim_test.cpp b/radio/aidl/vts/radio_sim_test.cpp
index 06654c2..e9b68cc 100644
--- a/radio/aidl/vts/radio_sim_test.cpp
+++ b/radio/aidl/vts/radio_sim_test.cpp
@@ -118,7 +118,14 @@
EXPECT_EQ(CardStatus::STATE_PRESENT, slotStatus.cardState);
if (CardStatus::STATE_PRESENT == slotStatus.cardState) {
ASSERT_TRUE(slotStatus.portInfo[0].portActive);
- EXPECT_EQ(0, cardStatus.slotMap.portId);
+ if (cardStatus.supportedMepMode == aidl::android::hardware::radio::config::
+ MultipleEnabledProfilesMode::MEP_A1 ||
+ cardStatus.supportedMepMode == aidl::android::hardware::radio::config::
+ MultipleEnabledProfilesMode::MEP_A2) {
+ EXPECT_EQ(1, cardStatus.slotMap.portId);
+ } else {
+ EXPECT_EQ(0, cardStatus.slotMap.portId);
+ }
}
}
}
diff --git a/security/keymint/aidl/vts/functional/AttestKeyTest.cpp b/security/keymint/aidl/vts/functional/AttestKeyTest.cpp
index 5106561..464883e 100644
--- a/security/keymint/aidl/vts/functional/AttestKeyTest.cpp
+++ b/security/keymint/aidl/vts/functional/AttestKeyTest.cpp
@@ -39,7 +39,9 @@
class AttestKeyTest : public KeyMintAidlTestBase {
public:
void SetUp() override {
- skipAttestKeyTestIfNeeded();
+ if (shouldSkipAttestKeyTest()) {
+ GTEST_SKIP() << "Test using ATTEST_KEY is not applicable on waivered device";
+ }
KeyMintAidlTestBase::SetUp();
}
};
@@ -251,7 +253,11 @@
.SetDefaultValidity(),
{} /* attestation signing key */, &attest_key.keyBlob,
&attest_key_characteristics, &attest_key_cert_chain);
- if (isRkpOnly() && result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
+ std::optional<bool> rkpOnly = isRkpOnly();
+ if (!rkpOnly.has_value()) {
+ GTEST_SKIP() << "Test not applicable because RKP-only status cannot be determined";
+ }
+ if (rkpOnly.value() && result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
GTEST_SKIP() << "RKP-only devices do not have a factory key";
}
ASSERT_EQ(ErrorCode::OK, result);
@@ -355,7 +361,8 @@
.Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
.SetDefaultValidity();
// In RKP-only systems, the first key cannot be attested due to lack of batch key
- if (!isRkpOnly() || i > 0) {
+ bool confirmedNotRkpOnly = !isRkpOnly().value_or(true);
+ if (confirmedNotRkpOnly || i > 0) {
auth_set_builder.AttestationChallenge("foo");
}
auto result = GenerateAttestKey(auth_set_builder, attest_key_opt, &key_blob_list[i],
@@ -363,7 +370,7 @@
ASSERT_EQ(ErrorCode::OK, result);
deleters.push_back(KeyBlobDeleter(keymint_, key_blob_list[i]));
- if (!isRkpOnly() || i > 0) {
+ if (confirmedNotRkpOnly || i > 0) {
AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics);
AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics);
ASSERT_GT(cert_chain_list[i].size(), 0);
@@ -386,7 +393,7 @@
}
EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_list[i]));
- EXPECT_GT(cert_chain_list[i].size(), i + (isRkpOnly() ? 0 : 1));
+ EXPECT_GT(cert_chain_list[i].size(), i + (confirmedNotRkpOnly ? 1 : 0));
verify_subject_and_serial(cert_chain_list[i][0], serial_int, subject, false);
}
}
@@ -432,7 +439,8 @@
.Authorization(TAG_NO_AUTH_REQUIRED)
.SetDefaultValidity();
// In RKP-only systems, the first key cannot be attested due to lack of batch key
- if (!isRkpOnly() || i > 0) {
+ bool confirmedNotRkpOnly = !isRkpOnly().value_or(true);
+ if (confirmedNotRkpOnly || i > 0) {
auth_set_builder.AttestationChallenge("foo");
}
auto result = GenerateAttestKey(auth_set_builder, attest_key_opt, &key_blob_list[i],
@@ -440,7 +448,7 @@
ASSERT_EQ(ErrorCode::OK, result);
deleters.push_back(KeyBlobDeleter(keymint_, key_blob_list[i]));
- if (!isRkpOnly() || i > 0) {
+ if (confirmedNotRkpOnly || i > 0) {
AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics);
AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics);
ASSERT_GT(cert_chain_list[i].size(), 0);
@@ -459,7 +467,7 @@
}
EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_list[i]));
- EXPECT_GT(cert_chain_list[i].size(), i + (isRkpOnly() ? 0 : 1));
+ EXPECT_GT(cert_chain_list[i].size(), i + (confirmedNotRkpOnly ? 1 : 0));
verify_subject_and_serial(cert_chain_list[i][0], serial_int, subject, false);
}
}
@@ -530,7 +538,8 @@
.Authorization(TAG_NO_AUTH_REQUIRED)
.SetDefaultValidity();
// In RKP-only systems, the first key cannot be attested due to lack of batch key
- if (!isRkpOnly() || i > 0) {
+ bool confirmedNotRkpOnly = !isRkpOnly().value_or(true);
+ if (confirmedNotRkpOnly || i > 0) {
auth_set_builder.AttestationChallenge("foo");
}
if ((i & 0x1) == 1) {
@@ -543,7 +552,7 @@
ASSERT_EQ(ErrorCode::OK, result);
deleters.push_back(KeyBlobDeleter(keymint_, key_blob_list[i]));
- if (!isRkpOnly() || i > 0) {
+ if (confirmedNotRkpOnly || i > 0) {
AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics);
AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics);
ASSERT_GT(cert_chain_list[i].size(), 0);
@@ -566,7 +575,7 @@
}
EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_list[i]));
- EXPECT_GT(cert_chain_list[i].size(), i + (isRkpOnly() ? 0 : 1));
+ EXPECT_GT(cert_chain_list[i].size(), i + (confirmedNotRkpOnly ? 1 : 0));
verify_subject_and_serial(cert_chain_list[i][0], serial_int, subject, false);
}
}
diff --git a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp
index cef8120..2ba75a3 100644
--- a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp
+++ b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.cpp
@@ -250,7 +250,13 @@
return AidlVersion() >= 3 && property_get_int32("ro.vendor.api_level", 0) > __ANDROID_API_T__;
}
-bool KeyMintAidlTestBase::isRkpOnly() {
+std::optional<bool> KeyMintAidlTestBase::isRkpOnly() {
+ // GSI replaces the values for remote_prov_prop properties (since they’re system_internal_prop
+ // properties), so on GSI the properties are not reliable indicators of whether StrongBox/TEE is
+ // RKP-only or not.
+ if (is_gsi_image()) {
+ return std::nullopt;
+ }
if (SecLevel() == SecurityLevel::STRONGBOX) {
return property_get_bool("remote_provisioning.strongbox.rkp_only", false);
}
@@ -318,8 +324,11 @@
vector<Certificate> attest_cert_chain;
// If an attestation is requested, but the system is RKP-only, we need to supply an explicit
// attestation key. Else the result is a key without an attestation.
- if (isRkpOnly() && key_desc.Contains(TAG_ATTESTATION_CHALLENGE)) {
- skipAttestKeyTestIfNeeded();
+ // If the RKP-only value is undeterminable (i.e., when running on GSI), generate and use the
+ // attest key anyways. In the case that using an attest key is not supported
+ // (shouldSkipAttestKeyTest), assume the device has factory keys (so not RKP-only).
+ if (isRkpOnly().value_or(true) && key_desc.Contains(TAG_ATTESTATION_CHALLENGE) &&
+ !shouldSkipAttestKeyTest()) {
AuthorizationSet attest_key_desc =
AuthorizationSetBuilder().EcdsaKey(EcCurve::P_256).AttestKey().SetDefaultValidity();
attest_key.emplace();
@@ -1677,14 +1686,6 @@
is_attest_key_feature_disabled());
}
-// Skip a test that involves use of the ATTEST_KEY feature in specific configurations
-// where ATTEST_KEY is not supported (for either StrongBox or TEE).
-void KeyMintAidlTestBase::skipAttestKeyTestIfNeeded() const {
- if (shouldSkipAttestKeyTest()) {
- GTEST_SKIP() << "Test using ATTEST_KEY is not applicable on waivered device";
- }
-}
-
void verify_serial(X509* cert, const uint64_t expected_serial) {
BIGNUM_Ptr ser(BN_new());
EXPECT_TRUE(ASN1_INTEGER_to_BN(X509_get_serialNumber(cert), ser.get()));
diff --git a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h
index 1bf2d9d..0368bba 100644
--- a/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h
+++ b/security/keymint/aidl/vts/functional/KeyMintAidlTestBase.h
@@ -104,7 +104,7 @@
uint32_t boot_patch_level();
bool isDeviceIdAttestationRequired();
bool isSecondImeiIdAttestationRequired();
- bool isRkpOnly();
+ std::optional<bool> isRkpOnly();
bool Curve25519Supported();
@@ -356,7 +356,6 @@
bool is_strongbox_enabled(void) const;
bool is_chipset_allowed_km4_strongbox(void) const;
bool shouldSkipAttestKeyTest(void) const;
- void skipAttestKeyTestIfNeeded() const;
void assert_mgf_digests_present_or_not_in_key_characteristics(
const vector<KeyCharacteristics>& key_characteristics,
diff --git a/security/keymint/support/fuzzer/Android.bp b/security/keymint/support/fuzzer/Android.bp
index 1b1a580..a3ceb91 100644
--- a/security/keymint/support/fuzzer/Android.bp
+++ b/security/keymint/support/fuzzer/Android.bp
@@ -46,6 +46,35 @@
"hardware/interfaces/security/keymint/support/include",
"frameworks/native/libs/binder/ndk/include_platform",
],
+ fuzz_config: {
+ cc: [
+ "android-hardware-security@google.com",
+ ],
+ componentid: 1084733,
+ hotlists: [
+ "4593311",
+ "4271696",
+ ],
+ description: "The fuzzer targets the APIs of libkeymint_support",
+ vector: "local_no_privileges_required",
+ service_privilege: "privileged",
+ users: "multi_user",
+ fuzzed_code_usage: "shipped",
+ },
+}
+
+cc_defaults {
+ name: "keymint_remote_fuzzer_defaults",
+ static_libs: [
+ "libkeymint_remote_prov_support",
+ "android.hardware.security.rkp-V3-ndk",
+ ],
+ shared_libs: [
+ "libcppbor",
+ "libcppcose_rkp",
+ "libjsoncpp",
+ "libkeymaster_portable",
+ ],
}
cc_fuzz {
@@ -67,3 +96,25 @@
"keymint_fuzzer_defaults",
],
}
+
+cc_fuzz {
+ name: "keymint_remote_prov_fuzzer",
+ srcs: [
+ "keymint_remote_prov_fuzzer.cpp",
+ ],
+ defaults: [
+ "keymint_fuzzer_defaults",
+ "keymint_remote_fuzzer_defaults",
+ ],
+}
+
+cc_fuzz {
+ name: "keymint_rkpsupport_fuzzer",
+ srcs: [
+ "keymint_rkpsupport_fuzzer.cpp",
+ ],
+ defaults: [
+ "keymint_fuzzer_defaults",
+ "keymint_remote_fuzzer_defaults",
+ ],
+}
diff --git a/security/keymint/support/fuzzer/README.md b/security/keymint/support/fuzzer/README.md
index d41af08..4cf6927 100644
--- a/security/keymint/support/fuzzer/README.md
+++ b/security/keymint/support/fuzzer/README.md
@@ -12,6 +12,8 @@
## Table of contents
+ [keymint_attestation_fuzzer](#KeyMintAttestation)
+ [keymint_authSet_fuzzer](#KeyMintAuthSet)
++ [keymint_remote_prov_fuzzer](#KeyMintRemoteProv)
++ [keymint_rkpsupport_fuzzer](#KeyMintRemoteKeyProvSupport)
# <a name="KeyMintAttestation"></a> Fuzzer for KeyMintAttestation
KeyMintAttestation supports the following parameters:
@@ -77,3 +79,53 @@
$ adb sync data
$ adb shell /data/fuzz/arm64/keymint_authSet_fuzzer/keymint_authSet_fuzzer
```
+
+# <a name="KeyMintRemoteProv"></a> Fuzzer for KeyMintRemoteProv
+KeyMintRemoteProv supports the following parameters:
+1. ChallengeSize(parameter name: "challengeSize")
+2. Challenge(parameter name: "challenge")
+3. NumKeys(parameter name: "numKeys")
+
+| Parameter| Valid Values| Configured Value|
+|------------- |--------------| -------------------- |
+|`challengeSize`| `uint8_t` |Value obtained from FuzzedDataProvider|
+|`challenge`| `std::vector<uint8_t>` |Value obtained from FuzzedDataProvider|
+|`numKeys`| `uint8_t` |Value obtained from FuzzedDataProvider|
+
+#### Steps to run
+1. Build the fuzzer
+```
+$ mm -j$(nproc) keymint_remote_prov_fuzzer
+```
+2. Run on device
+```
+$ adb sync data
+$ adb shell /data/fuzz/arm64/keymint_remote_prov_fuzzer/keymint_remote_prov_fuzzer
+```
+
+# <a name="KeyMintRemoteKeyProvSupport"></a> Fuzzer for KeyMintRemoteKeyProvSupport
+KeyMintRemoteKeyProvSupport supports the following parameters:
+1. SupportedEekCurve(parameter name: "supportedEekCurve")
+2. Length(parameter name: "length")
+3. SerialNumberProp(parameter name: "serialNoProp")
+4. InstanceName(parameter name: "instanceName")
+5. Value(parameter name: "value")
+
+| Parameter| Valid Values| Configured Value|
+|------------- |--------------| -------------------- |
+|`supportedEekCurve`| `uint8_t` |Value obtained from FuzzedDataProvider|
+|`length`| `uint8_t` |Value obtained from FuzzedDataProvider|
+|`serialNoProp`| `string` |Value obtained from FuzzedDataProvider|
+|`instanceName`| `string` |Value obtained from FuzzedDataProvider|
+|`value`| `uint8_t` |Value obtained from FuzzedDataProvider|
+
+#### Steps to run
+1. Build the fuzzer
+```
+$ mm -j$(nproc) keymint_rkpsupport_fuzzer
+```
+2. Run on device
+```
+$ adb sync data
+$ adb shell /data/fuzz/arm64/keymint_rkpsupport_fuzzer/keymint_rkpsupport_fuzzer
+```
diff --git a/security/keymint/support/fuzzer/keymint_attestation_fuzzer.cpp b/security/keymint/support/fuzzer/keymint_attestation_fuzzer.cpp
index bd781ac..1757997 100644
--- a/security/keymint/support/fuzzer/keymint_attestation_fuzzer.cpp
+++ b/security/keymint/support/fuzzer/keymint_attestation_fuzzer.cpp
@@ -151,7 +151,7 @@
extern "C" int LLVMFuzzerInitialize(int /* *argc */, char /* ***argv */) {
::ndk::SpAIBinder binder(AServiceManager_waitForService(kServiceName.c_str()));
- gKeyMint = std::move(IKeyMintDevice::fromBinder(binder));
+ gKeyMint = IKeyMintDevice::fromBinder(binder);
LOG_ALWAYS_FATAL_IF(!gKeyMint, "Failed to get IKeyMintDevice instance.");
return 0;
}
diff --git a/security/keymint/support/fuzzer/keymint_remote_prov_fuzzer.cpp b/security/keymint/support/fuzzer/keymint_remote_prov_fuzzer.cpp
new file mode 100644
index 0000000..6bd986c
--- /dev/null
+++ b/security/keymint/support/fuzzer/keymint_remote_prov_fuzzer.cpp
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2024 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 <android/binder_manager.h>
+#include <fuzzer/FuzzedDataProvider.h>
+#include <remote_prov/remote_prov_utils.h>
+#include <utils/Log.h>
+
+namespace android::hardware::security::keymint_support::fuzzer {
+
+using namespace cppcose;
+using namespace aidl::android::hardware::security::keymint;
+using namespace aidl::android::hardware::security::keymint::remote_prov;
+
+constexpr size_t kMinSize = 0;
+constexpr size_t kSupportedNumKeys = 4;
+constexpr size_t kChallengeSize = 64;
+constexpr size_t kMaxBytes = 128;
+const std::string kServiceName =
+ "android.hardware.security.keymint.IRemotelyProvisionedComponent/default";
+
+std::shared_ptr<IRemotelyProvisionedComponent> gRPC = nullptr;
+
+class KeyMintRemoteProv {
+ public:
+ KeyMintRemoteProv(const uint8_t* data, size_t size) : mFdp(data, size){};
+ void process();
+
+ private:
+ std::vector<uint8_t> ExtractPayloadValue(const MacedPublicKey& macedPubKey);
+ FuzzedDataProvider mFdp;
+};
+
+std::vector<uint8_t> KeyMintRemoteProv::ExtractPayloadValue(const MacedPublicKey& macedPubKey) {
+ std::vector<uint8_t> payloadValue;
+
+ auto [coseMac0, _, mac0ParseErr] = cppbor::parse(macedPubKey.macedKey);
+ if (coseMac0) {
+ // The payload is a bstr holding an encoded COSE_Key
+ auto payload = coseMac0->asArray()->get(kCoseMac0Payload)->asBstr();
+ if (payload != nullptr) {
+ payloadValue = payload->value();
+ }
+ }
+ return payloadValue;
+}
+
+void KeyMintRemoteProv::process() {
+ std::vector<MacedPublicKey> keysToSign = std::vector<MacedPublicKey>(
+ mFdp.ConsumeIntegralInRange<uint8_t>(kMinSize, kSupportedNumKeys));
+ cppbor::Array cborKeysToSign;
+ for (auto& key : keysToSign) {
+ // TODO: b/350649166 - Randomize keysToSign
+ std::vector<uint8_t> privateKeyBlob;
+ gRPC->generateEcdsaP256KeyPair(false /* testMode */, &key, &privateKeyBlob);
+
+ std::vector<uint8_t> payloadValue = ExtractPayloadValue(key);
+ cborKeysToSign.add(cppbor::EncodedItem(payloadValue));
+ }
+
+ uint8_t challengeSize = mFdp.ConsumeIntegralInRange<uint8_t>(kMinSize, kChallengeSize);
+ std::vector<uint8_t> challenge = mFdp.ConsumeBytes<uint8_t>(challengeSize);
+
+ std::vector<uint8_t> csr;
+ gRPC->generateCertificateRequestV2(keysToSign, challenge, &csr);
+
+ while (mFdp.remaining_bytes()) {
+ auto invokeProvAPI = mFdp.PickValueInArray<const std::function<void()>>({
+ [&]() { verifyFactoryCsr(cborKeysToSign, csr, gRPC.get(), challenge); },
+ [&]() { verifyProductionCsr(cborKeysToSign, csr, gRPC.get(), challenge); },
+ [&]() { isCsrWithProperDiceChain(csr); },
+ });
+ invokeProvAPI();
+ }
+}
+
+extern "C" int LLVMFuzzerInitialize(int /* *argc */, char /* ***argv */) {
+ ::ndk::SpAIBinder binder(AServiceManager_waitForService(kServiceName.c_str()));
+ gRPC = IRemotelyProvisionedComponent::fromBinder(binder);
+ LOG_ALWAYS_FATAL_IF(!gRPC, "Failed to get IRemotelyProvisionedComponent instance.");
+ return 0;
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ KeyMintRemoteProv kmRemoteProv(data, size);
+ kmRemoteProv.process();
+ return 0;
+}
+
+} // namespace android::hardware::security::keymint_support::fuzzer
diff --git a/security/keymint/support/fuzzer/keymint_rkpsupport_fuzzer.cpp b/security/keymint/support/fuzzer/keymint_rkpsupport_fuzzer.cpp
new file mode 100644
index 0000000..778d48f
--- /dev/null
+++ b/security/keymint/support/fuzzer/keymint_rkpsupport_fuzzer.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2024 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 <fuzzer/FuzzedDataProvider.h>
+#include <remote_prov/remote_prov_utils.h>
+
+namespace android::hardware::security::keymint_support::fuzzer {
+
+using namespace aidl::android::hardware::security::keymint::remote_prov;
+
+constexpr size_t kMaxBytes = 128;
+
+class KeyMintRemoteKeyProvSupport {
+ public:
+ KeyMintRemoteKeyProvSupport(const uint8_t* data, size_t size) : mFdp(data, size) {}
+ void process();
+
+ private:
+ FuzzedDataProvider mFdp;
+};
+
+void KeyMintRemoteKeyProvSupport::process() {
+ while (mFdp.remaining_bytes()) {
+ auto invokeProvAPI = mFdp.PickValueInArray<const std::function<void()>>({
+ [&]() {
+ std::vector<uint8_t> eekId;
+ if (mFdp.ConsumeBool()) {
+ eekId = mFdp.ConsumeBytes<uint8_t>(kMaxBytes);
+ }
+ generateEekChain(mFdp.ConsumeIntegral<uint8_t>() /* supportedEekCurve */,
+ mFdp.ConsumeIntegral<uint8_t>() /* length */, eekId);
+ },
+ [&]() { getProdEekChain(mFdp.ConsumeIntegral<uint8_t>() /* supportedEekCurve */); },
+ [&]() {
+ std::string serialNoProp = mFdp.ConsumeRandomLengthString(kMaxBytes);
+ std::string instanceName = mFdp.ConsumeRandomLengthString(kMaxBytes);
+ cppbor::Array array;
+ array.add(mFdp.ConsumeIntegral<uint8_t>() /* value */);
+ jsonEncodeCsrWithBuild(instanceName, array, serialNoProp);
+ },
+ });
+ invokeProvAPI();
+ }
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ KeyMintRemoteKeyProvSupport keymintRKPSupport(data, size);
+ keymintRKPSupport.process();
+ return 0;
+}
+
+} // namespace android::hardware::security::keymint_support::fuzzer
diff --git a/security/keymint/support/remote_prov_utils.cpp b/security/keymint/support/remote_prov_utils.cpp
index b74fd59..6638775 100644
--- a/security/keymint/support/remote_prov_utils.cpp
+++ b/security/keymint/support/remote_prov_utils.cpp
@@ -65,9 +65,9 @@
return privKey;
}
-ErrMsgOr<bytevec> ecKeyGetPublicKey(const EC_KEY* ecKey) {
+ErrMsgOr<bytevec> ecKeyGetPublicKey(const EC_KEY* ecKey, const int nid) {
// Extract public key.
- auto group = EC_GROUP_Ptr(EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1));
+ auto group = EC_GROUP_Ptr(EC_GROUP_new_by_curve_name(nid));
if (group.get() == nullptr) {
return "Error creating EC group by curve name";
}
@@ -123,11 +123,12 @@
int keyType = EVP_PKEY_base_id(pubKey.get());
switch (keyType) {
case EVP_PKEY_EC: {
+ int nid = EVP_PKEY_bits(pubKey.get()) == 384 ? NID_secp384r1 : NID_X9_62_prime256v1;
auto ecKey = EC_KEY_Ptr(EVP_PKEY_get1_EC_KEY(pubKey.get()));
if (ecKey.get() == nullptr) {
return "Failed to get ec key";
- }
- return ecKeyGetPublicKey(ecKey.get());
+ }
+ return ecKeyGetPublicKey(ecKey.get(), nid);
}
case EVP_PKEY_ED25519: {
bytevec rawPubKey;
@@ -165,7 +166,7 @@
auto privKey = ecKeyGetPrivateKey(ec_key.get());
if (!privKey) return privKey.moveMessage();
- auto pubKey = ecKeyGetPublicKey(ec_key.get());
+ auto pubKey = ecKeyGetPublicKey(ec_key.get(), NID_X9_62_prime256v1);
if (!pubKey) return pubKey.moveMessage();
return std::make_tuple(pubKey.moveValue(), privKey.moveValue());
@@ -824,7 +825,7 @@
}
if (i == chain.size() - 1) {
auto key = getRawPublicKey(pubKey);
- if (!key) key.moveMessage();
+ if (!key) return key.moveMessage();
rawPubKey = key.moveValue();
}
}
diff --git a/security/rkp/aidl/android/hardware/security/keymint/generateCertificateRequestV2.cddl b/security/rkp/aidl/android/hardware/security/keymint/generateCertificateRequestV2.cddl
index 3c43238..40cf685 100644
--- a/security/rkp/aidl/android/hardware/security/keymint/generateCertificateRequestV2.cddl
+++ b/security/rkp/aidl/android/hardware/security/keymint/generateCertificateRequestV2.cddl
@@ -62,9 +62,13 @@
SignerName = tstr
UdsCertChain = [
- 2* X509Certificate ; Root -> ... -> Leaf. "Root" is the vendor self-signed
- ; cert, "Leaf" contains UDS_Public. There may also be
- ; intermediate certificates between Root and Leaf.
+ + X509Certificate ; Root -> ... -> Leaf. "Root" is the vendor self-signed
+ ; cert, "Leaf" contains UDS_Public. It's recommended to
+ ; have at least 3 certificates in the chain.
+ ; The Root certificate is recommended to be generated in an air-gapped,
+ ; HSM-based secure environment. The intermediate signing keys may be
+ ; online, and should be rotated regularly (e.g. annually). Additionally,
+ ; the intermediate certificates may contain product family identifiers.
]
; A bstr containing a DER-encoded X.509 certificate (RSA, NIST P-curve, or EdDSA)
diff --git a/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp b/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp
index 0b15d12..b1590f9 100644
--- a/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp
+++ b/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp
@@ -714,11 +714,14 @@
return; // Exit early if setting up the new environment failed
}
+ size_t numNonOneShotAndNonSpecialSensors = getNonOneShotAndNonSpecialSensors().size();
activateAllSensors(true);
// Verify that the old environment does not receive any events
EXPECT_EQ(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), 0);
- // Verify that the new event queue receives sensor events
- EXPECT_GE(newEnv.get()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+ if (numNonOneShotAndNonSpecialSensors > 0) {
+ // Verify that the new event queue receives sensor events
+ EXPECT_GE(newEnv.get()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+ }
activateAllSensors(false);
// Cleanup the test environment
@@ -733,7 +736,9 @@
// Ensure that the original environment is receiving events
activateAllSensors(true);
- EXPECT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+ if (numNonOneShotAndNonSpecialSensors > 0) {
+ EXPECT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+ }
activateAllSensors(false);
}
@@ -743,7 +748,11 @@
// Verify that events are received
constexpr useconds_t kCollectionTimeoutUs = 1000 * 1000; // 1s
constexpr int32_t kNumEvents = 1;
- ASSERT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+
+ size_t numNonOneShotAndNonSpecialSensors = getNonOneShotAndNonSpecialSensors().size();
+ if (numNonOneShotAndNonSpecialSensors > 0) {
+ ASSERT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+ }
// Clear the active sensor handles so they are not disabled during TearDown
auto handles = mSensorHandles;
@@ -757,7 +766,9 @@
// Verify no events are received until sensors are re-activated
ASSERT_EQ(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), 0);
activateAllSensors(true);
- ASSERT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+ if (numNonOneShotAndNonSpecialSensors > 0) {
+ ASSERT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents);
+ }
// Disable sensors
activateAllSensors(false);
diff --git a/soundtrigger/aidl/Android.bp b/soundtrigger/aidl/Android.bp
index af9a5fc..b8b6915 100644
--- a/soundtrigger/aidl/Android.bp
+++ b/soundtrigger/aidl/Android.bp
@@ -35,7 +35,7 @@
sdk_version: "module_current",
},
},
- frozen: true,
+ frozen: false,
versions_with_info: [
{
version: "1",
@@ -52,7 +52,7 @@
}
// Note: This should always be one version ahead of the last frozen version
-latest_android_hardware_soundtrigger3 = "android.hardware.soundtrigger3-V2"
+latest_android_hardware_soundtrigger3 = "android.hardware.soundtrigger3-V3"
// Modules that depend on android.hardware.soundtrigger3 directly can include
// the following java_defaults to avoid explicitly managing dependency versions
diff --git a/staging/security/see/hwcrypto/aidl/Android.bp b/staging/security/see/hwcrypto/aidl/Android.bp
index 3e7ee9e..0a7e8be 100644
--- a/staging/security/see/hwcrypto/aidl/Android.bp
+++ b/staging/security/see/hwcrypto/aidl/Android.bp
@@ -10,6 +10,8 @@
aidl_interface {
name: "android.hardware.security.see",
unstable: false,
+ // TODO Remove this owner field when this interface is moved out of /staging
+ owner: "google_while_staging",
host_supported: true,
srcs: [
"android/hardware/security/see/hwcrypto/*.aidl",
diff --git a/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl
index 7efcdd6..3763f0a 100644
--- a/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl
+++ b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl
@@ -36,6 +36,8 @@
android.hardware.security.see.hwcrypto.IHwCryptoKey.DiceCurrentBoundKeyResult deriveCurrentDicePolicyBoundKey(in android.hardware.security.see.hwcrypto.IHwCryptoKey.DiceBoundDerivationKey derivationKey);
android.hardware.security.see.hwcrypto.IHwCryptoKey.DiceBoundKeyResult deriveDicePolicyBoundKey(in android.hardware.security.see.hwcrypto.IHwCryptoKey.DiceBoundDerivationKey derivationKey, in byte[] dicePolicyForKeyVersion);
android.hardware.security.see.hwcrypto.IHwCryptoKey.DerivedKey deriveKey(in android.hardware.security.see.hwcrypto.IHwCryptoKey.DerivedKeyParameters parameters);
+ android.hardware.security.see.hwcrypto.IHwCryptoOperations getHwCryptoOperations();
+ android.hardware.security.see.hwcrypto.IOpaqueKey importClearKey(in android.hardware.security.see.hwcrypto.types.ExplicitKeyMaterial keyMaterial, in android.hardware.security.see.hwcrypto.KeyPolicy newKeyPolicy);
enum DeviceKeyId {
DEVICE_BOUND_KEY,
BATCH_KEY,
@@ -56,8 +58,8 @@
int keySizeBytes;
}
union DerivedKeyPolicy {
- android.hardware.security.see.hwcrypto.KeyPolicy opaqueKey;
android.hardware.security.see.hwcrypto.IHwCryptoKey.ClearKeyPolicy clearKey;
+ byte[] opaqueKey;
}
parcelable DerivedKeyParameters {
android.hardware.security.see.hwcrypto.IOpaqueKey derivationKey;
diff --git a/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/AesKey.aidl b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/AesKey.aidl
new file mode 100644
index 0000000..f4bf786
--- /dev/null
+++ b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/AesKey.aidl
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.security.see.hwcrypto.types;
+union AesKey {
+ byte[16] aes128 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ byte[32] aes256;
+}
diff --git a/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/ExplicitKeyMaterial.aidl b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/ExplicitKeyMaterial.aidl
new file mode 100644
index 0000000..933fb67
--- /dev/null
+++ b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/ExplicitKeyMaterial.aidl
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.security.see.hwcrypto.types;
+union ExplicitKeyMaterial {
+ android.hardware.security.see.hwcrypto.types.AesKey aes;
+}
diff --git a/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl
index eaa8dd7..59c8757 100644
--- a/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl
+++ b/staging/security/see/hwcrypto/aidl/aidl_api/android.hardware.security.see/current/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl
@@ -32,6 +32,7 @@
// later when a module using the interface is updated, e.g., Mainline modules.
package android.hardware.security.see.hwcrypto.types;
+@RustDerive(Clone=true, Copy=true)
parcelable MemoryBufferReference {
int startOffset;
int sizeBytes;
diff --git a/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl
index 939014a..b5e7e9d 100644
--- a/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl
+++ b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/IHwCryptoKey.aidl
@@ -15,8 +15,10 @@
*/
package android.hardware.security.see.hwcrypto;
+import android.hardware.security.see.hwcrypto.IHwCryptoOperations;
import android.hardware.security.see.hwcrypto.IOpaqueKey;
import android.hardware.security.see.hwcrypto.KeyPolicy;
+import android.hardware.security.see.hwcrypto.types.ExplicitKeyMaterial;
/*
* Higher level interface to access and generate keys.
@@ -88,15 +90,15 @@
union DerivedKeyPolicy {
/*
- * Policy for the newly derived opaque key. Defines how the key can be used and its type.
- */
- KeyPolicy opaqueKey;
-
- /*
* If used we will derive a clear key and pass it back as an array of bytes on
* <code>HwCryptoKeyMaterial::explicitKey</code>.
*/
ClearKeyPolicy clearKey;
+
+ /*
+ * Policy for the newly derived opaque key. Defines how the key can be used and its type.
+ */
+ byte[] opaqueKey;
}
parcelable DerivedKeyParameters {
@@ -183,4 +185,36 @@
* <code>HalErrorCode</code> otherwise.
*/
DerivedKey deriveKey(in DerivedKeyParameters parameters);
+
+ /*
+ * getHwCryptoOperations() - Returns an interface used to work on opaque keys. This interface
+ * can also be used to operate on any opaque key generated by
+ * hwkeyDeriveVersioned, even if this key has been generated after
+ * retrieving a IHwCryptoOperations binder object, as long as the
+ * parent IHwCryptoDeviceKeyAccess is not dropped between retrieving
+ * the IHwCryptoOperations binder object and deriving the key.
+ * IHwCryptoOperations can also be used to create opaque keys that
+ * are not bound to the device.
+ *
+ * Return:
+ * IHwCryptoOperations on success
+ */
+ IHwCryptoOperations getHwCryptoOperations();
+
+ /*
+ * importClearKey() - Imports a SW clear key into the secure environment.
+ *
+ * @keyMaterial:
+ * key to be imported.
+ * @newKeyPolicy:
+ * Policy of the new key. Defines how the newly created key can be used. Because any
+ * clear key imported into the system is considered to have a
+ * <code>KeyLifetime::PORTABLE</code> lifetime, a call to this function will return an
+ * error if <code>newKeyPolicy.newKeyPolicy</code> is not set to portable.
+ *
+ * Return:
+ * IOpaqueKey on success, service specific error based on <code>HalErrorCode</code>
+ * otherwise.
+ */
+ IOpaqueKey importClearKey(in ExplicitKeyMaterial keyMaterial, in KeyPolicy newKeyPolicy);
}
diff --git a/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/KeyPolicy.cddl b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/KeyPolicy.cddl
new file mode 100644
index 0000000..77b632b
--- /dev/null
+++ b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/KeyPolicy.cddl
@@ -0,0 +1,66 @@
+;
+; Copyright (C) 2024 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.
+;
+
+KeyPolicy = [
+ -65701: KeyUse, ;usage
+ -65702: KeyLifetime ;keyLifetime
+ -65703: KeyPermissions ;keyPermissions
+ -65704: KeyType ;keyType
+ -65705: bool ;keyManagementKey
+]
+
+KeyUse = &(
+ ENCRYPT: 1,
+ DECRYPT: 2,
+ ENCRYPT_DECRYPT: ENCRYPT | DECRYPT,
+ SIGN: 4,
+ DERIVE: 8,
+ WRAP: 16,
+)
+
+KeyLifetime = &(
+ EPHEMERAL: 0,
+ HARDWARE: 1,
+ PORTABLE: 2,
+)
+
+KeyPermissions = &(
+ ALLOW_EPHEMERAL_KEY_WRAPPING: 0,
+ ALLOW_HARDWARE_KEY_WRAPPING: 1,
+ ALLOW_PORTABLE_KEY_WRAPPING: 2,
+)
+
+enum KeyType = &(
+ AES_128_CBC_NO_PADDING: 0,
+ AES_128_CBC_PKCS7_PADDING: 1,
+ AES_128_CTR: 2,
+ AES_128_GCM: 3,
+ AES_128_CMAC: 4,
+ AES_256_CBC_NO_PADDING: 5,
+ AES_256_CBC_PKCS7_PADDING: 6,
+ AES_256_CTR: 7,
+ AES_256_GCM: 8,
+ AES_256_CMAC: 9,
+ HMAC_SHA256: 10,
+ HMAC_SHA512: 11,
+ RSA2048_PSS_SHA256: 12,
+ RSA2048_PKCS1_5_SHA256: 13,
+ ECC_NIST_P256_SIGN_NO_PADDING: 14,
+ ECC_NIST_P256_SIGN_SHA256: 15,
+ ECC_NIST_P521_SIGN_NO_PADDING: 16,
+ ECC_NIST_P521_SIGN_SHA512: 17,
+ ECC_ED25519_SIGN:18,
+)
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/AesKey.aidl
similarity index 65%
copy from staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl
copy to staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/AesKey.aidl
index d339170..cf9082d 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl
+++ b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/AesKey.aidl
@@ -13,13 +13,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.hardware.security.see.storage;
+package android.hardware.security.see.hwcrypto.types;
-/** Determines how early during the boot process file is able to be accessed. */
-enum FileAvailability {
- /** Available before userdata is mounted, but after android has booted. */
- BEFORE_USERDATA,
+/*
+ * Type that represents an AES key.
+ */
+union AesKey {
+ /*
+ * Raw AES 128 bit key material.
+ */
+ byte[16] aes128 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- /** Available after userdata is mounted. */
- AFTER_USERDATA,
+ /*
+ * Raw AES 256 bit key material.
+ */
+ byte[32] aes256;
}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/ExplicitKeyMaterial.aidl
similarity index 65%
copy from staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl
copy to staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/ExplicitKeyMaterial.aidl
index d339170..4298ba9 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl
+++ b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/ExplicitKeyMaterial.aidl
@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.hardware.security.see.storage;
+package android.hardware.security.see.hwcrypto.types;
-/** Determines how early during the boot process file is able to be accessed. */
-enum FileAvailability {
- /** Available before userdata is mounted, but after android has booted. */
- BEFORE_USERDATA,
+import android.hardware.security.see.hwcrypto.types.AesKey;
- /** Available after userdata is mounted. */
- AFTER_USERDATA,
+/*
+ * Type encapsulating a clear key.
+ */
+union ExplicitKeyMaterial {
+ AesKey aes;
}
diff --git a/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl
index 5b90d9c..1175dc5 100644
--- a/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl
+++ b/staging/security/see/hwcrypto/aidl/android/hardware/security/see/hwcrypto/types/MemoryBufferReference.aidl
@@ -18,6 +18,7 @@
/*
* Structure representing a section of a memory buffer.
*/
+@RustDerive(Copy=true, Clone=true)
parcelable MemoryBufferReference {
/*
* Start of the memory buffer section measured from the start of the memory buffer set for this
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/Availability.aidl
similarity index 97%
rename from staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl
rename to staging/security/see/storage/aidl/android/hardware/security/see/storage/Availability.aidl
index d339170..21a275c 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileAvailability.aidl
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/Availability.aidl
@@ -16,7 +16,7 @@
package android.hardware.security.see.storage;
/** Determines how early during the boot process file is able to be accessed. */
-enum FileAvailability {
+enum Availability {
/** Available before userdata is mounted, but after android has booted. */
BEFORE_USERDATA,
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/DeleteOptions.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/DeleteOptions.aidl
deleted file mode 100644
index 1a94eb2..0000000
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/DeleteOptions.aidl
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2024 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.
- */
-package android.hardware.security.see.storage;
-
-import android.hardware.security.see.storage.ReadIntegrity;
-
-parcelable DeleteOptions {
- /**
- * Set to acknowledge possible files tampering.
- *
- * If unacknowledged tampering is detected, the operation will fail with an ERR_FS_*
- * service-specific code.
- */
- ReadIntegrity readIntegrity = ReadIntegrity.NO_TAMPER;
-
- /**
- * Allow writes to succeed while the filesystem is in the middle of an A/B update.
- *
- * If the A/B update fails, the operation will be rolled back. This rollback will not
- * cause subsequent operations fail with any ERR_FS_* code nor will need to be
- * acknowledged by setting the `readIntegrity`.
- */
- boolean allowWritesDuringAbUpdate = false;
-}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileProperties.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileProperties.aidl
deleted file mode 100644
index 733b5b0..0000000
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileProperties.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2024 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.
- */
-package android.hardware.security.see.storage;
-
-import android.hardware.security.see.storage.FileAvailability;
-import android.hardware.security.see.storage.FileIntegrity;
-
-parcelable FileProperties {
- FileIntegrity integrity = FileIntegrity.TAMPER_PROOF_AT_REST;
- FileAvailability availability = FileAvailability.BEFORE_USERDATA;
-
- /** Whether the file is reset when user data is wiped. */
- boolean persistent;
-}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/Filesystem.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/Filesystem.aidl
new file mode 100644
index 0000000..ea8db53
--- /dev/null
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/Filesystem.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2024 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.
+ */
+package android.hardware.security.see.storage;
+
+import android.hardware.security.see.storage.Availability;
+import android.hardware.security.see.storage.Integrity;
+
+/**
+ * Specifies minimum security requirements for a Secure Storage filesystem.
+ */
+parcelable Filesystem {
+ Integrity integrity = Integrity.TAMPER_PROOF_AT_REST;
+ Availability availability = Availability.BEFORE_USERDATA;
+
+ /**
+ * Whether the file is reset on factory resets. Factory resets will not be reported as
+ * tampering.
+ */
+ boolean persistent;
+}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/IDir.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/IDir.aidl
index a0a9f3d..5d9a761 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/IDir.aidl
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/IDir.aidl
@@ -26,15 +26,15 @@
*
* @maxCount:
* the maximum number of filenames to return. A @maxCount of 0 signifies no limit on the
- * number of filenames returned.
+ * number of filenames returned.
*
* Returns:
* An ordered list of filenames. If @maxCount > 0, the length of the returned list will be
- * less than or equal to @maxCount.
+ * less than or equal to @maxCount.
*
* May return service-specific errors:
- * - ERR_FS_* if the filesystem has been tampered with in a way that the `readIntegrity` the
- * dir was opened with does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
@utf8InCpp String[] readNextFilenames(int maxCount);
}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/IFile.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/IFile.aidl
index ff26aa4..fd2032e 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/IFile.aidl
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/IFile.aidl
@@ -32,8 +32,8 @@
* the sequence of bytes at [offset, offset + size) in the file
*
* May return service-specific errors:
- * - ERR_FS_* if the filesystem has been tampered with in a way that the `readIntegrity` the
- * file was opened with does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
byte[] read(long size, long offset);
@@ -47,8 +47,8 @@
* the number of bytes written successfully
*
* May return service-specific errors:
- * - ERR_FS_* if the filesystem has been tampered with in a way that the `readIntegrity` the
- * file was opened with does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
long write(long offset, in byte[] buffer);
@@ -56,8 +56,8 @@
* Reads this file's size.
*
* May return service-specific errors:
- * - ERR_FS_* if the filesystem has been tampered with in a way that the `readIntegrity` the
- * file was opened with does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
long getSize();
@@ -71,8 +71,8 @@
* the file's new size
*
* May return service-specific errors:
- * - ERR_FS_* if the filesystem has been tampered with in a way that the `readIntegrity` the
- * file was opened with does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
void setSize(long newSize);
@@ -88,8 +88,8 @@
* - ERR_NOT_FOUND if no file exists at @destPath and @destCreateMode is `NO_CREATE`
* - ERR_ALREADY_EXISTS if a file already exists at @destPath and @destCreateMode is
* `CREATE_EXCLUSIVE`
- * - ERR_FS_* if the filesystem has been tampered with in a way that the `readIntegrity` the
- * file was opened with does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
void rename(in @utf8InCpp String destPath, in CreationMode destCreateMode);
}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/ISecureStorage.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/ISecureStorage.aidl
index be3c045..022de9a 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/ISecureStorage.aidl
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/ISecureStorage.aidl
@@ -15,7 +15,7 @@
*/
package android.hardware.security.see.storage;
-import android.hardware.security.see.storage.FileProperties;
+import android.hardware.security.see.storage.Filesystem;
import android.hardware.security.see.storage.IStorageSession;
/**
@@ -28,20 +28,18 @@
const int ERR_NOT_FOUND = 2;
const int ERR_ALREADY_EXISTS = 3;
const int ERR_BAD_TRANSACTION = 4;
-
- const int ERR_FS_RESET = 5;
- const int ERR_FS_ROLLED_BACK = 6;
- const int ERR_FS_TAMPERED = 7;
+ const int ERR_AB_UPDATE_IN_PROGRESS = 5;
+ const int ERR_FS_TAMPERED = 6;
/**
* Starts a storage session for a filesystem.
*
- * @properties:
- * the minimum filesystem properties requested for the session.
+ * @filesystem:
+ * The minimum filesystem properties requested.
*
* May return service-specific errors:
* - ERR_UNSUPPORTED_PROPERTIES if no filesystems exist which meet the minimum requested
- * requirements
+ * requirements
*/
- IStorageSession startSession(in FileProperties properties);
+ IStorageSession startSession(in Filesystem filesystem);
}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/IStorageSession.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/IStorageSession.aidl
index cd126b8..1b70a0e 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/IStorageSession.aidl
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/IStorageSession.aidl
@@ -15,12 +15,10 @@
*/
package android.hardware.security.see.storage;
-import android.hardware.security.see.storage.DeleteOptions;
+import android.hardware.security.see.storage.CreationMode;
import android.hardware.security.see.storage.IDir;
import android.hardware.security.see.storage.IFile;
import android.hardware.security.see.storage.OpenOptions;
-import android.hardware.security.see.storage.ReadIntegrity;
-import android.hardware.security.see.storage.RenameOptions;
/**
* Interface for a Secure Storage session
@@ -66,8 +64,8 @@
* May return service-specific errors:
* - ERR_NOT_FOUND
* - ERR_ALREADY_EXISTS
- * - ERR_FS_* if the filesystem has been tampered with in a way that @options.readIntegrity
- * does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
IFile openFile(in @utf8InCpp String filePath, in OpenOptions options);
@@ -81,10 +79,10 @@
*
* May return service-specific errors:
* - ERR_NOT_FOUND
- * - ERR_FS_* if the filesystem has been tampered with in a way that @options.readIntegrity
- * does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
- void deleteFile(in @utf8InCpp String filePath, in DeleteOptions options);
+ void deleteFile(in @utf8InCpp String filePath);
/**
* Renames an existing file.
@@ -95,19 +93,19 @@
* path to the file, relative to filesystem root
* @destPath:
* the file's new path, relative to filesystem root
- * @options:
- * options controlling rename behavior
+ * @destCreateMode:
+ * creation behavior for the dest file
*
* May return service-specific errors:
- * - ERR_NOT_FOUND if no file exists at @currentPath, or if @options.destCreateMode is
- * `NO_CREATE` and no file exists at @destPath
- * - ERR_ALREADY_EXISTS if @options.destCreateMode is `CREATE_EXCLUSIVE` and a file exists at
+ * - ERR_NOT_FOUND if no file exists at @currentPath, or if @destCreateMode is `NO_CREATE` and
+ * no file exists at @destPath
+ * - ERR_ALREADY_EXISTS if @destCreateMode is `CREATE_EXCLUSIVE` and a file exists at
* @destPath
- * - ERR_FS_* if the filesystem has been tampered with in a way that @options.readIntegrity
- * does not acknowledge
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
+ * acknowledge
*/
void renameFile(in @utf8InCpp String currentPath, in @utf8InCpp String destPath,
- in RenameOptions options);
+ in CreationMode destCreateMode);
/**
* Opens a directory from a filesystem with the given properties.
@@ -116,14 +114,11 @@
*
* @path:
* path to the directory, relative to filesystem root
- * @readIntegrity:
- * allow opening (and subsequent read/write operations) despite possible tampering for the
- * directory
*
* May return service-specific errors:
* - ERR_NOT_FOUND
- * - ERR_FS_* if the filesystem has been tampered with in a way that @readIntegrity does not
+ * - ERR_FS_* if the filesystem has been tampered with in a way that the session did not
* acknowledge
*/
- IDir openDir(in @utf8InCpp String path, in ReadIntegrity readIntegrity);
+ IDir openDir(in @utf8InCpp String path);
}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileIntegrity.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/Integrity.aidl
similarity index 83%
rename from staging/security/see/storage/aidl/android/hardware/security/see/storage/FileIntegrity.aidl
rename to staging/security/see/storage/aidl/android/hardware/security/see/storage/Integrity.aidl
index 1879b16..2f7f7ab 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/FileIntegrity.aidl
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/Integrity.aidl
@@ -15,7 +15,7 @@
*/
package android.hardware.security.see.storage;
-enum FileIntegrity {
+enum Integrity {
/** REE may prevent operations, but cannot alter data once written. */
TAMPER_PROOF_AT_REST,
@@ -24,10 +24,4 @@
* an error on read.
*/
TAMPER_DETECT,
-
- /**
- * REE may alter written data. Changes other than full filesystem resets will be detected and
- * reported.
- */
- TAMPER_DETECT_IGNORE_RESET,
}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/OpenOptions.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/OpenOptions.aidl
index 997ca62..9fdf9e5 100644
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/OpenOptions.aidl
+++ b/staging/security/see/storage/aidl/android/hardware/security/see/storage/OpenOptions.aidl
@@ -17,7 +17,6 @@
import android.hardware.security.see.storage.CreationMode;
import android.hardware.security.see.storage.FileMode;
-import android.hardware.security.see.storage.ReadIntegrity;
parcelable OpenOptions {
/** Controls creation behavior of the to-be-opened file. See `CreationMode` docs for details. */
@@ -27,25 +26,8 @@
FileMode accessMode = FileMode.READ_WRITE;
/**
- * Set to acknowledge possible files tampering.
- *
- * If unacknowledged tampering is detected, the operation will fail with an ERR_FS_*
- * service-specific code.
- */
- ReadIntegrity readIntegrity = ReadIntegrity.NO_TAMPER;
-
- /**
* If this file already exists, discard existing content and open
* it as a new file. No semantic change if the file does not exist.
*/
boolean truncateOnOpen;
-
- /**
- * Allow writes to succeed while the filesystem is in the middle of an A/B update.
- *
- * If the A/B update fails, the operation will be rolled back. This rollback will not
- * cause subsequent operations fail with any ERR_FS_* code nor will need to be
- * acknowledged by setting the `readIntegrity`.
- */
- boolean allowWritesDuringAbUpdate = false;
}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/ReadIntegrity.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/ReadIntegrity.aidl
deleted file mode 100644
index cc0e4f9..0000000
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/ReadIntegrity.aidl
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2024 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.
- */
-package android.hardware.security.see.storage;
-
-enum ReadIntegrity {
- /**
- * Return an error on reads if any REE alteration of the written data
- * has been detected.
- */
- NO_TAMPER,
-
- /**
- * Return an error on reads if any REE alteration other than a reset
- * has been detected.
- */
- IGNORE_RESET,
-
- /**
- * Return an error if any REE alteration other than a rollback to a
- * valid checkpoint has been detected. (What makes a checkpoint valid is
- * implementation defined; an implementation might take a checkpoint on its
- * first post-factory boot. A reset is a rollback to the initial state.)
- */
- IGNORE_ROLLBACK,
-
- // There's no `IGNORE_ALL` because if REE has done any alteration other
- // than a rollback, the file contents will be known-bad data.
-}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/RenameOptions.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/RenameOptions.aidl
deleted file mode 100644
index f55ea7f..0000000
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/RenameOptions.aidl
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2024 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.
- */
-package android.hardware.security.see.storage;
-
-import android.hardware.security.see.storage.CreationMode;
-import android.hardware.security.see.storage.ReadIntegrity;
-
-parcelable RenameOptions {
- /** Controls creation behavior of the dest file. See `CreationMode` docs for details. */
- CreationMode destCreateMode = CreationMode.CREATE_EXCLUSIVE;
-
- /**
- * Set to acknowledge possible files tampering.
- *
- * If unacknowledged tampering is detected, the operation will fail with an ERR_FS_*
- * service-specific code.
- */
- ReadIntegrity readIntegrity = ReadIntegrity.NO_TAMPER;
-
- /**
- * Allow writes to succeed while the filesystem is in the middle of an A/B update.
- *
- * If the A/B update fails, the operation will be rolled back. This rollback will not
- * cause subsequent operations fail with any ERR_FS_* code nor will need to be
- * acknowledged by setting the `readIntegrity`.
- */
- boolean allowWritesDuringAbUpdate = false;
-}
diff --git a/staging/security/see/storage/aidl/android/hardware/security/see/storage/Tamper.aidl b/staging/security/see/storage/aidl/android/hardware/security/see/storage/Tamper.aidl
deleted file mode 100644
index 0a39fdd..0000000
--- a/staging/security/see/storage/aidl/android/hardware/security/see/storage/Tamper.aidl
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2024 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.
- */
-package android.hardware.security.see.storage;
-
-/** Specifies types of REE tampering the filesystem may detect */
-enum Tamper {
- /** REE has reset this file or the containing file system. */
- RESET,
-
- /** REE has rolled back this file or the containing file system to a previous state. */
- ROLLBACK,
-
- /** REE has made some other modification to the file. */
- OTHER,
-}
diff --git a/tests/extension/vibrator/aidl/default/CustomVibrator.cpp b/tests/extension/vibrator/aidl/default/CustomVibrator.cpp
index 7a7c58b..9c306b5 100644
--- a/tests/extension/vibrator/aidl/default/CustomVibrator.cpp
+++ b/tests/extension/vibrator/aidl/default/CustomVibrator.cpp
@@ -60,7 +60,7 @@
ndk::SpAIBinder CustomVibrator::createBinder() {
auto binder = BnCustomVibrator::createBinder();
// e.g. AIBinder_setInheritRt(binder.get(), true);
- // e.g. AIBinder_setMinSchedulerPolicy(binder.get(), SCHED_NORMAL, 20);
+ // e.g. AIBinder_setMinSchedulerPolicy(binder.get(), SCHED_NORMAL, -2);
// e.g. AIBinder_setRequestingSid(binder.get(), true);
return binder;
}
diff --git a/tests/msgq/1.0/ITestMsgQ.hal b/tests/msgq/1.0/ITestMsgQ.hal
index 0cf9c7c..62bef0a 100644
--- a/tests/msgq/1.0/ITestMsgQ.hal
+++ b/tests/msgq/1.0/ITestMsgQ.hal
@@ -18,8 +18,8 @@
interface ITestMsgQ {
enum EventFlagBits : uint32_t {
- FMQ_NOT_EMPTY = 1 << 0,
- FMQ_NOT_FULL = 1 << 1,
+ FMQ_NOT_FULL = 1 << 0,
+ FMQ_NOT_EMPTY = 1 << 1,
};
/**
diff --git a/tests/msgq/TEST_MAPPING b/tests/msgq/TEST_MAPPING
new file mode 100644
index 0000000..51c6c97
--- /dev/null
+++ b/tests/msgq/TEST_MAPPING
@@ -0,0 +1,18 @@
+{
+ "presubmit": [
+ {
+ "name": "fmq_unit_tests"
+ },
+ {
+ "name": "fmq_test"
+ }
+ ],
+ "hwasan-presubmit": [
+ {
+ "name": "fmq_unit_tests"
+ },
+ {
+ "name": "fmq_test"
+ }
+ ]
+}
diff --git a/threadnetwork/aidl/default/Android.bp b/threadnetwork/aidl/default/Android.bp
index 82a76e0..51e5c25 100644
--- a/threadnetwork/aidl/default/Android.bp
+++ b/threadnetwork/aidl/default/Android.bp
@@ -90,10 +90,20 @@
installable: false,
}
+filegroup {
+ name: "com.android.hardware.threadnetwork_manifest",
+ srcs: ["manifest.json"],
+}
+
+filegroup {
+ name: "com.android.hardware.threadnetwork_file_contexts",
+ srcs: ["file_contexts"],
+}
+
apex {
name: "com.android.hardware.threadnetwork",
- manifest: "manifest.json",
- file_contexts: "file_contexts",
+ manifest: ":com.android.hardware.threadnetwork_manifest",
+ file_contexts: ":com.android.hardware.threadnetwork_file_contexts",
key: "com.android.hardware.key",
certificate: ":com.android.hardware.certificate",
updatable: false,
@@ -110,3 +120,21 @@
"android.hardware.thread_network.prebuilt.xml", // permission
],
}
+
+prebuilt_etc {
+ name: "threadnetwork-service-simulation-rcp.rc",
+ src: "threadnetwork-service-simulation-rcp.rc",
+ installable: false,
+}
+
+// Thread HAL service which uses a simulation RCP (i.e. ot-rcp),
+// typically used in emulator devices.
+override_apex {
+ name: "com.android.hardware.threadnetwork-simulation-rcp",
+ base: "com.android.hardware.threadnetwork",
+ prebuilts: [
+ "threadnetwork-service-simulation-rcp.rc",
+ "threadnetwork-default.xml",
+ "android.hardware.thread_network.prebuilt.xml",
+ ],
+}
diff --git a/threadnetwork/aidl/default/socket_interface.cpp b/threadnetwork/aidl/default/socket_interface.cpp
index 0544502..339fd6b 100644
--- a/threadnetwork/aidl/default/socket_interface.cpp
+++ b/threadnetwork/aidl/default/socket_interface.cpp
@@ -33,6 +33,7 @@
#include <unistd.h>
#include <string>
+#include <vector>
#include "common/code_utils.hpp"
#include "openthread/openthread-system.h"
@@ -49,10 +50,8 @@
: mReceiveFrameCallback(nullptr),
mReceiveFrameContext(nullptr),
mReceiveFrameBuffer(nullptr),
- mSockFd(-1),
mRadioUrl(aRadioUrl) {
- memset(&mInterfaceMetrics, 0, sizeof(mInterfaceMetrics));
- mInterfaceMetrics.mRcpInterfaceType = kSpinelInterfaceTypeVendor;
+ ResetStates();
}
otError SocketInterface::Init(ReceiveFrameCallback aCallback, void* aCallbackContext,
@@ -120,13 +119,50 @@
} else if (rval == 0) {
ExitNow(error = OT_ERROR_RESPONSE_TIMEOUT);
} else {
- DieNowWithMessage("wait response", OT_EXIT_FAILURE);
+ DieNowWithMessage("Wait response", OT_EXIT_FAILURE);
}
exit:
return error;
}
+otError SocketInterface::WaitForHardwareResetCompletion(uint32_t aTimeoutMs) {
+ otError error = OT_ERROR_NONE;
+ int retries = 0;
+ int rval;
+
+ while (mIsHardwareResetting && retries++ < kMaxRetriesForSocketCloseCheck) {
+ struct timeval timeout;
+ timeout.tv_sec = static_cast<time_t>(aTimeoutMs / MS_PER_S);
+ timeout.tv_usec = static_cast<suseconds_t>((aTimeoutMs % MS_PER_S) * MS_PER_S);
+
+ fd_set readFds;
+
+ FD_ZERO(&readFds);
+ FD_SET(mSockFd, &readFds);
+
+ rval = TEMP_FAILURE_RETRY(select(mSockFd + 1, &readFds, nullptr, nullptr, &timeout));
+
+ if (rval > 0) {
+ Read();
+ } else if (rval < 0) {
+ DieNowWithMessage("Wait response", OT_EXIT_ERROR_ERRNO);
+ } else {
+ LogInfo("Waiting for hardware reset, retry attempt: %d, max attempt: %d", retries,
+ kMaxRetriesForSocketCloseCheck);
+ }
+ }
+
+ VerifyOrExit(!mIsHardwareResetting, error = OT_ERROR_FAILED);
+
+ WaitForSocketFileCreated(mRadioUrl.GetPath());
+ mSockFd = OpenFile(mRadioUrl);
+ VerifyOrExit(mSockFd != -1, error = OT_ERROR_FAILED);
+
+exit:
+ return error;
+}
+
void SocketInterface::UpdateFdSet(void* aMainloopContext) {
otSysMainloopContext* context = reinterpret_cast<otSysMainloopContext*>(aMainloopContext);
@@ -150,6 +186,16 @@
}
}
+otError SocketInterface::HardwareReset(void) {
+ otError error = OT_ERROR_NONE;
+ std::vector<uint8_t> resetCommand = {SPINEL_HEADER_FLAG, SPINEL_CMD_RESET, 0x04};
+
+ mIsHardwareResetting = true;
+ SendFrame(resetCommand.data(), resetCommand.size());
+
+ return WaitForHardwareResetCompletion(kMaxSelectTimeMs);
+}
+
void SocketInterface::Read(void) {
uint8_t buffer[kMaxFrameSize];
@@ -160,8 +206,13 @@
} else if (rval < 0) {
DieNow(OT_EXIT_ERROR_ERRNO);
} else {
- LogCrit("Socket connection is closed by remote.");
- exit(OT_EXIT_FAILURE);
+ if (mIsHardwareResetting) {
+ LogInfo("Socket connection is closed due to hardware reset.");
+ ResetStates();
+ } else {
+ LogCrit("Socket connection is closed by remote.");
+ exit(OT_EXIT_FAILURE);
+ }
}
}
@@ -298,6 +349,13 @@
return stat(aPath, &st) == 0 && S_ISSOCK(st.st_mode);
}
+void SocketInterface::ResetStates() {
+ mSockFd = -1;
+ mIsHardwareResetting = false;
+ memset(&mInterfaceMetrics, 0, sizeof(mInterfaceMetrics));
+ mInterfaceMetrics.mRcpInterfaceType = kSpinelInterfaceTypeVendor;
+}
+
} // namespace threadnetwork
} // namespace hardware
} // namespace android
diff --git a/threadnetwork/aidl/default/socket_interface.hpp b/threadnetwork/aidl/default/socket_interface.hpp
index 6f3be7f..494d76a 100644
--- a/threadnetwork/aidl/default/socket_interface.hpp
+++ b/threadnetwork/aidl/default/socket_interface.hpp
@@ -136,10 +136,10 @@
* Hardware resets the RCP.
*
* @retval OT_ERROR_NONE Successfully reset the RCP.
- * @retval OT_ERROR_NOT_IMPLEMENT The hardware reset is not implemented.
+ * @retval OT_ERROR_FAILED Hardware reset is failed.
*
*/
- otError HardwareReset(void) { return OT_ERROR_NOT_IMPLEMENTED; }
+ otError HardwareReset(void);
/**
* Returns the RCP interface metrics.
@@ -237,9 +237,26 @@
*/
void WaitForSocketFileCreated(const char* aPath);
+ /**
+ * Wait for the hardware reset completion signal.
+ *
+ * @retval OT_ERROR_NONE Hardware reset is successfully.
+ * @retval OT_ERROR_FAILED Hardware reset is failed.
+ *
+ */
+ otError WaitForHardwareResetCompletion(uint32_t aTimeoutMs);
+
+ /**
+ * Reset socket interface to intitial state.
+ *
+ */
+ void ResetStates(void);
+
enum {
- kMaxSelectTimeMs = 2000, ///< Maximum wait time in Milliseconds for file
- ///< descriptor to become available.
+ kMaxSelectTimeMs = 2000, ///< Maximum wait time in Milliseconds for file
+ ///< descriptor to become available.
+ kMaxRetriesForSocketCloseCheck = 3, ///< Maximum retry times for checking
+ ///< if socket is closed.
};
ReceiveFrameCallback mReceiveFrameCallback;
@@ -249,6 +266,8 @@
int mSockFd;
const ot::Url::Url& mRadioUrl;
+ bool mIsHardwareResetting;
+
otRcpInterfaceMetrics mInterfaceMetrics;
// Non-copyable, intentionally not implemented.
diff --git a/threadnetwork/aidl/default/threadnetwork-service-simulation-rcp.rc b/threadnetwork/aidl/default/threadnetwork-service-simulation-rcp.rc
new file mode 100644
index 0000000..3b889eb
--- /dev/null
+++ b/threadnetwork/aidl/default/threadnetwork-service-simulation-rcp.rc
@@ -0,0 +1,3 @@
+service vendor.threadnetwork_hal /apex/com.android.hardware.threadnetwork/bin/hw/android.hardware.threadnetwork-service spinel+hdlc+forkpty:///apex/com.android.hardware.threadnetwork/bin/ot-rcp?forkpty-arg=1
+ class hal
+ user thread_network
diff --git a/tv/input/aidl/vts/functional/VtsHalTvInputTargetTest.cpp b/tv/input/aidl/vts/functional/VtsHalTvInputTargetTest.cpp
index 7e095f1..41a78eb 100644
--- a/tv/input/aidl/vts/functional/VtsHalTvInputTargetTest.cpp
+++ b/tv/input/aidl/vts/functional/VtsHalTvInputTargetTest.cpp
@@ -137,13 +137,15 @@
}
bool TvInputAidlTest::isValidHandle(NativeHandle& handle) {
- if (handle.fds.empty()) {
+ if (handle.fds.empty() && handle.ints.empty()) {
return false;
}
- for (size_t i = 0; i < handle.fds.size(); i++) {
- int fd = handle.fds[i].get();
- if (fcntl(fd, F_GETFL) < 0) {
- return false;
+ if (!(handle.fds.empty())) {
+ for (size_t i = 0; i < handle.fds.size(); i++) {
+ int fd = handle.fds[i].get();
+ if (fcntl(fd, F_GETFL) < 0) {
+ return false;
+ }
}
}
return true;
diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h
index 6cabb3d..be9b996 100644
--- a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h
+++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h
@@ -32,9 +32,10 @@
bool initConfiguration() {
std::array<char, PROPERTY_VALUE_MAX> variant;
property_get("ro.vendor.vts_tuner_configuration_variant", variant.data(), "");
+ string variantString = variant.data();
string configFilePath = "/vendor/etc/tuner_vts_config_aidl_V1";
- if (variant.size() != 0) {
- configFilePath = configFilePath + "." + variant.data();
+ if (variantString.length() != 0) {
+ configFilePath = configFilePath + "." + variantString;
}
configFilePath = configFilePath + ".xml";
TunerTestingConfigAidlReader1_0::setConfigFilePath(configFilePath);
diff --git a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
index 58919d1..09cdc26 100644
--- a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
+++ b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
@@ -35,6 +35,7 @@
@Backing(type="int") @VintfStability
enum UwbVendorCapabilityTlvTypes {
SUPPORTED_POWER_STATS_QUERY = 0xC0,
+ SUPPORTED_ANTENNA_MODES = 0xC1,
CCC_SUPPORTED_CHAPS_PER_SLOT = 0xA0,
CCC_SUPPORTED_SYNC_CODES = 0xA1,
CCC_SUPPORTED_HOPPING_CONFIG_MODES_AND_SEQUENCES = 0xA2,
diff --git a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl
index 702e561..d9b7220 100644
--- a/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl
+++ b/uwb/aidl/aidl_api/android.hardware.uwb.fira_android/current/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl
@@ -34,6 +34,8 @@
package android.hardware.uwb.fira_android;
@Backing(type="long") @VintfStability
enum UwbVendorCapabilityTlvValues {
+ ANTENNA_MODE_OMNI = 1,
+ ANTENNA_MODE_DIRECTIONAL = (1 << 1) /* 2 */,
UWB_CONFIG_0 = 0,
UWB_CONFIG_1 = 1,
PULSE_SHAPE_SYMMETRICAL_ROOT_RAISED_COSINE = 0,
diff --git a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
index 4df45b6..28e44ef 100644
--- a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
+++ b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvTypes.aidl
@@ -41,6 +41,13 @@
*/
SUPPORTED_POWER_STATS_QUERY = 0xC0,
+ /**
+ * 1 byte bitmask to indicate which antennas modes are supported.
+ * 0x01 = "Omni mode",
+ * 0x02 = "Directional mode",
+ */
+ SUPPORTED_ANTENNA_MODES = 0xC1,
+
/*********************************************
* CCC specific
********************************************/
diff --git a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl
index 6ef52fe..e5165dc 100644
--- a/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl
+++ b/uwb/aidl/android/hardware/uwb/fira_android/UwbVendorCapabilityTlvValues.aidl
@@ -25,6 +25,12 @@
@Backing(type="long")
enum UwbVendorCapabilityTlvValues {
/*********************************************
+ * Protocol agnostic
+ ********************************************/
+ ANTENNA_MODE_OMNI = 1,
+ ANTENNA_MODE_DIRECTIONAL = 1 << 1,
+
+ /*********************************************
* CCC specific
********************************************/
UWB_CONFIG_0 = 0,
diff --git a/wifi/aidl/default/Android.bp b/wifi/aidl/default/Android.bp
index 362ef1b..2047807 100644
--- a/wifi/aidl/default/Android.bp
+++ b/wifi/aidl/default/Android.bp
@@ -218,3 +218,8 @@
name: "default-android.hardware.wifi-service.xml",
srcs: ["android.hardware.wifi-service.xml"],
}
+
+filegroup {
+ name: "default-android.hardware.wifi-service-lazy.rc",
+ srcs: ["android.hardware.wifi-service-lazy.rc"],
+}
diff --git a/wifi/netlinkinterceptor/aidl/default/Android.bp b/wifi/netlinkinterceptor/aidl/default/Android.bp
index 6bdd9fc..52f15e4 100644
--- a/wifi/netlinkinterceptor/aidl/default/Android.bp
+++ b/wifi/netlinkinterceptor/aidl/default/Android.bp
@@ -76,3 +76,13 @@
sub_dir: "vintf",
installable: false,
}
+
+filegroup {
+ name: "android.hardware.net.nlinterceptor-service.rc",
+ srcs: ["nlinterceptor.rc"],
+}
+
+filegroup {
+ name: "android.hardware.net.nlinterceptor.xml",
+ srcs: ["nlinterceptor.xml"],
+}
diff --git a/wifi/supplicant/1.1/vts/Android.mk b/wifi/supplicant/1.1/vts/Android.mk
deleted file mode 100644
index 6361f9b..0000000
--- a/wifi/supplicant/1.1/vts/Android.mk
+++ /dev/null
@@ -1,2 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))