Skip to content

Commit d624f0b

Browse files
committed
merging the buffers togather
1 parent 9175596 commit d624f0b

12 files changed

Lines changed: 493 additions & 520 deletions

File tree

Basis/Packages/com.basis.framework.editor/Editor/BasisRemoteAudioDebugWindow.cs

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -225,64 +225,59 @@ private void DrawVolumeChain(BasisAudioReceiver audio)
225225

226226
private void DrawRingBuffer(BasisAudioReceiver audio)
227227
{
228-
EditorGUILayout.LabelField("Ring Buffer (Voice)", EditorStyles.boldLabel);
228+
EditorGUILayout.LabelField("Decoded PCM Queue", EditorStyles.boldLabel);
229229

230-
BasisVoiceRingBuffer ring = audio.InOrderRead;
231-
if (ring == null)
230+
BasisVoiceBuffer buf = audio.VoiceBuffer;
231+
if (buf == null)
232232
{
233-
EditorGUILayout.LabelField("Ring Buffer", "NULL");
233+
EditorGUILayout.LabelField("Voice Buffer", "NULL");
234234
return;
235235
}
236236

237-
int ringCount = ring.Count;
238-
int ringCap = ring.Capacity;
239-
float fillPct = ringCap > 0 ? (float)ringCount / ringCap : 0f;
240-
float bufferedMs = ringCount * 1000f / RemoteOpusSettings.NetworkSampleRate;
237+
int frames = buf.DecodedFrameCount;
238+
int cap = buf.DecodedFrameCapacity;
239+
float fillPct = cap > 0 ? (float)frames / cap : 0f;
240+
int samples = buf.SampleCount;
241+
float bufferedMs = samples * 1000f / RemoteOpusSettings.NetworkSampleRate;
241242

242-
StatusLabel("Has Real Audio", ring.HasRealAudio);
243+
StatusLabel("Has Real Audio", buf.HasRealAudio);
243244

244245
EditorGUILayout.BeginHorizontal();
245246
EditorGUILayout.LabelField("Fill Level", GUILayout.Width(EditorGUIUtility.labelWidth));
246247
Rect fillBar = GUILayoutUtility.GetRect(0, 16, GUILayout.ExpandWidth(true));
247-
Color fillColor = ring.IsFull ? ErrorColor : fillPct > 0.8f ? WarnColor : BarColor;
248-
DrawBar(fillBar, fillPct, $"{ringCount}/{ringCap} ({fillPct:P0})", fillColor);
248+
Color fillColor = frames >= cap ? ErrorColor : fillPct > 0.8f ? WarnColor : BarColor;
249+
DrawBar(fillBar, fillPct, $"{frames}/{cap} frames ({fillPct:P0})", fillColor);
249250
EditorGUILayout.EndHorizontal();
250251

251252
EditorGUILayout.LabelField("Buffered Audio", $"{bufferedMs:F1}ms");
252-
EditorGUILayout.LabelField("State", ring.IsEmpty ? "EMPTY" : ring.IsFull ? "FULL (overwriting!)" : "Streaming");
253-
254-
if (ring.IsFull)
255-
{
256-
EditorGUILayout.HelpBox("Ring buffer is FULL - audio is being overwritten. Consumer can't keep up.", MessageType.Error);
257-
}
258-
else if (ring.IsEmpty && ring.HasRealAudio)
259-
{
260-
EditorGUILayout.HelpBox("Buffer empty but HasRealAudio flag set - possible underrun.", MessageType.Warning);
261-
}
253+
string state = buf.IsEmpty ? "EMPTY" : frames >= cap ? "FULL" : "Streaming";
254+
EditorGUILayout.LabelField("State", state);
255+
EditorGUILayout.LabelField("PLC Count", audio.PlcCount.ToString());
256+
EditorGUILayout.LabelField("Silence Skipped", audio.SilenceInjectedCount.ToString());
262257
}
263258

264259
private void DrawJitterBuffer(BasisAudioReceiver audio)
265260
{
266-
EditorGUILayout.LabelField("Jitter Buffer", EditorStyles.boldLabel);
261+
EditorGUILayout.LabelField("Encoded Packets (Jitter)", EditorStyles.boldLabel);
267262

268-
BasisJitterBuffer jitter = audio.JitterBuffer;
269-
if (jitter == null)
263+
BasisVoiceBuffer buf = audio.VoiceBuffer;
264+
if (buf == null)
270265
{
271-
EditorGUILayout.LabelField("Jitter Buffer", "NULL");
266+
EditorGUILayout.LabelField("Voice Buffer", "NULL");
272267
return;
273268
}
274269

275-
StatusLabel("Started", jitter.Started);
270+
StatusLabel("Started", buf.Started);
276271

277-
int buffered = jitter.BufferedCount;
278-
int received = jitter.ReceivedSinceStart;
279-
int initDepth = jitter.InitialBufferDepth;
272+
int buffered = buf.EncodedBufferedCount;
273+
int received = buf.ReceivedSinceStart;
274+
int initDepth = buf.InitialBufferDepth;
280275

281276
EditorGUILayout.LabelField("Buffered Packets", buffered.ToString());
282277
EditorGUILayout.LabelField("Received Since Start", received.ToString());
283278
EditorGUILayout.LabelField("Initial Depth Required", initDepth.ToString());
284279

285-
if (jitter.Started)
280+
if (buf.Started)
286281
{
287282
if (received < initDepth)
288283
{

Basis/Packages/com.basis.framework/BasisUI/Menus/Main Menu Providers/IndividualPlayerPanelUpdater.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -225,59 +225,59 @@ private void UpdateAudioDebugFields()
225225
AudioSource src = audio.audioSource;
226226
float srcVol = src != null ? src.volume : 0f;
227227
float dampen = audio.DirectionalDampeningMultiplier;
228-
float mainVol = SMModuleAudio.ActiveMainVolume;
229-
float effective = srcVol * dampen * mainVol;
228+
float listenerVol = AudioListener.volume;
229+
float effective = srcVol * dampen * listenerVol;
230230

231231
string dampenNote = dampen < 0.5f ? " (BEHIND)" : dampen < 1f ? " (off-axis)" : "";
232232
string warning = effective < 0.01f && srcVol > 0f ? "\nWARNING: Near zero!" : "";
233233

234234
VolumeChainField.SetDescription(
235-
$"Source: {srcVol:F2} x Dampen: {dampen:F3}{dampenNote} x Main: {mainVol:F2}\n" +
235+
$"Source: {srcVol:F2} x Dampen: {dampen:F3}{dampenNote} x Listener: {listenerVol:F2}\n" +
236236
$"Effective: {effective:F3}{warning}");
237237
}
238238

239-
// Ring Buffer
239+
// Voice Buffer (combined jitter + decoded)
240240
if (RingBufferField != null && BasisSettingsDefaults.AudioDebugShowRingBuffer.RawValue)
241241
{
242-
BasisVoiceRingBuffer ring = audio.InOrderRead;
243-
if (ring != null)
242+
BasisVoiceBuffer buf = audio.VoiceBuffer;
243+
if (buf != null)
244244
{
245-
int count = ring.Count;
246-
int cap = ring.Capacity;
247-
float pct = cap > 0 ? (count * 100f / cap) : 0f;
248-
float ms = count * 1000f / RemoteOpusSettings.NetworkSampleRate;
249-
string state = ring.IsEmpty ? "EMPTY" : ring.IsFull ? "FULL (overwriting!)" : "Streaming";
245+
int frames = buf.DecodedFrameCount;
246+
int cap = buf.DecodedFrameCapacity;
247+
int samples = buf.SampleCount;
248+
float ms = samples * 1000f / RemoteOpusSettings.NetworkSampleRate;
249+
string state = buf.IsEmpty ? "EMPTY" : frames >= cap ? "FULL" : "Streaming";
250250

251251
RingBufferField.SetDescription(
252-
$"Samples: {count}/{cap} ({pct:F0}%) | {ms:F1}ms buffered\n" +
253-
$"Real Audio: {(ring.HasRealAudio ? "Yes" : "No")} | State: {state}");
252+
$"Frames: {frames}/{cap} | {ms:F1}ms buffered\n" +
253+
$"Real Audio: {(buf.HasRealAudio ? "Yes" : "No")} | State: {state}");
254254
}
255255
else
256256
{
257-
RingBufferField.SetDescription("Ring Buffer: NULL");
257+
RingBufferField.SetDescription("Voice Buffer: NULL");
258258
}
259259
}
260260

261-
// Jitter Buffer
262261
if (JitterBufferField != null && BasisSettingsDefaults.AudioDebugShowJitter.RawValue)
263262
{
264-
BasisJitterBuffer jitter = audio.JitterBuffer;
265-
if (jitter != null)
263+
BasisVoiceBuffer buf = audio.VoiceBuffer;
264+
if (buf != null)
266265
{
267-
int buffered = jitter.BufferedCount;
268-
int received = jitter.ReceivedSinceStart;
269-
int depth = jitter.InitialBufferDepth;
270-
string status = !jitter.Started ? "Not started"
266+
int buffered = buf.EncodedBufferedCount;
267+
int received = buf.ReceivedSinceStart;
268+
int depth = buf.InitialBufferDepth;
269+
string status = !buf.Started ? "Not started"
271270
: received < depth ? $"FILLING ({received}/{depth})"
272271
: "Playing";
273272

274273
JitterBufferField.SetDescription(
275-
$"Started: {(jitter.Started ? "Yes" : "No")} | Buffered: {buffered} | Received: {received}\n" +
276-
$"Init Depth: {depth} | Status: {status}");
274+
$"Started: {(buf.Started ? "Yes" : "No")} | Buffered: {buffered} | Received: {received}\n" +
275+
$"Init Depth: {depth} | Status: {status}\n" +
276+
$"PLC: {audio.PlcCount} | Silence Skipped: {audio.SilenceInjectedCount}");
277277
}
278278
else
279279
{
280-
JitterBufferField.SetDescription("Jitter Buffer: NULL");
280+
JitterBufferField.SetDescription("Voice Buffer: NULL");
281281
}
282282
}
283283

Basis/Packages/com.basis.framework/BasisUI/Menus/Main Menu Providers/SettingsProviderParts/SettingsProviderAdminTab.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Collections.Generic;
77
using TMPro;
88
using UnityEngine;
9+
using UnityEngine.UI;
910

1011
namespace Basis.BasisUI
1112
{
@@ -482,6 +483,7 @@ public void RebuildPlayerList()
482483
}
483484

484485
ApplyFilter();
486+
LayoutRebuilder.ForceRebuildLayoutImmediate(PlayerListParent);
485487
}
486488

487489
private void ApplyFilter()

Basis/Packages/com.basis.framework/Drivers/Common/BasisOpenLipSyncContext.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ public void ProcessAudioSamples(float[] data, int channels, int length)
152152
{
153153
dstArr[w] = data[s];
154154
w++;
155-
if (w >= cap) w = 0;
155+
if (w >= cap)
156+
{
157+
w = 0;
158+
}
156159
}
157160
}
158161

Basis/Packages/com.basis.framework/Drivers/Remote/BasisRemoteAudioDriver.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ public class BasisRemoteAudioDriver : MonoBehaviour
1616
/// <summary>
1717
/// Viseme (lip-sync) analysis driver processing audio samples each frame.
1818
/// </summary>
19-
[SerializeReference] public BasisAudioAndVisemeDriver BasisAudioAndVisemeDriver = null;
19+
[SerializeReference]
20+
public BasisAudioAndVisemeDriver BasisAudioAndVisemeDriver = new BasisAudioAndVisemeDriver();
2021

2122
/// <summary>
2223
/// Remote audio receiver that decodes and mixes network voice.
2324
/// </summary>
24-
[SerializeReference] public BasisAudioReceiver BasisAudioReceiver = null;
25+
[SerializeReference]
26+
public BasisAudioReceiver BasisAudioReceiver = new BasisAudioReceiver();
2527

2628
/// <summary>
2729
/// Optional callback invoked after audio is processed:
@@ -45,8 +47,8 @@ private void OnAudioFilterRead(float[] data, int channels)
4547
if (Initalized)
4648
{
4749
int length = data.Length;
48-
BasisAudioReceiver?.OnAudioFilterRead(data, channels, length);
49-
BasisAudioAndVisemeDriver?.ProcessAudioSamples(data, channels, length);
50+
BasisAudioReceiver.OnAudioFilterRead(data, channels, length);
51+
BasisAudioAndVisemeDriver.ProcessAudioSamples(data, channels, length);
5052
AudioData?.Invoke(data, channels);
5153
}
5254
}

0 commit comments

Comments
 (0)