This fork replaces EMSS¹ audio with OpenAL², which fixes several audio problems:
-
Startup/Random speedup — Accelerated audio playback for the first few seconds of every stream, producing a chipmunk-like effect, regardless of the PTS timestamps submitted. This seems like an EMSS-internal behavior that cannot be worked around at the application layer. OpenAL plays at the hardware sample rate with no timeline management, eliminating the problem.
-
Silence after suspension — with EMSS, suspending the TV closed the audio track and resuming required re-opening it, a process that was unreliable and often produced permanent silence for the rest of the session. With OpenAL, the Web Audio context pauses on suspend and resumes transparently; the AL source restarts automatically on the next decoded frame with no track negotiation required.
-
Crackling — earlier EMSS bugs (wrong decoding mode, incorrect packet fields, PTS not advancing on failure) caused audio glitches. These are eliminated by the backend switch.
Decoding and AL feeding run on a dedicated feeder thread, decoupled from the network receive thread. A software jitter buffer sits between the Opus decoder and the AL buffer pool, absorbing short network bursts without stalling playback. Its depth is computed from the negotiated audio packet duration (5 / 10 / 20 ms frames) so the wall-clock protection is consistent regardless of the server's audio configuration. When the buffer runs dry during a dropout, gaps are filled with Opus Packet Loss Concealment (PLC) rather than silence, preserving audio continuity. Both the packet duration and the jitter buffer target are configurable in Audio Settings.
Through empirical testing it is noticiable that the Tizen does not handle 5ms frames properly which causes crackling audio frequently.
The OpenAL context is opened at the stream's sample rate (48 kHz) rather than the platform default (44.1 kHz on Tizen TVs), preventing the resampling artefacts that produced intermittent background noise.
¹EMSS (Elementary Media Stream Source) is Samsung's proprietary C++ API for feeding compressed media directly to a TV's hardware decoders from a WASM³ application. Video still uses EMSS since it works correctly for compressed bitstreams.
²OpenAL on Emscripten is implemented over the Web Audio API. It is used here only for audio; it has no concept of presentation timestamps, which is why it does not suffer from the EMSS clock bug.
³WASM (WebAssembly) is a binary instruction format that runs at near-native speed inside a browser sandbox.
Running nc -u -l -p 9999 on the Sunshine host receives timestamped log messages
from the TV client in real time, useful for diagnosing audio/video issues without
needing adb/sdb access (which Samsung disables on retail firmware).
Audio (OpenAL) and video (EMSS) now run through entirely separate pipelines. Previously both shared an EMSS instance, which caused video stalls when the audio track was renegotiated during TV UI interactions.
I recommend Samsung-Jellyfin-Installer to install the release package, select Custom WGT Package in the UI after the program finds the TV in your network.
The remainder of the original README.md follows.
Moonlight Tizen is a port of Moonlight ChromeOS, which is an open source client for NVIDIA GameStream and Sunshine.
Moonlight it allows you to stream your collection of games, programs, or your full desktop from your powerful PC to your Samsung TV running Tizen OS 5.5 or higher.
Check out the Moonlight Wiki for more details, setup guides, or troubleshooting steps.
This project originally started as a WASM port for Tizen TV created by the Samsung Developers Forum. They demonstrated how Moonlight could run on Tizen OS by converting the original Native Client module to WebAssembly, enabling raw TCP/UDP socket access for networking, reimplementing the video and audio pipelines using the Tizen WASM Player to leverage hardware acceleration, and fully adapting the application to the Tizen web environment (see their full article for technical details).
Although it remained only a proof-of-concept at that stage, the work was later taken much further by KyroFrCode, who expanded and transformed it into a fully installable Tizen application, simplifying the complex build and compilation process for users. However, the application became outdated, lacking new features and still containing several long-standing bugs that affected usability.
In September 2023, I started development on a fork repository, where I made significant changes, including a brand-new app logo and extensive improvements focused on delivering a modern, reliable, and user-friendly experience. When the upstream repository became inactive and was eventually abandoned, I migrated all my work to this new dedicated repository as a fresh and standalone continuation, offering a cleaner structure, easier maintenance, and greater flexibility for future development.
Since then, this repository has been actively maintained with frequent updates. Over time, I have refactored the codebase, updated core libraries, fixed bugs, polished the UI/UX, and introduced many new features and improvements. Thanks to more than two years of dedicated work, this has become the most enhanced and feature-rich Moonlight client available for Samsung Tizen TVs.
To get started, ensure that your setup meet the recommended requirements described below, which are essential to use the Moonlight app.
-
Client Requirements — You must have a Samsung TV with Tizen OS starting from model year 2020 (Tizen 5.5) or later.
-
Host Requirements — You must have a powerful PC with a GPU capable of hardware decoding that meets the system requirements to ensure optimal streaming performance.
-
Network Requirements — You need a mid-range or high-end wireless router with a good wireless connection to your client using 5 GHz WiFi 5 (802.11ac) or WiFi 6 (802.11ax) and a good wired connection to your host using the CAT5e ethernet or better which is strongly recommended.
-
Input Requirements — It is highly recommended that you use a supported gamepad connected to your client or host device for the best game streaming experience, as using a mouse and keyboard may cause some interference issues with Tizen OS during the streaming session.
Follow the instructions below based on the Tizen OS version of your Samsung TV to successfully download and install the Moonlight app.
- Download the
Moonlight.wgtfile from the latest release. - Follow the provided installation guide to install the app on your TV using Tizen Studio.
- Once the installation is complete, the Moonlight app will automatically open on your TV.
- Follow the provided installation guide to install the app on your TV using the Docker image.
- Once the installation is complete, open the Moonlight app on your TV.
See the CHANGELOG file for more information about the changes for each version of this project.
Contributions are welcome! You can fork the repo, create pull requests, or open issues.
If you find this project useful, here are ways you can support it:
- ⭐ Star the repo to show your appreciation and support the project.
- 🐛 Report bugs or suggest new features to help improve the project.
- 💬 Participate in discussions to share ideas, tips, and help others.
- 🧪 Test pre-release builds and give early feedback to the developer.
This project is licensed under the GNU General Public License v3.0. See the LICENSE file for more information.
- Thanks to Moonlight Game Streaming Project for the core implementation of the NVIDIA GameStream protocol and the development of Moonlight for Chrome OS.
- Thanks to Samsung Developers Forum for creating a port version based on Chrome OS (NaCl) and adapting the Moonlight implementation for Tizen OS (WASM).
- Thanks to babagreensheep and pablojrl123 for creating a method for building the application and adapting the Dockerfile including the supporting files.
- Thanks to KyroFrCode for updating the core files, adding a shortcut combo to stop the streaming session, allowing audio volume changes, and improving the Dockerfile for better build compatibility.
- Thanks to OneLiberty for implementing features such as video codec selection, mouse emulation, Wake-on-LAN, new IP address field mode, improved Docker publishing workflow, and several improvements.
- Thanks to toypoodlegaming for improving video codec selection logic and implementing features such as audio configuration and performance statistics.