Version 6.0.0

This release brings two new features to Dissonance.

Acoustic Echo Cancellation

After many months of experimentation it's finally here! Acoustic Echo Cancellation (AEC) watches the audio coming out of the speakers and then removes that audio when it is recorded by the microphone a few milliseconds later. This prevents unbearable feedback loops, hearing your own voice sent back to you and even suppresses game sound effects from being transmitted.

At the moment AEC is experimental. Quality on desktop computers has generally been excellent but it can vary with a large number of factors such as microphone quality, speaker quality, size of the room and even the amount of soft furnishing nearby! On mobile phones AEC is significantly less well tested because we only have access to a limited number of devices to test with and so it's crucial that we get feedback - if you use AEC please contact us and tell us what does and does not work.

Flexible Encoding Settings

In previous version of Dissonance all clients in a session used the same audio encoding settings. With flexible encoding settings this is no longer required - each client transmits it's settings when it joins the session allowing you to choose the best settings for each platform.

Breaking Changes!

There are two breaking changes in this version.

If you are implementing a completely custom network integration (using ICommsNetwork) a new parameter has been added to two methods. Initialize receives a CodecSettings which indicates the codec settings being used locally. The PlayerJoined event now emits a CodecSettings which indicates the codec settings being used by the new remote player.

If you are bypassing Dissonance management of the voice playback AudioSource by accessing VoicePlayerState.Playback.AudioSource the return type of the Playback property has changed from VoicePlayback (which is tied specifically to Unity audio playback) to IVoicePlayback which generalises playback. You can still access the Unity AudioSource with: ((VoicePlayback)VoicePlayerState.Playback).AudioSource.

Integrations

SALSA Lip Sync
Upgrade Available!
Realtime automatic lip synchronisation for Dissonance speaking using SALSA.
Playmaker
Upgrade Available!
Adds support for controlling channels (who is speaking to whom) using Playmaker.
Forge Remastered
Use the Forge Remastered Networking system to host a Dissonance voice chat session.
Forge
Use the Forge Networking (Classic) system to host a Dissonance voice chat session.
Photon Unity Networking
Use the Photon Unity Networking system to host a Dissonance voice chat session.
UNet (HLAPI)
Use the Unity (UNet) High Level API Networking system to host a Dissonance voice chat session.
UNet (LLAPI)
Use the Unity (UNet) Low Level API Networking system. This hosts it's own LLAPI session and could potentially be used in conjunction with most other networking systems.
Photon Bolt
Use the Photon Bolt Networking system to host a Dissonance voice chat session.
Steamworks.NET P2P
Use Steamworks.NET to host a peer to peer voice chat session.

New Features

  • Experimental Acoustic Echo Cancellation (AEC). Automatically removes speaker sounds from the microphone input; preventing feedback loops, echoing voices and transmitting game sound effects.
  • Each client may now use different encoding settings (quality, frame size, codec).
  • Added timestamps to Dissonance log messages.
  • Return IVoicePlayback from VoicePlayerState:Playback property. Removing a hard dependency on the Unity playback system.

Bug Fixes

  • Fixed clients (particularly HLAPI) getting stuck in connect/disconnect loops, causing them to never send or receive any voice packets.
  • Fixed string hashing using GetHashCode which is not stable between runtimes. Now using an FNV-1a hash for all string hashing.
  • Fixed GetSpeakingChannels returning all channels as if they were `Player` channels.
  • Fixed buffered network packets potentially "leaking" from one session to the next when the comms network is shut down and restarted.
  • Fixed a potential NullReferenceException in HLAPI integration if NetworkManager.singleton returns null.
  • Fixed preprocessor thread waking up too frequently when there is no work to do. Significantly reducing CPU usage.
  • Prevented the Lost NN samples in the preprocessor (buffer full), injecting silence to compensate message appearing every frame when there are lost samples.

Known Issues

No known issues or regressions in this release :D