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

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: PlayMode.c $             
  6.  *
  7.  * Description: 
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 10 $
  14.  * Last Modified by $Author: Jerryc $ at $Modtime: 04-03-16 9:41 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/PlayMode/PlayMode.c $
  19.  * 
  20.  * 10    04-03-16 9:42 Jerryc
  21.  * fix sacd repeat mode.
  22.  * 
  23.  * 9     04-03-04 14:04 Jerryc
  24.  * add support for sacd program mode.
  25.  * 
  26.  * 8     2/26/04 6:30p Leonh
  27.  * enable the shuffle beyond 255
  28.  * 
  29.  * 7     2/20/04 6:21p Glenl
  30.  * Merged S1 code
  31.  * 
  32.  * 6     2/10/04 3:58p Leonh
  33.  * rewrite the shuffle, rename the old one as random
  34.  * 
  35.  * 5     03-04-28 10:41 Jerryc
  36.  * take care of the case "shuffle program list which has no entries."
  37.  * 
  38.  * 4     03-03-07 19:11 Jerryc
  39.  * jerryc, add support for random play mode.
  40.  * 
  41.  * 3     10/30/02 17:49 Rond
  42.  * 
  43.  * 4     23/04/02 9:35 Nirm
  44.  * - Added dependency in "Config.h".
  45.  * 
  46.  * 3     16/01/02 12:33 Atai
  47.  * Change debug printing
  48.  * 
  49.  * 2     9/01/02 16:47 Nirm
  50.  * Corrected Include-Paths.
  51.  ****************************************************************************************/
  52. #include "Config.h" // Global Configuration - do not remove!
  53. #ifdef _DEBUG
  54. #undef IFTRACE
  55. #define IFTRACE if (gTraceCore) 
  56. #include "DebugDbgMain.h"
  57. #endif
  58. #include "Includesysdefs.h"
  59. #include "Kernelker_api.h"
  60. #include "Kerneleventdef.h"
  61. #include "PlaycoreScPadscmgr.h"
  62. #include "PlaycorePlayModeplaymode.h"
  63. #include "Playcorenav_cddaPE_CD.h"
  64. /////////////////////////////////////////////////////////////////////////////////////////////////
  65. // Global Variables
  66. PlayModeInfo g_PlayModeInfo={0};
  67. /////////////////////////////////////////////////////////////////////////////////////////////////
  68. // Public Services
  69. BYTE PM_GetPlaybackMode(void)
  70. {
  71. return g_PlayModeInfo.iPlaybackMode;
  72. }
  73. void PM_SetPlaybackMode(BYTE iPlaybackMode)
  74. {
  75. g_PlayModeInfo.iPlaybackMode &= PM_PBC_MASK; // Clear the existing Mode
  76. g_PlayModeInfo.iPlaybackMode |= iPlaybackMode; // Set the new Mode
  77. return;
  78. }
  79. void PM_SetPBC(BOOL bEnable)
  80. {
  81. if (bEnable)
  82. g_PlayModeInfo.iPlaybackMode |= PM_PBC_MASK;
  83. else
  84. g_PlayModeInfo.iPlaybackMode &= ~((BYTE)PM_PBC_MASK);
  85. return;
  86. }
  87. BOOL PM_IsRepeatSingle(void)
  88. {
  89. return ((g_PlayModeInfo.iRepeatMode & PM_REPEAT_SINGLE) ? TRUE : FALSE);
  90. }
  91. #ifdef S1_GUI
  92. BOOL PM_IsRepeat10SEC(void)
  93. {
  94. return ((g_PlayModeInfo.iRepeatMode & PM_REPEAT_10SEC) ? TRUE : FALSE);
  95. }
  96. void PM_SetRepeat10SEC(BOOL bEnable)
  97. {
  98. if (bEnable){
  99. g_PlayModeInfo.iRepeatMode = PM_REPEAT_10SEC;
  100. }
  101. else
  102. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_10SEC);
  103. return;
  104. }
  105. #endif
  106. BOOL PM_IsRepeatAll(void)
  107. {
  108. return ((g_PlayModeInfo.iRepeatMode & PM_REPEAT_ALL) ? TRUE : FALSE);
  109. }
  110. BYTE PM_GetRepeatAB(void)
  111. {
  112. return (g_PlayModeInfo.iRepeatMode & PM_REPEAT_AB_MASK);
  113. }
  114. BOOL PM_IsRepeatFolder(void)
  115. {
  116. return ((g_PlayModeInfo.iRepeatMode & PM_REPEAT_FOLDER) ? TRUE : FALSE);
  117. }
  118. void PM_SetRepeatSingle(BOOL bEnable)
  119. {
  120. if (bEnable){
  121. //Cancel Repeat All first
  122. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_ALL);
  123. g_PlayModeInfo.iRepeatMode = PM_REPEAT_SINGLE;
  124. }
  125. else
  126. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_SINGLE);
  127. #if D_SUPPORT_SACD
  128. ie_send(IE_CORE_SEAMLESS_MODE_CHANGE);
  129. #endif
  130. return;
  131. }
  132. void PM_SetRepeatAll(BOOL bEnable)
  133. {
  134. if (bEnable){
  135. //cancel repeat single first
  136. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_SINGLE);
  137. g_PlayModeInfo.iRepeatMode = PM_REPEAT_ALL;
  138. }
  139. else
  140. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_ALL);
  141. #if D_SUPPORT_SACD
  142. ie_send(IE_CORE_SEAMLESS_MODE_CHANGE);
  143. #endif
  144. return;
  145. }
  146. void PM_SetRepeatFolder(BOOL bEnable)
  147. {
  148. if (bEnable){
  149. //Cancel Repeat Single/All first
  150. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_SINGLE | PM_REPEAT_ALL);
  151. g_PlayModeInfo.iRepeatMode = PM_REPEAT_FOLDER;
  152. }
  153. else
  154. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_FOLDER);
  155. return;
  156. }
  157. void PM_ClearRepeat(void)
  158. {
  159. g_PlayModeInfo.iRepeatMode = 0;
  160. #if D_SUPPORT_SACD
  161. ie_send(IE_CORE_SEAMLESS_MODE_CHANGE);
  162. #endif
  163. return;
  164. }
  165. void PM_SetRepeatAB(BYTE iRepeatAB)
  166. {
  167. if (0 == iRepeatAB)
  168. g_PlayModeInfo.iRepeatMode &= ~((BYTE)PM_REPEAT_AB_MASK);
  169. else
  170. g_PlayModeInfo.iRepeatMode |= iRepeatAB;
  171. return;
  172. }
  173. #ifdef D_PM_BOOKDESC //stivenz_1116_2004_Mem_Opt: Remove since it never use.
  174. LPSTR PM_GetBookmarkDescription(WORD uBookmarkNumber)
  175. {
  176. if (uBookmarkNumber >= PM_MAX_BOOKMARKS)
  177. return NULL;
  178. return (g_PlayModeInfo.aBookmarkDescription[uBookmarkNumber]);
  179. }
  180. void PM_SetBookmarkDescription(WORD uBookmarkNumber, LPSTR lpszDescription)
  181. {
  182. if (uBookmarkNumber >= PM_MAX_BOOKMARKS)
  183. return;
  184. g_PlayModeInfo.aBookmarkDescription[uBookmarkNumber]= lpszDescription;
  185. return;
  186. }
  187. #endif //D_PM_BOOKDESC
  188. void PM_InitializeProgramList()
  189. {
  190. WORD wSP_Offset= SC_PROGLIST_ADDR;
  191. DWORD dwDummy= 0;
  192. g_PlayModeInfo.uProgramListSize= 0;
  193. while (wSP_Offset < (SC_PROGLIST_ADDR + SC_PROGLIST_SZ)) {
  194. sc_Write(wSP_Offset++, 1, (Sc_cont *)&dwDummy);
  195. }
  196. #if D_SUPPORT_SACD
  197.    if(DEC_DISC_TYPE_SACD == g_disc_type)
  198.      memset(&(SACD_GLOBALS.ProgramList), 0, sizeof(SACD_GLOBALS.ProgramList));
  199. #endif
  200. return;
  201. }
  202. WORD PM_GetProgramSize()
  203. {
  204. return g_PlayModeInfo.uProgramListSize;
  205. }
  206. void PM_SetProgramListEntry(WORD uEntryNumber, WORD wContents)
  207. {
  208. WORD wSP_Offset= (WORD)(SC_PROGLIST_ADDR + (uEntryNumber/2));
  209. DWORD dwData;
  210. if (g_PlayModeInfo.uProgramListSize < (uEntryNumber+1))
  211. g_PlayModeInfo.uProgramListSize= (uEntryNumber + 1);
  212. sc_Read(wSP_Offset, 1, (Sc_cont *)&dwData);
  213. if (0 == (uEntryNumber % 2)) {
  214. dwData &= 0x0000FFFF;
  215. dwData |= ((DWORD)wContents << 16);
  216. }
  217. else {
  218. dwData &= 0xFFFF0000L;
  219. dwData |= (DWORD)wContents;
  220. }
  221. sc_Write(wSP_Offset, 1, (Sc_cont *)&dwData);
  222. #if D_SUPPORT_SACD
  223.    if(DEC_DISC_TYPE_SACD == g_disc_type)
  224.    {
  225.      SACD_GLOBALS.ProgramList.tracks[(BYTE)uEntryNumber] = (BYTE)wContents;
  226.   SACD_GLOBALS.ProgramList.NumberOfTracks = g_PlayModeInfo.uProgramListSize;
  227.    }
  228. #endif
  229. return;
  230. }
  231. WORD PM_GetProgramListEntry(WORD uEntryNumber)
  232. {
  233. WORD wSP_Offset= (WORD)(SC_PROGLIST_ADDR + (uEntryNumber/2));
  234. DWORD dwData;
  235. if (uEntryNumber > (g_PlayModeInfo.uProgramListSize - 1))
  236. return 0xFFFF;
  237. sc_Read(wSP_Offset, 1, (Sc_cont *)&dwData);
  238. if (0 == (uEntryNumber % 2))
  239. return (WORD)(dwData >> 16);
  240. else
  241. return (WORD)(dwData & 0xFFFF);
  242. }
  243. //<<<Leon.He_1001_2004_a: rewrite the shuffle, rename the old one as random
  244. void PM_RandomProgramList(BOOL bExcludePivot, WORD uPivotEntryNumber)
  245. {
  246. WORD uCurrItem;
  247. WORD uItemsLeft;
  248. WORD wSP_Token;
  249. WORD wSP_Offset;
  250. DWORD dwContents;
  251.    if(0 == g_PlayModeInfo.uProgramListSize)
  252.    {
  253. dbg_printf(("no play items for Shuffling.n"));
  254.     return;
  255.    }
  256.    uItemsLeft= (g_PlayModeInfo.uProgramListSize - 1);
  257. wSP_Token= sc_Malloc(uItemsLeft);
  258. wSP_Offset= wSP_Token;
  259. if (0xFFFF == wSP_Token) {
  260. dbg_printf(("Failed to allocate Scratch-Pad space for Shuffling.n"));
  261. return;
  262. }
  263. if (bExcludePivot) {
  264. dwContents= (DWORD) PM_GetProgramListEntry(uPivotEntryNumber);
  265. // Set the first Entry in the Shuffled result to the contents of the Pivot
  266. sc_Write(wSP_Offset++, 1, (Sc_cont *)&dwContents);
  267. // Fill the Pivot's place in the original Program-List with the last Item,
  268. // unless the Pivot is already the last Item
  269. if (uPivotEntryNumber != uItemsLeft)
  270. PM_SetProgramListEntry(uPivotEntryNumber, PM_GetProgramListEntry(uItemsLeft));
  271. uItemsLeft--;
  272. }
  273. // Start build the random list
  274. while (uItemsLeft) {
  275. // Draw a random Entry-Number in the range: [1 .. uItemsLeft]
  276. uCurrItem= (WORD) (1 + (rand() % uItemsLeft));
  277. // Extract the contents of the randomly-selected Item
  278. dwContents= (DWORD) PM_GetProgramListEntry(uCurrItem);
  279. // Place the randomly-selected Item in the next slot of the result
  280. sc_Write(wSP_Offset++, 1, (Sc_cont *)&dwContents);
  281. // Swap between the last Item on the Program-List and the one just used
  282. if (uCurrItem != uItemsLeft) {
  283. PM_SetProgramListEntry(uCurrItem, PM_GetProgramListEntry(uItemsLeft));
  284. }
  285. uItemsLeft--;
  286. }
  287. // Now copy the result to the Program-List
  288. wSP_Offset= wSP_Token;
  289. for (uCurrItem=1; uCurrItem <= (g_PlayModeInfo.uProgramListSize - 1); uCurrItem++) {
  290. sc_Read(wSP_Offset++, 1, (Sc_cont *)&dwContents);
  291. PM_SetProgramListEntry(uCurrItem, (WORD)dwContents);
  292. }
  293. sc_Free(wSP_Token, (g_PlayModeInfo.uProgramListSize - 1));
  294. #ifdef _DEBUG
  295. // Print the result
  296. dbg_printf(("Random result: "));
  297. for (uCurrItem=1; uCurrItem <= (g_PlayModeInfo.uProgramListSize-1); uCurrItem++) {
  298. dbg_printf(("%d ", PM_GetProgramListEntry(uCurrItem)));
  299. }
  300. dbg_printf(("n"));
  301. #endif //_DEBUG
  302. return;
  303. }
  304. void PM_ShuffleProgramList(BOOL bExcludePivot, WORD uPivotEntryNumber)
  305. {
  306. WORD uListSize,uTempItemNums;
  307. WORD uTempEntry1,uTempEntry2;
  308. WORD uTempidx1,uTempidx2;
  309. WORD i,r_i,s_i;
  310. if(0 == g_PlayModeInfo.uProgramListSize)
  311. {
  312. dbg_printf(("no play items for Shuffling.n"));
  313. return;
  314. }
  315.    //playlist is start from 1, ignore the item 0
  316.    uListSize = (g_PlayModeInfo.uProgramListSize - 1);
  317.   
  318.    //If need exclude the current item, we need exchange it with the item 1
  319.    if(bExcludePivot)
  320.    {
  321.    s_i = 2;//shuffle will start from the item 2
  322.       uTempItemNums = uListSize -1;
  323. uTempEntry1 = PM_GetProgramListEntry(1);
  324. uTempEntry2 = PM_GetProgramListEntry(uPivotEntryNumber);
  325. PM_SetProgramListEntry(1, uTempEntry2);
  326. PM_SetProgramListEntry(uPivotEntryNumber, uTempEntry1);
  327. }
  328.    else
  329.    {
  330.    s_i = 1;
  331.    uTempItemNums = uListSize;
  332.    }
  333.   
  334. for (i=s_i;i<uListSize;i++) 
  335. {
  336. r_i = (BYTE)(rand() % uTempItemNums); // r_i range is 0 .. uListSize-1 
  337. uTempidx1 = i;
  338. uTempidx2 = uTempidx1 + r_i;
  339. uTempEntry1 = PM_GetProgramListEntry(uTempidx1);
  340. uTempEntry2 = PM_GetProgramListEntry(uTempidx2);
  341. PM_SetProgramListEntry(uTempidx1, uTempEntry2);
  342. PM_SetProgramListEntry(uTempidx2, uTempEntry1);
  343. uTempItemNums--;
  344. if(uTempItemNums == 0)
  345. uTempItemNums = uListSize-(i+1);
  346. }
  347. #ifdef _DEBUG
  348. dbg_printf(("Shuffle result: "));
  349. for (i=1; i <= (g_PlayModeInfo.uProgramListSize-1); i++) {
  350. dbg_printf(("%d ", PM_GetProgramListEntry(i)));
  351. }
  352. dbg_printf(("n"));
  353. #endif //_DEBUG
  354. return;
  355. }
  356. //>>>Leon.He_1001_2004_a: rewrite the shuffle, rename the old one as random
  357. BOOL PM_IsLastProgramListEntry(WORD wContents)
  358. {
  359. WORD wSP_Offset= (WORD)(SC_PROGLIST_ADDR + ((g_PlayModeInfo.uProgramListSize - 1)/2));
  360. DWORD dwData;
  361. sc_Read(wSP_Offset, 1, (Sc_cont *)&dwData);
  362. if (0 == ((g_PlayModeInfo.uProgramListSize - 1) % 2))
  363. dwData = (WORD)(dwData >> 16);
  364. else
  365. dwData = (WORD)(dwData & 0xFFFF);
  366. if (wContents == dwData)
  367. return TRUE;
  368. else
  369. return FALSE;
  370. }
  371. // <<< ZRN SH0713:Added this function to merge changes from ZCH
  372. // This function is used to reintialize the program list for program to shuffle
  373. void PM_ReConstructProgramListEntry(void)
  374. {
  375. int iItemNum;
  376. for (iItemNum=1; iItemNum <= (WORD) PE_CD_GetTracksCnt(); iItemNum++) 
  377. {
  378. switch (g_disc_type)
  379. {
  380. case DEC_DISC_TYPE_CDDA:
  381. PM_SetProgramListEntry((WORD)iItemNum, (WORD)iItemNum);
  382. break;
  383. case DEC_DISC_TYPE_VCD:
  384. case DEC_DISC_TYPE_SVCD:
  385. if(iItemNum != PE_CD_GetTracksCnt())
  386. PM_SetProgramListEntry((WORD)iItemNum, (WORD)iItemNum+1);
  387. break;
  388. }
  389. }
  390. }
  391. WORD PM_GetRandomItemFromProgramList(void)
  392. {
  393. WORD uNumOfItems= (g_PlayModeInfo.uProgramListSize - 1);
  394. if(uNumOfItems)
  395. return ((WORD) (1 + (rand() % uNumOfItems)));
  396. else
  397.   return 0;
  398. }
  399. // >>>
  400. /////////////////////////////////////////////////////////////////////////////////////////////////
  401. // Private Services