aboutsummaryrefslogtreecommitdiffstats
path: root/src/output
diff options
context:
space:
mode:
Diffstat (limited to 'src/output')
-rw-r--r--src/output/shout_ogg.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/output/shout_ogg.c b/src/output/shout_ogg.c
index ebf84c0bf..b7c7b6706 100644
--- a/src/output/shout_ogg.c
+++ b/src/output/shout_ogg.c
@@ -238,28 +238,29 @@ static int shout_ogg_encoder_send_metadata(struct shout_data *sd,
return 0;
}
+static void
+pcm16_to_ogg_buffer(float **dest, const int16_t *src,
+ unsigned num_samples, unsigned num_channels)
+{
+ for (unsigned i = 0; i < num_samples; i++)
+ for (unsigned j = 0; j < num_channels; j++)
+ dest[j][i] = *src++ / 32768.0;
+}
+
static int shout_ogg_encoder_encode(struct shout_data *sd,
const char *chunk, size_t size)
{
struct shout_buffer *buf = &sd->buf;
- unsigned int i;
- int j;
- float **vorbbuf;
unsigned int samples;
- int bytes = audio_format_sample_size(&sd->audio_format);
struct ogg_vorbis_data *od = (struct ogg_vorbis_data *)sd->encoder_data;
- samples = size / (bytes * sd->audio_format.channels);
- vorbbuf = vorbis_analysis_buffer(&od->vd, samples);
+ samples = size / audio_format_frame_size(&sd->audio_format);
/* this is for only 16-bit audio */
- for (i = 0; i < samples; i++) {
- for (j = 0; j < sd->audio_format.channels; j++) {
- vorbbuf[j][i] = (*((const int16_t *) chunk)) / 32768.0;
- chunk += bytes;
- }
- }
+ pcm16_to_ogg_buffer(vorbis_analysis_buffer(&od->vd, samples),
+ (const int16_t *)chunk,
+ samples, sd->audio_format.channels);
vorbis_analysis_wrote(&od->vd, samples);