Changelog

# Changelog

All notable changes to this project are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/).

## [0.1.1]

### Fixed
- All three example projects (`examples/usb-jtag`, `examples/uart-bridge`,
  `examples/loopback`) now request `I2S_SLOT_MODE_STEREO` from `i2s_spk`
  and duplicate each mono sample into both slots in application code,
  instead of requesting `I2S_SLOT_MODE_MONO` directly. This was changed
  after `examples/uart-bridge` was found, on classic ESP32 hardware, to
  play audio on only one physical DAC/amp output channel — a chip-family
  difference in how ESP32's I2S TX hardware handles a MONO slot request
  compared to ESP32-C3's, not a bug in the `i2s_spk` component itself
  (which passes `slot_mode` through unchanged). See the component
  README's "Notes" section for the full explanation. `examples/usb-jtag`
  was not actually broken (ESP32-C3 handles MONO correctly) but is
  updated too, to avoid depending on which chips currently happen to get
  this right.

## [0.1.0] - 2026-09-18

### Added
- Initial release of `i2s_spk`: a task-free I2S speaker (audio sink)
  component for ESP-IDF v6.0.x, built on the modern `i2s_std` driver.
- Blocking `i2s_spk_send_buffer()` API — wraps `i2s_channel_write()` in the
  caller's own task context. Its return is the sole completion signal;
  there is no internal FreeRTOS task and no TX-side application callback
  (see the design document's Section 5.2 for why the earlier
  `spk_buffer_consumed_cb_t` concept was removed).
- `auto_clear` enabled on the TX channel so ESP-IDF inserts silence rather
  than repeating stale data or stalling when the application falls behind
  (no software-level underrun detection in V1 — ESP-IDF provides no driver
  hook for it; see the design document's Open Question 2).
- Support for 16-bit and 32-bit sample widths, Philips I2S standard slot
  format, `I2S_ROLE_MASTER`.
- Full lifecycle API: `i2s_spk_init()`, `i2s_spk_start()`,
  `i2s_spk_stop()`, `i2s_spk_deinit()`.
- `examples/usb-jtag`: receives a WAV stream from a PC over native
  USB-Serial-JTAG and plays it through the speaker, for ESP32-C3/S3/C6
  (and similar) boards with no separate USB-to-UART bridge chip. Includes
  a companion PC-side Python script and an explicit chunk/ACK flow-control
  protocol (see its README for why this is needed on the playback side).
- `examples/uart-bridge`: the same, over UART0, for classic ESP32 (and
  similar) boards with a separate CP2102/CH340-style bridge chip.
- `examples/loopback`: a single example (one shared source, no per-target
  variants beyond `sdkconfig.defaults.esp32`/`.esp32c3`) that records with
  `i2s_mic` (pulled in from the ESP Component Registry) and plays the
  recording back through `i2s_spk` — no PC or transport involved. Uses a
  record-then-playback structure rather than live streaming so it works
  correctly on both dual-I2S-peripheral chips (ESP32, S3) and
  single-I2S-peripheral chips (ESP32-C3), where `i2s_mic` and `i2s_spk`
  cannot both be `INITIALIZED` at once — see the example's README.