lincd.pp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  1. {
  2. Copyright (c) 1999-2000 by Michael Van Canneyt
  3. Unit containing definitions from the Linux CDROM kernel interface.
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {$IFNDEF FPC_DOTTEDUNITS}
  11. unit lincd;
  12. {$ENDIF FPC_DOTTEDUNITS}
  13. {$mode objfpc}
  14. interface
  15. {$IFDEF FPC_DOTTEDUNITS}
  16. uses
  17. UnixApi.Base,
  18. UnixApi.Unix;
  19. {$ELSE FPC_DOTTEDUNITS}
  20. uses
  21. baseunix,
  22. unix;
  23. {$ENDIF FPC_DOTTEDUNITS}
  24. { ---------------------------------------------------------------------
  25. cdrom.h header translation.
  26. ---------------------------------------------------------------------}
  27. { Pointers to basic pascal types, inserted by h2pas conversion program.}
  28. Type
  29. PLongint = ^Longint;
  30. PSmallInt = ^SmallInt;
  31. PByte = ^Byte;
  32. PWord = ^Word;
  33. PDWord = ^DWord;
  34. PDouble = ^Double;
  35. TU8 = Byte;
  36. PU8 = ^TU8;
  37. TU32 = Cardinal;
  38. PU32 = ^TU32;
  39. {$PACKRECORDS C}
  40. const
  41. EDRIVE_CANT_DO_THIS = ESysEOPNOTSUPP; // = 95
  42. CDROMPAUSE = $5301;
  43. CDROMRESUME = $5302;
  44. CDROMPLAYMSF = $5303;
  45. CDROMPLAYTRKIND = $5304;
  46. CDROMREADTOCHDR = $5305;
  47. CDROMREADTOCENTRY = $5306;
  48. CDROMSTOP = $5307;
  49. CDROMSTART = $5308;
  50. CDROMEJECT = $5309;
  51. CDROMVOLCTRL = $530a;
  52. CDROMSUBCHNL = $530b;
  53. CDROMREADMODE2 = $530c;
  54. CDROMREADMODE1 = $530d;
  55. CDROMREADAUDIO = $530e;
  56. CDROMEJECT_SW = $530f;
  57. CDROMMULTISESSION = $5310;
  58. CDROM_GET_MCN = $5311;
  59. CDROM_GET_UPC = CDROM_GET_MCN;
  60. CDROMRESET = $5312;
  61. CDROMVOLREAD = $5313;
  62. CDROMREADRAW = $5314;
  63. CDROMREADCOOKED = $5315;
  64. CDROMSEEK = $5316;
  65. CDROMPLAYBLK = $5317;
  66. CDROMREADALL = $5318;
  67. CDROMGETSPINDOWN = $531d;
  68. CDROMSETSPINDOWN = $531e;
  69. CDROMCLOSETRAY = $5319;
  70. CDROM_SET_OPTIONS = $5320;
  71. CDROM_CLEAR_OPTIONS = $5321;
  72. CDROM_SELECT_SPEED = $5322;
  73. CDROM_SELECT_DISC = $5323;
  74. CDROM_MEDIA_CHANGED = $5325;
  75. CDROM_DRIVE_STATUS = $5326;
  76. CDROM_DISC_STATUS = $5327;
  77. CDROM_CHANGER_NSLOTS = $5328;
  78. CDROM_LOCKDOOR = $5329;
  79. CDROM_DEBUG = $5330;
  80. CDROM_GET_CAPABILITY = $5331;
  81. CDROMAUDIOBUFSIZ = $5382;
  82. DVD_READ_STRUCT = $5390;
  83. DVD_WRITE_STRUCT = $5391;
  84. DVD_AUTH = $5392;
  85. CDROM_SEND_PACKET = $5393;
  86. CDROM_NEXT_WRITABLE = $5394;
  87. CDROM_LAST_WRITTEN = $5395;
  88. type
  89. Pcdrom_msf0 = ^Tcdrom_msf0;
  90. Tcdrom_msf0 = record
  91. minute : Tu8;
  92. second : Tu8;
  93. frame : Tu8;
  94. end;
  95. Pcdrom_addr = ^Tcdrom_addr;
  96. Tcdrom_addr = record
  97. case longint of
  98. 0 : ( msf : Tcdrom_msf0 );
  99. 1 : ( lba : longint );
  100. end;
  101. Pcdrom_msf = ^Tcdrom_msf;
  102. Tcdrom_msf = record
  103. cdmsf_min0 : Tu8;
  104. cdmsf_sec0 : Tu8;
  105. cdmsf_frame0 : Tu8;
  106. cdmsf_min1 : Tu8;
  107. cdmsf_sec1 : Tu8;
  108. cdmsf_frame1 : Tu8;
  109. end;
  110. Pcdrom_ti = ^Tcdrom_ti;
  111. Tcdrom_ti = record
  112. cdti_trk0 : Tu8;
  113. cdti_ind0 : Tu8;
  114. cdti_trk1 : Tu8;
  115. cdti_ind1 : Tu8;
  116. end;
  117. Pcdrom_tochdr = ^Tcdrom_tochdr;
  118. Tcdrom_tochdr = record
  119. cdth_trk0 : Tu8;
  120. cdth_trk1 : Tu8;
  121. end;
  122. Pcdrom_volctrl = ^Tcdrom_volctrl;
  123. Tcdrom_volctrl = record
  124. channel0 : Tu8;
  125. channel1 : Tu8;
  126. channel2 : Tu8;
  127. channel3 : Tu8;
  128. end;
  129. Pcdrom_subchnl = ^Tcdrom_subchnl;
  130. Tcdrom_subchnl = record
  131. cdsc_format : Tu8;
  132. cdsc_audiostatus : Tu8;
  133. flag0 : word;
  134. cdsc_trk : Tu8;
  135. cdsc_ind : Tu8;
  136. cdsc_absaddr : Tcdrom_addr;
  137. cdsc_reladdr : Tcdrom_addr;
  138. end;
  139. const
  140. bm_Tcdrom_subchnl_cdsc_adr = $F;
  141. bp_Tcdrom_subchnl_cdsc_adr = 0;
  142. bm_Tcdrom_subchnl_cdsc_ctrl = $F0;
  143. bp_Tcdrom_subchnl_cdsc_ctrl = 4;
  144. function cdsc_adr(var a : Tcdrom_subchnl) : Tu8;
  145. procedure set_cdsc_adr(var a : Tcdrom_subchnl; __cdsc_adr : Tu8);
  146. function cdsc_ctrl(var a : Tcdrom_subchnl) : Tu8;
  147. procedure set_cdsc_ctrl(var a : Tcdrom_subchnl; __cdsc_ctrl : Tu8);
  148. type
  149. Pcdrom_tocentry = ^Tcdrom_tocentry;
  150. Tcdrom_tocentry = record
  151. cdte_track : Tu8;
  152. flag0 : tu8;
  153. cdte_format : Tu8;
  154. cdte_addr : Tcdrom_addr;
  155. cdte_datamode : Tu8;
  156. end;
  157. const
  158. bm_Tcdrom_tocentry_cdte_adr = $F;
  159. bp_Tcdrom_tocentry_cdte_adr = 0;
  160. bm_Tcdrom_tocentry_cdte_ctrl = $F0;
  161. bp_Tcdrom_tocentry_cdte_ctrl = 4;
  162. function cdte_adr(var a : Tcdrom_tocentry) : Tu8;
  163. procedure set_cdte_adr(var a : Tcdrom_tocentry; __cdte_adr : Tu8);
  164. function cdte_ctrl(var a : Tcdrom_tocentry) : Tu8;
  165. procedure set_cdte_ctrl(var a : Tcdrom_tocentry; __cdte_ctrl : Tu8);
  166. type
  167. Pcdrom_read = ^Tcdrom_read;
  168. Tcdrom_read = record
  169. cdread_lba : longint;
  170. cdread_bufaddr : PAnsiChar;
  171. cdread_buflen : longint;
  172. end;
  173. Pcdrom_read_audio = ^Tcdrom_read_audio;
  174. Tcdrom_read_audio = record
  175. addr : Tcdrom_addr;
  176. addr_format : Tu8;
  177. nframes : longint;
  178. buf : Pu8;
  179. end;
  180. Pcdrom_multisession = ^Tcdrom_multisession;
  181. Tcdrom_multisession = record
  182. addr : Tcdrom_addr;
  183. xa_flag : Tu8;
  184. addr_format : Tu8;
  185. end;
  186. Pcdrom_mcn = ^Tcdrom_mcn;
  187. Tcdrom_mcn = record
  188. medium_catalog_number : array[0..13] of Tu8;
  189. end;
  190. Pcdrom_blk = ^Tcdrom_blk;
  191. Tcdrom_blk = record
  192. from : dword;
  193. len : word;
  194. end;
  195. const
  196. CDROM_PACKET_SIZE = 12;
  197. CGC_DATA_UNKNOWN = 0;
  198. CGC_DATA_WRITE = 1;
  199. CGC_DATA_READ = 2;
  200. CGC_DATA_NONE = 3;
  201. // Moved here
  202. type
  203. Prequest_sense = ^Trequest_sense;
  204. Trequest_sense = record
  205. flag0 : word;
  206. segment_number : Tu8;
  207. flag1 : word;
  208. information : array[0..3] of Tu8;
  209. add_sense_len : Tu8;
  210. command_info : array[0..3] of Tu8;
  211. asc : Tu8;
  212. ascq : Tu8;
  213. fruc : Tu8;
  214. sks : array[0..2] of Tu8;
  215. asb : array[0..45] of Tu8;
  216. end;
  217. Pcdrom_generic_command = ^Tcdrom_generic_command;
  218. Tcdrom_generic_command = record
  219. cmd : array[0..(CDROM_PACKET_SIZE)-1] of byte;
  220. buffer : Pbyte;
  221. buflen : dword;
  222. stat : longint;
  223. sense : Prequest_sense;
  224. data_direction : byte;
  225. quiet : longint;
  226. timeout : longint;
  227. reserved : array[0..0] of pointer;
  228. end;
  229. const
  230. CD_MINS = 74;
  231. CD_SECS = 60;
  232. CD_FRAMES = 75;
  233. CD_SYNC_SIZE = 12;
  234. CD_MSF_OFFSET = 150;
  235. CD_CHUNK_SIZE = 24;
  236. CD_NUM_OF_CHUNKS = 98;
  237. CD_FRAMESIZE_SUB = 96;
  238. CD_HEAD_SIZE = 4;
  239. CD_SUBHEAD_SIZE = 8;
  240. CD_EDC_SIZE = 4;
  241. CD_ZERO_SIZE = 8;
  242. CD_ECC_SIZE = 276;
  243. CD_FRAMESIZE = 2048;
  244. CD_FRAMESIZE_RAW = 2352;
  245. CD_FRAMESIZE_RAWER = 2646;
  246. CD_FRAMESIZE_RAW1 = CD_FRAMESIZE_RAW - CD_SYNC_SIZE;
  247. CD_FRAMESIZE_RAW0 = (CD_FRAMESIZE_RAW - CD_SYNC_SIZE) - CD_HEAD_SIZE;
  248. CD_XA_HEAD = CD_HEAD_SIZE + CD_SUBHEAD_SIZE;
  249. CD_XA_TAIL = CD_EDC_SIZE + CD_ECC_SIZE;
  250. CD_XA_SYNC_HEAD = CD_SYNC_SIZE + CD_XA_HEAD;
  251. CDROM_LBA = $01;
  252. CDROM_MSF = $02;
  253. CDROM_DATA_TRACK = $04;
  254. CDROM_LEADOUT = $AA;
  255. CDROM_AUDIO_INVALID = $00;
  256. CDROM_AUDIO_PLAY = $11;
  257. CDROM_AUDIO_PAUSED = $12;
  258. CDROM_AUDIO_COMPLETED = $13;
  259. CDROM_AUDIO_ERROR = $14;
  260. CDROM_AUDIO_NO_STATUS = $15;
  261. CDC_CLOSE_TRAY = $1;
  262. CDC_OPEN_TRAY = $2;
  263. CDC_LOCK = $4;
  264. CDC_SELECT_SPEED = $8;
  265. CDC_SELECT_DISC = $10;
  266. CDC_MULTI_SESSION = $20;
  267. CDC_MCN = $40;
  268. CDC_MEDIA_CHANGED = $80;
  269. CDC_PLAY_AUDIO = $100;
  270. CDC_RESET = $200;
  271. CDC_IOCTLS = $400;
  272. CDC_DRIVE_STATUS = $800;
  273. CDC_GENERIC_PACKET = $1000;
  274. CDC_CD_R = $2000;
  275. CDC_CD_RW = $4000;
  276. CDC_DVD = $8000;
  277. CDC_DVD_R = $10000;
  278. CDC_DVD_RAM = $20000;
  279. CDS_NO_INFO = 0;
  280. CDS_NO_DISC = 1;
  281. CDS_TRAY_OPEN = 2;
  282. CDS_DRIVE_NOT_READY = 3;
  283. CDS_DISC_OK = 4;
  284. CDS_AUDIO = 100;
  285. CDS_DATA_1 = 101;
  286. CDS_DATA_2 = 102;
  287. CDS_XA_2_1 = 103;
  288. CDS_XA_2_2 = 104;
  289. CDS_MIXED = 105;
  290. CDO_AUTO_CLOSE = $1;
  291. CDO_AUTO_EJECT = $2;
  292. CDO_USE_FFLAGS = $4;
  293. CDO_LOCK = $8;
  294. CDO_CHECK_TYPE = $10;
  295. { was #define dname def_expr }
  296. function CDSL_NONE : longint;
  297. { return type might be wrong }
  298. { was #define dname def_expr }
  299. function CDSL_CURRENT : longint;
  300. const
  301. CD_PART_MAX = 64;
  302. CD_PART_MASK = CD_PART_MAX - 1;
  303. GPCMD_BLANK = $a1;
  304. GPCMD_CLOSE_TRACK = $5b;
  305. GPCMD_FLUSH_CACHE = $35;
  306. GPCMD_FORMAT_UNIT = $04;
  307. GPCMD_GET_CONFIGURATION = $46;
  308. GPCMD_GET_EVENT_STATUS_NOTIFICATION = $4a;
  309. GPCMD_GET_PERFORMANCE = $ac;
  310. GPCMD_INQUIRY = $12;
  311. GPCMD_LOAD_UNLOAD = $a6;
  312. GPCMD_MECHANISM_STATUS = $bd;
  313. GPCMD_MODE_SELECT_10 = $55;
  314. GPCMD_MODE_SENSE_10 = $5a;
  315. GPCMD_PAUSE_RESUME = $4b;
  316. GPCMD_PLAY_AUDIO_10 = $45;
  317. GPCMD_PLAY_AUDIO_MSF = $47;
  318. GPCMD_PLAY_AUDIO_TI = $48;
  319. GPCMD_PLAY_CD = $bc;
  320. GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL = $1e;
  321. GPCMD_READ_10 = $28;
  322. GPCMD_READ_12 = $a8;
  323. GPCMD_READ_CDVD_CAPACITY = $25;
  324. GPCMD_READ_CD = $be;
  325. GPCMD_READ_CD_MSF = $b9;
  326. GPCMD_READ_DISC_INFO = $51;
  327. GPCMD_READ_DVD_STRUCTURE = $ad;
  328. GPCMD_READ_FORMAT_CAPACITIES = $23;
  329. GPCMD_READ_HEADER = $44;
  330. GPCMD_READ_TRACK_RZONE_INFO = $52;
  331. GPCMD_READ_SUBCHANNEL = $42;
  332. GPCMD_READ_TOC_PMA_ATIP = $43;
  333. GPCMD_REPAIR_RZONE_TRACK = $58;
  334. GPCMD_REPORT_KEY = $a4;
  335. GPCMD_REQUEST_SENSE = $03;
  336. GPCMD_RESERVE_RZONE_TRACK = $53;
  337. GPCMD_SCAN = $ba;
  338. GPCMD_SEEK = $2b;
  339. GPCMD_SEND_DVD_STRUCTURE = $ad;
  340. GPCMD_SEND_EVENT = $a2;
  341. GPCMD_SEND_KEY = $a3;
  342. GPCMD_SEND_OPC = $54;
  343. GPCMD_SET_READ_AHEAD = $a7;
  344. GPCMD_SET_STREAMING = $b6;
  345. GPCMD_START_STOP_UNIT = $1b;
  346. GPCMD_STOP_PLAY_SCAN = $4e;
  347. GPCMD_TEST_UNIT_READY = $00;
  348. GPCMD_VERIFY_10 = $2f;
  349. GPCMD_WRITE_10 = $2a;
  350. GPCMD_WRITE_AND_VERIFY_10 = $2e;
  351. GPCMD_SET_SPEED = $bb;
  352. GPCMD_PLAYAUDIO_TI = $48;
  353. GPCMD_GET_MEDIA_STATUS = $da;
  354. GPMODE_R_W_ERROR_PAGE = $01;
  355. GPMODE_WRITE_PARMS_PAGE = $05;
  356. GPMODE_AUDIO_CTL_PAGE = $0e;
  357. GPMODE_POWER_PAGE = $1a;
  358. GPMODE_FAULT_FAIL_PAGE = $1c;
  359. GPMODE_TO_PROTECT_PAGE = $1d;
  360. GPMODE_CAPABILITIES_PAGE = $2a;
  361. GPMODE_ALL_PAGES = $3f;
  362. GPMODE_CDROM_PAGE = $0d;
  363. DVD_STRUCT_PHYSICAL = $00;
  364. DVD_STRUCT_COPYRIGHT = $01;
  365. DVD_STRUCT_DISCKEY = $02;
  366. DVD_STRUCT_BCA = $03;
  367. DVD_STRUCT_MANUFACT = $04;
  368. type
  369. Pdvd_layer = ^Tdvd_layer;
  370. Tdvd_layer = record
  371. flag0 : longint;
  372. start_sector : Tu32;
  373. end_sector : Tu32;
  374. end_sector_l0 : Tu32;
  375. end;
  376. const
  377. bm_Tdvd_layer_book_version = $F;
  378. bp_Tdvd_layer_book_version = 0;
  379. bm_Tdvd_layer_book_type = $F0;
  380. bp_Tdvd_layer_book_type = 4;
  381. bm_Tdvd_layer_min_rate = $F00;
  382. bp_Tdvd_layer_min_rate = 8;
  383. bm_Tdvd_layer_disc_size = $F000;
  384. bp_Tdvd_layer_disc_size = 12;
  385. bm_Tdvd_layer_layer_type = $F0000;
  386. bp_Tdvd_layer_layer_type = 16;
  387. bm_Tdvd_layer_track_path = $100000;
  388. bp_Tdvd_layer_track_path = 20;
  389. bm_Tdvd_layer_nlayers = $600000;
  390. bp_Tdvd_layer_nlayers = 21;
  391. bm_Tdvd_layer_track_density = $7800000;
  392. bp_Tdvd_layer_track_density = 23;
  393. bm_Tdvd_layer_linear_density = $78000000;
  394. bp_Tdvd_layer_linear_density = 27;
  395. bm_Tdvd_layer_bca = $80000000;
  396. bp_Tdvd_layer_bca = 31;
  397. function book_version(var a : Tdvd_layer) : Tu8;
  398. procedure set_book_version(var a : Tdvd_layer; __book_version : Tu8);
  399. function book_type(var a : Tdvd_layer) : Tu8;
  400. procedure set_book_type(var a : Tdvd_layer; __book_type : Tu8);
  401. function min_rate(var a : Tdvd_layer) : Tu8;
  402. procedure set_min_rate(var a : Tdvd_layer; __min_rate : Tu8);
  403. function disc_size(var a : Tdvd_layer) : Tu8;
  404. procedure set_disc_size(var a : Tdvd_layer; __disc_size : Tu8);
  405. function layer_type(var a : Tdvd_layer) : Tu8;
  406. procedure set_layer_type(var a : Tdvd_layer; __layer_type : Tu8);
  407. function track_path(var a : Tdvd_layer) : Tu8;
  408. procedure set_track_path(var a : Tdvd_layer; __track_path : Tu8);
  409. function nlayers(var a : Tdvd_layer) : Tu8;
  410. procedure set_nlayers(var a : Tdvd_layer; __nlayers : Tu8);
  411. function track_density(var a : Tdvd_layer) : Tu8;
  412. procedure set_track_density(var a : Tdvd_layer; __track_density : Tu8);
  413. function linear_density(var a : Tdvd_layer) : Tu8;
  414. procedure set_linear_density(var a : Tdvd_layer; __linear_density : Tu8);
  415. function bca(var a : Tdvd_layer) : Tu8;
  416. procedure set_bca(var a : Tdvd_layer; __bca : Tu8);
  417. const
  418. DVD_LAYERS = 4;
  419. type
  420. Pdvd_physical = ^Tdvd_physical;
  421. Tdvd_physical = record
  422. _type : Tu8;
  423. layer_num : Tu8;
  424. layer : array[0..(DVD_LAYERS)-1] of Tdvd_layer;
  425. end;
  426. Pdvd_copyright = ^Tdvd_copyright;
  427. Tdvd_copyright = record
  428. _type : Tu8;
  429. layer_num : Tu8;
  430. cpst : Tu8;
  431. rmi : Tu8;
  432. end;
  433. Pdvd_disckey = ^Tdvd_disckey;
  434. Tdvd_disckey = record
  435. _type : Tu8;
  436. flag0 : word;
  437. value : array[0..2047] of Tu8;
  438. end;
  439. const
  440. bm_Tdvd_disckey_agid = $3;
  441. bp_Tdvd_disckey_agid = 0;
  442. function agid(var a : Tdvd_disckey) : dword;
  443. procedure set_agid(var a : Tdvd_disckey; __agid : dword);
  444. type
  445. Pdvd_bca = ^Tdvd_bca;
  446. Tdvd_bca = record
  447. _type : Tu8;
  448. len : longint;
  449. value : array[0..187] of Tu8;
  450. end;
  451. Pdvd_manufact = ^Tdvd_manufact;
  452. Tdvd_manufact = record
  453. _type : Tu8;
  454. layer_num : Tu8;
  455. len : longint;
  456. value : array[0..2047] of Tu8;
  457. end;
  458. Pdvd_struct = ^Tdvd_struct;
  459. Tdvd_struct = record
  460. case longint of
  461. 0 : ( _type : Tu8 );
  462. 1 : ( physical : Tdvd_physical );
  463. 2 : ( copyright : Tdvd_copyright );
  464. 3 : ( disckey : Tdvd_disckey );
  465. 4 : ( bca : Tdvd_bca );
  466. 5 : ( manufact : Tdvd_manufact );
  467. end;
  468. const
  469. DVD_LU_SEND_AGID = 0;
  470. DVD_HOST_SEND_CHALLENGE = 1;
  471. DVD_LU_SEND_KEY1 = 2;
  472. DVD_LU_SEND_CHALLENGE = 3;
  473. DVD_HOST_SEND_KEY2 = 4;
  474. DVD_AUTH_ESTABLISHED = 5;
  475. DVD_AUTH_FAILURE = 6;
  476. DVD_LU_SEND_TITLE_KEY = 7;
  477. DVD_LU_SEND_ASF = 8;
  478. DVD_INVALIDATE_AGID = 9;
  479. DVD_LU_SEND_RPC_STATE = 10;
  480. DVD_HOST_SEND_RPC_STATE = 11;
  481. type
  482. Pdvd_key = ^Tdvd_key;
  483. Tdvd_key = Tu8;
  484. Pdvd_challenge = ^Tdvd_challenge;
  485. Tdvd_challenge = Tu8;
  486. Pdvd_lu_send_agid = ^Tdvd_lu_send_agid;
  487. Tdvd_lu_send_agid = record
  488. _type : Tu8;
  489. flag0 : word;
  490. end;
  491. const
  492. bm_Tdvd_lu_send_agid_agid = $3;
  493. bp_Tdvd_lu_send_agid_agid = 0;
  494. function agid(var a : Tdvd_lu_send_agid) : dword;
  495. procedure set_agid(var a : Tdvd_lu_send_agid; __agid : dword);
  496. type
  497. Pdvd_host_send_challenge = ^Tdvd_host_send_challenge;
  498. Tdvd_host_send_challenge = record
  499. _type : Tu8;
  500. flag0 : word;
  501. chal : Tdvd_challenge;
  502. end;
  503. const
  504. bm_Tdvd_host_send_challenge_agid = $3;
  505. bp_Tdvd_host_send_challenge_agid = 0;
  506. function agid(var a : Tdvd_host_send_challenge) : dword;
  507. procedure set_agid(var a : Tdvd_host_send_challenge; __agid : dword);
  508. type
  509. Pdvd_send_key = ^Tdvd_send_key;
  510. Tdvd_send_key = record
  511. _type : Tu8;
  512. flag0 : word;
  513. key : Tdvd_key;
  514. end;
  515. const
  516. bm_Tdvd_send_key_agid = $3;
  517. bp_Tdvd_send_key_agid = 0;
  518. function agid(var a : Tdvd_send_key) : dword;
  519. procedure set_agid(var a : Tdvd_send_key; __agid : dword);
  520. type
  521. Pdvd_lu_send_challenge = ^Tdvd_lu_send_challenge;
  522. Tdvd_lu_send_challenge = record
  523. _type : Tu8;
  524. flag0 : word;
  525. chal : Tdvd_challenge;
  526. end;
  527. const
  528. bm_Tdvd_lu_send_challenge_agid = $3;
  529. bp_Tdvd_lu_send_challenge_agid = 0;
  530. function agid(var a : Tdvd_lu_send_challenge) : dword;
  531. procedure set_agid(var a : Tdvd_lu_send_challenge; __agid : dword);
  532. const
  533. DVD_CPM_NO_COPYRIGHT = 0;
  534. DVD_CPM_COPYRIGHTED = 1;
  535. DVD_CP_SEC_NONE = 0;
  536. DVD_CP_SEC_EXIST = 1;
  537. DVD_CGMS_UNRESTRICTED = 0;
  538. DVD_CGMS_SINGLE = 2;
  539. DVD_CGMS_RESTRICTED = 3;
  540. type
  541. Pdvd_lu_send_title_key = ^Tdvd_lu_send_title_key;
  542. Tdvd_lu_send_title_key = record
  543. _type : Tu8;
  544. flag0 : word;
  545. title_key : Tdvd_key;
  546. lba : longint;
  547. flag1 : word;
  548. end;
  549. const
  550. bm_Tdvd_lu_send_title_key_agid = $3;
  551. bp_Tdvd_lu_send_title_key_agid = 0;
  552. bm_Tdvd_lu_send_title_key_cpm = $1;
  553. bp_Tdvd_lu_send_title_key_cpm = 0;
  554. bm_Tdvd_lu_send_title_key_cp_sec = $2;
  555. bp_Tdvd_lu_send_title_key_cp_sec = 1;
  556. bm_Tdvd_lu_send_title_key_cgms = $C;
  557. bp_Tdvd_lu_send_title_key_cgms = 2;
  558. function agid(var a : Tdvd_lu_send_title_key) : dword;
  559. procedure set_agid(var a : Tdvd_lu_send_title_key; __agid : dword);
  560. function cpm(var a : Tdvd_lu_send_title_key) : dword;
  561. procedure set_cpm(var a : Tdvd_lu_send_title_key; __cpm : dword);
  562. function cp_sec(var a : Tdvd_lu_send_title_key) : dword;
  563. procedure set_cp_sec(var a : Tdvd_lu_send_title_key; __cp_sec : dword);
  564. function cgms(var a : Tdvd_lu_send_title_key) : dword;
  565. procedure set_cgms(var a : Tdvd_lu_send_title_key; __cgms : dword);
  566. type
  567. Pdvd_lu_send_asf = ^Tdvd_lu_send_asf;
  568. Tdvd_lu_send_asf = record
  569. _type : Tu8;
  570. flag0 : word;
  571. end;
  572. const
  573. bm_Tdvd_lu_send_asf_agid = $3;
  574. bp_Tdvd_lu_send_asf_agid = 0;
  575. bm_Tdvd_lu_send_asf_asf = $4;
  576. bp_Tdvd_lu_send_asf_asf = 2;
  577. function agid(var a : Tdvd_lu_send_asf) : dword;
  578. procedure set_agid(var a : Tdvd_lu_send_asf; __agid : dword);
  579. function asf(var a : Tdvd_lu_send_asf) : dword;
  580. procedure set_asf(var a : Tdvd_lu_send_asf; __asf : dword);
  581. type
  582. Pdvd_host_send_rpcstate = ^Tdvd_host_send_rpcstate;
  583. Tdvd_host_send_rpcstate = record
  584. _type : Tu8;
  585. pdrc : Tu8;
  586. end;
  587. Pdvd_lu_send_rpcstate = ^Tdvd_lu_send_rpcstate;
  588. Tdvd_lu_send_rpcstate = record
  589. flag0 : word;
  590. region_mask : Tu8;
  591. rpc_scheme : Tu8;
  592. end;
  593. const
  594. bm_Tdvd_lu_send_rpcstate_type = $3;
  595. bp_Tdvd_lu_send_rpcstate_type = 0;
  596. bm_Tdvd_lu_send_rpcstate_vra = $1C;
  597. bp_Tdvd_lu_send_rpcstate_vra = 2;
  598. bm_Tdvd_lu_send_rpcstate_ucca = $E0;
  599. bp_Tdvd_lu_send_rpcstate_ucca = 5;
  600. function get_type(var a : Tdvd_lu_send_rpcstate) : Tu8;
  601. procedure set_type(var a : Tdvd_lu_send_rpcstate; __type : Tu8);
  602. function get_vra(var a : Tdvd_lu_send_rpcstate) : Tu8;
  603. procedure set_vra(var a : Tdvd_lu_send_rpcstate; __vra : Tu8);
  604. function ucca(var a : Tdvd_lu_send_rpcstate) : Tu8;
  605. procedure set_ucca(var a : Tdvd_lu_send_rpcstate; __ucca : Tu8);
  606. type
  607. Pdvd_authinfo = ^Tdvd_authinfo;
  608. Tdvd_authinfo = record
  609. case longint of
  610. 0 : ( _type : Tu8 );
  611. 1 : ( lsa : Tdvd_lu_send_agid );
  612. 2 : ( hsc : Tdvd_host_send_challenge );
  613. 3 : ( lsk : Tdvd_send_key );
  614. 4 : ( lsc : Tdvd_lu_send_challenge );
  615. 5 : ( hsk : Tdvd_send_key );
  616. 6 : ( lstk : Tdvd_lu_send_title_key );
  617. 7 : ( lsasf : Tdvd_lu_send_asf );
  618. 8 : ( hrpcs : Tdvd_host_send_rpcstate );
  619. 9 : ( lrpcs : Tdvd_lu_send_rpcstate );
  620. end;
  621. const
  622. bm_Trequest_sense_valid = $1;
  623. bp_Trequest_sense_valid = 0;
  624. bm_Trequest_sense_error_code = $FE;
  625. bp_Trequest_sense_error_code = 1;
  626. bm_Trequest_sense_reserved1 = $3;
  627. bp_Trequest_sense_reserved1 = 0;
  628. bm_Trequest_sense_ili = $4;
  629. bp_Trequest_sense_ili = 2;
  630. bm_Trequest_sense_reserved2 = $8;
  631. bp_Trequest_sense_reserved2 = 3;
  632. bm_Trequest_sense_sense_key = $F0;
  633. bp_Trequest_sense_sense_key = 4;
  634. function valid(var a : Trequest_sense) : Tu8;
  635. procedure set_valid(var a : Trequest_sense; __valid : Tu8);
  636. function error_code(var a : Trequest_sense) : Tu8;
  637. procedure set_error_code(var a : Trequest_sense; __error_code : Tu8);
  638. function reserved1(var a : Trequest_sense) : Tu8;
  639. procedure set_reserved1(var a : Trequest_sense; __reserved1 : Tu8);
  640. function ili(var a : Trequest_sense) : Tu8;
  641. procedure set_ili(var a : Trequest_sense; __ili : Tu8);
  642. function reserved2(var a : Trequest_sense) : Tu8;
  643. procedure set_reserved2(var a : Trequest_sense; __reserved2 : Tu8);
  644. function sense_key(var a : Trequest_sense) : Tu8;
  645. procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8);
  646. { ---------------------------------------------------------------------
  647. Utility functions
  648. ---------------------------------------------------------------------}
  649. type
  650. TCDSearchRec = record
  651. Name: AnsiString;
  652. i,j: Integer;
  653. end;
  654. Function IsCDDevice(Device : AnsiString) : Boolean;
  655. Function FindFirstCD(var ACDSearchRec: TCDSearchRec): Boolean;
  656. Function FindNextCD(var ACDSearchRec: TCDSearchRec): Boolean;
  657. Function DetectCd : AnsiString;
  658. implementation
  659. {$IFDEF FPC_DOTTEDUNITS}
  660. uses System.CDROM.Major,System.SysUtils;
  661. {$ELSE FPC_DOTTEDUNITS}
  662. uses major,sysutils;
  663. {$ENDIF FPC_DOTTEDUNITS}
  664. { ---------------------------------------------------------------------
  665. Functions from cdrom.h translation.
  666. ---------------------------------------------------------------------}
  667. function cdsc_adr(var a : Tcdrom_subchnl) : Tu8;
  668. begin
  669. cdsc_adr:=(a.flag0 and bm_Tcdrom_subchnl_cdsc_adr) shr bp_Tcdrom_subchnl_cdsc_adr;
  670. end;
  671. procedure set_cdsc_adr(var a : Tcdrom_subchnl; __cdsc_adr : Tu8);
  672. begin
  673. a.flag0:=a.flag0 or ((__cdsc_adr shl bp_Tcdrom_subchnl_cdsc_adr) and bm_Tcdrom_subchnl_cdsc_adr);
  674. end;
  675. function cdsc_ctrl(var a : Tcdrom_subchnl) : Tu8;
  676. begin
  677. cdsc_ctrl:=(a.flag0 and bm_Tcdrom_subchnl_cdsc_ctrl) shr bp_Tcdrom_subchnl_cdsc_ctrl;
  678. end;
  679. procedure set_cdsc_ctrl(var a : Tcdrom_subchnl; __cdsc_ctrl : Tu8);
  680. begin
  681. a.flag0:=a.flag0 or ((__cdsc_ctrl shl bp_Tcdrom_subchnl_cdsc_ctrl) and bm_Tcdrom_subchnl_cdsc_ctrl);
  682. end;
  683. function cdte_adr(var a : Tcdrom_tocentry) : Tu8;
  684. begin
  685. cdte_adr:=(a.flag0 and bm_Tcdrom_tocentry_cdte_adr) shr bp_Tcdrom_tocentry_cdte_adr;
  686. end;
  687. procedure set_cdte_adr(var a : Tcdrom_tocentry; __cdte_adr : Tu8);
  688. begin
  689. a.flag0:=a.flag0 or ((__cdte_adr shl bp_Tcdrom_tocentry_cdte_adr) and bm_Tcdrom_tocentry_cdte_adr);
  690. end;
  691. function cdte_ctrl(var a : Tcdrom_tocentry) : Tu8;
  692. begin
  693. cdte_ctrl:=(a.flag0 and bm_Tcdrom_tocentry_cdte_ctrl) shr bp_Tcdrom_tocentry_cdte_ctrl;
  694. end;
  695. procedure set_cdte_ctrl(var a : Tcdrom_tocentry; __cdte_ctrl : Tu8);
  696. begin
  697. a.flag0:=a.flag0 or ((__cdte_ctrl shl bp_Tcdrom_tocentry_cdte_ctrl) and bm_Tcdrom_tocentry_cdte_ctrl);
  698. end;
  699. { was #define dname def_expr }
  700. function CDSL_NONE : longint;
  701. { return type might be wrong }
  702. begin
  703. CDSL_NONE:=(longint(( not (0)) shr 1)) - 1;
  704. end;
  705. { was #define dname def_expr }
  706. function CDSL_CURRENT : longint;
  707. begin
  708. CDSL_CURRENT:=longint(( not (0)) shr 1);
  709. end;
  710. function book_version(var a : Tdvd_layer) : Tu8;
  711. begin
  712. book_version:=(a.flag0 and bm_Tdvd_layer_book_version) shr bp_Tdvd_layer_book_version;
  713. end;
  714. procedure set_book_version(var a : Tdvd_layer; __book_version : Tu8);
  715. begin
  716. a.flag0:=a.flag0 or ((__book_version shl bp_Tdvd_layer_book_version) and bm_Tdvd_layer_book_version);
  717. end;
  718. function book_type(var a : Tdvd_layer) : Tu8;
  719. begin
  720. book_type:=(a.flag0 and bm_Tdvd_layer_book_type) shr bp_Tdvd_layer_book_type;
  721. end;
  722. procedure set_book_type(var a : Tdvd_layer; __book_type : Tu8);
  723. begin
  724. a.flag0:=a.flag0 or ((__book_type shl bp_Tdvd_layer_book_type) and bm_Tdvd_layer_book_type);
  725. end;
  726. function min_rate(var a : Tdvd_layer) : Tu8;
  727. begin
  728. min_rate:=(a.flag0 and bm_Tdvd_layer_min_rate) shr bp_Tdvd_layer_min_rate;
  729. end;
  730. procedure set_min_rate(var a : Tdvd_layer; __min_rate : Tu8);
  731. begin
  732. a.flag0:=a.flag0 or ((__min_rate shl bp_Tdvd_layer_min_rate) and bm_Tdvd_layer_min_rate);
  733. end;
  734. function disc_size(var a : Tdvd_layer) : Tu8;
  735. begin
  736. disc_size:=(a.flag0 and bm_Tdvd_layer_disc_size) shr bp_Tdvd_layer_disc_size;
  737. end;
  738. procedure set_disc_size(var a : Tdvd_layer; __disc_size : Tu8);
  739. begin
  740. a.flag0:=a.flag0 or ((__disc_size shl bp_Tdvd_layer_disc_size) and bm_Tdvd_layer_disc_size);
  741. end;
  742. function layer_type(var a : Tdvd_layer) : Tu8;
  743. begin
  744. layer_type:=(a.flag0 and bm_Tdvd_layer_layer_type) shr bp_Tdvd_layer_layer_type;
  745. end;
  746. procedure set_layer_type(var a : Tdvd_layer; __layer_type : Tu8);
  747. begin
  748. a.flag0:=a.flag0 or ((__layer_type shl bp_Tdvd_layer_layer_type) and bm_Tdvd_layer_layer_type);
  749. end;
  750. function track_path(var a : Tdvd_layer) : Tu8;
  751. begin
  752. track_path:=(a.flag0 and bm_Tdvd_layer_track_path) shr bp_Tdvd_layer_track_path;
  753. end;
  754. procedure set_track_path(var a : Tdvd_layer; __track_path : Tu8);
  755. begin
  756. a.flag0:=a.flag0 or ((__track_path shl bp_Tdvd_layer_track_path) and bm_Tdvd_layer_track_path);
  757. end;
  758. function nlayers(var a : Tdvd_layer) : Tu8;
  759. begin
  760. nlayers:=(a.flag0 and bm_Tdvd_layer_nlayers) shr bp_Tdvd_layer_nlayers;
  761. end;
  762. procedure set_nlayers(var a : Tdvd_layer; __nlayers : Tu8);
  763. begin
  764. a.flag0:=a.flag0 or ((__nlayers shl bp_Tdvd_layer_nlayers) and bm_Tdvd_layer_nlayers);
  765. end;
  766. function track_density(var a : Tdvd_layer) : Tu8;
  767. begin
  768. track_density:=(a.flag0 and bm_Tdvd_layer_track_density) shr bp_Tdvd_layer_track_density;
  769. end;
  770. procedure set_track_density(var a : Tdvd_layer; __track_density : Tu8);
  771. begin
  772. a.flag0:=a.flag0 or ((__track_density shl bp_Tdvd_layer_track_density) and bm_Tdvd_layer_track_density);
  773. end;
  774. function linear_density(var a : Tdvd_layer) : Tu8;
  775. begin
  776. linear_density:=(a.flag0 and bm_Tdvd_layer_linear_density) shr bp_Tdvd_layer_linear_density;
  777. end;
  778. procedure set_linear_density(var a : Tdvd_layer; __linear_density : Tu8);
  779. begin
  780. a.flag0:=a.flag0 or ((__linear_density shl bp_Tdvd_layer_linear_density) and bm_Tdvd_layer_linear_density);
  781. end;
  782. function bca(var a : Tdvd_layer) : Tu8;
  783. begin
  784. bca:=(a.flag0 and bm_Tdvd_layer_bca) shr bp_Tdvd_layer_bca;
  785. end;
  786. procedure set_bca(var a : Tdvd_layer; __bca : Tu8);
  787. begin
  788. a.flag0:=a.flag0 or ((__bca shl bp_Tdvd_layer_bca) and bm_Tdvd_layer_bca);
  789. end;
  790. function agid(var a : Tdvd_disckey) : dword;
  791. begin
  792. agid:=(a.flag0 and bm_Tdvd_disckey_agid) shr bp_Tdvd_disckey_agid;
  793. end;
  794. procedure set_agid(var a : Tdvd_disckey; __agid : dword);
  795. begin
  796. a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_disckey_agid) and bm_Tdvd_disckey_agid);
  797. end;
  798. function agid(var a : Tdvd_lu_send_agid) : dword;
  799. begin
  800. agid:=(a.flag0 and bm_Tdvd_lu_send_agid_agid) shr bp_Tdvd_lu_send_agid_agid;
  801. end;
  802. procedure set_agid(var a : Tdvd_lu_send_agid; __agid : dword);
  803. begin
  804. a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_agid_agid) and bm_Tdvd_lu_send_agid_agid);
  805. end;
  806. function agid(var a : Tdvd_host_send_challenge) : dword;
  807. begin
  808. agid:=(a.flag0 and bm_Tdvd_host_send_challenge_agid) shr bp_Tdvd_host_send_challenge_agid;
  809. end;
  810. procedure set_agid(var a : Tdvd_host_send_challenge; __agid : dword);
  811. begin
  812. a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_host_send_challenge_agid) and bm_Tdvd_host_send_challenge_agid);
  813. end;
  814. function agid(var a : Tdvd_send_key) : dword;
  815. begin
  816. agid:=(a.flag0 and bm_Tdvd_send_key_agid) shr bp_Tdvd_send_key_agid;
  817. end;
  818. procedure set_agid(var a : Tdvd_send_key; __agid : dword);
  819. begin
  820. a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_send_key_agid) and bm_Tdvd_send_key_agid);
  821. end;
  822. function agid(var a : Tdvd_lu_send_challenge) : dword;
  823. begin
  824. agid:=(a.flag0 and bm_Tdvd_lu_send_challenge_agid) shr bp_Tdvd_lu_send_challenge_agid;
  825. end;
  826. procedure set_agid(var a : Tdvd_lu_send_challenge; __agid : dword);
  827. begin
  828. a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_challenge_agid) and bm_Tdvd_lu_send_challenge_agid);
  829. end;
  830. function agid(var a : Tdvd_lu_send_title_key) : dword;
  831. begin
  832. agid:=(a.flag0 and bm_Tdvd_lu_send_title_key_agid) shr bp_Tdvd_lu_send_title_key_agid;
  833. end;
  834. procedure set_agid(var a : Tdvd_lu_send_title_key; __agid : dword);
  835. begin
  836. a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_title_key_agid) and bm_Tdvd_lu_send_title_key_agid);
  837. end;
  838. function cpm(var a : Tdvd_lu_send_title_key) : dword;
  839. begin
  840. cpm:=(a.flag1 and bm_Tdvd_lu_send_title_key_cpm) shr bp_Tdvd_lu_send_title_key_cpm;
  841. end;
  842. procedure set_cpm(var a : Tdvd_lu_send_title_key; __cpm : dword);
  843. begin
  844. a.flag1:=a.flag1 or ((__cpm shl bp_Tdvd_lu_send_title_key_cpm) and bm_Tdvd_lu_send_title_key_cpm);
  845. end;
  846. function cp_sec(var a : Tdvd_lu_send_title_key) : dword;
  847. begin
  848. cp_sec:=(a.flag1 and bm_Tdvd_lu_send_title_key_cp_sec) shr bp_Tdvd_lu_send_title_key_cp_sec;
  849. end;
  850. procedure set_cp_sec(var a : Tdvd_lu_send_title_key; __cp_sec : dword);
  851. begin
  852. a.flag1:=a.flag1 or ((__cp_sec shl bp_Tdvd_lu_send_title_key_cp_sec) and bm_Tdvd_lu_send_title_key_cp_sec);
  853. end;
  854. function cgms(var a : Tdvd_lu_send_title_key) : dword;
  855. begin
  856. cgms:=(a.flag1 and bm_Tdvd_lu_send_title_key_cgms) shr bp_Tdvd_lu_send_title_key_cgms;
  857. end;
  858. procedure set_cgms(var a : Tdvd_lu_send_title_key; __cgms : dword);
  859. begin
  860. a.flag1:=a.flag1 or ((__cgms shl bp_Tdvd_lu_send_title_key_cgms) and bm_Tdvd_lu_send_title_key_cgms);
  861. end;
  862. function agid(var a : Tdvd_lu_send_asf) : dword;
  863. begin
  864. agid:=(a.flag0 and bm_Tdvd_lu_send_asf_agid) shr bp_Tdvd_lu_send_asf_agid;
  865. end;
  866. procedure set_agid(var a : Tdvd_lu_send_asf; __agid : dword);
  867. begin
  868. a.flag0:=a.flag0 or ((__agid shl bp_Tdvd_lu_send_asf_agid) and bm_Tdvd_lu_send_asf_agid);
  869. end;
  870. function asf(var a : Tdvd_lu_send_asf) : dword;
  871. begin
  872. asf:=(a.flag0 and bm_Tdvd_lu_send_asf_asf) shr bp_Tdvd_lu_send_asf_asf;
  873. end;
  874. procedure set_asf(var a : Tdvd_lu_send_asf; __asf : dword);
  875. begin
  876. a.flag0:=a.flag0 or ((__asf shl bp_Tdvd_lu_send_asf_asf) and bm_Tdvd_lu_send_asf_asf);
  877. end;
  878. function get_type(var a : Tdvd_lu_send_rpcstate) : Tu8;
  879. begin
  880. get_type:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_type) shr bp_Tdvd_lu_send_rpcstate_type;
  881. end;
  882. procedure set_type(var a : Tdvd_lu_send_rpcstate; __type : Tu8);
  883. begin
  884. a.flag0:=a.flag0 or ((__type shl bp_Tdvd_lu_send_rpcstate_type) and bm_Tdvd_lu_send_rpcstate_type);
  885. end;
  886. function get_vra(var a : Tdvd_lu_send_rpcstate) : Tu8;
  887. begin
  888. get_vra:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_vra) shr bp_Tdvd_lu_send_rpcstate_vra;
  889. end;
  890. procedure set_vra(var a : Tdvd_lu_send_rpcstate; __vra : Tu8);
  891. begin
  892. a.flag0:=a.flag0 or ((__vra shl bp_Tdvd_lu_send_rpcstate_vra) and bm_Tdvd_lu_send_rpcstate_vra);
  893. end;
  894. function ucca(var a : Tdvd_lu_send_rpcstate) : Tu8;
  895. begin
  896. ucca:=(a.flag0 and bm_Tdvd_lu_send_rpcstate_ucca) shr bp_Tdvd_lu_send_rpcstate_ucca;
  897. end;
  898. procedure set_ucca(var a : Tdvd_lu_send_rpcstate; __ucca : Tu8);
  899. begin
  900. a.flag0:=a.flag0 or ((__ucca shl bp_Tdvd_lu_send_rpcstate_ucca) and bm_Tdvd_lu_send_rpcstate_ucca);
  901. end;
  902. function valid(var a : Trequest_sense) : Tu8;
  903. begin
  904. valid:=(a.flag0 and bm_Trequest_sense_valid) shr bp_Trequest_sense_valid;
  905. end;
  906. procedure set_valid(var a : Trequest_sense; __valid : Tu8);
  907. begin
  908. a.flag0:=a.flag0 or ((__valid shl bp_Trequest_sense_valid) and bm_Trequest_sense_valid);
  909. end;
  910. function error_code(var a : Trequest_sense) : Tu8;
  911. begin
  912. error_code:=(a.flag0 and bm_Trequest_sense_error_code) shr bp_Trequest_sense_error_code;
  913. end;
  914. procedure set_error_code(var a : Trequest_sense; __error_code : Tu8);
  915. begin
  916. a.flag0:=a.flag0 or ((__error_code shl bp_Trequest_sense_error_code) and bm_Trequest_sense_error_code);
  917. end;
  918. function reserved1(var a : Trequest_sense) : Tu8;
  919. begin
  920. reserved1:=(a.flag1 and bm_Trequest_sense_reserved1) shr bp_Trequest_sense_reserved1;
  921. end;
  922. procedure set_reserved1(var a : Trequest_sense; __reserved1 : Tu8);
  923. begin
  924. a.flag1:=a.flag1 or ((__reserved1 shl bp_Trequest_sense_reserved1) and bm_Trequest_sense_reserved1);
  925. end;
  926. function ili(var a : Trequest_sense) : Tu8;
  927. begin
  928. ili:=(a.flag1 and bm_Trequest_sense_ili) shr bp_Trequest_sense_ili;
  929. end;
  930. procedure set_ili(var a : Trequest_sense; __ili : Tu8);
  931. begin
  932. a.flag1:=a.flag1 or ((__ili shl bp_Trequest_sense_ili) and bm_Trequest_sense_ili);
  933. end;
  934. function reserved2(var a : Trequest_sense) : Tu8;
  935. begin
  936. reserved2:=(a.flag1 and bm_Trequest_sense_reserved2) shr bp_Trequest_sense_reserved2;
  937. end;
  938. procedure set_reserved2(var a : Trequest_sense; __reserved2 : Tu8);
  939. begin
  940. a.flag1:=a.flag1 or ((__reserved2 shl bp_Trequest_sense_reserved2) and bm_Trequest_sense_reserved2);
  941. end;
  942. function sense_key(var a : Trequest_sense) : Tu8;
  943. begin
  944. sense_key:=(a.flag1 and bm_Trequest_sense_sense_key) shr bp_Trequest_sense_sense_key;
  945. end;
  946. procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8);
  947. begin
  948. a.flag1:=a.flag1 or ((__sense_key shl bp_Trequest_sense_sense_key) and bm_Trequest_sense_sense_key);
  949. end;
  950. { ---------------------------------------------------------------------
  951. Implementation of utility functions.
  952. ---------------------------------------------------------------------}
  953. Const
  954. NrDevices = 16;
  955. Devices : Array[1..NrDevices] of AnsiString = (
  956. '/dev/cdrom',
  957. '/dev/cdroms/cdrom?',
  958. '/dev/hd?',
  959. '/dev/sg?',
  960. '/dev/cdu31a',
  961. '/dev/cdu535',
  962. '/dev/sbpcd',
  963. '/dev/sbpcd?',
  964. '/dev/sonycd',
  965. '/dev/mcd',
  966. '/dev/sjcd',
  967. '/dev/cm206cd',
  968. '/dev/gscd',
  969. '/dev/scd?',
  970. '/dev/sr?',
  971. '/dev/optcd');
  972. function FindFirstCD(var ACDSearchRec: TCDSearchRec): Boolean;
  973. begin
  974. Result := False;
  975. With ACDSearchRec do
  976. begin
  977. I := 1;
  978. J := 0;
  979. Name := '';
  980. end;
  981. Result := FindNextCD(ACDSearchRec);
  982. end;
  983. function FindNextCD(var ACDSearchRec: TCDSearchRec): Boolean;
  984. var
  985. L: integer;
  986. S: AnsiString;
  987. FoundDev: AnsiString;
  988. begin
  989. Result := False;
  990. FoundDev := '';
  991. with ACDSearchRec do
  992. begin
  993. While (FoundDev='') and (I<NrDevices) do
  994. begin
  995. S:=Devices[i];
  996. L:=Length(S);
  997. If S[l]='?' then
  998. begin
  999. S:=Copy(S,1,L-1);
  1000. if j >= 3 then
  1001. j := 0;
  1002. while (j <= 3) and (Length(FoundDev)=0) do
  1003. begin
  1004. If IsCdDevice(S+Chr(Ord('0')+J)) then
  1005. FoundDev:=S+Chr(Ord('0')+J)
  1006. else If IsCdDevice(S+Chr(Ord('a')+J)) then
  1007. FoundDev:=S+Chr(Ord('a')+J);
  1008. Inc(j);
  1009. end;
  1010. if J >= 3 then
  1011. Inc(i);
  1012. end
  1013. else
  1014. begin
  1015. If IsCdDevice(S) then
  1016. FoundDev:=S;
  1017. Inc(i);
  1018. end;
  1019. end;
  1020. end;
  1021. Result := Length(FoundDev) > 0;
  1022. ACDSearchRec.Name:=FoundDev;
  1023. end;
  1024. Function DetectCD : AnsiString;
  1025. Var
  1026. I,J,L : Integer;
  1027. S : AnsiString;
  1028. begin
  1029. Result:='';
  1030. I:=0;
  1031. While (Result='') and (I<NrDevices) do
  1032. begin
  1033. Inc(I);
  1034. S:=Devices[i];
  1035. L:=Length(S);
  1036. If S[l]='?' then
  1037. begin
  1038. S:=Copy(S,1,L-1);
  1039. For J:=0 to 3 do
  1040. If IsCdDevice(S+Chr(Ord('0')+J)) then
  1041. Result:=S+Chr(Ord('0')+J)
  1042. else If IsCdDevice(S+Chr(Ord('a')+J)) then
  1043. Result:=S+Chr(Ord('a')+J)
  1044. end
  1045. else
  1046. If IsCdDevice(S) then
  1047. Result:=S;
  1048. end;
  1049. end;
  1050. Const
  1051. IDEMajor = [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR];
  1052. CDMajor = [CDU31A_CDROM_MAJOR,CDU535_CDROM_MAJOR,
  1053. MATSUSHITA_CDROM_MAJOR,MATSUSHITA_CDROM2_MAJOR,
  1054. MATSUSHITA_CDROM3_MAJOR,MATSUSHITA_CDROM4_MAJOR,
  1055. SANYO_CDROM_MAJOR,
  1056. MITSUMI_CDROM_MAJOR,MITSUMI_X_CDROM_MAJOR,
  1057. OPTICS_CDROM_MAJOR,AZTECH_CDROM_MAJOR,
  1058. GOLDSTAR_CDROM_MAJOR,CM206_CDROM_MAJOR];
  1059. Function TestCDRomIOCTL(Device : AnsiString) : Boolean;forward;
  1060. Function IsCDDevice(Device : AnsiString) : Boolean;
  1061. Var
  1062. Info : stat;
  1063. S : AnsiString;
  1064. DeviceMajor,F : Integer;
  1065. begin
  1066. {$ifdef debug}
  1067. Writeln('Testing device : ',Device);
  1068. {$endif}
  1069. Result:=False;
  1070. If fpstat(device,info)<>0 then
  1071. exit;
  1072. if not (fpS_ISCHR(info.st_mode) or
  1073. fpS_ISBLK(info.st_mode)) then
  1074. exit;
  1075. S:=fpReadLink(Device);
  1076. If (S<>'') then
  1077. Device:=S;
  1078. If fpStat(Device,info)<>0 then
  1079. exit;
  1080. DeviceMajor:=info.st_rdev shr 8;
  1081. {$ifdef debug}
  1082. Writeln('Device major : ',DeviceMajor);
  1083. {$endif}
  1084. If DeviceMajor in [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR] then
  1085. Result:=TestCDRomIOCTL(Device)
  1086. else
  1087. begin
  1088. Result:= DeviceMajor=SCSI_CDROM_MAJOR;
  1089. If not Result then
  1090. begin
  1091. Result:=DeviceMajor in CDMajor;
  1092. If Not Result then
  1093. begin
  1094. // test SCSI
  1095. end
  1096. else
  1097. begin
  1098. F:=fpOpen(Device,OPEN_RDONLY or OPEN_NONBLOCK);
  1099. Result:=(F>=0);
  1100. If Result then
  1101. fpClose(F);
  1102. end;
  1103. end;
  1104. end;
  1105. end;
  1106. Function TestCDRomIOCTL(Device : AnsiString) : Boolean;
  1107. Var
  1108. F : Integer;
  1109. info : Tcdrom_volctrl;
  1110. begin
  1111. {$ifdef debug}
  1112. Writeln('Testing for ATAPI');
  1113. {$endif}
  1114. Result:=False;
  1115. f:=fpOpen(device,OPEN_RDONLY or OPEN_NONBLOCK);
  1116. If (f<0) then
  1117. exit;
  1118. Result:=(fpIOCtl(f,CDROMVOLREAD,@info)=0);
  1119. fpClose(f);
  1120. end;
  1121. end.