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

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

?? echotool.cpp

?? < VC++視頻音頻開發>> 這本書的源碼
?? CPP
字號:
//-----------------------------------------------------------------------------
// 文件名: EchoTool.cpp
//
// 描  述: 實現一個繼承自IDirectMusicTool,并提供回音效果的類
//-----------------------------------------------------------------------------
#include <dmusici.h>
#include "EchoTool.h"




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




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




//-----------------------------------------------------------------------------
// 函數名: 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;
}




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




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

    return m_cRef;
}




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




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




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




//-----------------------------------------------------------------------------
// 函數名: CEchoTool::GetMediaTypes()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::GetMediaTypes( DWORD** padwMediaTypes, 
                                                    DWORD dwNumElements )
{
    // 用本工具想要處理的消息的類型來填充padwMediaTypes數組。
    // 本例中dwNumElements將為3, 因為該數據是從GetMediaTypeArraySize()返回的。    
    if( dwNumElements == 4 )
    {
        // 設置數組的元素為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
    {
        // 這應該不會發生
        return E_FAIL;
    }
}




//-----------------------------------------------------------------------------
// 函數名: CEchoTool::ProcessPMsg()
// 描  述: 
//-----------------------------------------------------------------------------
HRESULT STDMETHODCALLTYPE CEchoTool::ProcessPMsg( IDirectMusicPerformance* pPerf, 
                                                  DMUS_PMSG* pPMsg )
{
    DWORD dwCount;
    DWORD dwEchoNum;
    MUSIC_TIME mtDelay;
    
    // SetEchoNum()和SetDelay()使用這些成員變量,
    // 因此使用關鍵的段使得線程安全。
    EnterCriticalSection(&m_CrSec);
    dwEchoNum = m_dwEchoNum;
    mtDelay = m_mtDelay;
    LeaveCriticalSection(&m_CrSec);
    
    // 返回S_FREE釋放消息. 如果StampPMsg()失敗,沒有此消息的目的地,因此釋放它
    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)))
            {
                // 增加回音音符的次數
                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));
                }
                // 設置音符,因此僅僅MUSIC_TIME是有效的.
                // REFERENCE_TIME將在SendPMsg()中重新計算
                pClone->dwFlags = DMUS_PMSGF_MUSICTIME;
                pClone->dwPChannel = pPMsg->dwPChannel + 
                    (16*dwCount);
                // 排隊等待回音的PMsg
                pPerf->SendPMsg(pClone );
            }
        }
        pPerf8->Release();
    }


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




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




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




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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人丝袜高跟foot| 波多野结衣在线一区| 亚洲电影你懂得| 亚洲欧美二区三区| 中文字幕综合网| 亚洲精品乱码久久久久久久久| 中文字幕制服丝袜一区二区三区 | 亚洲色图20p| 国产精品的网站| 亚洲一区二区三区精品在线| 亚洲一区中文在线| 日本伊人精品一区二区三区观看方式 | 精品国产乱码久久久久久牛牛| 日韩免费看网站| 久久这里只精品最新地址| 久久久不卡网国产精品一区| 国产欧美视频一区二区| 中文字幕日韩精品一区| 亚洲午夜久久久久久久久久久| 五月天欧美精品| 久久草av在线| 成人va在线观看| 色老汉一区二区三区| 制服丝袜日韩国产| 国产欧美视频一区二区| 亚洲伊人色欲综合网| 精品一区在线看| 91伊人久久大香线蕉| 欧美肥胖老妇做爰| 国产精品色呦呦| 亚洲图片欧美一区| 国产不卡视频一区| 欧美喷潮久久久xxxxx| 久久精品视频在线免费观看 | 免费在线欧美视频| 成人sese在线| 欧美一二三区在线| 亚洲三级免费电影| 国产在线播精品第三| 91美女蜜桃在线| 久久亚洲一区二区三区四区| 亚洲精品videosex极品| 国产精品自在在线| 9191久久久久久久久久久| 国产精品丝袜91| 久久精品国产亚洲5555| 色呦呦日韩精品| 久久精品人人做| 日本视频一区二区| 在线观看免费成人| 日韩毛片视频在线看| 精东粉嫩av免费一区二区三区| 色94色欧美sute亚洲线路一ni | 久久99精品国产| 一本到不卡免费一区二区| 国产日韩欧美亚洲| 国内不卡的二区三区中文字幕 | 精品久久久影院| 偷拍与自拍一区| 色综合久久综合网| 国产精品超碰97尤物18| 成人av在线电影| 国产欧美一区二区三区网站 | 精品国产露脸精彩对白| 日日夜夜一区二区| 欧美疯狂性受xxxxx喷水图片| 亚洲一区二区视频在线观看| 99视频一区二区| 中文字幕精品三区| 国产a区久久久| 欧美激情自拍偷拍| 成年人国产精品| 最新国产の精品合集bt伙计| 成人美女在线视频| 国产精品久久久久婷婷| av电影天堂一区二区在线观看| 国产精品久久久久天堂| 99精品视频一区| 亚洲精品视频在线观看网站| 色94色欧美sute亚洲线路一ni| 亚洲精品伦理在线| 欧美精品xxxxbbbb| 久久99精品久久久久久久久久久久| 欧美不卡视频一区| 国产成人午夜视频| 亚洲国产成人一区二区三区| www.日本不卡| 一区二区三区四区亚洲| 欧美日韩黄色一区二区| 欧美bbbbb| 国产欧美精品国产国产专区| 波波电影院一区二区三区| 尤物av一区二区| 91精品欧美综合在线观看最新 | 91精品国产综合久久久久| 开心九九激情九九欧美日韩精美视频电影 | 亚洲国产一区视频| 精品少妇一区二区三区在线播放| 国产激情精品久久久第一区二区| 国产精品久久久久影院亚瑟| 在线观看日韩高清av| 久久成人免费电影| 最新国产成人在线观看| 欧美精品一级二级| 国产成人av网站| 一区二区三区精品在线观看| 日韩三级av在线播放| 成人精品高清在线| 日韩国产欧美在线视频| 日本一区二区三区四区| 555夜色666亚洲国产免| 国产69精品久久777的优势| 婷婷综合五月天| 国产精品免费看片| 日韩视频免费直播| av电影在线观看一区| 精品一区二区在线免费观看| 一区二区三区欧美视频| 久久久精品天堂| 在线成人小视频| 91激情五月电影| 粉嫩高潮美女一区二区三区| 丝袜美腿亚洲一区二区图片| 国产人久久人人人人爽| 3d成人动漫网站| 色88888久久久久久影院野外| 精品一区二区在线观看| 日日欢夜夜爽一区| 亚洲麻豆国产自偷在线| 国产精品久久久久影院老司| 精品久久五月天| 日韩欧美不卡一区| 欧美日韩国产高清一区二区三区 | 久久精品国产在热久久| 洋洋成人永久网站入口| 中文字幕免费不卡在线| 久久久精品免费观看| 欧美r级在线观看| 欧美一区二区在线免费观看| 在线观看中文字幕不卡| 91视视频在线直接观看在线看网页在线看| 麻豆国产精品官网| 日韩av一区二| 丝袜诱惑亚洲看片| 丝袜美腿亚洲一区二区图片| 亚洲国产精品视频| 亚洲国产日产av| 亚洲一区在线视频| 一区二区三区四区亚洲| 亚洲一区二区三区三| 亚洲影院久久精品| 午夜精品久久一牛影视| 性做久久久久久| 五月天精品一区二区三区| 日韩精品福利网| 奇米影视一区二区三区| 久久成人免费日本黄色| 国产一区二区视频在线播放| 国产一区二区不卡| 国产成a人亚洲精品| 91视频免费播放| 欧美中文字幕久久| 91麻豆精品国产综合久久久久久| 日韩一区二区在线免费观看| 久久综合国产精品| 国产欧美综合在线| 一区二区三区在线免费视频| 午夜精品久久久久久久久久久| 日韩成人伦理电影在线观看| 精品一区二区日韩| 成人精品视频一区二区三区尤物| 91丨九色丨黑人外教| 9191久久久久久久久久久| 久久久久99精品一区| 亚洲日本成人在线观看| 午夜精彩视频在线观看不卡| 久久精品国产77777蜜臀| 国产精品99精品久久免费| 成人国产精品免费网站| 欧美性色综合网| 久久久久97国产精华液好用吗| 亚洲人成网站在线| 久久9热精品视频| www.久久久久久久久| 欧美一级高清片在线观看| 国产欧美日韩麻豆91| 亚洲成人av资源| 国产成人自拍高清视频在线免费播放| 97se亚洲国产综合自在线观| 欧美日本乱大交xxxxx| 国产欧美精品一区二区色综合朱莉| 亚洲蜜臀av乱码久久精品蜜桃| 免费av成人在线| 91免费观看视频在线| 欧美精品一区二区久久婷婷| 亚洲乱码国产乱码精品精小说| 久久精品国产澳门| 欧美日韩视频专区在线播放| 国产精品嫩草久久久久| 免费成人在线视频观看|