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

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

?? a2dp_handler.c

?? BLUETOOTH Stereo Headset Source Code,含CVC(噪音消除,回聲抵消),可用于開發藍牙立體聲耳機,藍牙車載,經過測試.
?? C
字號:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2004-2006
Part of BlueLab 3.6.2-release

FILE NAME
    a2dp_handler.c        

DESCRIPTION
    Deals with A2dp functionality.

*/


/****************************************************************************
    Header files
*/
#include "headset_private.h"
#include "a2dp_handler.h"
#include "av_stream_control.h"
#include "avrcp_handler.h"
#include "headset_common.h"
#include "headset_power.h"
#include "headset_tones.h"

#include <codec.h>
#include <kalimba.h>
#include <panic.h>
#include <ps.h>
#include <stdlib.h>


#ifdef DEBUG_A2DP
#define A2DP_DEBUG(x) DEBUG(x)
#else
#define A2DP_DEBUG(x) 
#endif


static void playConnectTone(headsetTaskData* app)
{
    headsetPlayTone(app, tone_type_connect);
}

static void playErrorTone(headsetTaskData* app)
{
    headsetPlayTone(app, tone_type_error);
}


/**************************************************************************/
void avHeadsetRegisterSep(const headsetTaskData *app, a2dp_sep_type sep)
{
	a2dp_sep_config config;    
	config.sep_type = sep;
	config.params = 0;
	
    A2dpAddSep(app->a2dp, &config);
}


/**************************************************************************/
void avHeadsetHandleA2dpAddSepCfm(headsetTaskData* app, const A2DP_ADD_SEP_CFM_T* cfm)
{
    if(cfm->status == a2dp_success)
    {
		/* SBC is registered last, so wait for it.*/
        if (cfm->sep_type == a2dp_sbc)
        {
            avrcp_init_params config;
            config.device_type = avrcp_controller;
            config.priority = 50;

			/* Go ahead and Initialise the AVRCP library */
			AvrcpInit(&app->task, &config);
                    
			/* Change to Ready state */
			setA2dpState(app, avHeadsetA2dpReady);
		}
    }
    else
    {
        A2DP_DEBUG(("A2DP: Unable to register SEPs\n"));
	Panic();
    }
}


/**************************************************************************/
void avHeadsetHandleA2dpOpenInd(headsetTaskData* app, const A2DP_OPEN_IND_T* ind)
{   
    bdaddr bdaddr_ind;

	APP_AVRCP_CONNECT_REQ_T *message = PanicNull(malloc(sizeof(APP_AVRCP_CONNECT_REQ_T)));
    
    (void) SinkGetBdAddr(ind->media_sink, &bdaddr_ind);

	message->addr = bdaddr_ind;
    MessageSendLater(getAppTask(), APP_AVRCP_CONNECT_REQ, message, 0);

    setA2dpState(app, avHeadsetA2dpConnected);

    /* Store the address of the device that just connecetd to us */
    (void)PsStore(LAST_USED_AV_SOURCE, &bdaddr_ind, sizeof(bdaddr)); 
    (void)PsStore(LAST_USED_AV_SOURCE_SEP, &(ind->sep_type), sizeof(a2dp_sep_type));
    
    /* Store the media sink */
    app->media_sink = ind->media_sink;
}


/**************************************************************************/
void avHeadsetHandleA2dpSignallingOpenInd(headsetTaskData* app, const A2DP_SIGNALLING_OPEN_IND_T* ind)
{   
	bdaddr bdaddr_ind;

    app->sig_sink = ind->sink;
    
    /* We are now connected */
    if ((app->a2dp_state == avHeadsetA2dpReady) || (app->a2dp_state == avHeadsetA2dpInitiating))
        setA2dpState(app, avHeadsetA2dpSignallingActive);
    

    /* Establish an AVRCP connection if required */
	if (app->avrcp_state == avHeadsetAvrcpReady)
	{	
        APP_AVRCP_CONNECT_REQ_T *message = PanicNull(malloc(sizeof(APP_AVRCP_CONNECT_REQ_T)));
		(void) SinkGetBdAddr(ind->sink, &bdaddr_ind);
        message->addr = bdaddr_ind;
        MessageSendLater(getAppTask(), APP_AVRCP_CONNECT_REQ, message, 3000);
	}

    playConnectTone(app);  
}


/**************************************************************************/
void avHeadsetHandleA2dpOpenCfm(headsetTaskData* app, const A2DP_OPEN_CFM_T* cfm)
{
    bdaddr bdaddr_cfm;
    
    if (cfm->result == a2dp_success)
    {
		APP_AVRCP_CONNECT_REQ_T *message = PanicNull(malloc(sizeof(APP_AVRCP_CONNECT_REQ_T)));

		(void)PsStore(LAST_USED_AV_SOURCE_SEP, &(cfm->sep_type), sizeof(a2dp_sep_type));  
        A2dpStart(app->a2dp, cfm->media_sink); 
        
        setA2dpState(app, avHeadsetA2dpConnected);
        
        /* Store the media sink and source id*/
        app->media_sink = cfm->media_sink;
        
        SinkGetBdAddr(cfm->media_sink, &bdaddr_cfm);
		message->addr = bdaddr_cfm;
        MessageSendLater(getAppTask(), APP_AVRCP_CONNECT_REQ, message, 0);
    }
    else
    {
        if (app->sig_sink)
            setA2dpState(app, avHeadsetA2dpSignallingActive);
        else
		{
			/* Try SBC if MP3 failed */
			if ((cfm->sep_type == a2dp_mpeg_audio)  && (cfm->result == a2dp_fail))
			{
				bdaddr addr;
				bool found = FALSE;
				found = PsRetrieve(LAST_USED_AV_SOURCE, &addr, sizeof(bdaddr));
				if (!found)
					found = PsRetrieve(LAST_PAIRED_DEVICE, &addr, sizeof(bdaddr));
				if (found)
				{
					A2dpOpen(app->a2dp, a2dp_sbc, &addr);
					return;
				}
			}
			setA2dpState(app, avHeadsetA2dpReady);
			playErrorTone(app);
		}
    }
    app->headset_connecting_av = FALSE;
}


/**************************************************************************/
void avHeadsetHandleA2dpStartInd(headsetTaskData* app, const A2DP_START_IND_T* ind)
{
    if (!app->media_sink || (app->a2dp_state == avHeadsetA2dpStreaming))
        return;
    
    if (app->sco_sink)
    {
        /* SCO is active so don't start AV */
        A2dpSuspend(app->a2dp, ind->media_sink);
        avHeadsetSendPause(app);
    }
    else
	{
		avHeadsetUpdateAvrcpPlayState(app, 1);
        avHeadsetAvStreamStart(app);
	}
    /* Change to streaming state */
    setA2dpState(app, avHeadsetA2dpStreaming);
    
    /* Cancel pairing mode */
    (void) MessageCancelAll(getAppTask(), APP_PAIR_MODE_END_IND);
    MessageSend(getAppTask(), APP_PAIR_MODE_END_IND, 0);
}


/**************************************************************************/
void avHeadsetHandleA2dpStartCfm(headsetTaskData* app, const A2DP_START_CFM_T* cfm)
{
    if (cfm->result == a2dp_success)
    {   
        /* Cancel pairing mode */
        (void) MessageCancelAll(getAppTask(), APP_PAIR_MODE_END_IND);
        MessageSend(getAppTask(), APP_PAIR_MODE_END_IND, 0);

        /* start Kalimba decoding if it isn't already */
        if (app->av_stream_stopped)
        {			
            if (app->sco_sink)
            {
                /* 
                    SCO has become active while we were waiting for a START_CFM.
				    AV doesn't want to be streaming now, so we must try to 
				    suspend the source again.
				*/
                A2dpSuspend(app->a2dp, cfm->media_sink);
                avHeadsetSendPause(app);
                return;
            }
            else
            {
				avHeadsetUpdateAvrcpPlayState(app, 1);
                avHeadsetAvStreamStart(app);
            }
        } 
        
        setA2dpState(app, avHeadsetA2dpStreaming);
    }
    else
    {
        /* failed to start, close the connection */
        A2dpClose(app->a2dp, cfm->media_sink);

        if (app->avrcp_state == avHeadsetAvrcpConnected)
            AvrcpDisconnect(app->avrcp);
    }
}


