public static Top Read(string logPath, Stream logStream) { TopProxy topProxy = new TopProxy(); List <Definition> definitions = new List <Definition>(); bool level2; long timerBasis; int samplingRate; int envelopeRate; int concurrency; string acceleratorPath = Accelerators.Schedule.QueryAcceleratorPath(logPath, logStream, AcceleratorVersion); string level2AcceleratorPath = Accelerators.Events.QueryAcceleratorPath(logPath, logStream, AcceleratorVersion); using (TextReader reader = new StreamReader2(logStream)) { // always read header from log file string line; string[] parts; line = reader.ReadLine(); parts = line.Split('\t'); Debug.Assert(parts[0] == "version"); int version = Int32.Parse(parts[1]); Debug.Assert(version == 1); line = reader.ReadLine(); parts = line.Split('\t'); Debug.Assert(parts[0] == "level"); level2 = Int64.Parse(parts[1]) > 1; line = reader.ReadLine(); parts = line.Split('\t'); Debug.Assert(parts[0] == "tres"); timerBasis = Int64.Parse(parts[1]); line = reader.ReadLine(); parts = line.Split('\t'); Debug.Assert(parts[0] == "srate"); samplingRate = Int32.Parse(parts[1]); line = reader.ReadLine(); parts = line.Split('\t'); Debug.Assert(parts[0] == "erate"); envelopeRate = Int32.Parse(parts[1]); line = reader.ReadLine(); parts = line.Split('\t'); Debug.Assert(parts[0] == "threads"); concurrency = Int32.Parse(parts[1]); line = reader.ReadLine(); if (!String.Equals(line, ":")) { Debug.Assert(false); } while (!String.IsNullOrEmpty(line = reader.ReadLine())) { parts = line.Split('\t'); switch (parts[1]) { default: Debug.Assert(false); throw new ArgumentException(); case "section": definitions.Add( new Definition( topProxy, Int32.Parse(parts[0]), parts[2], Kind.Effect, -1)); break; case "track": definitions.Add( new Definition( topProxy, Int32.Parse(parts[0]), parts[3], Kind.Track, Int32.Parse(parts[2]))); break; } } } // create offsets table for epoch records if (acceleratorPath == null) { acceleratorPath = Path.GetTempFileName(); level2AcceleratorPath = Path.GetTempFileName(); #if false long end = stream.Length; using (Stream acceleratorStream = new FileStream(acceleratorPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None, Constants.BufferSize)) { using (BinaryWriter acceleratorWriter = new BinaryWriter(acceleratorStream, Encoding.UTF8)) { while (((StreamReader2)reader).Position < end) { acceleratorWriter.Write((long)((StreamReader2)reader).Position); EpochResident.Read(reader, topProxy, definitions.Count); } } } #else using (Stream acceleratorStream = new FileStream(acceleratorPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None, Constants.BufferSize)) { using (Stream level2Stream = new FileStream(level2AcceleratorPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None, Constants.BufferSize)) { FindBoundariesHelper.FindBoundaries(logPath, logStream, acceleratorStream, level2Stream); } } #endif Accelerators.Schedule.RecordAcceleratorPath(logPath, logStream, acceleratorPath, AcceleratorVersion); Accelerators.Events.RecordAcceleratorPath(logPath, logStream, level2AcceleratorPath, AcceleratorVersion); } Stream acceleratorStream2 = new FileStream(acceleratorPath, FileMode.Open, FileAccess.Read, FileShare.Read, Constants.BufferSize); BinaryReader acceleratorReader2 = new BinaryReader(acceleratorStream2, Encoding.UTF8); BitVector level2Bits; using (Stream level2Stream = new FileStream(level2AcceleratorPath, FileMode.Open, FileAccess.Read, FileShare.Read, Constants.BufferSize)) { level2Bits = BitVector.Load(level2Stream); } IList <Epoch> epochs = new EpochVirtualList( topProxy, (int)(acceleratorStream2.Length / EpochVirtualList.OffsetRecordLength), level2Bits); //System.Windows.Forms.MessageBox.Show("Number of epochs: " + epochs.Count.ToString()); Top top = new Top( logStream, level2, timerBasis, samplingRate, envelopeRate, concurrency, definitions, acceleratorStream2, acceleratorReader2, epochs); topProxy.Top = top; return(top); }
private void Generate() { if (bars != null) { return; } if (!top.Level2) { return; } #if false string acceleratorPath = Accelerators.Events.QueryAcceleratorPath(logPath, top.LogStream, Top.AcceleratorVersion); if (acceleratorPath == null) { evtf = new BitVector(top.Epochs.Count); } else { using (Stream stream = new FileStream(acceleratorPath, FileMode.Open, FileAccess.Read, FileShare.Read, Constants.BufferSize)) { evtf = BitVector.Load(stream); } } #endif List <EventBar>[] bars2 = new List <EventBar> [top.Definitions.Count]; Dictionary <int, EventBar>[] bars3 = new Dictionary <int, EventBar> [top.Definitions.Count]; for (int j = 0; j < top.Definitions.Count; j++) { bars2[j] = new List <EventBar>(); bars3[j] = new Dictionary <int, EventBar>(); } for (int i = 0; i < top.Epochs.Count; i++) { #if false if (acceleratorPath != null) { if (!evtf[i]) { continue; } } bool found = false; #endif Epoch epoch = top.Epochs[i]; if (!epoch.Level2) { continue; } for (int j = 0; j < top.Definitions.Count; j++) { DatumEvent[] events = epoch.Data[j].Events; foreach (DatumEvent e in events) { #if false found = true; #endif switch (e.Tag) { default: Debug.Assert(false); break; case "Start": { EventBar bar = new EventBar(); bar.start = i; bar.seq = e.Seq; bar.frameIndex = ((DatumEvent2)e).frameIndex; bar.noteIndex = ((DatumEvent2)e).noteIndex; bars2[j].Add(bar); bars3[j].Add(e.Seq, bar); } break; case "Stop": { EventBar bar = bars3[j][e.Seq]; bar.end = i; } break; case "Restart": { EventBar bar = bars3[j][e.Seq]; EventBar.Tie tie = new EventBar.Tie(); tie.when = i; tie.frameIndex = ((DatumEvent2)e).frameIndex; tie.noteIndex = ((DatumEvent2)e).noteIndex; int p = bar.ties.Length; Array.Resize(ref bar.ties, p + 1); bar.ties[p] = tie; } break; case "SkipEnter": case "SkipLeave": { EventBar bar = new EventBar(); bar.tag = e.Tag; bar.start = i; bar.end = i; bar.seq = e.Seq; bars2[j].Add(bar); bars3[j].Add(e.Seq, bar); } break; } } } #if false if ((acceleratorPath == null) && found) { evtf[i] = true; } #endif } #if false if (acceleratorPath == null) { acceleratorPath = System.IO.Path.GetTempFileName(); using (Stream stream = new FileStream(acceleratorPath, FileMode.Create, FileAccess.Write, FileShare.None, Constants.BufferSize)) { evtf.Save(stream); } Accelerators.Events.RecordAcceleratorPath(logPath, top.LogStream, acceleratorPath, Top.AcceleratorVersion); } #endif bars = new EventBar[top.Definitions.Count][]; for (int j = 0; j < top.Definitions.Count; j++) { bars[j] = bars2[j].ToArray(); } }