Home | History | Annotate | Download | only in 2.0
      1 /*
      2  * Copyright (C) 2016 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 package android.hardware.audio@2.0;
     18 
     19 import android.hardware.audio.common@2.0;
     20 import IStream;
     21 import IStreamOutCallback;
     22 
     23 interface IStreamOut extends IStream {
     24     typedef android.hardware.audio@2.0::Result Result;
     25 
     26     /**
     27      * Return the audio hardware driver estimated latency in milliseconds.
     28      *
     29      * @return latencyMs latency in milliseconds.
     30      */
     31     getLatency() generates (uint32_t latencyMs);
     32 
     33     /**
     34      * This method is used in situations where audio mixing is done in the
     35      * hardware. This method serves as a direct interface with hardware,
     36      * allowing to directly set the volume as apposed to via the framework.
     37      * This method might produce multiple PCM outputs or hardware accelerated
     38      * codecs, such as MP3 or AAC.
     39      *
     40      * @param left left channel attenuation, 1.0f is unity, 0.0f is zero.
     41      * @param right right channel attenuation, 1.0f is unity, 0.0f is zero.
     42      * @return retval operation completion status.
     43      */
     44     setVolume(float left, float right) generates (Result retval);
     45 
     46     /**
     47      * Commands that can be executed on the driver writer thread.
     48      */
     49     enum WriteCommand : int32_t {
     50         WRITE,
     51         GET_PRESENTATION_POSITION,
     52         GET_LATENCY
     53     };
     54 
     55     /**
     56      * Data structure passed back to the client via status message queue
     57      * of 'write' operation.
     58      *
     59      * Possible values of 'retval' field:
     60      *  - OK, write operation was successful;
     61      *  - INVALID_ARGUMENTS, stream was not configured properly;
     62      *  - INVALID_STATE, stream is in a state that doesn't allow writes;
     63      *  - INVALID_OPERATION, retrieving presentation position isn't supported.
     64      */
     65     struct WriteStatus {
     66         Result retval;
     67         WriteCommand replyTo;  // discriminator
     68         union Reply {
     69             uint64_t written;  // WRITE command, amount of bytes written, >= 0.
     70             struct PresentationPosition {  // same as generated by
     71                 uint64_t frames;           // getPresentationPosition.
     72                 TimeSpec timeStamp;
     73             } presentationPosition;
     74             uint32_t latencyMs; // Same as generated by getLatency.
     75         } reply;
     76     };
     77 
     78     /**
     79      * Set up required transports for passing audio buffers to the driver.
     80      *
     81      * The transport consists of three message queues:
     82      *  -- command queue is used to instruct the writer thread what operation
     83      *     to perform;
     84      *  -- data queue is used for passing audio data from the client
     85      *     to the driver;
     86      *  -- status queue is used for reporting operation status
     87      *     (e.g. amount of bytes actually written or error code).
     88      *
     89      * The driver operates on a dedicated thread. The client must ensure that
     90      * the thread is given an appropriate priority and assigned to correct
     91      * scheduler and cgroup. For this purpose, the method returns identifiers
     92      * of the driver thread.
     93      *
     94      * @param frameSize the size of a single frame, in bytes.
     95      * @param framesCount the number of frames in a buffer.
     96      * @return retval OK if both message queues were created successfully.
     97      *                INVALID_STATE if the method was already called.
     98      *                INVALID_ARGUMENTS if there was a problem setting up
     99      *                                  the queues.
    100      * @return commandMQ a message queue used for passing commands.
    101      * @return dataMQ a message queue used for passing audio data in the format
    102      *                specified at the stream opening.
    103      * @return statusMQ a message queue used for passing status from the driver
    104      *                  using WriteStatus structures.
    105      * @return threadInfo identifiers of the driver's dedicated thread.
    106      */
    107     prepareForWriting(uint32_t frameSize, uint32_t framesCount)
    108     generates (
    109             Result retval,
    110             fmq_sync<WriteCommand> commandMQ,
    111             fmq_sync<uint8_t> dataMQ,
    112             fmq_sync<WriteStatus> statusMQ,
    113             ThreadInfo threadInfo);
    114 
    115     /**
    116      * Return the number of audio frames written by the audio DSP to DAC since
    117      * the output has exited standby.
    118      *
    119      * @return retval operation completion status.
    120      * @return dspFrames number of audio frames written.
    121      */
    122     getRenderPosition() generates (Result retval, uint32_t dspFrames);
    123 
    124     /**
    125      * Get the local time at which the next write to the audio driver will be
    126      * presented. The units are microseconds, where the epoch is decided by the
    127      * local audio HAL.
    128      *
    129      * @return retval operation completion status.
    130      * @return timestampUs time of the next write.
    131      */
    132     getNextWriteTimestamp() generates (Result retval, int64_t timestampUs);
    133 
    134     /**
    135      * Set the callback interface for notifying completion of non-blocking
    136      * write and drain.
    137      *
    138      * Calling this function implies that all future 'write' and 'drain'
    139      * must be non-blocking and use the callback to signal completion.
    140      *
    141      * 'clearCallback' method needs to be called in order to release the local
    142      * callback proxy on the server side and thus dereference the callback
    143      * implementation on the client side.
    144      *
    145      * @return retval operation completion status.
    146      */
    147     setCallback(IStreamOutCallback callback) generates (Result retval);
    148 
    149     /**
    150      * Clears the callback previously set via 'setCallback' method.
    151      *
    152      * Warning: failure to call this method results in callback implementation
    153      * on the client side being held until the HAL server termination.
    154      *
    155      * @return retval operation completion status: OK or NOT_SUPPORTED.
    156      */
    157     clearCallback() generates (Result retval);
    158 
    159     /**
    160      * Returns whether HAL supports pausing and resuming of streams.
    161      *
    162      * @return supportsPause true if pausing is supported.
    163      * @return supportsResume true if resume is supported.
    164      */
    165     supportsPauseAndResume()
    166             generates (bool supportsPause, bool supportsResume);
    167 
    168     /**
    169      * Notifies to the audio driver to stop playback however the queued buffers
    170      * are retained by the hardware. Useful for implementing pause/resume. Empty
    171      * implementation if not supported however must be implemented for hardware
    172      * with non-trivial latency. In the pause state, some audio hardware may
    173      * still be using power. Client code may consider calling 'suspend' after a
    174      * timeout to prevent that excess power usage.
    175      *
    176      * Implementation of this function is mandatory for offloaded playback.
    177      *
    178      * @return retval operation completion status.
    179      */
    180     pause() generates (Result retval);
    181 
    182     /**
    183      * Notifies to the audio driver to resume playback following a pause.
    184      * Returns error INVALID_STATE if called without matching pause.
    185      *
    186      * Implementation of this function is mandatory for offloaded playback.
    187      *
    188      * @return retval operation completion status.
    189      */
    190     resume() generates (Result retval);
    191 
    192     /**
    193      * Returns whether HAL supports draining of streams.
    194      *
    195      * @return supports true if draining is supported.
    196      */
    197     supportsDrain() generates (bool supports);
    198 
    199     /**
    200      * Requests notification when data buffered by the driver/hardware has been
    201      * played. If 'setCallback' has previously been called to enable
    202      * non-blocking mode, then 'drain' must not block, instead it must return
    203      * quickly and completion of the drain is notified through the callback. If
    204      * 'setCallback' has not been called, then 'drain' must block until
    205      * completion.
    206      *
    207      * If 'type' is 'ALL', the drain completes when all previously written data
    208      * has been played.
    209      *
    210      * If 'type' is 'EARLY_NOTIFY', the drain completes shortly before all data
    211      * for the current track has played to allow time for the framework to
    212      * perform a gapless track switch.
    213      *
    214      * Drain must return immediately on 'stop' and 'flush' calls.
    215      *
    216      * Implementation of this function is mandatory for offloaded playback.
    217      *
    218      * @param type type of drain.
    219      * @return retval operation completion status.
    220      */
    221     drain(AudioDrain type) generates (Result retval);
    222 
    223     /**
    224      * Notifies to the audio driver to flush the queued data. Stream must
    225      * already be paused before calling 'flush'.
    226      *
    227      * Implementation of this function is mandatory for offloaded playback.
    228      *
    229      * @return retval operation completion status.
    230      */
    231     flush() generates (Result retval);
    232 
    233     /**
    234      * Return a recent count of the number of audio frames presented to an
    235      * external observer. This excludes frames which have been written but are
    236      * still in the pipeline. The count is not reset to zero when output enters
    237      * standby. Also returns the value of CLOCK_MONOTONIC as of this
    238      * presentation count. The returned count is expected to be 'recent', but
    239      * does not need to be the most recent possible value. However, the
    240      * associated time must correspond to whatever count is returned.
    241      *
    242      * Example: assume that N+M frames have been presented, where M is a 'small'
    243      * number. Then it is permissible to return N instead of N+M, and the
    244      * timestamp must correspond to N rather than N+M. The terms 'recent' and
    245      * 'small' are not defined. They reflect the quality of the implementation.
    246      *
    247      * @return retval operation completion status.
    248      * @return frames count of presented audio frames.
    249      * @return timeStamp associated clock time.
    250      */
    251     getPresentationPosition()
    252             generates (Result retval, uint64_t frames, TimeSpec timeStamp);
    253 };
    254