PE_CD.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:46k
源码类别:

DVD

开发平台:

Others

  1. /****************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: PE_CD.c $             
  6.  *
  7.  * Description: 
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 87 $
  14.  * Last Modified by $Author: Leslie $ at $Modtime: 04-04-03 14:04 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/Nav_CDDA/PE_CD.c $
  19.  * 
  20.  * 87    04-04-03 14:05 Leslie
  21.  * Improve for get drive MSF 
  22.  * 
  23.  * 86    04-04-02 10:18 Hansenw
  24.  * fix type define
  25.  * 
  26.  * 85    04-04-01 23:42 Leslie
  27.  * 
  28.  * 84    04-04-01 23:37 Leslie
  29.  * Alco mute SPDIF when call PE_CD_SetMute()
  30.  * 
  31.  * 83    04-04-01 9:52 Hansenw
  32.  * fix OSD flashes 00:00 at A-B (VCD)
  33.  * 
  34.  * 82    04-04-01 9:42 Hansenw
  35.  * fix type mis-match
  36.  * 
  37.  * 81    04-03-30 20:49 Williaml
  38.  * fix the bug 1. press key "fastf" fastly, then press key "play"; 2. It
  39.  * may change to stop state automatically.
  40.  * 
  41.  * 80    3/26/04 5:02p Aidenl
  42.  * TF changes 2
  43.  * 
  44.  * 79    04-03-24 19:50 Chaol
  45.  * improve _getDecoderSubcodeQ
  46.  * 
  47.  * 78    04-03-23 15:09 Leslie
  48.  * Add CLIPS_MPEG_SUPPORT
  49.  * 
  50.  * 77    04-03-18 16:23 Leonh
  51.  * For CDDA tracks on SVCD/VCD discs, set the disc type as CDDA
  52.  * 
  53.  * 76    04-03-17 11:41 Chaol
  54.  * change PE_CD_GetCdDetectType, we always need to detect CDTS bitstream
  55.  * in a CDDS disc
  56.  * 
  57.  * 75    04-03-09 14:42 Fwang
  58.  * Use CC-RAM mode for VCD
  59.  * 
  60.  * 74    04-03-03 19:07 Fwang
  61.  * Avoid black screen flashing if sequence header detection failed.
  62.  * 
  63.  * 73    2/20/04 4:34p Leonh
  64.  * not start stucktrigger for cdda on vcd
  65.  * 
  66.  * 72    04-02-19 15:06 Chaol
  67.  * change DEC_SET_MICROPHONE_ON_OFF
  68.  * 
  69.  * 71    04-02-11 17:33 Fwang
  70.  * Enable CPU scaling for DVD/VCD/SVCD.
  71.  * 
  72.  * 70    2/05/04 8:40a Leslie
  73.  * Fix MPEG Clip can't start problem
  74.  * 
  75.  * 69    1/25/04 8:20 Nmaurer
  76.  * Add drv_ prefix to Drive routines
  77.  * 
  78.  * 68    12/30/03 10:24a Chaol
  79.  * fix CDDTS detect
  80.  * 
  81.  * 67    12/29/03 2:03p Chaol
  82.  * add subcodeQ support
  83.  * 
  84.  * 66    03-12-23 14:46 Fwang
  85.  * Add parameter for scaling
  86.  * 
  87.  * 65    12/22/03 4:29p Chaol
  88.  * add function PE_CD_GetCdDetectType to support CDDTS
  89.  * 
  90.  * 64    03-12-18 13:22 Fwang
  91.  * modify scaling
  92.  * 
  93.  * 63    12/09/03 7:03p Leslie
  94.  * Call DEC_SetDiskType() in function PE_CD_AutoDetectVideoSetting()
  95.  * 
  96.  * 62    12/07/03 8:53p Fwang
  97.  * Change marco name for CPU scaling
  98.  * 
  99.  * 61    11/28/03 7:24p Leslie
  100.  * Re-Structure disk type setting for PE_CD_PlaySegment()
  101.  * 
  102.  * 60    11/28/03 5:49p Fwang
  103.  * Implement manual scaling and clean code.
  104.  * 
  105.  * 59    11/24/03 6:24p Fwang
  106.  * Set TV format right after auto detection.
  107.  * 
  108.  * 58    11/19/03 11:40a Leslie
  109.  * Add function PE_CD_AutoDetectAudioSetting(0 in order to detect SVCD
  110.  * Audio Sampling Rate
  111.  * 
  112.  * 57    11/15/03 7:10p Leslie
  113.  * Replace old  Video API Low Level Files with new ones
  114.  * 
  115.  * 56    2/11/03 15:29 Rinata
  116.  * PE_CD_UpdateAudioSPDIF - do nothing if ADP_DEMO_TEST is define
  117.  * 
  118.  * 55    10/30/03 10:22a Chaol
  119.  * update emphasis & category & SR in function PE_CD_UpdateAudioSPDIF.
  120.  * need to add function HAL_SET_PRE_EMPHASIS()
  121.  * 
  122.  * 54    9/29/03 11:56a Chaol
  123.  * remove PS_SET_ANALOG_AUDIO_SETTING()
  124.  * 
  125.  * 48    03-08-28 23:59 Leslie
  126.  * Code cleanup
  127.  * 
  128.  * 47    03-07-22 18:21 Kennyz
  129.  * Unmute the DAC and amplifier output as enabling the switch :
  130.  * HW_MUTE_FORCE_ON
  131.  * 
  132.  * 46    03-07-22 17:08 Mikelv
  133.  * support cdda de_emphasis
  134.  * 
  135.  * 45    03-06-30 16:46 Leslie
  136.  * Merge for Alco Step A code
  137.  * 
  138.  * 44    03-06-20 13:51 Dingming
  139.  * Roll back, wrong sequence
  140.  * 
  141.  * 42    6/04/03 3:31p Clifflv
  142.  * add mute for amplifier
  143.  * 
  144.  * 41    03-05-29 11:34 Leslie
  145.  * Add StuckTrigger
  146.  * 
  147.  * 40    03-05-20 15:23 Leslie
  148.  * For still picture presentation, use DATA_DUMP mode
  149.  * 
  150.  * 39    03-05-19 13:41 Leslie
  151.  * Add drive Play Mode
  152.  * Code cleanup
  153.  * 
  154.  * 38    03-04-25 15:53 Kennyz
  155.  * Modified code for AIN function.
  156.  * 
  157.  * 37    03-04-16 11:50 Jerryc
  158.  * fix pbe 'logo flashs when playing vcd and decoder is adapting to the
  159.  * encoded TV system.'
  160.  * 
  161.  * 36    3/20/03 1:41p Lyncolnc
  162.  * Problem: For CD-DTS, when a track is muted and 'Next' is pressed. The
  163.  * next track will not be muted. This is NG.
  164.  * Solution: Change the condition as shown.
  165.  * 
  166.  * 35    3/20/03 10:15a Clifflv
  167.  * Enable AIN for AVReceiver
  168.  * 
  169.  * 34    03-03-18 16:17 Leslie
  170.  * 
  171.  * 36    03-03-13 18:45 Dingming
  172.  * 
  173.  * 35    03-03-13 17:05 Dingming
  174.  * AIN implement
  175.  * 
  176.  * 34    03-03-12 14:51 Dingming
  177.  * AIN implement
  178.  * 
  179.  * 33    2/26/03 9:46p Tomasp
  180.  * Synchronization with ZCH database
  181.  * 
  182.  * 32    2/21/03 7:17a Stephaneh
  183.  * Added Reset subcode functions
  184.  * 
  185.  * 31    2/10/03 1:10a Tomasp
  186.  * Fixed external definition of g_bIsAuxModeOn.
  187.  * 
  188.  * 30    2/07/03 10:47p Tomasp
  189.  * - changed SW feature selection to compilation switch
  190.  * 
  191.  * 29    03-02-06 11:16 Dingming
  192.  * Bug fixing, wrong disc type setting
  193.  * 
  194.  * 28    03-02-03 11:03 Dingming
  195.  * comments out CDDA margin
  196.  * 
  197.  * 27    1/23/03 4:27a Rinata
  198.  * Change Dacs API name and add more Dacs support
  199.  * 
  200.  * 26    1/18/03 6:10p Adamw
  201.  * //temp fix the aux in mut problem
  202.  * still need further check decoder api's mute sequence,
  203.  * to correct to right sequence
  204.  * 
  205.  * 25    03-01-18 16:03 Leslie
  206.  * Force Unmute when Aux In Enabled
  207.  * 
  208.  * 24    03-01-17 19:33 Leslie
  209.  * AIN supported
  210.  * 
  211.  * 23    03-01-16 14:33 Dingming
  212.  * prologic II support
  213.  * 
  214.  * 22    03-01-15 19:00 Dingming
  215.  * 
  216.  * 21    03-01-15 18:49 Dingming
  217.  * code clean up
  218.  * 
  219.  * 20    03-01-14 18:13 Janeg
  220.  * 
  221.  * 19    12/09/02 6:07p Leslie
  222.  * Code cleanup
  223.  * 
  224.  * 39    3/06/02 20:00 Nirm
  225.  * - Fixed PE_CD_PausePlayback() to better support Pause during FF.
  226.  * 
  227.  * 38    3/06/02 11:14 Nirm
  228.  * - Code cleanup.
  229.  * 
  230.  * 37    29/05/02 14:44 Nirm
  231.  * - Added Subcode-Q streaming support;
  232.  * - Code cleanup.
  233.  * 
  234.  * 36    5/15/02 12:28p Dingming
  235.  * fix the video-compression of svcd ,add a macro to enable it to full
  236.  * screen
  237.  * 
  238.  * 35    9/05/02 15:52 Ettim
  239.  * Enabling the function PE_CD_MediaIdentification() although it is still
  240.  * not being used by the media detection sequence.
  241.  * 
  242.  * 34    4/30/02 17:11 Rinata
  243.  * CGMS/WSS support
  244.  * 
  245.  * 33    29/04/02 16:55 Nirm
  246.  * - Code cleanup.
  247.  * 
  248.  * 32    23/04/02 9:31 Nirm
  249.  * - Added dependency in "Config.h".
  250.  * 
  251.  * 31    21/04/02 10:48 Ettim
  252.  * Disabling the function PE_CD_MediaIdentification()
  253.  * 
  254.  * 30    16/04/02 15:23 Ettim
  255.  * Integration with CDDTS. Work is still im progress.
  256.  * 
  257.  * 29    4/14/02 15:16 Rinata
  258.  * Support DTS, CDTS
  259.  * 
  260.  * 28    31/03/02 23:17 Nirm
  261.  * -Changes in the prototype of drv_get_msf().
  262.  * 
  263.  * 27    3/26/02 18:27 Ettim
  264.  * Removed unneccessary debug printing.
  265.  * 
  266.  * 26    3/14/02 11:10 Ettim
  267.  * Setting the drive to search mode in speed 1X before scanning AV streams
  268.  * in PE_CD_SetScan().
  269.  * 
  270.  * 25    3/13/02 9:31 Ettim
  271.  * Reading the sequence header in case of random-access play.
  272.  * 
  273.  * 24    3/11/02 17:43 Ettim
  274.  * Sending PLAY command to the decoder before the PAUSE in
  275.  * PE_CD_PausePlayback function (in case the decoder was on I-Frame mode)
  276.  * 
  277.  * 23    3/10/02 17:30 Ettim
  278.  * Added Motion Digest support. 
  279.  * 
  280.  * 22    4/03/02 20:49 Nirm
  281.  * Integrated support for Full-Stop.
  282.  * 
  283.  * 21    2/18/02 11:01 Ettim
  284.  * Updated Audio SID setting for the channels C0 & C1
  285.  * 
  286.  * 20    15/02/02 0:20 Nirm
  287.  * - Temporarily disabled spindown of the drive.
  288.  * 
  289.  * 19    31/01/02 16:33 Nirm
  290.  * Addede Logo/Background support.
  291.  * 
  292.  * 18    31/01/02 13:49 Nirm
  293.  * Changed CVD support implementation.
  294.  * 
  295.  * 17    30/01/02 21:04 Nirm
  296.  * Compilation-Warnings removal.
  297.  * 
  298.  * 15    1/21/02 17:46 Ettim
  299.  * Adding the function PE_CD_VideoIsActive().
  300.  * 
  301.  * 14    1/17/02 19:14 Ettim
  302.  * Handling the CVD encryption
  303.  * 
  304.  * 13    1/17/02 16:39 Ettim
  305.  * removed the include for the stubs.h file
  306.  * 
  307.  * 12    16/01/02 11:53 Atai
  308.  * Change debug printing
  309.  * 
  310.  * 11    1/13/02 18:18 Ettim
  311.  * 
  312.  * 10    1/10/02 18:01 Ettim
  313.  * Implementing the feature SVCD_USE_ABSOLUTE_TIME
  314.  * Fixing the scan - corrected playback resumption from scanning
  315.  * 
  316.  * 9     10/01/02 12:52 Nirm
  317.  * Corrected PE_CD_GetDecoderCurrentLocationSCR().
  318.  * 
  319.  * 8     9/01/02 15:43 Nirm
  320.  * Corrected Include-Paths.
  321.  * 
  322.  * 7     1/09/02 10:01 Ettim
  323.  * 
  324.  * 6     1/08/02 17:54 Ettim
  325.  * updating the function PE_CD_GetDecoderCurrentLocationPTS, nad renaming
  326.  * it to PE_CD_GetDecoderCurrentLocationSCR
  327.  * 
  328.  * 5     1/07/02 18:06 Ettim
  329.  * Added new compilation switch CDDA_USE_ABSOLUTE_TIME - handles
  330.  * navigation using the absolute time from the beginning of disc instead
  331.  * of the relative time (from the beginning of the current track)
  332.  * 
  333.  * 4     1/06/02 19:28 Ettim
  334.  * A fully working version of nav_cdda
  335.  * 
  336.  * 3     1/03/02 17:21 Ettim
  337.  * 
  338.  * 2     12/31/01 18:09 Ettim
  339.  * 
  340.  * 1     12/26/01 19:06 Ettim
  341.  ****************************************************************************************/
  342. #include "Config.h" // Global Configuration - do not remove!
  343. #ifdef _DEBUG
  344. #undef IFTRACE
  345. #define IFTRACE if (gTracePe)
  346. #include "DebugDbgMain.h"
  347. #endif
  348. #include "IncludeSysDefs.h"
  349. #include "KernelEventDef.h"
  350. #include "Drivedrv_api.h"
  351. #include "DecoderDecoder.h"
  352. #include "Decoderlow_levelDEC_LL_Info.h"
  353. #include "Decoderlow_levelDEC_LL_API.h"
  354. #include "LogoLogo.h"
  355. #include "PlaycoreCoremaincoregdef.h"
  356. #include "PlaycoreNav_CDDApe_cd.h"
  357. #include "Customerdevicedacaudio_dac.h"
  358. #include "Decoderadp_api.h"
  359. #ifdef SUPPORT_FLASH_CARD
  360. #include "DriveFE_Manager.h"
  361. extern DWORD FlashCard_GetPlaybackSize(void);
  362. #endif
  363. extern BYTE g_audio_sid;
  364. typedef struct ScanPair_TAG {
  365. UINT16 play;
  366. UINT16 skip;
  367. } ScanPair;
  368. //Function prototypes
  369. #if AUX_IN_ENABLE
  370. extern UINT8 g_bIsAuxModeOn;
  371. #endif
  372. #ifdef CDDA_ERROR_RECOVERY
  373. #ifdef SDRAM_2X16MBITS
  374. #define CDDA_AUDIO_CODED_BUFFER_FULLNESS_THRESHOLD 8000 // 250K
  375. #else
  376. #define CDDA_AUDIO_CODED_BUFFER_FULLNESS_THRESHOLD 16000 // 500K
  377. #endif
  378. #endif
  379. static DWORD g_dwCurrentLocaionLBN = 0;
  380. ///////////////////////////////////////////////////////////////////////////////////
  381. // Function name : PE_CD_GetTracksCnt
  382. //
  383. // Purpose : Getting the number of tracks on the disc.
  384. //
  385. // Input Parameters : none
  386. //
  387. // Return Value : int 
  388. //
  389. // Description : Retrieving it from the DRIVE_GLOBALS structure.
  390. ///////////////////////////////////////////////////////////////////////////////////
  391. int PE_CD_GetTracksCnt(void)
  392. {
  393. return gds.cd_number_of_tracks;
  394. }
  395. ///////////////////////////////////////////////////////////////////////////////////
  396. // Function name : PE_CD_GetTrackInfo
  397. //
  398. // Purpose : Retrienving the track information of a given track number.
  399. //
  400. // Input Parameters : 
  401. // int iTrackNumber
  402. // Output Parameters:
  403. // TrackInfo *o_pInfo - will hold the appropriate track information
  404. //
  405. // Return Value : BOOL 
  406. //
  407. // Description : Using the drive function in order to appraoch the track info.
  408. ///////////////////////////////////////////////////////////////////////////////////
  409. BOOL PE_CD_GetTrackInfo (int iTrackNumber, TrackInfo *o_pInfo)
  410. {
  411. WORD wDummy, wMin, wSec, wFrm;
  412. ULONG ulSize;
  413. drv_get_track_info((WORD)iTrackNumber, &wDummy, &wMin, &wSec, &wFrm, &ulSize);
  414. o_pInfo->dwStartAddress= drv_msf2lbn(wMin, wSec, wFrm);
  415. o_pInfo->ulBlocksCnt= ulSize;
  416. return TRUE;
  417. }
  418. //////////////////////////////////////////////////////////////////////////////////
  419. // Function name : PE_CD_GetTrackInfoEx
  420. //
  421. // Purpose : Retrienving the track information of a given track number
  422. // in the format of mm:ss:ff .
  423. //
  424. // Input Parameters : 
  425. // int iTrackNumber
  426. // WORD *o_pMin
  427. // WORD *o_pSec
  428. // WORD *o_pFrm
  429. //
  430. // Return Value : BOOL 
  431. //
  432. // Description : Using the drive function in order to appraoch the track info.
  433. //////////////////////////////////////////////////////////////////////////////////
  434. BOOL PE_CD_GetTrackInfoEx(int iTrackNumber, WORD *o_pMin, WORD *o_pSec, WORD *o_pFrm)
  435. {
  436. WORD wDummy;
  437. ULONG ulSize;
  438. drv_get_track_info((WORD)iTrackNumber, &wDummy, o_pMin, o_pSec, o_pFrm, &ulSize);
  439. return TRUE;
  440. }
  441. //////////////////////////////////////////////////////////////////////////////////
  442. // Function name : PE_CD_GetTrackTOC
  443. //
  444. // Purpose : Retrieving the table of content of a given track number.
  445. //
  446. // Input Parameters : 
  447. // int iTrackNumber
  448. // Output Parameters:
  449. // BYTE *o_pCtrlField
  450. // DWORD *o_pStartAddr
  451. // ULONG *o_pSize
  452. //
  453. // Return Value : BOOL 
  454. //
  455. // Description : Using the drive function in order to appraoch the disc.
  456. //////////////////////////////////////////////////////////////////////////////////
  457. BOOL PE_CD_GetTrackTOC(int iTrackNumber, BYTE *o_pCtrlField, DWORD *o_pStartAddr, ULONG *o_pSize)
  458. {
  459. unsigned short uCtrlAdr;
  460. WORD wMin, wSec, wFrm;
  461. drv_get_track_info((WORD)iTrackNumber, &uCtrlAdr, &wMin, &wSec, &wFrm, o_pSize);
  462. *o_pCtrlField= (BYTE)(uCtrlAdr >> 4);
  463. *o_pStartAddr= drv_msf2lbn(wMin, wSec, wFrm);
  464. return TRUE;
  465. }
  466. //////////////////////////////////////////////////////////////////////////////////
  467. // Function name : PE_CD_GetCDTEXTInfo
  468. //
  469. // Purpose : Getting the cd text according to a given track number.
  470. //
  471. // Input Parameters : 
  472. // BYTE TrackNum
  473. //
  474. // Return Value : void* 
  475. //
  476. // Description : Using the drive function in order to appraoch the disc.
  477. //////////////////////////////////////////////////////////////////////////////////
  478. void* PE_CD_GetCDTEXTInfo(BYTE TrackNum)
  479. {
  480. /*
  481. UINT32 ulStringAddress = 0;
  482. drv_get_cdtext_info(i_TrackNum, &ulStringAddress);
  483. return ((void*)ulStringAddress);
  484. */
  485. return NULL;
  486. }
  487. //////////////////////////////////////////////////////////////////////////////////
  488. // Function name : PE_CD_GetCurrentLocation
  489. //
  490. // Purpose : Retrieving the current location.
  491. //
  492. // Input Parameters : none
  493. //
  494. // Return Value : DWORD 
  495. //
  496. // Description : Getting the mm:ss:ff format of the current location.
  497. //////////////////////////////////////////////////////////////////////////////////
  498. #ifdef SUPPORT_FLASH_CARD
  499. extern UINT32 Clips_GetCurrClipSize(void);
  500. extern UINT32 Clips_GetCurrClipSartAddr(void);
  501. #endif
  502. DWORD PE_CD_GetCurrentLocation(void)
  503. {
  504. UINT8 wMin, wSec, wFrm;
  505. #ifdef SUPPORT_FLASH_CARD
  506. if(IS_PLAYING_CARD)
  507.    {
  508.     DWORD dwPlaySize = FlashCard_GetPlaybackSize();
  509.       if(0xfffffffful == dwPlaySize)
  510.        return Clips_GetCurrClipSartAddr();
  511. else
  512. return (Clips_GetCurrClipSartAddr() + (Clips_GetCurrClipSize()>>11) - dwPlaySize);
  513. }
  514. #endif
  515. if ( drv_get_msf(&wMin, &wSec, &wFrm) ){
  516. g_dwCurrentLocaionLBN = drv_msf2lbn(wMin, wSec, wFrm);
  517. }
  518. return g_dwCurrentLocaionLBN;
  519. }
  520. //#ifdef SUBCODEQ_STREAMING_SUPPORT
  521. //////////////////////////////////////////////////////////////////////////////////
  522. // Function name : _getDecoderSubcodeQ
  523. //
  524. // Purpose : Reading the sub code Q.
  525. //
  526. // Input Parameters : 
  527. // BYTE o_aSubcodeQ[12]
  528. //
  529. // Return Value : BOOL 
  530. //
  531. // Description : 
  532. //////////////////////////////////////////////////////////////////////////////////
  533. #define MAX_SUBCODEQ_RETRIES 50
  534. BOOL _getDecoderSubcodeQ(BYTE o_aSubcodeQ[12])
  535. {
  536. UINT8 uRetryCnt;
  537. for(uRetryCnt=0x0;uRetryCnt < MAX_SUBCODEQ_RETRIES; uRetryCnt++)
  538. {
  539. if(DEC_GetSubcodeQ(o_aSubcodeQ))
  540. {
  541. if (0x01 == (o_aSubcodeQ[0] & 0x0F))
  542. return TRUE;
  543. }
  544. }
  545. return FALSE;
  546. }
  547. BOOL _resetDecoderSubcodeQ(void)
  548. {
  549. return DEC_ResetSubcodeQ();
  550. }
  551. // ZCO SH021903 >>>
  552. //#endif //SUBCODEQ_STREAMING_SUPPORT
  553. // <<< ZCO SH021903:Added to reset subcode when full stop
  554. BOOL PE_CD_ResetDecoderCurrentLocationMSF(void)
  555. {
  556. return _resetDecoderSubcodeQ();
  557. }
  558. // ZCO SH021903 >>>
  559. //////////////////////////////////////////////////////////////////////////////////
  560. // Function name : PE_CD_GetDecoderCurrentLocationMSF
  561. //
  562. // Purpose : Retrieving the current location
  563. //
  564. // Input Parameters : 
  565. // enLocationType eType
  566. // UINT32 *o_pMinute
  567. // UINT32 *o_pSecond
  568. // UINT32 *o_pFrame
  569. // int *o_pRelativeSign
  570. //
  571. // Return Value : BOOL 
  572. //
  573. // Description : 
  574. //////////////////////////////////////////////////////////////////////////////////
  575. BOOL PE_CD_GetDecoderCurrentLocationMSF(enLocationType eType, 
  576. UINT8 *o_pMinute, 
  577. UINT8 *o_pSecond, 
  578. UINT8 *o_pFrame, 
  579. int *o_pRelativeSign)
  580. {
  581. BYTE aSubcodeQ[12];
  582. #ifdef SUBCODEQ_STREAMING_SUPPORT
  583. if (! _getDecoderSubcodeQ(aSubcodeQ))
  584. return FALSE;
  585. #else
  586. if (!drv_get_subcodeQ(aSubcodeQ))
  587. return FALSE;
  588. #endif //SUBCODEQ_STREAMING_SUPPORT
  589. if (eRelativeLocation == eType) {
  590. // Extract the Relative MSF (including index information)
  591. BYTE ucIndex= drv_bcd2bin(aSubcodeQ[2]);
  592. // Determine the Sign of the Current-Location, according to whether or not this is
  593. // a Pause-Index.
  594. if (0 == ucIndex)
  595. *o_pRelativeSign= -1;
  596. else
  597. *o_pRelativeSign= 1;
  598. // Extract the Relative MSF
  599. *o_pMinute= drv_bcd2bin(aSubcodeQ[3]);
  600. *o_pSecond= drv_bcd2bin(aSubcodeQ[4]);
  601. *o_pFrame=  drv_bcd2bin(aSubcodeQ[5]);
  602. }
  603. else if (eAbsoluteLocation == eType) {
  604. // Extract the Absolute MSF
  605. *o_pMinute= drv_bcd2bin(aSubcodeQ[7]);
  606. *o_pSecond= drv_bcd2bin(aSubcodeQ[8]);
  607. *o_pFrame=  drv_bcd2bin(aSubcodeQ[9]);
  608. }
  609. else {
  610. dbg_printf(("Unknown Location-Type: %xn", eType));
  611. }
  612. dbg_printf(("Current Location (%s): %02d:%02d:%02dn", 
  613.   ((eAbsoluteLocation == eType) ? "Absolute" : "Relative"), 
  614.   *o_pMinute, *o_pSecond, *o_pFrame));
  615. return TRUE;
  616. }
  617. //////////////////////////////////////////////////////////////////////////////////
  618. // Function name : PE_CD_GetDecoderCurrentLocationLBN
  619. //
  620. // Purpose : Getting the current location in the LBN format.
  621. //
  622. // Input Parameters : none
  623. //
  624. // Return Value : DWORD 
  625. //
  626. // Description : Using the function PE_CD_GetDecoderCurrentLocationMSF in
  627. // order to get the location in the MSF format, and then 
  628. // just transforming it to LBN format.
  629. //////////////////////////////////////////////////////////////////////////////////
  630. DWORD PE_CD_GetDecoderCurrentLocationLBN(void)
  631. {
  632. UINT8 uMinute, uSecond, uFrame;
  633. if (PE_CD_GetDecoderCurrentLocationMSF(eAbsoluteLocation, &uMinute, &uSecond, &uFrame, NULL))
  634. return drv_msf2lbn(uMinute,uSecond, uFrame);
  635. return PE_CD_GetCurrentLocation();
  636. }
  637. //////////////////////////////////////////////////////////////////////////////////
  638. // Function name : PE_CD_GetDecoderCurrentLocationSCR
  639. //
  640. // Purpose : Getting the current location in terms of SCR.
  641. //
  642. // Output Parameters: 
  643. // UINT32 *o_pSCR
  644. //
  645. // Return Value : BOOL 
  646. //
  647. // Description : 
  648. //////////////////////////////////////////////////////////////////////////////////
  649. BOOL PE_CD_GetDecoderCurrentLocationSCR(UINT32 *o_pSCR)
  650. {
  651. return DEC_get_current_SCR(o_pSCR);
  652. }
  653. //////////////////////////////////////////////////////////////////////////////////
  654. // Function name : PE_CD_GetDecoderCurrentTrackInfo
  655. //
  656. // Purpose : Getting the current track info.
  657. //
  658. // Output Parameters : 
  659. // BYTE *o_pCtrl
  660. // BYTE *o_pTrackNumber
  661. //
  662. // Return Value : BOOL 
  663. //
  664. // Description : Reading the current track info from the Subcode-Q
  665. //////////////////////////////////////////////////////////////////////////////////
  666. BOOL PE_CD_GetDecoderCurrentTrackInfo(BYTE *o_pCtrl, BYTE *o_pTrackNumber)
  667. {
  668. BYTE aSubcodeQ[12];
  669. #ifdef SUBCODEQ_STREAMING_SUPPORT
  670. if (! _getDecoderSubcodeQ(aSubcodeQ))
  671. return FALSE;
  672. #else
  673. if (! drv_get_subcodeQ(aSubcodeQ))
  674. return FALSE;
  675. #endif //SUBCODEQ_STREAMING_SUPPORT
  676. *o_pCtrl= (aSubcodeQ[0] >> 4);
  677. *o_pTrackNumber= drv_bcd2bin(aSubcodeQ[1]);
  678. return TRUE;
  679. }
  680. //////////////////////////////////////////////////////////////////////////////////
  681. // Function name : PE_CD_SelectAudioStream
  682. //
  683. // Purpose : Setting the audio stream according to the given audio type.
  684. //
  685. // Input Parameters : 
  686. // AudioSID iAudioSID
  687. //
  688. // Return Value : void 
  689. //
  690. // Description : Using the decoder function in order to set the audio type.
  691. //////////////////////////////////////////////////////////////////////////////////
  692. void PE_CD_SelectAudioStream(AudioSID iAudioSID)
  693. {
  694. DEC_SetSID(DEC_SID_TYPE_AUDIO, (BYTE)iAudioSID);
  695.    
  696. return;
  697. }
  698. //////////////////////////////////////////////////////////////////////////////////
  699. // Function name : PE_CD_UpdateAudioSPDIF
  700. //
  701. // Purpose : Updating the digital information of the SPDIF 
  702. //
  703. // Input Parameters : none
  704. //
  705. // Return Value : void 
  706. //
  707. // Description : 
  708. //////////////////////////////////////////////////////////////////////////////////
  709. void PE_CD_UpdateAudioSPDIF(void)
  710. {
  711. UINT32 emphasis;
  712. #ifndef ADP_DEMO_TEST
  713. // Configure the Copy-protection bit
  714. API_ADP_Set_SPDIF_Chnl_Status(SET_COPYRIGHT_INDICATION, AS_GetSPDIF_Chnl_Status_Setting(SET_COPYRIGHT_INDICATION),NOT_SEND_TO_ADP);
  715. // Configure the Pre-Emphasis field
  716. emphasis = AS_GetSPDIF_Chnl_Status_Setting(SET_PRE_EMPHASIS);
  717. API_ADP_Set_SPDIF_Chnl_Status(SET_PRE_EMPHASIS, emphasis , NOT_SEND_TO_ADP);
  718. //I76 TODO:need to add it.
  719. //HAL_SET_PRE_EMPHASIS(emphasis);
  720. // Configure the Category field
  721. API_ADP_Set_SPDIF_Chnl_Status(SET_CATEGORY_CODE, AS_GetSPDIF_Chnl_Status_Setting(SET_CATEGORY_CODE), NOT_SEND_TO_ADP);
  722. #ifdef EXINO2  //ZMR ML0429 Digital out L_BIT_SET
  723. API_ADP_Set_SPDIF_Chnl_Status(SET_L_BIT, AS_GetSPDIF_Chnl_Status_Setting(SET_L_BIT), NOT_SEND_TO_ADP);
  724. #endif
  725. // Configure the Output Sampling-Rate field
  726. API_ADP_Set_SPDIF_Chnl_Status(SET_AUDIO_SAMPLE_RATE, AS_GetSPDIF_Chnl_Status_Setting(SET_AUDIO_SAMPLE_RATE), SEND_TO_ADP);
  727. #endif // ADP_DEMO_TEST
  728. return;
  729. }
  730. //////////////////////////////////////////////////////////////////////////////////
  731. // Function name : PE_CD_SetMute
  732. //
  733. // Purpose : 
  734. //
  735. // Input Parameters : 
  736. // BOOL bEnable - an indication whether or not to mute the output as well. 
  737. //
  738. // Return Value : void 
  739. //
  740. // Description : Sending the request to the ADP and the SPDIF
  741. //////////////////////////////////////////////////////////////////////////////////
  742. void PE_CD_SetMute(BOOL bEnable)
  743. {
  744. DEC_MuteOutput(MUTE_CORE_REQUEST, bEnable);
  745. DEC_MuteSPDIF(MUTE_CORE_REQUEST, bEnable);
  746. return;
  747. }
  748. //<<<Leslie_0828_2003_B: Code cleanup
  749. #if 0
  750. //////////////////////////////////////////////////////////////////////////////////
  751. // Function name : PE_CD_ConfigureTVSystem
  752. //
  753. // Purpose : 
  754. //
  755. // Input Parameters : none
  756. //
  757. // Return Value : void 
  758. //
  759. // Description : 
  760. //////////////////////////////////////////////////////////////////////////////////
  761. void PE_CD_ConfigureTVSystem(void)
  762. {
  763. /* EttiM - 25/11/2001
  764. static OUTPUT_VIDEO_STANDARD ovsCurrSystem= VIDEO_STANDARD_MULTI;
  765. OUTPUT_VIDEO_STANDARD ovsTvSystem;
  766. ovsTvSystem= I54_API_GetCodedVideoStandard();
  767. if (ovsTvSystem != ovsCurrSystem) {
  768. DEC_UpdateActual_tv_std(((VIDEO_STANDARD_NTSC == ovsTvSystem) ? 0 : 1), DEC_DISC_TYPE_VCD);
  769. ovsCurrSystem= ovsTvSystem;
  770. }
  771. */
  772. return;
  773. }
  774. #endif
  775. //Leslie_0828_2003_B>>>
  776. /**************************************************************************
  777. *
  778. * Function : PE_CD_AutoDetectVideoSetting
  779. *
  780. * In : cVideoSID = the video Stream ID to be set
  781. *   dwStartAddress = the start addr to start playing to get the Video info
  782. *   ulMaxBlocksCnt : Max nbr of block to be read
  783. * Out : void
  784. *
  785. * Return : TRUE if video scaling has been set properly, FALSE otherwise
  786. *
  787. * Desc : Use the Vaddis to get the Video size info needed for scaling
  788. * See Release notes 13.XX - Section 29 "Random access for special VCD Stream".
  789. *
  790. ***************************************************************************/
  791. BOOL PE_CD_AutoDetectVideoSetting(VideoSID cVideoSID, DWORD dwStartAddress, 
  792.   ULONG ulMaxBlocksCnt)
  793. {
  794. BOOL cReturn = TRUE;
  795. DEC_LL_DECODED_FRAME_RATE std;
  796. UINT32 uRetry=0;
  797. // Set Video Stream ID 
  798. DEC_SetSID(DEC_SID_TYPE_VIDEO, (BYTE)cVideoSID);
  799. // Set Audio Stream ID for No Audio Stream 
  800. DEC_SetSID(DEC_SID_TYPE_AUDIO, (BYTE)NoAudio);
  801. if (SI_IS_CURRENT_MPEG_CLIP)
  802. DEC_SetDiskType(DEC_DISC_TYPE_MPEG);
  803. else if (g_disc_type == DEC_DISC_TYPE_SVCD)
  804. DEC_SetDiskType(DEC_DISC_TYPE_SVCD);
  805. else
  806. DEC_SetDiskType(DEC_DISC_TYPE_VCD);
  807. DEC_prepare_to_decode();
  808. // Set Vaddis for playing Seq Header and start playing seq header 
  809. DEC_OnSequenceHeaderPlay();
  810. // Start the drive to read this seq 
  811. PE_Clips_SetPlaybackRange(dwStartAddress, ulMaxBlocksCnt, UNLIMITED_FILE_SIZE);
  812. if (IS_DVD_MEDIA)
  813. drv_play_dvd(dwStartAddress, ulMaxBlocksCnt, DRVF_PLAY_DVD_AV_DATA);
  814. else
  815. drv_play_cd_logical(DRVCF_CDSPEED_MAX | DRVF_PLAY_CD_DUMP_DATA, dwStartAddress, ulMaxBlocksCnt);
  816. if (!drv_is_playing())
  817. {
  818. dbg_printf(("PE_CD_AutoDetectVideoSetting, Drvier is not playing, waiting........n"));
  819. while (1)
  820. {
  821. if (drv_is_playing())
  822. {
  823. dbg_printf(("Success while waiting for driver spindle up, Waiting time = %x msn",uRetry));
  824. break;
  825. }
  826. else
  827. {
  828. usleep(1000UL);
  829. }
  830. uRetry++;
  831. if (uRetry>10000) // 10s
  832. {
  833.     dbg_printf(("Time out 10s while waiting for driver spindle upn"));
  834. break;
  835. }
  836. }
  837. }
  838. // Wait for the Vaddis to be in idle mode (finish reading seq header)
  839. if (! DEC_WaitForScalingCompletion()) 
  840. {
  841. tr_printf(("W_PE_CD_ADVideoSet - Cannot find seq headern"));
  842. cReturn = FALSE;
  843. }
  844. #ifndef V882_FLASH_CARD
  845. #ifdef SUPPORT_FLASH_CARD
  846. if(IS_PLAYING_CARD)
  847. {
  848. while(FALSE == drv_is_play_done());
  849. }
  850. #endif
  851. #endif //V882_FLASH_CARD
  852. drv_abort_play();
  853. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, 0);
  854. usleep(25000UL);                //Wait for one field period to make sure CPU received DVP message about video format
  855. // Configure the approriate TV-Standard, according to the Video-settings just detected
  856. if (cReturn)
  857. {
  858. /*!!!Following sequence is imporatant to avoid video artifact during TV format conversion */
  859. //Get information of new video clip
  860. DEC_LL_GetCodedVideoStandard( &std );
  861. //Change display video format according to displaying picture information
  862. DEC_set_display_video_format( std );
  863. #ifdef SVCD_SCALING_BY_CPU
  864. DEC_EnableManualScaling(PROG_SCALER_MODE_CCRAM);
  865. #else
  866. DEC_DisableManualScaling();
  867. #endif
  868. }
  869. return cReturn;
  870. }
  871. //////////////////////////////////////////////////////////////////////////////////
  872. // Function name : PE_CD_DisableCGMSData
  873. //
  874. // Purpose : Disabling the CGMS and the Microvision
  875. //
  876. // Input Parameters : none
  877. //
  878. // Return Value : void 
  879. //
  880. // Description : 
  881. //////////////////////////////////////////////////////////////////////////////////
  882. void PE_CD_DisableCGMSData(void)
  883. {
  884. DEC_on_set_macrovision_mode(0); //set MV off
  885. DEC_Set_CGMS(0, 0xff, 0, 0); //set CGMS=0
  886. }
  887. //////////////////////////////////////////////////////////////////////////////////
  888. // Function name : PE_CD_PlaySegment
  889. //
  890. // Purpose : Playing a given segment.
  891. //
  892. // Input Parameters : 
  893. // VideoSID eVideoSID
  894. // AudioSID eAudioSID
  895. // DWORD dwStartAddress
  896. // ULONG ulBlocksCnt
  897. // enPlaybackType ePBType
  898. // ULONG ulParam
  899. //
  900. // Return Value : BOOL 
  901. //
  902. // Description : 
  903. //////////////////////////////////////////////////////////////////////////////////
  904. BOOL PE_CD_PlaySegment(VideoSID eVideoSID, AudioSID eAudioSID, DWORD dwStartAddress,    
  905. ULONG ulBlocksCnt, enPlaybackType ePBType, ULONG ulParam)
  906. {
  907. WORD wDriveMode;
  908. DEC_PLAYBACK_CMD pbCommand = DEC_PLAYBACK_CMD_PLAY;
  909. dbg_printf(("PE_CD_PlaySegment(Video= %02x, Audio= %02x, StartAddress= 0x%08lx, BlocksCnt= %ul, PlaybackType= %02x)n", 
  910. eVideoSID, eAudioSID, dwStartAddress, ulBlocksCnt, ePBType));
  911. #ifdef SVCD_SCALING_BY_CPU
  912. DEC_EnableManualScaling(PROG_SCALER_MODE_CCRAM);
  913. DEC_set_Display_AspectRatio(gps->tv_shape);
  914. if (VIEW_MODE_ORIGINAL == gps->view_mode)
  915. DEC_SetViewMode(VIEW_MODE_FILL);
  916. else
  917. DEC_SetViewMode(gps->view_mode);
  918. //Set information of new video clip for playback
  919. DEC_set_coded_AR_sourceNav( TRUE );
  920. DEC_set_coded_AspectRatio(DEC_LL_DECODED_ASPECT_RATIO_4X3);          //VCD/SVCD containes only 4:3  picture
  921. #else
  922. DEC_DisableManualScaling();
  923. #endif
  924. switch (g_disc_type)
  925. {
  926. //Leon.He_0318_04:: For CDDA tracks on SVCD/VCD discs, set the disc type as CDDA
  927. case DEC_DISC_TYPE_VCD:
  928. if( eAudioSID!= CDDA_SID && eAudioSID!= CDDTS_SID)
  929. {
  930. DEC_SetDiskType(DEC_DISC_TYPE_VCD);
  931. break;
  932. }
  933. //fall through
  934. case DEC_DISC_TYPE_SVCD:
  935. if( eAudioSID!= CDDA_SID && eAudioSID!= CDDTS_SID)
  936. {
  937. DEC_SetDiskType(DEC_DISC_TYPE_SVCD);
  938. break;
  939. }
  940. //fall through
  941. case DEC_DISC_TYPE_CDDA:
  942. DEC_ResetSubcodeQ();
  943. DEC_SetDiskType(DEC_DISC_TYPE_CDDA);
  944. break;
  945. }
  946. DEC_prepare_to_decode();
  947. DEC_SetSID(DEC_SID_TYPE_VIDEO, (BYTE)eVideoSID);
  948. if ((eScan == ePBType) && (CDDA_SID != eAudioSID) && (CDDTS_SID != eAudioSID))
  949. {
  950. DEC_SetSID(DEC_SID_TYPE_AUDIO, (BYTE)0x00);
  951. DEC_SetCDScan(TRUE);
  952. DEC_LL_SyncMode(DEC_LL_SYNC_MODE_NO_SYNC);
  953. }
  954. else
  955. {
  956. DEC_SetSID(DEC_SID_TYPE_AUDIO, (BYTE)eAudioSID);
  957. DEC_SetCDScan(FALSE);
  958. DEC_LL_SyncMode(DEF_VIDEO_SYNC);
  959. }
  960. if (eAudioSID == CDDA_SID || eAudioSID == CDDTS_SID || CDDETECT_SID == eAudioSID ) 
  961. {
  962. wDriveMode = DRVCF_CDSPEED_1X;
  963. }
  964. else
  965. wDriveMode = DRVCF_CDSPEED_MAX;
  966. //LX051703: Add AV Data mode for Play CD
  967. if ( ( STILL_HIRES == eVideoSID ) || ( STILL_LOWRES == eVideoSID ) )
  968. wDriveMode |= DRVF_PLAY_CD_DUMP_DATA;
  969. else
  970. wDriveMode |= DRVF_PLAY_CD_AV_DATA;
  971. // Inform the Decoder of the Playback-Range
  972. DEC_CD_SetPlaybackRange(dwStartAddress, ulBlocksCnt, UNLIMITED_FILE_SIZE);
  973. if (! drv_play_cd_logical(wDriveMode, dwStartAddress, ulBlocksCnt))
  974. return FALSE;
  975. switch (ePBType)
  976. {
  977. case eSearch: // Fall-Through!
  978. case eNormalSpeed:
  979. pbCommand= DEC_PLAYBACK_CMD_PLAY;
  980. break;
  981. case eScan:
  982. pbCommand= DEC_PLAYBACK_CMD_REF_FRAME_ONLY;
  983. break;
  984. case eSlowMotion:
  985. pbCommand= DEC_PLAYBACK_CMD_SLOW;
  986. break;
  987. default:
  988. dbg_printf(("Unknown Playback-Type: %xn", ePBType));
  989. break;
  990. }
  991. DEC_PlaybackCommand(pbCommand, (DWORD)ulParam);
  992. if ((eAudioSID == CDDTS_SID) && (gtps.mMute == MUTE_SETTING_OFF)) //ZCO LC032003
  993. ie_send_ex(IE_CORE_UPDATE_PS, (void *)((((DWORD)PS_UPDATE_VOLUME_SETTING)<<16) + gps->volume));
  994. #ifdef WATCHDOG_TRIGGERED_BY_FE
  995. if ((eAudioSID == CDDA_SID) || (IsSegmentPlay() && (eVideoSID != MPEG_2) )){
  996. PE_CD_CancelNotification( StuckTrigger );
  997. }else{
  998. PE_CD_RequestNotification( StuckTrigger );
  999. }
  1000. #endif
  1001. return TRUE;
  1002. }
  1003. //////////////////////////////////////////////////////////////////////////////////
  1004. // Function name : PE_CD_PausePlayback
  1005. //
  1006. // Purpose : Performing the pause request.
  1007. //
  1008. // Input Parameters : 
  1009. // BOOL bEnable - perform pause or resume indication.
  1010. // AudioSID eAudioSID - the current audio sid 
  1011. //
  1012. // Return Value : void 
  1013. //
  1014. // Description : Performing the pause operation with the option to stay on a
  1015. // stand-by mode.
  1016. //////////////////////////////////////////////////////////////////////////////////
  1017. void PE_CD_PausePlayback(BOOL bEnable, AudioSID eAudioSID)
  1018. {
  1019. if (bEnable) {
  1020. //since the decoder waits for the next I-Frame, it will ignore the PAUSE command.
  1021. //So we first switch it back to PLAY and then send the PAUSE command.
  1022. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PAUSE, 0);
  1023. }
  1024. else
  1025. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_RESUME, 0);
  1026. return;
  1027. }
  1028. //////////////////////////////////////////////////////////////////////////////////
  1029. // Function name : PE_CD_Step
  1030. //
  1031. // Purpose : 
  1032. //
  1033. // Input Parameters : none
  1034. //
  1035. // Return Value : void 
  1036. //
  1037. // Description : 
  1038. //////////////////////////////////////////////////////////////////////////////////
  1039. void PE_CD_Step(void)
  1040. {
  1041. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STEP, NULL);
  1042. return;
  1043. }
  1044. void PE_CD_AbortPlayback(BOOL bRemainInStandby)
  1045. {
  1046. drv_abort_play();
  1047. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, 0);
  1048. if (! bRemainInStandby)
  1049. drv_spindown();
  1050. return;
  1051. }
  1052. //////////////////////////////////////////////////////////////////////////////////
  1053. // Function name : PE_CD_AbortPlaybackEx
  1054. //
  1055. // Purpose : Aborting the current playback.
  1056. //
  1057. // Input Parameters : none
  1058. //
  1059. // Return Value : void 
  1060. //
  1061. // Description : Stopping the playback but always remaining in a standby mode
  1062. //////////////////////////////////////////////////////////////////////////////////
  1063. void PE_CD_AbortPlaybackEx(void)
  1064. {
  1065. //The decoder must be stopped before the drive so the I Frame will be displayed.
  1066. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, 0);
  1067. drv_abort_play();
  1068. return;
  1069. }
  1070. //////////////////////////////////////////////////////////////////////////////////
  1071. // Function name : PE_CD_IsPlaybackFinished
  1072. //
  1073. // Purpose : Getting the indication whether the playback is finished or not.
  1074. //
  1075. // Input Parameters : none
  1076. //
  1077. // Return Value : BOOL 
  1078. //
  1079. // Description : Checking all the conditions that show the playback is 
  1080. // actually finished.
  1081. //////////////////////////////////////////////////////////////////////////////////
  1082. BOOL PE_CD_IsPlaybackFinished(void)
  1083. {
  1084. if (drv_is_play_done() && DEC_IsPlaybackFinished(FALSE)) 
  1085. return TRUE; 
  1086. return FALSE; 
  1087. }
  1088. //////////////////////////////////////////////////////////////////////////////////
  1089. // Function name : PE_CD_RequestNotification
  1090. //
  1091. // Purpose : 
  1092. //
  1093. // Input Parameters : 
  1094. // NotificationType eType
  1095. //
  1096. // Return Value : void 
  1097. //
  1098. // Description : 
  1099. //////////////////////////////////////////////////////////////////////////////////
  1100. void PE_CD_RequestNotification(NotificationType eType)
  1101. {
  1102. switch (eType) 
  1103. {
  1104. case TriggerBit:
  1105. DEC_NotificationRequest(DECN_TRIGGER_BIT);
  1106. break;
  1107. case IFrame:
  1108. DEC_NotificationRequest(DECN_I_FRAME);
  1109. break;
  1110. case StuckTrigger:
  1111. DEC_Reset_PicDecoding_Stuck_Counter();
  1112. DEC_NotificationRequest(DECN_STUCK_CONDITION);
  1113. break;
  1114. }
  1115. return;
  1116. }
  1117. //////////////////////////////////////////////////////////////////////////////////
  1118. // Function name : PE_CD_CancelNotification
  1119. //
  1120. // Purpose : 
  1121. //
  1122. // Input Parameters : 
  1123. // NotificationType eType
  1124. //
  1125. // Return Value : void 
  1126. //
  1127. // Description : 
  1128. //////////////////////////////////////////////////////////////////////////////////
  1129. void PE_CD_CancelNotification(NotificationType eType)
  1130. {
  1131. switch (eType) 
  1132. {
  1133. case TriggerBit:
  1134. DEC_NotificationClear(DECN_TRIGGER_BIT);
  1135. break;
  1136. case IFrame:
  1137. DEC_NotificationClear(DECN_I_FRAME);
  1138. break;
  1139. }
  1140. return;
  1141. }
  1142. void PE_CD_DisplayLogo(void)
  1143. {
  1144. #ifndef EXTERNAL_LOGO_SOURCE_SETTING
  1145. Logo_selectSource(eStartup);
  1146. #endif //EXTERNAL_LOGO_SOURCE_SETTING
  1147. Logo_display();
  1148. return;
  1149. }
  1150. void PE_CD_DisplayBackground(BOOL bEnable)
  1151. {
  1152. #ifndef EXTERNAL_LOGO_SOURCE_SETTING
  1153. Logo_selectSource(eBackground);
  1154. #endif //EXTERNAL_LOGO_SOURCE_SETTING
  1155. if (bEnable)
  1156. Logo_display();
  1157. else
  1158. Logo_clear();
  1159. return;
  1160. }
  1161. //////////////////////////////////////////////////////////////////////////////////
  1162. // Function name : PE_CD_SetScan
  1163. //
  1164. // Purpose : Switching to scan mode.
  1165. //
  1166. // Input Parameters : 
  1167. // BOOL bEnable
  1168. // AudioSID eAudioType
  1169. // int iScanSpeed
  1170. //
  1171. // Return Value : void 
  1172. //
  1173. // Description : Setting the approrpiate drive mode according to the given
  1174. // sacn speed, and sending it forward to the drive.
  1175. //////////////////////////////////////////////////////////////////////////////////
  1176. void PE_CD_SetScan(BOOL bEnable, AudioSID eAudioType, int iScanSpeed)
  1177. {
  1178. // Take care of non-AV streams (CDDA, CDDTS, etc.)
  1179. if ((CDDA_SID == eAudioType) || (CDDTS_SID == eAudioType)) {
  1180. UINT8 ucDriveMode;
  1181. UINT16 uAbsoluteSpeed= abs(iScanSpeed);
  1182. if (bEnable && (0 != iScanSpeed)) {
  1183. if ((uAbsoluteSpeed >= 1) && (uAbsoluteSpeed <= 2))
  1184. ucDriveMode= DRVCF_SEARCHSPEED_2X;
  1185. else if ((uAbsoluteSpeed >= 3) && (uAbsoluteSpeed <= 4))
  1186. ucDriveMode= DRVCF_SEARCHSPEED_4X;
  1187. else
  1188. ucDriveMode= DRVCF_SEARCHSPEED_10X;
  1189. }
  1190. else
  1191. ucDriveMode= DRVCF_SEARCHSPEED_1X;
  1192. if (iScanSpeed < 0) 
  1193. ucDriveMode |= DRVCF_SEARCH_BW;
  1194. drv_set_cdda_search_mode(ucDriveMode);
  1195. return;
  1196. }
  1197. drv_set_cdda_search_mode(DRVCF_SEARCHSPEED_1X);
  1198. //Stopping the decoder first in order to force synchroniation of the Audio and 
  1199. //the Video before the play
  1200. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, 0);
  1201. DEC_SetCDScan(bEnable);
  1202. // Take care of AV streams
  1203. if (bEnable) 
  1204. {
  1205. // When scanning, turn-off Audio, to prevent A/V Sync. interferance
  1206. DEC_SetSID(DEC_SID_TYPE_AUDIO, NoAudio);
  1207. DEC_LL_SyncMode(DEC_LL_SYNC_MODE_NO_SYNC);
  1208. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_REF_FRAME_ONLY, 0);
  1209. }
  1210. else 
  1211. {
  1212. // When cancelling a Scan, re-establish the appropriate Audio-SID
  1213. DEC_SetSID(DEC_SID_TYPE_AUDIO, eAudioType);
  1214. DEC_LL_SyncMode(DEF_VIDEO_SYNC);
  1215. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, 0);
  1216. }
  1217. return;
  1218. }
  1219. //////////////////////////////////////////////////////////////////////////////////
  1220. // Function name : PE_CD_SetSlowMotion
  1221. //
  1222. // Purpose : Setting the playback to a slow motion mode.
  1223. //
  1224. // Input Parameters : 
  1225. // BOOL bEnable
  1226. // UINT8 uSlowSpeed
  1227. //
  1228. // Return Value : void 
  1229. //
  1230. // Description : 
  1231. //////////////////////////////////////////////////////////////////////////////////
  1232. void PE_CD_SetSlowMotion(BOOL bEnable, UINT8 uSlowSpeed)
  1233. {
  1234. if (bEnable && (0 != uSlowSpeed))
  1235. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_SLOW, (DWORD)uSlowSpeed);
  1236. else
  1237. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, 0);
  1238. return;
  1239. }
  1240. #ifdef CVD_ENABLED
  1241. ////////////////////////////////////////////////////////////////////////////
  1242. // Function Name: 
  1243. //   PE_CD_EnableCVDDecryption
  1244. //
  1245. // Purpose: Enables reading a CVD encrypted disc. 
  1246. //
  1247. // Input Parameters:
  1248. //  BOOL bEnable - detrmines whether to enable decryption, or not
  1249. //   DWORD i_dwEncryptionInfoAddr - encryption address 
  1250. //   DWORD i_dwEncryptionInfoSize - encryption info size
  1251. //
  1252. // Return Value:
  1253. //   BOOL - an indication whether the operation was successful or not.
  1254. //
  1255. // Description: 
  1256. //   Reading the encrypted data and decoding it.
  1257. /////////////////////////////////////////////////////////////////////////////
  1258. BOOL PE_CD_EnableCVDDecryption(BOOL bEnable, DWORD i_dwEncryptionInfoAddr, 
  1259.    DWORD i_dwEncryptionInfoSize)
  1260. {
  1261. if (bEnable) {
  1262. if (! DEC_CVD_ProcessDiskID(i_dwEncryptionInfoAddr, i_dwEncryptionInfoSize))
  1263. return FALSE;
  1264. }
  1265. DEC_CVD_EnableDecryption(bEnable);
  1266. return TRUE;
  1267. #endif // CVD_ENABLED
  1268. //////////////////////////////////////////////////////////////////////////////////
  1269. // Function name : PE_CD_VideoIsActive
  1270. //
  1271. // Purpose : Getting an indication whether the decoder already displayed
  1272. // some video data.
  1273. //
  1274. // Input Parameters : none
  1275. //
  1276. // Return Value : BOOL - FALSE in case nothing is currently displayed by the video.
  1277. //
  1278. // Description : Checking the state of the decoder whether it is idle or
  1279. // it has no video to display.
  1280. //////////////////////////////////////////////////////////////////////////////////
  1281. BOOL PE_CD_VideoIsActive(void)
  1282. {
  1283. return DEC_IsVideoActive();
  1284. }
  1285. //////////////////////////////////////////////////////////////////////////////////
  1286. // Function name : PE_CD_StreamPortion
  1287. //
  1288. // Purpose : Playing a given unit of stream.
  1289. //
  1290. // Input Parameters : 
  1291. // DWORD dwAddress 
  1292. // ULONG uSize
  1293. //
  1294. // Return Value : void 
  1295. //
  1296. // Description : approaching the drive andplaying the given stream.
  1297. //////////////////////////////////////////////////////////////////////////////////
  1298. void PE_CD_StreamPortion(DWORD dwAddress, ULONG uSize)
  1299. {
  1300. //LX051703: Add AV Data mode for Play CD
  1301. drv_play_cd_logical(DRVCF_CDSPEED_MAX | DRVF_PLAY_CD_AV_DATA, dwAddress, uSize);
  1302. }
  1303. //////////////////////////////////////////////////////////////////////////////////
  1304. // Function name : PE_CD_ADP_isSyncPointEstablished
  1305. //
  1306. // Purpose : Getting the indication from the ADP has a sync point for 
  1307. // CDDTS stream been established.
  1308. //
  1309. // Input Parameters : none
  1310. //
  1311. // Return Value : BOOL - TRUE in case a sync point was established, FALSE otherwise.
  1312. //
  1313. // Description : Checking the DTS status reply of the ADP - if the ADP is on running
  1314. // mode and input underflow is not occurring.
  1315. //////////////////////////////////////////////////////////////////////////////////
  1316. BOOL PE_CD_ADP_isSyncPointEstablished(void)
  1317. {
  1318. return DEC_ADP_isSyncPointEstablished();
  1319. }
  1320. //////////////////////////////////////////////////////////////////////////////////
  1321. // Function name : PE_CD_ADP_isStreamValid
  1322. //
  1323. // Purpose : Checking if the current played stream is a valid CDDTS stream.
  1324. //
  1325. // Input Parameters : none
  1326. //
  1327. // Return Value : BOOL 
  1328. //
  1329. // Description : Getting the ADP status and checking that both the global status
  1330. // and the DTS decode status report no errors.
  1331. //////////////////////////////////////////////////////////////////////////////////
  1332. BOOL PE_CD_isAudioStreamValid(void)
  1333. {
  1334. return DEC_ADP_isStreamValid();
  1335. }
  1336. //SeanLiu_0902_2004
  1337. #ifdef AUDIO_IN_SUPPORT
  1338. void PE_CD_AUDIO_IN_MODE(AUDIO_IN_MODE_SETTING audio_in_mode)
  1339. {
  1340. switch(audio_in_mode)
  1341. {
  1342. case AUDIO_IN_MODE_ANALOG :
  1343. // if ((MP3_SID == g_audio_sid) || (WMA_SID == g_audio_sid) || (NoAudio == g_audio_sid))  //add by wl111104
  1344. DEC_SetSID(DEC_SID_TYPE_AUDIO, CDDA_SID);     //add by wl111104
  1345. DEC_SetDiskType(DEC_DISC_TYPE_AIN);
  1346. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, NULL);
  1347. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, NULL);
  1348. ADP_GlobalPlay();
  1349. DEC_SetSID(DEC_SID_TYPE_VIDEO, NoVideo);
  1350. DEC_SetSID(DEC_SID_TYPE_AUDIO, ANALOG_IN_SID);
  1351. DEC_MuteOutput(MUTE_CORE_REQUEST, MUTE_SETTING_OFF);
  1352. DEC_MuteSPDIF(MUTE_CORE_REQUEST, MUTE_SETTING_OFF);
  1353. break;
  1354. case AUDIO_IN_MODE_COAXIAL :
  1355. case AUDIO_IN_MODE_OPTICAL :
  1356. #ifdef D_ENABLE_SPDIF_IN_PORT
  1357. if(AUDIO_IN_MODE_OPTICAL == audio_in_mode)
  1358. {
  1359. IO_Select_SPDIFIN_Pin(FALSE);
  1360. }
  1361. else
  1362. {
  1363. IO_Select_SPDIFIN_Pin(TRUE);
  1364. }
  1365. #endif
  1366. DEC_SetDiskType(DEC_DISC_TYPE_AIN);
  1367. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, NULL);
  1368. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, NULL);
  1369. ADP_GlobalPlay();
  1370. DEC_SetSID(DEC_SID_TYPE_VIDEO, NoVideo);
  1371. DEC_SetSID(DEC_SID_TYPE_AUDIO, DIGITAL_IN_SID);
  1372. DEC_MuteOutput(MUTE_CORE_REQUEST, MUTE_SETTING_OFF);
  1373. DEC_MuteSPDIF(MUTE_CORE_REQUEST, MUTE_SETTING_OFF);
  1374. break;
  1375. default :
  1376. DEC_SetSID(DEC_SID_TYPE_VIDEO, NoVideo);
  1377. DEC_SetSID(DEC_SID_TYPE_AUDIO, NoAudio);
  1378. }
  1379. }
  1380. void PE_CD_SelectAINMode(void)
  1381. {
  1382. /*
  1383. BYTE bAinMode = gps->ain_mode;
  1384. switch (bAinMode)
  1385. {
  1386. case M_Mode_OFF:
  1387. PS_SET_ANALOG_AUDIO_SETTING(AUDIO_STREAM_PCM,ANALOG_AUDIO_2CH);
  1388. PE_CD_AIN_Play(0);
  1389. PE_CD_AIN_Play(1);
  1390. break;
  1391. case M_Mode_Prologic_EMU:
  1392. PS_SET_ANALOG_AUDIO_SETTING(AUDIO_STREAM_PCM,ANALOG_AUDIO_6CH);
  1393. PE_CD_AIN_Play(0);
  1394. PE_CD_AIN_Play(1);
  1395. break;
  1396. default:
  1397. break;
  1398. }
  1399. */
  1400. }
  1401. void PE_CD_SelectAINChannelMode(void)
  1402. {
  1403. /*
  1404. BYTE bAinMode = gps->ain_mode;
  1405. switch (bAinMode)
  1406. {
  1407. case M_Mode_OFF:
  1408. PS_SET_ANALOG_AUDIO_SETTING(AUDIO_STREAM_PCM,ANALOG_AUDIO_2CH);
  1409. break;
  1410. case M_Mode_Prologic_EMU:
  1411. PS_SET_ANALOG_AUDIO_SETTING(AUDIO_STREAM_PCM,ANALOG_AUDIO_6CH);
  1412. break;
  1413. default:
  1414. PS_SET_ANALOG_AUDIO_SETTING(AUDIO_STREAM_PCM,ANALOG_AUDIO_6CH);
  1415. }
  1416. */
  1417. }
  1418. #endif //AUDIO_IN_SUPPORT
  1419. //<<<SeanLiu_0902_2004
  1420. #ifdef CDDA_DEEMPHASIS_ENABLE
  1421. /**************************************************************************
  1422. *
  1423. * Function : PE_CD_SetDeemphasis
  1424. *
  1425. * In : DeEmphasis or not
  1426. * Out : void
  1427. *
  1428. * Return : void
  1429. *
  1430. * Desc :  Indicate IO_HAL to implement the de-emphasis
  1431. *
  1432. ***************************************************************************/
  1433. void PE_CD_SetDeemphasis(BOOL DeEmphasis)    
  1434. {
  1435. #ifndef INTERNAL_DAC
  1436. if (DeEmphasis)
  1437. DEC_EX_SetDeemphasis(TRUE);
  1438. else
  1439. DEC_EX_SetDeemphasis(FALSE);
  1440. #endif
  1441. }
  1442. #endif
  1443. //SeanLiu_0902_2004
  1444. #ifdef D_ENABLE_SVCD_SAMPLE_RATE_DETECTION
  1445. /**************************************************************************
  1446. *
  1447. * Function :
  1448. *
  1449. * In :
  1450. * Out :
  1451. *
  1452. * Return :
  1453. *
  1454. * Desc :
  1455. *
  1456. ***************************************************************************/
  1457. UINT32 PE_CD_AutoDetectAudioSetting( AudioSID cAudioSID, DWORD dwStartAddress, ULONG ulMaxBlocksCnt)
  1458. {
  1459. UINT32 SampleRate = 0;
  1460. dbg_printf(("On Audio Sampling Rate Detectingn"));
  1461. DEC_MuteOutput(MUTE_DETECT_REQUEST, MUTE_SETTING_ON);
  1462. DEC_MuteSPDIF(MUTE_DETECT_REQUEST, MUTE_SETTING_ON);
  1463. DEC_SetSID( DEC_SID_TYPE_VIDEO, (BYTE)NoVideo);
  1464. DEC_SetSID( DEC_SID_TYPE_AUDIO, (BYTE)cAudioSID);
  1465. //We already set the Decoder Disc Type correctly
  1466. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, NULL);
  1467. /* Start the drive to read this seq */
  1468. drv_play_cd_logical(DRVCF_CDSPEED_MAX, dwStartAddress, ulMaxBlocksCnt);
  1469. SampleRate = DEC_Get_MPEG_Audio_SamplingRate();
  1470. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, NULL);
  1471. drv_abort_play();
  1472. DEC_MuteOutput(MUTE_DETECT_REQUEST, MUTE_SETTING_OFF);
  1473. DEC_MuteSPDIF(MUTE_DETECT_REQUEST, MUTE_SETTING_OFF);
  1474. return SampleRate;
  1475. }
  1476. #endif //D_ENABLE_SVCD_SAMPLE_RATE_DETECTION
  1477. //<<<SeanLiu_0902_2004
  1478. /**************************************************************************
  1479. *
  1480. * Function : PE_CD_GetCdDetectType
  1481. *
  1482. * In : none
  1483. * Out : none
  1484. *
  1485. * Return : return the results of the cd-detection
  1486. *
  1487. * Desc : detect CDDTS 
  1488. *
  1489. ***************************************************************************/
  1490. CD_DETECT_RESULT PE_CD_GetCdDetectType(void)
  1491. {
  1492. return API_ADP_GetCdDetectType();
  1493. }
  1494. #ifdef CDDA_ERROR_RECOVERY
  1495. /**************************************************************************
  1496. *
  1497. * Function : PE_CD_CheckAudioBufferFullness
  1498. *
  1499. * In :  void
  1500. * Out :  TRUE if fullness
  1501. *
  1502. * Return : Size in term of 32 bytes
  1503. *
  1504. * Desc :  Check if current Audio Coded Buffer is more than Threshold
  1505. *
  1506. ***************************************************************************/
  1507. BOOL PE_CD_CheckAudioBufferFullness(void)
  1508. {
  1509. UINT16 uiAudioCodedBufferLevel;
  1510. uiAudioCodedBufferLevel = DEC_ReadCodeBufferFullness(DEC_AUDIO_CODE_BUFFER, DEC_FULLNESS_IN_KILOBYTES);
  1511. if ( uiAudioCodedBufferLevel >= CDDA_AUDIO_CODED_BUFFER_FULLNESS_THRESHOLD )
  1512. return TRUE;
  1513. else
  1514. return FALSE;
  1515. }
  1516. #endif
  1517. /**************************************************************************
  1518. *
  1519. * Function : PE_CD_SetCurrentLocationLBN_Bakcup
  1520. *
  1521. * In : 
  1522. * Out : 
  1523. *
  1524. * Return : 
  1525. *
  1526. * Desc :  
  1527. *
  1528. ***************************************************************************/
  1529. void PE_CD_SetCurrentLocationLBN_Bakcup(DWORD dwCurrentLocation)
  1530. {
  1531. g_dwCurrentLocaionLBN = dwCurrentLocation;
  1532. }