seal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. data/.yardopts +1 -0
  2. data/LICENSE +13 -0
  3. data/README.md +265 -0
  4. data/ext/seal/extconf.rb +45 -0
  5. data/include/al/al.h +724 -0
  6. data/include/al/alc.h +277 -0
  7. data/include/al/efx-presets.h +402 -0
  8. data/include/al/efx.h +758 -0
  9. data/include/mpg123/mpg123.h +1034 -0
  10. data/include/ogg/config_types.h +25 -0
  11. data/include/ogg/ogg.h +210 -0
  12. data/include/ogg/os_types.h +147 -0
  13. data/include/seal.h +23 -0
  14. data/include/seal/buf.h +143 -0
  15. data/include/seal/core.h +95 -0
  16. data/include/seal/efs.h +112 -0
  17. data/include/seal/err.h +93 -0
  18. data/include/seal/fmt.h +58 -0
  19. data/include/seal/listener.h +103 -0
  20. data/include/seal/raw.h +86 -0
  21. data/include/seal/rvb.h +520 -0
  22. data/include/seal/src.h +413 -0
  23. data/include/seal/stream.h +81 -0
  24. data/include/vorbis/codec.h +243 -0
  25. data/include/vorbis/vorbisfile.h +206 -0
  26. data/mpg123/AUTHORS +150 -0
  27. data/mpg123/COPYING +773 -0
  28. data/mpg123/ChangeLog +3 -0
  29. data/mpg123/INSTALL +111 -0
  30. data/mpg123/Makefile.am +99 -0
  31. data/mpg123/Makefile.in +1043 -0
  32. data/mpg123/NEWS +1200 -0
  33. data/mpg123/NEWS.libmpg123 +133 -0
  34. data/mpg123/README +203 -0
  35. data/mpg123/TODO +38 -0
  36. data/mpg123/aclocal.m4 +1168 -0
  37. data/mpg123/build/config.guess +1530 -0
  38. data/mpg123/build/config.sub +1782 -0
  39. data/mpg123/build/depcomp +707 -0
  40. data/mpg123/build/install-sh +527 -0
  41. data/mpg123/build/ltmain.sh +9655 -0
  42. data/mpg123/build/missing +330 -0
  43. data/mpg123/configure +20267 -0
  44. data/mpg123/configure.ac +2178 -0
  45. data/mpg123/doc/ACCURACY +2 -0
  46. data/mpg123/doc/BENCHMARKING +110 -0
  47. data/mpg123/doc/BUGS +3 -0
  48. data/mpg123/doc/CONTACT +17 -0
  49. data/mpg123/doc/LICENSE +22 -0
  50. data/mpg123/doc/Makefile.am +32 -0
  51. data/mpg123/doc/Makefile.in +490 -0
  52. data/mpg123/doc/PATENTS +39 -0
  53. data/mpg123/doc/README.3DNOW +56 -0
  54. data/mpg123/doc/README.gain +171 -0
  55. data/mpg123/doc/README.remote +218 -0
  56. data/mpg123/doc/ROAD_TO_LGPL +270 -0
  57. data/mpg123/doc/THANKS +13 -0
  58. data/mpg123/doc/TODO +63 -0
  59. data/mpg123/doc/doxy_examples.c +21 -0
  60. data/mpg123/doc/doxygen.conf +41 -0
  61. data/mpg123/doc/doxyhead.xhtml +12 -0
  62. data/mpg123/doc/examples/dump_seekindex.c +41 -0
  63. data/mpg123/doc/examples/extract_frames.c +92 -0
  64. data/mpg123/doc/examples/feedseek.c +238 -0
  65. data/mpg123/doc/examples/id3dump.c +178 -0
  66. data/mpg123/doc/examples/mpg123_to_wav.c +118 -0
  67. data/mpg123/doc/examples/mpglib.c +92 -0
  68. data/mpg123/doc/examples/scan.c +47 -0
  69. data/mpg123/doc/libmpg123_speed.txt +84 -0
  70. data/mpg123/equalize.dat +37 -0
  71. data/mpg123/libmpg123.pc.in +11 -0
  72. data/mpg123/m4/addrconfig.m4 +34 -0
  73. data/mpg123/m4/libtool.m4 +7982 -0
  74. data/mpg123/m4/ltoptions.m4 +384 -0
  75. data/mpg123/m4/ltsugar.m4 +123 -0
  76. data/mpg123/m4/ltversion.m4 +23 -0
  77. data/mpg123/m4/lt~obsolete.m4 +98 -0
  78. data/mpg123/makedll.sh +19 -0
  79. data/mpg123/man1/mpg123.1 +512 -0
  80. data/mpg123/mpg123.spec +68 -0
  81. data/mpg123/mpg123.spec.in +68 -0
  82. data/mpg123/ports/MSVC++/2005/libmpg123/libmpg123.vcproj +741 -0
  83. data/mpg123/ports/MSVC++/2008/dump_seekindex/dump_seekindex.vcproj +194 -0
  84. data/mpg123/ports/MSVC++/2008/feedseek/feedseek.vcproj +195 -0
  85. data/mpg123/ports/MSVC++/2008/libmpg123/libmpg123.vcproj +1357 -0
  86. data/mpg123/ports/MSVC++/2008/mpg123.sln +44 -0
  87. data/mpg123/ports/MSVC++/2008/mpglib/mpglib.vcproj +191 -0
  88. data/mpg123/ports/MSVC++/2008/scan/scan.vcproj +195 -0
  89. data/mpg123/ports/MSVC++/2008clr/2008clr.sln +81 -0
  90. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Program.cs +435 -0
  91. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/Properties/AssemblyInfo.cs +36 -0
  92. data/mpg123/ports/MSVC++/2008clr/examples/ReplaceReaderclr/ReplaceReaderclr.csproj +72 -0
  93. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Program.cs +331 -0
  94. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/Properties/AssemblyInfo.cs +36 -0
  95. data/mpg123/ports/MSVC++/2008clr/examples/feedseekclr/feedseekclr.csproj +71 -0
  96. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Program.cs +79 -0
  97. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/Properties/AssemblyInfo.cs +36 -0
  98. data/mpg123/ports/MSVC++/2008clr/examples/scanclr/scanclr.csproj +70 -0
  99. data/mpg123/ports/MSVC++/2008clr/mpg123clr/AssemblyInfo.cpp +76 -0
  100. data/mpg123/ports/MSVC++/2008clr/mpg123clr/ReadMe.txt +165 -0
  101. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.cpp +91 -0
  102. data/mpg123/ports/MSVC++/2008clr/mpg123clr/advanced.h +130 -0
  103. data/mpg123/ports/MSVC++/2008clr/mpg123clr/dllmain.cpp +19 -0
  104. data/mpg123/ports/MSVC++/2008clr/mpg123clr/enum.h +218 -0
  105. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.cpp +48 -0
  106. data/mpg123/ports/MSVC++/2008clr/mpg123clr/error.h +134 -0
  107. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.cpp +92 -0
  108. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v1.h +132 -0
  109. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.cpp +138 -0
  110. data/mpg123/ports/MSVC++/2008clr/mpg123clr/id3v2.h +152 -0
  111. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.cpp +896 -0
  112. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.h +953 -0
  113. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.rc +102 -0
  114. data/mpg123/ports/MSVC++/2008clr/mpg123clr/mpg123clr.vcproj +328 -0
  115. data/mpg123/ports/MSVC++/2008clr/mpg123clr/resource.h +14 -0
  116. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.cpp +8 -0
  117. data/mpg123/ports/MSVC++/2008clr/mpg123clr/stdafx.h +38 -0
  118. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.cpp +166 -0
  119. data/mpg123/ports/MSVC++/2008clr/mpg123clr/string.h +265 -0
  120. data/mpg123/ports/MSVC++/2008clr/mpg123clr/targetver.h +24 -0
  121. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.cpp +67 -0
  122. data/mpg123/ports/MSVC++/2008clr/mpg123clr/text.h +111 -0
  123. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj +90 -0
  124. data/mpg123/ports/MSVC++/2010/dump_seekindex/dump_seekindex.vcxproj.filters +6 -0
  125. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj +95 -0
  126. data/mpg123/ports/MSVC++/2010/feedseek/feedseek.vcxproj.filters +6 -0
  127. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj +960 -0
  128. data/mpg123/ports/MSVC++/2010/libmpg123/libmpg123.vcxproj.user +3 -0
  129. data/mpg123/ports/MSVC++/2010/libmpg123/yasm.exe +0 -0
  130. data/mpg123/ports/MSVC++/2010/mpg123.sln +38 -0
  131. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj +93 -0
  132. data/mpg123/ports/MSVC++/2010/scan/scan.vcxproj.filters +6 -0
  133. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/CORE_FileIn.H +15 -0
  134. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/CORE/SourceFilter_MP3.H +139 -0
  135. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_Def.H +206 -0
  136. data/mpg123/ports/MSVC++/CMP3Stream/INCLUDE/IIEP_FileIn.H +167 -0
  137. data/mpg123/ports/MSVC++/CMP3Stream/README +4 -0
  138. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_FileIn.CPP +462 -0
  139. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Log.CPP +122 -0
  140. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/CORE_Mutex.CPP +35 -0
  141. data/mpg123/ports/MSVC++/CMP3Stream/SOURCE/SourceFilter_MP3Stream.CPP +586 -0
  142. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/PLACE_LIBMPG123_SOURCES_HERE +0 -0
  143. data/mpg123/ports/MSVC++/CMP3Stream/libMPG123/libMPG123.vcproj +245 -0
  144. data/mpg123/ports/MSVC++/config.h +35 -0
  145. data/mpg123/ports/MSVC++/examples/feedseek.c +240 -0
  146. data/mpg123/ports/MSVC++/examples/scan.c +47 -0
  147. data/mpg123/ports/MSVC++/mpg123.h +46 -0
  148. data/mpg123/ports/MSVC++/msvc.c +59 -0
  149. data/mpg123/ports/README +26 -0
  150. data/mpg123/ports/Sony_PSP/Makefile.psp +38 -0
  151. data/mpg123/ports/Sony_PSP/README +11 -0
  152. data/mpg123/ports/Sony_PSP/config.h +368 -0
  153. data/mpg123/ports/Sony_PSP/readers.c.patch +2 -0
  154. data/mpg123/ports/Xcode/config.h +197 -0
  155. data/mpg123/ports/Xcode/mpg123.h +17 -0
  156. data/mpg123/ports/Xcode/mpg123.xcodeproj/project.pbxproj +670 -0
  157. data/mpg123/ports/mpg123_.pas +478 -0
  158. data/mpg123/scripts/benchmark-cpu.pl +56 -0
  159. data/mpg123/scripts/tag_lyrics.py +76 -0
  160. data/mpg123/src/Makefile.am +186 -0
  161. data/mpg123/src/Makefile.in +1097 -0
  162. data/mpg123/src/audio.c +725 -0
  163. data/mpg123/src/audio.h +106 -0
  164. data/mpg123/src/buffer.c +312 -0
  165. data/mpg123/src/buffer.h +45 -0
  166. data/mpg123/src/common.c +240 -0
  167. data/mpg123/src/common.h +29 -0
  168. data/mpg123/src/config.h.in +436 -0
  169. data/mpg123/src/control_generic.c +809 -0
  170. data/mpg123/src/equalizer.c +48 -0
  171. data/mpg123/src/genre.c +271 -0
  172. data/mpg123/src/genre.h +15 -0
  173. data/mpg123/src/getlopt.c +148 -0
  174. data/mpg123/src/getlopt.h +77 -0
  175. data/mpg123/src/httpget.c +700 -0
  176. data/mpg123/src/httpget.h +66 -0
  177. data/mpg123/src/legacy_module.c +74 -0
  178. data/mpg123/src/libmpg123/Makefile.am +141 -0
  179. data/mpg123/src/libmpg123/Makefile.in +919 -0
  180. data/mpg123/src/libmpg123/compat.c +138 -0
  181. data/mpg123/src/libmpg123/compat.h +178 -0
  182. data/mpg123/src/libmpg123/dct36_3dnow.S +505 -0
  183. data/mpg123/src/libmpg123/dct36_3dnowext.S +512 -0
  184. data/mpg123/src/libmpg123/dct64.c +174 -0
  185. data/mpg123/src/libmpg123/dct64_3dnow.S +712 -0
  186. data/mpg123/src/libmpg123/dct64_3dnowext.S +714 -0
  187. data/mpg123/src/libmpg123/dct64_altivec.c +315 -0
  188. data/mpg123/src/libmpg123/dct64_i386.c +336 -0
  189. data/mpg123/src/libmpg123/dct64_i486.c +342 -0
  190. data/mpg123/src/libmpg123/dct64_mmx.S +811 -0
  191. data/mpg123/src/libmpg123/dct64_neon.S +297 -0
  192. data/mpg123/src/libmpg123/dct64_neon_float.S +270 -0
  193. data/mpg123/src/libmpg123/dct64_sse.S +454 -0
  194. data/mpg123/src/libmpg123/dct64_sse_float.S +401 -0
  195. data/mpg123/src/libmpg123/dct64_x86_64.S +464 -0
  196. data/mpg123/src/libmpg123/dct64_x86_64_float.S +426 -0
  197. data/mpg123/src/libmpg123/debug.h +171 -0
  198. data/mpg123/src/libmpg123/decode.h +268 -0
  199. data/mpg123/src/libmpg123/dither.c +119 -0
  200. data/mpg123/src/libmpg123/dither.h +23 -0
  201. data/mpg123/src/libmpg123/equalizer.c +17 -0
  202. data/mpg123/src/libmpg123/equalizer_3dnow.S +70 -0
  203. data/mpg123/src/libmpg123/feature.c +106 -0
  204. data/mpg123/src/libmpg123/format.c +521 -0
  205. data/mpg123/src/libmpg123/frame.c +1046 -0
  206. data/mpg123/src/libmpg123/frame.h +410 -0
  207. data/mpg123/src/libmpg123/gapless.h +119 -0
  208. data/mpg123/src/libmpg123/getbits.h +100 -0
  209. data/mpg123/src/libmpg123/getcpuflags.S +91 -0
  210. data/mpg123/src/libmpg123/getcpuflags.h +47 -0
  211. data/mpg123/src/libmpg123/huffman.h +340 -0
  212. data/mpg123/src/libmpg123/icy.c +32 -0
  213. data/mpg123/src/libmpg123/icy.h +38 -0
  214. data/mpg123/src/libmpg123/icy2utf8.c +438 -0
  215. data/mpg123/src/libmpg123/icy2utf8.h +10 -0
  216. data/mpg123/src/libmpg123/id3.c +999 -0
  217. data/mpg123/src/libmpg123/id3.h +43 -0
  218. data/mpg123/src/libmpg123/index.c +134 -0
  219. data/mpg123/src/libmpg123/index.h +59 -0
  220. data/mpg123/src/libmpg123/intsym.h +256 -0
  221. data/mpg123/src/libmpg123/l12_integer_tables.h +278 -0
  222. data/mpg123/src/libmpg123/l2tables.h +164 -0
  223. data/mpg123/src/libmpg123/l3_integer_tables.h +1002 -0
  224. data/mpg123/src/libmpg123/layer1.c +155 -0
  225. data/mpg123/src/libmpg123/layer2.c +371 -0
  226. data/mpg123/src/libmpg123/layer3.c +2053 -0
  227. data/mpg123/src/libmpg123/lfs_alias.c +252 -0
  228. data/mpg123/src/libmpg123/lfs_wrap.c +751 -0
  229. data/mpg123/src/libmpg123/libmpg123.c +1607 -0
  230. data/mpg123/src/libmpg123/mangle.h +74 -0
  231. data/mpg123/src/libmpg123/mpeghead.h +87 -0
  232. data/mpg123/src/libmpg123/mpg123.h.in +1075 -0
  233. data/mpg123/src/libmpg123/mpg123lib_intern.h +338 -0
  234. data/mpg123/src/libmpg123/ntom.c +148 -0
  235. data/mpg123/src/libmpg123/optimize.c +964 -0
  236. data/mpg123/src/libmpg123/optimize.h +219 -0
  237. data/mpg123/src/libmpg123/parse.c +1179 -0
  238. data/mpg123/src/libmpg123/parse.h +25 -0
  239. data/mpg123/src/libmpg123/reader.h +137 -0
  240. data/mpg123/src/libmpg123/readers.c +1235 -0
  241. data/mpg123/src/libmpg123/sample.h +152 -0
  242. data/mpg123/src/libmpg123/stringbuf.c +163 -0
  243. data/mpg123/src/libmpg123/synth.c +816 -0
  244. data/mpg123/src/libmpg123/synth.h +196 -0
  245. data/mpg123/src/libmpg123/synth_3dnow.S +318 -0
  246. data/mpg123/src/libmpg123/synth_3dnowext.S +6 -0
  247. data/mpg123/src/libmpg123/synth_8bit.c +142 -0
  248. data/mpg123/src/libmpg123/synth_8bit.h +86 -0
  249. data/mpg123/src/libmpg123/synth_altivec.c +1057 -0
  250. data/mpg123/src/libmpg123/synth_arm.S +271 -0
  251. data/mpg123/src/libmpg123/synth_arm_accurate.S +287 -0
  252. data/mpg123/src/libmpg123/synth_i486.c +252 -0
  253. data/mpg123/src/libmpg123/synth_i586.S +336 -0
  254. data/mpg123/src/libmpg123/synth_i586_dither.S +375 -0
  255. data/mpg123/src/libmpg123/synth_mmx.S +125 -0
  256. data/mpg123/src/libmpg123/synth_mono.h +64 -0
  257. data/mpg123/src/libmpg123/synth_neon.S +123 -0
  258. data/mpg123/src/libmpg123/synth_neon_accurate.S +173 -0
  259. data/mpg123/src/libmpg123/synth_neon_float.S +149 -0
  260. data/mpg123/src/libmpg123/synth_neon_s32.S +168 -0
  261. data/mpg123/src/libmpg123/synth_ntom.h +213 -0
  262. data/mpg123/src/libmpg123/synth_real.c +404 -0
  263. data/mpg123/src/libmpg123/synth_s32.c +411 -0
  264. data/mpg123/src/libmpg123/synth_sse.S +6 -0
  265. data/mpg123/src/libmpg123/synth_sse3d.h +246 -0
  266. data/mpg123/src/libmpg123/synth_sse_accurate.S +294 -0
  267. data/mpg123/src/libmpg123/synth_sse_float.S +241 -0
  268. data/mpg123/src/libmpg123/synth_sse_s32.S +306 -0
  269. data/mpg123/src/libmpg123/synth_stereo_neon.S +175 -0
  270. data/mpg123/src/libmpg123/synth_stereo_neon_accurate.S +262 -0
  271. data/mpg123/src/libmpg123/synth_stereo_neon_float.S +220 -0
  272. data/mpg123/src/libmpg123/synth_stereo_neon_s32.S +247 -0
  273. data/mpg123/src/libmpg123/synth_stereo_sse_accurate.S +508 -0
  274. data/mpg123/src/libmpg123/synth_stereo_sse_float.S +416 -0
  275. data/mpg123/src/libmpg123/synth_stereo_sse_s32.S +540 -0
  276. data/mpg123/src/libmpg123/synth_stereo_x86_64.S +335 -0
  277. data/mpg123/src/libmpg123/synth_stereo_x86_64_accurate.S +454 -0
  278. data/mpg123/src/libmpg123/synth_stereo_x86_64_float.S +396 -0
  279. data/mpg123/src/libmpg123/synth_stereo_x86_64_s32.S +473 -0
  280. data/mpg123/src/libmpg123/synth_x86_64.S +244 -0
  281. data/mpg123/src/libmpg123/synth_x86_64_accurate.S +301 -0
  282. data/mpg123/src/libmpg123/synth_x86_64_float.S +259 -0
  283. data/mpg123/src/libmpg123/synth_x86_64_s32.S +312 -0
  284. data/mpg123/src/libmpg123/synths.h +52 -0
  285. data/mpg123/src/libmpg123/tabinit.c +294 -0
  286. data/mpg123/src/libmpg123/tabinit_mmx.S +210 -0
  287. data/mpg123/src/libmpg123/testcpu.c +35 -0
  288. data/mpg123/src/libmpg123/true.h +14 -0
  289. data/mpg123/src/local.c +63 -0
  290. data/mpg123/src/local.h +21 -0
  291. data/mpg123/src/metaprint.c +373 -0
  292. data/mpg123/src/metaprint.h +17 -0
  293. data/mpg123/src/module.c +306 -0
  294. data/mpg123/src/module.h +48 -0
  295. data/mpg123/src/mpg123.c +1405 -0
  296. data/mpg123/src/mpg123app.h +171 -0
  297. data/mpg123/src/output/Makefile.am +213 -0
  298. data/mpg123/src/output/Makefile.in +1238 -0
  299. data/mpg123/src/output/aix.c +300 -0
  300. data/mpg123/src/output/alib.c +209 -0
  301. data/mpg123/src/output/alsa.c +297 -0
  302. data/mpg123/src/output/arts.c +117 -0
  303. data/mpg123/src/output/coreaudio.c +370 -0
  304. data/mpg123/src/output/dummy.c +78 -0
  305. data/mpg123/src/output/esd.c +167 -0
  306. data/mpg123/src/output/hp.c +184 -0
  307. data/mpg123/src/output/jack.c +450 -0
  308. data/mpg123/src/output/mint.c +197 -0
  309. data/mpg123/src/output/nas.c +335 -0
  310. data/mpg123/src/output/openal.c +197 -0
  311. data/mpg123/src/output/os2.c +665 -0
  312. data/mpg123/src/output/oss.c +319 -0
  313. data/mpg123/src/output/portaudio.c +255 -0
  314. data/mpg123/src/output/pulse.c +164 -0
  315. data/mpg123/src/output/sdl.c +206 -0
  316. data/mpg123/src/output/sgi.c +213 -0
  317. data/mpg123/src/output/sndio.c +161 -0
  318. data/mpg123/src/output/sun.c +281 -0
  319. data/mpg123/src/output/win32.c +229 -0
  320. data/mpg123/src/playlist.c +596 -0
  321. data/mpg123/src/playlist.h +52 -0
  322. data/mpg123/src/resolver.c +319 -0
  323. data/mpg123/src/resolver.h +25 -0
  324. data/mpg123/src/sfifo.c +146 -0
  325. data/mpg123/src/sfifo.h +95 -0
  326. data/mpg123/src/streamdump.c +74 -0
  327. data/mpg123/src/streamdump.h +20 -0
  328. data/mpg123/src/term.c +479 -0
  329. data/mpg123/src/term.h +81 -0
  330. data/mpg123/src/tests/noise.c +52 -0
  331. data/mpg123/src/tests/plain_id3.c +109 -0
  332. data/mpg123/src/tests/seek_accuracy.c +261 -0
  333. data/mpg123/src/tests/seek_whence.c +56 -0
  334. data/mpg123/src/tests/testtext.h +34 -0
  335. data/mpg123/src/tests/text.c +80 -0
  336. data/mpg123/src/wav.c +464 -0
  337. data/mpg123/src/wavhead.h +68 -0
  338. data/mpg123/src/win32_net.c +599 -0
  339. data/mpg123/src/win32_support.c +191 -0
  340. data/mpg123/src/win32_support.h +152 -0
  341. data/mpg123/src/xfermem.c +321 -0
  342. data/mpg123/src/xfermem.h +74 -0
  343. data/mpg123/windows-builds.sh +137 -0
  344. data/msvc/lib/OpenAL32.lib +0 -0
  345. data/spec/fixtures/heal.ogg +0 -0
  346. data/spec/fixtures/tone_up.wav +0 -0
  347. data/spec/seal/buffer_spec.rb +37 -0
  348. data/spec/seal/core_spec.rb +29 -0
  349. data/spec/seal/effect_slot_spec.rb +38 -0
  350. data/spec/seal/listener_spec.rb +33 -0
  351. data/spec/seal/reverb_spec.rb +51 -0
  352. data/spec/seal/source_spec.rb +370 -0
  353. data/spec/seal/stream_spec.rb +38 -0
  354. data/spec/spec_helper.rb +45 -0
  355. data/spec/support/attribute_examples.rb +75 -0
  356. data/spec/support/audio_object_with_format.rb +27 -0
  357. data/spec/support/movable_object.rb +22 -0
  358. data/src/libogg/bitwise.c +857 -0
  359. data/src/libogg/framing.c +2093 -0
  360. data/src/libvorbis/backends.h +144 -0
  361. data/src/libvorbis/bitrate.c +253 -0
  362. data/src/libvorbis/bitrate.h +59 -0
  363. data/src/libvorbis/block.c +1046 -0
  364. data/src/libvorbis/codebook.c +484 -0
  365. data/src/libvorbis/codebook.h +119 -0
  366. data/src/libvorbis/codec_internal.h +167 -0
  367. data/src/libvorbis/envelope.c +375 -0
  368. data/src/libvorbis/envelope.h +80 -0
  369. data/src/libvorbis/floor0.c +221 -0
  370. data/src/libvorbis/floor1.c +1100 -0
  371. data/src/libvorbis/highlevel.h +58 -0
  372. data/src/libvorbis/info.c +668 -0
  373. data/src/libvorbis/lookup.c +94 -0
  374. data/src/libvorbis/lookup.h +32 -0
  375. data/src/libvorbis/lookup_data.h +192 -0
  376. data/src/libvorbis/lpc.c +160 -0
  377. data/src/libvorbis/lpc.h +29 -0
  378. data/src/libvorbis/lsp.c +456 -0
  379. data/src/libvorbis/lsp.h +28 -0
  380. data/src/libvorbis/mapping0.c +816 -0
  381. data/src/libvorbis/masking.h +785 -0
  382. data/src/libvorbis/mdct.c +563 -0
  383. data/src/libvorbis/mdct.h +71 -0
  384. data/src/libvorbis/misc.h +57 -0
  385. data/src/libvorbis/os.h +186 -0
  386. data/src/libvorbis/psy.c +1206 -0
  387. data/src/libvorbis/psy.h +154 -0
  388. data/src/libvorbis/registry.c +45 -0
  389. data/src/libvorbis/registry.h +32 -0
  390. data/src/libvorbis/res0.c +889 -0
  391. data/src/libvorbis/scales.h +90 -0
  392. data/src/libvorbis/sharedbook.c +579 -0
  393. data/src/libvorbis/smallft.c +1255 -0
  394. data/src/libvorbis/smallft.h +34 -0
  395. data/src/libvorbis/synthesis.c +184 -0
  396. data/src/libvorbis/vorbisfile.c +2337 -0
  397. data/src/libvorbis/window.c +2135 -0
  398. data/src/libvorbis/window.h +26 -0
  399. data/src/rubyext.c +2329 -0
  400. data/src/seal/buf.c +124 -0
  401. data/src/seal/core.c +283 -0
  402. data/src/seal/efs.c +74 -0
  403. data/src/seal/err.c +118 -0
  404. data/src/seal/fmt.c +86 -0
  405. data/src/seal/listener.c +111 -0
  406. data/src/seal/mpg.c +174 -0
  407. data/src/seal/mpg.h +24 -0
  408. data/src/seal/ov.c +180 -0
  409. data/src/seal/ov.h +22 -0
  410. data/src/seal/raw.c +59 -0
  411. data/src/seal/reader.c +102 -0
  412. data/src/seal/reader.h +59 -0
  413. data/src/seal/rvb.c +368 -0
  414. data/src/seal/src.c +654 -0
  415. data/src/seal/stream.c +109 -0
  416. data/src/seal/threading.c +66 -0
  417. data/src/seal/threading.h +20 -0
  418. data/src/seal/wav.c +297 -0
  419. data/src/seal/wav.h +23 -0
  420. data/src/win32api.rb +29 -0
  421. metadata +563 -0
@@ -0,0 +1,74 @@
1
+ /*
2
+ xfermem: unidirectional fast pipe
3
+
4
+ copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
5
+ see COPYING and AUTHORS files in distribution or http://mpg123.org
6
+ initially written by Oliver Fromme
7
+ old timestamp: Sat Mar 29 04:41:34 MET 1997
8
+
9
+ This is a stand-alone module which implements a unidirectional,
10
+ fast pipe using mmap(). Its primary use is to transfer large
11
+ amounts of data from a parent process to its child process,
12
+ with a buffer in between which decouples blocking conditions
13
+ on both sides. Control information is transferred between the
14
+ processes through a socketpair. See xftest.c for an example on
15
+ how to use this module.
16
+
17
+ note: xftest not there anymore
18
+ */
19
+
20
+ #ifndef _XFERMEM_H_
21
+ #define _XFERMEM_H_
22
+
23
+ #ifndef TRUE
24
+ #define FALSE 0
25
+ #define TRUE 1
26
+ #endif
27
+
28
+ typedef struct {
29
+ size_t freeindex; /* [W] next free index */
30
+ size_t readindex; /* [R] next index to read */
31
+ int fd[2];
32
+ int wakeme[2];
33
+ byte *data;
34
+ byte *metadata;
35
+ size_t size;
36
+ size_t metasize;
37
+ long rate;
38
+ int channels;
39
+ int format;
40
+ int justwait;
41
+ } txfermem;
42
+ /*
43
+ * [W] -- May be written to by the writing process only!
44
+ * [R] -- May be written to by the reading process only!
45
+ * All other entries are initialized once.
46
+ */
47
+
48
+ void xfermem_init (txfermem **xf, size_t bufsize, size_t msize, size_t skipbuf);
49
+ void xfermem_init_writer (txfermem *xf);
50
+ void xfermem_init_reader (txfermem *xf);
51
+
52
+ size_t xfermem_get_freespace (txfermem *xf);
53
+ size_t xfermem_get_usedspace (txfermem *xf);
54
+ #define XF_CMD_WAKEUP_INFO 0x04
55
+ #define XF_CMD_WAKEUP 0x02
56
+ #define XF_CMD_TERMINATE 0x03
57
+ #define XF_CMD_AUDIOCAP 0x05
58
+ #define XF_CMD_RESYNC 0x06
59
+ #define XF_CMD_ABORT 0x07
60
+ #define XF_WRITER 0
61
+ #define XF_READER 1
62
+ int xfermem_getcmd (int fd, int block);
63
+ int xfermem_putcmd (int fd, byte cmd);
64
+ int xfermem_block (int fd, txfermem *xf);
65
+ int xfermem_sigblock (int fd, txfermem *xf, int pid, int signal);
66
+ /* returns TRUE for being interrupted */
67
+ int xfermem_write(txfermem *xf, byte *buffer, size_t bytes);
68
+
69
+ void xfermem_done (txfermem *xf);
70
+ #define xfermem_done_writer xfermem_init_reader
71
+ #define xfermem_done_reader xfermem_init_writer
72
+
73
+
74
+ #endif
@@ -0,0 +1,137 @@
1
+ #!/bin/sh
2
+
3
+ # A dirty script to create some windows binaries (shared, static, debug, ...) using the MSYS environment.
4
+
5
+ # give build type as command line argument
6
+ # x86 or x86_64-cross
7
+ build_type=$1
8
+ test -z "$build_type" && build_type=x86
9
+
10
+ echo "build type: $build_type"
11
+ case $build_type in
12
+ x86)
13
+ decoder=x86
14
+ strip=strip
15
+ hostopt=
16
+ ;;
17
+ x86_64-cross)
18
+ decoder=x86-64
19
+ strip=x86_64-w64-mingw32-strip
20
+ hostopt="--host=x86_64-w64-mingw32 --build=`./build/config.guess`"
21
+ ;;
22
+ *)
23
+ echo "Unknown build type!"
24
+ exit 1
25
+ ;;
26
+ esac
27
+
28
+ temp="$PWD/tmp"
29
+ final="$PWD/releases"
30
+ txt="README COPYING NEWS"
31
+ # let's try with modules
32
+ opts=""
33
+ #opts="--with-audio=win32 --disable-modules"
34
+
35
+ # Get the version for the build from configure.ac .
36
+ version=`sed -n 's/^AC_INIT([^,]*, \[\([^,]*\)\], .*$/\1/p' < configure.ac`
37
+ echo "Building binaries for version $version"
38
+
39
+ prepare_dir()
40
+ {
41
+ test -e "$final" || mkdir "$final"
42
+ }
43
+
44
+ prepare_unix2dos()
45
+ {
46
+ echo "preparing unix2dos tool"
47
+ # I'll include documentation in DOS-style, with the help of this little unix2dos variant.
48
+ test -x "unix2dos" || echo "
49
+ #include <unistd.h>
50
+ #include <stdio.h>
51
+ int main()
52
+ {
53
+ char buf[1000];
54
+ ssize_t got;
55
+ while((got=read(0, buf, 1000))>0)
56
+ {
57
+ ssize_t end=0;
58
+ ssize_t pos=0;
59
+ for(end=0;end<got;++end)
60
+ {
61
+ if(buf[end] == '\n')
62
+ {
63
+ write(1, buf+pos, end-pos);
64
+ write(1, \"\r\n\", 2);
65
+ pos=end+1;
66
+ }
67
+ }
68
+ write(1, buf+pos, end-pos);
69
+ }
70
+ }" > unix2dos.c && gcc -O -o unix2dos unix2dos.c
71
+ }
72
+
73
+ mpg123_build()
74
+ {
75
+ cpu=$1
76
+ stat=$2
77
+ debug=$3
78
+ myopts=$opts
79
+ if test "$stat" = "y"; then
80
+ echo "static build (stat=$stat)" &&
81
+ name=mpg123-$version-static-$cpu
82
+ myopts="$myopts --disable-shared"
83
+ else
84
+ echo "dynamic build (stat=$stat)" &&
85
+ name=mpg123-$version-$cpu
86
+ fi &&
87
+ if test "$debug" = "y"; then
88
+ echo "Debugging build!"
89
+ name=$name-debug
90
+ myopts="$myopts --enable-debug"
91
+ fi &&
92
+ tmp=$temp-$name &&
93
+ echo "REMOVING $tmp!" &&
94
+ sleep 5 &&
95
+ if test -e Makefile; then make clean; fi &&
96
+ rm -rvf $tmp &&
97
+ ./configure $hostopt --prefix=$tmp --with-module-suffix=.dll $myopts --with-cpu=$cpu && make && make install &&
98
+ rm -rf "$final/$name" &&
99
+ mkdir "$final/$name" &&
100
+ cp -v "$tmp/bin/mpg123.exe" "$final/$name" &&
101
+ if test "$debug" = y; then
102
+ echo "Not stripping the debug build..."
103
+ else
104
+ $strip --strip-unneeded "$final/$name/"*.exe
105
+ fi &&
106
+ if test "$stat" = "y"; then
107
+ echo "No DLL there..."
108
+ else
109
+ cp -v "$tmp/bin/libmpg123"*.dll "$tmp/include/mpg123.h" "$final/$name" &&
110
+ cp -v "src/libmpg123/.libs/libmpg123"*.dll.def "$final/$name" &&
111
+ if test "$debug" = y; then
112
+ echo "Not stripping the debug build..."
113
+ else
114
+ $strip --strip-unneeded "$final/$name/"*.dll || exit 1
115
+ fi
116
+ for i in $tmp/lib/mpg123/*.dll
117
+ do
118
+ if test -e "$i"; then
119
+ plugdir="$final/$name/plugins"
120
+ mkdir -p "$plugdir" &&
121
+ cp -v "$i" "$plugdir"
122
+ fi
123
+ done
124
+ fi &&
125
+ for i in $txt
126
+ do
127
+ echo "text file $i -> $final/$name/$i.txt"
128
+ ./unix2dos < "$i" > "$final/$name/$i.txt"
129
+ done
130
+ }
131
+
132
+ prepare_dir &&
133
+ prepare_unix2dos &&
134
+ mpg123_build $decoder y n &&
135
+ mpg123_build $decoder n n &&
136
+ mpg123_build $decoder n y &&
137
+ echo "Hurray! Note: Please do not forget to copy the libltdl DLL from MSYS to the dynamic build directories... " || echo "Bleh..."
Binary file
Binary file
Binary file
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Buffer do
4
+ it_behaves_like 'an audio object with format'
5
+
6
+ describe 'size after reading' do
7
+ context 'from the WAVE file' do
8
+ subject { Buffer.new(WAV_PATH) }
9
+ its(:size) { should eq 2250 }
10
+ end
11
+
12
+ context 'from the Ogg Vorbise file' do
13
+ subject { Buffer.new(OV_PATH) }
14
+ its(:size) { should eq 85342 }
15
+ end
16
+ end
17
+
18
+ it 'cannot be changed if it is being used by a source' do
19
+ error_pattern = /Invalid operation/
20
+ source = Source.new
21
+ another_source = Source.new
22
+ buffer = Buffer.new(WAV_PATH)
23
+
24
+ source.buffer = buffer
25
+ another_source.buffer = buffer
26
+ # Being used by two sources.
27
+ expect { buffer.load(WAV_PATH) }.to raise_error error_pattern
28
+
29
+ source.buffer = nil
30
+ # Still being used by one more source.
31
+ expect { buffer.load(WAV_PATH) }.to raise_error error_pattern
32
+
33
+ another_source.buffer = nil
34
+ # Not being used by any source.
35
+ expect { buffer.load(WAV_PATH) }.to_not raise_error
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Seal do
4
+ it 'should initialize and finalize correctly on default device' do
5
+ expect do
6
+ Seal.startup
7
+ Seal.cleanup
8
+ end.to_not raise_error
9
+ end
10
+
11
+ it 'should fail when trying to initialize non-existing device' do
12
+ expect { Seal.startup 'foo42' }.to raise_error SealError
13
+ end
14
+
15
+ it 'has only one instance of Listener' do
16
+ Seal.listener.should be Seal.listener
17
+ Seal.listener.should be_a Listener
18
+ expect { Seal::Listener.new }.to raise_error NoMethodError
19
+ expect { Seal::Listener.allocate }.to raise_error TypeError
20
+ end
21
+
22
+ it 'defines a limit on the number of effect slots per source' do
23
+ Seal.per_source_effect_limit.should be_an Integer
24
+ end
25
+
26
+ it 'defines a version string' do
27
+ Seal::VERSION.should match /\d\.\d\.\d/
28
+ end
29
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe EffectSlot do
4
+ before(:each) { GC.start }
5
+
6
+ describe 'by default' do
7
+ its(:auto?) { should be_true }
8
+ its(:effect) { should be_nil }
9
+ its(:gain) { should eq 1.0 }
10
+ end
11
+
12
+ it_validates 'the boolean attribute', :auto
13
+ it_validates 'the float attribute', :gain, "[0, 1]"
14
+
15
+ it 'can initialize with an effect' do
16
+ reverb = Reverb.new
17
+ effect_slot = EffectSlot.new(reverb)
18
+ effect_slot.effect.should be reverb
19
+ end
20
+
21
+ it 'can set an effect' do
22
+ effect_slot = subject
23
+ reverb = Reverb.new
24
+ effect_slot.effect = reverb
25
+ effect_slot.effect.should be reverb
26
+ end
27
+
28
+ it 'has a limited number of sources it can feed concurrently' do
29
+ effect_slot = subject
30
+ sources = []
31
+ Seal.per_source_effect_limit.times do |i|
32
+ sources << Source.new
33
+ effect_slot.feed(i, sources[-1])
34
+ end
35
+ expect { effect_slot.feed(sources.size, Source.new) }.to raise_error \
36
+ /Invalid parameter value/
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Listener do
4
+ subject { LISTENER }
5
+
6
+ it_behaves_like 'a movable object'
7
+
8
+ describe 'by default' do
9
+ its(:gain) { should eq 1.0 }
10
+ its(:orientation) { should eq [[0, 0, -1], [0, 1, 0]] }
11
+ end
12
+
13
+ it 'can change its orientation' do
14
+ old_orientation = LISTENER.orientation
15
+ LISTENER.orientation = [0, 1, 0], [3, 0, 0]
16
+ LISTENER.orientation[0].should eq [0, 1, 0]
17
+ LISTENER.orientation[1].should eq [3, 0, 0]
18
+ LISTENER.orientation = old_orientation
19
+ end
20
+
21
+ it "validates the float attribute 'gain' is in [0, +inf.)" do
22
+ old_gain = LISTENER.gain
23
+ LISTENER.gain = 0.34767
24
+ LISTENER.gain.should be_within(TOLERANCE).of 0.34767
25
+ LISTENER.gain = 10
26
+ error_pattern = /Invalid parameter value/
27
+ expect { LISTENER.gain = -0.1 }.to raise_error error_pattern
28
+ expect { LISTENER.gain = -1.3 }.to raise_error error_pattern
29
+ expect { LISTENER.gain = -3203 }.to raise_error error_pattern
30
+ LISTENER.gain.should eq 10
31
+ LISTENER.gain = old_gain
32
+ end
33
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reverb do
4
+ describe 'by default' do
5
+ its(:air_absorbtion_hfgain) { should be_within(TOLERANCE).of 0.994 }
6
+ its(:decay_time) { should be_within(TOLERANCE).of 1.49 }
7
+ its(:diffusion) { should be_within(TOLERANCE).of 1.0 }
8
+ its(:density) { should be_within(TOLERANCE).of 1.0 }
9
+ its(:gain) { should be_within(TOLERANCE).of 0.32 }
10
+ its(:hfdecay_limited?) { should be_true }
11
+ its(:hfdecay_ratio) { should be_within(TOLERANCE).of 0.83 }
12
+ its(:hfgain) { should be_within(TOLERANCE).of 0.89 }
13
+ its(:late_delay) { should be_within(TOLERANCE).of 0.011 }
14
+ its(:late_gain) { should be_within(TOLERANCE).of 1.26 }
15
+ its(:reflections_delay) { should be_within(TOLERANCE).of 0.007 }
16
+ its(:reflections_gain) { should be_within(TOLERANCE).of 0.05 }
17
+ its(:room_rolloff_factor) { should be_within(TOLERANCE).of 0 }
18
+ end
19
+
20
+ it_validates 'the boolean attribute', :hfdecay_limited
21
+ it_validates 'the float attribute', :air_absorbtion_hfgain, '[0.892, 1]'
22
+ it_validates 'the float attribute', :decay_time, '[0.1, 20]'
23
+ it_validates 'the float attribute', :density, '[0, 1]'
24
+ it_validates 'the float attribute', :diffusion, '[0, 1]'
25
+ it_validates 'the float attribute', :gain, '[0, 1]'
26
+ it_validates 'the float attribute', :hfdecay_ratio, '[0.1, 2]'
27
+ it_validates 'the float attribute', :hfgain, '[0, 1]'
28
+ it_validates 'the float attribute', :late_delay, '[0, 0.1]'
29
+ it_validates 'the float attribute', :late_gain, '[0, 10]'
30
+ it_validates 'the float attribute', :reflections_delay, '[0, 0.3]'
31
+ it_validates 'the float attribute', :reflections_gain, '[0, 3.16]'
32
+ it_validates 'the float attribute', :room_rolloff_factor, '[0, 10]'
33
+
34
+ it 'can load different reverb presets' do
35
+ test_load_presets = -> a_module do
36
+ a_module.constants.each do |const_sym|
37
+ constant = a_module.const_get const_sym
38
+ case constant
39
+ when Module
40
+ test_load_presets.call(constant)
41
+ else
42
+ expect do
43
+ reverb = Reverb.new(constant)
44
+ reverb.load(constant)
45
+ end.to_not raise_error
46
+ end
47
+ end
48
+ end
49
+ test_load_presets.call(Reverb::Preset)
50
+ end
51
+ end
@@ -0,0 +1,370 @@
1
+ require 'spec_helper'
2
+
3
+ include Source::State
4
+ include Source::Type
5
+
6
+ describe Source do
7
+ let(:source) { Source.new }
8
+ let(:stream) { Stream.new(WAV_PATH) }
9
+ let(:buffer) { Buffer.new(WAV_PATH) }
10
+
11
+ it_behaves_like 'a movable object'
12
+
13
+ describe 'by default' do
14
+ its(:auto?) { should be_true }
15
+ its(:buffer) { should be_nil }
16
+ its(:chunk_size) { should eq 36864 }
17
+ its(:gain) { should be_within(TOLERANCE).of(1.0) }
18
+ its(:looping) { should be_false }
19
+ its(:pitch) { should be_within(TOLERANCE).of(1.0) }
20
+ its(:queue_size) { should eq 3 }
21
+ its(:relative) { should be_false }
22
+ its(:state) { should be INITIAL }
23
+ its(:stream) { should be_nil }
24
+ its (:type) { should be UNDETERMINED }
25
+ end
26
+
27
+ it_validates 'the boolean attribute', :relative
28
+ it_validates 'the boolean attribute', :auto
29
+ it_validates 'the float attribute', :pitch, "[0, +inf.)"
30
+ it_validates 'the float attribute', :gain, "[0, +inf.)"
31
+
32
+ it 'validates its queue size is in [2, 63]' do
33
+ error_pattern = /Invalid parameter value/
34
+ expect { source.queue_size = -130 }.to raise_error error_pattern
35
+ expect { source.queue_size = 0 }.to raise_error error_pattern
36
+ expect { source.queue_size = 1 }.to raise_error error_pattern
37
+ source.queue_size = 2
38
+ source.queue_size.should eq 2
39
+ source.queue_size = 32
40
+ source.queue_size.should eq 32
41
+ source.queue_size = 63
42
+ source.queue_size.should eq 63
43
+ expect { source.queue_size = 64 }.to raise_error error_pattern
44
+ expect { source.queue_size = 1203 }.to raise_error error_pattern
45
+ source.queue_size.should eq 63
46
+ end
47
+
48
+ it 'validates it has an auto-adjusting chunk size in [9216, 16773120]' do
49
+ error_pattern = /Invalid parameter value/
50
+ expect { source.chunk_size = 0 }.to raise_error error_pattern
51
+ expect { source.chunk_size = 432 }.to raise_error error_pattern
52
+ expect { source.chunk_size = 9215 }.to raise_error error_pattern
53
+ source.chunk_size = 9216
54
+ source.chunk_size.should eq 9216
55
+ # It should be automatically adjusted to a smaller multiple of 9216.
56
+ source.chunk_size = 9217
57
+ source.chunk_size.should eq 9216
58
+ source.chunk_size = 32768
59
+ source.chunk_size.should eq 27648
60
+ source.chunk_size = 294912
61
+ source.chunk_size.should eq 294912
62
+ source.chunk_size = 16773119
63
+ source.chunk_size.should eq 16763904
64
+ source.chunk_size = 16773120
65
+ source.chunk_size.should eq 16773120
66
+ expect { source.chunk_size = 16773121 }.to raise_error error_pattern
67
+ expect { source.chunk_size = 234923428 }.to raise_error error_pattern
68
+ end
69
+
70
+ context 'with a buffer' do
71
+ before(:each) { source.buffer = buffer }
72
+
73
+ it 'cannot also have a stream unless buffer is detached' do
74
+ error_pattern = /attach a stream to a static source/
75
+ expect { source.stream = stream }.to raise_error error_pattern
76
+ source.play
77
+ expect { source.stream = stream }.to raise_error error_pattern
78
+ source.pause
79
+ expect { source.stream = stream }.to raise_error error_pattern
80
+ source.stop
81
+ expect { source.stream = stream }.to raise_error error_pattern
82
+ source.buffer = nil
83
+ expect { source.stream = stream }.to_not raise_error
84
+ end
85
+
86
+ it 'cannot change its buffer while playing' do
87
+ source.play
88
+ expect { source.buffer = buffer }.to raise_error /Invalid operation/
89
+ end
90
+
91
+ it 'cannot change its buffer while paused' do
92
+ source.play
93
+ source.pause
94
+ expect { source.buffer = buffer }.to raise_error /Invalid operation/
95
+ end
96
+
97
+ it 'can change its buffer while stopped' do
98
+ source.play
99
+ source.stop
100
+ expect { source.buffer = buffer }.to_not raise_error
101
+ end
102
+
103
+ it 'can change its buffer while in initial state' do
104
+ expect { source.buffer = buffer }.to_not raise_error
105
+ end
106
+
107
+ it 'can share its buffer' do
108
+ expect do
109
+ another_source = Source.new
110
+ another_source.buffer = source.buffer
111
+ another_source.play
112
+ source.play
113
+ end.to_not raise_error
114
+ end
115
+ end
116
+
117
+ context 'with a stream' do
118
+ let(:another_stream) { Stream.new(WAV_PATH) }
119
+
120
+ before(:each) { source.stream = stream }
121
+
122
+ it 'can set the same stream to itself' do
123
+ expect { source.stream = stream }.to_not raise_error
124
+ end
125
+
126
+ it 'cannot also have a buffer unless stream is detached' do
127
+ error_pattern = /attach a buffer to a streaming source/
128
+ expect { source.buffer = buffer }.to raise_error error_pattern
129
+ source.play
130
+ expect { source.buffer = buffer }.to raise_error error_pattern
131
+ source.pause
132
+ expect { source.buffer = buffer }.to raise_error error_pattern
133
+ source.stop
134
+ expect { source.buffer = buffer }.to raise_error error_pattern
135
+ source.stream = nil
136
+ expect { source.buffer = buffer }.to_not raise_error
137
+ end
138
+
139
+ it 'cannot have a closed stream' do
140
+ another_stream.close
141
+ expect { source.stream = another_stream }.to raise_error \
142
+ /uninitialized stream/
143
+ end
144
+
145
+ it 'can only change its stream to one with compatible format' do
146
+ expect { source.stream = another_stream }.to_not raise_error
147
+ expect { source.stream = Stream.new(OV_PATH) }.to raise_error \
148
+ /different audio format/
149
+ end
150
+
151
+ it 'can change to another stream in any state' do
152
+ expect do
153
+ source.stream = another_stream
154
+ source.play
155
+ source.stream = another_stream
156
+ source.pause
157
+ source.stream = another_stream
158
+ source.stop
159
+ source.stream = another_stream
160
+ end.to_not raise_error
161
+ end
162
+
163
+ it 'can share its stream' do
164
+ expect do
165
+ another_source = Source.new
166
+ another_source.stream = stream
167
+ another_source.play
168
+ source.play
169
+ source.stream = another_stream
170
+ another_source.stream = another_stream
171
+ end.to_not raise_error
172
+ end
173
+
174
+ it 'fails to perform if stream is closed' do
175
+ error_pattern = /uninitialized stream/
176
+ stream.close
177
+ expect { source.update }.to raise_error error_pattern
178
+ expect { source.stop }.to raise_error error_pattern
179
+ expect { source.play }.to raise_error error_pattern
180
+ end
181
+ end
182
+
183
+ describe 'automatic streaming' do
184
+ let(:source) do
185
+ Source.new.tap do |source|
186
+ source.stream = Stream.new(OV_PATH)
187
+ source.looping = true
188
+ source.pitch = 3
189
+ end
190
+ end
191
+
192
+ it 'continues in the background' do
193
+ source.play
194
+ sleep(0.5)
195
+ source.state.should be PLAYING
196
+ end
197
+
198
+ it 'can be disabled (taking effect upon the next play call)' do
199
+ source.play
200
+ source.auto = false
201
+ sleep(0.5)
202
+ # Not stopping streaming until the next play call.
203
+ source.state.should be PLAYING
204
+ source.play
205
+ sleep(0.5)
206
+ source.state.should be STOPPED
207
+ end
208
+ end
209
+
210
+ describe 'looping' do
211
+ example 'as undetermined type' do
212
+ source.looping?.should be_false
213
+ source.looping = true
214
+ source.looping.should be_true
215
+ source.looping = false
216
+ source.looping?.should be_false
217
+ end
218
+
219
+ example 'as streaming type' do
220
+ source.looping = true
221
+ source.stream = stream
222
+ source.looping?.should be_true
223
+ source.looping = false
224
+ source.looping?.should be_false
225
+ source.looping = true
226
+ source.looping?.should be_true
227
+ end
228
+
229
+ example 'as static type' do
230
+ source.looping = true
231
+ source.buffer = buffer
232
+ source.looping?.should be_true
233
+ source.looping = false
234
+ source.looping?.should be_false
235
+ source.looping = true
236
+ source.looping?.should be_true
237
+ end
238
+
239
+ # This example depends on the length of the test audio file.
240
+ it 'is true if and only if source repeats' do
241
+ source.stream = stream
242
+ source.pitch = 2
243
+ source.play
244
+ sleep(0.3)
245
+ source.state.should be STOPPED
246
+ source.looping = true
247
+ source.play
248
+ sleep(0.3)
249
+ source.state.should be PLAYING
250
+ end
251
+ end
252
+
253
+ describe 'type' do
254
+ it 'should initially be undetermined' do
255
+ source.type.should be UNDETERMINED
256
+ end
257
+
258
+ it 'should be streaming if it has a stream' do
259
+ source.stream = stream
260
+ source.type.should be STREAMING
261
+ end
262
+
263
+ it 'should be static if it has a buffer' do
264
+ source.buffer = buffer
265
+ source.type.should be STATIC
266
+ end
267
+
268
+ it 'should be undetermined after detaching' do
269
+ source.stream = stream
270
+ source.stream = nil
271
+ source.type.should be UNDETERMINED
272
+ source.buffer = buffer
273
+ source.buffer = nil
274
+ source.type.should be UNDETERMINED
275
+ end
276
+ end
277
+
278
+ describe 'state transition' do
279
+ before :each do
280
+ source.tap { |source| source.stream = stream }
281
+ end
282
+
283
+ example 'from initial state' do
284
+ source.state.should be INITIAL
285
+ source.stop
286
+ source.state.should be INITIAL
287
+ source.pause
288
+ source.state.should be INITIAL
289
+ source.rewind
290
+ source.state.should be INITIAL
291
+ source.play
292
+ source.state.should be PLAYING
293
+ end
294
+
295
+ example 'from playing state' do
296
+ source.play
297
+ source.state.should be PLAYING
298
+ source.rewind
299
+ source.state.should be INITIAL
300
+ source.play
301
+ source.stop
302
+ source.state.should be STOPPED
303
+ source.play
304
+ source.pause
305
+ source.state.should be PAUSED
306
+ source.play
307
+ source.play
308
+ source.state.should be PLAYING
309
+ end
310
+
311
+ example 'from paused state' do
312
+ source.play
313
+ source.pause
314
+ source.state.should be PAUSED
315
+ source.play
316
+ source.state.should be PLAYING
317
+ source.pause
318
+ source.rewind
319
+ source.state.should be INITIAL
320
+ source.play
321
+ source.pause
322
+ source.stop
323
+ source.state.should be STOPPED
324
+ end
325
+
326
+ example 'from stopped state' do
327
+ source.play
328
+ source.stop
329
+ source.state.should be STOPPED
330
+ source.pause
331
+ source.state.should be STOPPED
332
+ source.play
333
+ source.state.should be PLAYING
334
+ source.stop
335
+ source.rewind
336
+ source.state.should be INITIAL
337
+ end
338
+
339
+ context 'when detaching' do
340
+ example 'from initial state' do
341
+ source.state.should be INITIAL
342
+ source.stream = nil
343
+ source.state.should be INITIAL
344
+ end
345
+
346
+ example 'from playing state' do
347
+ source.play
348
+ source.state.should be PLAYING
349
+ source.stream = nil
350
+ source.state.should be INITIAL
351
+ end
352
+
353
+ example 'from paused state' do
354
+ source.play
355
+ source.pause
356
+ source.state.should be PAUSED
357
+ source.stream = nil
358
+ source.state.should be INITIAL
359
+ end
360
+
361
+ example 'from stopped state' do
362
+ source.play
363
+ source.stop
364
+ source.state.should be STOPPED
365
+ source.stream = nil
366
+ source.state.should be INITIAL
367
+ end
368
+ end
369
+ end
370
+ end