Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1cc2a85
feat: Unified Ethernet interface with settings manager and web UI
craigmillard86 Feb 12, 2026
d736928
Merge branch 'develop' of https://github.com/CarlosDerSeher/snapclien…
craigmillard86 Feb 19, 2026
ac46f3f
Merge luar123/player_state + fix 4 critical issues
craigmillard86 Feb 20, 2026
25fc8c2
Fix: Restore required includes in snapcast_protocol_parser.c
craigmillard86 Feb 20, 2026
3706883
Revert README.md to match luar123/player_state version
craigmillard86 Feb 20, 2026
62842df
Remove local Claude Code config file from commits
craigmillard86 Feb 20, 2026
ebf7a14
Add .claude to .gitignore to exclude local IDE config
craigmillard86 Feb 20, 2026
bb97646
Revert .gitignore to match luar123/player_state
craigmillard86 Feb 20, 2026
6d01fd1
Merge luar123/player_state latest update - Fix deadlock in deinit_player
craigmillard86 Feb 21, 2026
5836146
Unified Ethernet/WiFi MAC, player state fixes, and boot-time improvem…
craigmillard86 Feb 24, 2026
3d5841f
Fix correctness bugs from code review and Copilot findings
craigmillard86 Feb 25, 2026
9805edd
Merge luar123/player_state (a274fa1) - command-based state machine
craigmillard86 Apr 3, 2026
5170a17
Fix build break and correctness issues from code review
craigmillard86 Apr 3, 2026
5c19771
Replace reconnect polling with sc_restart_snapcast() commands
craigmillard86 Apr 3, 2026
51815d4
Fix portTTICK_Period/portTICK_Rate, CONFIG_DAC_I2C_ADDR, tas5805m_fau…
Sturi2011 Apr 7, 2026
c4250e8
Resolve luar123 review comments on reconnect polling PR
craigmillard86 Apr 7, 2026
f840181
Fix audio not restarting after network reconnection
craigmillard86 Apr 8, 2026
f138c63
Fix Ethernet reconnection: restart DHCP and clean up IPv6 on disconnect
craigmillard86 Apr 8, 2026
3e3efe3
Reviewed and updated MA12070P driver. Added I2S 32-bit word mode (req…
anabolyc May 6, 2026
8276015
Add support for TAS5825M DAC (detection based on the I2C address) (#219)
anabolyc May 20, 2026
c69ecac
Add snapcast state and refactor inter task communication (#203)
luar123 May 21, 2026
86dad5d
Merge upstream/develop: PR #203 (snapcast state refactor), #218, #219…
craigmillard86 May 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
{
"label": "Start Docker Container for Build",
"type": "shell",
"command": "docker run --rm -it -v ${workspaceFolder}:${workspaceFolder} -w ${workspaceFolder} -v /dev:/dev --privileged espressif/idf:v5.1.1",
"command": "docker run --rm -it -v ${workspaceFolder}:${workspaceFolder} -w ${workspaceFolder} -v /dev:/dev --privileged espressif/idf:v5.5.1",
"problemMatcher": []
},
{
"label": "Build, Flash and Monitor (Docker)",
"type": "shell",
"command": "docker run --rm -it -v ${workspaceFolder}:${workspaceFolder} -w ${workspaceFolder} -v /dev:/dev --privileged espressif/idf:v5.1.1 /bin/bash -c '. $IDF_PATH/export.sh && idf.py build flash monitor'",
"command": "docker run --rm -it -v ${workspaceFolder}:${workspaceFolder} -w ${workspaceFolder} -v /dev:/dev --privileged espressif/idf:v5.5.1 /bin/bash -c '. $IDF_PATH/export.sh && idf.py build flash monitor'",
"group": {
"kind": "build",
"isDefault": true
Expand Down
36 changes: 16 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,23 +108,11 @@ Update third party code (opus, flac, esp-dsp, improv_wifi):
```
git submodule update --init
```
Copy one of the template sdkconfig files and rename it to sdkconfig...

...on Linux:
```
cp sdkconfig_lyrat_v4.3 sdkconfig
```

...on Windows:
```
copy sdkconfig_lyrat_v4.3 sdkconfig
```

### ESP-IDF environment setup (required for configuration, compiling and flashing)
### ESP-IDF environnement configuration
- <b>If you're on Windows :</b> Install [ESP-IDF v5.5.1](https://github.com/espressif/esp-idf/releases/tag/v5.5.1) locally ([More info](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup-update.html)).
- <b>If you're on Linux (docker) :</b> Use the image for ESP-IDF by following [docker build](doc/docker_build.md) doc (you won't need any of the remaining commands/steps below up until the <b>Test</b> section then)
- <b>If you're on Linux (docker) :</b> Use the image for ESP-IDF by following [docker build](doc/docker_build.md) doc
- <b>If you're on Linux :</b> follow [official Espressif](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/linux-macos-setup.html) instructions

For debian based systems you'll need to do the following:
```
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
Expand All @@ -136,16 +124,24 @@ copy sdkconfig_lyrat_v4.3 sdkconfig
. ./export.sh
```

### Snapcast ESP Configuration (Non-Docker-Linux and Windows)
<a name="config"></a>
### Snapcast ESP Configuration
Start with the default config (remove any existing sdkconfig file) or copy one of the template sdkconfig files and rename it to sdkconfig

Configure your platform:
```
rm sdkconfig
```
or
```
cp sdkconfig_lyrat_v4.3 sdkconfig
```

then configure your platform:

```
idf.py menuconfig
```

<a name="config"></a>
Choose configuration options to match your setup
Configure to match your setup
- <b>Audio HAL :</b> Choose your audio board
- Lyrat (4.3, 4.2)
- Lyrat TD (2.2, 2.1)
Expand Down Expand Up @@ -235,7 +231,7 @@ Replace `snapclient.local` with your clients IP address. If you have multiple cl

You are very welcome to help and provide [Pull
Requests](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests)
to the project. Use [develop](https://github.com/CarlosDerSeher/snapclient/tree/develop) branch for your PRs as this is the place where new features will go.
to the project. Use [develop](https://github.com/jorgenkraghjakobsen/snapclient/tree/develop) branch for your PRs as this is the place where new features will go.

We strongly suggest you activate [pre-commit](https://pre-commit.com) hooks in
this git repository before starting to hack and make commits.
Expand Down
38 changes: 36 additions & 2 deletions components/audio_board/Kconfig.projbuild
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ menu "Audio Board"
choice and is not exposed to menuconfig.
See https://github.com/schreibfaul1/ESP32-audioI2S/blob/1d9b299d0197f99fc70335295adcd226dc220f88/src/Audio.cpp#L4929

config I2S_SLOT_32BIT
bool
default n
help
Forces the I2S slot width to 32 bits regardless of sample depth. Required for DACs that only
support 32-bit or 24-bit frames (e.g. MA120X0P whose OTP default frame size is 32 bits).
The IDF zero-pads 16-bit samples to fill the 32-bit slot automatically.

choice AUDIO_BOARD
prompt "Audio board"
default ESP32_S2_KALUGA_1_V1_2_BOARD if IDF_TARGET_ESP32S2
Expand Down Expand Up @@ -94,6 +102,7 @@ menu "Audio Board"

config DAC_MA120X0
bool "Infineon MA120X0 ClassD AMP"
select I2S_SLOT_32BIT

config DAC_ADAU1961
bool "Analog Devices ADAU1961 DAC"
Expand Down Expand Up @@ -206,23 +215,48 @@ menu "Audio Board"
help
GPIO number to control enable/disable.

config MA120X0_NENABLE_INVERT
bool "Invert nEnable pin logic (active-low)"
default n
depends on MA120X0_NENABLE_PIN != -1
help
When enabled, the nEnable pin is driven LOW to enable the
amplifier and HIGH to disable it (active-low, as per the
MA120x0 datasheet). When disabled, HIGH = on, LOW = off.

config MA120X0_NMUTE_PIN
int "Master mute/unmute for ma120x0"
default 2
help
GPIO number to controm mute/unmute.

config MERUS_NERR_PIN
config MA120X0_NERR_PIN
int "NERR monitor pin"
default 21
help
GPIO number to monitor NERROR.

config MERUS_NCLIP_PIN
config MA120X0_NCLIP_PIN
int "Clip indication pin"
default 22
help
GPIO number low if clip observed

config MA120X0_VOL_MAX_DB
int "Maximum volume level (dB, ≤ 0)"
default 0
range -144 24
help
Register value at slider position 100. 0 dB is the
maximum undistorted output level of the MA120x0.

config MA120X0_VOL_MIN_DB
int "Minimum volume level (dB)"
default -60
range -144 24
help
Register value at slider position 0. Values below -60 dB
are practically inaudible on most systems.
endmenu

menu "Merus MA120 interface Configuration"
Expand Down
6 changes: 3 additions & 3 deletions components/audio_hal/driver/tas5805m/tas5805m.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ static esp_err_t tas5805m_transmit_registers(const tas5805m_cfg_reg_t *conf_buf,
// Used in legacy applications. Ignored here.
break;
case CFG_META_DELAY:
vTaskDelay(conf_buf[i].value / portTICK_PERIOD_MS);
vTaskDelay(pdMS_TO_TICKS(conf_buf[i].value));
break;
case CFG_META_BURST:
ret = i2c_bus_write_bytes(i2c_handler, TAS5805M_ADDR,
Expand Down Expand Up @@ -135,9 +135,9 @@ esp_err_t tas5805m_init(audio_hal_codec_config_t *codec_cfg) {
io_conf.intr_type = GPIO_INTR_DISABLE;
gpio_config(&io_conf);
gpio_set_level(TAS5805M_RST_GPIO, 0);
vTaskDelay(20 / portTICK_PERIOD_MS);
vTaskDelay(pdMS_TO_TICKS(20));
gpio_set_level(TAS5805M_RST_GPIO, 1);
vTaskDelay(200 / portTICK_PERIOD_MS);
vTaskDelay(pdMS_TO_TICKS(200));

ret = get_i2c_pins(I2C_NUM_0, &i2c_cfg);
i2c_handler = i2c_bus_create(I2C_NUM_0, &i2c_cfg);
Expand Down
Loading