hdmi_audio.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578
  1. #include "drv_types.h"
  2. #include <linux/kernel.h> // abs(), max()
  3. #include <asm/mips-boards/drvmem.h>
  4. #include <asm/io.h>
  5. #include "hdmi.h"
  6. #include "hdmi_dbg.h"
  7. #include "hdmi_hw.h"
  8. #include "hdmi_audio.h"
  9. #include "hdmi_cmdq.h"
  10. #include "hdmi_notice.h"
  11. #include "gpioi2c.h"
  12. #include "sysreg.h"
  13. #include "drv_audio_internal.h"
  14. #include "../audio/drv_audio_common.h"
  15. #include "spdif_parser.h"
  16. #ifdef INIT_BY_KMF
  17. #include <drv2kmf.h>
  18. #endif
  19. //In previous software architecture, we only have multiple PCM channel case in media and HDMI.
  20. //In order to reduce memory usage in new architecture, We want to block Multi-pcm case in HDMI driver.
  21. //#define CONFIG_HDMI_Support_MULTI_PCM
  22. void HDMI_Audio_ChannelLocked(void);
  23. typedef enum
  24. {
  25. HDMI_PATH_LINEAR = 0,
  26. HDMI_PATH_PARSE,
  27. HDMI_PATH_BYPASS,
  28. } HDMI_PATH_T;
  29. //use smaller sample nuber to improve AV sync issue
  30. #define LINEAR_SAMPLE_NUMBER 768
  31. #define Linear_Buffer_Number 32
  32. //#define LINEAR_SAMPLE_NUMBER 1536
  33. //#define Linear_Buffer_Number 16
  34. #define PARSE_BUFFER_SIZE 4096
  35. #define BYPASS_SAMPLE_NUMBER 1536
  36. #define NonLinear_ByPass_Buffer_Number 16
  37. #define NonLinear_Parse_Buffer_Number 16
  38. typedef struct _WRITEBUF_DESC
  39. {
  40. union
  41. {
  42. UINT32 dw1;
  43. struct
  44. {
  45. UINT32 Buffer_Valid: 1;
  46. UINT32 Discontinuous: 1;
  47. UINT32 Pause_Exist: 1;
  48. UINT32 Buffer_Full: 1;
  49. UINT32 reserved1: 12;
  50. UINT32 b_size: 16;
  51. };
  52. };
  53. union
  54. {
  55. UINT32 dw2;
  56. struct
  57. {
  58. UINT32 b_dlth: 16;
  59. UINT32 reserved2: 8;
  60. UINT32 b_th: 8;
  61. };
  62. };
  63. union
  64. {
  65. UINT32 dw3;
  66. UINT32 PTS;
  67. };
  68. union
  69. {
  70. UINT32 dw4;
  71. struct
  72. {
  73. UINT32 PTS_high: 1;
  74. UINT32 reserved3: 15;
  75. UINT32 Vbmap: 16;
  76. };
  77. };
  78. union
  79. {
  80. UINT32 dw5;
  81. struct
  82. {
  83. UINT32 reserved4: 4;
  84. UINT32 b1_sadd: 27;
  85. UINT32 reserved5: 1;
  86. };
  87. };
  88. union
  89. {
  90. UINT32 dw6;
  91. struct
  92. {
  93. UINT32 reserved6: 4;
  94. UINT32 b2_sadd: 27;
  95. UINT32 reserved7: 1;
  96. };
  97. };
  98. union
  99. {
  100. UINT32 dw7;
  101. struct
  102. {
  103. UINT32 reserved8: 4;
  104. UINT32 b3_sadd: 27;
  105. UINT32 reserved9: 1;
  106. };
  107. };
  108. union
  109. {
  110. UINT32 dw8;
  111. struct
  112. {
  113. UINT32 reservedA: 4;
  114. UINT32 b4_sadd: 27;
  115. UINT32 reservedB: 1;
  116. };
  117. };
  118. } WRITEBUF_DESC, *WRITEBUF_DESC_PTR;
  119. typedef struct _HDMI_PARSER
  120. {
  121. struct
  122. {
  123. UINT32 audio_type: 1; //LINEAR/NONLINEAR
  124. UINT32 sfreq: 4;
  125. UINT32 osfreq: 4;
  126. UINT32 wordLen: 4;
  127. UINT32 reserved1: 3;
  128. UINT32 chcount: 3;
  129. UINT32 spkplace: 8;
  130. UINT32 downmixinhb: 1;
  131. UINT32 lvshVal: 4;
  132. };
  133. struct
  134. {
  135. UINT32 offset_flag: 1;
  136. UINT32 bDualChannel: 1;
  137. UINT32 TX_path: 3;
  138. UINT32 path: 2;
  139. // see defined values HDMI_PATH_xxxx
  140. UINT32 sp_non_linear_type: 5;
  141. UINT32 codingMode: 3;
  142. // codingMode
  143. // 0:1+1 dual mode, 1:C, 2:L R, 3: L C R,
  144. // 4:L R S, 5:L C R S, 6:L R SL SR, 7:L C R SL SR
  145. // AC3 - The same with codingMode
  146. // MPEG - 0:L R, 1:Joint Stereo, 2:Dual channel, 3:Single channel
  147. UINT32 bSupportNotice: 1;
  148. UINT32 relock_count: 8;
  149. UINT32 reserver2: 8;
  150. //~cdlin
  151. };
  152. INT32 reset516_count;
  153. INT32 audio_stream_type; //AC3 or MPEG
  154. UINT32 audio_offset;
  155. UINT32 NLdelayCnt;
  156. UINT32 sample_number;
  157. UINT32 writeBufNum;
  158. UINT32 bufSize;
  159. UINT8 *writeBuf;
  160. UINT8 *writeBufDsp;
  161. UINT32 wbuf_index;
  162. UINT8 cmdq[32];
  163. UINT32 Freq;
  164. UINT32 pPts;
  165. } HDMI_PARSER, *HDMI_PARSER_PTR;
  166. static HDMI_PARSER g_hp;
  167. static UINT8 Reset_Count = 0;
  168. volatile BOOL bReset = false;
  169. static volatile BOOL audio_active = false;
  170. volatile BOOL chLock_flag = false;
  171. volatile INT32 menu_path = AUDIO_MENU_INTERNAL;
  172. #ifdef CONFIG_HDMI_SUPPORT_MHL
  173. extern BOOL MHL_CABLE_IN;
  174. extern BOOL MHL_CTS;
  175. #endif
  176. static UINT32 getDW(UINT8* ptr)
  177. {
  178. return ((*ptr << 24) | (*(ptr + 1) << 16) | (*(ptr + 2) << 8) | *(ptr + 3));
  179. }
  180. #if 0//CONFIG_HDMI_Support_MULTI_PCM
  181. static UINT8 getSpeakerPlacement(UINT32 spkplace)
  182. {
  183. UINT8 chinvalid[32] =
  184. {
  185. 0xfc, 0xf8, 0xf4, 0xf0, 0xec, 0xe8, 0xe4, 0xe0,
  186. 0xcc, 0xc8, 0xc4, 0xc0, 0x8c, 0x88, 0x84, 0x80,
  187. 0x0c, 0x08, 0x04, 0x00, 0x3c, 0x38, 0x34, 0x30,
  188. 0x2c, 0x28, 0x24, 0x20, 0x0c, 0x08, 0x04, 0x00
  189. };
  190. return chinvalid[spkplace];
  191. }
  192. #endif
  193. static UINT8 getChannelCount(UINT32 spkplace, UINT32 chcount)
  194. {
  195. // chcnt. 0 - 2ch, 1- 5.1ch, 2 - 7.1 ch
  196. UINT8 chcnt_spk[32] =
  197. {
  198. 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
  199. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  200. };
  201. static UINT8 chcnt_chn[8] =
  202. {
  203. 2, 0, 1, 1, 1, 1, 2, 2
  204. };
  205. return (chcnt_spk[spkplace] < chcnt_chn[chcount]) ? chcnt_spk[spkplace] : chcnt_chn[chcount];
  206. }
  207. static UINT32 getFreq(UINT32 idx)
  208. {
  209. UINT32 ofreq_list[16] =
  210. {
  211. 1, 192000, 12000, 176400, 1 , 96000, 8000, 88200,
  212. 16000, 24000, 11025, 22050, 32000, 48000, 1, 44100
  213. };
  214. return ofreq_list[idx];
  215. }
  216. static BOOL verifyFreq(HDMI_PARSER_PTR hp, UINT32 pts_dif2)
  217. {
  218. UINT32 pts_dif1 = (hp->sample_number * 45000) / hp->Freq;
  219. if((hp->sp_non_linear_type)== 21) //EAC3 (Dolby Digital Plus) bypass verfy freq.
  220. return true;
  221. if (abs(pts_dif1 - pts_dif2) > 10)
  222. {
  223. UINT32 rfreq = 0, sfreq = 0, min_dist = 192000, dist = 0;
  224. UINT8 osfreq = 13; //48k
  225. INT32 i = 0;
  226. rfreq = (45000 * hp->sample_number) / pts_dif2;
  227. for (i = 0; i < 16; i++)
  228. {
  229. sfreq = getFreq(i);
  230. dist = (sfreq < rfreq) ? (rfreq - sfreq) : (sfreq - rfreq);
  231. if (dist < min_dist)
  232. {
  233. min_dist = dist;
  234. osfreq = i;
  235. }
  236. }
  237. if (osfreq == hp->osfreq)
  238. {
  239. return true;
  240. }
  241. hp->osfreq = osfreq;
  242. hp->Freq = getFreq(hp->osfreq);
  243. if (hp->Freq == 1)
  244. {
  245. return true;
  246. }
  247. return false;
  248. }
  249. return true;
  250. }
  251. static UINT8 AUDIO_freq(INT32 freq)
  252. {
  253. static INT32 dsp_freq_list[9] =
  254. {24000, 48000, 96000, 192000, 22050, 44100, 88200, 176400, 32000};
  255. UINT8 i = 0;
  256. if (freq == 0)
  257. {
  258. return 15;
  259. }
  260. for (i = 0; i < sizeof(dsp_freq_list) / sizeof(INT32); i++)
  261. {
  262. if (freq == dsp_freq_list[i])
  263. {
  264. return i;
  265. }
  266. }
  267. return 15;
  268. }
  269. #define HDMI_AUDIO_PTS_OFFSET 60 // PCM BUFFER NUMBER = 16, 192KHZ FRAME TIME = 4ms,, modify PTS OFFSET = 60ms ( 60/4 = 15 < 16)
  270. #define HDMI_AUDIO_PTS_OFFSET_NL 100
  271. static void AUDIO_setDelayTime(HDMI_PARSER_PTR hp)
  272. {
  273. if (hp->path == HDMI_PATH_LINEAR || hp->path == HDMI_PATH_BYPASS)
  274. {
  275. #ifdef CONFIG_HDMI_SUPPORT_MHL
  276. if((MHL_CTS == TRUE)&&(MHL_CABLE_IN == TRUE)&&( DrvHDMIPortSelectBitsGet() == CONFIG_HDMI_MHL_PORT))
  277. {
  278. hp->audio_offset = 250 * 90; // 100 ms
  279. }
  280. else
  281. {
  282. hp->audio_offset = HDMI_AUDIO_PTS_OFFSET * 90; // 60 ms
  283. }
  284. #else
  285. hp->audio_offset = HDMI_AUDIO_PTS_OFFSET * 90; // 60 ms
  286. #endif
  287. hp->NLdelayCnt = 0;
  288. }
  289. else // hp->path == HDMI_PATH_PARSE
  290. {
  291. if (hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR ||
  292. hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_LINEAR ||hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT_PCM)
  293. {
  294. hp->audio_offset = HDMI_AUDIO_PTS_OFFSET_NL * 90; // 100 ms
  295. hp->NLdelayCnt = ((30 * hp->Freq) / 1000) >> 5;
  296. }
  297. else
  298. {
  299. hp->audio_offset = HDMI_AUDIO_PTS_OFFSET_NL * 90;// 100 ms
  300. hp->NLdelayCnt = 0;
  301. }
  302. }
  303. }
  304. static void AUDIO_ResetLock(void)
  305. {
  306. HDMI_PARSER_PTR hp = &g_hp;
  307. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 0);
  308. HDMI_Interrupt_Disable(INTR_Buffer_Change_Pulse);
  309. while (HDMI_RegisterRead(HDMIRX_Buffer_chg_cnt))
  310. {
  311. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Buffer_Change_Pulse); //clear
  312. }
  313. memset(hp, 0, sizeof(HDMI_PARSER));
  314. HDMI_AudioResetDecoder();
  315. chLock_flag = false;
  316. HDMI_Audio_ChannelLocked();
  317. HDMI_Interrupt_Enable(INTR_Buffer_Change_Pulse);
  318. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 1);
  319. }
  320. void DRV_HDMI_AudioEnable(void)
  321. {
  322. TVFE_Audio_Mute_t MC;
  323. hdmidbg("%s\n", __FUNCTION__);
  324. #define PRECHARGE_MODE 1
  325. #define BURST_MODE 0 // Default 0:128, 1:256, 2:512
  326. chLock_flag = false;
  327. if (audio_active)
  328. {
  329. hdmidbg("\tdone\n");
  330. return;
  331. }
  332. if (HDMI_RegisterRead(HDMIRX_R_HDMI_en) == 0)
  333. {
  334. hdmidbg("\tCan't enable audio in dvi\n");
  335. return;
  336. }
  337. if (HDMI_RegisterRead(HDMIRX_AS_exist))
  338. {
  339. hdmidbg("\tNoraml Audio!\n");
  340. HDMI_RegisterWrite(HDMIRX_R_HBRAS_sel, 0);
  341. }
  342. else
  343. {
  344. if (HDMI_RegisterRead(HDMIRX_HBRAS_exist))
  345. {
  346. hdmidbg("\tHBRAS Audio!\n");
  347. HDMI_RegisterWrite(HDMIRX_R_HBRAS_sel, 1);
  348. }
  349. else
  350. {
  351. hdmidbg("\tNoraml Audio!\n");
  352. HDMI_RegisterWrite(HDMIRX_R_HBRAS_sel, 0);
  353. }
  354. }
  355. sysset_hdmi_stcclk();
  356. HDMI_RegisterWrite(HDMIRX_R_parsing_en, 0);
  357. HDMI_RegisterWrite(HDMIRX_R_unlock_th, 0x2);
  358. HDMI_RegisterWrite(HDMIRX_R_layout_detect, 1);
  359. HDMI_RegisterWrite(HDMIRX_R_layout_th, 0);
  360. HDMI_RegisterWrite(HDMIRX_R_mem_ap_en, PRECHARGE_MODE);
  361. HDMI_RegisterWrite(HDMIRX_R_as_mem_mode, BURST_MODE);
  362. HDMI_Interrupt_Enable(INTR_Channel_Status_Lock_Pulse);
  363. HDMI_RegisterWrite(HDMIRX_R_audio_enable, 1);
  364. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 0);
  365. HDMI_Interrupt_Disable(INTR_Buffer_Change_Pulse);
  366. audio_active = true;
  367. //ADD MUTE PROTECT TO AVOID UNSMOOTH AUDIO OUTPUT
  368. MC.Enable = 0;
  369. MC.Mute_Delay= 0;
  370. MC.Mute_TXSpeed= 0;
  371. MC.Mute_Path = TVFE_AUDIO_MUTE_DRV_ALL_PATH;
  372. DRV_AUDIO_DC_SetMute(&MC);
  373. //~MUTE PROTECT
  374. }
  375. void DRV_HDMI_AudioDisable(void)
  376. {
  377. TVFE_Audio_Mute_t MC;
  378. hdmidbg("%s\n", __FUNCTION__);
  379. chLock_flag = false;
  380. if (!audio_active)
  381. {
  382. hdmidbg("\tdone\n");
  383. return;
  384. }
  385. //ADD MUTE PROTECT TO AVOID UNSMOOTH AUDIO OUTPUT
  386. MC.Enable = 1;
  387. MC.Mute_Delay= 0;
  388. MC.Mute_TXSpeed= 0;
  389. MC.Mute_Path = TVFE_AUDIO_MUTE_DRV_ALL_PATH;
  390. DRV_AUDIO_DC_SetMute(&MC);
  391. //~MUTE PROTECT
  392. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 0);
  393. HDMI_Interrupt_Disable(INTR_Buffer_Change_Pulse | INTR_Channel_Status_Lock_Pulse | INTR_audio_sample_coming | INTR_HBR_audio_sample_coming | INTR_ACP_packets);
  394. HDMI_RegisterWrite(HDMIRX_R_audio_enable, 0);
  395. audio_active = false;
  396. memset(&g_hp, 0, sizeof(HDMI_PARSER));
  397. }
  398. void DRV_HDMI_AudioSetOutputPath(UINT8 menu_select)
  399. {
  400. BOOL bAudioEnable;
  401. bAudioEnable = HDMI_RegisterRead(HDMIRX_R_audio_enable) ? TRUE : FALSE;
  402. if (bAudioEnable)
  403. {
  404. DRV_HDMI_AudioDisable();
  405. }
  406. menu_path = menu_select;
  407. if (bAudioEnable)
  408. {
  409. DRV_HDMI_AudioEnable();
  410. }
  411. }
  412. void DRV_HDMI_AudioRestart(void)
  413. {
  414. hdmidbg("%s\n", __FUNCTION__);
  415. if (HDMI_RegisterRead(HDMIRX_R_audio_enable))
  416. {
  417. DRV_HDMI_AudioDisable();
  418. DRV_HDMI_AudioEnable();
  419. }
  420. else
  421. {
  422. if (HDMI_RegisterRead(HDMIRX_R_HDMI_en) == 1)
  423. {
  424. hdmidbg("%s:input signal changed form dvi to hdmi!\n", __FUNCTION__);
  425. DRV_HDMI_AudioDisable();
  426. DRV_HDMI_AudioEnable();
  427. }
  428. else
  429. {
  430. hdmidbg("%s:Skipped! Audio is not enable!\n", __FUNCTION__);
  431. }
  432. }
  433. }
  434. void HDMI_Audio_ChannelLocked(void)
  435. {
  436. HDMI_PARSER_PTR hp = &g_hp;
  437. pAUDIO_CMDQ cmdq = (pAUDIO_CMDQ)(hp->cmdq);
  438. UINT8 audio_type = (HDMI_RegisterRead(HDMIRX_R_ACS_CSts) & 0x2) >> 1;
  439. UINT8 chcount = HDMI_RegisterRead(HDMIRX_R_Ado_CC) & 0x7;
  440. UINT8 spkplace = HDMI_RegisterRead(HDMIRX_R_Ado_CA) & 0x1f;
  441. UINT8 downmixinhb = HDMI_RegisterRead(HDMIRX_R_Ado_DMInh);
  442. UINT8 lvshVal = HDMI_RegisterRead(HDMIRX_R_Ado_LSV);
  443. UINT8 osfreq = ~(HDMI_RegisterRead(HDMIRX_R_ACS_Sfeq)) & 0xf;
  444. UINT8 sp_non_linear_type = HDMI_RegisterRead(HDMIRX_R_sp_non_linear_type);
  445. UINT32 i = 0;
  446. if (menu_path == AUDIO_MENU_MUTE)
  447. {
  448. hp->TX_path = menu_path;
  449. return;
  450. }
  451. if (chLock_flag)
  452. {
  453. if (hp->osfreq != osfreq || hp->audio_type != audio_type || hp->chcount != chcount || hp->spkplace != spkplace)
  454. {
  455. hdmidbg("channel status is changed\n");
  456. HDMI_Audio_ChannelUnlocked();
  457. }
  458. else
  459. {
  460. if(hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT)
  461. {
  462. //PHILIPS DVD player updated audio buffer before ch lock function when switch play DD&DDP file at ARC case
  463. //but buffer update fucntion verfies PTS to change sfreq(48k<->192k), ch lock function will show channel status no changed
  464. //add check sp_non_linear_type to do error handle.
  465. if(hp->sp_non_linear_type != sp_non_linear_type)
  466. {
  467. hdmidbg("channel status is changed, ori_type=%d, hw_type=%d\n", hp->sp_non_linear_type, sp_non_linear_type);
  468. HDMI_Audio_ChannelUnlocked();
  469. }
  470. }
  471. else
  472. {
  473. hdmidbg("channel status no changed, return\n");
  474. return;
  475. }
  476. }
  477. }
  478. HDMI_RegisterWrite(HDMIRX_R_disc_tout, 0x48000); // 24576000x12ms
  479. HDMI_RegisterWrite(HDMIRX_R_as_w_timeout, 0x0);
  480. // Reset Audio Decoder
  481. bReset = true;
  482. // hp initialization
  483. hp->offset_flag = false;
  484. hp->reset516_count = 0;
  485. hp->relock_count = 0;
  486. hp->bDualChannel = false;
  487. hp->codingMode = 7; //AC3 5.1ch
  488. hp->bSupportNotice = false;
  489. hp->TX_path = menu_path; //Menu decide the TX path.
  490. hp->wbuf_index = 0; // Write buffer Index pointer
  491. hp->audio_type = audio_type;
  492. hp->wordLen = HDMI_RegisterRead(HDMIRX_R_ACS_Wlen);
  493. // hp->osfreq = HDMI_RegisterRead(HDMIRX_R_ACS_OSFeq);
  494. // hp->sfreq = HDMI_RegisterRead(HDMIRX_R_ACS_Sfeq);
  495. hp->osfreq = osfreq;
  496. hp->chcount = chcount;
  497. hp->spkplace = spkplace;
  498. hp->downmixinhb = downmixinhb;
  499. hp->lvshVal = lvshVal;
  500. // hp->sp_non_linear_type = HDMI_RegisterRead(HDMIRX_R_sp_non_linear_type);
  501. hp->sp_non_linear_type = 1; //Default AC3 Format
  502. hp->pPts = 0;
  503. hp->Freq = getFreq(hp->osfreq);
  504. hdmidbg("%s: %s audio %dK\n", __FUNCTION__,
  505. audio_type ? "nonlinear" : "linear",
  506. hp->Freq / 1000);
  507. /* Initialize audio command queue */
  508. cmdq->CID = AUDIO_CID;
  509. cmdq->RxType = AUDIO_RX_TYPE_HDMI;
  510. cmdq->sfreq = AUDIO_freq(hp->Freq);
  511. cmdq->ZeroStuffLen = 0;
  512. if (hp->audio_type) // nonlinear
  513. {
  514. hp->lvshVal = 0; //we should not take these two variables in account in NonLinear path.
  515. hp->downmixinhb = 0; // Set to 0.
  516. if (hp->TX_path == AUDIO_MENU_INTERNAL || hp->TX_path == AUDIO_MENU_EXTERNAL)
  517. {
  518. hp->path = HDMI_PATH_PARSE;
  519. cmdq->TxType = AUDIO_TX_TYPE_ONLY_I2S;
  520. }
  521. else if (hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT)
  522. {
  523. hp->path = HDMI_PATH_BYPASS;
  524. cmdq->TxType = AUDIO_TX_TYPE_ONLY_SPDIF;
  525. }
  526. else if (hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR)
  527. {
  528. hp->path = HDMI_PATH_PARSE;
  529. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_NONLINEAR;
  530. }
  531. else if (hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_LINEAR ||hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT_PCM)
  532. {
  533. hp->path = HDMI_PATH_PARSE;
  534. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_LINEAR;
  535. }
  536. }
  537. else //linear
  538. {
  539. hp->path = HDMI_PATH_LINEAR;
  540. if (hp->TX_path == AUDIO_MENU_INTERNAL || hp->TX_path == AUDIO_MENU_EXTERNAL)
  541. {
  542. cmdq->TxType = AUDIO_TX_TYPE_ONLY_I2S;
  543. }
  544. else if (hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT)
  545. {
  546. cmdq->TxType = AUDIO_TX_TYPE_ONLY_SPDIF;
  547. }
  548. else if (hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR ||
  549. hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_LINEAR ||hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT_PCM)
  550. {
  551. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_LINEAR;
  552. }
  553. }
  554. if (hp->path == HDMI_PATH_LINEAR) //linear
  555. {
  556. hdmidbg("<LINEAR>\n");
  557. HDMI_RegisterWrite(HDMIRX_R_parsing_en, 0);
  558. #if 0//CONFIG_HDMI_Support_MULTI_PCM
  559. HDMI_RegisterWrite(HDMIRX_R_rx_ch_set, 0x2);
  560. #else
  561. /* Patch: Only stereo pcm input is allowed. */
  562. HDMI_RegisterWrite(HDMIRX_R_rx_ch_set, 0x0);
  563. #endif
  564. /* Setup write buffer number */
  565. HDMI_RegisterWrite(HDMIRX_R_wbuf_num, Linear_Buffer_Number - 1);
  566. hp->bufSize = LINEAR_SAMPLE_NUMBER << 3; //Buffer size (1 group) for linear audio data.
  567. hp->writeBufNum = Linear_Buffer_Number;
  568. /* Note: Four write buffer group should be in different blank. Blank size is 64 bytes */
  569. hp->writeBufDsp = (UINT8*)AUDIO_RX_HDMI_DESP_BUFF_ADDR;
  570. hp->writeBuf = (UINT8*)AUDIO_PCM_BUFF_ADDR;
  571. /* Setup write buffer descriptor for hdmi audio rx */
  572. HDMI_RegisterWrite(HDMIRX_R_dma_start_addr, ((UINT32)hp->writeBufDsp & 0x1fffffff) >> 4);
  573. for (i = 0; i < hp->writeBufNum; i++)
  574. {
  575. WRITEBUF_DESC_PTR wbufdsc_ptr = (WRITEBUF_DESC_PTR)(hp->writeBufDsp + i * sizeof(WRITEBUF_DESC));
  576. wbufdsc_ptr->Buffer_Valid = 0;
  577. wbufdsc_ptr->b_size = hp->bufSize >> 4;
  578. wbufdsc_ptr->dw5 = 0;
  579. wbufdsc_ptr->dw6 = 0;
  580. wbufdsc_ptr->dw7 = 0;
  581. wbufdsc_ptr->dw8 = 0;
  582. wbufdsc_ptr->b1_sadd = (((UINT32)(hp->writeBuf + i * (hp->bufSize))) & 0x1fffffff) >> 4;
  583. wbufdsc_ptr->b1_sadd = GET_ADDR_FOR_HW(wbufdsc_ptr->b1_sadd);
  584. #if 0//CONFIG_HDMI_Support_MULTI_PCM
  585. wbufdsc_ptr->b2_sadd = (((UINT32)(hp->writeBuf + i * (hp->bufSize) + 1 * (hp->writeBufNum * hp->bufSize) + 64 * 1)) & 0x1fffffff) >> 4;
  586. wbufdsc_ptr->b2_sadd = GET_ADDR_FOR_HW(wbufdsc_ptr->b2_sadd);
  587. wbufdsc_ptr->b3_sadd = (((UINT32)(hp->writeBuf + i * (hp->bufSize) + 2 * (hp->writeBufNum * hp->bufSize) + 64 * 2)) & 0x1fffffff) >> 4;
  588. wbufdsc_ptr->b3_sadd = GET_ADDR_FOR_HW(wbufdsc_ptr->b3_sadd);
  589. wbufdsc_ptr->b4_sadd = (((UINT32)(hp->writeBuf + i * (hp->bufSize) + 3 * (hp->writeBufNum * hp->bufSize) + 64 * 3)) & 0x1fffffff) >> 4;
  590. wbufdsc_ptr->b4_sadd = GET_ADDR_FOR_HW(wbufdsc_ptr->b4_sadd);
  591. #endif
  592. }
  593. #if 0//CONFIG_HDMI_Support_MULTI_PCM
  594. memset((UINT8*)((((WRITEBUF_DESC_PTR) hp->writeBufDsp)->b2_sadd << 4) | 0xa0000000), 0, hp->bufSize * hp->writeBufNum);
  595. memset((UINT8*)((((WRITEBUF_DESC_PTR) hp->writeBufDsp)->b3_sadd << 4) | 0xa0000000), 0, hp->bufSize * hp->writeBufNum);
  596. #endif
  597. cmdq->flag = AUDIO_FLAG_PCM_OUT;
  598. cmdq->inDataType = AUDIO_DATA_TYPE_PCM;
  599. cmdq->outDataType = AUDIO_DATA_TYPE_PCM;
  600. cmdq->FrameNo = hp->writeBufNum;// write buffer size
  601. hp->audio_stream_type = cmdq->inDataType;
  602. hp->sample_number = LINEAR_SAMPLE_NUMBER;
  603. #if 0//CONFIG_HDMI_Support_MULTI_PCM
  604. cmdq->spkplace = getSpeakerPlacement(spkplace);
  605. cmdq->chcnt = getChannelCount(spkplace, chcount);
  606. #else
  607. /* Patch: Only stereo audio is allowed now */
  608. cmdq->spkplace = 0xfc;
  609. cmdq->chcnt = 0;
  610. #endif
  611. cmdq->sp_non_linear_type = 0;
  612. cmdq->sample_bit = hp->wordLen;
  613. }
  614. else if (hp->path == HDMI_PATH_PARSE) // parse mode
  615. {
  616. hdmidbg("<PARSE>\n");
  617. HDMI_RegisterWrite(HDMIRX_R_parsing_en, 1);
  618. HDMI_RegisterWrite(HDMIRX_R_rx_ch_set, 0); // one group in one write buffer
  619. HDMI_RegisterWrite(HDMIRX_R_wbuf_num, NonLinear_Parse_Buffer_Number - 1);
  620. /* Swap high low bytes in parse mode */
  621. HDMI_RegisterWrite(HDMIRX_R_byte_swap, 0x01);
  622. hp->bufSize = PARSE_BUFFER_SIZE;
  623. hp->writeBufNum = NonLinear_Parse_Buffer_Number;
  624. hp->writeBufDsp = (UINT8*)AUDIO_RX_HDMI_DESP_BUFF_ADDR;
  625. hp->writeBuf = (UINT8*)AUDIO_CMD_BUFF_ADDR;
  626. /* Setup write buffer descriptor for hdmi audio rx */
  627. HDMI_RegisterWrite(HDMIRX_R_dma_start_addr, ((UINT32)hp->writeBufDsp & 0x1fffffff) >> 4);
  628. for (i = 0; i < hp->writeBufNum; i++)
  629. {
  630. WRITEBUF_DESC_PTR wbufdsc_ptr = (WRITEBUF_DESC_PTR)(hp->writeBufDsp + i * sizeof(WRITEBUF_DESC));
  631. wbufdsc_ptr->Buffer_Valid = 0;
  632. wbufdsc_ptr->b_size = hp->bufSize >> 4;
  633. wbufdsc_ptr->b_th = 1; //NonLinear, 1 frame in one write buffer
  634. wbufdsc_ptr->dw5 = 0;
  635. wbufdsc_ptr->b1_sadd = (((UINT32)(hp->writeBuf + i * (hp->bufSize))) & 0x1fffffff) >> 4;
  636. wbufdsc_ptr->b1_sadd = GET_ADDR_FOR_HW(wbufdsc_ptr->b1_sadd);
  637. }
  638. cmdq->flag = AUDIO_FLAG_DECODING;
  639. hp->audio_stream_type = cmdq->inDataType = AUDIO_DATA_TYPE_AC3;
  640. hp->sample_number = 1536;
  641. cmdq->outDataType = AUDIO_DATA_TYPE_PCM;
  642. cmdq->FrameNo = 1; //One frame in buffer will be decoded.
  643. cmdq->spkplace = 0;
  644. cmdq->chcnt = 0;
  645. cmdq->sp_non_linear_type = 0;
  646. cmdq->sample_bit = 0;
  647. }
  648. else if (hp->path == HDMI_PATH_BYPASS)
  649. {
  650. hdmidbg("<BYPASS>\n");
  651. HDMI_RegisterWrite(HDMIRX_R_parsing_en, 0);
  652. HDMI_RegisterWrite(HDMIRX_R_rx_ch_set, 0); // one group in one write buffer
  653. HDMI_RegisterWrite(HDMIRX_R_wbuf_num, NonLinear_ByPass_Buffer_Number - 1); //ByPass mode, 32 write buffer now
  654. hp->bufSize = BYPASS_SAMPLE_NUMBER * 8;
  655. hp->writeBufNum = NonLinear_ByPass_Buffer_Number;
  656. hp->writeBufDsp = (UINT8*)AUDIO_RX_HDMI_DESP_BUFF_ADDR;
  657. hp->writeBuf = (UINT8*)AUDIO_PCM_BUFF_ADDR;
  658. /* Setup write buffer descriptor for hdmi audio rx */
  659. HDMI_RegisterWrite(HDMIRX_R_dma_start_addr, ((UINT32)hp->writeBufDsp & 0x1fffffff) >> 4);
  660. for (i = 0; i < hp->writeBufNum; i++)
  661. {
  662. WRITEBUF_DESC_PTR wbufdsc_ptr = (WRITEBUF_DESC_PTR)(hp->writeBufDsp + i * sizeof(WRITEBUF_DESC));
  663. wbufdsc_ptr->Buffer_Valid = 0;
  664. wbufdsc_ptr->b_size = hp->bufSize >> 4;
  665. wbufdsc_ptr->b_th = 1; //NonLinear, 1 frame in one write buffer
  666. wbufdsc_ptr->dw5 = 0;
  667. wbufdsc_ptr->b1_sadd = (((UINT32)(hp->writeBuf + i * (hp->bufSize))) & 0x1fffffff) >> 4;
  668. wbufdsc_ptr->b1_sadd = GET_ADDR_FOR_HW(wbufdsc_ptr->b1_sadd);
  669. }
  670. cmdq->flag = AUDIO_FLAG_BYPASS;
  671. hp->audio_stream_type = 0;
  672. cmdq->inDataType = cmdq->outDataType = AUDIO_DATA_TYPE_AC3;
  673. //hp->audio_stream_type = cmdq->inDataType = cmdq->outDataType = AUDIO_DATA_TYPE_AC3;
  674. hp->sample_number = BYPASS_SAMPLE_NUMBER;
  675. cmdq->FrameNo = 1;
  676. cmdq->spkplace = 0;
  677. cmdq->chcnt = 0;
  678. //cmdq->sp_non_linear_type=hp->sp_non_linear_type;
  679. cmdq->sample_bit = 0;
  680. }
  681. /* HDMI Source SPDIF OUT fix at SPDIF_WORD_LENGTH_16_BITS */
  682. //cmdq->sample_bit = 0x2;// SPDIF_WORD_LENGTH_16_BITS = 0x2,
  683. hdmidbg(" writeBufDsp 0x%p\n", hp->writeBufDsp);
  684. hdmidbg(" writeBuf 0x%p\n", hp->writeBuf);
  685. AUDIO_setDelayTime(hp);
  686. chLock_flag = true;
  687. HDMI_Interrupt_Enable(INTR_Buffer_Change_Pulse);
  688. //HDMI_Interrupt_Enable(INTR_ACP_packets);
  689. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 1);
  690. }
  691. void HDMI_Audio_ChannelUnlocked(void)
  692. {
  693. HDMI_PARSER_PTR hp = &g_hp;
  694. HDMI_RegisterWrite(HDMIRX_R_dma_w_enable, 0);
  695. HDMI_Interrupt_Disable(INTR_Buffer_Change_Pulse);
  696. while (HDMI_RegisterRead(HDMIRX_Buffer_chg_cnt))
  697. {
  698. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Buffer_Change_Pulse); //clear
  699. }
  700. // set_current_state(TASK_UNINTERRUPTIBLE);
  701. // schedule_timeout(1);
  702. memset(hp, 0, sizeof(HDMI_PARSER));
  703. HDMI_AudioResetDecoder();
  704. chLock_flag = false;
  705. }
  706. static UINT32 ddp_get_freq(unsigned char *ptr)
  707. {
  708. UINT32 sfreq = 0;
  709. if (ptr[0] == 0x0b && ptr[1] == 0x77)
  710. {
  711. UINT32 fscod_tbl[4] = {48000, 44100, 32000, 0};
  712. UINT32 fscod2_tbl[4] = {24000, 22050, 16000, 0};
  713. /* check fscod */
  714. if ((ptr[4] >> 6) != 0x3)
  715. {
  716. sfreq = fscod_tbl[ptr[4] >> 6];
  717. }
  718. else
  719. {
  720. /* fscod2_numblkscod */
  721. sfreq = fscod2_tbl[(ptr[4] >> 4) & 0x3];
  722. }
  723. }
  724. return sfreq;
  725. }
  726. static UINT32 ddp_get_framesize(UINT8 *ptr)
  727. {
  728. UINT32 fsz = 0;
  729. if (ptr[0] == 0x0b && ptr[1] == 0x77)
  730. {
  731. UINT32 frmsize_tlb[3][38] =
  732. {
  733. {64, 64, 80, 80, 96, 96, 112, 112, 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384, 384, 448, 448, 512, 512, 640, 640, 768, 768, 896, 896, 1024, 1024, 1152, 1152, 1280, 1280},
  734. {69, 70, 87, 88, 104, 105, 121, 122, 139, 140, 174, 175, 208, 209, 243, 244, 278, 279, 348, 349, 417, 418, 487, 488, 557, 558, 696, 697, 835, 836, 975, 976, 1114, 1115, 1253, 1254, 1393, 1394},
  735. {96, 96, 120, 120, 144, 144, 168, 168, 192, 192, 240, 240, 288, 288, 336, 336, 384, 384, 480, 480, 576, 576, 672, 672, 768, 768, 960, 960, 1152, 1152, 1344, 1344, 1536, 1536, 1728, 1728, 1920, 1920}
  736. };
  737. UINT8 bsid = ptr[5] >> 3;
  738. if (bsid <= 8)
  739. {
  740. /* frmsizecod < 38 && fscod < 3 */
  741. if ( /*(ptr[4] & 0x1f) < 38 && */ (ptr[4] >> 6) < 3) // (ptr[4] & 0x1f) < 38 is always TRUE
  742. {
  743. /* dd size = 2 * frmsize_tlb[fscod][frmsizecod] */
  744. fsz = 2 * frmsize_tlb[ptr[4] >> 6][ptr[4] & 0x1f];
  745. }
  746. }
  747. else if (bsid >= 11 && bsid <= 16)
  748. {
  749. /* ddp size = 2 * (ec3_frmsize + 1) */
  750. fsz = 2 * ((((ptr[2] & 0x7) << 8) | ptr[3]) + 1);
  751. }
  752. }
  753. return fsz;
  754. }
  755. static BOOL ddp_substrm_frame(UINT8 *ptr)
  756. {
  757. if (ptr[0] == 0x0b && ptr[1] == 0x77)
  758. {
  759. return (ptr[2] & 0xf8);
  760. }
  761. return FALSE;
  762. }
  763. #define ALIGN4(sz) ((sz+3) & (~0x3))
  764. void ddp_receive_frames(void *dev,
  765. UINT8 *ddp, UINT32 ddpsz, UINT32 pts)
  766. {
  767. HDMI_PARSER_PTR hp = (HDMI_PARSER_PTR)dev;
  768. AUDIO_CMDQ gcmdq, *cmdq = &gcmdq;
  769. BOOL validFrame = FALSE;
  770. UINT32 frmsz = 0, freq = 0;
  771. UINT32 parsed_sz = 0;
  772. UINT8 *ptr = NULL;
  773. UINT8 ACP_type = 0xff;
  774. if (ddp == NULL || ddpsz < 24)
  775. {
  776. hdmidbg("%s: Invalid IEC61937 buffer\n", __FUNCTION__);
  777. return;
  778. }
  779. memcpy(cmdq, &hp->cmdq, sizeof(AUDIO_CMDQ));
  780. //hdmidbg("%s: ddp 0x%p ddpsz %d pts 0x%08x\n", __FUNCTION__, ddp, ddpsz, pts);
  781. /* Parse and validate whole IEC61937 payload */
  782. parsed_sz = 8;
  783. ptr = ddp + parsed_sz;
  784. for (; parsed_sz < ddpsz; ptr += ALIGN4(frmsz))
  785. {
  786. frmsz = ddp_get_framesize(ptr);
  787. freq = ddp_get_freq(ptr);
  788. validFrame = (frmsz && freq) ? TRUE : FALSE;
  789. if (validFrame == FALSE)
  790. {
  791. break;
  792. }
  793. /* Patch: Audio Decoder only accept 4 byte aligned pointer,
  794. adjust the buffer to meet the requirement. */
  795. parsed_sz += frmsz;
  796. if ((ALIGN4(frmsz) != frmsz) && ptr + frmsz < ddp + ddpsz)
  797. {
  798. memmove(ptr + ALIGN4(frmsz), ptr + frmsz, ddpsz - parsed_sz);
  799. }
  800. }
  801. cmdq->flag = AUDIO_FLAG_DECODING;
  802. cmdq->pause = 0;
  803. cmdq->discontinue = 0;
  804. cmdq->chcnt = 0;
  805. cmdq->sfreq = AUDIO_freq(freq);
  806. cmdq->inDataType = AUDIO_DATA_TYPE_EAC3;
  807. cmdq->outDataType = AUDIO_DATA_TYPE_PCM;
  808. cmdq->DataPtr = (UINT32)ddp;
  809. cmdq->DataSize = hp->sample_number;
  810. cmdq->PTS_High = pts >> 31;
  811. cmdq->PTS = pts << 1;
  812. cmdq->spdif_channel_status_category_code = HDMI_RegisterRead(HDMIRX_R_ACS_CatC);
  813. cmdq->copy_protection = (HDMI_RegisterRead(HDMIRX_R_ACS_CSts) & 0x04) >> 2;
  814. //HC Modify
  815. ACP_type = HDMI_RegisterRead(HDMIRX_R_ACP_Type);
  816. if((ACP_type == ACP_GENERIC_AUDIO) || (ACP_type == ACP_IEC60958_IDENTIFIED))
  817. {
  818. cmdq->copy_protection = 0; // ACP TYPE = 0 1, CP bit = 0, L bit =1
  819. cmdq->spdif_channel_status_category_code = cmdq->spdif_channel_status_category_code | 0x80;
  820. }
  821. //~HC
  822. switch (hp->TX_path)
  823. {
  824. case AUDIO_MENU_INTERNAL:
  825. case AUDIO_MENU_EXTERNAL:
  826. cmdq->TxType = AUDIO_TX_TYPE_ONLY_I2S;
  827. break;
  828. case AUDIO_MENU_PARALLEL_SPDIF_LINEAR:
  829. case AUDIO_MENU_SPDIF_OUTPUT_PCM:
  830. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_LINEAR;
  831. break;
  832. case AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR:
  833. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_NONLINEAR;
  834. break;
  835. default:
  836. break;
  837. }
  838. if (HDMI_RegisterRead(HDMIRX_R_AV_Mute))
  839. {
  840. validFrame = FALSE;
  841. }
  842. if (validFrame)
  843. {
  844. if (bReset)
  845. {
  846. bReset = HDMI_AudioResetDecoder() ? FALSE : TRUE;
  847. }
  848. if (!bReset)
  849. {
  850. if (!hp->offset_flag)
  851. {
  852. hp->Freq = freq;
  853. AUDIO_setDelayTime(hp);
  854. hp->offset_flag = HDMI_AudioSetOffset(hp->audio_offset, hp->NLdelayCnt);
  855. }
  856. if (hp->offset_flag)
  857. {
  858. parsed_sz = 8;
  859. ptr = ddp + parsed_sz;
  860. for (; parsed_sz < ddpsz;
  861. parsed_sz += frmsz, ptr += ALIGN4(frmsz), cmdq->DataPtr += ALIGN4(frmsz))
  862. {
  863. frmsz = ddp_get_framesize(ptr);
  864. if (frmsz == 0)
  865. {
  866. break;
  867. }
  868. /* skip substream frame */
  869. if (ddp_substrm_frame(ptr))
  870. {
  871. continue;
  872. }
  873. /* Fire frame */
  874. HDMI_AudioSendCmdq(cmdq);
  875. }
  876. }
  877. }
  878. }
  879. else
  880. {
  881. bReset = TRUE;
  882. hp->offset_flag = FALSE;
  883. }
  884. }
  885. typedef enum
  886. {
  887. E_SPDIF_TYPE_UNKNOWN = 0,
  888. E_SPDIF_TYPE_DD,
  889. E_SPDIF_TYPE_DDP,
  890. E_SPDIF_TYPE_OTHERS,
  891. } E_SPDIF_TYPE;
  892. static E_SPDIF_TYPE check_spdif_type(UINT8 *inbuf, UINT32 inbufsz)
  893. {
  894. UINT32 i;
  895. UINT32 *in = (UINT32*)inbuf;
  896. for (i = 0; i < inbufsz / 4 - 1; i += 2)
  897. {
  898. if ((in[i] >> 16) == 0xf872 && (in[i + 1] >> 16) == 0x4e1f)
  899. {
  900. UINT8 t = (in[i + 2] >> 16) & 0x1f;
  901. if (t == 1)
  902. {
  903. return E_SPDIF_TYPE_DD;
  904. }
  905. else if (t == 21)
  906. {
  907. return E_SPDIF_TYPE_DDP;
  908. }
  909. else
  910. {
  911. return E_SPDIF_TYPE_OTHERS;
  912. }
  913. }
  914. }
  915. return E_SPDIF_TYPE_UNKNOWN;
  916. }
  917. void HDMI_Audio_BufferUpdated(void)
  918. {
  919. HDMI_PARSER_PTR hp = &g_hp;
  920. pAUDIO_CMDQ cmdq;
  921. WRITEBUF_DESC_PTR wbufdsc;
  922. UINT32 cur_wbuf;
  923. BOOL validData = false;
  924. UINT8 audio_type = (HDMI_RegisterRead(HDMIRX_R_ACS_CSts) & 0x2) >> 1;
  925. UINT32 pts_diff;
  926. static UINT8 ACP_type_pre = 0xFF;
  927. UINT8 ACP_type = 0;
  928. AUDIO_IEC61937_HEADER sp_header;
  929. UINT8* dataptr;
  930. HDMI_RegisterWrite(HDMIRX_R_INTR_Status, INTR_Buffer_Change_Pulse); //clear
  931. if (!audio_active)
  932. {
  933. hdmidbg("%s:hdmi aud is not enable\n", __FUNCTION__);
  934. return;
  935. }
  936. cmdq = (pAUDIO_CMDQ)(&hp->cmdq);
  937. wbufdsc = (WRITEBUF_DESC_PTR)(hp->writeBufDsp + hp->wbuf_index * sizeof(WRITEBUF_DESC));
  938. cur_wbuf = wbufdsc->b1_sadd << 4;
  939. dataptr = (UINT8*)(cur_wbuf | 0xa0000000);
  940. sp_header.dw1 = getDW(dataptr);
  941. sp_header.dw2 = getDW(dataptr+4);
  942. if (hp->audio_type != audio_type)
  943. {
  944. if (sp_header.data_type == 21 ||hp->sp_non_linear_type == 21)
  945. {
  946. hdmidbg("%s:EAC3 skip aud type mismatch case (hp->data:%d, header->datatype=%d\n", __FUNCTION__, hp->sp_non_linear_type, sp_header.data_type);
  947. }
  948. else
  949. {
  950. hdmidbg("%s:aud type mismatch(ori:%d, hw_reg=%d\n", __FUNCTION__, hp->audio_type, audio_type);
  951. AUDIO_ResetLock();
  952. return;
  953. }
  954. }
  955. if (hp->path == HDMI_PATH_LINEAR)
  956. {
  957. if (wbufdsc->Buffer_Full && !wbufdsc->Discontinuous)
  958. {
  959. validData = true;
  960. cmdq->DataSize = hp->bufSize; // size of one write buffer group
  961. cmdq->DataPtr = cur_wbuf | 0xa0000000;
  962. cmdq->pause = wbufdsc->Pause_Exist;
  963. cmdq->discontinue = wbufdsc->Discontinuous;
  964. }
  965. }
  966. else if (hp->path == HDMI_PATH_PARSE)
  967. {
  968. //hdmidbg("%s:hp->data:%d, header->datatype=%d, b_dlth=%d, bufsze=%d\n", __FUNCTION__, hp->sp_non_linear_type, sp_header.data_type, wbufdsc->b_dlth ,hp->bufSize);
  969. if ((wbufdsc->b_dlth >= wbufdsc->b_th && !wbufdsc->Discontinuous) ||((wbufdsc->b_dlth == 0) &&(sp_header.data_type == 21 ||hp->sp_non_linear_type == 21)))
  970. //if(wbufdsc->b_dlth >= wbufdsc->b_th && !wbufdsc->Discontinuous)
  971. {
  972. validData = true;
  973. if (HDMI_RegisterRead(HDMIRX_R_parsing_en))
  974. {
  975. if (hp->sp_non_linear_type != sp_header.data_type)
  976. {
  977. bReset = true;
  978. hp->offset_flag = false;
  979. hp->bSupportNotice = false;
  980. }
  981. hp->sp_non_linear_type = sp_header.data_type;
  982. if(hp->sp_non_linear_type == 21)
  983. {
  984. HDMI_RegisterWrite(HDMIRX_R_parsing_en, 0);
  985. HDMI_RegisterWrite(HDMIRX_R_byte_swap, 0);
  986. hdmi_spdif_parser_init(
  987. hp->writeBuf + NonLinear_Parse_Buffer_Number * PARSE_BUFFER_SIZE,
  988. ddp_receive_frames, hp);
  989. validData = false;
  990. }
  991. }
  992. else
  993. {
  994. UINT32 pts;
  995. validData = false;
  996. hp->sp_non_linear_type = 21;
  997. pts = (wbufdsc->PTS_high << 31) | (wbufdsc->PTS >> 1);
  998. hdmi_spdif_parser_handler(dataptr, hp->bufSize, pts);
  999. }
  1000. switch (hp->sp_non_linear_type)
  1001. {
  1002. case 4:
  1003. hp->sample_number = 384;
  1004. cmdq->inDataType = AUDIO_DATA_TYPE_MPEG;
  1005. break;
  1006. case 5:
  1007. hp->sample_number = 1152;
  1008. cmdq->inDataType = AUDIO_DATA_TYPE_MPEG;
  1009. break;
  1010. case 6:
  1011. hp->sample_number = 1152;
  1012. cmdq->inDataType = AUDIO_DATA_TYPE_MPEG;
  1013. break;
  1014. case 8:
  1015. hp->sample_number = 768;
  1016. cmdq->inDataType = AUDIO_DATA_TYPE_MPEG;
  1017. break;
  1018. case 9:
  1019. hp->sample_number = 2304;
  1020. cmdq->inDataType = AUDIO_DATA_TYPE_MPEG;
  1021. break;
  1022. case 10:
  1023. hp->sample_number = 1152;
  1024. cmdq->inDataType = AUDIO_DATA_TYPE_MPEG;
  1025. break;
  1026. case 1:
  1027. hp->sample_number = 1536;
  1028. cmdq->inDataType = AUDIO_DATA_TYPE_AC3;
  1029. break;
  1030. case 21: //EAC3
  1031. hp->sample_number = 1536;
  1032. cmdq->inDataType = AUDIO_DATA_TYPE_EAC3;
  1033. break;
  1034. case 11: //DTS type I
  1035. hp->sample_number = 512;
  1036. cmdq->inDataType = AUDIO_DATA_TYPE_DTS; //Currenttly unspported audio type
  1037. break;
  1038. case 12: //DTS type II
  1039. hp->sample_number = 1024;
  1040. cmdq->inDataType = AUDIO_DATA_TYPE_DTS;
  1041. break;
  1042. case 13: //DTS type III
  1043. hp->sample_number = 2048;
  1044. cmdq->inDataType = AUDIO_DATA_TYPE_DTS;
  1045. break;
  1046. case 7: //MPEG-2 AAC
  1047. hp->sample_number = 1024;
  1048. cmdq->inDataType = AUDIO_DATA_TYPE_UNKNOW;
  1049. break;
  1050. case 14: //ATRAC
  1051. hp->sample_number = 512;
  1052. cmdq->inDataType = AUDIO_DATA_TYPE_UNKNOW;
  1053. break;
  1054. case 15: //ATRAC 2/3
  1055. hp->sample_number = 1024;
  1056. cmdq->inDataType = AUDIO_DATA_TYPE_UNKNOW;
  1057. break;
  1058. default:
  1059. cmdq->inDataType = AUDIO_DATA_TYPE_UNKNOW;
  1060. hp->sample_number = 1536;
  1061. break;
  1062. }
  1063. cmdq->DataSize = hp->sample_number;
  1064. cmdq->DataPtr = cur_wbuf | 0xa0000000;
  1065. cmdq->pause = wbufdsc->Pause_Exist;
  1066. cmdq->discontinue = wbufdsc->Discontinuous;
  1067. cmdq->sp_non_linear_type = hp->sp_non_linear_type;
  1068. if (hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR ||
  1069. hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_LINEAR ||hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT_PCM)
  1070. {
  1071. INT32 framesize = ((*(((UINT8*)cmdq->DataPtr) + 6)) << 8 |
  1072. *(((UINT8*)cmdq->DataPtr) + 7));
  1073. cmdq->flag = AUDIO_FLAG_DECODING;
  1074. cmdq->outDataType = AUDIO_DATA_TYPE_PCM;
  1075. /* Only clear zero stuffing when input type is not EAC3. */
  1076. if(hp->sp_non_linear_type != 21)
  1077. {
  1078. framesize /= 8;
  1079. cmdq->NLsize = ((8 + framesize + 15) & ~15) >> 4;
  1080. memset(((UINT8*)cmdq->DataPtr) + 8 + framesize,
  1081. 0x0, cmdq->NLsize * 16 - framesize - 8);
  1082. }
  1083. if (cmdq->inDataType == AUDIO_DATA_TYPE_AC3 ||
  1084. cmdq->inDataType == AUDIO_DATA_TYPE_EAC3)
  1085. {
  1086. if (hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_LINEAR ||hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT_PCM)
  1087. {
  1088. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_LINEAR;
  1089. }
  1090. else
  1091. {
  1092. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_NONLINEAR;
  1093. }
  1094. }
  1095. else if (cmdq->inDataType == AUDIO_DATA_TYPE_MPEG)
  1096. {
  1097. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_LINEAR;
  1098. }
  1099. else if (cmdq->inDataType == AUDIO_DATA_TYPE_DTS)
  1100. {
  1101. cmdq->TxType = AUDIO_TX_TYPE_I2S_AND_SPDIF_NONLINEAR;
  1102. cmdq->NLsize = ((8 + framesize + 15) & ~15);//use NLsize send DTS framesize
  1103. }
  1104. else //if(cmdq->inDataType == AUDIO_DATA_TYPE_UNKNOW)
  1105. {
  1106. if (hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR)
  1107. {
  1108. cmdq->flag = AUDIO_FLAG_REPACKAGE;
  1109. cmdq->outDataType = AUDIO_DATA_TYPE_UNKNOW;
  1110. cmdq->TxType = AUDIO_TX_TYPE_ONLY_SPDIF;
  1111. cmdq->DataSize = (8 + framesize + 15)&~15; // size is 16 bytes aligned.
  1112. cmdq->ZeroStuffLen = (4 * hp->sample_number - cmdq->DataSize) / 16 - 1;
  1113. }
  1114. }
  1115. }
  1116. else// if(cmdq->TxType==AUDIO_TX_TYPE_ONLY_I2S)
  1117. {
  1118. cmdq->NLsize = 0;
  1119. }
  1120. }
  1121. }
  1122. else if (hp->path == HDMI_PATH_BYPASS)
  1123. {
  1124. if (wbufdsc->Buffer_Full && !wbufdsc->Discontinuous)
  1125. {
  1126. validData = true;
  1127. cmdq->DataSize = hp->bufSize;
  1128. cmdq->DataPtr = cur_wbuf | 0xa0000000;
  1129. cmdq->pause = wbufdsc->Pause_Exist;
  1130. cmdq->discontinue = wbufdsc->Discontinuous;
  1131. }
  1132. }
  1133. if (validData && (wbufdsc->PTS == 0 && wbufdsc->PTS_high == 0))
  1134. {
  1135. hdmidbg("%s: PTS is not normal. Skip the buffer\n", __FUNCTION__);
  1136. validData = false;
  1137. }
  1138. pts_diff = ((wbufdsc->PTS_high << 31) | (wbufdsc->PTS >> 1)) - hp->pPts;
  1139. if (validData && !pts_diff)
  1140. {
  1141. hdmidbg("%s: PTS is decreasing. Skip the buffer\n", __FUNCTION__);
  1142. validData = false;
  1143. }
  1144. if (validData && hp->pPts)
  1145. {
  1146. if (verifyFreq(hp, pts_diff) == false)
  1147. {
  1148. hdmidbg("%s: Change audio freq to %d\n", __FUNCTION__, hp->Freq);
  1149. #define Max_Reset_Count 100
  1150. if ((hp->path == HDMI_PATH_PARSE) && (Reset_Count < Max_Reset_Count) &&
  1151. (cmdq->inDataType == AUDIO_DATA_TYPE_UNKNOW))
  1152. {
  1153. DRV_HDMI_AudioDisable();
  1154. }
  1155. cmdq->sfreq = AUDIO_freq(hp->Freq);
  1156. AUDIO_setDelayTime(hp);
  1157. if (hp->offset_flag)
  1158. {
  1159. bReset = true;
  1160. hp->offset_flag = false;
  1161. }
  1162. if(HDMI_RegisterRead(HDMIRX_R_audio_enable) == 0)
  1163. {
  1164. DRV_HDMI_AudioEnable();
  1165. Reset_Count++;
  1166. hdmidbg("AUDIO_bufChange:Reset_Count=%d\n", Reset_Count);
  1167. }
  1168. #define HDMI_RELOCK_TIMEBOUND 0xa
  1169. if (hp->relock_count++ > HDMI_RELOCK_TIMEBOUND)
  1170. {
  1171. AUDIO_ResetLock();
  1172. return;
  1173. }
  1174. }
  1175. else
  1176. {
  1177. if (hp->Freq == 1)
  1178. {
  1179. hdmidbg("Freq is abnormal!!\n");
  1180. validData = false;
  1181. }
  1182. if ((hp->path == HDMI_PATH_PARSE) && (cmdq->inDataType == AUDIO_DATA_TYPE_UNKNOW))
  1183. {
  1184. Reset_Count = 0;
  1185. }
  1186. }
  1187. }
  1188. else
  1189. {
  1190. validData = false;
  1191. }
  1192. cmdq->spdif_channel_status_category_code = HDMI_RegisterRead(HDMIRX_R_ACS_CatC);
  1193. cmdq->copy_protection = (HDMI_RegisterRead(HDMIRX_R_ACS_CSts) & 0x04) >> 2;
  1194. cmdq->PTS = wbufdsc->PTS;
  1195. cmdq->PTS_High = wbufdsc->PTS_high;
  1196. hp->pPts = (wbufdsc->PTS_high << 31) | (wbufdsc->PTS >> 1);
  1197. /* Check IEC61937 header in parse mode */
  1198. if (validData && hp->path == HDMI_PATH_PARSE)
  1199. {
  1200. if (cmdq->inDataType == AUDIO_DATA_TYPE_AC3)
  1201. {
  1202. AUDIO_AC3HEADERDATA ac3_header;
  1203. ac3_header.dw1 = getDW(((UINT8*)cmdq->DataPtr) + 8);
  1204. ac3_header.dw2 = getDW(((UINT8*)cmdq->DataPtr) + 12);
  1205. if (ac3_header.syncword != 0x0b77)
  1206. {
  1207. validData = false;
  1208. }
  1209. else
  1210. {
  1211. if (hp->codingMode != ac3_header.acmod)
  1212. {
  1213. bReset = true;
  1214. hp->offset_flag = false;
  1215. hp->codingMode = ac3_header.acmod;
  1216. }
  1217. else
  1218. {
  1219. hp->codingMode = ac3_header.acmod;
  1220. hp->bDualChannel = (hp->codingMode == 0);
  1221. }
  1222. }
  1223. }
  1224. else if (cmdq->inDataType == AUDIO_DATA_TYPE_MPEG)
  1225. {
  1226. AUDIO_MPEGHEADERDATA mpeg_header;
  1227. mpeg_header.dw = getDW(((UINT8*)cmdq->DataPtr) + 8);
  1228. if ((mpeg_header.dw & 0xfff40000) != 0xfff40000)
  1229. {
  1230. validData = false;
  1231. }
  1232. else
  1233. {
  1234. UINT8 codMode = ((mpeg_header.mode == 2) ? 0 : ((mpeg_header.mode == 3) ? 1 : 2));
  1235. if (hp->codingMode != codMode)
  1236. {
  1237. bReset = true;
  1238. hp->offset_flag = false;
  1239. hp->codingMode = codMode;
  1240. }
  1241. else
  1242. {
  1243. hp->codingMode = codMode;
  1244. hp->bDualChannel = (hp->codingMode == 0);
  1245. }
  1246. }
  1247. }
  1248. else if (cmdq->inDataType == AUDIO_DATA_TYPE_DTS)
  1249. {
  1250. validData = true;//jsut not make valiData false;
  1251. }
  1252. else
  1253. {
  1254. if (cmdq->flag == AUDIO_FLAG_DECODING)
  1255. {
  1256. validData = false;
  1257. }
  1258. }
  1259. }
  1260. else if (validData && hp->path == HDMI_PATH_LINEAR)
  1261. {
  1262. UINT8 chcount = HDMI_RegisterRead(HDMIRX_R_Ado_CC) & 0x7;
  1263. UINT8 spkplace = HDMI_RegisterRead(HDMIRX_R_Ado_CA) & 0x1f;
  1264. #if 0//CONFIG_HDMI_Support_MULTI_PCM
  1265. UINT8 cur_chcnt = getChannelCount(spkplace, chcount);
  1266. UINT8 old_chcnt = getChannelCount(hp->spkplace, hp->chcount);
  1267. if (old_chcnt != cur_chcnt)
  1268. {
  1269. hp->chcount = chcount;
  1270. hp->spkplace = spkplace;
  1271. bReset = true;
  1272. hp->offset_flag = false;
  1273. cmdq->spkplace = getSpeakerPlacement(spkplace);
  1274. cmdq->chcnt = cur_chcnt;
  1275. }
  1276. #else
  1277. /* Patch: Only stereo pcm input is allowed. */
  1278. if (getChannelCount(spkplace, chcount))
  1279. {
  1280. //validData = false;
  1281. }
  1282. #endif
  1283. }
  1284. else if (validData && hp->path == HDMI_PATH_BYPASS)
  1285. {
  1286. if (hp->audio_stream_type == 0)
  1287. {
  1288. hp->audio_stream_type = check_spdif_type((UINT8*)(cur_wbuf | 0xa0000000), hp->bufSize);
  1289. //hdmidbg("check_spdif_type %d\n",hp->audio_stream_type);
  1290. switch (hp->audio_stream_type)
  1291. {
  1292. case E_SPDIF_TYPE_UNKNOWN:
  1293. validData = FALSE;
  1294. break;
  1295. case E_SPDIF_TYPE_DDP:
  1296. cmdq->inDataType = cmdq->outDataType = AUDIO_DATA_TYPE_EAC3;
  1297. break;
  1298. case E_SPDIF_TYPE_DD:
  1299. case E_SPDIF_TYPE_OTHERS:
  1300. default:
  1301. break;
  1302. }
  1303. }
  1304. }
  1305. ACP_type = HDMI_RegisterRead(HDMIRX_R_ACP_Type);
  1306. /* HDMI Source SPDIF OUT fix at SPDIF_WORD_LENGTH_16_BITS */
  1307. //cmdq->sample_bit = 0x2;// SPDIF_WORD_LENGTH_16_BITS = 0x2,
  1308. //HC Modify
  1309. if((ACP_type == ACP_GENERIC_AUDIO) || (ACP_type == ACP_IEC60958_IDENTIFIED))
  1310. {
  1311. cmdq->copy_protection = 0; // ACP TYPE = 0 1, CP bit = 0, L bit =1
  1312. cmdq->spdif_channel_status_category_code = cmdq->spdif_channel_status_category_code | 0x80;
  1313. }
  1314. //~HC
  1315. if (ACP_type_pre != ACP_type)
  1316. {
  1317. HDMI_NoticeAudioACP(HDMI_RegisterRead(HDMIRX_R_ACP_Type));
  1318. ACP_type_pre = ACP_type;
  1319. }
  1320. /* Check ACP Type */
  1321. if ((HDMI_RegisterRead(HDMIRX_R_ACP_Type) != ACP_GENERIC_AUDIO &&
  1322. HDMI_RegisterRead(HDMIRX_R_ACP_Type) != ACP_IEC60958_IDENTIFIED) &&
  1323. (hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT ||
  1324. hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR ||
  1325. hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_LINEAR ||hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT_PCM))
  1326. {
  1327. if (hp->TX_path == AUDIO_MENU_SPDIF_OUTPUT)
  1328. {
  1329. validData = false;
  1330. }
  1331. else
  1332. {
  1333. /* Change audio path: parallel linear/non-linear --> Internal speaker */
  1334. hp->TX_path = AUDIO_MENU_INTERNAL;
  1335. cmdq->TxType = AUDIO_TX_TYPE_ONLY_I2S;
  1336. }
  1337. }
  1338. /* Notice Flow control if we support the audio type */
  1339. if (!hp->bSupportNotice)
  1340. {
  1341. // BOOL bSupported = (cmdq->inDataType != AUDIO_DATA_TYPE_UNKNOW);
  1342. /* DTS is supported when SDPIF Out is enable */
  1343. /* if (!bSupported &&
  1344. cmdq->inDataType == AUDIO_DATA_TYPE_DTS &&
  1345. hp->TX_path == AUDIO_MENU_PARALLEL_SPDIF_NONLINEAR)
  1346. {
  1347. bSupported = 1;
  1348. }
  1349. */
  1350. // HDMI_NoticeAudioTypeSupport(bSupported);
  1351. hp->bSupportNotice = true;
  1352. }
  1353. /* Audio Mute when current control packet contains av mute flag */
  1354. if (HDMI_RegisterRead(HDMIRX_R_AV_Mute))
  1355. {
  1356. validData = false;
  1357. }
  1358. if (validData)
  1359. {
  1360. if (bReset)
  1361. {
  1362. bReset = HDMI_AudioResetDecoder() ? false : true;
  1363. }
  1364. if (!bReset)
  1365. {
  1366. if (!hp->offset_flag)
  1367. {
  1368. hp->offset_flag = HDMI_AudioSetOffset(hp->audio_offset, hp->NLdelayCnt);
  1369. }
  1370. if (hp->offset_flag)
  1371. {
  1372. HDMI_AudioSendCmdq(cmdq);
  1373. }
  1374. }
  1375. }
  1376. else
  1377. {
  1378. /* Software parsing EAC3 frames, don't reset. */
  1379. if (hp->offset_flag && hp->sp_non_linear_type != 21)
  1380. {
  1381. bReset = true;
  1382. hp->offset_flag = false;
  1383. }
  1384. }
  1385. hp->wbuf_index = (hp->wbuf_index + 1) % hp->writeBufNum;
  1386. wbufdsc->b_size = hp->bufSize >> 4;
  1387. //wbufdsc->Buffer_Valid=0;
  1388. //wbufdsc->Discontinuous=0;
  1389. //wbufdsc->Pause_Exist=0;
  1390. //wbufdsc->Buffer_Full=0;
  1391. //wbufdsc->b_dlth=0;
  1392. //wbufdsc->PTS=0;
  1393. //wbufdsc->PTS_high=0;
  1394. }