* @brief Write data into audio pipe * * @param[in] dev pointer to audio pipe that has been configured * * @param[in] pos useless param * * @param[in] buffer pointer to buffer of ringbuffer * * @param[in] size size of data will be written * * @return number of written bytes * * @note The function will disable interrupt and may suspend current thread */
| 148 | * @note The function will disable interrupt and may suspend current thread |
| 149 | */ |
| 150 | static rt_ssize_t rt_audio_pipe_write(rt_device_t dev, |
| 151 | rt_off_t pos, |
| 152 | const void *buffer, |
| 153 | rt_size_t size) |
| 154 | { |
| 155 | rt_base_t level; |
| 156 | rt_thread_t thread; |
| 157 | struct rt_audio_pipe *pipe; |
| 158 | rt_size_t write_nbytes; |
| 159 | |
| 160 | pipe = (struct rt_audio_pipe *)dev; |
| 161 | RT_ASSERT(pipe != RT_NULL); |
| 162 | |
| 163 | if ((pipe->flag & RT_PIPE_FLAG_FORCE_WR) || |
| 164 | !(pipe->flag & RT_PIPE_FLAG_BLOCK_WR)) |
| 165 | { |
| 166 | level = rt_hw_interrupt_disable(); |
| 167 | |
| 168 | if (pipe->flag & RT_PIPE_FLAG_FORCE_WR) |
| 169 | write_nbytes = rt_ringbuffer_put_force(&(pipe->ringbuffer), |
| 170 | (const rt_uint8_t *)buffer, size); |
| 171 | else |
| 172 | write_nbytes = rt_ringbuffer_put(&(pipe->ringbuffer), |
| 173 | (const rt_uint8_t *)buffer, size); |
| 174 | |
| 175 | _rt_audio_pipe_resume_reader(pipe); |
| 176 | |
| 177 | rt_hw_interrupt_enable(level); |
| 178 | |
| 179 | return write_nbytes; |
| 180 | } |
| 181 | |
| 182 | thread = rt_thread_self(); |
| 183 | |
| 184 | /* current context checking */ |
| 185 | RT_DEBUG_NOT_IN_INTERRUPT; |
| 186 | |
| 187 | do |
| 188 | { |
| 189 | level = rt_hw_interrupt_disable(); |
| 190 | write_nbytes = rt_ringbuffer_put(&(pipe->ringbuffer), (const rt_uint8_t *)buffer, size); |
| 191 | if (write_nbytes == 0) |
| 192 | { |
| 193 | /* pipe full, waiting on suspended write list */ |
| 194 | rt_thread_suspend(thread); |
| 195 | /* waiting on suspended read list */ |
| 196 | rt_list_insert_before(&(pipe->suspended_write_list), |
| 197 | &RT_THREAD_LIST_NODE(thread)); |
| 198 | rt_hw_interrupt_enable(level); |
| 199 | |
| 200 | rt_schedule(); |
| 201 | } |
| 202 | else |
| 203 | { |
| 204 | _rt_audio_pipe_resume_reader(pipe); |
| 205 | rt_hw_interrupt_enable(level); |
| 206 | break; |
| 207 | } |
nothing calls this directly
no test coverage detected