1a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung/* 2a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * Copyright (C) 2015 The Android Open Source Project 3a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * 4a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * Licensed under the Apache License, Version 2.0 (the "License"); 5a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * you may not use this file except in compliance with the License. 6a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * You may obtain a copy of the License at 7a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * 8a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * http://www.apache.org/licenses/LICENSE-2.0 9a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * 10a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * Unless required by applicable law or agreed to in writing, software 11a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * distributed under the License is distributed on an "AS IS" BASIS, 12a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * See the License for the specific language governing permissions and 14a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung * limitations under the License. 15a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung */ 16a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoungpackage android.support.car.media; 17a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 18df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkivimport android.Manifest; 19a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoungimport android.media.AudioAttributes; 20df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkivimport android.media.AudioFormat; 219aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrupimport android.media.AudioManager; 226f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkivimport android.media.AudioManager.OnAudioFocusChangeListener; 235672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Parkimport android.support.annotation.IntDef; 24df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkivimport android.support.annotation.RequiresPermission; 25a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoungimport android.support.car.CarManagerBase; 26eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chenimport android.support.car.CarNotConnectedException; 27a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 285672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Parkimport java.lang.annotation.Retention; 295672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Parkimport java.lang.annotation.RetentionPolicy; 305672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park 315672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park/** 3219c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * APIs for handling car-specific audio use cases. Provides a set of CAR_AUDIO_USAGE_* constants 3319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * that can be used to route audio by use case to the car. Important beyond the normal 3419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * {@link AudioManager} class methods because it handles multi channel audio. Includes use cases 3519c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * such as routing call audio only to the driver and not through all speakers. 365672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 37e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpublic abstract class CarAudioManager implements CarManagerBase { 38a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 39a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung /** 405672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for unspecified type. 415672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 425672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_DEFAULT = 0; 435672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 445672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for playing music. 455672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 465672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_MUSIC = 1; 475672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 4819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Audio usage for hardware radio. 499aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup * @hide 505672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 515672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_RADIO = 2; 525672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 535672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for playing navigation guidance. 545672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 555672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE = 3; 565672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 5719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Audio usage for voice call. 585672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 595672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_VOICE_CALL = 4; 605672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 615672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for voice search or voice command. 625672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 635672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_VOICE_COMMAND = 5; 645672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 655672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for playing alarm. 66a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung */ 675672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_ALARM = 6; 685672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 695672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for notification sound. 705672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 715672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_NOTIFICATION = 7; 725672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 7319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Audio usage for system sound (such as UI feedback). 745672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 755672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_SYSTEM_SOUND = 8; 765672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 7719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Audio usage for playing safety alerts. 785672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 795672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT = 9; 805672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park 815672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** @hide */ 825672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_MAX = CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT; 835672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park 845672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** @hide */ 855672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park @IntDef({CAR_AUDIO_USAGE_DEFAULT, CAR_AUDIO_USAGE_MUSIC, CAR_AUDIO_USAGE_RADIO, 865672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE, CAR_AUDIO_USAGE_VOICE_CALL, 875672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park CAR_AUDIO_USAGE_VOICE_COMMAND, CAR_AUDIO_USAGE_ALARM, CAR_AUDIO_USAGE_NOTIFICATION, 885672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park CAR_AUDIO_USAGE_SYSTEM_SOUND, CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT}) 895672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park @Retention(RetentionPolicy.SOURCE) 905672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public @interface CarAudioUsage {} 91a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 925672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 9319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Return {@link AudioAttributes} relevant for the given usage in car. 945672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 95150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park public abstract AudioAttributes getAudioAttributesForCarUsage(@CarAudioUsage int carUsage) 96150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park throws CarNotConnectedException; 976f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv 986f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv /** 9919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Request audio focus. Send a request to obtain audio focus. 1009aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup * 10119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @param listener The listener to be notified of audio focus changes. 10219c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @param requestAttributes Obtained from {@link #getAudioAttributesForCarUsage(int)}. 10319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @param durationHint Use {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT} to indicate this 10419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * focus request is temporary and focus will be abandoned shortly. Examples of transient 10519c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * requests include playback of driving directions and notification sounds. 10619c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * </p> 10719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Use {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate it's OK for the 10819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * previous focus owner to keep playing if it ducks its audio output. 10919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * </p> 11019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Use {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} for a temporary request that 11119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * benefits from the system not playing disruptive sounds such as notifications, for use cases 11219c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * such as voice memo recording, or speech recognition. 11319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * </p> 11419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Use {@link AudioManager#AUDIOFOCUS_GAIN} for a focus request of unknown duration, such as 11519c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * the playback of a song or a video. 1169aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup * @return {@link AudioManager#AUDIOFOCUS_REQUEST_FAILED}, or 11719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * {@link AudioManager#AUDIOFOCUS_REQUEST_GRANTED}. 1189aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup * @throws IllegalArgumentException 1199aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup */ 1201ac59caa6b1bc760aef0adb3c675b49bfa53af9fJason Tholstrup public abstract int requestAudioFocus(OnAudioFocusChangeListener listener, 1219aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup AudioAttributes requestAttributes, 122150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park int durationHint) throws CarNotConnectedException, IllegalArgumentException; 1239aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup 1249aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup /** 1259aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup * @hide 1266f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv */ 1271ac59caa6b1bc760aef0adb3c675b49bfa53af9fJason Tholstrup public abstract int requestAudioFocus(OnAudioFocusChangeListener listener, 1289aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup AudioAttributes requestAttributes, 1299aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup int durationHint, 130150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park int flags) throws CarNotConnectedException, IllegalArgumentException; 1316f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv /** 13219c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Abandon audio focus. Causes the previous focus owner (if any) to receive focus. 13319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @param listener The listener with which focus was requested. 1346f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @param aa 1356f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv */ 136150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park public abstract void abandonAudioFocus(OnAudioFocusChangeListener listener, AudioAttributes aa); 137df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 138df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 139df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Get {@link AudioFormat} for audio record. 140df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @return {@link AudioFormat} for audio record. 141df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 142150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park public abstract AudioFormat getAudioRecordAudioFormat() throws CarNotConnectedException; 143df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 144150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park public abstract boolean isAudioRecordSupported() throws CarNotConnectedException; 145d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup 146df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 147df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Get minimum buffer size for {@link CarAudioRecord}. 148c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup * 14919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @return Buffer size in bytes. 150df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 151c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup public abstract int getAudioRecordMinBufferSize() 152d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup throws CarNotConnectedException; 153df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 154df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 155df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Get maximum buffer size for {@link CarAudioRecord}. 156c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup * 15719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @return Buffer size in bytes. 158df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 159c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup public abstract int getAudioRecordMaxBufferSize() 160d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup throws CarNotConnectedException; 161df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 162df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 163df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Create a {@link CarAudioRecord} for the current {@link CarAudioManager}. There can be 16419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * multiple instances of {@link CarAudioRecord}. Requires {@link 165c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup * android.Manifest.permission#RECORD_AUDIO} permission. 166c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup * 16719c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @param bufferSize Should be a multiple of minimum buffer size acquired from {@link 16819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * #getAudioRecordMinBufferSize()}. Cannot exceed {@link #getAudioRecordMaxBufferSize()}. 169c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup * 170df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @return {@link CarAudioRecord} instance for the given stream. 17119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @throws IllegalArgumentException if passed parameter (such as bufferSize) is wrong. 172df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @throws SecurityException if client does not have 17319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * {@link android.Manifest.permission#RECORD_AUDIO} permission. 174df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 175df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv @RequiresPermission(Manifest.permission.RECORD_AUDIO) 176c5dc1964a09d266243ba418e96f1937b199ec93eJason Tholstrup public abstract CarAudioRecord createCarAudioRecord(int bufferSize) 177d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup throws SecurityException, CarNotConnectedException; 178eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen 179eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen /** 18019c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Check if media audio is muted or not (includes music and radio). Any application 18119c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * taking audio focus for media stream will move it out of a mute state. 182eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * 18319c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @return Returns {@code true} if media is muted. 184eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen */ 185eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen public abstract boolean isMediaMuted() throws CarNotConnectedException; 186eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen 187eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen /** 18819c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * Mute or unmute media stream including radio. Can involve audio focus change to stop 18919c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * the the app currently holding audio focus. If requester is currently holding audio focus, 190d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup * it gets LOSS_TRANSIENT focus loss. Requires 191d72b53500006e84b0c69e650878267c693c164a3Jason Tholstrup * {@link android.support.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} 1929aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup * permission. 193eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * 19419c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @param mute Returns {@code true} if media stream should be muted. 19519c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * @return Mute state of system after the request. A mute request can fail if a higher priority 19619c8ab20a71c725316241f4b0c8f44ce18c39d39Heidi von Markham * audio stream (such as a voice call) is already being played. 197eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * @hide 198eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen */ 199eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen public abstract boolean setMediaMute(boolean mute) throws CarNotConnectedException; 200a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung} 201