Ejemplo n.º 1
0
        private void PlayRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            PlayDoWorkResult r = new PlayDoWorkResult();

            r.hr = 0;

            if (!e.Cancelled)
            {
                r = e.Result as PlayDoWorkResult;
            }

            PlayEventType t  = (e.Cancelled) ? PlayEventType.Canceled : PlayEventType.Finished;
            var           ev = new PlayEvent(t, r.hr, m_playWorker);

            CallEventCallback(ev);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 再生中。バックグラウンドスレッド。
        /// </summary>
        private void PlayDoWork(object o, DoWorkEventArgs args)
        {
            //Console.WriteLine("PlayDoWork started");
            var r = new PlayDoWorkResult();

            r.hr        = 0;
            args.Result = r;
            var  bw = o as BackgroundWorker;
            bool cancelProcessed = false;

            while (!wasapi.Run(PROGRESS_REPORT_INTERVAL_MS))
            {
                m_playWorker.ReportProgress(0);

                System.Threading.Thread.Sleep(1);
                if (bw.CancellationPending && !cancelProcessed)
                {
                    Console.WriteLine("PlayDoWork() CANCELED StopGently=" + m_bStopGently);
                    if (m_bStopGently)
                    {
                        // 最後に再生する無音の再生にジャンプする。その後再生するものが無くなって停止する
                        wasapi.UpdatePlayPcmDataById(-1);
                        wasapi.Unpause();
                        cancelProcessed = true;
                    }
                    else
                    {
                        r.hr = wasapi.Stop();
                    }
                    args.Cancel = true;
                }
            }

            // 正常に最後まで再生が終わった場合、ここでStopを呼んで、後始末する。
            // キャンセルの場合は、2回Stopが呼ばれることになるが、問題ない!!!
            int hr = wasapi.Stop();

            if (0 <= r.hr)
            {
                r.hr = hr;
            }

            // 停止完了後タスクの処理は、ここではなく、PlayRunWorkerCompletedで行う。
            Console.WriteLine("PlayDoWork() end");
        }