亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? headset_volume.c

?? bc5_stereo:bluetooth stereo Headset CODE 支持A2DP HSP 和 HSP 。可作為車載免提。BlueLab 2007環境下編譯
?? C
字號:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2004-2007

FILE NAME
    headset_volume.c
    
DESCRIPTION
    Module responsible for Vol control 
    
*/

#include "headset_debug.h"
#include "headset_LEDmanager.h"
#include "headset_volume.h"
#include "headset_statemanager.h"
#include "headset_tones.h"
#include "headset_configmanager.h"

#include <stdlib.h>
#include <audio.h>
#include <ps.h>

#ifdef DEBUG_VOLUME
#define VOL_DEBUG(x) DEBUG(x)
#else
#define VOL_DEBUG(x) 
#endif


#define MIC_VOLUME	(10)


typedef struct
{
	unsigned int hfpVol:8;
	unsigned int avVol:8;
} vol_table_t;

vol_table_t *gVolLevels = NULL;

/*****************************************************************************/
void VolumeInit ( hsTaskData * pApp ) 
{
	uint16 psVolume = 0;
	VOL_DEBUG(("VOL: Init Volume\n"));

	if (PsRetrieve(PSKEY_VOLUME_LEVELS, &psVolume, sizeof(uint16)))
	{
		pApp->audioData.gHfpVolumeLevel = psVolume & 0x7f; /* Field is 7 Bits long */
		pApp->audioData.gAvVolumeLevel = (psVolume >> 8) & 0x7f; /* Field is 7 Bits long */
		
		if (pApp->audioData.gHfpVolumeLevel > VOL_MAX_VOLUME_LEVEL)
		{
		    pApp->audioData.gHfpVolumeLevel = VOL_DEFAULT_VOLUME_LEVEL ; 
		}
		if (pApp->audioData.gAvVolumeLevel > VOL_MAX_VOLUME_LEVEL)
		{
		    pApp->audioData.gAvVolumeLevel = VOL_DEFAULT_VOLUME_LEVEL ; 
		}
	}
	else
	{
	    pApp->audioData.gHfpVolumeLevel = VOL_DEFAULT_VOLUME_LEVEL ; 
	    pApp->audioData.gAvVolumeLevel = VOL_DEFAULT_VOLUME_LEVEL ; 
	}
	pApp->audioData.gMuted = FALSE;
	
	gVolLevels = (vol_table_t*)PanicUnlessMalloc(sizeof(vol_table_t) * (VOL_MAX_VOLUME_LEVEL+1));
	configManagerSetupVolumeGains((uint16*)gVolLevels, VOL_MAX_VOLUME_LEVEL+1);
}


/*****************************************************************************/
void VolumeInitHfp ( hsTaskData * pApp ) 
{
	uint16 psVolume = 0;
	VOL_DEBUG(("VOL: Init HFP Volume\n"));

	if (PsRetrieve(PSKEY_VOLUME_LEVELS, &psVolume, sizeof(uint16)))
	{
		pApp->audioData.gHfpVolumeLevel = psVolume & 0x7f; /* Field is 7 Bits long */
		
		if (pApp->audioData.gHfpVolumeLevel > VOL_MAX_VOLUME_LEVEL)
		{
		    pApp->audioData.gHfpVolumeLevel = VOL_DEFAULT_VOLUME_LEVEL ; 
		}
	}
	else
	{
	    pApp->audioData.gHfpVolumeLevel = VOL_DEFAULT_VOLUME_LEVEL ; 
	}
	pApp->audioData.gMuted = FALSE;
}


/*****************************************************************************/
void VolumeToggleMute ( hsTaskData * pApp )
{
    VOL_DEBUG(("VOL: Mute T [%c]\n" , (pApp->audioData.gMuted ? 'F':'T') )) ;
    
        /*if then old state was muted*/
    if (pApp->audioData.gMuted )
    {
        MessageSend( &pApp->task , EventMuteOff , 0 ) ;
    }
    else
    {
        MessageSend( &pApp->task , EventMuteOn , 0 ) ;
    }
}


