Showing with 84,386 additions and 380 deletions.
  1. +9 −0 Cargo.toml
  2. +1 −1 GECKO_REVISION
  3. +283 −45 build.rs
  4. +544 −0 gecko/glue/Logging.cpp
  5. +344 −0 gecko/glue/include/mozilla/BlockingResourceBase.h
  6. +0 −190 gecko/glue/include/nsString.h
  7. +16 −0 gecko/glue/nsDebugImpl.cpp
  8. +0 −21 gecko/glue/nsString.cpp
  9. +267 −0 gecko/include/AudioConverter.h
  10. +324 −0 gecko/include/AudioStream.h
  11. +59 −0 gecko/include/CubebUtils.h
  12. +653 −0 gecko/include/GeckoProfiler.h
  13. +11 −11 gecko/include/Intervals.h
  14. +34 −0 gecko/include/MainThreadUtils.h
  15. +11 −14 gecko/include/MediaInfo.h
  16. +19 −0 gecko/include/MutexPlatformData_posix.h
  17. +23 −0 gecko/include/NSPRLogModulesParser.h
  18. +21 −0 gecko/include/VideoLimits.h
  19. +568 −0 gecko/include/VideoUtils.h
  20. +38 −0 gecko/include/XREChildData.h
  21. +29 −0 gecko/include/XREShellData.h
  22. +638 −0 gecko/include/cubeb/cubeb.h
  23. +5 −0 gecko/include/cubeb/cubeb_export.h
  24. +828 −0 gecko/include/gfxPrefs.h
  25. +61 −0 gecko/include/js-config.h
  26. +456 −0 gecko/include/js/HeapAPI.h
  27. +268 −0 gecko/include/js/ProfilingStack.h
  28. +224 −0 gecko/include/js/Result.h
  29. +222 −0 gecko/include/js/TraceKind.h
  30. +81 −0 gecko/include/js/TypeDecls.h
  31. +584 −0 gecko/include/js/Utility.h
  32. +14 −0 gecko/include/jsbytecode.h
  33. +20 −0 gecko/include/jscpucfg.h
  34. +134 −0 gecko/include/jsprototypes.h
  35. +371 −0 gecko/include/jspubtd.h
  36. +227 −0 gecko/include/jstypes.h
  37. +40 −0 gecko/include/jsversion.h
  38. +66 −0 gecko/include/malloc_decls.h
  39. +1,084 −0 gecko/include/md/_linux.cfg
  40. +694 −0 gecko/include/md/_linux.h
  41. +270 −0 gecko/include/md/_pth.h
  42. +139 −0 gecko/include/md/_unix_errors.h
  43. +624 −0 gecko/include/md/_unixos.h
  44. +113 −0 gecko/include/md/prosdep.h
  45. +155 −0 gecko/include/mozilla/AbstractThread.h
  46. +124 −0 gecko/include/mozilla/ClearOnShutdown.h
  47. +136 −0 gecko/include/mozilla/CondVar.h
  48. +175 −0 gecko/include/mozilla/FileUtils.h
  49. +167 −0 gecko/include/mozilla/GuardObjects.h
  50. +143 −0 gecko/include/mozilla/IndexSequence.h
  51. +671 −0 gecko/include/mozilla/LinkedList.h
  52. +262 −0 gecko/include/mozilla/Logging.h
  53. +143 −0 gecko/include/mozilla/Monitor.h
  54. +1,585 −0 gecko/include/mozilla/MozPromise.h
  55. +269 −0 gecko/include/mozilla/Mutex.h
  56. +69 −0 gecko/include/mozilla/PlatformConditionVariable.h
  57. +63 −0 gecko/include/mozilla/PlatformMutex.h
  58. +57 −0 gecko/include/mozilla/ReentrancyGuard.h
  59. +259 −0 gecko/include/mozilla/ReentrantMonitor.h
  60. +476 −0 gecko/include/mozilla/Result.h
  61. +350 −0 gecko/include/mozilla/SSE.h
  62. +255 −0 gecko/include/mozilla/Scoped.h
  63. +86 −0 gecko/include/mozilla/StartupTimeline.h
  64. +285 −0 gecko/include/mozilla/StaticPtr.h
  65. +432 −0 gecko/include/mozilla/Telemetry.h
  66. +2,163 −0 gecko/include/mozilla/TelemetryHistogramEnums.h
  67. +101 −0 gecko/include/mozilla/TelemetryScalarEnums.h
  68. +197 −0 gecko/include/mozilla/ThreadLocal.h
  69. +461 −0 gecko/include/mozilla/Tuple.h
  70. +154 −0 gecko/include/mozilla/TypedEnumBits.h
  71. +760 −0 gecko/include/mozilla/Variant.h
  72. +1,564 −0 gecko/include/mozilla/Vector.h
  73. +242 −0 gecko/include/mozilla/XREAppData.h
  74. +146 −0 gecko/include/mozilla/arm.h
  75. +53 −0 gecko/include/mozilla/dom/AudioDeviceInfo.h
  76. +545 −0 gecko/include/mozilla/double-conversion.h
  77. +326 −0 gecko/include/mozilla/double-conversion/utils.h
  78. +30 −0 gecko/include/mozilla/gfx/LoggingConstants.h
  79. +5 −0 gecko/include/mozilla/media/libcubeb/include/cubeb-stdint.h
  80. +638 −0 gecko/include/mozilla/media/libcubeb/include/cubeb.h
  81. +5 −0 gecko/include/mozilla/media/libcubeb/include/cubeb_export.h
  82. +81 −0 gecko/include/mozilla/media/libcubeb/src/android/audiotrack_definitions.h
  83. +77 −0 gecko/include/mozilla/media/libcubeb/src/android/sles_definitions.h
  84. +72 −0 gecko/include/mozilla/media/libcubeb/src/audiotrack_definitions.h
  85. +89 −0 gecko/include/mozilla/media/libcubeb/src/cubeb-internal.h
  86. +26 −0 gecko/include/mozilla/media/libcubeb/src/cubeb-sles.h
  87. +1 −0 gecko/include/mozilla/media/libcubeb/src/cubeb-speex-resampler.h
  88. +97 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_array_queue.h
  89. +17 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_assert.h
  90. +47 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_log.h
  91. +90 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_mixer.h
  92. +22 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_osx_run_loop.h
  93. +28 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_panner.h
  94. +78 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_resampler.h
  95. +556 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_resampler_internal.h
  96. +159 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_ring_array.h
  97. +495 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_ringbuffer.h
  98. +44 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_strings.h
  99. +339 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_utils.h
  100. +89 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_utils_unix.h
  101. +71 −0 gecko/include/mozilla/media/libcubeb/src/cubeb_utils_win.h
  102. +100 −0 gecko/include/mozilla/media/libsoundtouch/src/AAFilter.h
  103. +184 −0 gecko/include/mozilla/media/libsoundtouch/src/FIFOSampleBuffer.h
  104. +234 −0 gecko/include/mozilla/media/libsoundtouch/src/FIFOSamplePipe.h
  105. +146 −0 gecko/include/mozilla/media/libsoundtouch/src/FIRFilter.h
  106. +67 −0 gecko/include/mozilla/media/libsoundtouch/src/InterpolateCubic.h
  107. +92 −0 gecko/include/mozilla/media/libsoundtouch/src/InterpolateLinear.h
  108. +72 −0 gecko/include/mozilla/media/libsoundtouch/src/InterpolateShannon.h
  109. +179 −0 gecko/include/mozilla/media/libsoundtouch/src/RateTransposer.h
  110. +186 −0 gecko/include/mozilla/media/libsoundtouch/src/STTypes.h
  111. +277 −0 gecko/include/mozilla/media/libsoundtouch/src/SoundTouch.h
  112. +22 −0 gecko/include/mozilla/media/libsoundtouch/src/SoundTouchFactory.h
  113. +272 −0 gecko/include/mozilla/media/libsoundtouch/src/TDStretch.h
  114. +62 −0 gecko/include/mozilla/media/libsoundtouch/src/cpu_detect.h
  115. +7 −0 gecko/include/mozilla/media/libsoundtouch/src/soundtouch_config.h
  116. +18 −0 gecko/include/mozilla/media/libsoundtouch/src/soundtouch_perms.h
  117. +235 −0 gecko/include/mozilla/media/libspeex_resampler/src/arch.h
  118. +110 −0 gecko/include/mozilla/media/libspeex_resampler/src/fixed_generic.h
  119. +43 −0 gecko/include/mozilla/media/libspeex_resampler/src/simd_detect.h
  120. +361 −0 gecko/include/mozilla/media/libspeex_resampler/src/speex_resampler.h
  121. +115 −0 gecko/include/mozilla/media/libspeex_resampler/src/stack_alloc.h
  122. +85 −65 gecko/{glue → }/include/mozilla/mozalloc.h
  123. +155 −0 gecko/include/mozjemalloc_types.h
  124. +189 −0 gecko/include/mozmemory_wrap.h
  125. +70 −0 gecko/include/nsASCIIMask.h
  126. +126 −0 gecko/include/nsAString.h
  127. +75 −0 gecko/include/nsAlgorithm.h
  128. +454 −0 gecko/include/nsAutoPtr.h
  129. +1,552 −0 gecko/include/nsCOMPtr.h
  130. +147 −0 gecko/include/nsCRTGlue.h
  131. +557 −0 gecko/include/nsCharTraits.h
  132. +247 −0 gecko/include/nsComponentManagerUtils.h
  133. +101 −0 gecko/include/nsCycleCollectionNoteChild.h
  134. +62 −0 gecko/include/nsCycleCollectionTraversalCallback.h
  135. +23 −0 gecko/include/nsDependentString.h
  136. +22 −0 gecko/include/nsDependentSubstring.h
  137. +31 −0 gecko/include/nsDirectoryServiceUtils.h
  138. +153 −0 gecko/include/nsIAtom.h
  139. +173 −0 gecko/include/nsIAudioDeviceInfo.h
  140. +38 −0 gecko/include/nsICancelableRunnable.h
  141. +179 −0 gecko/include/nsID.h
  142. +116 −0 gecko/include/nsIEventTarget.h
  143. +62 −0 gecko/include/nsIFactory.h
  144. +510 −0 gecko/include/nsIFile.h
  145. +58 −0 gecko/include/nsIIdlePeriod.h
  146. +46 −0 gecko/include/nsIIdleRunnable.h
  147. +55 −0 gecko/include/nsINamed.h
  148. +83 −0 gecko/include/nsIProperties.h
  149. +98 −0 gecko/include/nsIRunnable.h
  150. +52 −0 gecko/include/nsISerialEventTarget.h
  151. +83 −0 gecko/include/nsIServiceManager.h
  152. +79 −0 gecko/include/nsISupports.h
  153. +85 −0 gecko/include/nsISupportsBase.h
  154. +6 −25 gecko/{glue → }/include/nsISupportsImpl.h
  155. +145 −0 gecko/include/nsISupportsUtils.h
  156. +124 −0 gecko/include/nsIThread.h
  157. +165 −0 gecko/include/nsIThreadManager.h
  158. +232 −0 gecko/include/nsITimer.h
  159. +31 −0 gecko/include/nsLiteralString.h
  160. +136 −0 gecko/include/nsMemory.h
  161. +37 −0 gecko/include/nsPrintfCString.h
  162. +22 −0 gecko/include/nsPromiseFlatString.h
  163. +453 −0 gecko/include/nsReadableUtils.h
  164. +54 −0 gecko/include/nsReadableUtilsImpl.h
  165. +94 −0 gecko/include/nsServiceManagerUtils.h
  166. +53 −0 gecko/include/nsStaticAtom.h
  167. +164 −0 gecko/include/nsString.h
  168. +180 −0 gecko/include/nsStringBuffer.h
  169. +24 −0 gecko/include/nsStringGlue.h
  170. +268 −0 gecko/include/nsStringIterator.h
  171. +12 −0 gecko/include/nsSubstring.h
  172. +22 −0 gecko/include/nsSubstringTuple.h
  173. +99 −0 gecko/include/nsTDependentString.h
  174. +107 −0 gecko/include/nsTDependentSubstring.h
  175. +79 −0 gecko/include/nsTLiteralString.h
  176. +112 −0 gecko/include/nsTPromiseFlatString.h
  177. +762 −0 gecko/include/nsTString.h
  178. +1,362 −0 gecko/include/nsTSubstring.h
  179. +83 −0 gecko/include/nsTSubstringTuple.h
  180. +1,786 −0 gecko/include/nsThreadUtils.h
  181. +40 −0 gecko/include/nsTraceRefcnt.h
  182. +750 −0 gecko/include/nsUTF8Utils.h
  183. +527 −0 gecko/include/nsXULAppAPI.h
  184. +43 −0 gecko/include/nspr.h
  185. +149 −0 gecko/include/nspr/obsolete/probslet.h
  186. +199 −0 gecko/include/nspr/obsolete/protypes.h
  187. +126 −0 gecko/include/nspr/plhash.h
  188. +31 −0 gecko/include/nspr/prcpucfg.h
  189. +162 −0 gecko/include/nspr/prenv.h
  190. +99 −0 gecko/include/nspr/prinet.h
  191. +215 −0 gecko/include/nspr/prinit.h
  192. +146 −0 gecko/include/nspr/prinrval.h
  193. +2,022 −0 gecko/include/nspr/prio.h
  194. +256 −0 gecko/include/nspr/private/pprio.h
  195. +331 −0 gecko/include/nspr/private/pprthred.h
  196. +2,170 −0 gecko/include/nspr/private/primpl.h
  197. +16 −0 gecko/include/nspr/private/prpriv.h
  198. +122 −0 gecko/include/nspr/prprf.h
  199. +272 −0 gecko/include/nspr/prthread.h
  200. +164 −0 gecko/include/nspr/prwin16.h
  201. +54 −0 gecko/include/nsrootidl.h
  202. +198 −0 gecko/include/pratom.h
  203. +150 −0 gecko/include/prbit.h
  204. +108 −0 gecko/include/prclist.h
  205. +66 −0 gecko/include/prcmon.h
  206. +94 −0 gecko/include/prcvar.h
  207. +51 −0 gecko/include/prdtoa.h
  208. +249 −0 gecko/include/prerr.h
  209. +294 −0 gecko/include/prerror.h
  210. +101 −0 gecko/include/pripcsem.h
  211. +230 −0 gecko/include/prlink.h
  212. +109 −0 gecko/include/prlock.h
  213. +222 −0 gecko/include/prlog.h
  214. +403 −0 gecko/include/prlong.h
  215. +126 −0 gecko/include/prmem.h
  216. +96 −0 gecko/include/prmon.h
  217. +380 −0 gecko/include/prmwait.h
  218. +467 −0 gecko/include/prnetdb.h
  219. +86 −0 gecko/include/prproces.h
  220. +75 −0 gecko/include/prrng.h
  221. +88 −0 gecko/include/prrwlock.h
  222. +257 −0 gecko/include/prshm.h
  223. +239 −0 gecko/include/prshma.h
  224. +108 −0 gecko/include/prsystem.h
  225. +262 −0 gecko/include/prtime.h
  226. +83 −0 gecko/include/prtpool.h
  227. +646 −0 gecko/include/prtrace.h
  228. +598 −0 gecko/include/prtypes.h
  229. +234 −0 gecko/include/soundtouch/FIFOSamplePipe.h
  230. +186 −0 gecko/include/soundtouch/STTypes.h
  231. +277 −0 gecko/include/soundtouch/SoundTouch.h
  232. +22 −0 gecko/include/soundtouch/SoundTouchFactory.h
  233. +7 −0 gecko/include/soundtouch/soundtouch_config.h
  234. +361 −0 gecko/include/speex/speex_resampler.h
  235. +28 −0 gecko/include/string-template-def-char.h
  236. +28 −0 gecko/include/string-template-def-unichar.h
  237. +29 −0 gecko/include/string-template-undef.h
  238. +4 −0 gecko/include/system_wrappers/prcpucfg.h
  239. +4 −0 gecko/include/system_wrappers/prthread.h
  240. +4 −0 gecko/include/system_wrappers/prwin16.h
  241. +4 −0 gecko/include/system_wrappers/soundtouch/SoundTouchFactory.h
  242. +17 −0 gecko/include/xrecore.h
  243. +734 −0 gecko/src/dom/media/AudioStream.cpp
  244. +671 −0 gecko/src/dom/media/CubebUtils.cpp
  245. +658 −0 gecko/src/media/libcubeb/src/cubeb.c
  246. +1,372 −0 gecko/src/media/libcubeb/src/cubeb_alsa.c
  247. +441 −0 gecko/src/media/libcubeb/src/cubeb_audiotrack.c
  248. +3,324 −0 gecko/src/media/libcubeb/src/cubeb_audiounit.cpp
  249. +1,052 −0 gecko/src/media/libcubeb/src/cubeb_jack.cpp
  250. +144 −0 gecko/src/media/libcubeb/src/cubeb_log.cpp
  251. +571 −0 gecko/src/media/libcubeb/src/cubeb_mixer.cpp
  252. +1,721 −0 gecko/src/media/libcubeb/src/cubeb_opensl.c
  253. +11 −0 gecko/src/media/libcubeb/src/cubeb_osx_run_loop.c
  254. +60 −0 gecko/src/media/libcubeb/src/cubeb_panner.cpp
  255. +1,567 −0 gecko/src/media/libcubeb/src/cubeb_pulse.c
  256. +314 −0 gecko/src/media/libcubeb/src/cubeb_resampler.cpp
  257. +388 −0 gecko/src/media/libcubeb/src/cubeb_sndio.c
  258. +155 −0 gecko/src/media/libcubeb/src/cubeb_strings.c
  259. +2,418 −0 gecko/src/media/libcubeb/src/cubeb_wasapi.cpp
  260. +1,062 −0 gecko/src/media/libcubeb/src/cubeb_winmm.c
  261. +236 −0 gecko/src/media/libsoundtouch/src/AAFilter.cpp
  262. +274 −0 gecko/src/media/libsoundtouch/src/FIFOSampleBuffer.cpp
  263. +330 −0 gecko/src/media/libsoundtouch/src/FIRFilter.cpp
  264. +200 −0 gecko/src/media/libsoundtouch/src/InterpolateCubic.cpp
  265. +299 −0 gecko/src/media/libsoundtouch/src/InterpolateLinear.cpp
  266. +185 −0 gecko/src/media/libsoundtouch/src/InterpolateShannon.cpp
  267. +302 −0 gecko/src/media/libsoundtouch/src/RateTransposer.cpp
  268. +504 −0 gecko/src/media/libsoundtouch/src/SoundTouch.cpp
  269. +31 −0 gecko/src/media/libsoundtouch/src/SoundTouchFactory.cpp
  270. +966 −0 gecko/src/media/libsoundtouch/src/TDStretch.cpp
  271. +138 −0 gecko/src/media/libsoundtouch/src/cpu_detect_x86.cpp
  272. +385 −0 gecko/src/media/libsoundtouch/src/mmx_optimized.cpp
  273. +372 −0 gecko/src/media/libsoundtouch/src/sse_optimized.cpp
  274. +1,267 −0 gecko/src/media/libspeex_resampler/src/resample.c
  275. +202 −0 gecko/src/media/libspeex_resampler/src/resample_neon.c
  276. +130 −0 gecko/src/media/libspeex_resampler/src/resample_sse.c
  277. +27 −0 gecko/src/media/libspeex_resampler/src/simd_detect.cpp
  278. +11 −0 gecko/src/memory/fallible/fallible.cpp
  279. +244 −0 gecko/src/memory/mozalloc/mozalloc.cpp
  280. +61 −0 gecko/src/memory/mozalloc/mozalloc_oom.cpp
  281. +173 −0 gecko/src/mozglue/misc/ConditionVariable_posix.cpp
  282. +93 −0 gecko/src/mozglue/misc/Mutex_posix.cpp
  283. +839 −0 gecko/src/nsprpub/pr/src/misc/prinit.c
  284. +1,294 −0 gecko/src/xpcom/string/nsReadableUtils.cpp
  285. +17 −0 gecko/src/xpcom/string/nsString.cpp
  286. +471 −0 gecko/src/xpcom/string/nsSubstring.cpp
  287. +16 −0 gecko/src/xpcom/string/nsTString.cpp
  288. +1,204 −0 gecko/src/xpcom/string/nsTSubstring.cpp
  289. +624 −0 gecko/src/xpcom/threads/BlockingResourceBase.cpp
  290. +29 −0 gecko/test/test.cpp
  291. +307 −8 import.py