/**************************************************************************/
void avHeadsetHandleA2dpSuspendInd(headsetTaskData *app)
{
    /* Change to connected state */
    setA2dpState(app, avHeadsetA2dpConnected);
	avHeadsetUpdateAvrcpPlayState(app, 0);
    avHeadsetAvStreamStop(app, FALSE);
}


/**************************************************************************/
void avHeadsetHandleA2dpSuspendCfm(headsetTaskData* app, const A2DP_SUSPEND_CFM_T* ind)
{
    if (ind->result == a2dp_success)
    {
        setA2dpState(app, avHeadsetA2dpConnected);
        
        if (!app->av_stream_stopped)
        {
            /* We must have had a stream restart at this end occuring so restart AV source */
            A2dpStart(app->a2dp, app->media_sink);
            avHeadsetSendPlay(app);
        }
        else
        {
            /* We have suspended the AV source. */
            app->sent_suspend = TRUE;
        }
    }
}


/**************************************************************************/
void avHeadsetHandleA2dpCloseInd(headsetTaskData *app, const A2DP_CLOSE_IND_T *ind)
{
    /* Stop the media stream */
    avHeadsetAvStreamStop(app,FALSE);

    /* Power down the codec */
    CodecPowerDown(app->codec_task);

    /* Change state */
    if ((app->a2dp_state == avHeadsetA2dpStreaming) || (app->a2dp_state == avHeadsetA2dpConnected))
        setA2dpState(app, avHeadsetA2dpSignallingActive);
    else
        setA2dpState(app, avHeadsetA2dpReady);
   
    /* Switch to hfp mode */
    
    app->media_sink = 0;
	avHeadsetUpdateAvrcpPlayState(app, 0);
    app->sent_suspend = FALSE;

}


/**************************************************************************/
void avHeadsetHandleA2dpSignallingCloseInd(headsetTaskData* app, const A2DP_SIGNALLING_CLOSE_IND_T* ind)
{
    /* Change to ready state */
    setA2dpState(app, avHeadsetA2dpReady);
    
    app->sig_sink = 0;
	
	if (app->avrcp_state == avHeadsetAvrcpConnected)
        AvrcpDisconnect(app->avrcp);
	
	/* Switch to hfp mode */
    app->active_profile = hfp_active;
    
    /* Reconnect on link loss */
    if (ind->result == a2dp_disconnect_link_loss)
        avHeadsetHandleAvConnectRequest(app);

}


/**************************************************************************/
void avHeadsetHandleA2dpCloseCfm(headsetTaskData* app)
{
    /* Stop the media stream */
    avHeadsetAvStreamStop(app,FALSE);
    /* Switch to hfp mode */
    app->active_profile = hfp_active;

    /* Change state */
    if ((app->a2dp_state == avHeadsetA2dpStreaming) || (app->a2dp_state == avHeadsetA2dpConnected))
        setA2dpState(app, avHeadsetA2dpSignallingActive);
    else
        setA2dpState(app, avHeadsetA2dpReady);
    
    app->media_sink = 0;
	avHeadsetUpdateAvrcpPlayState(app, 0);
    app->sent_suspend = FALSE;
}


/**************************************************************************/
void avHeadsetHandleA2dpCodecSettingsInd(headsetTaskData *theAvApp, const A2DP_CODEC_SETTINGS_IND_T *ind)
{
	/* Store the codec config settings */
	theAvApp->channel_mode = ind->channel_mode;
	theAvApp->rate = ind->rate;
}

