AudioStreamOut.h revision 062e67a26e0553dd142be622821f493df541f0c6
1062e67a26e0553dd142be622821f493df541f0c6Phil Burk/* 2062e67a26e0553dd142be622821f493df541f0c6Phil Burk** 3062e67a26e0553dd142be622821f493df541f0c6Phil Burk** Copyright 2015, The Android Open Source Project 4062e67a26e0553dd142be622821f493df541f0c6Phil Burk** 5062e67a26e0553dd142be622821f493df541f0c6Phil Burk** Licensed under the Apache License, Version 2.0 (the "License"); 6062e67a26e0553dd142be622821f493df541f0c6Phil Burk** you may not use this file except in compliance with the License. 7062e67a26e0553dd142be622821f493df541f0c6Phil Burk** You may obtain a copy of the License at 8062e67a26e0553dd142be622821f493df541f0c6Phil Burk** 9062e67a26e0553dd142be622821f493df541f0c6Phil Burk** http://www.apache.org/licenses/LICENSE-2.0 10062e67a26e0553dd142be622821f493df541f0c6Phil Burk** 11062e67a26e0553dd142be622821f493df541f0c6Phil Burk** Unless required by applicable law or agreed to in writing, software 12062e67a26e0553dd142be622821f493df541f0c6Phil Burk** distributed under the License is distributed on an "AS IS" BASIS, 13062e67a26e0553dd142be622821f493df541f0c6Phil Burk** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14062e67a26e0553dd142be622821f493df541f0c6Phil Burk** See the License for the specific language governing permissions and 15062e67a26e0553dd142be622821f493df541f0c6Phil Burk** limitations under the License. 16062e67a26e0553dd142be622821f493df541f0c6Phil Burk*/ 17062e67a26e0553dd142be622821f493df541f0c6Phil Burk 18062e67a26e0553dd142be622821f493df541f0c6Phil Burk#ifndef ANDROID_AUDIO_STREAM_OUT_H 19062e67a26e0553dd142be622821f493df541f0c6Phil Burk#define ANDROID_AUDIO_STREAM_OUT_H 20062e67a26e0553dd142be622821f493df541f0c6Phil Burk 21062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <stdint.h> 22062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <sys/types.h> 23062e67a26e0553dd142be622821f493df541f0c6Phil Burk 24062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include <system/audio.h> 25062e67a26e0553dd142be622821f493df541f0c6Phil Burk 26062e67a26e0553dd142be622821f493df541f0c6Phil Burk#include "AudioStreamOut.h" 27062e67a26e0553dd142be622821f493df541f0c6Phil Burk 28062e67a26e0553dd142be622821f493df541f0c6Phil Burknamespace android { 29062e67a26e0553dd142be622821f493df541f0c6Phil Burk 30062e67a26e0553dd142be622821f493df541f0c6Phil Burkclass AudioHwDevice; 31062e67a26e0553dd142be622821f493df541f0c6Phil Burk 32062e67a26e0553dd142be622821f493df541f0c6Phil Burk/** 33062e67a26e0553dd142be622821f493df541f0c6Phil Burk * Managed access to a HAL output stream. 34062e67a26e0553dd142be622821f493df541f0c6Phil Burk */ 35062e67a26e0553dd142be622821f493df541f0c6Phil Burkclass AudioStreamOut { 36062e67a26e0553dd142be622821f493df541f0c6Phil Burkpublic: 37062e67a26e0553dd142be622821f493df541f0c6Phil Burk// AudioStreamOut is immutable, so its fields are const. 38062e67a26e0553dd142be622821f493df541f0c6Phil Burk// For emphasis, we could also make all pointers to them be "const *", 39062e67a26e0553dd142be622821f493df541f0c6Phil Burk// but that would clutter the code unnecessarily. 40062e67a26e0553dd142be622821f493df541f0c6Phil Burk AudioHwDevice * const audioHwDev; 41062e67a26e0553dd142be622821f493df541f0c6Phil Burk audio_stream_out_t *stream; 42062e67a26e0553dd142be622821f493df541f0c6Phil Burk const audio_output_flags_t flags; 43062e67a26e0553dd142be622821f493df541f0c6Phil Burk 44062e67a26e0553dd142be622821f493df541f0c6Phil Burk audio_hw_device_t *hwDev() const; 45062e67a26e0553dd142be622821f493df541f0c6Phil Burk 46062e67a26e0553dd142be622821f493df541f0c6Phil Burk AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags); 47062e67a26e0553dd142be622821f493df541f0c6Phil Burk 48062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual status_t open( 49062e67a26e0553dd142be622821f493df541f0c6Phil Burk audio_io_handle_t handle, 50062e67a26e0553dd142be622821f493df541f0c6Phil Burk audio_devices_t devices, 51062e67a26e0553dd142be622821f493df541f0c6Phil Burk struct audio_config *config, 52062e67a26e0553dd142be622821f493df541f0c6Phil Burk const char *address); 53062e67a26e0553dd142be622821f493df541f0c6Phil Burk 54062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual ~AudioStreamOut() { } 55062e67a26e0553dd142be622821f493df541f0c6Phil Burk 56062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual status_t getRenderPosition(uint32_t *frames); 57062e67a26e0553dd142be622821f493df541f0c6Phil Burk 58062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual status_t getPresentationPosition(uint64_t *frames, struct timespec *timestamp); 59062e67a26e0553dd142be622821f493df541f0c6Phil Burk 60062e67a26e0553dd142be622821f493df541f0c6Phil Burk /** 61062e67a26e0553dd142be622821f493df541f0c6Phil Burk * Write audio buffer to driver. Returns number of bytes written, or a 62062e67a26e0553dd142be622821f493df541f0c6Phil Burk * negative status_t. If at least one frame was written successfully prior to the error, 63062e67a26e0553dd142be622821f493df541f0c6Phil Burk * it is suggested that the driver return that successful (short) byte count 64062e67a26e0553dd142be622821f493df541f0c6Phil Burk * and then return an error in the subsequent call. 65062e67a26e0553dd142be622821f493df541f0c6Phil Burk * 66062e67a26e0553dd142be622821f493df541f0c6Phil Burk * If set_callback() has previously been called to enable non-blocking mode 67062e67a26e0553dd142be622821f493df541f0c6Phil Burk * the write() is not allowed to block. It must write only the number of 68062e67a26e0553dd142be622821f493df541f0c6Phil Burk * bytes that currently fit in the driver/hardware buffer and then return 69062e67a26e0553dd142be622821f493df541f0c6Phil Burk * this byte count. If this is less than the requested write size the 70062e67a26e0553dd142be622821f493df541f0c6Phil Burk * callback function must be called when more space is available in the 71062e67a26e0553dd142be622821f493df541f0c6Phil Burk * driver/hardware buffer. 72062e67a26e0553dd142be622821f493df541f0c6Phil Burk */ 73062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual ssize_t write(const void *buffer, size_t bytes); 74062e67a26e0553dd142be622821f493df541f0c6Phil Burk 75062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual size_t getFrameSize(); 76062e67a26e0553dd142be622821f493df541f0c6Phil Burk 77062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual status_t flush(); 78062e67a26e0553dd142be622821f493df541f0c6Phil Burk virtual status_t standby(); 79062e67a26e0553dd142be622821f493df541f0c6Phil Burk}; 80062e67a26e0553dd142be622821f493df541f0c6Phil Burk 81062e67a26e0553dd142be622821f493df541f0c6Phil Burk} // namespace android 82062e67a26e0553dd142be622821f493df541f0c6Phil Burk 83062e67a26e0553dd142be622821f493df541f0c6Phil Burk#endif // ANDROID_AUDIO_STREAM_OUT_H 84