示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }