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,809 @@
1
+ /*
2
+ control_generic.c: control interface for frontends and real console warriors
3
+
4
+ copyright 1997-99,2004-8 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 Andreas Neuhaus and Michael Hipp
7
+ reworked by Thomas Orgis - it was the entry point for eventually becoming maintainer...
8
+ */
9
+
10
+ #include "mpg123app.h"
11
+ #include <stdarg.h>
12
+ #include <ctype.h>
13
+ #if !defined (WIN32) || defined (__CYGWIN__)
14
+ #include <sys/wait.h>
15
+ #include <sys/socket.h>
16
+ #endif
17
+ #include <fcntl.h>
18
+ #include <errno.h>
19
+ #include <string.h>
20
+
21
+ #include "common.h"
22
+ #include "buffer.h"
23
+ #include "genre.h"
24
+ #include "playlist.h"
25
+ #define MODE_STOPPED 0
26
+ #define MODE_PLAYING 1
27
+ #define MODE_PAUSED 2
28
+
29
+ extern int buffer_pid;
30
+ extern audio_output_t *ao;
31
+
32
+ #ifdef FIFO
33
+ #include <sys/stat.h>
34
+ int control_file = STDIN_FILENO;
35
+ #else
36
+ #define control_file STDIN_FILENO
37
+ #ifdef WANT_WIN32_FIFO
38
+ #error Control interface does not work on win32 stdin
39
+ #endif /* WANT_WIN32_FIFO */
40
+ #endif
41
+ FILE *outstream;
42
+ static int mode = MODE_STOPPED;
43
+ static int init = 0;
44
+
45
+ #include "debug.h"
46
+
47
+ void generic_sendmsg (const char *fmt, ...)
48
+ {
49
+ va_list ap;
50
+ fprintf(outstream, "@");
51
+ va_start(ap, fmt);
52
+ vfprintf(outstream, fmt, ap);
53
+ va_end(ap);
54
+ fprintf(outstream, "\n");
55
+ }
56
+
57
+ /* Split up a number of lines separated by \n, \r, both or just zero byte
58
+ and print out each line with specified prefix. */
59
+ static void generic_send_lines(const char* fmt, mpg123_string *inlines)
60
+ {
61
+ size_t i;
62
+ int hadcr = 0, hadlf = 0;
63
+ char *lines = NULL;
64
+ char *line = NULL;
65
+ size_t len = 0;
66
+
67
+ if(inlines != NULL && inlines->fill)
68
+ {
69
+ lines = inlines->p;
70
+ len = inlines->fill;
71
+ }
72
+ else return;
73
+
74
+ line = lines;
75
+ for(i=0; i<len; ++i)
76
+ {
77
+ if(lines[i] == '\n' || lines[i] == '\r' || lines[i] == 0)
78
+ {
79
+ char save = lines[i]; /* saving, changing, restoring a byte in the data */
80
+ if(save == '\n') ++hadlf;
81
+ if(save == '\r') ++hadcr;
82
+ if((hadcr || hadlf) && hadlf % 2 == 0 && hadcr % 2 == 0) line = "";
83
+
84
+ if(line)
85
+ {
86
+ lines[i] = 0;
87
+ generic_sendmsg(fmt, line);
88
+ line = NULL;
89
+ lines[i] = save;
90
+ }
91
+ }
92
+ else
93
+ {
94
+ hadlf = hadcr = 0;
95
+ if(line == NULL) line = lines+i;
96
+ }
97
+ }
98
+ }
99
+
100
+ void generic_sendstat (mpg123_handle *fr)
101
+ {
102
+ off_t current_frame, frames_left;
103
+ double current_seconds, seconds_left;
104
+ if(!mpg123_position(fr, 0, xfermem_get_usedspace(buffermem), &current_frame, &frames_left, &current_seconds, &seconds_left))
105
+ generic_sendmsg("F %"OFF_P" %"OFF_P" %3.2f %3.2f", (off_p)current_frame, (off_p)frames_left, current_seconds, seconds_left);
106
+ }
107
+
108
+ static void generic_sendv1(mpg123_id3v1 *v1, const char *prefix)
109
+ {
110
+ int i;
111
+ char info[125] = "";
112
+ memcpy(info, v1->title, 30);
113
+ memcpy(info+30, v1->artist, 30);
114
+ memcpy(info+60, v1->album, 30);
115
+ memcpy(info+90, v1->year, 4);
116
+ memcpy(info+94, v1->comment, 30);
117
+
118
+ for(i=0;i<124; ++i) if(info[i] == 0) info[i] = ' ';
119
+ info[i] = 0;
120
+ generic_sendmsg("%s ID3:%s%s", prefix, info, (v1->genre<=genre_count) ? genre_table[v1->genre] : "Unknown");
121
+ generic_sendmsg("%s ID3.genre:%i", prefix, v1->genre);
122
+ if(v1->comment[28] == 0 && v1->comment[29] != 0)
123
+ generic_sendmsg("%s ID3.track:%i", prefix, (unsigned char)v1->comment[29]);
124
+ }
125
+
126
+ static void generic_sendinfoid3(mpg123_handle *mh)
127
+ {
128
+ mpg123_id3v1 *v1;
129
+ mpg123_id3v2 *v2;
130
+ if(MPG123_OK != mpg123_id3(mh, &v1, &v2))
131
+ {
132
+ error1("Cannot get ID3 data: %s", mpg123_strerror(mh));
133
+ return;
134
+ }
135
+ if(v1 != NULL)
136
+ {
137
+ generic_sendv1(v1, "I");
138
+ }
139
+ if(v2 != NULL)
140
+ {
141
+ generic_send_lines("I ID3v2.title:%s", v2->title);
142
+ generic_send_lines("I ID3v2.artist:%s", v2->artist);
143
+ generic_send_lines("I ID3v2.album:%s", v2->album);
144
+ generic_send_lines("I ID3v2.year:%s", v2->year);
145
+ generic_send_lines("I ID3v2.comment:%s", v2->comment);
146
+ generic_send_lines("I ID3v2.genre:%s", v2->genre);
147
+ }
148
+ }
149
+
150
+ void generic_sendalltag(mpg123_handle *mh)
151
+ {
152
+ mpg123_id3v1 *v1;
153
+ mpg123_id3v2 *v2;
154
+ generic_sendmsg("T {");
155
+ if(MPG123_OK != mpg123_id3(mh, &v1, &v2))
156
+ {
157
+ error1("Cannot get ID3 data: %s", mpg123_strerror(mh));
158
+ v2 = NULL;
159
+ v1 = NULL;
160
+ }
161
+ if(v1 != NULL) generic_sendv1(v1, "T");
162
+
163
+ if(v2 != NULL)
164
+ {
165
+ size_t i;
166
+ for(i=0; i<v2->texts; ++i)
167
+ {
168
+ char id[5];
169
+ memcpy(id, v2->text[i].id, 4);
170
+ id[4] = 0;
171
+ generic_sendmsg("T ID3v2.%s:", id);
172
+ generic_send_lines("T =%s", &v2->text[i].text);
173
+ }
174
+ for(i=0; i<v2->extras; ++i)
175
+ {
176
+ char id[5];
177
+ memcpy(id, v2->extra[i].id, 4);
178
+ id[4] = 0;
179
+ generic_sendmsg("T ID3v2.%s desc(%s):",
180
+ id,
181
+ v2->extra[i].description.fill ? v2->extra[i].description.p : "" );
182
+ generic_send_lines("T =%s", &v2->extra[i].text);
183
+ }
184
+ for(i=0; i<v2->comments; ++i)
185
+ {
186
+ char id[5];
187
+ char lang[4];
188
+ memcpy(id, v2->comment_list[i].id, 4);
189
+ id[4] = 0;
190
+ memcpy(lang, v2->comment_list[i].lang, 3);
191
+ lang[3] = 0;
192
+ generic_sendmsg("T ID3v2.%s lang(%s) desc(%s):",
193
+ id, lang,
194
+ v2->comment_list[i].description.fill ? v2->comment_list[i].description.p : "");
195
+ generic_send_lines("T =%s", &v2->comment_list[i].text);
196
+ }
197
+ }
198
+ generic_sendmsg("T }");
199
+ }
200
+
201
+ void generic_sendinfo (char *filename)
202
+ {
203
+ char *s, *t;
204
+ s = strrchr(filename, '/');
205
+ if (!s)
206
+ s = filename;
207
+ else
208
+ s++;
209
+ t = strrchr(s, '.');
210
+ if (t)
211
+ *t = 0;
212
+ generic_sendmsg("I %s", s);
213
+ }
214
+
215
+ static void generic_load(mpg123_handle *fr, char *arg, int state)
216
+ {
217
+ if(param.usebuffer)
218
+ {
219
+ buffer_resync();
220
+ if(mode == MODE_PAUSED && state != MODE_PAUSED) buffer_start();
221
+ }
222
+ if(mode != MODE_STOPPED)
223
+ {
224
+ close_track();
225
+ mode = MODE_STOPPED;
226
+ }
227
+ if(!open_track(arg))
228
+ {
229
+ generic_sendmsg("E Error opening stream: %s", arg);
230
+ generic_sendmsg("P 0");
231
+ return;
232
+ }
233
+ mpg123_seek(fr, 0, SEEK_SET); /* This finds ID3v2 at beginning. */
234
+ if(mpg123_meta_check(fr) & MPG123_NEW_ID3)
235
+ {
236
+ generic_sendinfoid3(fr);
237
+ mpg123_meta_free(fr);
238
+ }
239
+ else generic_sendinfo(arg);
240
+
241
+ if(htd.icy_name.fill) generic_sendmsg("I ICY-NAME: %s", htd.icy_name.p);
242
+ if(htd.icy_url.fill) generic_sendmsg("I ICY-URL: %s", htd.icy_url.p);
243
+
244
+ mode = state;
245
+ init = 1;
246
+ generic_sendmsg(mode == MODE_PAUSED ? "P 1" : "P 2");
247
+ }
248
+
249
+ static void generic_loadlist(mpg123_handle *fr, char *arg)
250
+ {
251
+ /* arguments are two: first the index to play, then the URL */
252
+ long entry;
253
+ long i = 0;
254
+ char *file = NULL;
255
+ char *thefile = NULL;
256
+
257
+ /* I feel retarted with string parsing outside Perl. */
258
+ while(*arg && isspace(*arg)) ++arg;
259
+ entry = atol(arg);
260
+ while(*arg && !isspace(*arg)) ++arg;
261
+ while(*arg && isspace(*arg)) ++arg;
262
+ if(!*arg)
263
+ {
264
+ generic_sendmsg("E empty list name");
265
+ return;
266
+ }
267
+
268
+ /* Now got the plain playlist path in arg. On to evil manupulation of mpg123's playlist code. */
269
+ param.listname = arg;
270
+ param.listentry = 0; /* The playlist shall not filter. */
271
+ prepare_playlist(0, NULL);
272
+ while((file = get_next_file()))
273
+ {
274
+ ++i;
275
+ /* semantics: 0 brings you to the last track */
276
+ if(entry == 0 || entry == i) thefile = file;
277
+
278
+ generic_sendmsg("I LISTENTRY %li: %s", i, file);
279
+ }
280
+ if(!i) generic_sendmsg("I LIST EMPTY");
281
+
282
+ /* If we have something to play, play it. */
283
+ if(thefile) generic_load(fr, thefile, MODE_PLAYING);
284
+
285
+ free_playlist(); /* Free memory after it is not needed anymore. */
286
+ }
287
+
288
+ int control_generic (mpg123_handle *fr)
289
+ {
290
+ struct timeval tv;
291
+ fd_set fds;
292
+ int n;
293
+
294
+ /* ThOr */
295
+ char alive = 1;
296
+ char silent = 0;
297
+
298
+ /* responses to stderr for frontends needing audio data from stdout */
299
+ if (param.remote_err)
300
+ outstream = stderr;
301
+ else
302
+ outstream = stdout;
303
+
304
+ #ifndef WIN32
305
+ setlinebuf(outstream);
306
+ #else /* perhaps just use setvbuf as it's C89 */
307
+ /*
308
+ fprintf(outstream, "You are on Win32 and want to use the control interface... tough luck: We need a replacement for select on STDIN first.\n");
309
+ return 0;
310
+ setvbuf(outstream, (char*)NULL, _IOLBF, 0);
311
+ */
312
+ #endif
313
+ /* the command behaviour is different, so is the ID */
314
+ /* now also with version for command availability */
315
+ fprintf(outstream, "@R MPG123 (ThOr) v7\n");
316
+ #ifdef FIFO
317
+ if(param.fifo)
318
+ {
319
+ if(param.fifo[0] == 0)
320
+ {
321
+ error("You wanted an empty FIFO name??");
322
+ return 1;
323
+ }
324
+ #ifndef WANT_WIN32_FIFO
325
+ unlink(param.fifo);
326
+ if(mkfifo(param.fifo, 0666) == -1)
327
+ {
328
+ error2("Failed to create FIFO at %s (%s)", param.fifo, strerror(errno));
329
+ return 1;
330
+ }
331
+ debug("going to open named pipe ... blocking until someone gives command");
332
+ #endif /* WANT_WIN32_FIFO */
333
+ #ifdef WANT_WIN32_FIFO
334
+ control_file = win32_fifo_mkfifo(param.fifo);
335
+ #else
336
+ control_file = open(param.fifo,O_RDONLY);
337
+ #endif /* WANT_WIN32_FIFO */
338
+ debug("opened");
339
+ }
340
+ #endif
341
+
342
+ while (alive)
343
+ {
344
+ tv.tv_sec = 0;
345
+ tv.tv_usec = 0;
346
+ FD_ZERO(&fds);
347
+ FD_SET(control_file, &fds);
348
+ /* play frame if no command needs to be processed */
349
+ if (mode == MODE_PLAYING) {
350
+ #ifdef WANT_WIN32_FIFO
351
+ n = win32_fifo_read_peek(&tv);
352
+ #else
353
+ n = select(32, &fds, NULL, NULL, &tv);
354
+ #endif
355
+ if (n == 0) {
356
+ if (!play_frame())
357
+ {
358
+ /* When the track ended, user may want to keep it open (to seek back),
359
+ so there is a decision between stopping and pausing at the end. */
360
+ if(param.keep_open)
361
+ {
362
+ mode = MODE_PAUSED;
363
+ /* Hm, buffer should be stopped already, shouldn't it? */
364
+ if(param.usebuffer) buffer_stop();
365
+ generic_sendmsg("P 1");
366
+ }
367
+ else
368
+ {
369
+ mode = MODE_STOPPED;
370
+ close_track();
371
+ generic_sendmsg("P 0");
372
+ }
373
+ continue;
374
+ }
375
+ if (init) {
376
+ print_remote_header(fr);
377
+ init = 0;
378
+ }
379
+ if(silent == 0)
380
+ {
381
+ generic_sendstat(fr);
382
+ if(mpg123_meta_check(fr) & MPG123_NEW_ICY)
383
+ {
384
+ char *meta;
385
+ if(mpg123_icy(fr, &meta) == MPG123_OK)
386
+ generic_sendmsg("I ICY-META: %s", meta != NULL ? meta : "<nil>");
387
+ }
388
+ }
389
+ }
390
+ }
391
+ else {
392
+ /* wait for command */
393
+ while (1) {
394
+ #ifdef WANT_WIN32_FIFO
395
+ n = win32_fifo_read_peek(NULL);
396
+ #else
397
+ n = select(32, &fds, NULL, NULL, NULL);
398
+ #endif
399
+ if (n > 0)
400
+ break;
401
+ }
402
+ }
403
+
404
+ /* on error */
405
+ if (n < 0) {
406
+ fprintf(stderr, "Error waiting for command: %s\n", strerror(errno));
407
+ return 1;
408
+ }
409
+
410
+ /* read & process commands */
411
+ if (n > 0)
412
+ {
413
+ short int len = 1; /* length of buffer */
414
+ char *cmd, *arg; /* variables for parsing, */
415
+ char *comstr = NULL; /* gcc thinks that this could be used uninitialited... */
416
+ char buf[REMOTE_BUFFER_SIZE];
417
+ short int counter;
418
+ char *next_comstr = buf; /* have it initialized for first command */
419
+
420
+ /* read as much as possible, maybe multiple commands */
421
+ /* When there is nothing to read (EOF) or even an error, it is the end */
422
+ #ifdef WANT_WIN32_FIFO
423
+ len = win32_fifo_read(buf,REMOTE_BUFFER_SIZE);
424
+ #else
425
+ len = read(control_file, buf, REMOTE_BUFFER_SIZE);
426
+ #endif
427
+ if(len < 1)
428
+ {
429
+ #ifdef FIFO
430
+ if(len == 0 && param.fifo)
431
+ {
432
+ debug("fifo ended... reopening");
433
+ #ifdef WANT_WIN32_FIFO
434
+ win32_fifo_mkfifo(param.fifo);
435
+ #else
436
+ close(control_file);
437
+ control_file = open(param.fifo,O_RDONLY|O_NONBLOCK);
438
+ #endif
439
+ if(control_file < 0){ error1("open of fifo failed... %s", strerror(errno)); break; }
440
+ continue;
441
+ }
442
+ #endif
443
+ if(len < 0) error1("command read error: %s", strerror(errno));
444
+ break;
445
+ }
446
+
447
+ debug1("read %i bytes of commands", len);
448
+ /* one command on a line - separation by \n -> C strings in a row */
449
+ for(counter = 0; counter < len; ++counter)
450
+ {
451
+ /* line end is command end */
452
+ if( (buf[counter] == '\n') || (buf[counter] == '\r') )
453
+ {
454
+ debug1("line end at counter=%i", counter);
455
+ buf[counter] = 0; /* now it's a properly ending C string */
456
+ comstr = next_comstr;
457
+
458
+ /* skip the additional line ender of \r\n or \n\r */
459
+ if( (counter < (len - 1)) && ((buf[counter+1] == '\n') || (buf[counter+1] == '\r')) ) buf[++counter] = 0;
460
+
461
+ /* next "real" char is first of next command */
462
+ next_comstr = buf + counter+1;
463
+
464
+ /* directly process the command now */
465
+ debug1("interpreting command: %s", comstr);
466
+ if(strlen(comstr) == 0) continue;
467
+
468
+ /* PAUSE */
469
+ if (!strcasecmp(comstr, "P") || !strcasecmp(comstr, "PAUSE")) {
470
+ if(mode != MODE_STOPPED)
471
+ {
472
+ if (mode == MODE_PLAYING) {
473
+ mode = MODE_PAUSED;
474
+ if(param.usebuffer) buffer_stop();
475
+ generic_sendmsg("P 1");
476
+ } else {
477
+ mode = MODE_PLAYING;
478
+ if(param.usebuffer) buffer_start();
479
+ generic_sendmsg("P 2");
480
+ }
481
+ } else generic_sendmsg("P 0");
482
+ continue;
483
+ }
484
+
485
+ /* STOP */
486
+ if (!strcasecmp(comstr, "S") || !strcasecmp(comstr, "STOP")) {
487
+ if (mode != MODE_STOPPED) {
488
+ if(param.usebuffer)
489
+ {
490
+ buffer_stop();
491
+ buffer_resync();
492
+ }
493
+ close_track();
494
+ mode = MODE_STOPPED;
495
+ generic_sendmsg("P 0");
496
+ } else generic_sendmsg("P 0");
497
+ continue;
498
+ }
499
+
500
+ /* SILENCE */
501
+ if(!strcasecmp(comstr, "SILENCE")) {
502
+ silent = 1;
503
+ generic_sendmsg("silence");
504
+ continue;
505
+ }
506
+
507
+ if(!strcasecmp(comstr, "T") || !strcasecmp(comstr, "TAG")) {
508
+ generic_sendalltag(fr);
509
+ continue;
510
+ }
511
+
512
+ if(!strcasecmp(comstr, "SCAN"))
513
+ {
514
+ if(mode != MODE_STOPPED)
515
+ {
516
+ if(mpg123_scan(fr) == MPG123_OK)
517
+ generic_sendmsg("SCAN done");
518
+ else
519
+ generic_sendmsg("E %s", mpg123_strerror(fr));
520
+ }
521
+ else generic_sendmsg("E No track loaded!");
522
+
523
+ continue;
524
+ }
525
+
526
+ if(!strcasecmp(comstr, "SAMPLE"))
527
+ {
528
+ off_t pos = mpg123_tell(fr);
529
+ off_t len = mpg123_length(fr);
530
+ /* I need to have portable printf specifiers that do not truncate the type... more autoconf... */
531
+ if(len < 0) generic_sendmsg("E %s", mpg123_strerror(fr));
532
+ else generic_sendmsg("SAMPLE %li %li", (long)pos, (long)len);
533
+ continue;
534
+ }
535
+
536
+ if(!strcasecmp(comstr, "SHOWEQ"))
537
+ {
538
+ int i;
539
+ generic_sendmsg("SHOWEQ {");
540
+ for(i=0; i<32; ++i)
541
+ {
542
+ generic_sendmsg("SHOWEQ %i : %i : %f", MPG123_LEFT, i, mpg123_geteq(fr, MPG123_LEFT, i));
543
+ generic_sendmsg("SHOWEQ %i : %i : %f", MPG123_RIGHT, i, mpg123_geteq(fr, MPG123_RIGHT, i));
544
+ }
545
+ generic_sendmsg("SHOWEQ }");
546
+ continue;
547
+ }
548
+
549
+ if(!strcasecmp(comstr, "STATE"))
550
+ {
551
+ long val;
552
+ generic_sendmsg("STATE {");
553
+ /* Get some state information bits and display them. */
554
+ if(mpg123_getstate(fr, MPG123_ACCURATE, &val, NULL) == MPG123_OK)
555
+ generic_sendmsg("STATE accurate %li", val);
556
+
557
+ generic_sendmsg("STATE }");
558
+ continue;
559
+ }
560
+
561
+ /* QUIT */
562
+ if (!strcasecmp(comstr, "Q") || !strcasecmp(comstr, "QUIT")){
563
+ alive = FALSE; continue;
564
+ }
565
+
566
+ /* some HELP */
567
+ if (!strcasecmp(comstr, "H") || !strcasecmp(comstr, "HELP")) {
568
+ generic_sendmsg("H {");
569
+ generic_sendmsg("H HELP/H: command listing (LONG/SHORT forms), command case insensitve");
570
+ generic_sendmsg("H LOAD/L <trackname>: load and start playing resource <trackname>");
571
+ generic_sendmsg("H LOADPAUSED/LP <trackname>: load but do not start playing resource <trackname>");
572
+ generic_sendmsg("H LOADLIST <entry> <url>: load a playlist from given <url>, and display its entries, optionally load and play one of these specificed by the integer <entry> (<0: just list, 0: play last track, >0:play track with that position in list)");
573
+ generic_sendmsg("H PAUSE/P: pause playback");
574
+ generic_sendmsg("H STOP/S: stop playback (closes file)");
575
+ generic_sendmsg("H JUMP/J <frame>|<+offset>|<-offset>|<[+|-]seconds>s: jump to mpeg frame <frame> or change position by offset, same in seconds if number followed by \"s\"");
576
+ generic_sendmsg("H VOLUME/V <percent>: set volume in % (0..100...); float value");
577
+ generic_sendmsg("H RVA off|(mix|radio)|(album|audiophile): set rva mode");
578
+ generic_sendmsg("H EQ/E <channel> <band> <value>: set equalizer value for frequency band 0 to 31 on channel %i (left) or %i (right) or %i (both)", MPG123_LEFT, MPG123_RIGHT, MPG123_LR);
579
+ generic_sendmsg("H EQFILE <filename>: load EQ settings from a file");
580
+ generic_sendmsg("H SHOWEQ: show all equalizer settings (as <channel> <band> <value> lines in a SHOWEQ block (like TAG))");
581
+ generic_sendmsg("H SEEK/K <sample>|<+offset>|<-offset>: jump to output sample position <samples> or change position by offset");
582
+ generic_sendmsg("H SCAN: scan through the file, building seek index");
583
+ generic_sendmsg("H SAMPLE: print out the sample position and total number of samples");
584
+ generic_sendmsg("H SEQ <bass> <mid> <treble>: simple eq setting...");
585
+ generic_sendmsg("H PITCH <[+|-]value>: adjust playback speed (+0.01 is 1 %% faster)");
586
+ generic_sendmsg("H SILENCE: be silent during playback (meaning silence in text form)");
587
+ generic_sendmsg("H STATE: Print auxiliary state info in several lines (just try it to see what info is there).");
588
+ generic_sendmsg("H TAG/T: Print all available (ID3) tag info, for ID3v2 that gives output of all collected text fields, using the ID3v2.3/4 4-character names.");
589
+ generic_sendmsg("H The output is multiple lines, begin marked by \"@T {\", end by \"@T }\".");
590
+ generic_sendmsg("H ID3v1 data is like in the @I info lines (see below), just with \"@T\" in front.");
591
+ generic_sendmsg("H An ID3v2 data field is introduced via ([ ... ] means optional):");
592
+ generic_sendmsg("H @T ID3v2.<NAME>[ [lang(<LANG>)] desc(<description>)]:");
593
+ generic_sendmsg("H The lines of data follow with \"=\" prefixed:");
594
+ generic_sendmsg("H @T =<one line of content in UTF-8 encoding>");
595
+ generic_sendmsg("H meaning of the @S stream info:");
596
+ generic_sendmsg("H %s", remote_header_help);
597
+ generic_sendmsg("H The @I lines after loading a track give some ID3 info, the format:");
598
+ generic_sendmsg("H @I ID3:artist album year comment genretext");
599
+ generic_sendmsg("H where artist,album and comment are exactly 30 characters each, year is 4 characters, genre text unspecified.");
600
+ generic_sendmsg("H You will encounter \"@I ID3.genre:<number>\" and \"@I ID3.track:<number>\".");
601
+ generic_sendmsg("H Then, there is an excerpt of ID3v2 info in the structure");
602
+ generic_sendmsg("H @I ID3v2.title:Blabla bla Bla");
603
+ generic_sendmsg("H for every line of the \"title\" data field. Likewise for other fields (author, album, etc).");
604
+ generic_sendmsg("H }");
605
+ continue;
606
+ }
607
+
608
+ /* commands with arguments */
609
+ cmd = NULL;
610
+ arg = NULL;
611
+ cmd = strtok(comstr," \t"); /* get the main command */
612
+ arg = strtok(NULL,""); /* get the args */
613
+
614
+ if (cmd && strlen(cmd) && arg && strlen(arg))
615
+ {
616
+ /* Simple EQ: SEQ <BASS> <MID> <TREBLE> */
617
+ if (!strcasecmp(cmd, "SEQ")) {
618
+ double b,m,t;
619
+ int cn;
620
+ if(sscanf(arg, "%lf %lf %lf", &b, &m, &t) == 3)
621
+ {
622
+ /* Consider adding mpg123_seq()... but also, on could define a nicer courve for that. */
623
+ if ((t >= 0) && (t <= 3))
624
+ for(cn=0; cn < 1; ++cn) mpg123_eq(fr, MPG123_LEFT|MPG123_RIGHT, cn, b);
625
+
626
+ if ((m >= 0) && (m <= 3))
627
+ for(cn=1; cn < 2; ++cn) mpg123_eq(fr, MPG123_LEFT|MPG123_RIGHT, cn, m);
628
+
629
+ if ((b >= 0) && (b <= 3))
630
+ for(cn=2; cn < 32; ++cn) mpg123_eq(fr, MPG123_LEFT|MPG123_RIGHT, cn, t);
631
+
632
+ generic_sendmsg("bass: %f mid: %f treble: %f", b, m, t);
633
+ }
634
+ else generic_sendmsg("E invalid arguments for SEQ: %s", arg);
635
+ continue;
636
+ }
637
+
638
+ /* Equalizer control :) (JMG) */
639
+ if (!strcasecmp(cmd, "E") || !strcasecmp(cmd, "EQ")) {
640
+ double e; /* ThOr: equalizer is of type real... whatever that is */
641
+ int c, v;
642
+ /*generic_sendmsg("%s",updown);*/
643
+ if(sscanf(arg, "%i %i %lf", &c, &v, &e) == 3)
644
+ {
645
+ if(mpg123_eq(fr, c, v, e) == MPG123_OK)
646
+ generic_sendmsg("%i : %i : %f", c, v, e);
647
+ else
648
+ generic_sendmsg("E failed to set eq: %s", mpg123_strerror(fr));
649
+ }
650
+ else generic_sendmsg("E invalid arguments for EQ: %s", arg);
651
+ continue;
652
+ }
653
+
654
+ if(!strcasecmp(cmd, "EQFILE"))
655
+ {
656
+ equalfile = arg;
657
+ if(load_equalizer(fr) == 0)
658
+ generic_sendmsg("EQFILE done");
659
+ else
660
+ generic_sendmsg("E failed to parse given eq file");
661
+
662
+ continue;
663
+ }
664
+
665
+ /* SEEK to a sample offset */
666
+ if(!strcasecmp(cmd, "K") || !strcasecmp(cmd, "SEEK"))
667
+ {
668
+ off_t soff;
669
+ char *spos = arg;
670
+ int whence = SEEK_SET;
671
+ if(mode == MODE_STOPPED)
672
+ {
673
+ generic_sendmsg("E No track loaded!");
674
+ continue;
675
+ }
676
+
677
+ soff = (off_t) atobigint(spos);
678
+ if(spos[0] == '-' || spos[0] == '+') whence = SEEK_CUR;
679
+ if(0 > (soff = mpg123_seek(fr, soff, whence)))
680
+ {
681
+ generic_sendmsg("E Error while seeking: %s", mpg123_strerror(fr));
682
+ mpg123_seek(fr, 0, SEEK_SET);
683
+ }
684
+ if(param.usebuffer) buffer_resync();
685
+
686
+ generic_sendmsg("K %li", (long)mpg123_tell(fr));
687
+ continue;
688
+ }
689
+ /* JUMP */
690
+ if (!strcasecmp(cmd, "J") || !strcasecmp(cmd, "JUMP")) {
691
+ char *spos;
692
+ off_t offset;
693
+ double secs;
694
+
695
+ spos = arg;
696
+ if(mode == MODE_STOPPED)
697
+ {
698
+ generic_sendmsg("E No track loaded!");
699
+ continue;
700
+ }
701
+
702
+ if(spos[strlen(spos)-1] == 's' && sscanf(arg, "%lf", &secs) == 1) offset = mpg123_timeframe(fr, secs);
703
+ else offset = atol(spos);
704
+ /* totally replaced that stuff - it never fully worked
705
+ a bit usure about why +pos -> spos+1 earlier... */
706
+ if (spos[0] == '-' || spos[0] == '+') offset += framenum;
707
+
708
+ if(0 > (framenum = mpg123_seek_frame(fr, offset, SEEK_SET)))
709
+ {
710
+ generic_sendmsg("E Error while seeking");
711
+ mpg123_seek_frame(fr, 0, SEEK_SET);
712
+ }
713
+ if(param.usebuffer) buffer_resync();
714
+
715
+ generic_sendmsg("J %d", framenum);
716
+ continue;
717
+ }
718
+
719
+ /* VOLUME in percent */
720
+ if(!strcasecmp(cmd, "V") || !strcasecmp(cmd, "VOLUME"))
721
+ {
722
+ double v;
723
+ mpg123_volume(fr, atof(arg)/100);
724
+ mpg123_getvolume(fr, &v, NULL, NULL); /* Necessary? */
725
+ generic_sendmsg("V %f%%", v * 100);
726
+ continue;
727
+ }
728
+
729
+ /* PITCH (playback speed) in percent */
730
+ if(!strcasecmp(cmd, "PITCH"))
731
+ {
732
+ double p;
733
+ if(sscanf(arg, "%lf", &p) == 1)
734
+ {
735
+ set_pitch(fr, ao, p);
736
+ generic_sendmsg("PITCH %f", param.pitch);
737
+ }
738
+ else generic_sendmsg("E invalid arguments for PITCH: %s", arg);
739
+ continue;
740
+ }
741
+
742
+ /* RVA mode */
743
+ if(!strcasecmp(cmd, "RVA"))
744
+ {
745
+ if(!strcasecmp(arg, "off")) param.rva = MPG123_RVA_OFF;
746
+ else if(!strcasecmp(arg, "mix") || !strcasecmp(arg, "radio")) param.rva = MPG123_RVA_MIX;
747
+ else if(!strcasecmp(arg, "album") || !strcasecmp(arg, "audiophile")) param.rva = MPG123_RVA_ALBUM;
748
+ mpg123_volume_change(fr, 0.);
749
+ generic_sendmsg("RVA %s", rva_name[param.rva]);
750
+ continue;
751
+ }
752
+
753
+ /* LOAD - actually play */
754
+ if (!strcasecmp(cmd, "L") || !strcasecmp(cmd, "LOAD")){ generic_load(fr, arg, MODE_PLAYING); continue; }
755
+
756
+ if (!strcasecmp(cmd, "L") || !strcasecmp(cmd, "LOADLIST")){ generic_loadlist(fr, arg); continue; }
757
+
758
+ /* LOADPAUSED */
759
+ if (!strcasecmp(cmd, "LP") || !strcasecmp(cmd, "LOADPAUSED")){ generic_load(fr, arg, MODE_PAUSED); continue; }
760
+
761
+ /* no command matched */
762
+ generic_sendmsg("E Unknown command: %s", cmd); /* unknown command */
763
+ } /* end commands with arguments */
764
+ else generic_sendmsg("E Unknown command or no arguments: %s", comstr); /* unknown command */
765
+
766
+ } /* end of single command processing */
767
+ } /* end of scanning the command buffer */
768
+
769
+ /*
770
+ when last command had no \n... should I discard it?
771
+ Ideally, I should remember the part and wait for next
772
+ read() to get the rest up to a \n. But that can go
773
+ to infinity. Too long commands too quickly are just
774
+ bad. Cannot/Won't change that. So, discard the unfinished
775
+ command and have fingers crossed that the rest of this
776
+ unfinished one qualifies as "unknown".
777
+ */
778
+ if(buf[len-1] != 0)
779
+ {
780
+ char lasti = buf[len-1];
781
+ buf[len-1] = 0;
782
+ generic_sendmsg("E Unfinished command: %s%c", comstr, lasti);
783
+ }
784
+ } /* end command reading & processing */
785
+ } /* end main (alive) loop */
786
+ debug("going to end");
787
+ /* quit gracefully */
788
+ #ifndef NOXFERMEM
789
+ if (param.usebuffer) {
790
+ kill(buffer_pid, SIGINT);
791
+ xfermem_done_writer(buffermem);
792
+ waitpid(buffer_pid, NULL, 0);
793
+ xfermem_done(buffermem);
794
+ }
795
+ #endif
796
+ debug("closing control");
797
+ #ifdef FIFO
798
+ #if WANT_WIN32_FIFO
799
+ win32_fifo_close();
800
+ #else
801
+ close(control_file); /* be it FIFO or STDIN */
802
+ if(param.fifo) unlink(param.fifo);
803
+ #endif /* WANT_WIN32_FIFO */
804
+ #endif
805
+ debug("control_generic returning");
806
+ return 0;
807
+ }
808
+
809
+ /* EOF */