feat: add microphone protocal #123
No reviewers
Labels
No labels
bug
dependencies
duplicate
enhancement
hacktoberfest-accepted
invalid
question
submodules
wontfix
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gh-moonlight-stream/moonlight-common-c!123
Loading…
Reference in a new issue
No description provided.
Delete branch "Yundi339/master"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The following is translated by AI.
Hi, I'm the developer of the Sunshine-Foundation and moonlight-vplus.
Moonlight has always been a one-way street for audio/video - downstream only, no microphone upstream. We implemented a microphone transmission protocol in Moonlight VPlus, and it's been in production with many users.
This PR contributes the code to the community, aiming to establish a unified specification. Better to standardize now before wider adoption to avoid microphone protocol conflicts down the road.
Everything defined here is open for modification - we'll follow the official guidelines.
Protocol Overview
Client captures mic → Opus encode → UDP send to host. Supports both plaintext and encrypted modes.
Packet Format
Followed by Opus-encoded audio (optionally encrypted). Total packet <= 1400 bytes.
Key Constants
Encryption Support
We use Sunshine-Foundation and Moonlight VPlus. The old version only supported plaintext MIC data transmission; the new version adds encrypted transmission.
For smooth upgrades (some users may still be on older versions), we implemented compatibility handling: RTSP handshake identifies whether both sides support encryption. If one side doesn't support it, falls back to plaintext. Developers can also force MIC to use encrypted transmission in code for absolute security.
remoteInputAesKeyriKeyId + sequenceNumber(big-endian) in first 4 bytesDesign Notes
MIC_PACKET_MAGICThis value is sent in every packet's SSRC field. Sunshine currently doesn't validate it.
Design intent: If multiple mic implementations emerge (different codecs, configs), this value can identify client type and enable plugin-based processing.
Reserved Interfaces
These are defined but not currently used, reserved for scenarios where mic needs to be dynamically started/stopped via control stream:
FEC and Packet Loss
Opus library has built-in FEC and packet loss concealment, default FEC level is 1. Not explicitly configured in code - can be added to RTSP handshake if stronger FEC protection is needed.
Files Changed
MicrophoneStream.cLimelight.henableMicconfig and encryption flagLimelight-internal.hInput.hConnection.cRtspConnection.cSdpGenerator.cCompatibility
Our microphone implementation is based on VBCable. While it shares functional similarities with another ongoing Sunshine Pull Request, the underlying mechanisms differ. We have considered merging the complete microphone codebase into the upstream repository; however, several challenges remain:
Given these factors, our current priority is to continue refining these capabilities. Should the opportunity arise to integrate with the community version in the future, we intend to perform a complete rewrite of the microphone logic to ensure it meets community standards and maintains long-term maintainability.
Hi, I'm a small developer and I'd like to know if you're still working on Moonlight's microphone support or if you've given up on the project. What was the last success you had with that project? Maybe I... I can help if you allow me to. I really want this to move forward because what the community wants most is a native microphone in Moonlight, right?
View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.