Exemple #1
0
 public void ClearBuffer()
 {
     lock (SampleQueue)
     {
         SampleQueue.Clear();
     }
 }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
            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;
                    }
                }
            }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
            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;
                }
            }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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));
        }