/// <summary>
        /// Is called when a buffer is completly read and can be freed up
        /// </summary>
        private void HandleBufferCompleted(object sender, BufferCompletedEventArgs e)
        {
            _queuedBufferCount--;
            IntPtr buf = e.IntPtrBuffer;

            foreach (var buffer in _outputBuffers)
            {
                if (buffer.Buffer != buf)
                {
                    continue;
                }

                // free Buffer
                buffer.PacketDescriptions.Clear();
                buffer.CurrentOffset = 0;
                lock (buffer)
                {
                    buffer.IsInUse = false;
                    Monitor.Pulse(buffer);
                }
            }

            if (_queuedBufferCount == 0 || _audioPlayerState == AudioPlayerState.Stopping)
            {
                Console.WriteLine($"{nameof(HandleBufferCompleted)} when playerState stopping");
                SetAudioPlayerStatus(AudioPlayerState.Stopped);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Is called when a buffer is completly read and can be freed up
        /// </summary>
        void HandleBufferCompleted(object sender, BufferCompletedEventArgs e)
        {
            queuedBufferCount--;
            IntPtr buf = e.IntPtrBuffer;

            foreach (var buffer in outputBuffers)
            {
                if (buffer.Buffer != buf)
                {
                    continue;
                }

                // free Buffer
                buffer.PacketDescriptions.Clear();
                buffer.CurrentOffset = 0;
                lock (buffer) {
                    buffer.IsInUse = false;
                    Monitor.Pulse(buffer);
                }
            }

            if (queuedBufferCount == 0 && Finished != null)
            {
                Finished(this, new EventArgs());
            }
        }
Esempio n. 3
0
        private void OutputQueue_BufferCompleted(object sender, BufferCompletedEventArgs e)
        {
            var index = Buffers.FindIndex((x) => x.Data == e.IntPtrBuffer);
            var buf   = Buffers[index];

            lock (buf)
            {
                buf.IsInUse = false;
            }
            Interlocked.Decrement(ref BufReadyNum);

            if (BufReadyNum < MIN_READY_BUF)
            {
                OutputQueue.Pause();
            }
        }
Esempio n. 4
0
        private void OnStreamingAudioPeriodicNotification(object sender, BufferCompletedEventArgs args)
#endif
        {
            //nextBeat refers to the next beat to generate - the current beat is the one before nextBeat
            int currentBeat = ((nextBeat - 1) + song.BeatCount) % song.BeatCount;

            //Call the BeatStarted callback on a separate thread
            BeatStarted?.BeginInvoke(currentBeat, false, null, null);

            //Mix the audio data for this beat
            short[] data = MixBeat(song.NotesAtBeat(nextBeat));

            //Make sure the track isnt disposed of after we check if it's playing
            lock (trackDisposedOfSyncObject)
            {
                if (IsPlaying)
                {
#if __ANDROID__
                    //Add the audio data to the track
                    playingTrack.Write(data, 0, data.Length);
#endif
#if __IOS__
                    //Copy the audio data to the buffer passed in to this method
                    unsafe
                    {
                        fixed(short *beatData = data)
                        {
                            args.UnsafeBuffer->CopyToAudioData((IntPtr)beatData, data.Length * 2);
                        }
                    }
                    //Add the buffer to the audio queue
                    audioQueue.EnqueueBuffer(args.IntPtrBuffer, data.Length * 2, null);
#endif
                }
            }

            nextBeat = (nextBeat + 1) % song.BeatCount;
        }
 void HandleBufferCompleted(object sender, BufferCompletedEventArgs e)
 {
     audioQueue.FreeBuffer(e.IntPtrBuffer);
 }
Esempio n. 6
0
 void OnBufferCompleted(object sender, BufferCompletedEventArgs e)
 {
     oaq.FreeBuffer(e.IntPtrBuffer);
 }
		void HandleBufferCompleted (object sender, BufferCompletedEventArgs e)
		{
			audioQueue.FreeBuffer (e.IntPtrBuffer);
		}
Esempio n. 8
0
		/// <summary>
		/// Is called when a buffer is completly read and can be queued for re-use
		/// </summary>
		void HandleBufferCompleted (object sender, BufferCompletedEventArgs e)
		{
			lock (locker) {
				var buffer = outputBuffers [e.IntPtrBuffer];
				buffer.PacketDescriptions.Clear ();
				buffer.CurrentOffset = 0;
				availableBuffers.Enqueue (buffer);

				// Signal that we should try to fill up some more buffers with audio
				// data. NOTE: When we parse a blob of data we will always create enough
				// buffers to fit the decoded data. That could make us create more buffers
				// than 'MaxBufferCount', so let's be careful to ensure we only start reading
				// more input data once enough buffers have been freed up.
				if (outputBuffers.Count - availableBuffers.Count < MaxBufferCount)
					needsBufferTask.TrySetResult (true);

				// If autoresume buffer level is zero then we're at the end of the stream and should
				// not pause the output because the number of enqueued buffers is low.
				if ((outputBuffers.Count - availableBuffers.Count) == 1 && AutoResumeBufferLevel > 0) {
					Buffering = true;
					TryPause ();
				}
			}
		}
Esempio n. 9
0
 private void Queue_BufferCompleted(object sender, BufferCompletedEventArgs e)
 {
     _queue?.Stop(true);
 }
        /// <summary>
        /// Is called when a buffer is completly read and can be freed up
        /// </summary>
        void HandleBufferCompleted(object sender, BufferCompletedEventArgs e)
        {
            queuedBufferCount--;
            IntPtr buf = e.IntPtrBuffer;

            foreach (var buffer in outputBuffers) {
                if (buffer.Buffer != buf)
                    continue;

                // free Buffer
                buffer.PacketDescriptions.Clear ();
                buffer.CurrentOffset = 0;
                lock (buffer) {
                    buffer.IsInUse = false;
                    Monitor.Pulse (buffer);
                }
            }

            if (queuedBufferCount == 0 && Finished != null)
                Finished (this, new EventArgs ());
        }
 void OnOutputQueueOutputCompleted(object sender, BufferCompletedEventArgs e)
 {
     outputQueue.FreeBuffer (e.IntPtrBuffer);
 }
Esempio n. 12
0
 void OnOutputQueueOutputCompleted(object sender, BufferCompletedEventArgs e)
 {
     outputQueue.FreeBuffer(e.IntPtrBuffer);
 }