/* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA"). * All rights reserved. * * This software is supplied "AS IS" without any warranties. * RDA assumes no responsibility or liability for the use of the software, * conveys no license or title under any patent, copyright, or mask work * right to the product. RDA reserves the right to make changes in the * software without notification. RDA also make no representation or * warranty that such application will be suitable for the specified use * without further testing or modification. */ #ifndef _AUDIO_WRITER_H_ #define _AUDIO_WRITER_H_ #include "osi_api.h" #include "osi_byte_buf.h" OSI_EXTERN_C_BEGIN /** * \brief forward declaration */ struct auWriter; /** * \brief forward declaration */ struct osiPipe; /** * \brief audio writer operations */ typedef struct { /** delete the audio writer */ void (*destroy)(struct auWriter *d); /** refer to \p auWriterWrite */ int (*write)(struct auWriter *d, const void *buf, unsigned size); /** refer to \p auWriterSeek */ int (*seek)(struct auWriter *d, int offset, int whence); } auWriterOps_t; /** * \brief audio writer base * * Audio writer is an abstraction of file. The basic operation is to write * to the writer. And the writer doesn't care about the content. * * When implement an audio writer, the first field should be * const auWriterOps_t *. */ typedef struct auWriter { auWriterOps_t ops; ///< audio writer operations } auWriter_t; /** * \brief delete the audio writer * * When \p d is NULL, nothing will be done. * * \param d audio writer */ void auWriterDelete(auWriter_t *d); /** * \brief write data to audio writer * * \param d audio writer * \param buf buf to be written, can't be NULL if \p size is not 0. * \param size buf size * \return * - the size written to audio writer, which may be less than \p size. * - -1 for invalid parameters, or write error */ int auWriterWrite(auWriter_t *d, const void *buf, unsigned size); /** * \brief whether the audio writer support seek * * When \p seek function pointer is NULL, it is not seekable. * * \param d audio writer * \return * - true if the audio writer supports seek * - false if the audio writer doesn't support seek */ bool auWriterIsSeekable(auWriter_t *d); /** * \brief audio writer seek * * Macros for \p whence are defined in stdio.h. * * \param d audio writer * \param offset offset according to the directive whence * \param whence SEEK_SET, SEEK_CUR, SEEK_END * \return * - offset location from the beginning of writer on success. * - -1 on error. */ int auWriterSeek(auWriter_t *d, int offset, int whence); /** * \brief opaque data strcture of file based audio writer */ typedef struct auFileWriter auFileWriter_t; /** * \brief create a file based audio writer * * When \p fname doesn't exist, it will be created. When \p fname exists, * the file will be truncated to zero length. * * \param fname file name * \return * - the created audio writer * - NULL if invalid parameter, or out of memory */ auFileWriter_t *auFileWriterCreate(const char *fname); /** * \brief opaque data structure of memory based audio writer */ typedef struct auMemWriter auMemWriter_t; /** * \brief create a memory based audio writer * * The memory is dynamic allocated at initialization. * * \param max_size maximum memory size, 0 for no limitation * \return * - the created audio writer * - NULL if out of memory */ auMemWriter_t *auMemWriterCreate(unsigned max_size); /** * \brief get buffer of memory based audio writer * * The buffer pointer may be changed, except the special case mentioned above, * \p init_size is the same as \p max_size. * * \param d memory based audio writer * \return * - buffer pointer and size. */ osiBuffer_t auMemWriterGetBuf(auMemWriter_t *d); /** * \brief opaque data structure for pip based audio writer */ typedef struct auPipeWriter auPipeWriter_t; /** * \brief create a pipe based audio writer * * Pipe base audio writer will decouple audio data producing and consuming. * Seek is unsupported in pipe based audio writer. Audio writer will just * access the writer side of pipe. * * \param pipe the pipe to be write * \return * - the created audio writer * - NULL if out of memory, or invalid parameter */ auPipeWriter_t *auPipeWriterCreate(struct osiPipe *pipe); /** * \brief set wait timeout for audio pipe writer * * By default, audio pipe write won't wait and will return immediately even * the pipe is full, or not enough for the requested byte count. This can * set the wait timeout, 0 for not waiting and \p OSI_WAIT_FOREVER for * infinite wait until the requested data are written. * * \param d the audio pipe writer * \param timeout wait timeout */ void auPipeWriterSetWait(auWriter_t *d, unsigned timeout); /** * \brief opaque data structure of dummy audio writer * * Dummy writer will drop all incoming data, just provides writer APIs. * Typically, it will only be used for debug purpose. */ typedef struct auDummyWriter auDummyWriter_t; /** * \brief create a dummy audio writer * * \return * - the created audio writer * - NULL if out of memory */ auDummyWriter_t *auDummyWriterCreate(void); OSI_EXTERN_C_END #endif