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

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

?? midi.c

?? ReactOS是一些高手根據(jù)Windows XP的內(nèi)核編寫出的類XP。內(nèi)核實現(xiàn)機(jī)理和API函數(shù)調(diào)用幾乎相同。甚至可以兼容XP的程序。喜歡研究系統(tǒng)內(nèi)核的人可以看一看。
?? C
字號:
/*
 *
 * COPYRIGHT:            See COPYING in the top level directory
 * PROJECT:              ReactOS Multimedia
 * FILE:                 lib/mmdrv/midi.c
 * PURPOSE:              Multimedia User Mode Driver
 * PROGRAMMER:           Andrew Greenwood
 * UPDATE HISTORY:
 *                       Jan 30, 2004: Imported into ReactOS tree
 */

#include "mmdrv.h"
#include "wave.h"

#define NDEBUG
#include <debug.h>

// MIDI device instance information
//
#define LOCAL_DATA_SIZE 20
typedef struct _LOCALMIDIHDR {
    OVERLAPPED          Ovl;
    DWORD               BytesReturned;
    struct _LOCALMIDIHDR *lpNext;       
    BOOL                Done;           
    PVOID               pClient;        
  //  MIDI_DD_INPUT_DATA  MidiData;       
    BYTE                ExtraData[LOCAL_DATA_SIZE - sizeof(ULONG)];
                                        
} LOCALMIDIHDR, *PLOCALMIDIHDR;

#define LOCAL_MIDI_BUFFERS 8

typedef struct {
    
    BOOL                fMidiInStarted;
    DWORD               dwMsg;         
    DWORD               dwCurData;     
    BYTE                status;        
    BOOLEAN             fSysex;        
    BOOLEAN             Bad;           
    BYTE                bBytesLeft;    
    BYTE                bBytePos;      
    DWORD               dwCurTime;     
    DWORD               dwMsgTime;     
                                       
                                       
    PLOCALMIDIHDR       DeviceQueue;   
                                       
    LOCALMIDIHDR                       
    Bufs[LOCAL_MIDI_BUFFERS];
                                       
                                       
} LOCALMIDIDATA, *PLOCALMIDIDATA;


typedef struct tag_MIDIALLOC {
    struct tag_MIDIALLOC *Next;         // Chain of devices
    UINT                DeviceNumber;   // Number of device
    UINT                DeviceType;     // MidiInput or MidiOutput
    DWORD               dwCallback;     // client's callback
    DWORD               dwInstance;     // client's instance data
    HMIDI               hMidi;          // handle for stream
    HANDLE              DeviceHandle;   // Midi device handle
    LPMIDIHDR           lpMIQueue;      // Buffers sent to device
                                        // This is only required so that
                                        // CLOSE knows when things have
                                        // really finished.
                                        // notify.  This is only accessed
                                        // on the device thread and its
                                        // apcs so does not need any
                                        // synchronized access.
    HANDLE              Event;          // Event for driver syncrhonization
                                        // and notification of auxiliary
                                        // task operation completion.
//    MIDITHREADFUNCTION  AuxFunction;    // Function for thread to perform
    union {
        LPMIDIHDR       pHdr;           // Buffer to pass in aux task
        ULONG           State;          // State to set
        struct {
            ULONG       Function;       // IOCTL to use
            PBYTE       pData;          // Data to set or get
            ULONG       DataLen;        // Length of data
        } GetSetData;

    } AuxParam;
                                        // 0 means terminate task.
    HANDLE              ThreadHandle;   // Handle for termination ONLY
    HANDLE              AuxEvent1;      // Aux thread waits on this
    HANDLE              AuxEvent2;      // Aux thread caller waits on this
    DWORD               AuxReturnCode;  // Return code from Aux task
    DWORD               dwFlags;        // Open flags
    PLOCALMIDIDATA      Mid;            // Extra midi input structures
    int                 l;              // Helper global for modMidiLength

} MIDIALLOC, *PMIDIALLOC;

PMIDIALLOC MidiHandleList;              // Our chain of wave handles



