Home | History | Annotate | Download | only in media
      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 
     43 namespace android {
     44 
     45 // ----------------------------------------------------------------------------
     46 
     47 class IAudioFlinger : public IInterface
     48 {
     49 public:
     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 
    499 class BnAudioFlinger : public BnInterface<IAudioFlinger>
    500 {
    501 public:
    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