@@ -12,3 +12,12 @@ rustflags = ["-C link-arg=-fno-exceptions"]

[build-dependencies]
gcc = "0.3.53"

[features]
default = []
audio-sample-type-s16 = []
audio-sample-type-f32 = []
alsa = []
pulseaudio = []
jack = []
widget-toolkit-cocoa = []
@@ -1 +1 @@
378885:3ecda4678c49
421964:2bb39688625c
328 build.rs
@@ -1,66 +1,304 @@
extern crate gcc;

use std::env;

fn make_builder() -> gcc::Build {
let mut b = gcc::Build::new();
b.cpp(true);
fn make_builder(cpp: bool) -> gcc::Build {
let mut b = gcc::Build::new();
b.cpp(cpp);

#[cfg(target_os = "macos")]
b.flag("-std=c++11");
if cpp {
b.flag("-std=c++11");
}

b.include("gecko/glue/include/stl_wrappers");
b.include("gecko/include");
b.include("gecko/glue/include");
b.include("gecko/glue/include/stl_wrappers");
b.include("gecko/include/system_wrappers");
b.include("gecko/include/nspr");
b.include("gecko/include/nspr/private");
b.include("gecko/include");
b.include("gecko/glue/include");
b.include("gecko/include/mozilla/");
b.include("gecko/include/mozilla/double-conversion");
b.include("gecko/include/mozilla/media/libsoundtouch/src");
b.include("gecko/include/mozilla/media/libspeex_resampler/src");
b.include("gecko/include/mozilla/media/libcubeb/src");

#[cfg(target_os = "macos")]
env::set_var("CXXFLAGS", "--include gecko/glue/include/mozilla-config-x86_64-apple-darwin.h");
#[cfg(target_os = "macos")]
env::set_var(
"CXXFLAGS",
"--include gecko/glue/include/mozilla-config-x86_64-apple-darwin.h",
);

#[cfg(target_os = "linux")]
env::set_var("CXXFLAGS", "--include gecko/glue/include/mozilla-config-x86_64-apple-darwin.h");
#[cfg(target_os = "linux")]
env::set_var(
"CXXFLAGS",
"--include gecko/glue/include/mozilla-config-x86_64-linux.h",
);

b.flag("-fno-exceptions");
b.define("GECKO_MEDIA_CRATE", "1");
b.flag("-fno-exceptions");
// FIXME: not sure about this!
b.define("MOZILLA_INTERNAL_API", "1");
//b.define("__x86_64__", "1");
//b.define("__i386__", "1");
b.define("_PR_PTHREADS", "1");
b.define("GECKO_MEDIA_CRATE", "1");

b
b
}

fn compile_tests() {
let mut b = make_builder();
let mut b = make_builder(true);

let src_files = ["test.cpp"];

for file_path in src_files
.iter()
.map(|&p| "gecko/test/".to_owned() + p.clone())
{
b.file(file_path);
}
b.compile("geckotest");
}

fn configure_libsoundtouch(c_builder: &mut gcc::Build, cpp_builder: &mut gcc::Build) {
let src_files = [
"media/libsoundtouch/src/cpu_detect_x86.cpp",
"media/libsoundtouch/src/RateTransposer.cpp",
"media/libsoundtouch/src/InterpolateLinear.cpp",
"media/libsoundtouch/src/AAFilter.cpp",
"media/libsoundtouch/src/FIFOSampleBuffer.cpp",
"media/libsoundtouch/src/FIRFilter.cpp",
"media/libsoundtouch/src/SoundTouchFactory.cpp",
"media/libsoundtouch/src/InterpolateCubic.cpp",
"media/libsoundtouch/src/InterpolateShannon.cpp",
"media/libsoundtouch/src/SoundTouch.cpp",
"media/libsoundtouch/src/TDStretch.cpp",
];

for file_path in src_files
.iter()
.map(|&p| "gecko/src/".to_owned() + p.clone())
{
cpp_builder.file(file_path);
}

#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
#[cfg(feature = "audio-sample-type-f32")]
{
// FIXME: set SSE2 cflags?
cpp_builder.define("SOUNDTOUCH_ALLOW_SSE", "1");
cpp_builder.file("gecko/src/media/libsoundtouch/src/sse_optimized.cpp");
}
#[cfg(not(feature = "audio-sample-type-f32"))]
{
// FIXME: set MMX cflags?
cpp_builder.file("gecko/src/media/libsoundtouch/src/mmx_optimized.cpp");
}
}
// #[cfg(not(target_os = "windows"))]
// {
// env::set_var(
// "CXXFLAGS",
// "--include gecko/include/mozilla/media/libsoundtouch/src/soundtouch_perms.h",
// );
// }
#[cfg(target_os = "windows")]
{
cpp_builder.define("alloca", "_alloca");
}

cpp_builder.define("ST_NO_EXCEPTION_HANDLING", "1");
}

