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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997  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.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_beaudio.cc,v 1.4 2002/04/22 21:38:02 wmay Exp $";
  21. #endif
  22. /* Allow access to the audio stream on BeOS */
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <SoundPlayer.h>
  27. #include "SDL_BeApp.h"
  28. extern "C" {
  29. #include "SDL_audio.h"
  30. #include "SDL_audio_c.h"
  31. #include "SDL_sysaudio.h"
  32. #include "SDL_systhread_c.h"
  33. #include "SDL_beaudio.h"
  34. /* Audio driver functions */
  35. static int BE_OpenAudio(_THIS, SDL_AudioSpec *spec);
  36. static void BE_WaitAudio(_THIS);
  37. static void BE_PlayAudio(_THIS);
  38. static Uint8 *BE_GetAudioBuf(_THIS);
  39. static void BE_CloseAudio(_THIS);
  40. /* Audio driver bootstrap functions */
  41. static int Audio_Available(void)
  42. {
  43. return(1);
  44. }
  45. static void Audio_DeleteDevice(SDL_AudioDevice *device)
  46. {
  47. free(device->hidden);
  48. free(device);
  49. }
  50. static SDL_AudioDevice *Audio_CreateDevice(int devindex)
  51. {
  52. SDL_AudioDevice *device;
  53. /* Initialize all variables that we clean on shutdown */
  54. device = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice));
  55. if ( device ) {
  56. memset(device, 0, (sizeof *device));
  57. device->hidden = (struct SDL_PrivateAudioData *)
  58. malloc((sizeof *device->hidden));
  59. }
  60. if ( (device == NULL) || (device->hidden == NULL) ) {
  61. SDL_OutOfMemory();
  62. if ( device ) {
  63. free(device);
  64. }
  65. return(0);
  66. }
  67. memset(device->hidden, 0, (sizeof *device->hidden));
  68. /* Set the function pointers */
  69. device->OpenAudio = BE_OpenAudio;
  70. device->WaitAudio = BE_WaitAudio;
  71. device->PlayAudio = BE_PlayAudio;
  72. device->GetAudioBuf = BE_GetAudioBuf;
  73. device->CloseAudio = BE_CloseAudio;
  74. device->free = Audio_DeleteDevice;
  75. return device;
  76. }
  77. AudioBootStrap BAUDIO_bootstrap = {
  78. "baudio", "BeOS BSoundPlayer",
  79. Audio_Available, Audio_CreateDevice
  80. };
  81. /* The BeOS callback for handling the audio buffer */
  82. static void FillSound(void *device, void *stream, size_t len, 
  83. const media_raw_audio_format &format)
  84. {
  85. SDL_AudioDevice *audio = (SDL_AudioDevice *)device;
  86. /* Silence the buffer, since it's ours */
  87. memset(stream, audio->spec.silence, len);
  88. /* Only do soemthing if audio is enabled */
  89. if ( ! audio->enabled )
  90. return;
  91. if ( ! audio->paused ) {
  92. if ( audio->convert.needed ) {
  93. SDL_mutexP(audio->mixer_lock);
  94. (*audio->spec.callback)(audio->spec.userdata,
  95. (Uint8 *)audio->convert.buf,audio->convert.len);
  96. SDL_mutexV(audio->mixer_lock);
  97. SDL_ConvertAudio(&audio->convert);
  98. memcpy(stream,audio->convert.buf,audio->convert.len_cvt);
  99. } else {
  100. SDL_mutexP(audio->mixer_lock);
  101. (*audio->spec.callback)(audio->spec.userdata,
  102. (Uint8 *)stream, len);
  103. SDL_mutexV(audio->mixer_lock);
  104. }
  105. }
  106. return;
  107. }
  108. /* Dummy functions -- we don't use thread-based audio */
  109. void BE_WaitAudio(_THIS)
  110. {
  111. return;
  112. }
  113. void BE_PlayAudio(_THIS)
  114. {
  115. return;
  116. }
  117. Uint8 *BE_GetAudioBuf(_THIS)
  118. {
  119. return(NULL);
  120. }
  121. void BE_CloseAudio(_THIS)
  122. {
  123. if ( audio_obj ) {
  124. audio_obj->Stop();
  125. delete audio_obj;
  126. audio_obj = NULL;
  127. }
  128. /* Quit the Be Application, if there's nothing left to do */
  129. SDL_QuitBeApp();
  130. }
  131. int BE_OpenAudio(_THIS, SDL_AudioSpec *spec)
  132. {
  133. media_raw_audio_format format;
  134. /* Initialize the Be Application, if it's not already started */
  135. if ( SDL_InitBeApp() < 0 ) {
  136. return(-1);
  137. }
  138. /* Parse the audio format and fill the Be raw audio format */
  139. format.frame_rate = (float)spec->freq;
  140. format.channel_count = spec->channels;
  141. switch (spec->format&~0x1000) {
  142. case AUDIO_S8:
  143. /* Signed 8-bit audio unsupported, convert to U8 */
  144. spec->format = AUDIO_U8;
  145. case AUDIO_U8:
  146. format.format = media_raw_audio_format::B_AUDIO_UCHAR;
  147. format.byte_order = 0;
  148. break;
  149. case AUDIO_U16:
  150. /* Unsigned 16-bit audio unsupported, convert to S16 */
  151. spec->format ^= 0x8000;
  152. case AUDIO_S16:
  153. format.format = media_raw_audio_format::B_AUDIO_SHORT;
  154. if ( spec->format & 0x1000 ) {
  155. format.byte_order = 1; /* Big endian */
  156. } else {
  157. format.byte_order = 2; /* Little endian */
  158. }
  159. break;
  160. }
  161. format.buffer_size = spec->samples;
  162. /* Calculate the final parameters for this audio specification */
  163. SDL_CalculateAudioSpec(spec);
  164. /* Subscribe to the audio stream (creates a new thread) */
  165. { sigset_t omask;
  166. SDL_MaskSignals(&omask);
  167. audio_obj = new BSoundPlayer(&format, "SDL Audio", FillSound,
  168.                                                  NULL, _this);
  169. SDL_UnmaskSignals(&omask);
  170. }
  171. if ( audio_obj->Start() == B_NO_ERROR ) {
  172. audio_obj->SetHasData(true);
  173. } else {
  174. SDL_SetError("Unable to start Be audio");
  175. return(-1);
  176. }
  177. /* We're running! */
  178. return(1);
  179. }
  180. }; /* Extern C */