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