📄 amp_gui.c
字号:
#include "osd.h"
#include "iop.h"
#include "e2prom_map.h"
#include "amp_gui.h"
#include "auddef.h" //hongfeng 2005-08-01
#ifdef ROM_BUS_EXTENT_IO//chenzhao20060114
#include "rom_bus_io.h"
#endif
#ifdef TDA7448
#include "tda7448.c"
#endif
#ifdef PT2258
#include "pt2258.c"
#endif
#ifdef TAS_5508_PWM
#include "Tas5508_pwm.h"
#endif
#ifdef SUPPORT_DDX8001
#include "ddx8001.h"
#endif
#if defined(TLV320_DAC) //chenzhao20060118
#include "tlv320.h"
#endif
#ifndef SUPPORT_VFD_MESSAGE
BYTE subvol_time_out = 0 ;
#endif
BYTE current_channel = 0;
BYTE volume_changed =0;
#ifdef TREBLE_BASS_EQ_MENU_INTERFACE
#include "ircode.h"
TONE_TYPE amp_tone_mode = TONE_IDLE;
#endif
#ifdef SUPPORT_VFD_MESSAGE
void set_vfd_message_state(BYTE state,BYTE time);
#endif
#if defined(DOLBY_AMP_VOLUME_CTRL)
/*
channel: 0--6
1-6->sub channel vol
vol:0-->79dB
*/
void subvol_channel_volume(BYTE channel,BYTE vol)
{
#ifdef SUPPORT_APOGEE_AMP
ddx_set_channel_vol(channel, vol);
#endif
#ifdef TAS_5026_PWM
tas_5026_channel_vol(channel, vol);
#elif defined(TAS_5508_PWM)
tas_5508_channel_vol(channel, vol);
#endif
}
#endif
#if defined(TDA7448)||defined(PT2258)||defined(DOLBY_AMP_VOLUME_CTRL)
#ifdef DOLBY_AMP_VOLUME_CTRL
#ifdef SUPPORT_BASS_TREBLE
char *channel_str[MAX_VOLUM_CHANNEL]={"FRONT L","FRONT R","SURROUND L","SURROUND R","CENTER","LFE","BASS","TREBLE",};
#else
char *channel_str[MAX_VOLUM_CHANNEL]={"LFE","SURROUND R","SURROUND L","CENTER","FRONT R","FRONT L"};
#endif
#else
char *channel_str[6]={"SW","SR","SL","CE","FR","FL"};
//BYTE channel_str[6]={STR_SUB_CH,STR_SR_CH,STR_SL_CH,STR_C_CH,STR_FR_CH,STR_FL_CH};
#endif
/*
current_channel:
0->main
1->ch1
2->ch2
3->ch3
4->ch4
5->ch5
6->ch6
7->ch bass
8->ch treble
*/
BYTE volum_list[MAX_VOLUM_CHANNEL+1];
#ifdef SUPPORT_BASS_TREBLE
BYTE channel_vol_offset[MAX_VOLUM_CHANNEL] = {CH1_VOL,CH2_VOL,CH3_VOL,CH4_VOL,CH5_VOL,CH6_VOL,CH_BASS_VOL,CH_TREBEL_VOL};
#else
BYTE channel_vol_offset[MAX_VOLUM_CHANNEL] = {CH1_VOL,CH2_VOL,CH3_VOL,CH4_VOL,CH5_VOL,CH6_VOL};
#endif
#ifdef TAS_5508_PWM
#define GET_ABSOLUTE_VALUE(channel) (MAIN_VOL_MAX+channel_vol_offset[channel-1]-(CH_VOL_MAX/2))
#else//#ifdef TAS_5508_PWM
#define GET_ABSOLUTE_VALUE(channel) (volum_list[0]+channel_vol_offset[channel-1]-(CH_VOL_MAX/2))
#endif//#ifdef TAS_5508_PWM
#ifdef SAVE_AMP_VOLUME
/*
channel:
main 0
fl 1
fr 2
sl 3
sr 4
ce 5
lfe 6
global var: volum_list
AMPLIFIER_START 228
bass offset 7
treble offset 8
*/
//#define AMPLIFIER_START 228 moved to e2prom_map.h
extern BYTE ddx_Bass_lev;
extern BYTE ddx_Treble_lev;
void reset_amp_variable(void)
{
int i;
volum_list[0]=MAIN_VOL;
channel_vol_offset[0]=CH1_VOL;
channel_vol_offset[1]=CH2_VOL;
channel_vol_offset[2]=CH3_VOL;
channel_vol_offset[3]=CH4_VOL;
channel_vol_offset[4]=CH5_VOL;
channel_vol_offset[5]=CH6_VOL;
#ifdef SUPPORT_BASS_TREBLE
channel_vol_offset[6]=CH_BASS_VOL;
channel_vol_offset[7]=CH_TREBEL_VOL;
#endif//#ifdef SUPPORT_BASS_TREBLE
for(i=1;i<MAX_VOLUM_CHANNEL;i++)
volum_list[i] = GET_ABSOLUTE_VALUE(i);
for(i=0;i<MAX_VOLUM_CHANNEL;i++)
save_amp_variable(i);
}
void save_amp_variable(BYTE ch)
{
BYTE data;
#if 0//def SUPPORT_APOGEE_AMP
data = ddx_Treble_lev;
WriteToI2c(I2C_ID_MEMORY, AMPLIFIER_START+8,&data, 1);
#endif
if(ch==0)
{
#ifdef TAS_5508_PWM
data = volum_list[0];
WriteToI2c(I2C_ID_MEMORY, AMPLIFIER_START,&data, 1);
#ifdef DEBUG_VOLUME
printf("save ch %d data %d\n",ch,data);
#endif
#endif//#ifdef TAS_5508_PWM
}
else if ((ch > 0)&&(ch<=MAX_VOLUM_CHANNEL))
{
data = channel_vol_offset[ch-1];
WriteToI2c(I2C_ID_MEMORY, AMPLIFIER_START+ch,&data, 1);
#ifdef DEBUG_VOLUME
printf("save ch %d data %d\n",ch,data);
#endif
}
}
void load_amp_variable()
{
BYTE data,ch;
int res;
#ifdef TAS_5508_PWM
res = ReadFromI2c(I2C_ID_MEMORY, AMPLIFIER_START,&data, 1);
if(res>0)
volum_list[0] = data;
#endif//#ifdef TAS_5508_PWM
for(ch = 1;ch<=MAX_VOLUM_CHANNEL;ch++)
{
res = ReadFromI2c(I2C_ID_MEMORY, AMPLIFIER_START+ch,&data, 1);
if(res == 1)//no error
{
#ifdef DEBUG_VOLUME
printf("load ch %d data %d\n",ch,data);
#endif
if(data <= CH_VOL_MAX)
channel_vol_offset[ch-1] = data;
}
}
}
#endif
extern void init_tas_5026();
void init_subvol()
{
BYTE ch;
volum_list[0] = MAIN_VOL;
#ifdef SAVE_AMP_VOLUME
load_amp_variable();
#endif
#ifdef PT2258
init_pt2258();
#endif
#ifdef TAS_5026_PWM
init_tas_5026();
#elif defined(TAS_5508_PWM)
init_tas_5508();
#endif
#ifdef TAS_5508_PWM
subvol_channel_volume(0, volum_list[0]);
#endif
for(ch = 1;ch<=MAX_VOLUM_CHANNEL;ch++)
{
volum_list[ch] = GET_ABSOLUTE_VALUE(ch);
subvol_channel_volume(ch,volum_list[ch]);
}
/*init lineout volume*/
#ifdef TAS_5508_PWM
subvol_channel_volume(VOL_CH_BSL, LINE_OUT_VOL);
subvol_channel_volume(VOL_CH_BSR, LINE_OUT_VOL);
#else
subvol_channel_volume(7, LINE_OUT_VOL);
subvol_channel_volume(8, LINE_OUT_VOL);
#endif
}
/*
current_channel:
0->main
1->ch1
2->ch2
3->ch3
4->ch4
5->ch5
6->ch6
*/
void subvol_next_channel()
{
if(current_channel == 6)
current_channel = 0;
#ifdef SUPPORT_BASS_TREBLE
else if(current_channel == 0)
current_channel = 7;
else if(current_channel == 8)
current_channel = 1;
#endif
else
current_channel ++;
if(current_channel == 0)
{
psprintf(RegionValStr[REGION1], "VOLUME %d",volum_list[0]);
PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
else
{
#ifdef SUPPORT_VFD_MESSAGE
set_vfd_message_state(VFD_MESSAGE_VOL,SUBVOL_TIME_OUT);
#else
subvol_time_out = SUBVOL_TIME_OUT;
#endif
show_channel_msg();
}
}
/*
to come with dolby's demand
sub channel adjust from -10dB to +10dB
*/
//char channel_offset_str[];
void show_channel_msg()
{
#ifdef DEBUG_VOLUME
printf("keep ch %d %d\n",current_channel,(channel_vol_offset[current_channel-1]));
#endif
if((channel_vol_offset[current_channel-1])==(CH_VOL_MAX/2))
{
psprintf(RegionValStr[REGION1],"%s 0",channel_str[current_channel-1]);
}
else if((channel_vol_offset[current_channel-1])<(CH_VOL_MAX/2))
{
psprintf(RegionValStr[REGION1],"%s -%d",channel_str[current_channel-1],(CH_VOL_MAX/2)-(channel_vol_offset[current_channel-1]));
}
else
{
psprintf(RegionValStr[REGION1],"%s +%d",channel_str[current_channel-1],(channel_vol_offset[current_channel-1])-(CH_VOL_MAX/2));
}
PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
/*
I place this function at 500ms polling loop
so,the time out is 500ms * 10 == 5 sec
*/
#ifdef SUPPORT_VFD_MESSAGE
void exit_channel_volume(void)
{
current_channel = 0;
}
#else
void polling_channel_timeout(void)
{
if(subvol_time_out>0)
{
subvol_time_out--;
/* if(current_channel > 0)
{
show_channel_msg();
}*/
}
else
{
current_channel = 0;
}
}
#endif
#ifdef TAS_5508_PWM
void subvol_main_vol()
{
#if defined(USE_AMP_MUTE)&& !defined(CHANGE_VOL_DEMUTE) //chenzhao20050926
if(!user_amp_mute)
#endif//#ifdef USE_AMP_MUTE
{
#ifdef SUPPORT_AMP_IO_MUTE
amp_io_demute();
#endif
subvol_channel_volume(0,volum_list[0]);
}
}
#else//#ifdef TAS_5508_PWM
/*
according to DOLBY's specification.
actually,we set each channel here.
*/
void subvol_main_vol()
{
BYTE ch;
for(ch = 1;ch<7;ch++)
{
volum_list[ch]=GET_ABSOLUTE_VALUE(ch);
/*huziqin 2004-5-10 avoid volume turn to 255*/
if(volum_list[ch]>(255-CH_VOL_MAX))
{
volum_list[ch] = 0;
break;
}
if(volum_list[0] == 0) //if main vol ==0,all channel set to zero
subvol_channel_volume(ch,0);
else
subvol_channel_volume(ch,volum_list[ch]);
}
}
#endif//#ifdef TAS_5508_PWM
/*
global -- volum_list[]
*/
void subvol_vol_up()
{
#ifndef TAS_5508_PWM
BYTE ch;
#endif//#ifndef TAS_5508_PWM
if(current_channel == 0) //main vol
{
/*check if reach max,according to DOLBY's spec*/
#ifdef TAS_5508_PWM
if (volum_list[0]<MAIN_VOL_MAX)
volum_list[0] ++;
#else//#ifdef TAS_5508_PWM
BYTE overflow =0;
for(ch = 0;ch <7;ch ++)
{
if (volum_list[ch]>=(MAIN_VOL_MAX-1))
{
overflow=1;
}
}
if(overflow!=1)
volum_list[0] ++;
#endif//#ifdef TAS_5508_PWM
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -