?? headset_volume.c
字號:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2004
FILE 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
VolumeConfigureVolumeSettings
DESCRIPTION
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
VolumeDefault
DESCRIPTION
sets a default volume
RETURNS
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 back
RETURNS
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
VolumeUp
DESCRIPTION
Increments voulme
RETURNS
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
VolumeDown
DESCRIPTION
Decrements volume - sends a response to the AG
RETURNS
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
VolumeToggleMute
DESCRIPTION
Toggles the mute state
RETURNS
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
VolumeMuteOn
DESCRIPTION
Enables Mute
RETURNS
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
VolumeMuteOff
DESCRIPTION
Disables Mute
RETURNS
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
VolumeUnMuteMicrophone
DESCRIPTION
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
2. Set the mic bias to 1
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -