Diff for /np2/x11/soundmng.c between versions 1.2 and 1.6

version 1.2, 2003/11/18 14:32:48 version 1.6, 2004/06/26 15:48:35
Line 94  static BOOL nosound_setup(void); Line 94  static BOOL nosound_setup(void);
   
 static void PARTSCALL (*fnmix)(SINT16* dst, const SINT32* src, UINT size);  static void PARTSCALL (*fnmix)(SINT16* dst, const SINT32* src, UINT size);
   
 #if defined(__GNUC__) && (defined(i386) || defined(__i386__))  #if defined(GCC_CPU_ARCH_IA32)
 void PARTSCALL _saturation_s16(SINT16 *dst, const SINT32 *src, UINT size);  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_s16x(SINT16 *dst, const SINT32 *src, UINT size);
 void PARTSCALL saturation_s16mmx(SINT16 *dst, const SINT32 *src, UINT size);  void PARTSCALL saturation_s16mmx(SINT16 *dst, const SINT32 *src, UINT size);
Line 224  UINT Line 224  UINT
 soundmng_create(UINT rate, UINT bufmsec)  soundmng_create(UINT rate, UINT bufmsec)
 {  {
         UINT samples;          UINT samples;
 #if defined(VERMOUTH_LIB)  
         UINT num;  
 #endif  
   
         if (opened || ((rate != 11025) && (rate != 22050) && (rate != 44100))) {          if (opened || ((rate != 11025) && (rate != 22050) && (rate != 44100))) {
                 return 0;                  return 0;
Line 252  soundmng_create(UINT rate, UINT bufmsec) Line 249  soundmng_create(UINT rate, UINT bufmsec)
   
 #if defined(VERMOUTH_LIB)  #if defined(VERMOUTH_LIB)
         vermouth_module = midimod_create(rate);          vermouth_module = midimod_create(rate);
         for (num = 0; num < 128; num++) {          midimod_loadall(vermouth_module);
                 midimod_loadprogram(vermouth_module, num);  
                 midimod_loadrhythm(vermouth_module, num);  
         }  
 #endif  #endif
   
         soundmng_setreverse(FALSE);          soundmng_setreverse(FALSE);
Line 355  void Line 349  void
 soundmng_setreverse(BOOL reverse)  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 (!reverse) {
                 if (mmxflag & (MMXFLAG_NOTSUPPORT|MMXFLAG_DISABLE)) {                  if (mmxflag & (MMXFLAG_NOTSUPPORT|MMXFLAG_DISABLE)) {
                         fnmix = _saturation_s16;                          fnmix = _saturation_s16;
Line 606  buffer_play(void *arg) Line 610  buffer_play(void *arg)
         size_t len = opna_frame;          size_t len = opna_frame;
         size_t s;          size_t s;
         ssize_t r;          ssize_t r;
           int nextbuf;
   
         UNUSED(arg);          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;          is_proc = TRUE;
         while (is_proc) {          while (is_proc) {
                   nextbuf = sound_nextbuf;
                 if (sound_event)                  if (sound_event)
                         memset(sound_event, 0, len);                          memset(sound_event, 0, len);
                 memcpy(buf, sound_buffer[sound_nextbuf], len);  
                 sound_nextbuf = (sound_nextbuf + 1) % NSOUNDBUFFER;                  sound_nextbuf = (sound_nextbuf + 1) % NSOUNDBUFFER;
                 sound_event = sound_buffer[sound_nextbuf];                  sound_event = sound_buffer[sound_nextbuf];
   
                   buf = sound_buffer[nextbuf];
                 s = 0;                  s = 0;
                 for (;;) {                  for (;;) {
                         r = write(audio_fd, buf + s, len - s);                          r = write(audio_fd, buf + s, len - s);
Line 633  buffer_play(void *arg) Line 633  buffer_play(void *arg)
                         }                          }
                 }                  }
         }          }
         _MFREE(buf);  
         is_proc = FALSE;          is_proc = FALSE;
   
         return NULL;          return NULL;
Line 657  snddrv_stop(void) Line 656  snddrv_stop(void)
   
 #endif  /* USE_NETBSDAUDIO || USE_OSSAUDIO || USE_ESDAUDIO */  #endif  /* USE_NETBSDAUDIO || USE_OSSAUDIO || USE_ESDAUDIO */
   
 #if defined(__GNUC__) && (defined(i386) || defined(__i386__))  #if defined(GCC_CPU_ARCH_AMD64)
   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  void PARTSCALL
 _saturation_s16(SINT16 *dst, const SINT32 *src, UINT size)  _saturation_s16(SINT16 *dst, const SINT32 *src, UINT size)
 {  {
Line 757  saturation_s16mmx(SINT16 *dst, const SIN Line 782  saturation_s16mmx(SINT16 *dst, const SIN
                 : /* output */                  : /* output */
                 : "m" (dst), "m" (src), "m" (size));                  : "m" (dst), "m" (src), "m" (size));
 }  }
 #endif  /* __GNUC__ && (i386 || __i386__) */  #endif  /* GCC_CPU_ARCH_AMD64 */
   
 #endif  /* !NOSOUND */  #endif  /* !NOSOUND */

Removed from v.1.2  
changed lines
  Added in v.1.6


RetroPC.NET-CVS <cvs@retropc.net>