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

This commit is contained in:
Barry Harris 2012-05-20 07:35:25 +00:00
parent 5423fb03af
commit 22c6f4a82e
4 changed files with 57 additions and 13 deletions

View File

@ -1987,6 +1987,7 @@ INT32 System16Init()
BurnYM3438SetAllRoutes(1, 0.40, BURN_SND_ROUTE_BOTH);
RF5C68PCMInit(10000000);
RF5C68PCMSetAllRoutes(1.00, BURN_SND_ROUTE_BOTH);
System16TileBankSize = 0x400;
System16CreateOpaqueTileMaps = 1;

View File

@ -24,6 +24,8 @@ struct rf5c68pcm
UINT8 wbank;
UINT8 enable;
UINT8 data[0x10000];
double volume[2];
INT32 output_dir[2];
};
static struct rf5c68pcm *chip = NULL;
@ -61,7 +63,7 @@ void RF5C68PCMUpdate(INT16* pSoundBuf, INT32 length)
if (sample == 0xff) break;
}
chan->addr += (chan->step * nUpdateStep) >> 15;//(chan->step * 1181) / 1000;
chan->addr += (chan->step * nUpdateStep) >> 15;
if (sample & 0x80) {
sample &= 0x7f;
@ -76,15 +78,33 @@ void RF5C68PCMUpdate(INT16* pSoundBuf, INT32 length)
}
for (i = 0; i < length; i++) {
if (left[i] > 32767) left[i] = 32767;
if (left[i] < -32768) left[i] = -32768;
left[i] = left[i] & ~0x3f;
if (right[i] > 32767) right[i] = 32767;
if (right[i] < -32768) right[i] = -32768;
right[i] = right[i] & ~0x3f;
INT32 nLeftSample = 0;
INT32 nRightSample = 0;
pSoundBuf[i + 0] = left[i];
pSoundBuf[i + 1] = right[i];
left[i] = BURN_SND_CLIP(left[i]);
left[i] = left[i] & ~0x3f;
right[i] = BURN_SND_CLIP(right[i]);
right[i] = right[i] & ~0x3f;
if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(left[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_1]);
}
if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(left[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_1]);
}
if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)(right[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_2]);
}
if ((chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)(right[i] * chip->volume[BURN_SND_RF5C68PCM_ROUTE_2]);
}
nLeftSample = BURN_SND_CLIP(nLeftSample);
nRightSample = BURN_SND_CLIP(nRightSample);
pSoundBuf[i + 0] = nLeftSample;
pSoundBuf[i + 1] = nRightSample;
}
}
@ -94,7 +114,6 @@ void RF5C68PCMReset()
if (!DebugSnd_RF5C68Initted) bprintf(PRINT_ERROR, _T("RF5C68PCMReset called without init\n"));
#endif
memset(chip, 0, sizeof(*chip));
memset(chip->data, 0xff, sizeof(chip->data));
}
@ -109,9 +128,25 @@ void RF5C68PCMInit(INT32 clock)
left = (INT32*)malloc(nBurnSoundLen * sizeof(INT32));
right = (INT32*)malloc(nBurnSoundLen * sizeof(INT32));
chip->volume[BURN_SND_RF5C68PCM_ROUTE_1] = 1.00;
chip->volume[BURN_SND_RF5C68PCM_ROUTE_2] = 1.00;
chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_1] = BURN_SND_ROUTE_LEFT;
chip->output_dir[BURN_SND_RF5C68PCM_ROUTE_2] = BURN_SND_ROUTE_RIGHT;
DebugSnd_RF5C68Initted = 1;
}
void RF5C68PCMSetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir)
{
#if defined FBA_DEBUG
if (!DebugSnd_RF5C68Initted) bprintf(PRINT_ERROR, _T("RF5C68PCMSetRoute called without init\n"));
if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("RF5C68PCMSetRoute called with invalid index %i\n"), nIndex);
#endif
chip->volume[nIndex] = nVolume;
chip->output_dir[nIndex] = nRouteDir;
}
void RF5C68PCMExit()
{
#if defined FBA_DEBUG

View File

@ -1,8 +1,16 @@
void RF5C68PCMUpdate(INT16* pSoundBuf, INT32 length);
void RF5C68PCMReset();
void RF5C68PCMInit(INT32 clock);
void RF5C68PCMSetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir);
void RF5C68PCMExit();
void RF5C68PCMScan(INT32 nAction);
void RF5C68PCMRegWrite(UINT8 offset, UINT8 data);
UINT8 RF5C68PCMRead(UINT16 offset);
void RF5C68PCMWrite(UINT16 offset, UINT8 data);
#define BURN_SND_RF5C68PCM_ROUTE_1 0
#define BURN_SND_RF5C68PCM_ROUTE_2 1
#define RF5C68PCMSetAllRoutes(v, d) \
RF5C68PCMSetRoute(BURN_SND_RF5C68PCM_ROUTE_1, v, d); \
RF5C68PCMSetRoute(BURN_SND_RF5C68PCM_ROUTE_2, v, d);

View File

@ -16,6 +16,6 @@ void SegaPCMWrite(UINT32 Offset, UINT8 Data);
#define BURN_SND_SEGAPCM_ROUTE_1 0
#define BURN_SND_SEGAPCM_ROUTE_2 1
#define SegaPCMSetAllRoutes(i, v, d) \
SegaPCMSetRoute(i, BURN_SND_SEGAPCM_ROUTE_1, v, d); \
SegaPCMSetRoute(i, BURN_SND_SEGAPCM_ROUTE_2, v, d);
#define SegaPCMSetAllRoutes(v, d) \
SegaPCMSetRoute(BURN_SND_SEGAPCM_ROUTE_1, v, d); \
SegaPCMSetRoute(BURN_SND_SEGAPCM_ROUTE_2, v, d);