public void ClearBuffer() { lock (SampleQueue) { SampleQueue.Clear(); } }
public int Read(byte[] buffer, int offset, int count) { if (count < 1) { return(0); } var writeCount = 0; var lastWriteSampleCount = 0; var lastSamples = new double[0]; using (var ms = new MemoryStream(buffer)) { if (RemainSample.Length > 0) { lastWriteSampleCount = WriteSample(ms, RemainSample); writeCount += lastWriteSampleCount * BytePerSample * 2; lastSamples = RemainSample; } else { while (writeCount < count) { lock (SampleQueue) { if (SampleQueue.Count < 1) { break; } var samples = SampleQueue.First(); SampleQueue.RemoveFirst(); lastWriteSampleCount = WriteSample(ms, samples); writeCount += lastWriteSampleCount * BytePerSample * 2; lastSamples = samples; } } } } if (writeCount >= count && lastWriteSampleCount < lastSamples.Length - 1) { RemainSample = new double[lastSamples.Length - lastWriteSampleCount - 1]; Buffer.BlockCopy(lastSamples, (lastWriteSampleCount + 1) * DoubleSize, RemainSample, 0, RemainSample.Length * DoubleSize); } else { RemainSample = new double[0]; } if (writeCount < count) { Array.Clear(buffer, offset + writeCount, count - writeCount); } return(count); }
public void GivenTwoItems_EnQueue_LengthShouldBeTwo() { //Arrange var size = 5; var sampleQueue = new SampleQueue(size); //Act sampleQueue.EnQueue(1); sampleQueue.EnQueue(2); //Assert Assert.AreEqual(2, sampleQueue.Length); }
public void Enqueue(SampleQueue queue) { if (queue.last != null) { queue.last.next = head.next; head.next = queue.head.next; if (last == null) { last = queue.last; } } }
public void AddSamples(double[] samples) { var windowedSample = new double[samples.Length]; for (var i = 0; i < samples.Length; i++) { windowedSample[i] = samples[i] * GetSampleWindow(samples.Length, i); } lock (SampleQueue) { SampleQueue.AddLast(windowedSample); } }
public void GivenQueueWithFullCapacity_EnQueue_ThrowsOverflowException() { //Arrange var size = 5; var sampleQueue = new SampleQueue(size); sampleQueue.EnQueue(1); sampleQueue.EnQueue(2); sampleQueue.EnQueue(3); sampleQueue.EnQueue(4); sampleQueue.EnQueue(5); //Act Action action = () => sampleQueue.EnQueue(6); //Assert Assert.ThrowsException <OverflowException>(action); }
public void TrimAndKeepDiscarded(SampleQueue refQueue) { BufferedSample sample = null; BufferedSample discardedSample; refQueue.Clear(); while (head.next != null && head.next.shouldBeRemoved) { discardedSample = head.next; discardedSample.shouldBeRemoved = false; head.next = discardedSample.next; refQueue.Enqueue(discardedSample); //enqueue cached because enqueuing might set next to null if is last } if (head.next != null) { sample = head.next; while (sample.next != null) { if (sample.next.shouldBeRemoved) { discardedSample = sample.next; discardedSample.shouldBeRemoved = false; sample.next = discardedSample.next; refQueue.Enqueue(discardedSample); //enqueue cached because enqueuing might set next to null if is last } else { sample = sample.next; } } } if (head.next == null) { last = null; } else { last = sample; } }
public void GivenQueueWithLengthFive_DeQueue_TwoItems_LengthShouldBeThree() { //Arrange var size = 5; var sampleQueue = new SampleQueue(size); sampleQueue.EnQueue(1); sampleQueue.EnQueue(2); sampleQueue.EnQueue(3); sampleQueue.EnQueue(4); sampleQueue.EnQueue(5); //Act sampleQueue.DeQueue(); sampleQueue.DeQueue(); //Assert Assert.AreEqual(3, sampleQueue.Length); }
public void GivenQueueWithLengthThree_DeQueue_FourItems_ThrowsIndexOutOfRangeException() { //Arrange var size = 3; var sampleQueue = new SampleQueue(size); sampleQueue.EnQueue(1); sampleQueue.EnQueue(2); sampleQueue.EnQueue(3); //Act sampleQueue.DeQueue(); sampleQueue.DeQueue(); sampleQueue.DeQueue(); Action action = () => sampleQueue.DeQueue(); //Assert Assert.ThrowsException <IndexOutOfRangeException>(action); }
void Awake() { AudioSource audio = GetComponent <AudioSource>(); audio.playOnAwake = false; #if UNITY_5 if (audio.clip != null) { audio.clip = null; #if GAT_DEBUG Debug.LogWarning("As of Unity 5, GATPlayer's AudioSource's clip should be null"); #endif } #else if (GATManager.UniqueInstance.SupportedSampleRates == GATManager.SampleRatesSupport.All) { if (audio.clip == null || audio.clip.frequency != GATInfo.OutputSampleRate) { if (audio.clip != null) { #if UNITY_EDITOR if (Application.isPlaying) { Destroy(audio.clip); } else { DestroyImmediate(audio.clip); } #else Destroy(audio.clip); #endif } audio.clip = AudioClip.Create("G-Audio", 1, GATInfo.NbOfChannels, GATInfo.OutputSampleRate, true, false); } } else { if (GATInfo.OutputSampleRate != 44100) { Debug.LogError("Supported sample rate setting is set to Only44100, but current output sample rate is " + GATInfo.OutputSampleRate + ". Disabling player."); this.enabled = false; } else if (audio.clip != null) { #if UNITY_EDITOR if (Application.isPlaying) { Destroy(audio.clip); } else { DestroyImmediate(audio.clip); } #else Destroy(audio.clip); #endif } } #endif // ************** Initialize serialized objects only if needed ************** if (_FiltersHandler == null) { InitFilters(); } if (_tracks == null) { _tracks = new List <GATTrack> (4); } // ************** Initialize transient objects always ************** _scheduledSamples = new SampleQueue(); _samplesToEnqueue = new SampleQueue(); _discardedSamples = new SampleQueue(); _playingSamples = new PlayingSamplesQueue(this); _pool = new Stack <BufferedSample>(30); int i; for (i = 0; i < 30; i++) { _pool.Push(new BufferedSample()); } _audioThreadStreamProxy = new GATAudioThreadStreamProxy(GATInfo.AudioBufferSizePerChannel, GATInfo.NbOfChannels, GATAudioBuffer.AudioBufferPointer, 0, ("GATPlayer " + gameObject.name)); }