Пример #1
0
ssize_t FMDirPlaySysfs_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t count)
{
   	//int i=0;
	
	
	if(5!= sscanf(buf, "%d %d %d %d %d",&sgFMDirectPlayValues[0], &sgFMDirectPlayValues[1], &sgFMDirectPlayValues[2], &sgFMDirectPlayValues[3], &sgFMDirectPlayValues[4]))
	{
	
		DEBUG("\n<-FMDirectPlay SysFS Handler: On_Off=%d OpMode=%d, samplerate=%d, channel=%d, volume=%d \n",  sgFMDirectPlayValues[0],
											sgFMDirectPlayValues[1],
											sgFMDirectPlayValues[2],
											sgFMDirectPlayValues[3],
											sgFMDirectPlayValues[4]);
		DEBUG("error reading buf=%s count=%d\n", buf, count);
		return count;
	}
        DEBUG("\n<-FMDirectPlay SysFS Handler: On_Off=%d OpMode=%d, samplerate=%d, channel=%d, volume=%d \n",  sgFMDirectPlayValues[0],
											sgFMDirectPlayValues[1],
											samplerate_tbl[sgFMDirectPlayValues[2]],
											FM_chmode[sgFMDirectPlayValues[3]],
											sgFMDirectPlayValues[4]);

#ifdef FM_ENABLE_SYSFS_INTERFACE
	if(sgFMDirectPlayValues[0]) 		// enable path
	{
		if ( FMIsOn == 0 )
		{
			AUDCTRL_SaveAudioModeFlag((AUDCTRL_SPEAKER_t)sgFMDirectPlayValues[1],AUDIO_APP_FM);
			AUDCTRL_EnablePlay(AUDIO_HW_I2S_IN,
					   AUDIO_HW_AUDIO_OUT,
					   AUDIO_HW_NONE,
					   (AUDCTRL_SPEAKER_t)sgFMDirectPlayValues[1],
					   (AUDIO_CHANNEL_NUM_t)FM_chmode[sgFMDirectPlayValues[3]],
					   samplerate_tbl[sgFMDirectPlayValues[2]]
				          );
			FMIsOn = 1;
		}
		AUDCTRL_SetPlayVolume(AUDIO_HW_AUDIO_OUT,
				      (AUDCTRL_SPEAKER_t)sgFMDirectPlayValues[1],
				      AUDIO_GAIN_FORMAT_FM_RADIO_DIGITAL_VOLUME_TABLE,
				      sgFMDirectPlayValues[4],
				      sgFMDirectPlayValues[4]
				);
	}
	else								//disable path
	{
		if ( FMIsOn )
		{
			AUDCTRL_DisablePlay(AUDIO_HW_I2S_IN,
				            AUDIO_HW_AUDIO_OUT,
					    (AUDCTRL_SPEAKER_t)sgFMDirectPlayValues[1]
					   );
			FMIsOn = 0;
		}
	}
#endif //FM_ENABLE_SYSFS_INTERFACE
	return count;
     
}
Пример #2
0
//*****************************************************************
// Functiona Name: SetControlItem
//
// Description: Set control item, will set hardware if value changed.
//
//*****************************************************************
static int SetControlItem(
	struct snd_kcontrol * kcontrol,
	struct snd_ctl_elem_value * ucontrol
)
{
	int changed = 0;
    int vol = 0;
    int mute = 0;

    audio_init();
	//DEBUG("\n%lx:SetControlItem",jiffies);

	if(kcontrol->private_value>=0 && kcontrol->private_value<BRCM_CTL_TOTAL)
	{
		if(!(kcontrol->private_value&1))//volume
		{
			DEBUG("\n%lx:SetControlItem [%s]=%d",jiffies, gpstrCtrlName[kcontrol->private_value], (int)ucontrol->value.integer.value[0]);
			if((gCurPath != kcontrol->private_value) && (BRCM_CTL_Mic_Capture_Volume!=kcontrol->private_value)) //gCurPath is for playback only
			{
				//Enable path with volume
				DEBUG("\n%lx:SetControlItem path = %d changed to %d\n",jiffies, (int)gCurPath, (int)kcontrol->private_value);
				sgBrcmCtrlVal[kcontrol->private_value] = ucontrol->value.integer.value[0] ;
				changed=1;
				gCurPath = kcontrol->private_value;
			}

			if(sgBrcmCtrlVal[kcontrol->private_value] != ucontrol->value.integer.value[0] )
			{
				sgBrcmCtrlVal[kcontrol->private_value] = ucontrol->value.integer.value[0] ;
//				audvoc_configure_Volume(0, 0x1FF) ;
				changed=1;
			}
			DEBUG("SetControlItem: sgBrcmCtrlVal[%d] = %d\n", kcontrol->private_value, sgBrcmCtrlVal[kcontrol->private_value] );
		}
		else //mute
		{
			DEBUG("\n%lx:mute SetControlItem [%s]=%d",jiffies, gpstrCtrlName[kcontrol->private_value], (int)ucontrol->value.integer.value[0]);

			//if(sgBrcmCtrlVal[kcontrol->private_value] != ucontrol->value.integer.value[0] )
			{
				sgBrcmCtrlVal[kcontrol->private_value] = ucontrol->value.integer.value[0] ;
				changed=1;
			}
		}

		if(changed)
		{
            
			DEBUG("\n SET SetControlItem [%s]=%d", gpstrCtrlName[kcontrol->private_value], (int)ucontrol->value.integer.value[0]);

	        switch(kcontrol->private_value)
			{
				case BRCM_CTL_EAR_Playback_Volume:
                    {
                        vol = (int)ucontrol->value.integer.value[0];						

                        // ensure that it is not completely muted at the minimum volume level
                        if(vol > 5)
                            vol = 5;
                        AUDCTRL_SetPlayVolume(AUDIO_HW_VOICE_OUT,AUDCTRL_SPK_HANDSET,AUDIO_GAIN_FORMAT_DSP_VOICE_VOL_GAIN,vol,vol);
							
                    }
                    break;
	
		case BRCM_CTL_Speaker_Playback_Volume:
			{ 
				unsigned int vol;
   				vol = (int)ucontrol->value.integer.value[0];

				if (vol == 0) {
					vol = AUDIO_VOLUME_FM_MUTE;  // for mute case send 0xff to distinguish from other values.
				}	
				else {
                                    vol = vol -1;  // volume range is converted from 15-1 to 14-0
				}	
			
				//if we are to set volume for FM app then apply FM app gain table
                      		AUDCTRL_SetPlayVolume(AUDIO_HW_AUDIO_OUT,AUDCTRL_SPK_LOUDSPK,
                      					 AUDIO_GAIN_FORMAT_FM_RADIO_DIGITAL_VOLUME_TABLE,
				      				vol,
				      				vol);
				DEBUG("Set FM Play vol to %d\n",vol);
			}
                    break;

		case BRCM_CTL_Mic_Capture_Mute:
                    {
                        mute = (int)ucontrol->value.integer.value[0];

                        AUDCTRL_SetTelephonyMicMute(AUDIO_HW_VOICE_OUT,AUDCTRL_MIC_MAIN,mute);
                    }
                	break;
	    case BRCM_CTL_ROUTE:
            {   
                BRCM_AUDIO_Param_Route_t parm_route;

                parm_route.command = (int)ucontrol->value.integer.value[0];
                parm_route.speaker = (int)ucontrol->value.integer.value[1];
                // Send the route command
                AUDIO_Ctrl_Trigger(ACTON_ROUTE,&parm_route,NULL,0);
            }
            break;
	
      			
                default:
                    break;
            }

		}


	}


	
	return changed;
}
void AUDIO_Ctrl_Process(
	BRCM_AUDIO_ACTION_en_t action_code,
	void *arg_param,
	void *callback,
    int  block
	)
{
   	TMsgAudioCtrl	msgAudioCtrl;
	unsigned int	len;
	AUDIO_DRIVER_TYPE_t drv_type;
    UInt32 app_profile = 0 ;
	static AudioApp_t prev_app_profile = 0;
	static AudioMode_t prev_mode_profile = 0;
	static bool mode_restore = FALSE;

	if(arg_param == NULL)
	{
		DEBUG("AUDIO_Ctrl_Process: arg_param is NULL \n");
		return;
	}
    switch (action_code)
    {
        case ACTION_AUD_StartPlay:
        {
            BRCM_AUDIO_Param_Start_t* param_start = (BRCM_AUDIO_Param_Start_t*) arg_param;
            
		//20110905 	//prev_app_profile = AUDDRV_GetAudioApp();
            app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_MUSIC);

            AUDIO_DRIVER_Ctrl(param_start->drv_handle,AUDIO_DRIVER_START,NULL);

            AUDIO_DRIVER_Ctrl(param_start->drv_handle,AUDIO_DRIVER_GET_DRV_TYPE,(void*)&drv_type);

            if (AUDIO_Policy_GetState() == BRCM_STATE_INCALL)
            {
                DEBUG("Play Music During Voice call \n");
                musicduringcall = TRUE;
                if ( sgTableIDChannelOfDev[param_start->substream_number].speaker == AUDCTRL_SPK_HEADSET ||
                     sgTableIDChannelOfDev[param_start->substream_number].speaker == AUDCTRL_SPK_BTM )
                {
                    DEBUG("Play Music During Voice call to HEADSET or BTM\n");
                    if ( app_profile == AUDIO_APP_VOICE_CALL )
                    {
                        DEBUG(" Play music during Voice call with BT Tap at 8k \r\n");
                        AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_BTM, 8000);
                    }
                    else
                    {
                        DEBUG(" Play music during Voice call with BT Tap at 16k \r\n");
                        if ( sgTableIDChannelOfDev[param_start->substream_number].speaker == AUDCTRL_SPK_BTM )
                        {
                            AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_BTM, 8000);
                        }
                        else
                        {
                            AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_BTM, 16000);
                        }
                    }

                    AUDCTRL_EnablePlay(AUDIO_HW_NONE,
                                       sgTableIDChannelOfDev[param_start->substream_number].hw_id,
                                       AUDIO_HW_TAP_VOICE,
                                       AUDCTRL_SPK_BTM,
                                       param_start->channels,
                                       param_start->rate
                                      );
                }
                else
                {
                    DEBUG("Play Music During Voice call to HANDSET or LOUDSPEAKER\n");
                    if ( app_profile == AUDIO_APP_VOICE_CALL )
                    {
                        DEBUG(" Play music during Voice call with BT Tap at 8k \r\n");
                        AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_HEADSET, 8000);
                    }
                    else
                    {
                        DEBUG(" Play music during Voice call with BT Tap at 16k \r\n");
                        AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_HEADSET, 16000);
                    }

                    AUDCTRL_EnablePlay(AUDIO_HW_NONE,
                                       sgTableIDChannelOfDev[param_start->substream_number].hw_id,
                                       AUDIO_HW_TAP_VOICE,
                                       AUDCTRL_SPK_HEADSET,
                                       param_start->channels,
                                       param_start->rate
                                      );
                }
            }
            else
            {
               	AUDCTRL_SaveAudioModeFlag( sgTableIDChannelOfDev[param_start->substream_number].speaker,app_profile);
            
                if( sgTableIDChannelOfDev[param_start->substream_number].speaker == AUDCTRL_SPK_BTM )
                {
                    AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, sgTableIDChannelOfDev[param_start->substream_number].speaker, 8000);

                    // Enable the playback the path
                    AUDCTRL_EnablePlay(AUDIO_HW_NONE,
                                       sgTableIDChannelOfDev[param_start->substream_number].hw_id,
                                       AUDIO_HW_TAP_VOICE,
                                       sgTableIDChannelOfDev[param_start->substream_number].speaker,
                                       param_start->channels,
                                       param_start->rate
				      );
                }
                else
                {
                    // Enable the playback the path
                    AUDCTRL_EnablePlay(AUDIO_HW_NONE,
                                       sgTableIDChannelOfDev[param_start->substream_number].hw_id,
                                       AUDIO_HW_NONE,
                                       sgTableIDChannelOfDev[param_start->substream_number].speaker,
                                       param_start->channels,
                                       param_start->rate
                                      );

                    //if (param_start->substream_number == 5)  // Ring case
                    if(extra_speaker)
                    {
                        DEBUG("Play to speaker as well \n");
                        AUDCTRL_AddPlaySpk(sgTableIDChannelOfDev[param_start->substream_number].hw_id, //		AUDIO_HW_ID_t			sink,
                                           AUDCTRL_SPK_LOUDSPK                 //          AUDCTRL_SPEAKER_t		spk
                                          );
                    }
                }
            }

            // set the slopgain register to max value
            AUDCTRL_SetPlayVolume(sgTableIDChannelOfDev[param_start->substream_number].hw_id,
                                  sgTableIDChannelOfDev[param_start->substream_number].speaker,
                                  AUDIO_GAIN_FORMAT_VOL_LEVEL,
                                  AUDIO_VOLUME_MAX,
                                  AUDIO_VOLUME_MAX
                                 );

            // start DMA now
            AUDIO_DRIVER_Ctrl(param_start->drv_handle,AUDIO_DRIVER_RESUME,NULL);

            playback_prev_time = 0;
            playback_triggered = 1;

        }
        break;
        case ACTION_AUD_StopPlay:
        {
            BRCM_AUDIO_Param_Stop_t* param_stop = (BRCM_AUDIO_Param_Stop_t*) arg_param;

            // stop DMA first
            AUDIO_DRIVER_Ctrl(param_stop->drv_handle,AUDIO_DRIVER_PAUSE,NULL);

            AUDIO_DRIVER_Ctrl(param_stop->drv_handle,AUDIO_DRIVER_GET_DRV_TYPE,(void*)&drv_type);
            //if (param_stop->substream_number == 5)  // Ring case
            if(extra_speaker)
            {
		            DEBUG(" REMOVING  LOUDSPK  \n");				  
                    AUDCTRL_RemovePlaySpk(sgTableIDChannelOfDev[param_stop->substream_number].hw_id, //		AUDIO_HW_ID_t			sink,
									  AUDCTRL_SPK_LOUDSPK				  //		  AUDCTRL_SPEAKER_t 	spk
                    );
            }

		//20110905	//AUDCTRL_SaveAudioModeFlag( AUDDRV_GetAudioMode(), prev_app_profile );

            //disable the playback path
            if (AUDIO_Policy_GetState() == BRCM_STATE_INCALL)
            {
                musicduringcall = FALSE;
                if ( sgTableIDChannelOfDev[param_stop->substream_number].speaker == AUDCTRL_SPK_HEADSET ||
                     sgTableIDChannelOfDev[param_stop->substream_number].speaker == AUDCTRL_SPK_BTM )
                {
                    AUDCTRL_DisablePlay(AUDIO_HW_NONE,
                                        sgTableIDChannelOfDev[param_stop->substream_number].hw_id,
                                        AUDCTRL_SPK_BTM
                                       );
                }
                else
                {
                    AUDCTRL_DisablePlay(AUDIO_HW_NONE,
                                        sgTableIDChannelOfDev[param_stop->substream_number].hw_id,
                                        AUDCTRL_SPK_HEADSET
                                       );
                }
                AUDCTRL_DisableTap (AUDIO_HW_TAP_VOICE);
            }
            else
            {
                if( sgTableIDChannelOfDev[param_stop->substream_number].speaker == AUDCTRL_SPK_BTM )
                {
                    AUDCTRL_DisablePlay(AUDIO_HW_NONE,
                                        sgTableIDChannelOfDev[param_stop->substream_number].hw_id,
                                        sgTableIDChannelOfDev[param_stop->substream_number].speaker
                                       );

                    AUDCTRL_DisableTap (AUDIO_HW_TAP_VOICE);
                }
                else
                {
                    AUDCTRL_DisablePlay(AUDIO_HW_NONE,
                                        sgTableIDChannelOfDev[param_stop->substream_number].hw_id,
                                        sgTableIDChannelOfDev[param_stop->substream_number].speaker
                                       );
                }
            }
            AUDIO_DRIVER_Ctrl(param_stop->drv_handle,AUDIO_DRIVER_STOP,NULL);

            playback_prev_time = 0;
            playback_triggered = 0;

            

        }
        break;
        case ACTION_AUD_PausePlay:
        {
            BRCM_AUDIO_Param_Pause_t* param_pause = (BRCM_AUDIO_Param_Pause_t*) arg_param;

            AUDIO_DRIVER_Ctrl(param_pause->drv_handle,AUDIO_DRIVER_GET_DRV_TYPE,(void*)&drv_type);

            //disable the playback path
             AUDCTRL_DisablePlay(AUDIO_HW_NONE,
                        sgTableIDChannelOfDev[param_pause->substream_number].hw_id,
                        sgTableIDChannelOfDev[param_pause->substream_number].speaker
                    );

            if( sgTableIDChannelOfDev[param_pause->substream_number].speaker == AUDCTRL_SPK_BTM )
            {
                AUDCTRL_DisableTap (AUDIO_HW_TAP_VOICE);
            }
            AUDIO_DRIVER_Ctrl(param_pause->drv_handle,AUDIO_DRIVER_PAUSE,NULL);
        }
        break;

        case ACTION_AUD_ResumePlay:
        {
            BRCM_AUDIO_Param_Resume_t* param_resume = (BRCM_AUDIO_Param_Resume_t*) arg_param;

            AUDIO_DRIVER_Ctrl(param_resume->drv_handle,AUDIO_DRIVER_GET_DRV_TYPE,(void*)&drv_type);

            AUDIO_DRIVER_Ctrl(param_resume->drv_handle,AUDIO_DRIVER_RESUME,NULL);

            if( sgTableIDChannelOfDev[param_resume->substream_number].speaker == AUDCTRL_SPK_BTM )
            {
                AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, sgTableIDChannelOfDev[param_resume->substream_number].speaker, param_resume->rate);

                // Enable the playback the path
                AUDCTRL_EnablePlay(AUDIO_HW_NONE,
                                   sgTableIDChannelOfDev[param_resume->substream_number].hw_id,
                                   AUDIO_HW_TAP_VOICE,
                                   sgTableIDChannelOfDev[param_resume->substream_number].speaker,
				                   param_resume->channels,
                                   param_resume->rate
				    );
            }
            else
            {
                // Enable the playback the path
                AUDCTRL_EnablePlay(AUDIO_HW_NONE,
                                   sgTableIDChannelOfDev[param_resume->substream_number].hw_id,
                                   AUDIO_HW_NONE,
                                   sgTableIDChannelOfDev[param_resume->substream_number].speaker,
				                   param_resume->channels,
                                   param_resume->rate
				    );
            }
        }
        break;
        case ACTION_AUD_StartRecord:
        {
            AudioApp_t app_prof = AUDIO_APP_RECORDING;
            AudioMode_t  new_mode = AUDIO_MODE_SPEAKERPHONE;
            AudioMode_t cur_mode;

            BRCM_AUDIO_Param_Start_t* param_start = (BRCM_AUDIO_Param_Start_t*) arg_param;
            DEBUG("ACTION_AUD_StartRecord : param_start->substream_number -  %d \n",param_start->substream_number);

			prev_app_profile = AUDDRV_GetAudioApp();
            cur_mode = AUDCTRL_GetAudioMode();

            if ( cur_mode >= AUDIO_MODE_NUMBER )
                cur_mode = (AudioMode_t) (cur_mode - AUDIO_MODE_NUMBER);

            if (param_start->substream_number == 6 || param_start->substream_number == 7) // record request with Google voice search profile
			{
                app_prof = AUDIO_APP_RECORDING_GVS;
				mode_restore = TRUE;
				prev_mode_profile = cur_mode;
				DEBUG("ACTION_AUD_StartRecord : [%d, %d]", prev_app_profile, prev_mode_profile);
			}

            if (param_start->substream_number == 9 || param_start->substream_number == 10) // record request with voip profile
            {
				app_prof = AUDIO_APP_VOIP;
                new_mode = cur_mode; // use current mode based on earpiece or speaker
            }
            
            if (param_start->substream_number == 11 || param_start->substream_number == 12) // record request with voip incomm profile
            {
				app_prof = AUDIO_APP_VOIP_INCOMM;
                new_mode = cur_mode; // use current mode based on earpiece or speaker
            }

            if (param_start->substream_number == 1 || param_start->substream_number == 7  || param_start->substream_number == 8 
                || param_start->substream_number == 10 || param_start->substream_number == 12) // record request with auxilary mic
                new_mode = AUDIO_MODE_HEADSET;

            app_profile = AUDIO_Policy_Get_Profile(app_prof);
            new_mode = AUDIO_Policy_Get_Mode(new_mode);
            AUDCTRL_SaveAudioModeFlag(new_mode,app_profile);

            AUDCTRL_EnableRecord(sgTableIDChannelOfCaptDev[param_start->substream_number].hw_id,
				                     AUDIO_HW_NONE,
                                     sgTableIDChannelOfCaptDev[param_start->substream_number].mic,
				                     param_start->channels,
                                     param_start->rate);

            AUDIO_DRIVER_Ctrl(param_start->drv_handle,AUDIO_DRIVER_START,NULL);

             AUDIO_Policy_SetState(BRCM_STATE_RECORD);

        }
        break;
        case ACTION_AUD_StopRecord:
        {
            BRCM_AUDIO_Param_Stop_t* param_stop = (BRCM_AUDIO_Param_Stop_t*) arg_param;
               
            AUDIO_DRIVER_Ctrl(param_stop->drv_handle,AUDIO_DRIVER_STOP,NULL);

			if (mode_restore)
			{
				mode_restore = FALSE;
				AUDCTRL_SaveAudioModeFlag( prev_mode_profile, prev_app_profile );
				DEBUG("ACTION_AUD_StartRecord : [%d, %d]", prev_app_profile, prev_mode_profile);
			}
			else
			{
				AUDCTRL_SaveAudioModeFlag( AUDDRV_GetAudioMode(), prev_app_profile );
			}

            AUDCTRL_DisableRecord(sgTableIDChannelOfCaptDev[param_stop->substream_number].hw_id,
                                      AUDIO_HW_NONE,
                                      sgTableIDChannelOfCaptDev[param_stop->substream_number].mic);

            AUDIO_Policy_RestoreState();

        }
	break;
        case ACTION_AUD_OpenPlay:
        {
            BRCM_AUDIO_Param_Open_t* param_open = (BRCM_AUDIO_Param_Open_t*) arg_param;

            param_open->drv_handle = AUDIO_DRIVER_Open(sgTableIDChannelOfDev[param_open->substream_number].drv_type);

            DEBUG("param_open->drv_handle -  0x%x \n",param_open->drv_handle);

        }
        break;
        case ACTION_AUD_ClosePlay:
        {
            BRCM_AUDIO_Param_Close_t* param_close = (BRCM_AUDIO_Param_Close_t*) arg_param;

            DEBUG("param_close->drv_handle -  0x%x \n",param_close->drv_handle);

            AUDIO_DRIVER_Close(param_close->drv_handle);

        }
        break;

	case ACTION_AUD_OpenRecord:
        {
            BRCM_AUDIO_Param_Open_t* param_open = (BRCM_AUDIO_Param_Open_t*) arg_param;

            param_open->drv_handle = AUDIO_DRIVER_Open(sgTableIDChannelOfCaptDev[param_open->substream_number].drv_type);

            DEBUG("param_open->drv_handle -  0x%x \n",param_open->drv_handle);

        }
        break;

        case ACTION_AUD_CloseRecord:
        {
            BRCM_AUDIO_Param_Close_t* param_close = (BRCM_AUDIO_Param_Close_t*) arg_param;

            DEBUG("param_close->drv_handle -  0x%x \n",param_close->drv_handle);

            AUDIO_DRIVER_Close(param_close->drv_handle);

        }
        break;


        case ACTON_VOICECALL_START:
        {
            BRCM_VOICE_Param_Start_t* param_voice_start = (BRCM_VOICE_Param_Start_t*)arg_param;
            int vol_level;

            telephony_stream_number = param_voice_start->substream_number;

            if ( telephony_codecId == 10 )
            {
                DEBUG("Enable telephony WB Call \r\n");
                app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_VOICE_CALL_WB);
                AUDCTRL_SaveAudioModeFlag( sgTableIDChannelOfVoiceCallDev[telephony_stream_number-VOICE_CALL_SUB_DEVICE].speaker + AUDIO_MODE_NUMBER,app_profile);
            }
            else if ( telephony_codecId == 6 )
            {
                DEBUG("Enable telephony NB Call \r\n");
                app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_VOICE_CALL);
                AUDCTRL_SaveAudioModeFlag( sgTableIDChannelOfVoiceCallDev[telephony_stream_number-VOICE_CALL_SUB_DEVICE].speaker,app_profile);
            }
            else
            {
                DEBUG("Enable telephony Invalid Codec : Setting as NB \r\n");
                app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_VOICE_CALL);
                AUDCTRL_SaveAudioModeFlag( sgTableIDChannelOfVoiceCallDev[telephony_stream_number-VOICE_CALL_SUB_DEVICE].speaker,app_profile);
            }

            if ( (telephony_stream_number-VOICE_CALL_SUB_DEVICE) == 4 )
            {
		if ( telephony_codecId == 10 )
            	{
                	DEBUG("Enable telephony WB Call for BT NREC \r\n");
                	app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_VOICE_CALL_WB);
                	AUDCTRL_SaveAudioModeFlag(AUDCTRL_SPK_HANDSFREE, app_profile);
            	}
            	else if ( telephony_codecId == 6 )
            	{
                	DEBUG("Enable telephony NB Call BT NREC \r\n");
                	app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_VOICE_CALL);
                	AUDCTRL_SaveAudioModeFlag(AUDCTRL_SPK_HANDSFREE, app_profile);
            	}

                DEBUG(" Telephony : Turning Off EC and NS \r\n");
                //AUDCTRL_EC(FALSE, 0);
                //AUDCTRL_NS(FALSE);
            }
            else
            {
                DEBUG(" Telephony : Turning On EC and NS \r\n");
                //AUDCTRL_EC(TRUE, 0);
                //AUDCTRL_NS(TRUE);
            }

            vol_level= GetCtrlValue(BRCM_CTL_EAR_Playback_Volume);
            if(vol_level > 5)
                vol_level = 5;
            AUDCTRL_SetPlayVolume(AUDIO_HW_VOICE_OUT,AUDCTRL_SPK_HANDSET,AUDIO_GAIN_FORMAT_DSP_VOICE_VOL_GAIN,vol_level,vol_level);

            AUDCTRL_RateChangeTelephony();
            AUDCTRL_EnableTelephony(AUDIO_HW_VOICE_IN,AUDIO_HW_VOICE_OUT,sgTableIDChannelOfVoiceCallDev[telephony_stream_number-VOICE_CALL_SUB_DEVICE].mic,sgTableIDChannelOfVoiceCallDev[telephony_stream_number-VOICE_CALL_SUB_DEVICE].speaker);
            telephony_started = 1;

	        if(TRUE==GetCtrlValue(BRCM_CTL_Mic_Capture_Mute))
            {
                DEBUG("Muting device \r\n");
			    AUDCTRL_SetTelephonyMicMute(AUDIO_HW_VOICE_OUT,AUDCTRL_MIC_MAIN,TRUE);;
            }
            AUDIO_Policy_SetState(BRCM_STATE_INCALL);


        }
        break;

        case ACTON_VOICECALL_STOP:
        {
            BRCM_VOICE_Param_Stop_t* param_voice_stop = (BRCM_VOICE_Param_Stop_t*)arg_param;

            telephony_stream_number = param_voice_stop->substream_number;

            DEBUG("DISABLE TELEPHONY substream = %d \r\n", telephony_stream_number);
            AUDCTRL_DisableTelephony(AUDIO_HW_VOICE_IN,AUDIO_HW_VOICE_OUT,sgTableIDChannelOfVoiceCallDev[telephony_stream_number-VOICE_CALL_SUB_DEVICE].mic,sgTableIDChannelOfVoiceCallDev[telephony_stream_number-VOICE_CALL_SUB_DEVICE].speaker);
            telephony_started = 0;
             AUDIO_Policy_RestoreState();
        }
        break;

        case ACTON_VOICECALL_UPDATE:
        {
            int local_sub_stream_number = 0;
            BRCM_VOICE_Param_Update_t* param_voice_update = (BRCM_VOICE_Param_Update_t*)arg_param;

            DEBUG("TELEPHONY UPDATE codecId = %d \r\n", param_voice_update->voicecall_codecId);

            if ( telephony_codecId != param_voice_update->voicecall_codecId )
            {
                telephony_codecId = param_voice_update->voicecall_codecId;

                if (telephony_started)
                {
                    if ( telephony_codecId == 10 )
                    {
                        app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_VOICE_CALL_WB);
                        DEBUG("call_CodedId_hander : changing Mode to AMR-WB ===>\r\n");
                        AUDCTRL_SaveAudioModeFlag( sgTableIDChannelOfVoiceCallDev[telephony_stream_number - VOICE_CALL_SUB_DEVICE].speaker + AUDIO_MODE_NUMBER,app_profile);
                        DEBUG("call_CodedId_hander : changing Mode to AMR-WB <===\r\n");
                    }
                    else
                    {
                        app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_VOICE_CALL);
                        DEBUG("call_CodedId_hander : changing Mode to AMR-NB ===>\r\n");
                        AUDCTRL_SaveAudioModeFlag( sgTableIDChannelOfVoiceCallDev[telephony_stream_number - VOICE_CALL_SUB_DEVICE].speaker,app_profile );
                        DEBUG("call_CodedId_hander : changing Mode to AMR-NB <===\r\n");
                    }
                    DEBUG("call_CodedId_hander : AUDCTRL_RateChangeTelephony ===>\r\n");
                    if ( musicduringcall == TRUE )
                    {
                        local_sub_stream_number = (telephony_stream_number - VOICE_CALL_SUB_DEVICE)*2;
                        // wired headphone
                        if(telephony_stream_number == 17)
                        {
                            // set the substream number to same as headset
                            local_sub_stream_number = 4;
                        }

                        AUDCTRL_DisableTap (AUDIO_HW_TAP_VOICE);
                        if ( app_profile == AUDIO_APP_VOICE_CALL )
                        {
                            
                            AUDCTRL_RateChangeTelephony();
                            if( sgTableIDChannelOfDev[local_sub_stream_number].speaker == AUDCTRL_SPK_HEADSET ||
                                sgTableIDChannelOfDev[local_sub_stream_number].speaker == AUDCTRL_SPK_BTM )
                            {
                                AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_BTM, 8000);
                            }
                            else
                            {
                                AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_HEADSET, 8000);
                            }
                        }
                        else
                        {
                            AUDCTRL_RateChangeTelephony();
                            if( sgTableIDChannelOfDev[local_sub_stream_number].speaker == AUDCTRL_SPK_HEADSET )
                            {
                                AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_BTM, 16000);
                            }
                            else if ( sgTableIDChannelOfDev[local_sub_stream_number].speaker == AUDCTRL_SPK_BTM )
                            {
                                AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_BTM, 8000);
                            }
                            else
                            {
                                AUDCTRL_EnableTap (AUDIO_HW_TAP_VOICE, AUDCTRL_SPK_HEADSET, 16000);
                            }
                        }
                    }
                    else
                    {
                        AUDCTRL_RateChangeTelephony();
                    }
                    DEBUG("call_CodedId_hander : AUDCTRL_RateChangeTelephony <===\r\n");
                }
            }
        }
        break;
		
        case ACTON_FM_START:
        {
	    BRCM_FM_Param_Start_t* param_start = (BRCM_FM_Param_Start_t*) arg_param;
        app_profile = AUDIO_Policy_Get_Profile(AUDIO_APP_FM);
			
      	    AUDCTRL_SaveAudioModeFlag( sgTableIDChannelOfDev[param_start->substream_number].speaker,app_profile);
                			
	        // Enable the FM playback the path
            AUDCTRL_EnablePlay(AUDIO_HW_I2S_IN,
				sgTableIDChannelOfDev[param_start->substream_number].hw_id,
				AUDIO_HW_NONE,
				sgTableIDChannelOfDev[param_start->substream_number].speaker,
				param_start->channels,
				param_start->rate
						);
            // set the slopgain register to max value
            // 20110530 FM radio volume is controlled by FM radio chip.
            AUDCTRL_SetPlayVolume(sgTableIDChannelOfDev[param_start->substream_number].hw_id,
				  sgTableIDChannelOfDev[param_start->substream_number].speaker,
				  AUDIO_GAIN_FORMAT_FM_RADIO_DIGITAL_VOLUME_TABLE,
				  AUDIO_VOLUME_MAX,
				  AUDIO_VOLUME_MAX 
						);

            AUDIO_Policy_SetState(BRCM_STATE_FM);

	    }
        break;
		
        case ACTON_FM_STOP:
        {

            BRCM_FM_Param_Stop_t* param_fm_stop = (BRCM_FM_Param_Stop_t*)arg_param;
	
            //disable the FM playback path
            AUDCTRL_DisablePlay(AUDIO_HW_I2S_IN,
				  sgTableIDChannelOfDev[param_fm_stop->substream_number].hw_id,
				  sgTableIDChannelOfDev[param_fm_stop->substream_number].speaker
						 );
            AUDIO_Policy_RestoreState();
        }
        break;
        case  ACTON_ROUTE:
            {
                BRCM_AUDIO_Param_Route_t* parm_route = (BRCM_AUDIO_Param_Route_t*)arg_param;
                 DEBUG("ACTON_ROUTE  \n");			
                

                if(playback_triggered == 1){

                    if(parm_route->command == 1)
                    {
                        DEBUG(" ADDING  SPK - %d  \n",parm_route->speaker);				  
                        AUDCTRL_AddPlaySpk(AUDIO_HW_PLR_OUT,
                                               parm_route->speaker
                                              );
                        extra_speaker = 1;

                    }
                    else if (parm_route->command == 0)
                    {
             
                        DEBUG(" REMOVING  SPK - %d  \n",parm_route->speaker);				  
                        AUDCTRL_RemovePlaySpk(AUDIO_HW_PLR_OUT, 
									      parm_route->speaker	
                        );

                        extra_speaker = 0;
                    }
                }
                else
                {
                    if(parm_route->command == 1)
                        extra_speaker = 1;
                    else if (parm_route->command == 0)
                        extra_speaker = 0;
                }
            }
            break;
        default:
            DEBUG("Error AUDIO_Ctrl_Process Invalid acction command \n");
    }
    if(block)
    {
        // put the message in output fifo if waiting
        msgAudioCtrl.action_code = action_code;
	    if(arg_param)
		    memcpy(&msgAudioCtrl.param, arg_param, sizeof(BRCM_AUDIO_Control_Params_un_t));
	    else
		    memset(&msgAudioCtrl.param, 0, sizeof(BRCM_AUDIO_Control_Params_un_t));
	    msgAudioCtrl.pCallBack = callback;
        msgAudioCtrl.block = block;

        len = kfifo_in_locked(&sgThreadData.m_pkfifo_out, (unsigned char *)&msgAudioCtrl, sizeof(TMsgAudioCtrl), &sgThreadData.m_lock_out);
        if(len != sizeof(TMsgAudioCtrl))
		    DEBUG("Error AUDIO_Ctrl_Process len=%d expected %d \n", len, sizeof(TMsgAudioCtrl));
#if 1        
        // release the semaphore 
        DEBUG("Semaphore released - %d \n",action_code);
        OSSEMAPHORE_Release(sgThreadData.action_complete);
#endif
    }

}