CarAudioManager.java revision eaad6efb79308bed2fca49e6dd19f7608071ee27
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; 216f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkivimport android.media.AudioManager.OnAudioFocusChangeListener; 225672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Parkimport android.support.annotation.IntDef; 23df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkivimport android.support.annotation.RequiresPermission; 24a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoungimport android.support.car.CarManagerBase; 25eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chenimport android.support.car.CarNotConnectedException; 26a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 275672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Parkimport java.lang.annotation.Retention; 285672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Parkimport java.lang.annotation.RetentionPolicy; 295672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park 305672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park/** 315672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * APIs for handling car specific audio stuffs. 325672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 33e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Parkpublic abstract class CarAudioManager implements CarManagerBase { 34a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 35a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung /** 365672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for unspecified type. 375672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 385672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_DEFAULT = 0; 395672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 405672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for playing music. 415672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 425672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_MUSIC = 1; 435672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 445672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for H/W radio. 455672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 465672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_RADIO = 2; 475672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 485672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for playing navigation guidance. 495672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 505672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE = 3; 515672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 525672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for voice call 535672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 545672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_VOICE_CALL = 4; 555672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 565672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for voice search or voice command. 575672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 585672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_VOICE_COMMAND = 5; 595672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 605672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for playing alarm. 61a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung */ 625672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_ALARM = 6; 635672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 645672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for notification sound. 655672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 665672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_NOTIFICATION = 7; 675672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 685672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for system sound like UI feedback. 695672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 705672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_SYSTEM_SOUND = 8; 715672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 725672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Audio usage for playing safety alert. 735672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 745672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT = 9; 755672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park 765672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** @hide */ 775672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public static final int CAR_AUDIO_USAGE_MAX = CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT; 785672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park 795672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** @hide */ 805672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park @IntDef({CAR_AUDIO_USAGE_DEFAULT, CAR_AUDIO_USAGE_MUSIC, CAR_AUDIO_USAGE_RADIO, 815672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE, CAR_AUDIO_USAGE_VOICE_CALL, 825672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park CAR_AUDIO_USAGE_VOICE_COMMAND, CAR_AUDIO_USAGE_ALARM, CAR_AUDIO_USAGE_NOTIFICATION, 835672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park CAR_AUDIO_USAGE_SYSTEM_SOUND, CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT}) 845672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park @Retention(RetentionPolicy.SOURCE) 855672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park public @interface CarAudioUsage {} 86a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung 875672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park /** 885672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * Get {@link AudioAttrbutes} relevant for the given usage in car. 895672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * @param carUsage 905672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park * @return 915672e85bdf82f6a2350afb942dfe17b7c699af87Keun-young Park */ 92e54ac276796c6535558f8444d882adecd19ce2bdKeun-young Park public abstract AudioAttributes getAudioAttributesForCarUsage(@CarAudioUsage int carUsage); 936f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv 946f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv /** 956f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * Request audio focus. 966f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * Send a request to obtain the audio focus. 976f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @param l 986f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @param requestAttributes 996f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @param durationHint 1006f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @param flags 1016f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv */ 1026f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv public abstract int requestAudioFocus(OnAudioFocusChangeListener l, 1036f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv AudioAttributes requestAttributes, 1046f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv int durationHint, 1056f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv int flags) throws IllegalArgumentException; 1066f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv /** 1076f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * Abandon audio focus. Causes the previous focus owner, if any, to receive focus. 1086f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @param l 1096f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @param aa 1106f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv * @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED} 1116f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv */ 1126f3f402a7469e300fbfe65d950204fef995d4d8dVitalii Tomkiv public abstract int abandonAudioFocus(OnAudioFocusChangeListener l, AudioAttributes aa); 113df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 114df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 115df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Get {@link AudioFormat} for audio record. 116df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @return {@link AudioFormat} for audio record. 117df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 118df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv public abstract AudioFormat getAudioRecordAudioFormat(); 119df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 120df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 121df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Get minimum buffer size for {@link CarAudioRecord}. 122df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @return buffer size in bytes. 123df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 124df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv public abstract int getAudioRecordMinBufferSize(); 125df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 126df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 127df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Get maximum buffer size for {@link CarAudioRecord}. 128df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @return buffer size in bytes. 129df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 130df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv public abstract int getAudioRecordMaxBufferSize(); 131df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv 132df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv /** 133df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * Create a {@link CarAudioRecord} for the current {@link CarAudioManager}. There can be 134df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * multiple instances of {@link CarAudioRecord}. 135df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * This requires {@link android.Manifest.permission#RECORD_AUDIO} permission. 136df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @param bufferSize It should be a multiple of minimum buffer size acquired from 137df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * {@link #getAudioRecordMinBufferSize()}. This cannot exceed 138df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * {@link #getAudioRecordMaxBufferSize()}. 139df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @return {@link CarAudioRecord} instance for the given stream. 140df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @throws IllegalArgumentException if passed parameter like bufferSize is wrong. 141df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * @throws SecurityException if client does not have 142df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv * {@link android.Manifest.permission#RECORD_AUDIO} permission. 143df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv */ 144df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv @RequiresPermission(Manifest.permission.RECORD_AUDIO) 145df5e37387b5bcbed7345b11c0e8393d2d8959306Vitalii Tomkiv public abstract CarAudioRecord createCarAudioRecord(int bufferSize) throws SecurityException; 146eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen 147eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen /** 148eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * Check if media audio is muted or not. This will include music and radio. Any application 149eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * taking audio focus for media stream will get it out of mute state. 150eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * 151eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * @return {@code true} if media is muted. 152eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen */ 153eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen public abstract boolean isMediaMuted() throws CarNotConnectedException; 154eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen 155eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen /** 156eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * Mute or unmute media stream including radio. This can involve audio focus change to stop 157eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * whatever app holding audio focus now. If requester is currently holding audio focus, 158eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * it will get LOSS_TRANSIENT focus loss. 159eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * This API requires {@link android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission. 160eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * 161eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * @param mute {@code true} if media stream should be muted. 162eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * @return Mute state of system after the request. Note that mute request can fail if there 163eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * is higher priority audio already being played like phone call. 164eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen * @hide 165eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen */ 166eaad6efb79308bed2fca49e6dd19f7608071ee27Anthony Chen public abstract boolean setMediaMute(boolean mute) throws CarNotConnectedException; 167a74b9caa2fb6435f1c01c5e8766b89235c4e3d5akeunyoung} 168