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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? echotool.cpp

?? VC++視頻開(kāi)發(fā)實(shí)例集錦(包括“遠(yuǎn)程視頻監(jiān)控”"語(yǔ)音識(shí)別系統(tǒng)"等13個(gè)經(jīng)典例子)
?? CPP
字號(hào):
//-----------------------------------------------------------------------------
// 文件名: EchoTool.cpp
//
// 描  述: 實(shí)現(xiàn)一個(gè)繼承自IDirectMusicTool,并提供回音效果的類(lèi)
//-----------------------------------------------------------------------------
#include <dmusici.h>
#include "EchoTool.h"




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::CEchoTool()
// 描  述: 
//-----------------------------------------------------------------------------
CEchoTool::CEchoTool()
{
    m_cRef = 1;                 // 設(shè)置為1,可調(diào)用Release()釋放
    m_dwEchoNum = 3;            // 設(shè)置缺省情況為每個(gè)音符三個(gè)回音
    m_mtDelay = DMUS_PPQ / 2;   // 設(shè)置缺省情況為第八音符回音
    InitializeCriticalSection(&m_CrSec);
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::~CEchoTool()
// 描  述: 
//-----------------------------------------------------------------------------
CEchoTool::~CEchoTool()
{
    DeleteCriticalSection(&m_CrSec);
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::QueryInterface()
// 描  述: 
//-----------------------------------------------------------------------------
STDMETHODIMP CEchoTool::QueryInterface(const IID &iid, void **ppv)
{
    if (iid == IID_IUnknown || iid == IID_IDirectMusicTool)
    {
        *ppv = static_cast<IDirectMusicTool*>(this);
    } 
    else
    {
        *ppv = NULL;
        return E_NOINTERFACE;
    }
    
    reinterpret_cast<IUnknown*>(this)->AddRef();
    return S_OK;
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::AddRef()
// 描  述: 
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CEchoTool::AddRef()
{
    return InterlockedIncrement(&m_cRef);
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::Release()
// 描  述: 
//-----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CEchoTool::Release()
{
    if( 0 == InterlockedDecrement(&m_cRef) )
    {
        delete this;
        return 0;
    }

    return m_cRef;
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::Init()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::Init( IDirectMusicGraph* pGraph )
{
    // 本工具不需要任何初始化
    return E_NOTIMPL;
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::GetMsgDeliveryType()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::GetMsgDeliveryType( DWORD* pdwDeliveryType )
{
    // 本工具需要立即消息,這是缺省的,因此返回E_NOTIMPL即可。
    // 另一種方法是設(shè)置*pdwDeliveryType傳輸類(lèi)型,如DMUS_PMSGF_TOOL_IMMEDIATE,
    // DMUS_PMSGF_TOOL_QUEUE, 或DMUS_PMSGF_TOOL_ATTIME.
    
    *pdwDeliveryType = DMUS_PMSGF_TOOL_IMMEDIATE;
    return S_OK;
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::GetMediaTypeArraySize()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::GetMediaTypeArraySize( DWORD* pdwNumElements )
{
    // 這個(gè)工具只需要note、patch、sysex和MIDI四種消息, 
    // 所以*pdwNumElements為4.
    
    *pdwNumElements = 4;
    return S_OK;
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::GetMediaTypes()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::GetMediaTypes( DWORD** padwMediaTypes, 
                                                    DWORD dwNumElements )
{
    // 用本工具想要處理的消息的類(lèi)型來(lái)填充padwMediaTypes數(shù)組。
    // 本例中dwNumElements將為3, 因?yàn)樵摂?shù)據(jù)是從GetMediaTypeArraySize()返回的。    
    if( dwNumElements == 4 )
    {
        // 設(shè)置數(shù)組的元素為DMUS_PMSGT_NOTE,
        // DMUS_PMSGT_MIDI, and DMUS_PMSGT_PATCH
        (*padwMediaTypes)[0] = DMUS_PMSGT_NOTE;
        (*padwMediaTypes)[1] = DMUS_PMSGT_MIDI;
        (*padwMediaTypes)[2] = DMUS_PMSGT_PATCH;
        (*padwMediaTypes)[3] = DMUS_PMSGT_SYSEX;
        return S_OK;
    }
    else
    {
        // 這應(yīng)該不會(huì)發(fā)生
        return E_FAIL;
    }
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::ProcessPMsg()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::ProcessPMsg( IDirectMusicPerformance* pPerf, 
                                                  DMUS_PMSG* pPMsg )
{
    DWORD dwCount;
    DWORD dwEchoNum;
    MUSIC_TIME mtDelay;
    
    // SetEchoNum()和SetDelay()使用這些成員變量,
    // 因此使用關(guān)鍵的段使得線程安全。
    EnterCriticalSection(&m_CrSec);
    dwEchoNum = m_dwEchoNum;
    mtDelay = m_mtDelay;
    LeaveCriticalSection(&m_CrSec);
    
    // 返回S_FREE釋放消息. 如果StampPMsg()失敗,沒(méi)有此消息的目的地,因此釋放它
    if(( NULL == pPMsg->pGraph ) ||
        FAILED(pPMsg->pGraph->StampPMsg(pPMsg)))
    {
        return DMUS_S_FREE;
    }

  
    IDirectMusicPerformance8 *pPerf8;
    if (SUCCEEDED(pPerf->QueryInterface(IID_IDirectMusicPerformance8,(void **)&pPerf8)))
    {
        for( dwCount = 1; dwCount <= dwEchoNum; dwCount++ )
        {
            DMUS_PMSG *pClone;
            if( SUCCEEDED( pPerf8->ClonePMsg( pPMsg,&pClone)))
            {
                // 增加回音音符的次數(shù)
                pClone->mtTime += (dwCount * mtDelay);
                if (pPMsg->dwType == DMUS_PMSGT_NOTE )
                {
                    DMUS_NOTE_PMSG *pNote = (DMUS_NOTE_PMSG*)pPMsg;
                    DMUS_NOTE_PMSG *pCloneNote = (DMUS_NOTE_PMSG*)pClone;
                    pCloneNote->bVelocity = (BYTE) (pNote->bVelocity - 
                        ((pNote->bVelocity * (dwCount * 15))/100));
                }
                // 設(shè)置音符,因此僅僅MUSIC_TIME是有效的.
                // REFERENCE_TIME將在SendPMsg()中重新計(jì)算
                pClone->dwFlags = DMUS_PMSGF_MUSICTIME;
                pClone->dwPChannel = pPMsg->dwPChannel + 
                    (16*dwCount);
                // 排隊(duì)等待回音的PMsg
                pPerf->SendPMsg(pClone );
            }
        }
        pPerf8->Release();
    }


    //返回DMUS_S_REQUEUE,因此原始消息被重新排列 
    return DMUS_S_REQUEUE;
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::Flush()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::Flush( IDirectMusicPerformance* pPerf, 
                                            DMUS_PMSG* pDMUS_PMSG,
                                            REFERENCE_TIME rt)
{
    // 本工具不需要流
    return E_NOTIMPL;
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::SetEchoNum()
// 描  述: 
//-----------------------------------------------------------------------------
void CEchoTool::SetEchoNum( DWORD dwEchoNum )
{
    // ProcessPMsg()使用m_dwEchoNum, 
    // 因此使用關(guān)鍵的段使得線程安全。
    if( dwEchoNum <= MAX_ECHOES )
    {
        EnterCriticalSection(&m_CrSec);
        m_dwEchoNum = dwEchoNum;
        LeaveCriticalSection(&m_CrSec);
    }
}




//-----------------------------------------------------------------------------
// 函數(shù)名: CEchoTool::SetDelay()
// 描  述: 
//-----------------------------------------------------------------------------
void CEchoTool::SetDelay( MUSIC_TIME mtDelay )
{
    // ProcessPMsg()使用m_mtDelay,     
	// 因此使用關(guān)鍵的段使得線程安全。
    EnterCriticalSection(&m_CrSec);
    m_mtDelay = mtDelay;
    LeaveCriticalSection(&m_CrSec);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
1000部国产精品成人观看| 欧美一级xxx| 国产精品一区二区视频| 久久精品久久久精品美女| 婷婷久久综合九色综合伊人色| 一区二区三区日韩| 亚洲主播在线观看| 亚洲成人www| 极品少妇一区二区| 美国毛片一区二区三区| 久久电影网电视剧免费观看| 久久av资源网| 福利一区福利二区| 99久久精品免费精品国产| 日本高清不卡一区| 欧美日韩在线观看一区二区| 最近日韩中文字幕| 亚洲色图视频网| 午夜日韩在线观看| 奇米一区二区三区av| 国产一区二区电影| 99精品欧美一区二区蜜桃免费| 在线视频一区二区三区| 欧美一区二区三区视频免费| 欧美电影免费观看高清完整版在线观看 | 精品精品欲导航| 国产亚洲综合在线| 亚洲在线中文字幕| 看电影不卡的网站| 99视频精品全部免费在线| 欧美日韩免费观看一区三区| 欧美成人福利视频| 亚洲免费三区一区二区| 美女一区二区视频| 99这里只有精品| 91精品国产综合久久小美女| 国产精品美女久久久久久2018 | 韩国精品久久久| 色综合久久久久久久久久久| 7777精品伊人久久久大香线蕉完整版 | 欧美日韩精品电影| 国产女人18毛片水真多成人如厕| 一区二区三区产品免费精品久久75| 日韩黄色小视频| 色综合久久综合| 久久先锋资源网| 视频在线观看国产精品| 国产成人精品一区二区三区网站观看| 在线看日韩精品电影| 国产色产综合色产在线视频| 香蕉加勒比综合久久| 成人av中文字幕| 精品电影一区二区三区| 玉米视频成人免费看| 国产精品亚洲一区二区三区妖精| 欧美日韩国产综合久久| 亚洲图片欧美激情| 成人久久18免费网站麻豆| 精品日韩一区二区三区免费视频| 亚洲成人资源网| 91在线精品一区二区三区| 久久麻豆一区二区| 美国毛片一区二区| 91精品国产综合久久精品| 国产综合成人久久大片91| 91久久精品网| 夜夜揉揉日日人人青青一国产精品| 国产一区二区三区香蕉| 精品三级在线观看| 久88久久88久久久| ww亚洲ww在线观看国产| 久久精品国产网站| 亚洲精品一区二区三区精华液| 日韩经典一区二区| 日韩欧美一二三| 韩国一区二区在线观看| 精品日韩一区二区| 国产精品亚洲成人| 欧美韩国日本不卡| 成人久久视频在线观看| 亚洲人成网站精品片在线观看| 99视频国产精品| 亚洲一区在线播放| 欧美人妇做爰xxxⅹ性高电影| 亚洲人妖av一区二区| 色老汉一区二区三区| 夜夜夜精品看看| 欧美丰满嫩嫩电影| 久久电影网站中文字幕| 国产欧美精品在线观看| 97久久久精品综合88久久| 欧美激情一区二区三区不卡| www.66久久| 亚州成人在线电影| 欧美一区二区久久久| 国内精品久久久久影院色 | 国产福利一区二区三区| 国产日韩欧美综合在线| 久久99精品久久久久久国产越南| 久久国产夜色精品鲁鲁99| 日韩一区二区免费电影| 欧美体内she精高潮| 日韩激情av在线| 国产午夜精品久久| 色狠狠色狠狠综合| 日本欧美加勒比视频| 欧美日韩视频在线第一区| 美女网站一区二区| 国产欧美一区二区精品仙草咪| 丁香婷婷综合色啪| 水蜜桃久久夜色精品一区的特点 | 久久国产精品露脸对白| 精品国产乱码久久久久久免费 | 91网上在线视频| 亚洲电影视频在线| 国产午夜精品一区二区| 欧美视频在线一区二区三区| 日本va欧美va瓶| 欧美国产国产综合| 日韩午夜激情视频| 一本久久综合亚洲鲁鲁五月天 | 香港成人在线视频| 欧美国产综合一区二区| 91麻豆精品国产91久久久久久| 白白色亚洲国产精品| 极品销魂美女一区二区三区| 亚洲国产欧美在线| 亚洲欧洲精品一区二区三区不卡| 欧美精品tushy高清| 色素色在线综合| 国产69精品久久久久毛片| 日韩**一区毛片| 亚洲一区免费视频| 国产精品白丝在线| 国产亚洲欧美中文| 精品国产乱子伦一区| 9191久久久久久久久久久| 91麻豆国产精品久久| 成人美女视频在线看| 韩国成人福利片在线播放| 婷婷中文字幕综合| 一区二区三区国产| 亚洲欧美日韩小说| 国产精品久久久久久久久晋中 | 欧美日韩一级二级三级| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 在线日韩av片| 成人av在线看| 成人av午夜电影| 99精品国产一区二区三区不卡| 成人美女视频在线看| 视频一区视频二区中文| 亚洲不卡av一区二区三区| 午夜免费久久看| 亚洲va欧美va人人爽| 国产偷国产偷亚洲高清人白洁| 欧美欧美欧美欧美| 欧美日韩不卡在线| 日韩精品一区二区三区在线| 欧美xxxxxxxxx| 亚洲国产你懂的| 日韩电影在线免费看| 麻豆精品在线播放| 韩国av一区二区三区四区| 国产乱码精品一区二区三区av| 国产乱人伦偷精品视频不卡| 丁香网亚洲国际| 在线视频一区二区三区| 欧美精品一二三| 日韩一区二区免费电影| 久久蜜桃av一区精品变态类天堂| 国产欧美日韩激情| 伊人色综合久久天天人手人婷| 亚洲国产精品久久久久秋霞影院 | 东方aⅴ免费观看久久av| 成人avav在线| 欧美色图免费看| 日韩精品中文字幕一区二区三区 | 欧美顶级少妇做爰| 久久色.com| 亚洲精品乱码久久久久久| 亚洲动漫第一页| 久久精品国产一区二区三| 亚洲综合区在线| 美女被吸乳得到大胸91| 成人免费视频免费观看| 91丨porny丨首页| 欧美成人aa大片| 一区二区三区加勒比av| 激情综合一区二区三区| 91看片淫黄大片一级在线观看| 欧美一区二区视频在线观看| 国产三级精品三级在线专区| 亚洲图片欧美色图| 成人性色生活片免费看爆迷你毛片| 欧美日韩一二区| 国产精品福利一区| 久久福利资源站| 欧美日韩视频在线第一区| 国产亚洲精品超碰|