diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2007-02-09 18:11:11 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2007-02-09 18:11:11 +0000 |
| commit | d52f2e4bcaac8a70f306d3022a16ea6360108559 (patch) | |
| tree | 134ae84bc188ee44f4e6cfc7706616618cedd67b /apps/codecs/aiff_enc.c | |
| parent | 0abfe9f8ea5cc52a17ae3ac0b4ebe9df0b27ce14 (diff) | |
| download | rockbox-d52f2e4bcaac8a70f306d3022a16ea6360108559.zip rockbox-d52f2e4bcaac8a70f306d3022a16ea6360108559.tar.gz rockbox-d52f2e4bcaac8a70f306d3022a16ea6360108559.tar.bz2 rockbox-d52f2e4bcaac8a70f306d3022a16ea6360108559.tar.xz | |
Encoders: Add a little dithering with the fractional bit for mono mixdowns so faster shifts can be used again instead of division without introducing their own DC offset into the mixed channels.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12246 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/aiff_enc.c')
| -rw-r--r-- | apps/codecs/aiff_enc.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/apps/codecs/aiff_enc.c b/apps/codecs/aiff_enc.c index f1569d2..5f99308 100644 --- a/apps/codecs/aiff_enc.c +++ b/apps/codecs/aiff_enc.c @@ -69,9 +69,10 @@ struct aiff_header aiff_header = /* (*) updated when finalizing file */ -static int num_channels; -uint32_t sample_rate; -uint32_t enc_size; +static int num_channels IBSS_ATTR; +static uint32_t sample_rate; +static uint32_t enc_size; +static int32_t err IBSS_ATTR; /* convert unsigned 32 bit value to 80-bit floating point number */ static void uint32_h_to_ieee754_extended_be(uint8_t f[10], uint32_t l) ICODE_ATTR; @@ -240,10 +241,14 @@ static void chunk_to_aiff_format(uint32_t *src, uint32_t *dst) int32_t lr1, lr2; lr1 = *(*src)++; - lr1 = ((int16_t)lr1 + (lr1 >> 16)) / 2; + lr1 = (int16_t)lr1 + (lr1 >> 16) + err; + err = lr1 & 1; + lr1 >>= 1; lr2 = *(*src)++; - lr2 = ((int16_t)lr2 + (lr2 >> 16)) / 2; + lr2 = (int16_t)lr2 + (lr2 >> 16) + err; + err = lr2 & 1; + lr2 >>= 1; *(*dst)++ = swap_odd_even_le32((lr1 << 16) | (uint16_t)lr2); } /* to_mono */ @@ -311,6 +316,7 @@ static bool init_encoder(void) sample_rate = inputs.sample_rate; num_channels = inputs.num_channels; + err = 0; /* configure the buffer system */ params.afmt = AFMT_AIFF; |