www.pudn.com > gspmidi101src.zip > gspmidi_a.c
#include "win_inc.h"
#include "config.h"
#include "output.h"
int OpenOutput(void); /* 0=success, 1=warning, -1=fatal error */
void CloseOutput(void);
void OutputData(int32 *buf, int32 count);
void FlushOutput(void);
void PurgeOutput(void);
#define dpm gsp_play_mode
PlayMode dpm = {
DEFAULT_RATE, PE_16BIT | PE_SIGNED,
-1,
{16},
"Windows wave mapper", 'd',
NULL,
OpenOutput,
CloseOutput,
OutputData,
FlushOutput,
PurgeOutput
};
extern WAVEHDR* g_pHdr;
__inline void s32tos16_2(int32 *lp, int16 *sp, int32 c)
{
int32 l;
while (c--) {
l = (*lp++) >> (32 - 16 - GUARD_BITS);
if (l > 32767) l= 32767;
else if (l < -32768) l= -32768;
*sp++ = (int16)(l);
}
}
__inline void s32tou8_2(int32 *lp, uint8 *cp, int32 c)
{
int32 l;
while (c--) {
l = (*lp++) >> (32 - 8 - GUARD_BITS);
if (l > 127) l= 127;
else if (l < -128) l= -128;
*cp++ = 0x80 ^ ((uint8)l);
}
}
int OpenOutput(void)
{
return 0;
}
void OutputData(int32 *buf, int32 count)
{
int converted;
if (dpm.encoding & PE_16BIT)
converted = count * 2;
else
converted = count;
if (!(dpm.encoding & PE_MONO))
converted *= 2;
if (dpm.encoding & PE_16BIT) {
/* Convert data to signed 16-bit PCM */
if (dpm.encoding & PE_MONO)
s32tos16_2(buf, (int16*)(g_pHdr->lpData + g_pHdr->dwBytesRecorded), count);
else
s32tos16_2(buf, (int16*)(g_pHdr->lpData + g_pHdr->dwBytesRecorded), count * 2);
}
else {
/* Convert to 8-bit unsigned. */
if (dpm.encoding & PE_MONO)
s32tou8_2(buf, (uint8*)(g_pHdr->lpData + g_pHdr->dwBytesRecorded), count);
else
s32tou8_2(buf, (uint8*)(g_pHdr->lpData + g_pHdr->dwBytesRecorded), count * 2);
}
g_pHdr->dwBytesRecorded += converted;
}
void CloseOutput(void)
{
}
void FlushOutput(void)
{
}
void PurgeOutput(void)
{
}
int GetSampleCount(int len)
{
int ret = len;
if (dpm.encoding & PE_16BIT)
ret /= 2;
if (!(dpm.encoding & PE_MONO))
ret /= 2;
return ret;
}