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); }
/// <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"); }