drv_sgi.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* MikMod sound library
  2. (c) 1998, 1999, 2000 Miodrag Vallat and others - see file AUTHORS for
  3. complete list.
  4. This library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of
  7. the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. GNU Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with this library; if not, write to the Free Software
  16. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  17. 02111-1307, USA.
  18. */
  19.   
  20. /*==============================================================================
  21.   $Id: drv_sgi.c,v 1.2 2004/01/31 22:39:40 raph Exp $
  22.   Driver for output on SGI audio system (needs libaudio from the dmedia
  23.   package).
  24. ==============================================================================*/
  25. /*
  26. Written by Stephan Kanthak <kanthak@i6.informatik.rwth-aachen.de>
  27. Fragment configuration:
  28. =======================
  29. You can use the driver options fragsize and bufsize to override the
  30. default size of the audio buffer. If you experience crackles & pops,
  31. try experimenting with these values.
  32. Please read the SGI section of libmikmod's README file first before
  33. contacting the author because there are some things to know about the
  34. specials of the SGI audio driver.
  35. */
  36. #ifdef HAVE_CONFIG_H
  37. #include "config.h"
  38. #endif
  39. #include "mikmod_internals.h"
  40. #ifdef DRV_SGI
  41. #ifdef HAVE_UNISTD_H
  42. #include <unistd.h>
  43. #endif
  44. #include <stdio.h>
  45. #include <stdlib.h>
  46. #include <dmedia/audio.h>
  47. #define DEFAULT_SGI_FRAGSIZE  20000
  48. #define DEFAULT_SGI_BUFSIZE   40000
  49. static ALconfig sgi_config;
  50. static ALport sgi_port;
  51. static int sample_factor;
  52. static int sgi_fragsize=DEFAULT_SGI_FRAGSIZE;
  53. static int sgi_bufsize=DEFAULT_SGI_BUFSIZE;
  54. static SBYTE *audiobuffer=NULL;
  55. static void SGI_CommandLine(CHAR *cmdline)
  56. {
  57. CHAR *ptr;
  58. if ((ptr=MD_GetAtom("fragsize",cmdline,0))) {
  59. sgi_fragsize=atol(ptr);
  60. free(ptr);
  61. } else sgi_fragsize=DEFAULT_SGI_FRAGSIZE;
  62. if ((ptr=MD_GetAtom("bufsize",cmdline,0))) {
  63. sgi_bufsize=atol(ptr);
  64. free(ptr);
  65. } else sgi_bufsize=DEFAULT_SGI_BUFSIZE;
  66. }
  67. static BOOL SGI_IsThere(void)
  68. {
  69. ALseterrorhandler(0);
  70. return(ALqueryparams(AL_DEFAULT_DEVICE,0,0))?1:0;
  71. }
  72. static BOOL SGI_Init(void)
  73. {
  74. long chpars[] = { AL_OUTPUT_RATE, AL_RATE_22050 };
  75. switch(md_mixfreq) {
  76. case 8000:
  77. chpars[1] = AL_RATE_8000;
  78. break;
  79. case 11025:
  80. chpars[1] = AL_RATE_11025;
  81. break;
  82. case 16000:
  83. chpars[1] = AL_RATE_16000;
  84. break;
  85. case 22050:
  86. chpars[1] = AL_RATE_22050;
  87. break;
  88. case 32000:
  89. chpars[1] = AL_RATE_32000;
  90. break;
  91. case 44100:
  92. chpars[1] = AL_RATE_44100;
  93. break;
  94. case 48000:
  95. chpars[1] = AL_RATE_48000;
  96. break;
  97. default:
  98. _mm_errno=MMERR_SGI_SPEED;
  99. return 1;
  100. }
  101. ALseterrorhandler(0);
  102. ALsetparams(AL_DEFAULT_DEVICE, chpars, 2);
  103. if (!(sgi_config=ALnewconfig())) {
  104. _mm_errno=MMERR_OPENING_AUDIO;
  105. return 1;
  106. }
  107. if (md_mode&DMODE_16BITS) {
  108. if (ALsetwidth(sgi_config,AL_SAMPLE_16)<0) {
  109. _mm_errno=MMERR_SGI_16BIT;
  110. return 1;
  111. }
  112. sample_factor = 1;
  113. } else {
  114. if (ALsetwidth(sgi_config,AL_SAMPLE_8)<0) {
  115. _mm_errno=MMERR_SGI_8BIT;
  116. return 1;
  117. }
  118. sample_factor = 0;
  119. }
  120. if (md_mode&DMODE_STEREO) {
  121. if (ALsetchannels(sgi_config,AL_STEREO)<0) {
  122. _mm_errno=MMERR_SGI_STEREO;
  123. return 1;
  124. }
  125. } else {
  126. if (ALsetchannels(sgi_config,AL_MONO)<0) {
  127. _mm_errno=MMERR_SGI_MONO;
  128. return 1;
  129. }
  130. }
  131. if ((getenv("MM_SGI_FRAGSIZE"))&&(sgi_fragsize!=DEFAULT_SGI_FRAGSIZE))
  132. sgi_fragsize=atol(getenv("MM_SGI_FRAGSIZE"));
  133. if (!sgi_fragsize) sgi_fragsize=DEFAULT_SGI_FRAGSIZE;
  134. if ((getenv("MM_SGI_BUFSIZE"))&&(sgi_bufsize!=DEFAULT_SGI_BUFSIZE))
  135. sgi_bufsize=atol(getenv("MM_SGI_BUFSIZE"));
  136. if (!sgi_bufsize) sgi_fragsize=DEFAULT_SGI_BUFSIZE;
  137. ALsetqueuesize(sgi_config, sgi_bufsize);
  138. if (!(sgi_port=ALopenport("libmikmod","w",sgi_config))) {
  139. _mm_errno=MMERR_OPENING_AUDIO;
  140. return 1;
  141. }
  142. if(!(audiobuffer=(SBYTE*)_mm_malloc(sgi_fragsize))) return 1;
  143. return VC_Init();
  144. }
  145. static void SGI_Exit(void)
  146. {
  147. VC_Exit();
  148. _mm_free(audiobuffer);
  149. }
  150. static void SGI_Update(void)
  151. {
  152. ALwritesamps(sgi_port,audiobuffer,
  153.              VC_WriteBytes(audiobuffer,sgi_fragsize)>>sample_factor);
  154. }
  155. MIKMODAPI MDRIVER drv_sgi={
  156. NULL,
  157. "SGI Audio System",
  158. "SGI Audio System driver v0.5",
  159. 0,255,
  160. "sgi",
  161. "fragsize:r:0,99999,20000:Sound buffer fragment sizen"
  162.         "bufsize:r:0,199999,40000:Sound buffer total sizen",
  163. SGI_CommandLine,
  164. SGI_IsThere,
  165. VC_SampleLoad,
  166. VC_SampleUnload,
  167. VC_SampleSpace,
  168. VC_SampleLength,
  169. SGI_Init,
  170. SGI_Exit,
  171. NULL,
  172. VC_SetNumVoices,
  173. VC_PlayStart,
  174. VC_PlayStop,
  175. SGI_Update,
  176. NULL,
  177. VC_VoiceSetVolume,
  178. VC_VoiceGetVolume,
  179. VC_VoiceSetFrequency,
  180. VC_VoiceGetFrequency,
  181. VC_VoiceSetPanning,
  182. VC_VoiceGetPanning,
  183. VC_VoicePlay,
  184. VC_VoiceStop,
  185. VC_VoiceStopped,
  186. VC_VoiceGetPosition,
  187. VC_VoiceRealVolume
  188. };
  189. #else
  190. MISSING(drv_sgi);
  191. #endif
  192. /* ex:set ts=4: */