예제 #1
0
        public static CDSessionInfo?Decode(byte[] CDSessionInfoResponse)
        {
            if (CDSessionInfoResponse == null ||
                CDSessionInfoResponse.Length <= 4)
            {
                return(null);
            }

            var decoded = new CDSessionInfo
            {
                DataLength           = BigEndianBitConverter.ToUInt16(CDSessionInfoResponse, 0),
                FirstCompleteSession = CDSessionInfoResponse[2],
                LastCompleteSession  = CDSessionInfoResponse[3]
            };

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

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

                return(null);
            }

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

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

            return(decoded);
        }
예제 #2
0
        public static string Prettify(CDSessionInfo?CDSessionInfoResponse)
        {
            if (CDSessionInfoResponse == null)
            {
                return(null);
            }

            CDSessionInfo response = CDSessionInfoResponse.Value;

            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("First complete session number: {0}", response.FirstCompleteSession).AppendLine();
            sb.AppendFormat("Last complete session number: {0}", response.LastCompleteSession).AppendLine();
            foreach (TrackDataDescriptor descriptor in response.TrackDescriptors)
            {
                sb.AppendFormat("First track number in last complete session: {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.CurrentPosition:
                    sb.AppendLine("Q subchannel stores current position");
                    break;

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

                case TocAdr.MediaCatalogNumber:
                    sb.AppendLine("Q subchannel stores media catalog number");
                    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("Stereo 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());
        }