Exemplo n.º 1
0
        /// <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;
        }
Exemplo n.º 2
0
        /// <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);
        }