From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: usb-audio Date: Thu, 30 Oct 2003 20:46:42 +0100 Sender: alsa-devel-admin@lists.sourceforge.net Message-ID: References: <20031027180300.GA5016@Zeryn> <200310292326.08018.bergtroll@gmx.li> <200310301342.14872.bergtroll@gmx.li> Mime-Version: 1.0 (generated by SEMI 1.14.5 - "Awara-Onsen") Content-Type: multipart/mixed; boundary="Multipart_Thu_Oct_30_20:46:42_2003-1" Return-path: In-Reply-To: <200310301342.14872.bergtroll@gmx.li> Errors-To: alsa-devel-admin@lists.sourceforge.net List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: To: Niklas Werner Cc: alsa-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org --Multipart_Thu_Oct_30_20:46:42_2003-1 Content-Type: text/plain; charset=US-ASCII At Thu, 30 Oct 2003 13:42:14 +0100, Niklas Werner wrote: > > Am Donnerstag, 30. Oktober 2003 13:17 schrieb Takashi Iwai: > > At Wed, 29 Oct 2003 23:26:07 +0100, > > > > Niklas Werner wrote: > > > Am Mittwoch, 29. Oktober 2003 19:24 wurde geschrieben: > > > > At Tue, 28 Oct 2003 20:18:35 +0100, > > > > > > > > > > > > hmm, it seems that a wrong label is used. the label should be > > > > conv_xx12_xx21 (= conv_labels[35]). something is really broken. > > > > > > > > could you check stepwise the loop there? > > > > > > still checking (any tips on speeding this up (I'm trying "step 80000" > > > atm?), seems to happen after the first set of frames (=16384) is > > > processed. > > > > in the first process, did it go to conv_xx12_xx21 properly? > > nope: > > 0x0fd422f4 184 goto *conv; > (gdb) si > 299 conv_1234_xx21: as_u16(dst) = bswap_16(as_u32c(src) >> 16); goto hmm, really weird. meanwhile, i rewrote snd_pcm_linear_convert() without goto trick. could you try the attached patch? Takashi --Multipart_Thu_Oct_30_20:46:42_2003-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="pcm_linear_flatten.dif" Content-Transfer-Encoding: 7bit Index: alsa-lib/src/pcm/pcm_linear.c =================================================================== RCS file: /suse/tiwai/cvs/alsa/alsa-lib/src/pcm/pcm_linear.c,v retrieving revision 1.41 diff -u -r1.41 pcm_linear.c --- alsa-lib/src/pcm/pcm_linear.c 25 Jul 2003 16:56:36 -0000 1.41 +++ alsa-lib/src/pcm/pcm_linear.c 30 Oct 2003 19:41:54 -0000 @@ -157,37 +157,396 @@ } } +#define as_u8(ptr) (*(u_int8_t*)(ptr)) +#define as_u16(ptr) (*(u_int16_t*)(ptr)) +#define as_u32(ptr) (*(u_int32_t*)(ptr)) +#define as_u64(ptr) (*(u_int64_t*)(ptr)) +#define as_s8(ptr) (*(int8_t*)(ptr)) +#define as_s16(ptr) (*(int16_t*)(ptr)) +#define as_s32(ptr) (*(int32_t*)(ptr)) +#define as_s64(ptr) (*(int64_t*)(ptr)) +#define as_float(ptr) (*(float_t*)(ptr)) +#define as_double(ptr) (*(double_t*)(ptr)) + +#define as_u8c(ptr) (*(const u_int8_t*)(ptr)) +#define as_u16c(ptr) (*(const u_int16_t*)(ptr)) +#define as_u32c(ptr) (*(const u_int32_t*)(ptr)) +#define as_u64c(ptr) (*(const u_int64_t*)(ptr)) +#define as_s8c(ptr) (*(const int8_t*)(ptr)) +#define as_s16c(ptr) (*(const int16_t*)(ptr)) +#define as_s32c(ptr) (*(const int32_t*)(ptr)) +#define as_s64c(ptr) (*(const int64_t*)(ptr)) +#define as_floatc(ptr) (*(const float_t*)(ptr)) +#define as_doublec(ptr) (*(const double_t*)(ptr)) + +#define l_conv_xxx1_xxx1 (as_u8(dst) = as_u8c(src)) +#define l_conv_xxx1_xx10 (as_u16(dst) = (u_int16_t)as_u8c(src) << 8) +#define l_conv_xxx1_xx01 (as_u16(dst) = (u_int16_t)as_u8c(src)) +#define l_conv_xxx1_x100 (as_u32(dst) = (u_int32_t)as_u8c(src)) +#define l_conv_xxx1_001x (as_u32(dst) = (u_int32_t)as_u8c(src) << 8) +#define l_conv_xxx1_1000 (as_u32(dst) = (u_int32_t)as_u8c(src) << 24) +#define l_conv_xxx1_0001 (as_u32(dst) = (u_int32_t)as_u8c(src)) +#define l_conv_xxx1_xxx9 (as_u8(dst) = as_u8c(src) ^ 0x80) +#define l_conv_xxx1_xx90 (as_u16(dst) = (u_int16_t)(as_u8c(src) ^ 0x80) << 8) +#define l_conv_xxx1_xx09 (as_u16(dst) = (u_int16_t)(as_u8c(src) ^ 0x80)) +#define l_conv_xxx1_x900 (as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80) << 16) +#define l_conv_xxx1_009x (as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80) << 8) +#define l_conv_xxx1_9000 (as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80) << 24) +#define l_conv_xxx1_0009 (as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80)) +#define l_conv_xx12_xxx1 (as_u8(dst) = as_u16c(src) >> 8) +#define l_conv_xx12_xx12 (as_u16(dst) = as_u16c(src)) +#define l_conv_xx12_xx21 (as_u16(dst) = bswap_16(as_u16c(src))) +#define l_conv_xx12_x120 (as_u32(dst) = (u_int32_t)as_u16c(src) << 8) +#define l_conv_xx12_021x (as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)) << 8) +#define l_conv_xx12_1200 (as_u32(dst) = (u_int32_t)as_u16c(src) << 16) +#define l_conv_xx12_0021 (as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src))) +#define l_conv_xx12_xxx9 (as_u8(dst) = (as_u16c(src) >> 8) ^ 0x80) +#define l_conv_xx12_xx92 (as_u16(dst) = as_u16c(src) ^ 0x8000) +#define l_conv_xx12_xx29 (as_u16(dst) = bswap_16(as_u16c(src)) ^ 0x80) +#define l_conv_xx12_x920 (as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x8000) << 8) +#define l_conv_xx12_029x (as_u32(dst) = (u_int32_t)(bswap_16(as_u16c(src)) ^ 0x80) << 8) +#define l_conv_xx12_9200 (as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x8000) << 16) +#define l_conv_xx12_0029 (as_u32(dst) = (u_int32_t)(bswap_16(as_u16c(src)) ^ 0x80)) +#define l_conv_xx12_xxx2 (as_u8(dst) = as_u16c(src) & 0xff) +#define l_conv_xx12_x210 (as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)) << 8) +#define l_conv_xx12_012x (as_u32(dst) = (u_int32_t)as_u16c(src) << 8) +#define l_conv_xx12_2100 (as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)) << 16) +#define l_conv_xx12_0012 (as_u32(dst) = (u_int32_t)as_u16c(src)) +#define l_conv_xx12_xxxA (as_u8(dst) = (as_u16c(src) ^ 0x80) & 0xff) +#define l_conv_xx12_xxA1 (as_u16(dst) = bswap_16(as_u16c(src) ^ 0x80)) +#define l_conv_xx12_xx1A (as_u16(dst) = as_u16c(src) ^ 0x80) +#define l_conv_xx12_xA10 (as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 8) +#define l_conv_xx12_01Ax (as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x80) << 8) +#define l_conv_xx12_A100 (as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 16) +#define l_conv_xx12_001A (as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x80)) +#define l_conv_x123_xxx1 (as_u8(dst) = as_u32c(src) >> 16) +#define l_conv_x123_xx12 (as_u16(dst) = as_u32c(src) >> 8) +#define l_conv_x123_xx21 (as_u16(dst) = bswap_16(as_u32c(src) >> 8)) +#define l_conv_x123_x123 (as_u32(dst) = as_u32c(src)) +#define l_conv_x123_321x (as_u32(dst) = bswap_32(as_u32c(src))) +#define l_conv_x123_1230 (as_u32(dst) = as_u32c(src) << 8) +#define l_conv_x123_0321 (as_u32(dst) = bswap_32(as_u32c(src)) >> 8) +#define l_conv_x123_xxx9 (as_u8(dst) = (as_u32c(src) >> 16) ^ 0x80) +#define l_conv_x123_xx92 (as_u16(dst) = (as_u32c(src) >> 8) ^ 0x8000) +#define l_conv_x123_xx29 (as_u16(dst) = bswap_16(as_u32c(src) >> 8) ^ 0x80) +#define l_conv_x123_x923 (as_u32(dst) = as_u32c(src) ^ 0x800000) +#define l_conv_x123_329x (as_u32(dst) = bswap_32(as_u32c(src)) ^ 0x8000) +#define l_conv_x123_9230 (as_u32(dst) = (as_u32c(src) ^ 0x800000) << 8) +#define l_conv_x123_0329 (as_u32(dst) = (bswap_32(as_u32c(src)) >> 8) ^ 0x80) +#define l_conv_123x_xxx3 (as_u8(dst) = (as_u32c(src) >> 8) & 0xff) +#define l_conv_123x_xx32 (as_u16(dst) = bswap_16(as_u32c(src) >> 8)) +#define l_conv_123x_xx23 (as_u16(dst) = (as_u32c(src) >> 8) & 0xffff) +#define l_conv_123x_x321 (as_u32(dst) = bswap_32(as_u32c(src))) +#define l_conv_123x_123x (as_u32(dst) = as_u32c(src)) +#define l_conv_123x_3210 (as_u32(dst) = bswap_32(as_u32c(src)) << 8) +#define l_conv_123x_0123 (as_u32(dst) = as_u32c(src) >> 8) +#define l_conv_123x_xxxB (as_u8(dst) = ((as_u32c(src) >> 8) & 0xff) ^ 0x80) +#define l_conv_123x_xxB2 (as_u16(dst) = bswap_16((as_u32c(src) >> 8) ^ 0x80)) +#define l_conv_123x_xx2B (as_u16(dst) = ((as_u32c(src) >> 8) & 0xffff) ^ 0x80) +#define l_conv_123x_xB21 (as_u32(dst) = bswap_32(as_u32c(src)) ^ 0x800000) +#define l_conv_123x_12Bx (as_u32(dst) = as_u32c(src) ^ 0x8000) +#define l_conv_123x_B210 (as_u32(dst) = bswap_32(as_u32c(src) ^ 0x8000) << 8) +#define l_conv_123x_012B (as_u32(dst) = (as_u32c(src) >> 8) ^ 0x80) +#define l_conv_1234_xxx1 (as_u8(dst) = as_u32c(src) >> 24) +#define l_conv_1234_xx12 (as_u16(dst) = as_u32c(src) >> 16) +#define l_conv_1234_xx21 (as_u16(dst) = bswap_16(as_u32c(src) >> 16)) +#define l_conv_1234_x123 (as_u32(dst) = as_u32c(src) >> 8) +#define l_conv_1234_321x (as_u32(dst) = bswap_32(as_u32c(src)) << 8) +#define l_conv_1234_1234 (as_u32(dst) = as_u32c(src)) +#define l_conv_1234_4321 (as_u32(dst) = bswap_32(as_u32c(src))) +#define l_conv_1234_xxx9 (as_u8(dst) = (as_u32c(src) >> 24) ^ 0x80) +#define l_conv_1234_xx92 (as_u16(dst) = (as_u32c(src) >> 16) ^ 0x8000) +#define l_conv_1234_xx29 (as_u16(dst) = bswap_16(as_u32c(src) >> 16) ^ 0x80) +#define l_conv_1234_x923 (as_u32(dst) = (as_u32c(src) >> 8) ^ 0x800000) +#define l_conv_1234_329x (as_u32(dst) = (bswap_32(as_u32c(src)) ^ 0x80) << 8) +#define l_conv_1234_9234 (as_u32(dst) = as_u32c(src) ^ 0x80000000) +#define l_conv_1234_4329 (as_u32(dst) = bswap_32(as_u32c(src)) ^ 0x80) +#define l_conv_1234_xxx4 (as_u8(dst) = as_u32c(src) & 0xff) +#define l_conv_1234_xx43 (as_u16(dst) = bswap_16(as_u32c(src))) +#define l_conv_1234_xx34 (as_u16(dst) = as_u32c(src) & 0xffff) +#define l_conv_1234_x432 (as_u32(dst) = bswap_32(as_u32c(src)) >> 8) +#define l_conv_1234_234x (as_u32(dst) = as_u32c(src) << 8) +#define l_conv_1234_xxxC (as_u8(dst) = (as_u32c(src) & 0xff) ^ 0x80) +#define l_conv_1234_xxC3 (as_u16(dst) = bswap_16(as_u32c(src) ^ 0x80)) +#define l_conv_1234_xx3C (as_u16(dst) = (as_u32c(src) & 0xffff) ^ 0x80) +#define l_conv_1234_xC32 (as_u32(dst) = (bswap_32(as_u32c(src)) >> 8) ^ 0x800000) +#define l_conv_1234_23Cx (as_u32(dst) = (as_u32c(src) ^ 0x80) << 8) +#define l_conv_1234_C321 (as_u32(dst) = bswap_32(as_u32c(src) ^ 0x80)) +#define l_conv_1234_123C (as_u32(dst) = as_u32c(src) ^ 0x80) + +#define DEF_CONV(cname,convertor) \ +static void snd_pcm_linear_##cname(const char *src, char *dst, int src_step, int dst_step, int frames) \ +{ \ + while (frames-- > 0) { \ + convertor; \ + src += src_step; \ + dst += dst_step; \ + }\ +} + +DEF_CONV(conv_xxx1_xxx1,l_conv_xxx1_xxx1); +DEF_CONV(conv_xxx1_xx10,l_conv_xxx1_xx10); +DEF_CONV(conv_xxx1_xx01,l_conv_xxx1_xx01); +DEF_CONV(conv_xxx1_x100,l_conv_xxx1_x100); +DEF_CONV(conv_xxx1_001x,l_conv_xxx1_001x); +DEF_CONV(conv_xxx1_1000,l_conv_xxx1_1000); +DEF_CONV(conv_xxx1_0001,l_conv_xxx1_0001); +DEF_CONV(conv_xxx1_xxx9,l_conv_xxx1_xxx9); +DEF_CONV(conv_xxx1_xx90,l_conv_xxx1_xx90); +DEF_CONV(conv_xxx1_xx09,l_conv_xxx1_xx09); +DEF_CONV(conv_xxx1_x900,l_conv_xxx1_x900); +DEF_CONV(conv_xxx1_009x,l_conv_xxx1_009x); +DEF_CONV(conv_xxx1_9000,l_conv_xxx1_9000); +DEF_CONV(conv_xxx1_0009,l_conv_xxx1_0009); +DEF_CONV(conv_xx12_xxx1,l_conv_xx12_xxx1); +DEF_CONV(conv_xx12_xx12,l_conv_xx12_xx12); +DEF_CONV(conv_xx12_xx21,l_conv_xx12_xx21); +DEF_CONV(conv_xx12_x120,l_conv_xx12_x120); +DEF_CONV(conv_xx12_021x,l_conv_xx12_021x); +DEF_CONV(conv_xx12_1200,l_conv_xx12_1200); +DEF_CONV(conv_xx12_0021,l_conv_xx12_0021); +DEF_CONV(conv_xx12_xxx9,l_conv_xx12_xxx9); +DEF_CONV(conv_xx12_xx92,l_conv_xx12_xx92); +DEF_CONV(conv_xx12_xx29,l_conv_xx12_xx29); +DEF_CONV(conv_xx12_x920,l_conv_xx12_x920); +DEF_CONV(conv_xx12_029x,l_conv_xx12_029x); +DEF_CONV(conv_xx12_9200,l_conv_xx12_9200); +DEF_CONV(conv_xx12_0029,l_conv_xx12_0029); +DEF_CONV(conv_xx12_xxx2,l_conv_xx12_xxx2); +DEF_CONV(conv_xx12_x210,l_conv_xx12_x210); +DEF_CONV(conv_xx12_012x,l_conv_xx12_012x); +DEF_CONV(conv_xx12_2100,l_conv_xx12_2100); +DEF_CONV(conv_xx12_0012,l_conv_xx12_0012); +DEF_CONV(conv_xx12_xxxA,l_conv_xx12_xxxA); +DEF_CONV(conv_xx12_xxA1,l_conv_xx12_xxA1); +DEF_CONV(conv_xx12_xx1A,l_conv_xx12_xx1A); +DEF_CONV(conv_xx12_xA10,l_conv_xx12_xA10); +DEF_CONV(conv_xx12_01Ax,l_conv_xx12_01Ax); +DEF_CONV(conv_xx12_A100,l_conv_xx12_A100); +DEF_CONV(conv_xx12_001A,l_conv_xx12_001A); +DEF_CONV(conv_x123_xxx1,l_conv_x123_xxx1); +DEF_CONV(conv_x123_xx12,l_conv_x123_xx12); +DEF_CONV(conv_x123_xx21,l_conv_x123_xx21); +DEF_CONV(conv_x123_x123,l_conv_x123_x123); +DEF_CONV(conv_x123_321x,l_conv_x123_321x); +DEF_CONV(conv_x123_1230,l_conv_x123_1230); +DEF_CONV(conv_x123_0321,l_conv_x123_0321); +DEF_CONV(conv_x123_xxx9,l_conv_x123_xxx9); +DEF_CONV(conv_x123_xx92,l_conv_x123_xx92); +DEF_CONV(conv_x123_xx29,l_conv_x123_xx29); +DEF_CONV(conv_x123_x923,l_conv_x123_x923); +DEF_CONV(conv_x123_329x,l_conv_x123_329x); +DEF_CONV(conv_x123_9230,l_conv_x123_9230); +DEF_CONV(conv_x123_0329,l_conv_x123_0329); +DEF_CONV(conv_123x_xxx3,l_conv_123x_xxx3); +DEF_CONV(conv_123x_xx32,l_conv_123x_xx32); +DEF_CONV(conv_123x_xx23,l_conv_123x_xx23); +DEF_CONV(conv_123x_x321,l_conv_123x_x321); +DEF_CONV(conv_123x_123x,l_conv_123x_123x); +DEF_CONV(conv_123x_3210,l_conv_123x_3210); +DEF_CONV(conv_123x_0123,l_conv_123x_0123); +DEF_CONV(conv_123x_xxxB,l_conv_123x_xxxB); +DEF_CONV(conv_123x_xxB2,l_conv_123x_xxB2); +DEF_CONV(conv_123x_xx2B,l_conv_123x_xx2B); +DEF_CONV(conv_123x_xB21,l_conv_123x_xB21); +DEF_CONV(conv_123x_12Bx,l_conv_123x_12Bx); +DEF_CONV(conv_123x_B210,l_conv_123x_B210); +DEF_CONV(conv_123x_012B,l_conv_123x_012B); +DEF_CONV(conv_1234_xxx1,l_conv_1234_xxx1); +DEF_CONV(conv_1234_xx12,l_conv_1234_xx12); +DEF_CONV(conv_1234_xx21,l_conv_1234_xx21); +DEF_CONV(conv_1234_x123,l_conv_1234_x123); +DEF_CONV(conv_1234_321x,l_conv_1234_321x); +DEF_CONV(conv_1234_1234,l_conv_1234_1234); +DEF_CONV(conv_1234_4321,l_conv_1234_4321); +DEF_CONV(conv_1234_xxx9,l_conv_1234_xxx9); +DEF_CONV(conv_1234_xx92,l_conv_1234_xx92); +DEF_CONV(conv_1234_xx29,l_conv_1234_xx29); +DEF_CONV(conv_1234_x923,l_conv_1234_x923); +DEF_CONV(conv_1234_329x,l_conv_1234_329x); +DEF_CONV(conv_1234_9234,l_conv_1234_9234); +DEF_CONV(conv_1234_4329,l_conv_1234_4329); +DEF_CONV(conv_1234_xxx4,l_conv_1234_xxx4); +DEF_CONV(conv_1234_xx43,l_conv_1234_xx43); +DEF_CONV(conv_1234_xx34,l_conv_1234_xx34); +DEF_CONV(conv_1234_x432,l_conv_1234_x432); +DEF_CONV(conv_1234_234x,l_conv_1234_234x); +DEF_CONV(conv_1234_xxxC,l_conv_1234_xxxC); +DEF_CONV(conv_1234_xxC3,l_conv_1234_xxC3); +DEF_CONV(conv_1234_xx3C,l_conv_1234_xx3C); +DEF_CONV(conv_1234_xC32,l_conv_1234_xC32); +DEF_CONV(conv_1234_23Cx,l_conv_1234_23Cx); +DEF_CONV(conv_1234_C321,l_conv_1234_C321); +DEF_CONV(conv_1234_123C,l_conv_1234_123C); + +#undef as_u8 +#undef as_u16 +#undef as_u32 +#undef as_s8 +#undef as_s16 +#undef as_s32 +#undef as_float +#undef as_double + +#undef as_u8c +#undef as_u16c +#undef as_u32c +#undef as_s8c +#undef as_s16c +#undef as_s32c +#undef as_floatc +#undef as_doublec + +typedef void (*snd_pcm_linear_conv_t)(const char *, char *, int, int, int); +static snd_pcm_linear_conv_t linear_conv_table[4 * 2 * 2 * 4 * 2] = { + snd_pcm_linear_conv_xxx1_xxx1, /* 8h -> 8h */ + snd_pcm_linear_conv_xxx1_xxx1, /* 8h -> 8s */ + snd_pcm_linear_conv_xxx1_xx10, /* 8h -> 16h */ + snd_pcm_linear_conv_xxx1_xx01, /* 8h -> 16s */ + snd_pcm_linear_conv_xxx1_x100, /* 8h -> 24h */ + snd_pcm_linear_conv_xxx1_001x, /* 8h -> 24s */ + snd_pcm_linear_conv_xxx1_1000, /* 8h -> 32h */ + snd_pcm_linear_conv_xxx1_0001, /* 8h -> 32s */ + snd_pcm_linear_conv_xxx1_xxx9, /* 8h ^> 8h */ + snd_pcm_linear_conv_xxx1_xxx9, /* 8h ^> 8s */ + snd_pcm_linear_conv_xxx1_xx90, /* 8h ^> 16h */ + snd_pcm_linear_conv_xxx1_xx09, /* 8h ^> 16s */ + snd_pcm_linear_conv_xxx1_x900, /* 8h ^> 24h */ + snd_pcm_linear_conv_xxx1_009x, /* 8h ^> 24s */ + snd_pcm_linear_conv_xxx1_9000, /* 8h ^> 32h */ + snd_pcm_linear_conv_xxx1_0009, /* 8h ^> 32s */ + snd_pcm_linear_conv_xxx1_xxx1, /* 8s -> 8h */ + snd_pcm_linear_conv_xxx1_xxx1, /* 8s -> 8s */ + snd_pcm_linear_conv_xxx1_xx10, /* 8s -> 16h */ + snd_pcm_linear_conv_xxx1_xx01, /* 8s -> 16s */ + snd_pcm_linear_conv_xxx1_x100, /* 8s -> 24h */ + snd_pcm_linear_conv_xxx1_001x, /* 8s -> 24s */ + snd_pcm_linear_conv_xxx1_1000, /* 8s -> 32h */ + snd_pcm_linear_conv_xxx1_0001, /* 8s -> 32s */ + snd_pcm_linear_conv_xxx1_xxx9, /* 8s ^> 8h */ + snd_pcm_linear_conv_xxx1_xxx9, /* 8s ^> 8s */ + snd_pcm_linear_conv_xxx1_xx90, /* 8s ^> 16h */ + snd_pcm_linear_conv_xxx1_xx09, /* 8s ^> 16s */ + snd_pcm_linear_conv_xxx1_x900, /* 8s ^> 24h */ + snd_pcm_linear_conv_xxx1_009x, /* 8s ^> 24s */ + snd_pcm_linear_conv_xxx1_9000, /* 8s ^> 32h */ + snd_pcm_linear_conv_xxx1_0009, /* 8s ^> 32s */ + snd_pcm_linear_conv_xx12_xxx1, /* 16h -> 8h */ + snd_pcm_linear_conv_xx12_xxx1, /* 16h -> 8s */ + snd_pcm_linear_conv_xx12_xx12, /* 16h -> 16h */ + snd_pcm_linear_conv_xx12_xx21, /* 16h -> 16s */ + snd_pcm_linear_conv_xx12_x120, /* 16h -> 24h */ + snd_pcm_linear_conv_xx12_021x, /* 16h -> 24s */ + snd_pcm_linear_conv_xx12_1200, /* 16h -> 32h */ + snd_pcm_linear_conv_xx12_0021, /* 16h -> 32s */ + snd_pcm_linear_conv_xx12_xxx9, /* 16h ^> 8h */ + snd_pcm_linear_conv_xx12_xxx9, /* 16h ^> 8s */ + snd_pcm_linear_conv_xx12_xx92, /* 16h ^> 16h */ + snd_pcm_linear_conv_xx12_xx29, /* 16h ^> 16s */ + snd_pcm_linear_conv_xx12_x920, /* 16h ^> 24h */ + snd_pcm_linear_conv_xx12_029x, /* 16h ^> 24s */ + snd_pcm_linear_conv_xx12_9200, /* 16h ^> 32h */ + snd_pcm_linear_conv_xx12_0029, /* 16h ^> 32s */ + snd_pcm_linear_conv_xx12_xxx2, /* 16s -> 8h */ + snd_pcm_linear_conv_xx12_xxx2, /* 16s -> 8s */ + snd_pcm_linear_conv_xx12_xx21, /* 16s -> 16h */ + snd_pcm_linear_conv_xx12_xx12, /* 16s -> 16s */ + snd_pcm_linear_conv_xx12_x210, /* 16s -> 24h */ + snd_pcm_linear_conv_xx12_012x, /* 16s -> 24s */ + snd_pcm_linear_conv_xx12_2100, /* 16s -> 32h */ + snd_pcm_linear_conv_xx12_0012, /* 16s -> 32s */ + snd_pcm_linear_conv_xx12_xxxA, /* 16s ^> 8h */ + snd_pcm_linear_conv_xx12_xxxA, /* 16s ^> 8s */ + snd_pcm_linear_conv_xx12_xxA1, /* 16s ^> 16h */ + snd_pcm_linear_conv_xx12_xx1A, /* 16s ^> 16s */ + snd_pcm_linear_conv_xx12_xA10, /* 16s ^> 24h */ + snd_pcm_linear_conv_xx12_01Ax, /* 16s ^> 24s */ + snd_pcm_linear_conv_xx12_A100, /* 16s ^> 32h */ + snd_pcm_linear_conv_xx12_001A, /* 16s ^> 32s */ + snd_pcm_linear_conv_x123_xxx1, /* 24h -> 8h */ + snd_pcm_linear_conv_x123_xxx1, /* 24h -> 8s */ + snd_pcm_linear_conv_x123_xx12, /* 24h -> 16h */ + snd_pcm_linear_conv_x123_xx21, /* 24h -> 16s */ + snd_pcm_linear_conv_x123_x123, /* 24h -> 24h */ + snd_pcm_linear_conv_x123_321x, /* 24h -> 24s */ + snd_pcm_linear_conv_x123_1230, /* 24h -> 32h */ + snd_pcm_linear_conv_x123_0321, /* 24h -> 32s */ + snd_pcm_linear_conv_x123_xxx9, /* 24h ^> 8h */ + snd_pcm_linear_conv_x123_xxx9, /* 24h ^> 8s */ + snd_pcm_linear_conv_x123_xx92, /* 24h ^> 16h */ + snd_pcm_linear_conv_x123_xx29, /* 24h ^> 16s */ + snd_pcm_linear_conv_x123_x923, /* 24h ^> 24h */ + snd_pcm_linear_conv_x123_329x, /* 24h ^> 24s */ + snd_pcm_linear_conv_x123_9230, /* 24h ^> 32h */ + snd_pcm_linear_conv_x123_0329, /* 24h ^> 32s */ + snd_pcm_linear_conv_123x_xxx3, /* 24s -> 8h */ + snd_pcm_linear_conv_123x_xxx3, /* 24s -> 8s */ + snd_pcm_linear_conv_123x_xx32, /* 24s -> 16h */ + snd_pcm_linear_conv_123x_xx23, /* 24s -> 16s */ + snd_pcm_linear_conv_123x_x321, /* 24s -> 24h */ + snd_pcm_linear_conv_123x_123x, /* 24s -> 24s */ + snd_pcm_linear_conv_123x_3210, /* 24s -> 32h */ + snd_pcm_linear_conv_123x_0123, /* 24s -> 32s */ + snd_pcm_linear_conv_123x_xxxB, /* 24s ^> 8h */ + snd_pcm_linear_conv_123x_xxxB, /* 24s ^> 8s */ + snd_pcm_linear_conv_123x_xxB2, /* 24s ^> 16h */ + snd_pcm_linear_conv_123x_xx2B, /* 24s ^> 16s */ + snd_pcm_linear_conv_123x_xB21, /* 24s ^> 24h */ + snd_pcm_linear_conv_123x_12Bx, /* 24s ^> 24s */ + snd_pcm_linear_conv_123x_B210, /* 24s ^> 32h */ + snd_pcm_linear_conv_123x_012B, /* 24s ^> 32s */ + snd_pcm_linear_conv_1234_xxx1, /* 32h -> 8h */ + snd_pcm_linear_conv_1234_xxx1, /* 32h -> 8s */ + snd_pcm_linear_conv_1234_xx12, /* 32h -> 16h */ + snd_pcm_linear_conv_1234_xx21, /* 32h -> 16s */ + snd_pcm_linear_conv_1234_x123, /* 32h -> 24h */ + snd_pcm_linear_conv_1234_321x, /* 32h -> 24s */ + snd_pcm_linear_conv_1234_1234, /* 32h -> 32h */ + snd_pcm_linear_conv_1234_4321, /* 32h -> 32s */ + snd_pcm_linear_conv_1234_xxx9, /* 32h ^> 8h */ + snd_pcm_linear_conv_1234_xxx9, /* 32h ^> 8s */ + snd_pcm_linear_conv_1234_xx92, /* 32h ^> 16h */ + snd_pcm_linear_conv_1234_xx29, /* 32h ^> 16s */ + snd_pcm_linear_conv_1234_x923, /* 32h ^> 24h */ + snd_pcm_linear_conv_1234_329x, /* 32h ^> 24s */ + snd_pcm_linear_conv_1234_9234, /* 32h ^> 32h */ + snd_pcm_linear_conv_1234_4329, /* 32h ^> 32s */ + snd_pcm_linear_conv_1234_xxx4, /* 32s -> 8h */ + snd_pcm_linear_conv_1234_xxx4, /* 32s -> 8s */ + snd_pcm_linear_conv_1234_xx43, /* 32s -> 16h */ + snd_pcm_linear_conv_1234_xx34, /* 32s -> 16s */ + snd_pcm_linear_conv_1234_x432, /* 32s -> 24h */ + snd_pcm_linear_conv_1234_234x, /* 32s -> 24s */ + snd_pcm_linear_conv_1234_4321, /* 32s -> 32h */ + snd_pcm_linear_conv_1234_1234, /* 32s -> 32s */ + snd_pcm_linear_conv_1234_xxxC, /* 32s ^> 8h */ + snd_pcm_linear_conv_1234_xxxC, /* 32s ^> 8s */ + snd_pcm_linear_conv_1234_xxC3, /* 32s ^> 16h */ + snd_pcm_linear_conv_1234_xx3C, /* 32s ^> 16s */ + snd_pcm_linear_conv_1234_xC32, /* 32s ^> 24h */ + snd_pcm_linear_conv_1234_23Cx, /* 32s ^> 24s */ + snd_pcm_linear_conv_1234_C321, /* 32s ^> 32h */ + snd_pcm_linear_conv_1234_123C, /* 32s ^> 32s */ +}; + void snd_pcm_linear_convert(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_t dst_offset, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames, unsigned int convidx) { -#define CONV_LABELS -#include "plugin_ops.h" -#undef CONV_LABELS - void *conv = conv_labels[convidx]; unsigned int channel; + snd_pcm_linear_conv_t func = linear_conv_table[convidx]; for (channel = 0; channel < channels; ++channel) { const char *src; char *dst; int src_step, dst_step; - snd_pcm_uframes_t frames1; const snd_pcm_channel_area_t *src_area = &src_areas[channel]; const snd_pcm_channel_area_t *dst_area = &dst_areas[channel]; src = snd_pcm_channel_area_addr(src_area, src_offset); dst = snd_pcm_channel_area_addr(dst_area, dst_offset); src_step = snd_pcm_channel_area_step(src_area); dst_step = snd_pcm_channel_area_step(dst_area); - frames1 = frames; - while (frames1-- > 0) { - goto *conv; -#define CONV_END after -#include "plugin_ops.h" -#undef CONV_END - after: - src += src_step; - dst += dst_step; - } + func(src, dst, src_step, dst_step, frames); } } --Multipart_Thu_Oct_30_20:46:42_2003-1-- ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/