Added support to samples.cpp for volume and left/right selection for each route. Updated necessary drivers to support.

This commit is contained in:
Barry Harris 2012-05-24 09:46:27 +00:00
parent 2d0d872d27
commit f21770fa69
4 changed files with 152 additions and 33 deletions

View File

@ -381,7 +381,7 @@ static struct BurnSampleInfo GalagaSampleDesc[] = {
{ "bang.wav", SAMPLE_NOLOOP },
{ "bang.wav", SAMPLE_NOLOOP },
#endif
{ "", 0 }
{ "", 0 }
};
STD_SAMPLE_PICK(Galaga)
@ -847,7 +847,8 @@ static void MachineInit()
NamcoSoundInit(18432000 / 6 / 32);
NacmoSoundSetAllRoutes(0.90 * 10.0 / 16.0, BURN_SND_ROUTE_BOTH);
BurnSampleInit(80, 0);
BurnSampleInit(0);
BurnSampleSetAllRoutesAllSamples(0.80, BURN_SND_ROUTE_BOTH);
GenericTilesInit();

View File

@ -707,7 +707,8 @@ static void MachineInit()
NamcoSoundInit(18432000 / 6 / 32);
NacmoSoundSetAllRoutes(1.00, BURN_SND_ROUTE_BOTH);
BurnSampleInit(80, 0);
BurnSampleInit(0);
BurnSampleSetAllRoutesAllSamples(0.80, BURN_SND_ROUTE_BOTH);
GenericTilesInit();

View File

