MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / rt_audio_pipe_write

Function rt_audio_pipe_write

components/drivers/audio/dev_audio_pipe.c:150–212  ·  view source on GitHub ↗

* @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 */

Source from the content-addressed store, hash-verified

148 * @note The function will disable interrupt and may suspend current thread
149 */
150static 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 }

Callers

nothing calls this directly

Calls 9

rt_ringbuffer_put_forceFunction · 0.85
rt_ringbuffer_putFunction · 0.85
rt_thread_selfFunction · 0.85
rt_thread_suspendFunction · 0.85
rt_list_insert_beforeFunction · 0.85
rt_hw_interrupt_disableFunction · 0.50
rt_hw_interrupt_enableFunction · 0.50
rt_scheduleFunction · 0.50

Tested by

no test coverage detected