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 #pragma once 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 23 #include <system/audio.h> 24 #include <utils/Errors.h> 25 #include <utils/RefBase.h> 26 27 namespace android { 28 29 class AudioHwDevice; 30 class DeviceHalInterface; 31 class StreamOutHalInterface; 32 33 /** 34 * Managed access to a HAL output stream. 35 */ 36 class AudioStreamOut { 37 public: 38 AudioHwDevice * const audioHwDev; 39 sp<StreamOutHalInterface> stream; 40 const audio_output_flags_t flags; 41 42 [[nodiscard]] sp<DeviceHalInterface> hwDev() const; 43 44 AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags); 45 46 virtual status_t open( 47 audio_io_handle_t handle, 48 audio_devices_t deviceType, 49 struct audio_config *config, 50 const char *address); 51 52 virtual ~AudioStreamOut(); 53 54 virtual status_t getRenderPosition(uint64_t *frames); 55 56 virtual status_t getPresentationPosition(uint64_t *frames, struct timespec *timestamp); 57 58 /** 59 * Write audio buffer to driver. Returns number of bytes written, or a 60 * negative status_t. If at least one frame was written successfully prior to the error, 61 * it is suggested that the driver return that successful (short) byte count 62 * and then return an error in the subsequent call. 63 * 64 * If set_callback() has previously been called to enable non-blocking mode 65 * the write() is not allowed to block. It must write only the number of 66 * bytes that currently fit in the driver/hardware buffer and then return 67 * this byte count. If this is less than the requested write size the 68 * callback function must be called when more space is available in the 69 * driver/hardware buffer. 70 */ 71 virtual ssize_t write(const void *buffer, size_t bytes); 72 73 /** 74 * @return frame size from the perspective of the application and the AudioFlinger. 75 */ getFrameSize()76 [[nodiscard]] virtual size_t getFrameSize() const { return mHalFrameSize; } 77 78 /** 79 * @return audio stream configuration: channel mask, format, sample rate: 80 * - channel mask from the perspective of the application and the AudioFlinger, 81 * The HAL is in stereo mode when playing multi-channel compressed audio over HDMI; 82 * - format from the perspective of the application and the AudioFlinger; 83 * - sample rate from the perspective of the application and the AudioFlinger, 84 * The HAL may be running at a higher sample rate if, for example, playing wrapped EAC3. 85 */ 86 [[nodiscard]] virtual audio_config_base_t getAudioProperties() const; 87 88 virtual status_t flush(); 89 virtual status_t standby(); 90 91 virtual void presentationComplete(); 92 93 protected: 94 uint64_t mFramesWritten = 0; // reset by flush 95 uint64_t mFramesWrittenAtStandby = 0; 96 int mRateMultiplier = 1; 97 bool mHalFormatHasProportionalFrames = false; 98 size_t mHalFrameSize = 0; 99 }; 100 101 } // namespace android 102