Updated modplay

This commit is contained in:
Chris Moeller 2015-11-12 21:35:42 -08:00
parent ce2303ef24
commit b8763c6cad
4 changed files with 721 additions and 633 deletions

View file

@ -2167,7 +2167,8 @@ static void MainPlayer(PLAYER *p) /* periodically called from mixer */
if (oldSongPos != p->Song.SongPos)
{
for (size_t i = 0; i < playedRowsCount; ++i)
size_t i;
for (i = 0; i < playedRowsCount; ++i)
bit_array_set(p->playedRows, oldSongPos * 1024 + p->playedRowsPatLoop[i]);
memset(p->playedRowsPatLoop, 0xFF, playedRowsCount * 2);
playedRowsCount = 0;
@ -3032,7 +3033,7 @@ static inline void mix8b(PLAYER *p, uint32_t ch, uint32_t samples)
{
samplePosition = v->samplePosition;
while (interpolating && (resampler_get_free_count(resampler) ||
while (interpolating > 0 && (resampler_get_free_count(resampler) ||
!resampler_get_sample_count(resampler)))
{
resampler_write_sample_fixed(resampler, sampleData[samplePosition], 8);
@ -3071,11 +3072,18 @@ static inline void mix8b(PLAYER *p, uint32_t ch, uint32_t samples)
}
else if ((samplePosition < 0) || (samplePosition >= sampleLength))
{
interpolating = 0;
interpolating = -resampler_get_padding_size();
break;
}
}
while (interpolating < 0 && (resampler_get_free_count(resampler) ||
!resampler_get_sample_count(resampler)))
{
resampler_write_sample_fixed(resampler, 0, 8);
++interpolating;
}
v->samplePosition = samplePosition;
v->loopingForward = loopingForward;
v->interpolating = (int8_t)interpolating;
@ -3196,7 +3204,7 @@ static inline void mix8bstereo(PLAYER *p, uint32_t ch, uint32_t samples)
{
samplePosition = v->samplePosition;
while (interpolating && (resampler_get_free_count(resampler[0]) ||
while (interpolating > 0 && (resampler_get_free_count(resampler[0]) ||
(!resampler_get_sample_count(resampler[0]) &&
!resampler_get_sample_count(resampler[1]))))
{
@ -3237,11 +3245,20 @@ static inline void mix8bstereo(PLAYER *p, uint32_t ch, uint32_t samples)
}
else if ((samplePosition < 0) || (samplePosition >= sampleLength))
{
interpolating = 0;
interpolating = -resampler_get_padding_size();
break;
}
}
while (interpolating < 0 && (resampler_get_free_count(resampler[0]) ||
(!resampler_get_sample_count(resampler[0]) &&
!resampler_get_sample_count(resampler[1]))))
{
resampler_write_sample_fixed(resampler[0], 0, 8);
resampler_write_sample_fixed(resampler[1], 0, 8);
++interpolating;
}
v->samplePosition = samplePosition;
v->loopingForward = loopingForward;
v->interpolating = (int8_t)interpolating;
@ -3366,7 +3383,7 @@ static inline void mix16b(PLAYER *p, uint32_t ch, uint32_t samples)
{
samplePosition = v->samplePosition;
while (interpolating && (resampler_get_free_count(resampler) ||
while (interpolating > 0 && (resampler_get_free_count(resampler) ||
!resampler_get_sample_count(resampler)))
{
resampler_write_sample_fixed(resampler, sampleData[samplePosition], 16);
@ -3405,11 +3422,18 @@ static inline void mix16b(PLAYER *p, uint32_t ch, uint32_t samples)
}
else if ((samplePosition < 0) || (samplePosition >= sampleLength))
{
interpolating = 0;
interpolating = -resampler_get_padding_size();
break;
}
}
while (interpolating < 0 && (resampler_get_free_count(resampler) ||
!resampler_get_sample_count(resampler)))
{
resampler_write_sample_fixed(resampler, 0, 16);
++interpolating;
}
v->samplePosition = samplePosition;
v->loopingForward = loopingForward;
v->interpolating = (int8_t)interpolating;
@ -3530,7 +3554,7 @@ static inline void mix16bstereo(PLAYER *p, uint32_t ch, uint32_t samples)
{
samplePosition = v->samplePosition;
while (interpolating && (resampler_get_free_count(resampler[0]) ||
while (interpolating > 0 && (resampler_get_free_count(resampler[0]) ||
(!resampler_get_sample_count(resampler[0]) &&
!resampler_get_sample_count(resampler[1]))))
{
@ -3571,11 +3595,20 @@ static inline void mix16bstereo(PLAYER *p, uint32_t ch, uint32_t samples)
}
else if ((samplePosition < 0) || (samplePosition >= sampleLength))
{
interpolating = 0;
interpolating = -resampler_get_padding_size();
break;
}
}
while (interpolating < 0 && (resampler_get_free_count(resampler[0]) ||
(!resampler_get_sample_count(resampler[0]) &&
!resampler_get_sample_count(resampler[1]))))
{
resampler_write_sample_fixed(resampler[0], 0, 16);
resampler_write_sample_fixed(resampler[1], 0, 16);
++interpolating;
}
v->samplePosition = samplePosition;
v->loopingForward = loopingForward;
v->interpolating = (int8_t)interpolating;

View file

@ -303,6 +303,11 @@ static int resampler_output_delay(resampler *r)
}
}
int resampler_get_padding_size()
{
return SINC_WIDTH - 1;
}
int resampler_ready(void *_r)
{
resampler * r = ( resampler * ) _r;

View file

@ -3,7 +3,6 @@
#define RESAMPLER_DECORATE modplay
// Ugglay
#ifdef RESAMPLER_DECORATE
#define PASTE(a,b) a ## b
#define EVALUATE(a,b) PASTE(a,b)
@ -14,6 +13,7 @@
#define resampler_dup_inplace EVALUATE(RESAMPLER_DECORATE,_resampler_dup_inplace)
#define resampler_set_quality EVALUATE(RESAMPLER_DECORATE,_resampler_set_quality)
#define resampler_get_free_count EVALUATE(RESAMPLER_DECORATE,_resampler_get_free_count)
#define resampler_get_padding_size EVALUATE(RESAMPLER_DECORATE,_resampler_get_padding_size)
#define resampler_write_sample EVALUATE(RESAMPLER_DECORATE,_resampler_write_sample)
#define resampler_write_sample_fixed EVALUATE(RESAMPLER_DECORATE,_resampler_write_sample_fixed)
#define resampler_set_rate EVALUATE(RESAMPLER_DECORATE,_resampler_set_rate)
@ -47,6 +47,7 @@ enum
void resampler_set_quality(void *, int quality);
int resampler_get_free_count(void *);
int resampler_get_padding_size();
void resampler_write_sample(void *, short sample);
void resampler_write_sample_fixed(void *, int sample, unsigned char depth);
void resampler_set_rate( void *, double new_factor );

File diff suppressed because it is too large Load diff