Exemple #1
0
        /// <summary>Reads all frames.</summary>
        /// <param name="stream">The stream.</param>
        /// <returns></returns>
        public static SynchronizedLyrics ReadAllFrames(Stream stream)
        {
            var       items  = new List <SynchronizedLyricsItem>();
            var       reader = new CdgReader(stream);
            CdgPacket packet;
            TimeSpan  time;

            while (reader.GetNextPacket(out packet, out time))
            {
                var builder = new SynchronizedLyricsItemBuilder();
                builder.TimeCode = time;

                switch (packet.Instruction)
                {
                case CdgInstruction.MemoryPreset: reader.ParseMemoryPreset(builder, packet); break;

                case CdgInstruction.BorderPreset: break;

                case CdgInstruction.TileBlock: reader.ParseTileBlock(builder, packet, false); break;

                case CdgInstruction.TileBlockXor: reader.ParseTileBlock(builder, packet, true); break;

                case CdgInstruction.ScrollPreset: reader.ParseScroll(builder, packet, false); break;

                case CdgInstruction.ScrollCopy: reader.ParseScroll(builder, packet, true); break;

                case CdgInstruction.DefineTransparentColor: reader.ParseDefineTransparentColor(builder, packet); break;

                case CdgInstruction.LoadLowerColorTable: reader.ParseLoadColorTable(builder, packet, false); break;

                case CdgInstruction.LoadHigherColorTable: reader.ParseLoadColorTable(builder, packet, true); break;

                case CdgInstruction.Unknown: continue;

                default:
                    Trace.TraceError("Unknown command <red>{0}", packet.Instruction);
                    continue;
                }
                if (builder.Commands.Count > 0)
                {
                    items.Add(builder.ToSynchronizedLyricsItem());
                }
            }
            return(new SynchronizedLyrics(items));
        }
Exemple #2
0
        /// <summary>Creates a new <see cref="SynchronizedLyrics"/> instance by parsing the specified stream.</summary>
        /// <param name="stream">The stream.</param>
        /// <returns></returns>
        public static SynchronizedLyrics FromStream(MemoryStream stream)
        {
            var  items       = new List <SynchronizedLyricsItem>();
            long milliSecond = 0;

            var reader = new DataReader(stream);

            if (reader.ReadString(3) != "SLT")
            {
                throw new InvalidDataException("Invalid format!");
            }

            if (reader.Read7BitEncodedUInt64() != 1)
            {
                throw new InvalidDataException("Invalid version!");
            }

            while (reader.Available > 0)
            {
                long milliSecondDistance = reader.Read7BitEncodedInt64();
                milliSecond += milliSecondDistance;

                var item = new SynchronizedLyricsItemBuilder();
                item.TimeCode = new TimeSpan(milliSecond * TimeSpan.TicksPerMillisecond);
                while (true)
                {
                    ISynchronizedLyricsCommand command = SynchronizedLyricsCommand.Parse(reader);
                    if (command == null)
                    {
                        break;
                    }

                    item.Commands.Add(command);
                }
                items.Add(item.ToSynchronizedLyricsItem());
            }
            return(new SynchronizedLyrics(items));
        }