fn configure_libspeex_resampler(c_builder: &mut gcc::Build, cpp_builder: &mut gcc::Build) {
c_builder.file("gecko/src/media/libspeex_resampler/src/resample.c");
cpp_builder.file("gecko/src/media/libspeex_resampler/src/simd_detect.cpp");

let mut defines = Vec::<(&str, &str)>::new();

defines.push(("OUTSIDE_SPEEX", "1"));
defines.push(("EXPORT", ""));

#[cfg(feature = "audio-sample-type-s16")]
{
defines.push(("FIXED_POINT", "1"));
}
#[cfg(not(feature = "audio-sample-type-s16"))]
{
defines.push(("FLOATING_POINT", "1"));

#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
defines.push(("_USE_SSE", "1"));
defines.push(("_USE_SSE2", "1"));
// FIXME: set SSE2 cflags?
c_builder.file("gecko/src/media/libspeex_resampler/src/resample_sse.c");
}
}
#[cfg(target_arch = "arm")]
{
// FIXME: set NEON cflags?
defines.push(("_USE_NEON", "1"));
c_builder.file("gecko/src/media/libspeex_resampler/src/resample_neon.c");
}

for &(name, value) in defines.iter() {
c_builder.define(name, value);
cpp_builder.define(name, value);
}
}

