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

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

?? av_headset_controls.c

?? csr 藍牙芯片 無線藍牙耳機的嵌入式程序
?? C
字號:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2004

FILE NAME
    av_headset_controls.c        

DESCRIPTION
    
NOTES

*/


/****************************************************************************
    Header files
*/
#include "av_headset_private.h"
#include "av_headset_controls.h"

#include <stdlib.h>
#include <string.h>
#include <panic.h>
#include <pio.h>
#include <codec.h>
#include <pcm.h>


static void controls_handler(Task task, MessageId id, Message message);


/* 
    Send remote control command to remote device 
*/
static void sendAVRCP(avTaskData* theAvApp, avc_operation_id op_id, uint8 state)
{
    theAvApp->avrcp_pending = TRUE;
    
    /* Send a key press */
    AvrcpPassthrough(theAvApp->avrcp, subunit_panel, 0, state, op_id, 0, 0);
}


/*************************************************************************
NAME    
     avHeadsetInitialiseControls
    
DESCRIPTION
     Initialises power and button control
RETURNS
     
*/
void avHeadsetInitialiseControls(avTaskData* theAvApp)
{
    /* hold power on so user can release the button */
    PioSet(POWER_HOLD,POWER_HOLD);
    PioSetDir(POWER_HOLD,POWER_HOLD);

    /* set the input gain to a reasonable value */
    theAvApp->output_gain = CodecOutputGainRange()/2;
    CodecSetOutputGainA(theAvApp->output_gain);
    CodecSetOutputGainB(theAvApp->output_gain);
    
    /* initial the handler task */
    theAvApp->controls_task.handler = controls_handler;
}

/*************************************************************************
NAME    
     avHeadsetStartPowerDown
    
DESCRIPTION
     Start to power down the headset gracefully
     
RETURNS
     
*/
void avHeadsetStartPowerDown(avTaskData* theAvApp)
{
	if (theAvApp->powering_down)
		return;
	
    theAvApp->powering_down = TRUE;
    
    /* Close down any active AV link */
    if ((theAvApp->a2dp_state == avHeadsetA2dpConnected) || (theAvApp->a2dp_state == avHeadsetA2dpStreaming))
    {
		/* Update the local state */
        avHeadsetSetA2dpState(avHeadsetA2dpConnected);

		/* Close the AV stream */
        A2dpClose(theAvApp->a2dp, theAvApp->media_sink);
    }
    /* Close down any active AVRCP link */
    if (theAvApp->avrcp_state == avHeadsetAvrcpConnected)
    {
        avHeadsetSetAvrcpState(avHeadsetAvrcpDisconnecting);
        AvrcpDisconnect(theAvApp->avrcp);
    }
    
    MessageSendLater(getAppTask(), POWER_OFF, 0, (uint32) 5000);
    
    avHeadsetCheckPowerDownStatus(theAvApp);
        
}

/*************************************************************************
NAME    
     avHeadsetCheckPowerDownStatus
    
DESCRIPTION
     Checks if connections have been successfully dropped and we have
     initiated power down. We can then power off.
     
RETURNS
     
*/
void avHeadsetCheckPowerDownStatus(const avTaskData *theAvApp)
{
    if (!theAvApp->powering_down)
        return;
    
    if ((theAvApp->a2dp_state == avHeadsetA2dpReady) && (theAvApp->avrcp_state == avHeadsetAvrcpReady))
    {
        DEBUG(("OK! We can power down early\n"));

        (void) MessageCancelAll(getAppTask(), POWER_OFF);
        MessageSend(getAppTask(), POWER_OFF, 0);
    }
}

/*************************************************************************
NAME    
     avHeadsetPowerDown
    
DESCRIPTION
     Power down the headset
     
RETURNS
     
*/
void avHeadsetPowerDown(void)
{
    DEBUG(("PowerDown and Panic\n"));
    
    /* disable power hold and LED */
    PioSetDir(POWER_HOLD | LED, 0);
    PioSet(POWER_HOLD | LED,0);

    /* in case the interface board is attached
       and keeping us alive we also halt the program. */
    Panic();
}

/*************************************************************************
NAME    
     avHeadsetHandleVolUp
    
DESCRIPTION
     Handle volume up
     
RETURNS
     
*/
void avHeadsetHandleVolUp(avTaskData* theAvApp)
{
    /* if gain is not at max, increase */
    if (theAvApp->output_gain < CodecOutputGainRange())
    {
        theAvApp->output_gain++;

        CodecSetOutputGainA(theAvApp->output_gain);
        CodecSetOutputGainB(theAvApp->output_gain);
    }
}


/*************************************************************************
NAME    
     avHeadsetHandleVolDown
    
DESCRIPTION
     Handle volume down
     
RETURNS
     
*/
void avHeadsetHandleVolDown(avTaskData* theAvApp)
{
    /* if gain is not at min, decrease */
    if (theAvApp->output_gain > 0)
    {
        theAvApp->output_gain--;

        CodecSetOutputGainA(theAvApp->output_gain);
        CodecSetOutputGainB(theAvApp->output_gain);
    }
}


enum
{
    PAUSE_PRESS,
    PAUSE_RELEASE,
    PLAY_PRESS,
    PLAY_RELEASE,
    FORWARD_PRESS,
    FORWARD_RELEASE,
    BACKWARD_PRESS,
    BACKWARD_RELEASE,
    STOP_PRESS,
    STOP_RELEASE
};

/*************************************************************************
NAME    
     controls_handler
    
DESCRIPTION
     Called when a button state change is pending which can now be sent.

     Messages will only be delivered when avrcp_pending is FALSE and
     hence when we are clear to send the message.
     
RETURNS
     
*/
static void controls_handler(Task task, MessageId id, Message message)
{
	task = task;
	message = message;

    switch (id)
    {
        case PAUSE_PRESS:
            DEBUG(("Sending Pause Pressed\n"));
            sendAVRCP(getApp(), opid_pause, 0);
            break;

        case PAUSE_RELEASE:
            DEBUG(("Sending Pause Released\n"));
            sendAVRCP(getApp(), opid_pause, 1);
            break;

        case PLAY_PRESS:
            DEBUG(("Sending Play Pressed\n"));
            sendAVRCP(getApp(), opid_play, 0);
            break;

        case PLAY_RELEASE:
            DEBUG(("Sending Play Released\n"));
            sendAVRCP(getApp(), opid_play, 1);
            break;

        case FORWARD_PRESS:
            DEBUG(("Sending Forward Pressed\n"));
            sendAVRCP(getApp(), opid_forward, 0);
            break;

        case FORWARD_RELEASE:
            DEBUG(("Sending Forward Released\n"));
            sendAVRCP(getApp(), opid_forward, 1);
            break;

        case BACKWARD_PRESS:
            DEBUG(("Sending Backward Pressed\n"));
            sendAVRCP(getApp(), opid_backward, 0);
            break;

        case BACKWARD_RELEASE:
            DEBUG(("Sending Backward Released\n"));
            sendAVRCP(getApp(), opid_backward, 1);
            break;

        case STOP_PRESS:
            DEBUG(("Sending Stop Pressed\n"));
            sendAVRCP(getApp(), opid_stop, 0);
            break;

        case STOP_RELEASE:
            DEBUG(("Sending Stop Released\n"));
            sendAVRCP(getApp(), opid_stop, 1);
            break;

		default:
			break;
    }
}


/*************************************************************************
NAME    
     avHeadsetPausePress
    
DESCRIPTION
     Signal that pause has been pressed.
     Note that the AV Control specification states that the pause
     button will toggle between playing/paused.
     
RETURNS
     
*/
void avHeadsetPausePress(avTaskData* theAvApp)
{
    /* see controls_handler description */
    MessageSendConditionally(&theAvApp->controls_task, PAUSE_PRESS, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetPauseRelease
    
DESCRIPTION
     Signal that pause has been released
     
RETURNS
     
*/
void avHeadsetPauseRelease(avTaskData* theAvApp)
{
    /* see button_handler message queue description */
    MessageSendConditionally(&theAvApp->controls_task, PAUSE_RELEASE, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetPlayPress
    
DESCRIPTION
     Signal that play has been pressed
     
RETURNS
     
*/
void avHeadsetPlayPress(avTaskData* theAvApp)
{
    /* see controls_handler description */
    MessageSendConditionally(&theAvApp->controls_task, PLAY_PRESS, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetPlayRelease
    
DESCRIPTION
     Signal that play has been released
     
RETURNS
     
*/
void avHeadsetPlayRelease(avTaskData* theAvApp)
{
    /* see button_handler message queue description */
    MessageSendConditionally(&theAvApp->controls_task, PLAY_RELEASE, NULL, &theAvApp->avrcp_pending);
}


/*************************************************************************
NAME    
     avHeadsetForwardPress
    
DESCRIPTION
     Signal that Forward has been pressed
     
RETURNS
     
*/
void avHeadsetForwardPress(avTaskData* theAvApp)
{
    /* see controls_handler description */
    MessageSendConditionally(&theAvApp->controls_task, FORWARD_PRESS, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetForwardRelease
    
DESCRIPTION
     Signal that Forward has been released
     
RETURNS
     
*/
void avHeadsetForwardRelease(avTaskData* theAvApp)
{
    /* see button_handler message queue description */
    MessageSendConditionally(&theAvApp->controls_task, FORWARD_RELEASE, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetBackwardPress
    
DESCRIPTION
     Signal that Backward has been pressed
     
RETURNS
     
*/
void avHeadsetBackwardPress(avTaskData* theAvApp)
{
    /* see controls_handler description */
    MessageSendConditionally(&theAvApp->controls_task, BACKWARD_PRESS, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetBackwardRelease
    
DESCRIPTION
     Signal that Backward has been released
     
RETURNS
     
*/
void avHeadsetBackwardRelease(avTaskData* theAvApp)
{
    /* see button_handler message queue description */
    MessageSendConditionally(&theAvApp->controls_task, BACKWARD_RELEASE, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetStopPress
    
DESCRIPTION
     Signal that Stop has been pressed
     
RETURNS
     
*/
void avHeadsetStopPress(avTaskData* theAvApp)
{
    /* see controls_handler description */
    MessageSendConditionally(&theAvApp->controls_task, STOP_PRESS, NULL, &theAvApp->avrcp_pending);
}

/*************************************************************************
NAME    
     avHeadsetStopRelease
    
DESCRIPTION
     Signal that Stop has been released
     
RETURNS
     
*/
void avHeadsetStopRelease(avTaskData* theAvApp)
{
    /* see button_handler message queue description */
    MessageSendConditionally(&theAvApp->controls_task, STOP_RELEASE, NULL, &theAvApp->avrcp_pending);
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品久久久久影视| 日本一区二区三级电影在线观看| 最新热久久免费视频| 高清不卡一区二区在线| 亚洲国产精品99久久久久久久久| 国产露脸91国语对白| 国产日韩欧美一区二区三区乱码 | 欧美精品九九99久久| 亚洲成人一区二区| 日韩一级黄色片| 美女视频网站黄色亚洲| 久久久国产一区二区三区四区小说 | 欧美性猛交xxxx乱大交退制版 | 日本一区二区三区免费乱视频| 国产一区二区三区国产| 国产精品久久二区二区| 欧美性色黄大片手机版| 人人爽香蕉精品| 国产日韩欧美一区二区三区综合| 成人av免费在线播放| 亚洲午夜精品一区二区三区他趣| 欧美一区二区在线播放| 国产盗摄一区二区三区| 亚洲美女区一区| 日韩一区二区免费在线电影| 福利电影一区二区三区| 亚洲一区二区av在线| 26uuu色噜噜精品一区| 99久久精品免费看| 免费黄网站欧美| 亚洲视频小说图片| 欧美成人福利视频| 一本色道a无线码一区v| 看国产成人h片视频| 亚洲视频在线观看三级| 日韩视频免费观看高清完整版在线观看| 国产不卡在线一区| 日韩电影免费在线看| **网站欧美大片在线观看| 日韩三级电影网址| 在线观看91精品国产入口| 国产一区 二区 三区一级| 亚洲不卡在线观看| 国产精品电影院| 日韩欧美亚洲另类制服综合在线| 色综合中文综合网| 日韩欧美在线网站| 色综合天天做天天爱| 国内精品写真在线观看| 亚洲国产精品天堂| 中文字幕一区二区5566日韩| 欧美不卡一区二区三区| 欧洲精品在线观看| thepron国产精品| 久久国产精品第一页| 亚洲在线观看免费| 国产精品国产三级国产a| 日韩女优制服丝袜电影| 欧美日韩国产精品成人| 99精品在线免费| 国产91富婆露脸刺激对白| 美国三级日本三级久久99| 午夜激情久久久| 亚洲一区av在线| 亚洲精品乱码久久久久久黑人| 久久久青草青青国产亚洲免观| 日韩一级二级三级精品视频| 欧美日韩综合不卡| 欧美三级在线视频| 在线国产亚洲欧美| 91久久精品网| 91精彩视频在线观看| 99久久免费视频.com| 成人黄色av网站在线| 成人avav影音| eeuss国产一区二区三区| 成人永久免费视频| 成人动漫中文字幕| 不卡的av中国片| thepron国产精品| 91在线视频官网| 色偷偷一区二区三区| 色婷婷av久久久久久久| 91小视频在线| 在线免费亚洲电影| 欧美亚洲日本一区| 欧美男人的天堂一二区| 欧美一区欧美二区| 精品国产区一区| 久久精品视频免费观看| 国产精品女人毛片| 亚洲精品视频一区| 五月激情综合婷婷| 免费观看成人av| 国产成人高清视频| 99精品国产视频| 精品视频一区二区三区免费| 欧美日韩电影在线| 精品成人私密视频| 国产精品麻豆欧美日韩ww| 日韩毛片在线免费观看| 亚洲午夜一区二区| 久久精品国产精品亚洲红杏 | 国产一区二区成人久久免费影院| 精品午夜一区二区三区在线观看 | 婷婷久久综合九色综合伊人色| 欧美aaaaa成人免费观看视频| 久久精品国产一区二区三 | 亚洲国产一区二区三区| 奇米四色…亚洲| 成人免费黄色大片| 欧美日韩在线电影| 337p粉嫩大胆色噜噜噜噜亚洲| 国产精品国产三级国产普通话蜜臀| 亚洲日本电影在线| 喷白浆一区二区| 91在线视频观看| 欧美成人一区二区三区片免费 | 欧美精品色综合| 久久久噜噜噜久久人人看 | 久久精品视频在线免费观看| 亚洲欧美电影院| 精品一区二区免费在线观看| 99在线精品免费| 欧美成人伊人久久综合网| 日韩理论片网站| 国内成人免费视频| 欧美综合在线视频| 国产三级精品视频| 日韩电影免费一区| 色欧美88888久久久久久影院| 91麻豆精品国产91久久久久久久久| 国产欧美一区二区精品久导航| 亚洲第一主播视频| kk眼镜猥琐国模调教系列一区二区 | 久久嫩草精品久久久精品| 亚洲午夜精品网| 97se亚洲国产综合自在线| 欧美sm极限捆绑bd| 天堂午夜影视日韩欧美一区二区| 成人福利视频在线| 精品999久久久| 三级不卡在线观看| 在线精品视频小说1| 中文字幕一区二区三区乱码在线| 久久成人免费网站| 69p69国产精品| 亚洲综合清纯丝袜自拍| 成人av免费在线| 26uuu亚洲综合色欧美 | 亚洲欧美偷拍另类a∨色屁股| 精品一区二区影视| 欧美精品v国产精品v日韩精品 | 欧美三级乱人伦电影| 亚洲一区二区中文在线| 风间由美性色一区二区三区| 精品少妇一区二区三区视频免付费| 亚洲国产精品久久不卡毛片 | 亚洲欧美综合色| 国产一区二区91| 久久综合色8888| 麻豆精品蜜桃视频网站| 欧美一区二区高清| 丝袜诱惑制服诱惑色一区在线观看 | 老司机精品视频一区二区三区| 在线电影院国产精品| 亚洲一区二区三区三| 色婷婷亚洲综合| 亚洲免费观看高清在线观看| 91亚洲精华国产精华精华液| 中文字幕在线一区二区三区| 成人高清视频免费观看| 欧美国产禁国产网站cc| 成人免费高清视频在线观看| 日本一区二区三区电影| 波多野结衣精品在线| 1000部国产精品成人观看| 91丨九色丨蝌蚪丨老版| 亚洲视频你懂的| 欧美亚洲一区二区在线| 香港成人在线视频| 日韩一区二区在线播放| 免费欧美高清视频| 欧美精品一区二区三区一线天视频| 激情综合一区二区三区| 国产欧美中文在线| 波多野结衣亚洲一区| 一区二区三区在线免费播放| 欧美亚洲一区二区在线观看| 日本va欧美va精品| 久久久国产精品麻豆| 99久久精品99国产精品 | 亚洲国产aⅴ天堂久久| 欧美一区二区视频免费观看| 韩国女主播一区二区三区| 亚洲成人动漫av| 日韩久久久精品| 成人av动漫在线| 国内久久婷婷综合| 51久久夜色精品国产麻豆|