1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero */ 9*10465441SEvalZero #ifndef __AUDIO_PIPE_H__ 10*10465441SEvalZero #define __AUDIO_PIPE_H__ 11*10465441SEvalZero 12*10465441SEvalZero /** 13*10465441SEvalZero * Pipe Device 14*10465441SEvalZero */ 15*10465441SEvalZero #include <rtthread.h> 16*10465441SEvalZero #include <rtdevice.h> 17*10465441SEvalZero 18*10465441SEvalZero #ifndef RT_PIPE_BUFSZ 19*10465441SEvalZero #define PIPE_BUFSZ 512 20*10465441SEvalZero #else 21*10465441SEvalZero #define PIPE_BUFSZ RT_PIPE_BUFSZ 22*10465441SEvalZero #endif 23*10465441SEvalZero 24*10465441SEvalZero /* portal device */ 25*10465441SEvalZero struct rt_audio_portal_device 26*10465441SEvalZero { 27*10465441SEvalZero struct rt_device parent; 28*10465441SEvalZero struct rt_device *write_dev; 29*10465441SEvalZero struct rt_device *read_dev; 30*10465441SEvalZero }; 31*10465441SEvalZero 32*10465441SEvalZero enum rt_audio_pipe_flag 33*10465441SEvalZero { 34*10465441SEvalZero /* both read and write won't block */ 35*10465441SEvalZero RT_PIPE_FLAG_NONBLOCK_RDWR = 0x00, 36*10465441SEvalZero /* read would block */ 37*10465441SEvalZero RT_PIPE_FLAG_BLOCK_RD = 0x01, 38*10465441SEvalZero /* write would block */ 39*10465441SEvalZero RT_PIPE_FLAG_BLOCK_WR = 0x02, 40*10465441SEvalZero /* write to this pipe will discard some data when the pipe is full. 41*10465441SEvalZero * When this flag is set, RT_PIPE_FLAG_BLOCK_WR will be ignored since write 42*10465441SEvalZero * operation will always be success. */ 43*10465441SEvalZero RT_PIPE_FLAG_FORCE_WR = 0x04, 44*10465441SEvalZero }; 45*10465441SEvalZero 46*10465441SEvalZero struct rt_audio_pipe 47*10465441SEvalZero { 48*10465441SEvalZero struct rt_device parent; 49*10465441SEvalZero 50*10465441SEvalZero /* ring buffer in pipe device */ 51*10465441SEvalZero struct rt_ringbuffer ringbuffer; 52*10465441SEvalZero 53*10465441SEvalZero rt_int32_t flag; 54*10465441SEvalZero 55*10465441SEvalZero /* suspended list */ 56*10465441SEvalZero rt_list_t suspended_read_list; 57*10465441SEvalZero rt_list_t suspended_write_list; 58*10465441SEvalZero 59*10465441SEvalZero struct rt_audio_portal_device *write_portal; 60*10465441SEvalZero struct rt_audio_portal_device *read_portal; 61*10465441SEvalZero }; 62*10465441SEvalZero 63*10465441SEvalZero #define PIPE_CTRL_GET_SPACE 0x14 /**< get the remaining size of a pipe device */ 64*10465441SEvalZero 65*10465441SEvalZero rt_err_t rt_audio_pipe_init(struct rt_audio_pipe *pipe, 66*10465441SEvalZero const char *name, 67*10465441SEvalZero rt_int32_t flag, 68*10465441SEvalZero rt_uint8_t *buf, 69*10465441SEvalZero rt_size_t size); 70*10465441SEvalZero rt_err_t rt_audio_pipe_detach(struct rt_audio_pipe *pipe); 71*10465441SEvalZero #ifdef RT_USING_HEAP 72*10465441SEvalZero rt_err_t rt_audio_pipe_create(const char *name, rt_int32_t flag, rt_size_t size); 73*10465441SEvalZero void rt_audio_pipe_destroy(struct rt_audio_pipe *pipe); 74*10465441SEvalZero #endif 75*10465441SEvalZero #endif 76*10465441SEvalZero 77