www.pudn.com > 8202T_PDVD_4X16.rar > amp_gui.c, change:2007-08-27,size:31569b
#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
}
else//channel vol
{
#ifdef TAS_5508_PWM
if((channel_vol_offset[current_channel-1])<CH_VOL_MAX)
(channel_vol_offset[current_channel-1])++;
#else//#ifdef TAS_5508_PWM
if(volum_list[current_channel]>=(MAIN_VOL_MAX-1))
{
if((channel_vol_offset[current_channel-1])<CH_VOL_MAX)
(channel_vol_offset[current_channel-1])++;
}
#endif//#ifdef TAS_5508_PWM
volum_list[current_channel] = GET_ABSOLUTE_VALUE(current_channel);
}
#ifdef SUPPORT_VFD_MESSAGE
set_vfd_message_state(VFD_MESSAGE_VOL,SUBVOL_TIME_OUT);
#else
subvol_time_out=SUBVOL_TIME_OUT;
#endif
volume_changed=1;
}
void subvol_vol_down()
{
if(current_channel == 0) //main vol
{
if(volum_list[0]>0)
volum_list[0] --;
}
else//channel vol
{
if(volum_list[current_channel]>0)
{
if((channel_vol_offset[current_channel-1])>0)
(channel_vol_offset[current_channel-1])--;
volum_list[current_channel] =GET_ABSOLUTE_VALUE(current_channel);
}
}
#ifdef SUPPORT_VFD_MESSAGE
set_vfd_message_state(VFD_MESSAGE_VOL,SUBVOL_TIME_OUT);
#else
subvol_time_out=SUBVOL_TIME_OUT;
#endif
volume_changed=1;
}
void polling_volume_change(void)
{
#ifdef I2C_MASS_DATA_POLLING_WRITE
if((volume_changed==1) && (NULL==p_i2c_mass_data))
#else
if(volume_changed==1)
#endif
{
if(current_channel == 0) //main vol
{
subvol_main_vol();
if(volum_list[0]>=MAIN_VOL_MAX)
{
psprintf(RegionValStr[REGION1], "VOLUME MAX");
}
else if (volum_list[0]<=0)
{
psprintf(RegionValStr[REGION1], "VOLUME MIN");
}
else
{
psprintf(RegionValStr[REGION1], "VOLUME %d",volum_list[0]);
}
PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
else//channel vol
{
subvol_channel_volume(current_channel, volum_list[current_channel]);
show_channel_msg();
PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
#ifdef SAVE_AMP_VOLUME
save_amp_variable(current_channel);
#endif
#if defined(USE_AMP_MUTE)&&defined(CHANGE_VOL_DEMUTE) //chenzhao20050926
user_amp_mute=0;
#endif//#ifdef USE_AMP_MUTE
volume_changed=0;
}
}
#ifdef USE_AMP_MUTE
//Master Volume Mute
//mute all channels simultaneously
//mute 1: mute 0: demute
void sub_masterMute(BYTE mute)
{
#ifdef SUPPORT_APOGEE_AMP
ddx_masterMute(mute);
#elif (defined(TAS_5508_PWM)||defined(TAS_5086_PWM))
#if 1
if(mute==AMP_MUTE)
{
printf("tass5508 unmute ....... \n");
#ifdef TAS_5508_PWM
#ifdef USE_TAS_5508_MUTE_REG
tas_5508_mute(CH_MASTER_MUTE_MASK);
#else
tas_5508_software_mute();
#endif
#elif defined(TAS_5086_PWM)
tas_5086_software_mute();
#endif
#ifndef MERGE_TEMP
subvol_restore_line_out();
#endif
#ifdef TLV320_DAC
use_tlv320_mute_headphone();
#endif
}
else
{
{
printf("tass5508 unmute ....... \n");
#ifdef TLV320_DAC
mute_tlv320_line_out(0); //unmute line out
#endif
#ifdef SUPPORT_AMP_IO_MUTE
amp_io_demute();
#endif
#ifdef USE_TAS_5508_MUTE_REG
tas_5508_mute(CH_MASTER_MUTE_MASK);
#else
subvol_main_vol();
#ifndef MERGE_TEMP
subvol_sub_vol();
#endif
#endif
#ifndef MERGE_TEMP
subvol_restore_line_out();
#endif
#ifdef SUPPORT_ACTIVE_SUBWOOFER
active_subvol_sub_vol();
#endif
}
}
#else
if(mute==AMP_MUTE)
tas_5508_mute(CH_MASTER_MUTE_MASK);
else
tas_5508_mute(0);
#endif
#endif
}
#endif
#ifdef SUPPORT_AMP_IO_MUTE//chenzhao20051205 for variable PWM processor.
inline void amp_io_mute(void)
{
#ifdef ROM_BUS_EXTENT_IO
#ifdef ORITRON_RECEIVER_6505
rom_bus_set_io(ROM_BUS_OUT_AMP_MUTE,0);
#else
rom_bus_set_io(ROM_BUS_OUT_AMP_MUTE,1);
#endif
#endif
}
inline void amp_io_demute(void)
{
#ifdef ROM_BUS_EXTENT_IO
#ifdef ORITRON_RECEIVER_6505
rom_bus_set_io(ROM_BUS_OUT_AMP_MUTE,1);
#else
rom_bus_set_io(ROM_BUS_OUT_AMP_MUTE,0);
#endif
#endif
}
#endif
#ifdef AMP_SUPPORT_EQ
const BYTE eq_str_id[EQ_MAX]={STR_OS_STANDARD,STR_OS_ROCK,STR_OS_POP,STR_OS_CLASSIC,STR_OS_JAZZ};
EQ_TYPE amp_eq=EQ_FLAT;
inline BYTE amp_set_eq(EQ_TYPE eq)
{
#if defined(TAS_5508_PWM)
return tas_5508_set_eq(eq);
#elif defined(SUPPORT_DDX8001)
ddx_Set_EQ(eq);
return 1;
#else
#amp_should_support_eq
#endif
}
void init_amp_eq(void)
{
amp_eq=EQ_FLAT;
amp_set_eq(amp_eq);
}
#ifdef I2C_MASS_DATA_POLLING_WRITE
void amp_toggle_EQ(void)
{
if(action_click)
{
EQ_TYPE temp=amp_eq;
amp_eq++;
if(amp_eq>=EQ_MAX)
amp_eq=EQ_FLAT;
if(! amp_set_eq(amp_eq))
amp_eq=temp;
}
PrintOsdMsg(eq_str_id[amp_eq], REGION1, 1, 0);
#ifdef SUPPORT_VFD_SHOW_TONE
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
#endif
#ifdef TREBLE_BASS_EQ_MENU_INTERFACE
amp_tone_mode = TONE_EQ;
#endif
}
#else
void amp_toggle_EQ(void)
{
//if(action_click)
{
#if defined(TAS_5508_PWM)
EQ_TYPE amp_eq_last=amp_eq;
if(amp_eq_last==EQ_FLAT)//to avoid pop noise when switch form flat to other.
{
sub_masterMute(AMP_MUTE);
delay_srv_10ms(10);
}
#endif
amp_eq++;
if(amp_eq>=EQ_MAX)
amp_eq=EQ_FLAT;
amp_set_eq(amp_eq);
#if defined(TAS_5508_PWM)
if(amp_eq_last==EQ_FLAT)
sub_masterMute(AMP_DEMUTE);
#endif
}
PrintOsdMsg(eq_str_id[amp_eq], REGION1, 1, 0);
#ifdef SUPPORT_VFD_SHOW_TONE
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
#endif
#ifdef TREBLE_BASS_EQ_MENU_INTERFACE
amp_tone_mode = TONE_EQ;
#endif
}
#endif//#ifdef I2C_MASS_DATA_POLLING_WRITE
#endif
#ifdef TREBLE_BASS_EQ_MENU_INTERFACE
void init_amp_tone_mode(void)
{
amp_tone_mode = TONE_IDLE;
current_channel=0;
}
void show_treble_bass_msg()
{
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, 2, 1);
}
BYTE call_ir_func_tone_menu(BYTE rx)
{
if(amp_tone_mode == TONE_IDLE)
return 0;
switch(rx)
{
case IRC_EQ: //TONE KEY
{
if(amp_tone_mode == TONE_EQ)
{
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
}
}
break;
case IRC_SELECT: //OK key
{
if(amp_tone_mode == TONE_EQ)
{
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
amp_tone_mode = TONE_BASS;
current_channel = VOL_CH_BASS; //for BASS Mode
show_channel_msg();
//show_treble_bass_msg();
}
}
break;
#ifdef EXIT_KEY
case IRC_EXIT: // setup/exit key
#else
case IRC_SETUP: // setup/exit key
#endif
{
if(amp_tone_mode != TONE_EQ)
{
amp_tone_mode = TONE_EQ;
PrintOsdMsg(eq_str_id[amp_eq], REGION1, 1, 0);
return 1;
}
}
break;
case IRC_UP:
{
if(amp_tone_mode != TONE_EQ && amp_tone_mode != TONE_IDLE)
{
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
if(amp_tone_mode == TONE_TREBLE)
current_channel = VOL_CH_TREBEL;
else
current_channel = VOL_CH_BASS;
//printf("joke: up key ,current_channel = %d ,vol= %d \n",current_channel,(channel_vol_offset[current_channel-1]));
if((channel_vol_offset[current_channel-1])<CH_VOL_MAX)
(channel_vol_offset[current_channel-1])++;
volum_list[current_channel] = GET_ABSOLUTE_VALUE(current_channel);
volume_changed=1;
//subvol_channel_volume(current_channel, volum_list[current_channel]);
//show_treble_bass_msg();
//PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
//#ifdef SAVE_AMP_VOLUME
//save_amp_variable(current_channel);
//#endif
}
}
break;
case IRC_DOWN:
{
if(amp_tone_mode != TONE_EQ && amp_tone_mode != TONE_IDLE)
{
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
if(amp_tone_mode == TONE_TREBLE)
current_channel = VOL_CH_TREBEL;
else
current_channel = VOL_CH_BASS;
//printf("joke:1 down key ,current_channel = %d ,vol= %d \n",current_channel,(channel_vol_offset[current_channel-1]));
//if((channel_vol_offset[current_channel-1])==0)
// break;
//printf("joke: down key ,current_channel = %d ,vol= %d \n",current_channel,(channel_vol_offset[current_channel-1]));
if((channel_vol_offset[current_channel-1])>0)
(channel_vol_offset[current_channel-1])--;
volum_list[current_channel] =GET_ABSOLUTE_VALUE(current_channel);
volume_changed=1;
//subvol_channel_volume(current_channel, volum_list[current_channel]);
//show_treble_bass_msg();
//PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
//#ifdef SAVE_AMP_VOLUME
//save_amp_variable(current_channel);
//#endif
}
}
break;
case IRC_LEFT:
{
if(amp_tone_mode!=TONE_EQ && amp_tone_mode != TONE_IDLE)
{
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
amp_tone_mode = amp_tone_mode - 1;
if(amp_tone_mode<TONE_BASS)
{
current_channel = VOL_CH_TREBEL; //for treble Mode
amp_tone_mode = TONE_TREBLE;
}
else
current_channel = VOL_CH_BASS; //for bass Mode
show_channel_msg();
}
}
break;
case IRC_RIGHT:
{
if(amp_tone_mode!=TONE_EQ && amp_tone_mode != TONE_IDLE)
{
set_vfd_message_state(VFD_MESSAGE_EQ,SUBVOL_TIME_OUT);
amp_tone_mode = amp_tone_mode + 1;
if(amp_tone_mode>=TONE_MAX)
{
current_channel = VOL_CH_BASS; //for bass Mode
amp_tone_mode = TONE_BASS;
}
else
current_channel = VOL_CH_TREBEL; //for treble Mode
show_channel_msg();
}
}
break;
}
if(amp_tone_mode == TONE_EQ || amp_tone_mode == TONE_IDLE)
return 0;
else
return 1;
}
#endif//#ifdef OP_TREBLE_BASS_OPER_INTERFACE
void init_amp(void)
{
#ifdef PT2258
init_pt2258();
#endif
#ifdef TLV320_DAC //chenzhao20060118
init_tlv320();
#endif
#ifdef TAS_5026_PWM
init_tas_5026();
#elif defined(TAS_5508_PWM)
init_tas_5508();
#elif defined(SUPPORT_APOGEE_AMP)
//disable external amplifier
ddx_disableEPAD();
//mute all channels
ddx_masterMute(1);
ddx_initialization();
ddx_masterMute(0);
ddx_enableEPAD();
#endif
#ifdef DOLBY_AMP_VOLUME_CTRL
init_subvol();
#endif
#ifdef AMP_SUPPORT_EQ
init_amp_eq();
#endif
#ifdef SUPPORT_EX_BASS_FUNC//chenzhao20060117
init_amp_exbass();
#endif
}
#ifdef SUPPORT_AMP_HEADPHONE//chenzhao 20060116
extern inline int AUDIF_Set_OutputMode(UINT8 outmode, UINT16 outparam);
extern void rom_ext_select_headphone(void);
void amp_enable_headphone(void)
{
if((cd_type_loaded==CDDVD)||(cd_subtype==CD_DTS))
AUDIF_Set_OutputMode(OUT_51DownmixL0R0,0); //downmix 5.1ch to FL FR channel hongfeng 2005-08-01
#ifdef SUPPORT_APOGEE_AMP
ddx_enable_headphone();
#endif
#ifdef TAS_5508_PWM
#ifdef USE_ROM_EXT_DET_HEADPHONE
//rom_ext_select_headphone();
tas_5508_enable_headphone();
#endif //USE_ROM_EXT_DET_HEADPHONE
#endif
}
void amp_disable_headphone(void)
{
if((cd_type_loaded==CDDVD)||(cd_subtype==CD_DTS))
AUDIF_Set_OutputMode(OUT_51Channel,0); //output 5.1ch hongfeng 2005-08-01
#ifdef SUPPORT_APOGEE_AMP
ddx_disable_headphone();
#endif
#ifdef TAS_5508_PWM
#ifdef USE_ROM_EXT_DET_HEADPHONE
//rom_ext_select_headphone();
tas_5508_disable_headphone();
#endif //USE_ROM_EXT_DET_HEADPHONE
#endif
}
#endif//#ifdef SUPPORT_HEADPHONE
//--------------------------------------------------------
//For Speaker Test Mapping Speaker in Amplifer
// chenzhao 20060116
//--------------------------------------------------------
#ifdef SUPPORT_TESTSPK
inline void amp_testspk_ch(BYTE ch)
{
#if defined(TAS_5508_PWM) || defined(TAS_5086_PWM)
{
if(ch>=4)
#ifdef TESTSPK_3CHANNEL //for dav6008 2.1 channel use hongfeng modify 2005-10-24
ch=ch-3;//kingslon add for 6008 pink noise
#else
ch=ch+2;
#endif
#ifdef USE_TAS_5508_MUTE_REG
tas_5508_mute((BYTE)(~(0x1<<ch))&0xcf);
#else
#if defined(TAS_5508_PWM)
tas_5508_mute_inputmixer(ch);
#elif defined(TAS_5086_PWM)
tas_5086_mute_inputmixer(ch);
#endif
#endif
}
#elif defined(SUPPORT_DDX8001)
ddx_test_spk(ch);
#endif
}
void amp_testspk_restore_ch(void)
{
#ifdef TAS_5508_PWM
init_tas_5508_input_mixer();
#elif defined(TAS_5086_PWM)
init_tas_5086_input_mixer();
#endif
}
#ifdef TESTSPK_CONTROL_VOL
void set_subvol_vol(BYTE channel,INT16 change)
{
if((channel_vol_offset[channel]+change>=0)&&(channel_vol_offset[channel]+change<=CH_VOL_MAX))
(channel_vol_offset[channel])+=change;
volum_list[channel+1] =GET_ABSOLUTE_VALUE(channel+1);
subvol_channel_volume(channel+1, volum_list[channel+1]);
#ifdef SAVE_AMP_VOLUME
save_amp_variable(channel+1);
#endif
}
inline INT16 get_subvol_vol(BYTE channel)
{
return (channel_vol_offset[channel]-CH_VOL_MAX/2);
}
#endif//#ifdef TESTSPK_CONTROL_VOL
#endif//#ifdef SUPPORT_TESTSPK
#ifdef SUPPORT_EX_BASS_FUNC//chenzhao 20060117
//================================================================
// subwoofer db | soft bass | balance bass | powerful bass |
//================================================================
// + 10 db | -- | +04 db | + 08 db |
// + 09 db | -- | +04 db | + 09 db |
// + 08 db | -- | +05 db | + 10 db |
// + 07 db | -- | +05 db | + 11 db |
// + 06 db | -- | +06 db | + 12 db |
// + 05 db | -- | +06 db | + 13 db |
// + 04 db | -- | +07 db | + 14 db |
// + 03 db | -- | +07 db | + 15 db |
// + 02 db | -- | +08 db | + 16 db |
// + 01 db | -- | +08 db | + 17 db |
// 00 ~ -10 db | -- | +09 db | + 18 db |
//================================================================
//comment: -- no change db |
//================================================================
BYTE sub_volue_tab[10]={8,8,7,7,6,6,5,5,4,4};
EXBASS_TYPE amp_exbass_mode;
BYTE GetExBassVolume(void)
{
BYTE sub_vloume=0,i;
if(amp_exbass_mode == EXBASS_SOFT)
sub_vloume = 0; //0db
else if(amp_exbass_mode == EXBASS_BALANCE)
{
if(GET_ABSOLUTE_VALUE(VOL_CH_SUB)<=MAIN_VOL_MAX) //subwoofer 0 db
{
#ifdef ORITRON_RECEIVER_6008
sub_vloume = 4; //+9db
#elif defined(ORITRON_RECEIVER_6505)
sub_vloume = 9; //+9db
#else
sub_vloume = 7; //+9db
#endif
}
else
{
i = (GET_ABSOLUTE_VALUE(VOL_CH_SUB)-MAIN_VOL_MAX);
if(i>=1 && i<=10)
sub_vloume = sub_volue_tab[i-1];
return sub_vloume; //+4db
}
}
else if(amp_exbass_mode == EXBASS_POWERFUL)
{
if(GET_ABSOLUTE_VALUE(VOL_CH_SUB)<=MAIN_VOL_MAX)
{
#ifdef ORITRON_RECEIVER_6008
sub_vloume = 8; //+18db
#elif defined(ORITRON_RECEIVER_6505)
sub_vloume = 18; //+18db
#else
sub_vloume = 14; //+18db
#endif
}
else
{
#if defined(ORITRON_RECEIVER_6505)
sub_vloume = (18 - (GET_ABSOLUTE_VALUE(VOL_CH_SUB)-MAIN_VOL_MAX));
#else
sub_vloume = (14 - (GET_ABSOLUTE_VALUE(VOL_CH_SUB)-MAIN_VOL_MAX));
#endif
}
}
//printf("GetExBassVolume %d,VOL_CH_SUB %d\n",sub_vloume,GET_ABSOLUTE_VALUE(VOL_CH_SUB));
return sub_vloume;
}
#ifdef SAVE_EX_BASS_MODE//chenzhao20060220
void reset_amp_exbass(void)
{
amp_exbass_mode = DEFAULT_EXBASS_MODE; //EXBASS_SOFT;
BYTE data=(BYTE)amp_exbass_mode;
WriteToI2c(I2C_ID_MEMORY, ADDR_EX_BASS_MODE,&data, 1);
}
#endif
void init_amp_exbass(void)
{
#ifdef SAVE_EX_BASS_MODE//chenzhao20060220
BYTE data;
if(ReadFromI2c(I2C_ID_MEMORY, ADDR_EX_BASS_MODE,&data, 1)>0)
amp_exbass_mode = data;
else
reset_amp_exbass();
#else
amp_exbass_mode = EXBASS_SOFT;
#endif
subvol_channel_volume(VOL_CH_SUB, volum_list[VOL_CH_SUB]);
}
#if defined(SUPPORT_TWO_MODE_EXBASS) //hongfeng add 2005-10-24
const char *amp_exbass_str[EXBASS_MAX]={"BASS ON","","BASS OFF",};
#elif defined(SUPPORT_THERE_MODE_EXBASS)
char *amp_exbass_str[EXBASS_MAX]={"SOFT BASS","BALANCE BASS","POWERFUL BASS",};
#else
#error should select a exbass mode.
#endif
void amp_toggle_ExBass(void)
{
if(action_click)
#ifdef I2C_MASS_DATA_POLLING_WRITE
if(NULL == p_i2c_mass_data)
#endif
{
#if defined(SUPPORT_TWO_MODE_EXBASS) //hongfeng add 2005-10-24
if(EXBASS_SOFT==amp_exbass_mode)
amp_exbass_mode = EXBASS_POWERFUL;
else
amp_exbass_mode = EXBASS_SOFT;
#elif defined(SUPPORT_THERE_MODE_EXBASS)
amp_exbass_mode ++;
if(amp_exbass_mode>=EXBASS_MAX)
amp_exbass_mode = EXBASS_SOFT;
#else
#error should select a exbass mode.
#endif
subvol_channel_volume(VOL_CH_SUB, volum_list[VOL_CH_SUB]);
#ifdef AUDIO_EFFECT_MUTE
set_audio_effect_mute_time(AUDIO_EFFECT_MUTE_TIME);
sub_masterMute(AMP_MUTE);
#endif
#ifdef SAVE_EX_BASS_MODE//chenzhao20060220
BYTE data=(BYTE)amp_exbass_mode;
WriteToI2c(I2C_ID_MEMORY, ADDR_EX_BASS_MODE,&data, 1);
#endif
}
show_exbass_msg();
#ifdef SUPPORT_VFD_SHOW_EXBASS
set_vfd_message_state(VFD_MESSAGE_EXBASS,SUBVOL_TIME_OUT);
#endif
}
void show_exbass_msg(void)
{
psprintf(RegionValStr[REGION1], amp_exbass_str[amp_exbass_mode]);
PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
#endif
//******************************************************
//wuzhj 2004/12/10
//for Radio new UI vol control
// Radio_vol_up();Radio_vol_down();Radio_main_vol()
//******************************************************
#ifdef SUPPORT_Radio_NEW_UI //wuzhj 2004/12/10
void Radio_vol_up()
{
BYTE ch;
if(current_channel == 0) //main vol
{
/*check if reach max,according to DOLBY's spec*/
for(ch = 0;ch <7;ch ++)
{
if (volum_list[ch]>=(MAIN_VOL_MAX-1))
{
return;
}
}
volum_list[0] ++;
subvol_main_vol();
psprintf(RegionValStr[REGION1], " MAIN %d",volum_list[0]);
//PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
//osd_DrawString(18+8, 2-2, RegionValStr[REGION1], 2, 11);
}
else//channel vol
{
subvol_time_out = SUBVOL_TIME_OUT;
volum_list[current_channel] = GET_ABSOLUTE_VALUE(current_channel);
if(volum_list[current_channel]>=(MAIN_VOL_MAX-1))
{
return;
}
if((channel_vol_offset[current_channel-1])<CH_VOL_MAX)
(channel_vol_offset[current_channel-1])++;
subvol_channel_volume(current_channel, volum_list[current_channel]);
show_channel_msg();
//PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
#ifdef SAVE_AMP_VOLUME
save_amp_variable(current_channel);
#endif
}
void Radio_vol_down()
{
if(current_channel == 0) //main vol
{
if(volum_list[0]>0)
volum_list[0] --;
subvol_main_vol();
psprintf(RegionValStr[REGION1], " MAIN %d",volum_list[0]);
//PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
else//channel vol
{
subvol_time_out = SUBVOL_TIME_OUT;
volum_list[current_channel] =GET_ABSOLUTE_VALUE(current_channel);
if(volum_list[current_channel]==0)
{
return;
}
if((channel_vol_offset[current_channel-1])>0)
(channel_vol_offset[current_channel-1])--;
subvol_channel_volume(current_channel, volum_list[current_channel]);
show_channel_msg();
PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
}
#ifdef SAVE_AMP_VOLUME
save_amp_variable(current_channel);
#endif
}
void Radio_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]);
}
psprintf(RegionValStr[REGION1], " MAIN %d",volum_list[0]);
}
#endif//#ifdef SUPPORT_Radio_NEW_UI //wuzhj 2004/12/10
#endif //defined(TDA7448)||defined(PT2258)