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

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

?? cpi_player_engine.c

?? VC++視頻開發實例集錦(包括“遠程視頻監控”"語音識別系統"等13個經典例子)
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include "stdafx.h"
#include "globals.h"
#include "CPI_Player.h"
#include "CPI_Player_Messages.h"
#include "CPI_Player_CoDec.h"
#include "CPI_Player_Output.h"
#include "CPI_Equaliser.h"

typedef struct __CPs_PlayerContext
{
    CPs_PlayEngine* m_pBaseEngineParams;
    CPs_CoDecModule m_CoDecs[CP_CODEC_last+1];
    CPs_OutputModule m_OutputModules[CP_OUTPUT_last+1];

    CPs_OutputModule* m_pCurrentOutputModule;
    BOOL m_bOutputActive;
    DWORD m_dwCurrentOutputModule;
    int m_iInternalVolume;

    int m_iLastSentTime_Secs;
    int m_iLastSentTime_Proportion;
    int m_iProportion_TrackLength;

    int m_iOpenDevice_Freq_Hz;
    BOOL m_bOpenDevice_Stereo;
    BOOL m_bOpenDevice_16bit;

    CPs_EqualiserModule m_Equaliser;

} CPs_PlayerContext;

void UpdateProgress(CPs_PlayerContext* pContext);
void EmptyOutputStream(CPs_PlayerContext* pContext);
void StartPlay(CPs_CoDecModule* pCoDec, CPs_PlayerContext* pContext);
void EnumOutputDevices(CPs_PlayerContext* pContext);
CPs_CoDecModule* OpenCoDec(CPs_PlayerContext* pContext, const char* pcFilename);
void CleanupCoDecs(CPs_PlayerContext* pContext);
void SetCurrentOutputModule(CPs_PlayerContext* pContext, CPs_OutputModule* pNewOuputModule, BOOL* pbForceRefill);
void AssociateFileExtensions(CPs_PlayerContext* pContext);
////////////////////////////////////////////////////////////////////////////////
DWORD WINAPI CPI_Player__EngineEP(void* pCookie)
{
    BOOL bTerminateThread = FALSE;
    HRESULT hr_ComState;
    CPs_PlayerContext playercontext;

    playercontext.m_pBaseEngineParams = (CPs_PlayEngine*)pCookie;
    playercontext.m_bOutputActive = FALSE;
    playercontext.m_iProportion_TrackLength = 0;
    playercontext.m_iLastSentTime_Secs = -1;
    playercontext.m_iLastSentTime_Proportion = -1;
    playercontext.m_iInternalVolume = 100;
    CP_CHECKOBJECT(playercontext.m_pBaseEngineParams);

    CP_TRACE0("Cooler Engine Startup");
    hr_ComState = CoInitialize(NULL);

    // 為該線程初始化 USER32.DLL 
    {
        MSG msgDummy;
        PeekMessage(&msgDummy, 0, WM_USER, WM_USER, PM_NOREMOVE);

        // 用信號通知此線程已經準備好輸入
        SetEvent(playercontext.m_pBaseEngineParams->m_hEvtThreadReady);
    }

    // 初始化 CoDecs
    CP_InitialiseCodec_MPEG(&playercontext.m_CoDecs[CP_CODEC_MPEG]);
    CP_InitialiseCodec_WAV(&playercontext.m_CoDecs[CP_CODEC_WAV]);
 //   CP_InitialiseCodec_OGG(&playercontext.m_CoDecs[CP_CODEC_OGG]);
//    CP_InitialiseCodec_WinAmpPlugin(&playercontext.m_CoDecs[CP_CODEC_WINAMPPLUGIN]);

    // 初始化輸出模式
    if(options.decoder_output_mode > CP_OUTPUT_last)
        options.decoder_output_mode = CP_OUTPUT_last;
    playercontext.m_dwCurrentOutputModule = options.decoder_output_mode;
    CPI_Player_Output_Initialise_WaveMapper(&playercontext.m_OutputModules[CP_OUTPUT_WAVE]);
    CPI_Player_Output_Initialise_DirectSound(&playercontext.m_OutputModules[CP_OUTPUT_DIRECTSOUND]);
    CPI_Player_Output_Initialise_File(&playercontext.m_OutputModules[CP_OUTPUT_FILE]);
    playercontext.m_pCurrentOutputModule = &playercontext.m_OutputModules[playercontext.m_dwCurrentOutputModule];


    // 初始化 EQ
    CPI_Player_Equaliser_Initialise_Basic(&playercontext.m_Equaliser);

    do
    {
        // 處理任何未決的消息
        BOOL bForceRefill = FALSE;
        MSG msg;
        DWORD dwWaitResult;
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            // 解碼引擎消息
            switch(msg.message)
            {
            case CPTM_QUIT:
                bTerminateThread = TRUE;
                break;

            case CPTM_OPENFILE:
                {
                    char* pcFilename = (char*)msg.wParam;

                    // 如果這里有另一個不定的打開文件,那么忽略此文件。
                    // 當進程沒有響應(on an http connect for example),
                    // 而且用戶還在不停的點擊播放按鈕時,這將非常有用。
					//- (這將導致大量的打開/關閉消息被放置倒隊列中,而這些消息將占用線程幾年的時間)
                    MSG msg2;
                    if(PeekMessage(&msg2, NULL, CPTM_OPENFILE, CPTM_OPENFILE, PM_NOREMOVE) == FALSE)
                    {
                        CPs_CoDecModule* pNewCoDec;

                        // 如果此處有CoDec播放,那么關閉之
                        if(playercontext.m_pCurrentOutputModule->m_pCoDec)
                        {
                            playercontext.m_pCurrentOutputModule->m_pCoDec->CloseFile(playercontext.m_pCurrentOutputModule->m_pCoDec);
                            playercontext.m_pCurrentOutputModule->m_pCoDec = NULL;
                        }

                        CP_TRACE1("Openfile \"%s\"", pcFilename);
                        pNewCoDec = OpenCoDec(&playercontext, pcFilename);

                        // 如果打開失敗,那么從接口申請一個新的流
                        if(pNewCoDec == NULL)
                        {
                            PostMessage(playercontext.m_pBaseEngineParams->m_hWndNotify, CPNM_PLAYERSTATE, (WPARAM)cppsEndOfStream, 0);
                        }
                        // 檢查文件格式 - 取樣率,聲道數或者取樣大小是否改變
                        // 然后,清除當前的輸出,關閉輸出裝備 (著將導致一個 gap
                        // - 但僅當格式改變時)
                        else if(playercontext.m_bOutputActive == TRUE)
                        {
                            CPs_FileInfo FileInfo;
                            pNewCoDec->GetFileInfo(pNewCoDec, &FileInfo);
                            if(//FileInfo.m_iFreq_Hz != playercontext.m_iOpenDevice_Freq_Hz
                                    FileInfo.m_bStereo != playercontext.m_bOpenDevice_Stereo
                                    || FileInfo.m_b16bit != playercontext.m_bOpenDevice_16bit
									)
                            {
                                CP_TRACE0("Stream format changes - clearing stream");
                                EmptyOutputStream(&playercontext);
                                StartPlay(pNewCoDec, &playercontext);
                                bForceRefill = TRUE;
                            }
                        }

                        playercontext.m_pCurrentOutputModule->m_pCoDec = pNewCoDec;
                    }
#ifdef _DEBUG
                    else
                    {
                        CP_TRACE1("Openfile of \"%s\" ignored due to other opens in the queue", pcFilename);
                    }
#endif

                    // 清空
                    free(pcFilename);
                }
                break;

            case CPTM_SEEK:
                if(playercontext.m_bOutputActive == TRUE)
                {
                    // 如果有另一個消息在此位置,忽略其他的!
                    MSG msg2;
                    if(PeekMessage(&msg2, NULL, CPTM_SEEK, CPTM_SEEK, PM_NOREMOVE) == FALSE)
                    {
                        if(playercontext.m_pCurrentOutputModule->m_pCoDec)
                            playercontext.m_pCurrentOutputModule->m_pCoDec->Seek(playercontext.m_pCurrentOutputModule->m_pCoDec, (int)msg.wParam, (int)msg.lParam);
                        playercontext.m_pCurrentOutputModule->Flush(playercontext.m_pCurrentOutputModule);
                        bForceRefill = TRUE;
                    }
                }
                break;

            case CPTM_PLAY:
                if(playercontext.m_pCurrentOutputModule->m_pCoDec)
                {
                    // 如果沒有輸出stage - 馬上初始化
                    if(playercontext.m_bOutputActive == FALSE)
                    {
                        StartPlay(playercontext.m_pCurrentOutputModule->m_pCoDec, &playercontext);
                        bForceRefill = TRUE;
                    }
                    playercontext.m_pCurrentOutputModule->SetPause(playercontext.m_pCurrentOutputModule, FALSE);
                    PostMessage(playercontext.m_pBaseEngineParams->m_hWndNotify, CPNM_PLAYERSTATE, (WPARAM)cppsPlaying, 0);
                    playercontext.m_iLastSentTime_Secs = -1;
                    playercontext.m_iLastSentTime_Proportion = -1;
                    UpdateProgress(&playercontext);
                }
                break;

            case CPTM_STOP:
                if(playercontext.m_pCurrentOutputModule->m_pCoDec)
                {
                    playercontext.m_pCurrentOutputModule->m_pCoDec->CloseFile(playercontext.m_pCurrentOutputModule->m_pCoDec);
                    playercontext.m_pCurrentOutputModule->m_pCoDec = NULL;
                }
                if(playercontext.m_bOutputActive == TRUE)
                {
                    playercontext.m_bOutputActive = FALSE;
                    playercontext.m_pCurrentOutputModule->Uninitialise(playercontext.m_pCurrentOutputModule);
                }
                PostMessage(playercontext.m_pBaseEngineParams->m_hWndNotify, CPNM_PLAYERSTATE, (WPARAM)cppsStopped, 0);
                break;

            case CPTM_PAUSE:
                CP_TRACE0("Pause");
                if(playercontext.m_bOutputActive == TRUE)
                    playercontext.m_pCurrentOutputModule->SetPause(playercontext.m_pCurrentOutputModule, TRUE);
                PostMessage(playercontext.m_pBaseEngineParams->m_hWndNotify, CPNM_PLAYERSTATE, (WPARAM)cppsPaused, 0);
                break;

            case CPTM_SETPROGRESSTRACKLENGTH:
                playercontext.m_iProportion_TrackLength = (int)msg.wParam;
                break;

            case CPTM_SENDSYNCCOOKIE:
                PostMessage(playercontext.m_pBaseEngineParams->m_hWndNotify, CPNM_SYNCCOOKIE, msg.wParam, 0);
                break;

            case CPTM_BLOCKMSGUNTILENDOFSTREAM:
                EmptyOutputStream(&playercontext);
                break;

            case CPTM_ENUMOUTPUTDEVICES:
                EnumOutputDevices(&playercontext);
                break;

            case CPTM_SETEQSETTINGS:
                {
                    MSG msg2;
                    CPs_EQSettings* pEQ = (CPs_EQSettings*)msg.wParam;

                    // 如果有另一個未決的EQ 消息,不要處理這個(試圖減少噪音)
                    if(PeekMessage(&msg2, NULL, CPTM_SETEQSETTINGS, CPTM_OPENFILE, PM_NOREMOVE) == FALSE)
                    {
                        BOOL bEQEnableStateChanged;
                        playercontext.m_Equaliser.ApplySettings(&playercontext.m_Equaliser, pEQ, &bEQEnableStateChanged);

                        // 清空緩存(這將音樂的不連續,但至少
						//  EQ 設置會立即改變
                        if(playercontext.m_bOutputActive == TRUE && playercontext.m_pCurrentOutputModule->OnEQChanged)
                            playercontext.m_pCurrentOutputModule->OnEQChanged(playercontext.m_pCurrentOutputModule);
                    }
                    free(pEQ);
                }
                break;

            case CPTM_ONOUTPUTMODULECHANGE:
                {
                    playercontext.m_dwCurrentOutputModule = options.decoder_output_mode;
                    SetCurrentOutputModule(&playercontext, NULL, &bForceRefill);
                }
                break;

            case CPTM_ASSOCIATEFILEEXTENSIONS:
                AssociateFileExtensions(&playercontext);
                break;

            case CPTM_SETINTERNALVOLUME:
                playercontext.m_iInternalVolume = (int)msg.wParam;
                if(playercontext.m_bOutputActive == TRUE && playercontext.m_pCurrentOutputModule->SetInternalVolume)
                    playercontext.m_pCurrentOutputModule->SetInternalVolume(playercontext.m_pCurrentOutputModule, playercontext.m_iInternalVolume);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区男人的天堂| 久久理论电影网| 精品一区二区三区免费播放| 中文字幕在线视频一区| 日韩三级中文字幕| 色婷婷久久久综合中文字幕| 国产精品一二二区| 蜜芽一区二区三区| 亚洲午夜久久久| 国产精品三级电影| 精品国产青草久久久久福利| 欧美日韩视频专区在线播放| 97久久精品人人澡人人爽| 国产精品乡下勾搭老头1| 美女在线视频一区| 日韩激情视频在线观看| 亚洲美女屁股眼交| 国产欧美视频在线观看| 精品乱码亚洲一区二区不卡| 欧美日韩亚洲丝袜制服| 色诱亚洲精品久久久久久| 高清av一区二区| 国产美女一区二区三区| 国内精品久久久久影院色| 久久精品国产第一区二区三区 | 亚洲欧美色一区| 欧美国产激情一区二区三区蜜月| 日韩欧美高清dvd碟片| 8x福利精品第一导航| 欧美日韩国产一区| 欧美日韩在线播放三区四区| 在线免费精品视频| 欧洲av在线精品| 欧美日韩在线播放| 欧美日韩亚洲综合| 6080日韩午夜伦伦午夜伦| 欧美视频在线一区二区三区| 欧洲生活片亚洲生活在线观看| 日本高清不卡一区| 欧美三级午夜理伦三级中视频| 色悠悠久久综合| 在线观看亚洲成人| 欧美日韩免费一区二区三区视频| 欧美日韩一区不卡| 日韩亚洲欧美高清| 欧美一二三四区在线| 欧美v日韩v国产v| 久久精品亚洲一区二区三区浴池| 久久久久久久网| 国产精品区一区二区三| 亚洲欧美激情视频在线观看一区二区三区 | 粉嫩嫩av羞羞动漫久久久| 国产成人av电影在线播放| 国产成人亚洲综合a∨婷婷| 成人国产精品免费观看视频| 99re这里只有精品视频首页| 色婷婷av一区二区三区大白胸| 欧美日韩中文字幕一区二区| 日韩欧美国产高清| 国产片一区二区三区| 日韩美女视频一区| 亚洲观看高清完整版在线观看 | 99麻豆久久久国产精品免费| 97精品久久久久中文字幕 | 国产精品三级电影| 夜夜嗨av一区二区三区| 日韩激情一二三区| 国产精品一级在线| 色狠狠桃花综合| 精品少妇一区二区三区| 最新日韩在线视频| 日韩 欧美一区二区三区| 国产剧情一区在线| 在线亚洲精品福利网址导航| 日韩一卡二卡三卡国产欧美| 国产日产欧产精品推荐色| 亚洲一区二区三区视频在线播放 | 色综合一区二区三区| 欧美久久久久久久久中文字幕| 欧美精品一区二区在线观看| 亚洲日本乱码在线观看| 日韩av一二三| 成人h动漫精品| 欧美一区午夜视频在线观看| 国产精品乱码一区二三区小蝌蚪| 丝袜亚洲另类丝袜在线| 国产成人综合视频| 91精品国产综合久久久久久久| 日本一区二区三级电影在线观看| 亚洲va国产天堂va久久en| 国产91精品一区二区麻豆亚洲| 欧美亚洲国产怡红院影院| 欧美国产精品v| 老司机午夜精品| 欧美婷婷六月丁香综合色| 国产精品私人影院| 精品一区免费av| 欧美日韩在线亚洲一区蜜芽| 国产精品久久久久久久久免费丝袜 | 日韩女优电影在线观看| 依依成人精品视频| 国产91在线观看丝袜| 日韩免费一区二区| 亚洲国产视频在线| 99热99精品| 欧美国产精品一区二区三区| 看国产成人h片视频| 在线免费不卡电影| 国产精品久久看| 国产一区二区福利视频| 欧美一卡2卡三卡4卡5免费| 一区二区三区高清| 93久久精品日日躁夜夜躁欧美| 2023国产精品| 麻豆精品一二三| 欧美日韩一区成人| 亚洲影院在线观看| 在线精品视频一区二区三四| 国产精品久久久久久久久搜平片| 国产一区999| wwww国产精品欧美| 精品一区二区久久久| 91精品国产91久久久久久最新毛片| 亚洲制服丝袜在线| 欧美专区亚洲专区| 亚洲一区影音先锋| 欧美亚洲禁片免费| 午夜在线成人av| 91精品视频网| 免费的成人av| 欧美成人a∨高清免费观看| 美女精品自拍一二三四| 精品捆绑美女sm三区| 精品无人区卡一卡二卡三乱码免费卡| 6080国产精品一区二区| 日韩av在线免费观看不卡| 日韩精品一区二区三区四区| 麻豆精品视频在线观看视频| 日韩精品在线一区二区| 激情成人午夜视频| 国产视频视频一区| 99久久99久久久精品齐齐| 亚洲综合丝袜美腿| 911精品产国品一二三产区| 人人精品人人爱| 久久久久久久久久久电影| 国产91富婆露脸刺激对白| **网站欧美大片在线观看| 欧美在线不卡一区| 蜜臀久久99精品久久久画质超高清| 日韩欧美激情一区| 国产河南妇女毛片精品久久久 | 日日夜夜免费精品| 精品久久久久av影院| 懂色av一区二区三区免费观看| 亚洲欧洲精品一区二区精品久久久| 91蝌蚪porny| 亚洲成人第一页| 久久综合av免费| 99精品一区二区三区| 香蕉久久一区二区不卡无毒影院 | 国产精品免费人成网站| 日本高清免费不卡视频| 热久久免费视频| 久久精品人人爽人人爽| 91在线视频观看| 免费一级欧美片在线观看| 亚洲国产精品99久久久久久久久| 色国产精品一区在线观看| 免费高清在线一区| 国产精品久久久久久久久免费相片| 欧美亚一区二区| 狠狠久久亚洲欧美| 一区二区三区免费看视频| 日韩免费高清视频| 91免费看视频| 美日韩一区二区三区| 亚洲美女视频在线| 精品国产髙清在线看国产毛片| 成人sese在线| 久久99国产精品久久99| 亚洲黄色av一区| 久久精品视频网| 在线播放国产精品二区一二区四区| 国产99一区视频免费| 日韩激情av在线| 亚洲人成精品久久久久久| 精品欧美乱码久久久久久1区2区| 日本精品一区二区三区高清| 韩国视频一区二区| 午夜视频在线观看一区二区三区| 国产精品素人视频| 欧美mv和日韩mv国产网站| 色噜噜狠狠成人网p站| 国产高清视频一区| 麻豆国产精品官网| 亚洲成av人**亚洲成av**| 亚洲欧美另类在线| 国产精品视频线看| 精品少妇一区二区三区在线播放|