From 5b0c6ba74ab889e7e85e99ed73947a8ae1e9b85a Mon Sep 17 00:00:00 2001 From: Abramo Bagnara Date: Mon, 27 Dec 1999 22:06:24 +0000 Subject: [PATCH] Added 24 bit sample support --- src/pcm/plugin/linear.c | 137 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 130 insertions(+), 7 deletions(-) diff --git a/src/pcm/plugin/linear.c b/src/pcm/plugin/linear.c index 7fbdf6a0..12ef0766 100644 --- a/src/pcm/plugin/linear.c +++ b/src/pcm/plugin/linear.c @@ -65,6 +65,11 @@ CONV_FUNC(8_16_end, char, short, (unsigned short)src) CONV_FUNC(8_16_sign, char, short, (unsigned short)(src ^ 0x80) << 8) CONV_FUNC(8_16_sign_end, char, short, (unsigned short)src ^ 0x80) +CONV_FUNC(8_24, char, long, (unsigned long)src << 16) +CONV_FUNC(8_24_end, char, long, (unsigned long)src << 8) +CONV_FUNC(8_24_sign, char, long, (unsigned long)(src ^ 0x80) << 16) +CONV_FUNC(8_24_sign_end, char, long, (unsigned long)(src ^ 0x80) << 8) + CONV_FUNC(8_32, char, long, (unsigned long)src << 24) CONV_FUNC(8_32_end, char, long, (unsigned long)src) CONV_FUNC(8_32_sign, char, long, (unsigned long)(src ^ 0x80) << 24) @@ -73,7 +78,7 @@ CONV_FUNC(8_32_sign_end, char, long, (unsigned long)src ^ 0x80) CONV_FUNC(16_8, short, char, src >> 8) CONV_FUNC(16_end_8, short, char, src) CONV_FUNC(16_8_sign, short, char, (src >> 8) ^ 0x80) -CONV_FUNC(16_end_8_sign, short, char, src ^ 0x80;) +CONV_FUNC(16_end_8_sign, short, char, src ^ 0x80) CONV_FUNC(16_sign, short, short, src ^ 0x8000) CONV_FUNC(16_end, short, short, bswap_16(src)) @@ -81,6 +86,15 @@ CONV_FUNC(16_end_sign, short, short, bswap_16(src) ^ 0x8000) CONV_FUNC(16_sign_end, short, short, bswap_16(src ^ 0x8000)) CONV_FUNC(16_end_sign_end, short, short, src ^ 0x80) +CONV_FUNC(16_24, short, long, (unsigned long)src << 8) +CONV_FUNC(16_24_sign, short, long, (unsigned long)(src ^ 0x8000) << 8) +CONV_FUNC(16_24_end, short, long, (unsigned long)bswap_16(src) << 8) +CONV_FUNC(16_24_sign_end, short, long, (unsigned long)bswap_16(src ^ 0x8000) << 8) +CONV_FUNC(16_end_24, short, long, (unsigned long)bswap_16(src) << 8) +CONV_FUNC(16_end_24_sign, short, long, (unsigned long)(bswap_16(src) ^ 0x8000) << 8) +CONV_FUNC(16_end_24_end, short, long, (unsigned long)src << 8) +CONV_FUNC(16_end_24_sign_end, short, long, ((unsigned long)src ^ 0x80) << 8) + CONV_FUNC(16_32, short, long, (unsigned long)src << 16) CONV_FUNC(16_32_sign, short, long, (unsigned long)(src ^ 0x8000) << 16) CONV_FUNC(16_32_end, short, long, (unsigned long)bswap_16(src)) @@ -90,10 +104,39 @@ CONV_FUNC(16_end_32_sign, short, long, (unsigned long)(bswap_16(src) ^ 0x8000) < CONV_FUNC(16_end_32_end, short, long, (unsigned long)src) CONV_FUNC(16_end_32_sign_end, short, long, (unsigned long)src ^ 0x80) +CONV_FUNC(24_8, long, char, src >> 16) +CONV_FUNC(24_end_8, long, char, src >> 8) +CONV_FUNC(24_8_sign, long, char, (src >> 16) ^ 0x80) +CONV_FUNC(24_end_8_sign, long, char, (src >> 8) ^ 0x80) + +CONV_FUNC(24_16, long, short, src >> 8) +CONV_FUNC(24_16_sign, long, short, (src >> 8) ^ 0x8000) +CONV_FUNC(24_16_end, long, short, bswap_32(src >> 8)) +CONV_FUNC(24_16_sign_end, long, short, bswap_32((src >> 8) ^ 0x8000)) +CONV_FUNC(24_end_16, long, short, bswap_32(src) >> 8) +CONV_FUNC(24_end_16_sign, long, short, (bswap_32(src) >> 8) ^ 0x8000) +CONV_FUNC(24_end_16_end, long, short, src >> 8) +CONV_FUNC(24_end_16_sign_end, long, short, (src >> 8) ^ 0x80) + +CONV_FUNC(24_sign, long, long, src ^ 0x800000) +CONV_FUNC(24_end, long, long, bswap_32(src)) +CONV_FUNC(24_end_sign, long, long, bswap_32(src) ^ 0x800000) +CONV_FUNC(24_sign_end, long, long, bswap_32(src) ^ 0x80) +CONV_FUNC(24_end_sign_end, long, long, src ^ 0x80) + +CONV_FUNC(24_32, long, long, src << 8) +CONV_FUNC(24_32_sign, long, long, (src << 8) ^ 0x80000000) +CONV_FUNC(24_32_end, long, long, bswap_32(src << 8)) +CONV_FUNC(24_32_sign_end, long, long, bswap_32((src << 8) ^ 0x80000000)) +CONV_FUNC(24_end_32, long, long, bswap_32(src) << 8) +CONV_FUNC(24_end_32_sign, long, long, (bswap_32(src) << 8) ^ 0x80000000) +CONV_FUNC(24_end_32_end, long, long, src >> 8) +CONV_FUNC(24_end_32_sign_end, long, long, (src >> 8) ^ 0x80) + CONV_FUNC(32_8, long, char, src >> 24) CONV_FUNC(32_end_8, long, char, src) CONV_FUNC(32_8_sign, long, char, (src >> 24) ^ 0x80) -CONV_FUNC(32_end_8_sign, long, char, src ^ 0x80;) +CONV_FUNC(32_end_8_sign, long, char, src ^ 0x80) CONV_FUNC(32_16, long, short, src >> 16) CONV_FUNC(32_16_sign, long, short, (src >> 16) ^ 0x8000) @@ -104,6 +147,15 @@ CONV_FUNC(32_end_16_sign, long, short, bswap_16(src) ^ 0x8000) CONV_FUNC(32_end_16_end, long, short, src) CONV_FUNC(32_end_16_sign_end, long, short, src ^ 0x80) +CONV_FUNC(32_24, long, long, src >> 8) +CONV_FUNC(32_24_sign, long, long, (src >> 8) ^ 0x800000) +CONV_FUNC(32_24_end, long, long, bswap_32(src >> 8)) +CONV_FUNC(32_24_sign_end, long, long, bswap_32((src >> 8) ^ 0x800000)) +CONV_FUNC(32_end_24, long, long, bswap_32(src) >> 8) +CONV_FUNC(32_end_24_sign, long, long, (bswap_32(src) >> 8) ^ 0x800000) +CONV_FUNC(32_end_24_end, long, long, src << 8) +CONV_FUNC(32_end_24_sign_end, long, long, (src << 8) ^ 0x80) + CONV_FUNC(32_sign, long, long, src ^ 0x80000000) CONV_FUNC(32_end, long, long, bswap_32(src)) CONV_FUNC(32_end_sign, long, long, bswap_32(src) ^ 0x80000000) @@ -111,7 +163,7 @@ CONV_FUNC(32_sign_end, long, long, bswap_32(src) ^ 0x80) CONV_FUNC(32_end_sign_end, long, long, src ^ 0x80) /* src_wid dst_wid src_endswap, dst_endswap, sign_swap */ -conv_f convert_functions[3][3][2][2][2] = { +conv_f convert_functions[4][4][2][2][2] = { NULL, /* 8->8: Nothing to do */ conv_8_sign, /* 8->8 sign: conv_8_sign */ NULL, /* 8->8 dst_end: Nothing to do */ @@ -128,6 +180,14 @@ conv_f convert_functions[3][3][2][2][2] = { conv_8_16_sign, /* 8->16 src_end sign: conv_8_16_sign */ conv_8_16_end, /* 8->16 src_end dst_end: conv_8_16_end */ conv_8_16_sign_end, /* 8->16 src_end dst_end sign: conv_8_16_sign_end */ + conv_8_24, /* 8->24: conv_8_24 */ + conv_8_24_sign, /* 8->24 sign: conv_8_24_sign */ + conv_8_24_end, /* 8->24 dst_end: conv_8_24_end */ + conv_8_24_sign_end, /* 8->24 dst_end sign: conv_8_24_sign_end */ + conv_8_24, /* 8->24 src_end: conv_8_24 */ + conv_8_24_sign, /* 8->24 src_end sign: conv_8_24_sign */ + conv_8_24_end, /* 8->24 src_end dst_end: conv_8_24_end */ + conv_8_24_sign_end, /* 8->24 src_end dst_end sign: conv_8_24_sign_end */ conv_8_32, /* 8->32: conv_8_32 */ conv_8_32_sign, /* 8->32 sign: conv_8_32_sign */ conv_8_32_end, /* 8->32 dst_end: conv_8_32_end */ @@ -160,6 +220,46 @@ conv_f convert_functions[3][3][2][2][2] = { conv_16_end_32_sign, /* 16->32 src_end sign: conv_16_end_32_sign */ conv_16_end_32_end, /* 16->32 src_end dst_end: conv_16_end_32_end */ conv_16_end_32_sign_end,/* 16->32 src_end dst_end sign: conv_16_end_32_sign_end */ + conv_16_24, /* 16->24: conv_16_24 */ + conv_16_24_sign, /* 16->24 sign: conv_16_24_sign */ + conv_16_24_end, /* 16->24 dst_end: conv_16_24_end */ + conv_16_24_sign_end, /* 16->24 dst_end sign: conv_16_24_sign_end */ + conv_16_end_24, /* 16->24 src_end: conv_16_end_24 */ + conv_16_end_24_sign, /* 16->24 src_end sign: conv_16_end_24_sign */ + conv_16_end_24_end, /* 16->24 src_end dst_end: conv_16_end_24_end */ + conv_16_end_24_sign_end,/* 16->24 src_end dst_end sign: conv_16_end_24_sign_end */ + conv_24_8, /* 24->8: conv_24_8 */ + conv_24_8_sign, /* 24->8 sign: conv_24_8_sign */ + conv_24_8, /* 24->8 dst_end: conv_24_8 */ + conv_24_8_sign, /* 24->8 dst_end sign: conv_24_8_sign */ + conv_24_end_8, /* 24->8 src_end: conv_24_end_8 */ + conv_24_end_8_sign, /* 24->8 src_end sign: conv_24_end_8_sign */ + conv_24_end_8, /* 24->8 src_end dst_end: conv_24_end_8 */ + conv_24_end_8_sign, /* 24->8 src_end dst_end sign: conv_24_end_8_sign */ + conv_24_16, /* 24->16: conv_24_16 */ + conv_24_16_sign, /* 24->16 sign: conv_24_16_sign */ + conv_24_16_end, /* 24->16 dst_end: conv_24_16_end */ + conv_24_16_sign_end, /* 24->16 dst_end sign: conv_24_16_sign_end */ + conv_24_end_16, /* 24->16 src_end: conv_24_end_16 */ + conv_24_end_16_sign, /* 24->16 src_end sign: conv_24_end_16_sign */ + conv_24_end_16_end, /* 24->16 src_end dst_end: conv_24_end_16_end */ + conv_24_end_16_sign_end,/* 24->16 src_end dst_end sign: conv_24_end_16_sign_end */ + NULL, /* 24->24: Nothing to do */ + conv_24_sign, /* 24->24 sign: conv_24_sign */ + conv_24_end, /* 24->24 dst_end: conv_24_end */ + conv_24_sign_end, /* 24->24 dst_end sign: conv_24_sign_end */ + conv_24_end, /* 24->24 src_end: conv_24_end */ + conv_24_end_sign, /* 24->24 src_end sign: conv_24_end_sign */ + NULL, /* 24->24 src_end dst_end: Nothing to do */ + conv_24_end_sign_end, /* 24->24 src_end dst_end sign: conv_24_end_sign_end */ + conv_24_32, /* 24->32: conv_24_32 */ + conv_24_32_sign, /* 24->32 sign: conv_24_32_sign */ + conv_24_32_end, /* 24->32 dst_end: conv_24_32_end */ + conv_24_32_sign_end, /* 24->32 dst_end sign: conv_24_32_sign_end */ + conv_24_end_32, /* 24->32 src_end: conv_24_end_32 */ + conv_24_end_32_sign, /* 24->32 src_end sign: conv_24_end_32_sign */ + conv_24_end_32_end, /* 24->32 src_end dst_end: conv_24_end_32_end */ + conv_24_end_32_sign_end,/* 24->32 src_end dst_end sign: conv_24_end_32_sign_end */ conv_32_8, /* 32->8: conv_32_8 */ conv_32_8_sign, /* 32->8 sign: conv_32_8_sign */ conv_32_8, /* 32->8 dst_end: conv_32_8 */ @@ -176,6 +276,14 @@ conv_f convert_functions[3][3][2][2][2] = { conv_32_end_16_sign, /* 32->16 src_end sign: conv_32_end_16_sign */ conv_32_end_16_end, /* 32->16 src_end dst_end: conv_32_end_16_end */ conv_32_end_16_sign_end,/* 32->16 src_end dst_end sign: conv_32_end_16_sign_end */ + conv_32_24, /* 32->24: conv_32_24 */ + conv_32_24_sign, /* 32->24 sign: conv_32_24_sign */ + conv_32_24_end, /* 32->24 dst_end: conv_32_24_end */ + conv_32_24_sign_end, /* 32->24 dst_end sign: conv_32_24_sign_end */ + conv_32_end_24, /* 32->24 src_end: conv_32_end_24 */ + conv_32_end_24_sign, /* 32->24 src_end sign: conv_32_end_24_sign */ + conv_32_end_24_end, /* 32->24 src_end dst_end: conv_32_end_24_end */ + conv_32_end_24_sign_end,/* 32->24 src_end dst_end sign: conv_32_end_24_sign_end */ NULL, /* 32->32: Nothing to do */ conv_32_sign, /* 32->32 sign: conv_32_sign */ conv_32_end, /* 32->32 dst_end: conv_32_end */ @@ -241,6 +349,7 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, snd_pcm_plugin_t *plugin; conv_f func; int src_endian, dst_endian, sign, src_width, dst_width; + int src_sample_size, dst_sample_size; if (!r_plugin) return -EINVAL; @@ -274,12 +383,19 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, switch (src_width) { case 8: src_width = 0; + src_sample_size = 1; break; case 16: src_width = 1; + src_sample_size = 2; break; - case 32: + case 24: src_width = 2; + src_sample_size = 4; + break; + case 32: + src_width = 3; + src_sample_size = 4; break; default: return -EINVAL; @@ -287,12 +403,19 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, switch (dst_width) { case 8: dst_width = 0; + dst_sample_size = 1; break; case 16: dst_width = 1; + dst_sample_size = 2; break; - case 32: + case 24: dst_width = 2; + dst_sample_size = 4; + break; + case 32: + dst_width = 3; + dst_sample_size = 4; break; default: return -EINVAL; @@ -314,8 +437,8 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, return -ENOMEM; data = (struct linear_private_data *)snd_pcm_plugin_extra_data(plugin); data->func = func; - data->src_sample_size = 1 << src_width; - data->dst_sample_size = 1 << dst_width; + data->src_sample_size = src_sample_size; + data->dst_sample_size = dst_sample_size; plugin->transfer = linear_transfer; plugin->src_size = linear_src_size; -- 2.47.1