Home | History | Annotate | Download | only in audioflinger
      1 /*
      2 **
      3 ** Copyright 2015, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #ifndef ANDROID_AUDIO_STREAM_OUT_H
     19 #define ANDROID_AUDIO_STREAM_OUT_H
     20 
     21 #include <stdint.h>
     22 #include <sys/types.h>
     23 
     24 #include <system/audio.h>
     25 
     26 namespace android {
     27 
     28 class AudioHwDevice;
     29 class DeviceHalInterface;
     30 class StreamOutHalInterface;
     31 
     32 /**
     33  * Managed access to a HAL output stream.
     34  */
     35 class AudioStreamOut {
     36 public:
     37 // AudioStreamOut is immutable, so its fields are const.
     38 // For emphasis, we could also make all pointers to them be "const *",
     39 // but that would clutter the code unnecessarily.
     40     AudioHwDevice * const audioHwDev;
     41     sp<StreamOutHalInterface> stream;
     42     const audio_output_flags_t flags;
     43 
     44     sp<DeviceHalInterface> hwDev() const;
     45 
     46     AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags);
     47 
     48     virtual status_t open(
     49             audio_io_handle_t handle,
     50             audio_devices_t devices,
     51             struct audio_config *config,
     52             const char *address);
     53 
     54     virtual ~AudioStreamOut();
     55 
     56     // Get the bottom 32-bits of the 64-bit render position.
     57     status_t getRenderPosition(uint32_t *frames);
     58 
     59     virtual status_t getRenderPosition(uint64_t *frames);
     60 
     61     virtual status_t getPresentationPosition(uint64_t *frames, struct timespec *timestamp);
     62 
     63     /**
     64     * Write audio buffer to driver. Returns number of bytes written, or a
     65     * negative status_t. If at least one frame was written successfully prior to the error,
     66     * it is suggested that the driver return that successful (short) byte count
     67     * and then return an error in the subsequent call.
     68     *
     69     * If set_callback() has previously been called to enable non-blocking mode
     70     * the write() is not allowed to block. It must write only the number of
     71     * bytes that currently fit in the driver/hardware buffer and then return
     72     * this byte count. If this is less than the requested write size the
     73     * callback function must be called when more space is available in the
     74     * driver/hardware buffer.
     75     */
     76     virtual ssize_t write(const void *buffer, size_t bytes);
     77 
     78     /**
     79      * @return frame size from the perspective of the application and the AudioFlinger.
     80      */
     81     virtual size_t getFrameSize() const { return mHalFrameSize; }
     82 
     83     /**
     84      * @return format from the perspective of the application and the AudioFlinger.
     85      */
     86     virtual audio_format_t getFormat() const;
     87 
     88     /**
     89      * The HAL may be running at a higher sample rate if, for example, playing wrapped EAC3.
     90      * @return sample rate from the perspective of the application and the AudioFlinger.
     91      */
     92     virtual uint32_t getSampleRate() const;
     93 
     94     /**
     95      * The HAL is in stereo mode when playing multi-channel compressed audio over HDMI.
     96      * @return channel mask from the perspective of the application and the AudioFlinger.
     97      */
     98     virtual audio_channel_mask_t getChannelMask() const;
     99 
    100 
    101     virtual status_t flush();
    102     virtual status_t standby();
    103 
    104 protected:
    105     uint64_t             mFramesWritten; // reset by flush
    106     uint64_t             mFramesWrittenAtStandby;
    107     uint64_t             mRenderPosition; // reset by flush or standby
    108     int                  mRateMultiplier;
    109     bool                 mHalFormatHasProportionalFrames;
    110     size_t               mHalFrameSize;
    111 };
    112 
    113 } // namespace android
    114 
    115 #endif // ANDROID_AUDIO_STREAM_OUT_H
    116