aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2012-10-02 08:19:45 +0200
committerMax Kellermann <max@duempel.org>2012-10-02 08:39:39 +0200
commit9e3f843291876b2cd62196c22be1130c0031bfc0 (patch)
tree323a87b073fd7f8c52d823f6c451a4c8ab070496 /src
parente166ddf46f16ca115372bc05a880e47deafc23c1 (diff)
downloadmpd-9e3f843291876b2cd62196c22be1130c0031bfc0.tar.gz
mpd-9e3f843291876b2cd62196c22be1130c0031bfc0.tar.xz
mpd-9e3f843291876b2cd62196c22be1130c0031bfc0.zip
encoder/vorbis: accept floating point input samples
Improves quality by not squeezing 32 bit samples down to 16 bit, and then back to 32 bit floating point. Reduces CPU usage by skipping a conversion step.
Diffstat (limited to 'src')
-rw-r--r--src/encoder/VorbisEncoderPlugin.cxx17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/encoder/VorbisEncoderPlugin.cxx b/src/encoder/VorbisEncoderPlugin.cxx
index 226a59abf..ff1c6b8df 100644
--- a/src/encoder/VorbisEncoderPlugin.cxx
+++ b/src/encoder/VorbisEncoderPlugin.cxx
@@ -212,7 +212,7 @@ vorbis_encoder_open(struct encoder *_encoder,
{
struct vorbis_encoder *encoder = (struct vorbis_encoder *)_encoder;
- audio_format->format = SAMPLE_FORMAT_S16;
+ audio_format->format = SAMPLE_FORMAT_FLOAT;
encoder->audio_format = *audio_format;
@@ -327,12 +327,12 @@ vorbis_encoder_tag(struct encoder *_encoder, const struct tag *tag,
}
static void
-pcm16_to_vorbis_buffer(float **dest, const int16_t *src,
- unsigned num_frames, unsigned num_channels)
+interleaved_to_vorbis_buffer(float **dest, const float *src,
+ unsigned num_frames, unsigned num_channels)
{
for (unsigned i = 0; i < num_frames; i++)
for (unsigned j = 0; j < num_channels; j++)
- dest[j][i] = *src++ / 32768.0;
+ dest[j][i] = *src++;
}
static bool
@@ -347,10 +347,11 @@ vorbis_encoder_write(struct encoder *_encoder,
/* this is for only 16-bit audio */
- pcm16_to_vorbis_buffer(vorbis_analysis_buffer(&encoder->vd,
- num_frames),
- (const int16_t *)data,
- num_frames, encoder->audio_format.channels);
+ interleaved_to_vorbis_buffer(vorbis_analysis_buffer(&encoder->vd,
+ num_frames),
+ (const float *)data,
+ num_frames,
+ encoder->audio_format.channels);
vorbis_analysis_wrote(&encoder->vd, num_frames);
vorbis_encoder_blockout(encoder);