public void Start(MBROLASynthesizer Synth)
            {
                callback   = new PlayCallbackProc(mbrCallback);
                this.Synth = Synth;
                t          = new Thread(delegate()
                {
                    while (Thread.CurrentThread.IsAlive)
                    {
                        if (Fragments.Count == 0)
                        {
                            Thread.Sleep(0);
                            continue;
                        }
                        string fragment = Fragments.Dequeue();
                        if (fragment == "EOF")
                        {
                            while (!Finished)
                            {
                                Thread.Sleep(0);
                            }
                            Eof = true;
                            Synth.Log("InvokeAudioFinished");
                            Synth.InvokeAudioFinished();
                            t.Abort();
                            return;
                        }
                        else
                        {
                            Synth.Log("Sent {0} characters to synth", fragment.Length);

                            MbrPlay.Play(fragment, (int)MbrFlags.Queued | (int)MbrFlags.Wait | (int)MbrFlags.MsgInit | (int)MbrFlags.MsgWrite | (int)MbrFlags.MsgEnd | (int)MbrFlags.Callback | (int)MbrOut.Disabled, null, callback);

                            StringBuilder error = new StringBuilder(256);
                            MbrPlay.LastError(error, 255);
                            if (error.Length > 0)
                            {
                                this.Error(this, error.ToString());
                            }
                        }
                    }
                });
                t.Name = "MbrThread";
                t.SetApartmentState(ApartmentState.STA);
                t.Start();
            }