From 226b8cfc6f3dd0e7c8628f08664361503a9a61fe Mon Sep 17 00:00:00 2001 From: Stephen Hodgson Date: Sat, 18 Jan 2025 19:04:26 -0500 Subject: [PATCH] fix output sample rate --- .../AbstractStreamRecordingBehaviour.cs | 22 ++--------- .../com.utilities.audio/Runtime/PCMEncoder.cs | 5 ++- .../Runtime/RecordingManager.cs | 38 +------------------ 3 files changed, 8 insertions(+), 57 deletions(-) diff --git a/Utilities.Audio/Packages/com.utilities.audio/Runtime/AbstractStreamRecordingBehaviour.cs b/Utilities.Audio/Packages/com.utilities.audio/Runtime/AbstractStreamRecordingBehaviour.cs index 01fec5e..c69bded 100644 --- a/Utilities.Audio/Packages/com.utilities.audio/Runtime/AbstractStreamRecordingBehaviour.cs +++ b/Utilities.Audio/Packages/com.utilities.audio/Runtime/AbstractStreamRecordingBehaviour.cs @@ -51,7 +51,6 @@ public enum SampleRates #endif private readonly ConcurrentQueue sampleQueue = new(); - private FileStream fileStream; private void OnValidate() { @@ -91,7 +90,7 @@ private void Update() { if (RecordingManager.IsRecording) { - EndRecording(); + RecordingManager.EndRecording(); } else { @@ -106,44 +105,29 @@ private void Update() UnityEngine.Debug.Log($"playback sample rate: {playbackSampleRate}"); } - // write to a file - fileStream = new FileStream($"{Application.dataPath}/{DateTime.UtcNow:yy-MM-dd-ss}-recording.raw", FileMode.Create, FileAccess.Write, FileShare.Read); - // ReSharper disable once MethodHasAsyncOverload RecordingManager.StartRecordingStream(BufferCallback, recordingSampleRate, destroyCancellationToken); async Task BufferCallback(ReadOnlyMemory bufferCallback) { - await fileStream.WriteAsync(bufferCallback, destroyCancellationToken); - var samples = PCMEncoder.Decode(bufferCallback.ToArray(), inputSampleRate: recordingSampleRate, outputSampleRate: playbackSampleRate); foreach (var sample in samples) { sampleQueue.Enqueue(sample); } + + await Task.Yield(); } } } } } - private void EndRecording() - { - if (RecordingManager.IsRecording) - { - RecordingManager.EndRecording(); - } - - fileStream?.Dispose(); - fileStream = null; - } - #if !UNITY_2022_1_OR_NEWER private void OnDestroy() { lifetimeCancellationTokenSource.Cancel(); - EndRecording(); } #endif } diff --git a/Utilities.Audio/Packages/com.utilities.audio/Runtime/PCMEncoder.cs b/Utilities.Audio/Packages/com.utilities.audio/Runtime/PCMEncoder.cs index 7345a74..f3fe582 100644 --- a/Utilities.Audio/Packages/com.utilities.audio/Runtime/PCMEncoder.cs +++ b/Utilities.Audio/Packages/com.utilities.audio/Runtime/PCMEncoder.cs @@ -453,6 +453,7 @@ async Task BufferCallback(ReadOnlyMemory buffer) var lastMicrophonePosition = 0; var inputBufferSize = clipData.InputBufferSize; var sampleBuffer = new float[inputBufferSize]; + var sampleBufferLength = sampleBuffer.Length; var outputSamples = new float[inputBufferSize]; do @@ -494,7 +495,7 @@ async Task BufferCallback(ReadOnlyMemory buffer) { sampleProvider.GetData(clipData.Clip, sampleBuffer); - for (var i = 0; i < sampleBuffer.Length; i++) + for (var i = 0; i < sampleBufferLength; i++) { if (i < samplesToWrite) { @@ -511,7 +512,7 @@ async Task BufferCallback(ReadOnlyMemory buffer) try { - await bufferCallback(Encode(Resample(outputSamples, null, clipData.InputSampleRate, clipData.OutputSampleRate), null, 0, samplesToWrite)).ConfigureAwait(false); + await bufferCallback(Encode(outputSamples, null, 0, samplesToWrite)).ConfigureAwait(false); } catch (Exception e) { diff --git a/Utilities.Audio/Packages/com.utilities.audio/Runtime/RecordingManager.cs b/Utilities.Audio/Packages/com.utilities.audio/Runtime/RecordingManager.cs index 2f8bd62..1503e9c 100644 --- a/Utilities.Audio/Packages/com.utilities.audio/Runtime/RecordingManager.cs +++ b/Utilities.Audio/Packages/com.utilities.audio/Runtime/RecordingManager.cs @@ -220,25 +220,8 @@ public static async Task> StartRecordingAsync Debug.Log($"[{nameof(RecordingManager)}] Recording device(s): {deviceName} | minFreq: {minFreq} | maxFreq {maxFreq}"); } - var inputSampleRate = outputSampleRate; - - if (inputSampleRate <= minFreq) - { - inputSampleRate = minFreq; - } - - if (inputSampleRate >= maxFreq) - { - inputSampleRate = maxFreq; - } - - if (EnableDebug && inputSampleRate != outputSampleRate) - { - Debug.LogWarning($"[{nameof(RecordingManager)}] device frequency range is outside of the requested output sample range. Clip will be resampled: {inputSampleRate}->{outputSampleRate}"); - } - // create dummy clip for recording purposes with a 1-second buffer. - var clip = Microphone.Start(DefaultRecordingDevice, loop: true, length: 1, inputSampleRate); + var clip = Microphone.Start(DefaultRecordingDevice, loop: true, length: 1, outputSampleRate); if (clip == null) { @@ -361,25 +344,8 @@ public static async Task StartRecordingStreamAsync(Func= maxFreq) - { - inputSampleRate = maxFreq; - } - - if (EnableDebug && inputSampleRate != outputSampleRate) - { - Debug.LogWarning($"[{nameof(RecordingManager)}] device frequency range is outside of the requested output sample range. Clip will be resampled: {inputSampleRate}->{outputSampleRate}"); - } - // create dummy clip for recording purposes with a 1-second buffer. - var clip = Microphone.Start(DefaultRecordingDevice, loop: true, length: 1, inputSampleRate); + var clip = Microphone.Start(DefaultRecordingDevice, loop: true, length: 1, outputSampleRate); if (clip == null) {