diff options
Diffstat (limited to 'apps/codecs/wav_enc.c')
-rw-r--r-- | apps/codecs/wav_enc.c | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/apps/codecs/wav_enc.c b/apps/codecs/wav_enc.c index a59eff7581..3627808271 100644 --- a/apps/codecs/wav_enc.c +++ b/apps/codecs/wav_enc.c | |||
@@ -60,6 +60,7 @@ struct riff_header | |||
60 | #define PCM_CHUNK_SIZE (PCM_SAMP_PER_CHUNK*4) | 60 | #define PCM_CHUNK_SIZE (PCM_SAMP_PER_CHUNK*4) |
61 | 61 | ||
62 | static int num_channels IBSS_ATTR; | 62 | static int num_channels IBSS_ATTR; |
63 | static int rec_mono_mode IBSS_ATTR; | ||
63 | static uint32_t sample_rate; | 64 | static uint32_t sample_rate; |
64 | static uint32_t enc_size; | 65 | static uint32_t enc_size; |
65 | static int32_t err IBSS_ATTR; | 66 | static int32_t err IBSS_ATTR; |
@@ -215,15 +216,36 @@ static inline void sample_to_mono(uint32_t **src, uint32_t **dst) | |||
215 | { | 216 | { |
216 | int32_t lr1, lr2; | 217 | int32_t lr1, lr2; |
217 | 218 | ||
218 | lr1 = *(*src)++; | 219 | switch(rec_mono_mode) |
219 | lr1 = (int16_t)lr1 + (lr1 >> 16) + err; | 220 | { |
220 | err = lr1 & 1; | 221 | case 1: |
221 | lr1 >>= 1; | 222 | /* mono = L */ |
222 | 223 | lr1 = *(*src)++; | |
223 | lr2 = *(*src)++; | 224 | lr1 = lr1 >> 16; |
224 | lr2 = (int16_t)lr2 + (lr2 >> 16) + err; | 225 | lr2 = *(*src)++; |
225 | err = lr2 & 1; | 226 | lr2 = lr2 >> 16; |
226 | lr2 >>= 1; | 227 | break; |
228 | case 2: | ||
229 | /* mono = R */ | ||
230 | lr1 = *(*src)++; | ||
231 | lr1 = (uint16_t)lr1; | ||
232 | lr2 = *(*src)++; | ||
233 | lr2 = (uint16_t)lr2; | ||
234 | break; | ||
235 | case 0: | ||
236 | default: | ||
237 | /* mono = (L+R)/2 */ | ||
238 | lr1 = *(*src)++; | ||
239 | lr1 = (int16_t)lr1 + (lr1 >> 16) + err; | ||
240 | err = lr1 & 1; | ||
241 | lr1 >>= 1; | ||
242 | |||
243 | lr2 = *(*src)++; | ||
244 | lr2 = (int16_t)lr2 + (lr2 >> 16) + err; | ||
245 | err = lr2 & 1; | ||
246 | lr2 >>= 1; | ||
247 | break; | ||
248 | } | ||
227 | *(*dst)++ = swap_odd_even_be32((lr1 << 16) | (uint16_t)lr2); | 249 | *(*dst)++ = swap_odd_even_be32((lr1 << 16) | (uint16_t)lr2); |
228 | } /* sample_to_mono */ | 250 | } /* sample_to_mono */ |
229 | 251 | ||
@@ -305,6 +327,7 @@ static bool init_encoder(void) | |||
305 | 327 | ||
306 | sample_rate = inputs.sample_rate; | 328 | sample_rate = inputs.sample_rate; |
307 | num_channels = inputs.num_channels; | 329 | num_channels = inputs.num_channels; |
330 | rec_mono_mode = inputs.rec_mono_mode; | ||
308 | err = 0; | 331 | err = 0; |
309 | 332 | ||
310 | /* configure the buffer system */ | 333 | /* configure the buffer system */ |