diff options
Diffstat (limited to 'framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java')
-rw-r--r-- | framework/java/android/bluetooth/BluetoothLeAudioCodecConfigMetadata.java | 200 |
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); + } + } +} |