w32_a.c

来自「MIDI解码程序(用VC编写)」· C语言 代码 · 共 759 行 · 第 1/2 页

C
759
字号
            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 + =
减小字号Ctrl + -
显示快捷键?