1d5ac70f0Sopenharmony_ci/* 2d5ac70f0Sopenharmony_ci * optimized mixing code for i386 3d5ac70f0Sopenharmony_ci */ 4d5ac70f0Sopenharmony_ci 5d5ac70f0Sopenharmony_ci#define MIX_AREAS_16 mix_areas_16 6d5ac70f0Sopenharmony_ci#define MIX_AREAS_16_MMX mix_areas_16_mmx 7d5ac70f0Sopenharmony_ci#define MIX_AREAS_32 mix_areas_32 8d5ac70f0Sopenharmony_ci#define MIX_AREAS_24 mix_areas_24 9d5ac70f0Sopenharmony_ci#define MIX_AREAS_24_CMOV mix_areas_24_cmov 10d5ac70f0Sopenharmony_ci#define LOCK_PREFIX "" 11d5ac70f0Sopenharmony_ci#define XADD "addl" 12d5ac70f0Sopenharmony_ci#define XSUB "subl" 13d5ac70f0Sopenharmony_ci#include "pcm_dmix_i386.h" 14d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16 15d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16_MMX 16d5ac70f0Sopenharmony_ci#undef MIX_AREAS_32 17d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24 18d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24_CMOV 19d5ac70f0Sopenharmony_ci#undef LOCK_PREFIX 20d5ac70f0Sopenharmony_ci#undef XADD 21d5ac70f0Sopenharmony_ci#undef XSUB 22d5ac70f0Sopenharmony_ci 23d5ac70f0Sopenharmony_ci#define MIX_AREAS_16 remix_areas_16 24d5ac70f0Sopenharmony_ci#define MIX_AREAS_16_MMX remix_areas_16_mmx 25d5ac70f0Sopenharmony_ci#define MIX_AREAS_32 remix_areas_32 26d5ac70f0Sopenharmony_ci#define MIX_AREAS_24 remix_areas_24 27d5ac70f0Sopenharmony_ci#define MIX_AREAS_24_CMOV remix_areas_24_cmov 28d5ac70f0Sopenharmony_ci#define LOCK_PREFIX "" 29d5ac70f0Sopenharmony_ci#define XADD "subl" 30d5ac70f0Sopenharmony_ci#define XSUB "addl" 31d5ac70f0Sopenharmony_ci#include "pcm_dmix_i386.h" 32d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16 33d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16_MMX 34d5ac70f0Sopenharmony_ci#undef MIX_AREAS_32 35d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24 36d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24_CMOV 37d5ac70f0Sopenharmony_ci#undef LOCK_PREFIX 38d5ac70f0Sopenharmony_ci#undef XADD 39d5ac70f0Sopenharmony_ci#undef XSUB 40d5ac70f0Sopenharmony_ci 41d5ac70f0Sopenharmony_ci#define MIX_AREAS_16 mix_areas_16_smp 42d5ac70f0Sopenharmony_ci#define MIX_AREAS_16_MMX mix_areas_16_smp_mmx 43d5ac70f0Sopenharmony_ci#define MIX_AREAS_32 mix_areas_32_smp 44d5ac70f0Sopenharmony_ci#define MIX_AREAS_24 mix_areas_24_smp 45d5ac70f0Sopenharmony_ci#define MIX_AREAS_24_CMOV mix_areas_24_smp_cmov 46d5ac70f0Sopenharmony_ci#define LOCK_PREFIX "lock ; " 47d5ac70f0Sopenharmony_ci#define XADD "addl" 48d5ac70f0Sopenharmony_ci#define XSUB "subl" 49d5ac70f0Sopenharmony_ci#include "pcm_dmix_i386.h" 50d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16 51d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16_MMX 52d5ac70f0Sopenharmony_ci#undef MIX_AREAS_32 53d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24 54d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24_CMOV 55d5ac70f0Sopenharmony_ci#undef LOCK_PREFIX 56d5ac70f0Sopenharmony_ci#undef XADD 57d5ac70f0Sopenharmony_ci#undef XSUB 58d5ac70f0Sopenharmony_ci 59d5ac70f0Sopenharmony_ci#define MIX_AREAS_16 remix_areas_16_smp 60d5ac70f0Sopenharmony_ci#define MIX_AREAS_16_MMX remix_areas_16_smp_mmx 61d5ac70f0Sopenharmony_ci#define MIX_AREAS_32 remix_areas_32_smp 62d5ac70f0Sopenharmony_ci#define MIX_AREAS_24 remix_areas_24_smp 63d5ac70f0Sopenharmony_ci#define MIX_AREAS_24_CMOV remix_areas_24_smp_cmov 64d5ac70f0Sopenharmony_ci#define LOCK_PREFIX "lock ; " 65d5ac70f0Sopenharmony_ci#define XADD "subl" 66d5ac70f0Sopenharmony_ci#define XSUB "addl" 67d5ac70f0Sopenharmony_ci#include "pcm_dmix_i386.h" 68d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16 69d5ac70f0Sopenharmony_ci#undef MIX_AREAS_16_MMX 70d5ac70f0Sopenharmony_ci#undef MIX_AREAS_32 71d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24 72d5ac70f0Sopenharmony_ci#undef MIX_AREAS_24_CMOV 73d5ac70f0Sopenharmony_ci#undef LOCK_PREFIX 74d5ac70f0Sopenharmony_ci#undef XADD 75d5ac70f0Sopenharmony_ci#undef XSUB 76d5ac70f0Sopenharmony_ci 77d5ac70f0Sopenharmony_ci#define i386_dmix_supported_format \ 78d5ac70f0Sopenharmony_ci ((1ULL << SND_PCM_FORMAT_S16_LE) |\ 79d5ac70f0Sopenharmony_ci (1ULL << SND_PCM_FORMAT_S32_LE) |\ 80d5ac70f0Sopenharmony_ci (1ULL << SND_PCM_FORMAT_S24_LE) |\ 81d5ac70f0Sopenharmony_ci (1ULL << SND_PCM_FORMAT_S24_3LE)) 82d5ac70f0Sopenharmony_ci 83d5ac70f0Sopenharmony_ci#define dmix_supported_format \ 84d5ac70f0Sopenharmony_ci (i386_dmix_supported_format | generic_dmix_supported_format) 85d5ac70f0Sopenharmony_ci 86d5ac70f0Sopenharmony_cistatic void mix_select_callbacks(snd_pcm_direct_t *dmix) 87d5ac70f0Sopenharmony_ci{ 88d5ac70f0Sopenharmony_ci static int smp = 0, mmx = 0, cmov = 0; 89d5ac70f0Sopenharmony_ci 90d5ac70f0Sopenharmony_ci if (!dmix->direct_memory_access) { 91d5ac70f0Sopenharmony_ci generic_mix_select_callbacks(dmix); 92d5ac70f0Sopenharmony_ci return; 93d5ac70f0Sopenharmony_ci } 94d5ac70f0Sopenharmony_ci 95d5ac70f0Sopenharmony_ci if (!((1ULL<< dmix->shmptr->s.format) & i386_dmix_supported_format)) { 96d5ac70f0Sopenharmony_ci generic_mix_select_callbacks(dmix); 97d5ac70f0Sopenharmony_ci return; 98d5ac70f0Sopenharmony_ci } 99d5ac70f0Sopenharmony_ci 100d5ac70f0Sopenharmony_ci if (!smp) { 101d5ac70f0Sopenharmony_ci FILE *in; 102d5ac70f0Sopenharmony_ci char line[255]; 103d5ac70f0Sopenharmony_ci 104d5ac70f0Sopenharmony_ci /* try to determine the capabilities of the CPU */ 105d5ac70f0Sopenharmony_ci in = fopen("/proc/cpuinfo", "r"); 106d5ac70f0Sopenharmony_ci if (in) { 107d5ac70f0Sopenharmony_ci while (!feof(in) && (fgets(line, sizeof(line), in) != NULL)) { 108d5ac70f0Sopenharmony_ci if (!strncmp(line, "processor", 9)) 109d5ac70f0Sopenharmony_ci smp++; 110d5ac70f0Sopenharmony_ci else if (!strncmp(line, "flags", 5)) { 111d5ac70f0Sopenharmony_ci if (strstr(line, " mmx")) 112d5ac70f0Sopenharmony_ci mmx = 1; 113d5ac70f0Sopenharmony_ci if (strstr(line, " cmov")) 114d5ac70f0Sopenharmony_ci cmov = 1; 115d5ac70f0Sopenharmony_ci } 116d5ac70f0Sopenharmony_ci } 117d5ac70f0Sopenharmony_ci fclose(in); 118d5ac70f0Sopenharmony_ci } 119d5ac70f0Sopenharmony_ci } 120d5ac70f0Sopenharmony_ci 121d5ac70f0Sopenharmony_ci if (mmx) { 122d5ac70f0Sopenharmony_ci dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp_mmx : mix_areas_16_mmx; 123d5ac70f0Sopenharmony_ci dmix->u.dmix.remix_areas_16 = smp > 1 ? remix_areas_16_smp_mmx : remix_areas_16_mmx; 124d5ac70f0Sopenharmony_ci } else { 125d5ac70f0Sopenharmony_ci dmix->u.dmix.mix_areas_16 = smp > 1 ? mix_areas_16_smp : mix_areas_16; 126d5ac70f0Sopenharmony_ci dmix->u.dmix.remix_areas_16 = smp > 1 ? remix_areas_16_smp : remix_areas_16; 127d5ac70f0Sopenharmony_ci } 128d5ac70f0Sopenharmony_ci dmix->u.dmix.mix_areas_32 = smp > 1 ? mix_areas_32_smp : mix_areas_32; 129d5ac70f0Sopenharmony_ci dmix->u.dmix.remix_areas_32 = smp > 1 ? remix_areas_32_smp : remix_areas_32; 130d5ac70f0Sopenharmony_ci if (cmov) { 131d5ac70f0Sopenharmony_ci dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp_cmov : mix_areas_24_cmov; 132d5ac70f0Sopenharmony_ci dmix->u.dmix.remix_areas_24 = smp > 1 ? remix_areas_24_smp_cmov : remix_areas_24_cmov; 133d5ac70f0Sopenharmony_ci } else { 134d5ac70f0Sopenharmony_ci dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp: mix_areas_24; 135d5ac70f0Sopenharmony_ci dmix->u.dmix.remix_areas_24 = smp > 1 ? remix_areas_24_smp: remix_areas_24; 136d5ac70f0Sopenharmony_ci } 137d5ac70f0Sopenharmony_ci dmix->u.dmix.use_sem = 0; 138d5ac70f0Sopenharmony_ci} 139