XRoom_Unity/Assets/Photon/PhotonVoice/Code/UtilityScripts/SaveOutgoingStreamToFile.cs
2025-05-31 10:20:20 +03:30

91 lines
3.1 KiB
C#

namespace Photon.Voice.Unity.UtilityScripts
{
using UnityEngine;
using System.IO;
[RequireComponent(typeof(Recorder))]
[DisallowMultipleComponent]
public class SaveOutgoingStreamToFile : VoiceComponent
{
private WaveWriter wavWriter;
private void PhotonVoiceCreated(PhotonVoiceCreatedParams photonVoiceCreatedParams)
{
VoiceInfo voiceInfo = photonVoiceCreatedParams.Voice.Info;
string filePath = this.GetFilePath();
if (photonVoiceCreatedParams.Voice is LocalVoiceAudioFloat)
{
this.wavWriter = new WaveWriter(filePath, voiceInfo.SamplingRate, 32, voiceInfo.Channels);
this.Logger.Log(LogLevel.Info, "Outgoing 32 bit stream {0}, output file path: {1}", voiceInfo, filePath);
LocalVoiceAudioFloat localVoiceAudioFloat = photonVoiceCreatedParams.Voice as LocalVoiceAudioFloat;
localVoiceAudioFloat.AddPostProcessor(new OutgoingStreamSaverFloat(this.wavWriter));
}
else if (photonVoiceCreatedParams.Voice is LocalVoiceAudioShort)
{
this.wavWriter = new WaveWriter(filePath, voiceInfo.SamplingRate, 16, voiceInfo.Channels);
this.Logger.Log(LogLevel.Info, "Outgoing 16 bit stream {0}, output file path: {1}", voiceInfo, filePath);
LocalVoiceAudioShort localVoiceAudioShort = photonVoiceCreatedParams.Voice as LocalVoiceAudioShort;
localVoiceAudioShort.AddPostProcessor(new OutgoingStreamSaverShort(this.wavWriter));
}
}
private string GetFilePath()
{
string filename = string.Format("out_{0}_{1}.wav", System.DateTime.UtcNow.ToString("yyyy-MM-dd_HH-mm-ss-ffff"), Random.Range(0, 1000));
return Path.Combine(Application.persistentDataPath, filename);
}
private void PhotonVoiceRemoved()
{
this.wavWriter.Dispose();
this.Logger.Log(LogLevel.Info, "Recording stopped: Saving wav file.");
}
class OutgoingStreamSaverFloat : IProcessor<float>
{
private WaveWriter wavWriter;
public OutgoingStreamSaverFloat(WaveWriter waveWriter)
{
this.wavWriter = waveWriter;
}
public float[] Process(float[] buf)
{
this.wavWriter.WriteSamples(buf, 0, buf.Length);
return buf;
}
public void Dispose()
{
this.wavWriter.Dispose();
}
}
class OutgoingStreamSaverShort : IProcessor<short>
{
private WaveWriter wavWriter;
public OutgoingStreamSaverShort(WaveWriter waveWriter)
{
this.wavWriter = waveWriter;
}
public short[] Process(short[] buf)
{
for (int i = 0; i < buf.Length; i++)
{
this.wavWriter.Write(buf[i]);
}
return buf;
}
public void Dispose()
{
this.wavWriter.Dispose();
}
}
}
}