In 4.12 there is a problem where voice chat over steam cuts out after a few seconds. Everything was working fine in 4.11 but now appears to be broken. Basically when one person starts talking, his voice plays back on the connected client but after a short time or when the talker’s volume drops too low, sound playback stops.
The stat NET command shows that voice packets are continuously being received so it doesn’t appear to be a network issue. The stat AUDIO command shows that an audio source is created when a person starts talking. If the person stops talking for several seconds the audio source will be destroyed. He can then begin talking again and will be audible for a few more seconds following the creation of a new audio source. Could there be an issue with audio components and streaming sounds?
Here is an example project that shows the problem. It’s just a first person template project with steam voice chat enabled and a menu that allows hosting and joining an online session.
[Sample project - 4.12.4 Voice chat cuts out
This is the same project made in 4.11 where voice chat is working fine.
This is the exact issue our game is having as well. We are using specially routed voice packets (not using the online subsystem) and the problem is still present. Is there any news regarding this issue? Voice communication is a rather large part of our project.
Hi , my team is having the same issues with voice being choppy in 4.12, we would sincerely like a fix sooner than later as the function is very important to our project. Is there any engine code that your team is aware of that could be grafted into 4.12 as a hotfix? I have been browsing your master and promoted branch only to find that the code and commit comments, or the solution itself, is not transparent enough for me to bring over without guidance.
If there is nothing for it, we understand and hope to see it fixed soon.
-Spiris
I have informed our Developers that there is an increased need for this to be resolved as soon as possible. While I cannot say at this time whether or not it’ll be resolved any sooner, I can advise you that it is considered a major bug - so it’ll be reviewed after all extreme/blocking issues are taken care of.
Hi there,
our studio would be interested in this as well. If you cannot release another hotfix for 4.12 please at least show us the fix on your master branch. Thanks!
Having VOIP work for dedicated servers is also a big priority for our game. I tried to implement the following pull request to enable VOIP over dedicated servers: https://github.com/EpicGames/UnrealEngine/pull/1661/files but had similar issues where the voice would drop out (in 4.12).
In debugging this myself I found that moving the line ‘QueuedData->AudioComponent->Play();’ to the end of the ‘FVoiceEngineSteam::SubmitRemoteVoiceData(…)’ function fixed voice from dropping out however the audio would cut in and out and with lots of players became unintelligible. But I think the logic surrounding when to play voice data may be the culprit. Hoping this may help Epic address this sooner! Here is the function in question:
uint32 FVoiceEngineSteam::SubmitRemoteVoiceData(const FUniqueNetId& RemoteTalkerId, uint8* Data, uint32* Size)
{
UE_LOG(LogVoiceDecode, VeryVerbose, TEXT("SubmitRemoteVoiceData(%s) Size: %d received!"), *RemoteTalkerId.ToDebugString(), *Size);
const FUniqueNetIdSteam& SteamId = (const FUniqueNetIdSteam&)RemoteTalkerId;
FRemoteTalkerDataSteam* QueuedData = RemoteTalkerBuffers.Find(SteamId);
if (QueuedData == NULL)
{
RemoteTalkerBuffers.Add(SteamId, FRemoteTalkerDataSteam());
QueuedData = RemoteTalkerBuffers.Find(SteamId);
}
check(QueuedData);
// new voice packet.
QueuedData->LastSeen = FPlatformTime::Seconds();
uint32 BytesWritten = 0;
DecompressedVoiceBuffer.Empty(MAX_UNCOMPRESSED_VOICE_BUFFER_SIZE);
DecompressedVoiceBuffer.AddUninitialized(MAX_UNCOMPRESSED_VOICE_BUFFER_SIZE);
const EVoiceResult VoiceResult = SteamUserPtr->DecompressVoice(Data, *Size, DecompressedVoiceBuffer.GetData(),
DecompressedVoiceBuffer.Num(), &BytesWritten, SteamUserPtr->GetVoiceOptimalSampleRate());
if (VoiceResult != k_EVoiceResultOK)
{
UE_LOG(LogVoiceDecode, Warning, TEXT("SubmitRemoteVoiceData: DecompressVoice failure: VoiceResult: %s"), *SteamVoiceResult(VoiceResult));
*Size = 0;
return E_FAIL;
}
// If there is no data, return
if (BytesWritten <= 0)
{
*Size = 0;
return S_OK;
}
// Generate a streaming wave audio component for voice playback
if (QueuedData->AudioComponent == NULL || QueuedData->AudioComponent->IsPendingKill())
{
if (SerializeHelper == NULL)
{
SerializeHelper = new FVoiceSerializeHelper(this);
}
QueuedData->AudioComponent = CreateVoiceAudioComponent(SteamUserPtr->GetVoiceOptimalSampleRate());
if (QueuedData->AudioComponent)
{
QueuedData->AudioComponent->OnAudioFinishedNative.AddRaw(this, &FVoiceEngineSteam::OnAudioFinished);
//QueuedData->AudioComponent->Play();
}
}
if (QueuedData->AudioComponent != NULL)
{
USoundWaveProcedural* SoundStreaming = CastChecked<USoundWaveProcedural>(QueuedData->AudioComponent->Sound);
if (SoundStreaming->GetAvailableAudioByteCount() == 0)
{
UE_LOG(LogVoiceDecode, Log, TEXT("VOIP audio component was starved!"));
}
SoundStreaming->QueueAudio(DecompressedVoiceBuffer.GetData(), BytesWritten);
QueuedData->AudioComponent->Play(); //moved Play() to come after QueueAudio(...)
}
return S_OK;
}
UE-31605 has been closed out as cannot reproduce however, UE-34081 was created in it’s place for procedural sound wave failing to play when returning 0 bytes in GeneratePCMData callback.
The original bug was closed out as cannot reproduce however, there was another (UE-34081) added which has since been fixed. We expect it to be added into 4.13.
If you feel that there is still an issue, please elaborate further.
Hi , I’ve been looking into fixing this. Procedural sound already has a way of asking a delegate to run when it would otherwise generate 0 bytes:
DECLARE_DELEGATE_TwoParams( FOnSoundWaveProceduralUnderflow, class USoundWaveProcedural*, int32 );
I think the online voice subsystem just needs to be updated to use that. However, I looked into just providing empty data and it seems that will keep the audio component from ever closing, which online voice tries to do to conserve resources. Something more nuanced is probably needed.
I’m so happy to hear that 4.13.0 release has resolved the issue your project was running in to. Please let us know if you have any further questions, thanks!
You reference UE-31605 multiple times in relation to extremely choppy voice chat but that issue only mentions it’s for the NULL online subsystem.
I think it’s important to note people, including the original poster here are noting the spotty/choppy voice chat is affecting Steam Online Subsystem as well.
Perhaps UI-31605 (or a seperate issue) should include that we are experiencing unusable voice chat with Steam Online Subsystem in addition to the NULL online subsystem. Hopefully fixing one fixes the other but it still seems to be an issue as of today.