static DWORD OpenMidiDevice(UINT DeviceType, DWORD ID, DWORD User, DWORD Param1, DWORD Param2)
{
    PMIDIALLOC pClient = NULL;
    MMRESULT Result = MMSYSERR_NOERROR;
    
    // Check ID?
    DPRINT("OpenMidiDevice()\n");
    
    switch(DeviceType)
    {
        case MidiOutDevice :
            pClient = (PMIDIALLOC) HeapAlloc(Heap, 0, sizeof(MIDIALLOC));
            if ( pClient ) memset(pClient, 0, sizeof(MIDIALLOC));
            break;
        
        case MidiInDevice :
            pClient = (PMIDIALLOC) HeapAlloc(Heap, 0, sizeof(MIDIALLOC) + sizeof(LOCALMIDIDATA));
			if ( pClient ) memset(pClient, 0, sizeof(MIDIALLOC) + sizeof(LOCALMIDIDATA));
            break;
    };
    
    if ( !pClient )
        return MMSYSERR_NOMEM;
    
	if (DeviceType == MidiInDevice) 
	{
        int i;
        pClient->Mid = (PLOCALMIDIDATA)(pClient + 1);
        for (i = 0 ;i < LOCAL_MIDI_BUFFERS ; i++) 
		{
            pClient->Mid->Bufs[i].pClient = pClient;
        }
    }

    pClient->DeviceType = DeviceType;
    pClient->dwCallback = ((LPMIDIOPENDESC)Param1)->dwCallback;
    pClient->dwInstance = ((LPMIDIOPENDESC)Param1)->dwInstance;
    pClient->hMidi = ((LPMIDIOPENDESC)Param1)->hMidi;
    pClient->dwFlags = Param2;
    
    Result = OpenDevice(DeviceType, ID, &pClient->DeviceHandle, (GENERIC_READ | GENERIC_WRITE));
    
    if ( Result != MMSYSERR_NOERROR )
    {
        // cleanup
        return Result;
    }
    
    pClient->Event = CreateEvent(NULL, FALSE, FALSE, NULL);
    
    if ( !pClient->Event )
    {
        // cleanup
        return MMSYSERR_NOMEM;
    }

	if (DeviceType == MidiInDevice) 
	{

        pClient->AuxEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pClient->AuxEvent1 == NULL) 
		{
            // cleanup
            return MMSYSERR_NOMEM;
        }
        
		pClient->AuxEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pClient->AuxEvent2 == NULL) 
		{
            // cleanup
            return MMSYSERR_NOMEM;
        }

        
        // TaskCreate
        
        
       WaitForSingleObject(pClient->AuxEvent2, INFINITE);
    }

    PMIDIALLOC *pUserHandle;
    pUserHandle = (PMIDIALLOC*) User;
    *pUserHandle = pClient;
    
    // callback    

    return MMSYSERR_NOERROR;
}



static DWORD WriteMidi(PBYTE pData, ULONG Length, PMIDIALLOC pClient)
{
    DWORD BytesReturned;

    DPRINT("IOCTL_MIDI_PLAY == %d [%x]\n", IOCTL_MIDI_PLAY, IOCTL_MIDI_PLAY);
    
    if ( !DeviceIoControl(pClient->DeviceHandle, IOCTL_MIDI_PLAY, (PVOID)pData,
                          Length, NULL, 0, &BytesReturned, NULL))
        return TranslateStatus();

    return MMSYSERR_NOERROR;
}


static int GetMidiLength(PMIDIALLOC pClient, BYTE b)
{
    if (b >= 0xF8)
    {
        // Realtime message - leave running status
        return 1; // Write one byte
    }

    switch (b)
    {
        case 0xF0: case 0xF4: case 0xF5: case 0xF6: case 0xF7:
            pClient->l = 1;
            return pClient->l;

        case 0xF1: case 0xF3:
            pClient->l = 2;
            return pClient->l;

        case 0xF2:
            pClient->l = 3;
            return pClient->l;
    }

    switch (b & 0xF0)
    {
        case 0x80: case 0x90: case 0xA0: case 0xB0: case 0xE0:
            pClient->l = 3;
            return pClient->l;

        case 0xC0: case 0xD0:
            pClient->l = 2;
            return pClient->l;
    }

    return (pClient->l - 1); // uses previous value if data byte (running status)
}



/* ----------------------------------------------------------------------------
    Exported functions
----------------------------------------------------------------------------- */

