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

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

?? chipcon remote control.cpp

?? reference about wireless design which is helpful to everyone
?? CPP
字號:
#include "stdafx.h"
#include "Chipcon Remote Control.h"
#include "WinampGen.h"
#include "WinampIpc.h"

static const GUID WINAMP_REMOTE_GUID = { 0xEFA3F566, 0x6E8C, 0x4CC2, { 0x93, 0xFB, 0x31, 0x3B, 0x1B, 0xA3, 0x4D, 0x9E } };

// Global variables
HANDLE hRemoteControlThread;
HANDLE hRemoteDisplayThread;
HANDLE hDeviceMonitorThread;
CudalPipe *pControlPipe;
CudalPipe *pDisplayPipe;
CudalDongle *pDongle;
BOOL quitAsap;


// Function prototypes
int waInit(void);
void waConfig(void);
void waQuit(void);


winampGeneralPurposePlugin plugin = {
	GPPHDR_VER,
	"Chipcon Remote Control", // Description
	waInit,					  // Initialization function
	waConfig,					  // Configuration function
	waQuit					  // Deinitialization function
};




BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    return TRUE;
}




DWORD WINAPI RemoteDisplayThread(LPVOID lpParameter) {
    WINAMP_DISPLAY_DATA lastWaDispData;
    WINAMP_DISPLAY_DATA waDispData;
    int lastTime = -1;
    BOOL forceRefresh;
    memset(&lastWaDispData, 0x00, sizeof(WINAMP_DISPLAY_DATA));

    // Bail out when Winamp tells us to, or die in sympathy for the other thread
    while (!quitAsap && pControlPipe) {

        // Initialize displayData
        memset(&waDispData, 0x00, sizeof(WINAMP_DISPLAY_DATA));

        // Get output time
        int time = WA_GET_PLAY_TIME();
        if (time != -1) {
            waDispData.milliseconds = time % 1000;
            waDispData.seconds = (time / 1000) % 60;
            waDispData.minutes = time / (1000 * 60);

            // Check output time for changes
            if ((waDispData.milliseconds != lastWaDispData.milliseconds) ||
                (waDispData.seconds != lastWaDispData.seconds) ||
                (waDispData.minutes != lastWaDispData.minutes)) {
                waDispData.refresh |= WDD_REFRESH_TIME_BM;
            }
        }

        // Check the time for significant changes
        if (time < lastTime) {
            forceRefresh = TRUE;
        } else if (time > (lastTime + SIGNIFICANT_TIME_DELTA)) {
            forceRefresh = TRUE;
        } else {
            forceRefresh = FALSE;
        }
        lastTime = time;
        
        // Get play state
        waDispData.state = 0x00;
        if (WA_IS_PLAYING()) {
            waDispData.state |= WDD_STATE_PLAYING_BM;
        } else if (WA_IS_PAUSED()) {
            waDispData.state |= WDD_STATE_PAUSED_BM;
        }

        // Check player state for changes
        if ((waDispData.state & (WDD_STATE_PLAYING_BM | WDD_STATE_PAUSED_BM)) != 
            (lastWaDispData.state & (WDD_STATE_PLAYING_BM | WDD_STATE_PAUSED_BM))) {
            waDispData.refresh |= WDD_REFRESH_PLAY_STATE_BM;
        }

        // Get shuffle state
        if (WA_GET_SHUFFLE()) waDispData.state |= WDD_STATE_SHUFFLE_BM;

        // Check shuffle state for changes
        if ((waDispData.state & WDD_STATE_SHUFFLE_BM) != (lastWaDispData.state & WDD_STATE_SHUFFLE_BM)) {
            waDispData.refresh |= WDD_REFRESH_SHUFFLE_STATE_BM;
        }

        // Get track title
        int titleLength;
        if (WA_GET_LIST_LENGTH()) {
            char *pTitlePtr = WA_GET_LIST_TITLE(WA_GET_LIST_POS());
            memcpy(waDispData.pTitle, pTitlePtr, min(sizeof(waDispData.pTitle), strlen(pTitlePtr)));
            titleLength = strlen(pTitlePtr);
        } else {
            sprintf(waDispData.pTitle, "- No playlist -");
            titleLength = strlen(waDispData.pTitle);
        }

        // Calculate the total length of the display data 
        waDispData.totalLength = sizeof(waDispData) 
                               - sizeof(waDispData.pTitle)
                               + titleLength;

        // Check track title for changes
        if ((waDispData.totalLength != lastWaDispData.totalLength) ||
            (memcmp(waDispData.pTitle, lastWaDispData.pTitle, titleLength) != 0)) {
            waDispData.refresh |= WDD_REFRESH_TITLE_BM;
        }

        // Send it if there are any relevant changes
        if ((waDispData.refresh & (WDD_REFRESH_PLAY_STATE_BM | WDD_REFRESH_SHUFFLE_STATE_BM | WDD_REFRESH_TITLE_BM)) || 
            (forceRefresh)) {

            DWORD length = waDispData.totalLength;
            switch (pDisplayPipe->WriteSync(&waDispData, &length, 100)) {
            case USBIO_ERR_SUCCESS:
            case USBIO_ERR_TIMEOUT:
                // It's only a success if the transferred length is correct
                if (length == waDispData.totalLength) break;
            default:
                // Fatal error (possibly disconnection)
                goto error;
            }
        }

        memcpy(&lastWaDispData, &waDispData, sizeof(WINAMP_DISPLAY_DATA));

        Sleep(DISPLAY_INTERVAL);
    }
error:
    delete pDisplayPipe;
    pDisplayPipe = NULL;    

    return 0;
}




