blob: 1f4b3a91475bb5043e81a0bfadbba4b133b7c9b3 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.media;
import android.media.AudioPatchFw;
import android.media.AudioPolicyConfig;
import android.media.AudioPortFw;
import android.media.AudioPortConfigFw;
import android.media.AudioUniqueIdUse;
import android.media.AudioVibratorInfo;
import android.media.CreateEffectRequest;
import android.media.CreateEffectResponse;
import android.media.CreateRecordRequest;
import android.media.CreateRecordResponse;
import android.media.CreateTrackRequest;
import android.media.CreateTrackResponse;
import android.media.DeviceConnectedState;
import android.media.OpenInputRequest;
import android.media.OpenInputResponse;
import android.media.OpenOutputRequest;
import android.media.OpenOutputResponse;
import android.media.EffectDescriptor;
import android.media.IAudioFlingerClient;
import android.media.IAudioRecord;
import android.media.IAudioTrack;
import android.media.MicrophoneInfoFw;
import android.media.RenderPosition;
import android.media.TrackSecondaryOutputInfo;
import android.media.audio.common.AudioChannelLayout;
import android.media.audio.common.AudioFormatDescription;
import android.media.audio.common.AudioLatencyMode;
import android.media.audio.common.AudioMMapPolicyInfo;
import android.media.audio.common.AudioMMapPolicyType;
import android.media.audio.common.AudioMode;
import android.media.audio.common.AudioStreamType;
import android.media.audio.common.AudioUuid;
/**
* {@hide}
*/
interface IAudioFlingerService {
/**
* Creates an audio track and registers it with AudioFlinger, or null if the track cannot be
* created.
*/
CreateTrackResponse createTrack(in CreateTrackRequest request);
CreateRecordResponse createRecord(in CreateRecordRequest request);
// FIXME Surprisingly, format/latency don't work for input handles
/**
* Queries the audio hardware state. This state never changes, and therefore can be cached.
*/
int sampleRate(int /* audio_io_handle_t */ ioHandle);
AudioFormatDescription format(int /* audio_io_handle_t */ output);
long frameCount(int /* audio_io_handle_t */ ioHandle);
/**
* Return the estimated latency in milliseconds.
*/
int latency(int /* audio_io_handle_t */ output);
/*
* Sets/gets the audio hardware state. This will probably be used by
* the preference panel, mostly.
*/
void setMasterVolume(float value);
void setMasterMute(boolean muted);
float masterVolume();
boolean masterMute();
void setMasterBalance(float balance);
float getMasterBalance();
/*
* Set/gets stream type state. This will probably be used by
* the preference panel, mostly.
*/
void setStreamVolume(AudioStreamType stream, float value, int /* audio_io_handle_t */ output);
void setStreamMute(AudioStreamType stream, boolean muted);
float streamVolume(AudioStreamType stream, int /* audio_io_handle_t */ output);
boolean streamMute(AudioStreamType stream);
// set audio mode.
void setMode(AudioMode mode);
// mic mute/state
void setMicMute(boolean state);
boolean getMicMute();
void setRecordSilenced(int /* audio_port_handle_t */ portId,
boolean silenced);
void setParameters(int /* audio_io_handle_t */ ioHandle,
@utf8InCpp String keyValuePairs);
@utf8InCpp String getParameters(int /* audio_io_handle_t */ ioHandle,
@utf8InCpp String keys);
// Register an object to receive audio input/output change and track notifications.
// For a given calling pid, AudioFlinger disregards any registrations after the first.
// Thus the IAudioFlingerClient must be a singleton per process.
void registerClient(IAudioFlingerClient client);
// Retrieve the audio recording buffer size in bytes.
// FIXME This API assumes a route, and so should be deprecated.
long getInputBufferSize(int sampleRate,
in AudioFormatDescription format,
in AudioChannelLayout channelMask);
OpenOutputResponse openOutput(in OpenOutputRequest request);
int /* audio_io_handle_t */ openDuplicateOutput(int /* audio_io_handle_t */ output1,
int /* audio_io_handle_t */ output2);
void closeOutput(int /* audio_io_handle_t */ output);
void suspendOutput(int /* audio_io_handle_t */ output);
void restoreOutput(int /* audio_io_handle_t */ output);
OpenInputResponse openInput(in OpenInputRequest request);
void closeInput(int /* audio_io_handle_t */ input);
void invalidateStream(AudioStreamType stream);
void setVoiceVolume(float volume);
RenderPosition getRenderPosition(int /* audio_io_handle_t */ output);
int getInputFramesLost(int /* audio_io_handle_t */ ioHandle);
int /* audio_unique_id_t */ newAudioUniqueId(AudioUniqueIdUse use);
void acquireAudioSessionId(int /* audio_session_t */ audioSession,
int /* pid_t */ pid,
int /* uid_t */ uid);
void releaseAudioSessionId(int /* audio_session_t */ audioSession,
int /* pid_t */ pid);
int queryNumberEffects();
EffectDescriptor queryEffect(int index);
/** preferredTypeFlag is interpreted as a uint32_t with the "effect flag" format. */
EffectDescriptor getEffectDescriptor(in AudioUuid effectUUID,
in AudioUuid typeUUID,
int preferredTypeFlag);
CreateEffectResponse createEffect(in CreateEffectRequest request);
void moveEffects(int /* audio_session_t */ session,
int /* audio_io_handle_t */ srcOutput,
int /* audio_io_handle_t */ dstOutput);
void setEffectSuspended(int effectId,
int /* audio_session_t */ sessionId,
boolean suspended);
int /* audio_module_handle_t */ loadHwModule(@utf8InCpp String name);
// helpers for android.media.AudioManager.getProperty(), see description there for meaning
// FIXME move these APIs to AudioPolicy to permit a more accurate implementation
// that looks on primary device for a stream with fast flag, primary flag, or first one.
int getPrimaryOutputSamplingRate();
long getPrimaryOutputFrameCount();
// Intended for AudioService to inform AudioFlinger of device's low RAM attribute,
// and should be called at most once. For a definition of what "low RAM" means, see
// android.app.ActivityManager.isLowRamDevice(). The totalMemory parameter
// is obtained from android.app.ActivityManager.MemoryInfo.totalMem.
void setLowRamDevice(boolean isLowRamDevice, long totalMemory);
/* Get attributes for a given audio port */
AudioPortFw getAudioPort(in AudioPortFw port);
/* Create an audio patch between several source and sink ports */
int /* audio_patch_handle_t */ createAudioPatch(in AudioPatchFw patch);
/* Release an audio patch */
void releaseAudioPatch(int /* audio_patch_handle_t */ handle);
/* List existing audio patches */
AudioPatchFw[] listAudioPatches(int maxCount);
/* Set audio port configuration */
void setAudioPortConfig(in AudioPortConfigFw config);
/* Get the HW synchronization source used for an audio session */
int /* audio_hw_sync_t */ getAudioHwSyncForSession(int /* audio_session_t */ sessionId);
/* Indicate JAVA services are ready (scheduling, power management ...) */
oneway void systemReady();
/* Indicate audio policy service is ready */
oneway void audioPolicyReady();
// Returns the number of frames per audio HAL buffer.
long frameCountHAL(int /* audio_io_handle_t */ ioHandle);
/* List available microphones and their characteristics */
MicrophoneInfoFw[] getMicrophones();
void setAudioHalPids(in int[] /* pid_t[] */ pids);
// Set vibrators' information.
// The value will be used to initialize HapticGenerator.
void setVibratorInfos(in AudioVibratorInfo[] vibratorInfos);
// Update secondary outputs.
// This usually happens when there is a dynamic policy registered.
void updateSecondaryOutputs(
in TrackSecondaryOutputInfo[] trackSecondaryOutputInfos);
AudioMMapPolicyInfo[] getMmapPolicyInfos(AudioMMapPolicyType policyType);
int getAAudioMixerBurstCount();
int getAAudioHardwareBurstMinUsec();
void setDeviceConnectedState(in AudioPortFw devicePort, DeviceConnectedState state);
// Used for tests only. Requires AIDL HAL to work.
void setSimulateDeviceConnections(boolean enabled);
/**
* Requests a given latency mode (See AudioLatencyMode.aidl) on an output stream.
* This can be used when some use case on a given mixer/stream can only be enabled
* if a specific latency mode is selected on the audio path below the HAL.
* For instance spatial audio with head tracking.
* output is the I/O handle of the output stream for which the request is made.
* latencyMode is the requested latency mode.
*/
void setRequestedLatencyMode(int output, AudioLatencyMode latencyMode);
/**
* Queries the list of latency modes (See LatencyMode.aidl) supported by an output stream.
* output is the I/O handle of the output stream to which the query applies.
* returns the list of supported latency modes.
*/
AudioLatencyMode[] getSupportedLatencyModes(int output);
/**
* Requests if the implementation supports controlling the latency modes
* over the Bluetooth A2DP or LE Audio links. If it does,
* setRequestedLatencyMode() and getSupportedLatencyModes() APIs can also be used
* for streams routed to Bluetooth and not just for the spatializer output.
*/
boolean supportsBluetoothVariableLatency();
/**
* Enables or disables the variable Bluetooth latency control mechanism in the
* audio framework and the audio HAL. This does not apply to the latency mode control
* on the spatializer output as this is a built-in feature.
*/
void setBluetoothVariableLatencyEnabled(boolean enabled);
/**
* Indicates if the variable Bluetooth latency control mechanism is enabled or disabled.
*/
boolean isBluetoothVariableLatencyEnabled();
/**
* Only implemented for AIDL. Provides the APM configuration which
* used to be in the XML file.
*/
AudioPolicyConfig getAudioPolicyConfig();
// When adding a new method, please review and update
// IAudioFlinger.h AudioFlingerServerAdapter::Delegate::TransactionCode
// AudioFlinger.cpp AudioFlinger::onTransactWrapper()
// AudioFlinger.cpp IAUDIOFLINGER_BINDER_METHOD_MACRO_LIST
}