effect_stereoreverse.c
上传用户:nini_0081
上传日期:2022-07-21
资源大小:2628k
文件大小:3k
源码类别:

多媒体编程

开发平台:

DOS

  1. /*
  2.     SDL_mixer:  An audio mixer library based on the SDL library
  3.     Copyright (C) 1997-2009 Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     This file by Ryan C. Gordon (icculus@icculus.org)
  16.     These are some internally supported special effects that use SDL_mixer's
  17.     effect callback API. They are meant for speed over quality.  :)
  18. */
  19. /* $Id: effect_stereoreverse.c 4211 2008-12-08 00:27:32Z slouken $ */
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include "SDL.h"
  23. #include "SDL_mixer.h"
  24. #define __MIX_INTERNAL_EFFECT__
  25. #include "effects_internal.h"
  26. /* profile code:
  27.     #include <sys/time.h>
  28.     #include <unistd.h>
  29.     struct timeval tv1;
  30.     struct timeval tv2;
  31.     
  32.     gettimeofday(&tv1, NULL);
  33.         ... do your thing here ...
  34.     gettimeofday(&tv2, NULL);
  35.     printf("%ldn", tv2.tv_usec - tv1.tv_usec);
  36. */
  37. /*
  38.  * Stereo reversal effect...this one's pretty straightforward...
  39.  */
  40. static void _Eff_reversestereo16(int chan, void *stream, int len, void *udata)
  41. {
  42.     /* 16 bits * 2 channels. */
  43.     Uint32 *ptr = (Uint32 *) stream;
  44.     int i;
  45.     for (i = 0; i < len; i += sizeof (Uint32), ptr++) {
  46.         *ptr = (((*ptr) & 0xFFFF0000) >> 16) | (((*ptr) & 0x0000FFFF) << 16);
  47.     }
  48. }
  49. static void _Eff_reversestereo8(int chan, void *stream, int len, void *udata)
  50. {
  51.     /* 8 bits * 2 channels. */
  52.     Uint32 *ptr = (Uint32 *) stream;
  53.     int i;
  54.     /* get the last two bytes if len is not divisible by four... */
  55.     if (len % sizeof (Uint32) != 0) {
  56.         Uint16 *p = (Uint16 *) (((Uint8 *) stream) + (len - 2));
  57.         *p = (Uint16)((((*p) & 0xFF00) >> 8) | (((*ptr) & 0x00FF) << 8));
  58.         len -= 2;
  59.     }
  60.     for (i = 0; i < len; i += sizeof (Uint32), ptr++) {
  61.         *ptr = (((*ptr) & 0x0000FF00) >> 8) | (((*ptr) & 0x000000FF) << 8) |
  62.                (((*ptr) & 0xFF000000) >> 8) | (((*ptr) & 0x00FF0000) << 8);
  63.     }
  64. }
  65. int Mix_SetReverseStereo(int channel, int flip)
  66. {
  67.     Mix_EffectFunc_t f = NULL;
  68.     int channels;
  69.     Uint16 format;
  70.     Mix_QuerySpec(NULL, &format, &channels);
  71.     if (channels == 2) {
  72.         if ((format & 0xFF) == 16)
  73.             f = _Eff_reversestereo16;
  74.         else if ((format & 0xFF) == 8)
  75.             f = _Eff_reversestereo8;
  76.         else {
  77.             Mix_SetError("Unsupported audio format");
  78.             return(0);
  79.         }
  80.         if (!flip) {
  81.             return(Mix_UnregisterEffect(channel, f));
  82.         } else {
  83.             return(Mix_RegisterEffect(channel, f, NULL, NULL));
  84.         }
  85.     }
  86.     return(1);
  87. }
  88. /* end of effect_stereoreverse.c ... */