ODIN Voice 2.2 is here - and it turns ODIN into more than a voice pipe. Exchanging arbitrary data with peers has always been part of the SDK, but the new Sockets make it far more powerful and flexible, with reliable and unreliable channels to choose from. On top of that, a Voice Isolation effect cuts through background noise with a deep-learning model and a long list of smaller improvements makes the SDK more robust and more convenient to work with.
Fittingly, it’s gamescom week in Cologne and a few of us are on site for meetings and good conversations. If you’re around and want to talk voice or networking, reach out.
Beyond Voice: Introducing Sockets
Every multiplayer project eventually needs to move data that isn’t voice, such as ready states, custom avatars, files, replays, high-frequency gameplay updates. While ODIN’s built-in messages have always covered the basics, anything bigger or faster meant working around their reliable, signaling-based delivery or running a second networking stack next to it.
ODIN Voice 2.2 introduces Sockets, which allow bidirectional communication channels to a specific peer (or all peers) in an ODIN room, right on top of the connection you already have. The key difference to messages is that you choose the delivery guarantees per channel:
- Reliable sockets deliver messages guaranteed and in order over a dedicated stream, with messages up to 10 MiB in size - ideal for files, state snapshots or anything that simply must arrive.
- Unreliable sockets deliver messages with minimal latency as individual datagrams - ideal for positions, inputs or anything where the next update matters more than the last one.
Time to get a little technical… here’s what this looks like in plain C. Opening a socket is a single call, and the user-defined label and priority values are transmitted to the remote peer, so both sides know what a socket is for and how important its traffic is:
OdinSocket *socket;
odin_socket_create(room, ODIN_SOCKET_KIND_RELIABLE, target_peer_id, 1, 0, &socket);
odin_socket_send(socket, (const uint8_t *)"hello", 5);
On the remote side, the socket simply shows up as inbound and its messages arrive through the new on_socket callback of the room events. The callback hands you the socket itself, so replying is just as easy:
void on_socket(OdinSocket *socket, const uint8_t *message, uint32_t message_length, void *user_data) {
OdinSocketInfo info;
odin_socket_info(socket, &info);
printf("received %d bytes on socket with label %d from peer %d\n",
message_length, info.label, info.remote_peer_id);
odin_socket_send(socket, message, message_length); // echo the message back
}
But wait… there’s one more trick: odin_socket_reset() performs a half-close. It shuts down your sending side while any queued messages are still transmitted and the socket keeps receiving. That enables clean request/response patterns without inventing your own protocol on top:
What can you build with that? A few ideas: transferring custom avatars and voice message recordings between players, replicating lobby and match state without a dedicated game server, streaming telemetry from embedded clients or pushing high-frequency positional data over an unreliable socket while voice and chat ride alongside on the same connection. If ODIN was already your only link between peers, sockets might just remove the last reason to maintain a second one.
Cutting Through the Noise: Voice Isolation
Noise suppression has been part of the ODIN audio pipeline for a long time. Version 2.2 adds a much bigger hammer: a Voice Isolation effect that uses a deep-learning model to separate speech from background noise like mechanical keyboards, barking dogs or an entire exhibition hall full of people.
Like VAD and APM, voice isolation is just another effect you insert into the pipeline, with a single knob to control how aggressively non-speech is attenuated:
uint32_t effect_id;
odin_pipeline_insert_vi_effect(pipeline, odin_pipeline_get_effect_count(pipeline), &effect_id);
OdinViConfig config = {
.enabled = true,
.attenuation_limit_db = 100.0f, // 100+ removes background sound entirely
};
odin_pipeline_set_vi_config(pipeline, effect_id, &config);
Values close to 0 leave the signal untouched, 100 and above remove background sound entirely. Everything in between blends the isolated voice with the original signal, in case you want to keep a bit of natural ambience. For best results, place the effect after the APM (whose echo canceller needs the unmodified capture signal) and before the VAD, which gates far more reliably on the isolated voice.
Smaller Things That Add Up
As always, a release is more than its headline features. A few highlights from the long tail of 2.2:
- Steam Deck ready: A network transport issue that prevented the Windows build from running under Proton is resolved.
- Reusable encoders: Creating an encoder with peer ID
0no longer binds it to a session; outgoing datagrams are automatically stamped with your actual peer ID on send, so you can create encoders up front and reuse them across joins and reconnects. - Smoother audio under packet loss: We have improved loss concealment and fixed a nasty bug that let the jitter buffer accumulate delay during continuous transmission.
Get Started
ODIN Voice 2.2 requires ODIN server version 2.1.0 or newer. All cloud-hosted servers in all regions are updated automatically, so for most of you there’s nothing to do but grab the new SDK. Head over to the repository on GitHub for the latest binaries, headers and documentation - including a new odin_sockets sample that demonstrates the socket API end to end.
As always: thank you for building with ODIN! A lot of what shipped in this release started as a conversation with one of you. Keep the feedback coming and if you’re at gamescom this week, chances are you’ll run into one of us.


