private void Main() { try { while (true) { while (!GetStart()) { Thread.Sleep(100); } WaitSync?.Invoke(); lock (lockObj) isRunning = true; double o = sw.ElapsedTicks / swFreq; double step = 1 / (double)Frq; SeqCounter = Def_SeqCounter; while (true) { if (!GetStart()) { break; } Thread.Sleep(0); double el1 = sw.ElapsedTicks / swFreq; if (el1 - o < step) { continue; } if (el1 - o >= step * Frq / 100.0)//閾値10ms { do { o += step; } while (el1 - o >= step); } else { o += step; } //lock (lockObj) { //待ち合わせ割り込み if (parent.GetInterrupt()) { //Thread.Sleep(0); continue; } SeqSpeed += SeqSpeedDelta; while (SeqSpeed >= 1.0) { SeqCounter++; SeqSpeed -= 1.0; } if (SeqCounter < 0) { continue; } //コールバック実施 DataSeqFrqCallBack?.Invoke(SeqCounter); if (ringBuffer.GetDataSize() == 0) { if (!parent.IsRunningAtDataMaker()) { //RequestStop(); break; } continue; } if (SeqCounter < ringBuffer.LookUpCounter()) { continue; } //continue; } //dataが貯まってます! while (SeqCounter >= ringBuffer.LookUpCounter()) { if (!ringBuffer.Deq(ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData)) { break; } //データ加工 ProcessingData?.Invoke(ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData); //振り分けてEnqueue if (Chip.Model == EnmModel.VirtualModel) { while (!EmuEnq(Counter, Chip, Type, Address, Data, ExData)) { if (!Start) { break; } Thread.Sleep(0); } } else if (Chip.Model == EnmModel.RealModel) { while (!RealEnq(Counter, Chip, Type, Address, Data, ExData)) { if (!Start) { break; } Thread.Sleep(0); } } else { //演奏制御処理 switch (Type) { case EnmDataType.FadeOut: parent.SetFadeOut(); break; case EnmDataType.Loop: parent.CountUpLoopCounter(); break; } } } } //停止時のデータの送信 if (stopData != null) { foreach (PackData dat in stopData) { //データ加工 ProcessingData?.Invoke(ref SeqCounter, ref dat.Chip, ref dat.Type, ref dat.Address, ref dat.Data, ref dat.ExData); //振り分けてEnqueue if (dat.Chip.Model == EnmModel.VirtualModel) { if (parent.IsRunningAtEmuChipSender()) { int timeOut = 1000; while (!EmuEnq(SeqCounter, dat.Chip, dat.Type, dat.Address, dat.Data, dat.ExData)) { Thread.Sleep(1); timeOut--; if (timeOut == 0) { goto Timeout; } } } } else if (dat.Chip.Model == EnmModel.RealModel) { if (parent.IsRunningAtRealChipSender()) { int timeOut = 1000; while (!RealEnq(SeqCounter, dat.Chip, dat.Type, dat.Address, dat.Data, dat.ExData)) { Thread.Sleep(1); timeOut--; if (timeOut == 0) { goto Timeout; } } } } } Timeout :; } lock (lockObj) { isRunning = false; Counter = 0; Start = false; } parent.RequestStopAtEmuChipSender(); parent.RequestStopAtRealChipSender(); } } catch { lock (lockObj) { isRunning = false; Start = false; } } }
private void SendData() { //long rlc = ringBuffer.LookUpCounter(); while (SeqCounter >= ringBuffer.LookUpCounter()) { if (!ringBuffer.Deq(ref od, ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData)) { return; } if (unmount) { return; } //rlc = Counter; //Console.WriteLine(string.Format("{0}",rlc)); //パラメーターセット SetMMLParameter?.Invoke(ref od, ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData); //データ加工 ProcessingData?.Invoke(ref od, ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData); if (od != null) { if (od.type == enmMMLType.ResetPlaySync) { reqResetSync = true; return; } if (od.type == enmMMLType.Tempo) { parent.CurrentTempo = (int)od.args[0]; parent.CurrentClockCount = (int)od.args[1]; continue; } if (od.type == enmMMLType.Length) { if (od.linePos.chip == parent.CurrentChip && od.linePos.ch == parent.CurrentCh - 1) { parent.CurrentNoteLength = (int)od.args[0]; } continue; } } //振り分けてEnqueue if (Chip.Model == EnmVRModel.VirtualModel) { while (!EmuEnq(od, Counter, Chip, Type, Address, Data, ExData)) { if (!Start) { break; } if (unmount) { return; } } Thread.Sleep(0); } else if (Chip.Model == EnmVRModel.RealModel) { while (!RealEnq(od, Counter, Chip, Type, Address, Data, ExData)) { if (!Start) { break; } if (unmount) { return; } Thread.Sleep(0); } } else { //演奏制御処理 switch (Type) { case EnmDataType.Normal: break; case EnmDataType.FadeOut: parent.SetFadeOut(); break; case EnmDataType.Loop: parent.CountUpLoopCounter(); break; } } } }
private void Main() { try { while (true) { Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; while (!GetStart()) { if (unmount) { return; } Thread.Sleep(100); } Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; WaitSync?.Invoke(); lock (lockObj) isRunning = true; double step = 1 / (double)Frq; SeqCounter = Def_SeqCounter; processOverFlowCounter = 0; ISpeedCount spdc; switch (musicInterruptTimer) { case MusicInterruptTimer.StopWatch: default: spdc = new TimeCountByStopWatch(); break; case MusicInterruptTimer.DateTime: spdc = new TimeCountByDateTime(); break; case MusicInterruptTimer.QueryPerformanceCounter: spdc = new TimeCountByPerformanceCounter(); break; } spdc.Start(); double o = spdc.ElapsedMilliSec();// sw.ElapsedTicks / swFreq; while (true) { if (!GetStart()) { break; } if (unmount) { return; } Thread.Sleep(0); double el1 = spdc.ElapsedMilliSec();// sw.ElapsedTicks / swFreq; if (el1 - o < step) { continue; } if (el1 - o >= step * Frq / 1.0)//閾値1000ms { processOverFlowCounter++; o = el1 - step; //do //{ // o += step; //} while (el1 - o >= step); } //else //{ //o += step; //} skipframe = Math.Max(Math.Min((int)((el1 - o) / step), 500), 1); for (int skipf = 0; skipf < skipframe; skipf++) { o += step; double lapPtr = spdc.ElapsedMilliSec(); { //待ち合わせ割り込み if (parent.GetInterrupt()) { //Thread.Sleep(0); continue; } SeqSpeed += SeqSpeedDelta; while (SeqSpeed >= 1.0) { SeqCounter++; SeqSpeed -= 1.0; } if (SeqCounter < 0) { continue; } //イベント実施 OnDataSeqFrq(SeqCounter); //if (parent.Mode == SendMode.Both) //{ //throw new ArgumentOutOfRangeException("演奏時は両モード同時指定できません"); //} if ((parent.Mode & SendMode.MML) == SendMode.MML) { if (ringBuffer.GetDataSize() == 0) { if (!parent.IsRunningAtDataMaker()) { parent.ResetMode(SendMode.MML); if ((parent.Mode & SendMode.RealTime) != SendMode.RealTime) { break; } } continue; } } if ((parent.Mode & SendMode.RealTime) == SendMode.RealTime) { if (reqSendStopData) { reqSendStopData = false; if (SendStopData() == -1) { return; } } } if (parent.Mode == SendMode.none) { //モード指定がnoneの場合はループを抜ける break; } } process1_Lap = spdc.ElapsedMilliSec() - lapPtr; lapPtr = spdc.ElapsedMilliSec(); //dataが貯まってます! while (SeqCounter >= ringBuffer.LookUpCounter()) { if (unmount) { return; } if (!ringBuffer.Deq(ref od, ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData)) { break; } //パラメーターセット SetMMLParameter?.Invoke(ref od, ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData); //データ加工 ProcessingData?.Invoke(ref od, ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData); if (od != null && od.type == enmMMLType.Tempo) { parent.CurrentTempo = (int)od.args[0]; parent.CurrentClockCount = (int)od.args[1]; continue; } if (od != null && od.type == enmMMLType.Length) { if (od.linePos.chip == parent.CurrentChip && od.linePos.ch == parent.CurrentCh - 1) { parent.CurrentNoteLength = (int)od.args[0]; } continue; } //振り分けてEnqueue if (Chip.Model == EnmVRModel.VirtualModel) { while (!EmuEnq(od, Counter, Chip, Type, Address, Data, ExData)) { if (!Start) { break; } if (unmount) { return; } Thread.Sleep(0); } } else if (Chip.Model == EnmVRModel.RealModel) { while (!RealEnq(od, Counter, Chip, Type, Address, Data, ExData)) { if (!Start) { break; } if (unmount) { return; } Thread.Sleep(0); } } else { //演奏制御処理 switch (Type) { case EnmDataType.Normal: break; case EnmDataType.FadeOut: parent.SetFadeOut(); break; case EnmDataType.Loop: parent.CountUpLoopCounter(); break; } } } process2_Lap = spdc.ElapsedMilliSec() - lapPtr; } if (parent.Mode == SendMode.none) { //モード指定がnoneの場合はループを抜ける break; } } if (SendStopData() == -1) { return; } lock (lockObj) { isRunning = false; Counter = 0; Start = false; } parent.RequestStopAtEmuChipSender(); parent.RequestStopAtRealChipSender(); } } catch (Exception ex) { mml2vgmIDE.log.ForcedWrite(ex); lock (lockObj) { isRunning = false; Start = false; } } finally { procExit = true; Thread.CurrentThread.Priority = ThreadPriority.Normal; } }