/*****************************************************************************/
void VolumeMuteOn ( hsTaskData * pApp )
{
    VOL_DEBUG(("VOL: Mute\n")) ;    
		
    AudioSetMode ( AUDIO_MODE_MUTE_MIC , NULL ) ;
    
    LEDManagerSetMicBias ( pApp , FALSE ) ; 
 
    pApp->audioData.gMuted = TRUE ;
    
    MessageSendLater( &pApp->task , EventMuteReminder , 0 ,D_SEC(pApp->Timeouts.MuteRemindTime_s ) ) ;
}


/*****************************************************************************/
void VolumeMuteOff ( hsTaskData * pApp )
{
	AUDIO_MODE_T lMode;
	
    VOL_DEBUG(("VOL: UnMute\n")) ;        
    pApp->audioData.gMuted = FALSE   ;
 
    MessageCancelAll( &pApp->task , EventMuteReminder ) ;
	
	if ( (stateManagerGetHfpState() == headsetActiveCall) || !pApp->cvcEnabled )
		lMode = AUDIO_MODE_CONNECTED ; 
	else
        lMode = AUDIO_MODE_MUTE_SPEAKER ;
    
    AudioSetMode ( lMode , NULL ) ;
    
    LEDManagerSetMicBias ( pApp , TRUE ) ;
}


/*****************************************************************************/
void VolumeUp ( hsTaskData * pApp )
{
	uint16 actVol = 0;
	bool avAudio = FALSE;
	
    VOL_DEBUG(("VOL: VolUp\n"));

    if (!VolumeGetHeadsetVolume( pApp, &actVol, &avAudio ))
	    return;
        
    if (actVol < VOL_MAX_VOLUME_LEVEL)
    {
        actVol++;
	
	    VolumeSetHeadsetVolume(  pApp, actVol, avAudio, TRUE );
	}
    else
    {
		MessageSend ( &pApp->task , EventVolumeMax , 0 );	
	    VOL_DEBUG(("VOL:      Max. volume reached\n"));
    }
}


/*****************************************************************************/
void VolumeDown ( hsTaskData * pApp )
{
	uint16 actVol = 0;
	bool avAudio = FALSE;
	
    VOL_DEBUG(("VOL: VolDwn\n"))  ;
    
    if (!VolumeGetHeadsetVolume( pApp, &actVol, &avAudio ))
	    return;
        
    if (actVol > 0)
    {
        actVol--;
	
	    VolumeSetHeadsetVolume(  pApp, actVol, avAudio, TRUE );
	}
    else
    {
	    MessageSend ( &pApp->task , EventVolumeMin , 0 );
	    VOL_DEBUG(("VOL:      Min. Volume reached\n"));
    }
}

/*****************************************************************************/
void VolumeStoreLevels ( hsTaskData * pApp )
{
	uint16 psVolume = 0;
	
	VOL_DEBUG(("VOL: Store Volume Levels\n"));
	
	psVolume |= pApp->audioData.gHfpVolumeLevel; /* Field is 7 Bits long */
	psVolume |= pApp->audioData.gAvVolumeLevel << 8; /* Field is 7 Bits long */
	
	if (!PsStore(PSKEY_VOLUME_LEVELS, &psVolume, sizeof(uint16)))
	{
		VOL_DEBUG(("VOL:    Can not store volume\n"));
	}
}


/*****************************************************************************/
void VolumeSendSettingsToAG(hsTaskData * pApp, bool send_speaker, bool send_mic)
{
	if (pApp->local_hfp_features & HFP_REMOTE_VOL_CONTROL)
	{
		if (send_speaker)
		{
			if (pApp->profile_connected == hfp_handsfree_profile)
				HfpSendSpeakerVolume(pApp->hfp, pApp->audioData.gHfpVolumeLevel);
			else
				HfpSendSpeakerVolume(pApp->hsp, pApp->audioData.gHfpVolumeLevel);
		}

		if (send_mic)
		{
			if (pApp->profile_connected == hfp_handsfree_profile)
				HfpSendMicrophoneVolume(pApp->hfp, MIC_VOLUME);
			else
				HfpSendMicrophoneVolume(pApp->hsp, MIC_VOLUME);
		}
	}
}


