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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? a2dp_handler.c

?? bluelab 3.52 里面的立體聲程序源代碼
?? C
字號:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2004-2006
Part of BlueLab 3.5.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 "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;
    
    (void) SinkGetBdAddr(ind->media_sink, &bdaddr_ind);
 
    /* We are now connected */
    setA2dpState(app, avHeadsetA2dpConnected);
    
    /* Play connect tone */
    if (!MessageCancelAll(getAppTask(), APP_A2DP_CLOSE_TIMER))
        playConnectTone(app);
        
    /* 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));
    
    /* Establish an AVRCP connection if required */
	if (app->avrcp_state == avHeadsetAvrcpReady)
	{
		/* Change to connecting state */
		setAvrcpState(app, avHeadsetAvrcpConnecting);
    
        /* Establish AVRCP connection */
		AvrcpConnect(app->avrcp, &bdaddr_ind);
	}

    /* Store the media sink */
    app->media_sink = ind->media_sink;
}


/**************************************************************************/
void avHeadsetHandleA2dpOpenCfm(headsetTaskData* app, const A2DP_OPEN_CFM_T* cfm)
{
    bdaddr bdaddr_cfm;
    
    if (cfm->result == a2dp_success)
    {
		(void)PsStore(LAST_USED_AV_SOURCE_SEP, &(cfm->sep_type), sizeof(a2dp_sep_type));  
        A2dpStart(app->a2dp, cfm->media_sink); 
        
        setA2dpState(app, avHeadsetA2dpConnected);
        
        /* Play connect tone */
        if (!MessageCancelAll(getAppTask(), APP_A2DP_CLOSE_TIMER))
            playConnectTone(app);
        
        /* Store the media sink and source id*/
        app->media_sink = cfm->media_sink;
        
        /* Establish an AVRCP connection if required */
	    if (app->avrcp_state == avHeadsetAvrcpReady)
        {
            if (SinkGetBdAddr(cfm->media_sink, &bdaddr_cfm))
            {
                setAvrcpState(app, avHeadsetAvrcpConnecting);
		        AvrcpConnect(app->avrcp, &bdaddr_cfm);
            }
	    }
    }
    else
    {
		playErrorTone(app);
        setA2dpState(app, avHeadsetA2dpReady);
    }
    app->headset_connecting_av = 0;
}


/**************************************************************************/
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);
    else
        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);
                return;
            }
            else
            {
                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);
    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);
        }
        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 to ready state */
    setA2dpState(app, avHeadsetA2dpReady);
    
    if (app->pcm_audio_state == pcm_tone_to_av)
        setPcmState(app, pcm_tone);
    if (app->pcm_audio_state == pcm_av)
        setPcmState(app, pcm_none);

    /* Switch to hfp mode */
    app->active_profile = hfp_active;
    
    if (app->avrcp_state == avHeadsetAvrcpConnected)
        AvrcpDisconnect(app->avrcp);
    
    app->media_sink = 0;

    /* Reconnect on link loss */
    if (ind->result == a2dp_disconnect_link_loss)
        avHeadsetHandleAvConnectRequest(app);

    /* If we're ready to power down don't wait any longer */    
    headsetCheckPowerDownStatus(app);
    
    MessageSendLater(getAppTask(), APP_A2DP_CLOSE_TIMER, 0, 1000);
}


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

    /* Change to ready state */
    setA2dpState(app, avHeadsetA2dpReady);
    
    app->media_sink = 0;

    /* If we're ready to power down don't wait any longer */    
    headsetCheckPowerDownStatus(app);
    
    MessageSendLater(getAppTask(), APP_A2DP_CLOSE_TIMER, 0, 1000);
}


