hdd_play.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:5k
源码类别:

DVD

开发平台:

C/C++

  1. /*=================================================================
  2.   hdd_play.c: Some FileSystem Info Function for HDD
  3.   
  4. 2002-04-28 10:00AM Created  by Verdure
  5. 2002-06-12 08:42AM Modified by cyue
  6.   Copyright(c)2000-2002 by Worldplus Technology (ShenZhen) Co., Ltd.
  7.   ALL RIGHTS RESERVED
  8. =================================================================*/
  9. #include "config.h"
  10. #include "global.h"
  11. #include "ata.h"
  12. #include "atapi_if.h"
  13. #include "hdd_if.h"
  14. #include "hdd_fs.h"
  15. #include "macro.h"
  16. #include "auddrv.h" //2004AUDDRV oliver 20041004 for using audio driver purpose
  17. //#include "audif.h"//20020729
  18. #include "srv2.h"
  19. #ifdef USE_HDD //cyue: only build HDD code when need!!
  20. #include "ninf.h"
  21. PLAY_BLOCK PlayBlock; // Interface for lbaif.c !!
  22. extern char  hd_play;
  23. /*
  24. ========================================================
  25. =   int hd_pump(char *fname)
  26. =      polling function for HDD -streaming play!!
  27. =  ARGUMENT(S):
  28. =      NONE
  29. =                     format
  30. =  RETURN VALUE:
  31. =      0 for no ERR
  32. =  GLOBAL USING:
  33. =      PlayBlock
  34. =  2002-06-12 08:38AM Modified by cyue
  35. =                     play continue LBAs currently 
  36. ========================================================
  37. */
  38. inline int hd_pump()
  39. {
  40. static int lba,bat;
  41. //printf(" PumpLBA=0x%x ",lba);
  42. if(!hd_play) return 0;
  43. if(!stream_full())
  44. {
  45. FILE_LINK_ITEM *pfl;
  46. UINT32 end_lba;
  47. pfl=&(PlayBlock.block[PlayBlock.curr_blk]);
  48. end_lba=pfl->lba+pfl->len; // should -1 for real num!!
  49. // Calc lba
  50. lba=PlayBlock.curr_lba;
  51. if(lba>=end_lba) //block overflow!!
  52. {
  53. pfl=&(PlayBlock.block[++PlayBlock.curr_blk]);
  54. if(PlayBlock.curr_blk>=MAX_FILE_LINK_ITEM) // block over
  55. {
  56. printf(" Block over!! ");
  57. AVD_SetMediaInterrupt();
  58. return 0;
  59. }
  60. else if(!(pfl->lba)) // no next block
  61. {
  62. printf(" No Next Block!! ");
  63. stream_append(0);
  64. //AVD_SetMediaInterrupt();
  65. return 0;
  66. }
  67. else // have next block
  68. {
  69. end_lba=pfl->lba+pfl->len;
  70. lba=PlayBlock.curr_lba=pfl->lba;
  71. printf("!!! Next Block Lba= 0x%lx !!!n",lba);
  72. }
  73. }
  74. // Calc bat
  75. bat=STREAM_MAX_ACCESS>>9;
  76. if(lba+bat>=end_lba)
  77. {
  78. bat=end_lba-lba; // should +1 for real num!!
  79. }
  80. // Now lba,bat is caculated.
  81. //printf("Read %x-%xn",lba,bat);
  82. HDD_ReadSec(stream_putheader(),lba,bat);
  83. stream_append(bat<<9);
  84. PlayBlock.curr_lba=(lba+=bat);
  85. polling();
  86. }
  87. return 1;
  88. }
  89. /*
  90. ========================================================
  91. =   void HDD_Play(char *fname)
  92. =      Play a file in HDD
  93. =  ARGUMENT(S):
  94. =      char   *fname: filename to play, 11 CHAR in 8.3 
  95. =                     format
  96. =  RETURN VALUE:
  97. =      NONE
  98. =  GLOBAL USING:
  99. =      FDB
  100. =  2002-06-12 08:38AM Modified by cyue
  101. =                     play continue LBAs currently 
  102. ========================================================
  103. */
  104. void HDD_Play(char *fname)
  105. {
  106. UINT32 len,i,CurrentClus;
  107. FILE_INFO* pfdb;
  108. hd_play=1; // This will let polling HDD_Pump()!!
  109. if((pfdb=HDD_SearchFile(fname))!=NULL)
  110. {
  111. sup_set_channel(0);
  112. sup_on();
  113. HDD_BuildPlayBlock(pfdb,&PlayBlock);
  114. printf("n=====  Play %s   =====n",fname);
  115. // cyue test 2002/11/2 11:01