📄 misc_scsi.c.htm
字号:
<a class="l" name="275"> 275 </a> * 1.5 Min leadout + 1 min. leadin + 2 sec. pre-gap.<a class="l" name="276"> 276 </a> * For 2nd+ leadout it will be 0.5 min. But currently<a class="l" name="277"> 277 </a> * there is no direct way. And it will not happen<a class="l" name="278"> 278 </a> * for any normal case.<a class="l" name="279"> 279 </a> *<a class="hl" name="280"> 280 </a> * 75 <a href="/source/s?path=frames/">frames</a>/<a href="/source/s?path=frames/sec">sec</a>, 60 <a href="/source/s?path=sec/">sec</a>/<a href="/source/s?path=sec/min">min</a>, so leadin gap is<a class="l" name="281"> 281 </a> * ((1.5 +1)*60 + 2)*75 = 11400 frames (blocks)<a class="l" name="282"> 282 </a> */</span><a class="l" name="283"> 283 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> -= <span class="n">11400</span>;<a class="l" name="284"> 284 </a> }<a class="l" name="285"> 285 </a> } <b>else</b> {<a class="l" name="286"> 286 </a> <b>if</b> (<a href="/source/s?defs=check_track_size">check_track_size</a>(<a href="/source/s?defs=dev">dev</a>, <a href="/source/s?defs=trackno">trackno</a>, <a href="/source/s?defs=t_info">t_info</a>) != <span class="n">1</span>)<a class="l" name="287"> 287 </a> <b>return</b> (<span class="n">0</span>);<a class="l" name="288"> 288 </a> }<a class="l" name="289"> 289 </a><a class="hl" name="290"> 290 </a> <b>return</b> (<span class="n">1</span>);<a class="l" name="291"> 291 </a>}<a class="l" name="292"> 292 </a><a class="l" name="293"> 293 </a><span class="c">/*<a class="l" name="294"> 294 </a> * The size of the last track in one of the first N - 1 sessions of an<a class="l" name="295"> 295 </a> * N-session (N > 1) disc is reported incorrectly by some drives and calculated<a class="l" name="296"> 296 </a> * incorrectly for others, because a <a href="/source/s?path=pre-gap/">pre-gap</a>/<a href="/source/s?path=pre-gap/lead-out/">lead-out</a>/<a href="/source/s?path=pre-gap/lead-out/lead-in">lead-in</a> section that ends<a class="l" name="297"> 297 </a> * a session is erroneously considered part of that track. This function checks<a class="l" name="298"> 298 </a> * for this corner case, and adjusts the track size if necessary.<a class="l" name="299"> 299 </a> */</span><a class="hl" name="300"> 300 </a><b>static</b> <b>int</b><a class="l" name="301"> 301 </a><a href="/source/s?defs=check_track_size">check_track_size</a>(<a href="/source/s?defs=cd_device">cd_device</a> *<a href="/source/s?defs=dev">dev</a>, <b>int</b> <a href="/source/s?defs=trk_num">trk_num</a>, <b>struct</b> <a href="/source/s?defs=track_info">track_info</a> *<a href="/source/s?defs=tip">tip</a>)<a class="l" name="302"> 302 </a>{<a class="l" name="303"> 303 </a> <a href="/source/s?defs=size_t">size_t</a> <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>;<a class="l" name="304"> 304 </a> <a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=raw_toc">raw_toc</a>;<a class="l" name="305"> 305 </a> <a href="/source/s?defs=rtoc_hdr_t">rtoc_hdr_t</a> <a href="/source/s?defs=hdr">hdr</a>;<a class="l" name="306"> 306 </a> <a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=sess_leadout_lba">sess_leadout_lba</a>;<a class="l" name="307"> 307 </a> <b>int</b> <a href="/source/s?defs=sess_last_trk_num">sess_last_trk_num</a>;<a class="l" name="308"> 308 </a> <b>int</b> <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>;<a class="l" name="309"> 309 </a> <a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=trk_size">trk_size</a>;<a class="hl" name="310"> 310 </a><a class="l" name="311"> 311 </a> <span class="c">/* Request Raw TOC Header for session count. */</span><a class="l" name="312"> 312 </a> <b>if</b> (<a href="/source/s?defs=read_toc">read_toc</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <a href="/source/s?defs=FORMAT_RAW_TOC">FORMAT_RAW_TOC</a>, <span class="n">1</span>,<a class="l" name="313"> 313 </a> <b>sizeof</b> (<a href="/source/s?defs=rtoc_hdr_t">rtoc_hdr_t</a>), (<a href="/source/s?defs=uchar_t">uchar_t</a> *)&<a href="/source/s?defs=hdr">hdr</a>) != <span class="n">1</span>)<a class="l" name="314"> 314 </a> <b>return</b> (<span class="n">0</span>);<a class="l" name="315"> 315 </a><a class="l" name="316"> 316 </a> <span class="c">/* Is this a multi-session medium? */</span><a class="l" name="317"> 317 </a> <b>if</b> (<a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_last_sess_num">rh_last_sess_num</a> > <a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_first_sess_num">rh_first_sess_num</a>) {<a class="l" name="318"> 318 </a> <span class="c">/* Yes; request entire Raw TOC. */</span><a class="l" name="319"> 319 </a> <a href="/source/s?defs=raw_toc_len">raw_toc_len</a> = <a href="/source/s?defs=read_scsi16">read_scsi16</a>(&<a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_data_len1">rh_data_len1</a>) + <a href="/source/s?defs=RTOC_DATA_LEN_SZ">RTOC_DATA_LEN_SZ</a>;<a class="hl" name="320"> 320 </a> <a href="/source/s?defs=raw_toc">raw_toc</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=raw_toc_len">raw_toc_len</a>);<a class="l" name="321"> 321 </a><a class="l" name="322"> 322 </a> <b>if</b> (<a href="/source/s?defs=read_toc">read_toc</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <a href="/source/s?defs=FORMAT_RAW_TOC">FORMAT_RAW_TOC</a>, <span class="n">1</span>, <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>, <a href="/source/s?defs=raw_toc">raw_toc</a>)<a class="l" name="323"> 323 </a> != <span class="n">1</span>)<a class="l" name="324"> 324 </a> <b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="325"> 325 </a><a class="l" name="326"> 326 </a> <b>if</b> (<a href="/source/s?defs=rtoc_get_trk_sess_num">rtoc_get_trk_sess_num</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>, <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>, <a href="/source/s?defs=trk_num">trk_num</a>,<a class="l" name="327"> 327 </a> &<a href="/source/s?defs=trk_sess_num">trk_sess_num</a>) != <span class="n">1</span>)<a class="l" name="328"> 328 </a> <b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="329"> 329 </a><a class="hl" name="330"> 330 </a> <a href="/source/s?defs=tip">tip</a>-><a href="/source/s?defs=ti_session_no">ti_session_no</a> = <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>;<a class="l" name="331"> 331 </a> <a href="/source/s?defs=tip">tip</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> |= <a href="/source/s?defs=TI_SESSION_NO_VALID">TI_SESSION_NO_VALID</a>;<a class="l" name="332"> 332 </a><a class="l" name="333"> 333 </a> <span class="c">/* Is the track in one of the first N - 1 sessions? */</span><a class="l" name="334"> 334 </a> <b>if</b> (<a href="/source/s?defs=trk_sess_num">trk_sess_num</a> < <a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_last_sess_num">rh_last_sess_num</a>) {<a class="l" name="335"> 335 </a> <b>if</b> (<a href="/source/s?defs=rtoc_get_sess_last_trk_num">rtoc_get_sess_last_trk_num</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>, <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>,<a class="l" name="336"> 336 </a> <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>, &<a href="/source/s?defs=sess_last_trk_num">sess_last_trk_num</a>) != <span class="n">1</span>)<a class="l" name="337"> 337 </a> <b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="338"> 338 </a><a class="l" name="339"> 339 </a> <span class="c">/* Is the track the last track in the session? */</span><a class="hl" name="340"> 340 </a> <b>if</b> (<a href="/source/s?defs=trk_num">trk_num</a> == <a href="/source/s?defs=sess_last_trk_num">sess_last_trk_num</a>) {<a class="l" name="341"> 341 </a> <b>if</b> (<a href="/source/s?defs=rtoc_get_sess_leadout_lba">rtoc_get_sess_leadout_lba</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>,<a class="l" name="342"> 342 </a> <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>, <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>,<a class="l" name="343"> 343 </a> &<a href="/source/s?defs=sess_leadout_lba">sess_leadout_lba</a>) != <span class="n">1</span>)<a class="l" name="344"> 344 </a> <b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="345"> 345 </a><a class="l" name="346"> 346 </a> <a href="/source/s?defs=trk_size">trk_size</a> = <a href="/source/s?defs=sess_leadout_lba">sess_leadout_lba</a> -<a class="l" name="347"> 347 </a> <a href="/source/s?defs=tip">tip</a>-><a href="/source/s?defs=ti_start_address">ti_start_address</a>;<a class="l" name="348"> 348 </a><a class="l" name="349"> 349 </a> <span class="c">/* Fix track size if it was too big. */</span><a class="hl" name="350"> 350 </a> <b>if</b> (<a href="/source/s?defs=tip">tip</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> > <a href="/source/s?defs=trk_size">trk_size</a>)<a class="l" name="351"> 351 </a> <a href="/source/s?defs=tip">tip</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> = <a href="/source/s?defs=trk_size">trk_size</a>;<a class="l" name="352"> 352 </a> }<a class="l" name="353"> 353 </a> }<a class="l" name="354"> 354 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>);<a class="l" name="355"> 355 </a> }<a class="l" name="356"> 356 </a> <b>return</b> (<span class="n">1</span>);<a class="l" name="357"> 357 </a><a class="l" name="358"> 358 </a><a href="/source/s?defs=fail">fail</a>:<a class="l" name="359"> 359 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>);<a class="hl" name="360"> 360 </a> <b>return</b> (<span class="n">0</span>);<a class="l" name="361"> 361 </a>}<a class="l" name="362"> 362 </a><a class="l" name="363"> 363 </a><span class="c">/*<a class="l" name="364"> 364 </a> * Determine what session number a track is in by parsing the Raw TOC format of<a class="l" name="365"> 365 </a> * the the READ <a href="/source/s?path=TOC/">TOC</a>/<a href="/source/s?path=TOC/PMA/">PMA</a>/<a href="/source/s?path=TOC/PMA/ATIP">ATIP</a> command response data.<a class="l" name="366"> 366 </a> */</span><a class="l" name="367"> 367 </a><b>static</b> <b>int</b><a class="l" name="368"> 368 </a><a href="/source/s?defs=rtoc_get_trk_sess_num">rtoc_get_trk_sess_num</a>(<a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=rtoc">rtoc</a>, <a href="/source/s?defs=size_t">size_t</a> <a href="/source/s?defs=rtoc_len">rtoc_len</a>, <b>int</b> <a href="/source/s?defs=trk_num">trk_num</a>,<a class="l" name="369"> 369 </a> <b>int</b> *<a href="/source/s?defs=sess_nump">sess_nump</a>)<a class="hl" name="370"> 370 </a>{<a class="l" name="371"> 371 </a> <a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *<a href="/source/s?defs=tdp">tdp</a> = (<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *)(<a href="/source/s?defs=rtoc">rtoc</a> + <b>sizeof</b> (<a href="/source/s?defs=rtoc_hdr_t">rtoc_hdr_t</a>));<a class="l" name="372"> 372 </a> <a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *<a href="/source/s?defs=last_tdp">last_tdp</a> = (<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *)(<a href="/source/s?defs=rtoc">rtoc</a> + <a href="/source/s?defs=rtoc_len">rtoc_len</a> -<a class="l" name="373"> 373 </a> <b>sizeof</b> (<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a>));<a class="l" name="374"> 374 </a><a class="l" name="375"> 375 </a> <b>if</b> ((<a href="/source/s?defs=tdp">tdp</a> = <a href="/source/s?defs=get_rtoc_td">get_rtoc_td</a>(<a href="/source/s?defs=tdp">tdp</a>, <a href="/source/s?defs=last_tdp">last_tdp</a>, <a href="/source/s?defs=Q_MODE_1">Q_MODE_1</a>, (<a href="/source/s?defs=uchar_t">uchar_t</a>)<a href="/source/s?defs=trk_num">trk_num</a>)) !=<a class="l" name="376"> 376 </a> <a href="/source/s?defs=NULL">NULL</a>) {<a class="l" name="377"> 377 </a> *<a href="/source/s?defs=sess_nump">sess_nump</a> = <a href="/source/s?defs=tdp">tdp</a>-><a href="/source/s?defs=rt_session_num">rt_session_num</a>;<a class="l" name="378"> 378 </a> <b>return</b> (<span class="n">1</span>);<a class="l" name="379"> 379 </a> } <b>else</b><a class="hl" name="380"> 380 </a> <b>return</b> (<span class="n">0</span>);<a class="l" name="381"> 381 </a>}<a class="l" name="382"> 382 </a><a class="l" name="383"> 383 </a><span class="c">/*<a class="l" name="384"> 384 </a> * Determine the last track number in a specified session number by parsing the<a class="l" name="385"> 385 </a> * Raw TOC format of the READ <a href="/source/s?path=TOC/">TOC</a>/<a href="/source/s?path=TOC/PMA/">PMA</a>/<a href="/source/s?path=TOC/PMA/ATIP">ATIP</a> command response data.<a class="l" name="386"> 386 </a> */</span><a class="l" name="387"> 387 </a><b>static</b> <b>int</b><a class="l" name="388"> 388 </a><a href="/source/s?defs=rtoc_get_sess_last_trk_num">rtoc_get_sess_last_trk_num</a>(<a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=rtoc">rtoc</a>, <a href="/source/s?defs=size_t">size_t</a> <a href="/source/s?defs=rtoc_len">rtoc_len</a>, <b>int</b> <a href="/source/s?defs=sess_num">sess_num</a>,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -