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

多媒体编程

开发平台:

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. */
  18. #ifdef OGG_MUSIC
  19. #include "SDL_loadso.h"
  20. #include "dynamic_ogg.h"
  21. vorbis_loader vorbis = {
  22. 0, NULL
  23. };
  24. #ifdef OGG_DYNAMIC
  25. int Mix_InitOgg()
  26. {
  27. if ( vorbis.loaded == 0 ) {
  28. vorbis.handle = SDL_LoadObject(OGG_DYNAMIC);
  29. if ( vorbis.handle == NULL ) {
  30. return -1;
  31. }
  32. vorbis.ov_clear =
  33. (int (*)(OggVorbis_File *))
  34. SDL_LoadFunction(vorbis.handle, "ov_clear");
  35. if ( vorbis.ov_clear == NULL ) {
  36. SDL_UnloadObject(vorbis.handle);
  37. return -1;
  38. }
  39. vorbis.ov_info =
  40. (vorbis_info *(*)(OggVorbis_File *,int))
  41. SDL_LoadFunction(vorbis.handle, "ov_info");
  42. if ( vorbis.ov_info == NULL ) {
  43. SDL_UnloadObject(vorbis.handle);
  44. return -1;
  45. }
  46. vorbis.ov_open_callbacks =
  47. (int (*)(void *, OggVorbis_File *, char *, long, ov_callbacks))
  48. SDL_LoadFunction(vorbis.handle, "ov_open_callbacks");
  49. if ( vorbis.ov_open_callbacks == NULL ) {
  50. SDL_UnloadObject(vorbis.handle);
  51. return -1;
  52. }
  53. vorbis.ov_pcm_total =
  54. (ogg_int64_t (*)(OggVorbis_File *,int))
  55. SDL_LoadFunction(vorbis.handle, "ov_pcm_total");
  56. if ( vorbis.ov_pcm_total == NULL ) {
  57. SDL_UnloadObject(vorbis.handle);
  58. return -1;
  59. }
  60. vorbis.ov_read =
  61. #ifdef OGG_USE_TREMOR
  62. (long (*)(OggVorbis_File *,char *,int,int *))
  63. #else
  64. (long (*)(OggVorbis_File *,char *,int,int,int,int,int *))
  65. #endif
  66. SDL_LoadFunction(vorbis.handle, "ov_read");
  67. if ( vorbis.ov_read == NULL ) {
  68. SDL_UnloadObject(vorbis.handle);
  69. return -1;
  70. }
  71. vorbis.ov_time_seek =
  72. (int (*)(OggVorbis_File *,double))
  73. SDL_LoadFunction(vorbis.handle, "ov_time_seek");
  74. if ( vorbis.ov_time_seek == NULL ) {
  75. SDL_UnloadObject(vorbis.handle);
  76. return -1;
  77. }
  78. }
  79. ++vorbis.loaded;
  80. return 0;
  81. }
  82. void Mix_QuitOgg()
  83. {
  84. if ( vorbis.loaded == 0 ) {
  85. return;
  86. }
  87. if ( vorbis.loaded == 1 ) {
  88. SDL_UnloadObject(vorbis.handle);
  89. }
  90. --vorbis.loaded;
  91. }
  92. #else
  93. int Mix_InitOgg()
  94. {
  95. if ( vorbis.loaded == 0 ) {
  96. vorbis.ov_clear = ov_clear;
  97. vorbis.ov_info = ov_info;
  98. vorbis.ov_open_callbacks = ov_open_callbacks;
  99. vorbis.ov_pcm_total = ov_pcm_total;
  100. vorbis.ov_read = ov_read;
  101. vorbis.ov_time_seek = ov_time_seek;
  102. }
  103. ++vorbis.loaded;
  104. return 0;
  105. }
  106. void Mix_QuitOgg()
  107. {
  108. if ( vorbis.loaded == 0 ) {
  109. return;
  110. }
  111. if ( vorbis.loaded == 1 ) {
  112. }
  113. --vorbis.loaded;
  114. }
  115. #endif /* OGG_DYNAMIC */
  116. #endif /* OGG_MUSIC */