open.mp forum
[Plugin] [VoiceChat] omp-voice - Printable Version

+ open.mp forum (https://forum.open.mp)
-- Forum: SA-MP (https://forum.open.mp/forumdisplay.php?fid=3)
--- Forum: Releases (https://forum.open.mp/forumdisplay.php?fid=13)
---- Forum: Plugins (https://forum.open.mp/forumdisplay.php?fid=32)
---- Thread: [Plugin] [VoiceChat] omp-voice (/showthread.php?tid=4288)



[VoiceChat] omp-voice - ionuzcostin - 2026-06-13

[RELEASE] omp-voice — Proximity + Radio/Phone Voice Chat for open.mp & SA-MP 0.3.7

What is omp-voice?
omp-voice is a full-featured, server-authoritative voice chat system for open.mp and SA-MP 0.3.7 R5. It brings proximity voice, radio channels, and phone calls to your server — all encrypted, low-latency, and scriptable via Pawn.
GitHub: https://github.com/staark-dev/omp-voice

Features
🎙️ Proximity Voice
  • Hear nearby players in 3D audio with logarithmic distance falloff and stereo panning
  • Occlusion support — voices are muffled through walls and closed vehicles
  • Three preset ranges: Whisper / Normal / Shout, or a custom range per player
  • Interior and virtual-world gating (you only hear players in the same dimension)
📻 Radio & Phone Channels
  • Radio filter: bandpass + squelch + half-duplex garble for that authentic feel
  • Phone filter: narrowband colouring for realistic call audio
  • Mixed per-listener on the server for perfect control
  • Speakerphone (
    /vspeaker
    ) — let bystanders hear a phone call out loud
🔒 Security
  • Per-connect cryptographic token identity (not IP-based)
  • Every relay↔client datagram sealed with XChaCha20-Poly1305 AEAD encryption
  • Server is fully authoritative for position, flags, and channels — anti-spoof
🎧 Audio Quality
  • Opus codec — industry-standard, low-latency voice compression
  • RNNoise neural noise suppression (enable/disable per client)
  • Adaptive jitter buffer for smooth playback
  • Push-to-Talk or Voice Activation modes (exclusive per client)
🖥️ In-Game Client UI (ImGui)
  • Press INSERT to open the control panel: volumes, devices, PTT key rebind, noise suppression
  • "Who's talking" HUD (toggle with F8) — see active speakers on-screen
  • Optional floating labels above player heads while they talk
  • Per-player local mute and volume control

Architecture
omp-voice uses a hybrid mixing model:
  • Proximity audio is relayed per-speaker as raw Opus; the client spatialises it locally (lowest latency)
  • Radio/Phone buses are decoded, filtered, and mixed server-side per listener, then re-encoded and streamed
The system consists of six modules:
Module
Roleshared/
Wire protocol, crypto (libsodium), INI, UDP
core/
Routing engine: proximity, bus router, channels, mix policy
relay/
Standalone relay process — AEAD transport shell
samp/
SA-MP 0.3.7 plugin bridge (Pawn natives)
omp/
open.mp component bridge
client/
Windows
.asi
— WASAPI, Opus, RNNoise, ImGui panel

Installation
Server Side
  1. Drop
    plugins/VoiceChat.dll
    (SA-MP) or the open.mp component into
    components/
  2. Place
    voice_relay.exe
    alongside the server executable
  3. Copy
    qawno/include/voicechat.inc
    (+
    voicechat_ui.inc
    ) for your gamemode
  4. Add
    voice.ini
    (config file — annotated, comes with the release)
  5. Add to
    config.json
    :
    "legacy_plugins": ["VoiceChat"]
    or to
    server.cfg
    for SA-MP
Client Side (each player)
  1. Place
    VoiceChat.asi
    in the GTA SA folder (requires an ASI loader: SilentPatch, CLEO, etc.)
  2. Edit
    voicechat.ini
    — set
    relay_ip
    to the server's IP address
Firewall
Open UDP port 7779 inbound on your server:
# Windows (admin)
netsh advfirewall firewall add rule name="VoiceChat 7779" dir=in action=allow protocol=UDP localport=7779

# Linux
sudo ufw allow 7779/udp


Pawn API (quick overview)

Code:
#include <voicechat>
#include <voicechat_ui>

public OnGameModeInit() {
    gProximity = Voice_CreateChannel(VOICE_FILTER_NONE, false);
    return 1;
}

public OnPlayerConnect(playerid) {
    new ip[16]; GetPlayerIp(playerid, ip, sizeof ip);
    Voice_OnPlayerConnect(playerid, ip);
    Voice_AddToChannel(playerid, gProximity);
    Voice_SetPlayerRange(playerid, VOICE_RANGE_NORMAL);
    return 1;
}

public OnPlayerUpdate(playerid) {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    new veh = GetPlayerVehicleID(playerid) ? VOICE_VEH_CLOSED : VOICE_ONFOOT;
    Voice_UpdatePosition(playerid, x, y, z,
        GetPlayerInterior(playerid), GetPlayerVirtualWorld(playerid), veh);
    return 1;
}

public OnPlayerStartTalking(playerid) { VoiceUI_OnStartTalking(playerid); return 1; }
public OnPlayerStopTalking(playerid)  { VoiceUI_OnStopTalking(playerid);  return 1; }
public OnPlayerDisconnect(playerid, reason) {
    Voice_OnPlayerDisconnect(playerid);
    return 1;
}

Key Natives
// Channel management
Voice_CreateChannel(filter, bool:positional, priority = 100);
Voice_AddToChannel(playerid, channelid);
Voice_RemoveFromChannel(playerid, channelid);

// Player control
Voice_SetPlayerRange(playerid, preset, Float:override = 0.0);
Voice_SetPlayerFlags(playerid, bool:muted, bool:deafen, bool:alive, bool:spectator);
Voice_SetMixPolicy(playerid, policy, Float:duckLevel = 0.5, Float:proximityFloor = 0.25);
Voice_MutePlayer(playerid, targetid, bool:mute = true);  // per-pair mute
Voice_SetSpeakerphone(playerid, bool:on = true);

// Lifecycle
Voice_OnPlayerConnect(playerid, const ip[]);
Voice_OnPlayerDisconnect(playerid);
Voice_ReloadConfig();  // reload voice.ini at runtime



In-Game Controls (Client)
Key Action:
Proximity push-to-talk
Radio/phone push-to-talk
F9 Self-mute
F8 Toggle "who's talking" HUD
INSERT Open settings panel

All keys are rebindable in the in-game panel.

Building from Source
One-shot Windows build:
powershell -ExecutionPolicy Bypass -File .\build.ps1

Manual CMake (production config, x86):
cmake -S . -B build -A Win32 -DVC_NO_SODIUM=OFF -DVC_WITH_OPUS=ON -DVC_BUILD_CLIENT=ON
cmake --build build --config Release

All third-party dependencies (libsodium, Opus, Dear ImGui, MinHook, RNNoise) are fetched and built automatically by CMake — no manual installs needed.
CI/CD via GitHub Actions builds and tests on every push. Tagged releases (v*) publish ready-to-use bundles automatically.

Current Status
Core engine and all major features are implemented and validated in-game (2-player proximity with occlusion + falloff, radio/phone channels, speakerphone, RNNoise, ImGui panel).
Remaining / planned:
  • AEC (Acoustic Echo Cancellation) — deferred; headphones avoid the issue for now
  • Linux 32-bit.so for SA-MP (relay and open.mp component already build on Linux x64)

Download
👉 GitHub Releases: https://github.com/staark-dev/omp-voice/releases

Bundles available:
  • voicechat-client-win32.zip
    — client.asi + voicechat.ini
  • voicechat-server-win.zip
    — server plugin + relay + includes + voice.ini
  • voicechat-relay-linux-x64.tar.gz
    — relay binary for Linux servers
Each bundle includes an
INSTALL.txt.

License
MIT — free to use, modify, and distribute. See LICENSE.

Feedback, bug reports, and pull requests are welcome on GitHub!