clean project
This commit is contained in:
126
Assets/Oculus/Platform/Scripts/BufferedAudioStream.cs
Normal file
126
Assets/Oculus/Platform/Scripts/BufferedAudioStream.cs
Normal file
@@ -0,0 +1,126 @@
|
||||
//#define VERBOSE_LOGGING
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System;
|
||||
|
||||
using Oculus.Platform;
|
||||
|
||||
public class BufferedAudioStream {
|
||||
const bool VerboseLogging = false;
|
||||
AudioSource audio;
|
||||
|
||||
float[] audioBuffer;
|
||||
int writePos;
|
||||
|
||||
const float bufferLengthSeconds = 0.25f;
|
||||
const int sampleRate = 48000;
|
||||
const int bufferSize = (int)(sampleRate * bufferLengthSeconds);
|
||||
const float playbackDelayTimeSeconds = 0.05f;
|
||||
|
||||
float playbackDelayRemaining;
|
||||
float remainingBufferTime;
|
||||
|
||||
public BufferedAudioStream(AudioSource audio) {
|
||||
audioBuffer = new float[bufferSize];
|
||||
this.audio = audio;
|
||||
|
||||
audio.loop = true;
|
||||
audio.clip = AudioClip.Create("", bufferSize, 1, sampleRate, false);
|
||||
|
||||
Stop();
|
||||
}
|
||||
|
||||
public void Update () {
|
||||
|
||||
if(remainingBufferTime > 0)
|
||||
{
|
||||
#if VERBOSE_LOGGING
|
||||
Debug.Log(string.Format("current time: {0}, remainingBufferTime: {1}", Time.time, remainingBufferTime));
|
||||
#endif
|
||||
|
||||
if (!audio.isPlaying && remainingBufferTime > playbackDelayTimeSeconds)
|
||||
{
|
||||
playbackDelayRemaining -= Time.deltaTime;
|
||||
if (playbackDelayRemaining <= 0)
|
||||
{
|
||||
#if VERBOSE_LOGGING
|
||||
Debug.Log("Starting playback");
|
||||
#endif
|
||||
audio.Play();
|
||||
}
|
||||
}
|
||||
|
||||
if (audio.isPlaying)
|
||||
{
|
||||
remainingBufferTime -= Time.deltaTime;
|
||||
if (remainingBufferTime < 0)
|
||||
{
|
||||
remainingBufferTime = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (remainingBufferTime <= 0)
|
||||
{
|
||||
if (audio.isPlaying)
|
||||
{
|
||||
Debug.Log("Buffer empty, stopping " + DateTime.Now);
|
||||
Stop();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (writePos != 0)
|
||||
{
|
||||
Debug.LogError("writePos non zero while not playing, how did this happen?");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Stop()
|
||||
{
|
||||
audio.Stop();
|
||||
audio.time = 0;
|
||||
writePos = 0;
|
||||
playbackDelayRemaining = playbackDelayTimeSeconds;
|
||||
}
|
||||
|
||||
public void AddData(float[] samples) {
|
||||
int remainingWriteLength = samples.Length;
|
||||
|
||||
if(writePos > audioBuffer.Length) {
|
||||
throw new Exception();
|
||||
}
|
||||
|
||||
do {
|
||||
int writeLength = remainingWriteLength;
|
||||
int remainingSpace = audioBuffer.Length - writePos;
|
||||
|
||||
if(writeLength > remainingSpace) {
|
||||
writeLength = remainingSpace;
|
||||
}
|
||||
|
||||
Array.Copy(samples, 0, audioBuffer, writePos, writeLength);
|
||||
|
||||
remainingWriteLength -= writeLength;
|
||||
writePos += writeLength;
|
||||
if(writePos > audioBuffer.Length) {
|
||||
throw new Exception();
|
||||
}
|
||||
if(writePos == audioBuffer.Length) {
|
||||
writePos = 0;
|
||||
}
|
||||
} while(remainingWriteLength > 0);
|
||||
|
||||
#if VERBOSE_LOGGING
|
||||
float prev = remainingBufferTime;
|
||||
#endif
|
||||
remainingBufferTime += (float)samples.Length / sampleRate;
|
||||
#if VERBOSE_LOGGING
|
||||
Debug.Log(string.Format("previous remaining: {0}, new remaining: {1}, added {2} samples", prev, remainingBufferTime, samples.Length));
|
||||
#endif
|
||||
audio.clip.SetData(audioBuffer, 0);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user