/// <summary> /// Reads CD Text from CD drive. /// </summary> /// <returns>CD Text</returns> public CdtextData ReadCdtext() { const int ReadTocExOutputMaxSize = 0xFFF0; UnsafeCalls.ReadTocEx readTocInput = new UnsafeCalls.ReadTocEx(); bool result; byte[] buffer = new byte[ReadTocExOutputMaxSize]; uint read = 0; result = UnsafeCalls.DeviceIoControl(hCd, UnsafeCalls.IoctlCdromReadTocEx, readTocInput, UnsafeCalls.RawReadInfoSize, buffer, (uint)buffer.Length, ref read, IntPtr.Zero); if (!result) throw new Win32Exception(UnsafeCalls.GetLastError()); Dictionary<UnsafeCalls.TocCdtextDataBlockPackType, StringBuilder> strings = new Dictionary<UnsafeCalls.TocCdtextDataBlockPackType, StringBuilder>(); List<UnsafeCalls.TocCdtextDataBlock> blocks = new List<UnsafeCalls.TocCdtextDataBlock>(); int position = 4; // skip length and reserved int lastPosition = 2 + BitConverter.ToUInt16(buffer, 0); while (position < lastPosition) { UnsafeCalls.TocCdtextDataBlock block = UnsafeCalls.GetTocCdtextDataBlock(buffer, position); if (block.PackType == UnsafeCalls.TocCdtextDataBlockPackType.None) break; // emtpy space? blocks.Add(block); StringBuilder sb; if (!strings.TryGetValue(block.PackType, out sb)) { strings.Add(block.PackType, sb = new StringBuilder()); } sb.Append(block.GetText()); position += UnsafeCalls.TocCdtextDataBlockSize; } CdtextData cdtext = new CdtextData(); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.AlbumName)) cdtext.AlbumNames = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.AlbumName]).ToString()); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Performer)) cdtext.Performers = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Performer]).ToString()); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Songwriter)) cdtext.Songwriters = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Songwriter]).ToString()); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Composer)) cdtext.Composers = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Composer]).ToString()); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Arranger)) cdtext.Arrangers = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Arranger]).ToString()); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Messages)) cdtext.Messages = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Messages]).ToString()); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Genre)) cdtext.Genres = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Genre]).ToString()); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.DiscId)) cdtext.DiskId = StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.DiscId]).ToString(); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.UpcEan)) cdtext.UpcEans = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.UpcEan]).ToString()); return cdtext; }
/// <summary> /// Reads CD Text from CD drive. /// </summary> /// <returns>CD Text</returns> public CdtextData ReadCdtext() { const int ReadTocExOutputMaxSize = 0xFFF0; UnsafeCalls.ReadTocEx readTocInput = new UnsafeCalls.ReadTocEx(); bool result; byte[] buffer = new byte[ReadTocExOutputMaxSize]; uint read = 0; result = UnsafeCalls.DeviceIoControl(hCd, UnsafeCalls.IoctlCdromReadTocEx, readTocInput, UnsafeCalls.RawReadInfoSize, buffer, (uint)buffer.Length, ref read, IntPtr.Zero); if (!result) { throw new Win32Exception(UnsafeCalls.GetLastError()); } Dictionary <UnsafeCalls.TocCdtextDataBlockPackType, StringBuilder> strings = new Dictionary <UnsafeCalls.TocCdtextDataBlockPackType, StringBuilder>(); List <UnsafeCalls.TocCdtextDataBlock> blocks = new List <UnsafeCalls.TocCdtextDataBlock>(); int position = 4; // skip length and reserved int lastPosition = 2 + BitConverter.ToUInt16(buffer, 0); while (position < lastPosition) { UnsafeCalls.TocCdtextDataBlock block = UnsafeCalls.GetTocCdtextDataBlock(buffer, position); if (block.PackType == UnsafeCalls.TocCdtextDataBlockPackType.None) { break; // emtpy space? } blocks.Add(block); StringBuilder sb; if (!strings.TryGetValue(block.PackType, out sb)) { strings.Add(block.PackType, sb = new StringBuilder()); } sb.Append(block.GetText()); position += UnsafeCalls.TocCdtextDataBlockSize; } CdtextData cdtext = new CdtextData(); if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.AlbumName)) { cdtext.AlbumNames = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.AlbumName]).ToString()); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Performer)) { cdtext.Performers = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Performer]).ToString()); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Songwriter)) { cdtext.Songwriters = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Songwriter]).ToString()); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Composer)) { cdtext.Composers = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Composer]).ToString()); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Arranger)) { cdtext.Arrangers = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Arranger]).ToString()); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Messages)) { cdtext.Messages = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Messages]).ToString()); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.Genre)) { cdtext.Genres = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.Genre]).ToString()); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.DiscId)) { cdtext.DiskId = StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.DiscId]).ToString(); } if (strings.ContainsKey(UnsafeCalls.TocCdtextDataBlockPackType.UpcEan)) { cdtext.UpcEans = SplitByZeros(StripTail(strings[UnsafeCalls.TocCdtextDataBlockPackType.UpcEan]).ToString()); } return(cdtext); }