blob: 0e059f71b44f28917b06da42e575eeafcb71fb85 [file] [log] [blame]
/*
* Copyright (C) 2007 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.
*/
#ifndef ANDROID_IAUDIOFLINGER_H
#define ANDROID_IAUDIOFLINGER_H
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
#include <utils/RefBase.h>
#include <utils/Errors.h>
#include <binder/IInterface.h>
#include <media/AidlConversion.h>
#include <media/AudioClient.h>
#include <media/AudioCommonTypes.h>
#include <media/DeviceDescriptorBase.h>
#include <system/audio.h>
#include <system/audio_effect.h>
#include <system/audio_policy.h>
#include <utils/String8.h>
#include <media/MicrophoneInfo.h>
#include <map>
#include <string>
#include <vector>
#include <android/media/AudioVibratorInfo.h>
#include <android/media/BnAudioFlingerService.h>
#include <android/media/BpAudioFlingerService.h>
#include <android/content/AttributionSourceState.h>
#include "android/media/CreateEffectRequest.h"
#include "android/media/CreateEffectResponse.h"
#include "android/media/CreateRecordRequest.h"
#include "android/media/CreateRecordResponse.h"
#include "android/media/CreateTrackRequest.h"
#include "android/media/CreateTrackResponse.h"
#include "android/media/IAudioRecord.h"
#include "android/media/IAudioFlingerClient.h"
#include "android/media/IAudioTrack.h"
#include "android/media/IAudioTrackCallback.h"
#include "android/media/IEffect.h"
#include "android/media/IEffectClient.h"
#include "android/media/OpenInputRequest.h"
#include "android/media/OpenInputResponse.h"
#include "android/media/OpenOutputRequest.h"
#include "android/media/OpenOutputResponse.h"
#include "android/media/TrackSecondaryOutputInfo.h"
namespace android {
// ----------------------------------------------------------------------------
class IAudioFlinger : public RefBase {
public:
static constexpr char DEFAULT_SERVICE_NAME[] = "media.audio_flinger";
virtual ~IAudioFlinger() = default;
/* CreateTrackInput contains all input arguments sent by AudioTrack to AudioFlinger
* when calling createTrack() including arguments that will be updated by AudioFlinger
* and returned in CreateTrackOutput object
*/
class CreateTrackInput {
public:
/* input */
audio_attributes_t attr;
audio_config_t config;
AudioClient clientInfo;
sp<IMemory> sharedBuffer;
uint32_t notificationsPerBuffer;
float speed;
sp<media::IAudioTrackCallback> audioTrackCallback;
/* input/output */
audio_output_flags_t flags;
size_t frameCount;
size_t notificationFrameCount;
audio_port_handle_t selectedDeviceId;
audio_session_t sessionId;
ConversionResult<media::CreateTrackRequest> toAidl() const;
static ConversionResult<CreateTrackInput> fromAidl(const media::CreateTrackRequest& aidl);
};
/* CreateTrackOutput contains all output arguments returned by AudioFlinger to AudioTrack
* when calling createTrack() including arguments that were passed as I/O for update by
* CreateTrackInput.
*/
class CreateTrackOutput {
public:
/* input/output */
audio_output_flags_t flags;
size_t frameCount;
size_t notificationFrameCount;
audio_port_handle_t selectedDeviceId;
audio_session_t sessionId;
/* output */
uint32_t sampleRate;
audio_stream_type_t streamType;
size_t afFrameCount;
uint32_t afSampleRate;
uint32_t afLatencyMs;
audio_io_handle_t outputId;
audio_port_handle_t portId;
sp<media::IAudioTrack> audioTrack;
ConversionResult<media::CreateTrackResponse> toAidl() const;
static ConversionResult<CreateTrackOutput> fromAidl(const media::CreateTrackResponse& aidl);
};
/* CreateRecordInput contains all input arguments sent by AudioRecord to AudioFlinger
* when calling createRecord() including arguments that will be updated by AudioFlinger
* and returned in CreateRecordOutput object
*/
class CreateRecordInput {
public:
/* input */
audio_attributes_t attr;
audio_config_base_t config;
AudioClient clientInfo;
audio_unique_id_t riid;
int32_t maxSharedAudioHistoryMs;
/* input/output */
audio_input_flags_t flags;
size_t frameCount;
size_t notificationFrameCount;
audio_port_handle_t selectedDeviceId;
audio_session_t sessionId;
ConversionResult<media::CreateRecordRequest> toAidl() const;
static ConversionResult<CreateRecordInput> fromAidl(const media::CreateRecordRequest& aidl);
};
/* CreateRecordOutput contains all output arguments returned by AudioFlinger to AudioRecord
* when calling createRecord() including arguments that were passed as I/O for update by
* CreateRecordInput.
*/
class CreateRecordOutput {
public:
/* input/output */
audio_input_flags_t flags;
size_t frameCount;
size_t notificationFrameCount;
audio_port_handle_t selectedDeviceId;
audio_session_t sessionId;
/* output */
uint32_t sampleRate;
audio_io_handle_t inputId;
sp<IMemory> cblk;
sp<IMemory> buffers;
audio_port_handle_t portId;
sp<media::IAudioRecord> audioRecord;
ConversionResult<media::CreateRecordResponse> toAidl() const;
static ConversionResult<CreateRecordOutput>
fromAidl(const media::CreateRecordResponse& aidl);
};
/* create an audio track and registers it with AudioFlinger.
* The audioTrack field will be null if the track cannot be created and the status will reflect
* failure.
*/
virtual status_t createTrack(const media::CreateTrackRequest& input,
media::CreateTrackResponse& output) = 0;
/* create an audio record and registers it with AudioFlinger.
* The audioRecord field will be null if the track cannot be created and the status will reflect
* failure.
*/
virtual status_t createRecord(const media::CreateRecordRequest& input,
media::CreateRecordResponse& output) = 0;
// FIXME Surprisingly, format/latency don't work for input handles
/* query the audio hardware state. This state never changes,
* and therefore can be cached.
*/
virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const = 0;
// reserved; formerly channelCount()
virtual audio_format_t format(audio_io_handle_t output) const = 0;
virtual size_t frameCount(audio_io_handle_t ioHandle) const = 0;
// return estimated latency in milliseconds
virtual uint32_t latency(audio_io_handle_t output) const = 0;
/* set/get the audio hardware state. This will probably be used by
* the preference panel, mostly.
*/
virtual status_t setMasterVolume(float value) = 0;
virtual status_t setMasterMute(bool muted) = 0;
virtual float masterVolume() const = 0;
virtual bool masterMute() const = 0;
virtual status_t setMasterBalance(float balance) = 0;
virtual status_t getMasterBalance(float *balance) const = 0;
/* set/get stream type state. This will probably be used by
* the preference panel, mostly.
*/
virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
audio_io_handle_t output) = 0;
virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) = 0;
virtual float streamVolume(audio_stream_type_t stream,
audio_io_handle_t output) const = 0;
virtual bool streamMute(audio_stream_type_t stream) const = 0;
// set audio mode
virtual status_t setMode(audio_mode_t mode) = 0;
// mic mute/state
virtual status_t setMicMute(bool state) = 0;
virtual bool getMicMute() const = 0;
virtual void setRecordSilenced(audio_port_handle_t portId, bool silenced) = 0;
virtual status_t setParameters(audio_io_handle_t ioHandle,
const String8& keyValuePairs) = 0;
virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys)
const = 0;
// 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.
virtual void registerClient(const sp<media::IAudioFlingerClient>& client) = 0;
// retrieve the audio recording buffer size in bytes
// FIXME This API assumes a route, and so should be deprecated.
virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
audio_channel_mask_t channelMask) const = 0;
virtual status_t openOutput(const media::OpenOutputRequest& request,
media::OpenOutputResponse* response) = 0;
virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
audio_io_handle_t output2) = 0;
virtual status_t closeOutput(audio_io_handle_t output) = 0;
virtual status_t suspendOutput(audio_io_handle_t output) = 0;
virtual status_t restoreOutput(audio_io_handle_t output) = 0;
virtual status_t openInput(const media::OpenInputRequest& request,
media::OpenInputResponse* response) = 0;
virtual status_t closeInput(audio_io_handle_t input) = 0;
virtual status_t invalidateStream(audio_stream_type_t stream) = 0;
virtual status_t setVoiceVolume(float volume) = 0;
virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
audio_io_handle_t output) const = 0;
virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const = 0;
virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) = 0;
virtual void acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) = 0;
virtual void releaseAudioSessionId(audio_session_t audioSession, pid_t pid) = 0;
virtual status_t queryNumberEffects(uint32_t *numEffects) const = 0;
virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const = 0;
virtual status_t getEffectDescriptor(const effect_uuid_t *pEffectUUID,
const effect_uuid_t *pTypeUUID,
uint32_t preferredTypeFlag,
effect_descriptor_t *pDescriptor) const = 0;
virtual status_t createEffect(const media::CreateEffectRequest& request,
media::CreateEffectResponse* response) = 0;
virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
audio_io_handle_t dstOutput) = 0;
virtual void setEffectSuspended(int effectId,
audio_session_t sessionId,
bool suspended) = 0;
virtual audio_module_handle_t loadHwModule(const char *name) = 0;
// 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.
virtual uint32_t getPrimaryOutputSamplingRate() = 0;
virtual size_t getPrimaryOutputFrameCount() = 0;
// 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.
virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) = 0;
/* Get attributes for a given audio port */
virtual status_t getAudioPort(struct audio_port_v7 *port) = 0;
/* Create an audio patch between several source and sink ports */
virtual status_t createAudioPatch(const struct audio_patch *patch,
audio_patch_handle_t *handle) = 0;
/* Release an audio patch */
virtual status_t releaseAudioPatch(audio_patch_handle_t handle) = 0;
/* List existing audio patches */
virtual status_t listAudioPatches(unsigned int *num_patches,
struct audio_patch *patches) = 0;
/* Set audio port configuration */
virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0;
/* Get the HW synchronization source used for an audio session */
virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) = 0;
/* Indicate JAVA services are ready (scheduling, power management ...) */
virtual status_t systemReady() = 0;
// Returns the number of frames per audio HAL buffer.
virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const = 0;
/* List available microphones and their characteristics */
virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) = 0;
virtual status_t setAudioHalPids(const std::vector<pid_t>& pids) = 0;
// Set vibrators' information.
// The values will be used to initialize HapticGenerator.
virtual status_t setVibratorInfos(
const std::vector<media::AudioVibratorInfo>& vibratorInfos) = 0;
virtual status_t updateSecondaryOutputs(
const TrackSecondaryOutputsMap& trackSecondaryOutputs) = 0;
};
/**
* A client-side adapter, wrapping an IAudioFlingerService instance and presenting it as an
* IAudioFlinger. Intended to be used by legacy client code that was written against IAudioFlinger,
* before IAudioFlingerService was introduced as an AIDL service.
* New clients should not use this adapter, but rather IAudioFlingerService directly, via
* BpAudioFlingerService.
*/
class AudioFlingerClientAdapter : public IAudioFlinger {
public:
explicit AudioFlingerClientAdapter(const sp<media::IAudioFlingerService> delegate);
status_t createTrack(const media::CreateTrackRequest& input,
media::CreateTrackResponse& output) override;
status_t createRecord(const media::CreateRecordRequest& input,
media::CreateRecordResponse& output) override;
uint32_t sampleRate(audio_io_handle_t ioHandle) const override;
audio_format_t format(audio_io_handle_t output) const override;
size_t frameCount(audio_io_handle_t ioHandle) const override;
uint32_t latency(audio_io_handle_t output) const override;
status_t setMasterVolume(float value) override;
status_t setMasterMute(bool muted) override;
float masterVolume() const override;
bool masterMute() const override;
status_t setMasterBalance(float balance) override;
status_t getMasterBalance(float* balance) const override;
status_t setStreamVolume(audio_stream_type_t stream, float value,
audio_io_handle_t output) override;
status_t setStreamMute(audio_stream_type_t stream, bool muted) override;
float streamVolume(audio_stream_type_t stream,
audio_io_handle_t output) const override;
bool streamMute(audio_stream_type_t stream) const override;
status_t setMode(audio_mode_t mode) override;
status_t setMicMute(bool state) override;
bool getMicMute() const override;
void setRecordSilenced(audio_port_handle_t portId, bool silenced) override;
status_t setParameters(audio_io_handle_t ioHandle,
const String8& keyValuePairs) override;
String8 getParameters(audio_io_handle_t ioHandle, const String8& keys)
const override;
void registerClient(const sp<media::IAudioFlingerClient>& client) override;
size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
audio_channel_mask_t channelMask) const override;
status_t openOutput(const media::OpenOutputRequest& request,
media::OpenOutputResponse* response) override;
audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
audio_io_handle_t output2) override;
status_t closeOutput(audio_io_handle_t output) override;
status_t suspendOutput(audio_io_handle_t output) override;
status_t restoreOutput(audio_io_handle_t output) override;
status_t openInput(const media::OpenInputRequest& request,
media::OpenInputResponse* response) override;
status_t closeInput(audio_io_handle_t input) override;
status_t invalidateStream(audio_stream_type_t stream) override;
status_t setVoiceVolume(float volume) override;
status_t getRenderPosition(uint32_t* halFrames, uint32_t* dspFrames,
audio_io_handle_t output) const override;
uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const override;
audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) override;
void acquireAudioSessionId(audio_session_t audioSession, pid_t pid, uid_t uid) override;
void releaseAudioSessionId(audio_session_t audioSession, pid_t pid) override;
status_t queryNumberEffects(uint32_t* numEffects) const override;
status_t queryEffect(uint32_t index, effect_descriptor_t* pDescriptor) const override;
status_t getEffectDescriptor(const effect_uuid_t* pEffectUUID,
const effect_uuid_t* pTypeUUID,
uint32_t preferredTypeFlag,
effect_descriptor_t* pDescriptor) const override;
status_t createEffect(const media::CreateEffectRequest& request,
media::CreateEffectResponse* response) override;
status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
audio_io_handle_t dstOutput) override;
void setEffectSuspended(int effectId,
audio_session_t sessionId,
bool suspended) override;
audio_module_handle_t loadHwModule(const char* name) override;
uint32_t getPrimaryOutputSamplingRate() override;
size_t getPrimaryOutputFrameCount() override;
status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override;
status_t getAudioPort(struct audio_port_v7* port) override;
status_t createAudioPatch(const struct audio_patch* patch,
audio_patch_handle_t* handle) override;
status_t releaseAudioPatch(audio_patch_handle_t handle) override;
status_t listAudioPatches(unsigned int* num_patches,
struct audio_patch* patches) override;
status_t setAudioPortConfig(const struct audio_port_config* config) override;
audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) override;
status_t systemReady() override;
size_t frameCountHAL(audio_io_handle_t ioHandle) const override;
status_t getMicrophones(std::vector<media::MicrophoneInfo>* microphones) override;
status_t setAudioHalPids(const std::vector<pid_t>& pids) override;
status_t setVibratorInfos(const std::vector<media::AudioVibratorInfo>& vibratorInfos) override;
status_t updateSecondaryOutputs(
const TrackSecondaryOutputsMap& trackSecondaryOutputs) override;
private:
const sp<media::IAudioFlingerService> mDelegate;
};
/**
* A server-side adapter, wrapping an IAudioFlinger instance and presenting it as an
* IAudioFlingerService. Intended to be used by legacy server code that was written against
* IAudioFlinger, before IAudioFlingerService was introduced as an AIDL service.
* New servers should not use this adapter, but rather implement IAudioFlingerService directly, via
* BnAudioFlingerService.
*/
class AudioFlingerServerAdapter : public media::BnAudioFlingerService {
public:
using Status = binder::Status;
/**
* Legacy server should implement this interface in order to be wrapped.
*/
class Delegate : public IAudioFlinger {
protected:
friend class AudioFlingerServerAdapter;
enum class TransactionCode {
CREATE_TRACK = media::BnAudioFlingerService::TRANSACTION_createTrack,
CREATE_RECORD = media::BnAudioFlingerService::TRANSACTION_createRecord,
SAMPLE_RATE = media::BnAudioFlingerService::TRANSACTION_sampleRate,
FORMAT = media::BnAudioFlingerService::TRANSACTION_format,
FRAME_COUNT = media::BnAudioFlingerService::TRANSACTION_frameCount,
LATENCY = media::BnAudioFlingerService::TRANSACTION_latency,
SET_MASTER_VOLUME = media::BnAudioFlingerService::TRANSACTION_setMasterVolume,
SET_MASTER_MUTE = media::BnAudioFlingerService::TRANSACTION_setMasterMute,
MASTER_VOLUME = media::BnAudioFlingerService::TRANSACTION_masterVolume,
MASTER_MUTE = media::BnAudioFlingerService::TRANSACTION_masterMute,
SET_STREAM_VOLUME = media::BnAudioFlingerService::TRANSACTION_setStreamVolume,
SET_STREAM_MUTE = media::BnAudioFlingerService::TRANSACTION_setStreamMute,
STREAM_VOLUME = media::BnAudioFlingerService::TRANSACTION_streamVolume,
STREAM_MUTE = media::BnAudioFlingerService::TRANSACTION_streamMute,
SET_MODE = media::BnAudioFlingerService::TRANSACTION_setMode,
SET_MIC_MUTE = media::BnAudioFlingerService::TRANSACTION_setMicMute,
GET_MIC_MUTE = media::BnAudioFlingerService::TRANSACTION_getMicMute,
SET_RECORD_SILENCED = media::BnAudioFlingerService::TRANSACTION_setRecordSilenced,
SET_PARAMETERS = media::BnAudioFlingerService::TRANSACTION_setParameters,
GET_PARAMETERS = media::BnAudioFlingerService::TRANSACTION_getParameters,
REGISTER_CLIENT = media::BnAudioFlingerService::TRANSACTION_registerClient,
GET_INPUTBUFFERSIZE = media::BnAudioFlingerService::TRANSACTION_getInputBufferSize,
OPEN_OUTPUT = media::BnAudioFlingerService::TRANSACTION_openOutput,
OPEN_DUPLICATE_OUTPUT = media::BnAudioFlingerService::TRANSACTION_openDuplicateOutput,
CLOSE_OUTPUT = media::BnAudioFlingerService::TRANSACTION_closeOutput,
SUSPEND_OUTPUT = media::BnAudioFlingerService::TRANSACTION_suspendOutput,
RESTORE_OUTPUT = media::BnAudioFlingerService::TRANSACTION_restoreOutput,
OPEN_INPUT = media::BnAudioFlingerService::TRANSACTION_openInput,
CLOSE_INPUT = media::BnAudioFlingerService::TRANSACTION_closeInput,
INVALIDATE_STREAM = media::BnAudioFlingerService::TRANSACTION_invalidateStream,
SET_VOICE_VOLUME = media::BnAudioFlingerService::TRANSACTION_setVoiceVolume,
GET_RENDER_POSITION = media::BnAudioFlingerService::TRANSACTION_getRenderPosition,
GET_INPUT_FRAMES_LOST = media::BnAudioFlingerService::TRANSACTION_getInputFramesLost,
NEW_AUDIO_UNIQUE_ID = media::BnAudioFlingerService::TRANSACTION_newAudioUniqueId,
ACQUIRE_AUDIO_SESSION_ID = media::BnAudioFlingerService::TRANSACTION_acquireAudioSessionId,
RELEASE_AUDIO_SESSION_ID = media::BnAudioFlingerService::TRANSACTION_releaseAudioSessionId,
QUERY_NUM_EFFECTS = media::BnAudioFlingerService::TRANSACTION_queryNumberEffects,
QUERY_EFFECT = media::BnAudioFlingerService::TRANSACTION_queryEffect,
GET_EFFECT_DESCRIPTOR = media::BnAudioFlingerService::TRANSACTION_getEffectDescriptor,
CREATE_EFFECT = media::BnAudioFlingerService::TRANSACTION_createEffect,
MOVE_EFFECTS = media::BnAudioFlingerService::TRANSACTION_moveEffects,
LOAD_HW_MODULE = media::BnAudioFlingerService::TRANSACTION_loadHwModule,
GET_PRIMARY_OUTPUT_SAMPLING_RATE = media::BnAudioFlingerService::TRANSACTION_getPrimaryOutputSamplingRate,
GET_PRIMARY_OUTPUT_FRAME_COUNT = media::BnAudioFlingerService::TRANSACTION_getPrimaryOutputFrameCount,
SET_LOW_RAM_DEVICE = media::BnAudioFlingerService::TRANSACTION_setLowRamDevice,
GET_AUDIO_PORT = media::BnAudioFlingerService::TRANSACTION_getAudioPort,
CREATE_AUDIO_PATCH = media::BnAudioFlingerService::TRANSACTION_createAudioPatch,
RELEASE_AUDIO_PATCH = media::BnAudioFlingerService::TRANSACTION_releaseAudioPatch,
LIST_AUDIO_PATCHES = media::BnAudioFlingerService::TRANSACTION_listAudioPatches,
SET_AUDIO_PORT_CONFIG = media::BnAudioFlingerService::TRANSACTION_setAudioPortConfig,
GET_AUDIO_HW_SYNC_FOR_SESSION = media::BnAudioFlingerService::TRANSACTION_getAudioHwSyncForSession,
SYSTEM_READY = media::BnAudioFlingerService::TRANSACTION_systemReady,
FRAME_COUNT_HAL = media::BnAudioFlingerService::TRANSACTION_frameCountHAL,
GET_MICROPHONES = media::BnAudioFlingerService::TRANSACTION_getMicrophones,
SET_MASTER_BALANCE = media::BnAudioFlingerService::TRANSACTION_setMasterBalance,
GET_MASTER_BALANCE = media::BnAudioFlingerService::TRANSACTION_getMasterBalance,
SET_EFFECT_SUSPENDED = media::BnAudioFlingerService::TRANSACTION_setEffectSuspended,
SET_AUDIO_HAL_PIDS = media::BnAudioFlingerService::TRANSACTION_setAudioHalPids,
SET_VIBRATOR_INFOS = media::BnAudioFlingerService::TRANSACTION_setVibratorInfos,
UPDATE_SECONDARY_OUTPUTS = media::BnAudioFlingerService::TRANSACTION_updateSecondaryOutputs,
};
/**
* And optional hook, called on every transaction, allowing additional operations to be
* performed before/after the unparceling ofthe data and dispatching to the respective
* method. Useful for bulk operations, such as logging or permission checks.
* The implementer is responsible to invoke the provided delegate function, which is the
* actual onTransact(), unless an error occurs.
* By default, this is just a pass-through to the delegate.
*/
virtual status_t onTransactWrapper(TransactionCode code,
const Parcel& data,
uint32_t flags,
const std::function<status_t()>& delegate) {
(void) code;
(void) data;
(void) flags;
return delegate();
}
/**
* An optional hook for implementing diagnostics dumping.
*/
virtual status_t dump(int fd, const Vector<String16>& args) {
(void) fd;
(void) args;
return OK;
}
};
explicit AudioFlingerServerAdapter(
const sp<AudioFlingerServerAdapter::Delegate>& delegate);
status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) override;
status_t dump(int fd, const Vector<String16>& args) override;
Status createTrack(const media::CreateTrackRequest& request,
media::CreateTrackResponse* _aidl_return) override;
Status createRecord(const media::CreateRecordRequest& request,
media::CreateRecordResponse* _aidl_return) override;
Status sampleRate(int32_t ioHandle, int32_t* _aidl_return) override;
Status format(int32_t output, media::audio::common::AudioFormat* _aidl_return) override;
Status frameCount(int32_t ioHandle, int64_t* _aidl_return) override;
Status latency(int32_t output, int32_t* _aidl_return) override;
Status setMasterVolume(float value) override;
Status setMasterMute(bool muted) override;
Status masterVolume(float* _aidl_return) override;
Status masterMute(bool* _aidl_return) override;
Status setMasterBalance(float balance) override;
Status getMasterBalance(float* _aidl_return) override;
Status setStreamVolume(media::AudioStreamType stream, float value, int32_t output) override;
Status setStreamMute(media::AudioStreamType stream, bool muted) override;
Status
streamVolume(media::AudioStreamType stream, int32_t output, float* _aidl_return) override;
Status streamMute(media::AudioStreamType stream, bool* _aidl_return) override;
Status setMode(media::AudioMode mode) override;
Status setMicMute(bool state) override;
Status getMicMute(bool* _aidl_return) override;
Status setRecordSilenced(int32_t portId, bool silenced) override;
Status setParameters(int32_t ioHandle, const std::string& keyValuePairs) override;
Status
getParameters(int32_t ioHandle, const std::string& keys, std::string* _aidl_return) override;
Status registerClient(const sp<media::IAudioFlingerClient>& client) override;
Status getInputBufferSize(int32_t sampleRate, media::audio::common::AudioFormat format,
int32_t channelMask, int64_t* _aidl_return) override;
Status openOutput(const media::OpenOutputRequest& request,
media::OpenOutputResponse* _aidl_return) override;
Status openDuplicateOutput(int32_t output1, int32_t output2, int32_t* _aidl_return) override;
Status closeOutput(int32_t output) override;
Status suspendOutput(int32_t output) override;
Status restoreOutput(int32_t output) override;
Status openInput(const media::OpenInputRequest& request,
media::OpenInputResponse* _aidl_return) override;
Status closeInput(int32_t input) override;
Status invalidateStream(media::AudioStreamType stream) override;
Status setVoiceVolume(float volume) override;
Status getRenderPosition(int32_t output, media::RenderPosition* _aidl_return) override;
Status getInputFramesLost(int32_t ioHandle, int32_t* _aidl_return) override;
Status newAudioUniqueId(media::AudioUniqueIdUse use, int32_t* _aidl_return) override;
Status acquireAudioSessionId(int32_t audioSession, int32_t pid, int32_t uid) override;
Status releaseAudioSessionId(int32_t audioSession, int32_t pid) override;
Status queryNumberEffects(int32_t* _aidl_return) override;
Status queryEffect(int32_t index, media::EffectDescriptor* _aidl_return) override;
Status getEffectDescriptor(const media::AudioUuid& effectUUID, const media::AudioUuid& typeUUID,
int32_t preferredTypeFlag,
media::EffectDescriptor* _aidl_return) override;
Status createEffect(const media::CreateEffectRequest& request,
media::CreateEffectResponse* _aidl_return) override;
Status moveEffects(int32_t session, int32_t srcOutput, int32_t dstOutput) override;
Status setEffectSuspended(int32_t effectId, int32_t sessionId, bool suspended) override;
Status loadHwModule(const std::string& name, int32_t* _aidl_return) override;
Status getPrimaryOutputSamplingRate(int32_t* _aidl_return) override;
Status getPrimaryOutputFrameCount(int64_t* _aidl_return) override;
Status setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override;
Status getAudioPort(const media::AudioPort& port, media::AudioPort* _aidl_return) override;
Status createAudioPatch(const media::AudioPatch& patch, int32_t* _aidl_return) override;
Status releaseAudioPatch(int32_t handle) override;
Status listAudioPatches(int32_t maxCount,
std::vector<media::AudioPatch>* _aidl_return) override;
Status setAudioPortConfig(const media::AudioPortConfig& config) override;
Status getAudioHwSyncForSession(int32_t sessionId, int32_t* _aidl_return) override;
Status systemReady() override;
Status frameCountHAL(int32_t ioHandle, int64_t* _aidl_return) override;
Status getMicrophones(std::vector<media::MicrophoneInfoData>* _aidl_return) override;
Status setAudioHalPids(const std::vector<int32_t>& pids) override;
Status setVibratorInfos(const std::vector<media::AudioVibratorInfo>& vibratorInfos) override;
Status updateSecondaryOutputs(
const std::vector<media::TrackSecondaryOutputInfo>& trackSecondaryOutputInfos) override;
private:
const sp<AudioFlingerServerAdapter::Delegate> mDelegate;
};
}; // namespace android
#endif // ANDROID_IAUDIOFLINGER_H