fn configure_libcubeb(c_builder: &mut gcc::Build, cpp_builder: &mut gcc::Build) {
let src_c_files = [
"media/libcubeb/src/cubeb.c",
"media/libcubeb/src/cubeb_strings.c",
];
for file_path in src_c_files
.iter()
.map(|&p| "gecko/src/".to_owned() + p.clone())
{
c_builder.file(file_path);
}
let src_cpp_files = [
"media/libcubeb/src/cubeb_log.cpp",
"media/libcubeb/src/cubeb_mixer.cpp",
"media/libcubeb/src/cubeb_panner.cpp",
];
for file_path in src_cpp_files
.iter()
.map(|&p| "gecko/src/".to_owned() + p.clone())
{
cpp_builder.file(file_path);
}

let mut defines = Vec::<(&str, &str)>::new();

#[cfg(feature = "alsa")]
{
c_builder.file("gecko/src/media/libcubeb/src/cubeb_alsa.c");
defines.push(("USE_ALSA", "1"));
c_builder.flag("-lasound");
cpp_builder.flag("-lasound");
}

#[cfg(any(feature = "pulseaudio", feature = "jack"))]
{
cpp_builder.file("gecko/src/media/libcubeb/src/cubeb_resampler.cpp");
}

#[cfg(feature = "pulseaudio")]
{
c_builder.file("gecko/src/media/libcubeb/src/cubeb_pulse.c");
defines.push(("USE_PULSE", "1"));
// FIXME: import cubeb pulse-rs
//defines.push(("USE_PULSE_RUST", "1"));
}

#[cfg(feature = "jack")]
{
cpp_builder.file("gecko/src/media/libcubeb/src/cubeb_jack.cpp");
defines.push(("USE_JACK", "1"));
// TODO: use lib speex
}

#[cfg(target_os = "openbsd")]
{
c_builder.file("gecko/src/media/libcubeb/src/cubeb_sndio.c");
defines.push(("USE_SNDIO", "1"));
}

let src_files = [
"test.cpp",
];
#[cfg(target_os = "macos")]
{
let src_files = [
"media/libcubeb/src/cubeb_audiounit.cpp",
"media/libcubeb/src/cubeb_resampler.cpp",
];
for file_path in src_files
.iter()
.map(|&p| "gecko/src/".to_owned() + p.clone())
{
cpp_builder.file(file_path);
}

for file_path in src_files.iter().map(|&p| "gecko/test/".to_owned() + p.clone()) {
b.file(file_path);
}
b.compile("geckotest");
#[cfg(feature = "widget-toolkit-cocoa")]
{
c_builder.file("gecko/src/media/libcubeb/src/cubeb_osx_run_loop.c");
}
defines.push(("USE_AUDIOUNIT", "1"));
}

#[cfg(target_os = "windows")]
{
cpp_builder.file("gecko/src/media/libcubeb/src/cubeb_resampler.cpp");
cpp_builder.file("gecko/src/media/libcubeb/src/cubeb_wasapi.cpp");
c_builder.file("gecko/src/media/libcubeb/src/cubeb_winmm.c");
defines.push(("USE_WINMM", "1"));
defines.push(("USE_WASAPI", "1"));
// TODO: add avrt to "OS_LIBS"
}

#[cfg(target_os = "android")]
{
c_builder.file("gecko/src/media/libcubeb/src/cubeb_audiotrack.c");
c_builder.file("gecko/src/media/libcubeb/src/cubeb_opensl.c");
cpp_builder.file("gecko/src/media/libcubeb/src/cubeb_resampler.cpp");
defines.push(("USE_OPENSL", "1"));
defines.push(("USE_AUDIOTRACK", "1"));
}

for &(name, value) in defines.iter() {
c_builder.define(name, value);
cpp_builder.define(name, value);
}
}