@ -11,7 +11,6 @@
static INT32 bAddToStream = 0;
static INT32 nTotalSamples = 0;
static INT32 nSampleSetGain = 100;
struct sample_format
{
@ -21,6 +20,8 @@ struct sample_format
UINT8 playing;
UINT8 loop;
UINT8 flags;
double gain[2];
INT32 output_dir[2];
};
static struct sample_format *samples = NULL; // store samples
@ -88,7 +89,7 @@ static void make_raw(UINT8 *src, UINT32 len)
// now go through and set the gain
for (UINT32 i = 0; i < converted_len * 2; i++)
{
INT32 d = (data[i] * nSampleSetGain) / 100;
INT32 d = data[i];
if (d > 0x7fff) d = 0x7fff;
if (d < -0x7fff) d = -0x7fff;
data[i] = (INT16)d;
@ -224,7 +225,7 @@ INT32 __cdecl ZipLoadOneFile(char* arcName, const char* fileName, void** Dest, I
char* TCHARToANSI(const TCHAR* pszInString, char* pszOutString, INT32 nOutSize);
#define _TtoA(a) TCHARToANSI(a, NULL, 0)
void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample to stream?*/)
void BurnSampleInit(INT32 bAdd /*add sample to stream?*/)
{
DebugSnd_SamplesInitted = 1;
@ -272,7 +273,6 @@ void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample
if (!nEnableSamples) return;
bAddToStream = bAdd;
nSampleSetGain = nGain;
nTotalSamples = 0;
struct BurnSampleInfo si;
@ -307,6 +307,11 @@ void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample
sample_ptr->flags = SAMPLE_IGNORE;
}
sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1] = 1.00;
sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2] = 1.00;
sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] = BURN_SND_ROUTE_BOTH;
sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] = BURN_SND_ROUTE_BOTH;
if (destination) {
free (destination);
destination = NULL;
@ -314,6 +319,34 @@ void BurnSampleInit(INT32 nGain /*volume percentage!*/, INT32 bAdd /*add sample
}
}
void BurnSampleSetRoute(INT32 sample, INT32 nIndex, double nVolume, INT32 nRouteDir)
{
#if defined FBA_DEBUG
if (!DebugSnd_SamplesInitted) bprintf(PRINT_ERROR, _T("BurnSampleSetRoute called without init\n"));
if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("BurnSampleSetRoute called with invalid index %i\n"), nIndex);
#endif
if (sample >= nTotalSamples) return;
sample_ptr = &samples[sample];
sample_ptr->gain[nIndex] = nVolume;
sample_ptr->output_dir[nIndex] = nRouteDir;
}
void BurnSampleSetRouteAllSamples(INT32 nIndex, double nVolume, INT32 nRouteDir)
{
#if defined FBA_DEBUG
if (!DebugSnd_SamplesInitted) bprintf(PRINT_ERROR, _T("BurnSampleSetRouteAllSamples called without init\n"));
if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("BurnSampleSetRouteAllSamples called with invalid index %i\n"), nIndex);
#endif
for (INT32 i = 0; i < nTotalSamples; i++) {
sample_ptr = &samples[i];
sample_ptr->gain[nIndex] = nVolume;
sample_ptr->output_dir[nIndex] = nRouteDir;
}
}
void BurnSampleExit()
{
#if defined FBA_DEBUG
@ -336,7 +369,6 @@ void BurnSampleExit()
sample_ptr = NULL;
nTotalSamples = 0;
bAddToStream = 0;
nSampleSetGain = 100;
DebugSnd_SamplesInitted = 0;
}
@ -366,8 +398,33 @@ void BurnSampleRender(INT16 *pDest, UINT32 pLen)
if (loop) {
if (bAddToStream == 0 && nFirstSample == 0) {
for (INT32 j = 0; j < playlen; j++, position++) {
dest[j] = data[position % length];
position *= 2;
length *= 2;
INT16 *dst = (INT16*)dest;
INT16 *dat = (INT16*)data;
for (INT32 j = 0; j < playlen; j++, position+=2, dst += 2) {
INT32 nLeftSample = 0, nRightSample = 0;
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
nLeftSample = BURN_SND_CLIP(nLeftSample);
nRightSample = BURN_SND_CLIP(nRightSample);
dst[0] = nLeftSample;
dst[1] = nRightSample;
}
} else {
position *= 2;
@ -376,15 +433,27 @@ void BurnSampleRender(INT16 *pDest, UINT32 pLen)
INT16 *dat = (INT16*)data;
for (INT32 j = 0; j < playlen; j++, position+=2, dst += 2) {
INT32 t0 = dst[0] + dat[(position + 0) % length];
INT32 t1 = dst[1] + dat[(position + 1) % length];
INT32 nLeftSample = 0, nRightSample = 0;
if (t0 > 0x7fff) t0 = 0x7fff;
if (t1 > 0x7fff) t1 = 0x7fff;
if (t0 < -0x7fff) t0 = -0x7fff;
if (t1 < -0x7fff) t1 = -0x7fff;
dst[0] = t0;
dst[1] = t1;
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[(position + 0) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[(position + 1) % length] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
nLeftSample = BURN_SND_CLIP(nLeftSample + dst[0]);
nRightSample = BURN_SND_CLIP(nRightSample + dst[1]);
dst[0] = nLeftSample;
dst[1] = nRightSample;
}
}
} else {
@ -401,23 +470,58 @@ void BurnSampleRender(INT16 *pDest, UINT32 pLen)
if (playlen > length) playlen = length;
if (bAddToStream == 0 && nFirstSample == 0) {
for (INT32 j = 0; j < playlen; j++) {
dest[j] = data[j];
INT16 *dst = (INT16*)dest;
INT16 *dat = (INT16*)data;
for (INT32 j = 0; j < playlen; j++, dst +=2, dat+=2) {
INT32 nLeftSample = 0, nRightSample = 0;
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
nLeftSample = BURN_SND_CLIP(nLeftSample);
nRightSample = BURN_SND_CLIP(nRightSample);
dst[0] = nLeftSample;
dst[1] = nRightSample;
}
} else {
INT16 *dst = (INT16*)dest;
INT16 *dat = (INT16*)data;
for (INT32 j = 0; j < playlen; j++, dst +=2, dat+=2) {
INT32 t0 = dst[0] + dat[0];
INT32 t1 = dst[1] + dat[1];
INT32 nLeftSample = 0, nRightSample = 0;
if (t0 > 0x7fff) t0 = 0x7fff;
if (t1 > 0x7fff) t1 = 0x7fff;
if (t0 < -0x7fff) t0 = -0x7fff;
if (t1 < -0x7fff) t1 = -0x7fff;
dst[0] = t0;
dst[1] = t1;
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[0] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_1]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
if ((sample_ptr->output_dir[BURN_SND_SAMPLE_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(dat[1] * sample_ptr->gain[BURN_SND_SAMPLE_ROUTE_2]);
}
nLeftSample = BURN_SND_CLIP(nLeftSample + dst[0]);
nRightSample = BURN_SND_CLIP(nRightSample + dst[1]);
dst[0] = nLeftSample;
dst[1] = nRightSample;
}
}
}

View File

@ -16,9 +16,22 @@ void BurnSampleSetPosition(INT32 sample, UINT32 position);
void BurnSampleReset();
void BurnSampleInit(INT32 nGain, INT32 bAdd);
void BurnSampleInit(INT32 bAdd);
void BurnSampleSetRoute(INT32 sample, INT32 nIndex, double nVolume, INT32 nRouteDir);
void BurnSampleSetRouteAllSamples(INT32 nIndex, double nVolume, INT32 nRouteDir);
INT32 BurnSampleScan(INT32 nAction, INT32 *pnMin);
void BurnSampleRender(INT16 *pDest, UINT32 pLen);
void BurnSampleExit();
#define BURN_SND_SAMPLE_ROUTE_1 0
#define BURN_SND_SAMPLE_ROUTE_2 1
#define BurnSampleSetAllRoutes(i, v, d) \
BurnSampleSetRoute(i, BURN_SND_SAMPLE_ROUTE_1, v, d); \
BurnSampleSetRoute(i, BURN_SND_SAMPLE_ROUTE_2, v, d);
#define BurnSampleSetAllRoutesAllSamples(v, d) \
BurnSampleSetRouteAllSamples(BURN_SND_SAMPLE_ROUTE_1, v, d); \
BurnSampleSetRouteAllSamples(BURN_SND_SAMPLE_ROUTE_2, v, d);