1 /* 2 * Copyright (C) 2020 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 android.media; 18 19 import android.media.AudioPatchFw; 20 import android.media.AudioPolicyConfig; 21 import android.media.AudioPortFw; 22 import android.media.AudioPortConfigFw; 23 import android.media.AudioUniqueIdUse; 24 import android.media.AudioVibratorInfo; 25 import android.media.CreateEffectRequest; 26 import android.media.CreateEffectResponse; 27 import android.media.CreateRecordRequest; 28 import android.media.CreateRecordResponse; 29 import android.media.CreateTrackRequest; 30 import android.media.CreateTrackResponse; 31 import android.media.DeviceConnectedState; 32 import android.media.OpenInputRequest; 33 import android.media.OpenInputResponse; 34 import android.media.OpenOutputRequest; 35 import android.media.OpenOutputResponse; 36 import android.media.EffectDescriptor; 37 import android.media.IAudioFlingerClient; 38 import android.media.IAudioRecord; 39 import android.media.IAudioTrack; 40 import android.media.ISoundDose; 41 import android.media.ISoundDoseCallback; 42 import android.media.MicrophoneInfoFw; 43 import android.media.RenderPosition; 44 import android.media.TrackSecondaryOutputInfo; 45 import android.media.audio.common.AudioChannelLayout; 46 import android.media.audio.common.AudioFormatDescription; 47 import android.media.audio.common.AudioLatencyMode; 48 import android.media.audio.common.AudioMMapPolicyInfo; 49 import android.media.audio.common.AudioMMapPolicyType; 50 import android.media.audio.common.AudioMode; 51 import android.media.audio.common.AudioStreamType; 52 import android.media.audio.common.AudioUuid; 53 54 /** 55 * {@hide} 56 */ 57 interface IAudioFlingerService { 58 /** 59 * Creates an audio track and registers it with AudioFlinger, or null if the track cannot be 60 * created. 61 */ createTrack(in CreateTrackRequest request)62 CreateTrackResponse createTrack(in CreateTrackRequest request); 63 createRecord(in CreateRecordRequest request)64 CreateRecordResponse createRecord(in CreateRecordRequest request); 65 66 // FIXME Surprisingly, format/latency don't work for input handles 67 68 /** 69 * Queries the audio hardware state. This state never changes, and therefore can be cached. 70 */ sampleRate(int ioHandle)71 int sampleRate(int /* audio_io_handle_t */ ioHandle); 72 format(int output)73 AudioFormatDescription format(int /* audio_io_handle_t */ output); 74 frameCount(int ioHandle)75 long frameCount(int /* audio_io_handle_t */ ioHandle); 76 77 /** 78 * Return the estimated latency in milliseconds. 79 */ latency(int output)80 int latency(int /* audio_io_handle_t */ output); 81 82 /* 83 * Sets/gets the audio hardware state. This will probably be used by 84 * the preference panel, mostly. 85 */ setMasterVolume(float value)86 void setMasterVolume(float value); setMasterMute(boolean muted)87 void setMasterMute(boolean muted); 88 masterVolume()89 float masterVolume(); masterMute()90 boolean masterMute(); 91 setMasterBalance(float balance)92 void setMasterBalance(float balance); getMasterBalance()93 float getMasterBalance(); 94 95 /* 96 * Set/gets stream type state. This will probably be used by 97 * the preference panel, mostly. 98 */ setStreamVolume(AudioStreamType stream, float value, int output)99 void setStreamVolume(AudioStreamType stream, float value, int /* audio_io_handle_t */ output); setStreamMute(AudioStreamType stream, boolean muted)100 void setStreamMute(AudioStreamType stream, boolean muted); streamVolume(AudioStreamType stream, int output)101 float streamVolume(AudioStreamType stream, int /* audio_io_handle_t */ output); streamMute(AudioStreamType stream)102 boolean streamMute(AudioStreamType stream); 103 104 // set audio mode. setMode(AudioMode mode)105 void setMode(AudioMode mode); 106 107 // mic mute/state setMicMute(boolean state)108 void setMicMute(boolean state); getMicMute()109 boolean getMicMute(); setRecordSilenced(int portId, boolean silenced)110 void setRecordSilenced(int /* audio_port_handle_t */ portId, 111 boolean silenced); 112 setParameters(int ioHandle, @utf8InCpp String keyValuePairs)113 void setParameters(int /* audio_io_handle_t */ ioHandle, 114 @utf8InCpp String keyValuePairs); getParameters(int ioHandle, @utf8InCpp String keys)115 @utf8InCpp String getParameters(int /* audio_io_handle_t */ ioHandle, 116 @utf8InCpp String keys); 117 118 // Register an object to receive audio input/output change and track notifications. 119 // For a given calling pid, AudioFlinger disregards any registrations after the first. 120 // Thus the IAudioFlingerClient must be a singleton per process. registerClient(IAudioFlingerClient client)121 void registerClient(IAudioFlingerClient client); 122 123 // Retrieve the audio recording buffer size in bytes. 124 // FIXME This API assumes a route, and so should be deprecated. getInputBufferSize(int sampleRate, in AudioFormatDescription format, in AudioChannelLayout channelMask)125 long getInputBufferSize(int sampleRate, 126 in AudioFormatDescription format, 127 in AudioChannelLayout channelMask); 128 openOutput(in OpenOutputRequest request)129 OpenOutputResponse openOutput(in OpenOutputRequest request); openDuplicateOutput(int output1, int output2)130 int /* audio_io_handle_t */ openDuplicateOutput(int /* audio_io_handle_t */ output1, 131 int /* audio_io_handle_t */ output2); closeOutput(int output)132 void closeOutput(int /* audio_io_handle_t */ output); suspendOutput(int output)133 void suspendOutput(int /* audio_io_handle_t */ output); restoreOutput(int output)134 void restoreOutput(int /* audio_io_handle_t */ output); 135 openInput(in OpenInputRequest request)136 OpenInputResponse openInput(in OpenInputRequest request); closeInput(int input)137 void closeInput(int /* audio_io_handle_t */ input); 138 setVoiceVolume(float volume)139 void setVoiceVolume(float volume); 140 getRenderPosition(int output)141 RenderPosition getRenderPosition(int /* audio_io_handle_t */ output); 142 getInputFramesLost(int ioHandle)143 int getInputFramesLost(int /* audio_io_handle_t */ ioHandle); 144 newAudioUniqueId(AudioUniqueIdUse use)145 int /* audio_unique_id_t */ newAudioUniqueId(AudioUniqueIdUse use); 146 acquireAudioSessionId(int audioSession, int pid, int uid)147 void acquireAudioSessionId(int /* audio_session_t */ audioSession, 148 int /* pid_t */ pid, 149 int /* uid_t */ uid); releaseAudioSessionId(int audioSession, int pid)150 void releaseAudioSessionId(int /* audio_session_t */ audioSession, 151 int /* pid_t */ pid); 152 queryNumberEffects()153 int queryNumberEffects(); 154 queryEffect(int index)155 EffectDescriptor queryEffect(int index); 156 157 /** preferredTypeFlag is interpreted as a uint32_t with the "effect flag" format. */ getEffectDescriptor(in AudioUuid effectUUID, in AudioUuid typeUUID, int preferredTypeFlag)158 EffectDescriptor getEffectDescriptor(in AudioUuid effectUUID, 159 in AudioUuid typeUUID, 160 int preferredTypeFlag); 161 createEffect(in CreateEffectRequest request)162 CreateEffectResponse createEffect(in CreateEffectRequest request); 163 moveEffects(int session, int srcOutput, int dstOutput)164 void moveEffects(int /* audio_session_t */ session, 165 int /* audio_io_handle_t */ srcOutput, 166 int /* audio_io_handle_t */ dstOutput); 167 setEffectSuspended(int effectId, int sessionId, boolean suspended)168 void setEffectSuspended(int effectId, 169 int /* audio_session_t */ sessionId, 170 boolean suspended); 171 loadHwModule(@tf8InCpp String name)172 int /* audio_module_handle_t */ loadHwModule(@utf8InCpp String name); 173 174 // helpers for android.media.AudioManager.getProperty(), see description there for meaning 175 // FIXME move these APIs to AudioPolicy to permit a more accurate implementation 176 // that looks on primary device for a stream with fast flag, primary flag, or first one. getPrimaryOutputSamplingRate()177 int getPrimaryOutputSamplingRate(); getPrimaryOutputFrameCount()178 long getPrimaryOutputFrameCount(); 179 180 // Intended for AudioService to inform AudioFlinger of device's low RAM attribute, 181 // and should be called at most once. For a definition of what "low RAM" means, see 182 // android.app.ActivityManager.isLowRamDevice(). The totalMemory parameter 183 // is obtained from android.app.ActivityManager.MemoryInfo.totalMem. setLowRamDevice(boolean isLowRamDevice, long totalMemory)184 void setLowRamDevice(boolean isLowRamDevice, long totalMemory); 185 186 /* Get attributes for a given audio port */ getAudioPort(in AudioPortFw port)187 AudioPortFw getAudioPort(in AudioPortFw port); 188 189 /* Create an audio patch between several source and sink ports */ createAudioPatch(in AudioPatchFw patch)190 int /* audio_patch_handle_t */ createAudioPatch(in AudioPatchFw patch); 191 192 /* Release an audio patch */ releaseAudioPatch(int handle)193 void releaseAudioPatch(int /* audio_patch_handle_t */ handle); 194 195 /* List existing audio patches */ listAudioPatches(int maxCount)196 AudioPatchFw[] listAudioPatches(int maxCount); 197 /* Set audio port configuration */ setAudioPortConfig(in AudioPortConfigFw config)198 void setAudioPortConfig(in AudioPortConfigFw config); 199 200 /* Get the HW synchronization source used for an audio session */ getAudioHwSyncForSession(int sessionId)201 int /* audio_hw_sync_t */ getAudioHwSyncForSession(int /* audio_session_t */ sessionId); 202 203 /* Indicate JAVA services are ready (scheduling, power management ...) */ systemReady()204 oneway void systemReady(); 205 206 /* Indicate audio policy service is ready */ audioPolicyReady()207 oneway void audioPolicyReady(); 208 209 // Returns the number of frames per audio HAL buffer. frameCountHAL(int ioHandle)210 long frameCountHAL(int /* audio_io_handle_t */ ioHandle); 211 212 /* List available microphones and their characteristics */ getMicrophones()213 MicrophoneInfoFw[] getMicrophones(); 214 setAudioHalPids(in int[] pids)215 void setAudioHalPids(in int[] /* pid_t[] */ pids); 216 217 // Set vibrators' information. 218 // The value will be used to initialize HapticGenerator. setVibratorInfos(in AudioVibratorInfo[] vibratorInfos)219 void setVibratorInfos(in AudioVibratorInfo[] vibratorInfos); 220 221 // Update secondary outputs. 222 // This usually happens when there is a dynamic policy registered. updateSecondaryOutputs( in TrackSecondaryOutputInfo[] trackSecondaryOutputInfos)223 void updateSecondaryOutputs( 224 in TrackSecondaryOutputInfo[] trackSecondaryOutputInfos); 225 getMmapPolicyInfos(AudioMMapPolicyType policyType)226 AudioMMapPolicyInfo[] getMmapPolicyInfos(AudioMMapPolicyType policyType); 227 getAAudioMixerBurstCount()228 int getAAudioMixerBurstCount(); 229 getAAudioHardwareBurstMinUsec()230 int getAAudioHardwareBurstMinUsec(); 231 setDeviceConnectedState(in AudioPortFw devicePort, DeviceConnectedState state)232 void setDeviceConnectedState(in AudioPortFw devicePort, DeviceConnectedState state); 233 234 // Used for tests only. Requires AIDL HAL to work. setSimulateDeviceConnections(boolean enabled)235 void setSimulateDeviceConnections(boolean enabled); 236 237 /** 238 * Requests a given latency mode (See AudioLatencyMode.aidl) on an output stream. 239 * This can be used when some use case on a given mixer/stream can only be enabled 240 * if a specific latency mode is selected on the audio path below the HAL. 241 * For instance spatial audio with head tracking. 242 * output is the I/O handle of the output stream for which the request is made. 243 * latencyMode is the requested latency mode. 244 */ setRequestedLatencyMode(int output, AudioLatencyMode latencyMode)245 void setRequestedLatencyMode(int output, AudioLatencyMode latencyMode); 246 247 /** 248 * Queries the list of latency modes (See LatencyMode.aidl) supported by an output stream. 249 * output is the I/O handle of the output stream to which the query applies. 250 * returns the list of supported latency modes. 251 */ getSupportedLatencyModes(int output)252 AudioLatencyMode[] getSupportedLatencyModes(int output); 253 254 /** 255 * Requests if the implementation supports controlling the latency modes 256 * over the Bluetooth A2DP or LE Audio links. If it does, 257 * setRequestedLatencyMode() and getSupportedLatencyModes() APIs can also be used 258 * for streams routed to Bluetooth and not just for the spatializer output. 259 */ supportsBluetoothVariableLatency()260 boolean supportsBluetoothVariableLatency(); 261 262 /** 263 * Enables or disables the variable Bluetooth latency control mechanism in the 264 * audio framework and the audio HAL. This does not apply to the latency mode control 265 * on the spatializer output as this is a built-in feature. 266 */ setBluetoothVariableLatencyEnabled(boolean enabled)267 void setBluetoothVariableLatencyEnabled(boolean enabled); 268 269 /** 270 * Indicates if the variable Bluetooth latency control mechanism is enabled or disabled. 271 */ isBluetoothVariableLatencyEnabled()272 boolean isBluetoothVariableLatencyEnabled(); 273 274 /** 275 * Registers the sound dose callback and returns the interface for executing 276 * sound dose methods on the audio server. 277 */ getSoundDoseInterface(in ISoundDoseCallback callback)278 ISoundDose getSoundDoseInterface(in ISoundDoseCallback callback); 279 280 /** 281 * Invalidate all tracks with given port ids. 282 */ invalidateTracks(in int[] portIds)283 void invalidateTracks(in int[] /* audio_port_handle_t[] */ portIds); 284 285 /** 286 * Only implemented for AIDL. Provides the APM configuration which 287 * used to be in the XML file. 288 */ getAudioPolicyConfig()289 AudioPolicyConfig getAudioPolicyConfig(); 290 291 // When adding a new method, please review and update 292 // IAudioFlinger.h AudioFlingerServerAdapter::Delegate::TransactionCode 293 // AudioFlinger.cpp AudioFlinger::onTransactWrapper() 294 // AudioFlinger.cpp IAUDIOFLINGER_BINDER_METHOD_MACRO_LIST 295 } 296