Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
de94bae
chore(transcode): vendor the OxideAV AC-3, DTS and AAC codecs
vyrti Aug 24, 2026
b5bde6a
feat(transcode): decode AC-3, E-AC-3 and DTS to linear PCM
vyrti Aug 24, 2026
a8a30ea
feat(streaming): serve AC-3, E-AC-3 and DTS as playable LPCM
vyrti Aug 24, 2026
2980382
feat(discovery): advertise a decoded <res> beside the original
vyrti Aug 24, 2026
b6042aa
feat(transcode): add AAC-LC as the compressed output format
vyrti Aug 24, 2026
11768f0
docs(transcode): document the feature and re-measure the crate counts
vyrti Aug 24, 2026
cf4c955
fix(transcode): index .ac3/.dts files and decode seeks from clean state
vyrti Aug 24, 2026
e9b7392
u
vyrti Aug 24, 2026
b34ebfb
u
vyrti Aug 24, 2026
1b4d980
u
vyrti Aug 24, 2026
243de7d
u
vyrti Aug 24, 2026
87ce1d3
u
vyrti Aug 24, 2026
9a771d4
audio decoder works
vyrti Aug 24, 2026
d037259
audio fix
vyrti Aug 24, 2026
f2c16bd
audio fix
vyrti Aug 24, 2026
59366ac
audio fix 2
vyrti Aug 24, 2026
b210485
fmt
vyrti Aug 24, 2026
509eac5
u
vyrti Aug 25, 2026
eb6d94c
bugs
vyrti Aug 25, 2026
937aac5
transcoding works
vyrti Aug 25, 2026
cdef2d8
transcoding fix
vyrti Aug 25, 2026
15d0050
clippy
vyrti Aug 25, 2026
72da244
u
vyrti Aug 25, 2026
5c75a5a
test
vyrti Aug 25, 2026
d32db6f
u
vyrti Aug 25, 2026
07ae390
perf(streaming): fork oxideav-ac3 and make the AC-3 encoder 3x faster
vyrti Aug 25, 2026
753649b
perf(streaming): tally AC-3 mantissa bits inline and hoist the debug …
vyrti Aug 25, 2026
381dbe2
perf(streaming): encode AC-3 syncframes in parallel with rayon
vyrti Aug 25, 2026
d3fe79f
perf(streaming): keep the AC-3 transient filter in registers
vyrti Aug 25, 2026
58cf368
u
vyrti Aug 25, 2026
f8b616c
u
vyrti Aug 25, 2026
f064aff
feat(streaming): finish the AC-3 default across config, DIDL and docs
vyrti Aug 25, 2026
a4fc7ac
fix(build): restore the AC-3 codec's lint exemption and its 1.95 MSRV
vyrti Aug 25, 2026
558a9f9
fix(build): build libxaac for Windows and hard-float arm
vyrti Aug 25, 2026
8105c89
fix(build): assemble libxaac's armv7 kernels with GNU as
vyrti Aug 25, 2026
bfd9674
fix(build): let libxaac's bindings compile on a 32-bit target
vyrti Aug 25, 2026
c294fc2
u
vyrti Aug 26, 2026
0176d66
u
vyrti Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"name": "vuio",
"displayName": "VuIO Media Server",
"description": "Browse, search and cast your VuIO media library — and control the TVs and speakers on your network — from Claude.",
"version": "0.0.44",
"version": "0.0.45",
"author": {
"name": "vyrti",
"url": "https://github.com/vuiodev"
Expand Down
32 changes: 21 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
with:
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
run: cargo fmt -p vuio-core -p vuio-cli -p vuio-cast -p vuio-web -- --check

# ===================================================================
# The web interface ships compiled into the binary.
Expand Down Expand Up @@ -130,7 +130,7 @@ jobs:
target/
key: clippy-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }}
- name: Run Clippy
run: cargo clippy --all-targets --all-features -- -D clippy::all -D warnings
run: cargo clippy -p vuio-core -p vuio-cli -p vuio-cast -p vuio-web --all-targets --all-features -- -D clippy::all -D warnings

