32typedef enum : uint32_t {
71[[gnu::section(
".sdram_data"),
108 out[1] = (uint8_t)(value >> 8U);
149 int32_t scaled = (int32_t)(amplified / 16);
150 if (scaled > INT16_MAX) {
152 }
else if (scaled < INT16_MIN) {
155 return (int16_t)scaled;
173 if ((frame ==
nullptr) || (frame->
data ==
nullptr) ||
179 const int32_t* samples = (
const int32_t*)frame->
data;
191 const uint32_t retained_ms =
193 const uint32_t frame_end_ms =
275 if ((out_wav ==
nullptr) || (out_bytes ==
nullptr) || (out_timestamp_ms ==
nullptr)) {
280 *out_timestamp_ms = 0U;
284 const uint32_t samples =
s_audio_banks[snapshot_bank].sample_count;
290 const uint32_t timestamp_ms =
s_audio_banks[snapshot_bank].oldest_timestamp_ms;
291 const uint8_t capture_bank = snapshot_bank ^ 1U;
298 for (uint32_t i = 0U; i < samples; ++i) {
299 uint32_t ring_index = oldest + i;
312 *out_timestamp_ms = timestamp_ms;
static const uint8_t s_wav_tag_riff[]
The three fixed-width chunk tags of a canonical PCM WAV header.
static void internal_c6_cam_audio_put_u32(uint8_t *out, uint32_t value)
Write one little-endian 32-bit scalar.
static void internal_c6_cam_audio_write_header(uint32_t samples)
Serialize the canonical mono PCM-S16LE WAV header.
static c6_cam_audio_bank_t s_audio_banks[k_c6_cam_audio_bank_count]
ra8_err_t c6_cam_audio_snapshot_wav(const uint8_t **out_wav, uint32_t *out_bytes, uint32_t *out_timestamp_ms)
Snapshot the rolling microphone ring as mono PCM-S16LE WAV.
static ra8_audio_source_t s_audio_source
Fixed audio source objects and interrupt assembly scratch.
static volatile uint8_t s_audio_active_bank
Active ISR bank and per-bank metadata guarded during handoff.
static ra8_audio_source_pdm_state_t s_audio_state
ra8_err_t c6_cam_audio_start(void)
Start continuous MIC1 capture into the SDRAM audio ring.
static int32_t s_audio_ring[k_c6_cam_audio_bank_count][k_c6_cam_audio_ring_samples]
Ping-pong PCM rings and generated WAV live in external SDRAM.
static uint8_t s_audio_wav[k_c6_cam_wav_capacity]
static const uint8_t s_wav_tag_data[]
static const uint8_t s_wav_tag_wavefmt[]
static void internal_c6_cam_audio_put_u16(uint8_t *out, uint16_t value)
Write one little-endian 16-bit scalar.
static void internal_c6_cam_audio_on_frame(void *ctx, const ra8_audio_frame_t *frame)
Append one complete audio frame to the active SDRAM ring.
c6_cam_audio_cfg_t
Audio capture, storage, and WAV constants.
@ k_c6_cam_shift_24
Most-significant byte shift.
@ k_c6_cam_wav_bits_off
WAV bits-per-sample field offset.
@ k_c6_cam_audio_rate_hz
Mono PCM sample rate.
@ k_c6_cam_audio_frame_samples
Samples assembled per IRQ frame.
@ k_c6_cam_ms_per_second
Milliseconds per second.
@ k_c6_cam_audio_bank_count
Ping-pong SDRAM capture banks.
@ k_c6_cam_wav_riff_overhead
RIFF size excluding 8-byte lead.
@ k_c6_cam_wav_sample_bytes
PCM-S16LE bytes per mono sample.
@ k_c6_cam_audio_discard
Startup transient samples.
@ k_c6_cam_audio_gain
WAV digital gain before scaling.
@ k_c6_cam_audio_ring_samples
One-second rolling sample window.
@ k_c6_cam_audio_irq_priority
PDM FIFO NVIC priority.
@ k_c6_cam_wav_audio_format_off
WAV audio-format field offset.
@ k_c6_cam_wav_capacity
Complete WAV capacity.
@ k_c6_cam_wav_data_size_off
WAV data-size field offset.
@ k_c6_cam_wav_channels_off
WAV channel-count field offset.
@ k_c6_cam_byte_mask
One serialized byte mask.
@ k_c6_cam_audio_poll_attempts
Initialization polling bound.
@ k_c6_cam_audio_settle_ms
Microphone/filter settling delay.
@ k_c6_cam_wav_header_bytes
Canonical PCM WAV header size.
@ k_c6_cam_wav_byte_rate_off
WAV byte-rate field offset.
static int16_t internal_c6_cam_audio_s16(int32_t sample)
Convert signed 20-bit PDM PCM to saturated signed 16-bit PCM.
static int32_t s_audio_frame[k_c6_cam_audio_frame_samples]
Shared contracts for ESP32-C6 browser camera servers.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Transport-neutral, caller-owned audio capture facade.
ra8_err_t ra8_audio_source_stop(ra8_audio_source_t *source)
Stop and release a bound source backend.
@ k_ra8_audio_format_pcm_s32le
Signed 32-bit little-endian PCM.
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.
RA8 PDM-IF backend for the transport-neutral audio facade.
ra8_err_t ra8_audio_source_pdm_init(ra8_audio_source_t *source, ra8_audio_source_pdm_state_t *state, const ra8_audio_source_pdm_cfg_t *cfg)
Configure, start, settle, and bind one PDM audio source.
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_pdm_mic_get_config(ra8_board_pdm_mic_t microphone, ra8_board_pdm_mic_config_t *out_config)
Return the validated SPH0690 filter policy for one board microphone.
@ k_ra8_board_pdm_mic1
Rising-edge MIC1 (SELECT tied low).
ra8_err_t ra8_board_pdm_mic_route(void)
Route P812/P502 to PDMCLK2/PDMDAT2.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_no_data
No application data available (e.g.
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
void * memcpy(void *dst, const void *src, size_t n)
Copy memory area between non-overlapping regions.
IRQ-masked read-modify-write helper for shared registers.
static void ra8_register_guard_exit(const ra8_register_guard_t *guard)
Exit a critical section: restore PRIMASK.
static void ra8_register_guard_enter(ra8_register_guard_t *guard)
Enter a critical section: save PRIMASK, mask interrupts.
Writer position and timing metadata for one SDRAM audio bank.
uint32_t write_index
Next sample index written by the ISR.
uint32_t oldest_timestamp_ms
Monotonic timestamp of the oldest sample.
uint32_t sample_count
Valid samples currently retained.
Caller-owned writable byte buffer.
Immutable view of one interleaved PCM frame.
ra8_audio_format_t format
PCM container layout.
uint32_t sample_count
Sample frames per channel.
const void * data
Borrowed interleaved PCM bytes.
uint32_t timestamp_ms
Capture-start monotonic milliseconds.
Complete PDM source initialization and capture policy.
Caller-owned mutable state for one PDM source backend.
Caller-owned handle binding an audio source backend and its state.
Board-owned PDM mechanism configuration for one microphone.
uint8_t channel
PDM-IF channel selector.
uint32_t sample_rate_hz
Decimated PCM sample rate.
ra8_pdm_channel_cfg_t pdm
SPH0690 filter coefficients.
uint8_t valid_bits
Significant PCM bits.
Opaque save-restore handle for IRQ masking.