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

DVD

开发平台:

C/C++

  1. #include "osd.h"
  2. #include "iop.h"
  3. #ifdef TDA7448
  4. #include "tda7448.c"
  5. #endif
  6. #ifdef PT2258
  7. #include "pt2258.c"
  8. #endif
  9. BYTE  subvol_time_out = 0 ;
  10. BYTE current_channel = 0;
  11. #if defined(DOLBY_AMP_VOLUME_CTRL)
  12. /*
  13. channel: 0--6
  14.  
  15.  1-6->sub channel vol
  16. vol:0-->79dB
  17. */
  18. void subvol_channel_volume(BYTE channel,BYTE vol)
  19. {
  20. #ifdef SUPPORT_APOGEE_AMP
  21. ddx_set_channel_vol(channel, vol);
  22. #endif
  23. #ifdef TAS_5026_PWM
  24. tas_5026_channel_vol(channel,  vol);
  25. #endif
  26. }
  27. #endif
  28. #if  defined(TDA7448)||defined(PT2258)||defined(DOLBY_AMP_VOLUME_CTRL)
  29. #ifdef DOLBY_AMP_VOLUME_CTRL
  30. #ifdef  TAS_5026_PWM
  31. char *channel_str[6]={"FRONT L","FRONT R","SURROUND L","SURROUND R","CENTER","LFE",};
  32. #else
  33. //char *channel_str[6]={"LFE","SURROUND R","SURROUND L","CENTER","FRONT R","FRONT L"};
  34. char *channel_str[6]={"FRONT L","FRONT R","SURROUND L","SURROUND R","CENTER","LFE",};
  35. #endif
  36. #else
  37. char *channel_str[6]={"SW","SR","SL","CE","FR","FL"};
  38. //BYTE  channel_str[6]={STR_SUB_CH,STR_SR_CH,STR_SL_CH,STR_C_CH,STR_FR_CH,STR_FL_CH};
  39. #endif
  40. /*
  41. current_channel:
  42. 0->main 
  43. 1->ch1
  44. 2->ch2
  45. 3->ch3
  46. 4->ch4
  47. 5->ch5
  48. 6->ch6
  49. */
  50. BYTE volum_list[7];
  51. BYTE channel_vol_offset[6] = {CH1_VOL,CH2_VOL,CH3_VOL,CH4_VOL,CH5_VOL,CH6_VOL};
  52. #define  GET_ABSOLUTE_VALUE(channel)     (volum_list[0]+channel_vol_offset[channel-1]-(CH_VOL_MAX/2))
  53. #ifdef SAVE_AMP_VOLUME
  54. /*
  55.   channel:
  56.   main  0
  57.   fl       1
  58.   fr       2
  59.   sl      3
  60.   sr       4
  61.   ce       5
  62.   lfe     6
  63.   global var: volum_list
  64.   AMPLIFIER_START 228
  65.   bass offset   7
  66.   treble offset 8
  67. */
  68. #define  AMPLIFIER_START  228
  69. extern BYTE ddx_Bass_lev;
  70. extern BYTE ddx_Treble_lev;
  71. void save_amp_variable(BYTE ch)
  72. {
  73. BYTE data;
  74. #ifdef  SUPPORT_APOGEE_AMP
  75. data = ddx_Treble_lev;
  76. WriteToI2c(I2C_ID_MEMORY, AMPLIFIER_START+8,&data, 1);
  77. #endif
  78. if(ch==0)
  79. {
  80. }
  81. else if ((ch > 0)&&(ch<7))
  82. {
  83. data = channel_vol_offset[ch-1];
  84. WriteToI2c(I2C_ID_MEMORY, AMPLIFIER_START+ch,&data, 1);
  85. #ifdef DEBUG_VOLUME
  86. printf("save ch %d data %dn",ch,data);
  87. #endif
  88. }
  89. }
  90. void load_amp_variable()
  91. {
  92. BYTE data,ch;
  93. int res;
  94. for(ch = 1;ch<7;ch++)
  95. {
  96. res = ReadFromI2c(I2C_ID_MEMORY, AMPLIFIER_START+ch,&data, 1);
  97. if(res == 1)//no error
  98. {
  99. #ifdef DEBUG_VOLUME
  100. printf("load ch %d data %dn",ch,data);
  101. #endif
  102. if(data <= CH_VOL_MAX)
  103. channel_vol_offset[ch-1] = data;
  104. }
  105. }
  106. }
  107. #endif
  108. extern void init_tas_5026();
  109. void init_subvol()
  110. {
  111. BYTE ch;
  112. #ifdef PT2258
  113. init_pt2258();
  114. #endif
  115. #ifdef TAS_5026_PWM
  116. init_tas_5026();
  117. #endif
  118. volum_list[0] = MAIN_VOL;
  119. #ifdef SAVE_AMP_VOLUME
  120. load_amp_variable();
  121. #endif
  122. for(ch = 1;ch<7;ch++)
  123. {
  124. volum_list[ch] = GET_ABSOLUTE_VALUE(ch);
  125. subvol_channel_volume(ch,volum_list[ch]);
  126. }
  127. /*init lineout volume*/
  128. subvol_channel_volume(7, LINE_OUT_VOL);
  129. subvol_channel_volume(8, LINE_OUT_VOL);
  130. }
  131. /*
  132. current_channel:
  133. 0->main 
  134. 1->ch1
  135. 2->ch2
  136. 3->ch3
  137. 4->ch4
  138. 5->ch5
  139. 6->ch6
  140. */
  141. #define SUBVOL_TIME_OUT  8 //decrease in 500ms polling
  142. void subvol_next_channel()
  143. {
  144. if(current_channel == 6)
  145. current_channel = 0;
  146. else
  147. current_channel ++;
  148. if(current_channel == 0)
  149. psprintf(RegionValStr[REGION1], "MAIN");
  150. else
  151. {
  152. subvol_time_out = SUBVOL_TIME_OUT;
  153. psprintf(RegionValStr[REGION1], "%s",channel_str[current_channel-1]);
  154. }
  155.   PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  156. }
  157. /*
  158.   to come with dolby's demand
  159.   sub channel adjust from -10dB to +10dB
  160. */
  161. //char  channel_offset_str[];
  162. void show_channel_msg()
  163. {
  164. #ifdef DEBUG_VOLUME
  165. printf("keep ch %d  %dn",current_channel,(channel_vol_offset[current_channel-1]));
  166. #endif
  167. if((channel_vol_offset[current_channel-1])==(CH_VOL_MAX/2))
  168. {
  169. psprintf(RegionValStr[REGION1],"%s 0",channel_str[current_channel-1]);
  170. }
  171. else if((channel_vol_offset[current_channel-1])<(CH_VOL_MAX/2))
  172. {
  173. psprintf(RegionValStr[REGION1],"%s -%d",channel_str[current_channel-1],(CH_VOL_MAX/2)-(channel_vol_offset[current_channel-1]));
  174. }
  175. else
  176. {
  177. psprintf(RegionValStr[REGION1],"%s +%d",channel_str[current_channel-1],(channel_vol_offset[current_channel-1])-(CH_VOL_MAX/2));
  178. }
  179. PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  180. }
  181. /*
  182. I place this function at 500ms polling loop
  183. so,the time out is 500ms * 10 == 5 sec 
  184. */
  185. void polling_channel_timeout()
  186. {
  187. if(subvol_time_out>0)
  188. {
  189. subvol_time_out--;
  190. /* if(current_channel > 0)
  191. {
  192. show_channel_msg();
  193. }*/
  194. }
  195. else
  196. {
  197. current_channel = 0;
  198. }
  199. }
  200. /*
  201.   according to DOLBY's specification.
  202.   actually,we set each channel here.
  203. */
  204. void subvol_main_vol()
  205. {
  206. BYTE ch;
  207. for(ch = 1;ch<7;ch++)
  208. {
  209. volum_list[ch]=GET_ABSOLUTE_VALUE(ch);
  210. /*huziqin 2004-5-10 avoid volume turn to 255*/
  211. if(volum_list[ch]>(255-CH_VOL_MAX))
  212. {
  213. volum_list[ch] = 0;
  214. break;
  215. }
  216. if(volum_list[0] == 0) //if main vol ==0,all channel set to zero
  217. subvol_channel_volume(ch,0);
  218. else
  219. subvol_channel_volume(ch,volum_list[ch]);
  220. }
  221. }
  222. /*
  223. global -- volum_list[]
  224. */
  225. void subvol_vol_up()
  226. {
  227. BYTE ch;
  228. if(current_channel == 0) //main vol
  229. {
  230. /*check if reach max,according to DOLBY's spec*/
  231. for(ch = 0;ch <7;ch ++)
  232. {
  233. if (volum_list[ch]>=(MAIN_VOL_MAX-1))
  234. {
  235.      psprintf(RegionValStr[REGION1], "MAIN MAX");
  236.         PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  237. return;
  238. }
  239. }
  240. volum_list[0] ++;
  241. subvol_main_vol();
  242. psprintf(RegionValStr[REGION1], "MAIN %d",volum_list[0]);
  243.     PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  244. }
  245. else//channel vol
  246. {
  247. subvol_time_out = SUBVOL_TIME_OUT;
  248. volum_list[current_channel] = GET_ABSOLUTE_VALUE(current_channel);
  249. if(volum_list[current_channel]>=(MAIN_VOL_MAX-1))
  250. {
  251.         return;
  252. }
  253. if((channel_vol_offset[current_channel-1])<CH_VOL_MAX)
  254. (channel_vol_offset[current_channel-1])++;
  255. subvol_channel_volume(current_channel, volum_list[current_channel]);
  256. show_channel_msg();
  257. PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  258. }
  259. #ifdef SAVE_AMP_VOLUME
  260. save_amp_variable(current_channel);
  261. #endif
  262. }
  263. void subvol_vol_down()
  264. {
  265. if(current_channel == 0) //main vol
  266. {
  267. if(volum_list[0]>0)
  268. volum_list[0] --;
  269. subvol_main_vol();
  270. psprintf(RegionValStr[REGION1], "MAIN %d",volum_list[0]);
  271. PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  272. }
  273. else//channel vol
  274. {
  275. subvol_time_out = SUBVOL_TIME_OUT;
  276. volum_list[current_channel] =GET_ABSOLUTE_VALUE(current_channel);
  277. if(volum_list[current_channel]==0)
  278. {
  279.         return;
  280. }
  281. if((channel_vol_offset[current_channel-1])>0)
  282. (channel_vol_offset[current_channel-1])--;
  283. subvol_channel_volume(current_channel, volum_list[current_channel]);
  284. show_channel_msg();
  285. PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  286. }
  287. #ifdef SAVE_AMP_VOLUME
  288. save_amp_variable(current_channel);
  289. #endif
  290. }
  291. //******************************************************
  292. //wuzhj 2004/12/10
  293. //for Radio new UI vol control
  294. // Radio_vol_up();Radio_vol_down();Radio_main_vol()
  295. //******************************************************
  296. #ifdef SUPPORT_Radio_NEW_UI  //wuzhj  2004/12/10   
  297. void Radio_vol_up()
  298. {
  299. BYTE ch;
  300. if(current_channel == 0) //main vol
  301. {
  302. /*check if reach max,according to DOLBY's spec*/
  303. for(ch = 0;ch <7;ch ++)
  304. {
  305. if (volum_list[ch]>=(MAIN_VOL_MAX-1))
  306. {
  307. return;
  308. }
  309. }
  310. volum_list[0] ++;
  311. subvol_main_vol();
  312. psprintf(RegionValStr[REGION1], " MAIN %d",volum_list[0]);
  313.         //PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  314.         //osd_DrawString(18+8, 2-2, RegionValStr[REGION1], 2, 11);
  315. }
  316. else//channel vol
  317. {
  318. subvol_time_out = SUBVOL_TIME_OUT;
  319. volum_list[current_channel] = GET_ABSOLUTE_VALUE(current_channel);
  320. if(volum_list[current_channel]>=(MAIN_VOL_MAX-1))
  321. {
  322.         return;
  323. }
  324. if((channel_vol_offset[current_channel-1])<CH_VOL_MAX)
  325. (channel_vol_offset[current_channel-1])++;
  326. subvol_channel_volume(current_channel, volum_list[current_channel]);
  327. show_channel_msg();
  328. //PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  329. }
  330. #ifdef SAVE_AMP_VOLUME
  331. save_amp_variable(current_channel);
  332. #endif
  333. }
  334. void Radio_vol_down()
  335. {
  336. if(current_channel == 0) //main vol
  337. {
  338. if(volum_list[0]>0)
  339. volum_list[0] --;
  340. subvol_main_vol();
  341. psprintf(RegionValStr[REGION1], " MAIN %d",volum_list[0]);
  342. //PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  343. }
  344. else//channel vol
  345. {
  346. subvol_time_out = SUBVOL_TIME_OUT;
  347. volum_list[current_channel] =GET_ABSOLUTE_VALUE(current_channel);
  348. if(volum_list[current_channel]==0)
  349. {
  350.         return;
  351. }
  352. if((channel_vol_offset[current_channel-1])>0)
  353. (channel_vol_offset[current_channel-1])--;
  354. subvol_channel_volume(current_channel, volum_list[current_channel]);
  355. show_channel_msg();
  356. PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
  357. }
  358. #ifdef SAVE_AMP_VOLUME
  359. save_amp_variable(current_channel);
  360. #endif
  361. }
  362. void Radio_main_vol()
  363. {
  364. BYTE ch;
  365. for(ch = 1;ch<7;ch++)
  366. {
  367. volum_list[ch]=GET_ABSOLUTE_VALUE(ch);
  368. //huziqin 2004-5-10 avoid volume turn to 255
  369. if(volum_list[ch]>(255-CH_VOL_MAX))
  370. {
  371. volum_list[ch] = 0;
  372. break;
  373. }
  374. if(volum_list[0] == 0) //if main vol ==0,all channel set to zero
  375. subvol_channel_volume(ch,0);
  376. else
  377. subvol_channel_volume(ch,volum_list[ch]);
  378. }
  379.     psprintf(RegionValStr[REGION1], " MAIN %d",volum_list[0]);
  380. }
  381. #endif//#ifdef SUPPORT_Radio_NEW_UI  //wuzhj  2004/12/10   
  382. #endif //defined(TDA7448)||defined(PT2258)