diff options
Diffstat (limited to 'apps/codecs')
-rw-r--r-- | apps/codecs/aiff_enc.c | 43 | ||||
-rw-r--r-- | apps/codecs/mp3_enc.c | 28 | ||||
-rw-r--r-- | apps/codecs/wav_enc.c | 41 |
3 files changed, 89 insertions, 23 deletions
diff --git a/apps/codecs/aiff_enc.c b/apps/codecs/aiff_enc.c index 7e085d5721..78c25b8711 100644 --- a/apps/codecs/aiff_enc.c +++ b/apps/codecs/aiff_enc.c | |||
@@ -72,6 +72,7 @@ struct aiff_header aiff_header = | |||
72 | /* (*) updated when finalizing file */ | 72 | /* (*) updated when finalizing file */ |
73 | 73 | ||
74 | static int num_channels IBSS_ATTR; | 74 | static int num_channels IBSS_ATTR; |
75 | static int rec_mono_mode IBSS_ATTR; | ||
75 | static uint32_t sample_rate; | 76 | static uint32_t sample_rate; |
76 | static uint32_t enc_size; | 77 | static uint32_t enc_size; |
77 | static int32_t err IBSS_ATTR; | 78 | static int32_t err IBSS_ATTR; |
@@ -226,16 +227,37 @@ static inline void sample_to_mono(uint32_t **src, uint32_t **dst) | |||
226 | { | 227 | { |
227 | int32_t lr1, lr2; | 228 | int32_t lr1, lr2; |
228 | 229 | ||
229 | lr1 = *(*src)++; | 230 | switch(rec_mono_mode) |
230 | lr1 = (int16_t)lr1 + (lr1 >> 16) + err; | 231 | { |
231 | err = lr1 & 1; | 232 | case 1: |
232 | lr1 >>= 1; | 233 | /* mono = L */ |
233 | 234 | lr1 = *(*src)++; | |
234 | lr2 = *(*src)++; | 235 | lr1 = lr1 >> 16; |
235 | lr2 = (int16_t)lr2 + (lr2 >> 16) + err; | 236 | lr2 = *(*src)++; |
236 | err = lr2 & 1; | 237 | lr2 = lr2 >> 16; |
237 | lr2 >>= 1; | 238 | break; |
238 | *(*dst)++ = swap_odd_even_le32((lr1 << 16) | (uint16_t)lr2); | 239 | case 2: |
240 | /* mono = R */ | ||
241 | lr1 = *(*src)++; | ||
242 | lr1 = (int16_t)lr1; | ||
243 | lr2 = *(*src)++; | ||
244 | lr2 = (int16_t)lr2; | ||
245 | break; | ||
246 | case 0: | ||
247 | default: | ||
248 | /* mono = (L+R)/2 */ | ||
249 | lr1 = *(*src)++; | ||
250 | lr1 = (int16_t)lr1 + (lr1 >> 16) + err; | ||
251 | err = lr1 & 1; | ||
252 | lr1 >>= 1; | ||
253 | |||
254 | lr2 = *(*src)++; | ||
255 | lr2 = (int16_t)lr2 + (lr2 >> 16) + err; | ||
256 | err = lr2 & 1; | ||
257 | lr2 >>= 1; | ||
258 | break; | ||
259 | } | ||
260 | *(*dst)++ = swap_odd_even_be32((lr1 << 16) | (uint16_t)lr2); | ||
239 | } /* sample_to_mono */ | 261 | } /* sample_to_mono */ |
240 | 262 | ||
241 | STATICIRAM void chunk_to_aiff_format(uint32_t *src, uint32_t *dst) ICODE_ATTR; | 263 | STATICIRAM void chunk_to_aiff_format(uint32_t *src, uint32_t *dst) ICODE_ATTR; |
@@ -316,6 +338,7 @@ static bool init_encoder(void) | |||
316 | 338 | ||
317 | sample_rate = inputs.sample_rate; | 339 | sample_rate = inputs.sample_rate; |
318 | num_channels = inputs.num_channels; | 340 | num_channels = inputs.num_channels; |
341 | rec_mono_mode = inputs.rec_mono_mode; | ||
319 | err = 0; | 342 | err = 0; |
320 | 343 | ||
321 | /* configure the buffer system */ | 344 | /* configure the buffer system */ |
diff --git a/apps/codecs/mp3_enc.c b/apps/codecs/mp3_enc.c index 767a292343..555e981a06 100644 --- a/apps/codecs/mp3_enc.c +++ b/apps/codecs/mp3_enc.c | |||
@@ -90,6 +90,7 @@ typedef struct { | |||
90 | int mean_bits; | 90 | int mean_bits; |
91 | int ResvSize; | 91 | int ResvSize; |
92 | int channels; | 92 | int channels; |
93 | int rec_mono_mode; | ||
93 | int granules; | 94 | int granules; |
94 | long samplerate; | 95 | long samplerate; |
95 | } config_t; | 96 | } config_t; |
@@ -1972,12 +1973,14 @@ static int find_samplerate_index(long freq, int *mp3_type) | |||
1972 | 1973 | ||
1973 | bool init_mp3_encoder_engine(int sample_rate, | 1974 | bool init_mp3_encoder_engine(int sample_rate, |
1974 | int num_channels, | 1975 | int num_channels, |
1976 | int rec_mono_mode, | ||
1975 | struct encoder_config *enc_cfg) | 1977 | struct encoder_config *enc_cfg) |
1976 | { | 1978 | { |
1977 | const bool stereo = num_channels > 1; | 1979 | const bool stereo = num_channels > 1; |
1978 | uint32_t avg_byte_per_frame; | 1980 | uint32_t avg_byte_per_frame; |
1979 | 1981 | ||
1980 | cfg.channels = stereo ? 2 : 1; | 1982 | cfg.channels = stereo ? 2 : 1; |
1983 | cfg.rec_mono_mode = rec_mono_mode; | ||
1981 | cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */ | 1984 | cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */ |
1982 | cfg.mpg.smpl_id = find_samplerate_index(sample_rate, &cfg.mpg.type); | 1985 | cfg.mpg.smpl_id = find_samplerate_index(sample_rate, &cfg.mpg.type); |
1983 | cfg.samplerate = sampr_index[cfg.mpg.type][cfg.mpg.smpl_id]; | 1986 | cfg.samplerate = sampr_index[cfg.mpg.type][cfg.mpg.smpl_id]; |
@@ -2093,9 +2096,26 @@ STATICIRAM void to_mono_mm(void) | |||
2093 | inline void to_mono(uint32_t **samp) | 2096 | inline void to_mono(uint32_t **samp) |
2094 | { | 2097 | { |
2095 | int32_t lr = **samp; | 2098 | int32_t lr = **samp; |
2096 | int32_t m = (int16_t)lr + (lr >> 16) + err; | 2099 | int32_t m; |
2097 | err = m & 1; | 2100 | |
2098 | m >>= 1; | 2101 | switch(cfg.rec_mono_mode) |
2102 | { | ||
2103 | case 1: | ||
2104 | /* mono = L */ | ||
2105 | m = lr >> 16; | ||
2106 | break; | ||
2107 | case 2: | ||
2108 | /* mono = R */ | ||
2109 | m = (int16_t)lr; | ||
2110 | break; | ||
2111 | case 0: | ||
2112 | default: | ||
2113 | /* mono = (L+R)/2 */ | ||
2114 | m = (int16_t)lr + (lr >> 16) + err; | ||
2115 | err = m & 1; | ||
2116 | m >>= 1; | ||
2117 | break; | ||
2118 | } | ||
2099 | *(*samp)++ = (m << 16) | (uint16_t)m; | 2119 | *(*samp)++ = (m << 16) | (uint16_t)m; |
2100 | } /* to_mono */ | 2120 | } /* to_mono */ |
2101 | 2121 | ||
@@ -2517,7 +2537,7 @@ static bool enc_init(void) | |||
2517 | return false; | 2537 | return false; |
2518 | 2538 | ||
2519 | init_mp3_encoder_engine(inputs.sample_rate, inputs.num_channels, | 2539 | init_mp3_encoder_engine(inputs.sample_rate, inputs.num_channels, |
2520 | inputs.config); | 2540 | inputs.rec_mono_mode, inputs.config); |
2521 | 2541 | ||
2522 | err = 0; | 2542 | err = 0; |
2523 | 2543 | ||
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 */ |