Updated playptmod and modplay
parent
08c0ac22c4
commit
8f1d76bd92
|
@ -2210,6 +2210,8 @@ static void MainPlayer(PLAYER *p) /* periodically called from mixer */
|
|||
|
||||
resampler_dup_inplace(p->resampler[SPARE_OFFSET + ChNr], p->resampler[ChNr]);
|
||||
resampler_dup_inplace(p->resampler[TOTAL_VOICES + SPARE_OFFSET + ChNr], p->resampler[TOTAL_VOICES + ChNr]);
|
||||
resampler_clear(p->resampler[ChNr]);
|
||||
resampler_clear(p->resampler[TOTAL_VOICES + ChNr]);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -3744,6 +3746,7 @@ void ft2play_RenderFixed32(void *_p, int32_t *buffer, int32_t count, int8_t dept
|
|||
float sample;
|
||||
assert(sizeof(int32_t) == sizeof(float));
|
||||
ft2play_RenderFloat(_p, fbuffer, count);
|
||||
if (buffer)
|
||||
for (i = 0; i < count * 2; ++i)
|
||||
{
|
||||
sample = fbuffer[i] * scale;
|
||||
|
@ -3759,6 +3762,9 @@ void ft2play_RenderFixed16(void *_p, int16_t *buffer, int32_t count, int8_t dept
|
|||
float scale = (float)(1 << (depth - 1));
|
||||
float sample;
|
||||
float fbuffer[1024];
|
||||
if (!buffer)
|
||||
ft2play_RenderFloat(_p, 0, count);
|
||||
else
|
||||
while (count)
|
||||
{
|
||||
SamplesTodo = (count < 512) ? count : 512;
|
||||
|
|
|
@ -1048,6 +1048,8 @@ static inline void doamiga(PLAYER *p, uint8_t ch)
|
|||
setvol(p, ch, 32, 0);
|
||||
resampler_dup_inplace(p->resampler[ch + 32], p->resampler[ch]);
|
||||
resampler_dup_inplace(p->resampler[ch + 32 + 64], p->resampler[ch + 64]);
|
||||
resampler_clear(p->resampler[ch]);
|
||||
resampler_clear(p->resampler[ch + 64]);
|
||||
if (p->chn[ch].vol != 255)
|
||||
{
|
||||
if (p->chn[ch].vol <= 64)
|
||||
|
@ -3845,6 +3847,7 @@ void st3play_RenderFixed32(void *_p, int32_t *buffer, int32_t count, int8_t dept
|
|||
float sample;
|
||||
assert(sizeof(int32_t) == sizeof(float));
|
||||
st3play_RenderFloat(_p, fbuffer, count);
|
||||
if (buffer)
|
||||
for (i = 0; i < count * 2; ++i)
|
||||
{
|
||||
sample = fbuffer[i] * scale;
|
||||
|
@ -3860,6 +3863,9 @@ void st3play_RenderFixed16(void *_p, int16_t *buffer, int32_t count, int8_t dept
|
|||
float scale = (float)(1 << (depth - 1));
|
||||
float sample;
|
||||
float fbuffer[1024];
|
||||
if (!buffer)
|
||||
st3play_RenderFloat(_p, 0, count);
|
||||
else
|
||||
while (count)
|
||||
{
|
||||
SamplesTodo = (count < 512) ? count : 512;
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
/*
|
||||
** - playptmod v1.15b - 29th of September 2014 -
|
||||
** This is the foobar2000 version, with code by kode54
|
||||
** - playptmod v1.16 - 23rd of January 2015 -
|
||||
** This is the foobar2000 version, with added code by kode54
|
||||
**
|
||||
** Changelog from 1.15b:
|
||||
** - Glissando (3xx/5xy) should not continue after its slide was done,
|
||||
** but this only applies to MODs playing in ProTracker mode.
|
||||
**
|
||||
** Changelog from 1.15a:
|
||||
** - Added a hack to find out what 8xx pan is used (7-bit/8-bit)
|
||||
|
@ -131,6 +135,7 @@ typedef struct
|
|||
unsigned char invertLoopDelay;
|
||||
unsigned char invertLoopSpeed;
|
||||
unsigned char chanIndex;
|
||||
unsigned char doGlissando;
|
||||
short period;
|
||||
short tempPeriod;
|
||||
int noNote;
|
||||
|
@ -1861,22 +1866,30 @@ static void handleGlissando(player *p, mod_channel *ch)
|
|||
char h;
|
||||
|
||||
short *tablePointer;
|
||||
|
||||
// quirk for glissando in PT mode
|
||||
if ((p->minPeriod == PT_MIN_PERIOD) && !ch->doGlissando)
|
||||
return;
|
||||
|
||||
if (p->tempPeriod > 0)
|
||||
{
|
||||
if (ch->period < ch->tempPeriod)
|
||||
{
|
||||
ch->period += ch->glissandoSpeed;
|
||||
|
||||
if (ch->period > ch->tempPeriod)
|
||||
if (ch->period >= ch->tempPeriod)
|
||||
{
|
||||
ch->period = ch->tempPeriod;
|
||||
ch->doGlissando = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ch->period -= ch->glissandoSpeed;
|
||||
|
||||
if (ch->period < ch->tempPeriod)
|
||||
if (ch->period <= ch->tempPeriod)
|
||||
{
|
||||
ch->period = ch->tempPeriod;
|
||||
ch->doGlissando = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (ch->glissandoControl != 0)
|
||||
|
@ -2488,6 +2501,17 @@ static void fetchPatternData(player *p, mod_channel *ch)
|
|||
ch->tempPeriod = (p->minPeriod == PT_MIN_PERIOD) ? rawAmigaPeriods[(ch->fineTune * 37) + tempNote] : extendedRawPeriods[(ch->fineTune * 85) + tempNote];
|
||||
ch->flags |= FLAG_NOTE;
|
||||
}
|
||||
|
||||
// 3xx/5xy quirk for PT MODs
|
||||
if (p->minPeriod == PT_MIN_PERIOD)
|
||||
{
|
||||
if ((ch->command == 0x03) || (ch->command == 0x05))
|
||||
{
|
||||
ch->doGlissando = true;
|
||||
if (!ch->period || (ch->period == ch->tempPeriod))
|
||||
ch->doGlissando = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue