#region --- License ---
/* Licensed under the MIT/X11 license.
 * Copyright (c) 2006-2008 the OpenTK Team.
 * This notice may not be removed from any source distribution.
 * See license.txt for licensing details.
 */
#endregion

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.ComponentModel;

using OpenTK.Audio;

namespace Examples.OpenAL
{
    // Not working correctly (sound pops).

    //[Example("Streaming Playback", ExampleCategory.OpenAL)]
    public class StreamingPlayback
    {
        const string filename = "Data\\Audio\\the_ring_that_fell.wav";
        const int buffer_size = (int)(0.5*44100);
        const int buffer_count = 4;

        //static object openal_lock = new object();   // Should be global in your app.

        public static void Main()
        {
            using (AudioContext context = new AudioContext())
            using (AudioReader sound = new AudioReader(filename))
            {
                int source = AL.GenSource();
                int[] buffers = AL.GenBuffers(buffer_count);
                int state;

                Console.WriteLine("Testing WaveReader({0}).ReadSamples()", filename);

                Console.Write("Playing");

                foreach (int buffer in buffers)
                    AL.BufferData(buffer, sound.ReadSamples(buffer_size));
                AL.SourceQueueBuffers(source, buffers.Length, buffers);
                AL.SourcePlay(source);

                int processed_count, queued_count;

                do
                {
                    //Console.Write(".");

                    do
                    {
                        AL.GetSource(source, ALGetSourcei.BuffersProcessed, out processed_count);
                        //Thread.Sleep(1);
                    }
                    while (processed_count == 0);

                    Console.WriteLine(processed_count);
                    while (processed_count > 0)
                    {
                        int buffer = AL.SourceUnqueueBuffer(source);
                        if (buffer != 0 && !sound.EndOfFile)
                        {
                            Console.WriteLine("    " + buffer.ToString());
                            AL.BufferData(buffer, sound.ReadSamples(buffer_size));
                            AL.SourceQueueBuffer(source, buffer);
                        }
                        --processed_count;
                    }

                    AL.GetSource(source, ALGetSourcei.BuffersQueued, out queued_count);
                    if (queued_count > 0)
                    {
                        AL.GetSource(source, ALGetSourcei.SourceState, out state);
                        if ((ALSourceState)state != ALSourceState.Playing)
                        {
                            AL.SourcePlay(source);
                            Console.WriteLine("r");
                        }
                    }
                    else
                        break;
                }
                while (true);

                AL.SourceStop(source);
                AL.DeleteSource(source);
                AL.DeleteBuffers(buffers);
            }

            Console.WriteLine();
        }
    }
}