Fix: Non-Steam Players Have No Voice (ReVoice) #7
Open
wants to merge 1 commits from
tutorial/fix-revoice-no-voice-nonsteam-en
into main
1 changed file
with 99 additions and 0 deletions
fix-revoice-no-voice-nonsteam/en.md
A
| @@ -0,0 +1,99 @@ | ||
| 1 | +--- | |
| 2 | +title: "Fix: Non-Steam Players Have No Voice (ReVoice)" | |
| 3 | +excerpt: "Steam players hear each other but non-Steam players are silent, one-way or robotic? Walk the ReVoice chain from the server stack to the client and find the exact link that breaks." | |
| 4 | +category: "errors" | |
| 5 | +tags: "revoice, voice, non-steam, reunion, rehlds" | |
| 6 | +image: "" | |
| 7 | +read_time: "8 min read" | |
| 8 | +--- | |
| 9 | +<p>The classic report: Steam players talk to each other fine, but nobody hears the non-Steam players and they hear nobody. Sometimes it is one-way, sometimes robotic. It is all one chain breaking at different links. This page assumes you followed <a href="/tutorials/install-revoice">the ReVoice install guide</a> and walks the chain in the order it usually breaks, so stop at the first link that fails.</p> | |
| 10 | + | |
| 11 | +<h2>Why voice splits along Steam lines</h2> | |
| 12 | +<p>Steam builds of CS 1.6 send voice in Steam's own format: SILK on older Steam builds, Opus on current ones. Older non-Steam builds send Speex. The engine converts nothing. It relays each voice packet to the listeners exactly as it arrived, so a Speex packet reaching a Steam client, or an Opus packet reaching a non-Steam client, is data the receiver cannot decode. Steam-to-Steam works without help because both ends already agree.</p> | |
| 13 | +<p>ReVoice is the translator: it takes over voice handling in ReHLDS, decodes each packet and re-encodes it for every listener, Speex for old builds and Steam format for Steam clients. So a broken ReVoice has a recognisable signature: Steam players keep talking while everyone on a non-Steam build goes silent.</p> | |
| 14 | + | |
| 15 | +<h2>1. Is ReVoice actually running?</h2> | |
| 16 | +<p>The file on disk proves nothing. In the server console:</p> | |
| 17 | +<pre><code>version | |
| 18 | +meta list</code></pre> | |
| 19 | +<p><code>version</code> must print a <code>ReHLDS version:</code> line. In <code>meta list</code>, ReVoice must show <code>RUN</code>, and Reunion must be listed <strong>above</strong> it. The order matters: ReVoice asks for Reunion's API the moment it attaches (it uses Reunion to learn each client's protocol) and refuses to start if Reunion is not loaded yet. Your <code>cstrike/addons/metamod/plugins.ini</code> should read:</p> | |
| 20 | +<pre><code>linux addons/reunion/reunion_mm_i386.so | |
| 21 | +linux addons/revoice/revoice_mm_i386.so | |
| 22 | +linux addons/amxmodx/dlls/amxmodx_mm_i386.so</code></pre> | |
| 23 | +<p>On Windows the lines start with <code>win32</code> and point at <code>reunion_mm.dll</code> and <code>revoice_mm.dll</code>. If ReVoice shows <code>fail</code>, scroll back through the startup output (or the server log) for its own error:</p> | |
| 24 | +<ul> | |
| 25 | +<li><code>[REVOICE]: Failed to locate REHLDS API</code> - you are on stock HLDS. ReVoice only runs on ReHLDS.</li> | |
| 26 | +<li><code>[REVOICE]: Failed to locate Reunion api</code> - Reunion is missing, failed to load, or sits below ReVoice. Fix it with <a href="/tutorials/install-reunion">the Reunion install guide</a>. ReVoice needs Reunion specifically; dproto does not provide that API.</li> | |
| 27 | +<li>A <code>Reunion API</code> version mismatch line - your Reunion build is too old for your ReVoice build. Update Reunion.</li> | |
| 28 | +</ul> | |
| 29 | +<p>ReVoice can only be loaded when the server process starts, so after any of these fixes, restart the server. A map change is not enough.</p> | |
| 30 | + | |
| 31 | +<h2>2. Ask ReVoice how it sees each player</h2> | |
| 32 | +<p>ReVoice can tell you which codec it assigned to each connected player:</p> | |
| 33 | +<pre><code>rev status</code></pre> | |
| 34 | +<p>It lists each player with a codec (<code>speex</code>, <code>opus</code>, <code>silk</code> or <code>none</code>), a voice rate and the protocol. Run it in the server's own console: the per-player lines go to the server process's terminal, so over rcon you may only see the header. If it prints nothing at all, ReVoice is not loaded.</p> | |
| 35 | +<p>How the codec is chosen: on connect, ReVoice asks the client for its <code>sv_version</code>. A build number above 4554 is treated as a Steam-style client and gets <code>opus</code>. Everything else, including a client that never answers the query, gets the value of <code>REV_DefaultCodec</code>, which should be <code>speex</code>. What you want to see:</p> | |
| 36 | +<ul> | |
| 37 | +<li>Steam players on <code>opus</code>.</li> | |
| 38 | +<li>Classic non-Steam builds on <code>speex</code>.</li> | |
| 39 | +<li>Nobody on <code>none</code>. A player on <code>none</code> is not handled at all, and ReVoice drops their voice.</li> | |
| 40 | +</ul> | |
| 41 | +<p>A player on the wrong codec is the usual cause of one-way or garbled voice: their packets go through the wrong decoder, so the other side gets noise or nothing. ReVoice classifies by build number alone, so a non-Steam pack built on a newer engine build is treated exactly like Steam.</p> | |
| 42 | + | |
| 43 | +<h2>3. Server cvars: one matters, two do not exist</h2> | |
| 44 | +<pre><code>sv_voiceenable</code></pre> | |
| 45 | +<p>Typed alone it prints the current value, which must be <code>1</code>. With <code>0</code>, ReVoice reads every voice packet and throws it away, so nobody hears anybody, Steam or not.</p> | |
| 46 | +<p>Many guides also set <code>sv_voicecodec</code> and <code>sv_voicequality</code>. ReHLDS does not have these cvars, so setting them does nothing, and ReHLDS stays silent about unknown commands unless <code>sv_echo_unknown_cmd 1</code> is set. ReVoice writes the voice setup each client receives on connect itself, always Speex at quality 5, so there is nothing to tune. Delete those lines from <code>server.cfg</code> so they stop misleading whoever debugs voice next.</p> | |
| 47 | + | |
| 48 | +<h2>4. revoice.cfg has two settings</h2> | |
| 49 | +<p>This is the file the current release ships, and these are the only two settings ReVoice registers:</p> | |
| 50 | +<pre><code>REV_HltvCodec opus // speex, opus | |
| 51 | +REV_DefaultCodec speex // speex, opus</code></pre> | |
| 52 | +<p>ReVoice executes it from its own folder, <code>cstrike/addons/revoice/revoice.cfg</code>, at every map start, so a copy in <code>cstrike/</code> is never read. <code>REV_DefaultCodec</code> is the codec for every client that does not identify as a newer build: leave it on <code>speex</code>. Set to <code>opus</code>, ReVoice decodes the old builds' Speex packets as Opus. <code>REV_HltvCodec</code> only affects HLTV. Any other line in a forum copy of this file (bitrates, quality levels) is not a ReVoice setting and does nothing.</p> | |
| 53 | + | |
| 54 | +<h2>5. Rule out the game's own voice rules</h2> | |
| 55 | +<p>Transcoding decides whether a packet can be understood; the game decides who may hear whom, and its default rules look exactly like a ReVoice fault. On ReGameDLL, <code>sv_alltalk</code> takes these values:</p> | |
| 56 | +<ul> | |
| 57 | +<li><code>0</code> (default) - teams cannot hear each other; dead players hear their whole team, alive players hear only alive teammates.</li> | |
| 58 | +<li><code>1</code> - everybody hears everybody.</li> | |
| 59 | +<li><code>2</code> - teammates hear each other, alive or dead.</li> | |
| 60 | +<li><code>3</code> - as 2, plus spectators hear everybody.</li> | |
| 61 | +<li><code>4</code> - alive hear alive, dead hear dead and alive.</li> | |
| 62 | +<li><code>5</code> - alive hear alive teammates, dead hear dead and alive.</li> | |
| 63 | +</ul> | |
| 64 | +<p>Values 2 to 5 are ReGameDLL additions; the stock game DLL only knows 0 and 1. To test, set <code>sv_alltalk 1</code> with a Steam and a non-Steam player on the server. If they now hear each other both ways, your "voice bug" was the game rules.</p> | |
| 65 | + | |
| 66 | +<h2>6. AMXX plugins that mute voice</h2> | |
| 67 | +<p>Gag plugins, dead-talk or alltalk managers and "voice for VIPs only" plugins switch voice off per player, and a misconfigured one can silence a whole group. They usually work through the engine module's <code>set_speak</code> with <code>SPEAK_MUTED</code>, fakemeta's <code>FM_Voice_SetClientListening</code> forward, or ReAPI's <code>RG_CSGameRules_CanPlayerHearPlayer</code> hook. If you have the sources, search them:</p> | |
| 68 | +<pre><code>grep -rlE "set_speak|Voice_SetClientListening|CanPlayerHearPlayer|VTC_" /home/steam/hlds/cstrike/addons/amxmodx/scripting/</code></pre> | |
| 69 | +<p>With only <code>.amxx</code> files, list what runs with <code>amxx plugins</code>, disable suspects one at a time (see <a href="/tutorials/plugins-ini-load-order">disabling plugins in plugins.ini</a>) and retest after a map change. <a href="/tutorials/amx-gag-mute-players">Gagging and muting players</a> covers how gag plugins behave.</p> | |
| 70 | +<p>A hit on <code>VTC_</code> means a plugin is written for VoiceTranscoder, a separate transcoder. Run one transcoder, not two: if VoiceTranscoder is also in the Metamod <code>plugins.ini</code>, remove one of them.</p> | |
| 71 | + | |
| 72 | +<h2>7. The client side</h2> | |
| 73 | +<p>When one particular player is silent, have them run this in their own console:</p> | |
| 74 | +<pre><code>voice_enable 1 | |
| 75 | +voice_modenable 1 | |
| 76 | +voice_scale 1 | |
| 77 | +bind "k" "+voicerecord"</code></pre> | |
| 78 | +<p><code>voice_enable 0</code> switches the client's voice system off entirely. <code>voice_modenable 0</code> is sneakier: the game only builds a hearing list for players who report it as on, so that player hears nobody even though everyone hears them. <code>voice_scale</code> is the playback volume of other players. Holding the bound key should show the microphone icon; no icon means a bind, input device or Windows microphone permission problem, all covered in <a href="/tutorials/cs16-mic-not-working">microphone not working</a>.</p> | |
| 79 | +<p><code>voice_loopback 1</code> plays the player's own voice back to them, but ReVoice returns your own packet untouched, so loopback proves the microphone and the client, not the transcoding. A player who cannot hear one specific person may have muted them on the scoreboard; those mutes are saved in <code>voice_ban.dt</code> in the client's <code>cstrike</code> folder and survive reconnects.</p> | |
| 80 | + | |
| 81 | +<h2>Common errors by symptom</h2> | |
| 82 | +<ul> | |
| 83 | +<li><strong>Steam players hear each other, non-Steam players are silent both ways</strong> - ReVoice is not running. Check <code>meta list</code> for <code>fail</code> or <code>badf</code>, make sure Reunion is above ReVoice and ReHLDS is present, then restart the server.</li> | |
| 84 | +<li><strong>One-way between Steam and non-Steam</strong> - run <code>rev status</code> while the silent player is on. A Steam player on <code>speex</code> or an old build on <code>opus</code> is misclassified: put <code>REV_DefaultCodec</code> back to <code>speex</code>; if it already is, the client is misreporting its build.</li> | |
| 85 | +<li><strong>One-way between teammates, Steam or not</strong> - usually the alive/dead rule of <code>sv_alltalk 0</code>: the dead hear the living, the living do not hear the dead. That is working as designed.</li> | |
| 86 | +<li><strong>One player cannot hear one other player</strong> - a scoreboard mute or a gag, not ReVoice.</li> | |
| 87 | +<li><strong>Garbled or robotic voice</strong> - have the speaker try <code>voice_loopback 1</code>. Robotic to themselves means their microphone level or boost. Clean loopback: check <code>rev status</code> for a wrong codec, then packet loss and very low client <code>rate</code> values, since voice rides in the unreliable part of each update and is skipped when there is no room.</li> | |
| 88 | +<li><strong>Nobody hears anyone, not even Steam to Steam</strong> - <code>sv_voiceenable</code> is 0, a plugin is muting everyone (step 6), or a second transcoder is loaded.</li> | |
| 89 | +</ul> | |
| 90 | + | |
| 91 | +<h2>Verification checklist</h2> | |
| 92 | +<ul> | |
| 93 | +<li><code>version</code> shows ReHLDS, and <code>meta list</code> shows Reunion <code>RUN</code> above ReVoice <code>RUN</code>.</li> | |
| 94 | +<li>No <code>[REVOICE]</code> errors in the startup output.</li> | |
| 95 | +<li><code>sv_voiceenable</code> prints 1, and <code>server.cfg</code> no longer sets <code>sv_voicecodec</code> or <code>sv_voicequality</code>.</li> | |
| 96 | +<li><code>addons/revoice/revoice.cfg</code> has <code>REV_DefaultCodec speex</code>.</li> | |
| 97 | +<li><code>rev status</code> shows Steam players on <code>opus</code>, non-Steam players on <code>speex</code>, nobody on <code>none</code>.</li> | |
| 98 | +<li>With <code>sv_alltalk 1</code> as a test, a Steam and a non-Steam player hear each other in both directions. Then restore your normal value.</li> | |
| 99 | +</ul> | |
| 0 | 100 |









