1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.car.audio; 18 19 import static com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport.DUMP_INFO; 20 21 import android.annotation.NonNull; 22 import android.hardware.automotive.audiocontrol.DuckingInfo; 23 import android.media.AudioAttributes; 24 import android.util.IndentingPrintWriter; 25 26 import com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport; 27 28 import java.util.List; 29 import java.util.Objects; 30 31 /** 32 * Ducking information for a given car audio zone based on its focus state. 33 */ 34 public final class CarDuckingInfo { 35 public final int mZoneId; 36 public final List<String> mAddressesToDuck; 37 public final List<String> mAddressesToUnduck; 38 public final int[] mUsagesHoldingFocus; 39 CarDuckingInfo(int zoneId, @NonNull List<String> addressesToDuck, @NonNull List<String> addressesToUnduck, @NonNull int[] usagesHoldingFocus)40 public CarDuckingInfo(int zoneId, @NonNull List<String> addressesToDuck, 41 @NonNull List<String> addressesToUnduck, @NonNull int[] usagesHoldingFocus) { 42 mZoneId = zoneId; 43 mAddressesToDuck = Objects.requireNonNull(addressesToDuck); 44 mAddressesToUnduck = Objects.requireNonNull(addressesToUnduck); 45 mUsagesHoldingFocus = Objects.requireNonNull(usagesHoldingFocus); 46 } 47 48 /** 49 * Creates {@link DuckingInfo} instance from contents of {@link CarDuckingInfo}. 50 * 51 * <p>Converts usages to XSD strings as part of this process. 52 */ generateDuckingInfo()53 public DuckingInfo generateDuckingInfo() { 54 DuckingInfo duckingInfo = new DuckingInfo(); 55 duckingInfo.zoneId = mZoneId; 56 duckingInfo.deviceAddressesToDuck = mAddressesToDuck.toArray(new String[0]); 57 duckingInfo.deviceAddressesToUnduck = mAddressesToUnduck.toArray(new String[0]); 58 String[] usageStrings = new String[mUsagesHoldingFocus.length]; 59 for (int i = 0; i < mUsagesHoldingFocus.length; i++) { 60 usageStrings[i] = AudioAttributes.usageToXsdString(mUsagesHoldingFocus[i]); 61 } 62 duckingInfo.usagesHoldingFocus = usageStrings; 63 64 return duckingInfo; 65 } 66 67 @ExcludeFromCodeCoverageGeneratedReport(reason = DUMP_INFO) dump(IndentingPrintWriter writer)68 void dump(IndentingPrintWriter writer) { 69 writer.printf("Ducking Info for zone %d \n", mZoneId); 70 writer.increaseIndent(); 71 writer.printf("Addresses to duck: %s\n", 72 String.join(", ", mAddressesToDuck)); 73 writer.printf("Addresses to unduck: %s\n", 74 String.join(", ", mAddressesToUnduck)); 75 writer.println("Usages holding focus:"); 76 writer.increaseIndent(); 77 for (int usage : mUsagesHoldingFocus) { 78 writer.printf("%s, ", AudioAttributes.usageToXsdString(usage)); 79 } 80 writer.decreaseIndent(); 81 writer.println(); 82 writer.decreaseIndent(); 83 } 84 } 85