IAudioFlinger.h revision 46a76fa5ffb88dbde2c67335dbc5cf20b75b10b6
1/*
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>
27#include <binder/Parcel.h>
28#include <binder/Parcelable.h>
29#include <media/AudioClient.h>
30#include <media/IAudioTrack.h>
31#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>
38#include <media/MicrophoneInfo.h>
39#include <vector>
40
41#include "android/media/IAudioRecord.h"
42
43namespace android {
44
45// ----------------------------------------------------------------------------
46
47class IAudioFlinger : public IInterface
48{
49public:
50    DECLARE_META_INTERFACE(AudioFlinger);
51
52    /* 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     */
56    class CreateTrackInput : public Parcelable {
57    public:
58        status_t readFromParcel(const Parcel *parcel) override {
59            /* 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            }
69            if (clientInfo.readFromParcel(parcel) != NO_ERROR) {
70                return DEAD_OBJECT;
71            }
72            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
90        status_t writeToParcel(Parcel *parcel) const override {
91            /* 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     */
133    class CreateTrackOutput : public Parcelable {
134    public:
135        status_t readFromParcel(const Parcel *parcel) override {
136            /* 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));
149            return NO_ERROR;
150        }
151
152        status_t writeToParcel(Parcel *parcel) const override {
153            /* input/output arguments*/
154            (void)parcel->write(&flags, sizeof(audio_output_flags_t));
155            (void)parcel->writeInt64(frameCount);
156            (void)parcel->writeInt64(notificationFrameCount);
157            (void)parcel->write(&selectedDeviceId, sizeof(audio_port_handle_t));
158            (void)parcel->write(&sessionId, sizeof(audio_session_t));
159
160            /* output arguments*/
161            (void)parcel->writeUint32(sampleRate);
162            (void)parcel->writeInt64(afFrameCount);
163            (void)parcel->writeInt64(afSampleRate);
164            (void)parcel->writeInt32(afLatencyMs);
165            (void)parcel->write(&outputId, sizeof(audio_io_handle_t));
166            return NO_ERROR;
167        }
168
169        /* input/output */
170        audio_output_flags_t flags;
171        size_t frameCount;
172        size_t notificationFrameCount;
173        audio_port_handle_t selectedDeviceId;
174        audio_session_t sessionId;
175
176        /* output */
177        uint32_t sampleRate;
178        size_t   afFrameCount;
179        uint32_t afSampleRate;
180        uint32_t afLatencyMs;
181        audio_io_handle_t outputId;
182    };
183
184    /* CreateRecordInput contains all input arguments sent by AudioRecord to AudioFlinger
185     * when calling createRecord() including arguments that will be updated by AudioFlinger
186     * and returned in CreateRecordOutput object
187     */
188    class CreateRecordInput : public Parcelable {
189    public:
190        status_t readFromParcel(const Parcel *parcel) override {
191            /* input arguments*/
192            memset(&attr, 0, sizeof(audio_attributes_t));
193            if (parcel->read(&attr, sizeof(audio_attributes_t)) != NO_ERROR) {
194                return DEAD_OBJECT;
195            }
196            attr.tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE -1] = '\0';
197            memset(&config, 0, sizeof(audio_config_base_t));
198            if (parcel->read(&config, sizeof(audio_config_base_t)) != NO_ERROR) {
199                return DEAD_OBJECT;
200            }
201            if (clientInfo.readFromParcel(parcel) != NO_ERROR) {
202                return DEAD_OBJECT;
203            }
204            opPackageName = parcel->readString16();
205
206            /* input/output arguments*/
207            (void)parcel->read(&flags, sizeof(audio_input_flags_t));
208            frameCount = parcel->readInt64();
209            notificationFrameCount = parcel->readInt64();
210            (void)parcel->read(&selectedDeviceId, sizeof(audio_port_handle_t));
211            (void)parcel->read(&sessionId, sizeof(audio_session_t));
212            return NO_ERROR;
213        }
214
215        status_t writeToParcel(Parcel *parcel) const override {
216            /* input arguments*/
217            (void)parcel->write(&attr, sizeof(audio_attributes_t));
218            (void)parcel->write(&config, sizeof(audio_config_base_t));
219            (void)clientInfo.writeToParcel(parcel);
220            (void)parcel->writeString16(opPackageName);
221
222            /* input/output arguments*/
223            (void)parcel->write(&flags, sizeof(audio_input_flags_t));
224            (void)parcel->writeInt64(frameCount);
225            (void)parcel->writeInt64(notificationFrameCount);
226            (void)parcel->write(&selectedDeviceId, sizeof(audio_port_handle_t));
227            (void)parcel->write(&sessionId, sizeof(audio_session_t));
228            return NO_ERROR;
229        }
230
231        /* input */
232        audio_attributes_t attr;
233        audio_config_base_t config;
234        AudioClient clientInfo;
235        String16 opPackageName;
236
237        /* input/output */
238        audio_input_flags_t flags;
239        size_t frameCount;
240        size_t notificationFrameCount;
241        audio_port_handle_t selectedDeviceId;
242        audio_session_t sessionId;
243    };
244
245    /* CreateRecordOutput contains all output arguments returned by AudioFlinger to AudioRecord
246     * when calling createRecord() including arguments that were passed as I/O for update by
247     * CreateRecordInput.
248     */
249    class CreateRecordOutput : public Parcelable {
250    public:
251        status_t readFromParcel(const Parcel *parcel) override {
252            /* input/output arguments*/
253            (void)parcel->read(&flags, sizeof(audio_input_flags_t));
254            frameCount = parcel->readInt64();
255            notificationFrameCount = parcel->readInt64();
256            (void)parcel->read(&selectedDeviceId, sizeof(audio_port_handle_t));
257            (void)parcel->read(&sessionId, sizeof(audio_session_t));
258
259            /* output arguments*/
260            sampleRate = parcel->readUint32();
261            (void)parcel->read(&inputId, sizeof(audio_io_handle_t));
262            if (parcel->readInt32() != 0) {
263                cblk = interface_cast<IMemory>(parcel->readStrongBinder());
264                if (cblk == 0 || cblk->pointer() == NULL) {
265                    return BAD_VALUE;
266                }
267            }
268            if (parcel->readInt32() != 0) {
269                buffers = interface_cast<IMemory>(parcel->readStrongBinder());
270                if (buffers == 0 || buffers->pointer() == NULL) {
271                    return BAD_VALUE;
272                }
273            }
274            return NO_ERROR;
275        }
276
277        status_t writeToParcel(Parcel *parcel) const override {
278            /* input/output arguments*/
279            (void)parcel->write(&flags, sizeof(audio_input_flags_t));
280            (void)parcel->writeInt64(frameCount);
281            (void)parcel->writeInt64(notificationFrameCount);
282            (void)parcel->write(&selectedDeviceId, sizeof(audio_port_handle_t));
283            (void)parcel->write(&sessionId, sizeof(audio_session_t));
284
285            /* output arguments*/
286            (void)parcel->writeUint32(sampleRate);
287            (void)parcel->write(&inputId, sizeof(audio_io_handle_t));
288            if (cblk != 0) {
289                (void)parcel->writeInt32(1);
290                (void)parcel->writeStrongBinder(IInterface::asBinder(cblk));
291            } else {
292                (void)parcel->writeInt32(0);
293            }
294            if (buffers != 0) {
295                (void)parcel->writeInt32(1);
296                (void)parcel->writeStrongBinder(IInterface::asBinder(buffers));
297            } else {
298                (void)parcel->writeInt32(0);
299            }
300
301            return NO_ERROR;
302        }
303
304        /* input/output */
305        audio_input_flags_t flags;
306        size_t frameCount;
307        size_t notificationFrameCount;
308        audio_port_handle_t selectedDeviceId;
309        audio_session_t sessionId;
310
311        /* output */
312        uint32_t sampleRate;
313        audio_io_handle_t inputId;
314        sp<IMemory> cblk;
315        sp<IMemory> buffers;
316    };
317
318    // invariant on exit for all APIs that return an sp<>:
319    //   (return value != 0) == (*status == NO_ERROR)
320
321    /* create an audio track and registers it with AudioFlinger.
322     * return null if the track cannot be created.
323     */
324    virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input,
325                                        CreateTrackOutput& output,
326                                        status_t *status) = 0;
327
328    virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input,
329                                        CreateRecordOutput& output,
330                                        status_t *status) = 0;
331
332    // FIXME Surprisingly, format/latency don't work for input handles
333
334    /* query the audio hardware state. This state never changes,
335     * and therefore can be cached.
336     */
337    virtual     uint32_t    sampleRate(audio_io_handle_t ioHandle) const = 0;
338
339    // reserved; formerly channelCount()
340
341    virtual     audio_format_t format(audio_io_handle_t output) const = 0;
342    virtual     size_t      frameCount(audio_io_handle_t ioHandle) const = 0;
343
344    // return estimated latency in milliseconds
345    virtual     uint32_t    latency(audio_io_handle_t output) const = 0;
346
347    /* set/get the audio hardware state. This will probably be used by
348     * the preference panel, mostly.
349     */
350    virtual     status_t    setMasterVolume(float value) = 0;
351    virtual     status_t    setMasterMute(bool muted) = 0;
352
353    virtual     float       masterVolume() const = 0;
354    virtual     bool        masterMute() const = 0;
355
356    /* set/get stream type state. This will probably be used by
357     * the preference panel, mostly.
358     */
359    virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value,
360                                    audio_io_handle_t output) = 0;
361    virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted) = 0;
362
363    virtual     float       streamVolume(audio_stream_type_t stream,
364                                    audio_io_handle_t output) const = 0;
365    virtual     bool        streamMute(audio_stream_type_t stream) const = 0;
366
367    // set audio mode
368    virtual     status_t    setMode(audio_mode_t mode) = 0;
369
370    // mic mute/state
371    virtual     status_t    setMicMute(bool state) = 0;
372    virtual     bool        getMicMute() const = 0;
373    virtual     void        setRecordSilenced(uid_t uid, bool silenced) = 0;
374
375    virtual     status_t    setParameters(audio_io_handle_t ioHandle,
376                                    const String8& keyValuePairs) = 0;
377    virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys)
378                                    const = 0;
379
380    // Register an object to receive audio input/output change and track notifications.
381    // For a given calling pid, AudioFlinger disregards any registrations after the first.
382    // Thus the IAudioFlingerClient must be a singleton per process.
383    virtual void registerClient(const sp<IAudioFlingerClient>& client) = 0;
384
385    // retrieve the audio recording buffer size
386    // FIXME This API assumes a route, and so should be deprecated.
387    virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format,
388            audio_channel_mask_t channelMask) const = 0;
389
390    virtual status_t openOutput(audio_module_handle_t module,
391                                audio_io_handle_t *output,
392                                audio_config_t *config,
393                                audio_devices_t *devices,
394                                const String8& address,
395                                uint32_t *latencyMs,
396                                audio_output_flags_t flags) = 0;
397    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
398                                    audio_io_handle_t output2) = 0;
399    virtual status_t closeOutput(audio_io_handle_t output) = 0;
400    virtual status_t suspendOutput(audio_io_handle_t output) = 0;
401    virtual status_t restoreOutput(audio_io_handle_t output) = 0;
402
403    virtual status_t openInput(audio_module_handle_t module,
404                               audio_io_handle_t *input,
405                               audio_config_t *config,
406                               audio_devices_t *device,
407                               const String8& address,
408                               audio_source_t source,
409                               audio_input_flags_t flags) = 0;
410    virtual status_t closeInput(audio_io_handle_t input) = 0;
411
412    virtual status_t invalidateStream(audio_stream_type_t stream) = 0;
413
414    virtual status_t setVoiceVolume(float volume) = 0;
415
416    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
417                                    audio_io_handle_t output) const = 0;
418
419    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const = 0;
420
421    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) = 0;
422
423    virtual void acquireAudioSessionId(audio_session_t audioSession, pid_t pid) = 0;
424    virtual void releaseAudioSessionId(audio_session_t audioSession, pid_t pid) = 0;
425
426    virtual status_t queryNumberEffects(uint32_t *numEffects) const = 0;
427
428    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const = 0;
429
430    virtual status_t getEffectDescriptor(const effect_uuid_t *pEffectUUID,
431                                        effect_descriptor_t *pDescriptor) const = 0;
432
433    virtual sp<IEffect> createEffect(
434                                    effect_descriptor_t *pDesc,
435                                    const sp<IEffectClient>& client,
436                                    int32_t priority,
437                                    // AudioFlinger doesn't take over handle reference from client
438                                    audio_io_handle_t output,
439                                    audio_session_t sessionId,
440                                    const String16& callingPackage,
441                                    pid_t pid,
442                                    status_t *status,
443                                    int *id,
444                                    int *enabled) = 0;
445
446    virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput,
447                                    audio_io_handle_t dstOutput) = 0;
448
449    virtual audio_module_handle_t loadHwModule(const char *name) = 0;
450
451    // helpers for android.media.AudioManager.getProperty(), see description there for meaning
452    // FIXME move these APIs to AudioPolicy to permit a more accurate implementation
453    // that looks on primary device for a stream with fast flag, primary flag, or first one.
454    virtual uint32_t getPrimaryOutputSamplingRate() = 0;
455    virtual size_t getPrimaryOutputFrameCount() = 0;
456
457    // Intended for AudioService to inform AudioFlinger of device's low RAM attribute,
458    // and should be called at most once.  For a definition of what "low RAM" means, see
459    // android.app.ActivityManager.isLowRamDevice().  The totalMemory parameter
460    // is obtained from android.app.ActivityManager.MemoryInfo.totalMem.
461    virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) = 0;
462
463    /* List available audio ports and their attributes */
464    virtual status_t listAudioPorts(unsigned int *num_ports,
465                                    struct audio_port *ports) = 0;
466
467    /* Get attributes for a given audio port */
468    virtual status_t getAudioPort(struct audio_port *port) = 0;
469
470    /* Create an audio patch between several source and sink ports */
471    virtual status_t createAudioPatch(const struct audio_patch *patch,
472                                       audio_patch_handle_t *handle) = 0;
473
474    /* Release an audio patch */
475    virtual status_t releaseAudioPatch(audio_patch_handle_t handle) = 0;
476
477    /* List existing audio patches */
478    virtual status_t listAudioPatches(unsigned int *num_patches,
479                                      struct audio_patch *patches) = 0;
480    /* Set audio port configuration */
481    virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0;
482
483    /* Get the HW synchronization source used for an audio session */
484    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) = 0;
485
486    /* Indicate JAVA services are ready (scheduling, power management ...) */
487    virtual status_t systemReady() = 0;
488
489    // Returns the number of frames per audio HAL buffer.
490    virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const = 0;
491
492    /* List available microphones and their characteristics */
493    virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) = 0;
494};
495
496
497// ----------------------------------------------------------------------------
498
499class BnAudioFlinger : public BnInterface<IAudioFlinger>
500{
501public:
502    virtual status_t    onTransact( uint32_t code,
503                                    const Parcel& data,
504                                    Parcel* reply,
505                                    uint32_t flags = 0);
506
507    // Requests media.log to start merging log buffers
508    virtual void requestLogMerge() = 0;
509};
510
511// ----------------------------------------------------------------------------
512
513}; // namespace android
514
515#endif // ANDROID_IAUDIOFLINGER_H
516