/// <summary> /// Sends the Pioneer READ CD-DA MSF command /// </summary> /// <returns><c>true</c> if the command failed and <paramref name="senseBuffer" /> contains the sense buffer.</returns> /// <param name="buffer">Buffer where the Pioneer READ CD-DA MSF response will be stored</param> /// <param name="senseBuffer">Sense buffer.</param> /// <param name="timeout">Timeout in seconds.</param> /// <param name="duration">Duration in milliseconds it took for the device to execute the command.</param> /// <param name="startMsf">Start MM:SS:FF of read encoded as 0x00MMSSFF.</param> /// <param name="endMsf">End MM:SS:FF of read encoded as 0x00MMSSFF.</param> /// <param name="blockSize">Block size.</param> /// <param name="subchannel">Subchannel selection.</param> public bool PioneerReadCdDaMsf(out byte[] buffer, out byte[] senseBuffer, uint startMsf, uint endMsf, uint blockSize, PioneerSubchannel subchannel, uint timeout, out double duration) { senseBuffer = new byte[32]; byte[] cdb = new byte[12]; cdb[0] = (byte)ScsiCommands.ReadCdDaMsf; cdb[3] = (byte)((startMsf & 0xFF0000) >> 16); cdb[4] = (byte)((startMsf & 0xFF00) >> 8); cdb[5] = (byte)(startMsf & 0xFF); cdb[7] = (byte)((endMsf & 0xFF0000) >> 16); cdb[8] = (byte)((endMsf & 0xFF00) >> 8); cdb[9] = (byte)(endMsf & 0xFF); cdb[10] = (byte)subchannel; uint transferLength = (uint)((cdb[7] - cdb[3]) * 60 * 75 + (cdb[8] - cdb[4]) * 75 + (cdb[9] - cdb[5])); buffer = new byte[blockSize * transferLength]; LastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out bool sense); Error = LastError != 0; DicConsole.DebugWriteLine("SCSI Device", "PIONEER READ CD-DA MSF took {0} ms.", duration); return(sense); }
/// <summary> /// Sends the Pioneer READ CD-DA command /// </summary> /// <returns><c>true</c> if the command failed and <paramref name="senseBuffer" /> contains the sense buffer.</returns> /// <param name="buffer">Buffer where the Pioneer READ CD-DA response will be stored</param> /// <param name="senseBuffer">Sense buffer.</param> /// <param name="timeout">Timeout in seconds.</param> /// <param name="duration">Duration in milliseconds it took for the device to execute the command.</param> /// <param name="lba">Start block address.</param> /// <param name="transferLength">How many blocks to read.</param> /// <param name="blockSize">Block size.</param> /// <param name="subchannel">Subchannel selection.</param> public bool PioneerReadCdDa(out byte[] buffer, out byte[] senseBuffer, uint lba, uint blockSize, uint transferLength, PioneerSubchannel subchannel, uint timeout, out double duration) { senseBuffer = new byte[32]; byte[] cdb = new byte[12]; cdb[0] = (byte)ScsiCommands.ReadCdDa; cdb[2] = (byte)((lba & 0xFF000000) >> 24); cdb[3] = (byte)((lba & 0xFF0000) >> 16); cdb[4] = (byte)((lba & 0xFF00) >> 8); cdb[5] = (byte)(lba & 0xFF); cdb[7] = (byte)((transferLength & 0xFF0000) >> 16); cdb[8] = (byte)((transferLength & 0xFF00) >> 8); cdb[9] = (byte)(transferLength & 0xFF); cdb[10] = (byte)subchannel; buffer = new byte[blockSize * transferLength]; LastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out bool sense); Error = LastError != 0; DicConsole.DebugWriteLine("SCSI Device", "PIONEER READ CD-DA took {0} ms.", duration); return(sense); }
static void ReadCdDa(string devPath, Device dev) { uint address = 0; uint length = 1; PioneerSubchannel subchan = PioneerSubchannel.None; uint blockSize = 2352; string strDev; int item; parameters: while (true) { System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("Parameters for READ CD-DA command:"); AaruConsole.WriteLine("LBA: {0}", address); AaruConsole.WriteLine("Will transfer {0} sectors", length); AaruConsole.WriteLine("Subchannel mode: {0}", subchan); AaruConsole.WriteLine("{0} bytes per sectors", blockSize); AaruConsole.WriteLine(); AaruConsole.WriteLine("Choose what to do:"); AaruConsole.WriteLine("1.- Change parameters."); AaruConsole.WriteLine("2.- Send command with these parameters."); AaruConsole.WriteLine("0.- Return to Pioneer vendor commands menu."); strDev = System.Console.ReadLine(); if (!int.TryParse(strDev, out item)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); System.Console.ReadKey(); continue; } switch (item) { case 0: AaruConsole.WriteLine("Returning to Pioneer vendor commands menu..."); return; case 1: AaruConsole.Write("Logical Block Address?: "); strDev = System.Console.ReadLine(); if (!uint.TryParse(strDev, out address)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); address = 0; System.Console.ReadKey(); continue; } AaruConsole.Write("How many sectors to transfer?: "); strDev = System.Console.ReadLine(); if (!uint.TryParse(strDev, out length)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); length = 1; System.Console.ReadKey(); continue; } AaruConsole.WriteLine("Subchannel mode"); AaruConsole.WriteLine("Available values: {0} {1} {2} {3}", PioneerSubchannel.None, PioneerSubchannel.Q16, PioneerSubchannel.All, PioneerSubchannel.Only); AaruConsole.Write("Choose?: "); strDev = System.Console.ReadLine(); if (!Enum.TryParse(strDev, true, out subchan)) { AaruConsole.WriteLine("Not a correct page control. Press any key to continue..."); subchan = PioneerSubchannel.None; System.Console.ReadKey(); continue; } switch (subchan) { case PioneerSubchannel.Q16: blockSize = 2368; break; case PioneerSubchannel.All: blockSize = 2448; break; case PioneerSubchannel.Only: blockSize = 96; break; default: blockSize = 2352; break; } break; case 2: goto start; } } start: System.Console.Clear(); bool sense = dev.PioneerReadCdDa(out byte[] buffer, out byte[] senseBuffer, address, blockSize, length, subchan, dev.Timeout, out double duration); menu: AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("Sending READ CD-DA to the device:"); AaruConsole.WriteLine("Command took {0} ms.", duration); AaruConsole.WriteLine("Sense is {0}.", sense); AaruConsole.WriteLine("Buffer is {0} bytes.", buffer?.Length.ToString() ?? "null"); AaruConsole.WriteLine("Buffer is null or empty? {0}", ArrayHelpers.ArrayIsNullOrEmpty(buffer)); AaruConsole.WriteLine("Sense buffer is {0} bytes.", senseBuffer?.Length.ToString() ?? "null"); AaruConsole.WriteLine("Sense buffer is null or empty? {0}", ArrayHelpers.ArrayIsNullOrEmpty(senseBuffer)); AaruConsole.WriteLine(); AaruConsole.WriteLine("Choose what to do:"); AaruConsole.WriteLine("1.- Print buffer."); AaruConsole.WriteLine("2.- Print sense buffer."); AaruConsole.WriteLine("3.- Decode sense buffer."); AaruConsole.WriteLine("4.- Send command again."); AaruConsole.WriteLine("5.- Change parameters."); AaruConsole.WriteLine("0.- Return to Pioneer vendor commands menu."); AaruConsole.Write("Choose: "); strDev = System.Console.ReadLine(); if (!int.TryParse(strDev, out item)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); goto menu; } switch (item) { case 0: AaruConsole.WriteLine("Returning to Pioneer vendor commands menu..."); return; case 1: System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("READ CD-DA response:"); if (buffer != null) { PrintHex.PrintHexArray(buffer, 64); } AaruConsole.WriteLine("Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); goto menu; case 2: System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("READ CD-DA sense:"); if (senseBuffer != null) { PrintHex.PrintHexArray(senseBuffer, 64); } AaruConsole.WriteLine("Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); goto menu; case 3: System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("READ CD-DA decoded sense:"); AaruConsole.Write("{0}", Sense.PrettifySense(senseBuffer)); AaruConsole.WriteLine("Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); goto menu; case 4: goto start; case 5: goto parameters; default: AaruConsole.WriteLine("Incorrect option. Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); goto menu; } }
static void ReadCdDaMsf(string devPath, Device dev) { byte startFrame = 0; byte startSecond = 2; byte startMinute = 0; byte endFrame = 0; byte endSecond = 0; byte endMinute = 0; PioneerSubchannel subchan = PioneerSubchannel.None; uint blockSize = 2352; string strDev; int item; parameters: while (true) { System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("Parameters for READ CD-DA MSF command:"); AaruConsole.WriteLine("Start: {0:D2}:{1:D2}:{2:D2}", startMinute, startSecond, startFrame); AaruConsole.WriteLine("End: {0:D2}:{1:D2}:{2:D2}", endMinute, endSecond, endFrame); AaruConsole.WriteLine("Subchannel mode: {0}", subchan); AaruConsole.WriteLine("{0} bytes per sectors", blockSize); AaruConsole.WriteLine(); AaruConsole.WriteLine("Choose what to do:"); AaruConsole.WriteLine("1.- Change parameters."); AaruConsole.WriteLine("2.- Send command with these parameters."); AaruConsole.WriteLine("0.- Return to Pioneer vendor commands menu."); strDev = System.Console.ReadLine(); if (!int.TryParse(strDev, out item)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); System.Console.ReadKey(); continue; } switch (item) { case 0: AaruConsole.WriteLine("Returning to Pioneer vendor commands menu..."); return; case 1: AaruConsole.Write("Start minute?: "); strDev = System.Console.ReadLine(); if (!byte.TryParse(strDev, out startMinute)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); startMinute = 0; System.Console.ReadKey(); continue; } AaruConsole.Write("Start second?: "); strDev = System.Console.ReadLine(); if (!byte.TryParse(strDev, out startSecond)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); startSecond = 2; System.Console.ReadKey(); continue; } AaruConsole.Write("Start frame?: "); strDev = System.Console.ReadLine(); if (!byte.TryParse(strDev, out startFrame)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); startFrame = 0; System.Console.ReadKey(); continue; } AaruConsole.Write("End minute?: "); strDev = System.Console.ReadLine(); if (!byte.TryParse(strDev, out endMinute)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); endMinute = 0; System.Console.ReadKey(); continue; } AaruConsole.Write("End second?: "); strDev = System.Console.ReadLine(); if (!byte.TryParse(strDev, out endMinute)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); endMinute = 2; System.Console.ReadKey(); continue; } AaruConsole.Write("End frame?: "); strDev = System.Console.ReadLine(); if (!byte.TryParse(strDev, out endFrame)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); endFrame = 0; System.Console.ReadKey(); continue; } AaruConsole.WriteLine("Subchannel mode"); AaruConsole.WriteLine("Available values: {0} {1} {2} {3}", PioneerSubchannel.None, PioneerSubchannel.Q16, PioneerSubchannel.All, PioneerSubchannel.Only); AaruConsole.Write("Choose?: "); strDev = System.Console.ReadLine(); if (!Enum.TryParse(strDev, true, out subchan)) { AaruConsole.WriteLine("Not a correct page control. Press any key to continue..."); subchan = PioneerSubchannel.None; System.Console.ReadKey(); continue; } switch (subchan) { case PioneerSubchannel.Q16: blockSize = 2368; break; case PioneerSubchannel.All: blockSize = 2448; break; case PioneerSubchannel.Only: blockSize = 96; break; default: blockSize = 2352; break; } break; case 2: goto start; } } start: uint startMsf = (uint)((startMinute << 16) + (startSecond << 8) + startFrame); uint endMsf = (uint)((startMinute << 16) + (startSecond << 8) + startFrame); System.Console.Clear(); bool sense = dev.PioneerReadCdDaMsf(out byte[] buffer, out byte[] senseBuffer, startMsf, endMsf, blockSize, subchan, dev.Timeout, out double duration); menu: AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("Sending READ CD-DA MSF to the device:"); AaruConsole.WriteLine("Command took {0} ms.", duration); AaruConsole.WriteLine("Sense is {0}.", sense); AaruConsole.WriteLine("Buffer is {0} bytes.", buffer?.Length.ToString() ?? "null"); AaruConsole.WriteLine("Buffer is null or empty? {0}", ArrayHelpers.ArrayIsNullOrEmpty(buffer)); AaruConsole.WriteLine("Sense buffer is {0} bytes.", senseBuffer?.Length.ToString() ?? "null"); AaruConsole.WriteLine("Sense buffer is null or empty? {0}", ArrayHelpers.ArrayIsNullOrEmpty(senseBuffer)); AaruConsole.WriteLine(); AaruConsole.WriteLine("Choose what to do:"); AaruConsole.WriteLine("1.- Print buffer."); AaruConsole.WriteLine("2.- Print sense buffer."); AaruConsole.WriteLine("3.- Decode sense buffer."); AaruConsole.WriteLine("4.- Send command again."); AaruConsole.WriteLine("5.- Change parameters."); AaruConsole.WriteLine("0.- Return to Pioneer vendor commands menu."); AaruConsole.Write("Choose: "); strDev = System.Console.ReadLine(); if (!int.TryParse(strDev, out item)) { AaruConsole.WriteLine("Not a number. Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); goto menu; } switch (item) { case 0: AaruConsole.WriteLine("Returning to Pioneer vendor commands menu..."); return; case 1: System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("READ CD-DA MSF response:"); if (buffer != null) { PrintHex.PrintHexArray(buffer, 64); } AaruConsole.WriteLine("Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); goto menu; case 2: System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("READ CD-DA MSF sense:"); if (senseBuffer != null) { PrintHex.PrintHexArray(senseBuffer, 64); } AaruConsole.WriteLine("Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); goto menu; case 3: System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); AaruConsole.WriteLine("READ CD-DA MSF decoded sense:"); AaruConsole.Write("{0}", Sense.PrettifySense(senseBuffer)); AaruConsole.WriteLine("Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); AaruConsole.WriteLine("Device: {0}", devPath); goto menu; case 4: goto start; case 5: goto parameters; default: AaruConsole.WriteLine("Incorrect option. Press any key to continue..."); System.Console.ReadKey(); System.Console.Clear(); goto menu; } }