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

多媒体编程

开发平台:

DOS

  1. /* 
  2.     TiMidity -- Experimental MIDI to WAVE converter
  3.     Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program 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
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15.     output.c
  16.     
  17.     Audio output (to file / device) functions.
  18. */
  19. #include "config.h"
  20. #include "output.h"
  21. #include "tables.h"
  22. #ifdef SDL
  23. extern PlayMode sdl_play_mode;
  24. #define DEFAULT_PLAY_MODE &sdl_play_mode
  25. #endif
  26. PlayMode *play_mode_list[] = {
  27. #ifdef DEFAULT_PLAY_MODE
  28.   DEFAULT_PLAY_MODE,
  29. #endif
  30.   0
  31. };
  32. #ifdef DEFAULT_PLAY_MODE
  33.   PlayMode *play_mode=DEFAULT_PLAY_MODE;
  34. #endif
  35. /*****************************************************************/
  36. /* Some functions to convert signed 32-bit data to other formats */
  37. void s32tos8(void *dp, int32 *lp, int32 c)
  38. {
  39.   int8 *cp=(int8 *)(dp);
  40.   int32 l;
  41.   while (c--)
  42.     {
  43.       l=(*lp++)>>(32-8-GUARD_BITS);
  44.       if (l>127) l=127;
  45.       else if (l<-128) l=-128;
  46.       *cp++ = (int8) (l);
  47.     }
  48. }
  49. void s32tou8(void *dp, int32 *lp, int32 c)
  50. {
  51.   uint8 *cp=(uint8 *)(dp);
  52.   int32 l;
  53.   while (c--)
  54.     {
  55.       l=(*lp++)>>(32-8-GUARD_BITS);
  56.       if (l>127) l=127;
  57.       else if (l<-128) l=-128;
  58.       *cp++ = 0x80 ^ ((uint8) l);
  59.     }
  60. }
  61. void s32tos16(void *dp, int32 *lp, int32 c)
  62. {
  63.   int16 *sp=(int16 *)(dp);
  64.   int32 l;
  65.   while (c--)
  66.     {
  67.       l=(*lp++)>>(32-16-GUARD_BITS);
  68.       if (l > 32767) l=32767;
  69.       else if (l<-32768) l=-32768;
  70.       *sp++ = (int16)(l);
  71.     }
  72. }
  73. void s32tou16(void *dp, int32 *lp, int32 c)
  74. {
  75.   uint16 *sp=(uint16 *)(dp);
  76.   int32 l;
  77.   while (c--)
  78.     {
  79.       l=(*lp++)>>(32-16-GUARD_BITS);
  80.       if (l > 32767) l=32767;
  81.       else if (l<-32768) l=-32768;
  82.       *sp++ = 0x8000 ^ (uint16)(l);
  83.     }
  84. }
  85. void s32tos16x(void *dp, int32 *lp, int32 c)
  86. {
  87.   int16 *sp=(int16 *)(dp);
  88.   int32 l;
  89.   while (c--)
  90.     {
  91.       l=(*lp++)>>(32-16-GUARD_BITS);
  92.       if (l > 32767) l=32767;
  93.       else if (l<-32768) l=-32768;
  94.       *sp++ = XCHG_SHORT((int16)(l));
  95.     }
  96. }
  97. void s32tou16x(void *dp, int32 *lp, int32 c)
  98. {
  99.   uint16 *sp=(uint16 *)(dp);
  100.   int32 l;
  101.   while (c--)
  102.     {
  103.       l=(*lp++)>>(32-16-GUARD_BITS);
  104.       if (l > 32767) l=32767;
  105.       else if (l<-32768) l=-32768;
  106.       *sp++ = XCHG_SHORT(0x8000 ^ (uint16)(l));
  107.     }
  108. }
  109. void s32toulaw(void *dp, int32 *lp, int32 c)
  110. {
  111.   uint8 *up=(uint8 *)(dp);
  112.   int32 l;
  113.   while (c--)
  114.     {
  115.       l=(*lp++)>>(32-13-GUARD_BITS);
  116.       if (l > 4095) l=4095;
  117.       else if (l<-4096) l=-4096;
  118.       *up++ = _l2u[l];
  119.     }
  120. }