summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
Diffstat (limited to 'src/class')
-rw-r--r--src/class/audio/audio_device.c194
1 files changed, 89 insertions, 105 deletions
diff --git a/src/class/audio/audio_device.c b/src/class/audio/audio_device.c
index 0e4220f4f..46fd6dfa9 100644
--- a/src/class/audio/audio_device.c
+++ b/src/class/audio/audio_device.c
@@ -631,64 +631,55 @@ static bool audiod_rx_done_cb(uint8_t rhport, audiod_function_t* audio, uint16_t
// Decoding according to 2.3.1.5 Audio Streams
// Helper function
-static inline uint8_t * audiod_interleaved_copy_bytes_fast_decode(uint16_t const nBytesToCopy, uint8_t * dst, uint8_t * dst_end, uint8_t * src, uint8_t const n_ff_used)
+static inline void * audiod_interleaved_copy_bytes_fast_decode(uint16_t const nBytesToCopy, void * dst, const void * dst_end, void * src, uint8_t const n_ff_used)
{
-
// Due to one FIFO contains 2 channels, data always aligned to (nBytesToCopy * 2)
+ uint16_t * dst16 = dst;
+ uint16_t * src16 = src;
+ const uint16_t * dst_end16 = dst_end;
+ uint32_t * dst32 = dst;
+ uint32_t * src32 = src;
+ const uint32_t * dst_end32 = dst_end;
- switch (nBytesToCopy)
+ if (nBytesToCopy == 1)
{
- case 1:
- while((uint8_t *)dst < dst_end)
- {
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- src += 2 * (n_ff_used - 1);
- }
- break;
-
- case 2:
- while((uint8_t *)dst < dst_end)
- {
- *(uint32_t*)dst = *(uint32_t*)src;
- src += 4;
- dst += 4;
- src += 4 * (n_ff_used - 1);
- }
- break;
-
- case 3:
- while((uint8_t *)dst < dst_end)
- {
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- src += 6 * (n_ff_used - 1);
- }
- break;
-
- case 4:
- while((uint8_t *)dst < dst_end)
- {
- *(uint32_t*)dst++ = *(uint32_t*)src++;
- src += 4;
- dst += 4;
- *(uint32_t*)dst++ = *(uint32_t*)src++;
- src += 4;
- dst += 4;
- src += 8 * (n_ff_used - 1);
- }
- break;
+ while(dst16 < dst_end16)
+ {
+ *dst16++ = *src16++;
+ src16 += n_ff_used - 1;
+ }
+ return src16;
+ }
+ else if (nBytesToCopy == 2)
+ {
+ while(dst32 < dst_end32)
+ {
+ *dst32++ = *src32++;
+ src32 += n_ff_used - 1;
+ }
+ return src32;
+ }
+ else if (nBytesToCopy == 3)
+ {
+ while(dst16 < dst_end16)
+ {
+ *dst16++ = *src16++;
+ *dst16++ = *src16++;
+ *dst16++ = *src16++;
+ src16 += 3 * (n_ff_used - 1);
+ }
+ return src16;
+ }
+ else // nBytesToCopy == 4
+ {
+ while(dst32 < dst_end32)
+ {
+ *dst32++ = *src32++;
+ *dst32++ = *src32++;
+ src32 += 2 * (n_ff_used - 1);
+ }
+ return src32;
}
-
- return src;
}
static bool audiod_decode_type_I_pcm(uint8_t rhport, audiod_function_t* audio, uint16_t n_bytes_received)
@@ -935,62 +926,55 @@ range [-1, +1)
* */
// Helper function
-static inline uint8_t * audiod_interleaved_copy_bytes_fast_encode(uint16_t const nBytesToCopy, uint8_t * src, uint8_t * src_end, uint8_t * dst, uint8_t const n_ff_used)
+static inline void * audiod_interleaved_copy_bytes_fast_encode(uint16_t const nBytesToCopy, void * src, const void * src_end, void * dst, uint8_t const n_ff_used)
{
// Due to one FIFO contains 2 channels, data always aligned to (nBytesToCopy * 2)
- switch (nBytesToCopy)
- {
- case 1:
- while(src < src_end)
- {
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- dst += 2 * (n_ff_used - 1);
- }
- break;
-
- case 2:
- while(src < src_end)
- {
- *(uint32_t*)dst = *(uint32_t*)src;
- src += 4;
- dst += 4;
- dst += 4 * (n_ff_used - 1);
- }
- break;
+ uint16_t * dst16 = dst;
+ uint16_t * src16 = src;
+ const uint16_t * src_end16 = src_end;
+ uint32_t * dst32 = dst;
+ uint32_t * src32 = src;
+ const uint32_t * src_end32 = src_end;
- case 3:
- while(src < src_end)
- {
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- *(uint16_t*)dst = *(uint16_t*)src;
- src += 2;
- dst += 2;
- dst += 6 * (n_ff_used - 1);
- }
- break;
-
- case 4:
- while(src < src_end)
- {
- *(uint32_t*)dst++ = *(uint32_t*)src++;
- src += 4;
- dst += 4;
- *(uint32_t*)dst++ = *(uint32_t*)src++;
- src += 4;
- dst += 4;
- dst += 8 * (n_ff_used - 1);
- }
- break;
+ if (nBytesToCopy == 1)
+ {
+ while(src16 < src_end16)
+ {
+ *dst16++ = *src16++;
+ dst16 += n_ff_used - 1;
+ }
+ return dst16;
+ }
+ else if (nBytesToCopy == 2)
+ {
+ while(src32 < src_end32)
+ {
+ *dst32++ = *src32++;
+ dst32 += n_ff_used - 1;
+ }
+ return dst32;
+ }
+ else if (nBytesToCopy == 3)
+ {
+ while(src16 < src_end16)
+ {
+ *dst16++ = *src16++;
+ *dst16++ = *src16++;
+ *dst16++ = *src16++;
+ dst16 += 3 * (n_ff_used - 1);
+ }
+ return dst16;
+ }
+ else // nBytesToCopy == 4
+ {
+ while(src32 < src_end32)
+ {
+ *dst32++ = *src32++;
+ *dst32++ = *src32++;
+ dst32 += 2 * (n_ff_used - 1);
+ }
+ return dst32;
}
-
- return dst;
}
static uint16_t audiod_encode_type_I_pcm(uint8_t rhport, audiod_function_t* audio)