# ===================================================================
# Guard the published API of vuio-core.
Expand Down Expand Up @@ -233,11 +233,21 @@ jobs:
run: cargo check -p vuio-core --no-default-features
- name: Build each feature alone
run: |
for feature in casting dashboard diagnostics mcp metadata web-ui; do
for feature in casting dashboard diagnostics mcp mediainfo metadata web-ui \
demux transcode transcode-ac3 transcode-dts transcode-aac; do
echo "::group::$feature"
cargo check -p vuio-core --no-default-features --features "$feature"
echo "::endgroup::"
done
# The transcode features are on by default, which makes their *absence*
# the path that rots unnoticed. Everything else here proves a feature
# builds; this proves the server still builds and behaves without one.
- name: Build with the decoders dropped
run: |
cargo check -p vuio-core --no-default-features \
--features casting,dashboard,diagnostics,mcp,mediainfo,metadata,web-ui
cargo test -p vuio-core --lib --no-default-features \
--features casting,dashboard,diagnostics,mcp,mediainfo,metadata,web-ui,unstable-internals
- name: Build with everything
run: cargo check -p vuio-core --all-features

Expand Down Expand Up @@ -338,9 +348,9 @@ jobs:
run: |
sudo apt-get update
if [ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]; then
sudo apt-get install -y gcc-aarch64-linux-gnu libc6-dev-arm64-cross
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-dev-arm64-cross
elif [ "${{ matrix.target }}" == "armv7-unknown-linux-gnueabihf" ]; then
sudo apt-get install -y gcc-arm-linux-gnueabihf libc6-dev-armhf-cross
sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-dev-armhf-cross
fi
- name: Configure cross-linker (Linux ARM)
if: runner.os == 'Linux' && (matrix.target == 'aarch64-unknown-linux-gnu' || matrix.target == 'armv7-unknown-linux-gnueabihf')
Expand Down Expand Up @@ -383,7 +393,7 @@ jobs:
mem: "6144"
cache-after-prepare: true
prepare: |
pkg install -y curl bash git
pkg install -y curl bash git cmake
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --profile minimal
run: |
set -e
Expand Down Expand Up @@ -421,7 +431,7 @@ jobs:
mem: "6144"
cache-after-prepare: true
prepare: |
pkg install -y curl bash git rust
pkg install -y curl bash git rust cmake
run: |
set -e
rustc -vV
Expand Down Expand Up @@ -500,9 +510,9 @@ jobs:
run: |
sudo apt-get update
if [ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]; then
sudo apt-get install -y gcc-aarch64-linux-gnu libc6-dev-arm64-cross
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-dev-arm64-cross
elif [ "${{ matrix.target }}" == "armv7-unknown-linux-gnueabihf" ]; then
sudo apt-get install -y gcc-arm-linux-gnueabihf libc6-dev-armhf-cross
sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-dev-armhf-cross
fi
- name: Configure cross-linker (Linux ARM)
if: runner.os == 'Linux' && (matrix.target == 'aarch64-unknown-linux-gnu' || matrix.target == 'armv7-unknown-linux-gnueabihf')
Expand Down Expand Up @@ -542,7 +552,7 @@ jobs:
mem: "6144"
cache-after-prepare: true
prepare: |
pkg install -y curl bash git
pkg install -y curl bash git cmake
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --profile minimal
run: |
set -e
Expand Down Expand Up @@ -613,7 +623,7 @@ jobs:
mem: "6144"
cache-after-prepare: true
prepare: |
pkg install -y curl bash git rust
pkg install -y curl bash git rust cmake
run: |
set -e
rustc -vV
Expand Down
53 changes: 53 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,24 @@ members = [
# Development tool, `publish = false`. Kept out of `vuio-cli` so the crate that
# ships the binary does not carry its dependencies.
"crates/vuio-bench",

# Our AC-3 / E-AC-3 codec — forked from oxideav-ac3, now maintained here.
# Not a default member for the same reason the vendored crates are not: its
# 100-plus tests (several of which shell out to ffmpeg) stay off the release
# path, while `cargo build` still compiles the library via vuio-core.
"crates/vuio-codec-ac3",

# The DTS decoder and the shared codec runtime, vendored verbatim from
# github.com/OxideAV by `scripts/vendor-oxideav.sh`. Members so cargo
# resolves the path deps and `cargo test -p oxideav-dts` works; deliberately
# not default members, so their own test and bench targets stay off the
# release path — the same reasoning that keeps `vuio-bench` out, and the
# reason a plain `cargo build` still compiles them (vuio-core depends on
# them) without building their tests.
"crates/vendor/oxideav-core",
"crates/vendor/oxideav-dts",
"crates/vendor/libxaac-sys",
"crates/vendor/xaac-rs",
]

