SDL_irixaudio.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998  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.     Sam Lantinga
  16.     5635-34 Springhouse Dr.
  17.     Pleasanton, CA 94588 (USA)
  18.     slouken@libsdl.org
  19. */
  20. #ifdef SAVE_RCSID
  21. static char rcsid =
  22.  "@(#) $Id: SDL_irixaudio.c,v 1.4 2002/04/22 21:38:02 wmay Exp $";
  23. #endif
  24. /* Allow access to a raw mixing buffer (For IRIX 6.5 and higher) */
  25. #include <stdlib.h>
  26. #include "SDL_endian.h"
  27. #include "SDL_timer.h"
  28. #include "SDL_audio.h"
  29. #include "SDL_audiomem.h"
  30. #include "SDL_audio_c.h"
  31. #include "SDL_irixaudio.h"
  32. /* Audio driver functions */
  33. static int AL_OpenAudio(_THIS, SDL_AudioSpec *spec);
  34. static void AL_WaitAudio(_THIS);
  35. static void AL_PlayAudio(_THIS);
  36. static Uint8 *AL_GetAudioBuf(_THIS);
  37. static void AL_CloseAudio(_THIS);
  38. /* Audio driver bootstrap functions */
  39. static int Audio_Available(void)
  40. {
  41. return 1;
  42. }
  43. static void Audio_DeleteDevice(SDL_AudioDevice *device)
  44. {
  45. free(device->hidden);
  46. free(device);
  47. }
  48. static SDL_AudioDevice *Audio_CreateDevice(int devindex)
  49. {
  50. SDL_AudioDevice *this;
  51. /* Initialize all variables that we clean on shutdown */
  52. this = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice));
  53. if ( this ) {
  54. memset(this, 0, (sizeof *this));
  55. this->hidden = (struct SDL_PrivateAudioData *)
  56. malloc((sizeof *this->hidden));
  57. }
  58. if ( (this == NULL) || (this->hidden == NULL) ) {
  59. SDL_OutOfMemory();
  60. if ( this ) {
  61. free(this);
  62. }
  63. return(0);
  64. }
  65. memset(this->hidden, 0, (sizeof *this->hidden));
  66. /* Set the function pointers */
  67. this->OpenAudio = AL_OpenAudio;
  68. this->WaitAudio = AL_WaitAudio;
  69. this->PlayAudio = AL_PlayAudio;
  70. this->GetAudioBuf = AL_GetAudioBuf;
  71. this->CloseAudio = AL_CloseAudio;
  72. this->free = Audio_DeleteDevice;
  73. return this;
  74. }
  75. AudioBootStrap DMEDIA_bootstrap = {
  76. "AL", "IRIX DMedia audio",
  77. Audio_Available, Audio_CreateDevice
  78. };
  79. void static AL_WaitAudio(_THIS)
  80. {
  81. Sint32 timeleft;
  82. timeleft = this->spec.samples - alGetFillable(audio_port);
  83. if ( timeleft > 0 ) {
  84. timeleft /= (this->spec.freq/1000);
  85. SDL_Delay((Uint32)timeleft);
  86. }
  87. }
  88. static void AL_PlayAudio(_THIS)
  89. {
  90. /* Write the audio data out */
  91. if ( alWriteFrames(audio_port, mixbuf, this->spec.samples) < 0 ) {
  92. /* Assume fatal error, for now */
  93. this->enabled = 0;
  94. }
  95. }
  96. static Uint8 *AL_GetAudioBuf(_THIS)
  97. {
  98. return(mixbuf);
  99. }
  100. static void AL_CloseAudio(_THIS)
  101. {
  102. if ( mixbuf != NULL ) {
  103. SDL_FreeAudioMem(mixbuf);
  104. mixbuf = NULL;
  105. }
  106. if ( audio_port != NULL ) {
  107. ALcloseport(audio_port);
  108. audio_port = NULL;
  109. }
  110. }
  111. static int AL_OpenAudio(_THIS, SDL_AudioSpec *spec)
  112. {
  113. ALconfig audio_config;
  114. ALpv audio_param;
  115. int width;
  116. /* Determine the audio parameters from the AudioSpec */
  117. switch ( spec->format & 0xFF ) {
  118. case 8: { /* Signed 8 bit audio data */
  119. spec->format = AUDIO_S8;
  120. width = AL_SAMPLE_8;
  121. }
  122. break;
  123. case 16: { /* Signed 16 bit audio data */
  124. spec->format = AUDIO_S16MSB;
  125. width = AL_SAMPLE_16;
  126. }
  127. break;
  128. default: {
  129. SDL_SetError("Unsupported audio format");
  130. return(-1);
  131. }
  132. }
  133. /* Update the fragment size as size in bytes */
  134. SDL_CalculateAudioSpec(spec);
  135. /* Set output frequency */
  136. audio_param.param = AL_RATE;
  137. audio_param.value.i = spec->freq;
  138. if( alSetParams(AL_DEFAULT_OUTPUT, &audio_param, 1) < 0 ) {
  139. SDL_SetError("alSetParams failed");
  140. return(-1);
  141. }
  142. /* Open the audio port with the requested frequency */
  143. audio_port = NULL;
  144. audio_config = alNewConfig();
  145. if ( audio_config &&
  146.      (alSetSampFmt(audio_config, AL_SAMPFMT_TWOSCOMP) >= 0) &&
  147.      (alSetWidth(audio_config, width) >= 0) &&
  148.      (alSetQueueSize(audio_config, spec->samples*2) >= 0) &&
  149.      (alSetChannels(audio_config, spec->channels) >= 0) ) {
  150. audio_port = ALopenport("SDL audio", "w", audio_config);
  151. }
  152. alFreeConfig(audio_config);
  153. if( audio_port == NULL ) {
  154. SDL_SetError("Unable to open audio port");
  155. return(-1);
  156. }
  157. /* Allocate mixing buffer */
  158. mixbuf = (Uint8 *)SDL_AllocAudioMem(spec->size);
  159. if ( mixbuf == NULL ) {
  160. SDL_OutOfMemory();
  161. return(-1);
  162. }
  163. memset(mixbuf, spec->silence, spec->size);
  164. /* We're ready to rock and roll. :-) */
  165. return(0);
  166. }