fn compile_gecko_media() {
let mut b = make_builder();

let src_files = [
"dom/media/MediaInfo.cpp",
"mfbt/Assertions.cpp",
"mfbt/Unused.cpp",
"xpcom/ds/nsTArray.cpp",
];
for file_path in src_files.iter().map(|&p| "gecko/src/".to_owned() + p.clone()) {
b.file(file_path);
}

let glue_files = [
"nsString.cpp",
];
for file_path in glue_files.iter().map(|&p| "gecko/glue/".to_owned() + p.clone()) {
b.file(file_path);
}

b.compile("gecko_media");
let mut c_builder = make_builder(false);
let mut cpp_builder = make_builder(true);

configure_libspeex_resampler(&mut c_builder, &mut cpp_builder);
configure_libcubeb(&mut c_builder, &mut cpp_builder);
configure_libsoundtouch(&mut c_builder, &mut cpp_builder);

let src_files = [
"dom/media/AudioStream.cpp",
// Compiling this one opens a new can of #include worms..
//"dom/media/CubebUtils.cpp",
"dom/media/MediaInfo.cpp",
"memory/fallible/fallible.cpp",
"memory/mozalloc/mozalloc.cpp",
"memory/mozalloc/mozalloc_oom.cpp",
"mfbt/Assertions.cpp",
"mfbt/Unused.cpp",
"mozglue/misc/ConditionVariable_posix.cpp",
"mozglue/misc/Mutex_posix.cpp",
"nsprpub/pr/src/misc/prinit.c",
"xpcom/ds/nsTArray.cpp",
"xpcom/string/nsReadableUtils.cpp",
"xpcom/string/nsString.cpp",
"xpcom/string/nsSubstring.cpp",
"xpcom/threads/BlockingResourceBase.cpp",
];
for file_path in src_files
.iter()
.map(|&p| "gecko/src/".to_owned() + p.clone())
{
cpp_builder.file(file_path);
}

let glue_files = ["nsDebugImpl.cpp", "Logging.cpp"];
for file_path in glue_files
.iter()
.map(|&p| "gecko/glue/".to_owned() + p.clone())
{
cpp_builder.file(file_path);
}

c_builder.compile("gecko_media_c");
cpp_builder.compile("gecko_media_cpp");
}

fn main() {
compile_gecko_media();
compile_tests();
compile_gecko_media();
compile_tests();
}