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

📄 wavemap.c

📁 Wine-20031016
💻 C
📖 第 1 页 / 共 3 页
字号:
	}        for (i = ndlo; i < ndhi; i++) {	    wfx.nSamplesPerSec=lpDesc->lpFormat->nSamplesPerSec;            /* first try with same stereo/mono option as source */            wfx.nChannels = lpDesc->lpFormat->nChannels;            TRY(96000, 16);            TRY(48000, 16);            TRY(44100, 16);            TRY(22050, 16);            TRY(11025, 16);                        /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */            wfx.nChannels ^= 3;            TRY(96000, 16);            TRY(48000, 16);            TRY(44100, 16);            TRY(22050, 16);            TRY(11025, 16);            /* first try with same stereo/mono option as source */            wfx.nChannels = lpDesc->lpFormat->nChannels;            TRY(96000, 8);            TRY(48000, 8);            TRY(44100, 8);            TRY(22050, 8);            TRY(11025, 8);                        /* 2^3 => 1, 1^3 => 2, so if stereo, try mono (and the other way around) */            wfx.nChannels ^= 3;            TRY(96000, 8);            TRY(48000, 8);            TRY(44100, 8);            TRY(22050, 8);            TRY(11025, 8);        }#undef TRY    }    HeapFree(GetProcessHeap(), 0, wim);    return WAVERR_BADFORMAT;found:    if (dwFlags & WAVE_FORMAT_QUERY) {	*lpdwUser = 0L;	HeapFree(GetProcessHeap(), 0, wim);    } else {	*lpdwUser = (DWORD)wim;    }    TRACE("Ok (stream=%08lx)\n", (DWORD)wim->hAcmStream);    return MMSYSERR_NOERROR;error:    HeapFree(GetProcessHeap(), 0, wim);    return MMSYSERR_ERROR;}static	DWORD	widClose(WAVEMAPDATA* wim){    DWORD ret = waveInClose(wim->u.in.hInnerWave);    if (ret == MMSYSERR_NOERROR) {	if (wim->hAcmStream) {	    ret = acmStreamClose(wim->hAcmStream, 0);	}	if (ret == MMSYSERR_NOERROR) {	    HeapFree(GetProcessHeap(), 0, wim);	}    }    return ret;}static	DWORD	widAddBuffer(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2){    PACMSTREAMHEADER	ash;    LPWAVEHDR		lpWaveHdrSrc;    if (!wim->hAcmStream) {	return waveInAddBuffer(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2);    }    lpWaveHdrDst->dwFlags |= WHDR_INQUEUE;    ash = (PACMSTREAMHEADER)lpWaveHdrDst->reserved;    lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));    return waveInAddBuffer(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc));}static	DWORD	widPrepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2){    PACMSTREAMHEADER	ash;    DWORD		size;    DWORD		dwRet;    LPWAVEHDR		lpWaveHdrSrc;    if (!wim->hAcmStream) {	return waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2);    }    if (acmStreamSize(wim->hAcmStream, lpWaveHdrDst->dwBufferLength, &size,		      ACM_STREAMSIZEF_DESTINATION) != MMSYSERR_NOERROR)	return MMSYSERR_ERROR;    ash = HeapAlloc(GetProcessHeap(), 0, sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR) + size);    if (ash == NULL)	return MMSYSERR_NOMEM;    ash->cbStruct = sizeof(*ash);    ash->fdwStatus = 0L;    ash->dwUser = (DWORD)lpWaveHdrDst;    ash->pbSrc = (LPSTR)ash + sizeof(ACMSTREAMHEADER) + sizeof(WAVEHDR);    ash->cbSrcLength = size;    /* ash->cbSrcLengthUsed */    ash->dwSrcUser = 0L; /* FIXME ? */    ash->pbDst = lpWaveHdrDst->lpData;    ash->cbDstLength = lpWaveHdrDst->dwBufferLength;    /* ash->cbDstLengthUsed */    ash->dwDstUser = lpWaveHdrDst->dwUser; /* FIXME ? */    dwRet = acmStreamPrepareHeader(wim->hAcmStream, ash, 0L);    if (dwRet != MMSYSERR_NOERROR)	goto errCleanUp;    lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));    lpWaveHdrSrc->lpData = ash->pbSrc;    lpWaveHdrSrc->dwBufferLength = size; /* conversion is not done yet */    lpWaveHdrSrc->dwFlags = 0;    lpWaveHdrSrc->dwLoops = 0;    dwRet = waveInPrepareHeader(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc));    if (dwRet != MMSYSERR_NOERROR)	goto errCleanUp;    lpWaveHdrDst->reserved = (DWORD)ash;    lpWaveHdrDst->dwFlags = WHDR_PREPARED;    TRACE("=> (0)\n");    return MMSYSERR_NOERROR;errCleanUp:    TRACE("=> (%ld)\n", dwRet);    HeapFree(GetProcessHeap(), 0, ash);    return dwRet;}static	DWORD	widUnprepare(WAVEMAPDATA* wim, LPWAVEHDR lpWaveHdrDst, DWORD dwParam2){    PACMSTREAMHEADER	ash;    LPWAVEHDR		lpWaveHdrSrc;    DWORD		dwRet1, dwRet2;    if (!wim->hAcmStream) {	return waveInUnprepareHeader(wim->u.in.hInnerWave, lpWaveHdrDst, dwParam2);    }    ash = (PACMSTREAMHEADER)lpWaveHdrDst->reserved;    dwRet1 = acmStreamUnprepareHeader(wim->hAcmStream, ash, 0L);    lpWaveHdrSrc = (LPWAVEHDR)((LPSTR)ash + sizeof(ACMSTREAMHEADER));    dwRet2 = waveInUnprepareHeader(wim->u.in.hInnerWave, lpWaveHdrSrc, sizeof(*lpWaveHdrSrc));    HeapFree(GetProcessHeap(), 0, ash);    lpWaveHdrDst->dwFlags &= ~WHDR_PREPARED;    return (dwRet1 == MMSYSERR_NOERROR) ? dwRet2 : dwRet1;}static	DWORD	widGetPosition(WAVEMAPDATA* wim, LPMMTIME lpTime, DWORD dwParam2){    DWORD       val = waveInGetPosition(wim->u.in.hInnerWave, lpTime, dwParam2);    if (lpTime->wType == TIME_BYTES)        lpTime->u.cb = MulDiv(lpTime->u.cb, wim->avgSpeedOuter, wim->avgSpeedInner);    /* other time types don't require conversion */    return val;}static	DWORD	widGetDevCaps(UINT wDevID, WAVEMAPDATA* wim, LPWAVEINCAPSA lpWaveCaps, DWORD dwParam2){    /* if opened low driver, forward message */    if (WAVEMAP_IsData(wim))	return waveInGetDevCapsA((UINT)wim->u.in.hInnerWave, lpWaveCaps, dwParam2);    /* otherwise, return caps of mapper itself */    if (wDevID == (UINT)-1 || wDevID == (UINT16)-1) {	lpWaveCaps->wMid = 0x00FF;	lpWaveCaps->wPid = 0x0001;	lpWaveCaps->vDriverVersion = 0x0001;	strcpy(lpWaveCaps->szPname, "Wine wave in mapper");	lpWaveCaps->dwFormats =	    WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 |	    WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 |	    WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16;	lpWaveCaps->wChannels = 2;	return MMSYSERR_NOERROR;    }    ERR("This shouldn't happen\n");    return MMSYSERR_ERROR;}static	DWORD	widStop(WAVEMAPDATA* wim){    return waveInStop(wim->u.in.hInnerWave);}static	DWORD	widStart(WAVEMAPDATA* wim){    return waveInStart(wim->u.in.hInnerWave);}static	DWORD	widReset(WAVEMAPDATA* wim){    return waveInReset(wim->u.in.hInnerWave);}static  DWORD	widMapperStatus(WAVEMAPDATA* wim, DWORD flags, LPVOID ptr){    UINT	id;    DWORD	ret = MMSYSERR_NOTSUPPORTED;    switch (flags) {    case WAVEIN_MAPPER_STATUS_DEVICE:	ret = waveInGetID(wim->u.in.hInnerWave, &id);	*(LPDWORD)ptr = id;	break;    case WAVEIN_MAPPER_STATUS_MAPPED:	FIXME("Unsupported yet flag=%ld\n", flags);	*(LPDWORD)ptr = 0; /* FIXME ?? */	break;    case WAVEIN_MAPPER_STATUS_FORMAT:	FIXME("Unsupported flag=%ld\n", flags);	/* ptr points to a WAVEFORMATEX struct  - before or after streaming ? */	*(LPDWORD)ptr = 0; /* FIXME ?? */	break;    default:	FIXME("Unsupported flag=%ld\n", flags);	*(LPDWORD)ptr = 0;	break;    }    return ret;}/************************************************************************** * 				widMessage (MSACM.@) */DWORD WINAPI WAVEMAP_widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,				DWORD dwParam1, DWORD dwParam2){    TRACE("(%u, %04X, %08lX, %08lX, %08lX);\n",	  wDevID, wMsg, dwUser, dwParam1, dwParam2);    switch (wMsg) {    case DRVM_INIT:    case DRVM_EXIT:    case DRVM_ENABLE:    case DRVM_DISABLE:	/* FIXME: Pretend this is supported */	return 0;    case WIDM_OPEN:		return widOpen          ((LPDWORD)dwUser,     (LPWAVEOPENDESC)dwParam1, dwParam2);    case WIDM_CLOSE:		return widClose         ((WAVEMAPDATA*)dwUser);    case WIDM_ADDBUFFER:	return widAddBuffer     ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, 	dwParam2);    case WIDM_PREPARE:		return widPrepare       ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, 	dwParam2);    case WIDM_UNPREPARE:	return widUnprepare     ((WAVEMAPDATA*)dwUser, (LPWAVEHDR)dwParam1, 	dwParam2);    case WIDM_GETDEVCAPS:	return widGetDevCaps    (wDevID, (WAVEMAPDATA*)dwUser, (LPWAVEINCAPSA)dwParam1, dwParam2);    case WIDM_GETNUMDEVS:	return 1;    case WIDM_GETPOS:		return widGetPosition   ((WAVEMAPDATA*)dwUser, (LPMMTIME)dwParam1, 	dwParam2);    case WIDM_RESET:		return widReset         ((WAVEMAPDATA*)dwUser);    case WIDM_START:		return widStart         ((WAVEMAPDATA*)dwUser);    case WIDM_STOP:		return widStop          ((WAVEMAPDATA*)dwUser);    case WIDM_MAPPER_STATUS:	return widMapperStatus  ((WAVEMAPDATA*)dwUser, dwParam1, (LPVOID)dwParam2);    default:	FIXME("unknown message %u!\n", wMsg);    }    return MMSYSERR_NOTSUPPORTED;}/*======================================================================* *                  Driver part                                         * *======================================================================*/static	struct WINE_WAVEMAP* oss = NULL;/************************************************************************** * 				WAVEMAP_drvOpen			[internal] */static	DWORD	WAVEMAP_drvOpen(LPSTR str){    if (oss)	return 0;    /* I know, this is ugly, but who cares... */    oss = (struct WINE_WAVEMAP*)1;    return 1;}/************************************************************************** * 				WAVEMAP_drvClose		[internal] */static	DWORD	WAVEMAP_drvClose(DWORD dwDevID){    if (oss) {	oss = NULL;	return 1;    }    return 0;}/************************************************************************** * 				DriverProc (MSACM.@) */LONG CALLBACK	WAVEMAP_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,				   DWORD dwParam1, DWORD dwParam2){    TRACE("(%08lX, %p, %08lX, %08lX, %08lX)\n",	  dwDevID, hDriv, wMsg, dwParam1, dwParam2);    switch(wMsg) {    case DRV_LOAD:		return 1;    case DRV_FREE:		return 1;    case DRV_OPEN:		return WAVEMAP_drvOpen((LPSTR)dwParam1);    case DRV_CLOSE:		return WAVEMAP_drvClose(dwDevID);    case DRV_ENABLE:		return 1;    case DRV_DISABLE:		return 1;    case DRV_QUERYCONFIGURE:	return 1;    case DRV_CONFIGURE:		MessageBoxA(0, "WAVEMAP MultiMedia Driver !", "Wave mapper Driver", MB_OK);	return 1;    case DRV_INSTALL:		return DRVCNF_RESTART;    case DRV_REMOVE:		return DRVCNF_RESTART;    default:	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);    }}

⌨️ 快捷键说明

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