#define DIRECT_IPC_SEMS 1
#define DIRECT_IPC_SEM_CLIENT 0
-typedef void (mix_areas1_t)(unsigned int size,
- volatile signed short *dst, signed short *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step);
+typedef void (mix_areas_16_t)(unsigned int size,
+ volatile signed short *dst, signed short *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step);
-typedef void (mix_areas2_t)(unsigned int size,
- volatile signed int *dst, signed int *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step);
+typedef void (mix_areas_32_t)(unsigned int size,
+ volatile signed int *dst, signed int *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step);
-typedef void (mix_areas3_t)(unsigned int size,
- volatile unsigned char *dst, unsigned char *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step);
+typedef void (mix_areas_24_t)(unsigned int size,
+ volatile unsigned char *dst, unsigned char *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step);
struct slave_params {
snd_pcm_format_t format;
struct {
int shmid_sum; /* IPC global sum ring buffer memory identification */
signed int *sum_buffer; /* shared sum buffer */
- mix_areas1_t *mix_areas1;
- mix_areas2_t *mix_areas2;
- mix_areas3_t *mix_areas3;
+ mix_areas_16_t *mix_areas_16;
+ mix_areas_32_t *mix_areas_32;
+ mix_areas_24_t *mix_areas_24;
} dmix;
struct {
} dsnoop;
* process all areas in one loop
* it optimizes the memory accesses for this case
*/
- dmix->u.dmix.mix_areas1(size * channels,
- ((signed short *)dst_areas[0].addr) + (dst_ofs * channels),
- ((signed short *)src_areas[0].addr) + (src_ofs * channels),
- dmix->u.dmix.sum_buffer + (dst_ofs * channels),
- sizeof(signed short),
- sizeof(signed short),
- sizeof(signed int));
+ dmix->u.dmix.mix_areas_16(size * channels,
+ ((signed short *)dst_areas[0].addr) + (dst_ofs * channels),
+ ((signed short *)src_areas[0].addr) + (src_ofs * channels),
+ dmix->u.dmix.sum_buffer + (dst_ofs * channels),
+ sizeof(signed short),
+ sizeof(signed short),
+ sizeof(signed int));
return;
}
for (chn = 0; chn < channels; chn++) {
src = (signed short *)(((char *)src_areas[chn].addr + src_areas[chn].first / 8) + (src_ofs * src_step));
dst = (signed short *)(((char *)dst_areas[dchn].addr + dst_areas[dchn].first / 8) + (dst_ofs * dst_step));
sum = dmix->u.dmix.sum_buffer + channels * dst_ofs + chn;
- dmix->u.dmix.mix_areas1(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int));
+ dmix->u.dmix.mix_areas_16(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int));
}
} else if (dmix->shmptr->s.format == SND_PCM_FORMAT_S32_LE ||
dmix->shmptr->s.format == SND_PCM_FORMAT_S32_BE) {
* process all areas in one loop
* it optimizes the memory accesses for this case
*/
- dmix->u.dmix.mix_areas2(size * channels,
- ((signed int *)dst_areas[0].addr) + (dst_ofs * channels),
- ((signed int *)src_areas[0].addr) + (src_ofs * channels),
- dmix->u.dmix.sum_buffer + (dst_ofs * channels),
- sizeof(signed int),
- sizeof(signed int),
- sizeof(signed int));
+ dmix->u.dmix.mix_areas_32(size * channels,
+ ((signed int *)dst_areas[0].addr) + (dst_ofs * channels),
+ ((signed int *)src_areas[0].addr) + (src_ofs * channels),
+ dmix->u.dmix.sum_buffer + (dst_ofs * channels),
+ sizeof(signed int),
+ sizeof(signed int),
+ sizeof(signed int));
return;
}
for (chn = 0; chn < channels; chn++) {
src = (signed int *)(((char *)src_areas[chn].addr + src_areas[chn].first / 8) + (src_ofs * src_step));
dst = (signed int *)(((char *)dst_areas[dchn].addr + dst_areas[dchn].first / 8) + (dst_ofs * dst_step));
sum = dmix->u.dmix.sum_buffer + channels * dst_ofs + chn;
- dmix->u.dmix.mix_areas2(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int));
+ dmix->u.dmix.mix_areas_32(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int));
}
} else { /* SND_PCM_FORMAT_S24_3LE */
unsigned char *src;
* process all areas in one loop
* it optimizes the memory accesses for this case
*/
- dmix->u.dmix.mix_areas3(size * channels,
- ((unsigned char *)dst_areas[0].addr) + 3 * dst_ofs * channels,
- ((unsigned char *)src_areas[0].addr) + 3 * src_ofs * channels,
- dmix->u.dmix.sum_buffer + (dst_ofs * channels),
- 3, 3, sizeof(signed int));
+ dmix->u.dmix.mix_areas_24(size * channels,
+ ((unsigned char *)dst_areas[0].addr) + 3 * dst_ofs * channels,
+ ((unsigned char *)src_areas[0].addr) + 3 * src_ofs * channels,
+ dmix->u.dmix.sum_buffer + (dst_ofs * channels),
+ 3, 3, sizeof(signed int));
return;
}
for (chn = 0; chn < channels; chn++) {
src = (unsigned char *)(((char *)src_areas[chn].addr + src_areas[chn].first / 8) + (src_ofs * src_step));
dst = (unsigned char *)(((char *)dst_areas[dchn].addr + dst_areas[dchn].first / 8) + (dst_ofs * dst_step));
sum = dmix->u.dmix.sum_buffer + channels * dst_ofs + chn;
- dmix->u.dmix.mix_areas3(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int));
+ dmix->u.dmix.mix_areas_24(size, dst, src, sum, dst_step, src_step, channels * sizeof(signed int));
}
}
}
#endif
#if IS_CONCURRENT
-static void mix_areas1(unsigned int size,
- volatile signed short *dst, signed short *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void mix_areas_16(unsigned int size,
+ volatile signed short *dst, signed short *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
register signed int sample, old_sample;
}
}
-static void mix_areas2(unsigned int size,
- volatile signed int *dst, signed int *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void mix_areas_32(unsigned int size,
+ volatile signed int *dst, signed int *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
register signed int sample, old_sample;
static void mix_select_callbacks(snd_pcm_direct_t *dmix)
{
- dmix->u.dmix.mix_areas1 = mix_areas1;
- dmix->u.dmix.mix_areas2 = mix_areas2;
+ dmix->u.dmix.mix_areas_16 = mix_areas_16;
+ dmix->u.dmix.mix_areas_32 = mix_areas_32;
}
#else
#include <byteswap.h>
-static void generic_mix_areas1_native(unsigned int size,
- volatile signed short *dst, signed short *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void generic_mix_areas_16_native(unsigned int size,
+ volatile signed short *dst,
+ signed short *src,
+ volatile signed int *sum,
+ size_t dst_step,
+ size_t src_step,
+ size_t sum_step)
{
register signed int sample;
}
}
-static void generic_mix_areas2_native(unsigned int size,
- volatile signed int *dst, signed int *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void generic_mix_areas_32_native(unsigned int size,
+ volatile signed int *dst,
+ signed int *src,
+ volatile signed int *sum,
+ size_t dst_step,
+ size_t src_step,
+ size_t sum_step)
{
register signed int sample;
}
}
-static void generic_mix_areas1_swap(unsigned int size,
- volatile signed short *dst, signed short *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void generic_mix_areas_16_swap(unsigned int size,
+ volatile signed short *dst,
+ signed short *src,
+ volatile signed int *sum,
+ size_t dst_step,
+ size_t src_step,
+ size_t sum_step)
{
register signed int sample;
}
}
-static void generic_mix_areas2_swap(unsigned int size,
- volatile signed int *dst, signed int *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void generic_mix_areas_32_swap(unsigned int size,
+ volatile signed int *dst,
+ signed int *src,
+ volatile signed int *sum,
+ size_t dst_step,
+ size_t src_step,
+ size_t sum_step)
{
register signed int sample;
}
/* always little endian */
-static void generic_mix_areas3(unsigned int size,
- volatile unsigned char *dst, unsigned char *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void generic_mix_areas_24(unsigned int size,
+ volatile unsigned char *dst,
+ unsigned char *src,
+ volatile signed int *sum,
+ size_t dst_step,
+ size_t src_step,
+ size_t sum_step)
{
register signed int sample;
static void generic_mix_select_callbacks(snd_pcm_direct_t *dmix)
{
if (snd_pcm_format_cpu_endian(dmix->shmptr->s.format)) {
- dmix->u.dmix.mix_areas1 = generic_mix_areas1_native;
- dmix->u.dmix.mix_areas2 = generic_mix_areas2_native;
+ dmix->u.dmix.mix_areas_16 = generic_mix_areas_16_native;
+ dmix->u.dmix.mix_areas_32 = generic_mix_areas_32_native;
} else {
- dmix->u.dmix.mix_areas1 = generic_mix_areas1_swap;
- dmix->u.dmix.mix_areas2 = generic_mix_areas2_swap;
+ dmix->u.dmix.mix_areas_16 = generic_mix_areas_16_swap;
+ dmix->u.dmix.mix_areas_32 = generic_mix_areas_32_swap;
}
- dmix->u.dmix.mix_areas3 = generic_mix_areas3;
+ dmix->u.dmix.mix_areas_24 = generic_mix_areas_24;
}
#endif
* optimized mixing code for i386
*/
-#define MIX_AREAS1 mix_areas1
-#define MIX_AREAS1_MMX mix_areas1_mmx
-#define MIX_AREAS2 mix_areas2
-#define MIX_AREAS3 mix_areas3
-#define MIX_AREAS3_CMOV mix_areas3_cmov
+#define MIX_AREAS_16 mix_areas_16
+#define MIX_AREAS_16_MMX mix_areas_16_mmx
+#define MIX_AREAS_32 mix_areas_32
+#define MIX_AREAS_24 mix_areas_24
+#define MIX_AREAS_24_CMOV mix_areas_24_cmov
#define LOCK_PREFIX ""
#include "pcm_dmix_i386.h"
-#undef MIX_AREAS1
-#undef MIX_AREAS1_MMX
-#undef MIX_AREAS2
-#undef MIX_AREAS3
-#undef MIX_AREAS3_CMOV
+#undef MIX_AREAS_16
+#undef MIX_AREAS_16_MMX
+#undef MIX_AREAS_32
+#undef MIX_AREAS_24
+#undef MIX_AREAS_24_CMOV
#undef LOCK_PREFIX
-#define MIX_AREAS1 mix_areas1_smp
-#define MIX_AREAS1_MMX mix_areas1_smp_mmx
-#define MIX_AREAS2 mix_areas2_smp
-#define MIX_AREAS3 mix_areas3_smp
-#define MIX_AREAS3_CMOV mix_areas3_smp_cmov
+#define MIX_AREAS_16 mix_areas_16_smp
+#define MIX_AREAS_16_MMX mix_areas_16_smp_mmx
+#define MIX_AREAS_32 mix_areas_32_smp
+#define MIX_AREAS_24 mix_areas_24_smp
+#define MIX_AREAS_24_CMOV mix_areas_24_smp_cmov
#define LOCK_PREFIX "lock ; "
#include "pcm_dmix_i386.h"
-#undef MIX_AREAS1
-#undef MIX_AREAS1_MMX
-#undef MIX_AREAS2
-#undef MIX_AREAS3
-#undef MIX_AREAS3_CMOV
+#undef MIX_AREAS_16
+#undef MIX_AREAS_16_MMX
+#undef MIX_AREAS_32
+#undef MIX_AREAS_24
+#undef MIX_AREAS_24_CMOV
#undef LOCK_PREFIX
#define i386_dmix_supported_format \
}
if (mmx) {
- dmix->u.dmix.mix_areas1 = smp > 1 ? mix_areas1_smp_mmx : mix_areas1_mmx;
+ dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp_mmx : mix_areas_16_mmx;
} else {
- dmix->u.dmix.mix_areas1 = smp > 1 ? mix_areas1_smp : mix_areas1;
+ dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp : mix_areas_16;
}
- dmix->u.dmix.mix_areas2 = smp > 1 ? mix_areas2_smp : mix_areas2;
+ dmix->u.dmix.mix_areas_32 = smp > 1 ? mix_areas_32_smp : mix_areas_32;
if (cmov) {
- dmix->u.dmix.mix_areas3 = smp > 1 ? mix_areas3_smp_cmov : mix_areas3_cmov;
+ dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp_cmov : mix_areas_24_cmov;
} else {
- dmix->u.dmix.mix_areas3 = smp > 1 ? mix_areas3_smp: mix_areas3;
+ dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp: mix_areas_24;
}
}
/*
* for plain i386
*/
-static void MIX_AREAS1(unsigned int size,
- volatile signed short *dst, signed short *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_16(unsigned int size,
+ volatile signed short *dst, signed short *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned int old_ebx;
/*
* MMX optimized
*/
-static void MIX_AREAS1_MMX(unsigned int size,
- volatile signed short *dst, signed short *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_16_MMX(unsigned int size,
+ volatile signed short *dst, signed short *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned int old_ebx;
/*
* for plain i386, 32-bit version (24-bit resolution)
*/
-static void MIX_AREAS2(unsigned int size,
- volatile signed int *dst, signed int *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_32(unsigned int size,
+ volatile signed int *dst, signed int *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned int old_ebx;
/*
* 24-bit version for plain i386
*/
-static void MIX_AREAS3(unsigned int size,
- volatile unsigned char *dst, unsigned char *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_24(unsigned int size,
+ volatile unsigned char *dst, unsigned char *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned int old_ebx;
/*
* 24-bit version for Pentium Pro/II
*/
-static void MIX_AREAS3_CMOV(unsigned int size,
- volatile unsigned char *dst, unsigned char *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_24_CMOV(unsigned int size,
+ volatile unsigned char *dst, unsigned char *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned int old_ebx;
* optimized mixing code for x86-64
*/
-#define MIX_AREAS1 mix_areas1
-#define MIX_AREAS2 mix_areas2
-#define MIX_AREAS3 mix_areas3
+#define MIX_AREAS_16 mix_areas_16
+#define MIX_AREAS_32 mix_areas_32
+#define MIX_AREAS_24 mix_areas_24
#define LOCK_PREFIX ""
#include "pcm_dmix_x86_64.h"
-#undef MIX_AREAS1
-#undef MIX_AREAS2
-#undef MIX_AREAS3
+#undef MIX_AREAS_16
+#undef MIX_AREAS_32
+#undef MIX_AREAS_24
#undef LOCK_PREFIX
-#define MIX_AREAS1 mix_areas1_smp
-#define MIX_AREAS2 mix_areas2_smp
-#define MIX_AREAS3 mix_areas3_smp
+#define MIX_AREAS_16 mix_areas_16_smp
+#define MIX_AREAS_32 mix_areas_32_smp
+#define MIX_AREAS_24 mix_areas_24_smp
#define LOCK_PREFIX "lock ; "
#include "pcm_dmix_x86_64.h"
-#undef MIX_AREAS1
-#undef MIX_AREAS2
-#undef MIX_AREAS3
+#undef MIX_AREAS_16
+#undef MIX_AREAS_32
+#undef MIX_AREAS_24
#undef LOCK_PREFIX
#define x86_64_dmix_supported_format \
}
}
// printf("SMP: %i\n", smp);
- dmix->u.dmix.mix_areas1 = smp > 1 ? mix_areas1_smp : mix_areas1;
- dmix->u.dmix.mix_areas2 = smp > 1 ? mix_areas2_smp : mix_areas2;
- dmix->u.dmix.mix_areas3 = smp > 1 ? mix_areas3_smp : mix_areas3;
+ dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp : mix_areas_16;
+ dmix->u.dmix.mix_areas_32 = smp > 1 ? mix_areas_32_smp : mix_areas_32;
+ dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp : mix_areas_24;
}
/*
* MMX optimized
*/
-static void MIX_AREAS1(unsigned int size,
- volatile signed short *dst, signed short *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_16(unsigned int size,
+ volatile signed short *dst, signed short *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned long long old_rbx;
/*
* 32-bit version (24-bit resolution)
*/
-static void MIX_AREAS2(unsigned int size,
- volatile signed int *dst, signed int *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_32(unsigned int size,
+ volatile signed int *dst, signed int *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned long long old_rbx;
/*
* 24-bit version
*/
-static void MIX_AREAS3(unsigned int size,
- volatile unsigned char *dst, unsigned char *src,
- volatile signed int *sum, size_t dst_step,
- size_t src_step, size_t sum_step)
+static void MIX_AREAS_24(unsigned int size,
+ volatile unsigned char *dst, unsigned char *src,
+ volatile signed int *sum, size_t dst_step,
+ size_t src_step, size_t sum_step)
{
unsigned long long old_rbx;