effects_internal.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 helper functions for the internal mixer special effects.
  17. */
  18. /* $Id: effects_internal.c 4211 2008-12-08 00:27:32Z slouken $ */
  19.      /* ------ These are used internally only. Don't touch. ------ */
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include "SDL_mixer.h"
  23. #define __MIX_INTERNAL_EFFECT__
  24. #include "effects_internal.h"
  25. /* Should we favor speed over memory usage and/or quality of output? */
  26. int _Mix_effects_max_speed = 0;
  27. void _Mix_InitEffects(void)
  28. {
  29.     _Mix_effects_max_speed = (getenv(MIX_EFFECTSMAXSPEED) != NULL);
  30. }
  31. void _Mix_DeinitEffects(void)
  32. {
  33.     _Eff_PositionDeinit();
  34. }
  35. void *_Eff_volume_table = NULL;
  36. /* Build the volume table for Uint8-format samples.
  37.  *
  38.  * Each column of the table is a possible sample, while each row of the
  39.  *  table is a volume. Volume is a Uint8, where 0 is silence and 255 is full
  40.  *  volume. So _Eff_volume_table[128][mysample] would be the value of
  41.  *  mysample, at half volume.
  42.  */
  43. void *_Eff_build_volume_table_u8(void)
  44. {
  45.     int volume;
  46.     int sample;
  47.     Uint8 *rc;
  48.     if (!_Mix_effects_max_speed) {
  49.         return(NULL);
  50.     }
  51.     if (!_Eff_volume_table) {
  52.         rc = malloc(256 * 256);
  53.         if (rc) {
  54.             _Eff_volume_table = (void *) rc;
  55.             for (volume = 0; volume < 256; volume++) {
  56.                 for (sample = -128; sample < 128; sample ++) {
  57.                     *rc = (Uint8)(((float) sample) * ((float) volume / 255.0)) 
  58.                         + 128;
  59.                     rc++;
  60.                 }
  61.             }
  62.         }
  63.     }
  64.     return(_Eff_volume_table);
  65. }
  66. /* Build the volume table for Sint8-format samples.
  67.  *
  68.  * Each column of the table is a possible sample, while each row of the
  69.  *  table is a volume. Volume is a Uint8, where 0 is silence and 255 is full
  70.  *  volume. So _Eff_volume_table[128][mysample+128] would be the value of
  71.  *  mysample, at half volume.
  72.  */
  73. void *_Eff_build_volume_table_s8(void)
  74. {
  75.     int volume;
  76.     int sample;
  77.     Sint8 *rc;
  78.     if (!_Eff_volume_table) {
  79.         rc = malloc(256 * 256);
  80.         if (rc) {
  81.             _Eff_volume_table = (void *) rc;
  82.             for (volume = 0; volume < 256; volume++) {
  83.                 for (sample = -128; sample < 128; sample ++) {
  84.                     *rc = (Sint8)(((float) sample) * ((float) volume / 255.0));
  85.                     rc++;
  86.                 }
  87.             }
  88.         }
  89.     }
  90.     return(_Eff_volume_table);
  91. }
  92. /* end of effects.c ... */