📄 headset_volume.c
字号:
/****************************************************************************Copyright (C) Cambridge Silicon Radio Ltd. 2004-2006Part of BlueLab 3.6.2-releaseFILE NAME headset_volume.c DESCRIPTION module responsible for Vol control - part of the sound manager */#include "headset_configmanager.h"#include "headset_soundmanager.h"#include "headset_LEDmanager.h"#include "headset_statemanager.h"#include "headset_volume.h"#include <codec.h>#include <csrtypes.h>#include <pcm.h>#include <ps.h>#include <stddef.h>/****************************************************************************VARIABLES */ /*the ofset to scale the volume by if we are scaling directly 4-19*/#define VOLUME_SPEAKER_CODEC_OFFSET 4 /*the delay to wait before completing the mic gain unmute - messageSentLater...*/#define VOLUME_MIC_UNMUTE_DELAY_MS 100/****************************************************************************Local Functions*/static uint16 VolumeScaleVolume ( uint16 pVolume , uint16 pRange );static void VolumeSetHeadsetVolume ( hsTaskData * pApp ,uint16 pNewVolume , bool pPlayTone) ;static void VolumeSendAndSetHeadsetVolume (hsTaskData * pApp , uint16 pNewVolume ,bool pPlayTone ) ;static void VolumeScaleAndSetCodecs ( hsTaskData * pApp , uint16 pNewVolume ) ;static void VolumeStartUnMuteMicrophone ( hsTaskData * pApp ) ;/****************************************************************************FUNCTIONS*//****************************************************************************NAME VolumeConfigureVolumeSettingsDESCRIPTION Configures the volume settings - via config manager - RETURNS void */void VolumeConfigureVolumeSettings ( hsTaskData * pApp , uint16 pProfileVolume , uint16 pIncLevel , uint16 pDecLevel , uint16 pMicLevel , HeadsetTone_t pTone, uint16 pVolGain , uint16 pMicGain ) { if( (pProfileVolume >= 0) && ( pProfileVolume <= SOM_NUM_VOL_SETTINGS ) ) { pApp->theSoundTask.gVolMaps [ pProfileVolume ].IncVol = pIncLevel ; pApp->theSoundTask.gVolMaps [ pProfileVolume ].DecVol = pDecLevel ; pApp->theSoundTask.gVolMaps [ pProfileVolume ].Mic = pMicLevel ; pApp->theSoundTask.gVolMaps [ pProfileVolume ].VolGain = pVolGain ; pApp->theSoundTask.gVolMaps [ pProfileVolume ].MicGain = pMicGain ; pApp->theSoundTask.gVolMaps [ pProfileVolume ].Tone = TONE_NOT_DEFINED ; /*if there is a tone defined*/ if (soundManagerIsToneDefined (pTone) ) { pApp->theSoundTask.gVolMaps [ pProfileVolume ].Tone = pTone ; } SOM_DEBUG(("SOM: CfgVol [%d] [%d][%d] [%d] [%d]]\n" , pProfileVolume , pApp->theSoundTask.gVolMaps [ pProfileVolume ].IncVol , pApp->theSoundTask.gVolMaps [ pProfileVolume ].DecVol , pApp->theSoundTask.gVolMaps [ pProfileVolume ].Mic , pApp->theSoundTask.gVolMaps [ pProfileVolume ].Tone )) ; SOM_DEBUG(("SOM: [%d][%d]\n", pApp->theSoundTask.gVolMaps [ pProfileVolume ].VolGain, pApp->theSoundTask.gVolMaps [ pProfileVolume ].MicGain)) } else { SOM_DEBUG(("SOM: CfgVol ![%d]\n" , pProfileVolume)) ; } }/****************************************************************************NAME VolumeDefaultDESCRIPTION sets a default volumeRETURNS void */void VolumeDefault ( hsTaskData * pApp , uint16 level){ /*set initial volume*/ pApp->theSoundTask.gSMVolumeLevel= level; /*set our internal volume level*/ VolumeSendAndSetHeadsetVolume ( pApp , pApp->theSoundTask.gSMVolumeLevel ,FALSE) ; }/*************************************************************************NAME VolumeHandleVolumeInd DESCRIPTION Handles a volume indication from an AG - does not send a response backRETURNS void*/void VolumeHandleVolumeInd ( hsTaskData * pApp , uint16 pProfileVolume ){ SOM_DEBUG(("SOM: VolInd[%d][%d]\n",pApp->theSoundTask.gSMVolumeLevel, pProfileVolume)) ; VolumeSetHeadsetVolume ( pApp , pProfileVolume ,TRUE) ;}/*************************************************************************NAME VolumeHandleMicInd DESCRIPTION Handles a Mic gain indication from an AG RETURNS void*/void VolumeSetMicLevel ( hsTaskData * pApp , uint16 pMicGain ) { uint16 lCodecVal = 0; /*scale the codec gain accordingly*/ lCodecVal = VolumeScaleVolume ( pMicGain ,CodecInputGainRange() ) ; if (pApp->features.UseUserDefinedCodecGains) { SOM_DEBUG(("SOM: User Codec\n")) ; lCodecVal = pApp->theSoundTask.gVolMaps[pMicGain].MicGain; } SOM_DEBUG(("SOM: Mic Codec [%d]\n" , lCodecVal)) ; if ( stateManagerIsConnected() ) { /*use correct profile instance*/ if (pApp->profile_connected == hfp_handsfree_profile) { HfpSendMicrophoneVolume(pApp->hfp , pMicGain); } else { HfpSendMicrophoneVolume(pApp->hsp , pMicGain); } } /*set the mic gain as requested*/ CodecSetInputGainA (lCodecVal) ; CodecSetInputGainB (lCodecVal) ; /*set the mic bias*/ LEDManagerSetMicBias ( pApp , (TRUE && pMicGain) ) ; SOM_DEBUG(("SOM :MicInd[%d][%d]\n" , pMicGain , lCodecVal)) ; }/****************************************************************************NAME VolumeUpDESCRIPTION Increments voulmeRETURNS void */void VolumeUp ( hsTaskData * pApp ){ uint16 lOldVol = pApp->theSoundTask.gSMVolumeLevel ; uint16 lNewVol = pApp->theSoundTask.gVolMaps[lOldVol].IncVol ; VolumeSendAndSetHeadsetVolume ( pApp , lNewVol ,TRUE) ; SOM_DEBUG(("SOM: VolUp[%d][%d]\n",lOldVol, lNewVol)) ;}/****************************************************************************NAME VolumeDownDESCRIPTION Decrements volume - sends a response to the AGRETURNS void */void VolumeDown ( hsTaskData * pApp ){ uint16 lOldVol = pApp->theSoundTask.gSMVolumeLevel ; uint16 lNewVol = pApp->theSoundTask.gVolMaps[lOldVol].DecVol ; VolumeSendAndSetHeadsetVolume ( pApp , lNewVol , TRUE ) ; SOM_DEBUG(("SOM: VolDwn[%d][%d]\n",lOldVol, lNewVol)) ;}/****************************************************************************NAME VolumeToggleMuteDESCRIPTION Toggles the mute stateRETURNS void */void VolumeToggleMute ( hsTaskData * pApp ){ SOM_DEBUG(("SOM: Mute T [%c]\n" , (pApp->theSoundTask.gMuted ? 'F':'T') )) ; /*if then old state was muted*/ if (pApp->theSoundTask.gMuted == VOL_MUTED ) { MessageSend( &pApp->task , EventMuteOff , 0 ) ; } else { MessageSend( &pApp->task , EventMuteOn , 0 ) ; }}/****************************************************************************NAME VolumeMuteOnDESCRIPTION Enables MuteRETURNS void */void VolumeMuteOn ( hsTaskData * pApp ){ SOM_DEBUG(("SOM: Mute\n")) ; if (pApp->features.MuteSpeakerAndMic ) { /*and set the codecs to 0*/ VolumeScaleAndSetCodecs (pApp , 0 ); } /*and disable the microphone LEDManagerSetMicBias ( FALSE ) ;*/ VolumeSetMicLevel ( pApp , 0 ) ; StreamDisconnect( StreamSourceFromSink(pApp->sco_sink) , 0); /*update the mutestate*/ pApp->theSoundTask.gMuted = VOL_MUTED ; VolumeMuteRemind ( pApp ) ; }/****************************************************************************NAME VolumeMuteOffDESCRIPTION Disables MuteRETURNS void */void VolumeMuteOff ( hsTaskData * pApp ){ /*update the mutestate*/ SOM_DEBUG(("SOM: UnMute\n")) ; pApp->theSoundTask.gMuted = VOL_NOT_MUTED ; /*cancel any mute reminders*/ MessageCancelAll( &pApp->task , EventMuteReminder ) ; if ( pApp->features.MuteSpeakerAndMic ) { /*restore the volume*/ VolumeScaleAndSetCodecs (pApp , pApp->theSoundTask.gSMVolumeLevel ) ; } StreamConnect(StreamSourceFromSink(pApp->sco_sink), StreamPcmSink(0)); StreamConnect(StreamPcmSource(0), pApp->sco_sink); /*enable the microphone*/ VolumeStartUnMuteMicrophone ( pApp ) ;}/****************************************************************************NAME VolumeUnMuteMicrophoneDESCRIPTION Current headset applications running on BC2-Audio and BC3-Audio ramp up the microphone gain when unmuting the microphone. This is a historical method due to an issue on BC2-Audio where it was possible to latch up the internal input amplifier. The following method was used on BC3-Audio and the consensus is too implement this method on BC4-Audio to avoid any audible pops as the microphone is unmuted. To Unmute: 1. Set mic gain to 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -