mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-08-29 00:03:33 +02:00
fix(birdnet-pi): make ALSA_CARD actually select the microphone (#2972)
* fix(birdnet-pi): turn ALSA_CARD into a valid ALSA PCM name for REC_CARD 99-run.sh copied ALSA_CARD verbatim into REC_CARD, but BirdNET-Pi passes REC_CARD to "arecord -D" (scripts/birdnet_recording.sh) and "ffmpeg -f alsa -i" (scripts/livestream.sh), which expect an ALSA PCM name. A card index such as ALSA_CARD=1 therefore produced "Unknown PCM 1" and no recording at all. Build "plughw:CARD=<value>,DEV=0" from a card index or card id, and pass through a value that already is a PCM name. Also use sed --follow-symlinks so the rewrite no longer replaces the ~/BirdNET-Pi/birdnet.conf symlink with a detached copy of /config/birdnet.conf. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix: address CodeRabbit review * fix(birdnet-pi): bump version so the ALSA_CARD fix actually ships The PR changed 99-run.sh and added a CHANGELOG entry but left config.yaml untouched, so `version` still read 2026.08.02. Supervisor only offers a rebuild when `version` changes: without this the fix would have merged, the add-on would have kept running the old image, and the issue would have looked closed while ALSA_CARD stayed broken. 2026.08.15 matches the CHANGELOG heading this PR already adds, which is this add-on's convention — every past version lines up with a dated heading (2026.08.02, 2026.07.22, ...). Not a `.N` counter bump: birdnet-pi's `version` has drifted from updater.json's `upstream_version` (0.11), so the counter rule does not apply and the add-on's own date scheme governs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(birdnet-pi-zach): turn ALSA_CARD into a valid ALSA PCM name for REC_CARD birdnet-pi-zach/rootfs/etc/cont-init.d/99-run.sh carried a byte-identical copy of the same bug fixed in birdnet-pi by this PR: REC_CARD was copied verbatim from ALSA_CARD, but BirdNET-Pi passes REC_CARD to "arecord -D" and "ffmpeg -f alsa -i", which expect an ALSA PCM name, not a card index. sed -i also replaced the $HOME/BirdNET-Pi/birdnet.conf symlink with a detached copy on first use. Apply the same fix: build "plughw:CARD=<value>,DEV=0" from a card index or card id, pass through a value that already is a PCM name, and use sed --follow-symlinks against /config/birdnet.conf only. Documented in README_standalone.md, same as birdnet-pi. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix: resolve ALSA_CARD against real PCM names, not a fixed allowlist CodeRabbit and Codex both flagged that the passthrough check only recognized default/null/pulse/pipewire: any other colon-free ALSA PCM name (sysdefault, front, surround51, a custom .asoundrc alias, ...) was still misread as a card index/id and rewritten as plughw:CARD=<name>,DEV=0, which then fails to open. alsa-utils is already installed in both images, so check the value against "arecord -L" (an exact, whole-line match against its unindented PCM-name lines) instead of hardcoding the set of names ALSA ships with. Anything that isn't a real PCM name still falls through to the plughw:CARD= build, so a numeric index or a card id is handled exactly as before. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
## 2026.08.15 (15-08-2026)
|
||||
|
||||
- Fix: `ALSA_CARD` now really selects the microphone. Its value was copied as-is into `REC_CARD`, but BirdNET-Pi hands `REC_CARD` to `arecord -D` / `ffmpeg -f alsa -i`, which expect an ALSA PCM name: a card index such as `1` gave `Unknown PCM 1` and no recording at all. It is now converted to `plughw:CARD=<value>,DEV=0`, while a value that already is a PCM name (`dsnoop:CARD=Audio,DEV=0`, `default`, `null`, `pulse`, `pipewire`, ...) is used as provided
|
||||
- Fix: setting `ALSA_CARD` no longer replaces the `~/BirdNET-Pi/birdnet.conf` symlink with a detached copy of `/config/birdnet.conf` (now only `/config/birdnet.conf`, which the symlink points to, is updated)
|
||||
|
||||
## 2026.07.10-2 (10-07-2026)
|
||||
- Minor bugs fixed
|
||||
## 2026.07.10 (10-07-2026)
|
||||
|
||||
@@ -101,6 +101,17 @@ Ensure you have the following installed on your system:
|
||||
|
||||
If rtsp feed doesn't work, perhaps you need to add "-rtsp-transport tcp" to your ffmpeg instruction, or allow udp on your network
|
||||
|
||||
### Selecting the microphone
|
||||
|
||||
By default the container records through PulseAudio (`REC_CARD=default` in `birdnet.conf`). To record directly from a USB microphone instead, find it on the host with `arecord -l`, then pass its card number (or its card id) as `ALSA_CARD`:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- ALSA_CARD=1 # "card 1: Audio [KT USB Audio]" in the output of "arecord -l"
|
||||
```
|
||||
|
||||
At startup this writes `REC_CARD=plughw:CARD=1,DEV=0` into your `birdnet.conf`. A value that already is a full ALSA PCM name, as listed by `arecord -L`, is used as provided - for example `ALSA_CARD=dsnoop:CARD=Audio,DEV=0`, which allows the recording and the livestream services to read the same microphone at the same time.
|
||||
|
||||
## Updating to the Latest Version
|
||||
|
||||
To check for new versions of the container and update:
|
||||
|
||||
@@ -116,5 +116,5 @@ tmpfs: true
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-pi-zach
|
||||
usb: true
|
||||
version: 2026.07.10.2
|
||||
version: 2026.08.15
|
||||
video: true
|
||||
|
||||
@@ -66,12 +66,26 @@ fi || true
|
||||
|
||||
# Use ALSA CARD defined in add-on options if available
|
||||
if [ -n "${ALSA_CARD:-}" ]; then
|
||||
bashio::log.warning "ALSA_CARD is defined, the birdnet.conf is adapt to use device $ALSA_CARD"
|
||||
for file in "$HOME"/BirdNET-Pi/birdnet.conf /config/birdnet.conf; do
|
||||
if [ -f "$file" ]; then
|
||||
sed -i "/^REC_CARD/c\REC_CARD=$ALSA_CARD" "$file"
|
||||
fi
|
||||
done
|
||||
# REC_CARD is passed as-is to "arecord -D" (scripts/birdnet_recording.sh) and to
|
||||
# "ffmpeg -f alsa -i" (scripts/livestream.sh), so it must be an ALSA PCM name.
|
||||
# ALSA_CARD holds a card index (1) or a card id (Audio), which are not PCM names:
|
||||
# writing them as-is gives "Unknown PCM 1" and no recording at all. Build a PCM
|
||||
# name from them, unless the value already is one of ALSA's own PCM names
|
||||
# (checked against "arecord -L", e.g. default, null, pulse, sysdefault, front...).
|
||||
if [[ "$ALSA_CARD" == *:* ]] || arecord -L 2> /dev/null | grep -qx "$ALSA_CARD"; then
|
||||
REC_CARD="$ALSA_CARD"
|
||||
else
|
||||
REC_CARD="plughw:CARD=${ALSA_CARD},DEV=0"
|
||||
fi
|
||||
bashio::log.warning "ALSA_CARD is defined, the birdnet.conf is adapted to use device $REC_CARD"
|
||||
# --follow-symlinks : $HOME/BirdNET-Pi/birdnet.conf is a symlink to /config/birdnet.conf
|
||||
# (01-structure.sh), and sed -i would replace it with a regular file, detaching it from
|
||||
# the file the WebUI writes to. Only /config/birdnet.conf is updated directly, since the
|
||||
# home-path symlink is writable by the pi/caddy user and could be repointed before this
|
||||
# root-run script gets to it.
|
||||
if [ -f /config/birdnet.conf ]; then
|
||||
sed -i --follow-symlinks "/^REC_CARD/c\REC_CARD=$REC_CARD" /config/birdnet.conf
|
||||
fi
|
||||
fi
|
||||
|
||||
# Define permissions for audio
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 2026.08.15 (15-08-2026)
|
||||
|
||||
- Fix: `ALSA_CARD` now really selects the microphone. Its value was copied as-is into `REC_CARD`, but BirdNET-Pi hands `REC_CARD` to `arecord -D` / `ffmpeg -f alsa -i`, which expect an ALSA PCM name: a card index such as `1` gave `Unknown PCM 1` and no recording at all. It is now converted to `plughw:CARD=<value>,DEV=0`, while a value that already is a PCM name (`dsnoop:CARD=Audio,DEV=0`, `default`, `null`, `pulse`, `pipewire`, ...) is used as provided
|
||||
- Fix: setting `ALSA_CARD` no longer replaces the `~/BirdNET-Pi/birdnet.conf` symlink with a detached copy of `/config/birdnet.conf` (now only `/config/birdnet.conf`, which the symlink points to, is updated)
|
||||
## 2026.08.02 (02-08-2026)
|
||||
- Fix: ingress returned "502 Bad Gateway" because Caddy never listened on :8082. `91-nginx_ingress.sh` hooked the ingress site into `update_caddyfile.sh` with a sed anchored on `sudo caddy fmt --overwrite`, but 2026.07.10-1 strips `sudo` from every BirdNET-Pi script at build time, so the anchor stopped matching. `update_caddyfile.sh` then rewrote the Caddyfile from scratch just before Caddy started, dropping the ingress site
|
||||
- Fix: `caddy_ingress.sh` no longer appends a second `:8082` block when it runs twice (a duplicate site address makes Caddy refuse to start)
|
||||
|
||||
@@ -101,6 +101,17 @@ Ensure you have the following installed on your system:
|
||||
|
||||
If rtsp feed doesn't work, perhaps you need to add "-rtsp-transport tcp" to your ffmpeg instruction, or allow udp on your network
|
||||
|
||||
### Selecting the microphone
|
||||
|
||||
By default the container records through PulseAudio (`REC_CARD=default` in `birdnet.conf`). To record directly from a USB microphone instead, find it on the host with `arecord -l`, then pass its card number (or its card id) as `ALSA_CARD`:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- ALSA_CARD=1 # "card 1: Audio [KT USB Audio]" in the output of "arecord -l"
|
||||
```
|
||||
|
||||
At startup this writes `REC_CARD=plughw:CARD=1,DEV=0` into your `birdnet.conf`. A value that already is a full ALSA PCM name, as listed by `arecord -L`, is used as provided - for example `ALSA_CARD=dsnoop:CARD=Audio,DEV=0`, which allows the recording and the livestream services to read the same microphone at the same time.
|
||||
|
||||
## Updating to the Latest Version
|
||||
|
||||
To check for new versions of the container and update:
|
||||
|
||||
@@ -116,5 +116,5 @@ tmpfs: true
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-pi
|
||||
usb: true
|
||||
version: 2026.08.02
|
||||
version: 2026.08.15
|
||||
video: true
|
||||
|
||||
@@ -66,12 +66,26 @@ fi || true
|
||||
|
||||
# Use ALSA CARD defined in add-on options if available
|
||||
if [ -n "${ALSA_CARD:-}" ]; then
|
||||
bashio::log.warning "ALSA_CARD is defined, the birdnet.conf is adapt to use device $ALSA_CARD"
|
||||
for file in "$HOME"/BirdNET-Pi/birdnet.conf /config/birdnet.conf; do
|
||||
if [ -f "$file" ]; then
|
||||
sed -i "/^REC_CARD/c\REC_CARD=$ALSA_CARD" "$file"
|
||||
fi
|
||||
done
|
||||
# REC_CARD is passed as-is to "arecord -D" (scripts/birdnet_recording.sh) and to
|
||||
# "ffmpeg -f alsa -i" (scripts/livestream.sh), so it must be an ALSA PCM name.
|
||||
# ALSA_CARD holds a card index (1) or a card id (Audio), which are not PCM names:
|
||||
# writing them as-is gives "Unknown PCM 1" and no recording at all. Build a PCM
|
||||
# name from them, unless the value already is one of ALSA's own PCM names
|
||||
# (checked against "arecord -L", e.g. default, null, pulse, sysdefault, front...).
|
||||
if [[ "$ALSA_CARD" == *:* ]] || arecord -L 2> /dev/null | grep -qx "$ALSA_CARD"; then
|
||||
REC_CARD="$ALSA_CARD"
|
||||
else
|
||||
REC_CARD="plughw:CARD=${ALSA_CARD},DEV=0"
|
||||
fi
|
||||
bashio::log.warning "ALSA_CARD is defined, the birdnet.conf is adapted to use device $REC_CARD"
|
||||
# --follow-symlinks : $HOME/BirdNET-Pi/birdnet.conf is a symlink to /config/birdnet.conf
|
||||
# (01-structure.sh), and sed -i would replace it with a regular file, detaching it from
|
||||
# the file the WebUI writes to. Only /config/birdnet.conf is updated directly, since the
|
||||
# home-path symlink is writable by the pi/caddy user and could be repointed before this
|
||||
# root-run script gets to it.
|
||||
if [ -f /config/birdnet.conf ]; then
|
||||
sed -i --follow-symlinks "/^REC_CARD/c\REC_CARD=$REC_CARD" /config/birdnet.conf
|
||||
fi
|
||||
fi
|
||||
|
||||
# Define permissions for audio
|
||||
|
||||
Reference in New Issue
Block a user