public void Process(byte[] buffer, int num) { for (int pos = 0, td; pos < num; pos += td, bytesLeft -= td) { while (bytesLeft == 0) { if (miv != null) { Dispatch(miv); } if (mr.End) { End = true; bytesLeft = sampleRate * bytesPerSample; } else { miv = mr.ReadEvent(); bytesLeft = (miv.delta * sampleRate / cmfFile.ticksPerSecond) * bytesPerSample; } } td = Math.Min(num - pos, bytesLeft); adlib.GetSamples(buffer, pos, td); time += (double)(td / bytesPerSample) / sampleRate; } }
private void init() { // read the midi data to determine the duration of the whole song: int totalTicks = 0; var mr = new MidiReader(new MemoryStream(cmf.mididata)); while (!mr.End) { totalTicks += mr.ReadEvent().delta; } SecTotal = (double)totalTicks / cmf.ticksPerSecond; destination.Open(destination.Info.defaultPeriod, 2, 44100, FormatType.Int16); pc = new PlayerCore(destination.SampleRate, cmf); thread = new Thread(AudioThread); thread.Start(); }