DWORD WINAPI RemoteControlThread(LPVOID lpParameter) {
    WINAMP_CONTROL_DATA controlData;
    CudalAsyncInfo asyncInfo;
    DWORD length;

    // Start polling
    if (!pControlPipe->ReadAsync(&asyncInfo, &controlData, sizeof(WINAMP_CONTROL_DATA))) {
        goto error;
    }

    // Bail out when Winamp tells us to, or die in sympathy for the other thread
    while (!quitAsap && pDisplayPipe) {

        // Did we get anything?
        switch (pControlPipe->WaitAsync(&asyncInfo, &length, 100)) {
        case USBIO_ERR_SUCCESS:

            // Make sure that we got it all...
            if (length == 2) {

                // When a command is received, perform the corresponding action
                switch (controlData.command) {
                case DONGLE_CMD_PREVIOUS_TRACK: WA_CMD_PREVIOUS_TRACK();             break;
                case DONGLE_CMD_PLAY:           WA_CMD_PLAY();                       break;
                case DONGLE_CMD_PAUSE:          WA_CMD_PAUSE();                      break;
                case DONGLE_CMD_STOP:           WA_CMD_STOP();                       break;
                case DONGLE_CMD_NEXT_TRACK:     WA_CMD_NEXT_TRACK();                 break;
                case DONGLE_CMD_VOLUMEUP:       WA_CMD_VOLUMEUP();                   break;
                case DONGLE_CMD_VOLUMEDOWN:     WA_CMD_VOLUMEDOWN();                 break;
                case DONGLE_CMD_FFWD5S:         WA_CMD_FFWD5S();                     break;
                case DONGLE_CMD_REW5S:          WA_CMD_REW5S();                      break;
                case DONGLE_SET_REPEAT:         WA_SET_REPEAT(controlData.value);    break;
                case DONGLE_SET_SHUFFLE:        WA_SET_SHUFFLE(controlData.value);   break;
                case DONGLE_SET_VOLUME:         WA_SET_VOLUME(controlData.value);    break;
                }
            }

            // Continue polling
            if (!pControlPipe->ReadAsync(&asyncInfo, &controlData, sizeof(WINAMP_CONTROL_DATA))) {
                goto error;
            }
            break;

        case USBIO_ERR_TIMEOUT:
            // A timeout does not have any effect
            break;

        default:
            // Fatal error (possibly disconnection)
            goto error;
        }
    }

error:

    // Terminate the transfer
    pControlPipe->AbortAll();
    pControlPipe->WaitAsyncTermination(&asyncInfo);

    // Delete the control pipe to tell the other threads that we're done
    delete pControlPipe;
    pControlPipe = NULL;
    
    return 0;
}




