--- np2/x11/soundmng.c 2003/11/16 16:43:45 1.1 +++ np2/x11/soundmng.c 2004/07/26 15:54:18 1.8 @@ -94,10 +94,10 @@ static BOOL nosound_setup(void); static void PARTSCALL (*fnmix)(SINT16* dst, const SINT32* src, UINT size); -#if defined(__GNUC__) && (defined(i386) || defined(__i386__)) -void PARTSCALL _satuation_s16(SINT16 *dst, const SINT32 *src, UINT size); -void PARTSCALL _satuation_s16x(SINT16 *dst, const SINT32 *src, UINT size); -void PARTSCALL satuation_s16mmx(SINT16 *dst, const SINT32 *src, UINT size); +#if defined(GCC_CPU_ARCH_IA32) +void PARTSCALL _saturation_s16(SINT16 *dst, const SINT32 *src, UINT size); +void PARTSCALL _saturation_s16x(SINT16 *dst, const SINT32 *src, UINT size); +void PARTSCALL saturation_s16mmx(SINT16 *dst, const SINT32 *src, UINT size); #endif /* @@ -141,7 +141,7 @@ calc_fragment(UINT size) return f; } -void +static void snddrv_setup(void) { @@ -224,21 +224,17 @@ UINT soundmng_create(UINT rate, UINT bufmsec) { UINT samples; -#if defined(VERMOUTH_LIB) - UINT num; -#endif if (opened || ((rate != 11025) && (rate != 22050) && (rate != 44100))) { return 0; } - snddrv_setup(); - - if (bufmsec < 50) { - bufmsec = 50; - } else if (bufmsec > 1000) { + if (bufmsec < 20) + bufmsec = 20; + else if (bufmsec > 1000) bufmsec = 1000; - } + + snddrv_setup(); samples = (rate * bufmsec) / 1000 / 2; samples = calc_blocksize(samples); @@ -253,10 +249,7 @@ soundmng_create(UINT rate, UINT bufmsec) #if defined(VERMOUTH_LIB) vermouth_module = midimod_create(rate); - for (num = 0; num < 128; num++) { - midimod_loadprogram(vermouth_module, num); - midimod_loadrhythm(vermouth_module, num); - } + midimod_loadall(vermouth_module); #endif soundmng_setreverse(FALSE); @@ -293,6 +286,7 @@ soundmng_destroy(void) (*snddrv.sndstop)(); (*snddrv.drvterm)(); buffer_destroy(); + nosound_setup(); audio_fd = -1; opened = FALSE; } @@ -355,15 +349,25 @@ void soundmng_setreverse(BOOL reverse) { -#if defined(__GNUC__) && (defined(i386) || defined(__i386__)) +#if defined(GCC_CPU_ARCH_AMD64) + if (!reverse) { + if (mmxflag & (MMXFLAG_NOTSUPPORT|MMXFLAG_DISABLE)) { + fnmix = satuation_s16; + } else { + fnmix = saturation_s16mmx; + } + } else { + fnmix = satuation_s16x; + } +#elif defined(GCC_CPU_ARCH_IA32) if (!reverse) { if (mmxflag & (MMXFLAG_NOTSUPPORT|MMXFLAG_DISABLE)) { - fnmix = _satuation_s16; + fnmix = _saturation_s16; } else { - fnmix = satuation_s16mmx; + fnmix = saturation_s16mmx; } } else { - fnmix = _satuation_s16x; + fnmix = _saturation_s16x; } #else if (!reverse) { @@ -606,23 +610,19 @@ buffer_play(void *arg) size_t len = opna_frame; size_t s; ssize_t r; + int nextbuf; UNUSED(arg); - buf = (char *)_MALLOC(len, "sound playing buf"); - if (buf == NULL) { - fprintf(stderr, "buffer_play: can't alloc memory\n"); - return NULL; - } - is_proc = TRUE; while (is_proc) { + nextbuf = sound_nextbuf; if (sound_event) memset(sound_event, 0, len); - memcpy(buf, sound_buffer[sound_nextbuf], len); sound_nextbuf = (sound_nextbuf + 1) % NSOUNDBUFFER; sound_event = sound_buffer[sound_nextbuf]; + buf = sound_buffer[nextbuf]; s = 0; for (;;) { r = write(audio_fd, buf + s, len - s); @@ -633,7 +633,6 @@ buffer_play(void *arg) } } } - _MFREE(buf); is_proc = FALSE; return NULL; @@ -657,9 +656,109 @@ snddrv_stop(void) #endif /* USE_NETBSDAUDIO || USE_OSSAUDIO || USE_ESDAUDIO */ -#if defined(__GNUC__) && (defined(i386) || defined(__i386__)) +#if defined(GCC_CPU_ARCH_AMD64) +void PARTSCALL +_saturation_s16(SINT16 *dst, const SINT32 *src, UINT size) +{ + asm volatile ( + "movq %0, %%rcx;" + "movq %1, %%rdx;" + "movl %2, %%ebx;" + "shrl $1, %%ebx;" + "je .ss16_ed;" + ".ss16_lp:" + "movl (%%rdx), %%eax;" + "cmpl $0x000008000, %%eax;" + "jl .ss16_min;" + "movw $0x7fff, %%ax;" + "jmp .ss16_set;" + ".ss16_min:" + "cmpl $0x0ffff8000, %%eax;" + "jg .ss16_set;" + "movw $0x8001, %%ax;" + ".ss16_set:" + "leal 4(%%rdx), %%edx;" + "movw %%ax, (%%rcx);" + "decl %%ebx;" + "leal 2(%%rcx), %%ecx;" + "jne .ss16_lp;" + ".ss16_ed:" + : /* output */ + : "m" (dst), "m" (src), "m" (size) + : "ebx"); +} + +void PARTSCALL +_saturation_s16x(SINT16 *dst, const SINT32 *src, UINT size) +{ + + asm volatile ( + "movq %0, %%rcx;" + "movq %1, %%rdx;" + "movl %2, %%ebx;" + "shrl $2, %%ebx;" + "je .ss16x_ed;" + ".ss16x_lp:" + "movl (%%rdx), %%eax;" + "cmpl $0x000008000, %%eax;" + "jl .ss16xl_min;" + "movw $0x7fff, %%ax;" + "jmp .ss16xl_set;" + ".ss16xl_min:" + "cmpl $0x0ffff8000, %%eax;" + "jg .ss16xl_set;" + "movw $0x8001, %%ax;" + ".ss16xl_set:" + "movw %%ax, 2(%%rcx);" + "movl 4(%%rdx), %%eax;" + "cmpl $0x000008000, %%eax;" + "jl .ss16xr_min;" + "movw $0x7fff, %%ax;" + "jmp .ss16xr_set;" + ".ss16xr_min:" + "cmpl $0x0ffff8000, %%eax;" + "jg .ss16xr_set;" + "mov $0x8001, %%ax;" + ".ss16xr_set:" + "movw %%ax, (%%rcx);" + "leal 8(%%rdx), %%edx;" + "decl %%ebx;" + "leal 4(%%rcx), %%ecx;" + "jne .ss16x_lp;" + ".ss16x_ed:" + : /* output */ + : "m" (dst), "m" (src), "m" (size) + : "ebx"); +} + +void PARTSCALL +saturation_s16mmx(SINT16 *dst, const SINT32 *src, UINT size) +{ + + asm volatile ( + "movq %0, %%rcx;" + "movq %1, %%rdx;" + "movl %2, %%eax;" + "shrl $3, %%eax;" + "je .ss16m_ed;" + "pxor %%mm0, %%mm0;" + ".ss16m_lp:" + "movq (%%rdx), %%mm1;" + "movq 8(%%rdx), %%mm2;" + "packssdw %%mm2, %%mm1;" + "leaq 16(%%rdx), %%rdx;" + "movq %%mm1, (%%rcx);" + "leaq 8(%%rcx), %%rcx;" + "dec %%eax;" + "jne .ss16m_lp;" + "emms;" + ".ss16m_ed:" + : /* output */ + : "m" (dst), "m" (src), "m" (size)); +} +#elif defined(GCC_CPU_ARCH_IA32) void PARTSCALL -_satuation_s16(SINT16 *dst, const SINT32 *src, UINT size) +_saturation_s16(SINT16 *dst, const SINT32 *src, UINT size) { asm volatile ( "movl %0, %%ecx;" @@ -690,7 +789,7 @@ _satuation_s16(SINT16 *dst, const SINT32 } void PARTSCALL -_satuation_s16x(SINT16 *dst, const SINT32 *src, UINT size) +_saturation_s16x(SINT16 *dst, const SINT32 *src, UINT size) { asm volatile ( @@ -733,7 +832,7 @@ _satuation_s16x(SINT16 *dst, const SINT3 } void PARTSCALL -satuation_s16mmx(SINT16 *dst, const SINT32 *src, UINT size) +saturation_s16mmx(SINT16 *dst, const SINT32 *src, UINT size) { asm volatile ( @@ -757,6 +856,6 @@ satuation_s16mmx(SINT16 *dst, const SINT : /* output */ : "m" (dst), "m" (src), "m" (size)); } -#endif /* __GNUC__ && (i386 || __i386__) */ +#endif /* GCC_CPU_ARCH_AMD64 */ #endif /* !NOSOUND */