blob: 8ec89313473a93e77f33428d1acdc87d534cbb33 [file] [log] [blame]
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -08001/*
2 * Copyright (C) 2007 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#ifndef ANDROID_IAUDIOFLINGER_H
18#define ANDROID_IAUDIOFLINGER_H
19
20#include <stdint.h>
21#include <sys/types.h>
22#include <unistd.h>
23
24#include <utils/RefBase.h>
25#include <utils/Errors.h>
26#include <binder/IInterface.h>
Eric Laurent21da6472017-11-09 16:29:26 -080027#include <binder/Parcel.h>
Eric Laurentf14db3c2017-12-08 14:20:36 -080028#include <binder/Parcelable.h>
Eric Laurent21da6472017-11-09 16:29:26 -080029#include <media/AudioClient.h>
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -080030#include <media/IAudioTrack.h>
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -080031#include <media/IAudioFlingerClient.h>
32#include <system/audio.h>
33#include <system/audio_effect.h>
34#include <system/audio_policy.h>
35#include <media/IEffect.h>
36#include <media/IEffectClient.h>
37#include <utils/String8.h>
jiabin46a76fa2018-01-05 10:18:21 -080038#include <media/MicrophoneInfo.h>
39#include <vector>
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -080040
Ivan Lozanoff6900d2017-08-01 15:47:38 -070041#include "android/media/IAudioRecord.h"
42
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -080043namespace android {
44
45// ----------------------------------------------------------------------------
46
47class IAudioFlinger : public IInterface
48{
49public:
50 DECLARE_META_INTERFACE(AudioFlinger);
51
Eric Laurent21da6472017-11-09 16:29:26 -080052 /* CreateTrackInput contains all input arguments sent by AudioTrack to AudioFlinger
53 * when calling createTrack() including arguments that will be updated by AudioFlinger
54 * and returned in CreateTrackOutput object
55 */
Eric Laurentf14db3c2017-12-08 14:20:36 -080056 class CreateTrackInput : public Parcelable {
Eric Laurent21da6472017-11-09 16:29:26 -080057 public:
Eric Laurentf14db3c2017-12-08 14:20:36 -080058 status_t readFromParcel(const Parcel *parcel) override {
Eric Laurent21da6472017-11-09 16:29:26 -080059 /* input arguments*/
60 memset(&attr, 0, sizeof(audio_attributes_t));
61 if (parcel->read(&attr, sizeof(audio_attributes_t)) != NO_ERROR) {
62 return DEAD_OBJECT;
63 }
64 attr.tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE -1] = '\0';
65 memset(&config, 0, sizeof(audio_config_t));
66 if (parcel->read(&config, sizeof(audio_config_t)) != NO_ERROR) {
67 return DEAD_OBJECT;
68 }
Eric Laurentf14db3c2017-12-08 14:20:36 -080069 if (clientInfo.readFromParcel(parcel) != NO_ERROR) {
70 return DEAD_OBJECT;
71 }
Eric Laurent21da6472017-11-09 16:29:26 -080072 if (parcel->readInt32() != 0) {
73 sharedBuffer = interface_cast<IMemory>(parcel->readStrongBinder());
74 if (sharedBuffer == 0 || sharedBuffer->pointer() == NULL) {
75 return BAD_VALUE;
76 }
77 }
78 notificationsPerBuffer = parcel->readInt32();
79 speed = parcel->readFloat();
80
81 /* input/output arguments*/
82 (void)parcel->read(&flags, sizeof(audio_output_flags_t));
83 frameCount = parcel->readInt64();
84 notificationFrameCount = parcel->readInt64();
85 (void)parcel->read(&selectedDeviceId, sizeof(audio_port_handle_t));
86 (void)parcel->read(&sessionId, sizeof(audio_session_t));
87 return NO_ERROR;
88 }
89
Eric Laurentf14db3c2017-12-08 14:20:36 -080090 status_t writeToParcel(Parcel *parcel) const override {
Eric Laurent21da6472017-11-09 16:29:26 -080091 /* input arguments*/
92 (void)parcel->write(&attr, sizeof(audio_attributes_t));
93 (void)parcel->write(&config, sizeof(audio_config_t));
94 (void)clientInfo.writeToParcel(parcel);
95 if (sharedBuffer != 0) {
96 (void)parcel->writeInt32(1);
97 (void)parcel->writeStrongBinder(IInterface::asBinder(sharedBuffer));
98 } else {
99 (void)parcel->writeInt32(0);
100 }
101 (void)parcel->writeInt32(notificationsPerBuffer);
102 (void)parcel->writeFloat(speed);
103
104 /* input/output arguments*/
105 (void)parcel->write(&flags, sizeof(audio_output_flags_t));
106 (void)parcel->writeInt64(frameCount);
107 (void)parcel->writeInt64(notificationFrameCount);
108 (void)parcel->write(&selectedDeviceId, sizeof(audio_port_handle_t));
109 (void)parcel->write(&sessionId, sizeof(audio_session_t));
110 return NO_ERROR;
111 }
112
113 /* input */
114 audio_attributes_t attr;
115 audio_config_t config;
116 AudioClient clientInfo;
117 sp<IMemory> sharedBuffer;
118 uint32_t notificationsPerBuffer;
119 float speed;
120
121 /* input/output */
122 audio_output_flags_t flags;
123 size_t frameCount;
124 size_t notificationFrameCount;
125 audio_port_handle_t selectedDeviceId;
126 audio_session_t sessionId;
127 };
128
129 /* CreateTrackOutput contains all output arguments returned by AudioFlinger to AudioTrack
130 * when calling createTrack() including arguments that were passed as I/O for update by
131 * CreateTrackInput.
132 */
Eric Laurentf14db3c2017-12-08 14:20:36 -0800133 class CreateTrackOutput : public Parcelable {
Eric Laurent21da6472017-11-09 16:29:26 -0800134 public:
Eric Laurentf14db3c2017-12-08 14:20:36 -0800135 status_t readFromParcel(const Parcel *parcel) override {
Eric Laurent21da6472017-11-09 16:29:26 -0800136 /* input/output arguments*/
137 (void)parcel->read(&flags, sizeof(audio_output_flags_t));
138 frameCount = parcel->readInt64();
139 notificationFrameCount = parcel->readInt64();
140 (void)parcel->read(&selectedDeviceId, sizeof(audio_port_handle_t));
141 (void)parcel->read(&sessionId, sizeof(audio_session_t));
142
143 /* output arguments*/
144 sampleRate = parcel->readUint32();
145 afFrameCount = parcel->readInt64();
146 afSampleRate = parcel->readInt64();
147 afLatencyMs = parcel->readInt32();
148 (void)parcel->read(&outputId, sizeof(audio_io_handle_t));
Eric Laurent973db022018-11-20 14:54:31 -0800149 (void)parcel->read(&portId, sizeof(audio_port_handle_t));
Eric Laurent21da6472017-11-09 16:29:26 -0800150 return NO_ERROR;
151 }
152
Eric Laurentf14db3c2017-12-08 14:20:36 -0800153 status_t writeToParcel(Parcel *parcel) const override {
Eric Laurent21da6472017-11-09 16:29:26 -0800154 /* input/output arguments*/
155 (void)parcel->write(&flags, sizeof(audio_output_flags_t));
156 (void)parcel->writeInt64(frameCount);
157 (void)parcel->writeInt64(notificationFrameCount);
158 (void)parcel->write(&selectedDeviceId, sizeof(audio_port_handle_t));
159 (void)parcel->write(&sessionId, sizeof(audio_session_t));
160
161 /* output arguments*/
162 (void)parcel->writeUint32(sampleRate);
163 (void)parcel->writeInt64(afFrameCount);
164 (void)parcel->writeInt64(afSampleRate);
165 (void)parcel->writeInt32(afLatencyMs);
166 (void)parcel->write(&outputId, sizeof(audio_io_handle_t));
Eric Laurent973db022018-11-20 14:54:31 -0800167 (void)parcel->write(&portId, sizeof(audio_port_handle_t));
Eric Laurent21da6472017-11-09 16:29:26 -0800168 return NO_ERROR;
169 }
170
171 /* input/output */
172 audio_output_flags_t flags;
173 size_t frameCount;
174 size_t notificationFrameCount;
175 audio_port_handle_t selectedDeviceId;
176 audio_session_t sessionId;
177
178 /* output */
179 uint32_t sampleRate;
180 size_t afFrameCount;
181 uint32_t afSampleRate;
182 uint32_t afLatencyMs;
183 audio_io_handle_t outputId;
Eric Laurent973db022018-11-20 14:54:31 -0800184 audio_port_handle_t portId;
Eric Laurent21da6472017-11-09 16:29:26 -0800185 };
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800186
Eric Laurentf14db3c2017-12-08 14:20:36 -0800187 /* CreateRecordInput contains all input arguments sent by AudioRecord to AudioFlinger
188 * when calling createRecord() including arguments that will be updated by AudioFlinger
189 * and returned in CreateRecordOutput object
190 */
191 class CreateRecordInput : public Parcelable {
192 public:
193 status_t readFromParcel(const Parcel *parcel) override {
194 /* input arguments*/
195 memset(&attr, 0, sizeof(audio_attributes_t));
196 if (parcel->read(&attr, sizeof(audio_attributes_t)) != NO_ERROR) {
197 return DEAD_OBJECT;
198 }
199 attr.tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE -1] = '\0';
200 memset(&config, 0, sizeof(audio_config_base_t));
201 if (parcel->read(&config, sizeof(audio_config_base_t)) != NO_ERROR) {
202 return DEAD_OBJECT;
203 }
204 if (clientInfo.readFromParcel(parcel) != NO_ERROR) {
205 return DEAD_OBJECT;
206 }
207 opPackageName = parcel->readString16();
Mikhail Naganov2996f672019-04-18 12:29:59 -0700208 if (parcel->read(&riid, sizeof(audio_unique_id_t)) != NO_ERROR) {
209 return DEAD_OBJECT;
210 }
Eric Laurentf14db3c2017-12-08 14:20:36 -0800211
212 /* input/output arguments*/
213 (void)parcel->read(&flags, sizeof(audio_input_flags_t));
214 frameCount = parcel->readInt64();
215 notificationFrameCount = parcel->readInt64();
216 (void)parcel->read(&selectedDeviceId, sizeof(audio_port_handle_t));
217 (void)parcel->read(&sessionId, sizeof(audio_session_t));
218 return NO_ERROR;
219 }
220
221 status_t writeToParcel(Parcel *parcel) const override {
222 /* input arguments*/
223 (void)parcel->write(&attr, sizeof(audio_attributes_t));
224 (void)parcel->write(&config, sizeof(audio_config_base_t));
225 (void)clientInfo.writeToParcel(parcel);
226 (void)parcel->writeString16(opPackageName);
Mikhail Naganov2996f672019-04-18 12:29:59 -0700227 (void)parcel->write(&riid, sizeof(audio_unique_id_t));
Eric Laurentf14db3c2017-12-08 14:20:36 -0800228
229 /* input/output arguments*/
230 (void)parcel->write(&flags, sizeof(audio_input_flags_t));
231 (void)parcel->writeInt64(frameCount);
232 (void)parcel->writeInt64(notificationFrameCount);
233 (void)parcel->write(&selectedDeviceId, sizeof(audio_port_handle_t));
234 (void)parcel->write(&sessionId, sizeof(audio_session_t));
235 return NO_ERROR;
236 }
237
238 /* input */
239 audio_attributes_t attr;
240 audio_config_base_t config;
241 AudioClient clientInfo;
242 String16 opPackageName;
Mikhail Naganov2996f672019-04-18 12:29:59 -0700243 audio_unique_id_t riid;
Eric Laurentf14db3c2017-12-08 14:20:36 -0800244
245 /* input/output */
246 audio_input_flags_t flags;
247 size_t frameCount;
248 size_t notificationFrameCount;
249 audio_port_handle_t selectedDeviceId;
250 audio_session_t sessionId;
251 };
252
253 /* CreateRecordOutput contains all output arguments returned by AudioFlinger to AudioRecord
254 * when calling createRecord() including arguments that were passed as I/O for update by
255 * CreateRecordInput.
256 */
257 class CreateRecordOutput : public Parcelable {
258 public:
259 status_t readFromParcel(const Parcel *parcel) override {
260 /* input/output arguments*/
261 (void)parcel->read(&flags, sizeof(audio_input_flags_t));
262 frameCount = parcel->readInt64();
263 notificationFrameCount = parcel->readInt64();
264 (void)parcel->read(&selectedDeviceId, sizeof(audio_port_handle_t));
265 (void)parcel->read(&sessionId, sizeof(audio_session_t));
266
267 /* output arguments*/
268 sampleRate = parcel->readUint32();
269 (void)parcel->read(&inputId, sizeof(audio_io_handle_t));
270 if (parcel->readInt32() != 0) {
271 cblk = interface_cast<IMemory>(parcel->readStrongBinder());
272 if (cblk == 0 || cblk->pointer() == NULL) {
273 return BAD_VALUE;
274 }
275 }
276 if (parcel->readInt32() != 0) {
277 buffers = interface_cast<IMemory>(parcel->readStrongBinder());
278 if (buffers == 0 || buffers->pointer() == NULL) {
279 return BAD_VALUE;
280 }
281 }
Eric Laurent973db022018-11-20 14:54:31 -0800282 (void)parcel->read(&portId, sizeof(audio_port_handle_t));
Eric Laurentf14db3c2017-12-08 14:20:36 -0800283 return NO_ERROR;
284 }
285
286 status_t writeToParcel(Parcel *parcel) const override {
287 /* input/output arguments*/
288 (void)parcel->write(&flags, sizeof(audio_input_flags_t));
289 (void)parcel->writeInt64(frameCount);
290 (void)parcel->writeInt64(notificationFrameCount);
291 (void)parcel->write(&selectedDeviceId, sizeof(audio_port_handle_t));
292 (void)parcel->write(&sessionId, sizeof(audio_session_t));
293
294 /* output arguments*/
295 (void)parcel->writeUint32(sampleRate);
296 (void)parcel->write(&inputId, sizeof(audio_io_handle_t));
297 if (cblk != 0) {
298 (void)parcel->writeInt32(1);
299 (void)parcel->writeStrongBinder(IInterface::asBinder(cblk));
300 } else {
301 (void)parcel->writeInt32(0);
302 }
303 if (buffers != 0) {
304 (void)parcel->writeInt32(1);
305 (void)parcel->writeStrongBinder(IInterface::asBinder(buffers));
306 } else {
307 (void)parcel->writeInt32(0);
308 }
Eric Laurent973db022018-11-20 14:54:31 -0800309 (void)parcel->write(&portId, sizeof(audio_port_handle_t));
Eric Laurentf14db3c2017-12-08 14:20:36 -0800310
311 return NO_ERROR;
312 }
313
314 /* input/output */
315 audio_input_flags_t flags;
316 size_t frameCount;
317 size_t notificationFrameCount;
318 audio_port_handle_t selectedDeviceId;
319 audio_session_t sessionId;
320
321 /* output */
322 uint32_t sampleRate;
323 audio_io_handle_t inputId;
324 sp<IMemory> cblk;
325 sp<IMemory> buffers;
Eric Laurent973db022018-11-20 14:54:31 -0800326 audio_port_handle_t portId;
Eric Laurentf14db3c2017-12-08 14:20:36 -0800327 };
328
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800329 // invariant on exit for all APIs that return an sp<>:
330 // (return value != 0) == (*status == NO_ERROR)
331
332 /* create an audio track and registers it with AudioFlinger.
333 * return null if the track cannot be created.
334 */
Eric Laurent21da6472017-11-09 16:29:26 -0800335 virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
336 CreateTrackOutput& output,
337 status_t *status) = 0;
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800338
Eric Laurentf14db3c2017-12-08 14:20:36 -0800339 virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input,
340 CreateRecordOutput& output,
341 status_t *status) = 0;
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800342
343 // FIXME Surprisingly, format/latency don't work for input handles
344
345 /* query the audio hardware state. This state never changes,
346 * and therefore can be cached.
347 */
348 virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const = 0;
349
350 // reserved; formerly channelCount()
351
352 virtual audio_format_t format(audio_io_handle_t output) const = 0;
353 virtual size_t frameCount(audio_io_handle_t ioHandle) const = 0;
354
355 // return estimated latency in milliseconds
356 virtual uint32_t latency(audio_io_handle_t output) const = 0;
357
358 /* set/get the audio hardware state. This will probably be used by
359 * the preference panel, mostly.
360 */
361 virtual status_t setMasterVolume(float value) = 0;
362 virtual status_t setMasterMute(bool muted) = 0;
363
364 virtual float masterVolume() const = 0;
365 virtual bool masterMute() const = 0;
366
Richard Folke Tullberg3fae0372017-01-13 09:04:25 +0100367 virtual status_t setMasterBalance(float balance) = 0;
368 virtual status_t getMasterBalance(float *balance) const = 0;
369
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800370 /* set/get stream type state. This will probably be used by
371 * the preference panel, mostly.
372 */
373 virtual status_t setStreamVolume(audio_stream_type_t stream, float value,
374 audio_io_handle_t output) = 0;
375 virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) = 0;
376
377 virtual float streamVolume(audio_stream_type_t stream,
378 audio_io_handle_t output) const = 0;
379 virtual bool streamMute(audio_stream_type_t stream) const = 0;
380
381 // set audio mode
382 virtual status_t setMode(audio_mode_t mode) = 0;
383
384 // mic mute/state
385 virtual status_t setMicMute(bool state) = 0;
386 virtual bool getMicMute() const = 0;
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800387 virtual void setRecordSilenced(uid_t uid, bool silenced) = 0;
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800388
389 virtual status_t setParameters(audio_io_handle_t ioHandle,
390 const String8& keyValuePairs) = 0;
391 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys)
392 const = 0;
393
394 // Register an object to receive audio input/output change and track notifications.
395 // For a given calling pid, AudioFlinger disregards any registrations after the first.
396 // Thus the IAudioFlingerClient must be a singleton per process.
397 virtual void registerClient(const sp<IAudioFlingerClient>& client) = 0;
398
399 // retrieve the audio recording buffer size
400 // FIXME This API assumes a route, and so should be deprecated.
401 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
402 audio_channel_mask_t channelMask) const = 0;
403
404 virtual status_t openOutput(audio_module_handle_t module,
405 audio_io_handle_t *output,
406 audio_config_t *config,
407 audio_devices_t *devices,
408 const String8& address,
409 uint32_t *latencyMs,
410 audio_output_flags_t flags) = 0;
411 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
412 audio_io_handle_t output2) = 0;
413 virtual status_t closeOutput(audio_io_handle_t output) = 0;
414 virtual status_t suspendOutput(audio_io_handle_t output) = 0;
415 virtual status_t restoreOutput(audio_io_handle_t output) = 0;
416
417 virtual status_t openInput(audio_module_handle_t module,
418 audio_io_handle_t *input,
419 audio_config_t *config,
420 audio_devices_t *device,
421 const String8& address,
422 audio_source_t source,
423 audio_input_flags_t flags) = 0;
424 virtual status_t closeInput(audio_io_handle_t input) = 0;
425
426 virtual status_t invalidateStream(audio_stream_type_t stream) = 0;
427
428 virtual status_t setVoiceVolume(float volume) = 0;
429
430 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
431 audio_io_handle_t output) const = 0;
432
433 virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const = 0;
434
435 virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) = 0;
436
437 virtual void acquireAudioSessionId(audio_session_t audioSession, pid_t pid) = 0;
438 virtual void releaseAudioSessionId(audio_session_t audioSession, pid_t pid) = 0;
439
440 virtual status_t queryNumberEffects(uint32_t *numEffects) const = 0;
441
442 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const = 0;
443
444 virtual status_t getEffectDescriptor(const effect_uuid_t *pEffectUUID,
Ari Hausman-Cohen2046ec72018-04-24 14:00:55 -0700445 const effect_uuid_t *pTypeUUID,
446 uint32_t preferredTypeFlag,
447 effect_descriptor_t *pDescriptor) const = 0;
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800448
449 virtual sp<IEffect> createEffect(
450 effect_descriptor_t *pDesc,
451 const sp<IEffectClient>& client,
452 int32_t priority,
453 // AudioFlinger doesn't take over handle reference from client
454 audio_io_handle_t output,
455 audio_session_t sessionId,
456 const String16& callingPackage,
457 pid_t pid,
458 status_t *status,
459 int *id,
460 int *enabled) = 0;
461
462 virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
463 audio_io_handle_t dstOutput) = 0;
464
Eric Laurentb20cf7d2019-04-05 19:37:34 -0700465 virtual void setEffectSuspended(int effectId,
466 audio_session_t sessionId,
467 bool suspended) = 0;
468
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800469 virtual audio_module_handle_t loadHwModule(const char *name) = 0;
470
471 // helpers for android.media.AudioManager.getProperty(), see description there for meaning
472 // FIXME move these APIs to AudioPolicy to permit a more accurate implementation
473 // that looks on primary device for a stream with fast flag, primary flag, or first one.
474 virtual uint32_t getPrimaryOutputSamplingRate() = 0;
475 virtual size_t getPrimaryOutputFrameCount() = 0;
476
477 // Intended for AudioService to inform AudioFlinger of device's low RAM attribute,
478 // and should be called at most once. For a definition of what "low RAM" means, see
Andy Hung6f248bb2018-01-23 14:04:37 -0800479 // android.app.ActivityManager.isLowRamDevice(). The totalMemory parameter
480 // is obtained from android.app.ActivityManager.MemoryInfo.totalMem.
481 virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) = 0;
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800482
483 /* List available audio ports and their attributes */
484 virtual status_t listAudioPorts(unsigned int *num_ports,
485 struct audio_port *ports) = 0;
486
487 /* Get attributes for a given audio port */
488 virtual status_t getAudioPort(struct audio_port *port) = 0;
489
490 /* Create an audio patch between several source and sink ports */
491 virtual status_t createAudioPatch(const struct audio_patch *patch,
492 audio_patch_handle_t *handle) = 0;
493
494 /* Release an audio patch */
495 virtual status_t releaseAudioPatch(audio_patch_handle_t handle) = 0;
496
497 /* List existing audio patches */
498 virtual status_t listAudioPatches(unsigned int *num_patches,
499 struct audio_patch *patches) = 0;
500 /* Set audio port configuration */
501 virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0;
502
503 /* Get the HW synchronization source used for an audio session */
504 virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) = 0;
505
506 /* Indicate JAVA services are ready (scheduling, power management ...) */
507 virtual status_t systemReady() = 0;
508
509 // Returns the number of frames per audio HAL buffer.
510 virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const = 0;
jiabin46a76fa2018-01-05 10:18:21 -0800511
512 /* List available microphones and their characteristics */
513 virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) = 0;
Nicolas Rouletdcdfaec2017-02-14 10:18:39 -0800514};
515
516
517// ----------------------------------------------------------------------------
518
519class BnAudioFlinger : public BnInterface<IAudioFlinger>
520{
521public:
522 virtual status_t onTransact( uint32_t code,
523 const Parcel& data,
524 Parcel* reply,
525 uint32_t flags = 0);
526
527 // Requests media.log to start merging log buffers
528 virtual void requestLogMerge() = 0;
529};
530
531// ----------------------------------------------------------------------------
532
533}; // namespace android
534
535#endif // ANDROID_IAUDIOFLINGER_H