DWORD WINAPI DongleMonitorThread(LPVOID lpParameter) {
    DWORD dummy;
	
    
    // This is sort of the main loop. Leave when the quit signal is given
    while (!quitAsap) {

        // If the pipes don't exist, then try to find a dongle to connect to
        if (!pControlPipe && !pDisplayPipe) {

            // Close the old thread handles
            if (hRemoteControlThread) { 
                CloseHandle(hRemoteControlThread); 
                hRemoteControlThread = NULL; 
            }
            if (hRemoteDisplayThread) { 
                CloseHandle(hRemoteDisplayThread); 
                hRemoteDisplayThread = NULL; 
            }
            
            // Clean up after last rounds
            if (pDongle) { 
                delete pDongle; 
                pDongle = NULL;
            }

            // Find the correct dongle type
            CUDAL_DONGLE_INFO pDongleInfo[MAX_DONGLE_ENUM_COUNT];
            int dongleCount = CudalDongle::EnumDongles(pDongleInfo, MAX_DONGLE_ENUM_COUNT, &WINAMP_REMOTE_GUID);
            for (int n = 0; n < dongleCount; n++) {
                if ((pDongleInfo[n].vendorId == CHIPCON_VID) &&
                    (pDongleInfo[n].productId == WINAMP_REMOTE_CONTROL_PID)) {

                    // If the dongle object could be created, then create the control and display pipes
                    if (pDongle = CudalDongle::CreateDongle(&pDongleInfo[n], 0, &WINAMP_REMOTE_GUID)) {
                        pDisplayPipe = pDongle->CreatePipe(REMOTE_DISPLAY_ENDPOINT, FALSE);
                        pControlPipe = pDongle->CreatePipe(REMOTE_CONTROL_ENDPOINT, TRUE);

                        // When both pipes have been created, the two data transfer threads can be started
                        if (pDisplayPipe && pControlPipe) {
                            hRemoteControlThread = CreateThread(NULL, 0, RemoteControlThread, NULL, 0, &dummy);
                            hRemoteDisplayThread = CreateThread(NULL, 0, RemoteDisplayThread, NULL, 0, &dummy);
							n = dongleCount;//stop searching
                        
                        // If not, then destroy everything
                        } else {
                            if (pDisplayPipe) { delete pDisplayPipe; pDisplayPipe = NULL; }
                            if (pControlPipe) { delete pControlPipe; pControlPipe = NULL; }
                            if (pDongle) { delete pDongle; pDongle = NULL; }
                        }
                    }
                }
            }
        }

        // Reduce activity
        for (int s = 0; s < 10; s++) {
            if (!quitAsap) {
                Sleep(MONITOR_INTERVAL / 10);
            }
        }
    }

    // Wait for the other threads to quit before destroying the dongle object
    if (hRemoteControlThread) {
        WaitForSingleObject(hRemoteControlThread, 5000);
        CloseHandle(hRemoteControlThread);
    }
    if (hRemoteDisplayThread) {
        WaitForSingleObject(hRemoteDisplayThread, 5000);
        CloseHandle(hRemoteDisplayThread);
    }
    if (pDongle) delete pDongle;

    return 0;
}




int waInit(void) {
    DWORD dummy;
    
    // Reset relevant globals
    hRemoteControlThread = 0;
    hRemoteDisplayThread = 0;
    pControlPipe = NULL;
    pDisplayPipe = NULL;
    pDongle = NULL;
    quitAsap = FALSE;

    // Start the monitoring thread, which discovers a dongle and initializes it
    hDeviceMonitorThread = CreateThread(NULL, 0, DongleMonitorThread, NULL, 0, &dummy);
    return 0;
}