# `vuio-bench` is deliberately not a default member. Cargo unifies features across
Expand All @@ -22,6 +40,41 @@ default-members = [
]
resolver = "2"

[patch.crates-io]
libxaac-sys = { path = "crates/vendor/libxaac-sys" }
xaac-rs = { path = "crates/vendor/xaac-rs" }

# Optimizing codecs, encoders, and demuxers in dev profile gives fast real-time
# audio decoding and encoding without requiring release rebuilds.
[profile.dev.package.oxideav-core]
opt-level = 3
[profile.dev.package.vuio-codec-ac3]
opt-level = 3
[profile.dev.package.oxideav-dts]
opt-level = 3
[profile.dev.package.xaac-rs]
opt-level = 3
[profile.dev.package.libxaac-sys]
opt-level = 3
[profile.dev.package.symphonia]
opt-level = 3
[profile.dev.package.symphonia-core]
opt-level = 3
[profile.dev.package.symphonia-format-mkv]
opt-level = 3
[profile.dev.package.symphonia-format-riff]
opt-level = 3
[profile.dev.package.symphonia-format-isomp4]
opt-level = 3
[profile.dev.package.symphonia-bundle-flac]
opt-level = 3
[profile.dev.package.symphonia-bundle-mp3]
opt-level = 3
[profile.dev.package.symphonia-codec-aac]
opt-level = 3
[profile.dev.package.symphonia-codec-pcm]
opt-level = 3

[profile.release]
opt-level = 3
lto = "fat"
Expand Down
11 changes: 10 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,19 @@ RUN RUST_TARGET=$(cat /tmp/rust_target) && \

# Copy the workspace and build the server. Only this layer rebuilds when source
# changes. `--bin vuio` skips the generate_test_media helper binary.
#
# VUIO_CARGO_FLAGS is for trimming the image. The default build is the whole
# server, including the AC-3/E-AC-3/DTS decoders — the person whose television
# plays a film silently is not going to rebuild an image to fix it. An operator
# who knows their renderers and wants the ~6 MB of decoder out can pass, e.g.:
#
# --build-arg VUIO_CARGO_FLAGS="--no-default-features \
# --features casting,dashboard,diagnostics,mcp,mediainfo,metadata,web-ui"
ARG VUIO_CARGO_FLAGS=""
COPY Cargo.toml Cargo.lock ./
COPY crates ./crates
RUN RUST_TARGET=$(cat /tmp/rust_target) && \
cargo build --release --locked --target $RUST_TARGET --package vuio-cli --bin vuio && \
cargo build --release --locked --target $RUST_TARGET --package vuio-cli --bin vuio $VUIO_CARGO_FLAGS && \
cp target/$RUST_TARGET/release/vuio /tmp/vuio

# ---- Final Stage ----
Expand Down
2 changes: 1 addition & 1 deletion claude/mcpb/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"manifest_version": "0.3",
"name": "vuio",
"display_name": "VuIO Media Server",
"version": "0.0.44",
"version": "0.0.45",
"description": "Browse, search and cast your VuIO media library from Claude.",
"long_description": "Connects Claude to a VuIO media server on your network. Search the library, browse folders, build playlists, and cast to DLNA, Chromecast and AirPlay devices.\n\nThis bundle runs `vuio mcp`, which bridges Claude's stdio connection to a VuIO server that is already running. It does not start a server or open the library database itself — point it at the machine that does.",
"author": {
Expand Down
2 changes: 1 addition & 1 deletion claude/plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "vuio",
"displayName": "VuIO Media Server",
"version": "0.0.44",
"version": "0.0.45",
"description": "Browse, search and cast your VuIO media library — and control the TVs and speakers on your network — from Claude.",
"author": {
"name": "vyrti",
Expand Down
Loading