• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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;
18 
19 import android.content.Context;
20 import android.hardware.automotive.vehicle.V2_0.VehicleAudioContextFlag;
21 import android.media.AudioAttributes;
22 import android.media.IVolumeController;
23 
24 import com.android.car.hal.AudioHalService;
25 
26 import java.io.PrintWriter;
27 
28 /**
29  * Handles car volume controls.
30  *
31  * It delegates to a {@link com.android.car.CarVolumeService.CarVolumeController} to do proper
32  * volume controls based on different car properties.
33  *
34  * @hide
35  */
36 public class CarVolumeService {
37     private static final String TAG = "CarVolumeService";
38 
39     public static int DEFAULT_CAR_AUDIO_CONTEXT =
40             VehicleAudioContextFlag.MUSIC_FLAG;
41     private final Context mContext;
42     private final AudioHalService mAudioHal;
43     private final CarAudioService mAudioService;
44     private final CarInputService mInputService;
45 
46     private CarVolumeController mCarVolumeController;
47 
48     private IVolumeController mIVolumeController;
49 
androidStreamToCarUsage(int logicalAndroidStream)50     public static int androidStreamToCarUsage(int logicalAndroidStream) {
51         return CarAudioAttributesUtil.getCarUsageFromAudioAttributes(
52                 new AudioAttributes.Builder()
53                         .setLegacyStreamType(logicalAndroidStream).build());
54     }
55 
CarVolumeService(Context context, CarAudioService audioService, AudioHalService audioHal, CarInputService inputService)56     public CarVolumeService(Context context, CarAudioService audioService, AudioHalService audioHal,
57                             CarInputService inputService) {
58         mContext = context;
59         mAudioHal = audioHal;
60         mAudioService = audioService;
61         mInputService = inputService;
62     }
63 
init()64     public synchronized void init() {
65         mCarVolumeController = CarVolumeControllerFactory.createCarVolumeController(mContext,
66                 mAudioService, mAudioHal, mInputService);
67 
68         mCarVolumeController.init();
69         if (mIVolumeController != null) {
70             mCarVolumeController.setVolumeController(mIVolumeController);
71         }
72         mInputService.setVolumeKeyListener(mCarVolumeController);
73     }
74 
release()75     public synchronized void release() {
76         mCarVolumeController.release();
77     }
78 
setStreamVolume(int streamType, int index, int flags)79     public void setStreamVolume(int streamType, int index, int flags) {
80         getController().setStreamVolume(streamType, index, flags);
81     }
82 
setVolumeController(IVolumeController controller)83     public synchronized void setVolumeController(IVolumeController controller) {
84         mIVolumeController = controller;
85         getController().setVolumeController(controller);
86     }
87 
getStreamMaxVolume(int stream)88     public int getStreamMaxVolume(int stream) {
89         return getController().getStreamMaxVolume(stream);
90     }
91 
getStreamMinVolume(int stream)92     public int getStreamMinVolume(int stream) {
93         return getController().getStreamMinVolume(stream);
94     }
95 
getStreamVolume(int stream)96     public int getStreamVolume(int stream) {
97         return getController().getStreamVolume(stream);
98     }
99 
dump(PrintWriter writer)100     public void dump(PrintWriter writer) {
101         mCarVolumeController.dump(writer);
102     }
103 
getController()104     private synchronized CarVolumeController getController() {
105         return mCarVolumeController;
106     }
107 
108     /**
109      * Abstraction layer for volume controls, so that we don't have if-else check for audio
110      * properties everywhere.
111      */
112     public static abstract class CarVolumeController implements CarInputService.KeyEventListener {
init()113         abstract void init();
release()114         abstract void release();
setStreamVolume(int stream, int index, int flags)115         abstract public void setStreamVolume(int stream, int index, int flags);
setVolumeController(IVolumeController controller)116         abstract public void setVolumeController(IVolumeController controller);
getStreamMaxVolume(int stream)117         abstract public int getStreamMaxVolume(int stream);
getStreamMinVolume(int stream)118         abstract public int getStreamMinVolume(int stream);
getStreamVolume(int stream)119         abstract public int getStreamVolume(int stream);
dump(PrintWriter writer)120         abstract public void dump(PrintWriter writer);
121     }
122 }
123