/*****************************************************************************/
bool VolumeGetHeadsetVolume(hsTaskData * pApp, uint16 * actVol, bool * avAudio)
{
	if (stateManagerIsA2dpStreaming())
    {
	    *actVol = pApp->audioData.gAvVolumeLevel;
	    *avAudio = TRUE;
    }
    else if (stateManagerIsHfpConnected())
    {
	    *actVol = pApp->audioData.gHfpVolumeLevel;
    }
    else
    {
	    VOL_DEBUG(("VOL:      No Active audio\n"));
	    return FALSE;
    }
	
	return TRUE;
}


/*****************************************************************************/
void VolumeSetHeadsetVolume(hsTaskData * pApp, uint16 actVol, bool avAudio, bool sendVolToAg)
{
	if (avAudio)
	{
	    pApp->audioData.gAvVolumeLevel = actVol;
		AudioSetVolume(	gVolLevels[actVol].avVol , pApp->theCodecTask ) ;
		VOL_DEBUG(("VOL:      Set A2DP vol index[%d] gain[%d]\n", actVol,gVolLevels[actVol].avVol));
	}
	else
	{
	    pApp->audioData.gHfpVolumeLevel = actVol;

		VOL_DEBUG(("VOL:      Set HFP vol index[%d] gain[%d]\n", actVol, gVolLevels[actVol].hfpVol));
		AudioSetVolume(	gVolLevels[actVol].hfpVol , pApp->theCodecTask ) ;

		if (sendVolToAg)
		{
			/* Send new local volume to AG */
			VolumeSendSettingsToAG(pApp, TRUE, FALSE);	
			VOL_DEBUG(("VOL:      Update AG vol\n"));
		}
	}
	
}


