Add diagnostic logs for Opus codec initialization and audio multicast

- Log at InitOpusCodec: FVoiceModule availability, encoder/decoder creation, net role
- Log at HandleAudioReceived: warn once if encoder is null or role is not Authority
- These fire unconditionally (not behind bDebug) to catch the root cause

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
j.foucher 2026-03-02 14:38:49 +01:00
parent 1990b828a2
commit 5e1c50edf8

View File

@ -638,6 +638,19 @@ void UPS_AI_ConvAgent_ElevenLabsComponent::HandleAudioReceived(const TArray<uint
} }
// Network: Opus-compress and broadcast to all clients before local playback. // Network: Opus-compress and broadcast to all clients before local playback.
if (GetOwnerRole() != ROLE_Authority || !OpusEncoder.IsValid())
{
static bool bWarnedOnce = false;
if (!bWarnedOnce)
{
bWarnedOnce = true;
UE_LOG(LogPS_AI_ConvAgent_ElevenLabs, Warning,
TEXT("[NET-SRV] Cannot multicast audio! Role=%d (need %d=Authority), OpusEncoder=%s, FVoiceModule=%s"),
static_cast<int32>(GetOwnerRole()), static_cast<int32>(ROLE_Authority),
OpusEncoder.IsValid() ? TEXT("VALID") : TEXT("NULL"),
FVoiceModule::IsAvailable() ? TEXT("available") : TEXT("UNAVAILABLE"));
}
}
if (GetOwnerRole() == ROLE_Authority && OpusEncoder.IsValid()) if (GetOwnerRole() == ROLE_Authority && OpusEncoder.IsValid())
{ {
uint32 CompressedSize = static_cast<uint32>(OpusWorkBuffer.Num()); uint32 CompressedSize = static_cast<uint32>(OpusWorkBuffer.Num());
@ -1453,10 +1466,16 @@ void UPS_AI_ConvAgent_ElevenLabsComponent::MulticastAgentStartedGenerating_Imple
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────
void UPS_AI_ConvAgent_ElevenLabsComponent::InitOpusCodec() void UPS_AI_ConvAgent_ElevenLabsComponent::InitOpusCodec()
{ {
if (!FVoiceModule::IsAvailable()) return; if (!FVoiceModule::IsAvailable())
{
UE_LOG(LogPS_AI_ConvAgent_ElevenLabs, Warning,
TEXT("[OPUS] FVoiceModule NOT available — Opus codec disabled. Network audio will NOT work."));
return;
}
FVoiceModule& VoiceModule = FVoiceModule::Get(); FVoiceModule& VoiceModule = FVoiceModule::Get();
if (GetOwnerRole() == ROLE_Authority) const ENetRole Role = GetOwnerRole();
if (Role == ROLE_Authority)
{ {
OpusEncoder = VoiceModule.CreateVoiceEncoder( OpusEncoder = VoiceModule.CreateVoiceEncoder(
PS_AI_ConvAgent_Audio_ElevenLabs::SampleRate, PS_AI_ConvAgent_Audio_ElevenLabs::SampleRate,
@ -1469,6 +1488,12 @@ void UPS_AI_ConvAgent_ElevenLabsComponent::InitOpusCodec()
PS_AI_ConvAgent_Audio_ElevenLabs::Channels); PS_AI_ConvAgent_Audio_ElevenLabs::Channels);
OpusWorkBuffer.SetNumUninitialized(8 * 1024); // 8 KB scratch buffer for Opus encode/decode OpusWorkBuffer.SetNumUninitialized(8 * 1024); // 8 KB scratch buffer for Opus encode/decode
UE_LOG(LogPS_AI_ConvAgent_ElevenLabs, Log,
TEXT("[OPUS] Init complete — Role=%d Encoder=%s Decoder=%s"),
static_cast<int32>(Role),
OpusEncoder.IsValid() ? TEXT("OK") : TEXT("NULL"),
OpusDecoder.IsValid() ? TEXT("OK") : TEXT("NULL"));
} }
// ───────────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────────