/**************************************************************************/
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->headset_connecting_av = 1;
        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);
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品乱码久久久久久按摩| 日韩一级完整毛片| 欧美性一二三区| 日韩欧美国产午夜精品| 中文字幕中文字幕中文字幕亚洲无线| 亚洲第一av色| 国产一区二区免费视频| 99久久99久久精品免费观看| 一区二区三区中文字幕精品精品| 亚洲va韩国va欧美va精品| 国产在线视频一区二区三区| 欧美综合在线视频| 国产女主播一区| 麻豆高清免费国产一区| 欧美综合久久久| 国产精品久久午夜| 国产在线精品一区二区| 欧美一区二区三区日韩视频| 亚洲精品视频在线| 成人久久久精品乱码一区二区三区 | 国产精品女主播av| 男女男精品视频| 欧美最猛性xxxxx直播| 亚洲婷婷国产精品电影人久久| 国产一区91精品张津瑜| 99在线热播精品免费| 欧美xxxx在线观看| 亚洲人被黑人高潮完整版| 国产成人免费9x9x人网站视频| 精品久久久久av影院| 人人精品人人爱| 91精品国产综合久久精品app| 亚洲一区二区视频在线观看| 色狠狠av一区二区三区| 亚洲美女视频在线| 91亚洲精品久久久蜜桃网站| 亚洲私人影院在线观看| 色综合久久综合网97色综合 | 国产乱一区二区| 2024国产精品| 国产一区二区三区视频在线播放| 精品国产一区久久| 国产成人啪免费观看软件| 中文一区在线播放| 99久久综合国产精品| 亚洲三级电影全部在线观看高清| 91在线观看地址| 亚洲国产va精品久久久不卡综合| 欧美视频一区二| 日本美女一区二区| 久久综合色天天久久综合图片| 国产精品自拍一区| 国产精品高清亚洲| 欧美天天综合网| 免费在线观看一区二区三区| 欧美大片日本大片免费观看| 国产一区日韩二区欧美三区| 国产精品五月天| 91视频国产观看| 视频在线观看国产精品| 精品1区2区在线观看| 成人一区二区三区| 亚洲精品欧美激情| 欧美一区二区视频观看视频| 国产成人免费视频网站高清观看视频 | 一区二区三区在线观看网站| 欧美猛男gaygay网站| 国产一区二区影院| 亚洲一区二区三区在线| 亚洲精品一区在线观看| 99精品视频在线播放观看| 日韩综合在线视频| 国产视频一区在线播放| 在线精品视频小说1| 久久国产精品99精品国产| 亚洲特黄一级片| 精品播放一区二区| 色综合久久综合网欧美综合网| 免费精品视频在线| 亚洲日本护士毛茸茸| 欧美大片一区二区| 91国产免费看| 粉嫩在线一区二区三区视频| 天堂成人免费av电影一区| 中文字幕第一区综合| 91精品国产综合久久久蜜臀粉嫩| 风间由美一区二区av101| 蜜臀av一区二区在线免费观看| 亚洲天堂福利av| 久久久久久久久久看片| 欧美日韩一区高清| 91在线免费看| 国产91丝袜在线播放九色| 免费一级欧美片在线观看| 一区二区三区在线观看国产| 国产欧美一区二区三区沐欲| 日韩一区二区在线观看视频| 色婷婷av一区二区三区软件| 高清国产一区二区| 国产一区二区三区在线观看精品| 天天综合天天做天天综合| 最新国产の精品合集bt伙计| 国产日韩欧美精品综合| 久久综合九色综合97_久久久| 8x8x8国产精品| 欧美日韩黄视频| 欧美日韩激情在线| 欧美日韩在线综合| 91论坛在线播放| 色噜噜狠狠一区二区三区果冻| 成人黄色一级视频| 成人午夜在线免费| 成人黄色在线看| 成人动漫在线一区| 成人妖精视频yjsp地址| 国产麻豆日韩欧美久久| 国产一区在线精品| 激情久久五月天| 国内成人精品2018免费看| 精品一区二区三区在线播放视频| 久久精品久久99精品久久| 久久精品国产在热久久| 久久99久久精品欧美| 久久99蜜桃精品| 国产激情视频一区二区在线观看 | 宅男噜噜噜66一区二区66| 欧美吻胸吃奶大尺度电影| 免费看日韩精品| 日韩欧美中文字幕一区| 欧美男生操女生| 91精品国产综合久久久久| 欧美一区二区三区免费大片| 国产欧美一区二区三区在线看蜜臀| 国产免费久久精品| 成人欧美一区二区三区| 亚洲精品乱码久久久久| 午夜久久久影院| 麻豆国产精品官网| 国产成人在线影院| 色哟哟亚洲精品| 欧美丰满高潮xxxx喷水动漫| 日韩一区二区电影网| 久久久国产午夜精品| 亚洲色大成网站www久久九九| 一二三区精品视频| 精品一区精品二区高清| av动漫一区二区| 欧美人与禽zozo性伦| 久久久精品影视| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲一区二区av在线| 麻豆精品久久久| 91麻豆自制传媒国产之光| 这里只有精品电影| 国产精品久久久久影院亚瑟| 亚洲午夜在线电影| 国产伦精品一区二区三区免费| 99re视频精品| 日韩手机在线导航| 亚洲免费av观看| 国产伦精品一区二区三区免费迷| 色偷偷成人一区二区三区91| 日韩欧美资源站| 一级精品视频在线观看宜春院| 国产一区二区伦理| 欧美亚洲禁片免费| 久久青草国产手机看片福利盒子| 一区二区三区四区亚洲| 国产麻豆精品theporn| 欧美日韩中文另类| 国产精品网站一区| 久久精品99久久久| 欧美色图天堂网| 国产精品免费视频一区| 男男gaygay亚洲| 欧美日韩综合在线免费观看| 久久久久久久久久久久久久久99| 久久久精品黄色| 日韩激情视频在线观看| 99视频一区二区| 成人黄色软件下载| 日本麻豆一区二区三区视频| 中文字幕欧美区| 精品少妇一区二区三区在线播放 | 337p日本欧洲亚洲大胆色噜噜| 成人app软件下载大全免费| 日韩激情视频网站| 欧美三级乱人伦电影| 亚洲图片一区二区| 精品福利二区三区| 青娱乐精品视频| 欧洲精品一区二区| 中文字幕日韩一区二区| 久久久久久久精| 一区二区视频在线看| 国产成人在线色| 日本一区二区三区四区| 国产美女主播视频一区| 精品少妇一区二区三区在线视频| 免费观看日韩av|