summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/mp3_encoder.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c
index bdfb4d8cdd..f36a25241a 100644
--- a/apps/plugins/mp3_encoder.c
+++ b/apps/plugins/mp3_encoder.c
@@ -893,12 +893,25 @@ int wave_open(void)
return 0;
}
-int read_samples(uint32_t *buffer, int num_samples)
+int read_samples(uint16_t *buffer, int num_samples)
{
- int s, samples = rb->read(wavfile, buffer, 4 * num_samples) / 4;
+ uint16_t tmpbuf[SAMP_PER_FRAME*2]; /* SAMP_PER_FRAME*MAX_CHANNELS */
+ int byte_per_sample = cfg.channels * 2; /* requires bits_per_sample==16 */
+ int s, samples = rb->read(wavfile, tmpbuf, byte_per_sample * num_samples) / byte_per_sample;
/* Pad last sample with zeros */
- for(s=samples; s<num_samples; s++)
- buffer[s] = 0;
+ memset(tmpbuf + samples*cfg.channels, 0, (num_samples-samples)*cfg.channels);
+
+ if (cfg.channels==1)
+ {
+ /* interleave the mono samples to stereo as required by encoder */
+ for(s=0; s<num_samples; s++)
+ buffer[2*s] = tmpbuf[s];
+ }
+ else
+ {
+ /* interleaving is correct for stereo */
+ memcpy(buffer, tmpbuf, sizeof(tmpbuf));
+ }
return samples;
}
@@ -2163,7 +2176,7 @@ void compress(void)
memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
/* read new samples to iram for further processing */
- if(read_samples((uint32_t*)(mfbuf + 2*512), SAMP_PER_FRAME) == 0)
+ if(read_samples((mfbuf + 2*512), SAMP_PER_FRAME) == 0)
break;
/* swap bytes if neccessary */
@@ -2182,10 +2195,6 @@ void compress(void)
mfbuf[i/2+513] = (short)(((int)mfbuf[i+1] + mfbuf[i+3]) >> 1);
}
- if(cfg.channels == 1) /* mix left and right channels to mono */
- for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=2)
- mfbuf[i] = mfbuf[i+1] = (short)(((int)mfbuf[i] + mfbuf[i+1]) >> 1);
-
cfg.ResvSize = 0;
gr_cnt = cfg.granules * cfg.channels;
CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
@@ -2560,7 +2569,7 @@ enum plugin_status plugin_start(const void* parameter)
ret = wave_open();
if(ret == 0)
{
- init_mp3_encoder_engine(true, brate[srat], cfg.samplerate);
+ init_mp3_encoder_engine((cfg.channels==2), brate[srat], cfg.samplerate);
get_mp3_filename(wav_filename);
mp3file = rb->open(mp3_name , O_WRONLY|O_CREAT|O_TRUNC, 0666);
frames = 0;