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