/*****************************************************************************/
uint16 VolumeRetrieveGain( uint16 index , bool avAudio )
{
	if (avAudio)
		return gVolLevels[index].avVol;
	else
		return gVolLevels[index].hfpVol;
		
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区日本一区韩国一区| 日韩午夜激情视频| 精品一二三四在线| 日韩精品电影在线观看| 亚洲国产精品一区二区久久恐怖片| 国产精品久久久久三级| 国产欧美日韩亚州综合| 欧美国产一区在线| 国产精品久久久久久妇女6080| 中文字幕在线不卡国产视频| 中文字幕日韩精品一区| 亚洲精品亚洲人成人网| 亚洲一区二区五区| 蜜桃一区二区三区在线| 国产精品白丝jk白祙喷水网站 | 波多野结衣亚洲| 99国产精品99久久久久久| 色妹子一区二区| 欧美精品一卡两卡| 久久精品视频在线看| 国产精品福利一区| 麻豆久久一区二区| 精品一区二区三区在线观看国产| 国产一区二区精品久久91| 国产成人精品免费网站| 91首页免费视频| 91精选在线观看| 国产肉丝袜一区二区| 亚洲精品网站在线观看| 精品一区二区三区在线视频| 99国产一区二区三精品乱码| 欧美一级淫片007| 中文字幕一区三区| 蜜臀av性久久久久av蜜臀妖精 | 欧美肥妇毛茸茸| 精品国产麻豆免费人成网站| 中文字幕一区三区| 韩国午夜理伦三级不卡影院| 欧美中文字幕一区| 久久一留热品黄| 香蕉久久夜色精品国产使用方法| 国产成人精品综合在线观看 | 久久久久国产精品麻豆ai换脸| 亚洲少妇最新在线视频| 日韩成人免费电影| 97久久超碰国产精品| 精品欧美一区二区三区精品久久 | 国产精品一区久久久久| 欧美视频在线不卡| 欧美经典一区二区三区| 日本在线不卡一区| 欧美中文字幕一区| 成人免费一区二区三区视频| 国内精品伊人久久久久av影院| 欧美日韩激情一区| 亚洲激情图片一区| 成人免费不卡视频| 欧美成人r级一区二区三区| 亚洲在线视频网站| 9l国产精品久久久久麻豆| 2020日本不卡一区二区视频| 蜜桃av一区二区| 91精品国产综合久久久久久久久久| 亚洲免费看黄网站| av在线这里只有精品| 国产精品久久久久精k8| 国产成人日日夜夜| 国产精品视频观看| 欧美一区二区久久久| 亚洲老妇xxxxxx| 成年人国产精品| 欧美激情中文字幕| 成人网男人的天堂| 欧美经典一区二区| 成人免费视频一区二区| 国产日产欧美一区二区视频| 精品亚洲成a人| 欧美精品一区视频| 国产永久精品大片wwwapp| 精品久久久久久综合日本欧美| 日韩av不卡在线观看| 日韩欧美国产午夜精品| 美女www一区二区| 欧美精品一区二区三区蜜桃视频| 狠狠狠色丁香婷婷综合久久五月| 日韩免费电影网站| 国产精一区二区三区| 亚洲国产精品成人综合色在线婷婷| 国产传媒欧美日韩成人| 国产精品日产欧美久久久久| 99久久婷婷国产综合精品电影| 国产精品毛片大码女人| 91福利在线观看| 日韩国产成人精品| 久久免费精品国产久精品久久久久| 国产一区二区女| 国产精品女同一区二区三区| 91在线观看下载| 亚洲国产成人91porn| 日韩亚洲欧美成人一区| 国模大尺度一区二区三区| 国产精品视频第一区| 欧美在线观看一区| 看国产成人h片视频| 国产日本欧洲亚洲| 欧洲av在线精品| 久久草av在线| 亚洲欧美日韩系列| 日韩一区二区在线免费观看| 成人中文字幕电影| 亚洲国产欧美日韩另类综合| 欧美成人激情免费网| 91免费在线播放| 日本午夜精品视频在线观看| 国产精品蜜臀av| 欧美xxxx老人做受| 成人av在线资源网站| 五月激情综合色| 亚洲国产精品二十页| 91麻豆精品国产自产在线观看一区 | 制服丝袜亚洲色图| 国产精品123区| 日韩精品一二三| 亚洲欧洲国产日韩| 欧美白人最猛性xxxxx69交| 欧美性欧美巨大黑白大战| 国产乱码精品1区2区3区| 亚洲第一成人在线| 自拍偷自拍亚洲精品播放| 日韩精品一区二区三区swag| 欧美日韩亚洲国产综合| 成人国产亚洲欧美成人综合网| 一区二区三区四区不卡在线| 久久精品男人天堂av| 制服丝袜国产精品| 欧美自拍丝袜亚洲| aaa欧美日韩| 成人99免费视频| 成人一区二区三区| 国内久久婷婷综合| 国产在线精品一区二区夜色| 日韩国产精品久久久久久亚洲| 一级做a爱片久久| 亚洲精选一二三| 亚洲精品高清在线观看| 亚洲乱码国产乱码精品精的特点 | 91成人看片片| 91在线小视频| 色哟哟亚洲精品| 在线中文字幕一区| 色欧美日韩亚洲| 在线观看av不卡| 欧美色精品在线视频| 欧美日韩免费不卡视频一区二区三区| 日本二三区不卡| 欧美视频在线一区| 在线成人免费视频| 日韩午夜激情视频| 久久亚洲一级片| 国产午夜精品一区二区三区视频 | 91精品国产91久久综合桃花| 欧美日韩国产大片| 日韩一区二区电影在线| 欧美va亚洲va国产综合| 久久先锋影音av鲁色资源网| 国产欧美一区二区精品忘忧草| 久久久久9999亚洲精品| 日本一区二区三区视频视频| 国产精品久久久久久久久免费樱桃| 中文字幕日本不卡| 亚洲国产精品自拍| 毛片不卡一区二区| 东方欧美亚洲色图在线| 91污片在线观看| 欧美午夜在线观看| 日韩丝袜美女视频| 欧美激情艳妇裸体舞| 伊人色综合久久天天人手人婷| 全部av―极品视觉盛宴亚洲| 国产精品亚洲人在线观看| 一本久道中文字幕精品亚洲嫩| 欧美一区二区三区视频在线观看| xnxx国产精品| 亚洲欧美另类小说| 日韩中文字幕区一区有砖一区| 激情久久五月天| 91视频免费看| 日韩免费观看2025年上映的电影| 国产精品久久久久久久蜜臀| 日韩成人一区二区三区在线观看| 国产成a人亚洲精品| 欧美日韩大陆一区二区| 国产拍揄自揄精品视频麻豆| 一区二区在线免费观看| 韩国成人福利片在线播放| 欧美日韩在线不卡| 国产精品久久毛片| 久久精品久久久精品美女| 在线看日本不卡| 亚洲国产精品激情在线观看|