Skip to content

Feat/audio support#1205

Open
pennycoders wants to merge 452 commits intojetkvm:devfrom
pennycoders:feat/audio-support
Open

Feat/audio support#1205
pennycoders wants to merge 452 commits intojetkvm:devfrom
pennycoders:feat/audio-support

Conversation

@pennycoders
Copy link
Copy Markdown
Contributor

@pennycoders pennycoders commented Feb 16, 2026

Please go to the Preview tab ☝️ and select the appropriate sub-template:

See #718 for more details

…udio system for easy debugging and troubleshooting
…udio system for easy debugging and troubleshooting
Implement SIMD-optimized audio operations using ARM NEON for Cortex-A7 targets
Update Makefile and CI configuration to support NEON compilation flags
Add SIMD implementations for common audio operations including:
- Sample clearing and interleaving
- Volume scaling and format conversion
- Channel manipulation and balance adjustment
- Endianness swapping and prefetching
pennycoders and others added 20 commits November 28, 2025 14:41
- Add CTA-861 extension block with HDMI Vendor-Specific Data Block
- Include Audio Data Block (2ch LPCM, 32/44.1/48kHz, 16/20/24-bit)
- Add Speaker Allocation and Video Capability data blocks
- Set display name to JetKVM with proper display size (71x40cm)
- EDID now passes edid-decode validation
- Use EDID 1.3 for HDMI specification compliance
- Add HDMI VSDB (OUI 00-0C-03) to enable audio on Linux/Ubuntu
- Add Display Range Limits descriptor for validation compliance
- Include standard resolutions: 1080p, 720p, 480p
- Set display name to "JetKVM v1"
- Passes edid-decode validation
Change UAC1 gadget p_chmask from 0x01 (Left Front) to 0x04 (Center Front)
for the mono microphone endpoint.

This addresses an issue where Windows defaults to "2 channels @ 48kHz"
for the USB audio input device, even though the device advertises mono.
Users had to manually change Windows audio settings to "1 channel @ 48kHz"
for the microphone to work.

Per USB Audio Class 1.0 specification, mono streams should use the
Center Front (D2) channel position rather than Left Front (D0), as
Left Front may be interpreted as one half of a stereo pair.

The channel count remains 1 (num_channels(0x04) = 1 bit set = 1 channel),
only the spatial position metadata changes in the USB descriptor.

References:
- USB Device Class Definition for Audio Devices 1.0, Section 3.7.2.3
- Silicon Labs AN295: USB Audio Class Tutorial
  https://www.silabs.com/documents/public/application-notes/AN295.pdf
- https://stackoverflow.com/questions/23519753/usb-audio-descriptor
The TC358743 HDMI receiver stops I2S clocks during silence periods,
causing corrupted samples (isolated ±32767 spikes) when clocks restart.
This manifests as audible clicks/pops during quiet audio passages.

Add NEON-optimized glitch filter that:
- Detects extreme values (>±32000) surrounded by low-amplitude neighbors
- Replaces glitches with interpolated values from adjacent samples
- Uses SIMD fast-path to skip clean audio chunks with zero overhead
- Only runs for HDMI capture (USB audio unaffected)

The filter processes 16 samples per iteration using ARM NEON intrinsics,
resulting in ~0.005% CPU overhead on Cortex-A7 at 1.2GHz.
The script was copied but never executed, causing Docker-based builds
(via dev_deploy.sh) to fail due to missing ALSA/Opus/SpeexDSP libraries.

Reported-by: J-Bu
Merged changes from dev branch including:
- Diagnostics logging and download feature (jetkvm#1078)
- E2E test infrastructure improvements
- UI component updates and refactoring
- Japanese keyboard layout support
- Various bug fixes and improvements

Resolved conflicts in:
- jsonrpc.go: Combined audio RPC handlers with diagnostics
- SettingsItem.tsx: Kept enhanced badge implementation
- WebRTCVideo.tsx: Kept isSecureContext() utility
- useJsonRpc.ts: Merged failsafe blocked methods
- devices.$id.settings.video.tsx: Kept EDID initialization logic
- devices.$id.tsx: Combined audio settings with E2E test handlers
- Fix prettier formatting in SettingsItem, WebRTCVideo, AudioPopover
- Replace react-hook-form watch() with useWatch() for React Compiler compatibility
- Remove unused dependencies from useCallback
- Add eslint-disable for known React ref false positive
Remove the ability to select between HDMI and USB for audio output.
Audio output now always uses the TC358743 HDMI capture device.

- Remove AudioOutputSource from config and RPC handlers
- Remove audio source UI dropdown and store state
- Clean up unused translations across all locales
- Update C audio comments to reflect HDMI-only output
Machine translate new audio-related keys to all supported languages:
da, de, es, fr, it, nb, sv, zh
- Add discrete note about potential reboot requirement after
  USB reconfiguration to restore audio input
- Clarify USB Audio labels to specify "Audio Input" since it
  refers to browser microphone -> target computer flow
- Update description to explain the feature better
@tvinhas
Copy link
Copy Markdown
Contributor

tvinhas commented Feb 17, 2026

I love this feature but I couldn't make it work. My main computer is a Macbook Pro and I KVM into a Windows box. Can't hear any audio from Windows in my Mac.

@joevans
Copy link
Copy Markdown

joevans commented Feb 18, 2026

I just purchased a JetKVM so this feature is very important for me.

@pennycoders are the instructions to try this feature out still spelled out here?
https://github.com/pennycoders/kvm/blob/feat/audio-support/DEVELOPMENT.md

@xMAC94x
Copy link
Copy Markdown

xMAC94x commented Mar 5, 2026

0001-add-a-chooser-between-HDMI-and-USB-audio.patch

can confirm this PR works and would love to see this merged.
@pennycoders It would be cool to be able to choose between HDMI and USB for the Audio Output, because some old computers have issue with HDMI audio(see patchfile)

@lgmys
Copy link
Copy Markdown

lgmys commented Mar 9, 2026

Can someone merge this already?

It's nice to get new keyboard layouts on a weekly basis, but "Audio-Support" sounds more valuable for all of us...

Can't hear anything right now!

@lucianmoldovanu
Copy link
Copy Markdown

While this makes its' way to the stable release, can the feature be tested in Developer Mode without custom deployments? If not, I would appreciate a short guideline regarding deploying custom versions, rollbacks etc before attempting it. I then assume a deployment from this feature branch would be required, assuming it's kept in sync otherwise with main branch. Thank you!

@boyinatree
Copy link
Copy Markdown

While this makes its' way to the stable release, can the feature be tested in Developer Mode without custom deployments? If not, I would appreciate a short guideline regarding deploying custom versions, rollbacks etc before attempting it. I then assume a deployment from this feature branch would be required, assuming it's kept in sync otherwise with main branch. Thank you!

A guide would be helpful since there doesn't seem to be any movement on this getting in a release 🤷‍♂️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.