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

DVD

开发平台:

C/C++

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