• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.annotation.Nullable;
23 import android.media.AudioAttributes;
24 import android.media.AudioManager;
25 import android.media.AudioPlaybackConfiguration;
26 import android.util.SparseArray;
27 import android.util.proto.ProtoOutputStream;
28 
29 import com.android.car.audio.CarAudioService.SystemClockWrapper;
30 import com.android.car.internal.ExcludeFromCodeCoverageGeneratedReport;
31 import com.android.car.internal.util.IndentingPrintWriter;
32 import com.android.internal.util.Preconditions;
33 
34 import java.util.List;
35 import java.util.Objects;
36 
37 final class CarAudioPlaybackCallback extends AudioManager.AudioPlaybackCallback {
38     private final SparseArray<ZoneAudioPlaybackCallback> mCarAudioZonesToZonePlaybackCallback;
39 
CarAudioPlaybackCallback(@onNull SparseArray<CarAudioZone> carAudioZones, @Nullable CarAudioPlaybackMonitor carAudioPlaybackMonitor, SystemClockWrapper clock, int volumeKeyEventTimeoutMs)40     CarAudioPlaybackCallback(@NonNull SparseArray<CarAudioZone> carAudioZones,
41             @Nullable CarAudioPlaybackMonitor carAudioPlaybackMonitor,
42             SystemClockWrapper clock, int volumeKeyEventTimeoutMs) {
43         Objects.requireNonNull(carAudioZones, "Car audio zone cannot be null");
44         Preconditions.checkArgument(carAudioZones.size() > 0,
45                 "Car audio zones must not be empty");
46         mCarAudioZonesToZonePlaybackCallback = createCallbackMapping(carAudioZones,
47                 carAudioPlaybackMonitor, clock, volumeKeyEventTimeoutMs);
48     }
49 
createCallbackMapping(SparseArray<CarAudioZone> carAudioZones, @Nullable CarAudioPlaybackMonitor carAudioPlaybackMonitor, SystemClockWrapper clock, int volumeKeyEventTimeoutMs)50     private static SparseArray createCallbackMapping(SparseArray<CarAudioZone> carAudioZones,
51             @Nullable CarAudioPlaybackMonitor carAudioPlaybackMonitor,
52             SystemClockWrapper clock, int volumeKeyEventTimeoutMs) {
53         SparseArray<ZoneAudioPlaybackCallback> carAudioZonesToZonePlaybackCallback =
54                 new SparseArray<>();
55         for (int i = 0; i < carAudioZones.size(); i++) {
56             CarAudioZone zone = carAudioZones.get(i);
57             carAudioZonesToZonePlaybackCallback.put(zone.getId(),
58                     new ZoneAudioPlaybackCallback(zone, carAudioPlaybackMonitor, clock,
59                             volumeKeyEventTimeoutMs));
60         }
61         return carAudioZonesToZonePlaybackCallback;
62     }
63 
64     @ExcludeFromCodeCoverageGeneratedReport(reason = DUMP_INFO)
dump(IndentingPrintWriter writer)65     void dump(IndentingPrintWriter writer) {
66         writer.println("CarAudioPlaybackCallback");
67         writer.increaseIndent();
68 
69         writer.println("Audio playback callback for zones");
70         writer.increaseIndent();
71         dumpZoneCallbacks(writer);
72         writer.decreaseIndent();
73 
74         writer.decreaseIndent();
75     }
76 
77     @ExcludeFromCodeCoverageGeneratedReport(reason = DUMP_INFO)
dumpZoneCallbacks(IndentingPrintWriter writer)78     void dumpZoneCallbacks(IndentingPrintWriter writer) {
79         for (int i = 0; i < mCarAudioZonesToZonePlaybackCallback.size(); i++) {
80             mCarAudioZonesToZonePlaybackCallback.valueAt(i).dump(writer);
81         }
82     }
83 
84     @ExcludeFromCodeCoverageGeneratedReport(reason = DUMP_INFO)
dumpProto(ProtoOutputStream proto)85     void dumpProto(ProtoOutputStream proto) {
86         long callbackToken = proto.start(CarAudioDumpProto.CAR_AUDIO_PLAYBACK_CALLBACK);
87         for (int i = 0; i < mCarAudioZonesToZonePlaybackCallback.size(); i++) {
88             mCarAudioZonesToZonePlaybackCallback.valueAt(i).dumpProto(proto);
89         }
90         proto.end(callbackToken);
91     }
92 
93     @Override
onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configurations)94     public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configurations) {
95         for (int i = 0; i < mCarAudioZonesToZonePlaybackCallback.size(); i++) {
96             mCarAudioZonesToZonePlaybackCallback.valueAt(i).onPlaybackConfigChanged(configurations);
97         }
98     }
99 
getAllActiveAudioAttributesForZone(int audioZone)100     public List<AudioAttributes> getAllActiveAudioAttributesForZone(int audioZone) {
101         return mCarAudioZonesToZonePlaybackCallback.get(audioZone).getAllActiveAudioAttributes();
102     }
103 
resetStillActiveContexts()104     public void resetStillActiveContexts() {
105         for (int i = 0; i < mCarAudioZonesToZonePlaybackCallback.size(); i++) {
106             mCarAudioZonesToZonePlaybackCallback.valueAt(i).resetStillActiveContexts();
107         }
108     }
109 }
110