/****************************************************************************/
void avHeadsetHandleAvConnectRequest(headsetTaskData *app)
{
    bdaddr addr;
	uint8 mp3_enabled = 0;
	a2dp_sep_type sep_type = a2dp_sbc;
    
    /* Retrieve the address of the last used AG from PS */
    if (!PsRetrieve(LAST_USED_AV_SOURCE, &addr, sizeof(bdaddr)))
    {
		if (!PsRetrieve(LAST_PAIRED_DEVICE, &addr, sizeof(bdaddr)))
		{
            /* Play an error tone to indicate we don't have a valid address */
		    playErrorTone(app);		    
		    return;
	    }
	}
			
    if ((app->a2dp_state == avHeadsetA2dpReady) || (app->a2dp_state == avHeadsetA2dpSignallingActive))
    {
        app->headset_connecting_av = TRUE;
        setA2dpState(app, avHeadsetA2dpInitiating);

		/*If last connected using MP3 and if MP3 is enabled, reconnect using MP3, otherwise 
		  using SBC*/

		if (PsRetrieve(MP3_ENABLED, &mp3_enabled, sizeof(uint8)))
			if (mp3_enabled)
			{
				if (!PsRetrieve(LAST_USED_AV_SOURCE_SEP, &sep_type, sizeof(a2dp_sep_type)))
					sep_type = a2dp_sbc;
			}

        A2dpOpen(app->a2dp, sep_type, &addr);
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区二区三区入口| 亚洲一区二区三区免费视频| 欧美一区二区久久| 久久日韩精品一区二区五区| 亚洲国产日韩在线一区模特| 国内久久精品视频| 欧美日韩精品福利| 国产精品理论在线观看| 久久66热re国产| 欧美精选一区二区| 成人免费在线观看入口| 国内精品第一页| 欧美一区二区成人6969| 一区二区三区精品在线| 99久久99久久综合| 国产精品毛片久久久久久| 国产一区二区三区四区五区美女| 欧美日精品一区视频| 一区二区三区加勒比av| 色综合视频一区二区三区高清| 久久精品免视看| 国产精品亚洲视频| 久久久国产精华| 精品一区二区三区在线视频| 欧美成人在线直播| 老司机精品视频在线| 欧美一区二区美女| 久久99精品国产麻豆不卡| 欧美一区二视频| 欧美aaaaa成人免费观看视频| 69堂亚洲精品首页| 日韩av网站免费在线| 欧美一区二区三区色| 日韩国产高清影视| 精品成人在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩欧美国产三级电影视频| 亚洲永久免费视频| 欧美日精品一区视频| 日韩电影免费在线| 亚洲精品一区二区三区精华液| 精品无人码麻豆乱码1区2区| 国产精品久久久久久久久免费相片| 福利视频网站一区二区三区| 中文子幕无线码一区tr| 91在线观看视频| 亚洲主播在线观看| 日韩欧美中文字幕一区| 国产精品538一区二区在线| 国产精品全国免费观看高清 | 欧美bbbbb| 久久久噜噜噜久久中文字幕色伊伊 | 精品国产免费人成在线观看| 国产一区二区成人久久免费影院 | 久久久久亚洲蜜桃| voyeur盗摄精品| 亚洲图片欧美综合| 精品国产乱码久久久久久夜甘婷婷| 成人免费毛片aaaaa**| 亚洲成人黄色小说| 久久欧美中文字幕| 在线观看一区日韩| 狠狠色综合播放一区二区| 亚洲丝袜另类动漫二区| 制服丝袜亚洲网站| 97久久精品人人做人人爽50路| 日日夜夜免费精品视频| 中文av一区特黄| 欧美日韩国产乱码电影| 精品一区二区av| 亚洲精品久久7777| 久久综合九色综合97婷婷女人 | 日韩一区二区三区视频在线 | 久久久久国产精品免费免费搜索| 偷拍与自拍一区| 欧美激情一区二区三区蜜桃视频| 国产亚洲欧洲一区高清在线观看| 色欲综合视频天天天| 美腿丝袜一区二区三区| 亚洲天堂久久久久久久| 精品剧情在线观看| 欧美综合一区二区| 成人午夜激情影院| 蜜臀av在线播放一区二区三区| 国产精品久久久久久久第一福利| 69久久夜色精品国产69蝌蚪网| av电影天堂一区二区在线| 久久精品国产精品亚洲红杏| 亚洲国产日韩一区二区| 亚洲欧美日本韩国| 国产欧美日本一区二区三区| 日韩视频一区二区三区| 欧美日韩一区二区三区免费看| fc2成人免费人成在线观看播放| 狠狠色丁香婷综合久久| 青青草国产成人av片免费| 亚洲精品视频在线观看网站| 久久国产精品露脸对白| 一区二区三区中文字幕精品精品| 欧美激情在线看| 久久久久久免费网| 久久天天做天天爱综合色| 欧美一级久久久| 欧美美女视频在线观看| 欧美天堂亚洲电影院在线播放| 粉嫩13p一区二区三区| 久久久影院官网| 夜夜揉揉日日人人青青一国产精品| 91色porny蝌蚪| 国产91精品一区二区| 国产成人免费视频精品含羞草妖精| 日韩福利视频网| 日韩成人午夜精品| 日本欧美大码aⅴ在线播放| 日本强好片久久久久久aaa| 日韩精品乱码免费| 青青草一区二区三区| 久久成人羞羞网站| 久88久久88久久久| 国产精品一区二区免费不卡 | 成人美女在线观看| 夫妻av一区二区| 99久久久精品免费观看国产蜜| 成人av手机在线观看| av成人老司机| 欧美日韩在线亚洲一区蜜芽| 欧美精品色综合| 日韩精品一区二| 国产欧美一区二区精品秋霞影院| 久久久99免费| 亚洲人成在线观看一区二区| 亚洲高清视频在线| 麻豆国产欧美日韩综合精品二区| 久久国产免费看| 成人中文字幕在线| 欧美最新大片在线看| 欧美一级视频精品观看| 欧美精选午夜久久久乱码6080| 欧美高清激情brazzers| 精品国产污污免费网站入口| 久久久久久久久久美女| 欧美国产精品一区| 亚洲成av人片在线| 激情成人综合网| 成人黄色网址在线观看| 欧美亚洲国产怡红院影院| 欧美日韩黄视频| 国产亚洲综合在线| 亚洲成av人片观看| 国产福利精品一区二区| 欧美无砖砖区免费| 国产午夜精品一区二区 | 717成人午夜免费福利电影| 欧美变态tickle挠乳网站| 国产视频视频一区| 亚洲精品日日夜夜| 亚洲国产一二三| 国产美女视频一区| 色88888久久久久久影院按摩 | 久久综合视频网| 亚洲一区二区成人在线观看| 狠狠色狠狠色综合| 9色porny自拍视频一区二区| 欧洲亚洲国产日韩| 久久精品一区八戒影视| 奇米色一区二区| 欧美午夜在线观看| 国产精品国产自产拍在线| 肉丝袜脚交视频一区二区| 免费看日韩精品| 99久久精品国产精品久久| 在线观看91av| 中文字幕在线不卡一区| 国产一区高清在线| 欧美一区二区观看视频| 一片黄亚洲嫩模| 懂色av一区二区三区蜜臀| 欧美福利电影网| 亚洲人妖av一区二区| 久久精品国产免费看久久精品| 欧美三级资源在线| 欧美高清在线视频| 精彩视频一区二区| 欧美一区二区啪啪| 青青国产91久久久久久| 欧美妇女性影城| 视频一区国产视频| 欧美精品久久久久久久多人混战| 一区二区三区四区视频精品免费| 成人a区在线观看| 国产欧美日产一区| 成人激情免费网站| 欧美极品aⅴ影院| 国产一区啦啦啦在线观看| 欧美夫妻性生活| 午夜精品久久久久影视| 欧美色倩网站大全免费| 国产精品久久看| 国模冰冰炮一区二区| 国产亚洲一区二区三区四区|