void waConfig(void) { 
    MessageBox(plugin.hwndParent, 
               "This plug-in demonstrates the Chipcon USB Dongle Access Library\n"
               "(CUDAL). Download \"winamp_remote.hex\" into a CC2510 on a\n"
               "SmartRF04EB, and \"winamp_dongle.hex\" into the CC2511 dongle.\n"
               "The plug-in will detect and attach to the first unused remote\n"
               "control that it finds. The dongle safely be removed at any time\n"
               "and re-connected later on.", 
               "Chipcon Remote Control",
               MB_OK | MB_ICONINFORMATION);
}




void waQuit(void) {   
    quitAsap = TRUE;
    WaitForSingleObject(hDeviceMonitorThread, INFINITE);
    CloseHandle(hDeviceMonitorThread);
}



extern "C" {
    __declspec(dllexport) winampGeneralPurposePlugin *winampGetGeneralPurposePlugin(void) { 
	    return &plugin;
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品久久精品| 亚洲嫩草精品久久| 国产成人在线影院 | 国产精品女同一区二区三区| 精品一区二区三区香蕉蜜桃| 日韩精品一区二区三区老鸭窝| 天天综合日日夜夜精品| 日韩亚洲欧美在线观看| 极品美女销魂一区二区三区免费| 久久婷婷综合激情| 国产成a人亚洲| 日韩美女视频一区二区 | 欧美日韩一区二区三区视频| 一级做a爱片久久| 欧美一区二区三区系列电影| 韩国av一区二区三区四区| 国产情人综合久久777777| 99在线视频精品| 午夜精品久久久久久久| 日韩一卡二卡三卡四卡| 国产乱国产乱300精品| 成人免费小视频| 欧美日韩中文字幕精品| 精品亚洲国内自在自线福利| 国产视频一区在线观看| 欧亚洲嫩模精品一区三区| 老色鬼精品视频在线观看播放| 国产亚洲污的网站| 在线这里只有精品| 精品一区二区免费在线观看| 中文字幕亚洲精品在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 亚洲国产日韩av| 2022国产精品视频| 欧美综合天天夜夜久久| 国产一区二区三区免费| 亚洲精品国产视频| 精品国产一区二区三区av性色| 白白色 亚洲乱淫| 日本一区中文字幕| 综合久久给合久久狠狠狠97色| 7777精品伊人久久久大香线蕉完整版 | 亚洲精品国产a| 日韩女优毛片在线| 色噜噜狠狠色综合中国| 国产裸体歌舞团一区二区| 亚洲午夜羞羞片| 国产精品卡一卡二| 精品国产91久久久久久久妲己| 色婷婷亚洲婷婷| 国产成人在线视频网站| 日本vs亚洲vs韩国一区三区二区| 自拍偷自拍亚洲精品播放| 精品欧美一区二区在线观看| 欧美亚洲综合网| 成人av在线播放网站| 精品一区二区三区久久| 视频一区在线视频| 亚洲一二三区在线观看| 中文字幕亚洲成人| 日本一区二区三级电影在线观看| 欧美一级日韩一级| 欧美裸体bbwbbwbbw| 色婷婷综合久久久中文一区二区| 国产精品911| 久久国产精品免费| 日本一区中文字幕 | 欧美亚洲一区二区三区四区| 不卡的av电影在线观看| 国产老妇另类xxxxx| 日本不卡一区二区三区 | 欧美四级电影在线观看| 99久久99久久精品免费看蜜桃| 国产精品一区专区| 国产一区二区三区久久久 | 91在线看国产| 97久久人人超碰| 91在线观看成人| 91麻豆自制传媒国产之光| a级精品国产片在线观看| 成人不卡免费av| 成人动漫一区二区| 99国产精品久| 91亚洲永久精品| 91久久线看在观草草青青| 91福利视频久久久久| 欧美在线一区二区三区| 在线观看免费视频综合| 日本丶国产丶欧美色综合| 欧美视频三区在线播放| 91精品国产综合久久蜜臀| 日韩欧美一区二区视频| 欧美精品一区二区三区在线| 精品国产一区二区亚洲人成毛片| 久久综合久久久久88| 国产亚洲综合av| 日韩理论在线观看| 亚洲一级片在线观看| 日韩高清在线不卡| 国产一区不卡在线| 不卡视频在线看| 欧美亚洲综合色| 欧美videossexotv100| 中文字幕精品一区二区精品绿巨人| 中文字幕中文字幕一区二区| 一区二区三区中文字幕在线观看| 亚洲午夜电影在线| 激情久久久久久久久久久久久久久久| 韩国毛片一区二区三区| 97精品久久久午夜一区二区三区| 欧美亚一区二区| 精品久久久久久久久久久久久久久 | 欧洲精品在线观看| 欧美大尺度电影在线| 国产精品免费看片| 天天操天天综合网| 国产伦精品一区二区三区免费迷 | 在线精品视频一区二区| 欧美一区二区在线视频| 国产拍揄自揄精品视频麻豆| 亚洲欧美激情插| 久久成人免费网站| 91国偷自产一区二区使用方法| 91精品国产综合久久精品| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 中文字幕亚洲不卡| 免费成人美女在线观看| 成人激情黄色小说| 制服丝袜中文字幕亚洲| 中文在线资源观看网站视频免费不卡| 亚洲一二三区不卡| 色综合婷婷久久| 欧美一级黄色大片| 亚洲三级小视频| 久久99久久精品| 欧美影院精品一区| 国产精品黄色在线观看| 免费xxxx性欧美18vr| 色网综合在线观看| 国产精品无码永久免费888| 日本欧美大码aⅴ在线播放| 91欧美一区二区| 国产色婷婷亚洲99精品小说| 日韩和的一区二区| 91黄色免费网站| 日韩伦理av电影| 成人午夜视频网站| 久久蜜臀精品av| 久久精品999| 制服丝袜成人动漫| 亚洲国产裸拍裸体视频在线观看乱了 | 精品国产一区二区三区四区四| 夜夜亚洲天天久久| 91在线无精精品入口| 欧美—级在线免费片| 国内精品久久久久影院一蜜桃| 欧美日本一区二区三区| 亚洲一区中文在线| 在线一区二区三区做爰视频网站| 国产精品亲子乱子伦xxxx裸| 国产乱淫av一区二区三区| 精品免费99久久| 美国av一区二区| 日韩美女视频在线| 久久99九九99精品| 日韩欧美一区二区免费| 美女脱光内衣内裤视频久久网站| 欧美性大战久久久久久久蜜臀| 亚洲日本成人在线观看| 91在线国产观看| 一区二区三区av电影| 在线观看视频一区二区欧美日韩| 亚洲人成在线观看一区二区| 91亚洲精品乱码久久久久久蜜桃 | 91日韩精品一区| 综合激情成人伊人| 色94色欧美sute亚洲13| 一区二区三区视频在线看| 色老综合老女人久久久| 亚洲大型综合色站| 91精品国产免费久久综合| 看片的网站亚洲| 久久久久久免费网| 成人黄色大片在线观看| 亚洲精品福利视频网站| 欧美网站大全在线观看| 日韩黄色小视频| 精品福利av导航| 国产精品自拍一区| 成人欧美一区二区三区小说| 色妹子一区二区| 日韩av高清在线观看| 亚洲精品在线免费观看视频| 国产成人精品免费视频网站| 亚洲色图欧美在线| 欧美日韩成人在线| 国产一区二区主播在线| 亚洲欧洲一区二区三区| 精品视频在线视频| 国产麻豆成人精品|