wavelib.c

来自「深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心」· C语言 代码 · 共 2,138 行 · 第 1/5 页

C
2,138
字号
#include <eframe.h>
#include <eapisrv.h>
//#include <ewavedev.h>
//#include <ewaveapi.h>
#include <emmsys.h>

#include <epcore.h>


enum{
    AUDIO_WAVEOUTGETNUMDEVS = 1,
    AUDIO_WAVEOUTGETDEVCAPS,
    AUDIO_WAVEOUTGETVOLUME,
    AUDIO_WAVEOUTSETVOLUME,
    AUDIO_WAVEOUTGETERRORTEXT,
    AUDIO_WAVEOUTCLOSE,
    AUDIO_WAVEOUTPREPAREHEADER,
    AUDIO_WAVEOUTUNPREPAREHEADER,
    AUDIO_WAVEOUTWRITE,
    AUDIO_WAVEOUTPAUSE,
    AUDIO_WAVEOUTRESTART,
    AUDIO_WAVEOUTRESET,
    AUDIO_WAVEOUTBREAKLOOP,
    AUDIO_WAVEOUTGETPOSITION,
    AUDIO_WAVEOUTGETPITCH,
    AUDIO_WAVEOUTSETPITCH,
    AUDIO_WAVEOUTGETPLAYBACKRATE,
    AUDIO_WAVEOUTSETPLAYBACKRATE,
    AUDIO_WAVEOUTGETID,
    AUDIO_WAVEOUTMESSAGE,
    AUDIO_WAVEOUTOPEN,
	AUDIO_WAVEINGETNUMDEVS,
    AUDIO_WAVEINGETDEVCAPS,
    AUDIO_WAVEINGETERRORTEXT,
    AUDIO_WAVEINCLOSE,
    AUDIO_WAVEINPREPAREHEADER,
    AUDIO_WAVEINUNPREPAREHEADER,
    AUDIO_WAVEINADDBUFFER,
    AUDIO_WAVEINSTART,
    AUDIO_WAVEINSTOP,
    AUDIO_WAVEINRESET,
    AUDIO_WAVEINGETPOSITION,
    AUDIO_WAVEINGETID,
    AUDIO_WAVEINMESSAGE,
    AUDIO_WAVEINOPEN,

    AUDIO_MIDICONNECT,
    AUDIO_MIDIDISCONNECT,
    AUDIO_MIDIINADDBUFFER,
    AUDIO_MIDIINCLOSE,
    AUDIO_MIDIINGETDEVCAPS,
    AUDIO_MIDIINGETERRORTEXT,
    AUDIO_MIDIINGETID,
    AUDIO_MIDIINGETNUMDEVS,
    AUDIO_MIDIINMESSAGE,
    AUDIO_MIDIINOPEN,
    AUDIO_MIDIINPREPAREHEADER,
    AUDIO_MIDIINRESET,
    AUDIO_MIDIINSTART,
    AUDIO_MIDIINSTOP,
    AUDIO_MIDIINUNPREPAREHEADER,
    AUDIO_MIDIOUTCACHEDRUMPATCHES,
    AUDIO_MIDIOUTCACHEPATCHES,
    AUDIO_MIDIOUTCLOSE,
    AUDIO_MIDIOUTGETDEVCAPS,
    AUDIO_MIDIOUTGETERRORTEXT,
    AUDIO_MIDIOUTGETID,
    AUDIO_MIDIOUTGETNUMDEVS,
    AUDIO_MIDIOUTGETVOLUME,
    AUDIO_MIDIOUTLONGMSG,
    AUDIO_MIDIOUTMESSAGE,
    AUDIO_MIDIOUTOPEN,
    AUDIO_MIDIOUTPREPAREHEADER,
    AUDIO_MIDIOUTRESET,
    AUDIO_MIDIOUTSETVOLUME,
    AUDIO_MIDIOUTSHORTMSG,
    AUDIO_MIDIOUTUNPREPAREHEADER,
    AUDIO_MIDISTREAMCLOSE,
    AUDIO_MIDISTREAMOPEN,
    AUDIO_MIDISTREAMOUT,
    AUDIO_MIDISTREAMPAUSE,
    AUDIO_MIDISTREAMPOSITION,
    AUDIO_MIDISTREAMPROPERTY,
    AUDIO_MIDISTREAMRESTART,
    AUDIO_MIDISTREAMSTOP,
};


typedef BOOL ( WINAPI * PWAVEOUTGETNUMDEVS)( void);
UINT     WINAPI aud_waveOutGetNumDevs(void)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTGETNUMDEVS, 0 );
    cs.arg0 = 0;
    return (DWORD)CALL_SERVER( &cs );
#else
	PWAVEOUTGETNUMDEVS pwaveOutGetNumDevs;

	CALLSTACK cs;
	UINT     retv = 0;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTGETNUMDEVS, &pwaveOutGetNumDevs, &cs ) )
	{
		retv = pwaveOutGetNumDevs();
		API_Leave(  );
	}
	return retv;
#endif
}

typedef MMRESULT (WINAPI * PWAVEOUTGETDEVCAPS)(UINT uDeviceID, LPWAVEOUTCAPS pwoc, UINT cbwoc);
MMRESULT WINAPI aud_waveOutGetDevCaps(UINT uDeviceID, LPWAVEOUTCAPS pwoc, UINT cbwoc)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTGETDEVCAPS, 3 );
    cs.arg0 = (DWORD)uDeviceID;
    return (DWORD)CALL_SERVER( &cs, pwoc, cbwoc);
#else
	PWAVEOUTGETDEVCAPS pwaveOutGetDevCaps;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTGETDEVCAPS, &pwaveOutGetDevCaps, &cs ) )
	{
		pwoc = MapProcessPtr( pwoc, (LPPROCESS)cs.lpvData );

		retv = pwaveOutGetDevCaps(uDeviceID, pwoc, cbwoc);
		API_Leave(  );
	}
	return retv;
#endif
}

typedef MMRESULT (WINAPI * PWAVEOUTGETVOLUME)(HWAVEOUT hwo, LPDWORD pdwVolume);
MMRESULT WINAPI aud_waveOutGetVolume(HWAVEOUT hwo, LPDWORD pdwVolume)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTGETVOLUME, 2 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs, pdwVolume);
#else
	PWAVEOUTGETVOLUME pwaveOutGetVolume;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTGETVOLUME, &pwaveOutGetVolume, &cs ) )
	{
		pdwVolume = MapProcessPtr( pdwVolume, (LPPROCESS)cs.lpvData );

		retv = pwaveOutGetVolume(hwo, pdwVolume);
		API_Leave(  );
	}
	return retv;
#endif
}


typedef MMRESULT (WINAPI * PWAVEOUTSETVOLUME)(HWAVEOUT hwo, DWORD dwVolume);
MMRESULT WINAPI aud_waveOutSetVolume(HWAVEOUT hwo, DWORD dwVolume)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTSETVOLUME, 2 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs, dwVolume);
#else
	PWAVEOUTSETVOLUME pwaveOutSetVolume;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTSETVOLUME, &pwaveOutSetVolume, &cs ) )
	{
		retv = pwaveOutSetVolume(hwo, dwVolume);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTGETERRORTEXT)(MMRESULT mmrError, LPTSTR pszText, UINT cchText);
MMRESULT WINAPI aud_waveOutGetErrorText(MMRESULT mmrError, LPTSTR pszText, UINT cchText)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTGETERRORTEXT, 3 );
    cs.arg0 = (DWORD)mmrError;
    return (DWORD)CALL_SERVER( &cs, pszText, cchText);
#else
	PWAVEOUTGETERRORTEXT pwaveOutGetErrorText;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTGETERRORTEXT, &pwaveOutGetErrorText, &cs ) )
	{
		pszText = MapProcessPtr( pszText, (LPPROCESS)cs.lpvData );

		retv = pwaveOutGetErrorText(mmrError, pszText, cchText);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTCLOSE)(HWAVEOUT hwo);
MMRESULT WINAPI aud_waveOutClose(HWAVEOUT hwo)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTCLOSE, 1 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs );
#else
	PWAVEOUTCLOSE pwaveOutClose;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTCLOSE, &pwaveOutClose, &cs ) )
	{
		retv = pwaveOutClose(hwo);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTPREPAREHEADER)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
MMRESULT WINAPI aud_waveOutPrepareHeader(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTPREPAREHEADER, 3 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs, pwh, cbwh);
#else
	PWAVEOUTPREPAREHEADER pwaveOutPrepareHeader;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTPREPAREHEADER, &pwaveOutPrepareHeader, &cs ) )
	{
		pwh = MapProcessPtr( pwh, (LPPROCESS)cs.lpvData );
		pwh->lpData = MapProcessPtr( pwh->lpData , (LPPROCESS)cs.lpvData );

		retv = pwaveOutPrepareHeader(hwo, pwh, cbwh);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTUNPREPAREHEADER)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
MMRESULT WINAPI aud_waveOutUnprepareHeader(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTUNPREPAREHEADER, 3 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs, pwh, cbwh);
#else
	PWAVEOUTUNPREPAREHEADER pwaveOutUnprepareHeader;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTUNPREPAREHEADER, &pwaveOutUnprepareHeader, &cs ) )
	{
		pwh = MapProcessPtr( pwh, (LPPROCESS)cs.lpvData );
		pwh->lpData = MapProcessPtr( pwh->lpData , (LPPROCESS)cs.lpvData );

		retv = pwaveOutUnprepareHeader(hwo, pwh, cbwh);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTWRITE)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
MMRESULT WINAPI aud_waveOutWrite(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTWRITE, 3 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs, pwh, cbwh);
#else
	PWAVEOUTWRITE pwaveOutWrite;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTWRITE, &pwaveOutWrite, &cs ) )
	{
		pwh = MapProcessPtr( pwh, (LPPROCESS)cs.lpvData );
		pwh->lpData = MapProcessPtr( pwh->lpData , (LPPROCESS)cs.lpvData );

		retv = pwaveOutWrite(hwo, pwh, cbwh);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTPAUSE)(HWAVEOUT hwo);
MMRESULT WINAPI aud_waveOutPause(HWAVEOUT hwo)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTPAUSE, 1 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs );
#else
	PWAVEOUTPAUSE pwaveOutPause;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTPAUSE, &pwaveOutPause, &cs ) )
	{
		retv = pwaveOutPause(hwo);
		API_Leave(  );
	}
	return retv;
#endif

}


typedef MMRESULT (WINAPI *PWAVEOUTRESTART)(HWAVEOUT hwo);
MMRESULT WINAPI aud_waveOutRestart(HWAVEOUT hwo)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTRESTART, 1 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs );
#else
	PWAVEOUTRESTART pwaveOutRestart;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTRESTART, &pwaveOutRestart, &cs ) )
	{
		retv = pwaveOutRestart(hwo);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTRESET)(HWAVEOUT hwo);
MMRESULT WINAPI aud_waveOutReset(HWAVEOUT hwo)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTRESET, 1 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs );
#else
	PWAVEOUTRESET pwaveOutReset;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTRESET, &pwaveOutReset, &cs ) )
	{
		retv = pwaveOutReset(hwo);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTBREAKLOOP)(HWAVEOUT hwo);
MMRESULT WINAPI aud_waveOutBreakLoop(HWAVEOUT hwo)
{
#ifdef CALL_TRAP
    CALLTRAP cs;
    cs.apiInfo = CALL_API( API_AUDIO, AUDIO_WAVEOUTBREAKLOOP, 1 );
    cs.arg0 = (DWORD)hwo;
    return (DWORD)CALL_SERVER( &cs );
#else
	PWAVEOUTBREAKLOOP pwaveOutBreakLoop;

	CALLSTACK cs;
	MMRESULT  retv = MMSYSERR_ERROR;

	if( API_Enter( API_AUDIO, AUDIO_WAVEOUTBREAKLOOP, &pwaveOutBreakLoop, &cs ) )
	{
		retv = pwaveOutBreakLoop(hwo);
		API_Leave(  );
	}
	return retv;
#endif
}



typedef MMRESULT (WINAPI *PWAVEOUTGETPOSITION)(HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt);
MMRESULT WINAPI aud_waveOutGetPosition(HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt)
{
#ifdef CALL_TRAP
    CALLTRAP cs;

⌨️ 快捷键说明

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