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

多媒体编程

开发平台:

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.     Sam Lantinga
  16.     slouken@libsdl.org
  17.     Implementation of the dynamic loading functionality for libFLAC.
  18.      ~ Austen Dicken (admin@cvpcs.org)
  19. */
  20. #ifdef FLAC_MUSIC
  21. #include "SDL_loadso.h"
  22. #include "dynamic_flac.h"
  23. flac_loader flac = {
  24. 0, NULL
  25. };
  26. #ifdef FLAC_DYNAMIC
  27. int Mix_InitFLAC()
  28. {
  29. if ( flac.loaded == 0 ) {
  30. flac.handle = SDL_LoadObject(FLAC_DYNAMIC);
  31. if ( flac.handle == NULL ) {
  32. return -1;
  33. }
  34. flac.FLAC__stream_decoder_new =
  35. (FLAC__StreamDecoder *(*)())
  36. SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_new");
  37. if ( flac.FLAC__stream_decoder_new == NULL ) {
  38. SDL_UnloadObject(flac.handle);
  39. return -1;
  40. }
  41. flac.FLAC__stream_decoder_delete =
  42. (void (*)(FLAC__StreamDecoder *))
  43. SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_delete");
  44. if ( flac.FLAC__stream_decoder_delete == NULL ) {
  45. SDL_UnloadObject(flac.handle);
  46. return -1;
  47. }
  48. flac.FLAC__stream_decoder_init_stream =
  49. (FLAC__StreamDecoderInitStatus (*)(
  50. FLAC__StreamDecoder *,
  51. FLAC__StreamDecoderReadCallback,
  52. FLAC__StreamDecoderSeekCallback,
  53. FLAC__StreamDecoderTellCallback,
  54. FLAC__StreamDecoderLengthCallback,
  55. FLAC__StreamDecoderEofCallback,
  56. FLAC__StreamDecoderWriteCallback,
  57. FLAC__StreamDecoderMetadataCallback,
  58. FLAC__StreamDecoderErrorCallback,
  59. void *))
  60. SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_init_stream");
  61. if ( flac.FLAC__stream_decoder_init_stream == NULL ) {
  62. SDL_UnloadObject(flac.handle);
  63. return -1;
  64. }
  65. flac.FLAC__stream_decoder_finish =
  66. (FLAC__bool (*)(FLAC__StreamDecoder *))
  67. SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_finish");
  68. if ( flac.FLAC__stream_decoder_finish == NULL ) {
  69. SDL_UnloadObject(flac.handle);
  70. return -1;
  71. }
  72. flac.FLAC__stream_decoder_flush =
  73. (FLAC__bool (*)(FLAC__StreamDecoder *))
  74. SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_flush");
  75. if ( flac.FLAC__stream_decoder_flush == NULL ) {
  76. SDL_UnloadObject(flac.handle);
  77. return -1;
  78. }
  79. flac.FLAC__stream_decoder_process_single =
  80. (FLAC__bool (*)(FLAC__StreamDecoder *))
  81. SDL_LoadFunction(flac.handle,
  82. "FLAC__stream_decoder_process_single");
  83. if ( flac.FLAC__stream_decoder_process_single == NULL ) {
  84. SDL_UnloadObject(flac.handle);
  85. return -1;
  86. }
  87. flac.FLAC__stream_decoder_process_until_end_of_metadata =
  88. (FLAC__bool (*)(FLAC__StreamDecoder *))
  89. SDL_LoadFunction(flac.handle,
  90. "FLAC__stream_decoder_process_until_end_of_metadata");
  91. if ( flac.FLAC__stream_decoder_process_until_end_of_metadata == NULL ) {
  92. SDL_UnloadObject(flac.handle);
  93. return -1;
  94. }
  95. flac.FLAC__stream_decoder_process_until_end_of_stream =
  96. (FLAC__bool (*)(FLAC__StreamDecoder *))
  97. SDL_LoadFunction(flac.handle,
  98. "FLAC__stream_decoder_process_until_end_of_stream");
  99. if ( flac.FLAC__stream_decoder_process_until_end_of_stream == NULL ) {
  100. SDL_UnloadObject(flac.handle);
  101. return -1;
  102. }
  103. flac.FLAC__stream_decoder_seek_absolute =
  104. (FLAC__bool (*)(FLAC__StreamDecoder *, FLAC__uint64))
  105. SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_seek_absolute");
  106. if ( flac.FLAC__stream_decoder_seek_absolute == NULL ) {
  107. SDL_UnloadObject(flac.handle);
  108. return -1;
  109. }
  110. flac.FLAC__stream_decoder_get_state =
  111. (FLAC__StreamDecoderState (*)(const FLAC__StreamDecoder *decoder))
  112. SDL_LoadFunction(flac.handle, "FLAC__stream_decoder_get_state");
  113. if ( flac.FLAC__stream_decoder_get_state == NULL ) {
  114. SDL_UnloadObject(flac.handle);
  115. return -1;
  116. }
  117. }
  118. ++flac.loaded;
  119. return 0;
  120. }
  121. void Mix_QuitFLAC()
  122. {
  123. if ( flac.loaded == 0 ) {
  124. return;
  125. }
  126. if ( flac.loaded == 1 ) {
  127. SDL_UnloadObject(flac.handle);
  128. }
  129. --flac.loaded;
  130. }
  131. #else
  132. int Mix_InitFLAC()
  133. {
  134. if ( flac.loaded == 0 ) {
  135. flac.FLAC__stream_decoder_new = FLAC__stream_decoder_new;
  136. flac.FLAC__stream_decoder_delete = FLAC__stream_decoder_delete;
  137. flac.FLAC__stream_decoder_init_stream =
  138. FLAC__stream_decoder_init_stream;
  139. flac.FLAC__stream_decoder_finish = FLAC__stream_decoder_finish;
  140. flac.FLAC__stream_decoder_flush = FLAC__stream_decoder_flush;
  141. flac.FLAC__stream_decoder_process_single =
  142. FLAC__stream_decoder_process_single;
  143. flac.FLAC__stream_decoder_process_until_end_of_metadata =
  144. FLAC__stream_decoder_process_until_end_of_metadata;
  145. flac.FLAC__stream_decoder_process_until_end_of_stream =
  146. FLAC__stream_decoder_process_until_end_of_stream;
  147. flac.FLAC__stream_decoder_seek_absolute =
  148. FLAC__stream_decoder_seek_absolute;
  149. flac.FLAC__stream_decoder_get_state =
  150. FLAC__stream_decoder_get_state;
  151. }
  152. ++flac.loaded;
  153. return 0;
  154. }
  155. void Mix_QuitFLAC()
  156. {
  157. if ( flac.loaded == 0 ) {
  158. return;
  159. }
  160. if ( flac.loaded == 1 ) {
  161. }
  162. --flac.loaded;
  163. }
  164. #endif /* FLAC_DYNAMIC */
  165. #endif /* FLAC_MUSIC */