summaryrefslogtreecommitdiff
path: root/framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java
diff options
context:
space:
mode:
authorƁukasz Rymanowski <rlukasz@google.com>2022-03-10 10:28:12 +0000
committerJack He <siyuanh@google.com>2022-03-16 11:46:29 -0700
commit4fb6536c516709c8fc91602622415f1b5af049c4 (patch)
treefd0450346cc93bdd7f47012ec27e3ce3978ee950 /framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java
parent49527e336a267f2ac37eafd26ac68c48c0cb95d6 (diff)
BluetoothLeAudio: Fix API for codec preferences
This patch adjust codec preferences for the Le Audio usage. API is using group id now and allows to choose configuration for output and input. Note: Input and Output shall use same codec type (for now) but different codec parameters might be used. Bug: 219875113 Test: atest BluetoothInstrumentationTests Ignore-AOSP-First: Compilation error Change-Id: Iee7a0c6d42dd029f9c24a27ec892eb7ef261263b
Diffstat (limited to 'framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java')
-rw-r--r--framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java194
1 files changed, 152 insertions, 42 deletions
diff --git a/framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java b/framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java
index 399ffa743c..bdb9d5d5c6 100644
--- a/framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java
+++ b/framework/java/android/bluetooth/BluetoothLeAudioCodecStatus.java
@@ -41,29 +41,47 @@ public final class BluetoothLeAudioCodecStatus implements Parcelable {
public static final String EXTRA_LE_AUDIO_CODEC_STATUS =
"android.bluetooth.extra.LE_AUDIO_CODEC_STATUS";
- private final @Nullable BluetoothLeAudioCodecConfig mCodecConfig;
- private final @Nullable List<BluetoothLeAudioCodecConfig> mCodecsLocalCapabilities;
- private final @Nullable List<BluetoothLeAudioCodecConfig> mCodecsSelectableCapabilities;
+ private final @Nullable BluetoothLeAudioCodecConfig mInputCodecConfig;
+ private final @Nullable BluetoothLeAudioCodecConfig mOutputCodecConfig;
+ private final @Nullable List<BluetoothLeAudioCodecConfig> mInputCodecsLocalCapabilities;
+ private final @Nullable List<BluetoothLeAudioCodecConfig> mOutputCodecsLocalCapabilities;
+ private final @Nullable List<BluetoothLeAudioCodecConfig> mInputCodecsSelectableCapabilities;
+ private final @Nullable List<BluetoothLeAudioCodecConfig> mOutputCodecsSelectableCapabilities;
/**
* Represents the codec status for a Bluetooth LE Audio source device.
*
- * @param codecConfig the current code configutration.
- * @param codecsLocalCapabilities the local codecs capabilities.
- * @param codecsSelectableCapabilities the selectable codecs capabilities.
+ * @param inputCodecConfig the current input code configutration.
+ * @param outputCodecConfig the current output code configutration.
+ * @param inputCodecsLocalCapabilities the local input codecs capabilities.
+ * @param outputCodecsLocalCapabilities the local output codecs capabilities.
+ * @param inputCodecsSelectableCapabilities the selectable input codecs capabilities.
+ * @param outputCodecsSelectableCapabilities the selectable output codecs capabilities.
*/
- public BluetoothLeAudioCodecStatus(@Nullable BluetoothLeAudioCodecConfig codecConfig,
- @NonNull List<BluetoothLeAudioCodecConfig> codecsLocalCapabilities,
- @NonNull List<BluetoothLeAudioCodecConfig> codecsSelectableCapabilities) {
- mCodecConfig = codecConfig;
- mCodecsLocalCapabilities = codecsLocalCapabilities;
- mCodecsSelectableCapabilities = codecsSelectableCapabilities;
+ public BluetoothLeAudioCodecStatus(@Nullable BluetoothLeAudioCodecConfig inputCodecConfig,
+ @Nullable BluetoothLeAudioCodecConfig outputCodecConfig,
+ @NonNull List<BluetoothLeAudioCodecConfig> inputCodecsLocalCapabilities,
+ @NonNull List<BluetoothLeAudioCodecConfig> outputCodecsLocalCapabilities,
+ @NonNull List<BluetoothLeAudioCodecConfig> inputCodecsSelectableCapabilities,
+ @NonNull List<BluetoothLeAudioCodecConfig> outputCodecsSelectableCapabilities) {
+ mInputCodecConfig = inputCodecConfig;
+ mOutputCodecConfig = outputCodecConfig;
+ mInputCodecsLocalCapabilities = inputCodecsLocalCapabilities;
+ mOutputCodecsLocalCapabilities = outputCodecsLocalCapabilities;
+ mInputCodecsSelectableCapabilities = inputCodecsSelectableCapabilities;
+ mOutputCodecsSelectableCapabilities = outputCodecsSelectableCapabilities;
}
private BluetoothLeAudioCodecStatus(Parcel in) {
- mCodecConfig = in.readTypedObject(BluetoothLeAudioCodecConfig.CREATOR);
- mCodecsLocalCapabilities = in.createTypedArrayList(BluetoothLeAudioCodecConfig.CREATOR);
- mCodecsSelectableCapabilities =
+ mInputCodecConfig = in.readTypedObject(BluetoothLeAudioCodecConfig.CREATOR);
+ mOutputCodecConfig = in.readTypedObject(BluetoothLeAudioCodecConfig.CREATOR);
+ mInputCodecsLocalCapabilities =
+ in.createTypedArrayList(BluetoothLeAudioCodecConfig.CREATOR);
+ mOutputCodecsLocalCapabilities =
+ in.createTypedArrayList(BluetoothLeAudioCodecConfig.CREATOR);
+ mInputCodecsSelectableCapabilities =
+ in.createTypedArrayList(BluetoothLeAudioCodecConfig.CREATOR);
+ mOutputCodecsSelectableCapabilities =
in.createTypedArrayList(BluetoothLeAudioCodecConfig.CREATOR);
}
@@ -71,10 +89,16 @@ public final class BluetoothLeAudioCodecStatus implements Parcelable {
public boolean equals(@Nullable Object o) {
if (o instanceof BluetoothLeAudioCodecStatus) {
BluetoothLeAudioCodecStatus other = (BluetoothLeAudioCodecStatus) o;
- return (Objects.equals(other.mCodecConfig, mCodecConfig)
- && sameCapabilities(other.mCodecsLocalCapabilities, mCodecsLocalCapabilities)
- && sameCapabilities(other.mCodecsSelectableCapabilities,
- mCodecsSelectableCapabilities));
+ return (Objects.equals(other.mInputCodecConfig, mInputCodecConfig)
+ && Objects.equals(other.mOutputCodecConfig, mOutputCodecConfig)
+ && sameCapabilities(other.mInputCodecsLocalCapabilities,
+ mInputCodecsLocalCapabilities)
+ && sameCapabilities(other.mOutputCodecsLocalCapabilities,
+ mOutputCodecsLocalCapabilities)
+ && sameCapabilities(other.mInputCodecsSelectableCapabilities,
+ mInputCodecsSelectableCapabilities)
+ && sameCapabilities(other.mOutputCodecsSelectableCapabilities,
+ mOutputCodecsSelectableCapabilities));
}
return false;
}
@@ -101,19 +125,67 @@ public final class BluetoothLeAudioCodecStatus implements Parcelable {
return c1.containsAll(c2);
}
+ private boolean isCodecConfigSelectable(BluetoothLeAudioCodecConfig codecConfig,
+ BluetoothLeAudioCodecConfig selectableConfig) {
+ if (codecConfig.getCodecType() != selectableConfig.getCodecType()) {
+ return false;
+ }
+ if ((codecConfig.getFrameDuration() != BluetoothLeAudioCodecConfig.FRAME_DURATION_NONE)
+ && ((codecConfig.getFrameDuration() & selectableConfig.getFrameDuration()) == 0)) {
+ return false;
+ }
+ if ((codecConfig.getChannelCount() != BluetoothLeAudioCodecConfig.CHANNEL_COUNT_NONE)
+ && ((codecConfig.getChannelCount() & selectableConfig.getChannelCount()) == 0)) {
+ return false;
+ }
+ if ((codecConfig.getSampleRate() != BluetoothLeAudioCodecConfig.SAMPLE_RATE_NONE)
+ && ((codecConfig.getSampleRate() & selectableConfig.getSampleRate()) == 0)) {
+ return false;
+ }
+ if ((codecConfig.getBitsPerSample() != BluetoothLeAudioCodecConfig.BITS_PER_SAMPLE_NONE)
+ && ((codecConfig.getBitsPerSample() & selectableConfig.getBitsPerSample()) == 0)) {
+ return false;
+ }
+ if ((codecConfig.getOctetsPerFrame() != 0)
+ && ((codecConfig.getOctetsPerFrame() < selectableConfig.getMinOctetsPerFrame())
+ || (codecConfig.getOctetsPerFrame() > selectableConfig.getMaxOctetsPerFrame()))) {
+ return false;
+ }
+ return true;
+ }
/**
- * Checks whether the codec config matches the selectable capabilities.
+ * Checks whether the Input codec config matches the selectable capabilities.
* Any parameters of the codec config with NONE value will be considered a wildcard matching.
*
* @param codecConfig the codec config to compare against
* @return {@code true} if the codec config matches, {@code false} otherwise
*/
- public boolean isCodecConfigSelectable(@Nullable BluetoothLeAudioCodecConfig codecConfig) {
+ public boolean isInputCodecConfigSelectable(@Nullable BluetoothLeAudioCodecConfig codecConfig) {
if (codecConfig == null) {
return false;
}
- for (BluetoothLeAudioCodecConfig selectableConfig : mCodecsSelectableCapabilities) {
- if (codecConfig.equals(selectableConfig)) {
+ for (BluetoothLeAudioCodecConfig selectableConfig : mInputCodecsSelectableCapabilities) {
+ if (isCodecConfigSelectable(codecConfig, selectableConfig)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Checks whether the Output codec config matches the selectable capabilities.
+ * Any parameters of the codec config with NONE value will be considered a wildcard matching.
+ *
+ * @param codecConfig the codec config to compare against
+ * @return {@code true} if the codec config matches, {@code false} otherwise
+ */
+ public boolean isOutputCodecConfigSelectable(
+ @Nullable BluetoothLeAudioCodecConfig codecConfig) {
+ if (codecConfig == null) {
+ return false;
+ }
+ for (BluetoothLeAudioCodecConfig selectableConfig : mOutputCodecsSelectableCapabilities) {
+ if (isCodecConfigSelectable(codecConfig, selectableConfig)) {
return true;
}
}
@@ -125,7 +197,9 @@ public final class BluetoothLeAudioCodecStatus implements Parcelable {
*/
@Override
public int hashCode() {
- return Objects.hash(mCodecConfig, mCodecsLocalCapabilities, mCodecsLocalCapabilities);
+ return Objects.hash(mInputCodecConfig, mOutputCodecConfig,
+ mInputCodecsLocalCapabilities, mOutputCodecsLocalCapabilities,
+ mInputCodecsSelectableCapabilities, mOutputCodecsSelectableCapabilities);
}
/**
@@ -134,9 +208,12 @@ public final class BluetoothLeAudioCodecStatus implements Parcelable {
*/
@Override
public String toString() {
- return "{mCodecConfig:" + mCodecConfig
- + ",mCodecsLocalCapabilities:" + mCodecsLocalCapabilities
- + ",mCodecsSelectableCapabilities:" + mCodecsSelectableCapabilities
+ return "{mInputCodecConfig:" + mInputCodecConfig
+ + ",mOutputCodecConfig:" + mOutputCodecConfig
+ + ",mInputCodecsLocalCapabilities:" + mInputCodecsLocalCapabilities
+ + ",mOutputCodecsLocalCapabilities:" + mOutputCodecsLocalCapabilities
+ + ",mInputCodecsSelectableCapabilities:" + mInputCodecsSelectableCapabilities
+ + ",mOutputCodecsSelectableCapabilities:" + mOutputCodecsSelectableCapabilities
+ "}";
}
@@ -171,38 +248,71 @@ public final class BluetoothLeAudioCodecStatus implements Parcelable {
*/
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
- out.writeTypedObject(mCodecConfig, flags);
- out.writeTypedList(mCodecsLocalCapabilities);
- out.writeTypedList(mCodecsSelectableCapabilities);
+ out.writeTypedObject(mInputCodecConfig, flags);
+ out.writeTypedObject(mOutputCodecConfig, flags);
+ out.writeTypedList(mInputCodecsLocalCapabilities);
+ out.writeTypedList(mOutputCodecsLocalCapabilities);
+ out.writeTypedList(mInputCodecsSelectableCapabilities);
+ out.writeTypedList(mOutputCodecsSelectableCapabilities);
+ }
+
+ /**
+ * Returns the current Input codec configuration.
+ *
+ * @return The current input codec config.
+ */
+ public @Nullable BluetoothLeAudioCodecConfig getInputCodecConfig() {
+ return mInputCodecConfig;
}
/**
- * Returns the current codec configuration.
+ * Returns the current Output codec configuration.
*
- * @return The current codec config.
+ * @return The current output codec config.
*/
- public @Nullable BluetoothLeAudioCodecConfig getCodecConfig() {
- return mCodecConfig;
+ public @Nullable BluetoothLeAudioCodecConfig getOutputCodecConfig() {
+ return mOutputCodecConfig;
}
/**
- * Returns the codecs local capabilities.
+ * Returns the input codecs local capabilities.
*
* @return The list of codec config that supported by the local system.
*/
- public @NonNull List<BluetoothLeAudioCodecConfig> getCodecLocalCapabilities() {
- return (mCodecsLocalCapabilities == null)
- ? Collections.emptyList() : mCodecsLocalCapabilities;
+ public @NonNull List<BluetoothLeAudioCodecConfig> getInputCodecLocalCapabilities() {
+ return (mInputCodecsLocalCapabilities == null)
+ ? Collections.emptyList() : mInputCodecsLocalCapabilities;
+ }
+
+ /**
+ * Returns the output codecs local capabilities.
+ *
+ * @return The list of codec config that supported by the local system.
+ */
+ public @NonNull List<BluetoothLeAudioCodecConfig> getOutputCodecLocalCapabilities() {
+ return (mOutputCodecsLocalCapabilities == null)
+ ? Collections.emptyList() : mOutputCodecsLocalCapabilities;
+ }
+
+ /**
+ * Returns the Input codecs selectable capabilities.
+ *
+ * @return The list of codec config that supported by both of the local system and
+ * remote devices.
+ */
+ public @NonNull List<BluetoothLeAudioCodecConfig> getInputCodecSelectableCapabilities() {
+ return (mInputCodecsSelectableCapabilities == null)
+ ? Collections.emptyList() : mInputCodecsSelectableCapabilities;
}
/**
- * Returns the codecs selectable capabilities.
+ * Returns the Output codecs selectable capabilities.
*
* @return The list of codec config that supported by both of the local system and
* remote devices.
*/
- public @NonNull List<BluetoothLeAudioCodecConfig> getCodecSelectableCapabilities() {
- return (mCodecsSelectableCapabilities == null)
- ? Collections.emptyList() : mCodecsSelectableCapabilities;
+ public @NonNull List<BluetoothLeAudioCodecConfig> getOutputCodecSelectableCapabilities() {
+ return (mOutputCodecsSelectableCapabilities == null)
+ ? Collections.emptyList() : mOutputCodecsSelectableCapabilities;
}
}