APIENTRY DWORD midMessage(DWORD dwId, DWORD dwMessage, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
{
    DPRINT("midMessage\n");
    return MMSYSERR_NOERROR;

    switch (dwMessage) {
        case MIDM_GETNUMDEVS:
            DPRINT("MIDM_GETNUMDEVS");
            return GetDeviceCount(MidiInDevice);

        case MIDM_GETDEVCAPS:
            DPRINT("MIDM_GETDEVCAPS");
            return GetDeviceCapabilities(dwId, MidiInDevice, (LPBYTE)dwParam1, (DWORD)dwParam2);

        case MIDM_OPEN:
            DPRINT("MIDM_OPEN");
            return MMSYSERR_NOERROR;

        case MIDM_CLOSE:
            DPRINT("MIDM_CLOSE");
            return MMSYSERR_NOERROR;

        case MIDM_ADDBUFFER:
            DPRINT("MIDM_ADDBUFFER");
            return MMSYSERR_NOERROR;

        case MIDM_STOP:
            DPRINT("MIDM_PAUSE");
            return MMSYSERR_NOERROR;

        case MIDM_START:
            DPRINT("MIDM_RESTART");
            return MMSYSERR_NOERROR;

        case MIDM_RESET:
            DPRINT("MIDM_RESET");
            return MMSYSERR_NOERROR;

        default:
            return MMSYSERR_NOTSUPPORTED;
    }

	// the function should never get to this point
	//FIXME: Would it be wise to assert here?
    return MMSYSERR_NOTSUPPORTED;
}

APIENTRY DWORD modMessage(DWORD ID, DWORD Message, DWORD User, DWORD Param1, DWORD Param2)
{
    DPRINT("modMessage\n");
    
    switch(Message)
    {
        case MODM_GETNUMDEVS:
            DPRINT("MODM_GETNUMDEVS == %d\n", (int)GetDeviceCount(MidiOutDevice));
            return GetDeviceCount(MidiOutDevice);
        
        case MODM_GETDEVCAPS:
            DPRINT("MODM_GETDEVCAPS");
            return GetDeviceCapabilities(ID, MidiOutDevice, (LPBYTE)Param1, (DWORD)Param2);
            
        case MODM_OPEN :
            return OpenMidiDevice(MidiOutDevice, ID, User, Param1, Param2);

        case MODM_CLOSE:
            DPRINT("MODM_CLOSE");
            return MMSYSERR_NOTSUPPORTED;

        case MODM_DATA:
            DPRINT("MODM_DATA");

            int i;
            BYTE b[4];
            for (i = 0; i < 4; i ++) {
                b[i] = (BYTE)(Param1 % 256);
                Param1 /= 256;
            }
            return WriteMidi(b, GetMidiLength((PMIDIALLOC)User, b[0]),
                                (PMIDIALLOC)User);

        case MODM_LONGDATA:
            DPRINT("MODM_LONGDATA");
            return MMSYSERR_NOTSUPPORTED;

        case MODM_RESET:
            DPRINT("MODM_RESET");
            return MMSYSERR_NOTSUPPORTED;

        case MODM_SETVOLUME:
            DPRINT("MODM_SETVOLUME");
            return MMSYSERR_NOTSUPPORTED;

        case MODM_GETVOLUME:
            DPRINT("MODM_GETVOLUME");
            return MMSYSERR_NOTSUPPORTED;

        case MODM_CACHEPATCHES:
            DPRINT("MODM_CACHEPATCHES");
            return MMSYSERR_NOTSUPPORTED;

        case MODM_CACHEDRUMPATCHES:
            DPRINT("MODM_CACHEDRUMPATCHES");
            return MMSYSERR_NOTSUPPORTED;
            
    };

    return MMSYSERR_NOTSUPPORTED;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品福利一区二区三区| 久久爱另类一区二区小说| 国产欧美一区二区精品性色超碰| 欧美精品tushy高清| 91黄色免费看| 色av一区二区| 在线亚洲+欧美+日本专区| 在线亚洲人成电影网站色www| 91亚洲大成网污www| 91首页免费视频| 99精品黄色片免费大全| 91免费视频网| 在线中文字幕不卡| 欧美无人高清视频在线观看| 欧美性猛片xxxx免费看久爱| 欧美三级欧美一级| 91精品国产91热久久久做人人| 日韩一区二区在线观看视频 | 狂野欧美性猛交blacked| 轻轻草成人在线| 久久电影网站中文字幕 | 欧美亚洲丝袜传媒另类| 欧美亚洲日本一区| 欧美顶级少妇做爰| 日韩欧美123| 久久夜色精品国产噜噜av| 国产亚洲午夜高清国产拍精品 | 亚洲精品成a人| 性做久久久久久久久| 奇米影视7777精品一区二区| 韩国毛片一区二区三区| 成人免费视频caoporn| 91视频91自| 5月丁香婷婷综合| 精品999久久久| 国产精品国产三级国产aⅴ原创| 亚洲精品视频一区二区| 日韩精品亚洲一区二区三区免费| 激情六月婷婷久久| 91丨九色丨国产丨porny| 欧美肥胖老妇做爰| 中文字幕欧美激情一区| 亚洲午夜精品一区二区三区他趣| 美女被吸乳得到大胸91| av动漫一区二区| 91麻豆精品91久久久久久清纯| 久久久久久久久久电影| 亚洲另类春色校园小说| 日韩av电影天堂| 不卡区在线中文字幕| 欧美日韩成人高清| 欧美高清在线一区二区| 亚洲国产视频在线| 国产资源精品在线观看| 欧美视频在线观看一区二区| 精品成人a区在线观看| 亚洲综合色视频| 精品在线视频一区| 欧美三级一区二区| 国产精品天天摸av网| 日本在线不卡一区| www.综合网.com| 精品国一区二区三区| 一区二区三区资源| 国产成人综合网站| 欧美一区二区三区免费在线看| 国产精品久久久久久户外露出 | 在线观看免费一区| 国产欧美日韩久久| 免费一级片91| 在线一区二区三区四区五区| 国产欧美精品区一区二区三区| 日韩国产精品久久久久久亚洲| 91美女蜜桃在线| 国产精品污www在线观看| 精品一区二区三区免费播放| 精品视频在线免费| 亚洲欧美国产三级| 成人一区二区三区视频| 精品国产乱码91久久久久久网站| 亚洲自拍偷拍九九九| av中文字幕不卡| 国产视频一区在线播放| 黑人精品欧美一区二区蜜桃 | 亚洲国产欧美一区二区三区丁香婷| 国产九色sp调教91| 精品久久久久av影院 | 欧洲精品一区二区| 国产精品三级电影| 国产精品一级二级三级| 日韩欧美黄色影院| 日韩精品五月天| 欧美视频一区二区三区四区| 亚洲精品视频在线看| 91首页免费视频| 亚洲日本在线天堂| 99久久精品国产毛片| 中文字幕精品一区二区精品绿巨人| 久久精品国产一区二区三区免费看| 制服丝袜国产精品| 五月婷婷综合网| 欧美另类久久久品| 五月天欧美精品| 欧美情侣在线播放| 亚洲电影在线免费观看| 欧美日韩中文字幕一区| 亚洲成年人影院| 欧美日韩国产大片| 日本亚洲三级在线| 欧美一区二区视频网站| 青草av.久久免费一区| 69久久99精品久久久久婷婷 | 日韩av中文在线观看| 91精品国产91久久综合桃花| 日韩不卡手机在线v区| 欧美成人猛片aaaaaaa| 精品制服美女丁香| 国产日韩精品久久久| 成人免费的视频| 自拍偷自拍亚洲精品播放| 一本大道久久a久久精品综合| 亚洲乱码一区二区三区在线观看| 在线观看视频一区二区欧美日韩| 亚洲第一av色| 日韩欧美卡一卡二| 国产一区二区网址| 亚洲欧洲精品一区二区三区| 色欧美日韩亚洲| 亚洲高清免费观看高清完整版在线观看| 欧美在线视频全部完| 日韩高清在线一区| 久久久一区二区三区| 日韩精品一区二区三区在线| 麻豆精品在线观看| 国产日产欧美精品一区二区三区| 成人高清视频免费观看| 亚洲一区二区三区在线| 欧美一区二区三区四区在线观看 | 狠狠色综合播放一区二区| 国产欧美日韩综合| 欧美中文字幕一二三区视频| 日本视频一区二区| 日本一区二区视频在线观看| 色一情一伦一子一伦一区| 日本va欧美va瓶| 国产日韩欧美精品一区| 欧美色网一区二区| 国产一区二区三区免费| 亚洲精品国产一区二区精华液 | 亚洲观看高清完整版在线观看| 欧美一级精品大片| 99热这里都是精品| 首页亚洲欧美制服丝腿| 欧美激情一区二区三区| 欧美丝袜丝nylons| 成人午夜激情影院| 五月天视频一区| 国产精品麻豆一区二区 | 午夜精品123| 欧美—级在线免费片| 欧美日本国产一区| 国产成a人无v码亚洲福利| 午夜视频在线观看一区二区| 久久久亚洲精品一区二区三区| 在线观看日韩毛片| 成人一区二区在线观看| 秋霞av亚洲一区二区三| 亚洲黄色免费网站| 久久久国产一区二区三区四区小说 | 欧美激情综合五月色丁香| 欧美日韩精品高清| 91亚洲精品乱码久久久久久蜜桃| 麻豆成人免费电影| 亚洲国产婷婷综合在线精品| 中文文精品字幕一区二区| 欧美成人三级电影在线| 欧美日韩亚洲综合在线 | 成人av在线播放网站| 久久精品国产色蜜蜜麻豆| 一个色综合网站| 日本一区二区三区在线不卡| 欧美一区二区网站| 欧美日韩一区中文字幕| www.欧美.com| 国产黄色91视频| 日韩不卡手机在线v区| 亚洲国产精品影院| 亚洲精品自拍动漫在线| 国产精品少妇自拍| 久久综合九色综合欧美就去吻| 欧美日韩中字一区| 欧美性生活久久| 色老头久久综合| 97aⅴ精品视频一二三区| 国产91精品在线观看| 国产乱码精品一区二区三区五月婷| 日韩精品福利网| 日韩精品亚洲专区| 午夜久久久影院| 视频一区视频二区中文|