using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.MagicLeap.Native;
namespace UnityEngine.XR.MagicLeap
{
public partial class MLAudioPlayback
{
protected static MLAudioPlayback Instance
{
get
{
if (instance == null)
{
instance = new MLAudioPlayback();
MLThreadDispatch.ScheduleMain(() => instance.outputSampleRate = (uint)AudioSettings.outputSampleRate);
}
return instance;
}
}
private static MLAudioPlayback instance;
private const uint OutputSampleSize = sizeof(short);
private const uint BitsPerOutputSample = OutputSampleSize * 8;
private const float MaxOutputPitch = 1.0f;
private const uint DefaultCacheDurationInSeconds = 4;
private uint cacheDurationInSeconds;
private uint outputBufferSizeInBytes;
private uint outputSampleRate;
private uint outputChannels;
private bool isStarted;
private bool bufferCreated;
public static void CreateAudioBuffer() => Instance.CreateAudioBufferInternal(DefaultCacheDurationInSeconds);
public static void CreateAudioBuffer(uint cacheDurationInSeconds) => Instance.CreateAudioBufferInternal(cacheDurationInSeconds);
public static void DestroyAudioBuffer() => Instance.DestroyAudioBufferInternal();
public static void SubmitBuffer(float[] data, int channels) => Instance.SubmitBufferInternal(data, channels);
private void CreateAudioBufferInternal(uint cacheDurationInSeconds)
{
if (!isStarted)
{
#if UNITY_EDITOR
this.cacheDurationInSeconds = cacheDurationInSeconds;
NativeBindings.CreateAudioOutput();
this.bufferCreated = false;
this.isStarted = true;
#endif
}
}
private void DestroyAudioBufferInternal()
{
#if UNITY_EDITOR
NativeBindings.DestroyAudioOutput();
isStarted = false;
#endif
}
private void SubmitBufferInternal(float[] data, int channels)
{
#if UNITY_EDITOR
if (!this.isStarted)
{
return;
}
if (!bufferCreated)
{
this.outputChannels = (uint)channels;
this.outputBufferSizeInBytes = ((uint)data.Length * OutputSampleSize);
NativeBindings.CreateOutputBuffer(this.outputBufferSizeInBytes, this.outputChannels, this.outputSampleRate, BitsPerOutputSample, BitsPerOutputSample, MaxOutputPitch, this.cacheDurationInSeconds);
bufferCreated = true;
}
NativeBindings.OnUnityAudio(data, (uint)data.Length);
#if UNITY_EDITOR
if (MagicLeapXrProvider.IsZIRunning)
{
#endif
for (int i = 0; i < data.Length; ++i)
data[i] = 0;
#if UNITY_EDITOR
}
#endif
#endif
}
}
}