예제 #1
0
        public static CDTOC? Decode(byte[] CDTOCResponse)
        {
            if(CDTOCResponse == null) return null;

            CDTOC decoded = new CDTOC();

            BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian;

            decoded.DataLength       = BigEndianBitConverter.ToUInt16(CDTOCResponse, 0);
            decoded.FirstTrack       = CDTOCResponse[2];
            decoded.LastTrack        = CDTOCResponse[3];
            decoded.TrackDescriptors = new CDTOCTrackDataDescriptor[(decoded.DataLength - 2) / 8];

            if(decoded.DataLength + 2 != CDTOCResponse.Length)
            {
                DicConsole.DebugWriteLine("CD TOC decoder",
                                          "Expected CDTOC size ({0} bytes) is not received size ({1} bytes), not decoding",
                                          decoded.DataLength + 2, CDTOCResponse.Length);
                return null;
            }

            for(int i = 0; i < (decoded.DataLength - 2) / 8; i++)
            {
                decoded.TrackDescriptors[i].Reserved1   = CDTOCResponse[0 + i * 8 + 4];
                decoded.TrackDescriptors[i].ADR         = (byte)((CDTOCResponse[1 + i * 8 + 4] & 0xF0) >> 4);
                decoded.TrackDescriptors[i].CONTROL     = (byte)(CDTOCResponse[1 + i * 8 + 4] & 0x0F);
                decoded.TrackDescriptors[i].TrackNumber = CDTOCResponse[2 + i * 8 + 4];
                decoded.TrackDescriptors[i].Reserved2   = CDTOCResponse[3 + i * 8 + 4];
                decoded.TrackDescriptors[i].TrackStartAddress =
                    BigEndianBitConverter.ToUInt32(CDTOCResponse, 4 + i * 8 + 4);
            }

            return decoded;
        }
예제 #2
0
        public static CDTOC?Decode(byte[] CDTOCResponse)
        {
            if (CDTOCResponse == null ||
                CDTOCResponse.Length <= 4)
            {
                return(null);
            }

            var decoded = new CDTOC
            {
                DataLength = BigEndianBitConverter.ToUInt16(CDTOCResponse, 0),
                FirstTrack = CDTOCResponse[2],
                LastTrack  = CDTOCResponse[3]
            };

            decoded.TrackDescriptors = new CDTOCTrackDataDescriptor[(decoded.DataLength - 2) / 8];

            if (decoded.DataLength + 2 != CDTOCResponse.Length)
            {
                AaruConsole.DebugWriteLine("CD TOC decoder",
                                           "Expected CDTOC size ({0} bytes) is not received size ({1} bytes), not decoding",
                                           decoded.DataLength + 2, CDTOCResponse.Length);

                return(null);
            }

            for (int i = 0; i < (decoded.DataLength - 2) / 8; i++)
            {
                decoded.TrackDescriptors[i].Reserved1   = CDTOCResponse[0 + (i * 8) + 4];
                decoded.TrackDescriptors[i].ADR         = (byte)((CDTOCResponse[1 + (i * 8) + 4] & 0xF0) >> 4);
                decoded.TrackDescriptors[i].CONTROL     = (byte)(CDTOCResponse[1 + (i * 8) + 4] & 0x0F);
                decoded.TrackDescriptors[i].TrackNumber = CDTOCResponse[2 + (i * 8) + 4];
                decoded.TrackDescriptors[i].Reserved2   = CDTOCResponse[3 + (i * 8) + 4];

                decoded.TrackDescriptors[i].TrackStartAddress =
                    BigEndianBitConverter.ToUInt32(CDTOCResponse, 4 + (i * 8) + 4);
            }

            return(decoded);
        }
예제 #3
0
        public static string Prettify(CDTOC?CDTOCResponse)
        {
            if (CDTOCResponse == null)
            {
                return(null);
            }

            CDTOC response = CDTOCResponse.Value;

            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("First track number in first complete session: {0}", response.FirstTrack).AppendLine();
            sb.AppendFormat("Last track number in last complete session: {0}", response.LastTrack).AppendLine();
            foreach (CDTOCTrackDataDescriptor descriptor in response.TrackDescriptors)
            {
                if (descriptor.TrackNumber == 0xAA)
                {
                    sb.AppendLine("Track number: Lead-Out");
                }
                else
                {
                    sb.AppendFormat("Track number: {0}", descriptor.TrackNumber).AppendLine();
                }
                sb.AppendFormat("Track starts at LBA {0}, or MSF {1:X2}:{2:X2}:{3:X2}", descriptor.TrackStartAddress,
                                (descriptor.TrackStartAddress & 0x0000FF00) >> 8,
                                (descriptor.TrackStartAddress & 0x00FF0000) >> 16,
                                (descriptor.TrackStartAddress & 0xFF000000) >> 24).AppendLine();

                switch ((TocAdr)descriptor.ADR)
                {
                case TocAdr.NoInformation:
                    sb.AppendLine("Q subchannel mode not given");
                    break;

                case TocAdr.TrackPointer:
                    sb.AppendLine("Q subchannel stores track pointer");
                    break;

                case TocAdr.VideoTrackPointer:
                    sb.AppendLine("Q subchannel stores video track pointer");
                    break;

                case TocAdr.ISRC:
                    sb.AppendLine("Q subchannel stores ISRC");
                    break;

                case TocAdr.MediaCatalogNumber:
                    sb.AppendLine("Q subchannel stores media catalog number");
                    break;

                default:
                    sb.AppendFormat("Q subchannel mode {0}", descriptor.ADR).AppendLine();
                    break;
                }

                if ((descriptor.CONTROL & (byte)TocControl.ReservedMask) == (byte)TocControl.ReservedMask)
                {
                    sb.AppendFormat("Reserved flags 0x{0:X2} set", descriptor.CONTROL).AppendLine();
                }
                else
                {
                    switch ((TocControl)(descriptor.CONTROL & 0x0D))
                    {
                    case TocControl.TwoChanNoPreEmph:
                        sb.AppendLine("Stereo audio track with no pre-emphasis");
                        break;

                    case TocControl.TwoChanPreEmph:
                        sb.AppendLine("Stereo audio track with 50/15 μs pre-emphasis");
                        break;

                    case TocControl.FourChanNoPreEmph:
                        sb.AppendLine("Quadraphonic audio track with no pre-emphasis");
                        break;

                    case TocControl.FourChanPreEmph:
                        sb.AppendLine("Quadraphonic audio track with 50/15 μs pre-emphasis");
                        break;

                    case TocControl.DataTrack:
                        sb.AppendLine("Data track, recorded uninterrupted");
                        break;

                    case TocControl.DataTrackIncremental:
                        sb.AppendLine("Data track, recorded incrementally");
                        break;
                    }

                    sb.AppendLine((descriptor.CONTROL & (byte)TocControl.CopyPermissionMask) ==
                                  (byte)TocControl.CopyPermissionMask
                                      ? "Digital copy of track is permitted"
                                      : "Digital copy of track is prohibited");

#if DEBUG
                    if (descriptor.Reserved1 != 0)
                    {
                        sb.AppendFormat("Reserved1 = 0x{0:X2}", descriptor.Reserved1).AppendLine();
                    }
                    if (descriptor.Reserved2 != 0)
                    {
                        sb.AppendFormat("Reserved2 = 0x{0:X2}", descriptor.Reserved2).AppendLine();
                    }
#endif

                    sb.AppendLine();
                }
            }

            return(sb.ToString());
        }