/// <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)); }
/// <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)); }