hdmi_audio.c 42 KB

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