pcm_volume: implement float samples

This commit is contained in:
Max Kellermann 2011-10-20 02:33:51 +02:00
parent 545685bc32
commit bfef0fbff3
2 changed files with 19 additions and 2 deletions

View File

@ -132,6 +132,16 @@ pcm_volume_change_32(int32_t *buffer, const int32_t *end, int volume)
}
}
static void
pcm_volume_change_float(float *buffer, const float *end, float volume)
{
while (buffer < end) {
float sample = *buffer;
sample *= volume;
*buffer++ = sample;
}
}
bool
pcm_volume(void *buffer, size_t length,
enum sample_format format,
@ -169,8 +179,9 @@ pcm_volume(void *buffer, size_t length,
return true;
case SAMPLE_FORMAT_FLOAT:
/* XXX */
return false;
pcm_volume_change_float(buffer, end,
pcm_volume_to_float(volume));
return true;
}
/* unreachable */

View File

@ -43,6 +43,12 @@ pcm_float_to_volume(float volume)
return volume * PCM_VOLUME_1 + 0.5;
}
static inline float
pcm_volume_to_float(int volume)
{
return (float)volume / (float)PCM_VOLUME_1;
}
/**
* Returns the next volume dithering number, between -511 and +511.
* This number is taken from a global PRNG, see pcm_prng().