Skip to main content

FMOD Studio Plugin for ODIN Voice

Our DSP-based plugin connects FMOD Studio to ODIN Voice and decodes remote peer audio into the DSP output buffer. This plugin is intended for use inside FMOD Studio only. It is not a standalone application; when hosted outside FMOD Studio it behaves as a simple passthrough (input copied to output) and does not mix any ODIN audio.

The code and binary releases of this plugin are available in the ODIN FMOD Studio Plugin repository.

To integrate ODIN with FMOD Core, use our integration guides for Unreal and Unity or use the Unreal Adapter Plugin.

⚠️ Studio-only policy: do not ship this plugin in console, mobile, or web runtime builds. For production/runtime targets, integrate the ODIN SDK directly in your app and route that audio through your runtime audio pipeline. If an event uses this DSP, the runtime will require the plugin binary at load time, so remove the DSP from runtime events (or maintain Studio-only event/bank variants) before building runtime banks.

ODIN Playback Plugin deck showing connection settings

What It Does

  • Exposes FMOD Studio parameters:
    • Access Key (text)
    • Room Id (text)
    • User Id (text, optional)
    • Connect (toggle)
  • Connects to ODIN when Connect = true.
  • Mixes decoded peer audio to the plugin output.
  • Disconnects and frees resources when Connect = false or the plugin is released.
  • Outside FMOD Studio, the plugin only passes the input buffer through unchanged.

Installation (Binary Release)

  1. Download the latest release asset for your platform.
  2. Extract the archive.
  3. Copy the plugin files into your FMOD Studio install:
  • fmod_odin_playback.dll -> <FMOD Studio>/Plugins/
  • fmod_odin_playback.plugin.js -> <FMOD Studio>/Plugins/
  • odin.dll -> <FMOD Studio>/

Then restart FMOD Studio so the plugin is reloaded.

Using the Plugin in FMOD Studio

  1. In the Events browser, create or open an event.
  2. In the Event Editor (signal chain), add ODIN Playback Plugin to the audio path.
  3. In the Event Editor header, enable Persistent for the event.
  4. In the Deck (plugin UI), enter Access Key, Room Id, and optional User Id.
  5. In the Deck, click Connect.
  6. Press Play on the event (transport bar or event preview) to monitor the room audio.

FMOD Studio event overview with ODIN Playback Plugin in the signal chain

Notes:

  • User Id empty = mix all remote peers.
  • If you do not hear audio, confirm the event is routed to an audible bus and the event is playing.

Testing with the 4Players Web App Sample

