Exemple #1
0
        public static string Prettify000b(StandardDiscInformation?information)
        {
            if (!information.HasValue)
            {
                return(null);
            }

            StandardDiscInformation decoded = information.Value;

            if (decoded.DataType != 0)
            {
                return(null);
            }

            StringBuilder sb = new StringBuilder();

            switch (decoded.DiscType)
            {
            case 0x00:
                sb.AppendLine("Disc type declared as CD-DA or CD-ROM");
                break;

            case 0x10:
                sb.AppendLine("Disc type declared as CD-i");
                break;

            case 0x20:
                sb.AppendLine("Disc type declared as CD-ROM XA");
                break;

            case 0xFF:
                sb.AppendLine("Disc type is undefined");
                break;

            default:
                sb.AppendFormat("Unknown disc type {0:X2}h", decoded.DiscType).AppendLine();
                break;
            }

            switch (decoded.DiscStatus)
            {
            case 0:
                sb.AppendLine("Disc is empty");
                break;

            case 1:
                sb.AppendLine("Disc is incomplete");
                break;

            case 2:
                sb.AppendLine("Disc is finalized");
                break;
            }

            if (decoded.Erasable)
            {
                sb.AppendLine("Disc is erasable");
            }

            switch (decoded.LastSessionStatus)
            {
            case 0:
                sb.AppendLine("Last session is empty");
                break;

            case 1:
                sb.AppendLine("Last session is incomplete");
                break;

            case 2:
                sb.AppendLine("Last session is damaged");
                break;

            case 3:
                sb.AppendLine("Last session is complete");
                break;
            }

            switch (decoded.BGFormatStatus)
            {
            case 1:
                sb.AppendLine("Media was being formatted in the background but it is stopped and incomplete");
                break;

            case 2:
                sb.AppendLine("Media is currently being formatted in the background");
                break;

            case 3:
                sb.AppendLine("Media background formatting has completed");
                break;
            }

            if (decoded.Dbit)
            {
                sb.AppendLine("MRW is dirty");
            }

            sb.AppendFormat("First track on disc is track {0}", decoded.FirstTrackNumber).AppendLine();
            sb.AppendFormat("Disc has {0} sessions", decoded.Sessions).AppendLine();
            sb.AppendFormat("First track in last session is track {0}", decoded.FirstTrackLastSession).AppendLine();
            sb.AppendFormat("Last track in last session is track {0}", decoded.LastTrackLastSession).AppendLine();
            sb.AppendFormat("Last session Lead-In address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}",
                            decoded.LastSessionLeadInStartLBA, (decoded.LastSessionLeadInStartLBA & 0xFF0000) >> 16,
                            (decoded.LastSessionLeadInStartLBA & 0xFF00) >> 8,
                            decoded.LastSessionLeadInStartLBA & 0xFF)
            .AppendLine();
            sb.AppendFormat("Last possible Lead-Out address is {0} (as LBA) or {1:X2}:{2:X2}:{3:X2}",
                            decoded.LastPossibleLeadOutStartLBA, (decoded.LastPossibleLeadOutStartLBA & 0xFF0000) >> 16,
                            (decoded.LastPossibleLeadOutStartLBA & 0xFF00) >> 8,
                            decoded.LastPossibleLeadOutStartLBA & 0xFF).AppendLine();

            sb.AppendLine(decoded.URU ? "Disc is defined for unrestricted use" : "Disc is defined for restricted use");

            if (decoded.DID_V)
            {
                sb.AppendFormat("Disc ID: {0:X6}", decoded.DiscIdentification & 0x00FFFFFF).AppendLine();
            }
            if (decoded.DBC_V)
            {
                sb.AppendFormat("Disc barcode: {0:X16}", decoded.DiscBarcode).AppendLine();
            }
            if (decoded.DAC_V)
            {
                sb.AppendFormat("Disc application code: {0}", decoded.DiscApplicationCode).AppendLine();
            }

            if (decoded.OPCTables == null)
            {
                return(sb.ToString());
            }

            foreach (OPCTable table in decoded.OPCTables)
            {
                sb.AppendFormat("OPC values for {0}Kbit/sec.: {1}, {2}, {3}, {4}, {5}, {6}", table.Speed,
                                table.OPCValues[0], table.OPCValues[1], table.OPCValues[2], table.OPCValues[3],
                                table.OPCValues[4], table.OPCValues[5]).AppendLine();
            }

            return(sb.ToString());
        }
Exemple #2
0
        public static StandardDiscInformation?Decode000b(byte[] response)
        {
            if (response.Length < 34)
            {
                return(null);
            }

            if ((response[2] & 0xE0) != 0)
            {
                return(null);
            }

            StandardDiscInformation decoded =
                new StandardDiscInformation {
                DataLength = (ushort)((response[0] << 8) + response[1])
            };

            if (decoded.DataLength + 2 != response.Length)
            {
                return(null);
            }

            decoded.DataType              = (byte)((response[2] & 0xE0) >> 5);
            decoded.Erasable             |= (response[2] & 0x10) == 0x10;
            decoded.LastSessionStatus     = (byte)((response[2] & 0x0C) >> 2);
            decoded.DiscStatus            = (byte)(response[2] & 0x03);
            decoded.FirstTrackNumber      = response[3];
            decoded.Sessions              = (ushort)((response[9] << 8) + response[4]);
            decoded.FirstTrackLastSession = (ushort)((response[10] << 8) + response[5]);
            decoded.LastTrackLastSession  = (ushort)((response[11] << 8) + response[6]);

            decoded.DID_V         |= (response[7] & 0x80) == 0x80;
            decoded.DBC_V         |= (response[7] & 0x40) == 0x40;
            decoded.URU           |= (response[7] & 0x20) == 0x20;
            decoded.DAC_V         |= (response[7] & 0x10) == 0x10;
            decoded.Reserved      |= (response[7] & 0x08) == 0x08;
            decoded.Dbit          |= (response[7] & 0x04) == 0x04;
            decoded.BGFormatStatus = (byte)(response[7] & 0x03);

            decoded.DiscIdentification =
                (uint)((response[12] << 24) + (response[13] << 16) + (response[14] << 8) + response[15]);
            decoded.LastSessionLeadInStartLBA =
                (uint)((response[16] << 24) + (response[17] << 16) + (response[18] << 8) + response[19]);
            decoded.LastPossibleLeadOutStartLBA =
                (uint)((response[20] << 24) + (response[21] << 16) + (response[22] << 8) + response[23]);

            byte[] temp = new byte[8];
            Array.Copy(response, 24, temp, 0, 8);
            Array.Reverse(temp);
            decoded.DiscBarcode = BitConverter.ToUInt64(temp, 0);

            decoded.DiscApplicationCode = response[32];
            decoded.OPCTablesNumber     = response[33];

            if (decoded.OPCTablesNumber <= 0 || response.Length != decoded.OPCTablesNumber * 8 + 34)
            {
                return(decoded);
            }

            decoded.OPCTables = new OPCTable[decoded.OPCTablesNumber];
            for (int i = 0; i < decoded.OPCTablesNumber; i++)
            {
                decoded.OPCTables[i].Speed     = (ushort)((response[34 + i * 8 + 0] << 16) + response[34 + i * 8 + 1]);
                decoded.OPCTables[i].OPCValues = new byte[6];
                Array.Copy(response, 34 + i * 8 + 2, decoded.OPCTables[i].OPCValues, 0, 6);
            }

            return(decoded);
        }