ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_audio.c
Go to the documentation of this file.
1
15
16#include "ra8_audio.h"
17
18#include <stdint.h>
19
20#include "ra8_audio_internal.h"
21
36{
37 switch (format) {
39 return 2U;
41 return 4U;
42 default:
43 return 0U;
44 }
45}
46
48{
49 if (frame == nullptr) {
50 return k_ra8_err_null_ptr;
51 }
52 if (frame->data == nullptr) {
53 return k_ra8_err_null_ptr;
54 }
55 const uint32_t container_bytes = internal_audio_container_bytes(frame->format);
56 if (container_bytes == 0U) {
58 }
59 if (frame->sample_count == 0U) {
61 }
62 if (frame->sample_rate_hz == 0U) {
64 }
65 if (frame->channels == 0U) {
67 }
68 if (frame->valid_bits == 0U) {
70 }
71 if (frame->valid_bits > (container_bytes * 8U)) {
73 }
74 const uint64_t required =
75 (uint64_t)frame->sample_count * (uint64_t)frame->channels * (uint64_t)container_bytes;
76 if (required > (uint64_t)UINT32_MAX) {
78 }
79 if (frame->bytes != (uint32_t)required) {
81 }
82 return k_ra8_ok;
83}
84
86{
87 if (source == nullptr) {
88 return k_ra8_err_null_ptr;
89 }
90 if (out_info == nullptr) {
91 return k_ra8_err_null_ptr;
92 }
93 *out_info = (ra8_audio_source_info_t){};
94 if (source->iface == nullptr) {
96 }
97 if (source->iface->get_info == nullptr) {
99 }
100 return source->iface->get_info(source->ctx, out_info);
101}
102
120 const ra8_audio_source_info_t* info)
121{
122 if (frame->bytes != info->frame_bytes) {
124 }
125 if (frame->sample_count != info->samples_per_frame) {
127 }
128 if (frame->sample_rate_hz != info->sample_rate_hz) {
130 }
131 if (frame->channels != info->channels) {
133 }
134 if (frame->valid_bits != info->valid_bits) {
136 }
137 return (frame->format == info->format) ? k_ra8_ok : k_ra8_err_invalid_state;
138}
139
162 const ra8_audio_buffer_t* buffer,
163 ra8_audio_frame_t* out_frame)
164{
165 if (source == nullptr) {
166 return k_ra8_err_null_ptr;
167 }
168 if (buffer == nullptr) {
169 return k_ra8_err_null_ptr;
170 }
171 if (out_frame == nullptr) {
172 return k_ra8_err_null_ptr;
173 }
174 *out_frame = (ra8_audio_frame_t){};
175 if (source->iface == nullptr) {
177 }
178 if (source->iface->capture == nullptr) {
180 }
181 if (buffer->data == nullptr) {
182 return k_ra8_err_null_ptr;
183 }
184 if (buffer->capacity == 0U) {
185 return k_ra8_err_null_ptr;
186 }
187 return k_ra8_ok;
188}
189
191 const ra8_audio_buffer_t* buffer,
192 ra8_audio_frame_t* out_frame)
193{
194 const ra8_err_t args_valid = internal_audio_capture_args_valid(source, buffer, out_frame);
195 if (args_valid != k_ra8_ok) {
196 return args_valid;
197 }
198 ra8_audio_source_info_t info = {};
199 ra8_err_t err = source->iface->get_info(source->ctx, &info);
200 if (err != k_ra8_ok) {
201 return err;
202 }
203 if (buffer->capacity < info.frame_bytes) {
205 }
206 err = source->iface->capture(source->ctx, buffer, out_frame);
207 if (err != k_ra8_ok) {
208 *out_frame = (ra8_audio_frame_t){};
209 return err;
210 }
211 if (out_frame->data != buffer->data) {
212 *out_frame = (ra8_audio_frame_t){};
214 }
215 err = ra8_audio_frame_validate(out_frame);
216 if (err != k_ra8_ok) {
217 *out_frame = (ra8_audio_frame_t){};
218 return err;
219 }
220 err = internal_audio_frame_matches_info(out_frame, &info);
221 if (err != k_ra8_ok) {
222 *out_frame = (ra8_audio_frame_t){};
223 return err;
224 }
225 return k_ra8_ok;
226}
227
229 const ra8_audio_buffer_t* buffer,
231 void* ctx)
232{
233 if (source == nullptr) {
234 return k_ra8_err_null_ptr;
235 }
236 if (buffer == nullptr) {
237 return k_ra8_err_null_ptr;
238 }
239 if (callback == nullptr) {
240 return k_ra8_err_null_ptr;
241 }
242 if (buffer->data == nullptr) {
243 return k_ra8_err_null_ptr;
244 }
245 if (source->iface == nullptr) {
247 }
248 if (source->iface->get_info == nullptr) {
250 }
251 if (source->iface->stream_start == nullptr) {
253 }
254 ra8_audio_source_info_t info = {};
255 const ra8_err_t err = source->iface->get_info(source->ctx, &info);
256 if (err != k_ra8_ok) {
257 return err;
258 }
259 if (buffer->capacity < info.frame_bytes) {
261 }
262 return source->iface->stream_start(source->ctx, buffer, callback, ctx);
263}
264
266{
267 if (source == nullptr) {
268 return k_ra8_err_null_ptr;
269 }
270 if (source->iface == nullptr) {
272 }
273 if (source->iface->stop == nullptr) {
275 }
276 const ra8_err_t err = source->iface->stop(source->ctx);
277 if (err == k_ra8_ok) {
278 *source = (ra8_audio_source_t){};
279 }
280 return err;
281}
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
ra8_err_t ra8_audio_source_get_info(ra8_audio_source_t *source, ra8_audio_source_info_t *out_info)
Query a bound source's fixed output contract.
Definition ra8_audio.c:85
ra8_err_t ra8_audio_source_stop(ra8_audio_source_t *source)
Stop and release a bound source backend.
Definition ra8_audio.c:265
ra8_err_t ra8_audio_frame_validate(const ra8_audio_frame_t *frame)
Validate one PCM frame view.
Definition ra8_audio.c:47
static ra8_err_t internal_audio_frame_matches_info(const ra8_audio_frame_t *frame, const ra8_audio_source_info_t *info)
Verify a captured frame matches its source metadata.
Definition ra8_audio.c:119
static ra8_err_t internal_audio_capture_args_valid(const ra8_audio_source_t *source, const ra8_audio_buffer_t *buffer, ra8_audio_frame_t *out_frame)
Validate capture arguments before touching source geometry.
Definition ra8_audio.c:161
static uint32_t internal_audio_container_bytes(ra8_audio_format_t format)
Return the PCM container width in bytes.
Definition ra8_audio.c:35
ra8_err_t ra8_audio_source_capture(ra8_audio_source_t *source, const ra8_audio_buffer_t *buffer, ra8_audio_frame_t *out_frame)
Capture one fixed-size PCM frame into caller-owned storage.
Definition ra8_audio.c:190
ra8_err_t ra8_audio_source_stream_start(ra8_audio_source_t *source, const ra8_audio_buffer_t *buffer, ra8_audio_frame_callback_t callback, void *ctx)
Start asynchronous fixed-frame delivery into caller-owned scratch.
Definition ra8_audio.c:228
Transport-neutral, caller-owned audio capture facade.
void(* ra8_audio_frame_callback_t)(void *ctx, const ra8_audio_frame_t *frame)
Complete-frame callback for asynchronous audio sources.
Definition ra8_audio.h:93
ra8_audio_format_t
PCM container layouts supported by the facade.
Definition ra8_audio.h:38
@ k_ra8_audio_format_pcm_s32le
Signed 32-bit little-endian PCM.
Definition ra8_audio.h:40
@ k_ra8_audio_format_pcm_s16le
Signed 16-bit little-endian PCM.
Definition ra8_audio.h:39
Private audio-source vtable shared by concrete backends.
@ k_ra8_err_not_supported
Requested feature not compiled in, not wired, or not supported by this MCU variant.
Definition ra8_err.h:180
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
Definition ra8_err.h:161
@ k_ra8_err_not_initialized
Module not initialized – _init() not yet called successfully.
Definition ra8_err.h:235
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
Definition ra8_err.h:167
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Caller-owned writable byte buffer.
Definition ra8_audio.h:44
uint32_t capacity
Writable capacity in bytes.
Definition ra8_audio.h:46
void * data
First writable byte.
Definition ra8_audio.h:45
Immutable view of one interleaved PCM frame.
Definition ra8_audio.h:56
uint32_t bytes
Valid byte count.
Definition ra8_audio.h:58
ra8_audio_format_t format
PCM container layout.
Definition ra8_audio.h:64
uint32_t sample_count
Sample frames per channel.
Definition ra8_audio.h:59
uint8_t channels
Interleaved channel count.
Definition ra8_audio.h:62
uint32_t sample_rate_hz
Sample frames per second.
Definition ra8_audio.h:60
const void * data
Borrowed interleaved PCM bytes.
Definition ra8_audio.h:57
uint8_t valid_bits
Significant bits per sample.
Definition ra8_audio.h:63
ra8_err_t(* get_info)(void *ctx, ra8_audio_source_info_t *out_info)
Query output.
ra8_err_t(* capture)(void *ctx, const ra8_audio_buffer_t *buffer, ra8_audio_frame_t *out_frame)
Capture PCM.
ra8_err_t(* stream_start)(void *ctx, const ra8_audio_buffer_t *buffer, ra8_audio_frame_callback_t callback, void *callback_ctx)
Start streaming.
ra8_err_t(* stop)(void *ctx)
Stop backend.
Fixed output contract and storage requirement for one source.
Definition ra8_audio.h:68
uint8_t valid_bits
Significant bits per sample.
Definition ra8_audio.h:73
uint32_t samples_per_frame
Sample frames returned per call.
Definition ra8_audio.h:70
ra8_audio_format_t format
PCM container layout.
Definition ra8_audio.h:74
uint32_t frame_bytes
Required capture-buffer capacity.
Definition ra8_audio.h:69
uint32_t sample_rate_hz
Sample frames per second.
Definition ra8_audio.h:71
uint8_t channels
Interleaved channel count.
Definition ra8_audio.h:72
Caller-owned handle binding an audio source backend and its state.
Definition ra8_audio.h:78
const ra8_audio_source_iface_t * iface
Bound source vtable (private).
Definition ra8_audio.h:79
void * ctx
Caller-owned backend state.
Definition ra8_audio.h:80