You can use the 4Players web app sample to join the exact same ODIN room that the FMOD plugin is connected to.

  1. In FMOD Studio, note the Access Key and Room Id set in the ODIN Playback Plugin deck.
  2. Open https://4players.app/.
  3. Click the Settings (sliders) icon in the center, then switch to Development Settings (tags icon).
  4. Enter the same Access Key from FMOD Studio and set the gateway to gateway.odin.4players.io (no https:// prefix).

4Players web app development settings with access key and gateway

  1. In the connection dialog, enter the same Room Id as FMOD Studio, add any display name, leave the password empty, and click Join Room.
  2. Start talking in the browser, then press Play on the FMOD event; you should hear the web app audio in FMOD.

4Players web app join room dialog

Notes:

  • The room must match exactly; even a single character difference creates a different room.
  • If you are using User Id in FMOD, set the web app's user ID to the same value to target that peer.
  • Remember the security reminder below: Access Key is for local testing only.

FMOD Parameter Behavior

  • Access Key: required for local token generation (testing only, not production-safe).
  • Room Id: required.
  • User Id: ODIN user ID to follow in strict mode.
  • Listen All:
    • true: ignore User Id and mix all remote peers.
    • false: strict mode; only the matching User Id peer is mixed.
    • In strict mode, an empty User Id mutes output.
  • Connect:
    • true: initialize ODIN, generate token, join room.
    • false: leave room and release ODIN resources.

User Id Switching Behavior

  • You can change User Id while connected; no reconnect is required.
  • Switching targets selects the first currently-known peer that matches the new User Id.
  • If the matching peer joins later (or updates its user data later), the plugin will switch at that time.
  • If multiple peers share the same User Id, the first matching peer will be used.
  • Clearing User Id mutes output while Listen All is false.
  • Enabling Listen All resumes mixing all peers.

Troubleshooting

  • Cannot connect:
    • Check Access Key and Room Id for typos.
    • Ensure your machine can reach the ODIN gateway.
  • Event plays but no audio:
    • Make sure Persistent is enabled on the event.
    • Confirm the event is routed to an audible bus and the master output is not muted.
    • Enable Listen All to monitor all peers regardless of User Id.
  • Audio drops after changing Access Key or Room Id:
    • The plugin reconnects automatically. Wait a moment for the room to rejoin.

Audio Mixing Behavior

  • Input passthrough: the DSP copies the incoming FMOD signal to the output unchanged.
  • ODIN streams: each decoded peer stream is mixed additively into the same output buffer.
  • Mixing details:
    • Stereo streams are added channel-by-channel.
    • If the output is mono, left and right are averaged before being added.
    • Per-sample values are clamped to [-1.0, 1.0] after accumulation.

Security Reminder

⚠️ Embedding access_key in client tooling is only suitable for local testing. In production, generate signed ODIN tokens on a trusted backend and pass only short-lived tokens to clients.

Build From Source (All Platforms)

This repository uses CMake. You need the FMOD Core API SDK and the ODIN SDK.

General steps:

  1. Get the FMOD Core API SDK and note its path.
  2. Get the ODIN SDK and note its path.
  3. Configure with CMake, pointing to both SDKs.
  4. Build the plugin.
  5. Copy the output binaries into your FMOD Studio install and restart FMOD Studio.

To target the ODIN 1.7.x API implementation, configure with:

-DODIN_LEGACY_1_7_API=ON

To use custom-built ODIN binaries, place them in:

third_party/odin-overrides/<platform>/

Examples:

  • Windows x64: third_party/odin-overrides/windows-x86_64/odin.dll + odin.lib
  • Linux x64: third_party/odin-overrides/linux-x86_64/libodin.so
  • macOS arm64: third_party/odin-overrides/macos-aarch64/libodin.dylib

CMake prefers override binaries before ODIN_SDK_DIR/bin/<platform>.

Windows (Visual Studio)

Configure:

cmake -S . -B build -G "Visual Studio 17 2022" -A x64 `
-DFMOD_SDK_DIR="C:/path/to/fmodstudioapi202xxwin" `
-DODIN_SDK_DIR="C:/path/to/odin-sdk"

Build:

cmake --build build --config Release

Install (staged output):

cmake --install build --config Release --prefix "C:/path/to/fmodstudioapi202xxwin"

Outputs:

  • build/Release/plugins/fmod_odin_playback.dll
  • build/Release/plugins/fmod_odin_playback.plugin.js
  • build/Release/odin.dll

Copy to FMOD Studio:

  • fmod_odin_playback.dll -> <FMOD Studio>/Plugins/
  • fmod_odin_playback.plugin.js -> <FMOD Studio>/Plugins/
  • odin.dll -> <FMOD Studio>/

macOS

Configure:

cmake -S . -B build \
-DFMOD_SDK_DIR="/path/to/fmodstudioapi202xxmac" \
-DODIN_SDK_DIR="/path/to/odin-sdk"

Build:

cmake --build build --config Release

Install (staged output):

cmake --install build --config Release --prefix build/Release

Outputs:

  • build/Release/plugins/libfmod_odin_playback.dylib
  • build/Release/plugins/fmod_odin_playback.plugin.js
  • build/Release/libodin.dylib

Copy to FMOD Studio:

  • libfmod_odin_playback.dylib -> <FMOD Studio>/Plugins/
  • fmod_odin_playback.plugin.js -> <FMOD Studio>/Plugins/
  • libodin.dylib -> <FMOD Studio>/

Linux

Configure:

cmake -S . -B build \
-DFMOD_SDK_DIR="/path/to/fmodstudioapi202xxlinux" \
-DODIN_SDK_DIR="/path/to/odin-sdk"

Build:

cmake --build build --config Release

Install (staged output):

cmake --install build --config Release --prefix build/Release

Outputs:

  • build/Release/plugins/libfmod_odin_playback.so
  • build/Release/plugins/fmod_odin_playback.plugin.js
  • build/Release/libodin.so

Copy to FMOD Studio:

  • libfmod_odin_playback.so -> <FMOD Studio>/Plugins/
  • fmod_odin_playback.plugin.js -> <FMOD Studio>/Plugins/
  • libodin.so -> <FMOD Studio>/