⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w32_a.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 2 页
字号:
            GlobalUnlock(block->hHead);            GlobalFree  (block->hHead);            GlobalUnlock(block->hData);            GlobalFree  (block->hData);        }        free(Buffers);    /** Reset the file descriptor. **/        dpm.fd = -1;    }}static int detect(void){	if (waveOutGetNumDevs() == 0) {return 0;}	/* not found */	return 1;	/* found */}/*****************************************************************************************************************************/static int output_data(char * Data, int32 Size){    char *  d;    int32   s;    d = Data;    s = Size;    while (s > 0)    {        int32               n;        struct MMBuffer *   b;        MMRESULT            Result;        LPWAVEHDR           wh;        if ((b = GetBuffer()) == NULL)        {            WaitForBuffer(0);            continue;        }        if (s <= DATA_BLOCK_SIZE)            n = s;        else            n = DATA_BLOCK_SIZE;        CopyMemory(b->Data, d, n);        wh = b->Head;        wh->dwBufferLength = n;        wh->lpData         = b->Data;        wh->dwUser         = b->Number;    /** Prepare the buffer. **/        { CHAR  b[256]; wsprintf(b, "%2d: Preparing buffer %d...\n", NumBuffersInUse, wh->dwUser); OutputDebugString(b); }        Result = waveOutPrepareHeader(hDevice, wh, sizeof(WAVEHDR));        if (Result)        {            { CHAR  b[256]; wsprintf(b, "%2d: Buffer preparation failed.\n", NumBuffersInUse); OutputDebugString(b); }            ctl->cmsg (CMSG_ERROR, VERB_NORMAL, "waveOutPrepareHeader(): %s", MMErrorMessage(Result));            return -1;        }        else            { CHAR  b[256]; wsprintf(b, "%2d: Buffer %d prepared.\n", NumBuffersInUse, wh->dwUser); OutputDebugString(b); }        b->Prepared = 1;    /** Queue the buffer. **/        { CHAR  b[256]; wsprintf(b, "%2d: Queueing buffer %d...\n", NumBuffersInUse, wh->dwUser); OutputDebugString(b); }        Result = waveOutWrite(hDevice, wh, sizeof(WAVEHDR));        if (Result)        {            { CHAR  b[256]; wsprintf(b, "%2d: Buffer queueing failed.\n", NumBuffersInUse); OutputDebugString(b); }            ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "waveOutWrite(): %s", MMErrorMessage(Result));            return -1;        }        else            { CHAR  b[256]; wsprintf(b, "%2d: Buffer %d queued.\n", NumBuffersInUse, wh->dwUser); OutputDebugString(b); }        d += n;        s -= n;    }    return 0;}/*****************************************************************************************************************************/static int acntl(int request, void *arg){  static char dummy_sounds[4*AUDIO_BUFFER_SIZE];    switch(request)    {        case PM_REQ_GETQSIZ:            *(int *)arg = (DATA_BLOCK_NUM-1) * AUDIO_BUFFER_SIZE;            if (NOT (dpm.encoding & PE_MONO))                *(int *)arg *= 2;			if (dpm.encoding & PE_24BIT)                *(int *)arg *= 3;            else if (dpm.encoding & PE_16BIT)                *(int *)arg *= 2;            return 0;        case PM_REQ_DISCARD:        {            { CHAR  b[256]; wsprintf(b, "Resetting audio device.\n"); OutputDebugString(b); }            waveOutReset(hDevice);	    close_output();	    open_output();            { CHAR  b[256]; wsprintf(b, "Audio device reset.\n"); OutputDebugString(b); }            return 0;        }        case PM_REQ_FLUSH:        {	    close_output();	    open_output();            return 0;        }    }    return -1;}/*****************************************************************************************************************************/static void CALLBACK OnPlaybackEvent(HWAVE hWave, UINT Msg, DWORD UserData, DWORD Param1, DWORD Param2){    ctl->cmsg(CMSG_INFO, VERB_DEBUG, "Msg: 0x%08X, Num. buffers in use: %d", Msg, NumBuffersInUse);    switch (Msg)    {        case WOM_OPEN:            { CHAR  b[256]; wsprintf(b, "%2d: Device opened.\n", NumBuffersInUse); OutputDebugString(b); }            break;        case WOM_CLOSE:            { CHAR  b[256]; wsprintf(b, "%2d: Device closed.\n", NumBuffersInUse); OutputDebugString(b); }            break;        case WOM_DONE:        {            WAVEHDR *   wh;            EnterCriticalSection(&critSect);            wh = (WAVEHDR *) Param1;/* It's not safe to do this here. Read the remarks of waveOutProc() in the SDK on which functions are safe to call.            if (NOT Queueing)            {                { CHAR  b[256]; wsprintf(b, "%2d: Dequeueing buffer %d...\n", NumBuffersInUse, wh->dwUser); OutputDebugString(b); }                waveOutUnprepareHeader(hDevice, wh, sizeof(WAVEHDR));                { CHAR  b[256]; wsprintf(b, "%2d: Buffer %d dequeued.\n",     NumBuffersInUse, wh->dwUser); OutputDebugString(b); }            }            else                { CHAR  b[256]; wsprintf(b, "%2d: *** Buffer %d not dequeued! ***\n", NumBuffersInUse, wh->dwUser); OutputDebugString(b); } */            PutBuffer(&Buffers[wh->dwUser]);            LeaveCriticalSection(&critSect);            break;        }        default:        {            CHAR    b[256];            wsprintf(b, "%2d: Unknown play back event 0x%08X.\n", NumBuffersInUse, Msg);            OutputDebugString(b);        }    }}/*****************************************************************************************************************************/#define DIM(a) sizeof(a) / sizeof(a[0])static const char * mmsyserr_code_string[] ={    "no error",    "unspecified error",    "device ID out of range",    "driver failed enable",    "device already allocated",    "device handle is invalid",    "no device driver present",    "memory allocation error",    "function isn't supported",    "error value out of range",    "invalid flag passed",    "invalid parameter passed",    "handle being used",};static const char * waverr_code_sring[] ={    "unsupported wave format",    "still something playing",    "header not prepared",    "device is synchronous",};static const char * MMErrorMessage(MMRESULT ErrorCode){    static char s[32];    if (ErrorCode >= WAVERR_BASE)    {        ErrorCode -= WAVERR_BASE;        if (ErrorCode > DIM(waverr_code_sring))        {            wsprintf(s, "Unknown wave error %d", ErrorCode);            return s;        }        else            return waverr_code_sring[ErrorCode];    }    else    if (ErrorCode > DIM(mmsyserr_code_string))    {        wsprintf(s, "Unknown multimedia error %d", ErrorCode);        return s;    }    else        return mmsyserr_code_string[ErrorCode];}#undef DIM/*****************************************************************************************************************************/static void BufferPoolReset(void){    int i;    { CHAR  b[256]; wsprintf(b, "Resetting buffer pool...\n"); OutputDebugString(b); }    Buffers[0].Number   = 0;    Buffers[0].Prepared = 0;    Buffers[0].Next     = &Buffers[1];    for (i = 1; i < DATA_BLOCK_NUM - 1; i++)    {        Buffers[i].Number   = i;        Buffers[i].Prepared = 0;        Buffers[i].Next     = &Buffers[i + 1];    }    Buffers[i].Number   = i;    Buffers[i].Prepared = 0;    Buffers[i].Next     = NULL;    FreeBuffers     = &Buffers[0];    NumBuffersInUse = 0;    { CHAR  b[256]; wsprintf(b, "Buffer pool reset.\n", NumBuffersInUse); OutputDebugString(b); }}/*****************************************************************************************************************************/static struct MMBuffer * GetBuffer(){    struct MMBuffer *   b;    { CHAR  b[256]; wsprintf(b, "%2d: Getting buffer...\n", NumBuffersInUse); OutputDebugString(b); }    EnterCriticalSection(&critSect);    if (FreeBuffers)    {        b           = FreeBuffers;        FreeBuffers = FreeBuffers->Next;        NumBuffersInUse++;    /** If this buffer is still prepared we can safely unprepare it because we got it from the free buffer list. **/        if (b->Prepared)        {            waveOutUnprepareHeader(hDevice, (LPWAVEHDR) b->Head, sizeof(WAVEHDR));            b->Prepared = 0;        }        b->Next     = NULL;    }    else        b = NULL;    LeaveCriticalSection(&critSect);    { CHAR  b[256]; wsprintf(b, "%2d: Got buffer.\n", NumBuffersInUse); OutputDebugString(b); }    return b;}/*****************************************************************************************************************************/static void PutBuffer(struct MMBuffer * b){    { CHAR  b[256]; wsprintf(b, "%2d: Putting buffer...\n", NumBuffersInUse); OutputDebugString(b); }    b->Next     = FreeBuffers;    FreeBuffers = b;    NumBuffersInUse--;    { CHAR  b[256]; wsprintf(b, "%2d: Buffer put.\n", NumBuffersInUse); OutputDebugString(b); }}/*****************************************************************************************************************************/static void WaitForBuffer(int WaitForAllBuffers){  int numbuf;    if (WaitForAllBuffers)    {        { CHAR  b[256]; wsprintf(b, "%2d: Waiting for all buffers to be dequeued...\n", NumBuffersInUse); OutputDebugString(b); }	while (1) {	  EnterCriticalSection(&critSect);	  numbuf = NumBuffersInUse;	  if (numbuf) {            LeaveCriticalSection(&critSect);	    Sleep(BufferDelay);	    continue;	  }	  break;	}	LeaveCriticalSection(&critSect);//        while (NumBuffersInUse)//            Sleep(BufferDelay);        { CHAR  b[256]; wsprintf(b, "%2d: All buffers dequeued.\n", NumBuffersInUse); OutputDebugString(b); }        BufferPoolReset();    }    else    {        { CHAR  b[256]; wsprintf(b, "%2d: Waiting %dms...\n", NumBuffersInUse, BufferDelay); OutputDebugString(b); }		#if !defined ( IA_W32GUI ) && !defined ( IA_W32G_SYN )//		#if !defined ( IA_W32GUI )        if(ctl->trace_playing)            Sleep(0);        else    #endif            Sleep(BufferDelay);        { CHAR  b[256]; wsprintf(b, "%2d: Wait finished.\n", NumBuffersInUse); OutputDebugString(b); }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -