summaryrefslogtreecommitdiff
path: root/framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java')
-rw-r--r--framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java200
1 files changed, 200 insertions, 0 deletions
diff --git a/framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java b/framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java
new file mode 100644
index 0000000000..4ca657c449
--- /dev/null
+++ b/framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2022 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.bluetooth;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * A class representing the codec specific config metadata information defined in the Basic Audio
+ * Profile.
+ *
+ * @hide
+ */
+@SystemApi
+public final class BluetoothLeAudioCodecConfigMetadata implements Parcelable {
+ private static final int UNKNOWN_VALUE_PLACEHOLDER = -1;
+
+ private final long mAudioLocation;
+ private final byte[] mRawMetadata;
+
+ private BluetoothLeAudioCodecConfigMetadata(long audioLocation, byte[] rawMetadata) {
+ mAudioLocation = audioLocation;
+ mRawMetadata = rawMetadata;
+ }
+
+ /**
+ * Get the audio location information as defined in the Generic Audio section of Bluetooth
+ * Assigned numbers.
+ *
+ * @return configured audio location, -1 if this metadata does not exist
+ * @hide
+ */
+ @SystemApi
+ public long getAudioLocation() {
+ return mAudioLocation;
+ }
+
+ /**
+ * Get the raw bytes of stream metadata in Bluetooth LTV format.
+ *
+ * Bluetooth LTV format for stream metadata is defined in the Generic Audio
+ * section of <a href="https://www.bluetooth.com/specifications/assigned-numbers/">Bluetooth Assigned Numbers</a>,
+ * including metadata that was not covered by the getter methods in this class.
+ *
+ * @return raw bytes of stream metadata in Bluetooth LTV format
+ * @hide
+ */
+ @SystemApi
+ public @NonNull byte[] getRawMetadata() {
+ return mRawMetadata;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @hide
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @hide
+ */
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeLong(mAudioLocation);
+ if (mRawMetadata != null) {
+ out.writeInt(mRawMetadata.length);
+ out.writeByteArray(mRawMetadata);
+ } else {
+ out.writeInt(-1);
+ }
+ }
+
+ /**
+ * A {@link Parcelable.Creator} to create {@link BluetoothLeAudioCodecConfigMetadata} from
+ * parcel.
+ * @hide
+ */
+ @SystemApi
+ public static final @NonNull Parcelable.Creator<BluetoothLeAudioCodecConfigMetadata> CREATOR =
+ new Parcelable.Creator<BluetoothLeAudioCodecConfigMetadata>() {
+ @NonNull
+ public BluetoothLeAudioCodecConfigMetadata createFromParcel(@NonNull Parcel in) {
+ long audioLocation = in.readLong();
+ int rawMetadataLen = in.readInt();
+ byte[] rawMetadata;
+ if (rawMetadataLen != -1) {
+ rawMetadata = new byte[rawMetadataLen];
+ in.readByteArray(rawMetadata);
+ } else {
+ rawMetadata = new byte[0];
+ }
+ return new BluetoothLeAudioCodecConfigMetadata(audioLocation, rawMetadata);
+ }
+
+ public @NonNull BluetoothLeAudioCodecConfigMetadata[] newArray(int size) {
+ return new BluetoothLeAudioCodecConfigMetadata[size];
+ }
+ };
+
+ /**
+ * Construct a {@link BluetoothLeAudioCodecConfigMetadata} from raw bytes.
+ *
+ * The byte array will be parsed and values for each getter will be populated
+ *
+ * Raw metadata cannot be set using builder in order to maintain raw bytes and getter value
+ * consistency
+ *
+ * @param rawBytes raw bytes of stream metadata in Bluetooth LTV format
+ * @return parsed {@link BluetoothLeAudioCodecConfigMetadata} object
+ * @throws IllegalArgumentException if <var>rawBytes</var> is null or when the raw bytes cannot
+ * be parsed to build the object
+ * @hide
+ */
+ @SystemApi
+ public static @NonNull BluetoothLeAudioCodecConfigMetadata fromRawBytes(
+ @NonNull byte[] rawBytes) {
+ if (rawBytes == null) {
+ throw new IllegalArgumentException("Raw bytes cannot be null");
+ }
+ return null;
+ }
+
+ /**
+ * Builder for {@link BluetoothLeAudioCodecConfigMetadata}.
+ * @hide
+ */
+ @SystemApi
+ public static final class Builder {
+ private long mAudioLocation = UNKNOWN_VALUE_PLACEHOLDER;
+ private byte[] mRawMetadata = null;
+
+ /**
+ * Create an empty builder.
+ * @hide
+ */
+ @SystemApi
+ public Builder() {}
+
+ /**
+ * Create a builder with copies of information from original object.
+ *
+ * @param original original object
+ * @hide
+ */
+ @SystemApi
+ public Builder(@NonNull BluetoothLeAudioCodecConfigMetadata original) {
+ mAudioLocation = original.getAudioLocation();
+ mRawMetadata = original.getRawMetadata();
+ }
+
+ /**
+ * Set the audio location information as defined in the Generic Audio section of Bluetooth
+ * Assigned numbers.
+ *
+ * @param audioLocation configured audio location, -1 if does not exist
+ * @return this builder
+ * @hide
+ */
+ @SystemApi
+ public @NonNull Builder setAudioLocation(long audioLocation) {
+ mAudioLocation = audioLocation;
+ return this;
+ }
+
+ /**
+ * Build {@link BluetoothLeAudioCodecConfigMetadata}.
+ *
+ * @return constructed {@link BluetoothLeAudioCodecConfigMetadata}
+ * @throws IllegalArgumentException if the object cannot be built
+ * @hide
+ */
+ @SystemApi
+ public @NonNull BluetoothLeAudioCodecConfigMetadata build() {
+ if (mRawMetadata == null) {
+ mRawMetadata = new byte[0];
+ }
+ return new BluetoothLeAudioCodecConfigMetadata(mAudioLocation, mRawMetadata);
+ }
+ }
+}