From 4c48fe01a5d1983be89b7dce6f08e6b708cfbb05 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 15 Nov 2022 20:49:38 +0000 Subject: [PATCH] Refactor, GLFW->SDL --- .gitignore | 59 - .gitmodules | 18 + compile_commands.json | 304 +- dep/anyascii/anyascii.h | 1243 - dep/cxong/tinydir.h | 838 - dep/dr_soft/miniaudio.h | 90463 ---------------- dep/dr_soft/miniaudio_impl.c | 11 - dep/glfw/glfw3.dll | Bin 242176 -> 0 bytes dep/glfw/glfw3.h | 5873 - dep/glfw/glfw3native.h | 525 - dep/glfw/libglfw3.a | Bin 457066 -> 0 bytes dep/glfw/libglfw3dll.a | Bin 85450 -> 0 bytes dep/phoboslab/qoi.h | 649 - dep/randygaul/cute_files.h | 520 - dep/sdl/libSDL2.a | Bin 0 -> 16537310 bytes dep/sdl/libSDL2.dll.a | Bin 0 -> 556746 bytes dep/sdl/libSDL2main.a | Bin 0 -> 8076 bytes dep/stb/stb_ds.h | 1896 - dep/stb/stb_image.h | 7890 -- dep/stb/stb_include.h | 313 - dep/stb/stb_vorbis.h | 5584 - install.sh | 5 - platformutils/force_link_glibc_2.23.h | 3727 - src/vg/vg.h | 812 - src/vg/vg_platform.h | 277 - src/vg/vg_steamworks.h | 885 - submodules/SDL | 1 + submodules/SDL_GameControllerDB | 1 + submodules/anyascii | 1 + submodules/qoi | 1 + submodules/stb | 1 + submodules/tinydir | 1 + vg.h | 915 + src/vg/vg_audio.h => vg_audio.h | 130 +- src/vg/vg_build.h => vg_build.h | 28 +- vg_build.sh | 120 - vg_compiler.sh | 389 - src/vg/vg_console.h => vg_console.h | 108 +- src/vg/vg_input.h => vg_input.h | 285 +- src/vg/vg_io.h => vg_io.h | 9 - src/vg/vg_lines.h => vg_lines.h | 0 src/vg/vg_loader.h => vg_loader.h | 22 +- src/vg/vg_log.h => vg_log.h | 17 +- src/vg/vg_m.h => vg_m.h | 748 +- src/vg/vg_mem.h => vg_mem.h | 0 src/vg/vg_opt.h => vg_opt.h | 4 +- vg_platform.h | 66 + src/vg/vg_profiler.h => vg_profiler.h | 18 +- src/vg/vg_pxfont.h => vg_pxfont.h | 0 src/vg/vg_shader.h => vg_shader.h | 0 src/vg/vg_stdint.h => vg_stdint.h | 0 src/vg/vg_steam.h => vg_steam.h | 2 + src/vg/vg_steam_auth.h => vg_steam_auth.h | 1 + .../vg_steam_friends.h => vg_steam_friends.h | 0 src/vg/vg_steam_http.h => vg_steam_http.h | 0 ...team_networking.h => vg_steam_networking.h | 0 ...team_user_stats.h => vg_steam_user_stats.h | 0 src/vg/vg_steam_utils.h => vg_steam_utils.h | 0 src/vg/vg_store.h => vg_store.h | 0 src/vg/vg_tex.h => vg_tex.h | 2 +- src/vg/vg_ui.h => vg_ui.h | 0 61 files changed, 1983 insertions(+), 122779 deletions(-) create mode 100644 .gitmodules delete mode 100644 dep/anyascii/anyascii.h delete mode 100644 dep/cxong/tinydir.h delete mode 100644 dep/dr_soft/miniaudio.h delete mode 100644 dep/dr_soft/miniaudio_impl.c delete mode 100755 dep/glfw/glfw3.dll delete mode 100755 dep/glfw/glfw3.h delete mode 100755 dep/glfw/glfw3native.h delete mode 100644 dep/glfw/libglfw3.a delete mode 100755 dep/glfw/libglfw3dll.a delete mode 100644 dep/phoboslab/qoi.h delete mode 100644 dep/randygaul/cute_files.h create mode 100644 dep/sdl/libSDL2.a create mode 100755 dep/sdl/libSDL2.dll.a create mode 100644 dep/sdl/libSDL2main.a delete mode 100644 dep/stb/stb_ds.h delete mode 100644 dep/stb/stb_image.h delete mode 100644 dep/stb/stb_include.h delete mode 100644 dep/stb/stb_vorbis.h delete mode 100755 install.sh delete mode 100644 platformutils/force_link_glibc_2.23.h delete mode 100644 src/vg/vg.h delete mode 100644 src/vg/vg_platform.h delete mode 100644 src/vg/vg_steamworks.h create mode 160000 submodules/SDL create mode 160000 submodules/SDL_GameControllerDB create mode 160000 submodules/anyascii create mode 160000 submodules/qoi create mode 160000 submodules/stb create mode 160000 submodules/tinydir create mode 100644 vg.h rename src/vg/vg_audio.h => vg_audio.h (91%) rename src/vg/vg_build.h => vg_build.h (87%) delete mode 100644 vg_build.sh delete mode 100755 vg_compiler.sh rename src/vg/vg_console.h => vg_console.h (86%) rename src/vg/vg_input.h => vg_input.h (60%) rename src/vg/vg_io.h => vg_io.h (91%) rename src/vg/vg_lines.h => vg_lines.h (100%) rename src/vg/vg_loader.h => vg_loader.h (92%) rename src/vg/vg_log.h => vg_log.h (90%) rename src/vg/vg_m.h => vg_m.h (60%) rename src/vg/vg_mem.h => vg_mem.h (100%) rename src/vg/vg_opt.h => vg_opt.h (98%) create mode 100644 vg_platform.h rename src/vg/vg_profiler.h => vg_profiler.h (89%) rename src/vg/vg_pxfont.h => vg_pxfont.h (100%) rename src/vg/vg_shader.h => vg_shader.h (100%) rename src/vg/vg_stdint.h => vg_stdint.h (100%) rename src/vg/vg_steam.h => vg_steam.h (99%) rename src/vg/vg_steam_auth.h => vg_steam_auth.h (99%) rename src/vg/vg_steam_friends.h => vg_steam_friends.h (100%) rename src/vg/vg_steam_http.h => vg_steam_http.h (100%) rename src/vg/vg_steam_networking.h => vg_steam_networking.h (100%) rename src/vg/vg_steam_user_stats.h => vg_steam_user_stats.h (100%) rename src/vg/vg_steam_utils.h => vg_steam_utils.h (100%) rename src/vg/vg_store.h => vg_store.h (100%) rename src/vg/vg_tex.h => vg_tex.h (99%) rename src/vg/vg_ui.h => vg_ui.h (100%) diff --git a/.gitignore b/.gitignore index fc078ca..2019de1 100755 --- a/.gitignore +++ b/.gitignore @@ -1,64 +1,5 @@ - *.o *.so *.dll bin/ - - -# Gitignore for MMV project. -# Whitelist mode - -# Ignore all but directories -#* -#!*/ -# -#build.linux/ -#build.win32/ -#restricted/ -#.temp_textures/ -# -## ALLOW ============================ -#!.gitattributes -#!.gitignore -#!.gitmodules -# -## Dependencies _____________________ -##!*.so -#!*.a -#!*.dll -# -## Code sources _____________________ -## C source files -#!*.c -#!*.h -# -## Blender projects -#!*.blend -# -## GLSL shader source files -#!*.fs -#!*.vs -#!*.gls -# -## Python source files -#!*.py -# -## Build scripts -#!*.sh -#!*.bat -# -## Compiled resources _______________ -## MMV proprietary files -#!*.vmd -#!*.vma -#!*.cfg -#!*.vmv -#!*.map -# -## Other game assets (3rd party) -#!*.bdf -#!*.png -#!*.ogg -#!*.txt -#!*.tga diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..cc30f0e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "submodules/anyascii"] + path = submodules/anyascii + url = https://github.com/anyascii/anyascii.git +[submodule "submodules/qoi"] + path = submodules/qoi + url = https://github.com/phoboslab/qoi.git +[submodule "submodules/stb"] + path = submodules/stb + url = https://github.com/nothings/stb.git +[submodule "submodules/SDL_GameControllerDB"] + path = submodules/SDL_GameControllerDB + url = https://github.com/gabomdq/SDL_GameControllerDB.git +[submodule "submodules/tinydir"] + path = submodules/tinydir + url = https://github.com/cxong/tinydir.git +[submodule "submodules/SDL"] + path = submodules/SDL + url = https://github.com/libsdl-org/SDL.git diff --git a/compile_commands.json b/compile_commands.json index 2ff6c01..83fbdbf 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -1,60 +1,316 @@ [ { "arguments": [ - "/usr/bin/gcc", + "/usr/bin/clang", "-c", - "-D_REENTRANT", - "-std=c99", - "-O1", "-fsanitize=address", + "-O0", + "-I./vg", + "-o", + "/tmp/tmpsr", + "build.c" + ], + "directory": "/home/harry/Documents/carve", + "file": "/home/harry/Documents/carve/build.c", + "output": "/tmp/tmpsr" + }, + { + "arguments": [ + "/usr/bin/clang-14", + "-cc1", + "-triple", + "x86_64-pc-linux-gnu", + "-emit-obj", + "-mrelax-all", + "--mrelax-relocations", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "pic", + "-pic-level", + "2", + "-pic-is-pie", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/harry/Documents/carve", + "-resource-dir", + "/usr/lib/clang/14.0.6", + "-I", + "./vg", + "-internal-isystem", + "/usr/lib/clang/14.0.6/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../x86_64-pc-linux-gnu/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-O0", + "-fdebug-compilation-dir=/home/harry/Documents/carve", + "-ferror-limit", + "19", + "-fsanitize=address", + "-fsanitize-system-ignorelist=/usr/lib/clang/14.0.6/share/asan_ignorelist.txt", + "-fsanitize-address-use-after-scope", + "-fno-assume-sane-operator-new", + "-stack-protector", + "2", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/build-2564d6.o", + "build.c" + ], + "directory": "/home/harry/Documents/carve", + "file": "/home/harry/Documents/carve/build.c", + "output": "/tmp/build-2564d6.o" + }, + { + "arguments": [ + "/usr/bin/clang", + "-c", + "-std=gnu99", + "-D_REENTRANT", + "-O0", "-ggdb3", "-fno-omit-frame-pointer", + "-fsanitize=address", "-Wall", - "-Wstrict-aliasing=3", "-Wno-unused-function", "-Wno-unused-variable", + "-Wno-unused-command-line-argument", "-Wno-unused-but-set-variable", "-I.", - "-I/home/harry/Documents/vg/dep", - "-I/home/harry/Documents/vg/src", - "/home/harry/Documents/vg/dep/dr_soft/miniaudio_linux.o", + "-I./vg", + "-I./vg/dep", "-pthread", "-Wl,-rpath=./", "-o", - "build.linux/game", - "main.c" + "bin/skaterift-clang/skaterift", + "skaterift.c" ], "directory": "/home/harry/Documents/carve", - "file": "/home/harry/Documents/carve/main.c", - "output": "/home/harry/Documents/carve/build.linux/game" + "file": "/home/harry/Documents/carve/skaterift.c", + "output": "/home/harry/Documents/carve/bin/skaterift-clang/skaterift" }, { "arguments": [ - "/usr/bin/gcc", + "/usr/bin/clang", "-c", + "-std=gnu99", "-D_REENTRANT", - "-std=c99", - "-O1", - "-fsanitize=address", + "-O0", "-ggdb3", "-fno-omit-frame-pointer", + "-fsanitize=address", "-Wall", - "-Wstrict-aliasing=3", "-Wno-unused-function", "-Wno-unused-variable", + "-Wno-unused-command-line-argument", "-Wno-unused-but-set-variable", "-I.", - "-I/home/harry/Documents/vg/dep", - "-I/home/harry/Documents/vg/src", - "/home/harry/Documents/vg/dep/dr_soft/miniaudio_linux.o", + "-I./vg", + "-I./vg/dep", "-pthread", "-Wl,-rpath=./", "-o", - "build.linux/game", - "/home/harry/Documents/vg/dep/glad/glad.c" + "bin/skaterift-clang/skaterift", + "vg/dep/glad/glad.c" + ], + "directory": "/home/harry/Documents/carve", + "file": "/home/harry/Documents/carve/vg/dep/glad/glad.c", + "output": "/home/harry/Documents/carve/bin/skaterift-clang/skaterift" + }, + { + "arguments": [ + "/usr/bin/clang-14", + "-cc1", + "-triple", + "x86_64-pc-linux-gnu", + "-emit-obj", + "-mrelax-all", + "--mrelax-relocations", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "pic", + "-pic-level", + "2", + "-pic-is-pie", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=5", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/harry/Documents/carve", + "-resource-dir", + "/usr/lib/clang/14.0.6", + "-D", + "_REENTRANT", + "-I", + ".", + "-I", + "./vg", + "-I", + "./vg/dep", + "-internal-isystem", + "/usr/lib/clang/14.0.6/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../x86_64-pc-linux-gnu/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-O0", + "-Wall", + "-Wno-unused-function", + "-Wno-unused-variable", + "-Wno-unused-command-line-argument", + "-Wno-unused-but-set-variable", + "-std=gnu99", + "-fdebug-compilation-dir=/home/harry/Documents/carve", + "-ferror-limit", + "19", + "-fsanitize=address", + "-fsanitize-system-ignorelist=/usr/lib/clang/14.0.6/share/asan_ignorelist.txt", + "-fsanitize-address-use-after-scope", + "-fno-assume-sane-operator-new", + "-pthread", + "-stack-protector", + "2", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/skaterift-eff20c.o", + "skaterift.c" + ], + "directory": "/home/harry/Documents/carve", + "file": "/home/harry/Documents/carve/skaterift.c", + "output": "/tmp/skaterift-eff20c.o" + }, + { + "arguments": [ + "/usr/bin/clang-14", + "-cc1", + "-triple", + "x86_64-pc-linux-gnu", + "-emit-obj", + "-mrelax-all", + "--mrelax-relocations", + "-disable-free", + "-clear-ast-before-backend", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "pic", + "-pic-level", + "2", + "-pic-is-pie", + "-mframe-pointer=all", + "-fmath-errno", + "-ffp-contract=on", + "-fno-rounding-math", + "-mconstructor-aliases", + "-funwind-tables=2", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-mllvm", + "-treat-scalable-fixed-error-as-warning", + "-debug-info-kind=constructor", + "-dwarf-version=5", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/harry/Documents/carve", + "-resource-dir", + "/usr/lib/clang/14.0.6", + "-D", + "_REENTRANT", + "-I", + ".", + "-I", + "./vg", + "-I", + "./vg/dep", + "-internal-isystem", + "/usr/lib/clang/14.0.6/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../x86_64-pc-linux-gnu/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-O0", + "-Wall", + "-Wno-unused-function", + "-Wno-unused-variable", + "-Wno-unused-command-line-argument", + "-Wno-unused-but-set-variable", + "-std=gnu99", + "-fdebug-compilation-dir=/home/harry/Documents/carve", + "-ferror-limit", + "19", + "-fsanitize=address", + "-fsanitize-system-ignorelist=/usr/lib/clang/14.0.6/share/asan_ignorelist.txt", + "-fsanitize-address-use-after-scope", + "-fno-assume-sane-operator-new", + "-pthread", + "-stack-protector", + "2", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-faddrsig", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/glad-5dcf26.o", + "vg/dep/glad/glad.c" ], "directory": "/home/harry/Documents/carve", - "file": "/home/harry/Documents/vg/dep/glad/glad.c", - "output": "/home/harry/Documents/carve/build.linux/game" + "file": "/home/harry/Documents/carve/vg/dep/glad/glad.c", + "output": "/tmp/glad-5dcf26.o" } ] diff --git a/dep/anyascii/anyascii.h b/dep/anyascii/anyascii.h deleted file mode 100644 index dca32e2..0000000 --- a/dep/anyascii/anyascii.h +++ /dev/null @@ -1,1243 +0,0 @@ -/* -ISC License - -Copyright (c) 2020-2022, Hunter WB - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#ifndef ANYASCII_H -#define ANYASCII_H - -#include -#include - -static const char bank[64322] = "Shch'eueueoeuiuzhiexyiescudororngkk'ieshch'uiucbrt'ieDramperewrrt'wainngiiyaorduiuqiets'eyayoriyaeyeoozssits'uiuxyrxyts'akbarrelwiiyeouncentimengngwanywaaunnguuyueok'oacrek'wek'wa.m.kh'ekh'ukh'atiungiywii'kh'okwiekhiekhwezhwalpharwaapartmentwiinpwied'ied'wach'ap'iep'wamwiebwiefwiepwiimAxAstwaapwoopwaatwookwiimnthiikwookwaacwiicwoocwaamwiimwoomwaanwaalwoolwaaswiiswooswaaspwaskwaywooscwashiishooshaafwaatthewhootthiehliihluuhlaakhooghoot'ook'oodloolhootlootl'utl'etl'itl'adzootsoongairueulueu-Lo-pwoyard'oashoyuanwiishayuotlwenwoorwiirwoolaewuoxAwt'oa''''Lari1/100aVIIInc.viiisqrtiexprSSSShou(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)ChR.{27}{37}{47}{57}{67}{18}{28}{38}{48}{58}{68}{78}ZeushoaKhR.choanyoaep'oangwek'yeoyak'yurxk'yak'yoeokyiegyieBingatiepico-opesoZhaoJiaoQingaxFengap.m.NiaoLongotuotuoxFangoxMiananornbituopiexGongopiepuoxPianbixXuanbipuopurxYongexZhouXingepyrxZhuiBiaoDinggiturxMasuoxkotoHZWGeoiSZWGungwuopwyrraxHZZPangyrroxHPWGwaiHXWGaai(ch)(Ga)(Na)(Da)(La)(Ma)(Ba)(Sa)(Ja)(Ka)(Ta)(Pa)(Ha)(Ju)(Mu)(Tu)(Ri)(Te)(Hu)(Qi)(Zi)(Ji)JuUikkcalorieZongonbaththwugigammansionbaxbetavoltkhmitmkhjuotkhyyrxlirasulietkharrophyrretsonbaphenbotsarrexm/s202akOhmixMOhmipornbophoeC/kgietsurxZaauDungurrepiouHangirrutsinbutshutswuChouKeoiTaaiZhuoHingwonbuxDonguwDAtiuSeoiZungouYinguaBengwieMiaoChaiNaamuotsirruxTangiexZhaiDiaoJingiephaiWonguotharrupeeMonguoxTingornbupartserrytsyrryxCungewrrypiculuotwyruopenceHungwyrublengwirruoxLanguowsxtsunbytswoRuanbyxDenggaaKuaiLungguaCoekiexHenggeeDeoiTenggooHongkwenbypionggixLinggatewrrurxTunggaxZaaiHaapercentwewGanggapiasterryrxConggothoeHaamgatsoeSaapfenniggoxLenggopRonggetcyuaeWenggexZanggepHaauBanggutcietsiuLiaoKyuthaiMengguxQiaoNanggupNgoiHeoiKonghmmgaxDaamgapPenghmyxHaandithauSaandixGinghmatcyndipLeoiHuaiLuandatsaiManghirad/s202bbixNinghuroentgendaxKangharSonghewNgaiTiaoKwaiSunghandapDuandotsouYuandoxCuandopZinghyrFonghiwFaandepSaamgotcyeZhundutciuJuanduxDaandupCenghonuopDaaiJeoiShunurxGuaiLaamgoxKengwarJungueiShaiTuanzitsieGenggiexCeonzixZeoiCaapNuanzipPiaoHaakiepNgokuoxRenggiepNaaiZaakuopWingguots'ieShuoZaapNengguoxTaapJyuts'waSingguopPinggurxCanghwenzats'oaChaoNonghwanzaxFunghornzapSaathwaaZuanzoxHuouCyunzopTaamgopDaatl'ooLaapDanghwyrSanghwinzexZengallonzuxNgouBaanzupCeoiBaakurxZaamgexRanguineaNgauGaakhwyoyaeBonguilderSengram tonzyts'ooGaanzyxGaapNungGaamgepMungSuanzypDaapBaathwiiNgithwooJiJikkhewFiaoSheightsewrbbipbbatthwebbaxbbapbbotthoobboxbbopbbexbbepbbutthaabbuxbbupbbytprusuopbbyxbbyphmaxhmaphmotshewhmoxhmophmutswenrathwanraxhmuxhmuphmypfurxvietshwuviexviepvurxvyrxdditshonrapddixddipddathornroxddaxddapddotshwyrddoxddopddexddepddutsornropdduxdduphnithwyrhnixhniphnatsharhnaxhnaphnotswyrhnoxhnophnexhnephliterhlixhliphlatshinretswinrexhlaxhlaphloxhlophlexhlephlutshyrxhluxhluphlytswarhlyxhlypmgutswanrepmguxmguphxitchyehxixhxiphxatciouhxaxhxaphxotchynruthenghxoxhxophxexhxepzuopciexciepcuoxcuopcurxcyrxzzitchyazzixzzipzzatchiezzaxzzapzzoxzzopzzexzzepzzuxzzupzzythangzzyxzzypssixssipssatcingssaxssapssothuowssoxssopssexssepssutsangssuxssupssytshoessyxssypzhatchyuyeozhaxzhapzhotsiouzhoxzhopzhetshiuzhexzhepzhutshauzhuxzhupzhytshiezhyxzhypchatsengchaxchapchotsuowchoxchetshaichexchepchuxchupchytshwinruxchyxchypnrupnrytshwewnryxnrypshatshwenjitshwanjixshaxshotshengshoxshetciangshexshepshuxshupshytchioushyxshypqiexqiepquotsiangquoxquopqurxqyrxjjitshioujjixjjipjjotshangjjoxjjopjjutsiongjjuxjjupjjytciongjjyxjjypnjipnjotshiongnjoxnjopnjuxnjupnjytchiongnjyxnjypnyitchiangnyixnyipnyotnyoxnyopnyutnyuxnyupNYIPpadhieGGOPpamgbeHXITtadzieBBUTtamgbismillah al-rahman al-rahimgbashkhondaaHXUOekkewrDDURialkhmiexGGUOegshhmiepNYOPpajwewJJUTtajwyrNZUPpatJJIEokkhinjemgbornjueSHUR10aCUOPpapHXOPpahokai-riSHATtatSHOPpedkhmuoxNBIEogshjyoyeomgbushelwonshaKungJongmbenbtyGakkhorGagshmmkhmuopGanjyuGanhertzzmtGalgGalmjkhwuGalbkhyGalskhauGaltGalpGalhwoGabshhyGassiexGachwyGaedwAttributionSmtGaemkhyGaejjietGaetGaepGaehmurxGyadSrtGyamniwtGyajjiexGyatGyapGyahmyrxGeodzewrGeomAatGeojjiepGeotGeopGeohnietGekkornxxwGegskhyGenjiuGenhniexGelgGelmnitGelbaHikkwyrGelsl`mnxtGeltGelpGelhewGebsptyGessiepGechewGyedzenwewGyemxAtGyejjuoxGyetGyepGyehniepGokkhenengGogsrqtGonjietGonhnuoxGolgGolmDAtGolbbietGolspAtGoltGolpGolhwiGobsnTrutGossyrxGochonuowGwadzonongGwamornngaaGwajjuopGwatGwapGwahliexGoedzarGoemiouGoejjurxGoetGoepGoehliepGyodewrGyombuuGyojalla jalalahuGyotGyopGyohluoxGukkhurGugsDAwGunjiexGunhluopGulgGulmbeeGulbbiexGulsTAwGultGulpGulhwaGubswewGusshwiiGuchenbiexGwodzyrGwomgiexGwojGwotGwopGwohlurxGwedzwoGwemguoxGwejGwetGwepGwehlyrxGwidwarGwimguopGwijGwitGwipGwihxietGyudwyrGyumgurxGyujGyutGyupGyuhxiexGeudzurGeumiongGeujGeutGeupGeuhxiepGuidzwiGuimicronbiepGuijGuitGuipGuihxuotGikkhuaGigshwooGinjiepGinhxuoxGilgGilmegatonburxGilbbiepGilshwaaGiltGilpGilhwuGibshwoyGisshuoxGichhuKkadwanbyrxKkamillibarKkajKkatKkapKkahxuopKkedziwKkemKkejKketKkepKkehectareKkodrsshuopKkomKkojKkotKkopKkohKkudozendiexKkumKkujKkutKkupKkuhKkiddiexKkimKkijKkitKkipKkihNakkuowNagshurxNanjuoxNanhNalgNalmNalbbuoxNalshmkh'ieNaltNalpNalhondurxNabshriiNasshruuNachwiNaeddiepNaemNaejNaetNaepNaehNyadduoxNyamNyajNyatNyapNyahNeodduopNeomNeojNeotNeopNeohNekkokorunaNegshraaNenjurxNenhNelgNelmNelbbuopNelsxmtyNeltNelpNelhyrNebshwonziexNesshwyaNechiwNyeddurxNyemNyejNyetNyepNyehNokk'wieNogshillingNonjyrxNonhNolgNolmNolbburxNolsalla Allah `alayhi wa-sallamNoltNolpNolhweNobsNossNochwuNwadzwanziepNwamNwajNwatNwapNwahNoedzwyrNoemNoejNoetNoepNoehNyodwewrNyomNyojNyotNyopNyohNukkh'weNugsNunjingNunhNulgNulmNulbNulsNultNulpNulhenzuoxNubsNussNuchirNwodzwewNwomNwojNwotNwopNwohNwedNwemNwejNwetNwepNwehNwidNwimNwijNwitNwipNwihNyudNyumNyujNyutNyupNyuhNeudNeumNeujNeutNeupNeuhNuidNuimNuijNuitNuipNuihNikkh'waNigsNinjiouNinhNilgNilmNilbNilsNiltNilpNilherNibsNissNich'ieDakkhwieDagsDanjiangDanhDalgDalmDalbDalsDaltDalpDalhanzurxDabsDassDach'waDaedDaemDaejDaetDaepDaehDyadDyamDyajDyatDyapDyahDeodDeomDeojDeotDeopDeohDekk'yieDegsDenjDenhDelgDelmDelbDelsDeltDelpDelhornzyrxDebsDessDech'ooDyedDyemDyejDyetDyepDyehDokkroneDogsDonjDonhDolgDolmDolbDolsDoltDolpDolhwyrDobsDossDoch'oaDwadDwamDwajDwatDwapDwahDoedDoemDoejDoetDoepDoehDyodDyomDyojDyotDyopDyohDukkhwarDugsDunjDunhDulgDulmDulbDulsDultDulpDulhDubsDussDuchuotDwodDwomDwojDwotDwopDwohDwedDwemDwejDwetDwepDwehDwidDwimDwijDwitDwipDwihDyudDyumDyujDyutDyupDyuhDeudDeumDeujDeutDeupDeuhDuidDuimDuijDuitDuipDuihDikkhwanrurxDigsDinjDinhDilgDilmDilbDilsDiltDilpDilhDibsDissDichuoxTtapTtahTtedTtemTtejTtetTtepTtehTtodTtomTtojTtotTtopTtohTtudTtumTtujTtutTtupTtuhTtidTtimTtijTtitTtipTtihLakkhangLagsLanjLanhLalgLalmLalbLalsLaltLalpLalhLabsLassLachuopLaedLaemLaejLaetLaepLaehLyadLyamLyajLyatLyapLyahLeodLeomLeojLeotLeopLeohLekkhuoeLegsLenjLenhLelgLelmLelbLelsLeltLelpLelhLebsLessLechurxLyedLyemLyejLyetLyepLyehLokkh'wieLogsLonjLonhLolgLolmLolbLolsLoltLolpLolhLobsLochyrxLwadLwamLwajLwatLwapLwahLoedLoemLoejLoetLoepLoehLyodLyomLyojLyotLyopLyohLukkilogramLugsLunjLunhLulgLulmLulbLulsLultLulpLulhLubsLussLuchhewLwodLwomLwojLwotLwopLwohLwedLwemLwejLwetLwepLwehLwidLwimLwijLwitLwipLwihLyudLyumLyujLyutLyupLyuhLeudLeumLeujLeutLeupLeuhLuidLuimLuijLuitLuipLuihLikkilowattLigsLinjLinhLilgLilmLilbLilsLiltLilpLilhLibsLissLichwonryrxMakkilometerMagsManjManhMalgMalmMalbMalsMaltMalpMalhMabsMassMachwenyietMaedMaemMaejMaetMaepMaehMyadMyamMyajMyatMyapMyahMeodMeomMeojMeotMeopMeohMekkMegsMenjMenhMelgMelmMelbMelsMeltMelpMelhMebsMessMechhonyiexMyedMyemMyejMyetMyepMyehMokkMogsMonjMonhMolgMolmMolbMolsMoltMolpMolhMobsMossMochhenyiepMwadMwamMwajMwatMwapMwahMoedMoemMoejMoetMoepMoehMyodMyomMyojMyotMyopMyohMukkMugsMunjMunhMulgMulmMulbMulsMultMulpMulhMubsMussMuchhyrMwodMwomMwojMwotMwopMwohMwedMwemMwejMwetMwepMwehMwidMwimMwijMwitMwipMwihMyudMyumMyujMyutMyupMyuhMeudMeumMeujMeutMeupMeuhMuidMuimMuijMuitMuipMuihMikkMigsMinjMinhMilgMilmMilbMilsMiltMilpMilhMibsMissMichwanyuoxBakkBagsBanjBanhBalgBalmBalbBalsBaltBalpBalhBabsBassBachhiwBaedBaemBaejBaetBaepBaehByadByamByajByatByapByahBeodBeomBeojBeotBeopBeohBekkBegsBenjBenhBelgBelmBelbBelsBeltBelpBelhBebsBessBechhanyuopByedByemByejByetByepByehBokkBogsBonjBonhBolgBolmBolbBolsBoltBolpBolhBobsBossBochwewBwadBwamBwajBwatBwapBwahBoedBoemBoejBoetBoepBoehByodByomByojByotByopByohBukkBugsBunjBunhBulgBulmBulbBulsBultBulpBulhBubsBussBungBuchhinBwodBwomBwojBwotBwopBwohBwedBwemBwejBwetBwepBwehBwidBwimBwijBwitBwipBwihByudByumByujByutByupByuhBeudBeumBeujBeutBeupBeuhBuidBuimBuijBuitBuipBuihBikkBigsBinjBinhBilgBilmBilbBilsBiltBilpBilhBibsBissBichharPpemPpejPpetPpepPpehPpodPpomPpojPpotPpopPpohPpudPpumPpujPputPpupPpuhPpidPpimPpijPpitPpipPpihSakkSagsSanjSanhSalgSalmSalbSalsSaltSalpSalhSabsSassSachhwanSaedSaemSaejSaetSaepSaehSyadSyamSyajSyatSyapSyahSeodSeomSeojSeotSeopSeohSekkSegsSenjSenhSelgSelmSelbSelsSeltSelpSelhSebsSessSechhwyrSyedSyemSyejSyetSyepSyehSokkSogsSonjSonhSolgSolmSolbSolsSoltSolpSolhSobsSossSochhwewSwadSwamSwajSwatSwapSwahSoedSoemSoejSoetSoepSoehSyodSyomSyojSyotSyopSyohSukkSugsSunjSunhSulgSulmSulbSulsSultSulpSulhSubsSussSuchhwenSwodSwomSwojSwotSwopSwohSwedSwemSwejSwetSwepSwehSwidSwimSwijSwitSwipSwihSyudSyumSyujSyutSyupSyuhSeudSeumSeujSeutSeupSeuhSuidSuimSuijSuitSuipSuihSikkSigsSinjSinhSilgSilmSilbSilsSiltSilpSilhSibsSissSichhworSsadSsamSsajSsatSsapSsahSsedSsemSsejSsetSsepSsehSsodSsomSsojSsotSsopSsohSsudSsumSsujSsutSsupSsuhSsidSsimSsijSsitSsipSsihAekkAegsAenjAenhAelgAelmAelbAelsAeltAelpAelhAebsAessAengAechhwinYakkYagsYanjYanhYalgYalmYalbYalsYaltYalpYalhYabsYassYachYaedYaemYaejYaetYaepYaehEonjEonhEolgEolmEolbEolsEoltEolpEolhEobsEossEongEochYeodYeomYeojYeotYeopYeohYekkYegsYenjYenhYelgYelmYelbYelsYeltYelpYelhYebsYessYengYechWakkWagsWanjWanhWalgWalmWalbWalsWaltWalpWalhWabsWassWachWaedWaemWaejWaetWaepWaehOenjOenhOelgOelmOelbOelsOeltOelpOelhOebsOessOengOechYokkYogsYonjYonhYolgYolmYolbYolsYoltYolpYolhYobsYossYochWokkWogsWonjWonhWolgWolmWolbWolsWoltWolpWolhWobsWossWochWekkWegsWenjWenhWelgWelmWelbWelsWeltWelpWelhWebsWessWechWikkWigsWinjWinhWilgWilmWilbWilsWiltWilpWilhWibsWissWichYukkYugsYunjYunhYulgYulmYulbYulsYultYulpYulhYubsYussYungYuchEukkEugsEunjEunhEulgEulmEulbEulsEultEulpEulhEubsEussEungEuchUigsUinjUinhUilgUilmUilbUilsUiltUilpUilhUibsUissUingUichJakkJagsJanjJanhJalgJalmJalbJalsJaltJalpJalhJabsJassJangJachJaedJaemJaejJaetJaepJaehJyadJyamJyajJyatJyapJyahJeodJeomJeojJeotJeopJeohJekkJegsJenjJenhJelgJelmJelbJelsJeltJelpJelhJebsJessJengJechJyedJyemJyejJyetJyepJyehJokkJogsJonjJonhJolgJolmJolbJolsJoltJolpJolhJobsJossJochJwadJwamJwajJwatJwapJwahJoedJoemJoejJoetJoepJoehJyodJyomJyojJyotJyopJyohJukkJugsJunjJunhJulgJulmJulbJulsJultJulpJulhJubsJussJuchJwodJwomJwojJwotJwopJwohJwedJwemJwejJwetJwepJwehJwidJwimJwijJwitJwipJwihJyudJyumJyujJyupJyuhJeudJeumJeujJeutJeupJeuhJuidJuimJuijJuitJuipJuihJigsJinjJinhJilgJilmJilbJilsJiltJilpJilhJibsJissJichJjadJjamJjajJjatJjapJjahJjedJjemJjejJjetJjepJjehJjodJjomJjojJjotJjopJjohJjudJjumJjujJjutJjupJjuhJjidJjimJjijJjitJjipJjihChadChajChatChapChahChedChemChejChetChepChehChodChomChojChotChopChohChudChumChujChutChupChuhChidChimChijChitChipChihKakkKagsKanjKanhKalgKalmKalbKalsKaltKalpKalhKabsKassKachKaedKaemKaejKaetKaepKaehKyadKyamKyajKyatKyapKyahKeodKeomKeojKeotKeopKeohKekkKegsKenjKenhKelgKelmKelbKelsKeltKelpKelhKebsKessKechKyedKyemKyejKyetKyepKyehKokkKogsKonjKonhKolgKolmKolbKolsKoltKolpKolhKobsKossKochKwadKwamKwajKwatKwapKwahKoedKoemKoejKoetKoepKoehKyodKyomKyojKyotKyopKyohKukkKugsKunjKunhKulgKulmKulbKulsKultKulpKulhKubsKussKuchKwodKwomKwojKwotKwopKwohKwedKwemKwejKwetKwepKwehKwidKwimKwijKwitKwipKwihKyudKyumKyujKyupKyuhKeudKeumKeujKeutKeupKeuhKuidKuimKuijKuitKuipKuihKikkKigsKinjKinhKilgKilmKilbKilsKiltKilpKilhKibsKissKingKichTakkTagsTanjTanhTalgTalmTalbTalsTaltTalpTalhTabsTassTachTaedTaemTaejTaetTaepTaehTyadTyamTyajTyatTyapTyahTeodTeomTeojTeotTeopTeohTekkTegsTenjTenhTelgTelmTelbTelsTeltTelpTelhTebsTessTechTyedTyemTyejTyetTyepTyehTokkTogsTonjTonhTolgTolmTolbTolsToltTolpTolhTobsTossTochTwadTwamTwajTwatTwapTwahToedToemToejToetToepToehTyodTyomTyojTyotTyopTyohTukkTugsTunjTunhTulgTulmTulbTulsTultTulpTulhTubsTussTuchTwodTwomTwojTwotTwopTwohTwedTwemTwejTwetTwepTwehTwidTwimTwijTwitTwipTwihTyudTyumTyujTyutTyupTyuhTeudTeumTeujTeutTeupTeuhTuidTuimTuijTuitTuipTuihTikkTigsTinjTinhTilgTilmTilbTilsTiltTilpTilhTibsTissTichPakkPagsPanjPanhPalgPalmPalbPalsPaltPalpPalhPabsPassPachPaedPaemPaejPaetPaepPaehPyadPyamPyajPyatPyapPyahPeodPeomPeojPeotPeopPeohPekkPegsPenjPenhPelgPelmPelbPelsPeltPelpPelhPebsPessPechPyedPyemPyejPyetPyepPyehPokkPogsPonjPonhPolgPolmPolbPolsPoltPolpPolhPobsPossPongPochPwadPwamPwajPwatPwapPwahPoedPoemPoejPoetPoepPoehPyodPyomPyojPyotPyopPyohPukkPugsPunjPunhPulgPulmPulbPulsPultPulpPulhPubsPussPungPuchPwodPwomPwojPwotPwopPwohPwedPwemPwejPwetPwepPwehPwidPwimPwijPwitPwipPwihPyudPyumPyujPyutPyupPyuhPeudPeumPeujPeutPeupPeuhPuidPuimPuijPuitPuipPuihPikkPigsPinjPinhPilgPilmPilbPilsPiltPilpPilhPibsPissPichHakkHagsHanjHanhHalgHalmHalbHalsHaltHalpHalhHabsHassHachHaedHaemHaejHaetHaepHaehHyadHyamHyajHyatHyapHyahHeodHeomHeojHeotHeopHeohHekkHegsHenjHenhHelgHelmHelbHelsHeltHelpHelhHebsHessHechHyedHyemHyejHyetHyepHyehHokkHogsHonjHonhHolgHolmHolbHolsHoltHolpHolhHobsHossHochHwadHwamHwajHwatHwapHwahHoedHoemHoejHoetHoepHoehHyodHyomHyojHyotHyopHyohHukkHugsHunjHunhHulgHulmHulbHulsHultHulpHulhHubsHussHuchHwodHwomHwojHwotHwopHwohHwedHwemHwejHwetHwepHwehHwidHwimHwijHwitHwipHwihHyudHyumHyujHyutHyupHyuhHeudHeumHeujHeutHeupHeuhHuidHuimHuijHuitHuipHuihHigsHinjHinhHilgHilmHilbHilsHiltHilpHilhHibsHissHichKakuShinFukuHagiItsufkhmB1000000000B102aB104aB1215aB125aB12700000B1289aB1300000B1329aB1332aB135aB1400000B1410aB14207aB1450aB14600000B1500000B15101aB15209aB15332bB15457aB156B157B15800000B15900000B160B16104bB16216aB16332caratB165B166B167B168B169B170B17227aB17336aB1743200000B176B177B178B179B18104curieB18267aB18336bB184B185B189B190B220B225B230B23105aB23294aB2336cruzeiroB234B2364aB240B24105bB24299aB24359aB245B246B247B248B249B25107aB2522.216000B25368aB254B255B256B257B258B259B155B200B20107bB202ndScrB20371aB204B205B206B207B208B209B2107cB2110aB2120Ped.B21381aB214B215maB216B217B218B219B22110bB222B226B227B228B229B250B305AMHAB105fangAB20AB24AB26AB27AB28A28bAB29AB30AB3115aAB34AB37AB383aAB39AB40AB415mbAB44AB45AB46AB47AB48AB49AB50AB51AB5386aAB54AB55AB56AB57AB58AB59AB60AB61AB65AB66AB67AB69AB70AB73AB74AB76AB77AB78AB79AB80AB81AB82AB85AB86AB87A301A302A303A304A305A306A307A308A310A311A312A314A315A316A317A318A319A320A321A322A323A324A325A326A327A328A329A330A331A332A333A334A335A336A337A338A339A340A341A342A343A344A345A346A347A348A349A350A351A352A353A354A355A356A357A358A359A360A361A362A363A364A365A366A367A368A369A370A371A400A401A402A403A404A405A406A407A408A409A410A411A412A413A414A415A416A417A418A501A502A503A504A505A506A508A509A510A511A512A513A515A516A520A521A523A524A525A526A527A528A529A530A531A532A534A535A536A537A538A539A540A541A542A545A547A548A549A550A551A552A553A554A555A556A557A559A563A564A565A566A568A569A570A571A572A573A574A575A576A577A578A579A580A581A582A583A584A585A586A587A588A589A591A592A594A595A596A598A600A601A602A603A604A606A608A609A610A611A612A613A614A615A616A617A618A619A620A621A622A623A624A626A627A628A629A634A637A638A640A642A643A644A645A646A648A649A651A652A653A654A655A656A657A658A659A660A661A662A663A664A701A702A703A704A705A706A707A708A710A711A712A713A714A715A717A726A732A800A801A802A803A804A805A806A807A14aA17aA32aA40aA42aA43aA45aSpsiXnmwC10aD27aD31aD34aD46aD48aD50aD50bD50cD50dD50eD50faradD50gD50hD50iD52aD54aD67aD67bD67cD67dD67eD67francD67gD67hE16aE17aE20aE28aE34aF13aF21aF31aF37aF38aF45aF46aF47aF51aF51bF51cG11aG20aG26aG36aG37aG43aG45aStywI10aI11aM10aM12aM12bM12cM12dM12eM12fM12gM12hM15aM16aM24aM28aM31aM33aM33bM40aN18aN18bN25aN33aN34aN37aNL5aNL10NL11NL12NL13NL14NL15NL16NL18NL19NL20NU12NU13NU14NU15NU16NU17NU19NU20NU21O10aO10bO10cO19aO20aO24aO25aO29azxntO30aO33aO36aO36bO36cO36dqnbtO50aO50bSnwtqrswR16aSwtyS14aS14bS17aS26aS26bS35aT11aT16aT32aT33aHqAtU23aU29aU32aV11aV11bV11cV12aV12bV20aV20bV20cV20dV20eV20fV20gV20hV20iV20jV20kV20lwyrV23aV28aV29aV30aV31aV33aV37aV40aW10aW14aW17aW18aHnqtW24azSStZ15aZ15bZ15cZ15dZ15eZ15fZ15gZ15hZ15iZ16aZ16bZ16cZ16dZ16eZ16fZ16gZ16hAA7aAA7bAA100/102AA120bAA14AA16AA18AA19AA22AA23AA24AA25AA26AA29AA313aAA32CaumRoobNeevangRuavXyooHnubNqigXiabNtujMouaThaoVangAivalwanzornzhinzhirlwinzhiwzhonzhwuzherzhewlwewzunglioulangD.S.D.C.COOLaaiFREEarth[Er][An][Da]:ox:cd:tv:on:wc:leo:zap:urn:fog:tea:art:ski:atm:rat:ram:bug:ant:bee:cow:cat:dog:pig:eye:ear:boy:man:imp:gem:zzz:100:yen:dvd:fax:vhs:mag:key:end:top:abc:gun:map:joy:yum:cry:sob:bus:bed:hut:oil:egg:pie:bat:owl:fox:leg:elf:dna:axe:fly:jar:gear:atom:pick:golf:tent:fist:loop:star:taco:rose:corn:herb:pear:rice:oden:cake:stew:sake:beer:gift:tada:dart:park:bank:cow2:cat2:goat:dog2:pig2:boar:fish:bird:frog:wolf:bear:feet:eyes:nose:lips:wave:clap:boot:girl:baby:pill:kiss:ring:bulb:bomb:boom:dash:poop:euro:seat:date:book:mega:mute:lock:bell:link:back:soon:abcd:1234:fire:dove:hole:key2:grin:wink:rage:mask:pray:tram:taxi:ship:door:bike:mens:bath:sled:nerd:rofl:drum:goal:milk:kiwi:sari:crab:duck:deer:swan:dodo:seal:bone:foot:salt:mate:mage:coat:yarn:soap:kite:coin:hook:knot:rock:worm:wood:watch:eject:timer:sunny:cloud:comet:peace:aries:virgo:libra:clubs:ferry:skier:cross:heart:foggy:ocean:star2:stars:tulip:melon:lemon:apple:peach:pizza:curry:ramen:bread:fries:dango:sushi:candy:bento:beers:santa:dolls:flags:8ball:notes:medal:beach:homes:house:hotel:label:snail:snake:sheep:shell:koala:camel:mouse:tiger:whale:horse:punch:crown:shirt:jeans:dress:purse:pouch:woman:ghost:angel:alien:skull:guard:cupid:anger:dizzy:pound:chart:books:pager:radio:sound:knife:kaaba:clock:japan:moyai:smile:blush:smirk:sweat:angry:weary:metro:train:truck:couch:wheel:tools:canoe:robot:metal:clown:spoon:bacon:salad:mango:bagel:ninja:eagle:shark:rhino:squid:zebra:t_rex:llama:sloth:otter:skunk:bison:tooth:onion:troll:adult:child:fairy:genie:brain:scarf:socks:broom:x_ray:yo_yo:chair:razor:banjo:hamsa:lotus:coral:lungs:olive:beans:rewind:coffee:taurus:gemini:cancer:pisces:spades:hearts:anchor:scales:coffin:soccer:chains:church:hotdog:cactus:leaves:tomato:grapes:banana:cookie:ribbon:bamboo:cinema:tophat:ticket:guitar:violin:tennis:trophy:hockey:desert:island:office:school:mouse2:tiger2:dragon:whale2:monkey:turtle:poodle:rabbit:tongue:kimono:bikini:sandal:family:couple:dancer:barber:muscle:dollar:ledger:scroll:pencil:e_mail:camera:repeat:unlock:wrench:hammer:mosque:clock1:clock2:clock3:clock4:clock5:clock6:clock7:clock8:clock9:candle:spider:crayon:vulcan:dagger:smiley:sleepy:hushed:scream:rocket:train2:womens:toilet:shower:shield:cowboy:selfie:prince:potato:carrot:turkey:lizard:shrimp:parrot:badger:oyster:beaver:cheese:garlic:waffle:butter:zombie:gloves:jigsaw:abacus:bricks:magnet:thread:basket:sponge:briefs:shorts:crutch:pinata:ladder:mirror:window:bucket:beetle:tamale:fondue:teapot:relaxed:recycle:alembic:warning:snowman:pencil2:sparkle:mahjong:cyclone:sunrise:rainbow:volcano:burrito:blossom:custard:cooking:popcorn:balloon:tickets:clapper:bowling:trumpet:camping:stadium:factory:rosette:amphora:leopard:rabbit2:rooster:chicken:octopus:penguin:dolphin:hamster:ok_hand:necktie:handbag:syringe:bouquet:wedding:droplet:pushpin:package:mailbox:postbox:calling:speaker:battery:no_bell:symbols:trident:menorah:clock10:clock11:clock12:desktop:printer:pensive:kissing:worried:triumph:fearful:flushed:joy_cat:station:busstop:minibus:red_car:tractor:smoking:bathtub:customs:bellhop:scooter:hugging:call_me:avocado:peanuts:coconut:pretzel:goggles:unicorn:gorilla:giraffe:cricket:peacock:raccoon:lobster:microbe:mammoth:cupcake:falafel:vampire:compass:toolbox:luggage:receipt:plunger:placard:feather:bubbles:keyboard:snowman2:umbrella:shamrock:point_up:yin_yang:scorpius:aquarius:diamonds:infinity:baseball:no_entry:mountain:fountain:sailboat:fuelpump:scissors:airplane:envelope:sparkles:question:arrow_up:new_moon:chestnut:seedling:hibiscus:mushroom:eggplant:cherries:icecream:doughnut:lollipop:cocktail:birthday:sparkler:game_die:football:race_car:hospital:elephant:blowfish:pig_nose:chipmunk:thumbsup:princess:lipstick:moneybag:computer:minidisc:calendar:notebook:bookmark:underage:beginner:clock130:clock230:clock330:clock430:clock530:clock630:clock730:clock830:clock930:levitate:joystick:dividers:card_box:grinning:laughing:innocent:relieved:unamused:confused:frowning:sleeping:no_mouth:blue_car:monorail:restroom:elevator:motorway:thinking:lacrosse:softball:cucumber:pancakes:dumpling:broccoli:sandwich:hot_face:lab_coat:scorpion:hedgehog:sauropod:kangaroo:mosquito:flamingo:ice_cube:hourglass:stopwatch:umbrella2:telephone:biohazard:frowning2:male_sign:capricorn:ophiuchus:ice_skate:black_nib:snowflake:wavy_dash:city_dusk:milky_way:full_moon:palm_tree:sunflower:tangerine:pineapple:hamburger:rice_ball:spaghetti:fish_cake:ice_cream:honey_pot:champagne:fireworks:saxophone:ping_pong:cityscape:badminton:crocodile:racehorse:mans_shoe:high_heel:older_man:nail_care:heartbeat:briefcase:bar_chart:clipboard:paperclip:blue_book:satellite:newspaper:projector:mag_right:telescope:om_symbol:synagogue:clock1030:clock1130:clock1230:detective:trackball:persevere:anguished:grimacing:smile_cat:smirk_cat:ambulance:speedboat:ring_buoy:motorboat:handshake:zany_face:mrs_claus:croissant:moon_cake:cold_face:lion_face:butterfly:orangutan:guide_dog:superhero:merperson:test_tube:parachute:boomerang:diya_lamp:accordion:long_drum:headstone:cockroach:flatbread:track_next:play_pause:chess_pawn:hotsprings:wheelchair:curly_loop:arrow_left:arrow_down:earth_asia:cloud_rain:cloud_snow:hot_pepper:maple_leaf:watermelon:strawberry:shaved_ice:wine_glass:wind_chime:rice_scene:microphone:headphones:video_game:basketball:motorcycle:volleyball:love_hotel:flag_white:flag_black:baby_chick:panda_face:point_up_2:point_down:point_left:thumbsdown:open_hands:womans_hat:eyeglasses:footprints:couplekiss:two_hearts:heartpulse:blue_heart:gift_heart:card_index:green_book:name_badge:inbox_tray:repeat_one:loud_sound:keycap_ten:flashlight:microscope:red_circle:spider_web:paperclips:paintbrush:newspaper2:ballot_box:mount_fuji:heart_eyes:sunglasses:confounded:tired_face:open_mouth:cold_sweat:astonished:dizzy_face:smiley_cat:scream_cat:helicopter:light_rail:trolleybus:police_car:no_smoking:skateboard:red_square:lying_face:chopsticks:woozy_face:bubble_tea:billed_cap:petri_dish:safety_pin:teddy_bear:magic_wand:mouse_trap:toothbrush:empty_nest:biting_lip:alarm_clock:stop_button:radioactive:female_sign:sagittarius:hammer_pick:raised_hand:exclamation:arrow_right:black_joker:city_sunset:thermometer:ear_of_rice:fallen_leaf:green_apple:poultry_leg:baby_bottle:microphone2:film_frames:circus_tent:snowboarder:post_office:lady_beetle:dragon_face:monkey_face:point_right:older_woman:love_letter:green_heart:sweat_drops:credit_card:floppy_disk:file_folder:closed_book:orange_book:loudspeaker:outbox_tray:postal_horn:blue_circle:man_dancing:black_heart:frame_photo:wastebasket:compression:speech_left:anger_right:tokyo_tower:sweat_smile:smiling_imp:kissing_cat:pouting_cat:upside_down:see_no_evil:railway_car:fire_engine:no_bicycles:baby_symbol:cruise_ship:blue_square:white_heart:brown_heart:money_mouth:star_struck:diving_mask:wilted_rose:first_place:third_place:flying_disc:takeout_box:cut_of_meat:canned_food:leafy_green:hiking_boot:safety_vest:deaf_person:older_adult:firecracker:stethoscope:screwdriver:mirror_ball:low_battery:blueberries:bell_pepper:heart_hands:fast_forward:pause_button:fleur_de_lis:white_circle:black_circle:partly_sunny:writing_hand:earth_africa:meat_on_bone:rice_cracker:sweet_potato:fried_shrimp:mortar_board:level_slider:ferris_wheel:movie_camera:slot_machine:musical_note:horse_racing:cricket_game:field_hockey:broken_heart:yellow_heart:purple_heart:white_flower:mobile_phone:video_camera:prayer_beads:radio_button:capital_abcd:nut_and_bolt:crystal_ball:pen_fountain:hand_splayed:file_cabinet:neutral_face:disappointed:slight_frown:slight_smile:rolling_eyes:hear_no_evil:raised_hands:oncoming_bus:construction:left_luggage:hindu_temple:pickup_truck:roller_skate:green_circle:brown_circle:green_square:brown_square:zipper_mouth:head_bandage:second_place:boxing_glove:french_bread:yawning_face:hippopotamus:probing_cane:supervillain:beverage_box:orange_heart:red_envelope:nazar_amulet:ballet_shoes:thong_sandal:potted_plant:pregnant_man:melting_face:palm_up_hand:arrow_up_down:record_button:arrow_forward:shinto_shrine:star_of_david:grey_question:crescent_moon:sun_with_face:cloud_tornado:chocolate_bar:confetti_ball:tanabata_tree:crossed_flags:control_knobs:musical_score:mountain_snow:bow_and_arrow:water_buffalo:tropical_fish:hatched_chick:athletic_shoe:japanese_ogre:space_invader:round_pushpin:bookmark_tabs:electric_plug:pen_ballpoint:middle_finger:speaking_head:kissing_heart:person_bowing:speak_no_evil:oncoming_taxi:traffic_light:no_entry_sign:do_not_litter:potable_water:person_biking:baggage_claim:shopping_bags:shopping_cart:railway_track:motor_scooter:flying_saucer:auto_rickshaw:orange_circle:yellow_circle:purple_circle:orange_square:yellow_square:purple_square:pinching_hand:drooling_face:sneezing_face:shushing_face:face_vomiting:tumbler_glass:curling_stone:partying_face:pleading_face:roll_of_paper:drop_of_blood:nesting_dolls:ringed_planet:carpentry_saw:sewing_needle:saluting_face:track_previous:arrow_backward:orthodox_cross:crossed_swords:medical_symbol:beach_umbrella:earth_americas:evergreen_tree:deciduous_tree:cherry_blossom:fork_and_knife:tropical_drink:jack_o_lantern:christmas_tree:school_satchel:military_medal:carousel_horse:roller_coaster:checkered_flag:person_running:person_surfing:rugby_football:person_golfing:hatching_chick:womans_clothes:police_officer:speech_balloon:page_with_curl:page_facing_up:straight_ruler:mailbox_closed:vibration_mode:low_brightness:arrow_up_small:notepad_spiral:expressionless:heart_eyes_cat:person_pouting:aerial_tramway:rotating_light:person_walking:no_pedestrians:octagonal_sign:airplane_small:nauseated_face:exploding_head:pregnant_woman:breast_feeding:person_fencing:fortune_cookie:cup_with_straw:disguised_face:mechanical_arm:mechanical_leg:bearded_person:squeeze_bottle:nest_with_eggs:people_hugging:pouring_liquid:leftwards_hand:palm_down_hand:arrow_double_up:wheel_of_dharma:heavy_plus_sign:closed_umbrella:bridge_at_night:white_sun_cloud:cloud_lightning:reminder_ribbon:performing_arts:person_swimming:house_abandoned:izakaya_lantern:japanese_castle:european_castle:dromedary_camel:japanese_goblin:sparkling_heart:thought_balloon:signal_strength:high_brightness:dark_sunglasses:calendar_spiral:crying_cat_face:person_frowning:pinched_fingers:fingers_crossed:person_juggling:champagne_glass:bowl_with_spoon:person_standing:person_kneeling:person_climbing:military_helmet:pregnant_person:rightwards_hand:left_right_arrow:arrow_upper_left:arrow_lower_left:arrow_right_hook:skull_crossbones:white_check_mark:heavy_check_mark:grey_exclamation:heavy_minus_sign:arrow_heading_up:night_with_stars:four_leaf_clover:fork_knife_plate:musical_keyboard:department_store:person_with_veil:revolving_hearts:heart_decoration:money_with_wings:open_file_folder:triangular_ruler:mobile_phone_off:no_mobile_phones:arrows_clockwise:six_pointed_star:arrow_down_small:stuck_out_tongue:steam_locomotive:bullettrain_side:mountain_railway:passport_control:place_of_worship:playground_slide:thermometer_face:left_facing_fist:love_you_gesture:person_in_tuxedo:person_shrugging:people_wrestling:womans_flat_shoe:adhesive_bandage:anatomical_heart:dotted_line_face:arrow_upper_right:arrow_lower_right:arrow_double_down:star_and_crescent:helmet_with_cross:heart_exclamation:last_quarter_moon:wind_blowing_face:construction_site:house_with_garden:convenience_store:couple_with_heart:currency_exchange:heavy_dollar_sign:incoming_envelope:mailbox_with_mail:camera_with_flash:lock_with_ink_pen:statue_of_liberty:bullettrain_front:articulated_lorry:mountain_cableway:non_potable_water:children_crossing:airplane_arriving:satellite_orbital:heavy_equals_sign:right_facing_fist:palms_up_together:stuffed_flatbread:manual_wheelchair:face_with_monocle:fire_extinguisher:person_with_crown:black_small_square:white_small_square:transgender_symbol:thunder_cloud_rain:arrow_heading_down:black_large_square:white_large_square:first_quarter_moon:new_moon_with_face:classical_building:bust_in_silhouette:telephone_receiver:large_blue_diamond:small_blue_diamond:small_red_triangle:mouse_three_button:suspension_railway:person_rowing_boat:airplane_departure:person_facepalming:one_piece_swimsuit:white_medium_square:black_medium_square:heavy_division_sign:waxing_gibbous_moon:waning_gibbous_moon:full_moon_with_face:busts_in_silhouette:blond_haired_person:construction_worker:person_tipping_hand:envelope_with_arrow:black_square_button:white_square_button:kissing_closed_eyes:person_gesturing_no:person_gesturing_ok:person_raising_hand:oncoming_police_car:oncoming_automobile:raised_back_of_hand:shallow_pan_of_food:identification_card:person_bouncing_ball:globe_with_meridians:waxing_crescent_moon:waning_crescent_moon:white_sun_rain_cloud:flower_playing_cards:european_post_office:man_with_chinese_cap:mailbox_with_no_mail:closed_lock_with_key:large_orange_diamond:small_orange_diamond:kissing_smiling_eyes:martial_arts_uniform:ear_with_hearing_aid:motorized_wheelchair:woman_with_headscarf:ballot_box_with_check:eight_spoked_asterisk:part_alternation_mark:white_sun_small_cloud:fishing_pole_and_fish:two_men_holding_hands:person_wearing_turban:disappointed_relieved:person_in_steamy_room:face_with_peeking_eye:hourglass_flowing_sand:heavy_multiplication_x:sunrise_over_mountains:person_lifting_weights:person_getting_massage:person_getting_haircut:vertical_traffic_light:person_mountain_biking:sleeping_accommodation:person_doing_cartwheel:smiling_face_with_tear:running_shirt_with_sash:two_women_holding_hands:arrows_counterclockwise:small_red_triangle_down:triangular_flag_on_post:put_litter_in_its_place:person_playing_handball:face_holding_back_tears:eight_pointed_black_star:chart_with_upwards_trend:face_with_raised_eyebrow:person_in_lotus_position:face_with_diagonal_mouth:leftwards_arrow_with_hook:white_medium_small_square:black_medium_small_square:twisted_rightwards_arrows:face_with_hand_over_mouth:person_playing_water_polo:chart_with_downwards_trend:smiling_face_with_3_hearts:negative_squared_cross_mark:last_quarter_moon_with_face:first_quarter_moon_with_face:stuck_out_tongue_winking_eye:stuck_out_tongue_closed_eyes:face_with_symbols_over_mouth:index_pointing_at_the_viewer:notebook_with_decorative_cover:people_with_bunny_ears_partying:diamond_shape_with_a_dot_inside:face_with_open_eyes_and_hand_over_mouth:hand_with_index_finger_and_thumb_crossed:XuoiDuoiNhamGiuaSuotQuenTrumXienTrayThayVungPhiaChauTroiTromThoiNguaNhauMaauNhocNhuiZeotNgatFaaiThaiHoatGiupThiaKhamGiauMuoiRuoiXungNhayTuouDieuQuaiNhaiPhomThauHuytThucCaauPhaoRenhToacUongZaatFaatThamTreuQuatPhucGiaiKhacChiaMaaiChiuChoiTrouVongXangNaapOangPaaiNhoiNuotThuaThepGiucThueThenGiamNhapNhipSaauNguiNhaoNgayKhayPheuThotKhaoXongThomNhomGheoTheoLiemKhemNheoThemHoaiNhepGiemNhotSaaiNieuVachTretRanhTrauGioiCanhCuoiCaaiNhatRungTraiPhoiTuoiRokuCingThitNgopLuoiKhitRieuNhacNhitLaanTriuGiatThatTrotQuayPaakQuaoQuetPhayKhepBuocGieoPhuiPhenKhoiGietBaaiCyutLuomPhocNaanTracTuomGiayBuoiTruaQuapNgucCaatNhumQueoTratXoaiPhimNgocChayTramPheoThacQuamNhopNgutNgotNhemNgamNgapNhuaVuotGiotRachRuouKhetPhapThuiThapBuotLuocDuocMuopNhimKhonKhaiNgaoTaanCuomNhucGuocDiecBuouKhomTeoiNgomTreoPhauLiecQuauTritGuomTraoZyunCaakXachWaakSakiThocHoamZoekKhauLiepNienRietXichNuocLuotXinhMieuVenhRuotPhopSuoiPhetThumGhemRuomKieuBuomVichJikuJrenShuuBieuXechKhapKheoRinhTrenMietCuocGiaoDuonGekiGuotXanhHaaiNgupThetNuoiXoamBuopLietGiecGhimRuocTruiZyutPaauGaauCaamJaapWaaiNeoiNaauAangTaatCeotManatPluto{237}{347}{257}{357}{457}{167}{267}{367}{467}{567}{128}{138}{238}{148}{248}{348}{158}{258}{358}{458}{168}{268}{368}{468}{568}{178}{278}{378}{478}{578}{678}HadesSTRS.JiongQiangChangHuangChongXiang(JIS)HZZZGuang(Cha)(OHu)(Yue)(Huo)(Jin)(Zhu)(You)(She)(Cai)(Lao)(Dai)(Xue)(Xie)(Xiu)(Zhi)ZhengShangReiwaShowaMeijiXiongChengQiongKuangLiangCoengZhangSoengNgaakJiangPaangChuaiGwongHoengZoengShuaiJoengGwingKoengGoengNiangGwangDaYouShiKeokkDaChukkDaGuongWeiJiaRenDiRenRenTianRenZhuaiGwaanzzietzziexzziepzzurxzzyrxzhuoxzhuopzhurxzhyrxZZIETtakkNuengGaekkGaegsGaenjGaenhGaelgGaelmGaelbGaelsGaeltGaelpGaelhGaebsGaessGaengGaechGyakkGyagsGyanjGyanhGyalgGyalmGyalbGyalsGyaltGyalpGyalhGyabsGyassGyangGyachGyaedGyaemGyaejGyaetGyaepGyaehGeokkGeogsGeonjGeonhGeolgGeolmGeolbGeolsGeoltGeolpGeolhGeobsGeossGeongGeochGyeodGyeomGyeojGyeotGyeopGyeohGyekkGyegsGyenjGyenhGyelgGyelmGyelbGyelsGyeltGyelpGyelhGyebsGyessGyengGyechGwakkGwagsGwanjGwanhGwalgGwalmGwalbGwalsGwaltGwalpGwalhGwabsGwassGwachGwaedGwaemGwaejGwaetGwaepGwaehGoekkGoegsGoenjGoenhGoelgGoelmGoelbGoelsGoeltGoelpGoelhGoebsGoessGoechGyokkGyogsGyonjGyonhGyolgGyolmGyolbGyolsGyoltGyolpGyolhGyobsGyossGyongGyochGwokkGwogsGwonjGwonhGwolgGwolmGwolbGwolsGwoltGwolpGwolhGwobsGwossGwochGwekkGwegsGwenjGwenhGwelgGwelmGwelbGwelsGweltGwelpGwelhGwebsGwessGwengGwechGwikkGwigsGwinjGwinhGwilgGwilmGwilbGwilsGwiltGwilpGwilhGwibsGwissGwichGyukkGyugsGyunjGyunhGyulgGyulmGyulbGyulsGyultGyulpGyulhGyubsGyussGyungGyuchGeukkGeugsGeunjGeunhGeulgGeulmGeulbGeulsGeultGeulpGeulhGeubsGeussGeungGeuchGuikkGuigsGuinjGuinhGuilgGuilmGuilbGuilsGuiltGuilpGuilhGuibsGuissGuingGuichKkakkKkagsKkanjKkanhKkalgKkalmKkalbKkalsKkaltKkalpKkalhKkabsKkassKkangKkachKkaedKkaemKkaejKkaetKkaepKkaehKkyadKkyamKkyajKkyatKkyapKkyahKkeodKkeomKkeojKkeotKkeopKkeohKkekkKkegsKkenjKkenhKkelgKkelmKkelbKkelsKkeltKkelpKkelhKkebsKkessKkengKkechKkyedKkyemKkyejKkyetKkyepKkyehKkokkKkogsKkonjKkonhKkolgKkolmKkolbKkolsKkoltKkolpKkolhKkobsKkossKkongKkochKkwadKkwamKkwajKkwatKkwapKkwahKkoedKkoemKkoejKkoetKkoepKkoehKkyodKkyomKkyojKkyotKkyopKkyohKkukkKkugsKkunjKkunhKkulgKkulmKkulbKkulsKkultKkulpKkulhKkubsKkussKkungKkuchKkwodKkwomKkwojKkwotKkwopKkwohKkwedKkwemKkwejKkwetKkwepKkwehKkwidKkwimKkwijKkwitKkwipKkwihKkyudKkyumKkyujKkyutKkyupKkyuhKkeudKkeumKkeujKkeutKkeupKkeuhKkuidKkuimKkuijKkuitKkuipKkuihKkikkKkigsKkinjKkinhKkilgKkilmKkilbKkilsKkiltKkilpKkilhKkibsKkissKkingKkichNaekkNaegsNaenjNaenhNaelgNaelmNaelbNaelsNaeltNaelpNaelhNaebsNaessNaengNaechNyakkNyagsNyanjNyanhNyalgNyalmNyalbNyalsNyaltNyalpNyalhNyabsNyassNyangNyachNyaedNyaemNyaejNyaetNyaepNyaehNeokkNeogsNeonjNeonhNeolgNeolmNeolbNeolsNeoltNeolpNeolhNeobsNeossNeongNeochNyeodNyeomNyeojNyeotNyeopNyeohNyekkNyegsNyenjNyenhNyelgNyelmNyelbNyelsNyeltNyelpNyelhNyebsNyessNyengNyechNwakkNwagsNwanjNwanhNwalgNwalmNwalbNwalsNwaltNwalpNwalhNwabsNwassNwangNwachNwaedNwaemNwaejNwaetNwaepNwaehNoekkNoegsNoenjNoenhNoelgNoelmNoelbNoelsNoeltNoelpNoelhNoebsNoessNoengNoechNyokkNyogsNyonjNyonhNyolgNyolmNyolbNyolsNyoltNyolpNyolhNyobsNyossNyongNyochNwokkNwogsNwonjNwonhNwolgNwolmNwolbNwolsNwoltNwolpNwolhNwobsNwossNwongNwochNwekkNwegsNwenjNwenhNwelgNwelmNwelbNwelsNweltNwelpNwelhNwebsNwessNwengNwechNwikkNwigsNwinjNwinhNwilgNwilmNwilbNwilsNwiltNwilpNwilhNwibsNwissNwingNwichNyukkNyugsNyunjNyunhNyulgNyulmNyulbNyulsNyultNyulpNyulhNyubsNyussNyungNyuchNeukkNeugsNeunjNeunhNeulgNeulmNeulbNeulsNeultNeulpNeulhNeubsNeussNeungNeuchNuikkNuigsNuinjNuinhNuilgNuilmNuilbNuilsNuiltNuilpNuilhNuibsNuissNuingNuichDaekkDaegsDaenjDaenhDaelgDaelmDaelbDaelsDaeltDaelpDaelhDaebsDaessDaengDaechDyakkDyagsDyanjDyanhDyalgDyalmDyalbDyalsDyaltDyalpDyalhDyabsDyassDyangDyachDyaedDyaemDyaejDyaetDyaepDyaehDeokkDeogsDeonjDeonhDeolgDeolmDeolbDeolsDeoltDeolpDeolhDeobsDeossDeongDeochDyeodDyeomDyeojDyeotDyeopDyeohDyekkDyegsDyenjDyenhDyelgDyelmDyelbDyelsDyeltDyelpDyelhDyebsDyessDyengDyechDwakkDwagsDwanjDwanhDwalgDwalmDwalbDwalsDwaltDwalpDwalhDwabsDwassDwangDwachDwaedDwaemDwaejDwaetDwaepDwaehDoekkDoegsDoenjDoenhDoelgDoelmDoelbDoelsDoeltDoelpDoelhDoebsDoessDoengDoechDyokkDyogsDyonjDyonhDyolgDyolmDyolbDyolsDyoltDyolpDyolhDyobsDyossDyongDyochDwokkDwogsDwonjDwonhDwolgDwolmDwolbDwolsDwoltDwolpDwolhDwobsDwossDwongDwochDwekkDwegsDwenjDwenhDwelgDwelmDwelbDwelsDweltDwelpDwelhDwebsDwessDwengDwechDwikkDwigsDwinjDwinhDwilgDwilmDwilbDwilsDwiltDwilpDwilhDwibsDwissDwingDwichDyukkDyugsDyunjDyunhDyulgDyulmDyulbDyulsDyultDyulpDyulhDyubsDyussDyungDyuchDeukkDeugsDeunjDeunhDeulgDeulmDeulbDeulsDeultDeulpDeulhDeubsDeussDeungDeuchDuikkDuigsDuinjDuinhDuilgDuilmDuilbDuilsDuiltDuilpDuilhDuibsDuissDuingDuichTtagsTtanjTtanhTtalgTtalmTtalbTtalsTtaltTtalpTtalhTtabsTtassTtangTtachTtaedTtaemTtaejTtaetTtaepTtaehTtyadTtyamTtyajTtyatTtyapTtyahTteodTteomTteojTteotTteopTteohTtekkTtegsTtenjTtenhTtelgTtelmTtelbTtelsTteltTtelpTtelhTtebsTtessTtengTtechTtyedTtyemTtyejTtyetTtyepTtyehTtokkTtogsTtonjTtonhTtolgTtolmTtolbTtolsTtoltTtolpTtolhTtobsTtossTtongTtochTtwadTtwamTtwajTtwatTtwapTtwahTtoedTtoemTtoejTtoetTtoepTtoehTtyodTtyomTtyojTtyotTtyopTtyohTtukkTtugsTtunjTtunhTtulgTtulmTtulbTtulsTtultTtulpTtulhTtubsTtussTtungTtuchTtwodTtwomTtwojTtwotTtwopTtwohTtwedTtwemTtwejTtwetTtwepTtwehTtwidTtwimTtwijTtwitTtwipTtwihTtyudTtyumTtyujTtyutTtyupTtyuhTteudTteumTteujTteutTteupTteuhTtuidTtuimTtuijTtuitTtuipTtuihTtikkTtigsTtinjTtinhTtilgTtilmTtilbTtilsTtiltTtilpTtilhTtibsTtissTtingTtichLaekkLaegsLaenjLaenhLaelgLaelmLaelbLaelsLaeltLaelpLaelhLaebsLaessLaengLaechLyakkLyagsLyanjLyanhLyalgLyalmLyalbLyalsLyaltLyalpLyalhLyabsLyassLyangLyachLyaedLyaemLyaejLyaetLyaepLyaehLeokkLeogsLeonjLeonhLeolgLeolmLeolbLeolsLeoltLeolpLeolhLeobsLeossLeongLeochLyeodLyeomLyeojLyeotLyeopLyeohLyekkLyegsLyenjLyenhLyelgLyelmLyelbLyelsLyeltLyelpLyelhLyebsLyessLyengLyechLwakkLwagsLwanjLwanhLwalgLwalmLwalbLwalsLwaltLwalpLwalhLwabsLwassLwangLwachLwaedLwaemLwaejLwaetLwaepLwaehLoekkLoegsLoenjLoenhLoelgLoelmLoelbLoelsLoeltLoelpLoelhLoebsLoessLoengLoechLyokkLyogsLyonjLyonhLyolgLyolmLyolbLyolsLyoltLyolpLyolhLyobsLyossLyongLyochLwokkLwogsLwonjLwonhLwolgLwolmLwolbLwolsLwoltLwolpLwolhLwobsLwossLwongLwochLwekkLwegsLwenjLwenhLwelgLwelmLwelbLwelsLweltLwelpLwelhLwebsLwessLwengLwechLwikkLwigsLwinjLwinhLwilgLwilmLwilbLwilsLwiltLwilpLwilhLwibsLwissLwingLwichLyukkLyugsLyunjLyunhLyulgLyulmLyulbLyulsLyultLyulpLyulhLyubsLyussLyungLyuchLeukkLeugsLeunjLeunhLeulgLeulmLeulbLeulsLeultLeulpLeulhLeubsLeussLeungLeuchLuikkLuigsLuinjLuinhLuilgLuilmLuilbLuilsLuiltLuilpLuilhLuibsLuissLuingLuichMaekkMaegsMaenjMaenhMaelgMaelmMaelbMaelsMaeltMaelpMaelhMaebsMaessMaengMaechMyakkMyagsMyanjMyanhMyalgMyalmMyalbMyalsMyaltMyalpMyalhMyabsMyassMyangMyachMyaedMyaemMyaejMyaetMyaepMyaehMeokkMeogsMeonjMeonhMeolgMeolmMeolbMeolsMeoltMeolpMeolhMeobsMeossMeongMeochMyeodMyeomMyeojMyeotMyeopMyeohMyekkMyegsMyenjMyenhMyelgMyelmMyelbMyelsMyeltMyelpMyelhMyebsMyessMyengMyechMwakkMwagsMwanjMwanhMwalgMwalmMwalbMwalsMwaltMwalpMwalhMwabsMwassMwangMwachMwaedMwaemMwaejMwaetMwaepMwaehMoekkMoegsMoenjMoenhMoelgMoelmMoelbMoelsMoeltMoelpMoelhMoebsMoessMoengMoechMyokkMyogsMyonjMyonhMyolgMyolmMyolbMyolsMyoltMyolpMyolhMyobsMyossMyongMyochMwokkMwogsMwonjMwonhMwolgMwolmMwolbMwolsMwoltMwolpMwolhMwobsMwossMwongMwochMwekkMwegsMwenjMwenhMwelgMwelmMwelbMwelsMweltMwelpMwelhMwebsMwessMwengMwechMwikkMwigsMwinjMwinhMwilgMwilmMwilbMwilsMwiltMwilpMwilhMwibsMwissMwingMwichMyukkMyugsMyunjMyunhMyulgMyulmMyulbMyulsMyultMyulpMyulhMyubsMyussMyungMyuchMeukkMeugsMeunjMeunhMeulgMeulmMeulbMeulsMeultMeulpMeulhMeubsMeussMeungMeuchMuikkMuigsMuinjMuinhMuilgMuilmMuilbMuilsMuiltMuilpMuilhMuibsMuissMuingMuichBaekkBaegsBaenjBaenhBaelgBaelmBaelbBaelsBaeltBaelpBaelhBaebsBaessBaengBaechByakkByagsByanjByanhByalgByalmByalbByalsByaltByalpByalhByabsByassByangByachByaedByaemByaejByaetByaepByaehBeokkBeogsBeonjBeonhBeolgBeolmBeolbBeolsBeoltBeolpBeolhBeobsBeossBeongBeochByeodByeomByeojByeotByeopByeohByekkByegsByenjByenhByelgByelmByelbByelsByeltByelpByelhByebsByessByengByechBwakkBwagsBwanjBwanhBwalgBwalmBwalbBwalsBwaltBwalpBwalhBwabsBwassBwangBwachBwaedBwaemBwaejBwaetBwaepBwaehBoekkBoegsBoenjBoenhBoelgBoelmBoelbBoelsBoeltBoelpBoelhBoebsBoessBoengBoechByokkByogsByonjByonhByolgByolmByolbByolsByoltByolpByolhByobsByossByongByochBwokkBwogsBwonjBwonhBwolgBwolmBwolbBwolsBwoltBwolpBwolhBwobsBwossBwongBwochBwekkBwegsBwenjBwenhBwelgBwelmBwelbBwelsBweltBwelpBwelhBwebsBwessBwengBwechBwikkBwigsBwinjBwinhBwilgBwilmBwilbBwilsBwiltBwilpBwilhBwibsBwissBwingBwichByukkByugsByunjByunhByulgByulmByulbByulsByultByulpByulhByubsByussByungByuchBeukkBeugsBeunjBeunhBeulgBeulmBeulbBeulsBeultBeulpBeulhBeubsBeussBeungBeuchBuikkBuigsBuinjBuinhBuilgBuilmBuilbBuilsBuiltBuilpBuilhBuibsBuissBuingBuichPpakkPpagsPpanjPpanhPpalgPpalmPpalbPpalsPpaltPpalpPpalhPpabsPpassPpangPpachPpaedPpaemPpaejPpaetPpaepPpaehPpyadPpyamPpyajPpyatPpyapPpyahPpeodPpeomPpeojPpeotPpeopPpeohPpekkPpegsPpenjPpenhPpelgPpelmPpelbPpelsPpeltPpelpPpelhPpebsPpessPpengPpechPpyedPpyemPpyejPpyetPpyepPpyehPpokkPpogsPponjPponhPpolgPpolmPpolbPpolsPpoltPpolpPpolhPpobsPpossPpongPpochPpwadPpwamPpwajPpwatPpwapPpwahPpoedPpoemPpoejPpoetPpoepPpoehPpyodPpyomPpyojPpyotPpyopPpyohPpukkPpugsPpunjPpunhPpulgPpulmPpulbPpulsPpultPpulpPpulhPpubsPpussPpungPpuchPpwodPpwomPpwojPpwotPpwopPpwohPpwedPpwemPpwejPpwetPpwepPpwehPpwidPpwimPpwijPpwitPpwipPpwihPpyudPpyumPpyujPpyutPpyupPpyuhPpeudPpeumPpeujPpeutPpeupPpeuhPpuidPpuimPpuijPpuitPpuipPpuihPpikkPpigsPpinjPpinhPpilgPpilmPpilbPpilsPpiltPpilpPpilhPpibsPpissPpingPpichSaekkSaegsSaenjSaenhSaelgSaelmSaelbSaelsSaeltSaelpSaelhSaebsSaessSaengSaechSyakkSyagsSyanjSyanhSyalgSyalmSyalbSyalsSyaltSyalpSyalhSyabsSyassSyangSyachSyaedSyaemSyaejSyaetSyaepSyaehSeokkSeogsSeonjSeonhSeolgSeolmSeolbSeolsSeoltSeolpSeolhSeobsSeossSeongSeochSyeodSyeomSyeojSyeotSyeopSyeohSyekkSyegsSyenjSyenhSyelgSyelmSyelbSyelsSyeltSyelpSyelhSyebsSyessSyengSyechSwakkSwagsSwanjSwanhSwalgSwalmSwalbSwalsSwaltSwalpSwalhSwabsSwassSwangSwachSwaedSwaemSwaejSwaetSwaepSwaehSoekkSoegsSoenjSoenhSoelgSoelmSoelbSoelsSoeltSoelpSoelhSoebsSoessSoechSyokkSyogsSyonjSyonhSyolgSyolmSyolbSyolsSyoltSyolpSyolhSyobsSyossSyongSyochSwokkSwogsSwonjSwonhSwolgSwolmSwolbSwolsSwoltSwolpSwolhSwobsSwossSwongSwochSwekkSwegsSwenjSwenhSwelgSwelmSwelbSwelsSweltSwelpSwelhSwebsSwessSwengSwechSwikkSwigsSwinjSwinhSwilgSwilmSwilbSwilsSwiltSwilpSwilhSwibsSwissSwingSwichSyukkSyugsSyunjSyunhSyulgSyulmSyulbSyulsSyultSyulpSyulhSyubsSyussSyungSyuchSeukkSeugsSeunjSeunhSeulgSeulmSeulbSeulsSeultSeulpSeulhSeubsSeussSeungSeuchSuikkSuigsSuinjSuinhSuilgSuilmSuilbSuilsSuiltSuilpSuilhSuibsSuissSuingSuichSsakkSsagsSsanjSsanhSsalgSsalmSsalbSsalsSsaltSsalpSsalhSsabsSsassSsangSsachSsaedSsaemSsaejSsaetSsaepSsaehSsyadSsyamSsyajSsyatSsyapSsyahSseodSseomSseojSseotSseopSseohSsekkSsegsSsenjSsenhSselgSselmSselbSselsSseltSselpSselhSsebsSsessSsengSsechSsyedSsyemSsyejSsyetSsyepSsyehSsokkSsogsSsonjSsonhSsolgSsolmSsolbSsolsSsoltSsolpSsolhSsobsSsossSsongSsochSswadSswamSswajSswatSswapSswahSsoedSsoemSsoejSsoetSsoepSsoehSsyodSsyomSsyojSsyotSsyopSsyohSsukkSsugsSsunjSsunhSsulgSsulmSsulbSsulsSsultSsulpSsulhSsubsSsussSsungSsuchSswodSswomSswojSswotSswopSswohSswedSswemSswejSswetSswepSswehSswidSswimSswijSswitSswipSswihSsyudSsyumSsyujSsyutSsyupSsyuhSseudSseumSseujSseutSseupSseuhSsuidSsuimSsuijSsuitSsuipSsuihSsikkSsigsSsinjSsinhSsilgSsilmSsilbSsilsSsiltSsilpSsilhSsibsSsissSsingSsichYaekkYaegsYaenjYaenhYaelgYaelmYaelbYaelsYaeltYaelpYaelhYaebsYaessYaengYaechYeokkYeogsYeonjYeonhYeolgYeolmYeolbYeolsYeoltYeolpYeolhYeobsYeossYeongYeochWaekkWaegsWaenjWaenhWaelgWaelmWaelbWaelsWaeltWaelpWaelhWaebsWaessWaengWaechJaekkJaegsJaenjJaenhJaelgJaelmJaelbJaelsJaeltJaelpJaelhJaebsJaessJaengJaechJyakkJyagsJyanjJyanhJyalgJyalmJyalbJyalsJyaltJyalpJyalhJyabsJyassJyangJyachJyaedJyaemJyaejJyaetJyaepJyaehJeokkJeogsJeonjJeonhJeolgJeolmJeolbJeolsJeoltJeolpJeolhJeobsJeossJeongJeochJyeodJyeomJyeojJyeotJyeopJyeohJyekkJyegsJyenjJyenhJyelgJyelmJyelbJyelsJyeltJyelpJyelhJyebsJyessJyengJyechJwakkJwagsJwanjJwanhJwalgJwalmJwalbJwalsJwaltJwalpJwalhJwabsJwassJwangJwachJwaedJwaemJwaejJwaetJwaepJwaehJoekkJoegsJoenjJoenhJoelgJoelmJoelbJoelsJoeltJoelpJoelhJoebsJoessJoechJyokkJyogsJyonjJyonhJyolgJyolmJyolbJyolsJyoltJyolpJyolhJyobsJyossJyongJyochJwokkJwogsJwonjJwonhJwolgJwolmJwolbJwolsJwoltJwolpJwolhJwobsJwossJwongJwochJwekkJwegsJwenjJwenhJwelgJwelmJwelbJwelsJweltJwelpJwelhJwebsJwessJwengJwechJwikkJwigsJwinjJwinhJwilgJwilmJwilbJwilsJwiltJwilpJwilhJwibsJwissJwingJwichJyukkJyugsJyunjJyunhJyulgJyulmJyulbJyulsJyultJyulpJyulhJyubsJyussJyungJyuchJeukkJeugsJeunjJeunhJeulgJeulmJeulbJeulsJeultJeulpJeulhJeubsJeussJeungJeuchJuikkJuigsJuinjJuinhJuilgJuilmJuilbJuilsJuiltJuilpJuilhJuibsJuissJuingJuichJjakkJjagsJjanjJjanhJjalgJjalmJjalbJjalsJjaltJjalpJjalhJjabsJjassJjangJjachJjaedJjaemJjaejJjaetJjaepJjaehJjyadJjyamJjyajJjyatJjyapJjyahJjeodJjeomJjeojJjeotJjeopJjeohJjekkJjegsJjenjJjenhJjelgJjelmJjelbJjelsJjeltJjelpJjelhJjebsJjessJjengJjechJjyedJjyemJjyejJjyetJjyepJjyehJjokkJjogsJjonjJjonhJjolgJjolmJjolbJjolsJjoltJjolpJjolhJjobsJjossJjongJjochJjwadJjwamJjwajJjwatJjwapJjwahJjoedJjoemJjoejJjoetJjoepJjoehJjyodJjyomJjyojJjyotJjyopJjyohJjukkJjugsJjunjJjunhJjulgJjulmJjulbJjulsJjultJjulpJjulhJjubsJjussJjungJjuchJjwodJjwomJjwojJjwotJjwopJjwohJjwedJjwemJjwejJjwetJjwepJjwehJjwidJjwimJjwijJjwitJjwipJjwihJjyudJjyumJjyujJjyutJjyupJjyuhJjeudJjeumJjeujJjeutJjeupJjeuhJjuidJjuimJjuijJjuitJjuipJjuihJjikkJjigsJjinjJjinhJjilgJjilmJjilbJjilsJjiltJjilpJjilhJjibsJjissJjingJjichChakkChagsChanjChanhChalgChalmChalbChalsChaltChalpChalhChabsChassChachChaedChaemChaejChaetChaepChaehChyadChyamChyajChyatChyapChyahCheodCheomCheojCheotCheopCheohChekkChegsChenjChenhChelgChelmChelbChelsCheltChelpChelhChebsChessChechChyedChyemChyejChyetChyepChyehChokkChogsChonjChonhCholgCholmCholbCholsCholtCholpCholhChobsChossChochChwadChwamChwajChwatChwapChwahChoedChoemChoejChoetChoepChoehChyodChyomChyojChyotChyopChyohChugsChunjChunhChulgChulmChulbChulsChultChulpChulhChubsChussChungChuchChwodChwomChwojChwotChwopChwohChwedChwemChwejChwetChwepChwehChwidChwimChwijChwitChwipChwihChyudChyumChyujChyutChyupChyuhCheudCheumCheujCheutCheupCheuhChuidChuimChuijChuitChuipChuihChikkChigsChinjChinhChilgChilmChilbChilsChiltChilpChilhChibsChissChingChichKaekkKaegsKaenjKaenhKaelgKaelmKaelbKaelsKaeltKaelpKaelhKaebsKaessKaengKaechKyakkKyagsKyanjKyanhKyalgKyalmKyalbKyalsKyaltKyalpKyalhKyabsKyassKyangKyachKyaedKyaemKyaejKyaetKyaepKyaehKeogsKeonjKeonhKeolgKeolmKeolbKeolsKeoltKeolpKeolhKeobsKeossKeongKeochKyeodKyeomKyeojKyeotKyeopKyeohKyekkKyegsKyenjKyenhKyelgKyelmKyelbKyelsKyeltKyelpKyelhKyebsKyessKyengKyechKwakkKwagsKwanjKwanhKwalgKwalmKwalbKwalsKwaltKwalpKwalhKwabsKwassKwangKwachKwaedKwaemKwaejKwaetKwaepKwaehKoekkKoegsKoenjKoenhKoelgKoelmKoelbKoelsKoeltKoelpKoelhKoebsKoessKoechKyokkKyogsKyonjKyonhKyolgKyolmKyolbKyolsKyoltKyolpKyolhKyobsKyossKyongKyochKwokkKwogsKwonjKwonhKwolgKwolmKwolbKwolsKwoltKwolpKwolhKwobsKwossKwongKwochKwekkKwegsKwenjKwenhKwelgKwelmKwelbKwelsKweltKwelpKwelhKwebsKwessKwengKwechKwikkKwigsKwinjKwinhKwilgKwilmKwilbKwilsKwiltKwilpKwilhKwibsKwissKwingKwichKyukkKyugsKyunjKyunhKyulgKyulmKyulbKyulsKyultKyulpKyulhKyubsKyussKyungKyuchKeukkKeugsKeunjKeunhKeulgKeulmKeulbKeulsKeultKeulpKeulhKeubsKeussKeungKeuchKuikkKuigsKuinjKuinhKuilgKuilmKuilbKuilsKuiltKuilpKuilhKuibsKuissKuingKuichTaekkTaegsTaenjTaenhTaelgTaelmTaelbTaelsTaeltTaelpTaelhTaebsTaessTaengTaechTyakkTyagsTyanjTyanhTyalgTyalmTyalbTyalsTyaltTyalpTyalhTyabsTyassTyangTyachTyaedTyaemTyaejTyaetTyaepTyaehTeokkTeogsTeonjTeonhTeolgTeolmTeolbTeolsTeoltTeolpTeolhTeobsTeossTeongTeochTyeodTyeomTyeojTyeotTyeopTyeohTyekkTyegsTyenjTyenhTyelgTyelmTyelbTyelsTyeltTyelpTyelhTyebsTyessTyengTyechTwakkTwagsTwanjTwanhTwalgTwalmTwalbTwalsTwaltTwalpTwalhTwabsTwassTwangTwachTwaedTwaemTwaejTwaetTwaepTwaehToekkToegsToenjToenhToelgToelmToelbToelsToeltToelpToelhToebsToessToengToechTyokkTyogsTyonjTyonhTyolgTyolmTyolbTyolsTyoltTyolpTyolhTyobsTyossTyongTyochTwokkTwogsTwonjTwonhTwolgTwolmTwolbTwolsTwoltTwolpTwolhTwobsTwossTwongTwochTwekkTwegsTwenjTwenhTwelgTwelmTwelbTwelsTweltTwelpTwelhTwebsTwessTwengTwechTwikkTwigsTwinjTwinhTwilgTwilmTwilbTwilsTwiltTwilpTwilhTwibsTwissTwingTwichTyukkTyugsTyunjTyunhTyulgTyulmTyulbTyulsTyultTyulpTyulhTyubsTyussTyungTyuchTeukkTeugsTeunjTeunhTeulgTeulmTeulbTeulsTeultTeulpTeulhTeubsTeussTeungTeuchTuikkTuigsTuinjTuinhTuilgTuilmTuilbTuilsTuiltTuilpTuilhTuibsTuissTuingTuichPaekkPaegsPaenjPaenhPaelgPaelmPaelbPaelsPaeltPaelpPaelhPaebsPaessPaengPaechPyakkPyagsPyanjPyanhPyalgPyalmPyalbPyalsPyaltPyalpPyalhPyabsPyassPyangPyachPyaedPyaemPyaejPyaetPyaepPyaehPeokkPeogsPeonjPeonhPeolgPeolmPeolbPeolsPeoltPeolpPeolhPeobsPeossPeongPeochPyeodPyeomPyeojPyeotPyeopPyeohPyekkPyegsPyenjPyenhPyelgPyelmPyelbPyelsPyeltPyelpPyelhPyebsPyessPyengPyechPwakkPwagsPwanjPwanhPwalgPwalmPwalbPwalsPwaltPwalpPwalhPwabsPwassPwangPwachPwaedPwaemPwaejPwaetPwaepPwaehPoekkPoegsPoenjPoenhPoelgPoelmPoelbPoelsPoeltPoelpPoelhPoebsPoessPoengPoechPyokkPyogsPyonjPyonhPyolgPyolmPyolbPyolsPyoltPyolpPyolhPyobsPyossPyongPyochPwokkPwogsPwonjPwonhPwolgPwolmPwolbPwolsPwoltPwolpPwolhPwobsPwossPwongPwochPwekkPwegsPwenjPwenhPwelgPwelmPwelbPwelsPweltPwelpPwelhPwebsPwessPwengPwechPwikkPwigsPwinjPwinhPwilgPwilmPwilbPwilsPwiltPwilpPwilhPwibsPwissPwingPwichPyukkPyugsPyunjPyunhPyulgPyulmPyulbPyulsPyultPyulpPyulhPyubsPyussPyungPyuchPeukkPeugsPeunjPeunhPeulgPeulmPeulbPeulsPeultPeulpPeulhPeubsPeussPeungPeuchPuikkPuigsPuinjPuinhPuilgPuilmPuilbPuilsPuiltPuilpPuilhPuibsPuissPuingPuichHaekkHaegsHaenjHaenhHaelgHaelmHaelbHaelsHaeltHaelpHaelhHaebsHaessHaengHaechHyakkHyagsHyanjHyanhHyalgHyalmHyalbHyalsHyaltHyalpHyalhHyabsHyassHyangHyachHyaedHyaemHyaejHyaetHyaepHyaehHeokkHeogsHeonjHeonhHeolgHeolmHeolbHeolsHeoltHeolpHeolhHeobsHeossHeongHeochHyeodHyeomHyeojHyeotHyeopHyeohHyekkHyegsHyenjHyenhHyelgHyelmHyelbHyelsHyeltHyelpHyelhHyebsHyessHyengHyechHwakkHwagsHwanjHwanhHwalgHwalmHwalbHwalsHwaltHwalpHwalhHwabsHwassHwangHwachHwaedHwaemHwaejHwaetHwaepHwaehHoekkHoegsHoenjHoenhHoelgHoelmHoelbHoelsHoeltHoelpHoelhHoebsHoessHoechHyokkHyogsHyonjHyonhHyolgHyolmHyolbHyolsHyoltHyolpHyolhHyobsHyossHyongHyochHwokkHwogsHwonjHwonhHwolgHwolmHwolbHwolsHwoltHwolpHwolhHwobsHwossHwongHwochHwekkHwegsHwenjHwenhHwelgHwelmHwelbHwelsHweltHwelpHwelhHwebsHwessHwengHwechHwikkHwigsHwinjHwinhHwilgHwilmHwilbHwilsHwiltHwilpHwilhHwibsHwissHwingHwichHyukkHyugsHyunjHyunhHyulgHyulmHyulbHyulsHyultHyulpHyulhHyubsHyussHyungHyuchHeukkHeugsHeunjHeunhHeulgHeulmHeulbHeulsHeultHeulpHeulhHeubsHeussHeungHeuchHuikkHuigsHuinjHuinhHuilgHuilmHuilbHuilsHuiltHuilpHuilhHuibsHuissHuingHuichKotsuB105mB106fB106mB107fB107mB108fB108mB109fB109mAB21fAB21mAB22fAB22mAB23mAB118AB120AB122AB123A131cAB164AB171AB180AB188AB191A309aA309bA309cA313bA313cTprusDHwtyHnmmtNL17aNU10aNU11aNU18aNU22aSndytCHLNNhongKhangzhwyrqatunliangliong[Ben][San][Dao][Bai]KhenhXuyenChuoiWaangGiengNguoiGiongTruocQuanhXuongLiengMaangGwaaiSiengKhuotNghinTrungNgheoTranhNgoenPhinhMiengNhungNhanhBiengNgoamViengKiengNhinhSuongChoacTuechThungTuongKwaatNhangThanhNgongThongLuongNgachThoaiNhieuMuongChoaiGhenhTsubiThuocTrangPhangKhuyaNghitGiangGhiecKhuayThiepNhuocNgoayNgungChieuBuongPhachNgoacPhietNgaauNgangPhungThoatVuongNgoatNgoeoThangKhuyuTrongChuomGiuocHoanhThuotPhongQuangHoangRuongNhenhPhechNguocNguytCaangHiengRiengGianhThinhNgoaiPhichKhoaiCuongJutsuToangZeongHuongKhoeoGhechQuynhXoangThiecKhuouQuachNgaamJaangNgaapNgaaiZaangBiangNgaatSaturnUranusYinYaoTaiYin{2357}{3457}{1267}{2367}{1467}{2467}{3467}{1567}{2567}{3567}{4567}{1238}{1248}{1348}{2348}{1258}{1358}{2358}{1458}{2458}{3458}{1268}{1368}{2368}{1468}{2468}{3468}{1568}{2568}{3568}{4568}{1278}{1378}{2378}{1478}{2478}{3478}{1578}{2578}{3578}{4578}{1678}{2678}{3678}{4678}{5678}CupidoKronos(Shui)(Ming)(Jian)ChamGoHeiseiTaishoChuangWuWangMingYiGuiMeiGyaekkGyaegsGyaenjGyaenhGyaelgGyaelmGyaelbGyaelsGyaeltGyaelpGyaelhGyaebsGyaessGyaengGyaechGyeokkGyeogsGyeonjGyeonhGyeolgGyeolmGyeolbGyeolsGyeoltGyeolpGyeolhGyeobsGyeossGyeongGyeochGwaekkGwaegsGwaenjGwaenhGwaelgGwaelmGwaelbGwaelsGwaeltGwaelpGwaelhGwaebsGwaessGwaengGwaechKkaekkKkaegsKkaenjKkaenhKkaelgKkaelmKkaelbKkaelsKkaeltKkaelpKkaelhKkaebsKkaessKkaengKkaechKkyakkKkyagsKkyanjKkyanhKkyalgKkyalmKkyalbKkyalsKkyaltKkyalpKkyalhKkyabsKkyassKkyangKkyachKkyaedKkyaemKkyaejKkyaetKkyaepKkyaehKkeokkKkeogsKkeonjKkeonhKkeolgKkeolmKkeolbKkeolsKkeoltKkeolpKkeolhKkeobsKkeossKkeongKkeochKkyeodKkyeomKkyeojKkyeotKkyeopKkyeohKkyekkKkyegsKkyenjKkyenhKkyelgKkyelmKkyelbKkyelsKkyeltKkyelpKkyelhKkyebsKkyessKkyengKkyechKkwakkKkwagsKkwanjKkwanhKkwalgKkwalmKkwalbKkwalsKkwaltKkwalpKkwalhKkwabsKkwassKkwangKkwachKkwaedKkwaemKkwaejKkwaetKkwaepKkwaehKkoekkKkoegsKkoenjKkoenhKkoelgKkoelmKkoelbKkoelsKkoeltKkoelpKkoelhKkoebsKkoessKkoengKkoechKkyokkKkyogsKkyonjKkyonhKkyolgKkyolmKkyolbKkyolsKkyoltKkyolpKkyolhKkyobsKkyossKkyongKkyochKkwokkKkwogsKkwonjKkwonhKkwolgKkwolmKkwolbKkwolsKkwoltKkwolpKkwolhKkwobsKkwossKkwongKkwochKkwekkKkwegsKkwenjKkwenhKkwelgKkwelmKkwelbKkwelsKkweltKkwelpKkwelhKkwebsKkwessKkwengKkwechKkwikkKkwigsKkwinjKkwinhKkwilgKkwilmKkwilbKkwilsKkwiltKkwilpKkwilhKkwibsKkwissKkwingKkwichKkyukkKkyugsKkyunjKkyunhKkyulgKkyulmKkyulbKkyulsKkyultKkyulpKkyulhKkyubsKkyussKkyungKkyuchKkeukkKkeugsKkeunjKkeunhKkeulgKkeulmKkeulbKkeulsKkeultKkeulpKkeulhKkeubsKkeussKkeungKkeuchKkuikkKkuigsKkuinjKkuinhKkuilgKkuilmKkuilbKkuilsKkuiltKkuilpKkuilhKkuibsKkuissKkuingKkuichNyaekkNyaegsNyaenjNyaenhNyaelgNyaelmNyaelbNyaelsNyaeltNyaelpNyaelhNyaebsNyaessNyaengNyaechNyeokkNyeogsNyeonjNyeonhNyeolgNyeolmNyeolbNyeolsNyeoltNyeolpNyeolhNyeobsNyeossNyeongNyeochNwaekkNwaegsNwaenjNwaenhNwaelgNwaelmNwaelbNwaelsNwaeltNwaelpNwaelhNwaebsNwaessNwaengNwaechDyaekkDyaegsDyaenjDyaenhDyaelgDyaelmDyaelbDyaelsDyaeltDyaelpDyaelhDyaebsDyaessDyaengDyaechDyeokkDyeogsDyeonjDyeonhDyeolgDyeolmDyeolbDyeolsDyeoltDyeolpDyeolhDyeobsDyeossDyeongDyeochDwaekkDwaegsDwaenjDwaenhDwaelgDwaelmDwaelbDwaelsDwaeltDwaelpDwaelhDwaebsDwaessDwaengDwaechTtaekkTtaegsTtaenjTtaenhTtaelgTtaelmTtaelbTtaelsTtaeltTtaelpTtaelhTtaebsTtaessTtaengTtaechTtyakkTtyagsTtyanjTtyanhTtyalgTtyalmTtyalbTtyalsTtyaltTtyalpTtyalhTtyabsTtyassTtyangTtyachTtyaedTtyaemTtyaejTtyaetTtyaepTtyaehTteokkTteogsTteonjTteonhTteolgTteolmTteolbTteolsTteoltTteolpTteolhTteobsTteossTteongTteochTtyeodTtyeomTtyeojTtyeotTtyeopTtyeohTtyekkTtyegsTtyenjTtyenhTtyelgTtyelmTtyelbTtyelsTtyeltTtyelpTtyelhTtyebsTtyessTtyengTtyechTtwakkTtwagsTtwanjTtwanhTtwalgTtwalmTtwalbTtwalsTtwaltTtwalpTtwalhTtwabsTtwassTtwangTtwachTtwaedTtwaemTtwaejTtwaetTtwaepTtwaehTtoekkTtoegsTtoenjTtoenhTtoelgTtoelmTtoelbTtoelsTtoeltTtoelpTtoelhTtoebsTtoessTtoengTtoechTtyokkTtyogsTtyonjTtyonhTtyolgTtyolmTtyolbTtyolsTtyoltTtyolpTtyolhTtyobsTtyossTtyongTtyochTtwokkTtwogsTtwonjTtwonhTtwolgTtwolmTtwolbTtwolsTtwoltTtwolpTtwolhTtwobsTtwossTtwongTtwochTtwekkTtwegsTtwenjTtwenhTtwelgTtwelmTtwelbTtwelsTtweltTtwelpTtwelhTtwebsTtwessTtwengTtwechTtwikkTtwigsTtwinjTtwinhTtwilgTtwilmTtwilbTtwilsTtwiltTtwilpTtwilhTtwibsTtwissTtwingTtwichTtyukkTtyugsTtyunjTtyunhTtyulgTtyulmTtyulbTtyulsTtyultTtyulpTtyulhTtyubsTtyussTtyungTtyuchTteukkTteugsTteunjTteunhTteulgTteulmTteulbTteulsTteultTteulpTteulhTteubsTteussTteungTteuchTtuikkTtuigsTtuinjTtuinhTtuilgTtuilmTtuilbTtuilsTtuiltTtuilpTtuilhTtuibsTtuissTtuingTtuichLyaekkLyaegsLyaenjLyaenhLyaelgLyaelmLyaelbLyaelsLyaeltLyaelpLyaelhLyaebsLyaessLyaengLyaechLyeokkLyeogsLyeonjLyeonhLyeolgLyeolmLyeolbLyeolsLyeoltLyeolpLyeolhLyeobsLyeossLyeongLyeochLwaekkLwaegsLwaenjLwaenhLwaelgLwaelmLwaelbLwaelsLwaeltLwaelpLwaelhLwaebsLwaessLwaengLwaechMyaekkMyaegsMyaenjMyaenhMyaelgMyaelmMyaelbMyaelsMyaeltMyaelpMyaelhMyaebsMyaessMyaengMyaechMyeokkMyeogsMyeonjMyeonhMyeolgMyeolmMyeolbMyeolsMyeoltMyeolpMyeolhMyeobsMyeossMyeongMyeochMwaekkMwaegsMwaenjMwaenhMwaelgMwaelmMwaelbMwaelsMwaeltMwaelpMwaelhMwaebsMwaessMwaengMwaechByaekkByaegsByaenjByaenhByaelgByaelmByaelbByaelsByaeltByaelpByaelhByaebsByaessByaengByaechByeokkByeogsByeonjByeonhByeolgByeolmByeolbByeolsByeoltByeolpByeolhByeobsByeossByeongByeochBwaekkBwaegsBwaenjBwaenhBwaelgBwaelmBwaelbBwaelsBwaeltBwaelpBwaelhBwaebsBwaessBwaengBwaechPpaekkPpaegsPpaenjPpaenhPpaelgPpaelmPpaelbPpaelsPpaeltPpaelpPpaelhPpaebsPpaessPpaengPpaechPpyakkPpyagsPpyanjPpyanhPpyalgPpyalmPpyalbPpyalsPpyaltPpyalpPpyalhPpyabsPpyassPpyangPpyachPpyaedPpyaemPpyaejPpyaetPpyaepPpyaehPpeokkPpeogsPpeonjPpeonhPpeolgPpeolmPpeolbPpeolsPpeoltPpeolpPpeolhPpeobsPpeossPpeongPpeochPpyeodPpyeomPpyeojPpyeotPpyeopPpyeohPpyekkPpyegsPpyenjPpyenhPpyelgPpyelmPpyelbPpyelsPpyeltPpyelpPpyelhPpyebsPpyessPpyengPpyechPpwakkPpwagsPpwanjPpwanhPpwalgPpwalmPpwalbPpwalsPpwaltPpwalpPpwalhPpwabsPpwassPpwangPpwachPpwaedPpwaemPpwaejPpwaetPpwaepPpwaehPpoekkPpoegsPpoenjPpoenhPpoelgPpoelmPpoelbPpoelsPpoeltPpoelpPpoelhPpoebsPpoessPpoengPpoechPpyokkPpyogsPpyonjPpyonhPpyolgPpyolmPpyolbPpyolsPpyoltPpyolpPpyolhPpyobsPpyossPpyongPpyochPpwokkPpwogsPpwonjPpwonhPpwolgPpwolmPpwolbPpwolsPpwoltPpwolpPpwolhPpwobsPpwossPpwongPpwochPpwekkPpwegsPpwenjPpwenhPpwelgPpwelmPpwelbPpwelsPpweltPpwelpPpwelhPpwebsPpwessPpwengPpwechPpwikkPpwigsPpwinjPpwinhPpwilgPpwilmPpwilbPpwilsPpwiltPpwilpPpwilhPpwibsPpwissPpwingPpwichPpyukkPpyugsPpyunjPpyunhPpyulgPpyulmPpyulbPpyulsPpyultPpyulpPpyulhPpyubsPpyussPpyungPpyuchPpeukkPpeugsPpeunjPpeunhPpeulgPpeulmPpeulbPpeulsPpeultPpeulpPpeulhPpeubsPpeussPpeungPpeuchPpuikkPpuigsPpuinjPpuinhPpuilgPpuilmPpuilbPpuilsPpuiltPpuilpPpuilhPpuibsPpuissPpuingPpuichSyaekkSyaegsSyaenjSyaenhSyaelgSyaelmSyaelbSyaelsSyaeltSyaelpSyaelhSyaebsSyaessSyaengSyaechSyeokkSyeogsSyeonjSyeonhSyeolgSyeolmSyeolbSyeolsSyeoltSyeolpSyeolhSyeobsSyeossSyeongSyeochSwaekkSwaegsSwaenjSwaenhSwaelgSwaelmSwaelbSwaelsSwaeltSwaelpSwaelhSwaebsSwaessSwaengSwaechSsaekkSsaegsSsaenjSsaenhSsaelgSsaelmSsaelbSsaelsSsaeltSsaelpSsaelhSsaebsSsaessSsaengSsaechSsyakkSsyagsSsyanjSsyanhSsyalgSsyalmSsyalbSsyalsSsyaltSsyalpSsyalhSsyabsSsyassSsyangSsyachSsyaedSsyaemSsyaejSsyaetSsyaepSsyaehSseokkSseogsSseonjSseonhSseolgSseolmSseolbSseolsSseoltSseolpSseolhSseobsSseossSseongSseochSsyeodSsyeomSsyeojSsyeotSsyeopSsyeohSsyekkSsyegsSsyenjSsyenhSsyelgSsyelmSsyelbSsyelsSsyeltSsyelpSsyelhSsyebsSsyessSsyengSsyechSswakkSswagsSswanjSswanhSswalgSswalmSswalbSswalsSswaltSswalpSswalhSswabsSswassSswangSswachSswaedSswaemSswaejSswaetSswaepSswaehSsoekkSsoegsSsoenjSsoenhSsoelgSsoelmSsoelbSsoelsSsoeltSsoelpSsoelhSsoebsSsoessSsoengSsoechSsyokkSsyogsSsyonjSsyonhSsyolgSsyolmSsyolbSsyolsSsyoltSsyolpSsyolhSsyobsSsyossSsyongSsyochSswokkSswogsSswonjSswonhSswolgSswolmSswolbSswolsSswoltSswolpSswolhSswobsSswossSswongSswochSswekkSswegsSswenjSswenhSswelgSswelmSswelbSswelsSsweltSswelpSswelhSswebsSswessSswengSswechSswikkSswigsSswinjSswinhSswilgSswilmSswilbSswilsSswiltSswilpSswilhSswibsSswissSswingSswichSsyukkSsyugsSsyunjSsyunhSsyulgSsyulmSsyulbSsyulsSsyultSsyulpSsyulhSsyubsSsyussSsyungSsyuchSseukkSseugsSseunjSseunhSseulgSseulmSseulbSseulsSseultSseulpSseulhSseubsSseussSseungSseuchSsuikkSsuigsSsuinjSsuinhSsuilgSsuilmSsuilbSsuilsSsuiltSsuilpSsuilhSsuibsSsuissSsuingSsuichJyaekkJyaegsJyaenjJyaenhJyaelgJyaelmJyaelbJyaelsJyaeltJyaelpJyaelhJyaebsJyaessJyaengJyaechJyeokkJyeogsJyeonjJyeonhJyeolgJyeolmJyeolbJyeolsJyeoltJyeolpJyeolhJyeobsJyeossJyeongJyeochJwaekkJwaegsJwaenjJwaenhJwaelgJwaelmJwaelbJwaelsJwaeltJwaelpJwaelhJwaebsJwaessJwaengJwaechJjaekkJjaegsJjaenjJjaenhJjaelgJjaelmJjaelbJjaelsJjaeltJjaelpJjaelhJjaebsJjaessJjaengJjaechJjyakkJjyagsJjyanjJjyanhJjyalgJjyalmJjyalbJjyalsJjyaltJjyalpJjyalhJjyabsJjyassJjyangJjyachJjyaedJjyaemJjyaejJjyaetJjyaepJjyaehJjeokkJjeogsJjeonjJjeonhJjeolgJjeolmJjeolbJjeolsJjeoltJjeolpJjeolhJjeobsJjeossJjeongJjeochJjyeodJjyeomJjyeojJjyeotJjyeopJjyeohJjyekkJjyegsJjyenjJjyenhJjyelgJjyelmJjyelbJjyelsJjyeltJjyelpJjyelhJjyebsJjyessJjyengJjyechJjwakkJjwagsJjwanjJjwanhJjwalgJjwalmJjwalbJjwalsJjwaltJjwalpJjwalhJjwabsJjwassJjwangJjwachJjwaedJjwaemJjwaejJjwaetJjwaepJjwaehJjoekkJjoegsJjoenjJjoenhJjoelgJjoelmJjoelbJjoelsJjoeltJjoelpJjoelhJjoebsJjoessJjoengJjoechJjyokkJjyogsJjyonjJjyonhJjyolgJjyolmJjyolbJjyolsJjyoltJjyolpJjyolhJjyobsJjyossJjyongJjyochJjwokkJjwogsJjwonjJjwonhJjwolgJjwolmJjwolbJjwolsJjwoltJjwolpJjwolhJjwobsJjwossJjwongJjwochJjwekkJjwegsJjwenjJjwenhJjwelgJjwelmJjwelbJjwelsJjweltJjwelpJjwelhJjwebsJjwessJjwengJjwechJjwikkJjwigsJjwinjJjwinhJjwilgJjwilmJjwilbJjwilsJjwiltJjwilpJjwilhJjwibsJjwissJjwingJjwichJjyukkJjyugsJjyunjJjyunhJjyulgJjyulmJjyulbJjyulsJjyultJjyulpJjyulhJjyubsJjyussJjyungJjyuchJjeukkJjeugsJjeunjJjeunhJjeulgJjeulmJjeulbJjeulsJjeultJjeulpJjeulhJjeubsJjeussJjeungJjeuchJjuikkJjuigsJjuinjJjuinhJjuilgJjuilmJjuilbJjuilsJjuiltJjuilpJjuilhJjuibsJjuissJjuingJjuichChaekkChaegsChaenjChaenhChaelgChaelmChaelbChaelsChaeltChaelpChaelhChaebsChaessChaengChaechChyakkChyagsChyanjChyanhChyalgChyalmChyalbChyalsChyaltChyalpChyalhChyabsChyassChyangChyachChyaedChyaemChyaejChyaetChyaepChyaehCheokkCheogsCheonjCheonhCheolgCheolmCheolbCheolsCheoltCheolpCheolhCheobsCheossCheongCheochChyeodChyeomChyeojChyeotChyeopChyeohChyekkChyegsChyenjChyenhChyelgChyelmChyelbChyelsChyeltChyelpChyelhChyebsChyessChyengChyechChwakkChwagsChwanjChwanhChwalgChwalmChwalbChwalsChwaltChwalpChwalhChwabsChwassChwangChwachChwaedChwaemChwaejChwaetChwaepChwaehChoekkChoegsChoenjChoenhChoelgChoelmChoelbChoelsChoeltChoelpChoelhChoebsChoessChoengChoechChyokkChyogsChyonjChyonhChyolgChyolmChyolbChyolsChyoltChyolpChyolhChyobsChyossChyongChyochChwokkChwogsChwonjChwonhChwolgChwolmChwolbChwolsChwoltChwolpChwolhChwobsChwossChwongChwochChwekkChwegsChwenjChwenhChwelgChwelmChwelbChwelsChweltChwelpChwelhChwebsChwessChwengChwechChwikkChwigsChwinjChwinhChwilgChwilmChwilbChwilsChwiltChwilpChwilhChwibsChwissChwingChwichChyukkChyugsChyunjChyunhChyulgChyulmChyulbChyulsChyultChyulpChyulhChyubsChyussChyungChyuchCheukkCheugsCheunjCheunhCheulgCheulmCheulbCheulsCheultCheulpCheulhCheubsCheussCheungCheuchChuikkChuigsChuinjChuinhChuilgChuilmChuilbChuilsChuiltChuilpChuilhChuibsChuissChuingChuichKyaekkKyaegsKyaenjKyaenhKyaelgKyaelmKyaelbKyaelsKyaeltKyaelpKyaelhKyaebsKyaessKyaengKyaechKyeokkKyeogsKyeonjKyeonhKyeolgKyeolmKyeolbKyeolsKyeoltKyeolpKyeolhKyeobsKyeossKyeongKyeochKwaekkKwaegsKwaenjKwaenhKwaelgKwaelmKwaelbKwaelsKwaeltKwaelpKwaelhKwaebsKwaessKwaengKwaechTyaekkTyaegsTyaenjTyaenhTyaelgTyaelmTyaelbTyaelsTyaeltTyaelpTyaelhTyaebsTyaessTyaengTyaechTyeokkTyeogsTyeonjTyeonhTyeolgTyeolmTyeolbTyeolsTyeoltTyeolpTyeolhTyeobsTyeossTyeongTyeochTwaekkTwaegsTwaenjTwaenhTwaelgTwaelmTwaelbTwaelsTwaeltTwaelpTwaelhTwaebsTwaessTwaengTwaechPyaekkPyaegsPyaenjPyaenhPyaelgPyaelmPyaelbPyaelsPyaeltPyaelpPyaelhPyaebsPyaessPyaengPyaechPyeokkPyeogsPyeonjPyeonhPyeolgPyeolmPyeolbPyeolsPyeoltPyeolpPyeolhPyeobsPyeossPyeongPyeochPwaekkPwaegsPwaenjPwaenhPwaelgPwaelmPwaelbPwaelsPwaeltPwaelpPwaelhPwaebsPwaessPwaengPwaechHyaekkHyaegsHyaenjHyaenhHyaelgHyaelmHyaelbHyaelsHyaeltHyaelpHyaelhHyaebsHyaessHyaengHyaechHyeokkHyeogsHyeonjHyeonhHyeolgHyeolmHyeolbHyeolsHyeoltHyeolpHyeolhHyeobsHyeossHyeongHyeochHwaekkHwaegsHwaenjHwaenhHwaelgHwaelmHwaelbHwaelsHwaeltHwaelpHwaelhHwaebsHwaessHwaengHwaechAB131aAB131bA709-2A709-3A709-4A709-6Hi-Res[Dian]PhuongChiengNghenhKhoachNgoangChuyenNguyenKhuyenChuongTriengNguongThuongKhuongChoangKhuynhNhoangTruongThiengGiuongNgoanhKhoangNghienKhiengChuenh(((|)))MercuryJupiterNeptuneYangYaoTaiYangShaoYin{12467}{23467}{12567}{23567}{14567}{34567}{12348}{12358}{12458}{13458}{23458}{12368}{12468}{13468}{23468}{12568}{13568}{23568}{14568}{24568}{34568}{12378}{12478}{13478}{23478}{12578}{13578}{23578}{14578}{24578}{34578}{12678}{13678}{23678}{14678}{24678}{34678}{15678}{25678}{35678}{45678}ApollonAdmetos(OJeon)XiaoChuTongRenZhongFuXiaoGuoKkyaekkKkyaegsKkyaenjKkyaenhKkyaelgKkyaelmKkyaelbKkyaelsKkyaeltKkyaelpKkyaelhKkyaebsKkyaessKkyaengKkyaechKkyeokkKkyeogsKkyeonjKkyeonhKkyeolgKkyeolmKkyeolbKkyeolsKkyeoltKkyeolpKkyeolhKkyeobsKkyeossKkyeongKkyeochKkwaekkKkwaegsKkwaenjKkwaenhKkwaelgKkwaelmKkwaelbKkwaelsKkwaeltKkwaelpKkwaelhKkwaebsKkwaessKkwaengKkwaechTtyaekkTtyaegsTtyaenjTtyaenhTtyaelgTtyaelmTtyaelbTtyaelsTtyaeltTtyaelpTtyaelhTtyaebsTtyaessTtyaengTtyaechTtyeokkTtyeogsTtyeonjTtyeonhTtyeolgTtyeolmTtyeolbTtyeolsTtyeoltTtyeolpTtyeolhTtyeobsTtyeossTtyeongTtyeochTtwaekkTtwaegsTtwaenjTtwaenhTtwaelgTtwaelmTtwaelbTtwaelsTtwaeltTtwaelpTtwaelhTtwaebsTtwaessTtwaengTtwaechPpyaekkPpyaegsPpyaenjPpyaenhPpyaelgPpyaelmPpyaelbPpyaelsPpyaeltPpyaelpPpyaelhPpyaebsPpyaessPpyaengPpyaechPpyeokkPpyeogsPpyeonjPpyeonhPpyeolgPpyeolmPpyeolbPpyeolsPpyeoltPpyeolpPpyeolhPpyeobsPpyeossPpyeongPpyeochPpwaekkPpwaegsPpwaenjPpwaenhPpwaelgPpwaelmPpwaelbPpwaelsPpwaeltPpwaelpPpwaelhPpwaebsPpwaessPpwaengPpwaechSsyaekkSsyaegsSsyaenjSsyaenhSsyaelgSsyaelmSsyaelbSsyaelsSsyaeltSsyaelpSsyaelhSsyaebsSsyaessSsyaengSsyaechSsyeokkSsyeogsSsyeonjSsyeonhSsyeolgSsyeolmSsyeolbSsyeolsSsyeoltSsyeolpSsyeolhSsyeobsSsyeossSsyeongSsyeochSswaekkSswaegsSswaenjSswaenhSswaelgSswaelmSswaelbSswaelsSswaeltSswaelpSswaelhSswaebsSswaessSswaengSswaechJjyaekkJjyaegsJjyaenjJjyaenhJjyaelgJjyaelmJjyaelbJjyaelsJjyaeltJjyaelpJjyaelhJjyaebsJjyaessJjyaengJjyaechJjyeokkJjyeogsJjyeonjJjyeonhJjyeolgJjyeolmJjyeolbJjyeolsJjyeoltJjyeolpJjyeolhJjyeobsJjyeossJjyeongJjyeochJjwaekkJjwaegsJjwaenjJjwaenhJjwaelgJjwaelmJjwaelbJjwaelsJjwaeltJjwaelpJjwaelhJjwaebsJjwaessJjwaengJjwaechChyaekkChyaegsChyaenjChyaenhChyaelgChyaelmChyaelbChyaelsChyaeltChyaelpChyaelhChyaebsChyaessChyaengChyaechChyeokkChyeogsChyeonjChyeonhChyeolgChyeolmChyeolbChyeolsChyeoltChyeolpChyeolhChyeobsChyeossChyeongChyeochChwaekkChwaegsChwaenjChwaenhChwaelgChwaelmChwaelbChwaelsChwaeltChwaelpChwaelhChwaebsChwaessChwaengChwaech[Sheng]ShaoYang{123467}{123567}{124567}{234567}{123458}{123468}{123568}{124568}{134568}{234568}{123478}{123578}{124578}{134578}{234578}{123678}{124678}{134678}{234678}{125678}{135678}{235678}{145678}{245678}{345678}VulcanusPoseidonDaZhuangMuhammadCopyleftLosslessShuangxi{1234567}{1234568}{1234578}{1234678}{1235678}{1245678}{1345678}{2345678}{12345678}ShareAlikePublicDomainNonCommercialCreativeCommons"; - -static const char b000[769] = "\377\000\000\201\001\000\201\002\000\201\003\000\201\004\000\201\005\000\201\006\000\201\007\000\201\010\000\201\011\000\201\012\000\201\013\000\201\014\000\201\015\000\201\016\000\201\017\000\201\020\000\201\021\000\201\022\000\201\023\000\201\024\000\201\025\000\201\026\000\201\027\000\201\030\000\201\031\000\201\032\000\201\033\000\201\034\000\201\035\000\201\036\000\201\037\000\201 \000\201!\000\201\042\000\201#\000\201$\000\201%\000\201&\000\201'\000\201(\000\201)\000\201*\000\201+\000\201,\000\201-\000\201.\000\201/\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201:\000\201;\000\201<\000\201=\000\201>\000\201?\000\201@\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201[\000\201\134\000\201]\000\201^\000\201_\000\201`\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201{\000\201|\000\201}\000\201~\000\201\177\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200 \000\201!\000\201c\000\201L\000\201$\000\201Y\000\201|\000\201S\000\201\042\000\201(C)a\000\201<<\202!\000\201\000\000\200(R)-\000\201deg+-\2022\000\2013\000\201'\000\201u\000\201P\000\201-\000\201,\000\2011\000\201o\000\201>>\2021/41/23/4?\000\201A\000\201A\000\201A\000\201A\000\201A\000\201A\000\201Ae\202C\000\201E\000\201E\000\201E\000\201E\000\201I\000\201I\000\201I\000\201I\000\201D\000\201N\000\201O\000\201O\000\201O\000\201O\000\201O\000\201*\000\201O\000\201U\000\201U\000\201U\000\201U\000\201Y\000\201Th\202ss\202a\000\201a\000\201a\000\201a\000\201a\000\201a\000\201ae\202c\000\201e\000\201e\000\201e\000\201e\000\201i\000\201i\000\201i\000\201i\000\201d\000\201n\000\201o\000\201o\000\201o\000\201o\000\201o\000\201/\000\201o\000\201u\000\201u\000\201u\000\201u\000\201y\000\201th\202y\000\201"; -static const char b001[769] = "\377A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201C\000\201c\000\201C\000\201c\000\201C\000\201c\000\201C\000\201c\000\201D\000\201d\000\201D\000\201d\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201G\000\201g\000\201G\000\201g\000\201G\000\201g\000\201G\000\201g\000\201H\000\201h\000\201H\000\201h\000\201I\000\201i\000\201I\000\201i\000\201I\000\201i\000\201I\000\201i\000\201I\000\201i\000\201IJ\202ij\202J\000\201j\000\201K\000\201k\000\201q\000\201L\000\201l\000\201L\000\201l\000\201L\000\201l\000\201L\000\201l\000\201L\000\201l\000\201N\000\201n\000\201N\000\201n\000\201N\000\201n\000\201'n\202Ng\202ng\202O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201Oe\202oe\202R\000\201r\000\201R\000\201r\000\201R\000\201r\000\201S\000\201s\000\201S\000\201s\000\201S\000\201s\000\201S\000\201s\000\201T\000\201t\000\201T\000\201t\000\201T\000\201t\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201W\000\201w\000\201Y\000\201y\000\201Y\000\201Z\000\201z\000\201Z\000\201z\000\201Z\000\201z\000\201s\000\201b\000\201B\000\201B\000\201b\000\2016\000\2016\000\201O\000\201C\000\201c\000\201D\000\201D\000\201D\000\201d\000\201z\000\201E\000\201E\000\201E\000\201F\000\201f\000\201G\000\201G\000\201hw\202I\000\201I\000\201K\000\201k\000\201l\000\201l\000\201W\000\201N\000\201n\000\201O\000\201O\000\201o\000\201Gh\202gh\202P\000\201p\000\201R\000\2012\000\2012\000\201Sh\202sh\202t\000\201T\000\201t\000\201T\000\201U\000\201u\000\201U\000\201V\000\201Y\000\201y\000\201Z\000\201z\000\201Zh\202`\000\201`\000\201zh\202dz\2025\000\2015\000\201ts\202w\000\201c\000\201x\000\201qc\202q\000\201DZ\202Dz\202dz\202LJ\202Lj\202lj\202NJ\202Nj\202nj\202A\000\201a\000\201I\000\201i\000\201O\000\201o\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201e\000\201A\000\201a\000\201A\000\201a\000\201Ae\202ae\202G\000\201g\000\201G\000\201g\000\201K\000\201k\000\201O\000\201o\000\201O\000\201o\000\201Zh\202zh\202j\000\201DZ\202Dz\202dz\202G\000\201g\000\201Hw\202W\000\201N\000\201n\000\201A\000\201a\000\201Ae\202ae\202O\000\201o\000\201"; -static const char b002[769] = "\377A\000\201a\000\201A\000\201a\000\201E\000\201e\000\201E\000\201e\000\201I\000\201i\000\201I\000\201i\000\201O\000\201o\000\201O\000\201o\000\201R\000\201r\000\201R\000\201r\000\201U\000\201u\000\201U\000\201u\000\201S\000\201s\000\201T\000\201t\000\201Y\000\201y\000\201H\000\201h\000\201N\000\201d\000\201Ou\202ou\202Z\000\201z\000\201A\000\201a\000\201E\000\201e\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201Y\000\201y\000\201l\000\201n\000\201t\000\201j\000\201db\202qp\202A\000\201C\000\201c\000\201L\000\201T\000\201s\000\201z\000\201'\000\201'\000\201B\000\201U\000\201A\000\201E\000\201e\000\201J\000\201j\000\201Q\000\201q\000\201R\000\201r\000\201Y\000\201y\000\201a\000\201a\000\201a\000\201b\000\201o\000\201c\000\201d\000\201d\000\201e\000\201e\000\201er\202e\000\201e\000\201er\202o\000\201j\000\201g\000\201g\000\201g\000\201g\000\201u\000\201y\000\201h\000\201h\000\201i\000\201i\000\201i\000\201l\000\201l\000\201l\000\201lzhw\000\201w\000\201m\000\201n\000\201n\000\201n\000\201o\000\201oe\202u\000\201f\000\201r\000\201r\000\201r\000\201r\000\201r\000\201r\000\201i\000\201r\000\201r\000\201s\000\201sh\202j\000\201i\000\201sh\202t\000\201t\000\201u\000\201u\000\201v\000\201a\000\201w\000\201y\000\201y\000\201z\000\201z\000\201zh\202zh\202'\000\201`\000\201x\000\201q\000\201pc\202b\000\201oe\202g\000\201h\000\201j\000\201k\000\201l\000\201q\000\201'\000\201`\000\201dz\202dzhdz\202ts\202tshtc\202fngls\202lz\202ww\202]]\202y\000\201y\000\201h\000\201h\000\201j\000\201r\000\201r\000\201r\000\201r\000\201w\000\201y\000\201'\000\201''\202`\000\201'\000\201`\000\201'\000\201`\000\201'\000\201`\000\201<\000\201>\000\201^\000\201v\000\201^\000\201^\000\201'\000\201-\000\201'\000\201`\000\201,\000\201_\000\201`\000\201'\000\201:\000\201-\000\201'\000\201`\000\201+\000\201+\000\201+\000\201-\000\201^\000\201.\000\201.\000\201,\000\201~\000\201\042\000\201r\000\201x\000\201g\000\201l\000\201s\000\201x\000\201`\000\2015\000\2014\000\2013\000\2012\000\2011\000\2013\000\2017\000\201_\000\201=\000\201''\202v\000\201^\000\201<\000\201>\000\201.\000\201`\000\201``\202''\202~\000\201:\000\201'\000\201'\000\201,\000\201,\000\201_\000\201_\000\201<\000\201"; -static const char b003[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201e\000\201i\000\201o\000\201u\000\201c\000\201d\000\201h\000\201m\000\201r\000\201t\000\201v\000\201x\000\201H\000\201h\000\201S\000\201s\000\201'\000\201,\000\201W\000\201w\000\201\000\000\200\000\000\200i\000\201s\000\201s.\202s.\202;\000\201J\000\201\000\000\200\000\000\200\000\000\200\000\000\200'\000\201\042'\202A\000\201;\000\201E\000\201I\000\201I\000\201\000\000\200O\000\201\000\000\200Y\000\201O\000\201i\000\201A\000\201V\000\201G\000\201D\000\201E\000\201Z\000\201I\000\201Th\202I\000\201K\000\201L\000\201M\000\201N\000\201X\000\201O\000\201P\000\201R\000\201\000\000\200S\000\201T\000\201Y\000\201F\000\201Ch\202Ps\202O\000\201I\000\201Y\000\201a\000\201e\000\201i\000\201i\000\201y\000\201a\000\201v\000\201g\000\201d\000\201e\000\201z\000\201i\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201x\000\201o\000\201p\000\201r\000\201s\000\201s\000\201t\000\201y\000\201f\000\201ch\202ps\202o\000\201i\000\201y\000\201o\000\201y\000\201o\000\201&\000\201b\000\201th\202Y\000\201Y\000\201Y\000\201ph\202p\000\201&\000\201Q\000\201q\000\201St\202st\202W\000\201w\000\201Q\000\201q\000\201S\000\201s\000\201Sh\202sh\202F\000\201f\000\201X\000\201x\000\201H\000\201h\000\201J\000\201j\000\201C\000\201c\000\201Ti\202ti\202k\000\201r\000\201s\000\201j\000\201Th\202e\000\201e\000\201Sh\202sh\202S\000\201S\000\201s\000\201r.\202S\000\201S.\202S.\202"; -static const char b004[769] = "\377E\000\201E\000\201Dj\202G\000\201Ie\202Dz\202I\000\201I\000\201J\000\201Lj\202Nj\202C\000\201K\000\201I\000\201U\000\201DzhA\000\201B\000\201V\000\201G\000\201D\000\201E\000\201Zh\202Z\000\201I\000\201Y\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201R\000\201S\000\201T\000\201U\000\201F\000\201Kh\202Ts\202Ch\202Sh\202\000\000\204'\000\201Y\000\201'\000\201E\000\201Yu\202Ya\202a\000\201b\000\201v\000\201g\000\201d\000\201e\000\201zh\202z\000\201i\000\201y\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201r\000\201s\000\201t\000\201u\000\201f\000\201kh\202ts\202ch\202sh\202\000&\204'\000\201y\000\201'\000\201e\000\201yu\202ya\202e\000\201e\000\201dj\202g\000\201ie\202dz\202i\000\201i\000\201j\000\201lj\202nj\202c\000\201k\000\201i\000\201u\000\201dzhO\000\201o\000\201E\000\201e\000\201Ie\202ie\202E\000\201e\000\201Ie\202ie\202O\000\201o\000\201Io\202io\202Ks\202ks\202Ps\202ps\202F\000\201f\000\201Y\000\201y\000\201Y\000\201y\000\201U\000\201u\000\201O\000\201o\000\201O\000\201o\000\201Ot\202ot\202Q\000\201q\000\2013v\204.\000\201\000\000\200\000\000\200\000\000\200.\000\2013v\2063v\207Jh\202jh\202'\000\201'\000\201Rh\202rh\202G\000\201g\000\201Gh\202gh\202Gh\202gh\202J\000\201j\000\201Z\000\201z\000\201Q\000\201q\000\201G\000\201g\000\201Q\000\201q\000\201Q\000\201q\000\201Ng\202ng\202Ng\202ng\202Ph\202ph\202W\000\201w\000\201S\000\201s\000\201Th\202th\202U\000\201u\000\201U\000\201u\000\201H\000\201h\000\201Ts\202ts\202J\000\201j\000\201C\000\201c\000\201H\000\201h\000\201Ch\202ch\202Ch\202ch\202H\000\201Gi\202gi\202Q\000\201q\000\201Lh\202lh\202Ng\202ng\202Nh\202nh\202DzhdzhMh\202mh\202h\000\201A\000\201a\000\201A\000\201a\000\201Ae\202ae\202E\000\201e\000\201A\000\201a\000\201E\000\201e\000\201DzhdzhJ\000\201j\000\201Dz\202dz\202I\000\201i\000\201I\000\201i\000\201O\000\201o\000\201O\000\201o\000\201Y\000\201y\000\201A\000\201a\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201TshtshGh\202gh\202Y\000\201y\000\201Xh\202xh\202X\000\201x\000\201H\000\201h\000\201"; -static const char b005[736] = "\364D\000\201d\000\201Dj\202dj\202Zj\202zj\202Dz\202dz\202Lj\202lj\202Nj\202nj\202Sj\202sj\202Tj\202tj\202A\000\201a\000\201L\000\201l\000\201LkhlkhRkhrkhA\000\201a\000\201Q\000\201q\000\201W\000\201w\000\201Q\000\201q\000\201L\000\201l\000\201N\000\201n\000\201Ph\202ph\202'\000\201'\000\201Ny\202ny\202DzhdzhDchdchL\000\201l\000\201\000\000\200A\000\201B\000\201G\000\201D\000\201E\000\201Z\000\201E\000\201Y\000\201T'\202Zh\202I\000\201L\000\201Kh\202Ts\202K\000\201H\000\201Dz\202Gh\202Ch\202M\000\201Y\000\201N\000\201Sh\202O\000\201Ch'P\000\201J\000\201Rr\202S\000\201V\000\201T\000\201R\000\201Ts'W\000\201P'\202K'\202O\000\201F\000\201\000\000\200\000\000\200`\000\201'\000\201*\000\201!\000\201,\000\201?\000\201.\000\201a\000\201a\000\201b\000\201g\000\201d\000\201e\000\201z\000\201e\000\201y\000\201t'\202zh\202i\000\201l\000\201kh\202ts\202k\000\201h\000\201dz\202gh\202ch\202m\000\201y\000\201n\000\201sh\202o\000\201ch'p\000\201j\000\201rr\202s\000\201v\000\201t\000\201r\000\201ts'w\000\201p'\202k'\202o\000\201f\000\201ev\202h\000\201.\000\201-\000\201\000\000\200\000\000\200*\000\201*\000\201\0005\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200e\000\201e\000\201a\000\201o\000\201i\000\201e\000\201e\000\201a\000\201a\000\201o\000\201o\000\201u\000\201\000\000\200\000\000\200-\000\201\000\000\200|\000\201h\000\201\000\000\200.\000\201`\000\201`\000\201^\000\201o\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201v\000\201g\000\201d\000\201h\000\201v\000\201z\000\201h\000\201t\000\201y\000\201kh\202kh\202l\000\201m\000\201m\000\201n\000\201n\000\201s\000\201'\000\201f\000\201f\000\201ts\202ts\202k\000\201r\000\201s\000\201t\000\201\000\000\200\000\000\200\000\000\200\000\000\200YYYv\000\201oy\202ey\202'\000\201\042\000\201"; -static const char b006[769] = "\377#\000\201sn.^\000\201#\000\201sm.#\000\201\000.\2044rtr\000\201%0\202%00Af\202,\000\201/\000\201^\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201\000\000\200\000\000\200\000\000\200\000\000\200;\000\201\000\000\200.\000\201.\000\201?\000\201y\000\201'\000\201a\000\201'\000\201u'\202'\000\201i'\202\000\000\200b\000\201h\000\201t\000\201th\202j\000\201h\000\201kh\202d\000\201dh\202r\000\201z\000\201s\000\201sh\202s\000\201d\000\201t\000\201dh\202`\000\201gh\202g\000\201g\000\201y\000\201i\000\201i\000\201\000\000\200f\000\201q\000\201k\000\201l\000\201m\000\201n\000\201h\000\201w\000\201a\000\201y\000\201\000\000\200\000\000\200\000\000\200a\000\201u\000\201i\000\201\000\000\200\000\000\200a\000\201'\000\201'\000\201i\000\201\000\000\200e\000\201e\000\201o\000\201e\000\201e\000\201o\000\201a\000\201u'\2020\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201%\000\201.\000\201,\000\201*\000\201b\000\201q\000\201a\000\201'\000\201a\000\201u'\202e\000\201a\000\201o\000\201u\000\201i\000\201t\000\201th\202b\000\201t\000\201t\000\201p\000\201th\202bh\202dz\202dz\202n\000\201j\000\201ts\202ch\202ch\202d\000\201d\000\201d\000\201dd\202dh\202dh\202dh\202d\000\201d\000\201r\000\201r\000\201r\000\201r\000\201r\000\201zh\202d\000\201zh\202r\000\201sh\202s\000\201ch\202ts\202ch\202th\202ng\202f\000\201f\000\201p\000\201v\000\201v\000\201ph\202q\000\201g\000\201k\000\201k\000\201g\000\201g\000\201ng\202kp\202g\000\201gg\202n\000\201g\000\201g\000\201g\000\201l\000\201l\000\201l\000\201l\000\201n\000\201n\000\201n\000\201n\000\201ny\202h\000\201n\000\201e\000\201h\000\201h\000\201h\000\201o\000\201o\000\201o\000\201u\000\201u\000\201u\000\201u\000\201v\000\201y\000\201ey\202e\000\201v\000\201e\000\201ny\202e\000\201e'\202.\000\201e\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200#\000\201#\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200^\000\201\000\000\200\000\000\200\000\000\200\000\000\200d\000\201r\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201s\000\201l\000\201n\000\201&\000\201m.\202h\000\201"; -static const char b007[769] = "\377*\000\201.\000\201.\000\201!\000\201!\000\201:\000\201:\000\201:\000\201;\000\201?\000\201.\000\201/\000\201\134\000\201+\000\201\000\000\200.\000\201'\000\201'\000\201b\000\201g\000\201j\000\201d\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201d\000\201y\000\201yh\202k\000\201l\000\201m\000\201n\000\201s\000\201s\000\201`\000\201p\000\201p\000\201s\000\201q\000\201r\000\201sh\202t\000\201bh\202gh\202dh\202a\000\201a\000\201a\000\201o\000\201u\000\201a\000\201e\000\201e\000\201i\000\201e\000\201i\000\201i\000\201i\000\201u\000\201u\000\201o\000\201\000\000\200\000\000\200h\000\201\000\000\200\000\000\200h\000\201h\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200zh\202kh\202ph\202'y\202p\000\201p\000\201c\000\201ny\202p\000\201c\000\201ng\202c\000\201dd\202d\000\201r\000\201s\000\201ng\202ng\202g\000\201p\000\201v\000\201g\000\201g\000\201k\000\201b\000\201mb\202n\000\201n\000\201n\000\201sl\202r\000\201z\000\201s\000\201j\000\201c\000\201s\000\201z\000\201j\000\201a\000\201aa\202i\000\201ii\202y\000\201o\000\201oo\202e\000\201ee\202ch\202s\000\201s\000\201g\000\201h\000\201sh\202n\000\201r\000\201b\000\201lh\202k\000\201\000\000\200v\000\201m\000\201f\000\201dh\202th\202l\000\201g\000\201gn\202s\000\201d\000\201z\000\201t\000\201y\000\201p\000\201j\000\201ch\202th'h'\202kh\202dh'x\000\201sh's'\202l'\202t'\202z'\202'\000\201gh\202q\000\201w\000\201a\000\201aa\202i\000\201ee\202u\000\201oo\202e\000\201ey\202o\000\201oa\202\000\000\200n\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201a\000\201e\000\201i\000\201e\000\201u\000\201o\000\201o\000\201\000\000\200n\000\201b\000\201p\000\201t\000\201j\000\201c\000\201d\000\201r\000\201rr\202s\000\201gb\202f\000\201k\000\201l\000\201n\000\201m\000\201ny\202n\000\201h\000\201w\000\201y\000\201ny\202j\000\201c\000\201r\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200n\000\201\000\000\200'\000\201`\000\201o\000\201*\000\201,\000\201!\000\201-\000\201\000\000\200\000\000\200.\000\201D\000\201T\000\201"; -static const char b008[766] = "\376'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201f\000\201s\000\201q\000\201r\000\201sh\202t\000\201`\000\201`\000\201\000\000\200\000\000\200y\000\201y\000\201e\000\201e\000\201a\000\201a\000\201a\000\201a\000\201a\000\201a\000\201a\000\201a\000\201u\000\201u\000\201i\000\201i\000\201i\000\201o\000\201\000\000\200\000\000\200\000\000\200\000\000\200;\000\201:\000\201..\202<.\202<:\202?\000\201.\000\201-<\202-.\202-:\202=:\202|:\202/\000\201.\000\201...\000\000\200a\000\201b\000\201g\000\201d\000\201h\000\201u\000\201z\000\201h\000\201t\000\201i\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201sh\202t\000\201d\000\201kd\202`\000\201'\000\201\000\000\200\000\000\200\000\000\200\000\000\200,\000\201\000\000\200n\000\201j\000\201n\000\201t\000\201n\000\201n\000\201bh\202r\000\201l\000\201l\000\201s\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201u\000\201y\000\201y\000\201.\000\201.\000\201nj\202c\000\201th\202th\202g\000\201.\000\201\000\000\200LE\202pt\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201a\000\201b\000\201b\000\201c\000\201t\000\201vb\202gb\202zl\202mv\202y\000\201ny\202r\000\201w\000\201y\000\201\000\000\200dz\202ts\202kh\202u\000\201z\000\201n\000\201k\000\201q\000\201mb\202mp\202tt\202nr\202ny\202f\000\201q\000\201n\000\201ph\202th\202th\202ch\202kh\202gy\202ky\202n\000\201n\000\201l\000\201gr\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200#\000\201e\000\201o\000\201ou\202e\000\201on\202ounen\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201u\000\201i\000\201u\000\201e\000\201a\000\201i\000\201o\000\201u\000\201e\000\201e\000\201un\202on\202o\000\201o\000\201"; -static const char b009[766] = "\376m\000\201m\000\201m\000\201h\000\201a\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201e\000\201e\000\201e\000\201ai\202o\000\201o\000\201o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201r\000\201l\000\201l\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201o\000\201o\000\201'\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201e\000\201e\000\201e\000\201ai\202o\000\201o\000\201o\000\201au\202\000\000\200e\000\201a\000\201Om\202\000\000\200\000\000\200\000\000\200\000\000\200e\000\201u\000\201u\000\201q\000\201kh\202g\000\201z\000\201r\000\201rh\202f\000\201y\000\201r\000\201l\000\201l\000\201l\000\201,\000\201.\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201.\000\201'\000\201a\000\201o\000\201o\000\201a\000\201u\000\201u\000\201d\000\201zh\202y\000\201g\000\201j\000\201'\000\201d\000\201b\000\201*\000\201m\000\201m\000\201h\000\201\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201\000\000\200p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201\000\000\200l\000\201\000\000\200\000\000\200\000\000\200s\000\201s\000\201s\000\201h\000\201\000\000\200\000\000\200'\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202\000\000\200t\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200u\000\201\000\000\200\000\000\200\000\000\200\000\000\200r\000\201rh\202\000\000\200y\000\201r\000\201l\000\201l\000\201l\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201r\000\201v\000\201Rs\202Rs\2021\000\2012\000\2013\000\2011\000\2013\000\201/\000\201^\000\201g\000\201m\000\201.\000\201'\000\201"; -static const char b00a[769] = "\377\000\000\200m\000\201m\000\201h\000\201\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201\000\000\200p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201\000\000\200l\000\201l\000\201\000\000\200v\000\201s\000\201\000\000\200s\000\201h\000\201\000\000\200\000\000\200'\000\201\000\000\200a\000\201i\000\201i\000\201u\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200kh\202g\000\201z\000\201r\000\201\000\000\200ph\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201m\000\201'\000\201\000\000\200\000\000\200*\000\201y\000\201.\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200m\000\201m\000\201h\000\201\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201e\000\201\000\000\200e\000\201ai\202o\000\201\000\000\200o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201\000\000\200p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201\000\000\200l\000\201l\000\201\000\000\200v\000\201s\000\201s\000\201s\000\201h\000\201\000\000\200\000\000\200'\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201e\000\201\000\000\200e\000\201ai\202o\000\201\000\000\200o\000\201au\202\000\000\200\000\000\200\000\000\200Om\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200r\000\201l\000\201l\000\201l\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201.\000\201Rs\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200zh\202\000\000\200\000\000\200\000\000\200'\000\201'\000\201'\000\201"; -static const char b00b[754] = "\372\000\000\200m\000\201m\000\201h\000\201\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201\000\000\200p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201\000\000\200l\000\201l\000\201\000\000\200v\000\201s\000\201s\000\201s\000\201h\000\201\000\000\200\000\000\200'\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200r\000\201rh\202\000\000\200y\000\201r\000\201l\000\201l\000\201l\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201^\000\201w\000\2011\000\2012\000\2013\000\2011\000\2012\000\2013\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200m\000\201k\000\201\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201\000\000\200\000\000\200\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202k\000\201\000\000\200\000\000\200\000\000\200n\000\201c\000\201\000\000\200j\000\201\000\000\200n\000\201t\000\201\000\000\200\000\000\200\000\000\200n\000\201t\000\201\000\000\200\000\000\200\000\000\200n\000\201n\000\201p\000\201\000\000\200\000\000\200\000\000\200m\000\201y\000\201r\000\201r\000\201l\000\201l\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201\000\000\200\000\000\200\000\000\200\000\000\200a\000\201i\000\201i\000\201u\000\201u\000\201\000\000\200\000\000\200\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202\000\000\200\000\000\200\000\000\200Om\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\2021003v\204N\000\201M\000\201V\000\201-\000\201+\000\201-\000\201Rs\202#\000\201"; -static const char b00c[730] = "\362m\000\201n\000\201m\000\201h\000\201m\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201\000\000\200p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201r\000\201l\000\201l\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201\000\000\200\000\000\200'\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201i\000\201\000\000\200c\000\201z\000\201r\000\201\000\000\200\000\000\200n\000\201\000\000\200\000\000\200r\000\201l\000\201l\000\201l\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\2010\000\2011\000\2012\000\2013\000\2011\000\2012\000\2013\000\201t\000\201m\000\201m\000\201m\000\201h\000\201*\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201\000\000\200p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201r\000\201l\000\201l\000\201\000\000\200v\000\201s\000\201s\000\201s\000\201h\000\201\000\000\200\000\000\200'\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201i\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200n\000\201l\000\201\000\000\200r\000\201l\000\201l\000\201l\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200h\000\201h\000\201"; -static const char b00d[736] = "\364m\000\201m\000\201m\000\201h\000\201m\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201r\000\201l\000\201l\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201t\000\201\000\000\200\000\000\200'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200e\000\201e\000\201ai\202\000\000\200o\000\201o\000\201au\202\000\000\200r\000\201p\000\201\000\000\200\000\000\200\000\000\200\000\000\200m\000\201y\000\201l\000\201u\000\2012\000\2014\000\20112\20216\20232\20248\20264\202i\000\201r\000\201l\000\201l\000\201l\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\2021003v\20480\20216024020\20240\20260\202d\000\201n\000\201n\000\201r\000\201l\000\201l\000\201k\000\201\000\000\200m\000\201m\000\201h\000\201\000\000\200a\000\201a\000\201ae\202ae\202i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201e\000\201ai\202o\000\201o\000\201au\202\000\000\200\000\000\200\000\000\200k\000\201kh\202g\000\201gh\202n\000\201ng\202c\000\201ch\202j\000\201jh\202n\000\201jn\202nj\202t\000\201th\202d\000\201dh\202n\000\201nd\202t\000\201th\202d\000\201dh\202n\000\201\000\000\200nd\202p\000\201ph\202b\000\201bh\202m\000\201mb\202y\000\201r\000\201\000\000\200l\000\201\000\000\200\000\000\200v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201f\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201ae\202ae\202i\000\201i\000\201u\000\201\000\000\200u\000\201\000\000\200r\000\201e\000\201e\000\201ai\202o\000\201o\000\201au\202u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200r\000\201l\000\201~\000\201"; -static const char b00e[673] = "\337\000\000\200k\000\201kh\202kh\202kh\202kh\202kh\202ng\202ch\202ch\202ch\202s\000\201ch\202y\000\201d\000\201t\000\201th\202th\202th\202n\000\201d\000\201t\000\201th\202th\202th\202n\000\201b\000\201p\000\201ph\202f\000\201ph\202f\000\201ph\202m\000\201y\000\201r\000\201ruel\000\201luew\000\201s\000\201s\000\201s\000\201h\000\201l\000\201o\000\201h\000\201.\000\201a\000\201a\000\201a\000\201am\202i\000\201i\000\201ue\202ue\202u\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200B\000\201e\000\201ae\202o\000\201ai\202ai\202\000\000\200-\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200m\000\201\000\000\200*\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201#\000\201@\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200k\000\201kh\202\000\000\200kh\202\000\000\200gh\202ng\202ch\202ch\202x\000\201\000\000\200jh\202gn\202n\000\201t\000\201th\202d\000\201dh\202n\000\201d\000\201t\000\201th\202th\202dh\202n\000\201b\000\201p\000\201ph\202f\000\201ph\202f\000\201bh\202m\000\201y\000\201r\000\201\000\000\200l\000\201\000\000\200v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201\000\000\200h\000\201...a\000\201a\000\201a\000\201am\202i\000\201i\000\201u\000\201u\000\201ou\202ou\202\000\000\200o\000\201l\000\201y\000\201\000\000\200\000\000\200e\000\201e\000\201o\000\201ai\202ai\202\000\000\200-\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200o\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200n\000\201m\000\201g\000\201gn\202"; -static const char b00f[658] = "\332Om\202@\000\201@\000\201@\000\201@\000\201#\000\201$\000\201%\000\201!\000\201*\000\201*\000\201-\000\201-\000\201,\000\201.\000\201;\000\201|\000\201|\000\201/\000\201*\000\201:\000\201*\000\201*\000\201*\000\201\000\000\200\000\000\200o\000\201oo\202ooox\000\201xx\202ox\2020\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011-\2022-\2023-\2024-\2025-\2026-\2027-\2028-\2029-\2020-\202=\000\201\000\000\200^\000\201\000\000\200*\000\201\000\000\200<\000\201>\000\201(\000\201)\000\201\000\000\200\000\000\200k\000\201kh\202g\000\201gh\202ng\202c\000\201ch\202j\000\201\000\000\200ny\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201ts\202tshdz\202dzhw\000\201zh\202z\000\201'\000\201y\000\201r\000\201l\000\201sh\202s\000\201s\000\201h\000\201\000\000\200ks\202r\000\201q\000\201r\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202m\000\201h\000\201i\000\201i\000\201m\000\201m\000\201\000\000\200`\000\201\000\000\200\000\000\200h\000\201h\000\201\000\000\200\000\000\200h\000\201h\000\201h\000\201h\000\201k\000\201kh\202g\000\201gh\202ng\202c\000\201ch\202j\000\201\000\000\200ny\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201ts\202tshdz\202dzhw\000\201zh\202z\000\201'\000\201y\000\201r\000\201l\000\201sh\202s\000\201s\000\201h\000\201\000\000\200ks\202w\000\201y\000\201r\000\201\000\000\200*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201\000\000\200*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201\000\000\200xo\202xxx*\000\201*\000\201:\000\201@\000\201#\000\201+\000\201+\000\201+\000\201+\000\201~\000\201~\000\201"; -static const char b010[769] = "\377k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201nn\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201h\000\201l\000\201'\000\201'\000\201i\000\201i\000\201u\000\201u\000\201e\000\201e\000\201o\000\201o\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202i\000\201ao\202e\000\201m\000\201\000\000\200\000\000\200\000\000\200\000\000\200y\000\201r\000\201v\000\201h\000\201ss\2020\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201,\000\201.\000\201n*\202r*\202l*\202e*\202s\000\201s\000\201r\000\201r\000\201l\000\201l\000\201r\000\201r\000\201l\000\201l\000\201n\000\201jh\202b\000\201b\000\201n\000\201m\000\201l\000\201sh\202o\000\201\000\000\200\000\000\200s\000\201pw\202o\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200n\000\201yw\202ghwi\000\201o\000\201u\000\201e\000\201k\000\201kh\202g\000\201c\000\201z\000\201n\000\201d\000\201n\000\201ph\202f\000\201b\000\201x\000\201h\000\201v\000\201a\000\201e\000\201e\000\201ai\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200f\000\201\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200a\000\201ai\2021\000\201!\000\201A\000\201B\000\201G\000\201D\000\201E\000\201V\000\201Z\000\201T\000\201I\000\201K'\202L\000\201M\000\201N\000\201O\000\201P'\202Zh\202R\000\201S\000\201T'\202U\000\201P\000\201K\000\201Gh\202Q'\202Sh\202Ch\202Ts\202Dz\202Ts'Ch'Kh\202J\000\201H\000\201E\000\201Y\000\201W\000\201X\000\201O\000\201\000\000\200E\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ae\202\000\000\200\000\000\200a\000\201b\000\201g\000\201d\000\201e\000\201v\000\201z\000\201t\000\201i\000\201k'\202l\000\201m\000\201n\000\201o\000\201p'\202zh\202r\000\201s\000\201t'\202u\000\201p\000\201k\000\201gh\202q'\202sh\202ch\202ts\202dz\202ts'ch'kh\202j\000\201h\000\201e\000\201y\000\201w\000\201x\000\201o\000\201f\000\201e\000\201`\000\201g\000\201`\000\201*\000\201n\000\201ae\202`\000\201w\000\201"; -static const char b011[769] = "\377g\000\201kk\202n\000\201d\000\201tt\202l\000\201m\000\201b\000\201pp\202s\000\201ss\202\000\000\200j\000\201jj\202ch\202k\000\201t\000\201p\000\201h\000\201ng\202nn\202nd\202nb\202dg\202ln\202ll\202lh\202lh\202mb\202mh\202bg\202bn\202bd\202bs\202bsgbsdbsbbssbsjbj\202bchbt\202bp\202v\000\201pphsg\202sn\202sd\202sl\202sm\202sb\202sbgssss\000\201sj\202schsk\202st\202sp\202sh\202s\000\201ss\202s\000\201ss\202z\000\201g\000\201d\000\201m\000\201b\000\201s\000\201z\000\201\000\000\200j\000\201ch\202t\000\201p\000\201ng\202j\000\201j\000\201jj\202j\000\201jj\202chkchhch\202ch\202pb\202f\000\201hh\202q\000\201gd\202ns\202nj\202nh\202dl\202\000\000\200\000\000\200a\000\201ae\202ya\202yaeeo\202e\000\201yeoye\202o\000\201wa\202waeoe\202yo\202u\000\201wo\202we\202wi\202yu\202eu\202ui\202i\000\201ao\202au\202yao\000Y\204eooeou\000\011\204\000b\204\000\203\204oeooe\202oyeoo\202ou\202\010\337\204\010\337\205\016p\205yooyoiua\202uae\000\010\205uyeuu\202yua\000\240\204yue\013\335\205\013\335\204yuuyuieuu\000\005\204uiuia\202iyaio\202iu\202ieuio\202o\000\201oeoou\202oi\202oo\202aeuyau\002\317\205oya\010\340\204g\000\201kk\202gs\202n\000\201nj\202nh\202d\000\201l\000\201lg\202lm\202lb\202ls\202lt\202lp\202lh\202m\000\201b\000\201bs\202s\000\201ss\202ng\202j\000\201ch\202k\000\201t\000\201p\000\201h\000\201gl\202gsgng\202nd\202ns\202nz\202nt\202dg\202dl\202lgsln\202ld\202ldhll\202lmglmslbslbhlv\202lsslz\202lk\202lq\202mg\202ml\202mb\202ms\202mssmz\202mchmh\202mh\202bl\202bp\202bh\202v\000\201sg\202sd\202sl\202sb\202z\000\201ngg\000\037\204\000\217\204ngkng\202ngsngzpb\202f\000\201hn\202hl\202hm\202hb\202q\000\201gn\202gb\202gchgk\202gh\202nn\202"; -static const char b012[769] = "\377he\202hu\202hi\202ha\202hieh\000\201ho\202hoale\202lu\202li\202la\202liel\000\201lo\202lwahe\202hu\202hi\202ha\202hieh\000\201ho\202hwame\202mu\202mi\202ma\202miem\000\201mo\202mwase\202su\202si\202sa\202sies\000\201so\202sware\202ru\202ri\202ra\202rier\000\201ro\202rwase\202su\202si\202sa\202sies\000\201so\202swasheshushisha\014\036\204sh\202sho\014\223\204k'ek'uk'ik'a\000\042\204k'\202k'o\000\244\204\000\253\204\000\000\200\024P\204\000\257\204\024P\205\024P\204\000\000\200\000\000\200\000\266\204\000\272\204\023R\204\000\276\204\023R\205kh'\000\315\204\000\000\200\025\022\205\000\000\200\032\002\205\025\355\205\032\002\206\032\002\205\000\000\200\000\000\200be\202bu\202bi\202ba\202bieb\000\201bo\202bwave\202vu\202vi\202va\202viev\000\201vo\202vwate\202tu\202ti\202ta\202tiet\000\201to\202twachechuchicha\013S\204ch\202cho\036\011\204he\202hu\202hi\202ha\202hieh\000\201ho\202hoahwe\000\000\200hwihwa\0262\204hwi\000\000\200\000\000\200ne\202nu\202ni\202na\202nien\000\201no\202nwanyenyunyinya\033\335\204ny\202nyo\000\225\204'e\202'u\202'i\202'a\202'ie'\000\201'o\202'wake\202ku\202ki\202ka\202kiek\000\201ko\202koakwe\000\000\200kwikwa\000\321\204kwi\000\000\200\000\000\200khekhukhikha\000\325\204kh\202kho\000\000\200\000\331\204\000\000\200\0261\204\027\252\204\0261\205\0261\204\000\000\200\000\000\200we\202wu\202wi\202wa\202wiew\000\201wo\202woa`e\202`u\202`i\202`a\202`ie`\000\201`o\202\000\000\200ze\202zu\202zi\202za\202ziez\000\201zo\202zwazhezhuzhizha\000\017\204zh\202zho\000\335\204ye\202yu\202yi\202ya\202yiey\000\201yo\202yoade\202du\202di\202da\202died\000\201do\202dwad'ed'ud'id'a\000\371\204d'\202d'o\000\375\204"; -static const char b013[763] = "\375je\202ju\202ji\202ja\202jiej\000\201jo\202jwage\202gu\202gi\202ga\202gieg\000\201go\202goagwe\000\000\200gwigwa\005\010\204gwi\000\000\200\000\000\200ngengunginga\005#\204ng\202ngo\000\221\204t'et'ut'it'a\0001\204t'\202t'o\000@\204\000\002\204\000(\204\026)\204\001\001\204\026)\205ch'\027\000\204\026r\205p'ep'up'ip'a\001\005\204p'\202p'o\001\011\204\000U\204\000j\204\010\011\204\000u\204\010\011\205ts'\010D\204\010%\205\000U\204\000j\204\010\011\204\000u\204\010\011\205ts'\010D\204\010D\205fe\202fu\202fi\202fa\202fief\000\201fo\202fwape\202pu\202pi\202pa\202piep\000\201po\202pwaryamyafya\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200+\000\201 \000\201.\000\201,\000\201;\000\201,\000\201:\000\201?\000\201#\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\2021003v\205\000\000\200\000\000\200\000\000\200mwemwi\001\015\204mwibwebwi\001\021\204bwifwefwi\001\025\204fwipwepwi\000\365\204pwi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200A\000\201E\000\201I\000\201O\000\201U\000\201V\000\201Ga\202Ka\202Ge\202Gi\202Go\202Gu\202Gv\202Ha\202He\202Hi\202Ho\202Hu\202Hv\202La\202Le\202Li\202Lo\202Lu\202Lv\202Ma\202Me\202Mi\202Mo\202Mu\202Na\202HnaNahNe\202Ni\202No\202Nu\202Nv\202QuaQueQuiQuoQuuQuvSa\202S\000\201Se\202Si\202So\202Su\202Sv\202Da\202Ta\202De\202Te\202Di\202Ti\202Do\202Du\202Dv\202DlaTlaTleTliTloTluTlvTsaTseTsiTsoTsuTsvWa\202We\202Wi\202Wo\202Wu\202Wv\202Ya\202Ye\202Yi\202Yo\202Yu\202Yv\202Mv\202\000\000\200\000\000\200ye\202yi\202yo\202yu\202yv\202mv\202"; -static const char b014[769] = "\377-\000\201e\000\201iy\202i\000\201ii\202o\000\201oo\202oo\202e\000\201i\000\201a\000\201aa\202we\202we\202wi\202wi\202wiiwiiwo\202wo\202woowoowo\202wa\202wa\202waawaawa\202ai\202w\000\201'\000\201t\000\201k\000\201sh\202s\000\201n\000\201w\000\201'\000\201h\000\201w\000\201c\000\201n\000\201l\000\201e\000\201i\000\201o\000\201a\000\201pe\202piypi\202piipo\202poopoohe\202hi\202pa\202paapwepwepwipwi\001\031\204\001\031\204pwopwo\001&\204\001&\204pwapwa\001*\204\001*\204pwap\000\201p\000\201h\000\201te\202tiyti\202tiito\202tootoode\202di\202ta\202taatwetwetwitwi\000\360\204\000\360\204twotwo\001.\204\001.\204twatwa\001\042\204\001\042\204twat\000\201t'et'it'ot'ake\202kiyki\202kiiko\202kookooka\202kaakwekwekwikwi\0012\204\0012\204kwokwo\001<\204\001<\204kwakwa\001@\204\001@\204kwak\000\201kw\202k'ek'ik'ok'ace\202ciyci\202ciico\202coocooca\202caacwecwecwicwi\001D\204\001D\204cwocwo\001H\204\001H\204cwacwa\001L\204\001L\204cwac\000\201c\000\201me\202miymi\202miimo\202moomooma\202maamwemwemwimwi\001P\204\001P\204mwomwo\001T\204\001T\204mwamwa\001X\204\001X\204mwam\000\201m\000\201mw\202m\000\201m\000\201ne\202niyni\202niino\202noonoona\202naanwenwenwanwa\001\134\204\001\134\204nwan\000\201ng\202nw\202le\202liyli\202liilo\202looloola\202laalwelwelwilwi\000\177\204\000\177\204lwolwo\001`\204\001`\204lwalwa\001d\204\001d\204l\000\201l\000\201l\000\201se\202siysi\202siiso\202soosoosa\202saaswesweswiswi\001h\204\001h\204swoswo\001l\204\001l\204"; -static const char b015[769] = "\377swaswa\001p\204\001p\204swas\000\201s\000\201sw\202s\000\201sk\202skwsw\202\001t\204\001!\204\001x\204\001\200\204sheshi\001\204\204sho\001\210\204sha\001\214\204\014z\204\014z\204\014b\204\014b\204\0212\205\0212\205\022\042\204\022\042\204\022\042\205\022\042\205\014\223\204\014\223\204\022S\205\022S\205sh\202ye\202yiyyi\202yiiyo\202yooyooya\202yaayweyweywiywi\000\310\204\000\310\204ywoywo\001|\204\001|\204ywaywa\000\226\204\000\226\204yway\000\201y\000\201y\000\201yi\202re\202re\202li\202riyri\202riiro\202roolo\202ra\202raala\202\000\345\204\000\345\204r\000\201r\000\201r\000\201fe\202fiyfi\202fiifo\202foofa\202faa\001\220\204\001\220\204f\000\201thethethithi\0018\204\0018\204tho\011e\204tha\011}\204\010f\205\010f\205th\202\001\224\204\001\234\204\011d\204\011|\204**\202te\202ti\202to\202ta\202haihi\202hiihu\202huuha\202haah\000\201h\000\201hk\202qiyqi\202qiiqu\202quuqa\202qaaq\000\201tletlitlotlare\202ri\202ro\202ra\202\000\305\204ngi\000F\204ngu\000\234\204nga\020r\204ng\202nngsheshishoshathethithothath\202hli\001\241\204hlu\001\245\204hla\001\251\204hl\202thethi\0018\204tho\011e\204tha\011}\204th\202b\000\201e\000\201i\000\201o\000\201a\000\201we\202wi\202wo\202wa\202ne\202ni\202no\202na\202ke\202ki\202ko\202ka\202ge\202gi\202go\202ga\202\001\255\204khokhukhekhikha\001\261\204ghoghugheghighawoowo\202wu\202we\202wi\202wa\202\001\230\204whowhuwhewhiwhatooto\202tu\202te\202ti\202ta\202\001\265\204t'ot'ut'et'it'apoopo\202pu\202pe\202pi\202pa\202p\000\201googo\202gu\202ge\202gi\202ga\202kooko\202ku\202ke\202ki\202ka\202\001\271\204k'ok'uk'ek'i"; -static const char b016[748] = "\370k'ak'\202noono\202nu\202ne\202ni\202na\202moomo\202mu\202me\202mi\202ma\202yooyo\202yu\202ye\202yi\202ya\202joojo\202jo\202ju\202je\202ji\202ji\202ja\202\027\000\205\027\000\204\000(\204\000\002\204\026)\204\001\001\204loolo\202lu\202le\202li\202la\202\001\275\204dlodludledlidla\001\301\204lholhulhelhilha\001\305\204tlotlutletlitla\010\207\205\010\207\204\001\311\204\001\315\204\001\321\204\001\325\204zoozo\202zu\202ze\202zi\202za\202z\000\201z\000\201\001\331\204dzodzudzedzidzasooso\202su\202se\202si\202sa\202\001\210\204shoshusheshishash\202E\202\204chochuchechicha\001\335\204tsotsutsetsitsa\010\373\205\010D\204\000j\204\000U\204\010\011\204\000u\204X\000\201.\000\201qai\001\341\204\000E\204\000E\205\000\233\204\000\233\205\020q\204\020q\205\011U\204\011(\204\011(\205\0110\204\0110\205\010f\204\010f\205th\202w\000\201 \000\201b\000\201l\000\201f\000\201s\000\201n\000\201h\000\201d\000\201t\000\201c\000\201q\000\201m\000\201g\000\201ng\202z\000\201r\000\201a\000\201o\000\201u\000\201e\000\201i\000\201ea\202oi\202ui\202ia\202ae\202p\000\201>\000\201<\000\201\000\000\200\000\000\200\000\000\200f\000\201v\000\201u\000\201y\000\201y\000\201w\000\201th\202dh\202a\000\201o\000\201a\000\201ae\202a\000\201a\000\201o\000\201o\000\201o\000\201r\000\201k\000\201c\000\201k\000\201g\000\201ng\202g\000\201g\000\201w\000\201h\000\201h\000\201h\000\201h\000\201n\000\201n\000\201n\000\201i\000\201e\000\201j\000\201j\000\201a\000\201a\000\201i\000\201p\000\201z\000\201s\000\201s\000\201s\000\201c\000\201z\000\201t\000\201t\000\201d\000\201b\000\201b\000\201p\000\201p\000\201e\000\201m\000\201m\000\201m\000\201l\000\201l\000\201ng\202ng\202d\000\201o\000\201ea\202io\202q\000\201k\000\201k\000\201st\202r\000\201r\000\201y\000\201q\000\201x\000\201.\000\201:\000\201+\000\20117\20218\20219\202k\000\201sh\202oo\202o\000\201i\000\201e\000\201a\000\201ae\202"; -static const char b017[751] = "\371a\000\201i\000\201u\000\201k\000\201g\000\201ng\202t\000\201d\000\201n\000\201p\000\201b\000\201m\000\201y\000\201r\000\201l\000\201w\000\201s\000\201h\000\201i\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200r\000\201a\000\201i\000\201u\000\201k\000\201g\000\201ng\202t\000\201d\000\201n\000\201p\000\201b\000\201m\000\201y\000\201r\000\201l\000\201w\000\201s\000\201h\000\201i\000\201u\000\201\000\000\200,\000\201.\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201i\000\201u\000\201k\000\201g\000\201ng\202t\000\201d\000\201n\000\201p\000\201b\000\201m\000\201y\000\201r\000\201l\000\201w\000\201s\000\201h\000\201i\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201i\000\201u\000\201k\000\201g\000\201ng\202t\000\201d\000\201n\000\201p\000\201b\000\201m\000\201y\000\201\000\000\200l\000\201w\000\201s\000\201\000\000\200i\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200k\000\201kh\202k\000\201kh\202ng\202ch\202chhch\202chhnh\202d\000\201th\202d\000\201th\202n\000\201t\000\201th\202t\000\201th\202n\000\201b\000\201ph\202p\000\201ph\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201'\000\201'\000\201'a\202e\000\201ei\202o\000\201o\000\201ou\202au\202rue\001\345\204lue\001\351\204ae\202ai\202ao\202ao\202ov\202\000\000\200\000\000\200a\000\201e\000\201ei\202oe\202eu\202o\000\201ou\202uo\202aeuoeaie\202e\000\201ae\202ai\202ao\202au\202am\202ah\202ak\202\000\000\200\000\000\200a\000\201r\000\201\000\000\200!\000\201\000\000\200a\000\201\000\000\200\000\000\200\000\000\200.\000\201#\000\201:\000\201-\000\201\001\355\204*\000\201@\000\201CR\202'\000\201\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b018[739] = "\365@\000\201...,\000\201.\000\201:\000\201*\000\201-\000\201-\000\201,\000\201.\000\201-\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201e\000\201i\000\201o\000\201u\000\201o\000\201u\000\201e\000\201n\000\201ng\202b\000\201p\000\201h\000\201g\000\201m\000\201l\000\201s\000\201x\000\201t\000\201d\000\201q\000\201j\000\201y\000\201r\000\201w\000\201f\000\201k\000\201k\000\201c\000\201z\000\201h\000\201r\000\201lh\202zh\202ch\202\000\000\200e\000\201i\000\201o\000\201u\000\201o\000\201u\000\201ng\202b\000\201p\000\201h\000\201g\000\201m\000\201t\000\201d\000\201q\000\201j\000\201c\000\201y\000\201v\000\201k\000\201g\000\201h\000\201j\000\201ny\202z\000\201e\000\201i\000\201y\000\201u\000\201u\000\201ng\202k\000\201g\000\201h\000\201p\000\201x\000\201t\000\201d\000\201j\000\201f\000\201g\000\201h\000\201c\000\201z\000\201r\000\201ch\202zh\202i\000\201k\000\201r\000\201f\000\201zh\202x\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200m\000\201h\000\201h\000\201h\000\201h\000\2013\000\2019\000\201a\000\201i\000\201k\000\201ng\202ts\202t\000\201th\202d\000\201n\000\201t\000\201d\000\201p\000\201ph\202s\000\201zh\202z\000\201'\000\201t\000\201zh\202gh\202ng\202ts\202dzht\000\201dh\202t\000\201dh\202s\000\201c\000\201zh\202z\000\201w\000\201y\000\201bh\202\000\000\200lh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200oy\202ay\202aaywaypoypay\001\361\204taykay\001y\204maynoynaylaysoysay\001\373\204\002\005\204\022i\205yoyyayraynwinwi\002\001\204\002\001\204nwonwo\002\017\204\002\017\204rwerwi\002\023\204rwo\002\027\204rwap\000\201t\000\201k\000\201c\000\201m\000\201n\000\201s\000\201sh\202w\000\201w\000\201y\000\201'\000\201rweloolaa\011U\204\010f\204\011T\205\011d\205\011|\205\002\013\204\001\305\204\014z\204\001\210\204googwogoogaagwajoojwel\000\201r\000\201s\000\201"; -static const char b019[769] = "\377\000\000\200k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201jn\202tr\202\000\000\200a\000\201i\000\201u\000\201e\000\201ai\202o\000\201au\202e\000\201o\000\201y\000\201r\000\201v\000\201\000\000\200\000\000\200\000\000\200\000\000\200k\000\201n\000\201m\000\201t\000\201n\000\201p\000\201m\000\201r\000\201l\000\201h\000\201'\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200lo\202\000\000\200\000\000\200\000\000\200!\000\201?\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201g\000\201h\000\201ng\202z\000\201s\000\201y\000\201d\000\201t\000\201l\000\201b\000\201p\000\201m\000\201f\000\201w\000\201hh\202'\000\201k\000\201c\000\201n\000\201aa\202i\000\201e\000\201ae\202u\000\201o\000\201oa\202ue\202oe\202aueai\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200g\000\201k\000\201ng\202g\000\201k\000\201ng\202z\000\201s\000\201y\000\201z\000\201s\000\201y\000\201d\000\201t\000\201n\000\201d\000\201t\000\201n\000\201b\000\201p\000\201m\000\201b\000\201p\000\201m\000\201f\000\201w\000\201l\000\201f\000\201w\000\201l\000\201h\000\201dd\202bb\202h\000\201dd\202bb\202gw\202kw\202gw\202kw\202sw\202sw\202\000\000\200\000\000\200\000\000\200\000\000\200'\000\201aa\202i\000\201u\000\201u\000\201e\000\201ae\202o\000\201oa\202ue\202ai\202aaiui\202oi\202oaiueiii\202w\000\201ng\202n\000\201m\000\201k\000\201t\000\201p\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\201\000\000\200\000\000\200\000\000\200lae\002\033\20408\2021.\2022.\2023.\2024.\2025.\2026.\2027.\2028.\2029.\20210.11.12.13.14.15.88\202.1\202.2\202.3\202.4\202.5\202.6\202.7\202.8\202.9\202.10.11.12.13.14.15"; -static const char b01a[622] = "\316k\000\201g\000\201ng\202ngkp\000\201b\000\201m\000\201mp\202t\000\201d\000\201n\000\201nr\202c\000\201j\000\201ny\202nc\202y\000\201r\000\201l\000\201w\000\201s\000\201\000\000\200h\000\201i\000\201u\000\201e\000\201o\000\201e\000\201\000\000\200\000\000\200\134\000\201*\000\201k\000\201kh\202kh\202k\000\201kh\202kh\202ng\202ch\202s\000\201ch\202s\000\201s\000\201ny\202t\000\201th\202d\000\201th\202n\000\201t\000\201th\202t\000\201th\202n\000\201b\000\201p\000\201ph\202f\000\201p\000\201f\000\201ph\202m\000\201ny\202y\000\201h\000\201luel\000\201luew\000\201s\000\201s\000\201s\000\201h\000\201l\000\201\000\000\200h\000\201i\000\201i\000\201u\000\201u\000\201e\000\201o\000\201laeth\202r\000\201l\000\201lngng\202ng\202p\000\201th\202m\000\201b\000\201s\000\201\000\000\200\000\000\200a\000\201a\000\201a\000\201a\000\201i\000\201i\000\201ue\202ue\202u\000\201u\000\201o\000\201o\000\201oy\202e\000\201ae\202o\000\201ai\202ai\202o\000\201m\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200-\000\201\000\000\200\000\000\200\000\000\200.\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w.\202ww.s.\202*\000\201*\000\201*\000\201^\000\201-\000\201,\000\201.\000\201;\000\201:\000\201@\000\201ch.\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\000\201w\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200g\000\201r\000\201t\000\201"; -static const char b01b[769] = "\377m\000\201ng\202ng\202r\000\201h\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201re\202ro\202le\202lo\202e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202ng\202c\000\201ch\202j\000\201jh\202ny\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201w\000\201s\000\201s\000\201s\000\201h\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201re\202ro\202le\202lo\202e\000\201ai\202o\000\201au\202e\000\201o\000\201\000\000\200q\000\201x\000\201ts\202f\000\201v\000\201z\000\201sy\202jny\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201*\000\201@\000\201.\000\201:\000\201,\000\201.\000\201-\000\201a\000\201e\000\201u\000\201ng\202r\000\201i\000\201e\000\201u\000\201ai\202h\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201**\202@@\202\000\000\200ng\202r\000\201h\000\201a\000\201i\000\201u\000\201e\000\201o\000\201e\000\201eu\202k\000\201q\000\201g\000\201ng\202c\000\201j\000\201z\000\201ny\202t\000\201d\000\201n\000\201p\000\201f\000\201v\000\201b\000\201m\000\201y\000\201r\000\201l\000\201w\000\201s\000\201x\000\201h\000\201y\000\201r\000\201l\000\201i\000\201u\000\201e\000\201o\000\201e\000\201eu\202\000\000\200\000\000\200m\000\201w\000\201kh\202sy\2020\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201'\000\201reuleubh\202k\000\201m\000\201\000\000\200\000\000\200h\000\201h\000\201h\000\201b\000\201b\000\201p\000\201p\000\201n\000\201n\000\201w\000\201w\000\201w\000\201g\000\201g\000\201j\000\201d\000\201r\000\201r\000\201m\000\201m\000\201t\000\201t\000\201s\000\201s\000\201s\000\201y\000\201y\000\201ng\202l\000\201l\000\201ny\202c\000\201nd\202mb\202i\000\201u\000\201'\000\201e\000\201e\000\201e\000\201i\000\201i\000\201o\000\201o\000\201u\000\201u\000\201ng\202h\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\201+\000\201|\000\201)\000\201"; -static const char b01c[742] = "\366k\000\201kl\202kh\202g\000\201gl\202ng\202c\000\201ch\202j\000\201ny\202t\000\201th\202d\000\201n\000\201p\000\201pl\202ph\202f\000\201fl\202b\000\201bl\202m\000\201ml\202ts\202tshz\000\201y\000\201r\000\201l\000\201h\000\201hl\202v\000\201s\000\201sh\202w\000\201\000\000\200y\000\201r\000\201a\000\201i\000\201o\000\201o\000\201u\000\201u\000\201e\000\201k\000\201m\000\201l\000\201n\000\201p\000\201r\000\201t\000\201ng\202ng\202\000\000\200'\000\201\000\000\200\000\000\200\000\000\200,\000\201.\000\201.\000\201.\000\201.\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200t\000\201th\202d\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201a\000\201t\000\201g\000\201m\000\201l\000\201a\000\201k\000\201j\000\201m\000\201w\000\201i\000\201s\000\201h\000\201n\000\201r\000\201u\000\201c\000\201d\000\201n\000\201y\000\201e\000\201p\000\201d\000\201n\000\201r\000\201o\000\201t\000\201b\000\201n\000\201h\000\201m\000\201\000\000\200m\000\201\000\000\200\000\000\200'\000\201,\000\201.\000\201v\000\201d\000\201o\000\201s\000\201t\000\201t\000\201'\000\201e\000\201u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200A\000\201B\000\201G\000\201D\000\201E\000\201V\000\201Z\000\201T\000\201I\000\201K'\202L\000\201M\000\201N\000\201O\000\201P'\202Zh\202R\000\201S\000\201T'\202U\000\201P\000\201K\000\201Gh\202Q'\202Sh\202Ch\202Ts\202Dz\202Ts'Ch'Kh\202J\000\201H\000\201E\000\201Y\000\201W\000\201X\000\201O\000\201F\000\201E\000\201`\000\201G\000\201`\000\201\000\000\200\000\000\200Ae\202`\000\201W\000\201.\000\201*\000\201;\000\201,\000\201L\000\201K\000\201D\000\201B\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\042\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200h\000\201h\000\201h\000\201h\000\201h\000\201h\000\201h\000\201m\000\201m\000\201m\000\201m\000\201m\000\201m\000\201m\000\201m\000\201m\000\201h\000\201h\000\201\000\000\200h\000\201h\000\201"; -static const char b01d[736] = "\364a\000\201ae\202ae\202b\000\201c\000\201d\000\201d\000\201e\000\201e\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201o\000\201o\000\201o\000\201o\000\201oe\202ou\202o\000\201o\000\201p\000\201r\000\201r\000\201t\000\201u\000\201u\000\201u\000\201w\000\201v\000\201w\000\201z\000\201zh\202`\000\201`\000\201g\000\201l\000\201p\000\201r\000\201ps\202l\000\201A\000\201Ae\202B\000\201B\000\201D\000\201E\000\201E\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201N\000\201O\000\201Ou\202P\000\201R\000\201T\000\201U\000\201W\000\201a\000\201a\000\201a\000\201ae\202b\000\201d\000\201e\000\201e\000\201e\000\201e\000\201g\000\201i\000\201k\000\201m\000\201ng\202o\000\201o\000\201o\000\201o\000\201p\000\201t\000\201u\000\201u\000\201w\000\201v\000\201`\000\201v\000\201g\000\201d\000\201f\000\201ch\202i\000\201r\000\201u\000\201v\000\201v\000\201g\000\201r\000\201f\000\201ch\202ue\202b\000\201d\000\201f\000\201m\000\201n\000\201p\000\201r\000\201r\000\201s\000\201t\000\201z\000\201g\000\201n\000\201g\000\201th\202i\000\201i\000\201p\000\201u\000\201u\000\201b\000\201d\000\201f\000\201g\000\201k\000\201l\000\201m\000\201n\000\201p\000\201r\000\201s\000\201sh\202v\000\201x\000\201z\000\201a\000\201a\000\201d\000\201e\000\201e\000\201e\000\201e\000\201i\000\201o\000\201sh\202u\000\201zh\202a\000\201c\000\201c\000\201d\000\201e\000\201f\000\201j\000\201g\000\201y\000\201i\000\201i\000\201i\000\201i\000\201j\000\201l\000\201l\000\201l\000\201m\000\201w\000\201n\000\201n\000\201n\000\201o\000\201f\000\201s\000\201sh\202t\000\201u\000\201u\000\201u\000\201v\000\201a\000\201z\000\201z\000\201z\000\201zh\202th\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200r\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201ae\202ao\202av\202c\000\201d\000\201d\000\201g\000\201g\000\201k\000\201l\000\201l\000\201m\000\201n\000\201n\000\201r\000\201r\000\201s\000\201s\000\201z\000\201a\000\201b\000\201b\000\201e\000\201f\000\201l\000\201o\000\201p\000\201sh\202u\000\201w\000\201a\000\201o\000\201u\000\201"; -static const char b01e[769] = "\377A\000\201a\000\201B\000\201b\000\201B\000\201b\000\201B\000\201b\000\201C\000\201c\000\201D\000\201d\000\201D\000\201d\000\201D\000\201d\000\201D\000\201d\000\201D\000\201d\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201F\000\201f\000\201G\000\201g\000\201H\000\201h\000\201H\000\201h\000\201H\000\201h\000\201H\000\201h\000\201H\000\201h\000\201I\000\201i\000\201I\000\201i\000\201K\000\201k\000\201K\000\201k\000\201K\000\201k\000\201L\000\201l\000\201L\000\201l\000\201L\000\201l\000\201L\000\201l\000\201M\000\201m\000\201M\000\201m\000\201M\000\201m\000\201N\000\201n\000\201N\000\201n\000\201N\000\201n\000\201N\000\201n\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201P\000\201p\000\201P\000\201p\000\201R\000\201r\000\201R\000\201r\000\201R\000\201r\000\201R\000\201r\000\201S\000\201s\000\201S\000\201s\000\201S\000\201s\000\201S\000\201s\000\201S\000\201s\000\201T\000\201t\000\201T\000\201t\000\201T\000\201t\000\201T\000\201t\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201V\000\201v\000\201V\000\201v\000\201W\000\201w\000\201W\000\201w\000\201W\000\201w\000\201W\000\201w\000\201W\000\201w\000\201X\000\201x\000\201X\000\201x\000\201Y\000\201y\000\201Z\000\201z\000\201Z\000\201z\000\201Z\000\201z\000\201h\000\201t\000\201w\000\201y\000\201a'\202s\000\201s.\202s.\202Ss\202d\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201A\000\201a\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201E\000\201e\000\201I\000\201i\000\201I\000\201i\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201O\000\201o\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201U\000\201u\000\201Y\000\201y\000\201Y\000\201y\000\201Y\000\201y\000\201Y\000\201y\000\201Ll\202ll\202V\000\201v\000\201Y\000\201y\000\201"; -static const char b01f[766] = "\376a\000\201ha\202a\000\201ha\202a\000\201ha\202a\000\201ha\202A\000\201Ha\202A\000\201Ha\202A\000\201Ha\202A\000\201Ha\202e\000\201he\202e\000\201he\202e\000\201he\202\000\000\200\000\000\200E\000\201He\202E\000\201He\202E\000\201He\202\000\000\200\000\000\200i\000\201hi\202i\000\201hi\202i\000\201hi\202i\000\201hi\202I\000\201Hi\202I\000\201Hi\202I\000\201Hi\202I\000\201Hi\202i\000\201hi\202i\000\201hi\202i\000\201hi\202i\000\201hi\202I\000\201Hi\202I\000\201Hi\202I\000\201Hi\202I\000\201Hi\202o\000\201ho\202o\000\201ho\202o\000\201ho\202\000\000\200\000\000\200O\000\201Ho\202O\000\201Ho\202O\000\201Ho\202\000\000\200\000\000\200y\000\201hy\202y\000\201hy\202y\000\201hy\202y\000\201hy\202\000\000\200Hy\202\000\000\200Hy\202\000\000\200Hy\202\000\000\200Hy\202o\000\201ho\202o\000\201ho\202o\000\201ho\202o\000\201ho\202O\000\201Ho\202O\000\201Ho\202O\000\201Ho\202O\000\201Ho\202a\000\201a\000\201e\000\201e\000\201i\000\201i\000\201i\000\201i\000\201o\000\201o\000\201y\000\201y\000\201o\000\201o\000\201\000\000\200\000\000\200a\000\201ha\202a\000\201ha\202a\000\201ha\202a\000\201ha\202A\000\201Ha\202A\000\201Ha\202A\000\201Ha\202A\000\201Ha\202i\000\201hi\202i\000\201hi\202i\000\201hi\202i\000\201hi\202I\000\201Hi\202I\000\201Hi\202I\000\201Hi\202I\000\201Hi\202o\000\201ho\202o\000\201ho\202o\000\201ho\202o\000\201ho\202O\000\201Ho\202O\000\201Ho\202O\000\201Ho\202O\000\201Ho\202a\000\201a\000\201a\000\201a\000\201a\000\201\000\000\200a\000\201a\000\201A\000\201A\000\201A\000\201A\000\201A\000\201'\000\201i\000\201'\000\201~\000\201\042~\202i\000\201i\000\201i\000\201\000\000\200i\000\201i\000\201E\000\201E\000\201I\000\201I\000\201I\000\201'`\202''\202'~\202i\000\201i\000\201i\000\201i\000\201\000\000\200\000\000\200i\000\201i\000\201I\000\201I\000\201I\000\201I\000\201\000\000\200h`\202h'\202h~\202y\000\201y\000\201y\000\201y\000\201r\000\201rh\202y\000\201y\000\201Y\000\201Y\000\201Y\000\201Y\000\201Rh\202\042`\202\042'\202`\000\201\000\000\200\000\000\200o\000\201o\000\201o\000\201\000\000\200o\000\201o\000\201O\000\201O\000\201O\000\201O\000\201O\000\201'\000\201h\000\201"; -static const char b020[580] = "\300 \000\201 \000\201 \000\201 \000\201 \000\201 \000\201 \000\201 \000\201 \000\201 \000\201 \000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201||\202_\000\201'\000\201'\000\201'\000\201'\000\201\042\000\201\042\000\201\042\000\201\042\000\201+\000\201++\202*\000\201*\000\201.\000\201..\202...-\000\201 \000\201 \000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200 \000\201%0\202%00'\000\201''\202'''`\000\201``\202```^\000\201<\000\201>\000\201*\000\201!!\202!?\202-\000\201_\000\201-\000\201^\000\201***-\000\201/\000\201[\000\201]\000\201??\202?!\202!?\202&\000\201P\000\201<\000\201>\000\201*\000\201;\000\201_\000\201**\202./.~\000\201_\000\201*\000\201:\000\201\002(\204:\000\201*\000\201:\000\201:\000\201+\000\201:\000\201:\000\201 \000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\201i\000\201\000\000\200\000\000\2004\000\2015\000\2016\000\2017\000\2018\000\2019\000\201+\000\201-\000\201=\000\201(\000\201)\000\201n\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201+\000\201-\000\201=\000\201(\000\201)\000\201\000\000\200a\000\201e\000\201o\000\201x\000\201e\000\201h\000\201k\000\201l\000\201m\000\201n\000\201p\000\201s\000\201t\000\201\000\000\200\000\000\200\000\000\200CE\202C\000\201Cr\202F\000\201L\000\201m\000\201N\000\201PtsRs\202W\000\201NISd\000\201EURK\000\201T\000\201Dr\202Pf\202P\000\201G\000\201A\000\201HRNC\000\201lt\202Sm\202T\000\201Rs\202TL\202M\000\201z4\205Rb\202\002,\204BTCSom"; -static const char b021[769] = "\377a/ca/sC\000\201C\000\201CL\202c/oc/uE\000\201g\000\201F\000\201g\000\201H\000\201H\000\201H\000\201h\000\201h\000\201I\000\201I\000\201L\000\201l\000\201#\000\201N\000\201No\202(P)p\000\201P\000\201Q\000\201R\000\201R\000\201R\000\201Rx\202R\000\201SM\202TELTM\202V\000\201Z\000\201oz\202OhmMhoZ\000\201i\000\201K\000\201A\000\201B\000\201C\000\201e\000\201e\000\201E\000\201F\000\201F\000\201M\000\201o\000\201a\000\201b\000\201g\000\201d\000\201i\000\201Q\000\201FAXp\000\201g\000\201G\000\201P\000\201S\000\201G\000\201L\000\201L\000\201Y\000\201D\000\201d\000\201e\000\201i\000\201j\000\201PL\202&\000\201P\000\201A/Sf\000\201Sh\2021/71/9\0020\2041/32/31/52/53/54/51/65/61/83/85/87/81/\202I\000\201II\202IIIIV\202V\000\201VI\202VII\0026\204IX\202X\000\201XI\202XIIL\000\201C\000\201D\000\201M\000\201i\000\201ii\202iiiiv\202v\000\201vi\202vii\002=\204ix\202x\000\201xi\202xiil\000\201c\000\201d\000\201m\000\201(|)|))\360\315\205C\000\201c\000\2016\000\201L\000\201\360\317\204\360\314\2070/32\000\2013\000\201\000\000\200\000\000\200\000\000\200\000\000\200<\000\201^\000\201>\000\201v\000\201f\277\222]R\217f\320\222i\232\223i\254\223f\341\222<\000\201>\000\201<\000\201>\000\201<\000\201^\000\201>\000\201v\000\201<\000\201>\000\201<\000\201^\000\201>\000\201v\000\201|\000\201s\300\233f\362\222<\000\201>\000\201~\000\201-\000\201v\000\201<\000\201>\000\201<\000\201>\000\201v\000\201<\000\201<\000\201>\000\201\134\000\201=\000\201<\000\201>\000\201<\000\201<\000\201^\000\201^\000\201>\000\201>\000\201v\000\201v\000\201=\000\201|\000\201=\000\201<\000\201^\000\201>\000\201v\000\201=\000\201=\000\201<\000\201-\000\201>\000\201<\000\201^\000\201>\000\201v\000\201-\000\201|\000\201\134\000\201/\000\201\134\000\201/\000\201<\000\201>\000\201<\000\201>\000\201^\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201>\000\201<\000\201^\000\201>\000\201v\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201>\000\201\134\000\201\134\000\201|\000\201>\000\201|\000\201>\000\201<\000\201>\000\201-\000\201<\000\201>\000\201-\000\201<\000\201>\000\201-\000\201"; -static const char b022[769] = "\377V\000\201C\000\201d\000\201E\000\201E\000\2010\000\201^\000\201D\000\201E\000\201E\000\201E\000\201E\000\201E\000\201E\000\201#\000\201P\000\201U\000\201S\000\201-\000\201-+\202+\000\201/\000\201\134\000\201*\000\201*\000\201*\000\201\002A\204\000.\2044rt~\000\201infL\000\201<\000\201<\000\201<\000\201|\000\201|\000\201||\202||\202^\000\201v\000\201^\000\201v\000\201S\000\201S\000\201SSSS\000\201SS\202SSSS\000\201S\000\201S\000\201:\000\201:\000\201:\000\201::\202_\000\201-:\202-\000\201~\000\201~\000\201~\000\201~\000\201~\000\201~\000\201~\000\201-~\202~\000\201~\000\201~=\202=\000\201=\000\201~\000\201~\000\201~\000\201~\000\201~=\202=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201:=\202=:\202=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201=\000\201<=\202>=\202<=\202>=\202<\000\201>\000\201<<\202>>\202()\202=\000\201<\000\201>\000\201<\000\201>\000\201<~\202>~\202<\000\201>\000\201=\000\201=\000\201=\000\201=\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201v\000\201v\000\201v\000\201[\000\201]\000\201[\000\201]\000\201^\000\201v\000\201+\000\201-\000\201x\000\201/\000\201.\000\201o\000\201*\000\201=\000\201-\000\201+\000\201-\000\201x\000\201.\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201-\000\201-\000\201-\000\201+\000\201T\000\201v\000\201^\000\201v\000\201<\000\201/\000\201^\000\201v\000\201^\000\201v\000\201*\000\201*\000\201*\000\201*\000\201><\202><\202><\202>\000\201<\000\201~=\202v\000\201^\000\201<\000\201>\000\201^\000\201v\000\201+\000\201#\000\201<\000\201>\000\201<<<>>>=\000\201=\000\201=<\202=>\202<\000\201>\000\201<\000\201>\000\201[\000\201]\000\201[\000\201]\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201|\000\201-\000\201/\000\201\134\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201E\000\201"; -static const char b023[769] = "\3770\000\201~\000\201^\000\201^\000\201v\000\201^\000\201^\000\201~\000\201[\000\201]\000\201[\000\201]\000\201+\000\201+\000\201+\000\201+\000\201-\000\201*\000\201*\000\201*\000\201*\000\201*\000\201+\000\201#\000\201#\000\201-\000\201A\134\207N\230\213+\000\201+\000\201+\000\201+\000\201(\000\201)\000\201(\000\201)\000\201^\000\201*\000\201>\000\201x\000\201K&\212<\000\201>\000\201<\000\201#\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201I\000\201#\000\201=\000\201:\000\201*\000\201*\000\201*\000\201*\000\201*\000\201/\000\201\134\000\201/\000\201\134\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\2010\000\201*\000\201*\000\201v\000\201*\000\201*\000\201^\000\201^\000\201*\000\201*\000\201^\000\201*\000\201*\000\201v\000\201v\000\201'\000\201*\000\201*\000\201*\000\201*\000\201*\000\201'\000\201*\000\201:\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201~\000\201>\000\201,\000\201*\000\2010\000\201|\000\201;\000\201=\000\201?\000\201v\000\201^\000\201i\000\201r\000\201o\000\201a\000\201e\000\201i\000\201o\000\201a\000\201NAK+\000\201*\000\201*\000\201|\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201#\000\201.\000\201<\000\201>\000\201#\000\201#\000\201(\000\201(\000\201(\000\201)\000\201)\000\201)\000\201[\000\201[\000\201[\000\201]\000\201]\000\201]\000\201{\000\201{\000\201{\000\201|\000\201}\000\201}\000\201}\000\201|\000\201-\000\201{\000\201{\000\201S\000\201S\000\201[\000\201]\000\201][\202/\000\201|\000\201|\000\201-\000\201-\000\201-\000\201-\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201'\000\201<\000\201Ab\207|\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\2013\000\2014\000\2015\000\201+\000\201-\000\201(\000\201)\000\201{\000\201}\000\201[\000\201]\000\201#\000\201#\000\201-\000\201#\000\201*\000\201*\000\201E\000\201Y\267\216D\222\210d\217\221i\276\223Q\364\214`\374\220Q\377\214U\307\215N\242\213Ah\207q\206\230<\000\201>\000\201^\000\201v\000\201Y\304\216U\323\215]`\217*\000\201*\000\201*\000\201*\000\201<\000\201"; -static const char b024[769] = "\377NULSOHSTXETXEOTENQACKBELBS\202HT\202LF\202VT\202FF\202CR\202SO\202SI\202DLEDC1DC2DC3DC4NAKSYNETBCANEM\202SUBESCFS\202GS\202RS\202US\202SP\202DELb\000\201_\000\201NL\202/\000\201?\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200<\000\201>\000\201]\000\201*\000\201*\000\201*\000\201:\000\201;\000\201<\000\201=\000\201%\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20211\20212\20213\20214\20215\20216\20217\20218\20219\20220\202(1)(2)(3)(4)(5)(6)(7)(8)(9)\002Q\204\002U\204\002Y\204\002]\204\002a\204\002e\204\002i\204\002m\204\002q\204\002u\204\002y\2041.\2022.\2023.\2024.\2025.\2026.\2027.\2028.\2029.\20210.11.12.13.14.15.16.17.18.19.20.(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\2010\000\20111\20212\20213\20214\20215\20216\20217\20218\20219\20220\2021\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\2020\000\201"; -static const char b025[769] = "\377-\000\201-\000\201|\000\201|\000\201-\000\201-\000\201|\000\201|\000\201-\000\201-\000\201|\000\201|\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201-\000\201-\000\201|\000\201|\000\201-\000\201|\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201/\000\201\134\000\201X\000\201-\000\201|\000\201-\000\201|\000\201-\000\201|\000\201-\000\201|\000\201-\000\201|\000\201-\000\201|\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201k\376\224l\021\224#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201^\000\201^\000\201^\000\201^\000\201]n\217>\000\201>\000\201>\000\201>\000\201>\000\201v\000\201v\000\201v\000\201v\000\201a\013\220<\000\201<\000\201<\000\201<\000\201<\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201(\000\201)\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201/\000\201\134\000\201/\000\201\134\000\201*\000\201#\000\201#\000\201#\000\201#\000\201#\000\201^\000\201^\000\201^\000\201*\000\201#\000\201#\000\201#\000\201#\000\201*\000\201*\000\201*\000\201*\000\201/\000\201\134\000\201\134\000\201m\215\225m\241\225s\332\233s\364\233/\000\201"; -static const char b026[769] = "\377An\207At\207N\254\213K/\212Az\207*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\2010\000\201180N\266\213@\000\201#\000\201p\252\227x\000\201X\000\201K8\212D\231\210W\000\201B\000\201KA\212*\000\201<\000\201>\000\201<\000\201KJ\212>\000\201v\000\201g\003\222Z\000\201U\337\215N\300\213+\000\201+\000\201a\032\220\002}\204+\000\201+\000\201i\320\223*\000\201*\000\201*\000\201A\200\207KS\212z\350\204DuiLi\202{Z\204XunKanGenKund\237\221N\312\213G\366\211:)\202*\000\201)\000\201(\000\201\360\323\207U\353\215>:\205N\324\213\360\332\207\303\374\206\304\002\206\360\341\207z9\205A\206\207D\240\210D\247\210D\256\210>Z\205A\214\207A\222\207K\134\212U\367\215N\336\213Ke\212D\265\210K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201k\000\201q\000\201r\000\201b\000\201n\000\201R\012\214D\274\210H\000\201D\000\201A\230\207S\000\201D\303\210Kn\212C\000\201R\025\214#\000\201#\000\201#\000\201#\000\201b\000\201#\000\201#\000\201+\000\201+\000\201*\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\201*\000\201G\376\211*\000\201*\000\201Kw\212R \2141\000\2012\000\2013\000\2014\000\2015\000\2016\000\201*\000\201*\000\201*\000\201*\000\201\360\350\207\304\010\206\360\357\207\360\366\207\371\266\210\304\016\206*\000\201*\000\201V\003\215D\312\210a)\220a8\220D\321\210H\006\211*\000\201?6\206*\000\201?;\206Y\321\216*\000\201>\000\201<\000\201H\016\211>^\205*\000\201*\000\201*\000\201*\000\201*\000\201l$\224*\000\201*\000\201Y\336\216Y\353\216*\000\201*\000\201*\000\201*\000\201D\330\210>b\205*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\20130\202150135D\337\210K\200\212*\000\201M\000\201K\000\201m\000\201k\000\201H\026\211Y\370\216*\000\201*\000\201l7\224w\000\201b\000\201#\000\201X\000\201*\000\201N\350\213?@\206*\000\201i\342\223*\000\201D\346\210K\211\212*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201v\000\201*\000\201X\000\201\134\000\201*\000\201*\000\201*\000\201\304\002\206*\000\201*\000\201*\000\201*\000\201*\000\201+\000\201]|\217D\355\210*\000\201*\000\201*\000\201*\000\201*\000\201K\222\212aG\220K\233\212?E\206A\236\207K\244\212#\000\201A\244\207N\362\213oE\226?J\206*\000\201*\000\201K\255\212*\000\201*\000\201"; -static const char b027[769] = "\377<\000\201<\000\201K\266\212<\000\201<\000\201g\024\222@\000\201@\000\201K\277\212K\310\212?O\206V\017\215:v:Z\005\216\134\000\201H\036\211/\000\201>\000\201N\374\213v\000\201g%\222X\000\201q\235\230x\000\201x\000\201+\000\201+\000\201+\000\201+\000\201A\252\207+\000\201+\000\201+\000\201]\212\217*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201K\321\212*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201p\300\227sC\232*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201O\006\213*\000\201*\000\201H&\211*\000\201*\000\201*\000\201*\000\201:x:*\000\201t\222\235#\000\201#\000\201#\000\201#\000\201K\332\212]\230\217g6\222*\000\201V\033\215|\000\201|\000\201|\000\201'\000\201'\000\201\042\000\201\042\000\201'\000\201\042\000\201P\000\201!\000\201i\364\223A\260\207*\000\201*\000\201*\000\201(\000\201)\000\201(\000\201)\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201(\000\201)\000\201{\000\201}\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\2021\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\2021\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\202>\000\201d\257\221gG\222m\265\225\134\000\201>\000\201/\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201V'\215>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201>\000\201R+\214>\000\201>\000\201>\000\201\134\000\201>\000\201/\000\201\134\000\201>\000\201/\000\201>\000\201>\000\201>\000\201>\000\201>\000\201?T\206^\000\201^\000\201T\000\201<\000\201>\000\201{\000\201}\000\201v\000\201\134<\202>/\202|\000\201/\000\201)\000\201\134\000\201^\000\201v\000\201#\000\201^\000\201w\000\201>\000\201<\000\201*\000\201*\000\201*\000\201T\000\201T\000\201#\000\201+\000\201-\000\201-\000\201-\000\201+\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201[\000\201]\000\201<\000\201>\000\201<<\202>>\202[\000\201]\000\201(\000\201)\000\201^\000\201v\000\201<\000\201>\000\201>\000\201<\000\201>\000\201-\000\201<\000\201>\000\201-\000\201<\000\201>\000\201<\000\201>\000\201~\000\201"; -static const char b028[769] = "\377 \000\201a\000\201,\000\201b\000\201'\000\201k\000\201;\000\201l\000\201@\000\201c\000\201i\000\201f\000\201st\202m\000\201s\000\201p\000\201*\000\201e\000\201:\000\201h\000\201in\202o\000\201!\000\201r\000\201^\000\201d\000\201j\000\201g\000\201ar\202n\000\201t\000\201q\000\201+\000\201ch\202en\202gh\202-\000\201u\000\201?\000\201v\000\201_\000\201sh\202ow\202ed\202ingx\000\201theand1\000\201wh\202.\000\201ou\202\042\000\201z\000\201`\000\201of\202|\000\201th\202w\000\201er\202#\000\201y\000\201]\271\204for{7}A\000\201\002\201\204B\000\201\002\205\204K\000\201z>\205L\000\201\002\211\204C\000\201I\000\201F\000\201zC\205M\000\201S\000\201P\000\201\002\215\204E\000\201zH\205H\000\201zM\205O\000\201\304\024\206R\000\201zR\205D\000\201J\000\201G\000\201\304\032\206N\000\201T\000\201Q\000\201\002\221\204zW\205z\134\205\304 \206za\205U\000\201\304&\206V\000\201zf\205\304,\206\3042\206\360\375\207\3048\206X\000\201\361\004\207\371\276\210zk\205\304>\206\304D\206\361\013\207\304J\206Z\000\201\361\022\207\371\306\210\304P\206\361\031\207W\000\201\371\316\210\361 \207Y\000\201\371\326\210\372\276\211{8}\002\225\204\002\231\204zp\205\002\235\204zu\205zz\205\304V\206\002\241\204z\177\205z\204\205\304\134\206z\211\205\304b\206\304h\206\361'\207\002\245\204z\216\205z\223\205\304n\206z\230\205\304t\206\304z\206\361.\207z\235\205\304\200\206\304\206\206\3615\207\304\214\206\361<\207\361C\207\371\336\210\002\251\204z\242\205z\247\205\304\222\206z\254\205\304\230\206\304\236\206\361J\207z\261\205\304\244\206\304\252\206\361Q\207\304\260\206\361X\207\361_\207\371\346\210z\266\205\304\266\206\304\274\206\361f\207\304\302\206\361m\207\361t\207\371\356\210\304\310\206\361{\207\361\202\207\371\366\210\361\211\207\371\376\210\372\006\210\372\307\211\002\255\204z\273\205z\300\205\304\316\206z\305\205\304\324\206\304\332\206\361\220\207z\312\205\304\340\206\304\346\206\361\227\207\304\354\206\361\236\207\361\245\207\372\016\210z\317\205\304\362\206\304\370\206\361\254\207\304\376\206\361\263\207\361\272\207\372\026\210\305\004\206\361\301\207\361\310\207\372\036\210\361\317\207\372&\210\372.\210\372\320\211z\324\205\305\012\206\305\020\206\361\326\207\305\026\206\361\335\207\361\344\207\3726\210\305\034\206\361\353\207\361\362\207\372>\210\361\371\207\372F\210\372N\210\372\331\211\305\042\206\362\000\207\362\007\207\372V\210\362\016\207\372^\210\372f\210\372\342\211\362\025\207\372n\210\372v\210\372\353\211\372~\210\372\364\211\372\375\211\373\006\212"; -static const char b029[769] = "\377>\000\201>\000\201<\000\201>\000\201-\000\201>\000\201<\000\201>\000\201v\000\201^\000\201^\000\201v\000\201<\000\201>\000\201<\000\201>\000\201>\000\201>\000\201^\000\201v\000\201>\000\201>\000\201>\000\201>\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201\134\000\201/\000\201\134\000\201/\000\201\134\000\201/\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201>\000\201gX\222lJ\224<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201-\000\201+\000\201<\000\201>\000\201<\000\201>\000\201=\000\201=\000\201=\000\201>\000\201<\000\201>\000\201-\000\201^\000\201-\000\201-\000\201|\000\201|\000\201-\000\201|\000\201-\000\201|\000\201<\000\201>\000\201^\000\201v\000\201<\000\201>\000\201^\000\201v\000\201<\000\201>\000\201^\000\201v\000\201<\000\201>\000\201^\000\201v\000\201<\000\201^\000\201>\000\201v\000\201=\000\201=\000\201=\000\201=\000\201<\000\201<\000\201>\000\201>\000\201|\000\201|\000\201>\000\201=\000\201~\000\201<\000\201>\000\201~\000\201<\000\201<\000\201>\000\201>\000\201<\000\201<\000\201>\000\201<\000\201v\000\201^\000\201|||*\000\201:\000\201{\000\201}\000\201(\000\201)\000\201(\000\201)\000\201<\000\201>\000\201[\000\201]\000\201[\000\201]\000\201[\000\201]\000\201<\000\201>\000\201<\000\201>\000\201>\000\201<\000\201[\000\201]\000\201:\000\201|\000\201>\000\201^\000\201^\000\201<\000\201<\000\201>\000\201^\000\201>\000\201>\000\201<\000\201>\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\201^\000\2010\000\2010\000\2010\000\2010\000\2010\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201<\000\201>\000\201*\000\201*\000\201/\000\201\134\000\201*\000\201o\000\201#\000\201#\000\201^\000\201^\000\201^\000\201^\000\201#\000\201<\000\201>\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201{\000\201}\000\201{{\202}}\202*\000\201*\000\201*\000\201*\000\201#\000\201<\000\201E\000\201#\000\201#\000\201#\000\201#\000\201#\000\201^\000\201^\000\201#\000\201#\000\201*\000\201*\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201:>\202\134\000\201/\000\201\134\000\201/\000\201\134\000\201++\202+++<\000\201>\000\201+\000\201-\000\201"; -static const char b02a[769] = "\377*\000\201+\000\201x\000\201.\000\201+\000\201^\000\201v\000\201M\000\201W\000\201X\000\201S\000\201S\000\201\002J\204S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201S\000\201><\202<\000\201;\000\201>>\202|\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201-\000\201-\000\201-\000\201-\000\201(+\202+)\202x\000\201x\000\201x\000\201x\000\201*\000\201(x\202x)\202x\000\201x\000\201/\000\201+\000\201-\000\201x\000\201-\000\201-\000\201;\000\201U\000\201^\000\201v\000\201v\000\201^\000\201^\000\201v\000\201X\000\2010\000\201X\000\2010\000\201w\000\201m\000\201v\000\201^\000\201^\000\201v\000\201*\000\201^\000\201v\000\201^\000\201v\000\201M\000\201W\000\201v\000\201^\000\201X\000\201^\000\201v\000\201^\000\201v\000\201^\000\201^\000\201^\000\201v\000\201v\000\201v\000\201<\000\201>\000\201=\000\201=\000\201#\000\201#\000\201~\000\201~\000\201~\000\201=\000\201=\000\201=\000\201=\000\201=+\202+=\202=~\202::===\202====\000\201=\000\201<\000\201>\000\201?<\202>?\202<=\202>=\202<=\202>=\202<=\202>=\202<=\202>=\202<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201=\000\201=\000\201<\000\201>\000\201~\000\201~\000\201=\000\201=\000\201=\000\201=\000\201=<\202=>\202=<\202=>\202=<\202=>\202=<\202=>\202~<\202~>\202<\000\201>\000\201<<\202>>\202<<\202><\202><\202<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201=\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<<\202>>\202<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201[\000\201]\000\201<\000\201>\000\201<\000\201>\000\201-\000\201-\000\201<\000\201>\000\201><\202><\202+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201-\000\201-\000\201|\000\201|\000\201|\000\201|\000\201||\202||\202||||||:\000\201<<<>>><=\202>=\202///|||//\202|\000\201|\000\201"; -static const char b02b[769] = "\377/\000\201\134\000\201\134\000\201/\000\201-\000\201R6\214K\343\212RA\214/\000\201\134\000\201\134\000\201/\000\201-\000\201|\000\201v\000\201^\000\201v\000\201^\000\201-\000\201-\000\201\134\000\201\134\000\201|\000\201|\000\201-\000\201-\000\201#\000\201l]\224lp\224-\000\201-\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201<\000\201>\000\201>\000\201<\000\201>\000\201>\000\201>\000\201<\000\201<\000\201<\000\201>\000\201v\000\201/\000\201\134\000\201?Y\206*\000\201*\000\201*\000\201*\000\201:o:*\000\201*\000\201*\000\201*\000\201/\000\201\134\000\201/\000\201\134\000\201>\000\201>\000\201<\000\201^\000\201>\000\201v\000\201-\000\201|\000\201\134\000\201/\000\201\134\000\201/\000\201<\000\201^\000\201>\000\201v\000\201>\000\201<\000\201<\000\201^\000\201>\000\201v\000\201\000\000\200\000\000\200\134\000\201/\000\201\134\000\201/\000\201<\000\201^\000\201>\000\201v\000\201-\000\201|\000\201-\000\201|\000\201-\000\201|\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201\000\000\200A\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201>\000\201<\000\201>\000\201^\000\201^\000\201v\000\201v\000\201<\000\201>\000\201<\000\201>\000\201^\000\201^\000\201v\000\201v\000\201<\000\201>\000\201<\000\201>\000\201^\000\201^\000\201v\000\201v\000\201^\000\201^\000\201*\000\201*\000\201*\000\201x\000\201x\000\201x\000\201*\000\201*\000\201*\000\201*\000\201*\000\201^\000\201v\000\201<\000\201>\000\201\360\341\207^\000\201v\000\201*\000\201*\000\201*\000\201*\000\201+\000\201?\000\201+\000\201z9\205z9\205z9\205z9\205*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201\305(\206z\331\205\002\261\204\305.\206\362\034\207\362#\207\372\206\210\372\216\210*\000\201*\000\201*\000\201*\000\201<\000\201^\000\201>\000\201v\000\201*\000\201*\000\201*\000\201V\000\201N\000\201Q\000\201N2\202100D3\202*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201#\000\201"; -static const char b02c[769] = "\377A\000\201B\000\201V\000\201G\000\201D\000\201E\000\201Zh\202Dz\202Z\000\201I\000\201J\000\201I\000\201G\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201R\000\201S\000\201T\000\201U\000\201F\000\201H\000\201O\000\201P\000\201ShtC\000\201Ch\202Sh\202U\000\201I\000\201E\000\201H\000\201Ju\202E\000\201E\000\201Jo\202Je\202O\000\201Jo\202Th\202U\000\201I\000\201A\000\201M\000\201Ch\202a\000\201b\000\201v\000\201g\000\201d\000\201e\000\201zh\202dz\202z\000\201i\000\201j\000\201i\000\201g\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201r\000\201s\000\201t\000\201u\000\201f\000\201h\000\201o\000\201p\000\201shtc\000\201ch\202sh\202u\000\201i\000\201e\000\201h\000\201ju\202e\000\201e\000\201jo\202je\202o\000\201jo\202th\202u\000\201i\000\201a\000\201m\000\201ch\202L\000\201l\000\201L\000\201P\000\201R\000\201a\000\201t\000\201H\000\201h\000\201K\000\201k\000\201Z\000\201z\000\201A\000\201M\000\201A\000\201A\000\201v\000\201W\000\201w\000\201v\000\201H\000\201h\000\201o\000\201e\000\201r\000\201o\000\201e\000\201j\000\201V\000\201S\000\201Z\000\201A\000\201a\000\201B\000\201b\000\201G\000\201g\000\201D\000\201d\000\201E\000\201e\000\2016\000\2016\000\201Z\000\201z\000\201E\000\201e\000\201Th\202th\202I\000\201i\000\201K\000\201k\000\201L\000\201l\000\201M\000\201m\000\201N\000\201n\000\201Ks\202ks\202O\000\201o\000\201P\000\201p\000\201R\000\201r\000\201S\000\201s\000\201T\000\201t\000\201U\000\201u\000\201Ph\202ph\202Kh\202kh\202Ps\202ps\202O\000\201o\000\201'\000\201'\000\201`\000\201`\000\201E\000\201e\000\201K\000\201k\000\201N\000\201n\000\201N\000\201n\000\201O\000\201o\000\201900900Sh\202sh\202Sh\202sh\202Sh\202sh\202X\000\201x\000\201H\000\201h\000\201H\000\201h\000\201H\000\201h\000\201H\000\201h\000\201H\000\201h\000\201H\000\201h\000\201J\000\201j\000\201Dj\202dj\202C\000\201c\000\201C\000\201c\000\201Ng\202ng\202Ny\202ny\202W\000\201w\000\201&\000\201MR.PR.z\336\205TR.\002\270\204CS.Sh\202sh\202J\000\201j\000\201n\000\201\000\000\200\000\000\200X\000\201x\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\134\134\202/.\202.\134\202//\202.5\202.\000\201'\000\201"; -static const char b02d[769] = "\377a\000\201b\000\201g\000\201d\000\201e\000\201v\000\201z\000\201t\000\201i\000\201k'\202l\000\201m\000\201n\000\201o\000\201p'\202zh\202r\000\201s\000\201t'\202u\000\201p\000\201k\000\201gh\202q'\202sh\202ch\202ts\202dz\202ts'ch'kh\202j\000\201h\000\201e\000\201y\000\201w\000\201x\000\201o\000\201\000\000\200e\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ae\202\000\000\200\000\000\200a\000\201b\000\201b\000\201g\000\201g\000\201dj\202dj\202d\000\201d\000\201d\000\201d\000\201e\000\201f\000\201k\000\201k\000\201k\000\201h\000\201h\000\201h\000\201h\000\201'\000\201x\000\201x\000\201q\000\201q\000\201i\000\201j\000\201j\000\201j\000\201l\000\201m\000\201n\000\201gn\202ng\202p\000\201u\000\201r\000\201r\000\201gh\202gh\202gh\202s\000\201s\000\201c\000\201t\000\201t\000\201tc\202t\000\201v\000\201w\000\201y\000\201z\000\201z\000\201z\000\201e\000\201o\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\000\201 \000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200loamoaroasoa\002\264\204boatoa\002\274\204noa\002\300\204'oazoadoa\001\367\204joa\002$\204\027Z\205\002\305\204poa\002\311\204\005\007\204\005\007\205\005\007\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200sheshushisha\014\036\204sh\202sho\000\000\200chechuchicha\013S\204ch\202cho\000\000\200zhezhuzhizha\000\017\204zh\202zho\000\000\200\000\002\204\000(\204\026)\204\001\001\204\026)\205ch'\027\000\204\000\000\200\002\315\204\002\324\204\026\302\204\002\332\204\026\302\205k'y\002\336\204\000\000\200kyekyukyikya\002\344\204ky\202kyo\000\000\200xyexyuxyixya\000\023\204xy\202xyo\000\000\200gyegyugyigya\002\350\204gy\202gyo\000\000\200b\000\201v\000\201g\000\201d\000\201zh\202z\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201r\000\201s\000\201t\000\201kh\202ts\202ch\202sh\202\000&\204f\000\201st\202a\000\201e\000\201dj\202u\000\201e\000\201yu\202ia\202e\000\201o\000\201io\202"; -static const char b02e[733] = "\363+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201*\000\201\134\000\201/\000\201#\000\201_\000\201_\000\201_\000\201,\000\201/\000\201/\000\201/\000\201>\000\201=\000\201!?\202/\000\201-\000\201~\000\201\134\000\201/\000\201~\000\201~\000\201[\000\201]\000\201[\000\201]\000\201[\000\201]\000\201(\000\201)\000\201((\202))\202:\000\201:\000\201::\202+\000\201?\000\201'\000\201*\000\201-\000\201,\000\201-\000\201,\000\201;\000\201+\000\201+\000\201+\000\201S\000\201--\202---.\000\201:\000\201|\000\201C\000\201=\000\201,\000\201\042\000\201-\000\201:\000\201.\000\201:\000\201.\000\201.\000\201;\000\201/\000\201+++,\000\201P\000\201;\000\201/\000\201+\000\201+\000\201&\000\201!\000\201?\000\201[\000\201]\000\201[\000\201]\000\201(\000\201)\000\201(\000\201)\000\201-\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002\354\204HanYi\202Yi\202Yi\202Renz\343\205Ji\202DaoDaoBu\202Jie\3621\204\3621\204\305`\204\305`\204\305`\204\305`\204Ji\202YaoJi\202Ji\202XinXin\002M\204Pu\202\000\000\200Wu\202Ri\202YueDaiWu\202Shi\3055\204\3055\204Huo\002\376\204\002\376\204z\350\205Niu\301\357\204Yu\202Pi\202Mu\202ShiShiZhuMi\202Mi\202\305`\204\305`\204\305`\204\305`\204\305`\204\360\350\204\360\350\204\360\350\204LaoYu\202Yu\202RouJiuCaoCaoCaoHu\202Yi\202Ya\202Ya\202{\240\204\003\002\204\003\002\204YanBeiZu\202Che\301\321\204\301\321\204\301\321\204Yi\202Jinz\355\205z\355\205z\355\205MenFu\202Fu\202Yu\202\003\006\204WeiYe\202\003\014\204FeiShiShiShiShi\002M\204Ma\202Gu\202GuiYu\202\003\025\204Lu\202Maiz\362\205MinQi\202Qi\202ChiChi\003\031\204\003\031\204GuiGuiGui"; -static const char b02f[757] = "\373Yi\202GunZhuPieYi\202JueEr\202TouRenEr\202Ru\202Ba\202z\343\205Mi\202\002\354\204Ji\202KanDaoLi\202BaoBi\202\003%\204Xi\202ShiBu\202JieHanSi\202YouKouWeiTu\202ShiZhiSuiXi\202Da\202Nu\202Zi\202\003+\204Cun\3621\204\305`\204ShiChe{_\204\305X\205\003=\204Ji\202JinGanYaoYanYin\003=\204Yi\202\003=\204Ji\202{_\204ChiXinGe\202Hu\202\002M\204ZhiPu\202WenDouJin\003%\204Wu\202Ri\202YueYueMu\202z\350\204ZhiDaiShuWu\202Bi\202MaoShiQi\202\3055\204Huo\002\376\204Fu\202Yaoz\350\205\003I\204Ya\202Niu\301\357\204\003P\204Yu\202GuaWa\202Gan\371\260\205\003]\204|\015\204Pi\202Ne\202Bo\202BaiPi\202MinMu\202MaoShiShiShiRouHe\202XueLi\202ZhuMi\202Mi\202Fou\305`\204\360\350\204Yu\202LaoEr\202LeiEr\202Yu\202Rou{x\204Zi\202ZhiJiuShe\305X\205\003c\204GenSe\202CaoHu\202z\367\205Xue\003g\204Yi\202Ya\202{\240\204\003\002\204YanGu\202DouShiZhiBeiChiZouZu\202\371\260\204CheXin{x\204\301\321\204Yi\202You\303\362\204Li\202Jinz\355\205MenFu\202Li\202\003p\204Yu\202\003\006\204Fei\003+\204Ge\202WeiJiuYinYe\202\003\014\204FeiShi\002M\204z\374\205Ma\202Gu\202Gao\003t\204Douz\355\205Li\202GuiYu\202\003\025\204Lu\202Lu\202MaiMa\202z\362\205ShuHeiZhiMin\003x\204Gu\202ShuBi\202Qi\202Chi\003\031\204GuiYue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201"; -static const char b030[769] = "\377 \000\201,\000\201.\000\201\042\000\201{\001\205-\000\201/\000\2010\000\201<\000\201>\000\201<<\202>>\202[\000\201]\000\201[\000\201]\000\201[(\202)]\202@\000\201=\000\201[\000\201]\000\201[(\202)]\202[\000\201]\000\201[\000\201]\000\201~\000\201\042\000\201\042\000\201\042\000\201@\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200O\020\213<\000\201<'\202/\000\201/'\202\134\000\201@\000\201XX\20210\20220\20230\202-\000\201\003\202\204p\326\227~\000\201#\000\201\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201e\000\201o\000\201o\000\201ka\202ga\202ki\202gi\202ku\202gu\202ke\202ge\202ko\202go\202sa\202za\202shiji\202su\202zu\202se\202ze\202so\202zo\202ta\202da\202chiji\202tsutsuzu\202te\202de\202to\202do\202na\202ni\202nu\202ne\202no\202ha\202ba\202pa\202hi\202bi\202pi\202fu\202bu\202pu\202he\202be\202pe\202ho\202bo\202po\202ma\202mi\202mu\202me\202mo\202ya\202ya\202yu\202yu\202yo\202yo\202ra\202ri\202ru\202re\202ro\202wa\202wa\202i\000\201e\000\201o\000\201n\000\201vu\202ka\202ke\202\000\000\200\000\000\200'\000\201`\000\201'\000\201`\000\201-\000\201-'\202\000[\204=\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201e\000\201o\000\201o\000\201ka\202ga\202ki\202gi\202ku\202gu\202ke\202ge\202ko\202go\202sa\202za\202shiji\202su\202zu\202se\202ze\202so\202zo\202ta\202da\202chiji\202tsutsuzu\202te\202de\202to\202do\202na\202ni\202nu\202ne\202no\202ha\202ba\202pa\202hi\202bi\202pi\202fu\202bu\202pu\202he\202be\202pe\202ho\202bo\202po\202ma\202mi\202mu\202me\202mo\202ya\202ya\202yu\202yu\202yo\202yo\202ra\202ri\202ru\202re\202ro\202wa\202wa\202i\000\201e\000\201o\000\201n\000\201vu\202ka\202ke\202va\202vi\202ve\202vo\202-\000\201\000\000\200-\000\201-'\202\003\210\204"; -static const char b031[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200b\000\201p\000\201m\000\201f\000\201d\000\201t\000\201n\000\201l\000\201g\000\201k\000\201h\000\201j\000\201q\000\201x\000\201zh\202ch\202sh\202r\000\201z\000\201c\000\201s\000\201a\000\201o\000\201e\000\201e\000\201ai\202ei\202ao\202ou\202an\202en\202angenger\202i\000\201u\000\201u\000\201v\000\201ng\202gn\202i\000\201e\000\201n\000\201\000\000\200g\000\201kk\202gs\202n\000\201nj\202nh\202d\000\201tt\202l\000\201lg\202lm\202lb\202ls\202lt\202lp\202lh\202m\000\201b\000\201pp\202bs\202s\000\201ss\202\000\000\200j\000\201jj\202ch\202k\000\201t\000\201p\000\201h\000\201a\000\201ae\202ya\202yaeeo\202e\000\201yeoye\202o\000\201wa\202waeoe\202yo\202u\000\201wo\202we\202wi\202yu\202eu\202ui\202i\000\201\000\000\200nn\202nd\202ns\202nz\202lgsld\202lbslz\202lq\202mb\202ms\202mz\202mh\202bg\202bd\202bsgbsdbj\202bt\202v\000\201pphsg\202sn\202sd\202sb\202sj\202z\000\201\000\000\200ng\202ngsngzf\000\201hh\202q\000\201\010\337\204\010\337\205yoi\013\335\205\013\335\204yuio\000\201oi\202\000\000\200-\000\201re\2021\000\2012\000\2013\000\2014\000\201A\000\201B\000\201C\000\201I\000\201II\202IIIIV\202a\000\201b\000\201c\000\201b\000\201j\000\201ji\202g\000\201e\000\201ennoo\202onnir\202anninnunnm\000\201ng\202\000C\204\000\231\204am\202om\202onginnp\000\201t\000\201k\000\201h\000\201v\000\201dl\202y\000\201k\000\201gw\202kw\202eu\202a\000\201T\000\201WG\202XG\202BXGSW\202HZZHZGHP\202\003\214\204\003\223\204HZT\003\244\204\003\260\204HZW{\006\204N\000\201H\000\201S\000\201P\000\201SP\202D\000\201HZ\202HG\202SZ\202SWZST\202SG\202PD\202PZ\202TN\202SZZSWG\003\267\204{\006\205PG\202Q\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ku\202shisu\202to\202nu\202ha\202hi\202fu\202he\202ho\202mu\202ra\202ri\202ru\202re\202ro\202"; -static const char b032[769] = "\377(g)(n)(d)(l)(m)(b)(s)()\202(j)\003\276\204(k)(t)(p)(h)\003\302\204\003\306\204\003\312\204\003\316\204\003\322\204\003\326\204\003\332\204(A)\003\336\204{\017\205\003\342\204\003\346\204\003\352\204\003\356\204\003\362\204\362*\207{\024\205\000\000\200(1)(2)(3)(4)(5)(6)(7)(8)(9)\002Q\204{\031\205{\036\205\3054\206\003\366\204{#\205\003\372\204\003\376\204{(\205{-\205{2\205\305:\206\004\002\204{7\205{(\205{<\205{A\205\004\006\204{F\205\305@\206\004\012\204\004\016\204{K\205\004\022\204{P\205\004\016\204{U\205WenYouWen{Z\20510\20220\20230\20240\20250\20260\20270\20280\202PTE21\20222\20223\20224\20225\20226\20227\20228\20229\20230\20231\20232\20233\20234\20235\202g\000\201n\000\201d\000\201l\000\201m\000\201b\000\201s\000\201\000\000\200j\000\201ch\202k\000\201t\000\201p\000\201h\000\201Ga\202Na\202Da\202La\202Ma\202Ba\202Sa\202A\000\201Ja\202ChaKa\202Ta\202Pa\202Ha\202\305F\206\004\026\204U\000\201(K)(1)(2)(3)(4)(5)(6)(7)(8)(9)\002Q\204YueHuo\3055\204Mu\202JinTu\202Ri\202ZhuYouShe\305;\204Te\202CaiZhuLaoMi\202NanNu\202ShiYouYinZhuz\374\205XiuXie{Z\205{_\205\362?\205XiaZuoYouYi\202\004#\204Xue{\240\204Qi\202Zi\202XieYe\20236\20237\20238\20239\20240\20241\20242\20243\20244\20245\20246\20247\20248\20249\20250\2021M\2022M\2023M\2024M\2025M\2026M\2027M\2028M\2029M\20210M11M12MHg\202ergeV\202LTDa\000\201i\000\201u\000\201e\000\201o\000\201ka\202ki\202ku\202ke\202ko\202sa\202shisu\202se\202so\202ta\202chitsute\202to\202na\202ni\202nu\202ne\202no\202ha\202hi\202fu\202he\202ho\202ma\202mi\202mu\202me\202mo\202ya\202yu\202yo\202ra\202ri\202ru\202re\202ro\202wa\202i\000\201e\000\201o\000\201{d\205"; -static const char b033[769] = "\377\000\350\211\000\340\205\0007\206areM\204\206`\036\204won\000\026\206\000\247\204\000\205\205ohm\016M\20647\205\004\034\207\010\246\206\0043\205\0041\204\010\317\2064\203\205\010\347\207\032\206\204\032\206\210\033\236\211\033X\210\010\361\204\010\361\2104\305\210\027 \205P$\204\023\330\206\002\366\205H\001\205\000\210\207\024X\210\000\210\205\000\210\204\022\351\205au\204E\377\206ton\003.\204AI\204\011C\207\006\013\207\005Y\205\000z\206\006\033\207\005r\205\002\364\204l\264\210:\310\205?\346\204\016w\206:\370\205\022\300\207\002\372\204\006=\207\016\257\205\005\177\205C\031\204\004@\204KK\205\004D\204honC\007\205o\037\204\010\134\204\021\372\205CJ\204Z\215\204L\366\204\0046\207\021\372\206\022\212\205\022\212\210\022=\204\022=\207\033\242\205\001\364\204\001\364\204\001\376\204\012y\205\004Z\204\005D\205\005\212\205rem\007\001\210\033\134\2040H\2021H\2022H\2023H\2024H\2025H\2026H\2027H\2028H\2029H\20210H11H12H13H14H15H16H17H18H19H20H21H22H23H24HhPada\202AU\202baroV\202pc\202dm\202dm2dm3IU\202\305L\206{i\205\305R\206{n\205\0029\204pA\202nA\202uA\202mA\202kA\202KB\202MB\202GB\202cal\004\033\204pF\202nF\202uF\202ug\202mg\202kg\202Hz\202kHzMHzGHzTHzul\202ml\202dl\202kl\202fm\202nm\202um\202mm\202cm\202km\202mm2cm2m2\202km2mm3cm3m3\202km3m/s\004\203\204Pa\202kPaMPaGParad\006\357\205\006\357\206ps\202ns\202us\202ms\202pV\202nV\202uV\202mV\202kV\202MV\202pW\202nW\202uW\202mW\202kW\202MW\202\004\212\204\004\220\204\000\262\204Bq\202cc\202cd\202\004\237\204Co.dB\202Gy\202ha\202HP\202in\202KK\202KM\202kt\202lm\202ln\202loglx\202mb\202milmolPH\202\003\021\204PPMPR\202sr\202Sv\202Wb\202V/mA/m1D\2022D\2023D\2024D\2025D\2026D\2027D\2028D\2029D\20210D11D12D13D14D15D16D17D18D19D20D21D22D23D24D25D26D27D28D29D30D31Dgal"; -static const char b034[769] = "\377Qiu|\015\204\000\000\200ZimKuaWu\202YinGauJap\003x\204Si\202TouYi\202\004\252\204ManNg\202Nou\004\256\204ZiuHo\202\004\272\204JauXieLouMaiDauNg\202Jau\004\320\204\004\324\204KeiFeiJyuNuoFauFu\202DanCo\202\003\217\204\000\000\200Xu\202\003g\204Si\202{s\205LiuLinz\374\205\003]\204Xin{Z\204DaiWu\202PanRu\202Ci\202Ma\202z\350\204Yi\202YinNei{x\205\003\014\204WunSau\004\330\204\004\334\204\003%\204Ao\202Wu\202Zuo\004\340\204\003c\204\004\352\204Su\202Yi\202{}\205{\202\205LeiNaoZhuShuZatCim\303\254\204Xu\202\004\365\204\004\371\204\371\260\204JieDieNuoSu\202Yi\202\003\031\204\004\377\204\005\005\204GinZik\262\005\204Lan\005\014\204Yi\202Li\202Ji\202Yu\202Luo\005\020\204NimGu\202BeiHunXu\202HuiRao\005\024\204\003c\204CamHanXi\202TaiYaoHuiJunMa\202Lue\005!\204Yao\002\376\204\005(\204Yu\202\004\334\204Er\202RanQi\202ChiWu\202Han\005!\204Se\202Si\202{}\205LeiSa\202Hon\236\353\204KuiPu\202Ta\202Shu\360\350\204Ou\202TaiSyu\003+\204Yin\005,\204Yu\202MieJun\003\025\204XieYou\250\000\204\0050\204Che\003\014\204LeiLi\202SinLuoSekJi\202\005:\204\000\000\200FuiJip\301\357\204ZikCai{\207\205Gu\202Mao\003\226\204GuaSuiDin\005I\204MaoMan\301\357\204ShiLi\202Buk\305`\204KouDu\202{Z\204\005P\204\217s\204Juk\002\354\204Huo\004\352\204\003=\204{x\205\005i\204Qinz\343\205Lu\202\003g\204CatNanXieMitBi\202JieSu\202\005\204\204\003=\204\003\226\204You\003g\204QiaPi\202\3607\204Fu\202LuoQiaQia\005!\204BaiGanCi\202\003P\204\005\230\204Fu\202Fu\202She\005,\204Li\202HuaTou\003I\204Di\202\005\253\204E\000\201QieYi\202\004\334\204Rui{\240\204\003=\204Chiz\367\205Xi\202Syu"; -static const char b035[769] = "\377Lue\005\262\204LinJueSu\202\3621\204ZanPutFeiZhu{\221\204{\240\204Zou{\252\204XieLi\202CimChiXi\202{\240\204GaaJi\202GaaFeiChu\005\005\204JieKitBa\202{\207\205\005\271\204SaiXiaBieJueLeiXinBai\360\350\204Lu\202BeiE\000\201Lu\202\005\275\204\005\304\204CheNuo\003P\204\005\313\204Yu\202\003\263\204GuiYi\202\003P\204\003=\204LouTi\202Le\202ShiPeiSunYaoz\374\204ZouWaiQueYinXi\202ZhiJiaHu\202La\202Yi\202Ke\202Fu\202QinAi\202\005\322\204Ke\202ChuXieChuWeiCin\005\326\204z\362\204Su\202YouCanJun\002\376\204Xu\202ShiSi\202{\276\204Kui\372\266\206He\202GaiYanQiu\371\260\204HuaXi\202Fan\003\247\204Dan\003%\204\003=\204Ao\202Fu\202Ne\202XueYouHua\005\204\204{x\204GuoN\000\201HuaLi\202Fa\202\3621\204Pou\005\204\204Si\202SiuWo\202Le\202LinYi\202Hou\000\000\200Xu\202Qu\202Er\202LouKeiXun\003\272\204SauDau\003\272\204NieWeiXieTi\202\005\335\204TunNieNieYin{Z\204GaaFu\202Gu\202\0050\204MeiWai\002M\204NuoYe\202Qi\202TouHanJun\004\352\204HunLu\202Ju\202Huo\005\357\204Sau|\015\204Lun\005\375\204\005\375\204Je\202JyuJyuManGe\202YanShiXuePen\256\371\204NiuDuoZe\202E\000\201XieYouE\000\201\371\260\205WenKu\202Hu\202Ge\202XiaManLueJi\202HouZhi\006\004\204GaaWai\006\010\204BaiAi\202\003p\204z\350\204GouDanBeiBo\202ChuLi\202\3621\204XiuGouPo\202ZyuCi\202\0050\204\005\335\204Ti\202Cu\202KuoLaoZhiXieXi\202PeiQieZhaXi\202\006\025\204Ze\202\006&\204Ji\202HuoTa\202YanXu\202Po\202Sai\0060\204Wai\006:\204GuoYe\202z\374\205XueHe\202"; -static const char b036[769] = "\377ZuoYi\202Ci\202Je\202\006G\204z\374\204Tai\006N\204Yi\202ZhiXi\202z\374\204Ju\202Ji\202HanDouPaoLi\202\004\371\204LanSaiHanYanQu\202\222\007\204YanHanKanChiNieHuo{\214\205Bi\202Xia\006Z\204\003P\204WanYouQinXu\202NieBi\202Hao\0050\204Ao\202Ao\202Jik{\214\205{Z\204TanJu\202\000\000\200ZuoBu\202JieAi\202\006a\204Ci\202Fa\202\000\000\200\006h\204ZoiJyuNieLiuMeiDui\006l\204Bi\202Bao\305`\204ChuXia|\015\204z\355\205GeiSukDuoWeiFu\202DuoYu\202Ye\202KuiWei\005\271\204JyuWeiYao\003\031\204\003g\204Bu\202ChiXieNie\005\230\204Yi\202\004#\204Man{\221\205XiaGunXieLauJi\202\006z\204Yi\202Ji\202Yin\006~\204Da\202Yi\202XieHao\003]\204Kanz\355\204Tai\005!\204ZhiBao\006\205\204Kuiz\355\204LeiSikXi\202HeiXi\202\006\214\204\006\220\204YunZi\202\003\031\204Fu\202\004#\204\006\227\204Gu\202Kai\005,\204HuaKui\006\233\204GaoTao\005\357\204{_\204LaiNieFu\202GaoQieBanJia\006\237\204Xi\202Yu\202\003p\204\371\260\204\301\321\204\3621\204Ji\202Nu\202\3621\204Yi\202Yu\202Yi\202Yan\371\260\204RanHaoSa\202JunYou\006\251\204XinPeiQiuz\355\204\000\000\200Bu\202\004\352\204Si\202Er\202Si\202MaoYunJi\202\000\000\200\006\214\204{s\205PaoChu\006\260\204NuoJieYi\202Er\202Duo\004#\204\006h\204JiuDuoNeiMauQieLu\202QiuSouCanDouXi\202\003\014\204Yi\202SuoQiePo\202Xin\3628\204XinYouBei\003\031\204Wun\006\270\204WanSauYunLi\202Ta\202LanManz\350\205\003c\204YanXi\202Lu\202Xi\202SaoFanFanWeiFa\202Yi\202Nao{x\205TanJi\202Shu\003I\204An\202KuaCha\006\302\204z\374\204Zhi"; -static const char b037[769] = "\377{\226\205Caa\003\014\204{\207\204XunXu\202Mi\202HuiMu\202\003]\204{\221\204Yi\202Nou\005!\204Xi\202YunShuFu\202Yi\202Da\202\006\311\204{\207\204CaoCanJu\202Lu\202Su\202NenAo\202An\202z\350\204\0060\204Cui\006&\204\006\327\204Ran{\327\204MaiXinYueNaiAo\202\371\260\204Ma\202\006\251\204\004\352\204LanXi\202YueZhi\006Z\204\006\333\204\006\205\204\003\025\204WanMi\202NieQu\202Zan{\207\204ZhiZi\202HaiXu\202Hao\003P\204Zhi\003+\204\256\371\204GouHei\256\371\204\006\337\204Zhu\002M\204\006z\204JiuXie\003x\204Jie\006N\204\006\351\204\003\217\204Ke\202Yao\006\373\204Yi\202\005\230\204\003]\204YinYanSu\202SikLinYa\202Mao\305;\204ZuiYu\202Yi\202GouMi\202JunWen\251|\204\007\014\204\3607\204\003\031\204Wu\202\003g\204Cui\006\214\204\003+\204\006\205\204QinSamWanDe\202Ai\202Cam\303\362\204Nou{\207\204JinYu\202\257\320\204ZuoBo\202HuiYaoTuiJi\202An\202LuoJi\202WeiBo\202Za\202Xu\202{\327\204Yun\251|\204Ba\202ZheJu\202WeiXieQi\202Yi\202XieCi\202QiuDu\202\003\025\204Qi\202Ji\202TuiCik\007\023\204\3607\204Lao{\221\204Zi\202FanYinCenJi\202HuiZi\202LanNaoJu\202QinDai\007\032\204JieXu\202\006&\204\003]\204DouChiTouMinz\362\205SuiKe\202Zu\202Hao{x\205XueNi\202Chi{\207\204An\202Mu\202Si\202z\374\205\360\350\204HuaCuoQiuLaoFu\202Dui\006\351\204\005\230\204TuoHan\006\351\204Bo\202QunQi\202HanGiu\003\031\204Bin\007\036\204Ze\202Qi\202ZanMi\202Pei{\221\204z\374\205\006\025\204\007\042\204Qi\202\007&\204Lu\202CamYunE\000\201\0070\204MinWei\301\357\204SouMinTu\202{\233\205\305;\204YaoJueLi\202\005\271\204\006\025\204\007:\204Da\202GouLaoLouz\350\204Ao\202\003t\204\003]\204\006\351\204"; -static const char b038[769] = "\377Dao\000\000\200Ao\202DikXi\202Fu\202DanJiuRun\3628\204Qu\202E\000\201Qi\202Ji\202Ji\202Hua\003\002\204Zui\003t\204\006\205\204BaiWeiYi\202Ao\202Yu\202HaoDuiWo\202Ni\202\007A\204\007H\204Li\202Lu\202\003\025\204\006\333\204Li\202{\226\205Lu\202\003\014\204Mi\202Yu\202\007O\204Ju\202\007V\204Hau{\221\204\006\260\204Yi\202GaaJi\202Bi\202JapRenz\362\205FanGe\202Ku\202JieShaHeiSi\202\3628\204\007:\204Zi\202Bi\202KuaLi\202z\362\205XunNuo\007O\204ZheWenz\374\204QiaYe\202MaoMok\007]\204ShuZin\006\214\204\007g\204KunWu\202\004\377\204\305X\206Ti\202{\207\204Bi\202Gou\006\351\204Xie\003\014\204LouZao{Z\205ChuMan\003\031\204JipYinPin{Z\205{\240\204\006\337\204NieYi\202GeiJi\202Ji\202\005(\204Yu\202Jiuz\362\204ZhiLa\202\005\357\204ZhiBenZhaJu\202Dan\006z\204Yi\202\002\376\204z\374\204ChiCi\202ChiYan\005\230\204Dou\003\031\204z\355\204JinTuiChaAi\202ChiAa\202\004\377\204ZheTouWaaTuiChaYao\004#\204\000\000\200Pan\006\214\204{\207\204QinLu\202Yan\007\014\204Su\202Yi\202z\355\204z\343\205{\240\205Bai\0050\204Zoi\004\352\204Go\202\007q\204HanDi\202Wu\202\006\302\204\005\335\204TouChi\005,\204Bi\202NeiXunLu\202SaiXieBi\202\004\365\204Bi\202Sanz\374\204RuiBieEr\202\007q\204Hau{Z\204BeiE\000\201Yu\202Qu\202ZanMi\202Yi\202Si\202\003\226\204Man\007x\204{_\204TaiMu\202\0050\204\303\362\204\006N\204\007\177\204Can\003x\204\007\211\204\004\330\204Wu\202\004\324\204Di\202\3628\204Ta\202\003g\204\007\023\204DuoXi\202Tao\004\371\204Ti\202{_\204{\240\204ZhiWeiYinGu\202Lamz\362\204\362?\205Qi\202\004#\204\005\024\204XieXieZe\202WeiMou\005:\204Ta\202{\221\204\006\373\204\007\215\204\0050\204XinYi\202RenShuCha\004\334\204"; -static const char b039[766] = "\376\005I\204\003+\204Ji\202\003%\204PeiAi\202FanAo\202QinQia\3621\204FenGan\006\214\204Ge\202\3628\204z\355\204YouGaoBenFu\202ChuZhu\004\330\204\003c\204En\202\004\272\204NinJuez\367\205Cha\006\237\204LieLi\202Yu\202{\245\205Yu\202HaiLi\202Hou\003=\204Ke\202\007:\204De\202HuiGiu{\012\205z\343\205ZuoFu\202QieBeiCheCi\202\006\351\204HanXi\202Qiuz\362\205\005\375\204Gip\004\320\204SanYanZhiDe\202Te\202Men\005\357\204\002M\204TuiCanDieChe\006\260\204Yi\202Ju\202Ji\202Lai|\015\204\007:\204\000\000\200CaiQi\202Yu\202{\207\204\006&\204ManGip\004\371\204Yu\202Ji\202WeiMi\202SuiXieXu\202ChiQiuHui\006\311\204Yu\202Qie\007\221\204\3055\204DuoLou\210R\204\003\247\204Tai\003c\204YinSaoFei{x\204\007:\204Yi\202HunSe\202Ye\202MinFenHe\202CikYinCe\202Ni\202Ao\202\003\014\204{\207\204z\355\205z\355\204Ma\202DieHu\202Lu\202Oi\202Yi\202HuaZhaHu\202E\000\201HuoSunNi\202z\374\204Li\202z\374\204Yan\003\031\204MenJinJi\202Jyu\303\362\204Yu\202Huo\005\014\204\004\320\204Mai\005\322\204Le\202JieWeiYi\202\003P\204Xi\202CanLanYinXieZa\202Luo\005\357\204z\350\204Huo{\240\204Wo\202ZoiZoiGe\202ZhuDie\003]\204Ji\202\360\350\204Ru\202Xi\202\372\266\206Yu\202Yi\202z\350\204Ji\202Qu\202|\015\204\002M\204z\350\204Mu\202JinMaoYinGaiPo\202\003P\204Mao\003%\204Ya\202\006\025\204\007\023\204HuiYu\202Gua\007\230\204LiuE\000\201Zi\202Zi\202Bi\202Wa\202\007\234\204Lie\000\000\200Bat\005\271\204MeiHaiYinZhuz\367\205z\374\204\003P\204So\202QiuPeiGuiEr\202\003=\204{}\205Hu\202LaoLi\202{x\204San\004\334\204Wo\202Pou\007\243\204Tun\006\260\204Te\202Ta\202\004\334\204\003t\204Gu\202Hu\202"; -static const char b03a[769] = "\377\002\354\204Zhi\004\352\204Dui\003c\204NeiLinPo\202Ji\202MinWeiCheGou\006l\204Ru\202TanBu\202\004#\204KuiLaoHan\004\377\204ZhiJie\003g\204XieXun{_\204z\350\204XieSu\202HaiMi\202HunPi\202\007\252\204HuiNa\202\007\023\204Ben\004\320\204Jiez\362\205Lan\251|\204Hu\202DouHuoGunYaoCe\202Gui{\240\204{\240\204DaoJinMa\202Hui\003+\204CanLuePi\202\360\350\204Ju\202Ju\202QueHukz\350\204\007\261\204CauJiuHuoYunDa\202\003P\204\3621\204FeiCe\202Ye\202HakDen\006:\204QinHuiTun\005\357\204z\350\205Xi\202Ni\202Sai\006\205\204\007\265\204LanHaoCi\202\005(\204Ao\202LuoMie\000\000\200Fu\202\000\000\200XieBo\202Hui\003\006\204XieZatHeiBo\202z\350\204Po\202\003\002\204JueKun\007\023\204Ju\202E\000\201Niez\350\204DieDiePeiQi\202ZhiQi\202\003p\204Ku\202Yu\202QinKu\202He\202Fu\202\007\277\204Di\202z\374\204GuiHe\202QunHan\3628\204Bo\202{_\204Bi\202Lu\202Ye\202Ni\202{\252\205San\005,\204Lu\202Tou{\207\204Ke\202San{Z\204{\252\205{\207\204Mao\210R\204z\350\204Kai\360\366\204\3621\204Bi\202ZhaYinXi\202{_\204Su\202Sa\202Rui\301\321\204Lu\202\005\357\204Cha\006\004\204z\362\204DauDauJiaBanHu\202Dou\000\000\200LouJu\202\007q\204Ke\202SuoLuoZhe\003x\204\0070\204ZhuYan\003\247\204ChaJi\202JyuJyu\007\032\204Yi\202Zin\241z\204YouHuiYaoYaoZhi\003=\204Qi\202Gen{\257\205Zi\202HouMi\202Fu\202Hu\202{\012\205TanDi\202TouYanBun\004\256\204Qu\202Manz\355\205\305;\204TaoBaoAn\202\007\307\204\004\371\204z\374\204\007\307\204Si\202Ci\202Mao\005\230\204NanBei{x\204\000\000\200Fei\003c\204Ji\202JieShuSikKunDieLu\202{\226\205\007\316\204"; -static const char b03b[769] = "\377{\264\205\007\322\204Yu\202Taiz\355\204ManMinz\362\204Wen\007\326\204z\362\204Hou\0050\204Bo\202z\374\204Li\202Jin~\266\204\006\351\204\007\335\204Hao\360\350\204Kaiz\374\204Su\202WeiCheXi\202Jin\007\177\204He\202Fen\007\261\204\005\357\204HeiDuiQi\202Pu\202YueBo\202\007\341\204HuiDieYanJu\202\003\002\204NanLieYu\202Ti\202|\015\204Wu\202\005\335\204\3621\204Hao\261\246\204\007\036\204{Z\205\005!\204z\362\205Fu\202\007\350\204\267\252\204TunSai\007\357\204\003\002\204\003=\204Xin\007]\204\007\367\204\007:\204JueHuaSik\006l\204MouCat\006\025\204Wei\007\211\204MeiSi\202\303\362\204Lu\202Qu\202Doi\305;\204Ge\202ZheLu\202Pai\006N\204QiuLie\003=\204z\374\204Xi\202XinMan\003\025\204Fu\202\007\373\204ZauXieLieFu\202Cuo\004\334\204Ba\202ZuoZheZuiHe\202Ji\202\006h\204{\240\204Din\007O\204\005\024\204Tu\202z\374\204Yan\005!\204Ta\202Di\202JueAngHan\3621\204Ju\202Wei\006l\204\003p\204Nie|\015\204NaiHapMauYou\003+\204ZinBuiNai\371\260\205ChaYanGenz\367\205\005\253\204JiaQinMaoE\000\201Li\202Chi\006a\204He\202Jie{\327\204\010\002\204{\012\204HouGai\005i\204BenSuoWu\202Ji\202Xi\202{}\205He\202\006Z\204z\374\204JieHunPi\202\371\260\204\004\320\204{Z\204Sau{\221\204\010\016\204Ji\202\007\023\204ZhiBenSouSinPun\005\230\204Bi\202\003P\204PeiDaiQi\202ZhiPi\202z\355\204Bi\202Su\202HuoHenz\343\205\305X\205{\240\205NenGu\202\003%\204{\271\205MikTa\202CuiXi\202De\202z\374\204{\202\204ZheTa\202Hu\202CuiLu\202\007q\204Lu\202z\350\204Pao{Z\204FanLi\202CaoQi\202CiuSukTi\202\005\357\204Qu\202{\207\204Lu\202Shu\003=\204ZhePaoJin\003\006\204\007\252\204\004\256\204\004#\204Pu\202Jin\003t\204{\240\204GunGoiBinZaoLie"; -static const char b03c[769] = "\377Li\202Luo\371\260\204\003+\204{\240\204Di\202Bei\000\000\200{\207\204\303\254\204z\374\204PinQue\003\031\204ZuiGouJue{_\204Xue\007\234\204XieHeiLanQi\202Yi\202NuoLi\202YueDinYi\202ChiJi\202\004\272\204Xie\007\243\204Zi\202He\202Xi\202Qu\202HaiXiaHaiGuiz\355\204XunXu\202\371\260\204KouXiaShaYu\202Ya\202PouZu\202YouZi\202{\207\204z\374\204XiaYi\202ShaYan\003\002\204Xi\202ChiShi\007\014\204YinHeiYi\202Xi\202Se\202JinYe\202YouQueYe\202\006\337\204Kun{Z\205\007H\204\004\365\204Ho\202\005\357\204Xie\003\263\204CuiXiuAn\202XiuCan\305X\205ZhaSeiYi\202Pi\202Ku\202\371\260\205\005\230\204TuiXi\202\005\357\204Qi\202Wo\202{\207\204Du\202MenLanWei\0070\204\005\271\204Ai\202ZaiHuiYi\202Mo\202Zi\202Fen\006\260\204\010\022\204Bi\202Li\202Lu\202LuoHai{Z\204GaiQue{Z\204\006\237\204{x\205JiuJueJi\202\005\357\204\004\256\204\360\366\204QueRui\301\321\204\010\026\204ZhiLouPaoGam\004\365\204Bao\006N\204z\374\204Lei\3621\204Fu\202Qu\202\000\000\200ShaZhiTan\006N\204Su\202\004\377\204MaoNai\303\362\204\000\000\200{\276\205\005!\204HanSao\006N\204\010\036\204\005\262\204Pu\202\003\002\204Tan\010\036\204Ran\006\373\204LieDieDie\362?\205SiuLu\202DanXi\202GuiJi\202Ni\202Yi\202{\327\204Yu\202\305`\204GuoZe\202YanCuiz\374\204\003\002\204TouFu\202Pei\010\042\204YouQiuYa\202Bu\202\303\362\204ShiZhaYi\202\303\362\204JauDuiLanYi\202\005\020\204z\367\205\003P\204Xu\202Yu\202Xiu\005\335\204\005i\204\005\204\204Ta\202GuoKiuLouSuk\003\031\204XieChe{\240\204TanPi\202Zan\003P\204z\374\204\003\025\204San\000\000\200{\303\205\004\330\204HakMi\202Ji\202NouHu\202Hua\305`\204YouZe\202Bi\202Mi\202z\350\205Xie"; -static const char b03d[769] = "\377FanYi\202TanLei\003]\204SiuJinSheYinJi\202\000\000\200Su\202Gu\202\010*\204Nai\305`\204\003+\204Su\202Yi\202\007\261\204Xi\202Ji\202LuoYouMaoZhaSuiZhi\303\362\204Li\202TouHau\0060\204{\264\205\005i\204Ji\202Cyu\006\214\204{\012\204Xi\202{Z\204\003]\204NieJunXieYaoXieZhi\010\026\204SamSi\202\003\031\204{x\204Mi\202QueDan{_\204MaiZipSyuSu\202XieBo\202\003x\204Zu\202\007O\204ShuSheHanTanGaoTimGu\202LamNa\202Mi\202XunMen{\240\204CuiJueHe\202FeiShiChe\371\260\204Nu\202\0102\204Man\000\000\200Fu\202Sin\005\024\204Yi\202\004\320\204MeiKu\202BaoLeiKe\202ShaBi\202SuiGe\202Pi\202Yi\202z\374\204Ni\202\004\377\204Zhu\256\371\204\003\014\204Xu\202\007\335\204Wu\202\006z\204\010:\204ZouZuo\303\362\204Yaoz\362\204PaiXiuSe\202Lei\003\006\204\3621\204\003\002\204Guo\005:\204MouYanXueZhu\005\313\204\004\377\204Xi\202Can\007\215\204{\207\204z\374\204z\362\204Yin\0050\204{\207\204{_\204\010:\204Bei{\240\204ShuFan\3607\204\007\215\204Ba\202Yu\202\000\000\200\0050\204\006\220\204LeiYi\202DaiGauz\355\204\010I\204GanJinNen\000\000\200JamPui\006z\204Mo\202YouSiuLiuHanBun\003]\204JinChiRen\010M\204\007\307\204Hip\005\335\204|\015\204\010X\204Ai\202Gua\003t\204Bo\202{}\205\007\252\204Shu\257\320\204Hui\010I\204Fu\202HuiE\000\201WeiFenTanZauLunHe\202\003]\204Hui\000\000\200Yu\202\004#\204YanQiu\002\376\204z\343\205TaiZin\005P\204BouJikDatHauTuiLinz\343\205Zha\003g\204Hu\202\007H\204Xu\202\251|\204\010X\204HeiCui\003\006\204Mo\202\010X\204Zao\005\005\204Chi\005\204\204\004\256\204YanGe\202Mo\202Bei\007q\204Die\002\376\204\010c\204Wu\202YanSinJuez\374\204"; -static const char b03e[769] = "\377TaiHan\004\365\204\3607\204Ji\202JieKao\010k\204ZiuXieLaiFanHuoXi\202NieMi\202Ran\007A\204YinMi\202HonJueQu\202\3628\204WanZheLi\202\360\366\204\006\237\204z\374\204ZheZhi\007\036\204ShuBeiYe\202\003I\204z\355\204Hu\202KenJiuAn\202\256\371\204z\350\204BeiBa\202FenKe\202TuoTuoZuo\005\357\204SekGuiYanShiHouLieShaSi\202\010X\204BeiRenDu\202Bo\202{\207\205z\350\204FeiJi\202\004#\204HuiHe\202Li\202\007:\204YueXiuz\355\204Di\202LeiJinz\367\205Si\202Pu\202Yao{\240\205z\362\204z\362\204TaoRu\202\006Z\204\004\377\204RaoYinShiYinJueTun\003P\204Jia\362?\205QieZhu\005,\204\000\000\200You\004\340\204\006\302\204Yi\202ShiYi\202Mo\202\010r\204{\257\205Que\3621\204Wu\202\007\277\204\004\377\204\005P\204ShiNi\202\007\277\204Ta\202Wo\202Ju\202z\355\204\007\335\204\004\334\204Hu\202NaoYanGouYu\202HouBanSi\202ChiHu\202\360\350\204\006Z\204z\374\204Pin\006N\204LouLao{_\204\3621\204Ze\202HaiFanHanz\355\204{\221\204SatTa\202Zhu\010M\204HanYu\202\004\334\204YouLi\202HuoXi\202z\374\204z\355\204{\207\204HiuSi\202JiuPu\202Qiu\003=\204Zi\202Yu\202\005\275\204Si\202\007\357\204NiuMeiBa\202JiuDauXu\202\0102\204\303\362\204MaoFatPatPei{\310\205Yi\202Yu\202\003\263\204\0102\204Qu\202BaoHui\251|\204\010v\204HauBu\202\006\351\204La\202Tu\202Wu\202Li\202\005\357\204\007\307\204Ji\202JunZouDuoJueDaiBeiSamJuk\003\247\204Ji\202\005i\204La\202BinSuiTu\202XueSi\202SamGikJauJyuDuo\251|\204GimSuiBi\202Tu\202Se\202CanTu\202\003+\204JinLu\202Lei\301\376\204{\221\204Bi\202Ji\202Zen\003P\204Li\202\210R\204\010}\204Sui\003]\204Shu"; -static const char b03f[769] = "\377\010\204\204Ji\202E\000\201\010\214\204Gei{\257\205\0050\204{}\205Luo{Z\204TunGu\202Yu\202LeiBo\202Nei\003I\204{\207\204\005!\204{\207\204Wen\010\220\204Li\202\005P\204Wa\202\003c\204\006\025\204\003g\204AngFan\006\260\204Bo\202TuoShuYi\202Bo\202QieTou\003=\204\3628\204Han{x\205Jiez\362\204\003g\204\3607\204\005\020\204\004\352\204Pi\202\005\253\204Lie\371\260\205Ou\202Di\202Yu\202\305X\205\006N\204\007\014\204\005!\204\006&\204\007\335\204\305X\206Lu\202\3628\204{Z\205Li\202Sa\202PanSi\202\010\220\204\010\220\204Hu\202Yi\202z\374\204XieLuoLiuHamTanGan\000\000\200Tan\010\230\204San\007\215\204YouNanDin\006\025\204JunChiGouWanLi\202LiuLieXiaBeiAn\202Yu\202Ju\202RouXunZi\202CuoCan\010\243\204\003]\204Fu\202\005\253\204\010*\204Xi\202Shu\003\002\204\003\002\204Xu\202{\221\205\004#\204Gei\3055\204{x\204FanJi\202ZhiJanGu\202Wu\202CuiQieShuHaiTuoDu\202Zi\202RanMu\202Fu\202\005\357\204Ji\202Xiu\003P\204NaiYa\202JieLi\202Da\202Ru\202\007:\204Lu\202\371\260\204Li\202{\207\205\007\277\204XinXieQinQieCheYouBu\202{\202\205QueAi\202Qinz\350\205ChuPeiKuoYi\202\007\230\204\371\260\205\003I\204\003\272\204\003c\204z\362\205HuiHu\202Bei\010\257\204Zi\202ZhaJi\202Gu\202Xi\202Gao\005\020\204Ma\202ZhuTui\003p\204z\374\204\005\230\204\010\263\204Hiu\007H\204ZhiAi\202z\374\204GuoXi\202\000\000\200TuiCanSaoz\374\204JieFenQun\010\272\204YaoDaoJiaLeiYanLu\202Tui\004\377\204Pi\202LuoLi\202Bie{\264\205MaoBaiz\362\205DauYaoHe\202\256\371\204He\202\006\373\204\004\320\204Li\202\005!\204z\362\204Bi\202Ba\202Che\360\350\204Da\202Ao\202Xue\000\000\200Zi\202Da\202Ran\006l\204CuoWanTa\202BaoGanYanXi\202ZhuYa\202"; -static const char b040[769] = "\377FanYouAn\202Tui\006\205\204SheJinGu\202Ji\202\006\214\204\003\002\204YanXi\202Kan\003+\204\003P\204{_\204Wo\202z\350\204z\362\204Ren{Z\204|\015\204JueXieQi\202AngMeiGu\202BeiTaoFanJu\202z\355\204\007\221\204Bi\202Mao\010\016\204Gu\202\005\335\204HuaLuo\004\272\204Jia\301\357\204Gaiz\362\205Bu\202Gu\202\003\014\204Mu\202Ai\202\004\377\204\007\221\204{\207\205JieChiJie\004\320\204\0102\204{x\204YanDu\202Di\202Dai{\207\205z\374\204\003t\204\003g\204\006\205\204Ye\202Mi\202Qi\202Qi\202Wo\202XieYu\202Qia{x\205Yao\004\377\204\360\350\204Ji\202\004#\204\003P\204MinLouKaiYaoYanSunGuiz\362\205\004\377\204\371\260\205Cha{\207\204Sim\003P\204\305X\205CheNi\202Qu\202\005\014\204HuoYu\202{\221\204Hu\202\007\177\204\003t\204z\350\204Xi\202{\240\205KouMai\006\351\204{\221\204\303\362\204Ji\202Jue\006\220\204Bi\202Shi\010\016\204Mo\202LieMieMo\202Xi\202z\355\204Qu\202\003\002\204Huoz\374\204Xu\202Niu\3628\204HouYu\202Jauz\367\205Bo\202\010k\204\005,\204\004\334\204Ji\202Qia\007\042\204\003g\204HuiShiKu\202\000\000\200DuiYaoYu\202\006l\204JieZheJiaShiDi\202\004\352\204Ci\202Fu\202Min{Z\204{Z\204CikYan\006\214\204\004\272\204\003=\204\006\214\204Lue\007\230\204La\202RuiFa\202CuoYan\003=\204Jie\007\230\204GuoSuoWo\202{Z\205Nie\005,\204LaiTa\202CuiYa\202Gun\005I\204\006\311\204Di\202Kei\003+\204JieMinJu\202Yu\202{Z\204\002\376\204Zha\003g\204DatBanHe\202Gou\005\335\204LaoWu\202Bo\202\007\243\204Lu\202Cu\202{\207\204Yi\202\006\214\204Shu\006\302\204\003P\204JinQinHuiSu\202\305X\206Dun\003\031\204{\315\205NaoTanDanWeiGanDa\202Li\202Ca\202z\374\204PanLa\202Zhu\003\025\204\006\333\204\004\377\204z\374\204LanMo\202Ba\202BukGuiBi\202Fu\202"; -static const char b041[769] = "\377HuoYi\202Liu\360\350\204Yin\007q\204Huo{x\205DouE\000\201Zi\202Yan\003p\204ZhaQi\202Yu\202\301\357\204HuoNiez\362\205Ju\202SheJyu\251|\204\006\260\204\305;\204CaoLouLi\202\305X\206ZaiCui{_\204DanQi\202SukLai\005\357\204\006z\204\007\357\204Yu\202Yi\202\005,\204Qi\202Yi\202{\327\204Fu\202{\240\204Ya\202\003%\204Ruiz\374\204\010\042\204LaiBi\202ShiPo\202{\327\204ZhiTao|\015\204|\015\204Ru\202Yi\202LieAn\202He\202{}\205Li\202GuiZi\202Su\202\007:\204Ya\202ChaWan\007q\204\005P\204YouHui{\240\204Rui\006\351\204Ju\202Zi\202Ju\202An\202SuiLaiHun\301\357\204z\355\205Duo\006\237\204Ne\202CanTi\202Xu\202Jiuz\362\205Qi\202JieMaoYan{\264\205ZhiTui\220\206\204Ai\202\003\247\204\010:\204\005!\204En\202HunQi\202ChuSuo\004\334\204NouTu\202\371\260\204Lou\003t\204Li\202ManXinCenz\362\205MeiGao{\207\204Dao{\221\204Zi\202Cou\010X\204ZhiBa\202CuiQiuKai\003\031\204z\374\204FeiGuo{x\205JiuE\000\201z\367\205Yue\005\335\204YaoYa\202Yao\3628\204ZhaYouXueYaoKe\202z\362\204\005\230\204Yue{x\204\010v\204\010v\204\371\260\204Wo\202\006\373\204\305;\204\005\335\204\305X\206Yun\003P\204Jin\004\334\204Yu\202Tan\007\014\204{}\205\003\263\204{x\205JiuXue{Z\205z\367\205Pan\006\214\204\000\000\200Qu\202LanYi\202\006N\204Si\202z\350\204Si\202HatFa\202Sap\006\205\204Hua\010\276\204{\257\205Hai\006\214\204ChuQueDuiLi\202Ba\202JieXu\202Luo\004\365\204Yun\362?\205Hu\202YinPokZhiz\350\204ZimGan{\240\204ZhuZhuKu\202NieRuiZe\202AngZhi\003=\204Yi\202ChiJi\202ZhuLaoRen\006N\204{Z\205Na\202Ce\202ZinSaiYi\202JueBie{x\205JunDouWeiYi\202ZheYanCuk"; -static const char b042[769] = "\377SanLun\0102\204\002\376\204HanYu\202Dai\002\376\204FeiSha\005\357\204Ta\202Qu\202\006\351\204Ye\202BaoGuiGuaNanGe\202GaaShiKe\202SuoCi\202\003c\204Tai\005\271\204QinXu\202Du\202Ce\202z\362\204\006&\204Sai{Z\205z\350\204Jin\004#\204Wei\006\270\204GimXi\202Na\202Pu\202SouJu\202{Z\204\360\366\204TaoBanTa\202z\350\204\006Z\204\006N\204LuoHu\202Sou\362?\205Pu\202MieJin\360\366\204Mi\202Shu\005\357\204Lei{\240\205\006G\204Zhi\005,\204\010\305\204SanGu\202FanMeiSui{\240\204\005!\204XieKu\202Wu\202FanLuoCan\007\177\204\005\357\204Yi\202\006&\204Yun\006\205\204Yu\202ZhiYi\202DanHuoWeiTanSe\202XieSou\007\023\204z\350\204LiuYi\202Au\202LeiLi\202FeiLieLinz\374\204\3621\204Ou\202Mi\202z\374\204\010\314\204\372\230\205\372\266\206Yan\303\362\204\005\357\204\005\335\204Qi\202\006z\204BanBi\202Hu\202Hu\202\000\000\200Ce\202Pei{}\205\305;\204JiuBu\202MeiSanWei\004#\204BeiLi\202\301\357\204SamHunz\374\205\007H\204Shi\004\377\204\000\000\200Nanz\362\205JiuYan\005\322\204Sa\202\007\265\204XieZheMenXi\202Man{\271\205z\362\205Tan\3621\204Ye\202Bi\202LuoFanLi\202Cui{\252\204DaoDi\202{\202\205Chuz\374\204z\355\204Mi\202z\350\204Qiu{Z\204Zi\202\000\000\200CinHu\202GanChi\007\230\204Mu\202Bo\202Hua\007\277\204YaoMao\305`\204\010\325\204Wu\202JikRu\202Xue{Z\205Min{\240\205O\000\201{\221\204ZuoYueLieSyu\003c\204Bi\202RenYu\202Gin\301\321\204Er\202Yi\202Mi\202\003\006\204\000\000\200\305`\204Ji\202Bu\202SyuBieFanYueLi\202FanQu\202Fu\202Er\202E\000\201{Z\205|\015\204Yu\202JinQi\202Ju\202LaiCheBeiNiuYi\202Xu\202MouXunFu\202CauNin\005P\204\005\005\204ZhaWei"; -static const char b043[769] = "\377Ke\202YaoOu\202\3621\204\007\277\204\005!\204GuiHuiTa\202\003=\204YaoDa\202Qi\202JinLueMi\202Mi\202{\240\204Lu\202FanOu\202Mi\202JieFu\202Biez\362\205Su\202YaoNieJin{\207\204Bo\202{\240\204Ti\202\005\357\204\010k\204ShiYinDao\004\320\204Ca\202MieYanLanz\367\205\003\002\204\372\266\206\301\357\204NieLuoFanShiLuoZhuZi\202\004\320\204\007q\204z\343\205Er\202Yi\202RuiCaiRenFu\202LanSuiYu\202You\3607\204\005\357\204ZhuTa\202\0102\204\005(\204\003\002\204\257\320\204Bu\202KouCun\251|\204HanHanMouHu\202\003=\204Di\202Fu\202\003P\204Mi\202Mei\005\230\204Gu\202\002\376\204Ta\202Yu\202\004#\204Li\202Lu\202Wu\202LeiJi\202Li\202Li\202\004#\204Po\202\360\350\204Wa\202Tuo\006\260\204\004#\204\002\376\204Gui\000\000\200Xu\202NaiQueWei{Z\205\004\352\204WeiBo\202Zinz\362\204\003P\204ZanLi\202Yanz\362\205XueHu\202BaoRan\3621\204Po\202\006z\204\003c\204Yi\202Xu\202LuoKaoChuFu\202Na\202Han\010I\204Lu\202{\221\204Ta\202Fu\202\005\335\204\010\243\204\006\214\204Su\202Pin{\012\204LouHunChuZe\202Er\202Er\202\005\253\204Qi\202Si\202Ju\202\010\331\204Yan\006l\204Ye\202Zi\202Ne\202\305X\206Ba\202CaoTi\202HanZuoBa\202ZheWa\202\007\277\204Bi\202Er\202ZhuWu\202WenZhi\003c\204Lu\202WenGunQiuLa\202ZaiSou\003+\204Di\202Qi\202Cao\007\335\204{\207\204Shi\003\031\204Su\202Qi\202\007:\204\003\014\204Xu\202JueDi\202\003I\204{\012\204NiuRen{Z\204GaiPi\202Tan\010I\204\256\371\204He\202\372\230\205Mo\202BieQi\202ShiBi\202JueSi\202\010}\204GuaNa\202HuiXi\202Er\202XiuMouZyuXi\202ZhiRunJu\202DieZhe\360\366\204\006\205\204Bi\202HanYu\202z\374\204\003\247\204\010\026\204CanBu\202\010\344\204Qi\202"; -static const char b044[769] = "\377Ji\202\004\334\204Lu\202Junz\374\204Xi\202CaiWenZhiZi\202Kun\006&\204|\015\204ChuDi\202\256\371\204QiuZheZhaRouBinJi\202Xi\202ZhuJueGe\202Ji\202Da\202{x\204SuoRuoz\374\205z\362\205Qi\202ZhuSun\005\020\204\006Z\204Ke\202KaoGu\202GaiFan\006&\204CaoZhiz\355\204LeiXiu\005(\204ZheYu\202Gui\003=\204ZanDanHuoSouTanGu\202Xi\202ManDuoAo\202Pi\202Wu\202Ai\202\006\205\204Pi\202\006\205\204\360\350\204ZhiBo\202\004\377\204Wei\010\314\204LanYanz\355\204\301\357\204{Z\204Pu\202DouTaiFeiShuZit\010\220\204CuoTan|\015\204ChiTa\202Jia\007\221\204z\362\205\006z\204Caa\000\000\200{x\204JinE\000\201GouFu\202DuoGu\202E\000\201\005\005\204TaoDi\202Do\202Di\202Bu\202Wan\002\376\204LunQi\202Mu\202z\350\204Gin\004#\204Sou\000\000\200You\003c\204Ta\202ZekSu\202Bu\202Xi\202{\240\205CaoFu\202\005\326\204CheFu\202FeiWu\202Xi\202\360\350\204\305;\204\003\247\204\006\351\204\010\356\204\006\205\204Cao\007\036\204KaiBai\3621\204XinQi\202\004\365\204\006&\204\360\366\204z\362\204Niu\3621\204{x\204Dan\003\014\204YinAngRanRi\202ManFanQu\202ShiHe\202\303\362\204DaiMo\202\005\262\204\003=\204\251|\204{\202\205\007H\204ChaDuoYouHaoTinGuaXueLeiJinQi\202Qu\202\305`\204Yi\202\006z\204Gat\010\220\204YanYi\202YinQi\202ZheXi\202Yi\202Ye\202Wu\202ZhiZhiHan\301\321\204Fu\202\256\371\204\0102\204\005\271\204\004\320\204\006h\204Tuo{}\205\006&\204GaoKuaQu\202Qu\202Zhi\006\205\204Li\202\003c\204Ta\202ZhiGu\202{\207\205Hu\202La\202\3607\204Ci\202\004\377\204Zi\202\000\000\200Qi\202\004\334\204ChaMaoDu\202Yin\005\020\204RuiHen\005\253\204Fu\202Lai\003g\204{\240\204Yi\202MeiKau\006\351\204Ji\202SuoHan"; -static const char b045[769] = "\377\004\365\204Li\202Zi\202Zu\202YaoGe\202Li\202Qi\202\003=\204Li\202\002\354\204SuoGouDukSu\202\004\320\204{\240\204XieBeiXu\202\0050\204Pu\202\005\357\204z\374\205Zuo\005,\204\256\371\204\003\006\204Nan\005(\204Lu\202Yi\202\360\366\204Yu\202HuaLi\202Pa\202SiuMuiLi\202UngCik\372\266\206So\202Yi\202\006\373\204Si\202Ku\202Fu\202Yi\202\005\262\204RanCe\202\011\000\204Ti\202Qin\003t\204SuiWeiDunSe\202Ai\202Qi\202Zun{\202\204Fei\251|\204Yin\007H\204SaoDouHuiXieZe\202Tan\005!\204ZhiYi\202Fu\202E\000\201FukJunJiaChaz\374\204Man\241z\204Bi\202\005\357\204JieKuiJia\010\272\204{x\205\005\230\204\003g\204FeiLu\202ZhaHe\202Ji\202Ni\202\004\377\204\3621\204\005\326\204LaoZe\202Kui{\322\205z\350\204Ju\202\007\335\204FanTouLinMi\202\004\334\204XieHu\202Mi\202JieZa\202\006&\204Li\202RanZhuYinHanHiuYi\202\006\337\204YueRan\005\357\204{\327\205Yu\202Nue\006\233\204Yi\202NueYi\202z\350\204XiaChuYinMi\202Xi\202Na\202KanZu\202XiaYanTu\202Ti\202Wu\202SuoYinz\367\205\003c\204\006\351\204\007:\204Nu\202\005\014\204ZaoWanLi\202Qu\202Na\202ShiBi\202Zi\202\006l\204\011\007\204\007q\204z\374\205KuiPai{\202\205XunZhaYaoKunHuiXi\202E\000\201\360\350\204\007\036\204YouJueLi\202\251|\204Li\202{x\205Ji\202Hu\202{\221\204Fu\202z\355\205{\012\204Ju\202\006\205\204z\355\205TanMou\003g\204Li\202YanSouShiYi\202\002\354\204\006&\204HouWanDi\202Ji\202Ge\202HanBo\202XiuLiuCanCanYi\202\003P\204YanZaoHan\003]\204\004#\204\010X\204\007\014\204Yu\202Qi\202ZheMa\202\010X\204\301\326\204\372\266\206Jin{\012\204Pu\202Lin\010\220\204\005P\204{\240\205La\202Yi\202\003]\204Ci\202YanJieXunWeiz\374\204\006\373\204"; -static const char b046[769] = "\377Fu\202Ge\202ZimMo\202ZhuNaiz\374\204WenLi\202CanMie{\240\204Ni\202\005\020\204WanXu\202Nu\202MaiZuiKanKa\202\004\272\204\0060\204\000\000\200Yu\202WeiZhuGeiGanYi\202Maa\005,\204Fu\202Bi\202ZhuZi\202ShuXiaNi\202{\303\205\003\002\204Xunz\367\205Nou\006N\204Zhi\010\230\204\000\000\200{_\204Yu\202ZamJin\004\371\204Lu\202HanBieYi\202Zui{\221\204Yu\202WanNi\202{\012\204Jue\005\005\204Can\004\371\204DuoQi\202YaoKui\005\253\204HouXunXie\241z\204KuiFeiXieBo\202Ke\202CuiXu\202BaiOu\202\004#\204\006l\204Ti\202ChuChi\003\025\204{\012\204\003\014\204Xie\005\262\204WeiJueKui\010\243\204Sa\202Duo\005\357\204\006\205\204FanGuo\006\205\204\003\031\204Kei\004\377\204Hin{\012\204Cu\202Li\202Du\202Cin\003t\204z\350\204Xi\202\011\013\204De\202De\202z\374\204{\207\204Ci\202\360\366\204XieShiWeiCamCamHe\202YouLu\202Lai\004\377\204\371\260\205\007q\204Qi\202{\240\204YunGouQi\202\006&\204LinJi\202Mai\305X\206{\327\204BinLi\202\005\357\204\006\025\204{x\205\003P\204z\374\204Hu\202Bi\202Zu\202DaiDaiHunSaiCheTi\202JyuNuoZhiLiuFei\003\002\204{\012\204Xi\202Lin\003P\204\007\357\204TaoPi\202Xin{_\204ZhiWa\202Tou|\015\204Yi\202XiePi\202YaoYaoNu\202HaoNinYinFanNanYaoWan\007:\204Xia\003c\204\007:\204Shi\003+\204Xi\202Ji\202TaoFeiXueNi\202Ci\202Mi\202\303\362\204\011\017\204Na\202Yu\202E\000\201ZhiRenXu\202LueHuiXunNaoHanJiaDouHuaTu\202\0102\204Cu\202Xi\202\007\023\204Mi\202XinWu\202{}\205{\221\205Tao\003g\204JiuJu\202HunTi\202ManYanJi\202\002M\204LeiWanCheCanJieYouHuiZhaSu\202Ge\202"; -static const char b047[769] = "\377NaoXi\202HouDuiChiWeiZheGun\010I\204ChiZaoHui\006\337\204\006z\204LaoTuoHuiWu\202Ao\202SheSuiMaiTanXin\0050\204An\202Ta\202z\355\204Wei\007\265\204Ji\202{x\204CheYu\202z\374\204Xin\005\204\204\007x\204\236\353\204Nao\301\326\204YanQiu{\240\205\007\023\204Jun\006z\204Ju\202HouManLie\010\042\204ChuChiz\374\205QinMeiShu\005\020\204ChiGu\202Yu\202YinSyuLiuLaoShuZhe\372\266\206HuiFatFuiE\000\201\011\026\204Sha\004#\204JueJun\007\265\204LouWeiz\367\205ZhuLieFunZhe\002\376\204\000\000\200Yi\202ChuNi\202Bo\202\011\032\204Yi\202HaoYa\202z\362\204ManManQu\202LaoHao\362?\205Minz\374\204{Z\204ShuZuoZhuGou\003P\204Yi\202ZhiXieJinCanZaiBu\202{\207\205ZhiJi\202Wan{\012\204Ju\202\0050\204Ai\202Fu\202GuiHouYan\005\253\204Zhi\003t\204Yi\202SuoDieGui\371\260\205Xun{x\204She\003\006\204{\214\205Si\202\256\371\204\005\335\204\004\352\204{x\205WeiRu\202ShuCaiJi\202Za\202Qi\202YanFu\202Yu\202Fu\202Po\202ZhiTanZuoCheQu\202YouHe\202HouGuiE\000\201{\240\205YunTouCunTu\202Fu\202ZuoHu\202NgoBo\202\002\376\204Jue\005!\204JueFu\202z\362\205\256\371\204\003]\204\257\320\204SuoChiz\350\204Cai\3621\204ManCanQi\202{\240\204Bi\202Ji\202ZhiZhuQu\202{\221\204Ji\202\303\362\204\303\355\204Li\202Li\202Yue\301\357\204{x\205Fu\202Cha\005!\204Shi\004\272\204QieQi\202Bo\202Na\202TouChuCu\202YueZhi{x\204ChuBi\202\006\205\204Ba\202|\015\204MinLie\003\014\204{x\205Qiu\007\036\204Fu\202Kuo{\240\204\000\000\200\005i\204Cuk{Z\204QiuZuoChiKuiLieBeiDu\202Wu\202So\202\004\334\204Lu\202"; -static const char b048[769] = "\377\005!\204ZaiChu{\207\205|\015\204Kunz\355\205JueTu\202z\362\204FeiBi\202\011!\204XiaWo\202Ji\202Qu\202KuiHu\202QiuSuiCaiZi\202QiuPi\202\003\247\204Wa\202Yao\006N\204XunCu\202DieChiCuo\006\205\204\003P\204DuoBieZheChuz\355\204Gui\0070\204Zou\005\262\204Lai\005\326\204Yue\301\357\204Zhu\005\357\204{x\204{Z\204Fu\202She\007\036\204KuaAi\202Man{}\205ShuHai{_\204Wai{\221\204\003\031\204JiuLi\202Gei\256\371\204\006N\204YueJue\007\014\204FanQi\202\005\335\204Fu\202Lu\202\005\335\204TuoMin|\015\204\007q\204Qi\202{Z\205\003\006\204\003=\204|\015\204\005\230\204MaoYinLu\202\007:\204Ju\202Pi\202\004\272\204Xie\303\362\204HunZhu\006N\204\010\230\204Wu\202Cha\007\243\204{_\204\006\260\204ManXiu\004\371\204\006&\204\007\243\204\372\230\205z\355\204Si\202z\367\205SuiBeiKaiMitZhiWeiMin\005\357\204\010k\204Nie\005\357\204Qi\202YueLipYi\202Xi\202{x\204\007\252\204\006N\204{x\204\010M\204YouJi\202Bo\202\003%\204\000\000\200DauCu\202Di\202\003\002\204Yu\202He\202Xu\202Yu\202Qu\202SauBai\007\277\204z\343\205\003\263\204Ya\202ShuYou\007\023\204Ye\202\010:\204YaoShuYan{\276\205\006z\204\006&\204Yu\202Bo\202SuiCinYanLeiLinTi\202Du\202YueJi\202CinYun\010\344\204\007x\204Ju\202Ju\202Chu{x\204\003=\204z\374\205z\374\204An\202GuiYu\202LeiSe\202Tu\202{x\204\003g\204Qiu\004\272\204Saa\010\220\204CaiDi\202YanZi\202\003\226\204\004\377\204z\355\204\003\263\204Li\202SuoMa\202Ma\202Gou\005!\204PeiLouQi\202CuoTu\202E\000\201CanJieYi\202Ji\202\010\220\204JueBi\202LeiYi\202\256\371\204\256\371\204Po\202Li\202ZaiTaiPo\202Cu\202Ju\202Xu\202FanSi\202Xu\202Er\202HuoZhuRanFa\202\007q\204Han{\207\205ZhiMi\202Yu\202"; -static const char b049[769] = "\377\250\000\204CenMeiYin\003+\204Tu\202KuiSauHeiMi\202\006N\204Yu\202z\350\205Mi\202Ju\202Pi\202Jin\305`\204Ji\202\006\205\204{\240\204XueBaoGanz\355\204Li\202Li\202QiuDun\004\377\204Yun{x\204ZhiRan\011%\204LueKaiGuiYueHuiPi\202ChaDuoz\355\204ShaShiShe\003g\204\004\377\204ShiChiYe\202HanFeiYe\202Yan\010k\204SouJinDuoz\374\204{\012\204TaoQiez\355\204Han\006\205\204YueCu\202z\350\204Jin{_\204Mu\202\007:\204{\214\205\006\260\204{Z\205Zhi\256\371\204Yu\202MouWan{\240\205Qi\202Su\202Pie|\015\204{\202\204Cu\202SuiCo\202Jie{\240\204Ao\202\003\002\204Ye\202\000\000\200Ye\202\003\031\204ZaoBao{\207\204\010\272\204z\362\204Lu\202Weiz\374\204TieBo\202{Z\205ZhuBei\006\205\204XieOu\202You\000\000\200\3621\204Li\202ZhaMi\202\011-\204Ye\202MouMatPo\202XieLaiJyu\010\344\204{_\204\004\334\204Wai{_\204JueJi\202JieSei\003\025\204Ao\202ChuWu\202{\012\204Xie\005P\204Xue\010\220\204{\221\204Tan\006\260\204XieXu\202z\374\204Si\202Kua{Z\205Wu\202HuoRunWenDu\202z\362\204KuoFu\202{\252\205z\374\204QinQieLanManYa\202\004\377\204Que\004\272\204\256\371\204ZhiGauWeiYanz\374\205Yi\202Ni\202{Z\205{\252\205JyuShi\003x\204Zi\202JueXu\202\007:\204\004\371\204{\334\205Xu\202Dao|\015\204Ge\202Yi\202\005\335\204Yi\202SaiLi\202Ku\202z\374\204SuiXi\202\003P\204\010X\204~\266\204Di\202Lai\003c\204{\327\204{x\205{\240\204Bi\202\372\230\205\005\357\204Hao\006l\204\005!\204ChiMa\202z\374\204\372\266\205\003]\204Qu\202\000\000\200Pu\202HuiWeiYi\202Ye\202GamCheHaoBinSi\202z\374\204z\355\204Hun\000\000\200HanCi\202ZhiQi\202KuiRouGu\202\004\377\204{s\205GapHu\202CuiSyuQue"; -static const char b04a[769] = "\377Di\202Wu\202QiuAanYan\006z\204Bi\202{\226\205Bin\000\000\200\007:\204NueBao\004\377\204\005\335\204Ci\202QiaTi\202Yu\202LeiBao\000\000\200Ji\202Fu\202z\374\204CenHu\202Se\202\005\005\204\003\006\204Yu\202Wa\202Ai\202HanDanGe\202Di\202Huo\003\247\204\000\000\200\003p\204\005\357\204MaiMai{\207\204\3621\204Xue{Z\204Po\202Fu\202NouXi\202DuiDanYunz\374\204YinShuDui\005\005\204Hu\202FeiFeiZa\202BeiFeiz\374\204Shi\003+\204{\221\204{\221\204{\221\204HuiFu\202WanMo\202\006\214\204\006z\204CimMieHu\202\005\335\204Yu\202Qi\202DuoAngSaaBa\202Di\202\003P\204Di\202Bi\202\003c\204PaoTieYi\202\005P\204JiaZhiTu\202XieDan\007\036\204Xiez\355\205\007:\204{\012\204{\207\205\005\005\204GeiLu\202Ji\202\003P\204ShuDu\202SouHu\202Yunz\355\204\006l\204\006N\204E\000\201\006Z\204Ba\202\003\014\204Yu\202ZheFen{\012\204Bu\202Ge\202Dunz\362\205Du\202Ti\202Bo\202z\350\204Lie\003\031\204Wei{\221\204LanSuiNa\202Bi\202TuoZhuDieBu\202Ju\202Po\202XiaWeiPo\202Da\202Fanz\355\204Hu\202Za\202Zai\000\000\200ZaiZaiZaiFanXie\005\335\204ChiBaoYinGaa\0050\204Bo\202\005\253\204\004\320\204\004\377\204Yi\202GaiKunYun{Z\204Ya\202Ju\202HouMinBaiGe\202\303\362\204\004\334\204Hao{Z\204\371\260\205GenBi\202Duo\256\371\204{\252\204San{x\205Ran{x\204MaoPeiWeiPi\202Fu\202\004\334\204Qi\202LinYi\202MenWu\202Qi\202Die{x\204XiaHe\202\010\230\204GuaHouAo\202Fu\202\006\214\204HunPi\202YanSi\202Xi\202\305;\204KuiGe\202HouAo\202San\372\266\206Lou{Z\204Huiz\355\204\000\000\200LinNa\202HanDu\202Jin\003+\204FanE\000\201\010I\204\005\335\204\005\335\204Yu\202XuePaoBi\202\010I\204"; -static const char b04b[769] = "\377YouYi\202XueSa\202Xu\202Li\202Li\202\007:\204DuiHuoSha\006G\204PouHu\202GuoBu\202RuiWeiSouAn\202Yu\202z\374\205\005\313\204\360\350\204\3621\204Yao\000\000\200Bi\202Ci\202\005\313\204TaoLiuFeiZhuTouXi\202ZanYi\202Dou\007:\204Jiu\000\000\200Bo\202Ti\202\004\377\204TouYi\202{\327\204\360\366\204BenGouBanMo\202GaiEn\202She\303u\204Zhi\360\350\204{\240\204\007:\204\3055\204Ti\202WeiXunZhiYi\202RenShiHu\202Ne\202Ye\202{\240\204Sui\004\377\204BaoHu\202Hu\202Ye\202Bin\360\350\204{\207\204Xi\202En\202DuiZanZhu\004\377\204\004\377\204Jin\305X\206DanLiu\005\271\204Yi\202Ye\202{\240\204En\202\006\373\204Ci\202z\350\204XueBo\202Mi\202\3055\204Mo\202{\207\205Qi\202Qi\202\002M\204Fu\202Bo\202\005\005\204BieYi\202Weiz\362\204FanQi\202MaoFu\202AngAngFu\202Qi\202QunTuoYi\202Bo\202\003I\204Ba\202\004\324\204\003P\204\010\042\204PeiYu\202ChiLu\202Yi\202Li\202\000\000\200\003\025\204Xi\202Wu\202{\310\205LeiPu\202\004\334\204Zui\004\334\204z\355\205An\202Er\202Yu\202\006G\204Fu\202ZhaHun\256\371\204SouBi\202Bi\202Zha\007\023\204He\202Li\202GiuHanZaiGu\202{x\205LouMo\202Mi\202MaiAo\202ZheZhuz\362\205Fan\005\262\204\3628\204BiuDu\202Wo\202WeiJi\202ChiLin\003t\204\003\031\204{\240\204NieLuo\371\260\204On\202GuaNieYi\202Ku\202WanWa\202QiaBo\202Kao\005\357\204GanGuaHai{\202\205\005\313\204KuiZe\202\005P\204\005\230\204Bi\202z\362\204Po\202YaoWanTi\202SuiKuaDuiAo\202{\240\204Mo\202Kui\005\271\204An\202Ma\202\003\006\204\006\214\204HouKaoHaoDuoz\374\204NaiSuoJiePi\202Pa\202\007\023\204z\355\205NieMan\007\023\204Ci\202z\374\204KuoGouDi\202Pou\007\036\204Zu\202"; -static const char b04c[769] = "\377Wo\202FeiCai\006\260\204SaiSouRouQi\202CuoPanBo\202Man\004#\204Ci\202KuiJi\202LanSou\006\205\204\003+\204PanLu\202\010k\204JiuLiuYi\202WenLi\202Li\202\010\243\204ZhuHun\371\260\204Chi\003g\204\305`\204\004\352\204HuoPi\202Hu\202MeiCheMei\010I\204Ju\202NouJi\202Yi\202Ru\202\005\357\204Ya\202\003x\204Qi\202Zi\202\005I\204\006l\204\003=\204Ze\202JieYu\202QinBeiBa\202Tuo\360\350\204\006\214\204YouZhiJieMo\202\371\260\205{_\204Qi\202{_\204Mi\202\003=\204Yi\202\007\277\204\007\277\204TouFu\202XueYe\202\005P\204\007\036\204MouLiuCanLi\202ShuLu\202HuoCuoPaiLiuJu\202{\221\204Ju\202{Z\205Zu\202z\374\204Zhi\007\316\204\177\227\204La\202\005I\204BiuLa\202Xu\202\007\277\204E\000\201Mu\202\362?\205Ti\202\007:\204{\221\204\007\277\204\006Z\204\005\230\204Yu\202SouZhaHaiHua{\221\204z\355\205Louz\355\204ZhiWei\003P\204ZaoMinGuiSu\202CukMaaSi\202DuoCen{\202\204\005\326\204NeiLaoLu\202Yi\202XieYan\003\006\204Pu\202\004\320\204z\374\204{\012\204JieLai\006\205\204Ye\202\006&\204Li\202Yin\256\371\204Qiu\005\326\204Yu\202ZauGauDaiDu\202\005\335\204Si\202Xi\202\000\000\200Qi\202Ci\202\007:\204Ji\202Yun\003%\204\003=\204\004\272\204{Z\204Que\251|\204NiuJiePi\202Gan\003P\204\371\260\205Shi\006\214\204Ci\202DieBo\202\005,\204WanCi\202ZhiBaiWu\202BaoDanBa\202\3628\204\177\227\204\003=\204JiuGuiCi\202You\007:\204LaoJu\202Fu\202NieE\000\201E\000\201\003g\204KanYanTu\202Pou\005\005\204\305;\204\3055\204YanQi\202\007:\204Bie\005\357\204\003P\204Houz\362\205Yao\007q\204KuiE\000\201Ji\202Mo\202z\367\205BaoWu\202{Z\204Xu\202Ta\202ChiXi\202\006&\204Ma\202KouYanCanAu\202He\202\005\262\204Ran"; -static const char b04d[769] = "\377\3628\204Yu\202z\374\205Nao\007\221\204FenPu\202\005\357\204Ao\202z\362\204Yi\202z\362\204\006\205\204\004\377\204LeiYanBaoDie\005\357\204Shi\003\002\204Lie\0050\204Ju\202Ti\202Pi\202\006\025\204\3621\204Wai{\252\205Di\202z\362\204YaoLi\202Mi\202Hu\202\371\260\205JiaYinWei\251|\204\007\335\204Lu\202\005\357\204Yi\202Cai{_\204Hu\202ShuTuoMo\202HuaTie\002\354\204\006\260\204HunFu\202GuoBu\202Li\202z\355\204Pi\202Cuo\006\205\204Suoz\350\205Zhi{\202\205Bi\202Ao\202\006\205\204z\374\204Ku\202Tou\007\265\204Weiz\374\204Tan\007\265\204Laoz\355\204Ni\202Ni\202Li\202\004\352\204Ju\202z\350\204Bo\202\007\261\204ZhaTaoz\350\204\010M\204Yi\202\0050\204GanDi\202{\240\204MeiDa\202{\240\204Yu\202XieZai\006\351\204Li\202GunXunTa\202Zhe\360\350\204\007\265\204{_\205Xi\202\006\214\204Wei\004\377\204{\252\204Qu\202Wa\202\000\000\200Zhi\005P\204Gu\202{_\205Ca\202Fu\202TieTa\202Ta\202\004\334\204Han\0102\204He\202\003p\204\003c\204Bo\202LiuNu\202Xi\202PaoDi\202He\202Ti\202WaiTi\202Qi\202Ji\202ChiBa\202JinKe\202Li\202Ju\202Qu\202La\202Gu\202QiaQi\202z\374\204{\240\204Shi{\240\204Ai\202HuaZhaZe\202Yao{\221\204Ji\202ChaYan{\240\204\005:\204Yan\000\000\200\003\002\204\3628\204NanYue\010\272\204Chi\000\000\200\000\000\200Mo\202Zo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\350\204Kun\007g\204\006\205\204Xu\202\007\023\204ShiBi\202\3621\207Lu\202TaiPi\202\3628\207{\341\205z\350\204Yu\202SuiGu\202Lin{\012\204{\346\205Bi\202Bo\202Fu\202\305^\206{\356\205Yi\202{\365\205KanLi\202z\374\204\005\313\204Dun\372\226\210Jin\305d\206{\377\206Kui{\240\204XieSunYi\202\007\230\204GouCui\371\260\205Kun\0050\204Ge\202\003x\204{Z\204Gen{\240\204\305j\206\003\014\204Lu\202XunDuiz\362\204Jie\362?\207\362F\207\0115\204{\374\205"; -static const char b04e[769] = "\377Yi\202\003x\204KaoQi\202{_\205XiaHanWan{\221\205San{_\205XiaJi\202Bu\202Yu\202\003+\204Gai\004\320\204\004\320\204\372\230\205QiePi\202ShiShiQiu\002\354\204Ye\202\006&\204\004\352\204Si\202{x\205DiuQiu{\207\205DiuYou{\207\205Yan\002\354\204\010\230\204GunJiuGe\202Ya\202z\350\205\362?\205Ji\202Jie\003\014\204{\012\204\305X\205z\355\204Lin\004\334\204ZhuBa\202WanDanWeiZhu\0050\204Li\202Ju\202PieFu\202Yi\202Yi\202NaiWu\202JiuJiuTuoMe\202Yi\202Yi\202ZhiWu\202ZhaHu\202Fa\202Le\202Yin\0102\204\003\247\204\006\214\204Hu\202\007\230\204{x\205{x\205Yi\202YinYa\202MieJiuQi\202Ye\202Xi\202z\374\205GaiJiuXiaHu\202ShuDouShiJi\202\006\220\204JiaJu\202ShiMaoHu\202Mai\006\337\204Zi\202Ru\202XueYanFu\202ShaNa\202GanSuoYu\202CuiZhez\350\204ZhiGuiGan\006\337\204LinYi\202JueLe\202Ma\202Yu\202{Z\205ShiShiEr\202ChuYu\202KuiYu\202YunHu\202Qi\202Wu\202\0050\204Si\202SuiGenGenYa\202XieYa\202Qi\202Ya\202Ji\202Tou\305`\204\007\014\204Da\202\003\002\204HaiYi\202z\355\204\005\313\204Mu\202Ye\202z\374\205\0050\204\005P\204{\207\205z\374\205\0050\204Ye\202QinBo\202YouXieDan{\207\204DuoMenRenRenJi\202Ji\202\305`\204Yi\202\371\260\204RenLe\202\003x\204Ze\202JinPu\202\004\320\204Ba\202{\221\205JinJie\002\354\204\007\357\204\006&\204Fo\202SanLun\002\354\204\010:\204Zi\202ShiTa\202{\221\205Fu\202z\374\204z\374\204Tuo\005\335\204\3628\204Renz\350\204GanGe\202Bo\202Dai\005\357\204Yi\202\010I\204z\355\205Sa\202z\355\205Yi\202Mu\202MenRenFan\010I\204\360\350\204z\350\204\362?\205Pi\202Wo\202Wu\202{\240\204JiaYao\003\014\204\010:\204Ren\305`\204FenDi\202\003%\204"; -static const char b04f[769] = "\377\362?\205Qi\202PeiYu\202\005,\204DunWu\202Yi\202Xin\007\014\204Yi\202Ji\202Ai\202Wu\202Ji\202Fu\202Fa\202XiuJinPi\202DanFu\202\005!\204\362?\205YouHuoHuiYu\202CuiYunSanWei\305X\205CheYa\202z\374\204{_\205z\355\205Lun\010:\204XunXinWeiZhuZe\202z\374\204Nu\202Bo\202Gu\202Ni\202Ni\202XieBanXu\202\005\357\204\003c\204\371\260\204Qu\202Ci\202\005\005\204ShiJiaPi\202Yi\202Si\202Yi\202{Z\205\3607\204HanMaiDanZhuBu\202Qu\202Bi\202\002\376\204Ci\202WeiDi\202ZhuZuoYou\360\350\204Ti\202{\221\204He\202Bi\202TuoSheYu\202Yi\202Fu\202ZuoGou\006\373\204\3628\204Ni\202z\374\204Qu\202\003]\204Wa\202z\350\204ShiKa\202BaoPeiHuiHe\202Laoz\374\205Ge\202\360\350\204BaiFa\202\305;\204JiaEr\202\002\354\204Ji\202HenHuoGui\301\357\204\007\036\204\003\002\204Ci\202Yi\202Shi\003g\204\371\260\204TuoKanZhiGaiLaiYi\202ChiKua{\012\205Li\202YinShiMi\202ZhuXu\202YouAn\202Lu\202MouEr\202Lun\004\352\204ChaChiXun\003=\204\003c\204Yi\202Ru\202CunXiaSi\202DaiLu\202Ta\202\003\002\204{Z\204Ce\202\006\214\204\005\271\204\005\020\204\006\373\204\010M\204JinWu\202Houz\343\205{x\205{Z\204Zuo\004\320\204QinLu\202Ju\202Shu\005P\204\371\260\204TuiBo\202Nan\3621\204\303\362\204TuiYu\202Xi\202Cu\202E\000\201QiuXu\202{\012\205Ku\202Wu\202JunYi\202Fu\202{\207\205Zu\202\006\214\204Li\202\003]\204Hun\0050\204z\350\204SanPeiSu\202Fu\202Xi\202Li\202Fu\202\0102\204BaoYu\202Qi\202XiaXinXiuYu\202Di\202Che\004\320\204ZhiYanLiaLi\202LaiSi\202{\240\204XiuFu\202HuoJu\202\3621\204Pai{\240\204\003t\204ChuFei\003\014\204Ya\202An\202BeiYu\202XinBi\202Hu\202"; -static const char b050[769] = "\377z\355\205Zhi\002\354\204JiuYaoCuiLiaWanLai\010:\204\004#\204Ge\202{\012\204Bei|\015\204ShuShuMenDaoTanJue\257\320\204\003g\204\006\260\204\005!\204HouYi\202Qi\202Ti\202Gan\0050\204JieSuiz\355\205Jie\003%\204Zhi\006\237\204\007q\204\004#\204Ju\202z\350\204Ni\202Lun\004\334\204Wo\202Luo\007\023\204\006G\204Hun\004\352\204Zi\202BenWu\202Ju\202NaiCai{\240\204\005(\204Ye\202ZhiSha\003\006\204\006\373\204\004\377\204{x\205z\350\204Yan\005\253\204\362?\205\256\371\204JiaJi\202WeiYu\202\002\354\204RuoTi\202Wei\003I\204Yan\003\014\204\005!\204Wo\202E\000\201XieChe\371\260\205KanDi\202ZuoCha\005P\204BeiXiez\362\205Yao{\221\204\004\320\204YanYou{\240\204Xu\202ZhaCi\202Fu\202Bi\202Zhi\004#\204\003+\204Ji\202Yi\202XieXunCai\0070\204Ce\202{Z\204Ou\202TouTouBeiZa\202LouJieWeiFenz\355\205GuiSouZhiSu\202XiaFu\202\007:\204\006N\204Li\202Nu\202Yun{\240\205Ma\202\006l\204\3607\204\005!\204HaoJieXi\202{_\204z\350\204Jue\010:\204ChuSanBei\3621\204\003]\204YaoTanSuo\360\350\204Fa\202\002\354\204JiaDaiZai\005!\204Gu\202BinChuNuoCanLeiCui\003]\204Zao\004#\204\005\005\204\007\023\204Ao\202\305X\205Yu\202\005(\204Zu\202{_\205\305X\206\0050\204ChiShaHan{\221\205\003\006\204YanDi\202XieLouBei\007\335\204Jin{\207\204Lu\202Manz\350\204z\374\204Tan\004\377\204\004\352\204\372\230\205z\374\205{_\204\006\214\204z\343\205TuiZunPu\202Xi\202Laoz\355\205{\012\205\006z\204Qi\202{x\205z\355\204WeiJi\202Bo\202Hui\305X\205TieDan\003\002\204Jiu\010\356\204Fenz\374\204Ju\202E\000\201\003\002\204{\240\204\3628\204LinBo\202Gu\202z\374\204Su\202z\374\204{\240\205MinYe\202JinJia\006\214\204Pi\202\003\014\204\003c\204Ai\202Sai"; -static const char b051[769] = "\377Yi\202Jun\010M\204z\355\204Yi\202\010\220\204\0050\204\003P\204\005\271\204{\240\204ChuDan\003\002\204ShaZaiCanBinAn\202Ru\202Tai\004\320\204\005\020\204LanNi\202Jinz\350\204\006\205\204Wu\202\006\373\204{}\205Ni\202z\355\205LieLeiLu\202{\202\205BaoYu\202\003t\204ZanZhiSi\202YouHao\003\006\204{x\204Li\202\005\326\204Wei\003\031\204Chuz\355\204\010\314\204ShuHuiLi\202LuoZanNuo\005!\204YanLei\006\220\204Er\202Wu\202YunZan\007:\204{s\205z\367\205\002\376\204{s\205z\374\204{\012\205DuiKe\202Dui\003+\204Tu\202z\355\205Er\202DuiEr\202JinTu\202Si\202YanYanShiSap\010\220\204z\350\204DouFenMao\371\260\204Dou\010\276\204\0050\204Li\202z\362\205Ru\202\305`\204Nei\301\357\204{\207\205Yu\202Ba\202\003=\204LiuXi\202HanLan\003=\204|\015\204{\012\204\003g\204\002\354\204Qi\202Ju\202\3607\204Zi\202Fen\360\350\204{\240\204\002M\204Ji\202Yi\202Ji\202z\355\204z\343\205MaoRanNei\007:\204Mao\006\025\204RanCe\202z\343\205Ce\202ZaiGuaz\343\205Mao\003c\204MaoGouXu\202\003+\204Mi\202\006N\204YinXieKanJun\010M\204Yi\202Mi\202Shi{\012\204\006\205\204\362?\205Ju\202\007:\204\305;\204KouLinFu\202XieMi\202\002\354\204\004\352\204Tai\006\025\204\003\014\204\002\354\204Hu\202z\367\205JueHu\202{\202\205Ye\202\006G\204PanFu\202Min\004\352\204z\374\204LieQia{\240\204\0050\204SouMeiTu\202Qi\202Gu\202\007g\204\007\023\204\0050\204{\207\205\003\006\204\005,\204\005\357\204\004\352\204Gan{\240\204YinCouAi\202Li\202\305X\206\305;\204\007g\204CuiSi\202DuoJinLinLin\006\373\204Xi\202Du\202Ji\202FanFanFan\003\014\204Ju\202Chu{Z\205\003\014\204Mu\202ZhiFu\202\003\014\204\0102\204\003\014\204Kaiz\362\205KaiGan\005\262\204\0102\204z\350\204{s\205\005\271\204Tu\202Ao\202ChuJi\202\010\220\204HanHanZao"; -static const char b052[769] = "\377Dao\005,\204DaoRenRen\305X\206FenQieYi\202Ji\202Kanz\350\204CunChuWenJi\202Dan\003g\204HuaWanJueLi\202YueLieLiuZe\202\006\025\204\305X\206Fu\202ChuQu\202\005,\204{_\204Min\005\357\204\362?\205PanBieJieJiePaoLi\202{_\204Biez\355\204\0050\204Gua\007\277\204Dao\305X\206KuiKu\202DuoEr\202Zhi{\276\204\301\357\204ShaCi\202Ke\202JieGuiCi\202GuiKaiDuoJi\202Ti\202\0050\204LouLuoZe\202\007:\204CuoXueKeiLa\202z\350\204Sha\305X\206Gua{\240\204CuoLi\202Ti\202FeiPouz\355\204Qi\202\305X\206Zi\202\006\025\204WanBo\202Ji\202Duo\003\006\204{_\204Du\202{\240\204Ji\202Bo\202YanJu\202Huo\371\260\205{\240\204Duo\0070\204Wu\202GuaFu\202\371\260\205{\240\204Ge\202Da\202Kai\305X\206\305X\205z\355\204\007\265\204Lu\202Li\202\006\260\204{_\204\007\335\204Kou\003\002\204Gua\006\214\204JueHuaZha\004\334\204{\207\204Ju\202Pi\202LiuGui\003\002\204Gui{\240\204{\240\204\005!\204HuoJi\202{\240\204Yi\202{\240\204Zhiz\355\204{\240\204Mo\202Li\202ZhuLi\202Ya\202\301\357\204Ban\003=\204JiaWu\202MaiLieJin\007\243\204XieZhi\004\352\204ZhuNu\202JieQu\202\360\366\204Yi\202ZhuMo\202Li\202JinLaoLao\007q\204Kou\360\350\204Wa\202\3621\204Mou{\202\205JieLieHe\202ShiKe\202JinGaoBo\202MinChi\005\230\204\003]\204\003]\204\003+\204Ke\202Xun\007q\204\003\006\204Lu\202Bu\202\006\205\204ChiLeiKai\003+\204\004\352\204Xu\202Xu\202KanWu\202Yi\202Xun\006Z\204\371\260\205LaoMu\202Lu\202\007\335\204ShiJi\202Qin{\240\205\010I\204\301\357\204z\374\205Yi\202JueFan\007q\204\3628\204Ju\202DanXieMaiXunXunLu\202Li\202Che\010\314\204\301\357\204Bao\360\366\204YunJiuBaoGouWu\202"; -static const char b053[769] = "\377YunWen{s\205GaiGaiBao\006&\204Yi\202{s\205\006\260\204Ju\202TaoGe\202Pu\202E\000\201PaoFu\202\003=\204Da\202Jiu\003=\204Bi\202HuaBeiNaoShi\003%\204JiuYi\202Za\202{\240\205\007\014\204{\240\205{\202\205Hu\202XiaQu\202FanGuiQie\006a\204{\202\205FeiHu\202Yu\202GuiKuiHuiDanGui{\207\204{\207\204\011\032\204Du\202JiuJueXi\202Pi\202Qu\202Yi\202Ke\202Yan\303\362\204Ni\202Qu\202ShiXunz\350\204{\327\204Sa\202Zu\202\371\260\205Wu\202HuiBanShiXi\202WanHuaXieWanBeiZu\202\004\334\204XieDanMaiNanDanJi\202Bo\202{\276\205Bo\202{\202\205\303\362\204Bu\202{\221\204Ka\202Lu\202YouLu\202Xi\202GuaWo\202XieJieJieWeiAng{}\205ZhiMaoYinWei\360\366\204Ji\202Que\006\337\204Chi\007q\204XieXu\202JinQueWu\202Ji\202E\000\201\003\006\204Xi\202Sanz\355\205WeiE\000\201\005P\204Li\202ZheHanLi\202Ya\202Ya\202YanSheDi\202Zha\003\247\204Ya\202QieYa\202ZhiCe\202\003\247\204Ti\202Li\202SheHou\005P\204ZuiCuoFei\007:\204Ce\202\007:\204z\374\205YanLi\202JueSha\3607\204ChuJiuJinAo\202GuiYanSi\202Li\202z\355\205LanLi\202YanYan\007:\204Si\202\003=\204LinRouQu\202Qu\202Er\202LeiDu\202z\374\204\372\230\205SanCanCanCanCanAi\202DaiYouChaJi\202You\372\266\206Fan\002M\204\007\230\204Ba\202Fa\202RuoShiShu\004\334\204Qu\202\002M\204\303\362\204Xu\202XiaPanSouJi\202WeiSouDieRui\006&\204KouGu\202Ju\202\005\357\204GuaDaoKouZhi\003\002\204\002\376\204Ba\202\003x\204Ke\202TaiChiShiYouQiuPo\202Ye\202HaoSi\202TanChiLe\202\005,\204Ji\202\006z\204\005\335\204"; -static const char b054[769] = "\377MieXu\202\006\351\204ChiGe\202\003P\204YaoZi\202He\202Ji\202\005,\204Cun\3628\204\305;\204HouLi\202Tu\202z\374\205ZhaXiaYe\202Lu\202Ya\202Ma\202Ou\202HuoYi\202Jun\004\320\204LinTunYinFeiBi\202QinQinJieBu\202FouBa\202DunFenE\000\201Han\005P\204\007\243\204\007\221\204Qi\202\005\335\204ZhiYinWu\202Wu\202\010I\204Na\202XueXi\202\257\320\204DouWenHou\005\335\204Wu\202GaoYa\202JunLu\202E\000\201Ge\202MeiDaiQi\202{x\205Wu\202GaoFu\202\003\002\204\005\335\204Chi\371\260\205Na\202TunWu\202Yi\202DaiOu\202Li\202Bei\007:\204GuoWenz\350\205Wu\202E\000\201Shi\007q\204PenWenNe\202M\000\201\005\357\204RanYouDi\202\003c\204Shi\003c\204TieXi\202Yi\202Qi\202\0102\204Zi\202Gu\202Ci\202WeiXu\202He\202NaoGa\202PeiYi\202\3621\204\371\260\204Hu\202\305;\204Da\202Qu\202Ju\202HanZa\202TuoDuoPouPaoBieFu\202\360\350\204He\202Za\202He\202HaiJiu\003]\204Fu\202Da\202\003c\204Wa\202Ka\202Gu\202Ka\202ZuoBu\202\003\031\204\004\352\204\006\373\204Ta\202Si\202z\374\204HuoQi\202Er\202E\000\201{\012\205ZhaXi\202Yi\202LieZi\202MieMi\202ZhiYaoJi\202\003c\204Ge\202ShuZan\3621\204HaiHuiKua\006\333\204Taoz\374\204E\000\201\003P\204XiuGuoYanLaoYi\202Ai\202Pin\371\260\204\3628\204\005\335\204{s\205DuoWa\202Ha\202ZaiYouDiePaiz\374\205Ai\202Gen{\202\205Ya\202Da\202\3621\204Bi\202Hui{\327\204Hua\003g\204\005\271\204DuoFenJi\202\010M\204MouYo\202Hao\007:\204\003\031\204Pou\006\351\204Ge\202O\000\201Chi\360\366\204Li\202Na\202Zu\202He\202Ku\202\3621\204z\374\204LaoBo\202ZheZha{\207\205Ba\202MieLieSuiFu\202Bu\202Han\005\313\204\007\277\204\010\016\204Ge\202"; -static const char b055[769] = "\377YouYanGu\202Gu\202BeiHanSuo\256\371\204Yi\202Ai\202JiaTu\202z\374\204WanLi\202Xi\202\005!\204ZuoQiuCheWu\202ZaoYa\202DouQi\202Di\202QinMa\202Mo\202\003=\204DouQu\202Lao{\207\205SuoZaoz\362\204\005\230\204ShaJi\202Zu\202Wo\202\003\014\204JinHu\202Qi\202\002M\204Wei{\276\204z\355\205Er\202Li\202z\350\205An\202Ze\202Yo\202{\327\204Yu\202|\015\204LaiShaXi\202TuoHu\202Ai\202\002\376\204NouKen\004\334\204\004\334\204{_\205Di\202\005\313\204LinA\000\201Caiz\374\205TunWu\202WenCuiShaGu\202Qi\202Qi\202TaoDanDanYe\202Zi\202Bi\202Cui{\252\205He\202Ya\202Qi\202ZheFei{\207\205z\374\204Pi\202ShaLa\202Ze\202\004\377\204GuaPa\202ZheSe\202\372\230\205NieGuoLuoYanDi\202\301\357\204z\355\204Bo\202\003x\204\005\230\204\3621\204Ju\202\005!\204ChiTi\202An\202JiuDanKa\202\003]\204WeiNan{_\204Yu\202ZheLa\202JieHouHanDie\003c\204\005\020\204WaiNuoYu\202YinZa\202YaoO\000\201\003+\204Hu\202Yun\305X\205Huiz\362\204z\362\204Xi\202He\202Ji\202Kui\362?\205WeiShaXu\202z\362\205DuoNie\003P\204{\207\205Yu\202\010\230\204Chi\006\214\204YanDanPenCanLi\202Yo\202ZhaWei\005\014\204\004\377\204PenBu\202KuiXi\202Yu\202JieLouKu\202ZaoHu\202Ti\202YaoHe\202A\000\201Xiuz\350\205Se\202\003]\204Su\202\005\335\204XieAi\202SuoMa\202ChaHaiKe\202Da\202\010\230\204{x\204Ru\202SouWa\202Ji\202\003\247\204Wu\202z\350\204ShiGe\202Zi\202JieLao\006Z\204Wa\202Si\202ChiHaoSuoGaaHaiSuoQinNieHe\202ZhiSaiN\000\201Ge\202Na\202DieAi\202z\350\205\3628\204Bi\202Ao\202Ao\202{\207\204ZuiZheMo\202SouSouTan"; -static const char b056[769] = "\377Di\202Qi\202\003\002\204z\367\205\003\002\204KaiTan{_\204CaoJiaAi\202\3621\204\007\335\204LouGa\202Gu\202\3621\204Hu\202HuiGuoOu\202z\374\204Ze\202z\355\205Xu\202Po\202De\202Ma\202Ma\202Hu\202LeiDu\202Ga\202\005!\204Ye\202\005\005\204\004\377\204Sai\003\002\204Mi\202\3621\204HuaMaiRan{\252\205\006\260\204Lao\3621\204Ji\202Zhu\010I\204KuiZui\3621\204Si\202HaoFu\202\006z\204\006\214\204Xi\202Chuz\355\204DanHeiXunE\000\201ZunFanChiHuiZan\305X\206Cu\202DanYu\202Tun\007\177\204\003\002\204Ye\202Xi\202Qi\202Hao{\207\204Xu\202\005\262\204HuiYinPu\202JueQinXunNieLu\202Si\202Yan\004\377\204Da\202{\221\204O\000\201\003c\204Jin\010M\204HuiXieQi\202E\000\201ZaoYi\202Shi\003\002\204\007:\204Ai\202\003]\204Jue\005\271\204Yu\202PenDaoGa\202Hm\202Dun\010\220\204XinSaiPi\202Pi\202YinZui\006\373\204Di\202LanTa\202HuoRu\202HaoXiaYe\202DuoPi\202\004\320\204Ji\202JinHaoTi\202z\355\205XunMe\202Ca\202Ti\202Lu\202HuiBo\202YouNieYinHu\202Me\202\005\335\204ZheLi\202LiuHai\006\220\204\3621\204Mo\202YanLi\202Lu\202\003\031\204Mo\202Dan{x\204PinPi\202z\374\205HuoMo\202Xi\202DuoKu\202Yanz\355\204\004\377\204\010\314\204\3607\204La\202Ta\202\3621\204Jue\301\321\204z\362\204Huo\372\230\205Nie\3621\204Ca\202Li\202z\355\204\005\020\204Li\202Yi\202Luo\006\220\204Za\202Su\202Xi\202Zen{\240\204Za\202ZhuLanNie\006\220\204LanLo\202WeiHuiYinQiuSi\202Nin{\240\204HuiXinYinNan\007\265\204\007\265\204Dun\007\014\204\007:\204z\343\205\003I\204Yun\006&\204Hu\202Hui\007:\204E\000\201GuoKun\006&\204\3628\204Tu\202WeiLunGuoQunRi\202\005\357\204Gu\202GuoTaiGuoTu\202You"; -static const char b057[769] = "\377GuoYinHunPu\202Yu\202Han\007:\204Lun\301\357\204Yu\202\003\006\204Guo\305X\205Wei\007:\204\301\357\204Ku\202Pu\202\007:\204\007:\204Ya\202Tu\202Tu\202Tu\202\007\265\204LueHuiYi\202z\362\204\006\337\204\006\337\204Tu\202Ya\202Tu\202\005P\204\371\260\205Pu\202Lu\202\005\271\204Ya\202ZaiWeiGe\202Yu\202Wu\202GuiPi\202Yi\202De\202z\350\204z\350\204{Z\204\004\334\204\010\220\204QiaXia{_\204{\202\205z\355\205Qi\202NieMo\202Ji\202JiaZhiZhiBanXunYi\202QinMeiJun\006N\204Tun\003%\204BenBenTanKan\006\333\204Zuo\007\243\204Bi\202\0050\204Di\202\0050\204Ji\202\005\271\204Di\202\0050\204{\240\204TanLi\202Ba\202Wu\202Fen\003p\204Po\202Ban\005!\204KunQu\202TanZhiTuoGan\0102\204\3607\204GuaNi\202TaiPi\202z\343\205\360\350\204Fo\202Ao\202Lu\202QiuMu\202Ke\202GouXueBa\202ChiChe\005\357\204ZhuFu\202Hu\202Zhi\257\320\204La\202\003\031\204\003\031\204Lu\202Ao\202DaiPaoMin\003g\204\004\352\204Ji\202He\202Lu\202Ci\202ChiLeiGaiYinHouDui\002\376\204Fu\202{\012\205YaoDuoDuoGuiCha\360\350\204YinFa\202Gou\007:\204DieXieKen{_\205\002M\204E\000\201\002\354\204\3607\204\005\335\204Ya\202KuaDa\202Ka\202\010\220\204Kai\004\272\204NaoAn\202\003g\204z\374\204\007:\204\006l\204Fu\202Ba\202Yi\202YinHanXu\202\257\320\204Qin\007\277\204Ai\202\005\005\204\003%\204Que\003]\204JunJiaDi\202Mai\005\230\204\007q\204{x\205{_\204JinZheLieLieBu\202{x\205HuaBu\202ShiXunGuoz\343\205Ye\202{\327\204Di\202Yu\202Bu\202Ya\202\301\357\204SuiPi\202\003\006\204WanJu\202Lun{Z\205\006\237\204z\367\205\004\352\204DaiTanAn\202CaiChu\005\005\204KanZhiDuoYi\202ZhiYi\202PeiJi\202\007g\204Qi\202SaoJu\202Ni\202"; -static const char b058[769] = "\377Ku\202Ke\202\005!\204KunNi\202{\240\204DuiJin\006\025\204Yu\202E\000\201\006\260\204Gu\202Tu\202\006G\204\003%\204Ya\202z\350\204KunAn\202\371\260\204DuoNaoTu\202{x\205YinHunBi\202{\207\204GuoDie\372\230\205HouBaoBaoYu\202Di\202MaoJie\005\253\204Ye\202\007\277\204Kan\004#\204Yu\202z\362\205E\000\201YaoYanBaoCi\202Meiz\355\205Du\202TuoYin\003\014\204\362?\205JieJin\005\313\204\006\025\204\256\371\204{\240\204\0102\204Leiz\374\205z\362\205\006G\204\0070\204Wan\003P\204Ji\202Ji\202\005\271\204\004\377\204Ta\202{x\205\003]\204KaiSu\202Su\202ShiMi\202Ta\202\006Z\204{x\205Tu\202\005!\204Que\362?\205Li\202\362?\205\006l\204Sai\006a\204Dui|\015\204Wu\202{Z\205XunGe\202{Z\204Ai\202\003=\204YanKan|\015\204\007:\204WenXieLiuHai\005\230\204z\355\205\006\260\204\005\005\204{x\204Lu\202Lu\202Ou\202z\350\204MeiMo\202\372\230\205\372\266\206ShuLouChiMan\003t\204\0050\204Ce\202ShuZhi{\221\205Kan\003]\204\3607\204{x\204ZhiXi\202Guoz\350\205JinDi\202{_\205Mu\202CuiYanTa\202\010\243\204z\350\204z\350\205{\207\205Wei\003p\204\006\214\204\010\243\204Xu\202{_\204{_\204Ba\202Pu\202\005\271\204\004\352\204FanQueMo\202DunDunZunDi\202\371\260\205DuoDuoTan\005\262\204Mu\202Fenz\362\205TanDa\202Ye\202Zhu{\240\204Ao\202z\350\205Ji\202\006\214\204KenYi\202Pi\202Bi\202\3607\204{\240\205Ye\202\003]\204XueTanLanJu\202\006\333\204\010\220\204\010\314\204z\350\204Xunz\374\204Xi\202He\202Ai\202Ya\202DaoHao\005\253\204JinLei{\202\205Lu\202YanTanWei\006\333\204\003\031\204\003\031\204RuiLi\202Lin\010\314\204z\355\204XunYanLeiBa\202WanShiRenSan\372\230\206\372\230\206\371\260\205Yi\202MaiKe\202Zhu\372\230\206Hu\202Hu\202KunYi\202Hu\202Xu\202Kun\002M\204\006\351\204Zun"; -static const char b059[769] = "\377\002M\204Yi\202ZhiGu\202Chu{\240\205\003\014\204Bei\005(\204\303\362\204SuiQun\005\357\204Fu\202CuoXia{s\205XieNaoXiaKuiXi\202Wai\007:\204MaoSu\202DuoDuoYe\202\003\006\204WaiGouGouQi\202\006\205\204\006\205\204YinHuo{x\204Da\202Ze\202|\015\204TaiFu\202\007\230\204Yao\360\350\204\004\272\204GaoShiTaoTaiTouYanBi\202Yi\202KuaJiaDuoHua{\202\205YunJiaBa\202En\202{\207\204z\362\204Di\202YanPao\007q\204Qi\202Nai\003\014\204XieFen\3607\204\301\357\204KuiZouz\362\204Qi\202KaiZhaBenYi\202{\240\205Tao\006a\204BenXi\202z\362\205Fei\005,\204Xun\005\005\204\3607\204Ao\202She\006Z\204Ha\202Ao\202Wu\202Ao\202{\240\205{\207\204DuoYun{\240\205ShiFenHuoBi\202\006\337\204DuoNu\202Nu\202\003x\204Naiz\350\204{\240\204Ta\202Jiu\007\326\204ChaHaoz\374\204FanJi\202\010\016\204Ru\202Fei\305`\204\005\335\204\372\230\206Fu\202Ma\202DanRenFu\202\0050\204YanHaiWen\362?\205Pa\202Du\202Ji\202\007\243\204\362?\205YaoJinYun\005\014\204FouChiYue\372\230\206NiuYanNa\202XinFenBi\202Yu\202Tuo\003\014\204Wan\003%\204Wu\202Yu\202GuiDu\202Ba\202Ni\202\003c\204\004\334\204\002\376\204Da\202Nai\007:\204Touz\374\204ZhiE\000\201MeiMo\202Qi\202Bi\202\371\260\204QieE\000\201He\202Xu\202Fa\202{Z\205MinBanMu\202Fu\202\005\357\204Zi\202Zi\202ShiRan{_\204\360\350\204ManJieGu\202Si\202\003g\204WeiZi\202Ju\202{_\204PinRenYao\004\352\204{\240\205ShuJi\202Gaiz\374\205Hua\007q\204\003\002\204GouLao{\240\204{\240\204Yi\202{\327\204ZhiJi\202Ji\202z\374\204\005\313\204{\012\205JunKuaYan\305;\204LiePeiE\000\201YouYanCha\371\260\204YinShiGui\301\357\204Zi\202"; -static const char b05a[769] = "\377\007\023\204Wei\005\335\204Wa\202LouYa\202Rao\003\002\204\006\337\204\0102\204z\374\204\360\366\204Li\202{x\205Xie\006\351\204Fu\202SuoMeiWeiKe\202\301\321\204\301\321\204\005P\204{\327\205\003g\204NanYu\202Na\202PouNei\007q\204\371\260\204ZhiHanDi\202\372\230\206E\000\201PinTuiz\374\204\003+\204Wu\202YanWu\202Ai\202YanYu\202Si\202Yu\202Wa\202Li\202z\374\204Ju\202Qu\202\003p\204Qi\202z\374\204\004\334\204\004\352\204z\355\205Lu\202Ai\202E\000\201E\000\201Lou\003+\204\006&\204PouJu\202Po\202Cai\005\357\204Wan\003t\204\3621\204ShuQi\202HuiFanWo\202RuiTanFeiFeiJie|\015\204Ni\202\301\357\204\0050\204Hun\0050\204z\350\204\3607\204\003g\204Hu\202WanLaiBi\202Yin\004\320\204NaoFu\202\0050\204LunAn\202LanKunYinYa\202Ju\202Li\202\3607\204z\374\204HuaHua\004\377\204z\355\204\371\260\204\005P\204\010\220\204YaoWu\202Nan\301\321\204JiaTouXu\202Yu\202WeiDi\202RouMeiDan\005\253\204QinHuiWo\202z\350\204\256\371\204\005\014\204Fu\202Jie\0070\204Yi\202\362?\205Meiz\362\205\003+\204An\202\004\377\204\003P\204JieWeiMei\007:\204{Z\205QiuShiXieTuo{\207\204MaoRanSi\202\003I\204WeiWa\202Cu\202Hu\202Ao\202JieBaoXu\202TouGuiChuYaoPi\202Xi\202\007:\204\004\377\204\006N\204Ru\202ChiLiuMeiPanAo\202Ma\202GouKuiQinJiaSao{Z\204\007:\204Jie\006N\204\305;\204\004\377\204Ji\202Su\202\003\025\204z\374\204Tao\003\247\204\005\230\204NaoBaoAi\202Pi\202PinYi\202\007\335\204Yu\202Lei\003P\204ManYi\202{\221\205\007\014\204\003]\204Ni\202Li\202Di\202GuiYanJin\372\230\205z\355\205Ze\202HanNenLaoMo\202ZheHu\202Hu\202Ao\202Nenz\350\205Ma\202PieGu\202Wu\202\006\214\204Tuo{\221\204\005\014\204z\374\204z\374\204Mo\202\006z\204{\207\204Hua"; -static const char b05b[769] = "\377Gui\005\262\204ZhiXu\202Yi\202HuaXi\202KuiRaoXi\202Yanz\355\204\003\002\204MeiFanFanz\374\204Yi\202Hui\003\002\204Fu\202ShiBi\202{_\204Suiz\350\205{\207\204z\362\204Xin\003\025\204\004\352\204Yi\202CanAi\202{\327\205\006\373\204Ma\202\007\036\204\004\320\204JinCi\202Yu\202Pin\006N\204Ru\202NaiYanTai\004\377\204z\350\204\003\025\204Yue\004\377\204\003+\204Bi\202Ma\202\371\260\204\003g\204Ni\202Du\202Liu\007:\204LanYan\372\266\206\005\357\204\003\002\204{\327\205Lanz\350\204\004\377\204\372\266\206Hui\301\357\204Mi\202Li\202\006\337\204YanZhuLanZi\202JieJueJue\006\237\204YunMa\202Zi\202CunSunFu\202BeiZi\202\3621\204Xin\006\205\204Si\202TaiBaoJi\202Gu\202Nu\202XueYou\372\230\205Hai\006\337\204SunNaoMie\006&\204z\350\204ShuCanYa\202Zi\202Ni\202Fu\202Zi\202Li\202XueBo\202Ru\202NaiNieNie\004\377\204\006\337\204\003+\204\006\373\204\006N\204Ta\202Gui\005(\204{}\205Yu\202\002M\204An\202Tu\202\007\023\204WanRouYao\005\335\204Yi\202\0050\204\007g\204Mi\202Zhu\010\220\204\005\335\204\004#\204{\012\204\003c\204\003x\204WanYi\202BaoShiShiz\367\205\371\260\204Ke\202\003P\204ShiYouz\362\204Yi\202\007\036\204Shiz\374\204\003=\204{x\205Qun\003=\204\3621\204ZaiZhaBaoHaiYan\3621\204Jia\371\260\204{x\204\006N\204z\362\205Mi\202Kou{\202\204BinSu\202CaiZanJi\202\007:\204Ji\202YinMi\202Kou\003\006\204He\202{Z\204{\240\204Fu\202\006\373\204\002\354\204z\362\204MeiQinHanYu\202Shi\006\373\204Jin\006\373\204ZhiYu\202Bao{\202\204\006\373\204QinMo\202ChaJu\202GuaQinHu\202Wu\202\006z\204Shi\006\373\204\005(\204\371\260\204WeiXie{\202\204Hui\006z\204Junz\362\204Yi\202Yi\202BaoQinz\367\205Bao\003\014\204CunDuiSi\202XunDaoLu\202Dui\002M\204"; -static const char b05c[769] = "\377Po\202\003\014\204\372\230\205Fu\202SheKe\202{\240\205{\240\205\372\230\205WeiZunXunShuDuiDao\3621\204Jie\360\366\204Er\202Er\202Er\202Ga\202{\240\204Shu{x\204{_\205{_\205Mo\202Ga\202z\355\205\006z\204z\374\204z\374\204KunYou\305`\204You\006z\204\006z\204Yao\006\351\204\305`\204\305`\204\305`\204Ga\202YaoDuoKui\362?\205JiuGanGu\202GanTuiGanGanShiYinChiKaoNi\202JinWei\003\025\204Ju\202Pi\202\007\177\204Xi\202Bi\202Ju\202Jie|\015\204Qu\202Ti\202JieWu\202\005,\204ShiShi\0102\204Ji\202Xie{Z\204XieNi\202{\221\204Xi\202WeiManE\000\201Lou\0102\204Ti\202FeiShuXieTu\202Lu\202Lu\202Xi\202\007\177\204Lu\202Ju\202XieJu\202Jue\006z\204JueShuXi\202CheTunNi\202{_\204Wa\202z\374\204Li\202E\000\201HuiHui\003\031\204Yi\202Qi\202RenWu\202Han\371\260\204Yu\202ChuSuiQi\202RenYueBanYaoAngYa\202Wu\202JieE\000\201Ji\202z\350\204FenWanQi\202Cenz\350\204Qi\202ChaJieQu\202\006\025\204z\374\204Ao\202LanDaoBa\202ZuoZuo\360\350\204Ju\202\006\025\204Ke\202GouXuePo\202Li\202\007\036\204Qu\202YanFu\202XiuJia\005\357\204TuoPi\202Ao\202Dai{\202\205YueQu\202Hu\202Po\202MinAn\202\007\036\204\005\357\204Chi\0102\204\004\352\204HanKuiXiuMao\3628\204XueYi\202\303\362\204He\202Ba\202LuoE\000\201Fu\202XunDieLu\202En\202Er\202Gai\301\357\204\004\352\204Yi\202Mu\202ShiAn\202Weiz\362\204ZhiMi\202Li\202Ji\202\3628\204WeiYouQiaXiaLi\202Yao\003\002\204{Z\205\006\337\204\003\002\204E\000\201E\000\201Yu\202XieBu\202\006\214\204Qun\003\014\204\003\014\204NaoLi\202Youz\374\204\006N\204Dao\371\260\204{x\205Tu\202\007\277\204JunGaoXiaYinYu\202"; -static const char b05d[769] = "\377\005\230\204KanLaoLaiz\374\204Que\006\237\204z\367\205z\367\205Ta\202LinHuaJu\202LaiQi\202MinKunKunZu\202Gu\202CuiYa\202Ya\202\006\025\204LunLun\006G\204JueDuo{Z\205GuoYin\004\352\204Han{Z\205Wei\3621\204Pi\202Yan\007\023\204Jie\005\005\204Zu\202Ku\202\004\352\204{\221\204Gu\202YinZi\202Ze\202z\362\205Yu\202Wai\360\350\204\003\014\204Qiu\360\350\204Ti\202Yi\202ZhiShiZaiYaoE\000\201ZhuKanLu\202YanMeiHanJi\202Ji\202z\362\204\005P\204\371\260\205Meiz\350\204Wu\202Yu\202\004#\204LanKe\202YanYanWei\004#\204ChaSui\006N\204Ke\202QinYu\202Qi\202LouTu\202DuiXi\202\006Z\204\010:\204\010\220\204\006N\204JieKaiLiuWu\202\007\023\204\006\214\204Zi\202Wei\005\005\204\3607\204Cuoz\350\204\003]\204NieCuoJi\202ShiRuo\007\023\204\004#\204{\240\205\006z\204\007\014\204z\355\204DieCen\003x\204Tu\202Lou{\221\205{\221\204{\221\204Ao\202CaoQu\202z\350\205CuiZuiDaoDaoXi\202Yu\202Pei\003\031\204z\374\205\007\177\204Bo\202Qin\003\002\204YanLao{\221\204Lin\006z\204\006z\204Jin\005\262\204DuoZun\003\002\204GuiYao\003\002\204YaoJue{\221\204Yi\202XueNaoYe\202Ye\202Yi\202Niez\374\204Ji\202XieKe\202Xi\202Di\202Ao\202ZuiWeiYi\202\006N\204Dao\005\357\204JieYu\202YueYinRu\202JieLi\202Gui\003\031\204\003\031\204\3607\204\006N\204Xi\202Ju\202z\355\204\004\377\204KuiYanWeiNao\301\357\204\010I\204\007A\204\006\337\204\3607\204\3607\204NieYanYanYanKuiYan\305X\205\005\271\204\305X\205\003c\204z\362\205\0050\204Xun\010I\204\010I\204Lie\003=\204Zuo\006\214\204Ju\202\003=\204Ju\202Wu\202Pu\202Pu\202ChaQiuQiuJi\202Yi\202Si\202Ba\202Zhi\002\376\204z\374\205Yi\202JinXun\007q\204Ba\202XunJinFu\202"; -static const char b05e[769] = "\377Za\202Bi\202ShiBu\202\003x\204{\276\205FanNieShiFenPa\202ZhiXi\202Hu\202DanWei{\221\205\005!\204DaiMo\202PeiPa\202TieBo\202{\207\204Zhi\003c\204Bo\202ZhiDi\202Mo\202Yi\202Yi\202\0102\204Qia\007q\204Ru\202{\276\205Dai{Z\205\3055\204\006\214\204{Z\204ShiQunXi\202\006l\204DaiGui\004\320\204\0102\204{\221\205SanWanDaiWeiz\355\205ShaQi\202Ze\202GuoMaoDu\202Hou{Z\205Xu\202Mi\202WeiWo\202Fu\202Yi\202\006l\204\0102\204Die\003=\204Panz\362\205TaoMi\202Jia\005\326\204Hui\362?\205{_\204ManMu\202\003t\204GuoZe\202Mu\202\006l\204{\221\205\0050\204z\355\204Fu\202ZhiHu\202Fan\305X\206Bi\202Bi\202{\221\205Mi\202\006\214\204z\355\204Fen\006\205\204\006l\204\004\320\204MieChuJiez\374\204LanGan\0102\204{\327\204{\240\204\002\354\204\002\354\204\003g\204GanYaoz\362\204YouYouJi\202{\012\205Pi\202\005P\204Ze\202{\012\205\372\230\206Mo\202\003\006\204Bi\202QinDun\305X\206GuiYa\202BaiJieXu\202Lu\202Wu\202\372\230\206Ku\202\004\377\204Di\202Pao\3607\204Ya\202\005\014\204\007\277\204Ci\202Fu\202\3628\204\003\247\204Feiz\374\205Yi\202Zhi\007\036\204ZhiXiuDu\202Zuo\3621\204Tu\202GuiKu\202\006\351\204\005P\204YouBu\202\002\354\204{x\205LaiBi\202Ji\202An\202Shu\007\014\204\003]\204Tuo\007\023\204Shu\003\006\204Yu\202Yu\202\005\014\204SouCe\202z\374\205FeiJiuE\000\201GuiLiuSha{\207\204\005\230\204SouZhiBu\202\003\006\204JiuJiuJinAo\202KuoLouYin\006z\204DaiLu\202Yi\202Chuz\355\204Tu\202Si\202Xin\005\014\204z\355\205Wu\202Fei{\012\205Ku\202\005\271\204Bi\202z\350\205XieLinLin\006z\204Lu\202Ji\202\004\377\204z\374\204\005P\204\003]\204Li\202\005P\204YinXunYan\005P\204Di\202Pai{\240\204HuiNaiHui\003=\204{\327\204"; -static const char b05f[769] = "\377Kai\303\362\204Yi\202Qi\202\010M\204FenJu\202YanYi\202\006a\204Bi\202Yi\202Yi\202Er\202SanShiEr\202ShiShi\003=\204\005,\204YinHu\202Fu\202\005\335\204Wu\202TuiChi{\240\205Ba\202\371\260\204Di\202{\221\205JueTaoFu\202Di\202Mi\202z\374\204Hu\202\010I\204Nu\202\0050\204{Z\204Yi\202Mi\202\301\357\204Wan\360\366\204Ruo\003P\204\0050\204\005,\204{\221\205{\240\205z\350\205\006\260\204Danz\350\205Bi\202Bi\202SheDan{\240\204GouGe\202Fa\202Bi\202Kou{\240\204Bie\3621\204DanGuo{\240\205\005\335\204Mi\202GuoWanJueJi\202Ji\202Gui\010\220\204Lu\202Lu\202\007\265\204HuiZhiHuiHuiYi\202Yi\202Yi\202Yi\202YueYue{_\204\003g\204Wen\3628\204YanYanYu\202ChiCai\003t\204\005,\204Bin\006\260\204\003]\204\007\335\204{\221\205\004\377\204ChiChi\004\334\204TuoJi\202\003%\204\362?\205Yi\202\305`\204CheBi\202Di\202\005\357\204Fu\202\305`\204{Z\205Cu\202\305`\204\0050\204DaiXi\202XunHen\360\350\204\006\333\204Lu\202Hou\305`\204{x\205ZhiXu\202\0050\204Tu\202\006&\204ZhiLai\006&\204De\202PaiXi\202\004\352\204Ji\202z\355\205Zhi\006&\204\003c\204LaiYu\202XieJie{\240\204ShiJia\303\362\204z\362\205Fu\202XunWei\003\247\204YaoWeiXi\202{Z\205\007\335\204Ti\202De\202{Z\205ZhiBieDe\202z\367\205Che\003\002\204Hui\003\002\204HuiMei\003\031\204z\374\205BaoQu\202XinXinBi\202Yi\202Le\202RenDao\003x\204GaiJi\202RenRenz\355\204TanTe\202Te\202GanQi\202ShiCunZhi\305`\204\006\351\204Xi\202Fan\004\377\204|\015\204MinWen\362?\205z\367\205Wu\202Ji\202Wu\202Xi\202JiaYouWan\006&\204\007\023\204\005\271\204Yu\202\303\362\204ZhiQi\202Cui{x\204TaiTunz\350\204{\327\204Hun{s\205Niu{\202\205z\374\204Xin\007\014\204Hu\202KaiFen"; -static const char b060[769] = "\377\006\333\204Tai\007\023\204Wu\202Ou\202z\355\205\305X\206Ju\202Yi\202Bao\010I\204MinPeiZuoZen\360\350\204Ju\202BanNu\202Nao{Z\205Pa\202Bu\202TieHu\202Hu\202Ju\202Da\202{\207\204Si\202\004\320\204Di\202DaiYi\202Tu\202YouFu\202Ji\202\006\260\204\003g\204\007:\204Ni\202\007\230\204Fu\202Xi\202Bi\202YouQie\003P\204\006&\204\002\354\204z\362\205Xu\202ChuBi\202ShuXi\202Tan\003]\204\004#\204DuiMo\202ZhiYi\202ShiNenXunShiXi\202Lao\005\313\204{\202\205MouZhiXie{\207\204\007\036\204z\362\205DieHao\006\237\204Gui\005\313\204Xi\202\003\002\204ShuSi\202Hu\202Qiu\360\350\204HuiHuiChiJiaYi\202{s\205\007\230\204LinHuiZi\202Xu\202Chi{_\205Nu\202HenEn\202Ke\202\004\352\204|\015\204\003=\204\301\357\204Xi\202QiaYue\006\260\204KenDe\202HuiE\000\201\3621\204\3628\204YanKaiCe\202NaoYun\006\351\204\003]\204\003]\204\007:\204Pi\202Kun\006\214\204YueYu\202Tu\202JieXi\202ZheLinTi\202HanHaoQieTi\202Bu\202Yi\202z\350\204HuiXi\202BeiManYi\202\005\313\204\007\023\204\301\357\204{x\205KuiWu\202Wu\202YouLi\202{\207\205z\362\204\006&\204Yi\202YueLi\202NinNaoE\000\201Que\003P\204z\350\204Wu\202Min\006&\204FeiBeiDe\202Cuiz\355\205MenLi\202Ji\202{\012\204{\012\204\003g\204DaoQi\202\006\237\204|\015\204LunXi\202KanGunNi\202\003\006\204\004\320\204DunGuo{\221\204\0050\204Wan\007:\204JinJi\202LanYu\202HuoHe\202\301\357\204TanTi\202Ti\202Nie\305`\204\301\321\204Hu\202HunXi\202z\355\205XinWeiHuiE\000\201Suo\004#\204{\240\204\003]\204\3607\204Ju\202Can{x\205De\202BeiQieCanDan{\012\204DuoNaoYunz\374\205\003p\204Diez\362\205\256\371\204{}\205Re\202\003g\204Ce\202\303\362\204Min\004#\204Ti\202"; -static const char b061[769] = "\377\006\214\204\004\320\204Bei\003P\204WeiGe\202z\350\204WeiYu\202Yu\202Bi\202\003P\204z\362\204MinBi\202Yi\202\003+\204\003]\204Kai\010\220\204YinE\000\201{x\204MaoQiaKe\202Yu\202Ai\202QieYanNuoGanYun\004#\204Sai\006G\204Fen\004\377\204KuiKuiQue\003=\204YunSu\202Su\202Qi\202Yao\007\023\204z\362\205Ji\202Gu\202Ju\202\305X\206Ni\202XieKai{Z\205\003]\204CaoXun\371\260\204Bo\202Kai\007:\204Xi\202Hun\003]\204\360\350\204Li\202SaoTaoYinCi\202Xu\202z\350\204Taiz\362\205Yun\371\260\204\305;\204\003=\204She\006&\204\007\335\204Mu\202Mu\202GuoChiCanCanCanCuiMinTe\202{\221\205\3628\204Ao\202\372\266\206Man{\012\204QueZaoJiuHuiKai{\207\204Ou\202\007\023\204QinYinLu\202{_\205Wei\007\265\204Manz\350\204She\003]\204\003\006\204\007\014\204Di\202ZhiLou\007q\204Qi\202Qi\202Yu\202\0102\204\006z\204\006&\204Youz\367\205Zhi\3628\204{x\205Qi\202Qu\202\006\260\204BeiBie{}\205\003\002\204\010\243\204Chi{\207\204\0102\204KuiHui\006\214\204{x\205YinYinXi\202Xi\202DanTanDuoDuiDuiSu\202JueCe\202\3621\204FanFenLaoLaoz\367\205HanQi\202z\374\204Min\0050\204\006z\204Wu\202CanJueCu\202z\374\204Tan\371\260\205Pi\202Yi\202Chuz\374\204NaoDanTan\0050\204\007\023\204Han\003\002\204Wei\003P\204\004\352\204QinQinJu\202CaoKenXie\004\377\204Ao\202MaoYi\202LinSe\202Jun\006\333\204MenLanAi\202LinYanKuoXiaChiYu\202YinDai\006\205\204Ai\202\006\205\204DuiQi\202Mo\202LanMen\004\320\204ZhiNuoNuoYan\360\350\204Bo\202Zhi{\202\205{\202\205YouFu\202LiuMie{x\205Huiz\355\204\006\205\204Lan\006\333\204\003P\204\010\314\204z\355\204Ji\202Ju\202z\362\204SheYi\202"; -static const char b062[769] = "\377{\207\204NanMi\202\005!\204Jue\006\025\204\006\025\204\372\230\206Ge\202YueWu\202{\240\204Xu\202Shu\006N\204Xi\202{x\205Wo\202JieGe\202{\240\204z\350\205Huoz\350\205{\221\204\004\352\204Qi\202JiaDieZeiJiaJi\202ZhiKanJi\202KuiGai\005\262\204{\221\204z\350\205Ge\202{\240\204JieYu\202{\240\204YanLu\202Hu\202{\221\204Xi\202Xi\202\301\321\204DaiQu\202Hu\202Hu\202Hu\202E\000\201ShiTi\202MaoHu\202Li\202\003%\204Suo\303\362\204\3607\204z\343\205{_\205Yi\202Yi\202{_\204Hu\202FeiYan\002M\204\002M\204CaiZhaQiuLe\202Pu\202Ba\202Da\202\007\357\204FanRu\202ZaiTuo{\221\205\005,\204\007\014\204Yu\202Ku\202Gan\371\260\204ChaTuoGu\202KouWu\202Denz\350\204ZhiRenKuoMenSao\360\350\204NiuBanCheRaoXi\202z\350\204BanJiaYu\202Fu\202Ao\202Xi\202Pi\202ZhiZhiE\000\201Den\002\376\204{x\205Ji\202Yan{\202\205\303\362\204\010I\204Ju\202WenHu\202YueJueBa\202QinDan{Z\205YunWanNe\202Yi\202Shu|\024\204PouTouDou\007\014\204ZhePouFu\202PaoBa\202Ao\202Ze\202\007\265\204KouLunz\350\205YunHu\202Bao\002\354\204Zhi\006\260\204NanBu\202Pi\202TaiYao{Z\204Zha\360\350\204BaoHe\202Ni\202Ye\202Di\202ChiPi\202JiaMo\202Mei{x\204Ya\202\004\320\204Qu\202MinChuJiaFu\202ZhaZhuDan\005\020\204Mu\202{\327\204La\202Fu\202PaoBanPaiLinNa\202\007\230\204z\350\204Ju\202Ta\202Ba\202TuoTuoAo\202Ju\202\004\334\204Pan\002\376\204BaiBaiDi\202Ni\202Ju\202Kuo\003\031\204{\240\204Qia\003]\204Lan\006\373\204Bo\202Ze\202z\350\204HenKuoShiJie{Z\205Nin\003=\204\003=\204\301\357\204\372\266\205CunZa\202KaoYi\202XieCe\202HuiPin|\024\205ShiNa\202"; -static const char b063[769] = "\377BaiChiGuaZhiKuoDuoDuoZhiQieAn\202\010M\204{Z\204Ge\202\003\002\204Kua\004\352\204Na\202\007\036\204LieZhaLu\202DieWa\202JueLieJu\202Zhi\006\337\204Ya\202Wo\202Ta\202XieNao\010\220\204\003\002\204{Z\205Ji\202Huiz\374\204Yu\202Ai\202TuoNuoCuoBo\202\007\277\204Ti\202{Z\204{x\205Sa\202Sa\202\007\243\204Mei\010M\204Ju\202\006\260\204{\240\204Yi\202\005P\204{_\204RuaWanXieCha\003\014\204\003\002\204Wu\202JunJiu\3628\204KunHuoTu\202\004\334\204PouLu\202Ba\202Han\360\366\204Nie\007q\204Ze\202ShuYe\202JueBu\202WanBu\202ZunYe\202\005(\204Lu\202SouTuoLaoSun\006l\204{\240\204z\362\204DaoWeiWanQin\006\260\204SheLieMinMenFu\202BaiJu\202DaoWo\202Ai\202\007q\204Yue\004#\204{x\204\257\320\204JieTu\202BenNa\202{\327\204RuoZuoWo\202Qi\202z\374\204{x\205\3607\204SaoLun\003\006\204\006\025\204Duo\002M\204\005,\204PouDi\202{\221\205HunJi\202TaoQiaQi\202PaiShuz\350\204\005\357\204Ye\202Ya\202Jue{Z\205{\207\205GuaYi\202Huo{_\204{Z\205LueCaiTanChe\002\354\204JieTi\202\006\237\204TuiYanCuo\003c\204Ju\202|\015\204z\350\204KenBaiPa\202JieLu\202\007\230\204\305;\204JieZhiDan\006\205\204CanSao{\012\204\006\260\204\007:\204Nuo{\240\204{Z\205Jiu{\240\204Yu\202YanKuiNan\005\335\204RouPi\202WeiSaiZou\003P\204\005\014\204Ti\202NieChaShi\004#\204{Z\204Yi\202Xun\003]\204\303\362\204\360\350\204z\362\204YanZanAn\202Xu\202Ya\202Wo\202Ke\202{\252\205Ji\202Ti\202La\202La\202{x\204KaiJiuJiuTu\202JieHuiGenz\367\205\3621\204DieXie\007:\204z\350\204Ye\202ChaZhaBeiYaoWei\005\005\204LanWenQin"; -static const char b064[769] = "\377z\355\204Ge\202Lou\004#\204Gen\003\002\204GouQin\006N\204Que\004\320\204{\252\205{\221\204SunSunBo\202Chu\006N\204\006l\204CuoSaoKe\202YaoDaoZhiNu\202La\202{\240\204SouQiuGaoz\374\204\010\016\204\010\230\204JinMieE\000\201\257\320\204Nuo{_\204Ta\202Zha\005!\204PanBanDa\202Li\202TaoHu\202ZhiWa\202Huaz\350\204Wenz\350\205|\015\204{Z\204E\000\201XieNuo\301\357\204ChaZhaGe\202Wu\202En\202She\007\014\204SheShuBaiYaoBinSouTanSa\202z\355\204SuoJiuz\367\205\305X\206\007\230\204\002\354\204\003\014\204{\276\205Di\202Qi\202Sou\005(\204{\207\204{x\205Chi{\012\204Lu\202LuoLou\004#\204GaiHu\202Zha\305X\206\005!\204HuaCuiNaiMo\202{\240\205Gui\004\377\204ZhiAo\202ZhiNieManz\355\204KouChuShe\007\265\204\003\002\204Mo\202Mo\202ZheCan\007\243\204\003t\204{\240\205YaoGouz\350\204\006z\204Ji\202\004\377\204JuePiePieLaoDunz\374\204\005\253\204GuiZanYi\202z\374\204{x\205{x\205Sa\202Nao\005\335\204Si\202Han{\012\205Da\202Zun{\327\204Lin{Z\205Hui\372\230\206\003\002\204Ji\202CaoDanDanCheBo\202CheJueFu\202\006z\204BenFu\202\006\214\204Bo\202Cuo\004\334\204\372\230\205WeiPu\202QinDun{\327\204HuaXieLu\202\003\002\204\007A\204Ta\202Han\006\214\204Wo\202{\240\204Gan\003]\204Lei\006\220\204Lu\202{_\204\004\334\204Ze\202Pu\202\301\321\204Ji\202\010\220\204Se\202Cao\003\006\204\003\006\204z\362\204JieQin\005\271\204DanXieKa\202Pi\202BaiAo\202Ju\202Ye\202E\000\201\006\205\204SouMi\202Ji\202Tai\004\334\204Dao\003g\204LanCa\202Ju\202Ye\202Ru\202Ye\202Ye\202Ni\202Wo\202JieBin\006\373\204Ge\202ZhiZhiKuoMo\202{\240\204XieLieTanBaiSouLu\202LueRaoTi\202"; -static const char b065[769] = "\377Pan\360\350\204LeiCa\202ShuZan{\327\204z\374\204JunHuoLi\202La\202z\362\204\004\377\204Lu\202\003\031\204z\350\204z\350\204Zanz\350\204Lanz\374\204\004\377\204Mei\010\314\204z\355\204\006Z\204\007A\204XieSheLuoJunMi\202ChiZan\006\337\204Tan\010k\204Li\202\3607\204Wa\202\010\220\204\003\002\204JueLanLi\202\006\220\204ZhiGuiGuiQi\202XunPu\202Pu\202\002M\204KaoYouGaiYi\202\003=\204GanBan\003%\204{Z\205Po\202\3607\204KouMinWu\202Gu\202He\202Ce\202\3621\204Mi\202ChuGe\202Di\202Xu\202\003\002\204Min{x\204Jiu\371\260\204DuoYu\202ChiAo\202BaiXu\202\003\002\204Duo{\207\204NieBi\202z\355\205\3607\204DuoYi\202GanSanKe\202YanDunJi\202Tou\3621\204Duo\003\002\204\0050\204\360\350\204XiaMinShuAi\202\006\214\204Ai\202{Z\205Di\202{Z\204Fu\202Shu\006z\204Qu\202{s\205Yi\202\003\002\204{_\204\003\002\204\004\334\204Yi\202{\207\204Bi\202Li\202\3621\204\3621\204WenXueQi\202Qi\202\005(\204BinJue\005(\204\005\230\204FeiBanBanLanYu\202LanWeiDou\371\260\205\006z\204JiaHu\202XieJiaYu\202{Z\204\003\002\204Wo\202\007\036\204DouJinChiYinFu\202z\350\205{\221\204Qu\202\004\334\204{\221\204\0070\204CuoSi\202Xin\004\334\204\004\334\204QinLin\004\334\204Chu\0070\204Zhu\003%\204z\355\204\004\272\204Yu\202ShiPeiYouMei\003\247\204Qi\202{\221\204MaoLu\202PeiPi\202LiuFu\202\003%\204\003P\204\0050\204\0050\204Ni\202Zu\202\002\376\204Yi\202Liu\360\366\204{\240\204Yu\202Yi\202Qi\202ZhiFan\007\335\204Fan{\221\204\005\271\204SuiYu\202Wu\202Ji\202Ji\202Ji\202HuoRi\202DanJiuZhiZaoXie\007\036\204XunXu\202Ga\202La\202GanHanTaiDi\202Xu\202z\355\204Shi{\202\205\360\350\204Shi\305`\204MinMinTun\256\371\204Wu\202"; -static const char b066[769] = "\377YunBeiAngZe\202BanJieKun\371\260\205Hu\202\003%\204HaoGuiz\355\205\003P\204\305;\204HunFenQinHu\202Yi\202Xi\202XinYanZe\202\003%\204Tan\371\260\204Ju\202\360\350\204Zan\002\354\204\003g\204\004\377\204\003P\204Po\202{Z\204\005\357\204\256\371\204HaoMeiZuoMo\202\303\362\204Xu\202Hun\002\376\204\004#\204ShiShiYu\202FeiDieMaoNi\202z\355\205Wen\004\352\204Ai\202\002\354\204Ang\003c\204\003\031\204z\374\204{\202\205\007\036\204\010I\204Shiz\362\205z\362\205\003P\204KuiXu\202\003\002\204JinZhiJin{_\205\3628\204\005\335\204YanGaiz\374\205\007\261\204\3621\204Ye\202YunHuiHanHanJunWanz\374\204Kun\003c\204Xi\202{x\205\371\260\205Bu\202ZheZheWu\202WanHuiHao{x\204Wan|\015\204\004\334\204Zui\003c\204Pu\202\0050\204Xi\202{_\204Ni\202Xi\202\003\006\204Qi\202\0050\204Gui{Z\205Yi\202ZhiAn\202WanLin{\207\205z\355\205\305`\204\3621\204ZanFei\003P\204\007\277\204Yi\202XiaYunHuiXu\202MinKuiYe\202\004\377\204ShuWeiShu\003\006\204MaoNan{\240\204\007\326\204An\202\360\350\204\256\371\204YaoSuoPu\202\305;\204\003\002\204KaiGao\006Z\204z\355\205Qi\202HaoYanLi\202Ai\202Ji\202Ji\202MenZanXieHaoMu\202Mo\202\006&\204Ni\202{\221\205HuiBaoHan\003P\204\305X\205\006z\204z\374\204Tan\0050\204PieLinTunXi\202Yi\202Ji\202z\362\205DaiYe\202Ye\202Li\202Tan\3628\204\3621\204Fei\371\260\204\002\376\204HaoYi\202z\374\205\003g\204\371\260\204\003\002\204Bao\0050\204YanAi\202Ye\202Ru\202Shu\006\205\204XunYaoPu\202Li\202{x\204{\202\205Die\006z\204YanHuoLu\202Xi\202\006N\204\003\031\204\006\220\204Luo\006\337\204\007\261\204\005!\204YanZhuYueYueQu\202Ye\202\007\277\204Ye\202Hu\202He\202ShuCaoCao\371\260\205Man\007\177\204\007\177\204Ti\202"; -static const char b067[769] = "\377ZuiCanXu\202HuiYinQieFenPi\202YueYou\005\253\204\006\260\204FenFu\202\005\357\204FeiQu\202Ti\202Nu\202\007\036\204\010\016\204{Z\204\005\230\204\005\230\204Zui\305;\204z\362\205\305`\204Tun\010I\204Ji\202Qi\202\004\377\204\004#\204\305`\204\3628\204\005\230\204Lao\006\205\204\003\031\204Mu\202\005\262\204WeiMo\202BenZhaShuShuMu\202ZhuRenBa\202Pu\202DuoDuoDaoLi\202GuiJi\202JiuBi\202Xiu{x\205Ci\202ShaRu\202Za\202\301\357\204z\350\204Yu\202GanWu\202Cha{_\204XunFanWu\202Zi\202Li\202\003g\204CaiCunRen\003t\204TuoDi\202{\221\205\006\351\204ChiYi\202Gai\003=\204Du\202Li\202Qi\202Shu\006\025\204\007\036\204{\240\205\003+\204WanLaiJiu\006\351\204\360\350\204Ma\202\005\014\204Si\202\007:\204\004\272\204FeiBeiJie\004\352\204GaoYaoz\374\204Chu\256\371\204Pa\202ShuHuaXin\004\320\204Zhu\004\320\204\007\023\204Ban\007\023\204Ji\202Wo\202JinGouJi\202MaoPi\202Bi\202\305`\204Ang\003%\204FenYi\202Fu\202NanXi\202Hu\202Ya\202DouXin{Z\204YaoLinRuiE\000\201Mei\002\376\204GuoZhi\006&\204YunZui\371\260\205ShuZaoDi\202Li\202Lu\202{\240\204{x\205\007\023\204z\350\205\003\014\204{\221\204\3621\204z\374\204Ku\202\0102\204TaiXi\202Zhi\007\230\204\3621\204JiaJiaGouBaoMo\202Yi\202Ye\202Ye\202ShiNieBi\202DuoYi\202\005\357\204\002\354\204Ni\202La\202He\202BanFan\362?\205DaiCi\202\360\350\204Fu\202BaiMouGanQi\202RanRouMao\360\366\204\007\023\204ZheXiaYou\371\260\204GuiTuoZhaNan\006\373\204\003]\204Di\202ZhiZhaChaDanGu\202Bu\202JiuAo\202Fu\202{\240\204Ba\202DuoKe\202NaiZhuBi\202Liu\005\020\204{_\204Si\202ChuPeiShi\007\230\204ZhaYao{x\205JiuShi"; -static const char b068[769] = "\377ZhiLiuMeiLi\202\006N\204ZhaZao\003t\204{\221\204Zhi\003\031\204\004\352\204Lu\202\371\260\205Li\202Lan\003]\204ShuXun\372\266\205Qi\202{Z\204Qi\202Li\202Yi\202z\374\205{Z\204Li\202Se\202GuaKanBenRen\3621\204BaiRen\002\354\204Zi\202\004\320\204Yi\202Ci\202Xu\202Zhu{\240\204ZuiEr\202Er\202YouFa\202\003=\204KaoLao{\221\204LieYin\360\350\204He\202GenYi\202ShiGe\202Zai\006\337\204Fu\202Jie\005\313\204GuiTao{\012\205Wei{\202\205Ru\202An\202An\202\007q\204Yi\202\004\334\204Ku\202Zhi{}\205\3628\204\010\230\204\010\230\204z\362\204Ju\202JiuXueDuo\003p\204Yu\202Zan\005\275\204\004\377\204JieLiu{\221\204Ya\202Rao{Z\204\010\220\204Qi\202\006\214\204HuaGui{\240\205\372\230\206XunSuoSha{Z\204Bei\005P\204Kuo\0050\204Po\202BenFu\202Rui\3628\204JueXi\202\005\230\204Liu\003\014\204Qi\202WenJunGanSu\202{\207\205Qiu\005P\204YouMei\006l\204\003\031\204\006\260\204\372\230\206Di\202\003P\204Tu\202ZaoAo\202Gu\202Bi\202Di\202HanZi\202ZhiRenBei\007\277\204{\240\204z\362\204WanNuoJia\007\036\204Ji\202\3621\204Lu\202Hun\360\366\204CenFen\007\023\204\006\205\204Wu\202Li\202Li\202DouQin\004\377\204SuoJu\202Ti\202XieKun\004\334\204Shuz\355\204FanWei\0050\204Li\202BinXiaFo\202TaoZhiLai{\207\204{\240\204\004\334\204\005\357\204Li\202Qi\202\002\354\204Lun\006&\204z\350\204\003+\204Qi\202Qi\202CaiGunz\355\204De\202FeiPai\006l\204\006l\204Hun\004#\204{x\205ZaoJi\202Li\202\006\260\204Yu\202Yu\202Gu\202Jun\004\352\204\005!\204\006\025\204\305`\204Di\202CuoFan{x\205{\221\204Qi\202\007:\204YanYu\202\301\357\204Yi\202SenRen\257\320\204\006G\204Qi\202\004\334\204Fu\202Ke\202LaiZouZou\002\376\204{\012\204FenFen\371\260\204\003\006\204Ni\202"; -static const char b069[769] = "\377WanGuoLu\202HaoJieYi\202\004\320\204Ju\202Ju\202{x\205Zuo{\207\205z\350\205Zhi\257\320\204Ya\202Ju\202Bei\003\002\204\004\334\204Zi\202Bin\006\260\204\003x\204Chuz\355\205MenHua{\240\204GuiXi\202Du\202z\350\204DaoGui\3607\204LuoZhi\301\357\204\305;\204Fu\202\007\277\204\006\260\204{_\204Yi\202TuoSenDuoYe\202Fu\202WeiWei\0070\204Jia\004#\204{\240\204Yi\202\371\260\204Xi\202YanYan\305X\205{\240\204\256\371\204Yu\202He\202ZhaWo\202\003I\204Bi\202YaoHuoXu\202Ruo\360\350\204La\202YanBenHuiKuiJieKuiSi\202\003\014\204XieTuoZhi{\240\204Mu\202MaoChuHu\202Hu\202{\207\204\006G\204\005P\204NanYu\202YouMei\007\023\204\003P\204\003P\204\360\350\204{Z\204\003I\204Ye\202Ji\202JieYe\202ChuDunYu\202ZouWeiMeiTi\202Ji\202JieKaiQiu\004\377\204Rouz\362\205LouLe\202\301\357\204z\374\205PinShiGaiTanLanWenYu\202{x\204Lu\202Ju\202\371\260\204ChuBi\202XieJiaYi\202{\221\204Fu\202NuoMi\202\005\230\204\006N\204Gu\202{\240\204Ju\202Ta\202Yao{Z\204\006l\204Sha\007:\204Zi\202\305;\204Su\202JiaYaoJiez\362\205GanFeiZhaz\350\204Ma\202Sun\007:\204Xie\006N\204ShiZhiCuiWen\005P\204Liu\006N\204\005!\204Que\005(\204Si\202\371\260\205Ta\202Ke\202Xi\202Gu\202Qi\202GaoGaoSunPanTaoGe\202\256\371\204\3607\204NouJi\202\010\016\204Gou\257\320\204z\350\205Chaz\350\204\006\333\204MeiXu\202\006\025\204Gao\004\334\204Tuo\006\214\204\360\350\204\3607\204JiaKanZuiDao\003\031\204BinZhu\010\230\204Xi\202Ji\202{\207\204Hui\003]\204z\350\204GuoGaiGai\007\265\204HuaQi\202SenCui\006\260\204YouHu\202{\240\205Hu\202z\362\204GuiNieYi\202Gao\007\014\204GuiGuiCaoManJin"; -static const char b06a[769] = "\377Di\202\372\230\206Le\202\005\230\204{x\204\006&\204Li\202Xiu\003\006\204\372\266\206Fan\3628\204{\012\204Ze\202Su\202LeiLu\202{\207\205Mi\202Lou\010I\204Su\202Ke\202Chu\005!\204\003t\204Lu\202JiuZheZhaShu{\221\205ManMo\202\003\025\204\360\350\204\007\036\204\006\260\204ZhuShaXi\202\301\357\204\005\313\204{\240\204\006&\204Ji\202Yanz\350\205Xue\004\377\204Er\202XunZhi\006\214\204Zui\006&\204Pu\202ShuHuaKui{Z\204ZunYue{_\204Xi\202\256\371\204\3607\204Fa\202GanMo\202Wu\202\006\214\204RaoLinLiu\006\214\204z\374\204RunFan{\221\204TuoLaoYun\007\221\204Dun{x\205\005!\204\006\205\204Ju\202{x\205Su\202JueJue\3607\204HuiJi\202Nuoz\374\205Tuo\006\373\204RuiZhu\3628\204\010\243\204Fen{}\205Ran\005\313\204z\350\204Gu\202LiuLaoGaoChuXi\202\371\260\205Zi\202SanJi\202Dou\0050\204Lu\202{\240\204Chu\007:\204Ta\202Shu{\240\205TanLin\010M\204YinXi\202Hui{_\204Zui\003P\204{x\205GanJu\202ZuiYi\202QinPu\202YanLei\003\014\204Hui\010\220\204Ji\202SuiBo\202\0102\204{x\205Chu|\024\204GuiJi\202JieJia\003\006\204\005(\204{\240\204z\350\205DaoYi\202\003t\204\007\023\204SheLinLi\202Cha\006\205\204YinTaoTai\003+\204Qi\202\007\265\204BinHuoJi\202z\350\204Ni\202\006\373\204Yi\202GaoKanYinNou\003\006\204YanQi\202Mi\202\002\376\204Gui\256\371\204Ji\202KuiPo\202\005\262\204ChuGe\202\003+\204YouZhiz\362\205z\350\204LeiLeiSa\202Lu\202Li\202\007A\204Lu\202MieHuiOu\202Lu\202ZhiGaoDu\202\007:\204Li\202Fei\004\334\204Sou{\207\204{\240\205Chu\003\006\204ZhuLu\202YanLi\202Zhu{x\204JieE\000\201Su\202\006\333\204NieYu\202\003\031\204Lai\003\002\204z\374\204GuiJu\202\3621\204\005\357\204\004\377\204{\240\204YinYou\004\377\204"; -static const char b06b[769] = "\377z\374\205\010M\204Bo\202z\355\204LanJu\202\372\266\206SheWei\006&\204\301\357\204Qu\202\010:\204JiuYu\202LuoLi\202\007A\204\006\337\204\010\220\204JueYanLanLanZhuLeiLi\202Ba\202\006\220\204Yu\202\005\357\204{\012\205z\350\204Ci\202z\362\204XinYu\202Yi\202z\350\204Ou\202Xu\202\010I\204ChuQi\202KaiYi\202JueXi\202Xu\202He\202Yu\202Kui\005\230\204{\202\204\010\016\204Xi\202Ai\202Yi\202Qi\202{\252\204ChiQin{\202\204Kan{\202\204Kan\305X\205ShaGuaYinXinXieYu\202z\350\204\3621\204Ye\202Ge\202Wu\202TanJinOu\202Hu\202Ti\202z\362\204Xu\202PenXi\202\3621\204{\252\204She{_\204HanChuYi\202E\000\201Yu\202\301\321\204z\362\204Zhi{Z\205Ci\202Bu\202Wu\202Qi\202Bu\202Bu\202WaiJu\202z\350\204ChiSe\202ChiSe\202\362?\205SuiSuiLi\202Ze\202Yu\202Li\202GuiDaiE\000\201Si\202{\240\204ZheMo\202Mo\202YaoMo\202Cu\202\360\350\204|\015\204\371\260\205Dai{_\205Xu\202XunShuCanJue\007\335\204QiaQiuSu\202\003\006\204Yun{\207\204Yi\202FouZhiYe\202CanHunDanJi\202Die{Z\204YunWen\004\320\204BinTi\202Jin{_\205Yin\005,\204JiuHui\007A\204Yi\202DanDu\202{\240\205{\207\204BinDu\202{\240\204{\240\204ShuOu\202\0070\204ZhuYin\003\006\204Yi\202Sha\006\214\204Ke\202\3621\204Xun\3607\204HuiHuiGu\202\006\214\204Ji\202Yi\202Ou\202Hui\0070\204Yi\202\3621\204Wu\202{\012\204Mu\202MeiMeiAi\202JieDu\202Yu\202Bi\202Bi\202Bi\202Pi\202Pi\202Bi\202z\355\204MaoHaoCaiPi\202LieJia{\221\204SaiMu\202TuoXunEr\202\006N\204z\374\204Ju\202Mu\202HaoQiuDouShaTanPeiJu\202DuoCuiBi\202SanSanMaoSaiShuShuTuoHe\202{\240\204Ta\202San"; -static const char b06c[769] = "\377Lu\202Mu\202Mao\3628\204\006N\204z\355\205Pu\202Lu\202{\221\204Sao{\221\204\006\205\204Lu\202Qu\202DieShiDi\202MinJue\006\351\204Qi\202PieNaiQi\202Daoz\374\204\305X\205Fen\360\350\204NeiBinFu\202\371\260\204\004\352\204\003\006\204Qi\202YinXi\202Hai\360\350\204An\202Ya\202Ke\202\003\006\204Ya\202\004\352\204DanLu\202\003\006\204\360\350\204YunYun\3055\204\3055\204{Z\205\002\354\204\003]\204\010\220\204\3055\204Le\202Ni\202TunFanGui\005P\204ZhiQiuBinZe\202\003+\204\007A\204Hui\005,\204HanCha\004\334\204\305X\205WanFanDa\202Xi\202Tuo\006\351\204QiuQi\202{_\204PinHanz\350\204Wu\202Wu\202XunSi\202Ru\202\003=\204{\240\205ChiWu\202Tu\202Jiu\005!\204ZhiZhiz\350\204Mi\202Gu\202\305`\204\0050\204\0050\204RuiJun\005\335\204Tai\301\357\204Ji\202\303\362\204\303\362\204GanWen\362?\205\003%\204{s\205JueHu\202NiuQi\202FenXu\202Xu\202QinYi\202Wo\202Yun\007:\204\004\272\204Yan\371\260\204{x\204DanYouDunHu\202HuoQi\202Mu\202Nu\202MeiDa\202\003+\204Mi\202z\367\205\003\247\204Bi\202ShaZhiPeiPan\003p\204Za\202GouLiuMeiZe\202\003\014\204Ou\202Li\202Lun\010:\204\003\014\204WeiHu\202Mo\202MeiShuJu\202Za\202TuoTuoTuoHe\202Li\202Mi\202Yi\202Fa\202FeiYou|\015\204Zhi\002\376\204Gu\202{\221\204YanSi\202{\202\205z\343\205Ju\202XieQiuYi\202Jia\362?\205\301\357\204Po\202HuiMi\202BenZe\202ZhuLe\202YouGu\202\005\335\204GanFa\202MaoSi\202Hu\202\0102\204Ci\202FanZhiSu\202\006\373\204{x\205\005\357\204PaoBo\202Qi\202Si\202Ni\202Ju\202Sa\202Zhu\371\260\205Lei\003P\204JueFu\202PanMinTai\360\350\204Ji\202\003]\204{\012\204\005\005\204Xue\003\031\204Lu\202DanLuoXiePo\202Ze\202\0050\204Yin"; -static const char b06d[769] = "\377PanJieYe\202HuiHuiZai{x\205YinWeiHou{\240\204\360\350\204LieSi\202Ji\202Er\202\003g\204Fu\202Sa\202Se\202ZhiYinWu\202Xi\202KaoZhu{\240\205LuoLuoAn\202\004\352\204Ti\202MouLeiYi\202Mi\202\301\357\204JinPo\202Wei\3621\204Xie\005\335\204Xu\202Su\202{\202\205TaoQieJu\202Er\202\003c\204Ru\202\0102\204Xun{s\205Zhi{\012\205z\362\204\305;\204HuoWa\202QiaPaiWu\202Qu\202LiuYi\202Jia\0050\204z\350\204{\240\205\003\002\204{Z\204Shi\004\334\204Ce\202Fa\202HuiJi\202Liuz\355\204HunHu\202\010M\204XunJinLieQiuWeiZheJunHan\006l\204\006\351\204\004\334\204YouXi\202Bo\202Douz\362\204\005\335\204Yi\202Pu\202\004\377\204LanHao\005\230\204HanLi\202\007\277\204Fu\202Wu\202{\207\204\256\371\204\003\014\204Yi\202Yu\202\3628\204LaoHaiJinJiaz\367\205z\343\205MeiSui{x\205Peiz\374\204\371\260\204Tu\202Kun\0102\204NieHan\0050\204\3621\204She{\327\204Tu\202\003]\204\3621\204z\374\204\005P\204E\000\201Su\202Tun\007q\204CenTi\202Li\202\3055\204Si\202Lei\3055\204TaoDu\202LaoLai{\207\204WeiWo\202Yunz\362\204Di\202\005\313\204Run{\240\204{\221\205Se\202Fu\202{\012\204\003g\204\002M\204\372\266\205Ya\202\301\321\204{\221\205Ye\202\006\237\204Wo\202HanTuo\004\352\204He\202Wo\202Ju\202She{\207\205HunTa\202\004\334\204\3607\204QieDe\202\007q\204Zi\202Xi\202\3621\204Qi\202Gu\202GuoYanLin\005!\204\003c\204\006\260\204Haoz\355\205ShuQi\202\003%\204ZhiLu\202NaoJu\202Tao\006&\204LeiZhe\0102\204Fei\007\023\204|\015\204Pi\202DanYu\202Ni\202Yu\202Lu\202GanMi\202\0050\204\005\357\204LunYinCuiQu\202\006\333\204Yu\202{\327\204\371\260\204\003t\204\256\371\204Hu\202\007:\204LaiHun\003\006\204Yanz\350\204|\015\204\005\014\204ZhiYinBo\202"; -static const char b06e[769] = "\377Ben\007:\204WenRuoFei\003\006\204\007:\204Ke\202Ji\202She\007:\204Se\202Lu\202Zi\202Du\202Yi\202{\240\204\003+\204PaiXi\202Yu\202\007:\204\371\260\204\371\260\204Rouz\362\204Zhu{\240\204\007\326\204Yu\202Qiu\005P\204Qu\202Du\202FanZhaBo\202Wo\202Wo\202Di\202WeiWenRu\202XieCe\202WeiHe\202\006\025\204Yan\005\335\204\003P\204Mi\202Ke\202Mao\004\377\204YanYou\005\335\204\005\014\204\371\260\205MeiZaiHunNaiGuiChiE\000\201PaiMei{\207\204Qi\202Qi\202Mei|\015\204CouWeiCan\007\265\204\003+\204HuiMo\202Xu\202Ji\202Pen{\240\204{\240\204Hu\202\003\014\204z\374\205Yi\202Yin{\221\204ShiJie{x\205z\362\205TanYu\202Bi\202MinShiTu\202\371\260\205\003]\204Ju\202\004\352\204\007\265\204\003\002\204\003\002\204QiuYan\005!\204\003\031\204Huo\007:\204NanBanYou\301\357\204\372\230\206{\207\205z\355\204z\374\204\256\371\204NieZi\202WanShiMan\004\377\204La\202Kui\003\014\204{\240\204Xu\202LouWeiGaiBo\202\004\377\204Po\202JinYan\005!\204\007:\204Suo\007:\204{\207\204Yao\006\205\204\007g\204{x\205Ke\202TaiTa\202Wa\202LiuGouSao\305;\204ZhaShiYi\202LunMa\202Pu\202WeiLi\202ZaiWu\202Xi\202Wenz\350\205Ze\202ShiSu\202Ai\202QinSouYunXiuYin\006N\204HunSu\202SuoNi\202Ta\202ShiRu\202Ai\202PanChuChu\003\247\204\006Z\204\010:\204MieGe\202\3607\204Haoz\362\205Xi\202Zi\202Di\202Zhi\003g\204Fu\202JieHuaGe\202Zi\202Tao\005\326\204SuiBi\202\003\002\204HuiGunYinGao\003\031\204ZhiYanSheMan\004\377\204\256\371\204Lu\202Lan\006\337\204YaoBinTanYu\202XiuHu\202Bi\202\003t\204Zhi{\240\205Kou\371\260\204{_\205Di\202Mi\202Ao\202Lu\202Hu\202Hu\202Youz\355\204Fan\003]\204GunMan"; -static const char b06f[769] = "\377\003\006\204Yu\202\007\335\204Ji\202Ya\202\010I\204Qi\202Xi\202Ji\202Lu\202Lou\003\031\204JinGuo\006&\204LouZhiGaiz\350\205Li\202YanCao\003\002\204\006&\204\256\371\204\007\265\204Ou\202\005\326\204Ye\202Xi\202Mi\202\005!\204Mo\202{_\205Han{\207\204LanWa\202ChiGan\003\014\204\003P\204Yi\202ManZi\202\006\351\204\007\014\204Luo\006\260\204Shu{\221\205{\221\205\372\230\206Xu\202z\362\204Huo{\240\204Yan\372\266\206\006z\204CuiTi\202\360\350\204{\240\205\006&\204\004\377\204\005\335\204XiuShu{\012\204\004\377\204\3621\204\004#\204KunXu\202{\207\204ZhiWeiPi\202Yu\202\003\002\204Po\202\010\220\204HuiJieWu\202Pa\202Ji\202PanWeiSu\202z\350\204z\350\204Xi\202Lu\202Xi\202XunDunz\362\205MinRunSu\202Lao{Z\204\006&\204Yi\202ZheWan{_\204Tan\010I\204XunKuiYe\202\360\366\204Tu\202ZhuSa\202HeiBi\202{_\204z\355\204z\355\204Shu\3628\204Pu\202LinWeiSe\202Se\202{x\205z\343\205{x\205Hua\003\002\204LaoCheGanCun\005\335\204Si\202Shu\006\260\204HanYunLiu\005\335\204Fu\202HaoHe\202z\374\204{\240\204{_\204Xi\202Yu\202Lu\202Lan\006\373\204Yu\202Lin\003+\204Zao\010\220\204z\362\204Ze\202XieYu\202Li\202ShiXue\005\357\204WanZi\202\003]\204HuiCan{\207\204\3607\204Ye\202Ao\202z\362\204{Z\204z\355\204ManDanDanYi\202SuiPi\202Ju\202Ta\202QinJi\202\004\334\204{\207\204\010M\204GuoJinFenSe\202Ji\202SuiHuiChuTa\202\007\023\204\003x\204Se\202ZhuLaiBin{\207\204Mi\202ShiShuMi\202\006\373\204\004\377\204\004\377\204\006\205\204JinQi\202Bi\202Ji\202HaoRu\202CuiWo\202TaoYinYinDuiCi\202Huo\003\006\204LanJunAi\202Pu\202\004\334\204WeiBinGu\202z\350\204\004\377\204BinKuoFei\010:\204Me\202{\240\204WeiLuoZanLu\202Li\202"; -static const char b070[769] = "\377You\360\350\204Lu\202Si\202Zhi\004\377\204Du\202\305`\204HuiXiePan\371\260\204\003t\204z\355\204Mo\202Liu{\240\204Pu\202Se\202{x\205Gu\202BinHuoz\374\204Lu\202QinHan\004\377\204\006N\204Li\202\0050\204\3621\204\004\377\204SuiWeiXie\006\333\204XueZhu\003\031\204LaiDuiFanHu\202LaiShu\005\357\204\004\377\204Mi\202Ji\202{\207\204{\240\204\004\377\204FenLinYi\202{\240\204Yuez\355\204Dai\010\314\204{\240\204LanFan\372\266\206\007:\204\004\334\204\003\014\204SheLeiLan\006&\204Qu\202\003]\204z\350\204Fa\202{\012\204JueYanHao\004\377\204Sa\202Zan\006\337\204YanLi\202Mi\202{_\204Tan\010\220\204\003\002\204z\355\204\004\377\204HaoBa\202ZhuLanLan\006\220\204Wan\006\337\204Xunz\374\204YanGanYanYu\202Huo\003t\204Mie{\012\205\005\262\204Hui\3621\204\3621\204Hui\005\335\204\005\357\204Zao\372\230\205JiuZhaXieChi\004\334\204ZaiZaiCan\360\350\204Qi\202\362?\205FenNiuz\343\205WenPu\202Yi\202Lu\202\257\320\204Pi\202KaiPanYanKai\003\247\204Mu\202\010I\204\006z\204Gui\007\014\204Dun{\012\205XinZhi{\012\205{\012\205Weiz\350\205\303\362\204Da\202Xia{Z\205ZhuKe\202\002\376\204Fu\202Ba\202XieXie\005\357\204\004\334\204\003P\204Ju\202TanPaoz\343\205PaoTaiTai\002\354\204\360\350\204\3628\204{_\204ZhuZha\3607\204WeiShi{\207\204Chiz\362\205\003c\204Hu\202\010\016\204Lan\005P\204\003\002\204Xu\202\005\313\204\301\357\204Liez\362\204\360\350\204XiuXiuz\374\204YinWu\202\003c\204YaoShiWei\3628\204MieZaiKai\005\335\204LaoXiaZhu\003P\204{Z\205Po\202YanHui{\012\205CheHuiKaoJu\202Fan\360\366\204Ye\202Hui|\031\205\005!\204JinRe\202LieXi\202Fu\202z\343\205XiePu\202\005P\204\004\334\204\005P\204WanHai\006\260\204\005\230\204YanXu\202\003\014\204Chi\006N\204"; -static const char b071[769] = "\377Hu\202Xi\202ShuHe\202XunKu\202\007q\204\3621\204Xi\202YanHan\372\230\206JunDi\202XieJi\202Wu\202YanLu\202HanYanz\362\204MenJu\202DaoBeiFenLinKunHunTunXi\202CuiWu\202\005\335\204\010I\204Fu\202Wo\202\003\002\204\006&\204\003\014\204\0102\204{}\205RuoXi\202{}\205Xin\010I\204YanYanYi\202JueYu\202\006\025\204RanPi\202{s\205\006\025\204\371\260\205z\355\205\360\366\204{s\205{\327\204\007\277\204Wei{x\204He\202Kui\362?\205\0070\204XiaHui\003\014\204{\207\204\003P\204\003g\204z\362\205\003\002\204{\240\204Bi\202\004\377\204ZhuWei\007\265\204{_\204Xi\202\007\326\204\007\326\204z\355\204Yanz\343\205z\343\205Yu\202MeiShaWeiZhaJin{}\205RouMeiz\362\204Xu\202\002\376\204WeiFanQiuSui\360\350\204LieZhuJieZaoGuaBaoHu\202YunNanShi{\207\205\303\362\204GouTui\005!\204\010I\204{_\204En\202Bo\202z\362\205XieXi\202Wu\202Xi\202YunHe\202He\202Xi\202Yun{s\205Nai{_\204{}\205YaoXunMi\202{\207\204\004\377\204Wu\202\006N\204\003=\204Yanz\350\205LiuXi\202Bi\202\003t\204\006&\204Lu\202{\240\204ShuYi\202Lou\006\260\204SuiYi\202\005\326\204Jue\004#\204YunHu\202Yi\202ZhiAo\202WeiLiuHanOu\202Re\202z\343\205ManKun{_\205\007A\204\010\243\204{\240\204Xi\202Xi\202Xi\202Yi\202\3621\204Chiz\362\205z\355\204Ye\202TanRanYanXun\006\214\204Jun\005\262\204Dun\371\260\204\003\002\204FenSi\202\006z\204Yu\202Lin\3628\204\360\366\204FenFanYanXunLanMei\005!\204Yi\202z\343\205Men\0050\204\003\002\204\004\377\204Yu\202Yi\202XueLanTaiZaoCanSuiXi\202Que\004#\204{\207\204HuiZhuXie\005\357\204WeiYi\202Xie\002\376\204HuiDa\202\010M\204LanRu\202z\374\204He\202XunJin\004\320\204DaoYao"; -static const char b072[769] = "\377He\202Lan\003t\204\006N\204Li\202Mo\202BaoRuoLu\202La\202Ao\202Xun{\202\205\010\016\204\006z\204Li\202Lu\202Jue\006z\204YanXi\202Xie\003\031\204Ye\202Can\010\314\204YueLan\006&\204Juez\367\205{\012\204Ju\202CheMi\202\005!\204LanZhuLan\005\357\204\007A\204Yu\202\002\376\204\002\376\204Pa\202{Z\205Pao{x\205\007:\204Ai\202WeiHanJueJueFu\202Ye\202Ba\202DieYe\202YaoZu\202\372\266\206Er\202Pan\305X\206Ke\202\006a\204Diez\350\205\003]\204z\350\205\003I\204BanPan\010I\204{\240\204PaiDu\202\305X\206Yu\202Zha\303\362\204Die\006l\204Bo\202\305X\206YouYouDu\202Ya\202{x\205NiuNiuPinJiuMouTa\202Mu\202LaoRen\006\351\204\003%\204MaoMu\202\006\025\204Wu\202YanGe\202BeiSi\202{\240\204Gu\202YouGe\202\371\260\205Mu\202Di\202z\350\204\301\357\204\301\357\204Zi\202Te\202Xi\202\006\351\204\007\243\204z\350\204Wu\202Gu\202Xi\202Li\202Li\202PouJi\202\006\025\204ZhiBen\301\357\204\256\371\204Du\202Ju\202Jia{\240\204\003\014\204\003I\204Ke\202Ju\202KaoChuXi\202BeiLuoJieMa\202SanWeiMaoDun\3628\204\006\214\204{\240\205Xi\202Li\202Du\202LiePai\007\335\204Bo\202Xi\202\004\320\204WeiKui\004\320\204\301\357\204\301\357\204Ba\202FanQiuJi\202\005\020\204\004\334\204An\202Ge\202\372\230\206{\012\205Ma\202You\007\014\204Bo\202HouYa\202Yinz\362\204\372\230\206Yun{\202\205NiuDi\202{\202\205\362?\205Mu\202BeiPi\202Ju\202Yi\202\371\260\205PaoXiaTuoHu\202\005\357\204FeiPi\202Ni\202YaoYouGouXueJu\202DanBo\202Ku\202z\374\204\006\373\204z\362\204Hen\003\002\204He\202\002\376\204Ji\202Xun{_\204Ta\202\006N\204\002M\204\3628\204LaoDu\202XiaShi\005\271\204{Z\205Yu\202SunYu\202Bi\202\006\351\204Xi\202\007q\204Li\202XiaYin\011\032\204\005\230\204BeiZhiYan"; -static const char b073[769] = "\377ShaLi\202Hanz\374\204\0050\204PaiFei\3621\204BaiQi\202Ni\202\003t\204YinLaiLie{\240\204z\350\205KunYanGuo\004#\204Mi\202z\355\205Yi\202Zhi{Z\205Ya\202\006\205\204CaiCu\202SheLie\3607\204LuoHu\202\004#\204GuiWei\003\014\204Wo\202\007:\204\003g\204ZhuMaoWei\305X\205z\374\204\007\265\204Ya\202NaoXieJiaHou\303\362\204YouYouMeiChaYaoSunBo\202\305;\204Hua\007:\204SouMa\202\007:\204DaiYu\202ShiHaoz\350\205Yi\202{Z\204\010:\204HaoMan\0050\204{\240\205Mo\202{\221\205z\355\204Ao\202Ao\202HaoCuiBenJueBi\202Bi\202z\362\205Pu\202LinXu\202\3628\204Yao\006z\204\010\016\204\3621\204\002M\204Dun\003\002\204Ge\202\007q\204Du\202Hui\005\271\204z\374\204XieTa\202z\374\204Xun\006\373\204\303\362\204HuoNou\006\205\204LieNao{\012\205\002M\204Lu\202Ta\202z\374\204Mi\202\010\314\204z\362\204NaoLuoz\374\204Qi\202Jue\003P\204\005\014\204Zi\202Lu\202Lu\202Yu\202Su\202\305`\204QiuGa\202\003x\204Le\202Ba\202Ji\202\005\335\204Di\202\305X\205GanJiuYu\202Qi\202Yu\202z\355\205Ma\202\005\335\204Wu\202Fu\202WenJieYa\202Bin\303\362\204\006l\204YueJueMenJueWan{\240\204MeiDanPinWeiz\362\204z\374\204z\350\205\005\357\204DaiYi\202An\202\0102\204\3607\204Fu\202\003P\204Xi\202Bo\202Ci\202GouJia\360\366\204Po\202Ci\202Ke\202Ran\371\260\205\371\260\204Yi\202Zu\202JiaMin{_\204LiuBi\202{Z\204{Z\204JueFa\202\003\031\204Jin\003\002\204{\240\204Li\202{\012\205z\374\204\003c\204\003=\204YanXiu\360\350\204Xu\202LuoSu\202ZhuQinYinXunBaoEr\202z\374\205YaoXia\004\272\204Guiz\367\205Xu\202BanPeiLao\010\220\204\004\377\204HuiWenE\000\201{x\205Di\202Wu\202Wu\202{x\205JunMeiBei\005P\204z\374\204Chu"; -static const char b074[769] = "\377Han\003P\204YanQiu\003P\204\005\230\204Li\202XiuFu\202LiuYa\202Xi\202\005\357\204Li\202Jin{\207\204SuoSuo\003\014\204Wan\3607\204Pin{\221\204Se\202MinYu\202Ju\202{x\204LaiMin\371\260\205Wei|\015\204ChuZuo\005\005\204{x\205Hu\202Qi\202E\000\201Kunz\355\205Qi\202\005\005\204WanLu\202\006&\204{\012\204Yan\005,\204BeiLinQinPi\202Pa\202Que\004\334\204QinFa\202Jin{}\205Du\202JieHunYu\202MaoMei\256\371\204\003P\204Ti\202\003g\204DaiRouMin{\240\204Wei\005\253\204z\362\204Xie\305X\205{\240\204\372\230\205z\355\205{\207\204\301\357\204Xia\0070\204\007:\204Ya\202NaoHu\202\004\377\204Yu\202z\362\205RuiSe\202LiuShi\006N\204SuoYaoWenWu\202{Z\204Jin\004\377\204Ma\202TaoLiu\005!\204Li\202\005\230\204Gui{Z\204z\350\205CuoJue\002\376\204YaoAi\202BinShuz\355\205Kun\372\230\205\006&\204JinYi\202Cui\006&\204Qi\202Li\202\0050\204SuoQiu\003P\204Ao\202{\207\204Men{\221\205YinYe\202\004\377\204WeiLu\202Wu\202\005\262\204Xiu\010\243\204XunQu\202\010\220\204Lin\006z\204{}\205Su\202z\362\205GuiPu\202\0050\204FanJinLiuJi\202Hui\0050\204Ai\202Bi\202CanQu\202Zao\010\220\204\003\002\204GunTanHuiz\362\204Se\202Sui|\015\204ChuYu\202JinLu\202BinShuWenZuiLanXi\202Zi\202\003P\204\005\253\204Wo\202GaiLeiDu\202Li\202ZhiRouLi\202Zan{}\205Ti\202GuiSuiLa\202\003\031\204Lu\202Li\202ZanLan\004\377\204Mi\202z\374\205{}\205{\012\204DaoZanz\362\204GuaBo\202DieBo\202Hu\202Zhi\007\335\204Ban\010\314\204Li\202Wa\202Sapz\374\205z\350\204BanPen\003%\204Dan\006Z\204Ou\202FanHouWa\202Hu\202\005\357\204Yi\202\0102\204Ci\202Bai\007q\204z\355\205ChiLei\010\220\204\006\205\204Bu\202"; -static const char b075[769] = "\377\003p\204\0102\204\303\362\204\003c\204{Z\204LeiCi\202\004\377\204Qi\202z\374\204LouDi\202Ou\202\006\205\204\372\230\205\005\005\204Lin\010\243\204Wu\202Pi\202Dan\006Z\204\004\377\204YanGanDai\371\260\204|\015\204|\015\204Hanz\355\205\371\260\205\003\006\204\371\260\204z\355\204z\355\204Rui\371\260\205Su\202\371\260\204\003]\204{\276\205Lu\202Fu\202\003]\204\005\005\204\003\014\204\006\373\204|\015\204YouJia\371\260\204Zha\3607\204Fu\202Nan\3607\204\0102\204\005P\204Hua\005P\204{Z\204Zai\006\205\204Bi\202Bi\202LiuXunLiuz\355\205Mu\202YunFanFu\202\007\277\204|\015\204JieJie\301\357\204WeiFu\202|\015\204Mu\202DuoPan{\240\205Wa\202Da\202NanLiuBen{Z\204ChuMu\202Mu\202Ce\202|\015\204GaiBi\202Da\202ZhiLueQi\202LuePanYi\202FanHuaSheYu\202Mu\202JunYi\202LiuSheDie\004\320\204Hua\010\220\204\003p\204Ji\202Wan{\240\205{x\205z\355\205TunLeiJi\202ChaLiuDie\007\265\204Lin{\240\205{\240\205\004\320\204Pi\202DieDiePi\202JieDanShuShuZhiYi\202Ne\202Nai\003x\204Bi\202Jie\006z\204\006\025\204Ge\202Jiu\003c\204Xia{_\204Xu\202NueLi\202\360\350\204{x\204YouBa\202JieJueQi\202XiaCuiBi\202Yi\202Li\202\004#\204\305X\206\003\014\204ZhuPaoPi\202GanKe\202Ci\202XueZhiDan{Z\204Fa\202Zhi\005\326\204Ju\202Ji\202FeiJu\202{_\204Jia\003P\204Zha\002\354\204Nie{Z\205\003]\204\0050\204\301\357\204\005\326\204\3628\204Yi\202JieWeiHuiTan\360\350\204ChiZhiHenYa\202MeiDou\0050\204\3621\204\3628\204Tu\202\006\351\204Pi\202\3621\204\011\032\204Fu\202Li\202ZhiCuoDuoWu\202ShaLao\002M\204z\362\204z\374\204Yi\202\005\005\204{\221\205{\012\204TanFeiMa\202LinChiJi\202|\015\204An\202ChiBi\202Bi\202MinGu\202DuiE\000\201Wei"; -static const char b076[769] = "\377Yu\202CuiYa\202ZhuCu\202Dan\371\260\204\362?\205ChiYu\202Hou\003\014\204La\202\360\350\204{x\204Tu\202Yu\202GuoWenz\362\204Ku\202JiaYinYi\202LouSaoJueChiXi\202{\012\204Yi\202WenJi\202\305X\206BanHuiLiu\005\020\204\002M\204Nue\3607\204Da\202BieTan{\221\205\003t\204\371\260\204Cu\202LuoYi\202\004#\204\004\320\204{\221\205\005(\204SouSe\202Que\005,\204LouLouMo\202QinYin\004\377\204z\362\205Fu\202\006z\204\003\031\204\006\214\204LiuLaoz\374\204FeiDanYinHe\202Ai\202Banz\374\204{\012\204Gui\010M\204Yu\202WeiYi\202\003]\204Pi\202LeiLi\202ShuDanLin\3607\204LinLaiBieJi\202Chi\360\350\204\003P\204Jie{Z\205Me\202Li\202HuoLaiJi\202\3607\204\003P\204\004\377\204YinQu\202\003]\204Tan\3607\204Luo\006\337\204\006\337\204Bo\202Bo\202GuiBa\202Fa\202\005\262\204Fa\202BaiBaiQieJi\202ZaoZaoMaoDe\202Pa\202Jiez\362\205GuiCi\202\005\357\204GaoMo\202Ji\202\003\002\204\006\260\204GaoAi\202E\000\201HaoHanBi\202Wan\004\320\204z\350\204Xi\202Ai\202\3621\204Haoz\362\205HaoZe\202CuiHao\3621\204Ye\202Po\202Hao\003\002\204Ai\202\003g\204z\362\205Li\202\007\335\204He\202\003\002\204Pi\202GanPao\003c\204JunQiuCunQueZhaGu\202JunJun\003c\204ZhaGu\202\002\376\204Du\202MinQi\202\004\377\204Yu\202Bei\002\376\204\362?\205PenHe\202\004\377\204He\202Yi\202Bo\202WanHe\202Ang{\221\204Yan{\240\204He\202Yu\202KuiFanGaiDaoPanFu\202Qiu\371\260\205DaoLu\202{\221\204\006\205\204Li\202JinXu\202{\240\204Pan{\012\204An\202Lu\202Xu\202\003c\204\010\220\204An\202Gu\202Li\202Mu\202\003x\204GanXu\202\006\351\204\305`\204ZhiQi\202\007:\204|\015\204z\374\205DunXinXi\202Pan\003\014\204DunMin"; -static const char b077[769] = "\377\305;\204\371\260\205ShiYun\003+\204Pan\003%\204\005\014\204DanMeiMaoKanz\374\204KouShi\360\350\204{Z\205Yao\371\260\204HuoDa\202{Z\204{\202\205Ju\202\371\260\204Yi\202\371\260\205MeiMo\202Zhu{Z\204{Z\204\003+\204Shi\007:\204DieNi\202Zi\202Zi\202\010I\204Zha\003P\204\002\354\204Mi\202\003\031\204Sui\3628\204Mi\202DieDi\202Ne\202\305;\204\003P\204Chi{\202\205\007q\204Mou{Z\204\007\036\204\360\350\204YanMo\202\362?\205Mo\202Zhe{Z\205MeiSuo\360\366\204Hanz\362\204Di\202{x\205Cuo\007q\204E\000\201Manz\374\204Xi\202KunLai{\240\204{_\204|\015\204GunWan\006G\204Shi{}\205LieYa\202\0050\204{Z\205Li\202LaiSui\007q\204\3055\204SuiDu\202Bi\202Pi\202Mu\202HunNi\202Lu\202Yi\202JieCai\003c\204Yu\202HunMa\202Xia\003g\204HuiGunZai\256\371\204{\240\204MeiDu\202Hou\003P\204|\015\204KuiGaoRuiMaoXu\202Fa\202Wo\202\005\014\204\004\320\204KuiMi\202\006Z\204Kou\010\220\204{x\204Ke\202SouXia{}\205Mo\202\305;\204Man\3055\204Ze\202{\221\205Yi\202\005,\204KouMo\202\007\221\204\006&\204LouChiMan\007\335\204{x\205Gui\006\205\204WanRunPieXi\202\006\214\204Pu\202Zhu\005\262\204\371\260\204\007\221\204\006z\204Chez\374\204KanYe\202Xu\202\3628\204MouLinGui{\240\204Ye\202Ai\202Hui{\221\204{\240\204Gu\202\002\376\204Qu\202Mei\004\320\204Sao\006\373\204XunYaoHuo\006\205\204\003+\204Pin\003+\204Lei{\202\205Jue\003P\204\003+\204HuoLu\202\006\205\204\003\031\204{\012\204ManXi\202Chu\005!\204KanZhuMaoJinJinYu\202\010\016\204Ze\202JueShiYi\202\371\260\204ZhiHou\371\260\204\004\377\204Ju\202\003c\204\003\002\204Cuo\0070\204Ai\202\003\002\204\010\243\204YueBa\202Shi\003x\204Qi\202Ji\202Zi\202GanWu\202ZheKu\202\006\025\204Xi\202Fan{\202\205"; -static const char b078[769] = "\377\010\220\204Ma\202ShaDanJueLi\202Fu\202MinE\000\201Huo\007\014\204ZhiQi\202KanJieBinE\000\201Ya\202Pi\202ZheYanSui\372\230\205CheDunWa\202YanJin\003\014\204Fa\202Mo\202ZhaJu\202Yu\202Ke\202TuoTuoDi\202\005(\204{Z\204E\000\201Fu\202Mu\202ZhuLa\202\303\362\204Nu\202\0102\204\006\260\204\005\357\204PaoLe\202Po\202Bo\202Po\202\371\260\204Za\202Ai\202Li\202\003\031\204\3628\204\003]\204Li\202{\202\205Chu\007\243\204\301\357\204Zhu{\202\205GuiE\000\201NaoQiaLu\202WeiAi\202Ge\202z\374\204\003g\204Yan\004\352\204\006\260\204Xi\202Lao\005\335\204\010\016\204Xia\006\214\204\003\006\204Wei\006\214\204Yi\202\007\243\204\3621\204Quez\355\204\005\230\204\005\335\204Yu\202\3621\204Xia\006\351\204Luo\003]\204CheCheWo\202Liu\004\377\204\006\351\204QueYanShaKunYu\202ChiHuaLu\202{x\204{\240\204Nue\007\023\204\004\334\204\007\243\204\006\260\204Yan\003p\204\006\237\204{x\205Qi\202\004#\204\003\006\204LinJunBo\202\003x\204Min\005,\204{\240\204He\202Lu\202Ai\202SuiQue\006G\204BeiYinDuiWu\202Qi\202LunWan\3607\204NaoBeiQi\202{x\204\005\253\204YanDie\003x\204Du\202TuoJie\004\377\204\303\362\204Ke\202Bi\202Wei\010\016\204{Z\204\0070\204Xia\010\220\204Ti\202Nao\006\260\204{\240\204Di\202TanCha|\015\204Qi\202Dun\003\014\204\003P\204QueQueMa\202\003=\204{\327\204Su\202E\000\201Ci\202LiuSi\202\005!\204\006l\204HuaPi\202Wei\010\230\204LeiCuo|\015\204XiaXi\202{\207\204PanWeiYunDuiZheKe\202La\202\372\230\205YaoGun\372\230\205z\355\204Qi\202Ao\202\006\260\204LiuLu\202Kan\305X\206{x\204YinLei\003t\204Qi\202Mo\202Qi\202Cui\004#\204\003\006\204\301\321\204LunJi\202{_\204LaoQu\202\010\243\204\005\262\204{\240\204Xi\202Lin\003x\204Tanz\362\205PanZa\202\006\214\204Di\202Li\202"; -static const char b079[769] = "\377{\240\204\003\002\204Xi\202{\221\205\006\214\204Dun{\240\204Yu\202\003p\204He\202Ke\202Ze\202LeiJieChuYe\202Que\010\220\204Yi\202{\240\205Pi\202Pi\202Yu\202PinE\000\201Ai\202Ke\202{\240\204Yu\202\005\253\204\006\205\204PaoCi\202Bo\202\360\350\204Ma\202Ca\202z\374\204{\202\205LeiLeiZhiLi\202Li\202FanQuePao\004\377\204Li\202\003\031\204\003\031\204Mo\202Bo\202\372\266\206{\012\204LanCa\202YanShiShiLi\202\007\357\204SheYueSi\202Qi\202Ta\202Ma\202XieYaoz\374\204Qi\202Qi\202Zhi\005\005\204Dui\362?\205RenYi\202ShiYouZhi\007\036\204Fu\202Fu\202Mi\202Zu\202Zhi\011\032\204MeiZuoQu\202Hu\202Zhu\371\260\204SuiCi\202\005\020\204Mi\202Lu\202Yu\202z\374\205Wu\202\007\036\204\007\335\204ZhuGuiXiaZhiJi\202Gao{Z\204Gao\3055\204Jin\371\260\204GaiKunDi\202DaoHuoTaoQi\202Gu\202{\012\204Zui\005\357\204Lu\202\002\354\204JinDaoZhiLu\202z\355\204Bi\202ZheHuiYouXi\202YinZi\202Huo{Z\204Fu\202\007:\204Wu\202z\374\204\360\350\204ZhiYi\202MeiSi\202Di\202Bei\004\334\204{Z\204\003]\204Ji\202Gao\005!\204Si\202Ma\202Ta\202Fu\202\003P\204Qi\202Yu\202Xi\202Ji\202Si\202z\355\204DanGuiSuiLi\202\010M\204Mi\202DaoLi\202\010\314\204YueTi\202ZanLeiRouYu\202Yu\202Li\202XieQinHe\202Tu\202XiuSi\202RenTu\202Zi\202ChaGanYi\202z\374\204\002\354\204{\327\204QiuQiu\362?\205FenHaoYunKe\202\005\014\204Zhi\0050\204Bi\202ZhiYu\202Mi\202Ku\202BanPi\202Ni\202Li\202YouZu\202Pi\202Bo\202\005\357\204Mo\202{x\205{\327\204Qin\360\350\204ZuoZhiZhiShuJu\202Zi\202HuoJi\202{x\205\3628\204ZhiHuoHe\202YinZi\202ZhiJieRenDu\202Yi\202ZhuHui\010M\204Fu\202"; -static const char b07a[769] = "\377Xi\202Gao\005\230\204Fu\202Xun\3055\204Lu\202KunGan\0050\204Ti\202{x\205Tu\202\360\366\204\3055\204Ya\202LunLu\202Gu\202ZuoRen\007g\204\006l\204BaiJi\202ZhiZhiKun\006G\204\006\260\204Ke\202\002\354\204\004\320\204ZuiYu\202Su\202Luez\374\205Yi\202Xi\202\303\362\204Ji\202Fu\202Pi\202NuoJie\362?\205\004#\204Xu\202{x\205DaoWenz\374\204Zi\202Yu\202Ji\202Xu\202{Z\204ZhiDaoJiaJi\202GaoGaoGu\202\006N\204Sui\006N\204Ji\202\007\014\204Mu\202CanMeiZhiJi\202Lu\202Su\202Ji\202\004\377\204WenQiuSe\202He\202Yi\202z\362\205QieJi\202Sui\3621\204Pu\202\003\002\204\004\334\204\362?\205ZuiLu\202Sui\010M\204Se\202Hui\010\314\204NuoYu\202PinJi\202TuiWen{x\205Huo{\202\205Lu\202\003t\204Se\202\010\314\204\004\334\204Li\202\007A\204XueWa\202Jiu{}\205Xi\202{}\205\006\237\204Yu\202\371\260\204\0050\204Yao\305X\205\007g\204Tu\202LaoQie\005(\204Yao\303\362\204BaoYao\002\354\204Wa\202Zhu\003\002\204\006\214\204\005,\204Wu\202GuiYaoZhi\305X\206Yao\007\036\204\003\002\204\305X\206z\343\205\3621\204{x\205Kou\007A\204Wo\202DanKu\202Ke\202\004\334\204Xu\202Su\202{\012\204KuiDou\004\334\204XunWo\202Wa\202Ya\202Yu\202Ju\202{}\205YaoYao\007\036\204\010I\204Yu\202|\015\204\005,\204Ju\202\006z\204Xi\202Wu\202Kui\305X\206\002\376\204{\202\204{\202\204\003\031\204{x\205Cui\006z\204Zao\007A\204\006\214\204{}\205DouZao\003\031\204QieLi\202ChuShiFu\202z\350\204Chu\005\335\204Qi\202Hao\371\260\205FenShu\005\014\204Qu\202{\221\204Zhu\005\357\204\003\031\204\002\354\204\0050\204\0050\204{\221\205BaiSi\202Jun\005\335\204\3628\204\007\023\204\0050\204\005,\204Yi\202Shu\0050\204Qu\202Jie\0102\204\0070\204Li\202\372\230\205\007\177\204\005\262\204CunWai\0050\204Kan\0050\204ZhuZhuLe\202\006\260\204Yu\202ChiGan"; -static const char b07b[769] = "\377\006\351\204ZhuWanDu\202Ji\202\003\002\204Ba\202\011\032\204Ji\202Qin\002\376\204SunYa\202\003p\204\007:\204Hu\202\004\272\204\3621\204CenBi\202Bi\202{\240\204Yi\202\004\352\204{_\204\371\260\205Da\202Di\202ZhuNa\202ChiGu\202Li\202QieMinBao\007\036\204Si\202Fu\202Ce\202BenFa\202Da\202Zi\202Di\202\005\357\204Ze\202Nu\202Fu\202GouFanJiaGanFanShiMaoPo\202Ti\202{\240\204{}\205\003\031\204Min\303\362\204LuoGuiQu\202ChiYinYaoz\374\204Bi\202{}\205Kuo\005\262\204\3621\204Jin\301\357\204SunRu\202Fa\202{\202\205Zhu\3628\204Ji\202Da\202\004\272\204Ce\202\362?\205KouLaiBi\202\007\261\204\010\220\204{Z\205Ce\202Fu\202YunTu\202Pa\202Li\202\005\230\204Ju\202{\012\204{\240\204Han\3628\204XiaZhi{x\205\011\032\204ShiZhuZuo\3621\204\360\366\204\005P\204Ce\202YanGao\005\271\204Gan\004\320\204{\202\205\006\025\204YunOu\202z\350\204\3621\204{\240\204PouLaiZouBi\202Bi\202Bi\202Ge\202Tai\007\230\204Yu\202{\240\204DaoGu\202Chi{Z\205\003\006\204Sha\003c\204Lu\202Bo\202Ji\202Lin\011\032\204JunFu\202ZhaGu\202\006\237\204z\350\204z\350\204Jun\257\320\204{\012\204\007:\204Ce\202Zu\202Bo\202Ze\202QieTuoLuoDan\3621\204Ruo{\240\204\003P\204\303\362\204Sunz\374\205z\374\204\0102\204{Z\204\003g\204Hu\202Yi\202ZhuYue\256\371\204Lu\202Wu\202\004\352\204\010\016\204Ji\202Jiez\362\205\003g\204MeiFan\305X\205\372\230\205\003I\204\003\014\204Zhuz\362\205QieHouQiu\005\014\204z\350\204Gu\202KuiShiLouYunHe\202\005!\204Yue\004\320\204GaoFeiRuo{Z\205GouNiez\350\204\3621\204\007A\204\003\031\204\006\260\204Du\202Li\202Bi\202\004\334\204Chu\007\261\204ChiZhuz\350\205\003\031\204Lan{\240\204Bu\202Li\202HuiBi\202Di\202\006&\204Yan\006\260\204Can\372\230\205Pi\202\007\335\204DouYu\202Mie\007\265\204"; -static const char b07c[769] = "\377Ze\202\007\261\204GuiYi\202Hu\202z\355\204KouCu\202\0102\204ZaoJi\202GuiSu\202LouCe\202Lu\202{\327\204Suo\007A\204\005,\204SuoLe\202\0070\204{\207\205\3621\204Bo\202Mi\202\007\261\204\010\220\204\006z\204Dan\3607\204Fu\202{\240\204MinKuiDai\003\002\204\005\262\204z\362\205SunLaoZan\3621\204Lu\202ShiZanQi\202PaiQi\202PaiGanJu\202Lu\202Lu\202YanBo\202\010\220\204Sai|\024\204Gouz\350\204{\207\204Bu\202\003c\204LaiShiLanKuiYu\202YueHao{Z\204TaiTi\202Nie\004\320\204Ji\202Yi\202Qi\202\005\326\204\372\230\205\003c\204FanSou\003c\204z\350\204\004\334\204\005\326\204Lu\202Lu\202{\240\204Tuo\004\377\204Yu\202Lai\003\031\204Qie{\207\204Lanz\350\204Yue\362?\205Qu\202{\207\204\303\362\204\0070\204\010k\204Li\202Si\202Luo\004\377\204Yue\004\334\204Yu\202Mi\202Di\202Fan\371\260\204Zhe\371\260\204Nu\202He\202Leiz\374\204Zi\202Ni\202Cun{\221\205z\350\204\005(\204Bi\202BanWu\202Sha\007\014\204RouFenBi\202CuiYinZheMi\202TaiHu\202Ba\202Li\202GanJu\202Po\202Mo\202Cu\202{\221\204\003c\204ChiSu\202\007\036\204Li\202Xi\202Su\202\005\335\204\3628\204Zi\202Ce\202Yue\003c\204Lin\372\230\206BaiLaoFenEr\202Qu\202He\202{\207\205z\374\204Fu\202{\207\205Can\0050\204Li\202YueLu\202Ju\202Qi\202CuiBai{\221\205Lin\004#\204\0050\204GuoHuaSanSan\005!\204\303\362\204Rou\003+\204HouXu\202\004#\204Hu\202{\240\204ZanCi\202Li\202XieFu\202NuoBeiGu\202XiuGao\005!\204QiuJiaCao\372\230\206\005!\204Mi\202SanFenZao\007\014\204{\240\205Mo\202SanSanNuoXi\202{\207\205{\240\205\005\271\204Bo\202z\362\204Shu\004#\204z\374\204Nuo\007\265\204NieLi\202ZuoDi\202Nie\007\036\204LanMi\202Si\202JiuXi\202\003=\204{Z\205JiuYou"; -static const char b07d[769] = "\377Ji\202Cha\003c\204XunYue\005\335\204Yu\202He\202WanRenWenWenQiuNa\202Zi\202TouNiuFouJi\202Shu\256\371\204Pi\202{Z\204Sha\005\335\204ZhiJi\202FenYunRenDanJinSu\202\003%\204SuoCuiJiuZa\202Ba\202JinFu\202ZhiQi\202Zi\202\004\320\204\005\335\204Za\202LeiXi\202Fu\202Xie\371\260\204Bo\202ZhuQu\202\005\357\204Zhu\360\366\204Gan\360\350\204Fu\202Tuo{Z\204DaiChuShi\362?\205z\374\204Zu\202z\343\205BanQu\202Mo\202ShuZui{\202\205\0050\204Ren\004\272\204XieJieZhu\004\320\204GuaBaiJue{\202\205Hu\202Ci\202z\362\204\007\277\204TaoJieKu\202\003\002\204\301\357\204GaiLuo\003P\204\005\005\204z\374\204Fu\202Gei\004\352\204\006N\204\007\036\204YinLeiXie\007q\204Xu\202GaiDie\3628\204Si\202{\240\205z\374\205HuiJueZhi{\240\204\007q\204Chi\003+\204{Z\204Lu\202{x\205QiuShu\006l\204\3628\204\3621\204z\362\204Qin\007\277\204XiuTi\202TouXie\005\335\204Xi\202Fu\202\005P\204SuiDuiKunFu\202\0050\204Hu\202ZhiYanz\343\205\003\014\204Ji\202Xu\202Ren\004#\204{x\204DuoLi\202Lu\202{\207\205\004\320\204\301\357\204\360\366\204Qi\202Qi\202\007g\204Qi\202Wanz\350\204z\374\204\002M\204WeiQi\202TaoWan\006\025\204\305`\204\005\005\204\003p\204CaiGuoCuiLunLiuQi\202{\221\204Bi\202\301\321\204\005\357\204\003+\204Qi\202Qie|\015\204\004#\204GunZouXi\202Zi\202\003g\204{\207\205JinFeiRuiMinYu\202\004#\204FanLu\202Xu\202\004\377\204{_\205Qi\202Xu\202z\374\205{\240\204Ke\202z\374\204\005\253\204\003+\204Ji\202\0070\204z\367\205Di\202Min\005\014\204\007:\204XieBaoSi\202Qiu\303\362\204z\362\204\007\277\204\006&\204\003+\204WeiFu\202WeiTouGou\005\014\204Xie{\207\204\004#\204\303\362\204YunYinTi\202GuaZhiYun{x\205z\355\204Dai"; -static const char b07e[769] = "\377Xia\007:\204\004#\204Xu\202\371\260\205Wei\007\277\204\003P\204\004\377\204JinYi\202\003p\204Ni\202\006l\204Gu\202Pan\003c\204{\240\204Ci\202\301\357\204\372\266\206YunXiaCuiXi\202\006N\204TaoFu\202Yun{x\204GaoRu\202Hu\202Zai\005\326\204z\374\204Su\202{Z\204\004#\204Taoz\362\205CaiBi\202\003\014\204Cu\202Li\202SuoYanXi\202\004#\204Lei\007q\204z\350\204ManZhiLu\202Mu\202\007\335\204{\207\204Mi\202\003P\204\004#\204Ji\202{_\204SuiFanLu\202\005\005\204Yi\202SaoMouYaoz\350\205Hunz\374\204Ji\202ShaXiuRan\003P\204Sui\006\214\204\010\243\204ZuoZhi{_\204SanLinYu\202Fan\006z\204\301\321\204Zun{\240\204Raoz\355\204RuiXiuHuiHua\010k\204Xi\202z\350\205YunDa\202\371\260\205HuiXi\202Se\202{\240\204{\240\205z\362\204Zao\006&\204Xie\003\002\204Bi\202DanYi\202\010M\204SuiYi\202\007\261\204Xu\202Ji\202Binz\350\204LanPu\202Xun\010k\204Qi\202\006\260\204YaoMo\202LeiXie\010k\204{\202\205YouXu\202Leiz\374\204z\355\204\003\002\204Lu\202z\355\204\004\377\204Cai\010\314\204z\374\204Zui\010k\204LuoLi\202DaoLanLei{\207\204Si\202JiuYu\202\005\335\204\003c\204z\374\204Ge\202YueJi\202Wan{\202\205Ji\202RenWeiYun\005\335\204\256\371\204Pi\202Sha\006\025\204Na\202Ren\004#\204LunFenZhiWen\003%\204Zhu{Z\204NiuShuz\374\204GanXieFu\202{\207\204Zu\202\371\260\204Xi\202Zhi\362?\205\003c\204BanFu\202Chu\360\366\204Yi\202\0050\204Dai\006l\204\006N\204JieKu\202RaoDie\004\272\204HuiGei\003P\204{\240\205LuoJue\003\002\204\3628\204\007\277\204\3621\204\007q\204XiuXi\202SuiTaoJi\202Ti\202Ji\202Xu\202\005\357\204\004\377\204Xu\202Qi\202Fei\301\321\204{_\205Gun\371\260\205Wei\003+\204\002M\204\005\005\204\004\320\204TaoLiu\301\357\204\004#\204{\221\204WanLu\202"; -static const char b07f[769] = "\377\003p\204Zi\202Ke\202z\374\205{\240\204\003+\204LanTi\202\005\014\204Ji\202YunHuiSi\202Duo\0070\204\303\362\204z\374\204Gou\003p\204z\362\204Di\202Lu\202\303\362\204Min\007:\204JinFu\202Ru\202{Z\204\003\014\204CuiGaoz\355\204Li\202Yi\202{\240\204Bin\007\335\204ManLei\004\377\204SuoMouSaoXie\006z\204{_\204\010\243\204{\240\205z\350\204\006\214\204z\362\204\003\002\204\010k\204FouXie\006\025\204FouQueFouQi\202Bo\202\0102\204z\374\205\002\376\204\006\025\204\004\377\204\004\377\204\003\006\204Xia{\012\204ZunTan{x\205Qi\202\006Z\204\004\377\204LeiTanLu\202{\012\204\305`\204\305`\204\006\025\204\305`\204HanLuoLuoFu\202\371\260\204Fa\202Gu\202ZhuJu\202MaoGu\202Min\006\025\204Ba\202GuaTi\202\007q\204Fu\202\371\260\204Yan\002\376\204ZuiGua\004\334\204Yu\202ZhiAn\202Fa\202LanShuSi\202Pi\202Ma\202LiuBa\202Fa\202Li\202\010I\204WeiBi\202Ji\202\010\243\204z\367\205LiuJi\202\007q\204Mi\202\002\376\204LuoPi\202Ji\202Ji\202\006\337\204\360\350\204Mi\202z\350\205Da\202Mei\360\350\204YouYouFenBa\202Gao\360\350\204Gu\202z\350\205\006a\204Gao\005\357\204Yi\202ZhuDi\202Xiuz\350\205Yi\202z\374\204\006N\204QunQunz\350\205z\362\204Suoz\374\204Yi\202\360\350\204z\350\205z\350\204Yu\202\007\277\204Jie\005!\204\007:\204Xi\202Fan{_\204Fen{_\204{\207\204Lei\007\277\204Nouz\350\205z\355\204Yu\202\003=\204Yi\202z\367\205\006Z\204Fen\005\335\204ChiChiCuiFu\202XiaBenYi\202La\202Yi\202Pi\202\005\357\204LiuZhiQu\202Xi\202Xiez\374\205Xi\202Xi\202Ke\202\006\214\204HuiHui\3621\204Sha\005\335\204{\240\205Di\202CuiFeiDaoShaChiZhu{\240\204\003P\204Chi\003I\204\004#\204WanHuiHouHe\202He\202HanAo\202\007\335\204Yi\202{\207\204HouAo\202LinPen\006\214\204Ao\202FanYi\202Hui\003P\204Dao"; -static const char b080[769] = "\377YaoLaoLaoKaoMaoZheQi\202GouGouGouDieDieEr\202{\276\204\005\253\204NaiNai\0070\204Lei\005P\204Zi\202\007\277\204\010I\204HaoYunBa\202Pi\202Yi\202Si\202Qu\202JiaJu\202HuoChuLaoLunJi\202\005!\204Ou\202LouNou{\240\205\003\247\204ZhaLouJi\202LaoHuoYouMo\202\006\333\204Er\202Yi\202\003x\204Ye\202Da\202\007\023\204QinYunChiDanDan\005\335\204\007\277\204ZhiPanNieDan{Z\204Che\005\357\204{Z\205YouWa\202\006z\204\003\031\204Zhi\006\373\204\007\036\204Er\202Ya\202TieGuaXu\202{\207\204Hao\371\260\205LiePin\0050\204Ju\202Bi\202Di\202GuoWenXu\202\0102\204\006&\204\003x\204Ni\202\005P\204Ju\202\006&\204Kui{\207\204Kui\006&\204{\207\204\006Z\204Kui{\207\204{\207\204\006&\204Ao\202\371\260\205\007\023\204\005P\204KuiNieZhiDan\006\373\204QieNi\202\005P\204\005P\204\003\031\204Yu\202Yu\202\002\376\204Si\202Su\202Yi\202Su\202Si\202\002\376\204\002\376\204RouYi\202Le\202Ji\202QiuKenCaoGe\202Bo\202z\362\204z\362\205ChiRen\3621\204Ru\202\003c\204\007:\204Du\202\006\025\204\006N\204GanChaWo\202z\355\205Gu\202ZhiHanFu\202FeiFenPei\003\247\204{\240\204\003%\204\007g\204YouNa\202AngKenRan\003=\204Yu\202WenYaoQi\202Pi\202z\350\204Xi\202Xi\202FeiKen\0050\204Tai\371\260\204\362?\205{\221\205Xie\371\260\204Wei\003c\204DieDanFeiBa\202Bo\202Qu\202|\015\204BeiGuaTaiZi\202FeiZhiNi\202\0102\204Zi\202Fu\202\003\247\204{Z\204z\374\204ZuoPeiJia\371\260\205ZhiBaoMu\202Qu\202Hu\202Ke\202ChiYinXu\202\360\350\204\003\031\204\004\352\204Ka\202Lu\202\0050\204Nu\202Yan\003\247\204KuaYi\202{\012\205HaiGe\202\004\352\204Chi\003\002\204{s\205{s\205Er\202An\202\005\313\204\003I\204\010\026\204Zi\202Gui"; -static const char b081[769] = "\377{x\205\007\036\204ZhiCuiMeiXieCuiXieMaiMaiJi\202XieNin\005\271\204Sa\202\006a\204Qi\202NaoMi\202\010M\204\006\337\204WanBo\202WenWanXiu\003\002\204\0050\204You\005\313\204CuoLie{_\204\005P\204Mei\256\371\204\371\260\204z\350\204De\202\007q\204Cu\202XiuXinTuoPao{x\205NeiPu\202DouTuo\003\025\204NaoPi\202Gu\202LuoLi\202{\207\204{\221\205CuiJie{\207\205\3055\204Pi\202\003t\204Lun\003I\204LeiKui\257\320\204Dan|\015\204Nei\0050\204NaiLa\202Ye\202YanRen\371\260\204\301\321\204Fu\202Fu\202Ju\202Feiz\350\205Wan\004\352\204Pi\202Guo\004#\204\003x\204Wo\202MeiNi\202\372\230\205ChiCouLuoOu\202Di\202An\202\003g\204NaoShu\372\266\205NanYun\362?\205RouE\000\201SaiTu\202Yao{\240\204Wei\003\002\204Yu\202Jia\0070\204Bi\202z\355\205Fu\202z\374\204Ni\202\003+\204Wa\202\005\326\204Tui\006l\204z\350\204Lu\202Wa\202\002M\204\005!\204Su\202\003p\204Ge\202Yi\202Bo\202\006z\204Ji\202Pi\202XieGaoLu\202BinOu\202z\355\205Lu\202Guo\003\247\204{\252\205\003t\204{\240\205Fu\202\005!\204Mo\202Xi\202\372\230\205Lu\202\003\002\204\004\377\204Lu\202ZhiXueCunLin\3628\204\006\260\204Ni\202{\252\205\006z\204CuiGui\3621\204\005\326\204FanZhi\003\002\204{_\204Hu\202CuiRunz\374\205SuiFen\004\377\204{_\204|\024\204Dan\005\271\204\010M\204Tun{\207\204Bi\202\003]\204JueChuYi\202\007q\204La\202{\207\204SaoTunGu\202Qi\202CuiBinXunNaoWo\202\006a\204z\374\204\003t\204\003g\204{\202\204La\202YanLu\202HuoZa\202LuoQu\202\006a\204\006\337\204Ni\202Za\202{x\204z\350\204Wo\202{\012\205\006a\204Lin{\012\205Zi\202\003\002\204Nie\004\320\204Ji\202Gao\004\320\204\003+\204NieZhiZhiGe\202{\240\204DieZhiXiuTai{Z\204Jiuz\374\204Yu\202Cha"; -static const char b082[769] = "\377YaoYu\202z\367\205Xi\202Xi\202JiuYu\202Yu\202\003g\204Ju\202JiuXinSheSheSheJiuShiTanShuShi|\015\204TanPu\202Pu\202{\012\204Hua|\015\204\305X\205\007\221\204XiaWu\202\003c\204Dao\305X\205{_\204Yi\202FanPa\202TaiFanBan\305X\205\004\272\204\003%\204BanBi\202Lu\202\362?\205{\240\204\010:\204\005\357\204ZhuZe\202DuoBo\202z\374\204Ge\202\305X\205XiaLu\202{}\205\003\247\204Xi\202KuaFu\202Zao\003\014\204Li\202\360\366\204Yu\202\005\230\204\005P\204Yu\202WeiBo\202\006\205\204{\327\204Ju\202z\362\205\002M\204Ke\202\303\362\204Mu\202DieDao\006l\204ChaYi\202Sou\010:\204CaoLouDaiXueYaoz\367\205\005\262\204\010\220\204z\350\205Lu\202Yi\202Ji\202{\240\204Huo\006\205\204Qi\202Lu\202Lu\202z\355\204\372\266\206Gen{\207\205{\240\204{\240\204Se\202YanFu\202\0102\204YanYanCaoCaoYi\202Le\202\005P\204\003\002\204Ai\202Nai\007\036\204\003\002\204Jie\006\260\204WanYi\202\005\020\204\003+\204Mi\202Ganz\350\204Yu\202Yu\202\360\366\204{}\205Du\202Hu\202Qi\202\006\351\204Zi\202HuiSuiZhiz\374\205Pi\202Fu\202TunWeiWu\202ZhiQi\202{_\204Wenz\350\204RenFu\202KouJieLu\202Xu\202Ji\202QinQi\202YanFenBa\202RuiXinJi\202HuaHua\003%\204Wu\202JueGouZhiYunQinAo\202ChuMaoYa\202Fei\007\357\204\004\272\204\006&\204YinYou\303\362\204Yi\202QieWeiLi\202Pi\202E\000\201z\374\204z\355\205\010:\204ZhuSu\202Ti\202\007:\204Ran\005\357\204Tai\360\366\204Di\202\005\014\204\003\006\204Li\202\003]\204Ke\202Mu\202BeiBaoGouMinYi\202Yi\202Ju\202PieRuoKu\202\006\373\204Ni\202Bo\202\002\354\204{_\204XiuYaoz\374\204Ben\005\335\204\004\377\204Zha\004\352\204Ju\202DieNieGanHu\202\0102\204MeiFu\202\371\260\205Gu\202Bi\202Wei"; -static const char b083[769] = "\377Fu\202\004\334\204MaoFanJiaMaoMaoBa\202Ci\202Mo\202Zi\202ZhiChiJi\202\0050\204\003\031\204\006&\204\003\025\204\007:\204Xue\004\377\204{}\205Ge\202\305;\204Li\202\006N\204YinGenz\350\204\005\020\204{x\204Yu\202HaoZi\202LieWu\202Ji\202GuiCi\202{\240\204Ci\202Gou{\012\205\006\351\204Cha\003\002\204\003\002\204Fu\202Yu\202ZhuZi\202{\240\205HuiYinChaFa\202\006N\204Ru\202z\367\205\006\351\204\3628\204\362?\205z\350\204ZhuXunz\362\204Fu\202\301\357\204GaiDa\202\0050\204\003g\204\305X\205Cao\0050\204Er\202An\202\006\214\204ChiRen{\240\204Ti\202z\362\205\0102\204Li\202JinLaoShu\372\230\206Da\202JiaRaoBi\202Ce\202\006\214\204HuiJi\202\010\220\204Zi\202\006N\204Hun\003g\204Luo\004\377\204XunJinSunYinMai\005\335\204\003c\204YaoDu\202WeiLi\202DouFu\202RenYinHe\202Bi\202Bu\202YunDi\202Tu\202SuiSui{x\205{x\204Wu\202BieXi\202\007\277\204Li\202Pu\202ZhuMo\202Li\202\372\230\206ZuoTuoQiuShaSuo{x\204\006\260\204Ju\202Mei\006\205\204\003g\204\0050\204Che\371\260\204JunYan\005P\204YouCuo{\012\204HanYouCuoJia\305`\204Su\202Niu\360\366\204z\374\204\005\230\204Fu\202E\000\201Mo\202WenJieNanMu\202KanLai{\207\204ShiWo\202Tu\202z\374\204HuoYou\004\377\204\004\377\204\003=\204\256\371\204\006\351\204\006\351\204Ci\202Wan\0050\204Di\202Qu\202\004\352\204{\240\204ZouGu\202La\202Lu\202Ju\202WeiJunNieKunHe\202Pu\202ZaiGaoGuoFu\202Lunz\355\205\004\320\204\007\023\204\257\320\204{\221\204MenCaiBa\202Li\202Tu\202Bo\202HanBaoQin\007q\204Xi\202QinDi\202JiePu\202\010\220\204Jin\006\214\204Tai\007\277\204HuaGu\202\005\357\204FeiQinAn\202\305`\204\005\005\204\003c\204YanJu\202{\240\204LinTanShu|\015\204Dao"; -static const char b084[769] = "\377Hu\202Qi\202He\202CuiTao\256\371\204Bi\202z\355\205z\362\204FeiLaiQi\202\006\205\204\0102\204WeiDanShaz\362\204YanYi\202\007\036\204Qi\202WanCe\202Nai{Z\204TuoJiuTieLuoBi\202Yi\202PanBo\202Pao\003x\204\004\377\204\004\377\204\004\377\204\3621\204Sa\202QiuKe\202z\374\205WanYu\202Yu\202Fu\202{\207\204\003P\204\003P\204NanCe\202Wo\202\256\371\204\3621\204Yu\202\303\362\204MaoAn\202E\000\201Luo\004\377\204KuoKuo{\240\205\003+\204ZuoZuoZu\202BaoRouXi\202Ye\202An\202Qu\202{\240\204Fu\202Lu\202\0050\204Pen\003\014\204\005\335\204\005\335\204HouYanTu\202ZheZi\202z\374\205RenGe\202Qia\003\006\204Mi\202z\362\205\371\260\204Pu\202Gai\004\352\204\003c\204{\240\204WeiBo\202WeiPa\202Ji\202Hu\202\006a\204Jia\0070\204YaoSui\006&\204\301\357\204Wei{Z\204Kui\005P\204HunXi\202ShiQi\202Lan\004#\204Yao\007:\204MeiYunShuDi\202\372\230\205{\012\204RanXuez\355\204KaiKuiHua{\240\205LouWeiPaiYouSouYinShi\256\371\204ShiYun{Z\204\005\230\204Ru\202\006\205\204Li\202Que\011\032\204\007:\204Li\202Ju\202Xi\202\006l\204ChuXu\202Tu\202LiuHuo\3607\204z\350\204Zu\202Po\202Cuo\007:\204ChuYu\202\005\271\204PanPu\202Pu\202Na\202\010\016\204Xi\202FenYun{Z\205{\240\204Ji\202Ruo\010:\204En\202Mi\202HaoSun{Z\204\305;\204SouXu\202LiuXi\202Gu\202\005\230\204\006N\204\006Z\204GaiCuoShi\005!\204LuoRu\202Suo\003P\204BeiYaoGuiBi\202\004#\204GunZuo\007\036\204Ce\202PeiLanDanJi\202Li\202\371\260\204\005\230\204Yu\202\005\357\204\004\377\204Mo\202\005,\204\007\036\204Mao\3628\204Chu\006\260\204An\202{\207\204\006&\204Xi\202\0102\204QiuJin\256\371\204JieWeiTuiCaoYu\202Yi\202Zi\202\006z\204Bi\202Lu\202Xu\202"; -static const char b085[769] = "\377Bu\202{\221\205Leiz\350\205ManYan\005\357\204Ji\202\003t\204GunHanDi\202Su\202Lu\202She{_\205Di\202MieXunManBo\202Di\202CuoZhe\371\260\204\003P\204WeiHu\202Ao\202Mi\202LouCu\202\362?\205CaiPo\202{\240\205Mi\202\006&\204\003\025\204Hui\007q\204Yin{\240\204{\327\204ShuYinGuo{x\204Hu\202ShaKouz\350\204Ma\202\006a\204Ze\202z\350\205Dou{\207\204LinKouAi\202Bi\202Li\202WeiJi\202z\350\204\371\260\205Fan\006\205\204Ou\202z\355\204\3607\204Xun\003\002\204RuiRuiLeiYu\202\006\214\204ChuHua{\240\204MaiYunBaoYouQu\202Lu\202RaoHuiE\000\201Ti\202FeiJueZuiFa\202Ru\202FenKui\007\221\204RuiYa\202Xu\202Fu\202Jue\010\220\204Wu\202\004\352\204Si\202\3621\204Xi\202\003\031\204Wen\360\366\204Qi\202{\240\204YunSun\005\357\204Yu\202Xia\006Z\204Ji\202\005\335\204Si\202\010M\204Lei\003P\204YunYu\202Xi\202HaoBaoHaoAi\202WeiHuiHuiJi\202Ci\202z\374\205WanMieYi\202\006G\204{\240\205Can\371\260\204z\350\205{\207\204Ke\202\007:\204Da\202Ti\202\005!\204XueBi\202{\221\204Sunz\374\204Fan\003x\204XieGu\202XieShu{\240\204Hao\005\335\204Sa\202XinXunYaoBaiSouShuXunDuiPinWei\006\373\204\004\320\204MaiRu\202\007\335\204TaiJi\202Zao{x\204{Z\204Er\202Ni\202\004\377\204Gao\006&\204\3621\204Qi\202Fa\202{\240\204Xu\202KuiJi\202\303\362\204\005,\204Mi\202LanJin\010:\204\005\014\204{}\205Qiez\374\204\006z\204Ou\202z\374\204Su\202Lu\202Yi\202Xu\202XieLi\202Yi\202La\202Lei\003\002\204Di\202ZhiBei\005\326\204YaoMo\202z\362\204\003t\204FanSouTanTui{}\205\006\214\204WeiLiuHuiOu\202GaoYunBaoLi\202ShuChuAi\202LinZao\003P\204QinLaiHuo"; -static const char b086[769] = "\377TuoWu\202RuiRuiQi\202\005\313\204Lu\202Su\202Tui\006\205\204Yun\0102\204Yu\202XunJi\202z\343\205\003P\204Mo\202QiuSu\202z\343\205\006\260\204NieBo\202\010\314\204Yi\202z\374\204Yu\202Ju\202{\207\204{\207\204Yinz\350\205\004\377\204\003\031\204TouHuaYue\005\357\204Qu\202YaoFanMeiHanKuiLanJi\202\010\220\204ManLeiLeiHui\003\014\204ZhiWeiKui{\221\204\006\333\204Li\202Ji\202Mi\202Lei\006\333\204LuoJi\202KuiLu\202{\240\204Sa\202\005\326\204Lei\301\357\204\3621\204Yi\202\006\337\204MenBieHu\202Hu\202Lu\202NueLu\202Si\202\3621\204z\350\204ChuHu\202Xu\202CuoFu\202Xu\202Xu\202Lu\202Hu\202Yu\202Hao\003\002\204Ju\202GuoBaoYan{\221\204{\221\204KuiBinXi\202Shuz\367\205Qiu\005,\204Ji\202Qiu\003x\204ShiXiaJueZheSheYu\202HanZi\202\005\335\204Hui\006\205\204Ge\202SuiXia\005\020\204ShiYi\202Ma\202z\374\205\003%\204E\000\201Ba\202Chiz\350\204WenWenRui\006l\204Pi\202YueYueJunQi\202\3628\204YinQi\202Can\007:\204JueHuiQinQi\202\362?\205Ya\202HaoMu\202\305`\204FenFen\004\272\204\003=\204ZaoFu\202RanJieFu\202ChiDouBaoz\374\204Ni\202DaiQiuYouZha\0102\204ChiYouHe\202HanJu\202Li\202Fu\202RanZhaGouPi\202Pi\202z\374\204Zhu\005,\204Bie\002\354\204Gu\202{\221\204Qu\202SheTie\005\357\204Gu\202DanGu\202\004\377\204Li\202{x\205Qu\202MouGe\202Ci\202HuiHui\006\351\204Fu\202\360\350\204Wa\202LieZhuYi\202z\374\204Kuo\003\002\204Li\202Yi\202\0102\204Qi\202Ha\202SheYi\202\305`\204Mo\202{}\205QieGui{}\205ZhiManLaoZheJiaNaoSi\202Qi\202\003g\204JieQiu\360\366\204\003]\204JiaTuiCheBeiE\000\201Han"; -static const char b087[769] = "\377Shu\003P\204\003\014\204\371\260\204\371\260\204Fu\202z\374\204ZheWu\202Fu\202Li\202\005\230\204Bi\202Chu\007:\204YouJieDanYan\005P\204\3607\204TuiHuiWo\202Zhi\007\023\204FeiJu\202Mi\202Qi\202Qi\202Yu\202JunLa\202\006\205\204z\350\205Si\202Xi\202LunLi\202Die\007\036\204TaoKunHanHanYu\202\006l\204FeiPi\202WeiDunYi\202\007:\204Suo\301\357\204z\350\204RuiNi\202\003\006\204Wei{\207\205GuoWan\004\352\204E\000\201BanDi\202\305`\204Can\360\350\204\004\377\204Guoz\355\204\003x\204La\202Ke\202JieXie\005P\204MaoXu\202\003+\204Yu\202JieShi\003P\204z\362\205Yan\303\362\204RouWeiFu\202\007:\204MeiWeiFu\202Ru\202XieYouQiuMaoXia\004\377\204Shiz\367\205\005!\204Zhu\004#\204Ti\202Fu\202\007:\204Kui\006\205\204La\202Du\202Hu\202QiuDieLi\202Wo\202YunQu\202NanLou\256\371\204\006N\204\004\377\204{\240\205Ban\005\230\204\003\247\204Si\202Xi\202Ci\202Xi\202\007:\204\006Z\204{\207\204SouBan\006N\204\006N\204Ji\202Wu\202XiuHanQinYi\202Bi\202Hua\005!\204Yi\202Du\202NaiHe\202Hu\202GuiMa\202\305;\204Yi\202Wen\004\377\204Te\202\362?\205\010:\204SaoQi\202Man\007\036\204{_\205ShiCaoChiDi\202Ao\202Lu\202WeiZhi\005!\204{x\204\007\335\204Qu\202Pi\202Yu\202{\240\204LuoLouQin\362?\205Yin{\240\205{\276\205Wen\3621\204WanZheZheMa\202Ma\202GuoLiuMaoXi\202\006&\204Li\202Man\3621\204z\355\205{\221\205\006\351\204z\374\205Mo\202ZuiSi\202QiuTe\202Zhi\006\260\204\006\260\204\003\002\204Qu\202Bie\006z\204PanGuiXi\202Ji\202\372\230\205z\362\205FeiLaoJueJueHuiYinz\355\204\003\002\204{_\204Nao\3621\204Wu\202z\367\205XunSi\202Chu{x\205\010\220\204Li\202Xie{_\204Yi\202\0050\204Da\202z\355\204Qi\202"; -static const char b088[769] = "\377Ci\202z\374\205SheLuoQin\004\377\204\005\020\204Li\202Zei\003P\204{\207\204ZhuZe\202Xie\006\351\204XieQi\202\006N\204{\240\204\006\205\204HaoRu\202Huo\004\334\204JiePinHe\202MieFanLeiJieLa\202MinLi\202\256\371\204Li\202QiuNieLu\202Du\202\3621\204Zhu\003\031\204Li\202\003\031\204\003\014\204Ye\202Pi\202\006\220\204Gu\202\007q\204\004\377\204ShuXi\202CanQu\202\301\357\204Du\202CanManQu\202JieZhu\004\334\204Xuez\362\205Nu\202PeiNu\202Xin\362?\205MaiEr\202Ka\202MieXi\202\003g\204YanKan\007:\204Qu\202\005\357\204\003P\204Shuz\374\204\3628\204z\374\205Jiez\374\204Ya\202Hu\202WeiDaoz\367\205WeiDao\007g\204\005\313\204Qu\202Yi\202Yi\202Bu\202GanYu\202\003t\204ChaYi\202{_\204{x\204Fu\202GunFen{\276\205JieNa\202\362?\205DanYi\202\362?\205\362?\205JieZhiXieRanZhiRenQinJinJun\007:\204Mei\005\020\204Ao\202\003\025\204HuiRanJiaTuo\005\357\204DaiBaoPaoYaoZuoBi\202\360\366\204TanJu\202He\202XueXiu{Z\204Yi\202Pa\202Bo\202Di\202Wa\202Fu\202GunZhiZhiRanPanYi\202MaoTuoNa\202Gou\003P\204ZheQu\202BeiYu\202Xi\202Mi\202Bo\202Bo\202Fu\202ChiChiKu\202Ren{\240\205Qia{\240\204Bo\202JieEr\202Ge\202Ru\202ZhuGuiYinCaiLieKa\202\003g\204\372\230\206\010\220\204Xu\202KunKen\003\025\204ShuJiaKun{x\205Li\202\007q\204\371\260\204PouGe\202Yi\202Yu\202{Z\204LiuQiuQunJi\202Yi\202Bu\202\372\230\206\3055\204ShaQunLi\202{\207\204{\207\204Ku\202{\240\204Fouz\355\204Bi\202KunTao\007:\204\005\357\204Chiz\355\205\004\320\204Duo\003t\204{\207\205{_\205PeiPeiFei\007:\204LuoGuoYanDu\202Ti\202ZhiJu\202Yi\202"; -static const char b089[769] = "\377Qi\202GuoGuaKenQi\202Ti\202Ti\202Fu\202z\367\205Xie\303\362\204DieKun\0070\204XiuXiuHe\202\007:\204BaoBaoFu\202Yu\202\007\265\204YanHuiBeiChuLu\202PaoDanYunTa\202GouDa\202\006\333\204\006N\204\007:\204Ru\202Naiz\343\205SuoBanTuiChi\010\230\204\003\025\204\004\377\204Jiez\350\204\006\333\204Ku\202{\207\204LanLi\202ZheShiLu\202Yi\202DieXiez\374\204Wei\003t\204CaoJi\202z\350\205SenBaoz\374\205Bi\202Fu\202{\240\204\372\230\205{\240\204CuiJi\202DanZa\202FanBo\202z\374\205XinBieRaoManLanAo\202Ze\202GuiCaoSui\010M\204z\355\204{\207\204Bi\202Jin\010\220\204ShuTanBi\202LanFu\202Ru\202ZhiDuiShuWa\202ShiBaiXieBo\202{x\204Lai\003\031\204Xi\202z\374\204LanZheDaiJu\202ZanShi{\240\204PanYi\202LanYa\202Xi\202Xi\202Yao\003\014\204TanFu\202\011>\204Fu\202Ba\202He\202Ji\202Ji\202{\240\204{\012\204\303\362\204YanGuiJue\003I\204MaoMi\202Mi\202MieShiSi\202z\355\204LuoJueMi\202\007\036\204{\207\204YaoZhiJunXi\202{_\204WeiXi\202|\015\204Yu\202LanE\000\201Du\202Qin\003\247\204Ji\202\305;\204\004\377\204GouQu\202{\221\204Jin{\012\204\005\262\204{\240\204LuoQu\202{\240\204WeiJueQu\202LuoLan\371\260\204Di\202{\012\204{\240\204{\012\204YanGuiMi\202Shiz\355\204LanJueJi\202Xi\202Di\202|\015\204Yu\202GouJinQu\202\003\002\204QiuJinCu\202JueZhi\010I\204Ji\202Gu\202DanZi\202Di\202{_\205Hua\301\357\204Ge\202ShiJieGui\003=\204ChuJieHunQiu\003g\204Su\202Ni\202Ji\202Lu\202ZhiZhaBi\202\003g\204Hu\202{_\205\003=\204ZhiXueChuXi\202Yi\202Li\202JueXi\202YanXi\202"; -static const char b08a[769] = "\377YanYan\003x\204Fu\202QiuQiu\003\002\204\005\335\204Ji\202FanXun\005,\204\005\335\204\005\020\204TaoXu\202JieYi\202RenXunYin{_\204Qi\202TuoJi\202XunYinE\000\201FenYa\202Yao\007\023\204\371\260\204YinXinJue\3621\204Ne\202{x\204YouZhi{s\205\003%\204Xin\010I\204SheYanSa\202\007g\204Xu\202Yi\202Yi\202Su\202ChiHe\202\371\260\204He\202Xu\202{Z\204Zhu{Z\205GouZi\202Zi\202{\221\204Gu\202Fu\202{\240\204Die\005\357\204Di\202\360\350\204Li\202NaoPan\003c\204GanYi\202Ju\202YaoZhaYi\202Yi\202Qu\202\002\376\204\0102\204Bi\202{s\205Qu\202Ba\202Da\202Zu\202TaoZhuCi\202Zhe\003]\204Xu\202XunYi\202z\362\205He\202ShiCha\3621\204ShiHenChaGouGui\301\357\204HuiJieHuaGaiz\374\205Wei\371\260\204\003c\204\3628\204Mi\202{\221\204\305;\204E\000\201HuiYan{s\205GuaEr\202\002\354\204\007\036\204Yi\202LeiZhu{\202\205KuaWu\202Yu\202\005\326\204Ji\202ZhiRenCu\202\005\230\204E\000\201{\202\205Ei\202Shi\005P\204DanBeiz\355\204You\007\243\204\006\214\204Qin{\276\204An\202Yu\202\3621\204{x\205Jiez\374\204Wu\202Wu\202Gao\007\023\204Bu\202Hui\0050\204\010\016\204{Z\204\010\016\204Du\202Huaz\355\205\3055\204JieKe\202Qu\202\006&\204\3621\204Sui\305`\204z\374\204FeiChiTa\202Yi\202Ni\202Yin\005,\204Pi\202\004\334\204z\355\204{x\204\007g\204Ji\202Qi\202Tan\003p\204WeiJu\202\003\006\204\004\352\204{Z\205Ze\202Zouz\350\204\004\334\204{\207\205{\240\204ChuHaoLun\371\260\204\003t\204Hua\003I\204Yu\202DieXu\202\003I\204Shi\003P\204ShiHunHuaE\000\201\362?\205Di\202XieFu\202Pu\202\005P\204{\240\204Qi\202Yu\202Zi\202\372\230\205Xi\202HuiYinAn\202z\374\204Nan{x\204\003\014\204Zhu\360\350\204Yanz\362\205\003P\204Ge\202NuoQi\202"; -static const char b08b[769] = "\377MouYe\202Wei\003g\204\005\326\204\003c\204{_\204{\240\204Po\202Kuiz\362\205HuoGe\202\004\377\204Mi\202\3621\204Mi\202Xi\202z\350\205{x\204XueTi\202Su\202\006l\204Chiz\350\204Shi{\240\205\007:\204XieHe\202TaoYaoYaoLu\202Yu\202\003t\204\006&\204\003\006\204Li\202Mo\202Mo\202{_\205ZheMiu{\240\204Ze\202Jie{\207\204LouCanOu\202GunXi\202\004\334\204Ao\202Ao\202JinZheYi\202Hu\202{\240\205Man\010I\204HanHuaz\355\204Xu\202\010\243\204Se\202Xi\202ZhaDui{Z\205NaoLanE\000\201\004\377\204JueJi\202Zun\003\002\204Bo\202Hui\372\230\205Wu\202ZenZhaShi\006\214\204TanZenPu\202\371\260\205\003P\204ZaoTan\010\220\204Suiz\374\204Ji\202\003\002\204\0050\204{\221\204\006\220\204Yi\202Ai\202{\221\204Pi\202HuiHuaYi\202Yi\202{_\204\010\314\204Nouz\350\204DuiTa\202Hu\202\003c\204HaoAi\202\004\377\204{\240\204Yu\202{\240\204HuiDu\202Zhe\003P\204ZanLei\371\260\204Weiz\355\204Li\202Yi\202\303\362\204ZheYanE\000\201\004\320\204Wei\004\320\204Yaoz\355\204\010\314\204YinLan{x\204XieNiez\362\204ZanYi\202\010\220\204{\221\204YanDu\202YanJi\202\003x\204Fu\202RenJi\202Jie\005\335\204Tao\010\314\204{_\204Qi\202TuoXunYi\202XunJi\202Ren{\240\205HuiOu\202Ju\202Ya\202Ne\202Xu\202E\000\201Lun{s\205\007\023\204\003\014\204She\003%\204Jue{Z\205Gu\202He\202\0102\204Zu\202Shi{s\205ZhaSu\202{Z\204Di\202\003c\204Ci\202Qu\202\002\376\204Bi\202Yi\202Yi\202{\202\205LeiShiGuaShiJi\202Hui{x\205Zhu\371\260\204HuaDanGou\301\357\204GuiXunYi\202{Z\205Gaiz\374\205ChaHunXu\202\003c\204JieWu\202Yu\202\006\214\204Wu\202GaoYouHui{\202\205\010\016\204\007\023\204Ei\202\003\006\204ZhuZouNuoDu\202\004\334\204FeiKe\202Wei"; -static const char b08c[769] = "\377Yu\202\011B\204\371\260\204\005,\204z\355\204{\207\205\007g\204SuiTan\371\260\204Yi\202Mou{x\204Diez\362\205{\240\204XieXueYe\202WeiE\000\201Yu\202\003P\204z\355\204Zi\202An\202YanDi\202Mi\202\003I\204Xu\202Mo\202\010\220\204Su\202XieYao\006l\204Shiz\350\204Mi\202JinManZhe{\240\204MiuTanZen\006\214\204LanPu\202JueYanz\350\204{\221\204{x\204Gu\202z\350\204\005\335\204XiaJi\202\005\335\204Han\005\335\204Xi\202Xi\202Huo\006z\204HanDu\202\003\031\204Dou{\240\205Qi\202ShiLi\202\005\262\204WanBi\202Shuz\374\204\003\014\204ZhiZhiYanYanShiChuHuiTunYi\202TunYi\202{\240\204Ba\202HouE\000\201Chuz\374\205z\362\204{\240\204KenGaiJu\202Fu\202Xi\202BinHaoYu\202ZhuJiaFenXi\202Bo\202Wenz\362\204BinDi\202\004#\204FenYi\202ZhiBao\005\020\204An\202Pi\202Na\202Pi\202GouNa\202You\005,\204Mo\202Si\202Xiuz\362\204KunHe\202HaoMo\202An\202MaoLi\202Ni\202Bi\202Yu\202Jia\007\265\204MaoPi\202Xi\202Yi\202Ju\202Mo\202ChuTanz\362\204JueBei{Z\204\007:\204Fu\202Cai\003=\204Te\202Yi\202\004\272\204WanPinHuoFanTan{\012\204Ze\202ZhiEr\202ZhuShiBi\202Zi\202Er\202Gui\003I\204\303\362\204MaiDai\371\260\205{\202\205FeiTieYi\202ChiMaoHe\202Bi\202Lu\202LinHuiGai\003I\204Zi\202JiaXu\202Zei\003\002\204Gai\006a\204{\240\204\004\377\204Xun{Z\204SheBinBinQiuShe\305X\205\006a\204\003c\204LaiZanCi\202{x\204{_\205|\015\204Pei\007\277\204z\374\204Mai{\240\204SuiFu\202Tan\006&\204\006&\204ZhiJi\202{\221\205Du\202Jin{s\205\256\371\204YunBaoZaiLai\003\014\204\010:\204Ji\202\371\260\205Yi\202\372\230\205Fu\202GouSaiZe\202\006z\204"; -static const char b08d[769] = "\377Yi\202Bai{x\204WanZhi\003p\204\003t\204Yun\010\243\204DanZanYanPu\202{_\204Wan\004\377\204JinGanz\374\204\006a\204Bi\202Du\202ShuYan{_\205\003P\204\003\031\204Gan\006a\204Bei{Z\204Fu\202\007:\204\003=\204CaiZe\202z\374\204Bai{\221\205HuoZhiFanTanPin\303\362\204GouZhu{\012\204Er\202{\240\204BenShiTieGui{\202\205DaiMaoFeiHe\202Yi\202ZeiZhiJiaHuiZi\202LinLu\202\006a\204Zi\202GaiJinQiu{Z\204LaiSheFu\202Du\202Ji\202Shu{_\205Ci\202Bi\202\003c\204\007\277\204PeiDanLai\003\014\204\003p\204Fu\202\372\230\205SaiZe\202YanZanYun\010\243\204{_\204\004\377\204GanChiXi\202SheNan\3628\204Xi\202{x\205He\202{x\205ZheXia\005!\204ZouZouLi\202JiuFu\202\002\376\204GanQi\202{_\204{}\205Yinz\374\204Zi\202JueQinChiCi\202{x\204{x\204DieJu\202\010I\204Di\202Xi\202{\221\204JueYueQu\202Ji\202ChiChuGuaXueZi\202\007\036\204DuoLieGanSuoCu\202Xi\202\002\376\204Su\202YinJu\202{\240\204Que\005!\204\301\321\204CuiLu\202Qu\202\010\220\204QiuZi\202Ti\202Qu\202Chiz\362\205\006\214\204\006\214\204\003\002\204ZaoTi\202Er\202ZanZanZu\202Pa\202BaoKu\202Ke\202DunJueFu\202{x\204{\240\204\003%\204ZhiTa\202YueBa\202Qi\202Yuez\350\205TuoTaiYi\202{\327\204\005\357\204MeiBa\202DieKu\202TuoJiaCi\202PaoQiaZhuJu\202\3607\204ZhiFu\202PanJu\202{_\204Bo\202Ni\202Ju\202Li\202GenYi\202Ji\202Duoz\374\204\003\002\204DuoZhu\301\357\204Kua|\024\205Gui{}\205Kuiz\374\205ChiLu\202\003I\204ZhiJia\007\036\204Cai{\240\204Da\202\006\214\204Bi\202z\374\204DuoJi\202Ju\202Ji\202ShuTu\202"; -static const char b08e[769] = "\377Chu\0050\204Nie\3621\204Bu\202XueCunMu\202Shu{\207\205\003]\204\003\002\204\004\320\204\006\214\204MouTa\202{\240\204Qi\202Wo\202Wei\301\321\204JieJi\202NieJu\202NieLunLu\202\006G\204\006\333\204Ju\202ChiWan\301\357\204Ti\202Bo\202Zu\202QieYi\202Cu\202\004#\204Cai\004#\204\006\260\204Zhi{Z\205\3607\204ZhiYu\202DuoDun\305X\205\003]\204\362?\205Di\202Zha{x\204{\252\205{\240\204Gua\005!\204Ju\202Fu\202Zu\202Die\003I\204RouNuoTi\202ChaTui{\240\204DaoCuoQi\202Ta\202z\350\205{\327\204\3607\204Ti\202Ji\202NieManLiuZanBi\202z\367\205Lu\202\006z\204Cu\202\005!\204DaiSu\202Xi\202KuiJi\202Zhiz\350\205Di\202Pan\004#\204{\207\204\005\005\204Zao{\327\204BieTuiJu\202\005\262\204\007\177\204z\374\204FanChu\362?\205DunBo\202Cu\202Cu\202JueJueLinTa\202\006\214\204JuePu\202\006z\204Dun\007A\204{\012\204ZaoDa\202Bi\202Bi\202ZhuJu\202Chu\006\214\204Dun\004\320\204Ji\202Wu\202Yue{\327\204LinLieZhiLi\202Zhiz\355\204Chu\0070\204Wei\003\031\204Linz\374\204Wei\010k\204LanXie\010\314\204Sa\202NieTa\202Qu\202Ji\202\007A\204CuoXi\202KuiJueLin\371\260\204\003=\204DanFenQu\202Ti\202DuoDuo\003=\204\005\230\204RenLuoAi\202Ji\202Ju\202\005!\204\006\237\204LaoYanMei\007\014\204Qu\202LouLaoDuoZhiYanTi\202Dao\004\377\204Yu\202CheYa\202GuiJunWeiYueXinDai\003P\204FanRen{_\204{\202\205ShuTun{x\204DaiE\000\201Na\202Qi\202Mao\005\253\204{\202\205z\350\204\372\230\205\005\335\204Hu\202Qu\202{\202\205Di\202\005\357\204DaiAo\202{Z\204Fan{\202\205\360\350\204\006\260\204BeiGu\202Gu\202PaoZhu\006N\204E\000\201Ba\202\003c\204ZhiYaoKe\202Yi\202ZhiShi\0102\204"; -static const char b08f[769] = "\377Er\202\003=\204Ju\202\003\002\204{\012\205He\202Kai\301\357\204\003c\204ZaiZhiShe{\207\205Yu\202\360\366\204YouWanYinZheWanFu\202\003\006\204\003c\204Ni\202\006G\204Zhe{\221\204{\207\205Zi\202Hui\305`\204\301\321\204GuoKanYi\202\006\260\204z\350\204Gun{\327\204\0102\204{\012\204BeiLunPai{\207\205\005\253\204RouJi\202\360\350\204z\374\204\305X\205Cou\256\371\204Ge\202You\005\335\204ShuFu\202Zi\202Fu\202WenBen{\221\204Yu\202WenTaoGu\202{Z\204Xia\007:\204Lu\202\003\002\204\010I\204\372\230\205WeiHunXueZhe\003\002\204{\221\204Bu\202LaoFenFanLinGe\202Se\202Kanz\362\204Yi\202Ji\202\003p\204Er\202Yu\202{\240\204\005\335\204LeiPeiLi\202Li\202Lu\202LinCheYa\202Gui\003P\204DaiRen\372\230\205E\000\201Lun\005\253\204\005\335\204Gu\202Ke\202Lu\202\003c\204ZhiYi\202Hu\202{Z\204Li\202Yao\003\006\204ShiZaiZhi\003\002\204\003c\204\301\357\204Lu\202\003\002\204ZheFu\202{\207\205{\327\204BeiHuiGun\305`\204{\207\205\301\321\204Zi\202CouFu\202Ji\202WenShuPei\007:\204Xia{\327\204Lu\202ZheLinXinGu\202Ci\202Ci\202Pi\202Zui\303\362\204La\202La\202Ci\202XueBan\303\362\204\303\362\204\303\362\204Xue\303\362\204BanCi\202\303\362\204\303\362\204{x\204Ru\202\010M\204\010M\204z\355\204\301\321\204\301\321\204Yi\202\007\357\204\303\362\204\303\362\204ShiYu\202\006z\204Da\202z\355\204Ganz\350\204Yu\202Yu\202Qi\202XunYi\202GuoMaiQi\202Za\202\305`\204Tu\202\007g\204\004\377\204Da\202YunJin\004\272\204Ya\202FanWu\202Da\202E\000\201HaiZheDa\202Jin\007:\204Wei{\207\204ChiCheNi\202\007\036\204ZhiYi\202z\343\205Jia{x\204DaiEr\202Di\202Po\202ZhuDieZe\202TaoShuTuoQu\202\0050\204Hui\004\352\204YouMi\202\005\005\204Ji\202NaiYi\202Jie\003p\204LieXun"; -static const char b090[769] = "\377Tui\007\023\204ShiTao\003\247\204HouNi\202Dunz\343\205\003P\204XunBu\202You\3621\204QiuTouZhuQiuDi\202Di\202Tu\202\0050\204Ti\202DouYi\202Zhe\3628\204{\012\205Wu\202Shi{x\205Su\202ZaoQun\003\014\204{\207\204SuoHuiLi\202Gu\202LaiBenCuoJue\005\005\204z\362\204DaiLu\202You\003c\204JinYu\202\301\321\204KuiWeiTi\202Yi\202Da\202\007:\204LuoBi\202NuoYu\202\010\220\204SuiDunSuiYan\305X\205ChiTi\202Yu\202Shi{Z\204YouYunE\000\201\303\362\204GuoE\000\201Xiaz\362\205QiuDaoDa\202WeiNanYi\202GouYao\004\320\204LiuXunTa\202Di\202Chi\007:\204Su\202Ta\202z\350\204Ma\202Yao{\012\204{\221\205Ao\202ShiCa\202ChiSu\202ZaoZheDunDi\202LouChiCuoLinZunRaoz\350\204\003P\204Yu\202Yi\202E\000\201\006z\204Ju\202ShiBi\202YaoMaiXieSuiHai{\221\204\005\326\204Er\202\005\014\204\303\362\204\303\362\204La\202Li\202\007:\204YaoLuoLi\202Yi\202\005P\204\005\262\204Qi\202\003]\204{_\204HanYu\202\006\351\204Ru\202{}\205Xi\202{\202\205Fu\202\007\014\204Bin\003%\204\003g\204Na\202Xin\371\260\204\006l\204\007:\204CunHuoXie\006l\204Wu\202Ju\202YouHanTaiQiuBi\202Pi\202\002\354\204\360\366\204BeiWa\202Di\202ZouYe\202Lin{\202\205GuiZhuShiKu\202Yu\202GaiHe\202QieZhiJi\202z\362\204Hou\003g\204\003\002\204Xi\202GuiNuo\005\230\204Jia\005\271\204{Z\205\005\230\204YunYan{x\205DouXi\202Lu\202Fu\202Wu\202Fu\202GaoHao\005\230\204Jia\007\277\204Jun\004\377\204Bo\202Xi\202BeiLi\202YunBu\202\3621\204Qi\202Pi\202\003\006\204Guo\003c\204TanZou\0102\204LaiNi\202{x\204YouBu\202z\374\205DanJu\202\003]\204\006\214\204Yi\202DouYanMei"; -static const char b091[769] = "\377RuoBeiE\000\201Shu\007q\204Yu\202YunHouKuiz\374\205z\374\205Sou\005!\204\305;\204Xi\202Ru\202ChuZi\202ZouYe\202Wu\202z\374\205YunHao\003]\204Bi\202Mao\010I\204Fu\202\006z\204Yin\372\230\205Hu\202\006\214\204Yan{\221\205Man\006\214\204Xu\202\005\262\204Bi\202XunBi\202\010\243\204Wei{Z\205Mao{_\204LinPo\202Dan\006\205\204Ye\202Cao\005\271\204\003\014\204\006\205\204Zou{\202\205{\207\204Zanz\355\204YouJi\202Yanz\355\204Cuo\005\357\204z\362\204Xi\202\003\014\204ZanLi\202You\003x\204Qiu\004\334\204Pei\003c\204Yi\202GanYu\202JiuYanZuiMao{Z\204Xu\202Dou{Z\204Fen\007:\204Fu\202YunTai|\015\204QiaTuoCu\202HanGu\202Su\202Po\202\004\320\204Zai\305;\204Lao\301\321\204\004\320\204You\3628\204Zhiz\374\204{\240\205{x\205YinTu\202\003\002\204MeiKu\202\011\032\204LeiPu\202ZuiHaiYan\007\261\204{\327\205WeiLu\202LanYanTaoPei{\221\204\256\371\204TanZui\003p\204Cu\202KunTi\202z\374\204Du\202Hu\202Xu\202\003g\204TanQiu\256\371\204YunPo\202Ke\202SouMi\202\301\357\204\004\320\204CuoYun\003]\204AngZhaHai\005!\204{\240\205\007\335\204{x\204Yu\202Li\202ZaoLaoYi\202{\240\205Bu\202\003\002\204Xi\202TanFa\202\010M\204Yi\202Li\202Ju\202YanYi\202{\327\205Ru\202Xun\004\320\204Yan\005\357\204Mi\202Mi\202{\327\205Xin\003\002\204\007\261\204Mi\202Yan\303\362\204CaiShiYouShiShiLi\202\362?\205Ye\202{\207\205Xi\202JinJinQiuYi\202\006z\204Dao\002\376\204\003x\204Po\202QiuBa\202Fu\202{Z\204ZhiBa\202\006\337\204Fu\202Nai\005,\204{_\204\006\214\204Kou\305X\205Zi\202FanHuaHuaHan\006\025\204Qi\202\006\351\204Ri\202Di\202Si\202Xi\202Yi\202\005\020\204ShiTu\202Xi\202Nu\202z\350\204Qiu{\240\204Pi\202Ye\202Jin"; -static const char b092[769] = "\377Ba\202\003%\204{x\204\003g\204DouYuez\350\204Fu\202Pi\202Na\202XinE\000\201JueDunGouYinz\350\204BanSa\202Ren\010I\204NiuFenYunYi\202QinPi\202Guo\005\335\204YinJun\005,\204Yi\202\362?\205Xi\202GaiRi\202HuoTai\007\014\204\007:\204Lu\202E\000\201QinDuoZi\202Ni\202Tu\202ShiMinGu\202Ke\202\005\357\204\002\354\204Si\202Gu\202Bo\202Pi\202Yu\202Si\202ZuoBu\202You|\015\204Jia{Z\204ShiShiZhiJu\202z\355\204ShiShi\003P\204\002\376\204BaoHe\202Bi\202\371\260\205ChuShiBo\202ZhuChiZa\202Po\202\3628\204z\350\204Fu\202\005(\204Liuz\350\204Fu\202Li\202YuePi\202\360\350\204BanBo\202JieGouShu{Z\205Mu\202Xi\202Xi\202Di\202JiaMu\202Tanz\362\204Yi\202Si\202{\202\205Ka\202Bei{\240\204\3628\204\003g\204\005\335\204\003\002\204ChiEr\202Luo\002\354\204ShiMouJiaYinJun\003c\204z\367\205z\374\205\3628\204Mo\202LeiJi\202Yu\202Xu\202RenZunZhi{}\205{_\204Chiz\374\204\003g\204\301\357\204Pi\202TieZhuz\374\205\305;\204KuaYaoz\374\204z\374\204XiuJunChaLaoJi\202Pi\202Ru\202Mi\202Yi\202Yin{\012\205An\202DiuYouSe\202Kaoz\350\204\006\337\204Si\202Ai\202\005,\204HanRuiShi\007\243\204Qiu\3621\204ZheXiu\006a\204Ti\202CuoGua\005\335\204\362?\205TouLu\202Mei\005\230\204WanXinYunBeiWu\202Su\202Yu\202z\355\204\003x\204Bo\202HanJia\005\335\204\007A\204\003\014\204z\355\204WanZhiSi\202\003P\204HuaYu\202\007\036\204{\202\205\004\334\204Lue\003g\204Qin\371\260\204HanLueYe\202Chu\010\243\204Ju\202z\374\204Tie\006\351\204Pu\202Li\202PanRui{x\205GaoLi\202Te\202\002\354\204Zhu{Z\204Tu\202LiuZuiJu\202z\355\205\007:\204{\240\204\006\025\204\005,\204Taoz\355\205"; -static const char b093[769] = "\377LunGuo\005\357\204Pi\202Lu\202Li\202z\350\205Pou\007q\204MinZui\006\260\204An\202Pi\202z\374\204Ya\202\003p\204LeiKe\202\006\237\204Ta\202KunDu\202Nei\257\320\204Zi\202{Z\205BenNie\004#\204\256\371\204Tan\003x\204Qi\202z\350\204\003p\204Ji\202Yu\202Jin{\012\204Maoz\355\205|\015\204Xi\202{\207\204TaoGu\202CuoShu{Z\204Lu\202\006\205\204Lu\202Hua\003t\204Ga\202LaiKen\003%\204Wu\202NaiWanZanHu\202De\202z\374\204\003I\204Huo{\207\205Fa\202MenKai\004\377\204Di\202{\207\204Guoz\374\204Du\202Tu\202Wei\004#\204Fu\202RouJi\202E\000\201Jun{x\204Ti\202ZhaHu\202\360\350\204\0070\204XiaYu\202\007\243\204\371\260\205z\362\205WeiFu\202\002\376\204ChaQieShi\005\335\204Kui|\015\204Mou\006\214\204\006\214\204HouTou\006&\204z\362\204Ye\202Min{\240\204\0070\204{\240\204\007\023\204KuiHu\202\003P\204DuoJie{Z\204\303\362\204\362?\205Zi\202XiuYe\202MeiPaiAi\202Jiez\350\204MeiSuoDa\202\006l\204Xia{\207\204SuoKaiLiuYaoYe\202Nou\006Z\204\006N\204\005!\204Suoz\350\205Li\202\010\016\204\257\320\204Bo\202PanDa\202Bi\202\010\230\204\006\025\204Zi\202Wu\202\004\377\204z\362\205\007\036\204LiuKaiSunShaSouWanHao{Z\204{Z\204\005\230\204Yi\202\007:\204\005!\204NieXi\202JiaGe\202Ma\202\007q\204\007\023\204Zu\202SuoXia\003\014\204WenNa\202Lu\202SuoOu\202Zu\202\007\265\204Xiu{\012\204\003P\204{\207\204\002M\204Ao\202ManMo\202LuoBi\202WeiLiuDi\202San\004#\204Yi\202Lu\202Ao\202\007\243\204z\350\205CuiQi\202z\355\205\005!\204Man\003]\204z\355\204\003\014\204\0050\204\003t\204ShuLouXiu\006&\204\003\031\204Zan{\240\204CaoLi\202XiaXi\202\007\014\204\372\266\206\005\005\204{\221\205z\350\204{x\205Lu\202HuaJi\202Pu\202Huiz\350\205Po\202LinSe\202XiuSan{x\205"; -static const char b094[769] = "\377KuiSi\202LiuNaoz\362\205PieSuiFan\006\214\204\301\357\204\360\350\204\005!\204z\374\205Jue\003\002\204Zun\006z\204QieLaoDuiXinZanJi\202{\240\204\362?\205\005\262\204Ya\202\004\377\204DuiJueNouZanPu\202TieFan{x\205\003x\204{_\204Kai{\240\204FeiSuiLu\202\007q\204HuiYu\202{\207\204\004\334\204\006\214\204{\240\204\004\334\204LeiBi\202Tiez\362\204Ye\202DuoGuo\010\220\204Ju\202FenDa\202BeiYi\202Ai\202\004#\204Xun\005,\204Zhu\005\313\204\003p\204Ji\202NieHe\202Huo\003\006\204Bin\004\377\204Kui\006\373\204Xu\202{\240\204{\240\204z\350\204ChaZhiMieLi\202LeiJi\202\010k\204{\202\205{_\205\006\260\204La\202Du\202\010\016\204\301\321\204Lu\202\003t\204BaoLu\202z\374\204{\202\204\003\031\204E\000\201Lu\202Xin{\240\204LanBo\202{\240\204Yaoz\355\204z\374\205{\240\204Xi\202{\012\204\010:\204NieLei\007A\204Qu\202PanLuo\010k\204\006\337\204ZaoNieJue\005!\204ZhuLanJinGa\202Yi\202{Z\204\003x\204\002\376\204Po\202\006z\204Tu\202z\350\204\305X\205{_\204Sa\202Fan\005,\204MenNu\202\360\350\204\005\020\204\003g\204GaiBu\202TaiJu\202Dun\010I\204\362?\205Na\202Bei\006\025\204Banz\350\204YaoQinJunWu\202Gou\007\014\204\003%\204HuoTouNiuBa\202Yu\202z\350\204{Z\205z\350\204Gu\202Bo\202Ke\202Po\202Bu\202Bo\202Yue\010k\204Mu\202TanJia\3607\204YouTieBo\202\005\357\204\010\016\204z\350\204MaoBaoShi\003P\204Ta\202Bi\202Ni\202Pi\202Duo\003g\204KaoLaoEr\202\006\351\204Ya\202You{x\205JiaYe\202NaoZhi\010\220\204\3628\204Lu\202\005,\204YinKaiZhaZhuXi\202\003x\204Diuz\374\204Hua\301\357\204ShaHa\202\005,\204Ge\202\305;\204{Z\205Se\202\003\002\204Yi\202z\355\204z\367\205\005!\204An\202YinRu\202ZhuLaoPu\202Wu\202LaiTe\202{\207\204\007\243\204"; -static const char b095[769] = "\377\3621\204SuoLi\202\010\243\204ChuGuoGaoE\000\201XiuCuoLue\003\014\204XinLiuKai{\240\204RuiTi\202\005\230\204QinJu\202A\000\201z\350\205ZheNuoCuoMaoBenQi\202De\202Ke\202Kunz\355\205Xi\202Gu\202Luo\257\320\204\003p\204JinZhiz\374\204\007q\204HuoPeiTan\003x\204{\240\204Ju\202\006\205\204Zi\202Qie\004\377\204Kaiz\350\205Si\202E\000\201Cha\006\214\204\362?\205\0070\204Souz\362\205z\362\204Ai\202Du\202MeiLouZi\202FeiMeiMo\202{Z\204Bo\202Ge\202Nie\005!\204\007q\204NieNa\202LiuGao\006l\204Yi\202JiaBin\006N\204\003t\204\005!\204ManLuo\005\005\204\003]\204\0050\204Di\202Zu\202\003P\204Liuz\355\204Jue\006z\204Pu\202Lu\202DuiLanPu\202\007A\204z\350\205\005\262\204HuoLeiz\362\204\004\334\204{\207\204Yi\202Cha\003t\204La\202z\355\204z\374\205{\221\205z\355\205JiuAo\202DieQu\202\006z\204Mi\202{\221\205MenMa\202\372\266\205{_\204HuoMenYanBi\202HanBi\202{_\204Kai\007\014\204\005\005\204\005\335\204RunSanz\374\204z\374\204{\240\204MinXia\3055\204DouZhaNao{\221\204\006\260\204Xia\005\357\204\303\362\204Bi\202RunAi\202{\012\204Ge\202Ge\202Fa\202Chu\005\335\204GuiMinSe\202Kun\005\230\204Lu\202\005P\204ShaJu\202YueYuez\355\204Qu\202Linz\355\205\007\261\204KunYanWenYanE\000\201HunYu\202Wen\005\335\204Bao\005\335\204Qu\202YaoWenBanAn\202WeiYinKuoQueLanDu\202\301\357\204\003\014\204|\015\204NieTa\202KaiHe\202Que\305X\206{\012\204DouQi\202Kui\005!\204{\012\204\007\335\204KanXi\202Huiz\355\204Pi\202\010\220\204z\362\204Ta\202WenTa\202Men\372\266\205{_\204YanHanBi\202Wen\305X\206RunWeiz\374\204\005\335\204{\240\204Min\007\014\204MenZhaNaoGuiWenTa\202MinLu\202Kai"; -static const char b096[769] = "\377Fa\202Ge\202He\202KunJiuYue\005\230\204Du\202Yu\202Yanz\355\205Xi\202WenHunYanE\000\201z\355\204LanQu\202HuiKuoQueHe\202|\015\204Da\202QueHanz\362\204Fu\202Fu\202Le\202DuiXinz\350\204Wu\202GaiZhiYin\360\350\204DouE\000\201\371\260\205BanPei\007\243\204Yun\005\253\204ZhiPi\202\0050\204\003%\204\360\350\204Yin{Z\204Jie{x\205E\000\201Qu\202Di\202Zu\202Zuo\3607\204\005\357\204A\000\201TuoTuoBei\002\354\204Fu\202Ji\202Lu\202\003\031\204{x\204\003g\204DuoLouMo\202{\240\205ShuDuoz\374\204Er\202GuiYu\202Gai{_\204Jun\006\214\204\003g\204\256\371\204Fu\202Bi\202Xia{_\204\371\260\205ZhiPu\202Dou\007:\204{Z\204Chuz\374\204DaoNieYunz\374\204PeiFeiZouYi\202DuiLunYinJu\202\257\320\204{x\204Pi\202\005\357\204Taoz\374\204Lu\202\371\260\205z\374\204YinZhu\360\350\204\007\357\204Xiaz\367\205YanYinShuDi\202Yu\202\003\031\204WeiWeiNieDuiSuiAn\202z\362\205JieSuiYinGaiYanHuiGe\202YunWu\202KuiAi\202Xi\202\005!\204Ji\202{\221\205DaoAo\202Xi\202YinSa\202RaoLinTui\005\262\204\003\002\204SuiSuiAo\202z\374\204FenNi\202Er\202Ji\202DaoXi\202YinZhiHui\003\031\204Xi\202Li\202Li\202Li\202\003p\204Hu\202ZhiSun\007q\204NanYi\202QueYanQinz\350\204{s\205Ya\202Ji\202Gu\202z\362\204ZhiGou\007q\204Ci\202\003]\204Ju\202ChuHu\202Za\202LuoYu\202\004\320\204\005,\204SuiHanWo\202\372\266\206{\012\204ChuZa\202\003]\204Ji\202Xi\202\004\320\204LiuLi\202NanXueZa\202Ji\202Ji\202Yu\202Yu\202XueNa\202FouSe\202Mu\202WenFen\003\247\204YunLi\202Chi\360\350\204\005\357\204LeiAn\202BaoWu\202\3607\204\010\220\204Hu\202Wu\202\005,\204"; -static const char b097[769] = "\377Xu\202Ji\202Mu\202{x\204\3621\204Zha\005P\204{Z\204PeiMei\005\357\204Qi\202\003c\204HuoShaFei\005\335\204{\221\204YinNi\202ZhuTunLin\005\357\204\004\352\204\004\377\204Wu\202\005\357\204\372\266\206\005\357\204Xia\005\335\204YinMaiMaiYunLiu\006\205\204BinWu\202WeiKuoYinXi\202Yi\202Ai\202Dan\005\326\204z\374\204Yu\202Lu\202\003\031\204DaiJi\202\003\247\204\360\350\204Ba\202Pi\202Wei\003\014\204Xi\202Ji\202Mai\006\205\204\006\205\204LeiLi\202HuoAi\202FeiDai\003\031\204\005\357\204Ai\202\003\014\204Li\202BaoHe\202He\202He\202\002\354\204\003\006\204\003\006\204\0050\204|\015\204{Z\204\0050\204{x\205\003\006\204\0050\204\0050\204\3607\204\0050\204|\015\204FeiFeiKaoMi\202\003+\204\003+\204BaoYe\202|\015\204HuiYe\202Ge\202\003x\204Chaz\350\204RenDi\202Du\202Wu\202RenQinJinXueNiuBa\202YinSa\202Na\202Mo\202Zu\202Da\202BanYi\202YaoTaoBeiJie\005\335\204Pao\360\350\204\002\354\204YinGe\202TaoJieXieAn\202An\202Hen\003=\204QiaDa\202\006\214\204\005P\204Man\004\377\204Sui\007\036\204\006\214\204\003P\204\006\237\204\005\005\204Ta\202{_\205\002\354\204KuoJu\202La\202XieRou\006l\204EngQiuQiuHe\202\006\214\204Mu\202Ju\202{\240\204\303\362\204Di\202{\240\204WenTaoGouTa\202BeiXiePanGe\202Bi\202Kuo\005!\204LouGui\006\214\204XueJi\202{\240\204{\240\205z\355\204Da\202Hu\202z\374\204z\350\204Du\202Wa\202{\240\204LanWeiRenFu\202Mei\301\357\204Ge\202Wei\006\214\204Hanz\355\205KuoRouYunSheWeiGe\202BaiTaoGouYunGaoBi\202WeiSuiDu\202Wa\202Du\202WeiRenFu\202HanWeiYunTaoJiuJiuz\374\204Xiez\374\204Ji\202YinZa\202Yun\360\366\204Le\202\006\260\204z\362\205\004\377\204Yun\006\260\204An\202Yinz\374\205"; -static const char b098[769] = "\377Hu\202Ye\202\003x\204\003\006\204Kuiz\374\205\007\221\204HanXu\202Yi\202Xu\202E\000\201\007\023\204KuiQi\202\004\272\204Yu\202WanBanDunDi\202DanPanPo\202\005\357\204Che\0050\204LeiHe\202\006\214\204E\000\201E\000\201WeiXieKuo\371\260\204Yi\202Yi\202HaiDuiYu\202\0102\204LeiFu\202JiaTouHuiKuiJiaLuo\005P\204{x\205\004\377\204YunHu\202Han\0050\204TuiTuiPinLaiTuiZi\202Zi\202\257\320\204\003x\204LaiTanHanz\350\204Ke\202Cui\003P\204QinYi\202SaiTi\202E\000\201E\000\201YanWenKan\003]\204\372\230\205Yanz\374\204XinYi\202\007:\204\010\230\204\3607\204\3607\204{\240\205KuiLeiLao\007\335\204WaiManCu\202YaoHao\006\214\204Gu\202XunYanHuiz\355\204Ru\202\006\205\204Binz\374\204PinLu\202LanNie\301\357\204Ye\202\003x\204\003\006\204Hanz\374\205\007\221\204Xu\202Xu\202WanGu\202DunQi\202Ban\007\023\204\004\272\204Yu\202Lu\202\005\357\204Po\202\0050\204JieJia\005P\204He\202\004\377\204z\343\205Ke\202Yi\202PinHuiTuiHan\004\377\204\004\377\204Ke\202Ti\202\003]\204E\000\201\372\230\205YanE\000\201NieMan\3607\204\010\230\204HaoLeiz\355\204Ru\202Pin\301\357\204\003\014\204\003t\204GuaFu\202Xia{\221\204\003t\204Sa\202Ba\202TaiLieGua\003P\204\360\366\204Ju\202\003t\204Si\202Wei\360\350\204YaoSouKaiSouFanLiuXi\202Liu\007\335\204\007\335\204Liu\003t\204\003t\204\003t\204\006z\204\003t\204Se\202\003\014\204Xiu\003\014\204\360\350\204{\221\204\003t\204Sa\202Ju\202Si\202SouYaoLiu\007\335\204\003t\204\003t\204FeiFanFeiFeiShiShiCanJi\202\003x\204Si\202Tuo{\221\204Sunz\374\205TunRenYu\202\007q\204ChiYinFanFanSunYinTouYi\202ZuoBi\202JieTaoBaoCi\202TieSi\202BaoShiDuo"; -static const char b099[769] = "\377HaiRen|\015\204\003\002\204Jia\002\354\204Yao\3628\204Ci\202z\374\205\360\350\204\007q\204Er\202YanLe\202Xi\202CanBo\202NeiE\000\201Bu\202JunDouSu\202Yu\202ShiYaoHunGuoShi{\240\204\003p\204\002\354\204z\374\204Bu\202Ye\202TanFei{\221\205Wei{\012\204E\000\201\007\326\204YunHu\202z\362\205TieHui{\240\204HouAi\202\005!\204FenWeiGu\202Cha\007\023\204\005!\204Bo\202GaoXi\202KuiLiuSouTaoYe\202WenMo\202\005!\204ManBi\202Yu\202XiuJinSanKui\372\230\205{_\204ChiDanYi\202Ji\202Rao{x\205\003]\204TaoWeiz\374\205{\221\204FenHai\006\205\204YanMo\202z\355\204z\374\205LuoZan\006\220\204Shi\003x\204Ji\202Tuo\005!\204TunXi\202RenYu\202ChiFanYin{\240\204ShiBaoSi\202DuoYi\202Er\202Raoz\374\205He\202Le\202\003\002\204Xi\202\002\354\204Bo\202DouE\000\201Yu\202NeiJunGuoHunz\374\204{\012\204ChaKuiGu\202Souz\355\204Ye\202Mo\202Bo\202LiuXiuJinManSan\372\230\205\006\220\204\002M\204KuiGuoz\374\205FenBo\202Ni\202Bi\202Bo\202Tu\202HanFei{\240\204An\202Ai\202Fu\202z\374\204YunXinFenPinXinMa\202Yu\202\003\014\204HanDi\202TuoZheChiXunZhuZhiPeiXinRi\202Sa\202YunWenZhiDanLu\202YouBo\202BaoJueTuoYi\202Qu\202WenQu\202z\343\205Po\202\002\376\204\007:\204Pei\003c\204Ju\202ZhuNu\202Ju\202Pi\202\006a\204Jia\005\357\204{Z\204TaiFu\202\360\350\204ShiBi\202TuoTuoSi\202LiuMa\202\003I\204TaoZhi\006N\204\005\326\204\004\352\204Xun\301\357\204\371\260\204z\343\205Er\202HaiBo\202ZhuYinLuo\003c\204DanHaiLiuJu\202\007\023\204Qin\006\351\204\005\230\204HanTu\202\003P\204TuiJun"; -static const char b09a[769] = "\377E\000\201{x\205\003g\204Ai\202Lu\202\003p\204\003c\204She\003I\204KunTaoLai\004#\204Ke\202Qi\202Qi\202YanFeiSaoYanGe\202YaoWu\202\003I\204\006&\204\003I\204z\350\204Feiz\362\205z\350\204HuoYu\202Ti\202\301\357\204Xia\004#\204KuiRouSi\202GuaTuoGuiSouz\350\204{x\205ZhiLiu\006\260\204\005\326\204Xi\202CaoDu\202Yan\007:\204ZouSao{_\204Qi\202Zhi\372\266\206Lu\202Xi\202Luo{\221\205Mo\202Ao\202Can\003t\204\006&\204Qu\202Bi\202ZhiYu\202Xu\202HuaBo\202Su\202\3621\204Lin{\221\204DunLiuTuo\007\177\204\3607\204\003\002\204TieYanLuo{\221\204\0050\204Yi\202Ye\202TuoPin\003c\204Yan\003\031\204Lu\202\005\326\204z\374\205Ji\202\372\266\206Ju\202Xi\202z\362\204Li\202\003t\204Ma\202Yu\202TuoXunChiQu\202Ri\202Bo\202Lu\202\006a\204ShiSi\202Fu\202Ju\202ZouZhuTuoNu\202JiaYi\202Dai\3621\204Ma\202Yin\003\002\204HuaLuoHai\003I\204\003t\204Li\202{x\205Yan\003g\204QinJunQi\202Qi\202Ke\202\003p\204\004#\204Su\202Can\003I\204ZhiKuiSaoWu\202Ao\202Liuz\350\204{_\204\003t\204Luo\006&\204z\355\204\003c\204Ji\202\372\266\206z\374\205Gu\202WeiWeiWeiYu\202GanYi\202AngTouJieBaoBeiCi\202Ti\202Di\202Ku\202Hai\006\214\204HouKuaGe\202Tui\007\277\204\003I\204Bi\202Ke\202QiaYu\202SuiLouBo\202\3621\204\006l\204Bo\202Ci\202{\202\204BinMo\202\006z\204Lou\3621\204Du\202\006a\204SuiTi\202Bin{\202\204Lu\202GaoGao\006\214\204Kao\006\214\204LaoSao\003t\204KunKunDi\202\003%\204XiuRanMaoDanKunBinFa\202\007\036\204Pi\202Zi\202Fa\202RanTi\202BaoBi\202MaoFu\202Er\202\006N\204Qu\202\003=\204XiuKuoJi\202\006\260\204|\024\204\360\366\204Suo"; -static const char b09b[769] = "\377Ti\202Li\202Bin\004#\204Di\202\006\260\204\007\023\204{Z\205\301\357\204\004#\204\007\221\204{\240\204TuoHu\202La\202JiuQi\202{\207\204{Z\204Bin\006\260\204Ma\202SanManMan\010\356\204Xu\202Liez\350\204z\350\204\006\220\204z\362\204Kuo\006\373\204BinLie\010\314\204DouDouNao\005\335\204Xi\202DouHanDouDouJiuz\355\205Yu\202Yu\202Ge\202YanFu\202QinGui\004#\204LiuGui{_\205Yu\202GuiMeiJi\202Qi\202Ga\202KuiHunBa\202Po\202MeiXu\202Yan\3621\204{\207\205Yu\202TuiQi\202\305`\204{\207\205WeiGanChi\007\335\204Bi\202Mo\202Ji\202Xu\202\004\320\204Yan{\221\204Yu\202DaoRenJieBa\202\005\335\204Tuo\005,\204Ji\202Xu\202E\000\201E\000\201Sha\004\272\204TunMo\202Jie\371\260\204Ban\007:\204Pi\202Lu\202WenHu\202Lu\202Za\202\003%\204FenNa\202You\003I\204Mo\202He\202XiaQu\202HanPi\202\005\357\204TuoBo\202Qiu\0102\204Fu\202Bi\202Ci\202WeiJu\202\005,\204Ba\202YouGunPi\202{\327\204\003g\204TaiBaoFu\202ZhaJu\202Gu\202Shi\004\352\204DaiTa\202JieShuHouz\374\205Er\202An\202Wei\002\376\204ZhuYinLieLuo\3628\204Ti\202Yi\202\002\354\204Wei\003\002\204Ku\202Guiz\374\204Ge\202HuiLaoFu\202KaoXiuDuoJunTi\202\003+\204\360\366\204ZhaSuoQinYu\202NeiZheGun\007\277\204Su\202Wu\202Qiu{_\204Pu\202z\362\204\007\036\204Li\202ShaShaKao\006\205\204{x\205Li\202ZouXi\202\003]\204\371\260\204Zi\202Qi\202{Z\205z\374\205Nei\256\371\204Ji\202\005,\204QieGu\202\003c\204\004\352\204LaiFeiNi\202Yi\202KunLu\202Jiuz\355\205\0050\204Lun\005\357\204ZouLi\202\006\205\204\004#\204Zhi{\327\204Hu\202Yu\202Di\202Shi\371\260\204z\362\204Ti\202Hou\003g\204ZhuLa\202\004#\204Zei\303\362\204\303\362\204"; -static const char b09c[769] = "\377z\362\204\301\357\204ZeiWeiWeiYu\202\256\371\204RouDiez\362\205{\207\204YanQiuQiu{\240\204Bi\202E\000\201\360\350\204Fu\202SaiGanXiaTuoHu\202ShiRuo\003P\204Wenz\350\204HaoWu\202\003%\204SaoLiuMa\202ShiShi{\012\204Zi\202\005\326\204Ta\202YaoE\000\201\003]\204z\350\204Qi\202WenRuo\371\260\204{\207\204Ao\202Le\202HuiMinJi\202\007\036\204Qu\202{\240\204\371\260\204ManXi\202Qiu\003t\204Ji\202Ji\202Zhu{\240\205Xiu\372\230\205\003]\204{\221\205\007\014\204XueBieYu\202Qu\202z\374\205Bo\202\003\002\204XunSu\202z\362\205Zun{_\204{_\204FanGuiLinXun\005\014\204Xi\202\010\243\204z\374\205Fen{\012\204Hou\005\271\204ZeiSao{\221\204GanGui\004\377\204Li\202z\355\205LeiShuAi\202Ru\202Ji\202Xu\202Hu\202ShuLi\202LieLi\202Mie{Z\204z\374\205E\000\201Lu\202{\012\204Li\202z\374\204Yu\202DaoJi\202YouTunLu\202\003%\204Ba\202He\202Ba\202\0102\204{\327\204Lu\202YouZhaFu\202Ba\202BaoHouPi\202TaiGuiJieKaoWeiEr\202\3628\204ZeiHou\005\271\204Ji\202\003\002\204z\374\204Zhaz\374\205Xun\007\277\204Li\202{\207\204{\240\204Li\202Shi\007\036\204GunShaz\362\204JunJi\202\003]\204\003\006\204\005\357\204Qi\202ZouFeiKunz\355\205Gu\202Ni\202{\327\204\005,\204\0050\204\371\260\204ShiZi\202FenDieBi\202z\355\205Ti\202WenWeiSaiE\000\201QiuFu\202z\362\205\301\357\204{\240\205\303\362\204SaoAo\202Qi\202Ta\202{\012\204Yao\003\247\204{\240\204Le\202\003t\204XueBieManMin\003]\204WeiXi\202Gui{_\204LinZunHu\202GanLi\202{\221\204{\012\204\003\025\204Yi\202Fu\202Li\202JiuBu\202YanFu\202\005,\204Ji\202\003\014\204Ru\202GanShi\003\014\204\305;\204Bao\007:\204ZhiHu\202QinFu\202BanWen{\240\204ShiYu\202"; -static const char b09d[769] = "\377FouYaoJueJuePi\202z\362\204{Z\204BaoYanYa\202{Z\205\003%\204\003\014\204WenOu\202DaiGe\202Ru\202\005\357\204MieFu\202TuoMinLi\202\303\362\204ZhiGe\202\007:\204Ci\202Qu\202\3621\204ChiDanJu\202YaoGu\202\362?\205Yu\202\360\350\204Yu\202Ya\202TieYu\202|\015\204\004\377\204DuiWu\202Er\202GuaAi\202ZhiYan\005\313\204\3621\204JiaLieZhu\360\350\204Ti\202\005\335\204LuoRu\202MouGe\202Ren\003\002\204Xiu\003c\204ChiLuo\005\313\204{\327\204E\000\201\006\337\204JiaJi\202Tu\202z\362\204TuoBu\202Wu\202\007q\204Yu\202Bo\202JunJunBi\202Xi\202JunJu\202Tu\202\0050\204Ti\202E\000\201E\000\201{\202\205Hu\202Wu\202\371\260\204Lai\003\002\204PanLu\202Pi\202ShuFu\202An\202\004\334\204\006\260\204Qinz\350\204Bei\005,\204Lu\202Que{\240\204Ju\202Tu\202Ya\202\007:\204Qi\202Li\202Ye\202\003p\204\006\237\204DuoKun\371\260\205Qi\202\0050\204Yi\202Yi\202\0050\204Zi\202Lai\004\352\204Qi\202\256\371\204\007\277\204Ju\202JueYi\202ZunJi\202Shu\004\377\204Chi\005\014\204RouAn\202QiuTi\202Hu\202Ti\202E\000\201JieMaoFu\202\256\371\204Tu\202YanHe\202\007:\204\003I\204KunMeiHu\202\004\377\204\305X\205Wu\202Ju\202\004\352\204\010:\204\003%\204He\202\004\377\204\007:\204z\374\204\006Z\204ShiHe\202Chu\005!\204XiaRuoLiuJi\202Gu\202{\240\204SunHanCi\202Ci\202Yi\202YaoYanJi\202Li\202|\015\204KouTi\202Ti\202Yi\202Tu\202Ma\202\3621\204Gao|\015\204{x\204Ji\202\007\265\204ZheAo\202YaoYi\202Ou\202ChiZhiLiu\003]\204Lu\202Bi\202\372\266\206\004\334\204Yu\202Wu\202JueYinTi\202Si\202\003\002\204Yi\202HuaBi\202\004\377\204Su\202z\362\205Fan\003\002\204\006z\204YanGaoJiuz\374\204z\374\204Tu\202MaiZunYu\202\004\377\204Lu\202\007\265\204z\374\204XueYi\202Pi\202"; -static const char b09e[769] = "\377ShuLuoXi\202Yi\202Ji\202Ze\202Yu\202{\221\204Ye\202\360\350\204Pi\202\006\373\204Hu\202Mi\202\004\377\204\006\205\204Di\202YueYu\202LeiBu\202Lu\202He\202\003\031\204\372\266\206Yue\004\377\204{\012\204Qu\202Li\202\006\337\204\003\025\204JiuJi\202\007:\204\305;\204ShiOu\202Ya\202\010:\204Bao{Z\204Gu\202\004\352\204Lu\202Ya\202\3621\204\360\350\204\005\357\204ChiQu\202\007:\204XueTuoSi\202ZhiEr\202GuaXiu\005\313\204\003c\204Ge\202\006\337\204\005\335\204Wu\202Bo\202Li\202\007q\204Gu\202E\000\201Yu\202z\374\204Ti\202Wu\202Que\005\014\204An\202KunBei\006\260\204z\350\204\256\371\204\007\277\204\007:\204Su\202Hu\202He\202E\000\201Gu\202QiuCi\202MeiWu\202Yi\202Yao\006Z\204LiuJi\202Yi\202{\240\204He\202Yi\202\004\377\204ZheLiu\006z\204\003\002\204JiuYu\202Lu\202z\362\204{\221\204\004\377\204Hu\202\006\205\204{\012\204\372\266\206Lu\202Jin\005\357\204{\240\204z\374\204Cuo{\240\204{\240\204YanCuoLu\202YouCu\202Ji\202PaoCu\202PaoZhuJunZhu{\240\204Mi\202Mi\202Yu\202Liu{x\204JunLinNi\202Qi\202Lu\202JiuJun\0050\204Li\202z\374\205z\374\204JiaMi\202Li\202She{\221\205Lin\0050\204Qi\202\005\357\204YanCu\202MaiMaiHe\202\010I\204Fu\202\003+\204\003+\204Fu\202PaoQu\202Qu\202MouFu\202z\374\204LaiQu\202\003+\204Chi\003\014\204Fu\202Qu\202\003+\204Ma\202Me\202Mo\202HuiMo\202ZouNunFenz\362\205z\362\205Jin{\012\205|\015\204Tou\005\335\204Hua{\202\205\005\335\204ShuLi\202{\327\204ChiHeiHeiYi\202z\350\204DanXi\202TunMo\202Mo\202z\350\204DaiChuYou\3607\204Yi\202XiaYanQu\202MeiYan\003\006\204YueLi\202\010\220\204Du\202CanYanYanYanDanAn\202{Z\204DaiCanYi\202Mei{\221\204YanDu\202Lu\202ZhiFenFu\202Fu\202\003+\204\003+\204\007:\204"; -static const char b09f[715] = "\355Cu\202Qu\202\010I\204Wa\202ZhuZhi\006\205\204Ao\202BieTuoBi\202\007:\204\010I\204Tuo\003x\204Mi\202Nai\003x\204Zi\202Gu\202Gu\202\004\352\204FenTao\007:\204Pi\202z\355\205GaoQi\202\007:\204\005!\204\005\326\204ShuShuFenFeiWenBa\202\005,\204Tuo\362?\205Qu\202\371\260\205ShiYouShi\005P\204Wu\202Ju\202\0050\204HunJu\202YanTu\202Si\202Xi\202z\374\204YanLeiBi\202YaoQiuHanWu\202Wu\202HouXieE\000\201ZhaXiu\006Z\204Zha\010M\204\006\220\204Qi\202\005(\204Ji\202Zi\202Ji\202Ji\202Qi\202Ji\202Chi{x\204{x\204He\202Ya\202YinXieBaoZe\202Xie\005\020\204ChiYanJu\202\007\036\204\005\357\204\005\357\204Chu\301\357\204XieKenNieJiuYao\301\321\204YunYu\202ChuYi\202Ni\202Ze\202ZouQu\202YunYanOu\202E\000\201Wo\202Yi\202Ci\202Zou\3607\204ChuJinYa\202Chi{x\204He\202YinJu\202\005\357\204Bao\007\036\204Zi\202KenYu\202\301\321\204Qu\202Wo\202\003\031\204\003\247\204\003=\204\003\247\204Yan\003\031\204\003\031\204\003=\204KanDa\202\005\357\204Da\202\003\031\204\003=\204KanGuiQiuBieGuiYue\257\320\204He\202JueXieYu\202{\226\205Syu\007\316\204GanJanGon\005I\204Ji\202JikMou\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\204\204\000\000\200{_\204\000\000\200\000\000\200\000\000\200\006a\204Ce\202Wu\202Zi\202Hei{\207\205\006\025\204Ta\202MaiZau\000\000\200\000\000\200\000\000\200Ge\202Dan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ao\202|\015\204Ni\202"; -static const char b0a0[769] = "\377it\202ix\202i\000\201ip\202ietiexie\202iepat\202ax\202a\000\201ap\202uoxuo\202uopot\202ox\202o\000\201op\202ex\202e\000\201w\000\201bitbixbi\202bip\020/\204\021\017\204bie\022\000\204batbaxba\202bap\023H\204buo\023\375\204botboxbo\202bopbexbe\202bepbutbuxbu\202bup\022D\204burbytbyxby\202byp\022\203\204byrpitpixpi\202pip\0039\204pie\003B\204patpaxpa\202pap\003E\204puo\003V\204potpoxpo\202popputpuxpu\202pup\003Y\204purpytpyxpy\202pyp\003l\204pyrE\273\204\006\367\204bbi\011M\204\020.\205\021\016\205\020.\204\022K\205\011Q\204\011Y\204bba\011]\204\023G\205\023G\204\023\374\205\011a\204\011i\204bbo\011m\204\011q\204bbe\011u\204\011y\204\011\201\204bbu\011\205\204\024v\205\024v\204\011\211\204\011\224\204bby\011\230\204\0033\204\003L\204nbi\003S\204\021<\205\021<\204\021\377\205\004(\204\004<\204nba\004s\204\004y\204S\360\204nbo\004\230\204\004\305\204\004\346\204nbu\005V\204\022C\205\022C\204\005\244\204\005\256\204nby\005\344\204\022\202\205\022\202\204\004I\204\004\214\204hmi\004\222\204\015\365\205\015\365\204\016\002\205\006\315\204\011\234\204hma\011\240\204\016b\205\016b\204\016\241\205\011\244\204\011\254\204hmo\011\260\204\011\264\204\011\306\204hmu\011\312\204\017\042\205\017\042\204\006\264\204hmy\011\316\204\017I\205\017I\204mitmixmi\202mip\015\366\204mie\016\003\204matmaxma\202map\005\027\204\016c\204muo\016\242\204motmoxmo\202mopmexme\202mutmuxmu\202mup\017#\204murmytmyxmy\202mypfitfixfi\202fipfatfaxfa\202fapfoxfo\202fopfutfuxfu\202fup\011\322\204furfytfyxfy\202fypvitvixvi\202vip\011\326\204\011\336\204vie\011\342\204vatvaxva\202vapvotvoxvo\202vopvexvepvutvuxvu\202vup\011\346\204vurvytvyxvy\202vyp\011\352\204vyr"; -static const char b0a1[769] = "\377ditdixdi\202dip\022\356\204die\023\203\204datdaxda\202dap\023\237\204duodotdoxdo\202dopdexde\202depdutduxdu\202dup\023e\204durtittixti\202tip\002D\204tie\002\361\204tattaxta\202tap\003\036\204\003!\204tuo\0036\204tottoxto\202toptexte\202teptuttuxtu\202tup\003~\204tur\011\356\204\011\371\204ddi\011\375\204\023\011\205\023\011\204\023\202\205\012\001\204\012\014\204dda\012\020\204\023\236\205\023\236\204\023\272\205\012\024\204\012\035\204ddo\012!\204\012%\204dde\012)\204\012-\204\0128\204ddu\012<\204\0244\205\0244\204\006\273\204\006\305\204ndi\006\323\204\022\355\205\022\355\204\006\342\204\007\010\204nda\007,\204\0073\204\007=\204ndo\007D\204S\324\204nde\007Y\204\007j\204\007t\204ndu\007{\204\023d\205\023d\204\012@\204\012H\204hni\012L\204\017p\205\017\217\205\017p\204\017\373\205\012P\204\012X\204hna\012\134\204\020\033\205\020\033\204\012`\204\012h\204\012l\204\012p\204hne\012t\204L9\204nitnixni\202nip\017\220\204nie\017\374\204naxna\202nap\020\034\204nuo\007\205\204notnoxno\202nopnexne\202nepnutnuxnu\202nup\007\224\204nur\012x\204\012~\204hli\012\202\204\020\211\205\020\211\204\020\257\205\012\206\204\012\230\204hla\012\234\204\020\336\205\020\336\204\020\373\205\012\240\204hlo\012\244\204\012\250\204hle\012\254\204\012\260\204\012\271\204hlu\012\275\204\021_\205\021_\204\012\301\204\012\311\204hly\012\315\204\021\202\205\021\202\204litlixli\202lip\004`\204\020\212\204lie\020\260\204latlaxla\202lap\005v\204\020\337\204luo\020\374\204lotloxlo\202loplexle\202leplutluxlu\202lup\021`\204lurlytlyxly\202lyp\021\203\204lyrgitgixgi\202gip\004\242\204\005$\204gie\0053\204gatgaxga\202gap\005=\204\005L\204guo\010.\204gotgoxgo\202gopgetgexge\202gepgutguxgu\202gup\0106\204gurkitkixki\202kip\005\307\204kie\007\344\204kat"; -static const char b0a2[769] = "\377kaxka\202kap\007\353\204kuo\007\376\204kotkoxko\202kopketkexke\202kepkutkuxku\202kup\010\301\204kur\003{\204\005\353\204ggi\007\302\205\007\302\204\007\362\205\005\362\204\006\000\204gga\006\030\204\010\005\205\010\031\205\010\005\204\010-\205\006)\204\006C\204ggo\006J\204\006Q\204\006]\204gge\006d\204\006o\204\006\210\204ggu\006\223\204\0105\205\0105\204\021K\205\021K\204\0063\204\006\245\204mga\006\254\204\021n\205\021n\204\021\221\205\007`\204\007\237\204mgo\010\200\204\010\310\204mge\011\022\204\012\321\204\012\334\204mgu\012\340\204\021\264\205\021\264\204\012\344\204\012\354\204hxi\012\360\204\021\245\205\021\310\205\021\245\204\021\353\205\012\364\204\012\374\204hxa\013\000\204\022\023\205\0221\205\022\023\204\022\241\205\013\004\204\013\023\204hxo\013\027\204\013\033\204hxe\013\037\204\005#\205\005#\204\0052\205\002\356\204\003\010\204nga\003\016\204\005<\205\005K\205\005<\204\003\033\204\003'\204ngo\003?\204\003_\204nge\003i\204hit\000\020\204hiehathaxha\202hap\027\342\204\022r\204huo\022\316\204hothoxho\202hophexhe\202hepwatwaxwa\202wap\002\036\204wuo\003\232\204woxwo\202wopwexwe\202wepzitzixzi\202zip\024\037\204zie\024\277\204zatzaxza\202zap\025D\204zuo\013#\204zotzoxzo\202zopzexze\202zepzutzuxzu\202zup\026d\204zurzytzyxzy\202zyp\026\362\204zyrcitcixci\202cip\006s\204\013'\204cie\013+\204catcaxca\202cap\013/\204cuo\0133\204cotcoxco\202copcexce\202cepcutcuxcu\202cup\0137\204curcytcyxcy\202cyp\013;\204cyr\013?\204\013G\204zzi\013K\204|\036\205|#\205|\036\204|(\205\013O\204\013W\204zza\013[\204\013_\204zzo\013c\204\013g\204zze\013k\204\013o\204zzu\013s\204|-\205|-\204\013w\204\013\177\204zzy\013\203\204|2\205|2\204\007\270\204\007\312\204nzi\007\331\204\024\036\205\024\036\204\024\276\205\010A\204\010T\204nza\010_\204\025C\205\025C\204\010n\204\010y\204\010\237\204nze\010\253\204nzu"; -static const char b0a3[769] = "\377\010\266\204\026c\205\026c\204\010\370\204\011\003\204nzy\011\035\204\026\361\205\026\361\204sitsixsi\202sip\016\353\204sie\017\315\204satsaxsa\202sap\003\204\204suo\011\220\204sotsoxso\202sopsexse\202sepsutsuxsu\202sup\004\246\204sursytsyxsy\202syp\020T\204syr\000g\204\013\207\204ssi\013\213\204\016\352\205\016\352\204\017\314\205\013\217\204\013\227\204ssa\013\233\204\013\237\204\013\247\204sso\013\253\204\013\257\204sse\013\263\204\013\267\204\013\277\204ssu\013\303\204\013\307\204\013\317\204ssy\013\323\204\020S\205\020S\204\013\327\204\013\342\204zha\013\346\204|7\205|7\204|<\205\013\352\204\013\362\204zho\013\366\204\013\372\204\014\002\204zhe\014\006\204\014\012\204\014\022\204zhu\014\026\204|A\205|A\204\014\032\204\014\042\204zhy\014&\204|F\205|F\204\014*\204\0142\204cha\0146\204\027\341\205\030\264\205\027\341\204\031[\205\014:\204\014B\204choUD\204\014F\204\014N\204che\014R\204\014V\204chu\014Z\204\031\342\205\031\342\204\014^\204\014j\204chy\014n\204\0326\205\0326\204\003\240\204rra\005\223\205\005\223\204G\022\204\003\254\204rro\004g\204\004m\204\004\177\204rre\004\263\204\004\277\204\005\035\204rru\005C\204\005\370\205\005\370\204\005_\204\005e\204rry\005o\204\006!\205\006!\204\011\273\204\011\302\204nra\011\365\204\012\010\204nro\0124\204\012\215\204\012\224\204nre\012\330\204\013\013\204\014f\204nru\014r\204\030}\205\030}\204\014v\204\014\177\204nry\014\203\204\033\226\205\033\226\204\014\207\204\014\233\204shau\243\204\022q\205\022q\204\022\315\205\014\237\204\014\250\204sho_u\204\014\254\204\014\265\204she\014\271\204\004\311\204\014\275\204shu\014\301\204\023,\205\023,\204\014\305\204\014\316\204shy\014\322\204\012\264\205\012\264\204ratraxra\202rap\005\224\204ruo\005|\204rotroxro\202roprexre\202reprutruxru\202rup\005\371\204rurrytryxry\202ryp\006\042\204ryrjitjixji\202jip\017\023\204\017:\204jie\017a\204\004P\204\017\354\204juo\020z\204jotjoxjo\202jopjutjuxju\202jup\020\240\204jurjytjyxjy\202jyp\024c\204jyrqitqixqi\202qip"; -static const char b0a4[769] = "\377\000R\204\014\326\204qie\014\332\204\014\336\204\014\347\204quo\014\353\204qotqoxqo\202qopqutquxqu\202qup\014\357\204qurqytqyxqy\202qyp\014\363\204qyr\014\367\204\015\000\204jji\015\004\204\017\022\205\0179\205\017\022\204\017`\205\017\353\205\017\353\204\020y\205\015\010\204\015\021\204jjo\015\025\204\015\031\204\015\042\204jju\015&\204\020\237\205\020\237\204\015*\204\0153\204jjy\0157\204\014\217\204\014\227\204nji\015;\204\020\023\205\020\363\205\020\023\204\022)\205\0233\205\0233\204\015?\204\015I\204njo\015M\204\015Q\204nju\015U\204\023\350\205\023\350\204\015Y\204\015c\204njy\015g\204\024b\205\024b\204\015k\204\015u\204nyi\015y\204\033\335\205\034d\205\033\335\204\034\273\205\036\015\205\036\015\204\036\317\205\015}\204\015\201\204nyo\015\205\204\015\211\204\015\215\204nyu\015\221\204xitxixxi\202xip\021\246\204\021\311\204xie\021\354\204\0222\204xuoxotxoxxo\202xopxytxyxxy\202xyp\000p\204xyryityixyi\202yip\033\336\204\034e\204yie\034\274\204\002\010\204\036\016\204yuo\036\320\204yotyoxyo\202yopyutyuxyu\202yup\002\326\204yuryytyyxyy\202yyp\004V\204yyr\000\000\200\000\000\200\000\000\200QOTLI\202KIT\015\225\204CYPSSI\015\237\204GEPMI\202\015\251\204LYR\015\263\204MOPYO\202PUT\015\343\204TATGA\202ZUPCYT\015\355\204BUR\015\372\204\016\007\204TU\202OP\202\016\021\204ZOTPYTHMOYITVURSHYVEPZA\202JO\202\016\033\204JJYGOT\016\042\204WO\202DU\202\0167\204LIECY\202\016>\204CIP\016E\204\016S\204ZUR\016Z\204CHE|K\205\016g\204KE\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200bb\202b\000\201p\000\201dd\202d\000\201t\000\201gg\202g\000\201k\000\201rr\202zh\202ch\202zz\202z\000\201c\000\201m\000\201n\000\201l\000\201s\000\201r\000\201ss\202ng\202h\000\201h\000\201h'\202f\000\201w\000\201sh\202y\000\201e\000\201a\000\201ai\202ei\202ei\202i\000\201o\000\201u\000\201u\000\201e\000\201e\000\201l\000\201q\000\201\000\000\200x\000\201r\000\201t\000\201,\000\201.\000\201"; -static const char b0a5[769] = "\377e\000\201e\000\201he\202we\202we\202pe\202be\202be\202mbekpe\015\245\204gbefe\202ve\202te\202thede\202dhele\202re\202de\202ndese\202sheze\202zhecheje\202njeye\202ke\202\005\315\204ge\202me\202ne\202nyei\000\201i\000\201hi\202hi\202wi\202wi\202pi\202bi\202bi\202mbikpi\015\271\204gbifi\202vi\202ti\202thidi\202dhili\202ri\202di\202ndisi\202shizi\202zhichiji\202njiyi\202ki\202\003z\204gi\202mi\202ni\202nyia\000\201a\000\201ngaha\202ha\202wa\202wa\202pa\202ba\202ba\202mbakpakpa\015\326\204gbafa\202va\202ta\202thada\202dhala\202ra\202da\202ndasa\202shaza\202zhachaja\202njaya\202ka\202ka\202\005\264\204ga\202ma\202na\202nyao\000\201o\000\201ho\202wo\202wo\202po\202bo\202bo\202mbokpo\016.\204gbofo\202vo\202to\202thodo\202dholo\202ro\202do\202ndoso\202shozo\202zhochojo\202njoyo\202ko\202\005\330\204go\202mo\202no\202nyou\000\201u\000\201hu\202hu\202wu\202wu\202pu\202bu\202bu\202mbukpu\016u\204gbufu\202vu\202tu\202thudu\202dhulu\202ru\202du\202ndusu\202shuzu\202zhuchuju\202njuyu\202ku\202\005\277\204gu\202mu\202nu\202nyuo\000\201o\000\201ngoho\202ho\202wo\202wo\202po\202bo\202bo\202mbokpo\016.\204gbogbofo\202vo\202to\202thodo\202dholo\202ro\202do\202ndoso\202shozo\202zhochojo\202njoyo\202ko\202\005\330\204go\202mo\202no\202nyoe\000\201e\000\201ngehe\202he\202we\202we\202pe\202be\202be\202mbekpekpe\015\245\204gbegbefe\202ve\202te\202thede\202dhele\202re\202de\202ndese\202sheze\202zheche"; -static const char b0a6[745] = "\367je\202njeye\202ke\202\005\315\204\005\315\204ge\202ge\202me\202ne\202nyeng\202h\000\201,\000\201.\000\201?\000\201fa\202ka\202so\202\003\014\204\007\243\204\005P\204Nii\006l\204FaaTaa\010\220\204\004\352\204\016\203\204\3628\204Doo\016\207\2040\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201ma\202do\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Z\000\201z\000\201Dz\202dz\202Dz\202dz\202I\000\201i\000\201Dj\202dj\202U\000\201u\000\201O\000\201o\000\201'\000\201'\000\201Y\000\201y\000\201Ie\202ie\202Oi\202oi\202Ia\202ia\202E\000\201e\000\201O\000\201o\000\201Ie\202ie\202In\202in\202Ts\202ts\202Dg\202dg\202Lg\202lg\202Mg\202mg\202O\000\201o\000\201Oo\202oo\202Oo\202oo\202O\000\201.\000\2013v\2103v\2113v\212*\000\201ie\202i\000\201i\000\201u\000\201'\000\201y\000\201'\000\201o\000\201'\000\201'\000\201'\000\201'\000\201Dw\202dw\202DzwdzwZhwzhwCchcchDz\202dz\202T\000\201t\000\201Tw\202tw\202TswtswTs\202ts\202TchtchHw\202hw\202ShwshwOo\202oo\202O\000\201o\000\201'\000\201'\000\201f\000\201ie\202a\000\201ka\202u\000\201ku\202e\000\201re\202te\202o\000\201nyii\000\201la\202pa\202riirieleemeetaa\015\337\204\016+\204m\000\201suumu\202\001\204\204si\202\014\275\204suxkyeketnuenu\202\0163\204yo'shuyu'ya\202\016\177\204kuxpuxnjentepu\202wu\202pe\202fe\202ru\202lu\202mi\202ni\202ruxre\202ken\005\337\206\005\264\204ngashopuefu\202fomwa\202na\202li\202pi\202lo'ko\202\016\213\204renmenma\202ti\202ki\2021\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2010\000\201'\000\201`\000\201*\000\201.\000\201:\000\201,\000\201;\000\201?\000\201"; -static const char b0a7[769] = "\3771\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2015\000\2014\000\2013\000\2012\000\2011\000\2015\000\2014\000\2013\000\2012\000\2011\000\2015\000\2014\000\2013\000\2012\000\2011\000\2011\000\2012\000\2013\000\2014\000\201^\000\201v\000\201!\000\201^\000\201^\000\201-\000\201_\000\201'\000\201'\000\201`\000\201`\000\201H\000\201h\000\201Tz\202tz\2023\000\2013\000\2014\000\2014\000\2014,\2024,\202f\000\201s\000\201Aa\202aa\202Ao\202ao\202Au\202au\202Av\202av\202Av\202av\202Ay\202ay\202C.\202c.\202K.\202k.\202K.\202k.\202K.\202k.\202L\000\201l\000\201L.\202l.\202O.\202o.\202O\000\201o\000\201Oo\202oo\202P.\202p.\202P.\202p.\202P.\202p.\202Q.\202q.\202Q.\202q.\202R\000\201r\000\201R.\202r.\202V.\202v.\202Vy\202vy\202Z\000\201z\000\201Th.th.Th.th.V\000\201v\000\201&\000\201&\000\201S.\202s.\202'\000\201'\000\201'\000\201d.\202l.\202m.\202n.\202r.\202r.\202t.\202s.\202D\000\201d\000\201F\000\201f\000\201G\000\201Ng\202ng\202Ll\202ll\202R\000\201r\000\201S\000\201s\000\201T\000\201t\000\201^\000\201:\000\201=\000\201'\000\201'\000\201Y\000\201l\000\201-\000\201N\000\201n\000\201C\000\201c\000\201c\000\201h\000\201B\000\201b\000\201F\000\201f\000\201Ae\202ae\202Oe\202oe\202Ue\202ue\202G\000\201g\000\201K\000\201k\000\201N\000\201n\000\201R\000\201r\000\201S\000\201s\000\201H\000\201E\000\201G\000\201L\000\201I\000\201q\000\201K\000\201T\000\201J\000\201X\000\201B\000\201b\000\201O\000\201o\000\201U\000\201u\000\201A\000\201a\000\201I\000\201i\000\201U\000\201u\000\201O\000\201o\000\201W\000\201w\000\201C\000\201S\000\201Z\000\201D\000\201d\000\201S\000\201s\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200G\000\201g\000\201\000\000\200\004+\204\000\000\200ww\202S\000\201s\000\201S\000\201s\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200C\000\201F\000\201Q\000\201H\000\201h\000\201I\000\201H\000\201oe\202w\000\201F\000\201P\000\201M\000\201I\000\201M'\202"; -static const char b0a8[769] = "\377a\000\201i\000\201i\000\201u\000\201e\000\201o\000\201\000\000\200k\000\201kh\202g\000\201gh\202ng\202c\000\201ch\202j\000\201jh\202t\000\201th\202d\000\201dh\202t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201r\000\201l\000\201r\000\201s\000\201h\000\201a\000\201i\000\201u\000\201e\000\201o\000\2011\000\2012\000\2013\000\2014\000\201\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2011\000\2012\000\2013\000\201/\000\201-\000\201Rs\202'\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200k\000\201kh\202g\000\201ng\202c\000\201ch\202j\000\201ny\202t\000\201th\202d\000\201n\000\201p\000\201ph\202b\000\201m\000\201ts\202tshdz\202w\000\201zh\202z\000\201-\000\201y\000\201r\000\201l\000\201sh\202s\000\201h\000\201'\000\201i\000\201u\000\201e\000\201o\000\201q\000\201x\000\201f\000\201gg\202ee\202w\000\201y\000\201tt\202tthdd\202nn\202y''sh'h'\202f''r\000\201r\000\201^\000\201@\000\201@@\202/\000\201//\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200m\000\201h\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201e\000\201ai\202o\000\201o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201e\000\201ai\202o\000\201o\000\201au\202\000\000\200m\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200,\000\201.\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201a\000\201u\000\201k\000\201n\000\201p\000\201r\000\201v\000\201'\000\201m\000\201m\000\201mm\202m2\202m3\202m'\202-\000\201-\000\201^\000\201~\000\201*\000\201Om\202a\000\201a\000\201"; -static const char b0a9[766] = "\3760\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201k\000\201hk\202g\000\201ng\202s\000\201hs\202z\000\201ny\202t\000\201ht\202n\000\201p\000\201hp\202m\000\201d\000\201b\000\201r\000\201y\000\201l\000\201w\000\201th\202h\000\201v\000\201j\000\201a\000\201oe\202i\000\201o\000\201ue\202ae\202u\000\201e\000\201aw\202\000\000\200\000\000\200\000\000\200'\000\201,\000\201k\000\201g\000\201ng\202t\000\201d\000\201n\000\201p\000\201b\000\201m\000\201c\000\201j\000\201ny\202s\000\201r\000\201l\000\201y\000\201w\000\201h\000\201mb\202nggnd\202nyj'\000\201i\000\201u\000\201e\000\201ai\202o\000\201au\202eu\202ea\202ng\202n\000\201r\000\201h\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\201dm\202db\202ds\202dj\202lg\202lkkld\202lttlm\202lb\202lpplv\202ls\202lj\202lk\202mg\202md\202ms\202bstbk\202bh\202ssbl\000\201h\000\201jjhtt\202ph\202hs\202qq\202\000\000\200\000\000\200\000\000\200m\000\201ng\202r\000\201h\000\201a\000\201i\000\201i\000\201i\000\201u\000\201re\202le\202lo\202e\000\201ai\202o\000\201k\000\201q\000\201kh\202g\000\201gh\202ng\202c\000\201ch\202j\000\201jnyjh\202ny\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201r\000\201l\000\201w\000\201s\000\201s\000\201s\000\201h\000\201'\000\201a\000\201o\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202e\000\201re\202y\000\201r\000\201\000\000\200<\000\201>\000\201@\000\201@@\202@@@*\000\201:\000\201,\000\201.\000\201|\000\201||\202{\000\201}\000\201\000\000\200-\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200^\000\201~\000\201gh\202ch\202jh\202n\000\201bh\202\000\000\200-\000\201n\000\201f\000\201g\000\201gh\202j\000\201jh\202d\000\201dh\202n\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201l\000\201d\000\201dh\202b\000\201bh\202"; -static const char b0aa[739] = "\365a\000\201i\000\201u\000\201e\000\201ai\202o\000\201k\000\201kh\202g\000\201gh\202ng\202ng\202c\000\201ch\202j\000\201jh\202ny\202ny\202nj\202t\000\201th\202d\000\201dh\202n\000\201n\000\201nd\202p\000\201pp\202ph\202b\000\201bh\202m\000\201m\000\201mb\202y\000\201r\000\201l\000\201w\000\201x\000\201s\000\201h\000\201a\000\201i\000\201i\000\201ei\202u\000\201e\000\201o\000\201ai\202au\202u\000\201y\000\201r\000\201l\000\201w\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200k\000\201g\000\201ng\202ng\202c\000\201t\000\201n\000\201p\000\201y\000\201r\000\201l\000\201x\000\201m\000\201h\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200*\000\201,\000\201;\000\201.\000\201g\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202dh\202n\000\201s\000\201h\000\201l\000\201f\000\201-\000\201x\000\201z\000\201r\000\201oay'n\202hm\202!\000\2011\000\2012\000\201r\000\201\000\000\200\000\000\200\000\000\200ch\202sh\202k\000\201k\000\201kh\202kh\202x\000\201x\000\201g\000\201g\000\201ng\202ng\202ch\202ch\202chhchhs\000\201s\000\201ny\202ny\202d\000\201d\000\201t\000\201t\000\201th\202th\202n\000\201n\000\201b\000\201b\000\201p\000\201p\000\201ph\202ph\202f\000\201f\000\201m\000\201m\000\201y\000\201y\000\201r\000\201r\000\201l\000\201l\000\201v\000\201v\000\201h\000\201h\000\201\000\000\200\000\000\200a\000\201aa\202i\000\201ue\202u\000\201ae\202o\000\201oa\202ia\202ueaua\202aueai\202an\202am\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kon|T\205-\000\201<\000\201>\000\201e\000\201o\000\201ch\202n\000\201t\000\201th\202d\000\201dh\202n\000\201s\000\201s\000\201i\000\201u\000\201ai\202au\202au\202,\000\201?\000\201*\000\201-\000\201-\000\201h\000\201"; -static const char b0ab[751] = "\371\000\000\200thuthitha\001\235\204th\202tho\000\000\200\000\000\200dhudhidha\015\233\204dh\202dho\000\000\200\000\000\200dzudzidza\015\257\204dz\202dzo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\002\204\000(\204\026)\204\001\001\204\026)\205ch'\027\000\204\000\000\200be\202bu\202bi\202ba\202bieb\000\201bo\202\000\000\200a\000\201ae\202e\000\201e\000\201e\000\201f\000\201g\000\201l\000\201l\000\201l\000\201m\000\201n\000\201ng\202o\000\201o\000\201o\000\201oe\202oe\202oe\202oo\202oo\202r\000\201r\000\201r\000\201rr\202r\000\201rr\202r\000\201r\000\201sh\202u\000\201u\000\201ui\202ui\202u\000\201x\000\201x\000\201x\000\201x\000\201x\000\201x\000\201x\000\201y\000\201*\000\201h\000\201l\000\201l\000\201u\000\201ia\202ie\202oe\202uo\202a\000\201o\000\201dz\202ts\202r\000\201w\000\201<\000\201>\000\201\000\000\200\000\000\200\000\000\200\000\000\200a\000\201e\000\201i\000\201o\000\201u\000\201v\000\201ga\202ka\202ge\202gi\202go\202gu\202gv\202ha\202he\202hi\202ho\202hu\202hv\202la\202le\202li\202lo\202lu\202lv\202ma\202me\202mi\202mo\202mu\202na\202hnanahne\202ni\202no\202nu\202nv\202quaquequiquoquuquvsa\202s\000\201se\202si\202so\202su\202sv\202da\202ta\202de\202te\202di\202ti\202do\202du\202dv\202dlatlatletlitlotlutlvtsatsetsitsotsutsvwa\202we\202wi\202wo\202wu\202wv\202ya\202k\000\201s\000\201l\000\201m\000\201p\000\201n\000\201c\000\201t\000\201kh\202n\000\201th\202w\000\201y\000\201h\000\201u\000\201i\000\201ph\202a\000\201g\000\201jh\202r\000\201b\000\201j\000\201d\000\201gh\202dh\202bh\202k\000\201l\000\201m\000\201p\000\201n\000\201t\000\201n\000\201i\000\201o\000\201i\000\201a\000\201e\000\201ou\202u\000\201ei\202m\000\201.\000\201\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b0ac[769] = "\377Ga\202Gag\016\222\204\016\231\204Gan\016\246\204\016\254\204GadGal\016\267\204\016\273\204\016\304\204\016\313\204\016\323\204\016\327\204\016\333\204GamGab\016\341\204Gas\016\350\204\006\025\204Gaj\016\357\204GakGatGapGahGae|^\204|Y\205|^\205|c\204|c\205|h\205\016\365\204|m\204|m\205|r\205|w\205||\205|\201\205|\206\205|\213\205\017\010\204|\220\204|\220\205|\225\204|\225\205|\232\205\017\017\204|\237\205|Y\204\017\027\204\017\033\204\017\037\204Gya|\251\204|\244\205|\251\205|\256\204|\256\205|\263\205\017'\204|\270\204|\270\205|\275\205|\302\205|\307\205|\314\205|\321\205|\326\205\017.\204|\333\204|\333\205|\340\204|\340\205|\345\205\0176\204|\352\205|\244\204\017>\204\017B\204\017F\204|\357\204\305v\205\305p\206\305v\206\305|\205\305|\206\305\202\206|\357\205\305\210\205\305\210\206\305\216\206\305\224\206\305\232\206\305\240\206\305\246\206\305\254\206|\364\205\305\262\205\305\262\206\305\270\205\305\270\206\305\276\206|\371\205\305\304\206\305p\205|\376\205}\003\205}\010\205Geo}\022\204}\015\205}\022\205}\027\204}\027\205}\034\205\017N\204}!\204}!\205}&\205}+\205}0\205}5\205}:\205}?\205\017V\204}D\204}D\205}I\204}I\205}N\205\017]\204}S\205}\015\204\017e\204\017i\204\017m\204Ge\202Geg\017u\204\017\177\204Gen\017\206\204\017\214\204GedGel\017\224\204\017\230\204\017\237\204\017\253\204\017\265\204\017\271\204\017\275\204GemGeb\017\303\204Ges\017\312\204\007\277\204Gej\017\321\204GekGetGepGeh}X\204\305\320\205\305\312\206\305\320\206\305\326\205\305\326\206\305\334\206}X\205\305\342\205\305\342\206\305\350\206\305\356\206\305\364\206\305\372\206\306\000\206\306\006\206}]\205\306\014\205\306\014\206\306\022\205\306\022\206\306\030\206}b\205\306\036\206\305\312\205}g\205}l\205}q\205Gye}{\204}v\205}{\205}\200\204}\200\205}\205\205\017\327\204}\212\204}\212\205}\217\205}\224\205}\231\205}\236\205}\243\205}\250\205\017\341\204}\255\204}\255\205}\262\204}\262\205}\267\205\017\350\204}\274\205}v\204\017\360\204\017\364\204\017\370\204Go\202Gog\020\000\204\020\012\204Gon\020\021\204\020\030\204GodGol\020 \204\020$\204\020+\204\0203\204\020:\204\020>\204\020B\204GomGob\020H\204Gos\020Q\204\003=\204Goj\020X\204GokGotGopGohGwa}\306\204}\301\205}\306\205"; -static const char b0ad[769] = "\377{\334\204}\313\205}\320\205\020a\204}\325\204}\325\205}\332\205}\337\205}\344\205}\351\205}\356\205}\363\205\020k\204}\370\204}\370\205}\375\204}\375\205{\334\205\020v\204~\002\205}\301\204\020~\204\020\202\204\020\206\204~\007\204\306*\205\306$\206\306*\206\3060\205\3060\206\3066\206~\007\205\306<\205\306<\206\306B\206\306H\206\306N\206\306T\206\306Z\206\306`\206~\014\205\306f\205\306f\206\306l\205\306l\206\306r\206~\021\205\306x\206\306$\205~\026\205~\033\205~ \205Goe~*\204~%\205~*\205{\322\204~/\205~4\205\020\216\204~9\204~9\205~>\205~C\205~H\205~M\205~R\205~W\205\020\225\204~\134\204~\134\205~a\204~a\205{\322\205\020\234\204~f\205~%\204\020\244\204\020\250\204\020\254\204Gyo~p\204~k\205~p\205~u\204~u\205~z\205\020\264\204~\177\204~\177\205~\204\205~\211\205~\216\205~\223\205~\230\205~\235\205\020\273\204~\242\204~\242\205~\247\204~\247\205~\254\205\020\302\204~\261\205~k\204\020\323\204\020\327\204\020\333\204Gu\202Gug\020\343\204\020\352\204Gun\020\361\204\020\370\204GudGul\021\000\204\021\004\204\021\013\204\021\023\204\021\032\204\021\036\204\021\042\204GumGub\021(\204Gus\021/\204\003\226\204Guj\0217\204GukGutGupGuhGwo~\273\204~\266\205~\273\205{\257\204~\300\205~\305\205\021A\204~\312\204~\312\205~\317\205~\324\205~\331\205~\336\205~\343\205~\350\205\021H\204~\355\204~\355\205~\362\204~\362\205{\257\205\021P\204~\367\205~\266\204\021T\204\021X\204\021\134\204Gwe\177\001\204~\374\205\177\001\205\177\006\204\177\006\205\177\013\205\021d\204\177\020\204\177\020\205\177\025\205\177\032\205\177\037\205\177$\205\177)\205\177.\205\021k\204\1773\204\1773\205\1778\204\1778\205\177=\205\021s\204\177B\205~\374\204\021w\204\021{\204\021\177\204Gwi\177L\204\177G\205\177L\205{\310\204\177Q\205\177V\205\021\207\204\177[\204\177[\205\177`\205\177e\205\177j\205\177o\205\177t\205\177y\205\021\216\204\177~\204\177~\205\177\203\204\177\203\205{\310\205\021\226\204\177\210\205\177G\204\021\232\204\021\236\204\021\242\204Gyu\177\222\204\177\215\205\177\222\205\177\227\204\177\227\205\177\234\205\021\252\204\177\241\204\177\241\205\177\246\205\177\253\205\177\260\205\177\265\205\177\272\205\177\277\205\021\261\204\177\304\204\177\304\205\177\311\204\177\311\205\177\316\205\021\271\204\177\323\205\177\215\204\021\275\204\021\301\204\021\305\204Geu\177\335\204\177\330\205\177\335\205\177\342\204\177\342\205\177\347\205\021\315\204"; -static const char b0ae[769] = "\377\177\354\204\177\354\205\177\361\205\177\366\205\177\373\205\200\000\205\200\005\205\200\012\205\021\324\204\200\017\204\200\017\205\200\024\204\200\024\205\200\031\205\021\334\204\200\036\205\177\330\204\021\340\204\021\344\204\021\350\204Gui\200(\204\200#\205\200(\205\200-\204\200-\205\2002\205\021\360\204\2007\204\2007\205\200<\205\200A\205\200F\205\200K\205\200P\205\200U\205\021\367\204\200Z\204\200Z\205\200_\204\200_\205\200d\205\022\004\204\200i\205\200#\204\022\010\204\022\014\204\022\020\204Gi\202Gig\022\030\204\022\037\204Gin\022'\204\022.\204GidGil\0226\204\022:\204\022H\204\022P\204\022X\204\022\134\204\022`\204GimGib\022f\204Gis\022n\204\006\311\204Gij\022v\204GikGitGipGihKka\200s\204\200n\205\200s\205\200x\204\200x\205\200}\205\022|\204\200\202\204\200\202\205\200\207\205\200\214\205\200\221\205\200\226\205\200\233\205\200\240\205\022\207\204\200\245\204\200\245\205\200\252\204\200\252\205\200\257\205\022\222\204\200\264\205\200n\204\022\226\204\022\232\204\022\236\204\200\271\204\306\204\205\306~\206\306\204\206\306\212\205\306\212\206\306\220\206\200\271\205\306\226\205\306\226\206\306\234\206\306\242\206\306\250\206\306\256\206\306\264\206\306\272\206\200\276\205\306\300\205\306\300\206\306\306\205\306\306\206\306\314\206\200\303\205\306\322\206\306~\205\200\310\205\200\315\205\200\322\205\200\327\204\306\336\205\306\330\206\306\336\206\306\344\205\306\344\206\306\352\206\200\327\205\306\360\205\306\360\206\306\366\206\306\374\206\307\002\206\307\010\206\307\016\206\307\024\206\200\334\205\307\032\205\307\032\206\307 \205\307 \206\307&\206\200\341\205\307,\206\306\330\205\200\346\205\200\353\205\200\360\205\3072\205\362T\206\362M\207\362T\207\362[\206\362[\207\362b\207\3072\206\362i\206\362i\207\362p\207\362w\207\362~\207\362\205\207\362\214\207\362\223\207\3078\206\362\232\206\362\232\207\362\241\206\362\241\207\362\250\207\307>\206\362\257\207\362M\206\307D\206\307J\206\307P\206\200\365\204\307\134\205\307V\206\307\134\206\307b\205\307b\206\307h\206\200\365\205\307n\205\307n\206\307t\206\307z\206\307\200\206\307\206\206\307\214\206\307\222\206\200\372\205\307\230\205\307\230\206\307\236\205\307\236\206\307\244\206\200\377\205\307\252\206\307V\205\201\004\205\201\011\205\201\016\205Kke\201\030\204\201\023\205\201\030\205\201\035\204\201\035\205\201\042\205\022\246\204\201'\204\201'\205\201,\205\2011\205\2016\205\201;\205\201@\205\201E\205\022\255\204\201J\204\201J\205\201O\204\201O\205\201T\205\022\261\204\201Y\205\201\023\204\022\265\204\022\271\204\022\275\204\307\260\205\362\275\206\362\266\207\362\275\207\362\304\206\362\304\207\362\313\207\307\260\206\362\322\206\362\322\207\362\331\207\362\340\207"; -static const char b0af[769] = "\377\362\347\207\362\356\207\362\365\207\362\374\207\307\266\206\363\003\206\363\003\207\363\012\206\363\012\207\363\021\207\307\274\206\363\030\207\362\266\206\307\302\206\307\310\206\307\316\206\201^\204\307\332\205\307\324\206\307\332\206\307\340\205\307\340\206\307\346\206\201^\205\307\354\205\307\354\206\307\362\206\307\370\206\307\376\206\310\004\206\310\012\206\310\020\206\201c\205\310\026\205\310\026\206\310\034\205\310\034\206\310\042\206\201h\205\310(\206\307\324\205\201m\205\201r\205\201w\205Kko\201\201\204\201|\205\201\201\205\201\206\204\201\206\205\201\213\205\022\307\204\201\220\204\201\220\205\201\225\205\201\232\205\201\237\205\201\244\205\201\251\205\201\256\205\022\322\204\201\263\204\201\263\205\201\270\204\201\270\205\201\275\205\022\326\204\201\302\205\201|\204\022\332\204\022\336\204\022\342\204\201\307\204\3104\205\310.\206\3104\206\310:\205\310:\206\310@\206\201\307\205\310F\205\310F\206\310L\206\310R\206\310X\206\310^\206\310d\206\310j\206\201\314\205\310p\205\310p\206\310v\205\310v\206\310|\206\201\321\205\310\202\206\310.\205\201\326\205\201\333\205\201\340\205\310\210\205\363&\206\363\037\207\363&\207\363-\206\363-\207\3634\207\310\210\206\363;\206\363;\207\363B\207\363I\207\363P\207\363W\207\363^\207\363e\207\310\216\206\363l\206\363l\207\363s\206\363s\207\363z\207\310\224\206\363\201\207\363\037\206\310\232\206\310\240\206\310\246\206\201\345\204\310\262\205\310\254\206\310\262\206\310\270\205\310\270\206\310\276\206\201\345\205\310\304\205\310\304\206\310\312\206\310\320\206\310\326\206\310\334\206\310\342\206\310\350\206\201\352\205\310\356\205\310\356\206\310\364\205\310\364\206\310\372\206\201\357\205\311\000\206\310\254\205\201\364\205\201\371\205\201\376\205\202\003\204\311\014\205\311\006\206\311\014\206\311\022\205\311\022\206\311\030\206\202\003\205\311\036\205\311\036\206\311$\206\311*\206\3110\206\3116\206\311<\206\311B\206\202\010\205\311H\205\311H\206\311N\205\311N\206\311T\206\202\015\205\311Z\206\311\006\205\202\022\205\202\027\205\202\034\205Kku\202&\204\202!\205\202&\205\202+\204\202+\205\2020\205\022\346\204\2025\204\2025\205\202:\205\202?\205\202D\205\202I\205\202N\205\202S\205\022\362\204\202X\204\202X\205\202]\204\202]\205\202b\205\022\366\204\202g\205\202!\204\022\372\204\022\376\204\023\002\204\202l\204\311f\205\311`\206\311f\206\311l\205\311l\206\311r\206\202l\205\311x\205\311x\206\311~\206\311\204\206\311\212\206\311\220\206\311\226\206\311\234\206\202q\205\311\242\205\311\242\206\311\250\205\311\250\206\311\256\206\202v\205\311\264\206\311`\205\202{\205\202\200\205\202\205\205\202\212\204\311\300\205\311\272\206\311\300\206\311\306\205\311\306\206\311\314\206\202\212\205\311\322\205\311\322\206\311\330\206\311\336\206\311\344\206\311\352\206\311\360\206\311\366\206"; -static const char b0b0[769] = "\377\202\217\205\311\374\205\311\374\206\312\002\205\312\002\206\312\010\206\202\224\205\312\016\206\311\272\205\202\231\205\202\236\205\202\243\205\202\250\204\312\032\205\312\024\206\312\032\206\312 \205\312 \206\312&\206\202\250\205\312,\205\312,\206\3122\206\3128\206\312>\206\312D\206\312J\206\312P\206\202\255\205\312V\205\312V\206\312\134\205\312\134\206\312b\206\202\262\205\312h\206\312\024\205\202\267\205\202\274\205\202\301\205\202\306\204\312t\205\312n\206\312t\206\312z\205\312z\206\312\200\206\202\306\205\312\206\205\312\206\206\312\214\206\312\222\206\312\230\206\312\236\206\312\244\206\312\252\206\202\313\205\312\260\205\312\260\206\312\266\205\312\266\206\312\274\206\202\320\205\312\302\206\312n\205\202\325\205\202\332\205\202\337\205\202\344\204\312\316\205\312\310\206\312\316\206\312\324\205\312\324\206\312\332\206\202\344\205\312\340\205\312\340\206\312\346\206\312\354\206\312\362\206\312\370\206\312\376\206\313\004\206\202\351\205\313\012\205\313\012\206\313\020\205\313\020\206\313\026\206\202\356\205\313\034\206\312\310\205\202\363\205\202\370\205\202\375\205\203\002\204\313(\205\313\042\206\313(\206\313.\205\313.\206\3134\206\203\002\205\313:\205\313:\206\313@\206\313F\206\313L\206\313R\206\313X\206\313^\206\203\007\205\313d\205\313d\206\313j\205\313j\206\313p\206\203\014\205\313v\206\313\042\205\203\021\205\203\026\205\203\033\205Kki\203%\204\203 \205\203%\205\203*\204\203*\205\203/\205\023\006\204\2034\204\2034\205\2039\205\203>\205\203C\205\203H\205\203M\205\203R\205\023\016\204\203W\204\203W\205\203\134\204\203\134\205\203a\205\023\022\204\203f\205\203 \204\023\026\204\023\032\204\023\036\204Na\202Nag\023\042\204\023)\204Nan\0231\204\0238\204NadNal\023<\204\023@\204\023D\204\023L\204\023W\204\023[\204\023_\204NamNab\023i\204Nas\023q\204\006\220\204Naj\023y\204NakNatNapNahNae\203p\204\203k\205\203p\205\203u\204\203u\205\203z\205\023\177\204\203\177\204\203\177\205\203\204\205\203\211\205\203\216\205\203\223\205\203\230\205\203\235\205\023\207\204\203\242\204\203\242\205\203\247\204\203\247\205\203\254\205\023\213\204\203\261\205\203k\204\023\217\204\023\223\204\023\227\204Nya\203\273\204\203\266\205\203\273\205\203\300\204\203\300\205\203\305\205\023\233\204\203\312\204\203\312\205\203\317\205\203\324\205\203\331\205\203\336\205\203\343\205\203\350\205\023\243\204\203\355\204\203\355\205\203\362\204\203\362\205\203\367\205\023\247\204\203\374\205\203\266\204\023\253\204\023\257\204\023\263\204\204\001\204\313\202\205\313|\206\313\202\206\313\210\205\313\210\206\313\216\206\204\001\205\313\224\205\313\224\206\313\232\206\313\240\206\313\246\206\313\254\206\313\262\206\313\270\206\204\006\205\313\276\205\313\276\206\313\304\205"; -static const char b0b1[769] = "\377\313\304\206\313\312\206\204\013\205\313\320\206\313|\205\204\020\205\204\025\205\204\032\205Neo\204$\204\204\037\205\204$\205\204)\204\204)\205\204.\205\023\267\204\2043\204\2043\205\2048\205\204=\205\204B\205\204G\205\204L\205\204Q\205\023\277\204\204V\204\204V\205\204[\204\204[\205\204`\205\023\303\204\204e\205\204\037\204\023\307\204\023\313\204\023\317\204Ne\202Neg\023\323\204\023\336\204Nen\023\346\204\023\355\204NedNel\023\361\204\023\365\204\023\371\204\024\001\204\024\011\204\024\015\204\024\021\204NemNeb\024\027\204Nes\024#\204\010\026\204Nej\024+\204NekNetNepNeh\204j\204\313\334\205\313\326\206\313\334\206\313\342\205\313\342\206\313\350\206\204j\205\313\356\205\313\356\206\313\364\206\313\372\206\314\000\206\314\006\206\314\014\206\314\022\206\204o\205\314\030\205\314\030\206\314\036\205\314\036\206\314$\206\204t\205\314*\206\313\326\205\204y\205\204~\205\204\203\205Nye\204\215\204\204\210\205\204\215\205\204\222\204\204\222\205\204\227\205\0241\204\204\234\204\204\234\205\204\241\205\204\246\205\204\253\205\204\260\205\204\265\205\204\272\205\0249\204\204\277\204\204\277\205\204\304\204\204\304\205\204\311\205\024=\204\204\316\205\204\210\204\024A\204\024E\204\024I\204No\202Nog\024M\204\024U\204Non\024`\204\024g\204NodNol\024k\204\024o\204\024s\204\024{\204\024\233\204\024\237\204\024\243\204NomNob\024\251\204Nos\024\255\204\010M\204Noj\024\261\204NokNotNopNohNwa\204\330\204\204\323\205\204\330\205\204\335\204\204\335\205\204\342\205\024\267\204\204\347\204\204\347\205\204\354\205\204\361\205\204\366\205\204\373\205\205\000\205\205\005\205\024\303\204\205\012\204\205\012\205\205\017\204\205\017\205\205\024\205\024\307\204\205\031\205\204\323\204\024\313\204\024\317\204\024\323\204\205\036\204\3146\205\3140\206\3146\206\314<\205\314<\206\314B\206\205\036\205\314H\205\314H\206\314N\206\314T\206\314Z\206\314`\206\314f\206\314l\206\205#\205\314r\205\314r\206\314x\205\314x\206\314~\206\205(\205\314\204\206\3140\205\205-\205\2052\205\2057\205Noe\205A\204\205<\205\205A\205\205F\204\205F\205\205K\205\024\327\204\205P\204\205P\205\205U\205\205Z\205\205_\205\205d\205\205i\205\205n\205\024\337\204\205s\204\205s\205\205x\204\205x\205\205}\205\024\343\204\205\202\205\205<\204\024\347\204\024\353\204\024\357\204Nyo\205\214\204\205\207\205\205\214\205\205\221\204\205\221\205\205\226\205\024\363\204\205\233\204\205\233\205\205\240\205\205\245\205\205\252\205\205\257\205\205\264\205\205\271\205\024\373\204\205\276\204\205\276\205\205\303\204\205\303\205\205\310\205\024\377\204\205\315\205"; -static const char b0b2[769] = "\377\205\207\204\025\003\204\025\007\204\025\013\204Nu\202Nug\025\017\204\025\027\204Nun\025\033\204\025\042\204NudNul\025&\204\025*\204\025.\204\0252\204\0256\204\025:\204\025>\204NumNub\025H\204Nus\025L\204\011\013\204Nuj\025P\204NukNutNupNuhNwo\205\327\204\205\322\205\205\327\205\205\334\204\205\334\205\205\341\205\025V\204\205\346\204\205\346\205\205\353\205\205\360\205\205\365\205\205\372\205\205\377\205\206\004\205\025^\204\206\011\204\206\011\205\206\016\204\206\016\205\206\023\205\025b\204\206\030\205\205\322\204\025f\204\025j\204\025n\204Nwe\206\042\204\206\035\205\206\042\205\206'\204\206'\205\206,\205\025r\204\2061\204\2061\205\2066\205\206;\205\206@\205\206E\205\206J\205\206O\205\025v\204\206T\204\206T\205\206Y\204\206Y\205\206^\205\025z\204\206c\205\206\035\204\025~\204\025\202\204\025\206\204Nwi\206m\204\206h\205\206m\205\206r\204\206r\205\206w\205\025\212\204\206|\204\206|\205\206\201\205\206\206\205\206\213\205\206\220\205\206\225\205\206\232\205\025\216\204\206\237\204\206\237\205\206\244\204\206\244\205\206\251\205\025\222\204\206\256\205\206h\204\025\226\204\025\232\204\025\236\204Nyu\206\270\204\206\263\205\206\270\205\206\275\204\206\275\205\206\302\205\025\242\204\206\307\204\206\307\205\206\314\205\206\321\205\206\326\205\206\333\205\206\340\205\206\345\205\025\246\204\206\352\204\206\352\205\206\357\204\206\357\205\206\364\205\025\252\204\206\371\205\206\263\204\025\256\204\025\262\204\025\266\204Neu\207\003\204\206\376\205\207\003\205\207\010\204\207\010\205\207\015\205\025\272\204\207\022\204\207\022\205\207\027\205\207\034\205\207!\205\207&\205\207+\205\2070\205\025\276\204\2075\204\2075\205\207:\204\207:\205\207?\205\025\302\204\207D\205\206\376\204\025\306\204\025\312\204\025\316\204Nui\207N\204\207I\205\207N\205\207S\204\207S\205\207X\205\025\322\204\207]\204\207]\205\207b\205\207g\205\207l\205\207q\205\207v\205\207{\205\025\326\204\207\200\204\207\200\205\207\205\204\207\205\205\207\212\205\025\332\204\207\217\205\207I\204\025\336\204\025\342\204\025\346\204Ni\202Nig\025\352\204\025\362\204Nin\025\366\204\025\375\204NidNil\026\001\204\026\005\204\026\011\204\026\015\204\026\021\204\026\025\204\026\031\204NimNib\026\037\204Nis\026#\204\006\373\204Nij\026'\204NikNitNipNihDa\202Dag\026.\204\0266\204Dan\026:\204\026B\204DadDal\026F\204\026J\204\026N\204\026R\204\026V\204\026Z\204\026^\204DamDab\026h\204Das\026l\204\010\220\204Daj\026p\204DakDatDapDah"; -static const char b0b3[769] = "\377Dae\207\231\204\207\224\205\207\231\205\207\236\204\207\236\205\207\243\205\026w\204\207\250\204\207\250\205\207\255\205\207\262\205\207\267\205\207\274\205\207\301\205\207\306\205\026{\204\207\313\204\207\313\205\207\320\204\207\320\205\207\325\205\026\177\204\207\332\205\207\224\204\026\203\204\026\207\204\026\213\204Dya\207\344\204\207\337\205\207\344\205\207\351\204\207\351\205\207\356\205\026\217\204\207\363\204\207\363\205\207\370\205\207\375\205\210\002\205\210\007\205\210\014\205\210\021\205\026\223\204\210\026\204\210\026\205\210\033\204\210\033\205\210 \205\026\227\204\210%\205\207\337\204\026\233\204\026\237\204\026\243\204\210*\204\314\220\205\314\212\206\314\220\206\314\226\205\314\226\206\314\234\206\210*\205\314\242\205\314\242\206\314\250\206\314\256\206\314\264\206\314\272\206\314\300\206\314\306\206\210/\205\314\314\205\314\314\206\314\322\205\314\322\206\314\330\206\2104\205\314\336\206\314\212\205\2109\205\210>\205\210C\205Deo\210M\204\210H\205\210M\205\210R\204\210R\205\210W\205\026\247\204\210\134\204\210\134\205\210a\205\210f\205\210k\205\210p\205\210u\205\210z\205\026\253\204\210\177\204\210\177\205\210\204\204\210\204\205\210\211\205\026\257\204\210\216\205\210H\204\026\263\204\026\267\204\026\273\204De\202Deg\026\277\204\026\307\204Den\026\313\204\026\317\204DedDel\026\323\204\026\327\204\026\333\204\026\337\204\026\343\204\026\347\204\026\353\204DemDeb\026\366\204Des\026\372\204\005\262\204Dej\026\376\204DekDetDepDeh\210\223\204\314\352\205\314\344\206\314\352\206\314\360\205\314\360\206\314\366\206\210\223\205\314\374\205\314\374\206\315\002\206\315\010\206\315\016\206\315\024\206\315\032\206\315 \206\210\230\205\315&\205\315&\206\315,\205\315,\206\3152\206\210\235\205\3158\206\314\344\205\210\242\205\210\247\205\210\254\205Dye\210\266\204\210\261\205\210\266\205\210\273\204\210\273\205\210\300\205\027\005\204\210\305\204\210\305\205\210\312\205\210\317\205\210\324\205\210\331\205\210\336\205\210\343\205\027\011\204\210\350\204\210\350\205\210\355\204\210\355\205\210\362\205\027\015\204\210\367\205\210\261\204\027\021\204\027\025\204\027\031\204Do\202Dog\027\035\204\027%\204Don\027)\204\027-\204DodDol\0271\204\0275\204\0279\204\027=\204\027A\204\027E\204\027I\204DomDob\027P\204Dos\027T\204\004\352\204Doj\027X\204DokDotDopDohDwa\211\001\204\210\374\205\211\001\205\211\006\204\211\006\205\211\013\205\027_\204\211\020\204\211\020\205\211\025\205\211\032\205\211\037\205\211$\205\211)\205\211.\205\027c\204\2113\204\2113\205\2118\204\2118\205\211=\205\027g\204\211B\205\210\374\204\027k\204\027o\204\027s\204\211G\204\315D\205\315>\206\315D\206"; -static const char b0b4[769] = "\377\315J\205\315J\206\315P\206\211G\205\315V\205\315V\206\315\134\206\315b\206\315h\206\315n\206\315t\206\315z\206\211L\205\315\200\205\315\200\206\315\206\205\315\206\206\315\214\206\211Q\205\315\222\206\315>\205\211V\205\211[\205\211`\205Doe\211j\204\211e\205\211j\205\211o\204\211o\205\211t\205\027w\204\211y\204\211y\205\211~\205\211\203\205\211\210\205\211\215\205\211\222\205\211\227\205\027{\204\211\234\204\211\234\205\211\241\204\211\241\205\211\246\205\027\177\204\211\253\205\211e\204\027\203\204\027\207\204\027\213\204Dyo\211\265\204\211\260\205\211\265\205\211\272\204\211\272\205\211\277\205\027\217\204\211\304\204\211\304\205\211\311\205\211\316\205\211\323\205\211\330\205\211\335\205\211\342\205\027\223\204\211\347\204\211\347\205\211\354\204\211\354\205\211\361\205\027\227\204\211\366\205\211\260\204\027\233\204\027\237\204\027\243\204Du\202Dug\027\247\204\027\257\204Dun\027\263\204\027\267\204DudDul\027\273\204\027\277\204\027\303\204\027\307\204\027\313\204\027\317\204\027\323\204DumDub\027\327\204Dus\027\333\204\004\256\204Duj\027\337\204DukDutDupDuhDwo\212\000\204\211\373\205\212\000\205\212\005\204\212\005\205\212\012\205\027\346\204\212\017\204\212\017\205\212\024\205\212\031\205\212\036\205\212#\205\212(\205\212-\205\027\352\204\2122\204\2122\205\2127\204\2127\205\212<\205\027\356\204\212A\205\211\373\204\027\362\204\027\366\204\027\372\204Dwe\212K\204\212F\205\212K\205\212P\204\212P\205\212U\205\027\376\204\212Z\204\212Z\205\212_\205\212d\205\212i\205\212n\205\212s\205\212x\205\030\002\204\212}\204\212}\205\212\202\204\212\202\205\212\207\205\030\006\204\212\214\205\212F\204\030\012\204\030\016\204\030\022\204Dwi\212\226\204\212\221\205\212\226\205\212\233\204\212\233\205\212\240\205\030\026\204\212\245\204\212\245\205\212\252\205\212\257\205\212\264\205\212\271\205\212\276\205\212\303\205\030\032\204\212\310\204\212\310\205\212\315\204\212\315\205\212\322\205\030\036\204\212\327\205\212\221\204\030\042\204\030&\204\030*\204Dyu\212\341\204\212\334\205\212\341\205\212\346\204\212\346\205\212\353\205\030.\204\212\360\204\212\360\205\212\365\205\212\372\205\212\377\205\213\004\205\213\011\205\213\016\205\0302\204\213\023\204\213\023\205\213\030\204\213\030\205\213\035\205\0306\204\213\042\205\212\334\204\030:\204\030>\204\030B\204Deu\213,\204\213'\205\213,\205\2131\204\2131\205\2136\205\030F\204\213;\204\213;\205\213@\205\213E\205\213J\205\213O\205\213T\205\213Y\205\030J\204\213^\204\213^\205\213c\204\213c\205\213h\205\030N\204\213m\205\213'\204\030R\204\030V\204\030Z\204Dui\213w\204\213r\205\213w\205\213|\204\213|\205\213\201\205\030^\204"; -static const char b0b5[769] = "\377\213\206\204\213\206\205\213\213\205\213\220\205\213\225\205\213\232\205\213\237\205\213\244\205\030b\204\213\251\204\213\251\205\213\256\204\213\256\205\213\263\205\030f\204\213\270\205\213r\204\030j\204\030n\204\030r\204Di\202Dig\030v\204\030\202\204Din\030\206\204\030\212\204DidDil\030\216\204\030\222\204\030\226\204\030\232\204\030\236\204\030\242\204\030\246\204DimDib\030\252\204Dis\030\256\204\003x\204Dij\030\262\204DikDitDipDihTta\213\275\204|O\205\213\275\205\213\302\204\213\302\205\213\307\205\015\254\204\213\314\204\213\314\205\213\321\205\213\326\205\213\333\205\213\340\205\213\345\205\213\352\205\015\266\204\213\357\204\213\357\205\213\364\204\213\364\205\213\371\205\016\024\204\213\376\205|O\204\016V\204\030\271\204\030\275\204\214\003\204\315\236\205\315\230\206\315\236\206\315\244\205\315\244\206\315\252\206\214\003\205\315\260\205\315\260\206\315\266\206\315\274\206\315\302\206\315\310\206\315\316\206\315\324\206\214\010\205\315\332\205\315\332\206\315\340\205\315\340\206\315\346\206\214\015\205\315\354\206\315\230\205\214\022\205\214\027\205\214\034\205\214!\204\315\370\205\315\362\206\315\370\206\315\376\205\315\376\206\316\004\206\214!\205\316\012\205\316\012\206\316\020\206\316\026\206\316\034\206\316\042\206\316(\206\316.\206\214&\205\3164\205\3164\206\316:\205\316:\206\316@\206\214+\205\316F\206\315\362\205\2140\205\2145\205\214:\205\316L\205\363\217\206\363\210\207\363\217\207\363\226\206\363\226\207\363\235\207\316L\206\363\244\206\363\244\207\363\253\207\363\262\207\363\271\207\363\300\207\363\307\207\363\316\207\316R\206\363\325\206\363\325\207\363\334\206\363\334\207\363\343\207\316X\206\363\352\207\363\210\206\316^\206\316d\206\316j\206\214?\204\316v\205\316p\206\316v\206\316|\205\316|\206\316\202\206\214?\205\316\210\205\316\210\206\316\216\206\316\224\206\316\232\206\316\240\206\316\246\206\316\254\206\214D\205\316\262\205\316\262\206\316\270\205\316\270\206\316\276\206\214I\205\316\304\206\316p\205\214N\205\214S\205\214X\205Tte\214b\204\214]\205\214b\205\214g\204\214g\205\214l\205\030\301\204\214q\204\214q\205\214v\205\214{\205\214\200\205\214\205\205\214\212\205\214\217\205\030\305\204\214\224\204\214\224\205\214\231\204\214\231\205\214\236\205\030\311\204\214\243\205\214]\204\030\315\204\030\321\204\030\325\204\316\312\205\363\370\206\363\361\207\363\370\207\363\377\206\363\377\207\364\006\207\316\312\206\364\015\206\364\015\207\364\024\207\364\033\207\364\042\207\364)\207\3640\207\3647\207\316\320\206\364>\206\364>\207\364E\206\364E\207\364L\207\316\326\206\364S\207\363\361\206\316\334\206\316\342\206\316\350\206\214\250\204\316\364\205\316\356\206\316\364\206\316\372\205\316\372\206\317\000\206\214\250\205\317\006\205\317\006\206\317\014\206\317\022\206"; -static const char b0b6[769] = "\377\317\030\206\317\036\206\317$\206\317*\206\214\255\205\3170\205\3170\206\3176\205\3176\206\317<\206\214\262\205\317B\206\316\356\205\214\267\205\214\274\205\214\301\205Tto\214\313\204\214\306\205\214\313\205\214\320\204\214\320\205\214\325\205\030\331\204\214\332\204\214\332\205\214\337\205\214\344\205\214\351\205\214\356\205\214\363\205\214\370\205\030\335\204\214\375\204\214\375\205\215\002\204\215\002\205\215\007\205\030\341\204\215\014\205\214\306\204\030\345\204\030\351\204\030\355\204\215\021\204\317N\205\317H\206\317N\206\317T\205\317T\206\317Z\206\215\021\205\317`\205\317`\206\317f\206\317l\206\317r\206\317x\206\317~\206\317\204\206\215\026\205\317\212\205\317\212\206\317\220\205\317\220\206\317\226\206\215\033\205\317\234\206\317H\205\215 \205\215%\205\215*\205\317\242\205\364a\206\364Z\207\364a\207\364h\206\364h\207\364o\207\317\242\206\364v\206\364v\207\364}\207\364\204\207\364\213\207\364\222\207\364\231\207\364\240\207\317\250\206\364\247\206\364\247\207\364\256\206\364\256\207\364\265\207\317\256\206\364\274\207\364Z\206\317\264\206\317\272\206\317\300\206\215/\204\317\314\205\317\306\206\317\314\206\317\322\205\317\322\206\317\330\206\215/\205\317\336\205\317\336\206\317\344\206\317\352\206\317\360\206\317\366\206\317\374\206\320\002\206\2154\205\320\010\205\320\010\206\320\016\205\320\016\206\320\024\206\2159\205\320\032\206\317\306\205\215>\205\215C\205\215H\205\215M\204\320&\205\320 \206\320&\206\320,\205\320,\206\3202\206\215M\205\3208\205\3208\206\320>\206\320D\206\320J\206\320P\206\320V\206\320\134\206\215R\205\320b\205\320b\206\320h\205\320h\206\320n\206\215W\205\320t\206\320 \205\215\134\205\215a\205\215f\205Ttu\215p\204\215k\205\215p\205\215u\204\215u\205\215z\205\030\361\204\215\177\204\215\177\205\215\204\205\215\211\205\215\216\205\215\223\205\215\230\205\215\235\205\030\365\204\215\242\204\215\242\205\215\247\204\215\247\205\215\254\205\030\371\204\215\261\205\215k\204\030\375\204\031\001\204\031\005\204\215\266\204\320\200\205\320z\206\320\200\206\320\206\205\320\206\206\320\214\206\215\266\205\320\222\205\320\222\206\320\230\206\320\236\206\320\244\206\320\252\206\320\260\206\320\266\206\215\273\205\320\274\205\320\274\206\320\302\205\320\302\206\320\310\206\215\300\205\320\316\206\320z\205\215\305\205\215\312\205\215\317\205\215\324\204\320\332\205\320\324\206\320\332\206\320\340\205\320\340\206\320\346\206\215\324\205\320\354\205\320\354\206\320\362\206\320\370\206\320\376\206\321\004\206\321\012\206\321\020\206\215\331\205\321\026\205\321\026\206\321\034\205\321\034\206\321\042\206\215\336\205\321(\206\320\324\205\215\343\205\215\350\205\215\355\205\215\362\204\3214\205\321.\206\3214\206\321:\205\321:\206\321@\206\215\362\205\321F\205\321F\206\321L\206\321R\206\321X\206\321^\206\321d\206\321j\206"; -static const char b0b7[769] = "\377\215\367\205\321p\205\321p\206\321v\205\321v\206\321|\206\215\374\205\321\202\206\321.\205\216\001\205\216\006\205\216\013\205\216\020\204\321\216\205\321\210\206\321\216\206\321\224\205\321\224\206\321\232\206\216\020\205\321\240\205\321\240\206\321\246\206\321\254\206\321\262\206\321\270\206\321\276\206\321\304\206\216\025\205\321\312\205\321\312\206\321\320\205\321\320\206\321\326\206\216\032\205\321\334\206\321\210\205\216\037\205\216$\205\216)\205\216.\204\321\350\205\321\342\206\321\350\206\321\356\205\321\356\206\321\364\206\216.\205\321\372\205\321\372\206\322\000\206\322\006\206\322\014\206\322\022\206\322\030\206\322\036\206\2163\205\322$\205\322$\206\322*\205\322*\206\3220\206\2168\205\3226\206\321\342\205\216=\205\216B\205\216G\205\216L\204\322B\205\322<\206\322B\206\322H\205\322H\206\322N\206\216L\205\322T\205\322T\206\322Z\206\322`\206\322f\206\322l\206\322r\206\322x\206\216Q\205\322~\205\322~\206\322\204\205\322\204\206\322\212\206\216V\205\322\220\206\322<\205\216[\205\216`\205\216e\205Tti\216o\204\216j\205\216o\205\216t\204\216t\205\216y\205\031\011\204\216~\204\216~\205\216\203\205\216\210\205\216\215\205\216\222\205\216\227\205\216\234\205\031\015\204\216\241\204\216\241\205\216\246\204\216\246\205\216\253\205\031\021\204\216\260\205\216j\204\031\025\204\031\031\204\031\035\204La\202Lag\031!\204\031)\204Lan\031-\204\0311\204LadLal\0315\204\0319\204\031=\204\031A\204\031E\204\031I\204\031M\204LamLab\031Q\204Las\031U\204\005\230\204Laj\031Y\204LakLatLapLahLae\216\272\204\216\265\205\216\272\205\216\277\204\216\277\205\216\304\205\031`\204\216\311\204\216\311\205\216\316\205\216\323\205\216\330\205\216\335\205\216\342\205\216\347\205\031d\204\216\354\204\216\354\205\216\361\204\216\361\205\216\366\205\031h\204\216\373\205\216\265\204\031l\204\031p\204\031t\204Lya\217\005\204\217\000\205\217\005\205\217\012\204\217\012\205\217\017\205\031x\204\217\024\204\217\024\205\217\031\205\217\036\205\217#\205\217(\205\217-\205\2172\205\031|\204\2177\204\2177\205\217<\204\217<\205\217A\205\031\200\204\217F\205\217\000\204\031\204\204\031\210\204\031\214\204\217K\204\322\234\205\322\226\206\322\234\206\322\242\205\322\242\206\322\250\206\217K\205\322\256\205\322\256\206\322\264\206\322\272\206\322\300\206\322\306\206\322\314\206\322\322\206\217P\205\322\330\205\322\330\206\322\336\205\322\336\206\322\344\206\217U\205\322\352\206\322\226\205\217Z\205\217_\205\217d\205Leo\217n\204\217i\205\217n\205\217s\204\217s\205\217x\205\031\220\204\217}\204\217}\205\217\202\205\217\207\205\217\214\205\217\221\205\217\226\205\217\233\205\031\224\204\217\240\204\217\240\205\217\245\204"; -static const char b0b8[769] = "\377\217\245\205\217\252\205\031\230\204\217\257\205\217i\204\031\234\204\031\240\204\031\244\204Le\202Leg\031\250\204\031\260\204Len\031\264\204\031\270\204LedLel\031\274\204\031\300\204\031\304\204\031\310\204\031\314\204\031\320\204\031\324\204LemLeb\031\330\204Les\031\334\204\006G\204Lej\031\340\204LekLetLepLeh\217\264\204\322\366\205\322\360\206\322\366\206\322\374\205\322\374\206\323\002\206\217\264\205\323\010\205\323\010\206\323\016\206\323\024\206\323\032\206\323 \206\323&\206\323,\206\217\271\205\3232\205\3232\206\3238\205\3238\206\323>\206\217\276\205\323D\206\322\360\205\217\303\205\217\310\205\217\315\205Lye\217\327\204\217\322\205\217\327\205\217\334\204\217\334\205\217\341\205\031\347\204\217\346\204\217\346\205\217\353\205\217\360\205\217\365\205\217\372\205\217\377\205\220\004\205\031\353\204\220\011\204\220\011\205\220\016\204\220\016\205\220\023\205\031\357\204\220\030\205\217\322\204\031\363\204\031\367\204\031\373\204Lo\202Log\031\377\204\032\010\204Lon\032\014\204\032\020\204LodLol\032\024\204\032\030\204\032\034\204\032 \204\032$\204\032(\204\032,\204LomLob\0320\204Los\372\256\204\003\031\204Loj\0324\204LokLotLopLohLwa\220\042\204\220\035\205\220\042\205\220'\204\220'\205\220,\205\032;\204\2201\204\2201\205\2206\205\220;\205\220@\205\220E\205\220J\205\220O\205\032?\204\220T\204\220T\205\220Y\204\220Y\205\220^\205\032C\204\220c\205\220\035\204\032G\204\032K\204\032O\204\220h\204\323P\205\323J\206\323P\206\323V\205\323V\206\323\134\206\220h\205\323b\205\323b\206\323h\206\323n\206\323t\206\323z\206\323\200\206\323\206\206\220m\205\323\214\205\323\214\206\323\222\205\323\222\206\323\230\206\220r\205\323\236\206\323J\205\220w\205\220|\205\220\201\205Loe\220\213\204\220\206\205\220\213\205\220\220\204\220\220\205\220\225\205\032S\204\220\232\204\220\232\205\220\237\205\220\244\205\220\251\205\220\256\205\220\263\205\220\270\205\032W\204\220\275\204\220\275\205\220\302\204\220\302\205\220\307\205\032[\204\220\314\205\220\206\204\032_\204\032c\204\032g\204Lyo\220\326\204\220\321\205\220\326\205\220\333\204\220\333\205\220\340\205\032k\204\220\345\204\220\345\205\220\352\205\220\357\205\220\364\205\220\371\205\220\376\205\221\003\205\032o\204\221\010\204\221\010\205\221\015\204\221\015\205\221\022\205\032s\204\221\027\205\220\321\204\032w\204\032{\204\032\177\204Lu\202Lug\032\203\204\032\216\204Lun\032\222\204\032\226\204LudLul\032\232\204\032\236\204\032\242\204\032\246\204\032\252\204\032\256\204\032\262\204LumLub\032\266\204Lus\032\272\204\005\275\204Luj\032\276\204"; -static const char b0b9[769] = "\377LukLutLupLuhLwo\221!\204\221\034\205\221!\205\221&\204\221&\205\221+\205\032\305\204\2210\204\2210\205\2215\205\221:\205\221?\205\221D\205\221I\205\221N\205\032\311\204\221S\204\221S\205\221X\204\221X\205\221]\205\032\315\204\221b\205\221\034\204\032\321\204\032\325\204\032\331\204Lwe\221l\204\221g\205\221l\205\221q\204\221q\205\221v\205\032\335\204\221{\204\221{\205\221\200\205\221\205\205\221\212\205\221\217\205\221\224\205\221\231\205\032\341\204\221\236\204\221\236\205\221\243\204\221\243\205\221\250\205\032\345\204\221\255\205\221g\204\032\351\204\032\355\204\032\361\204Lwi\221\267\204\221\262\205\221\267\205\221\274\204\221\274\205\221\301\205\032\365\204\221\306\204\221\306\205\221\313\205\221\320\205\221\325\205\221\332\205\221\337\205\221\344\205\032\371\204\221\351\204\221\351\205\221\356\204\221\356\205\221\363\205\032\375\204\221\370\205\221\262\204\033\001\204\033\005\204\033\011\204Lyu\222\002\204\221\375\205\222\002\205\222\007\204\222\007\205\222\014\205\033\015\204\222\021\204\222\021\205\222\026\205\222\033\205\222 \205\222%\205\222*\205\222/\205\033\021\204\2224\204\2224\205\2229\204\2229\205\222>\205\033\025\204\222C\205\221\375\204\033\031\204\033\035\204\033!\204Leu\222M\204\222H\205\222M\205\222R\204\222R\205\222W\205\033%\204\222\134\204\222\134\205\222a\205\222f\205\222k\205\222p\205\222u\205\222z\205\033)\204\222\177\204\222\177\205\222\204\204\222\204\205\222\211\205\033-\204\222\216\205\222H\204\0331\204\0335\204\0339\204Lui\222\230\204\222\223\205\222\230\205\222\235\204\222\235\205\222\242\205\033=\204\222\247\204\222\247\205\222\254\205\222\261\205\222\266\205\222\273\205\222\300\205\222\305\205\033A\204\222\312\204\222\312\205\222\317\204\222\317\205\222\324\205\033E\204\222\331\205\222\223\204\033I\204\033M\204\033Q\204Li\202Lig\033U\204\033`\204Lin\033d\204\033h\204LidLil\033l\204\033p\204\033t\204\033x\204\033|\204\033\200\204\033\204\204LimLib\033\210\204Lis\033\214\204\005\357\204Lij\033\220\204LikLitLipLihMa\202Mag\033\233\204\033\247\204Man\033\253\204\033\257\204MadMal\033\263\204\033\267\204\033\273\204\033\277\204\033\303\204\033\307\204\033\313\204MamMab\033\317\204Mas\033\323\204\006\351\204Maj\033\327\204MakMatMapMahMae\222\343\204\222\336\205\222\343\205\222\350\204\222\350\205\222\355\205\033\342\204\222\362\204\222\362\205\222\367\205\222\374\205\223\001\205\223\006\205\223\013\205\223\020\205\033\346\204\223\025\204\223\025\205\223\032\204\223\032\205\223\037\205\033\352\204\223$\205\222\336\204\033\356\204\033\362\204\033\366\204"; -static const char b0ba[769] = "\377Mya\223.\204\223)\205\223.\205\2233\204\2233\205\2238\205\033\372\204\223=\204\223=\205\223B\205\223G\205\223L\205\223Q\205\223V\205\223[\205\033\376\204\223`\204\223`\205\223e\204\223e\205\223j\205\034\002\204\223o\205\223)\204\034\006\204\034\012\204\034\016\204\223t\204\323\252\205\323\244\206\323\252\206\323\260\205\323\260\206\323\266\206\223t\205\323\274\205\323\274\206\323\302\206\323\310\206\323\316\206\323\324\206\323\332\206\323\340\206\223y\205\323\346\205\323\346\206\323\354\205\323\354\206\323\362\206\223~\205\323\370\206\323\244\205\223\203\205\223\210\205\223\215\205Meo\223\227\204\223\222\205\223\227\205\223\234\204\223\234\205\223\241\205\034\022\204\223\246\204\223\246\205\223\253\205\223\260\205\223\265\205\223\272\205\223\277\205\223\304\205\034\026\204\223\311\204\223\311\205\223\316\204\223\316\205\223\323\205\034\032\204\223\330\205\223\222\204\034\036\204\034\042\204\034&\204Me\202Meg\034*\204\034.\204Men\0342\204\0346\204MedMel\034:\204\034>\204\034B\204\034F\204\034J\204\034N\204\034R\204MemMeb\034V\204Mes\034Z\204\006\205\204Mej\034^\204MekMetMepMeh\223\335\204\324\004\205\323\376\206\324\004\206\324\012\205\324\012\206\324\020\206\223\335\205\324\026\205\324\026\206\324\034\206\324\042\206\324(\206\324.\206\3244\206\324:\206\223\342\205\324@\205\324@\206\324F\205\324F\206\324L\206\223\347\205\324R\206\323\376\205\223\354\205\223\361\205\223\366\205Mye\224\000\204\223\373\205\224\000\205\224\005\204\224\005\205\224\012\205\034i\204\224\017\204\224\017\205\224\024\205\224\031\205\224\036\205\224#\205\224(\205\224-\205\034m\204\2242\204\2242\205\2247\204\2247\205\224<\205\034q\204\224A\205\223\373\204\034u\204\034y\204\034}\204Mo\202Mog\034\201\204\034\205\204Mon\034\211\204\034\215\204ModMol\034\221\204\034\225\204\034\231\204\034\235\204\034\241\204\034\245\204\034\251\204MomMob\034\255\204Mos\034\261\204\005I\204Moj\034\265\204MokMotMopMohMwa\224K\204\224F\205\224K\205\224P\204\224P\205\224U\205\034\300\204\224Z\204\224Z\205\224_\205\224d\205\224i\205\224n\205\224s\205\224x\205\034\304\204\224}\204\224}\205\224\202\204\224\202\205\224\207\205\034\310\204\224\214\205\224F\204\034\314\204\034\320\204\034\324\204\224\221\204\324^\205\324X\206\324^\206\324d\205\324d\206\324j\206\224\221\205\324p\205\324p\206\324v\206\324|\206\324\202\206\324\210\206\324\216\206\324\224\206\224\226\205\324\232\205\324\232\206\324\240\205\324\240\206\324\246\206\224\233\205\324\254\206\324X\205\224\240\205\224\245\205\224\252\205Moe\224\264\204\224\257\205\224\264\205"; -static const char b0bb[769] = "\377\224\271\204\224\271\205\224\276\205\034\330\204\224\303\204\224\303\205\224\310\205\224\315\205\224\322\205\224\327\205\224\334\205\224\341\205\034\334\204\224\346\204\224\346\205\224\353\204\224\353\205\224\360\205\034\340\204\224\365\205\224\257\204\034\344\204\034\350\204\034\354\204Myo\224\377\204\224\372\205\224\377\205\225\004\204\225\004\205\225\011\205\034\360\204\225\016\204\225\016\205\225\023\205\225\030\205\225\035\205\225\042\205\225'\205\225,\205\034\364\204\2251\204\2251\205\2256\204\2256\205\225;\205\034\370\204\225@\205\224\372\204\034\374\204\035\000\204\035\004\204Mu\202Mug\035\010\204\035\014\204Mun\035\020\204\035\024\204MudMul\035\030\204\035\034\204\035 \204\035$\204\035(\204\035,\204\0350\204MumMub\0354\204Mus\0358\204\011\026\204Muj\035<\204MukMutMupMuhMwo\225J\204\225E\205\225J\205\225O\204\225O\205\225T\205\035C\204\225Y\204\225Y\205\225^\205\225c\205\225h\205\225m\205\225r\205\225w\205\035G\204\225|\204\225|\205\225\201\204\225\201\205\225\206\205\035K\204\225\213\205\225E\204\035O\204\035S\204\035W\204Mwe\225\225\204\225\220\205\225\225\205\225\232\204\225\232\205\225\237\205\035[\204\225\244\204\225\244\205\225\251\205\225\256\205\225\263\205\225\270\205\225\275\205\225\302\205\035_\204\225\307\204\225\307\205\225\314\204\225\314\205\225\321\205\035c\204\225\326\205\225\220\204\035g\204\035k\204\035o\204Mwi\225\340\204\225\333\205\225\340\205\225\345\204\225\345\205\225\352\205\035s\204\225\357\204\225\357\205\225\364\205\225\371\205\225\376\205\226\003\205\226\010\205\226\015\205\035w\204\226\022\204\226\022\205\226\027\204\226\027\205\226\034\205\035{\204\226!\205\225\333\204\035\177\204\035\203\204\035\207\204Myu\226+\204\226&\205\226+\205\2260\204\2260\205\2265\205\035\213\204\226:\204\226:\205\226?\205\226D\205\226I\205\226N\205\226S\205\226X\205\035\217\204\226]\204\226]\205\226b\204\226b\205\226g\205\035\223\204\226l\205\226&\204\035\227\204\035\233\204\035\237\204Meu\226v\204\226q\205\226v\205\226{\204\226{\205\226\200\205\035\243\204\226\205\204\226\205\205\226\212\205\226\217\205\226\224\205\226\231\205\226\236\205\226\243\205\035\247\204\226\250\204\226\250\205\226\255\204\226\255\205\226\262\205\035\253\204\226\267\205\226q\204\035\257\204\035\263\204\035\267\204Mui\226\301\204\226\274\205\226\301\205\226\306\204\226\306\205\226\313\205\035\273\204\226\320\204\226\320\205\226\325\205\226\332\205\226\337\205\226\344\205\226\351\205\226\356\205\035\277\204\226\363\204\226\363\205\226\370\204\226\370\205\226\375\205\035\303\204\227\002\205\226\274\204\035\307\204\035\313\204\035\317\204Mi\202Mig\035\323\204\035\327\204Min\035\333\204\035\337\204Mid"; -static const char b0bc[769] = "\377Mil\035\343\204\035\347\204\035\353\204\035\357\204\035\363\204\035\367\204\035\373\204MimMib\035\377\204Mis\036\003\204\305;\204Mij\036\007\204MikMitMipMihBa\202Bag\036\022\204\036\026\204Ban\036\032\204\036\036\204BadBal\036\042\204\036&\204\036*\204\036.\204\0362\204\0366\204\036:\204BamBab\036>\204Bas\036B\204\006l\204Baj\036F\204BakBatBapBahBae\227\014\204\227\007\205\227\014\205\227\021\204\227\021\205\227\026\205\036M\204\227\033\204\227\033\205\227 \205\227%\205\227*\205\227/\205\2274\205\2279\205\036Q\204\227>\204\227>\205\227C\204\227C\205\227H\205\036U\204\227M\205\227\007\204\036Y\204\036]\204\036a\204Bya\227W\204\227R\205\227W\205\227\134\204\227\134\205\227a\205\036e\204\227f\204\227f\205\227k\205\227p\205\227u\205\227z\205\227\177\205\227\204\205\036i\204\227\211\204\227\211\205\227\216\204\227\216\205\227\223\205\036m\204\227\230\205\227R\204\036q\204\036u\204\036y\204\227\235\204\324\270\205\324\262\206\324\270\206\324\276\205\324\276\206\324\304\206\227\235\205\324\312\205\324\312\206\324\320\206\324\326\206\324\334\206\324\342\206\324\350\206\324\356\206\227\242\205\324\364\205\324\364\206\324\372\205\324\372\206\325\000\206\227\247\205\325\006\206\324\262\205\227\254\205\227\261\205\227\266\205Beo\227\300\204\227\273\205\227\300\205\227\305\204\227\305\205\227\312\205\036}\204\227\317\204\227\317\205\227\324\205\227\331\205\227\336\205\227\343\205\227\350\205\227\355\205\036\201\204\227\362\204\227\362\205\227\367\204\227\367\205\227\374\205\036\205\204\230\001\205\227\273\204\036\211\204\036\215\204\036\221\204Be\202Beg\036\225\204\036\231\204Ben\036\235\204\036\241\204BedBel\036\245\204\036\251\204\036\255\204\036\261\204\036\265\204\036\271\204\036\275\204BemBeb\036\301\204Bes\036\305\204\005\005\204Bej\036\311\204BekBetBepBeh\230\006\204\325\022\205\325\014\206\325\022\206\325\030\205\325\030\206\325\036\206\230\006\205\325$\205\325$\206\325*\206\3250\206\3256\206\325<\206\325B\206\325H\206\230\013\205\325N\205\325N\206\325T\205\325T\206\325Z\206\230\020\205\325`\206\325\014\205\230\025\205\230\032\205\230\037\205Bye\230)\204\230$\205\230)\205\230.\204\230.\205\2303\205\036\324\204\2308\204\2308\205\230=\205\230B\205\230G\205\230L\205\230Q\205\230V\205\036\330\204\230[\204\230[\205\230`\204\230`\205\230e\205\036\334\204\230j\205\230$\204\036\340\204\036\344\204\036\350\204Bo\202Bog\036\354\204\036\360\204Bon\036\364\204\036\370\204BodBol\036\374\204\037\000\204\037\004\204"; -static const char b0bd[769] = "\377\037\010\204\037\014\204\037\020\204\037\024\204BomBob\037\030\204Bos\037\034\204\010\344\204Boj\037 \204BokBotBopBohBwa\230t\204\230o\205\230t\205\230y\204\230y\205\230~\205\037'\204\230\203\204\230\203\205\230\210\205\230\215\205\230\222\205\230\227\205\230\234\205\230\241\205\037+\204\230\246\204\230\246\205\230\253\204\230\253\205\230\260\205\037/\204\230\265\205\230o\204\0373\204\0377\204\037;\204\230\272\204\325l\205\325f\206\325l\206\325r\205\325r\206\325x\206\230\272\205\325~\205\325~\206\325\204\206\325\212\206\325\220\206\325\226\206\325\234\206\325\242\206\230\277\205\325\250\205\325\250\206\325\256\205\325\256\206\325\264\206\230\304\205\325\272\206\325f\205\230\311\205\230\316\205\230\323\205Boe\230\335\204\230\330\205\230\335\205\230\342\204\230\342\205\230\347\205\037?\204\230\354\204\230\354\205\230\361\205\230\366\205\230\373\205\231\000\205\231\005\205\231\012\205\037C\204\231\017\204\231\017\205\231\024\204\231\024\205\231\031\205\037G\204\231\036\205\230\330\204\037K\204\037O\204\037S\204Byo\231(\204\231#\205\231(\205\231-\204\231-\205\2312\205\037W\204\2317\204\2317\205\231<\205\231A\205\231F\205\231K\205\231P\205\231U\205\037[\204\231Z\204\231Z\205\231_\204\231_\205\231d\205\037_\204\231i\205\231#\204\037c\204\037g\204\037k\204Bu\202Bug\037o\204\037s\204Bun\037w\204\037{\204BudBul\037\177\204\037\203\204\037\207\204\037\213\204\037\217\204\037\223\204\037\227\204BumBub\037\233\204Bus\037\237\204\037\243\204Buj\037\247\204BukButBupBuhBwo\231s\204\231n\205\231s\205\231x\204\231x\205\231}\205\037\256\204\231\202\204\231\202\205\231\207\205\231\214\205\231\221\205\231\226\205\231\233\205\231\240\205\037\262\204\231\245\204\231\245\205\231\252\204\231\252\205\231\257\205\037\266\204\231\264\205\231n\204\037\272\204\037\276\204\037\302\204Bwe\231\276\204\231\271\205\231\276\205\231\303\204\231\303\205\231\310\205\037\306\204\231\315\204\231\315\205\231\322\205\231\327\205\231\334\205\231\341\205\231\346\205\231\353\205\037\312\204\231\360\204\231\360\205\231\365\204\231\365\205\231\372\205\037\316\204\231\377\205\231\271\204\037\322\204\037\326\204\037\332\204Bwi\232\011\204\232\004\205\232\011\205\232\016\204\232\016\205\232\023\205\037\336\204\232\030\204\232\030\205\232\035\205\232\042\205\232'\205\232,\205\2321\205\2326\205\037\342\204\232;\204\232;\205\232@\204\232@\205\232E\205\037\346\204\232J\205\232\004\204\037\352\204\037\356\204\037\362\204Byu\232T\204\232O\205\232T\205\232Y\204\232Y\205\232^\205\037\366\204\232c\204\232c\205\232h\205\232m\205\232r\205\232w\205\232|\205\232\201\205"; -static const char b0be[769] = "\377\037\372\204\232\206\204\232\206\205\232\213\204\232\213\205\232\220\205\037\376\204\232\225\205\232O\204 \002\204 \006\204 \012\204Beu\232\237\204\232\232\205\232\237\205\232\244\204\232\244\205\232\251\205 \016\204\232\256\204\232\256\205\232\263\205\232\270\205\232\275\205\232\302\205\232\307\205\232\314\205 \022\204\232\321\204\232\321\205\232\326\204\232\326\205\232\333\205 \026\204\232\340\205\232\232\204 \032\204 \036\204 \042\204Bui\232\352\204\232\345\205\232\352\205\232\357\204\232\357\205\232\364\205 &\204\232\371\204\232\371\205\232\376\205\233\003\205\233\010\205\233\015\205\233\022\205\233\027\205 *\204\233\034\204\233\034\205\233!\204\233!\205\233&\205 .\204\233+\205\232\345\204 2\204 6\204 :\204Bi\202Big >\204 B\204Bin F\204 J\204BidBil N\204 R\204 V\204 Z\204 ^\204 b\204 f\204BimBib j\204Bis n\204\002\354\204Bij r\204BikBitBipBihPpa\2335\204\2330\205\2335\205\233:\204\233:\205\233?\205\015\230\204\233D\204\233D\205\233I\205\233N\205\233S\205\233X\205\233]\205\233b\205\015\242\204\233g\204\233g\205\233l\204\233l\205\233q\205\016\012\204\233v\205\2330\204\016\036\204\016A\204\016H\204\233{\204\325\306\205\325\300\206\325\306\206\325\314\205\325\314\206\325\322\206\233{\205\325\330\205\325\330\206\325\336\206\325\344\206\325\352\206\325\360\206\325\366\206\325\374\206\233\200\205\326\002\205\326\002\206\326\010\205\326\010\206\326\016\206\233\205\205\326\024\206\325\300\205\233\212\205\233\217\205\233\224\205\233\231\204\326 \205\326\032\206\326 \206\326&\205\326&\206\326,\206\233\231\205\3262\205\3262\206\3268\206\326>\206\326D\206\326J\206\326P\206\326V\206\233\236\205\326\134\205\326\134\206\326b\205\326b\206\326h\206\233\243\205\326n\206\326\032\205\233\250\205\233\255\205\233\262\205\326t\205\364\312\206\364\303\207\364\312\207\364\321\206\364\321\207\364\330\207\326t\206\364\337\206\364\337\207\364\346\207\364\355\207\364\364\207\364\373\207\365\002\207\365\011\207\326z\206\365\020\206\365\020\207\365\027\206\365\027\207\365\036\207\326\200\206\365%\207\364\303\206\326\206\206\326\214\206\326\222\206\233\267\204\326\236\205\326\230\206\326\236\206\326\244\205\326\244\206\326\252\206\233\267\205\326\260\205\326\260\206\326\266\206\326\274\206\326\302\206\326\310\206\326\316\206\326\324\206\233\274\205\326\332\205\326\332\206\326\340\205\326\340\206\326\346\206\233\301\205\326\354\206\326\230\205\233\306\205\233\313\205\233\320\205Ppe\233\332\204\233\325\205\233\332\205\233\337\204\233\337\205\233\344\205\016]\204\233\351\204\233\351\205\233\356\205\233\363\205\233\370\205\233\375\205\234\002\205\234\007\205 y\204\234\014\204\234\014\205\234\021\204"; -static const char b0bf[769] = "\377\234\021\205\234\026\205 }\204\234\033\205\233\325\204 \201\204 \205\204 \211\204\326\362\205\3653\206\365,\207\3653\207\365:\206\365:\207\365A\207\326\362\206\365H\206\365H\207\365O\207\365V\207\365]\207\365d\207\365k\207\365r\207\326\370\206\365y\206\365y\207\365\200\206\365\200\207\365\207\207\326\376\206\365\216\207\365,\206\327\004\206\327\012\206\327\020\206\234 \204\327\034\205\327\026\206\327\034\206\327\042\205\327\042\206\327(\206\234 \205\327.\205\327.\206\3274\206\327:\206\327@\206\327F\206\327L\206\327R\206\234%\205\327X\205\327X\206\327^\205\327^\206\327d\206\234*\205\327j\206\327\026\205\234/\205\2344\205\2349\205Ppo\234C\204\234>\205\234C\205\234H\204\234H\205\234M\205 \215\204\234R\204\234R\205\234W\205\234\134\205\234a\205\234f\205\234k\205\234p\205 \221\204\234u\204\234u\205\234z\204\234z\205\234\177\205 \225\204\234\204\205\234>\204 \231\204 \235\204 \241\204\234\211\204\327v\205\327p\206\327v\206\327|\205\327|\206\327\202\206\234\211\205\327\210\205\327\210\206\327\216\206\327\224\206\327\232\206\327\240\206\327\246\206\327\254\206\234\216\205\327\262\205\327\262\206\327\270\205\327\270\206\327\276\206\234\223\205\327\304\206\327p\205\234\230\205\234\235\205\234\242\205\327\312\205\365\234\206\365\225\207\365\234\207\365\243\206\365\243\207\365\252\207\327\312\206\365\261\206\365\261\207\365\270\207\365\277\207\365\306\207\365\315\207\365\324\207\365\333\207\327\320\206\365\342\206\365\342\207\365\351\206\365\351\207\365\360\207\327\326\206\365\367\207\365\225\206\327\334\206\327\342\206\327\350\206\234\247\204\327\364\205\327\356\206\327\364\206\327\372\205\327\372\206\330\000\206\234\247\205\330\006\205\330\006\206\330\014\206\330\022\206\330\030\206\330\036\206\330$\206\330*\206\234\254\205\3300\205\3300\206\3306\205\3306\206\330<\206\234\261\205\330B\206\327\356\205\234\266\205\234\273\205\234\300\205\234\305\204\330N\205\330H\206\330N\206\330T\205\330T\206\330Z\206\234\305\205\330`\205\330`\206\330f\206\330l\206\330r\206\330x\206\330~\206\330\204\206\234\312\205\330\212\205\330\212\206\330\220\205\330\220\206\330\226\206\234\317\205\330\234\206\330H\205\234\324\205\234\331\205\234\336\205Ppu\234\350\204\234\343\205\234\350\205\234\355\204\234\355\205\234\362\205 \245\204\234\367\204\234\367\205\234\374\205\235\001\205\235\006\205\235\013\205\235\020\205\235\025\205 \251\204\235\032\204\235\032\205\235\037\204\235\037\205\235$\205 \255\204\235)\205\234\343\204 \261\204 \265\204 \271\204\235.\204\330\250\205\330\242\206\330\250\206\330\256\205\330\256\206\330\264\206\235.\205\330\272\205\330\272\206\330\300\206\330\306\206\330\314\206\330\322\206\330\330\206\330\336\206\2353\205\330\344\205\330\344\206\330\352\205\330\352\206\330\360\206\2358\205\330\366\206"; -static const char b0c0[769] = "\377\330\242\205\235=\205\235B\205\235G\205\235L\204\331\002\205\330\374\206\331\002\206\331\010\205\331\010\206\331\016\206\235L\205\331\024\205\331\024\206\331\032\206\331 \206\331&\206\331,\206\3312\206\3318\206\235Q\205\331>\205\331>\206\331D\205\331D\206\331J\206\235V\205\331P\206\330\374\205\235[\205\235`\205\235e\205\235j\204\331\134\205\331V\206\331\134\206\331b\205\331b\206\331h\206\235j\205\331n\205\331n\206\331t\206\331z\206\331\200\206\331\206\206\331\214\206\331\222\206\235o\205\331\230\205\331\230\206\331\236\205\331\236\206\331\244\206\235t\205\331\252\206\331V\205\235y\205\235~\205\235\203\205\235\210\204\331\266\205\331\260\206\331\266\206\331\274\205\331\274\206\331\302\206\235\210\205\331\310\205\331\310\206\331\316\206\331\324\206\331\332\206\331\340\206\331\346\206\331\354\206\235\215\205\331\362\205\331\362\206\331\370\205\331\370\206\331\376\206\235\222\205\332\004\206\331\260\205\235\227\205\235\234\205\235\241\205\235\246\204\332\020\205\332\012\206\332\020\206\332\026\205\332\026\206\332\034\206\235\246\205\332\042\205\332\042\206\332(\206\332.\206\3324\206\332:\206\332@\206\332F\206\235\253\205\332L\205\332L\206\332R\205\332R\206\332X\206\235\260\205\332^\206\332\012\205\235\265\205\235\272\205\235\277\205\235\304\204\332j\205\332d\206\332j\206\332p\205\332p\206\332v\206\235\304\205\332|\205\332|\206\332\202\206\332\210\206\332\216\206\332\224\206\332\232\206\332\240\206\235\311\205\332\246\205\332\246\206\332\254\205\332\254\206\332\262\206\235\316\205\332\270\206\332d\205\235\323\205\235\330\205\235\335\205Ppi\235\347\204\235\342\205\235\347\205\235\354\204\235\354\205\235\361\205 \275\204\235\366\204\235\366\205\235\373\205\236\000\205\236\005\205\236\012\205\236\017\205\236\024\205 \301\204\236\031\204\236\031\205\236\036\204\236\036\205\236#\205 \305\204\236(\205\235\342\204 \311\204 \315\204 \321\204Sa\202Sag \325\204 \331\204San \335\204 \341\204SadSal \345\204 \351\204 \355\204 \361\204 \365\204 \371\204 \375\204SamSab!\001\204Sas!\005\204\010\230\204Saj!\011\204SakSatSapSahSae\2362\204\236-\205\2362\205\2367\204\2367\205\236<\205!\021\204\236A\204\236A\205\236F\205\236K\205\236P\205\236U\205\236Z\205\236_\205!\025\204\236d\204\236d\205\236i\204\236i\205\236n\205!\031\204\236s\205\236-\204!\035\204!!\204!%\204Sya\236}\204\236x\205\236}\205\236\202\204\236\202\205\236\207\205!)\204\236\214\204\236\214\205\236\221\205\236\226\205\236\233\205\236\240\205\236\245\205\236\252\205!-\204\236\257\204\236\257\205\236\264\204\236\264\205\236\271\205!1\204\236\276\205\236x\204!5\204!9\204!=\204"; -static const char b0c1[769] = "\377\236\303\204\332\304\205\332\276\206\332\304\206\332\312\205\332\312\206\332\320\206\236\303\205\332\326\205\332\326\206\332\334\206\332\342\206\332\350\206\332\356\206\332\364\206\332\372\206\236\310\205\333\000\205\333\000\206\333\006\205\333\006\206\333\014\206\236\315\205\333\022\206\332\276\205\236\322\205\236\327\205\236\334\205Seo\236\346\204\236\341\205\236\346\205\236\353\204\236\353\205\236\360\205!A\204\236\365\204\236\365\205\236\372\205\236\377\205\237\004\205\237\011\205\237\016\205\237\023\205!E\204\237\030\204\237\030\205\237\035\204\237\035\205\237\042\205!I\204\237'\205\236\341\204!M\204!Q\204!U\204Se\202Seg!Y\204!]\204Sen!a\204!e\204SedSel!i\204!m\204!q\204!u\204!y\204!}\204!\201\204SemSeb!\205\204Ses!\211\204\010\356\204Sej!\215\204SekSetSepSeh\237,\204\333\036\205\333\030\206\333\036\206\333$\205\333$\206\333*\206\237,\205\3330\205\3330\206\3336\206\333<\206\333B\206\333H\206\333N\206\333T\206\2371\205\333Z\205\333Z\206\333`\205\333`\206\333f\206\2376\205\333l\206\333\030\205\237;\205\237@\205\237E\205Sye\237O\204\237J\205\237O\205\237T\204\237T\205\237Y\205!\225\204\237^\204\237^\205\237c\205\237h\205\237m\205\237r\205\237w\205\237|\205!\231\204\237\201\204\237\201\205\237\206\204\237\206\205\237\213\205!\235\204\237\220\205\237J\204!\241\204!\245\204!\251\204So\202Sog!\255\204!\261\204Son!\265\204!\271\204SodSol!\275\204!\301\204!\305\204!\311\204!\315\204!\321\204!\325\204SomSob!\331\204Sos!\335\204\007\023\204Soj!\341\204SokSotSopSohSwa\237\232\204\237\225\205\237\232\205\237\237\204\237\237\205\237\244\205!\351\204\237\251\204\237\251\205\237\256\205\237\263\205\237\270\205\237\275\205\237\302\205\237\307\205!\355\204\237\314\204\237\314\205\237\321\204\237\321\205\237\326\205!\361\204\237\333\205\237\225\204!\365\204!\371\204!\375\204\237\340\204\333x\205\333r\206\333x\206\333~\205\333~\206\333\204\206\237\340\205\333\212\205\333\212\206\333\220\206\333\226\206\333\234\206\333\242\206\333\250\206\333\256\206\237\345\205\333\264\205\333\264\206\333\272\205\333\272\206\333\300\206\237\352\205\333\306\206\333r\205\237\357\205\237\364\205\237\371\205Soe\240\003\204\237\376\205\240\003\205{\226\204\240\010\205\240\015\205\042\001\204\240\022\204\240\022\205\240\027\205\240\034\205\240!\205\240&\205\240+\205\2400\205\042\005\204\2405\204\2405\205\240:\204\240:\205{\226\205\042\011\204\240?\205\237\376\204\042\015\204\042\021\204\042\025\204Syo\240I\204\240D\205\240I\205"; -static const char b0c2[769] = "\377\240N\204\240N\205\240S\205\042\031\204\240X\204\240X\205\240]\205\240b\205\240g\205\240l\205\240q\205\240v\205\042\035\204\240{\204\240{\205\240\200\204\240\200\205\240\205\205\042!\204\240\212\205\240D\204\042%\204\042)\204\042-\204Su\202Sug\0421\204\0425\204Sun\0429\204\042=\204SudSul\042A\204\042E\204\042I\204\042M\204\042Q\204\042U\204\042Y\204SumSub\042]\204Sus\042a\204\007&\204Suj\042e\204SukSutSupSuhSwo\240\224\204\240\217\205\240\224\205\240\231\204\240\231\205\240\236\205\042m\204\240\243\204\240\243\205\240\250\205\240\255\205\240\262\205\240\267\205\240\274\205\240\301\205\042q\204\240\306\204\240\306\205\240\313\204\240\313\205\240\320\205\042u\204\240\325\205\240\217\204\042y\204\042}\204\042\201\204Swe\240\337\204\240\332\205\240\337\205\240\344\204\240\344\205\240\351\205\042\205\204\240\356\204\240\356\205\240\363\205\240\370\205\240\375\205\241\002\205\241\007\205\241\014\205\042\211\204\241\021\204\241\021\205\241\026\204\241\026\205\241\033\205\042\215\204\241 \205\240\332\204\042\221\204\042\225\204\042\231\204Swi\241*\204\241%\205\241*\205\241/\204\241/\205\2414\205\042\235\204\2419\204\2419\205\241>\205\241C\205\241H\205\241M\205\241R\205\241W\205\042\241\204\241\134\204\241\134\205\241a\204\241a\205\241f\205\042\245\204\241k\205\241%\204\042\251\204\042\255\204\042\261\204Syu\241u\204\241p\205\241u\205\241z\204\241z\205\241\177\205\042\265\204\241\204\204\241\204\205\241\211\205\241\216\205\241\223\205\241\230\205\241\235\205\241\242\205\042\271\204\241\247\204\241\247\205\241\254\204\241\254\205\241\261\205\042\275\204\241\266\205\241p\204\042\301\204\042\305\204\042\311\204Seu\241\300\204\241\273\205\241\300\205\241\305\204\241\305\205\241\312\205\042\315\204\241\317\204\241\317\205\241\324\205\241\331\205\241\336\205\241\343\205\241\350\205\241\355\205\042\321\204\241\362\204\241\362\205\241\367\204\241\367\205\241\374\205\042\325\204\242\001\205\241\273\204\042\331\204\042\335\204\042\341\204Sui\242\013\204\242\006\205\242\013\205\242\020\204\242\020\205\242\025\205\042\345\204\242\032\204\242\032\205\242\037\205\242$\205\242)\205\242.\205\2423\205\2428\205\042\351\204\242=\204\242=\205\242B\204\242B\205\242G\205\042\355\204\242L\205\242\006\204\042\361\204\042\365\204\042\371\204Si\202Sig\042\375\204#\001\204Sin#\005\204#\011\204SidSil#\015\204#\021\204#\025\204#\031\204#\035\204#!\204#%\204SimSib#)\204Sis#-\204\010*\204Sij#1\204SikSitSipSihSsa\242V\204\242Q\205\242V\205\242[\204\242[\205\242`\205#9\204"; -static const char b0c3[769] = "\377\242e\204\242e\205\242j\205\242o\205\242t\205\242y\205\242~\205\242\203\205#=\204\242\210\204\242\210\205\242\215\204\242\215\205\242\222\205#A\204\242\227\205\242Q\204#E\204#I\204#M\204\242\234\204\333\322\205\333\314\206\333\322\206\333\330\205\333\330\206\333\336\206\242\234\205\333\344\205\333\344\206\333\352\206\333\360\206\333\366\206\333\374\206\334\002\206\334\010\206\242\241\205\334\016\205\334\016\206\334\024\205\334\024\206\334\032\206\242\246\205\334 \206\333\314\205\242\253\205\242\260\205\242\265\205\242\272\204\334,\205\334&\206\334,\206\3342\205\3342\206\3348\206\242\272\205\334>\205\334>\206\334D\206\334J\206\334P\206\334V\206\334\134\206\334b\206\242\277\205\334h\205\334h\206\334n\205\334n\206\334t\206\242\304\205\334z\206\334&\205\242\311\205\242\316\205\242\323\205\334\200\205\366\005\206\365\376\207\366\005\207\366\014\206\366\014\207\366\023\207\334\200\206\366\032\206\366\032\207\366!\207\366(\207\366/\207\3666\207\366=\207\366D\207\334\206\206\366K\206\366K\207\366R\206\366R\207\366Y\207\334\214\206\366`\207\365\376\206\334\222\206\334\230\206\334\236\206\242\330\204\334\252\205\334\244\206\334\252\206\334\260\205\334\260\206\334\266\206\242\330\205\334\274\205\334\274\206\334\302\206\334\310\206\334\316\206\334\324\206\334\332\206\334\340\206\242\335\205\334\346\205\334\346\206\334\354\205\334\354\206\334\362\206\242\342\205\334\370\206\334\244\205\242\347\205\242\354\205\242\361\205Sse\242\373\204\242\366\205\242\373\205\243\000\204\243\000\205\243\005\205#Q\204\243\012\204\243\012\205\243\017\205\243\024\205\243\031\205\243\036\205\243#\205\243(\205#U\204\243-\204\243-\205\2432\204\2432\205\2437\205#Y\204\243<\205\242\366\204#]\204#a\204#e\204\334\376\205\366n\206\366g\207\366n\207\366u\206\366u\207\366|\207\334\376\206\366\203\206\366\203\207\366\212\207\366\221\207\366\230\207\366\237\207\366\246\207\366\255\207\335\004\206\366\264\206\366\264\207\366\273\206\366\273\207\366\302\207\335\012\206\366\311\207\366g\206\335\020\206\335\026\206\335\034\206\243A\204\335(\205\335\042\206\335(\206\335.\205\335.\206\3354\206\243A\205\335:\205\335:\206\335@\206\335F\206\335L\206\335R\206\335X\206\335^\206\243F\205\335d\205\335d\206\335j\205\335j\206\335p\206\243K\205\335v\206\335\042\205\243P\205\243U\205\243Z\205Sso\243d\204\243_\205\243d\205\243i\204\243i\205\243n\205#i\204\243s\204\243s\205\243x\205\243}\205\243\202\205\243\207\205\243\214\205\243\221\205#m\204\243\226\204\243\226\205\243\233\204\243\233\205\243\240\205#q\204\243\245\205\243_\204#u\204#y\204#}\204\243\252\204\335\202\205\335|\206\335\202\206\335\210\205\335\210\206\335\216\206\243\252\205\335\224\205\335\224\206\335\232\206\335\240\206"; -static const char b0c4[769] = "\377\335\246\206\335\254\206\335\262\206\335\270\206\243\257\205\335\276\205\335\276\206\335\304\205\335\304\206\335\312\206\243\264\205\335\320\206\335|\205\243\271\205\243\276\205\243\303\205\335\326\205\366\327\206\366\320\207\366\327\207\366\336\206\366\336\207\366\345\207\335\326\206\366\354\206\366\354\207\366\363\207\366\372\207\367\001\207\367\010\207\367\017\207\367\026\207\335\334\206\367\035\206\367\035\207\367$\206\367$\207\367+\207\335\342\206\3672\207\366\320\206\335\350\206\335\356\206\335\364\206\243\310\204\336\000\205\335\372\206\336\000\206\336\006\205\336\006\206\336\014\206\243\310\205\336\022\205\336\022\206\336\030\206\336\036\206\336$\206\336*\206\3360\206\3366\206\243\315\205\336<\205\336<\206\336B\205\336B\206\336H\206\243\322\205\336N\206\335\372\205\243\327\205\243\334\205\243\341\205\243\346\204\336Z\205\336T\206\336Z\206\336`\205\336`\206\336f\206\243\346\205\336l\205\336l\206\336r\206\336x\206\336~\206\336\204\206\336\212\206\336\220\206\243\353\205\336\226\205\336\226\206\336\234\205\336\234\206\336\242\206\243\360\205\336\250\206\336T\205\243\365\205\243\372\205\243\377\205Ssu\244\011\204\244\004\205\244\011\205\244\016\204\244\016\205\244\023\205#\201\204\244\030\204\244\030\205\244\035\205\244\042\205\244'\205\244,\205\2441\205\2446\205#\205\204\244;\204\244;\205\244@\204\244@\205\244E\205#\211\204\244J\205\244\004\204#\215\204#\221\204#\225\204\244O\204\336\264\205\336\256\206\336\264\206\336\272\205\336\272\206\336\300\206\244O\205\336\306\205\336\306\206\336\314\206\336\322\206\336\330\206\336\336\206\336\344\206\336\352\206\244T\205\336\360\205\336\360\206\336\366\205\336\366\206\336\374\206\244Y\205\337\002\206\336\256\205\244^\205\244c\205\244h\205\244m\204\337\016\205\337\010\206\337\016\206\337\024\205\337\024\206\337\032\206\244m\205\337 \205\337 \206\337&\206\337,\206\3372\206\3378\206\337>\206\337D\206\244r\205\337J\205\337J\206\337P\205\337P\206\337V\206\244w\205\337\134\206\337\010\205\244|\205\244\201\205\244\206\205\244\213\204\337h\205\337b\206\337h\206\337n\205\337n\206\337t\206\244\213\205\337z\205\337z\206\337\200\206\337\206\206\337\214\206\337\222\206\337\230\206\337\236\206\244\220\205\337\244\205\337\244\206\337\252\205\337\252\206\337\260\206\244\225\205\337\266\206\337b\205\244\232\205\244\237\205\244\244\205\244\251\204\337\302\205\337\274\206\337\302\206\337\310\205\337\310\206\337\316\206\244\251\205\337\324\205\337\324\206\337\332\206\337\340\206\337\346\206\337\354\206\337\362\206\337\370\206\244\256\205\337\376\205\337\376\206\340\004\205\340\004\206\340\012\206\244\263\205\340\020\206\337\274\205\244\270\205\244\275\205\244\302\205\244\307\204\340\034\205\340\026\206\340\034\206\340\042\205\340\042\206\340(\206\244\307\205\340.\205\340.\206\3404\206\340:\206\340@\206\340F\206\340L\206\340R\206"; -static const char b0c5[769] = "\377\244\314\205\340X\205\340X\206\340^\205\340^\206\340d\206\244\321\205\340j\206\340\026\205\244\326\205\244\333\205\244\340\205\244\345\204\340v\205\340p\206\340v\206\340|\205\340|\206\340\202\206\244\345\205\340\210\205\340\210\206\340\216\206\340\224\206\340\232\206\340\240\206\340\246\206\340\254\206\244\352\205\340\262\205\340\262\206\340\270\205\340\270\206\340\276\206\244\357\205\340\304\206\340p\205\244\364\205\244\371\205\244\376\205Ssi\245\010\204\245\003\205\245\010\205\245\015\204\245\015\205\245\022\205#\231\204\245\027\204\245\027\205\245\034\205\245!\205\245&\205\245+\205\2450\205\2455\205#\235\204\245:\204\245:\205\245?\204\245?\205\245D\205#\241\204\245I\205\245\003\204#\245\204#\251\204#\255\204A\000\201Ag\202AkkAgsAn\202AnjAnhAd\202Al\202AlgAlmAlbAlsAltAlpAlhAm\202Ab\202AbsAs\202AssAngAj\202AchAk\202At\202Ap\202Ah\202Ae\202Aeg#\261\204#\265\204Aen#\271\204#\275\204AedAel#\301\204#\305\204#\311\204#\315\204#\321\204#\325\204#\331\204AemAeb#\335\204Aes#\341\204#\345\204Aej#\351\204AekAetAepAehYa\202Yag#\361\204#\365\204Yan#\371\204#\375\204YadYal$\001\204$\005\204$\011\204$\015\204$\021\204$\025\204$\031\204YamYab$\035\204Yas$!\204\360\350\204Yaj$%\204YakYatYapYahYae\245S\204\245N\205\245S\205\245X\204\245X\205\245]\205$)\204\245b\204\245b\205\245g\205\245l\205\245q\205\245v\205\245{\205\245\200\205$-\204\245\205\204\245\205\205\245\212\204\245\212\205\245\217\205$1\204\245\224\205\245N\204$5\204$9\204$=\204Eo\202Eog\016%\204\016j\204Eon$A\204$E\204EodEol$I\204$M\204$Q\204$U\204$Y\204$]\204$a\204EomEob$e\204Eos$i\204$m\204Eoj$q\204EokEotEopEohE\000\201Eg\202EkkEgsEn\202EnjEnhEd\202El\202ElgElmElbElsEltElpElhEm\202Eb\202EbsEs\202EssEngEj\202EchEk\202Et\202Ep\202Eh\202Yeo\245\236\204\245\231\205\245\236\205\245\243\204\245\243\205\245\250\205$u\204\245\255\204\245\255\205\245\262\205\245\267\205\245\274\205\245\301\205\245\306\205\245\313\205$y\204\245\320\204\245\320\205\245\325\204"; -static const char b0c6[769] = "\377\245\325\205\245\332\205$}\204\245\337\205\245\231\204$\201\204$\205\204$\211\204Ye\202Yeg$\215\204$\221\204Yen$\225\204$\231\204YedYel$\235\204$\241\204$\245\204$\251\204$\255\204$\261\204$\265\204YemYeb$\271\204Yes$\275\204$\301\204Yej$\305\204YekYetYepYehO\000\201Og\202OkkOgsOn\202OnjOnhOd\202Ol\202OlgOlmOlbOlsOltOlpOlhOm\202Ob\202ObsOs\202OssOngOj\202OchOk\202Ot\202Op\202Oh\202Wa\202Wag$\311\204$\315\204Wan$\321\204$\325\204WadWal$\331\204$\335\204$\341\204$\345\204$\351\204$\355\204$\361\204WamWab$\365\204Was$\371\204\305`\204Waj$\375\204WakWatWapWahWae\245\351\204\245\344\205\245\351\205\245\356\204\245\356\205\245\363\205%\001\204\245\370\204\245\370\205\245\375\205\246\002\205\246\007\205\246\014\205\246\021\205\246\026\205%\005\204\246\033\204\246\033\205\246 \204\246 \205\246%\205%\011\204\246*\205\245\344\204%\015\204%\021\204%\025\204Oe\202Oeg\015\346\204\015\375\204Oen%\031\204%\035\204OedOel%!\204%%\204%)\204%-\204%1\204%5\204%9\204OemOeb%=\204Oes%A\204%E\204Oej%I\204OekOetOepOehYo\202Yog%M\204%Q\204Yon%U\204%Y\204YodYol%]\204%a\204%e\204%i\204%m\204%q\204%u\204YomYob%y\204Yos%}\204\003]\204Yoj%\201\204YokYotYopYohU\000\201Ug\202UkkUgsUn\202UnjUnhUd\202Ul\202UlgUlmUlbUlsUltUlpUlhUm\202Ub\202UbsUs\202UssUngUj\202UchUk\202Ut\202Up\202Uh\202Wo\202Wog%\205\204%\211\204Won%\215\204%\221\204WodWol%\225\204%\231\204%\235\204%\241\204%\245\204%\251\204%\255\204WomWob%\261\204Wos%\265\204\005:\204Woj%\271\204WokWotWopWohWe\202Weg%\275\204%\301\204Wen%\305\204%\311\204WedWel%\315\204%\321\204%\325\204%\331\204%\335\204%\341\204%\345\204WemWeb%\351\204Wes%\355\204\006Z\204Wej%\361\204"; -static const char b0c7[769] = "\377WekWetWepWehWi\202Wig%\365\204%\371\204Win%\375\204&\001\204WidWil&\005\204&\011\204&\015\204&\021\204&\025\204&\031\204&\035\204WimWib&!\204Wis&%\204\010\002\204Wij&)\204WikWitWipWihYu\202Yug&-\204&1\204Yun&5\204&9\204YudYul&=\204&A\204&E\204&I\204&M\204&Q\204&U\204YumYub&Y\204Yus&]\204&a\204Yuj&e\204YukYutYupYuhEu\202Eug&i\204&m\204Eun&q\204&u\204EudEul&y\204&}\204&\201\204&\205\204&\211\204&\215\204&\221\204EumEub&\225\204Eus&\231\204&\235\204Euj&\241\204EukEutEupEuhUi\202Uig\004\030\204&\245\204Uin&\251\204&\255\204UidUil&\261\204&\265\204&\271\204&\275\204&\301\204&\305\204&\311\204UimUib&\315\204Uis&\321\204&\325\204Uij&\331\204UikUitUipUihI\000\201Ig\202IkkIgsIn\202InjInhId\202Il\202IlgIlmIlbIlsIltIlpIlhIm\202Ib\202IbsIs\202IssIngIj\202IchIk\202It\202Ip\202Ih\202Ja\202Jag&\335\204&\341\204Jan&\345\204&\351\204JadJal&\355\204&\361\204&\365\204&\371\204&\375\204'\001\204'\005\204JamJab'\011\204Jas'\015\204'\021\204Jaj'\025\204JakJatJapJahJae\2464\204\246/\205\2464\205\2469\204\2469\205\246>\205'\031\204\246C\204\246C\205\246H\205\246M\205\246R\205\246W\205\246\134\205\246a\205'\035\204\246f\204\246f\205\246k\204\246k\205\246p\205'!\204\246u\205\246/\204'%\204')\204'-\204Jya\246\177\204\246z\205\246\177\205\246\204\204\246\204\205\246\211\205'1\204\246\216\204\246\216\205\246\223\205\246\230\205\246\235\205\246\242\205\246\247\205\246\254\205'5\204\246\261\204\246\261\205\246\266\204\246\266\205\246\273\205'9\204\246\300\205\246z\204'=\204'A\204'E\204\246\305\204\340\320\205\340\312\206\340\320\206\340\326\205\340\326\206\340\334\206\246\305\205\340\342\205\340\342\206\340\350\206\340\356\206\340\364\206\340\372\206\341\000\206\341\006\206\246\312\205\341\014\205\341\014\206\341\022\205\341\022\206\341\030\206\246\317\205\341\036\206\340\312\205\246\324\205\246\331\205\246\336\205"; -static const char b0c8[769] = "\377Jeo\246\350\204\246\343\205\246\350\205\246\355\204\246\355\205\246\362\205'I\204\246\367\204\246\367\205\246\374\205\247\001\205\247\006\205\247\013\205\247\020\205\247\025\205'M\204\247\032\204\247\032\205\247\037\204\247\037\205\247$\205'Q\204\247)\205\246\343\204'U\204'Y\204']\204Je\202Jeg'a\204'e\204Jen'i\204'm\204JedJel'q\204'u\204'y\204'}\204'\201\204'\205\204'\211\204JemJeb'\215\204Jes'\221\204'\225\204Jej'\231\204JekJetJepJeh\247.\204\341*\205\341$\206\341*\206\3410\205\3410\206\3416\206\247.\205\341<\205\341<\206\341B\206\341H\206\341N\206\341T\206\341Z\206\341`\206\2473\205\341f\205\341f\206\341l\205\341l\206\341r\206\2478\205\341x\206\341$\205\247=\205\247B\205\247G\205Jye\247Q\204\247L\205\247Q\205\247V\204\247V\205\247[\205'\235\204\247`\204\247`\205\247e\205\247j\205\247o\205\247t\205\247y\205\247~\205'\241\204\247\203\204\247\203\205\247\210\204\247\210\205\247\215\205'\245\204\247\222\205\247L\204'\251\204'\255\204'\261\204Jo\202Jog'\265\204'\271\204Jon'\275\204'\301\204JodJol'\305\204'\311\204'\315\204'\321\204'\325\204'\331\204'\335\204JomJob'\341\204Jos'\345\204\016\207\204Joj'\351\204JokJotJopJohJwa\247\234\204\247\227\205\247\234\205\247\241\204\247\241\205\247\246\205'\355\204\247\253\204\247\253\205\247\260\205\247\265\205\247\272\205\247\277\205\247\304\205\247\311\205'\361\204\247\316\204\247\316\205\247\323\204\247\323\205\247\330\205'\365\204\247\335\205\247\227\204'\371\204'\375\204(\001\204\247\342\204\341\204\205\341~\206\341\204\206\341\212\205\341\212\206\341\220\206\247\342\205\341\226\205\341\226\206\341\234\206\341\242\206\341\250\206\341\256\206\341\264\206\341\272\206\247\347\205\341\300\205\341\300\206\341\306\205\341\306\206\341\314\206\247\354\205\341\322\206\341~\205\247\361\205\247\366\205\247\373\205Joe\250\005\204\250\000\205\250\005\205{\303\204\250\012\205\250\017\205(\005\204\250\024\204\250\024\205\250\031\205\250\036\205\250#\205\250(\205\250-\205\2502\205(\011\204\2507\204\2507\205\250<\204\250<\205{\303\205(\015\204\250A\205\250\000\204(\021\204(\025\204(\031\204Jyo\250K\204\250F\205\250K\205\250P\204\250P\205\250U\205(\035\204\250Z\204\250Z\205\250_\205\250d\205\250i\205\250n\205\250s\205\250x\205(!\204\250}\204\250}\205\250\202\204\250\202\205\250\207\205(%\204\250\214\205\250F\204()\204(-\204(1\204Ju\202Jug(5\204(9\204"; -static const char b0c9[769] = "\377Jun(=\204(A\204JudJul(E\204(I\204(M\204(Q\204(U\204(Y\204(]\204JumJub(a\204Jus(e\204\007\252\204Juj(i\204JukJutJupJuhJwo\250\226\204\250\221\205\250\226\205\250\233\204\250\233\205\250\240\205(m\204\250\245\204\250\245\205\250\252\205\250\257\205\250\264\205\250\271\205\250\276\205\250\303\205(q\204\250\310\204\250\310\205\250\315\204\250\315\205\250\322\205(u\204\250\327\205\250\221\204(y\204(}\204(\201\204Jwe\250\341\204\250\334\205\250\341\205\250\346\204\250\346\205\250\353\205(\205\204\250\360\204\250\360\205\250\365\205\250\372\205\250\377\205\251\004\205\251\011\205\251\016\205(\211\204\251\023\204\251\023\205\251\030\204\251\030\205\251\035\205(\215\204\251\042\205\250\334\204(\221\204(\225\204(\231\204Jwi\251,\204\251'\205\251,\205\2511\204\2511\205\2516\205(\235\204\251;\204\251;\205\251@\205\251E\205\251J\205\251O\205\251T\205\251Y\205(\241\204\251^\204\251^\205\251c\204\251c\205\251h\205(\245\204\251m\205\251'\204(\251\204(\255\204(\261\204Jyu\251w\204\251r\205\251w\205\251|\204\251|\205\251\201\205(\265\204\251\206\204\251\206\205\251\213\205\251\220\205\251\225\205\251\232\205\251\237\205\251\244\205(\271\204\251\251\204\251\251\205\251\256\204\251\256\205\251\263\205(\275\204\251\270\205\251r\204\010\042\204(\301\204(\305\204Jeu\251\302\204\251\275\205\251\302\205\251\307\204\251\307\205\251\314\205(\311\204\251\321\204\251\321\205\251\326\205\251\333\205\251\340\205\251\345\205\251\352\205\251\357\205(\315\204\251\364\204\251\364\205\251\371\204\251\371\205\251\376\205(\321\204\252\003\205\251\275\204(\325\204(\331\204(\335\204Jui\252\015\204\252\010\205\252\015\205\252\022\204\252\022\205\252\027\205(\341\204\252\034\204\252\034\205\252!\205\252&\205\252+\205\2520\205\2525\205\252:\205(\345\204\252?\204\252?\205\252D\204\252D\205\252I\205(\351\204\252N\205\252\010\204(\355\204(\361\204(\365\204Ji\202Jig\0117\204(\371\204Jin(\375\204)\001\204JidJil)\005\204)\011\204)\015\204)\021\204)\025\204)\031\204)\035\204JimJib)!\204Jis)%\204\0050\204Jij))\204JikJitJipJihJja\252X\204\252S\205\252X\205\252]\204\252]\205\252b\205)-\204\252g\204\252g\205\252l\205\252q\205\252v\205\252{\205\252\200\205\252\205\205)1\204\252\212\204\252\212\205\252\217\204\252\217\205\252\224\205)5\204\252\231\205\252S\204)9\204)=\204)A\204\252\236\204\341\336\205\341\330\206\341\336\206\341\344\205\341\344\206\341\352\206\252\236\205"; -static const char b0ca[769] = "\377\341\360\205\341\360\206\341\366\206\341\374\206\342\002\206\342\010\206\342\016\206\342\024\206\252\243\205\342\032\205\342\032\206\342 \205\342 \206\342&\206\252\250\205\342,\206\341\330\205\252\255\205\252\262\205\252\267\205\252\274\204\3428\205\3422\206\3428\206\342>\205\342>\206\342D\206\252\274\205\342J\205\342J\206\342P\206\342V\206\342\134\206\342b\206\342h\206\342n\206\252\301\205\342t\205\342t\206\342z\205\342z\206\342\200\206\252\306\205\342\206\206\3422\205\252\313\205\252\320\205\252\325\205\342\214\205\367@\206\3679\207\367@\207\367G\206\367G\207\367N\207\342\214\206\367U\206\367U\207\367\134\207\367c\207\367j\207\367q\207\367x\207\367\177\207\342\222\206\367\206\206\367\206\207\367\215\206\367\215\207\367\224\207\342\230\206\367\233\207\3679\206\342\236\206\342\244\206\342\252\206\252\332\204\342\266\205\342\260\206\342\266\206\342\274\205\342\274\206\342\302\206\252\332\205\342\310\205\342\310\206\342\316\206\342\324\206\342\332\206\342\340\206\342\346\206\342\354\206\252\337\205\342\362\205\342\362\206\342\370\205\342\370\206\342\376\206\252\344\205\343\004\206\342\260\205\252\351\205\252\356\205\252\363\205Jje\252\375\204\252\370\205\252\375\205\253\002\204\253\002\205\253\007\205)E\204\253\014\204\253\014\205\253\021\205\253\026\205\253\033\205\253 \205\253%\205\253*\205)I\204\253/\204\253/\205\2534\204\2534\205\2539\205)M\204\253>\205\252\370\204)Q\204)U\204)Y\204\343\012\205\367\251\206\367\242\207\367\251\207\367\260\206\367\260\207\367\267\207\343\012\206\367\276\206\367\276\207\367\305\207\367\314\207\367\323\207\367\332\207\367\341\207\367\350\207\343\020\206\367\357\206\367\357\207\367\366\206\367\366\207\367\375\207\343\026\206\370\004\207\367\242\206\343\034\206\343\042\206\343(\206\253C\204\3434\205\343.\206\3434\206\343:\205\343:\206\343@\206\253C\205\343F\205\343F\206\343L\206\343R\206\343X\206\343^\206\343d\206\343j\206\253H\205\343p\205\343p\206\343v\205\343v\206\343|\206\253M\205\343\202\206\343.\205\253R\205\253W\205\253\134\205Jjo\253f\204\253a\205\253f\205\253k\204\253k\205\253p\205)]\204\253u\204\253u\205\253z\205\253\177\205\253\204\205\253\211\205\253\216\205\253\223\205)a\204\253\230\204\253\230\205\253\235\204\253\235\205\253\242\205)e\204\253\247\205\253a\204)i\204)m\204)q\204\253\254\204\343\216\205\343\210\206\343\216\206\343\224\205\343\224\206\343\232\206\253\254\205\343\240\205\343\240\206\343\246\206\343\254\206\343\262\206\343\270\206\343\276\206\343\304\206\253\261\205\343\312\205\343\312\206\343\320\205\343\320\206\343\326\206\253\266\205\343\334\206\343\210\205\253\273\205\253\300\205\253\305\205\343\342\205\370\022\206\370\013\207\370\022\207\370\031\206\370\031\207\370 \207\343\342\206\370'\206\370'\207\370.\207\3705\207"; -static const char b0cb[769] = "\377\370<\207\370C\207\370J\207\370Q\207\343\350\206\370X\206\370X\207\370_\206\370_\207\370f\207\343\356\206\370m\207\370\013\206\343\364\206\343\372\206\344\000\206\253\312\204\344\014\205\344\006\206\344\014\206\344\022\205\344\022\206\344\030\206\253\312\205\344\036\205\344\036\206\344$\206\344*\206\3440\206\3446\206\344<\206\344B\206\253\317\205\344H\205\344H\206\344N\205\344N\206\344T\206\253\324\205\344Z\206\344\006\205\253\331\205\253\336\205\253\343\205\253\350\204\344f\205\344`\206\344f\206\344l\205\344l\206\344r\206\253\350\205\344x\205\344x\206\344~\206\344\204\206\344\212\206\344\220\206\344\226\206\344\234\206\253\355\205\344\242\205\344\242\206\344\250\205\344\250\206\344\256\206\253\362\205\344\264\206\344`\205\253\367\205\253\374\205\254\001\205Jju\254\013\204\254\006\205\254\013\205\254\020\204\254\020\205\254\025\205)u\204\254\032\204\254\032\205\254\037\205\254$\205\254)\205\254.\205\2543\205\2548\205)y\204\254=\204\254=\205\254B\204\254B\205\254G\205)}\204\254L\205\254\006\204)\201\204)\205\204)\211\204\254Q\204\344\300\205\344\272\206\344\300\206\344\306\205\344\306\206\344\314\206\254Q\205\344\322\205\344\322\206\344\330\206\344\336\206\344\344\206\344\352\206\344\360\206\344\366\206\254V\205\344\374\205\344\374\206\345\002\205\345\002\206\345\010\206\254[\205\345\016\206\344\272\205\254`\205\254e\205\254j\205\254o\204\345\032\205\345\024\206\345\032\206\345 \205\345 \206\345&\206\254o\205\345,\205\345,\206\3452\206\3458\206\345>\206\345D\206\345J\206\345P\206\254t\205\345V\205\345V\206\345\134\205\345\134\206\345b\206\254y\205\345h\206\345\024\205\254~\205\254\203\205\254\210\205\254\215\204\345t\205\345n\206\345t\206\345z\205\345z\206\345\200\206\254\215\205\345\206\205\345\206\206\345\214\206\345\222\206\345\230\206\345\236\206\345\244\206\345\252\206\254\222\205\345\260\205\345\260\206\345\266\205\345\266\206\345\274\206\254\227\205\345\302\206\345n\205\254\234\205\254\241\205\254\246\205\254\253\204\345\316\205\345\310\206\345\316\206\345\324\205\345\324\206\345\332\206\254\253\205\345\340\205\345\340\206\345\346\206\345\354\206\345\362\206\345\370\206\345\376\206\346\004\206\254\260\205\346\012\205\346\012\206\346\020\205\346\020\206\346\026\206\254\265\205\346\034\206\345\310\205\254\272\205\254\277\205\254\304\205\254\311\204\346(\205\346\042\206\346(\206\346.\205\346.\206\3464\206\254\311\205\346:\205\346:\206\346@\206\346F\206\346L\206\346R\206\346X\206\346^\206\254\316\205\346d\205\346d\206\346j\205\346j\206\346p\206\254\323\205\346v\206\346\042\205\254\330\205\254\335\205\254\342\205\254\347\204\346\202\205\346|\206\346\202\206\346\210\205\346\210\206\346\216\206\254\347\205\346\224\205\346\224\206\346\232\206\346\240\206\346\246\206\346\254\206\346\262\206\346\270\206"; -static const char b0cc[769] = "\377\254\354\205\346\276\205\346\276\206\346\304\205\346\304\206\346\312\206\254\361\205\346\320\206\346|\205\254\366\205\254\373\205\255\000\205Jji\255\012\204\255\005\205\255\012\205\255\017\204\255\017\205\255\024\205)\215\204\255\031\204\255\031\205\255\036\205\255#\205\255(\205\255-\205\2552\205\2557\205)\221\204\255<\204\255<\205\255A\204\255A\205\255F\205)\225\204\255K\205\255\005\204)\231\204)\235\204)\241\204Cha\255U\204\255P\205\255U\205z\355\204\255Z\205\255_\205)\245\204\255d\204\255d\205\255i\205\255n\205\255s\205\255x\205\255}\205\255\202\205\305F\204\255\207\204\255\207\205\255\214\204\255\214\205z\355\205)\251\204\255\221\205\255P\204)\255\204)\261\204)\265\204\255\226\204\346\334\205\346\326\206\346\334\206\346\342\205\346\342\206\346\350\206\255\226\205\346\356\205\346\356\206\346\364\206\346\372\206\347\000\206\347\006\206\347\014\206\347\022\206\255\233\205\347\030\205\347\030\206\347\036\205\347\036\206\347$\206\255\240\205\347*\206\346\326\205\255\245\205\255\252\205\255\257\205\255\264\204\3476\205\3470\206\3476\206\347<\205\347<\206\347B\206\255\264\205\347H\205\347H\206\347N\206\347T\206\347Z\206\347`\206\347f\206\347l\206\255\271\205\347r\205\347r\206\347x\205\347x\206\347~\206\255\276\205\347\204\206\3470\205\255\303\205\255\310\205\255\315\205\347\212\205\370{\206\370t\207\370{\207\370\202\206\370\202\207\370\211\207\347\212\206\370\220\206\370\220\207\370\227\207\370\236\207\370\245\207\370\254\207\370\263\207\370\272\207\347\220\206\370\301\206\370\301\207\370\310\206\370\310\207\370\317\207\347\226\206\370\326\207\370t\206\347\234\206\347\242\206\347\250\206\255\322\204\347\264\205\347\256\206\347\264\206\347\272\205\347\272\206\347\300\206\255\322\205\347\306\205\347\306\206\347\314\206\347\322\206\347\330\206\347\336\206\347\344\206\347\352\206\255\327\205\347\360\205\347\360\206\347\366\205\347\366\206\347\374\206\255\334\205\350\002\206\347\256\205\255\341\205\255\346\205\255\353\205Che\255\365\204\255\360\205\255\365\205{x\204\255\372\205\255\377\205)\271\204\256\004\204\256\004\205\256\011\205\256\016\205\256\023\205\256\030\205\256\035\205\256\042\205)\275\204\256'\204\256'\205\256,\204\256,\205{x\205)\301\204\2561\205\255\360\204)\305\204)\311\204)\315\204\350\010\205\370\344\206\370\335\207\370\344\207\370\353\206\370\353\207\370\362\207\350\010\206\370\371\206\370\371\207\371\000\207\371\007\207\371\016\207\371\025\207\371\034\207\371#\207\350\016\206\371*\206\371*\207\3711\206\3711\207\3718\207\350\024\206\371?\207\370\335\206\350\032\206\350 \206\350&\206\2566\204\3502\205\350,\206\3502\206\3508\205\3508\206\350>\206\2566\205\350D\205\350D\206\350J\206\350P\206\350V\206\350\134\206\350b\206\350h\206\256;\205\350n\205\350n\206\350t\205"; -static const char b0cd[769] = "\377\350t\206\350z\206\256@\205\350\200\206\350,\205\256E\205\256J\205\256O\205Cho\256Y\204\256T\205\256Y\205z\367\204\256^\205\256c\205)\321\204\256h\204\256h\205\256m\205\256r\205\256w\205\256|\205\256\201\205\256\206\205)\325\204\256\213\204\256\213\205\256\220\204\256\220\205z\367\205)\331\204\256\225\205\256T\204)\335\204)\341\204)\345\204\256\232\204\350\214\205\350\206\206\350\214\206\350\222\205\350\222\206\350\230\206\256\232\205\350\236\205\350\236\206\350\244\206\350\252\206\350\260\206\350\266\206\350\274\206\350\302\206\256\237\205\350\310\205\350\310\206\350\316\205\350\316\206\350\324\206\256\244\205\350\332\206\350\206\205\256\251\205\256\256\205\256\263\205\350\340\205\371M\206\371F\207\371M\207\371T\206\371T\207\371[\207\350\340\206\371b\206\371b\207\371i\207\371p\207\371w\207\371~\207\371\205\207\371\214\207\350\346\206\371\223\206\371\223\207\371\232\206\371\232\207\371\241\207\350\354\206\371\250\207\371F\206\350\362\206\350\370\206\350\376\206\256\270\204\351\012\205\351\004\206\351\012\206\351\020\205\351\020\206\351\026\206\256\270\205\351\034\205\351\034\206\351\042\206\351(\206\351.\206\3514\206\351:\206\351@\206\256\275\205\351F\205\351F\206\351L\205\351L\206\351R\206\256\302\205\351X\206\351\004\205\256\307\205\256\314\205\256\321\205\256\326\204\351d\205\351^\206\351d\206\351j\205\351j\206\351p\206\256\326\205\351v\205\351v\206\351|\206\351\202\206\351\210\206\351\216\206\351\224\206\351\232\206\256\333\205\351\240\205\351\240\206\351\246\205\351\246\206\351\254\206\256\340\205\351\262\206\351^\205\256\345\205\256\352\205\256\357\205Chu\256\364\204{\360\205\256\364\205\256\371\204\256\371\205\256\376\205)\351\204\257\003\204\257\003\205\257\010\205\257\015\205\257\022\205\257\027\205\257\034\205\257!\205)\355\204\257&\204\257&\205\257+\204\257+\205\2570\205)\361\204\2575\205{\360\204)\365\204)\371\204)\375\204\257:\204\351\276\205\351\270\206\351\276\206\351\304\205\351\304\206\351\312\206\257:\205\351\320\205\351\320\206\351\326\206\351\334\206\351\342\206\351\350\206\351\356\206\351\364\206\257?\205\351\372\205\351\372\206\352\000\205\352\000\206\352\006\206\257D\205\352\014\206\351\270\205\257I\205\257N\205\257S\205\257X\204\352\030\205\352\022\206\352\030\206\352\036\205\352\036\206\352$\206\257X\205\352*\205\352*\206\3520\206\3526\206\352<\206\352B\206\352H\206\352N\206\257]\205\352T\205\352T\206\352Z\205\352Z\206\352`\206\257b\205\352f\206\352\022\205\257g\205\257l\205\257q\205\257v\204\352r\205\352l\206\352r\206\352x\205\352x\206\352~\206\257v\205\352\204\205\352\204\206\352\212\206\352\220\206\352\226\206\352\234\206\352\242\206\352\250\206\257{\205\352\256\205\352\256\206\352\264\205\352\264\206\352\272\206\257\200\205\352\300\206"; -static const char b0ce[769] = "\377\352l\205\257\205\205\257\212\205\257\217\205\257\224\204\352\314\205\352\306\206\352\314\206\352\322\205\352\322\206\352\330\206\257\224\205\352\336\205\352\336\206\352\344\206\352\352\206\352\360\206\352\366\206\352\374\206\353\002\206\257\231\205\353\010\205\353\010\206\353\016\205\353\016\206\353\024\206\257\236\205\353\032\206\352\306\205\257\243\205\257\250\205\257\255\205\257\262\204\353&\205\353 \206\353&\206\353,\205\353,\206\3532\206\257\262\205\3538\205\3538\206\353>\206\353D\206\353J\206\353P\206\353V\206\353\134\206\257\267\205\353b\205\353b\206\353h\205\353h\206\353n\206\257\274\205\353t\206\353 \205\257\301\205\257\306\205\257\313\205\257\320\204\353\200\205\353z\206\353\200\206\353\206\205\353\206\206\353\214\206\257\320\205\353\222\205\353\222\206\353\230\206\353\236\206\353\244\206\353\252\206\353\260\206\353\266\206\257\325\205\353\274\205\353\274\206\353\302\205\353\302\206\353\310\206\257\332\205\353\316\206\353z\205\257\337\205\257\344\205\257\351\205Chi\257\363\204\257\356\205\257\363\205\257\370\204\257\370\205\257\375\205*\001\204\260\002\204\260\002\205\260\007\205\260\014\205\260\021\205\260\026\205\260\033\205\260 \205*\005\204\260%\204\260%\205\260*\204\260*\205\260/\205*\011\204\2604\205\257\356\204*\015\204*\021\204*\025\204Ka\202Kag*\031\204*\035\204Kan*!\204*%\204KadKal*)\204*-\204*1\204*5\204*9\204*=\204*A\204KamKab*E\204Kas*I\204\007\014\204Kaj*M\204KakKatKapKahKae\260>\204\2609\205\260>\205\260C\204\260C\205\260H\205*Q\204\260M\204\260M\205\260R\205\260W\205\260\134\205\260a\205\260f\205\260k\205*U\204\260p\204\260p\205\260u\204\260u\205\260z\205*Y\204\260\177\205\2609\204*]\204*a\204*e\204Kya\260\211\204\260\204\205\260\211\205\260\216\204\260\216\205\260\223\205*i\204\260\230\204\260\230\205\260\235\205\260\242\205\260\247\205\260\254\205\260\261\205\260\266\205*m\204\260\273\204\260\273\205\260\300\204\260\300\205\260\305\205*q\204\260\312\205\260\204\204*u\204*y\204*}\204\260\317\204\353\332\205\353\324\206\353\332\206\353\340\205\353\340\206\353\346\206\260\317\205\353\354\205\353\354\206\353\362\206\353\370\206\353\376\206\354\004\206\354\012\206\354\020\206\260\324\205\354\026\205\354\026\206\354\034\205\354\034\206\354\042\206\260\331\205\354(\206\353\324\205\260\336\205\260\343\205\260\350\205Keo\260\355\204{\351\205\260\355\205\260\362\204\260\362\205\260\367\205*\201\204\260\374\204\260\374\205\261\001\205\261\006\205\261\013\205\261\020\205\261\025\205\261\032\205*\205\204\261\037\204\261\037\205\261$\204\261$\205\261)\205*\211\204\261.\205{\351\204*\215\204*\221\204*\225\204"; -static const char b0cf[769] = "\377Ke\202Keg*\231\204*\235\204Ken*\241\204*\245\204KedKel*\251\204*\255\204*\261\204*\265\204*\271\204*\275\204*\301\204KemKeb*\305\204Kes*\311\204\007\243\204Kej*\315\204KekKetKepKeh\2613\204\3544\205\354.\206\3544\206\354:\205\354:\206\354@\206\2613\205\354F\205\354F\206\354L\206\354R\206\354X\206\354^\206\354d\206\354j\206\2618\205\354p\205\354p\206\354v\205\354v\206\354|\206\261=\205\354\202\206\354.\205\261B\205\261G\205\261L\205Kye\261V\204\261Q\205\261V\205\261[\204\261[\205\261`\205*\321\204\261e\204\261e\205\261j\205\261o\205\261t\205\261y\205\261~\205\261\203\205*\325\204\261\210\204\261\210\205\261\215\204\261\215\205\261\222\205*\331\204\261\227\205\261Q\204*\335\204*\341\204*\345\204Ko\202Kog*\351\204*\355\204Kon*\361\204*\365\204KodKol*\371\204*\375\204+\001\204+\005\204+\011\204+\015\204+\021\204KomKob+\025\204Kos+\031\204\006\237\204Koj+\035\204KokKotKopKohKwa\261\241\204\261\234\205\261\241\205\261\246\204\261\246\205\261\253\205+!\204\261\260\204\261\260\205\261\265\205\261\272\205\261\277\205\261\304\205\261\311\205\261\316\205+%\204\261\323\204\261\323\205\261\330\204\261\330\205\261\335\205+)\204\261\342\205\261\234\204+-\204+1\204+5\204\261\347\204\354\216\205\354\210\206\354\216\206\354\224\205\354\224\206\354\232\206\261\347\205\354\240\205\354\240\206\354\246\206\354\254\206\354\262\206\354\270\206\354\276\206\354\304\206\261\354\205\354\312\205\354\312\206\354\320\205\354\320\206\354\326\206\261\361\205\354\334\206\354\210\205\261\366\205\261\373\205\262\000\205Koe\262\012\204\262\005\205\262\012\205{\315\204\262\017\205\262\024\205+9\204\262\031\204\262\031\205\262\036\205\262#\205\262(\205\262-\205\2622\205\2627\205+=\204\262<\204\262<\205\262A\204\262A\205{\315\205+A\204\262F\205\262\005\204+E\204+I\204+M\204Kyo\262P\204\262K\205\262P\205\262U\204\262U\205\262Z\205+Q\204\262_\204\262_\205\262d\205\262i\205\262n\205\262s\205\262x\205\262}\205+U\204\262\202\204\262\202\205\262\207\204\262\207\205\262\214\205+Y\204\262\221\205\262K\204+]\204+a\204+e\204Ku\202Kug+i\204+m\204Kun+q\204+u\204KudKul+y\204+}\204+\201\204+\205\204+\211\204+\215\204+\221\204KumKub+\225\204Kus+\231\204\016\203\204Kuj+\235\204KukKutKupKuhKwo\262\233\204\262\226\205\262\233\205"; -static const char b0d0[769] = "\377\262\240\204\262\240\205\262\245\205+\241\204\262\252\204\262\252\205\262\257\205\262\264\205\262\271\205\262\276\205\262\303\205\262\310\205+\245\204\262\315\204\262\315\205\262\322\204\262\322\205\262\327\205+\251\204\262\334\205\262\226\204+\255\204+\261\204+\265\204Kwe\262\346\204\262\341\205\262\346\205\262\353\204\262\353\205\262\360\205+\271\204\262\365\204\262\365\205\262\372\205\262\377\205\263\004\205\263\011\205\263\016\205\263\023\205+\275\204\263\030\204\263\030\205\263\035\204\263\035\205\263\042\205+\301\204\263'\205\262\341\204+\305\204+\311\204+\315\204Kwi\2631\204\263,\205\2631\205\2636\204\2636\205\263;\205+\321\204\263@\204\263@\205\263E\205\263J\205\263O\205\263T\205\263Y\205\263^\205+\325\204\263c\204\263c\205\263h\204\263h\205\263m\205+\331\204\263r\205\263,\204+\335\204+\341\204+\345\204Kyu\263|\204\263w\205\263|\205\263\201\204\263\201\205\263\206\205+\351\204\263\213\204\263\213\205\263\220\205\263\225\205\263\232\205\263\237\205\263\244\205\263\251\205+\355\204\263\256\204\263\256\205\263\263\204\263\263\205\263\270\205+\361\204\263\275\205\263w\204\006~\204+\365\204+\371\204Keu\263\307\204\263\302\205\263\307\205\263\314\204\263\314\205\263\321\205+\375\204\263\326\204\263\326\205\263\333\205\263\340\205\263\345\205\263\352\205\263\357\205\263\364\205,\001\204\263\371\204\263\371\205\263\376\204\263\376\205\264\003\205,\005\204\264\010\205\263\302\204,\011\204,\015\204,\021\204Kui\264\022\204\264\015\205\264\022\205\264\027\204\264\027\205\264\034\205,\025\204\264!\204\264!\205\264&\205\264+\205\2640\205\2645\205\264:\205\264?\205,\031\204\264D\204\264D\205\264I\204\264I\205\264N\205,\035\204\264S\205\264\015\204,!\204,%\204,)\204Ki\202Kig,-\204,1\204Kin,5\204,9\204KidKil,=\204,A\204,E\204,I\204,M\204,Q\204,U\204KimKib,Y\204Kis,]\204,a\204Kij,e\204KikKitKipKihTa\202Tag,i\204,m\204Tan,q\204,u\204TadTal,y\204,}\204,\201\204,\205\204,\211\204,\215\204,\221\204TamTab,\225\204Tas,\231\204\005!\204Taj,\235\204TakTatTapTahTae\264]\204\264X\205\264]\205\264b\204\264b\205\264g\205,\241\204\264l\204\264l\205\264q\205\264v\205\264{\205\264\200\205\264\205\205\264\212\205,\245\204\264\217\204\264\217\205\264\224\204\264\224\205\264\231\205,\251\204\264\236\205\264X\204,\255\204,\261\204,\265\204Tya\264\250\204\264\243\205\264\250\205\264\255\204\264\255\205\264\262\205,\271\204"; -static const char b0d1[769] = "\377\264\267\204\264\267\205\264\274\205\264\301\205\264\306\205\264\313\205\264\320\205\264\325\205,\275\204\264\332\204\264\332\205\264\337\204\264\337\205\264\344\205,\301\204\264\351\205\264\243\204,\305\204,\311\204,\315\204\264\356\204\354\350\205\354\342\206\354\350\206\354\356\205\354\356\206\354\364\206\264\356\205\354\372\205\354\372\206\355\000\206\355\006\206\355\014\206\355\022\206\355\030\206\355\036\206\264\363\205\355$\205\355$\206\355*\205\355*\206\3550\206\264\370\205\3556\206\354\342\205\264\375\205\265\002\205\265\007\205Teo\265\021\204\265\014\205\265\021\205\265\026\204\265\026\205\265\033\205,\321\204\265 \204\265 \205\265%\205\265*\205\265/\205\2654\205\2659\205\265>\205,\325\204\265C\204\265C\205\265H\204\265H\205\265M\205,\331\204\265R\205\265\014\204,\335\204,\341\204,\345\204Te\202Teg,\351\204,\355\204Ten,\361\204,\365\204TedTel,\371\204,\375\204-\001\204-\005\204-\011\204-\015\204-\021\204TemTeb-\025\204Tes-\031\204\005\326\204Tej-\035\204TekTetTepTeh\265W\204\355B\205\355<\206\355B\206\355H\205\355H\206\355N\206\265W\205\355T\205\355T\206\355Z\206\355`\206\355f\206\355l\206\355r\206\355x\206\265\134\205\355~\205\355~\206\355\204\205\355\204\206\355\212\206\265a\205\355\220\206\355<\205\265f\205\265k\205\265p\205Tye\265z\204\265u\205\265z\205\265\177\204\265\177\205\265\204\205-!\204\265\211\204\265\211\205\265\216\205\265\223\205\265\230\205\265\235\205\265\242\205\265\247\205-%\204\265\254\204\265\254\205\265\261\204\265\261\205\265\266\205-)\204\265\273\205\265u\204--\204-1\204-5\204To\202Tog-9\204-=\204Ton-A\204-E\204TodTol-I\204-M\204-Q\204-U\204-Y\204-]\204-a\204TomTob-e\204Tos-i\204\3628\204Toj-m\204TokTotTopTohTwa\265\305\204\265\300\205\265\305\205\265\312\204\265\312\205\265\317\205-q\204\265\324\204\265\324\205\265\331\205\265\336\205\265\343\205\265\350\205\265\355\205\265\362\205-u\204\265\367\204\265\367\205\265\374\204\265\374\205\266\001\205-y\204\266\006\205\265\300\204-}\204-\201\204-\205\204\266\013\204\355\234\205\355\226\206\355\234\206\355\242\205\355\242\206\355\250\206\266\013\205\355\256\205\355\256\206\355\264\206\355\272\206\355\300\206\355\306\206\355\314\206\355\322\206\266\020\205\355\330\205\355\330\206\355\336\205\355\336\206\355\344\206\266\025\205\355\352\206\355\226\205\266\032\205\266\037\205\266$\205Toe\266.\204\266)\205\266.\205\2663\204\2663\205\2668\205-\211\204\266=\204\266=\205\266B\205\266G\205"; -static const char b0d2[769] = "\377\266L\205\266Q\205\266V\205\266[\205-\215\204\266`\204\266`\205\266e\204\266e\205\266j\205-\221\204\266o\205\266)\204-\225\204-\231\204-\235\204Tyo\266y\204\266t\205\266y\205\266~\204\266~\205\266\203\205-\241\204\266\210\204\266\210\205\266\215\205\266\222\205\266\227\205\266\234\205\266\241\205\266\246\205-\245\204\266\253\204\266\253\205\266\260\204\266\260\205\266\265\205-\251\204\266\272\205\266t\204-\255\204-\261\204-\265\204Tu\202Tug-\271\204-\275\204Tun-\301\204-\305\204TudTul-\311\204-\315\204-\321\204-\325\204-\331\204-\335\204-\341\204TumTub-\345\204Tus-\351\204\005\375\204Tuj-\355\204TukTutTupTuhTwo\266\304\204\266\277\205\266\304\205\266\311\204\266\311\205\266\316\205-\361\204\266\323\204\266\323\205\266\330\205\266\335\205\266\342\205\266\347\205\266\354\205\266\361\205-\365\204\266\366\204\266\366\205\266\373\204\266\373\205\267\000\205-\371\204\267\005\205\266\277\204-\375\204.\001\204.\005\204Twe\267\017\204\267\012\205\267\017\205\267\024\204\267\024\205\267\031\205.\011\204\267\036\204\267\036\205\267#\205\267(\205\267-\205\2672\205\2677\205\267<\205.\015\204\267A\204\267A\205\267F\204\267F\205\267K\205.\021\204\267P\205\267\012\204.\025\204.\031\204.\035\204Twi\267Z\204\267U\205\267Z\205\267_\204\267_\205\267d\205.!\204\267i\204\267i\205\267n\205\267s\205\267x\205\267}\205\267\202\205\267\207\205.%\204\267\214\204\267\214\205\267\221\204\267\221\205\267\226\205.)\204\267\233\205\267U\204.-\204.1\204.5\204Tyu\267\245\204\267\240\205\267\245\205\267\252\204\267\252\205\267\257\205.9\204\267\264\204\267\264\205\267\271\205\267\276\205\267\303\205\267\310\205\267\315\205\267\322\205.=\204\267\327\204\267\327\205\267\334\204\267\334\205\267\341\205.A\204\267\346\205\267\240\204.E\204.I\204.M\204Teu\267\360\204\267\353\205\267\360\205\267\365\204\267\365\205\267\372\205.Q\204\267\377\204\267\377\205\270\004\205\270\011\205\270\016\205\270\023\205\270\030\205\270\035\205.U\204\270\042\204\270\042\205\270'\204\270'\205\270,\205.Y\204\2701\205\267\353\204.]\204.a\204.e\204Tui\270;\204\2706\205\270;\205\270@\204\270@\205\270E\205.i\204\270J\204\270J\205\270O\205\270T\205\270Y\205\270^\205\270c\205\270h\205.m\204\270m\204\270m\205\270r\204\270r\205\270w\205.q\204\270|\205\2706\204.u\204.y\204.}\204Ti\202Tig.\201\204.\205\204Tin.\211\204.\215\204TidTil.\221\204.\225\204.\231\204.\235\204.\241\204.\245\204.\251\204"; -static const char b0d3[769] = "\377TimTib.\255\204Tis.\261\204\005P\204Tij.\265\204TikTitTipTihPa\202Pag.\271\204.\275\204Pan.\301\204.\305\204PadPal.\311\204.\315\204.\321\204.\325\204.\331\204.\335\204.\341\204PamPab.\345\204Pas.\351\204\003\247\204Paj.\355\204PakPatPapPahPae\270\206\204\270\201\205\270\206\205\270\213\204\270\213\205\270\220\205.\361\204\270\225\204\270\225\205\270\232\205\270\237\205\270\244\205\270\251\205\270\256\205\270\263\205.\365\204\270\270\204\270\270\205\270\275\204\270\275\205\270\302\205.\371\204\270\307\205\270\201\204.\375\204/\001\204/\005\204Pya\270\321\204\270\314\205\270\321\205\270\326\204\270\326\205\270\333\205/\011\204\270\340\204\270\340\205\270\345\205\270\352\205\270\357\205\270\364\205\270\371\205\270\376\205/\015\204\271\003\204\271\003\205\271\010\204\271\010\205\271\015\205/\021\204\271\022\205\270\314\204/\025\204/\031\204/\035\204\271\027\204\355\366\205\355\360\206\355\366\206\355\374\205\355\374\206\356\002\206\271\027\205\356\010\205\356\010\206\356\016\206\356\024\206\356\032\206\356 \206\356&\206\356,\206\271\034\205\3562\205\3562\206\3568\205\3568\206\356>\206\271!\205\356D\206\355\360\205\271&\205\271+\205\2710\205Peo\271:\204\2715\205\271:\205\271?\204\271?\205\271D\205/!\204\271I\204\271I\205\271N\205\271S\205\271X\205\271]\205\271b\205\271g\205/%\204\271l\204\271l\205\271q\204\271q\205\271v\205/)\204\271{\205\2715\204/-\204/1\204/5\204Pe\202Peg/9\204/=\204Pen/A\204/E\204PedPel/I\204/M\204/Q\204/U\204/Y\204/]\204/a\204PemPeb/e\204Pes/i\204\006\260\204Pej/m\204PekPetPepPeh\271\200\204\356P\205\356J\206\356P\206\356V\205\356V\206\356\134\206\271\200\205\356b\205\356b\206\356h\206\356n\206\356t\206\356z\206\356\200\206\356\206\206\271\205\205\356\214\205\356\214\206\356\222\205\356\222\206\356\230\206\271\212\205\356\236\206\356J\205\271\217\205\271\224\205\271\231\205Pye\271\243\204\271\236\205\271\243\205\271\250\204\271\250\205\271\255\205/q\204\271\262\204\271\262\205\271\267\205\271\274\205\271\301\205\271\306\205\271\313\205\271\320\205/u\204\271\325\204\271\325\205\271\332\204\271\332\205\271\337\205/y\204\271\344\205\271\236\204/}\204/\201\204/\205\204Po\202Pog/\211\204/\215\204Pon/\221\204/\225\204PodPol/\231\204/\235\204/\241\204/\245\204/\251\204/\255\204/\261\204PomPob/\265\204Pos"; -static const char b0d4[769] = "\377/\271\204/\275\204Poj/\301\204PokPotPopPohPwa\271\356\204\271\351\205\271\356\205\271\363\204\271\363\205\271\370\205/\305\204\271\375\204\271\375\205\272\002\205\272\007\205\272\014\205\272\021\205\272\026\205\272\033\205/\311\204\272 \204\272 \205\272%\204\272%\205\272*\205/\315\204\272/\205\271\351\204/\321\204/\325\204/\331\204\2724\204\356\252\205\356\244\206\356\252\206\356\260\205\356\260\206\356\266\206\2724\205\356\274\205\356\274\206\356\302\206\356\310\206\356\316\206\356\324\206\356\332\206\356\340\206\2729\205\356\346\205\356\346\206\356\354\205\356\354\206\356\362\206\272>\205\356\370\206\356\244\205\272C\205\272H\205\272M\205Poe\272W\204\272R\205\272W\205\272\134\204\272\134\205\272a\205/\335\204\272f\204\272f\205\272k\205\272p\205\272u\205\272z\205\272\177\205\272\204\205/\341\204\272\211\204\272\211\205\272\216\204\272\216\205\272\223\205/\345\204\272\230\205\272R\204/\351\204/\355\204/\361\204Pyo\272\242\204\272\235\205\272\242\205\272\247\204\272\247\205\272\254\205/\365\204\272\261\204\272\261\205\272\266\205\272\273\205\272\300\205\272\305\205\272\312\205\272\317\205/\371\204\272\324\204\272\324\205\272\331\204\272\331\205\272\336\205/\375\204\272\343\205\272\235\2040\001\2040\005\2040\011\204Pu\202Pug0\015\2040\021\204Pun0\025\2040\031\204PudPul0\035\2040!\2040%\2040)\2040-\20401\20405\204PumPub09\204Pus0=\2040A\204Puj0E\204PukPutPupPuhPwo\272\355\204\272\350\205\272\355\205\272\362\204\272\362\205\272\367\2050I\204\272\374\204\272\374\205\273\001\205\273\006\205\273\013\205\273\020\205\273\025\205\273\032\2050M\204\273\037\204\273\037\205\273$\204\273$\205\273)\2050Q\204\273.\205\272\350\2040U\2040Y\2040]\204Pwe\2738\204\2733\205\2738\205\273=\204\273=\205\273B\2050a\204\273G\204\273G\205\273L\205\273Q\205\273V\205\273[\205\273`\205\273e\2050e\204\273j\204\273j\205\273o\204\273o\205\273t\2050i\204\273y\205\2733\2040m\2040q\2040u\204Pwi\273\203\204\273~\205\273\203\205\273\210\204\273\210\205\273\215\2050y\204\273\222\204\273\222\205\273\227\205\273\234\205\273\241\205\273\246\205\273\253\205\273\260\2050}\204\273\265\204\273\265\205\273\272\204\273\272\205\273\277\2050\201\204\273\304\205\273~\2040\205\2040\211\2040\215\204Pyu\273\316\204\273\311\205\273\316\205\273\323\204\273\323\205\273\330\2050\221\204\273\335\204\273\335\205\273\342\205\273\347\205\273\354\205\273\361\205\273\366\205\273\373\2050\225\204\274\000\204\274\000\205\274\005\204\274\005\205\274\012\2050\231\204\274\017\205"; -static const char b0d5[769] = "\377\273\311\2040\235\2040\241\2040\245\204Peu\274\031\204\274\024\205\274\031\205\274\036\204\274\036\205\274#\2050\251\204\274(\204\274(\205\274-\205\2742\205\2747\205\274<\205\274A\205\274F\2050\255\204\274K\204\274K\205\274P\204\274P\205\274U\2050\261\204\274Z\205\274\024\2040\265\2040\271\2040\275\204Pui\274d\204\274_\205\274d\205\274i\204\274i\205\274n\2050\301\204\274s\204\274s\205\274x\205\274}\205\274\202\205\274\207\205\274\214\205\274\221\2050\305\204\274\226\204\274\226\205\274\233\204\274\233\205\274\240\2050\311\204\274\245\205\274_\2040\315\2040\321\2040\325\204Pi\202Pig0\331\2040\335\204Pin0\341\2040\345\204PidPil0\351\2040\355\2040\361\2040\365\2040\371\2040\375\2041\001\204PimPib1\005\204Pis1\011\204\0102\204Pij1\015\204PikPitPipPihHa\202Hag1\021\2041\025\204Han1\031\2041\035\204HadHal1!\2041%\2041)\2041-\20411\20415\20419\204HamHab1=\204Has1A\204\004\272\204Haj1E\204HakHatHapHahHae\274\257\204\274\252\205\274\257\205\274\264\204\274\264\205\274\271\2051I\204\274\276\204\274\276\205\274\303\205\274\310\205\274\315\205\274\322\205\274\327\205\274\334\2051M\204\274\341\204\274\341\205\274\346\204\274\346\205\274\353\2051Q\204\274\360\205\274\252\2041U\2041Y\2041]\204Hya\274\372\204\274\365\205\274\372\205\274\377\204\274\377\205\275\004\2051a\204\275\011\204\275\011\205\275\016\205\275\023\205\275\030\205\275\035\205\275\042\205\275'\2051e\204\275,\204\275,\205\2751\204\2751\205\2756\2051i\204\275;\205\274\365\2041m\2041q\2041u\204\275@\204\357\004\205\356\376\206\357\004\206\357\012\205\357\012\206\357\020\206\275@\205\357\026\205\357\026\206\357\034\206\357\042\206\357(\206\357.\206\3574\206\357:\206\275E\205\357@\205\357@\206\357F\205\357F\206\357L\206\275J\205\357R\206\356\376\205\275O\205\275T\205\275Y\205Heo\275c\204\275^\205\275c\205\275h\204\275h\205\275m\2051y\204\275r\204\275r\205\275w\205\275|\205\275\201\205\275\206\205\275\213\205\275\220\2051}\204\275\225\204\275\225\205\275\232\204\275\232\205\275\237\2051\201\204\275\244\205\275^\2041\205\2041\211\2041\215\204He\202Heg1\221\2041\225\204Hen1\231\2041\235\204HedHel1\241\2041\245\2041\251\2041\255\2041\261\2041\265\2041\271\204HemHeb1\275\204Hes1\301\204\005\313\204Hej1\305\204HekHetHepHeh"; -static const char b0d6[769] = "\377\275\251\204\357^\205\357X\206\357^\206\357d\205\357d\206\357j\206\275\251\205\357p\205\357p\206\357v\206\357|\206\357\202\206\357\210\206\357\216\206\357\224\206\275\256\205\357\232\205\357\232\206\357\240\205\357\240\206\357\246\206\275\263\205\357\254\206\357X\205\275\270\205\275\275\205\275\302\205Hye\275\314\204\275\307\205\275\314\205\275\321\204\275\321\205\275\326\2051\311\204\275\333\204\275\333\205\275\340\205\275\345\205\275\352\205\275\357\205\275\364\205\275\371\2051\315\204\275\376\204\275\376\205\276\003\204\276\003\205\276\010\2051\321\204\276\015\205\275\307\2041\325\2041\331\2041\335\204Ho\202Hog1\341\2041\345\204Hon1\351\2041\355\204HodHol1\361\2041\365\2041\371\2041\375\2042\001\2042\005\2042\011\204HomHob2\015\204Hos2\021\204\005\335\204Hoj2\025\204HokHotHopHohHwa\276\027\204\276\022\205\276\027\205\276\034\204\276\034\205\276!\2052\031\204\276&\204\276&\205\276+\205\2760\205\2765\205\276:\205\276?\205\276D\2052\035\204\276I\204\276I\205\276N\204\276N\205\276S\2052!\204\276X\205\276\022\2042%\2042)\2042-\204\276]\204\357\270\205\357\262\206\357\270\206\357\276\205\357\276\206\357\304\206\276]\205\357\312\205\357\312\206\357\320\206\357\326\206\357\334\206\357\342\206\357\350\206\357\356\206\276b\205\357\364\205\357\364\206\357\372\205\357\372\206\360\000\206\276g\205\360\006\206\357\262\205\276l\205\276q\205\276v\205Hoe\276\200\204\276{\205\276\200\205{\264\204\276\205\205\276\212\20521\204\276\217\204\276\217\205\276\224\205\276\231\205\276\236\205\276\243\205\276\250\205\276\255\20525\204\276\262\204\276\262\205\276\267\204\276\267\205{\264\20529\204\276\274\205\276{\2042=\2042A\2042E\204Hyo\276\306\204\276\301\205\276\306\205\276\313\204\276\313\205\276\320\2052I\204\276\325\204\276\325\205\276\332\205\276\337\205\276\344\205\276\351\205\276\356\205\276\363\2052M\204\276\370\204\276\370\205\276\375\204\276\375\205\277\002\2052Q\204\277\007\205\276\301\2042U\2042Y\2042]\204Hu\202Hug2a\2042e\204Hun2i\2042m\204HudHul2q\2042u\2042y\2042}\2042\201\2042\205\2042\211\204HumHub2\215\204Hus2\221\204\005\204\204Huj2\225\204HukHutHupHuhHwo\277\021\204\277\014\205\277\021\205\277\026\204\277\026\205\277\033\2052\231\204\277 \204\277 \205\277%\205\277*\205\277/\205\2774\205\2779\205\277>\2052\235\204\277C\204\277C\205\277H\204\277H\205\277M\2052\241\204\277R\205\277\014\2042\245\2042\251\2042\255\204Hwe\277\134\204\277W\205\277\134\205"; -static const char b0d7[757] = "\373\277a\204\277a\205\277f\2052\261\204\277k\204\277k\205\277p\205\277u\205\277z\205\277\177\205\277\204\205\277\211\2052\265\204\277\216\204\277\216\205\277\223\204\277\223\205\277\230\2052\271\204\277\235\205\277W\2042\275\2042\301\2042\305\204Hwi\277\247\204\277\242\205\277\247\205\277\254\204\277\254\205\277\261\2052\311\204\277\266\204\277\266\205\277\273\205\277\300\205\277\305\205\277\312\205\277\317\205\277\324\2052\315\204\277\331\204\277\331\205\277\336\204\277\336\205\277\343\2052\321\204\277\350\205\277\242\2042\325\2042\331\2042\335\204Hyu\277\362\204\277\355\205\277\362\205\277\367\204\277\367\205\277\374\2052\341\204\300\001\204\300\001\205\300\006\205\300\013\205\300\020\205\300\025\205\300\032\205\300\037\2052\345\204\300$\204\300$\205\300)\204\300)\205\300.\2052\351\204\3003\205\277\355\2042\355\2042\361\2042\365\204Heu\300=\204\3008\205\300=\205\300B\204\300B\205\300G\2052\371\204\300L\204\300L\205\300Q\205\300V\205\300[\205\300`\205\300e\205\300j\2052\375\204\300o\204\300o\205\300t\204\300t\205\300y\2053\001\204\300~\205\3008\2043\005\2043\011\2043\015\204Hui\300\210\204\300\203\205\300\210\205\300\215\204\300\215\205\300\222\2053\021\204\300\227\204\300\227\205\300\234\205\300\241\205\300\246\205\300\253\205\300\260\205\300\265\2053\025\204\300\272\204\300\272\205\300\277\204\300\277\205\300\304\2053\031\204\300\311\205\300\203\2043\035\2043!\2043%\204Hi\202Hig\017\244\2043)\204Hin3-\20431\204HidHil35\20439\2043=\2043A\2043E\2043I\2043M\204HimHib3Q\204His3U\204\004\340\204Hij3Y\204HikHitHipHih\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\016q\204ooiyoa\002\301\204\002\340\204\013\336\204uii\006V\204yuoeua\000\007\204eueeuo\000I\204\000^\204\000\202\204iyeioiiyoiyuii\202oa\202oe\202\000\000\200\000\000\200\000\000\200\000\000\200nl\202nchtt\202ttbdb\202ds\202dsgdj\202dchdt\202lkklghllklmhlbdlbplnglqhlh\202mn\202mnnmm\202mbsmj\202bd\202blpbm\202pp\202bsdbj\202bchsm\202sv\202ssgssdsz\202sj\202schst\202sh\202zb\202zv\202ngmnghjb\202jppjj\202ps\202pt\202"; -static const char b0f9[769] = "\377Gae|\232\205GeoGo\202Gol{\334\204GwiGwi\177\227\204\177\354\204\021\324\204Na\202Na\202Na\202Na\202Na\202Na\202Na\202Na\202Na\202NagNagNagNagNagNagNagNanNanNanNanNanNanNamNamNamNamNabNabNab\003\031\204\006\220\204\006\220\204\006\220\204\006\220\204Nae\203\254\205No\202No\202No\202No\202No\202No\202No\202LouNo\202No\202No\202No\202NogNogNogNogNogNogNon\010M\204\010M\204\010M\204\010M\204NoeNoeNoeNoeNu\202Nu\202Nu\202Nu\202Nu\202Nu\202Nu\202Nu\202\207\003\204\207\003\204\025\276\204\207?\205\207?\205\207?\205\207?\205\207?\205Du\202La\202LagLagLan\323>\206Lo\202\222\021\204Li\202Bae\227\305\204\325\030\205Bu\202BulBi\202SagSagSam\2362\204\236n\205\237\030\204Se\202\237\340\204SinSimSibYa\202YagYag\360\350\204\360\350\204\360\350\204\360\350\204\360\350\204\360\350\204\360\350\204\360\350\204YeoYeoYeoYeoYeoYeoYeoYeoYeoYeoYeo\245\236\204\245\236\204\245\236\204\245\236\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\243\204\245\255\204\245\255\204\245\255\204\245\255\204\245\255\204\245\255\204$y\204$y\204$y\204$y\204$y\204\245\320\204\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205\245\332\205Ye\202Ye\202Ye\202Ye\202O\000\201Yo\202Yo\202Yo\202Yo\202Yo\202Yo\202Yo\202Yo\202Yo\202Yo\202\003]\204Un\202WonYu\202Yu\202Yu\202Yu\202Yu\202Yu\202Yu\202Yu\202Yu\202Yu\202YugYugYugYunYunYunYunYulYulYulYul&a\204I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201I\000\201Ig\202Ig\202In\202In\202In\202In\202In\202In\202In\202Im\202Im\202Im\202Ib\202Ib\202Ib\202'\021\204\246\350\204Ji\202JibCha\347\264\205"; -static const char b0fa[655] = "\331CheTagTag\005!\204\264]\204\3628\204Po\202Pog\004\272\204\004\272\204\357d\205\276\027\204\300\316\2053]\204\000\000\200Coc\004\320\204Ki\202Sei\000\000\200\000\000\200Ki\202ChoJikLi\2023a\204\002M\2043e\204SeiSeiU\000\201\000\000\2003i\204SenSho\000\000\200Gap3m\204To\202\000\000\200\000\000\200\000\000\200HanShiKan3]\204\006\220\204Ye\202Wu\202\010\356\204\003+\204\003+\204QinBeiHe\202TanQi\202\0102\204Mo\202\007\177\204CheHuiKai\010\243\204{x\205MinJi\202ShuMeiHaiZhuHanZhu\002\376\204ZuoBeiSheZhiQi\202YouZu\202ZhuHuo{Z\204Gu\202Tu\202Jie{\207\204JinFanShuZhe\004\320\204CaoCaoZheHe\202ShiYe\202JinBin\010\243\204\301\321\204Yi\202Nanz\374\205PinHuiHei{\012\204\000\000\200\000\000\200\002\354\204{\202\205\301\357\204\003g\204z\367\205Ji\202\003]\204\360\366\204He\202TaoHuiWa\202\362?\205FenYanBenBi\202Ci\202Ao\202Yi\202CaiYao\305`\204\371\260\204Yu\202\010\243\204Ao\202{x\205DaiYu\202Sou\002\354\204Ao\202\003\006\204\005\230\204\305`\204{\221\205DaiShaLiuYinZi\202Han\0050\204Zhu\006\214\204JueFanZhu{Z\204Ci\202Hua{\012\204WenYi\202\371\260\205Zhi\007q\204Zhe|\015\204\007\036\204JieLeiTao{\207\204\0102\204Zhez\362\205HuaYunz\350\205Fu\202Shi\005,\204Zhu\003\006\204Ye\202NuoYu\202Jin\303\362\204\010\243\204ShuChiSou\003g\204ZhuNan\0050\204Baiz\374\205E\000\201Pin{Z\204Gui\000\000\200\000\000\200\000\000\200He\202XieJie\000\000\200z\350\204\005\005\204E\000\201\003\247\204"; -static const char b0fb[769] = "\377ff\202fi\202fl\202ffifflst\202st\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200mn\202me\202mi\202vn\202mkh\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201\000\000\200ay\202'\000\201'\000\201d\000\201h\000\201kh\202l\000\201m\000\201r\000\201t\000\201+\000\201sh\202s\000\201sh\202ss\202a\000\201o\000\201'\000\201b\000\201g\000\201d\000\201h\000\201u\000\201zz\202\000\000\200tt\202yy\202k\000\201k\000\201ll\202\000\000\200mm\202\000\000\200nn\202ss\202\000\000\200p\000\201p\000\201\000\000\200ts\202kk\202rr\202ss\202t\000\201o\000\201v\000\201kh\202f\000\201'l\202'\000\201'\000\201b\000\201b\000\201b\000\201b\000\201p\000\201p\000\201p\000\201p\000\201bh\202bh\202bh\202bh\202th\202th\202th\202th\202th\202th\202th\202th\202t\000\201t\000\201t\000\201t\000\201v\000\201v\000\201v\000\201v\000\201ph\202ph\202ph\202ph\202j\000\201j\000\201j\000\201j\000\201n\000\201n\000\201n\000\201n\000\201ch\202ch\202ch\202ch\202ch\202ch\202ch\202ch\202dh\202dh\202dh\202dh\202dh\202dh\202d\000\201d\000\201zh\202zh\202r\000\201r\000\201k\000\201k\000\201k\000\201k\000\201g\000\201g\000\201g\000\201g\000\201g\000\201g\000\201g\000\201g\000\201n\000\201n\000\201n\000\201n\000\201n\000\201n\000\201n\000\201n\000\201n\000\201n\000\201e\000\201e\000\201h\000\201h\000\201h\000\201h\000\201h\000\201h\000\201h\000\201h\000\201e\000\201e\000\201e'\202e'\202.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201t\000\201t\000\201'\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ng\202ng\202ng\202ng\202u\000\201u\000\201o\000\201o\000\201u\000\201u\000\201u\000\201v\000\201v\000\201o\000\201o\000\201u\000\201u\000\201e\000\201e\000\201e\000\201e\000\201a\000\201a\000\201i'ai'ai'ei'ei'wi'wi'ui'ui'oi'oi'ui'ui'ei'ei'ei'ai'ai'ay\000\201y\000\201y\000\201y\000\201"; -static const char b0fc[769] = "\377i'ji'hi'mi'ai'ybj\202bh\202bkhbm\202ba\202by\202tj\202th\202tkhtm\202ta\202ty\202thjthmthathyjh\202jm\202hj\202hm\202khjkhhkhmsj\202sh\202skhsm\202sh\202sm\202dj\202dh\202dkhdm\202th\202tm\202dhm`j\202`m\202ghjghmfj\202fh\202fkhfm\202fa\202fy\202qh\202qm\202qa\202qy\202ka\202kj\202kh\202kkhkl\202km\202ka\202ky\202lj\202lh\202lkhlm\202la\202ly\202mj\202mh\202mkhmm\202ma\202my\202nj\202nh\202nkhnm\202na\202ny\202hj\202hm\202ha\202hy\202yj\202yh\202ykhym\202ya\202yy\202dhara\202aa\202un-in-a-\202u-\202i-\202-a\202i'ri'zi'mi'ni'ai'ybr\202bz\202bm\202bn\202ba\202by\202tr\202tz\202tm\202tn\202ta\202ty\202thrthzthmthnthathyfa\202fy\202qa\202qy\202ka\202kl\202km\202ka\202ky\202lm\202la\202ly\202ma\202mm\202nr\202nz\202nm\202nn\202na\202ny\202aa\202yr\202yz\202ym\202yn\202ya\202yy\202i'ji'h\000\313\204i'mi'hbj\202bh\202bkhbm\202bh\202tj\202th\202tkhtm\202th\202thmjh\202jm\202hj\202hm\202khjkhmsj\202sh\202skhsm\202sh\202skhsm\202dj\202dh\202dkhdm\202th\202dhm`j\202`m\202ghjghmfj\202fh\202fkhfm\202qh\202qm\202kj\202kh\202kkhkl\202km\202lj\202lh\202lkhlm\202lh\202mj\202mh\202mkhmm\202nj\202nh\202nkhnm\202nh\202hj\202hm\202ha\202yj\202yh\202ykhym\202yh\202i'mi'hbm\202bh\202tm\202th\202thmthhsm\202sh\202shmshhkl\202km\202lm\202nm\202nh\202ym\202yh\202a-\202u-\202i-\202ta\202ty\202`a\202`y\202ghaghysa\202sy\202shashyha\202"; -static const char b0fd[769] = "\377hy\202ja\202jy\202khakhysa\202sy\202da\202dy\202shjshh\015\332\204shmshrsr\202sr\202dr\202ta\202ty\202`a\202`y\202ghaghysa\202sy\202shashyha\202hy\202ja\202jy\202khakhysa\202sy\202da\202dy\202shjshh\015\332\204shmshrsr\202sr\202dr\202shjshh\015\332\204shmsh\202shhtm\202sj\202sh\202skhshjshh\015\332\204tm\202dhmaanaan(\000\201)\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201tjmthjthjthm\004G\204tmjtmh\004L\204jmhjmhhmyhmashjsjhsjasmhsmhsmjsmmsmmshhshhsmm\016\000\204\016\000\204\016m\204\023O\205\023O\205\016\234\204\016\234\204dha\016`\204\016`\204tmhtmhtmmtmy`jm`mm`mm`ma\006\242\204\006\263\204\006\314\2043q\2043q\204qmhqmmlhmlhylhaljjljj\015\363\204\015\363\204lmhlmhmhjmhmmhymjhmjm\004M\204\016\237\204\000\000\200\000\000\200\016\276\204hmjhmmnhmnhanjmnjmnjanmynmaymmymm\016\307\204tjytja\004S\204\004c\204tmytmajmyjhajma\016\316\204shy\016\344\204dhyljylmyyhyyjyymymmyqmynhyqmhlhm`mykmynjh\017\013\204ljmkmmljmnjhjhyhjymjyfmybhykmm`jmsmm\017\202\204njy\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200sleqle\024\204\205\000w\206\372\236\210\017\256\204\004\134\205\024\212\207\024\222\211\024~\205\024~\235\020\305\216\015\360\204\015\273\234*\000\201*\000\201"; -static const char b0fe[760] = "\374\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200,\000\201,\000\201.\000\201:\000\201;\000\201!\000\201?\000\201[(\202)]\202...\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200..\202-\000\201-\000\201_\000\201_\000\201(\000\201)\000\201{\000\201}\000\201[\000\201]\000\201[(\202)]\202<<\202>>\202<\000\201>\000\201[\000\201]\000\201[\000\201]\000\201'\000\201'\000\201[\000\201]\000\201-\000\201-\000\201-\000\201-\000\201_\000\201_\000\201_\000\201,\000\201,\000\201.\000\201\000\000\200;\000\201:\000\201?\000\201!\000\201-\000\201(\000\201)\000\201{\000\201}\000\201[\000\201]\000\201#\000\201&\000\201*\000\201+\000\201-\000\201<\000\201>\000\201=\000\201\000\000\200\134\000\201$\000\201%\000\201@\000\201\000\000\200\000\000\200\000\000\200\000\000\200an\202an\202un\202_\000\201in\202\000\000\200a\000\201a\000\201u\000\201u\000\201i\000\201i\000\201-\000\201-\000\201.\000\201.\000\201'\000\201a\000\201a\000\201'\000\201'\000\201u'\202u'\202'\000\201'\000\201i'\202i'\202i'\202i'\202a\000\201a\000\201b\000\201b\000\201b\000\201b\000\201h\000\201h\000\201t\000\201t\000\201t\000\201t\000\201th\202th\202th\202th\202j\000\201j\000\201j\000\201j\000\201h\000\201h\000\201h\000\201h\000\201kh\202kh\202kh\202kh\202d\000\201d\000\201dh\202dh\202r\000\201r\000\201z\000\201z\000\201s\000\201s\000\201s\000\201s\000\201sh\202sh\202sh\202sh\202s\000\201s\000\201s\000\201s\000\201d\000\201d\000\201d\000\201d\000\201t\000\201t\000\201t\000\201t\000\201dh\202dh\202dh\202dh\202`\000\201`\000\201`\000\201`\000\201gh\202gh\202gh\202gh\202f\000\201f\000\201f\000\201f\000\201q\000\201q\000\201q\000\201q\000\201k\000\201k\000\201k\000\201k\000\201l\000\201l\000\201l\000\201l\000\201m\000\201m\000\201m\000\201m\000\201n\000\201n\000\201n\000\201n\000\201h\000\201h\000\201h\000\201h\000\201w\000\201w\000\201a\000\201a\000\201y\000\201y\000\201y\000\201y\000\201la\202la\202l'\202l'\202l'\202l'\202la\202la\202"; -static const char b0ff[763] = "\375\000\000\200!\000\201\042\000\201#\000\201$\000\201%\000\201&\000\201'\000\201(\000\201)\000\201*\000\201+\000\201,\000\201-\000\201.\000\201/\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201:\000\201;\000\201<\000\201=\000\201>\000\201?\000\201@\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201[\000\201\134\000\201]\000\201^\000\201_\000\201`\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201{\000\201|\000\201}\000\201~\000\201(\000\201)\000\201.\000\201[\000\201]\000\201,\000\201-\000\201o\000\201a\000\201i\000\201u\000\201e\000\201o\000\201ya\202yu\202yo\202tsu\000\000\200a\000\201i\000\201u\000\201e\000\201o\000\201ka\202ki\202ku\202ke\202ko\202sa\202shisu\202se\202so\202ta\202chitsute\202to\202na\202ni\202nu\202ne\202no\202ha\202hi\202fu\202he\202ho\202ma\202mi\202mu\202me\202mo\202ya\202yu\202yo\202ra\202ri\202ru\202re\202ro\202wa\202n\000\201'\000\201`\000\201\000\000\200g\000\201kk\202gs\202n\000\201nj\202nh\202d\000\201tt\202l\000\201lg\202lm\202lb\202ls\202lt\202lp\202lh\202m\000\201b\000\201pp\202bs\202s\000\201ss\202\000\000\200j\000\201jj\202ch\202k\000\201t\000\201p\000\201h\000\201\000\000\200\000\000\200\000\000\200a\000\201ae\202ya\202yaeeo\202e\000\201\000\000\200\000\000\200yeoye\202o\000\201wa\202waeoe\202\000\000\200\000\000\200yo\202u\000\201wo\202we\202wi\202yu\202\000\000\200\000\000\200eu\202ui\202i\000\201\000\000\200\000\000\200\000\000\200c\000\201L\000\201!\000\201-\000\201|\000\201Y\000\201W\000\201\000\000\200|\000\201<\000\201^\000\201>\000\201v\000\201#\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\000\201|\000\201}\000\201?\000\201?\000\201"; -static const char b100[754] = "\372a\000\201e\000\201i\000\201o\000\201u\000\201da\202de\202di\202do\202du\202ja\202je\202\000\000\200jo\202ju\202ka\202ke\202ki\202ko\202ku\202ma\202me\202mi\202mo\202mu\202na\202ne\202ni\202no\202nu\202pa\202pe\202pi\202po\202pu\202qa\202qe\202qi\202qo\202\000\000\200ra\202re\202ri\202ro\202ru\202sa\202se\202si\202so\202su\202ta\202te\202ti\202to\202tu\202wa\202we\202wi\202wo\202\000\000\200za\202ze\202\000\000\200zo\202B25B43B85B71B90B48B29B62B76B33B68B66B87B91\000\000\200\000\000\200B18B19B22B34B47B49B56B63B64B79B82B83B86B89\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2003u\2043\200\2043\205\2045\312\2045\312\205\300\323\205\300\330\205\300\335\205\300\342\205\300\347\205\300\354\205\300\361\205\300\366\205\300\373\205\301\037\2043\212\204\301$\204\301)\2043\220\2043\225\2043\236\2043\244\204\360\015\2043\254\2043\262\2043\270\2043\275\2043\305\2043\313\2043\322\2043\330\2043\341\2043\351\2043\360\2043\367\2043\376\2044\005\2044\011\2044\015\2044\026\2044\037\2044#\2044*\20441\204\3013\2044<\2044@\2044D\2044H\2044L\2044P\204\3018\2044T\2044[\2044b\2044m\2044q\2044u\2044y\204\301=\2044}\2044\210\2044\217\2044\226\2044\232\2044\236\2044\242\204\301G\2044\246\2044\252\2044\256\2044\262\2044\271\2044\300\2044\315\2044\321\2044\327\2044\333\2044\342\2044\351\2044\360\2044\364\2044\370\2044\374\2045\000\2045\004\2045\013\2045\027\2045\036\2045\042\2045&\2045*\2045.\20452\20456\2045:\2045>\2045E\2045N\2045U\2045Y\2045]\2045a\2045e\2045i\2045m\2045s\2045y\2045\202\2045\211\2045\215\2045\223\2045\227\2045\233\2045\237\2045\243\2045\252\2045\256\2045\262\2045\266\2045\272\2045\276\2045\302\204"; -static const char b101[763] = "\375,\000\201.\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\2021002003004005006007008009003v\2044g\2043\246\2043\277\2043\343\2043\333\2043\230\2044\020\2044\031\2043v\2054g\2053\246\2053\277\2053\343\2053\333\2053\230\2054\020\2054\031\205\000\000\200\000\000\200\000\000\200*\000\201*\000\201#\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\2011/41/21\000\2015\000\20150\2025003\343\2043\343\2055\000\20110\20250\2021005003v\2043\343\2045\000\20110\20250\2021005003v\2043v\2053\343\20510\2021\000\2011\000\2011\000\2012\000\2012\000\2012\000\2012\000\2015\000\20110\20210\20210\20210\20210\20230\20250\20250\20250\20250\2021003005005005005005003v\2043\343\2045\000\20150\2021/21/22/33/4y\000\201t\000\201<\000\2011\000\2012\000\2013\000\2014\000\2015\000\201m\000\201K\000\201l\000\201Go\202x\000\201a\000\201a\000\201Gr\202t\000\2010\000\2011/4y\000\201I\000\201No\202\000\000\200=\000\201-\000\201S\000\201S\000\201S\000\201))\202X\000\201V\000\201IISII\202|\000\201>\000\201*\000\201\000\000\200\000\000\200\000\000\200TR.\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\20001\20202\20203\20204\20205\20206\20207\20208\20209\20210\20211\20212\20213\20214\20215\20216\20217\20218\20219\20220\20221\20222\20223\20224\20225\20226\20227\20228\20229\20230\20231\20232\20233\20234\20235\20236\20237\20238\20239\20240\20241\20242\20243\20244\20245\202,\000\201"; -static const char b102[757] = "\373\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201e\000\201b\000\201b\000\201g\000\201d\000\201i\000\201w\000\201z\000\201th\202y\000\201k\000\201q\000\201l\000\201m\000\201n\000\201m\000\201n\000\201u\000\201p\000\201k\000\201r\000\201s\000\201t\000\201t\000\201a\000\201e\000\201h\000\201x\000\201\000\000\200\000\000\200\000\000\200a\000\201p\000\201d\000\201l\000\201y\000\201r\000\201l\000\201a\000\201q\000\201b\000\201m\000\201o\000\201d\000\201t\000\201sh\202sh\202s\000\201?\000\201u\000\201n\000\201k\000\201n\000\201t\000\201p\000\201s\000\201i\000\201e\000\201y\000\201k\000\201k\000\201d\000\201w\000\201g\000\201g\000\201z\000\201z\000\201ng\202j\000\201?\000\201t\000\201y\000\201r\000\201b\000\201b\000\201b\000\201b\000\201l\000\201e\000\201y\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200k\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\202100200300400500600700800900"; -static const char b103[643] = "\325a\000\201b\000\201c\000\201d\000\201e\000\201v\000\201z\000\201h\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201s\000\201o\000\201p\000\201s\000\201q\000\201r\000\201s\000\201t\000\201u\000\201x\000\201ph\202ch\202f\000\201r\000\201c\000\201i\000\201u\000\201s\000\201I\000\201V\000\201X\000\201L\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200j\000\201t'\202t'\202a\000\201b\000\201g\000\201d\000\201e\000\201q\000\201z\000\201h\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201j\000\201u\000\201p\000\20190\202r\000\201s\000\201t\000\201w\000\201f\000\201x\000\201hw\202o\000\201900\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201b\000\201g\000\201d\000\201e\000\201zh\202dzhz\000\201dz\202i\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201r\000\201s\000\201t\000\201u\000\201c\000\201sh\202shcy\000\201y\000\201o\000\201o\000\201f\000\201h\000\201c\000\201v\000\201''\202'\000\201e\000\201ie\202ju\202ja\202ia\202a\000\201d\000\201z\000\201n\000\201s\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201b\000\201g\000\201h\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201sh\202l\000\201m\000\201d\000\201n\000\201z\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201t\000\201g\000\201t\000\201i\000\201u\000\201s\000\201\000\000\200|\000\201a\000\201i\000\201u\000\201ka\202ku\202ga\202gu\202xa\202ca\202ja\202ji\202ta\202tu\202da\202di\202du\202thapa\202ba\202fa\202na\202nu\202ma\202mi\202mu\202ya\202va\202vi\202ra\202ru\202la\202sa\202za\202shasraha\202\000\000\200\000\000\200\000\000\200\000\000\200AM1AM25\306\204XS\202DH1DH2BG\202BU\202:\000\2011\000\2012\000\20110\20220\202100"; -static const char b104[757] = "\373E\000\201A\000\201A\000\201O\000\201O\000\201U\000\201I\000\201E\000\201A\000\201O\000\201U\000\201U\000\201I\000\201Aw\202W\000\201Y\000\201H\000\201P\000\201B\000\201T\000\201D\000\201Ch\202J\000\201K\000\201G\000\201F\000\201V\000\201Th\202Dh\202S\000\201Z\000\201Sh\202Zh\202R\000\201L\000\201M\000\201N\000\201Ng\202Oy\202Yu\202e\000\201a\000\201a\000\201o\000\201o\000\201u\000\201i\000\201e\000\201a\000\201o\000\201u\000\201u\000\201i\000\201aw\202w\000\201y\000\201h\000\201p\000\201b\000\201t\000\201d\000\201ch\202j\000\201k\000\201g\000\201f\000\201v\000\201th\202dh\202s\000\201z\000\201sh\202zh\202r\000\201l\000\201m\000\201n\000\201ng\202oy\202yu\202p\000\201t\000\201k\000\201f\000\201th\202s\000\201sh\202ch\202y\000\201ng\202b\000\201d\000\201g\000\201v\000\201th\202z\000\201zh\202j\000\201w\000\201h\000\201l\000\201m\000\201i\000\201e\000\201a\000\201a\000\201o\000\201u\000\201au\202a\000\201r\000\201n\000\201i\000\201ei\202ai\202u\000\201ou\202u\000\201oi\202o\000\201ar\202or\202er\202er\202ar\202iaria\202yu\202'\000\201b\000\201t\000\201j\000\201x\000\201kh\202d\000\201r\000\201s\000\201sh\202dh\202c\000\201g\000\201f\000\201q\000\201k\000\201l\000\201m\000\201n\000\201w\000\201h\000\201y\000\201a\000\201e\000\201i\000\201o\000\201u\000\201aa\202ee\202oo\202\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200A\000\201Ai\202Ai\202E\000\201Br\202Ch\202HchE\000\201Ei\202H\000\201Hy\202I\000\201K\000\201Hk\202Ky\202L\000\201M\000\201N\000\201O\000\201Oi\202P\000\201Hp\202S\000\201Sh\202T\000\201Ht\202C\000\201Hc\202Ch\202D\000\201U\000\201W\000\201X\000\201G\000\201Z\000\201Zh\202\000\000\200\000\000\200\000\000\200\000\000\200a\000\201ai\202ai\202e\000\201br\202ch\202hche\000\201ei\202h\000\201hy\202i\000\201k\000\201hk\202ky\202l\000\201m\000\201n\000\201o\000\201oi\202p\000\201hp\202s\000\201sh\202t\000\201ht\202c\000\201hc\202ch\202d\000\201u\000\201w\000\201x\000\201g\000\201z\000\201zh\202"; -static const char b105[568] = "\274a\000\201b\000\201c\000\201ch\202d\000\201nd\202dh\202e\000\201e\000\201f\000\201g\000\201gj\202h\000\201i\000\201j\000\201k\000\201l\000\201ll\202m\000\201n\000\201n\000\201nj\202o\000\201p\000\201q\000\201r\000\201rr\202s\000\201sh\202t\000\201th\202u\000\201v\000\201x\000\201y\000\201z\000\201zh\202gh\202gh\202kh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201b\000\201g\000\201d\000\201e\000\201z\000\201e\000\201z\000\201t\000\201c\000\201y\000\201z\000\201i\000\201`\000\201l\000\201n'\202x\000\201d'\202c\000\201j\000\201k\000\201l'\202h\000\201x\000\201a\000\201c\000\201c\000\201c'\202m\000\201q\000\201n\000\201j'\202s\000\201j\000\201o\000\201t'\202f\000\201j\000\201c\000\201p\000\201g\000\201r\000\201s\000\201v\000\201t\000\201s\000\201u\000\201c'\202c\000\201w\000\201p\000\201k\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\201A\000\201B\000\201B\000\201C\000\201Ch\202D\000\201Dh\202E\000\201E\000\201F\000\201G\000\201\000\000\200H\000\201H\000\201I\000\201Ij\202J\000\201K\000\201L\000\201Ll\202M\000\201N\000\201Nj\202O\000\201P\000\201Q\000\201R\000\201\000\000\200S\000\201Sh\202T\000\201Th\202U\000\201V\000\201X\000\201\000\000\200Y\000\201Z\000\201\000\000\200a\000\201b\000\201b\000\201c\000\201ch\202d\000\201dh\202e\000\201e\000\201f\000\201g\000\201\000\000\200h\000\201h\000\201i\000\201ij\202j\000\201k\000\201l\000\201ll\202m\000\201n\000\201nj\202o\000\201p\000\201q\000\201r\000\201\000\000\200s\000\201sh\202t\000\201th\202u\000\201v\000\201x\000\201\000\000\200y\000\201z\000\201"; -static const char b106[769] = "\377AB1AB2AB3AB4AB5AB6AB7AB8AB95\311\204\301\031\204\360\014\204\3012\204\3017\2045\322\204\301\000\204\301\000\205\301\005\205\301\012\204\301\012\205\301\017\205\301\024\204\301\024\2055\326\2045\332\2045\336\2045\342\2045\346\2045\352\2045\356\2045\362\2045\371\2045\375\2046\001\2046\007\2046\013\2046\017\2046\026\2046\032\2046\036\2046\042\2046&\2046*\2046.\20462\20466\2046=\2046A\2046E\2046I\2046M\2046Q\2046U\2046Y\2046]\2046a\2046e\2046i\2046m\2046q\2046u\2046y\2046}\2046\201\2046\205\2046\211\2046\215\2046\221\2046\225\2046\231\2046\235\204=y\210\301\031\205\301\036\205=\202\205\301#\205\301(\205\360\014\206\360\022\206\301-\205\3012\205\3017\205\301<\205\301A\205\301F\2056\241\2046\245\2046\251\2046\255\2046\261\2046\265\2046\271\2046\275\204\301K\205\301P\205\301U\2056\301\2046\305\2046\311\204=\260\205\301Z\205\301_\2056\315\2046\321\2046\325\2046\331\2046\335\2046\341\2046\345\2046\351\2046\355\2046\361\2046\365\2046\371\2046\375\2047\001\2047\005\2047\011\2047\015\2047\021\2047\025\2047\031\2047\035\2047!\2047%\2047)\2047-\20471\20475\20479\2047=\2047A\2047E\2047I\2047M\2047Q\2047U\2047Y\2047]\2047a\2047e\2047i\2047m\2047q\2047u\2047y\2047}\2047\201\2047\205\2047\211\2047\215\2047\221\2047\225\2047\231\2047\235\2047\241\2047\245\2047\251\2047\255\2047\261\2047\265\2047\271\2047\275\2047\301\2047\305\2047\311\2047\315\2047\321\2047\325\2047\331\2047\335\2047\341\2047\345\2047\351\2047\355\2047\361\2047\365\2047\371\2047\375\2048\001\2048\005\2048\011\2048\015\2048\021\2048\025\2048\031\2048\035\2048!\2048%\2048)\2048-\20481\20485\20489\2048=\2048A\2048E\2048I\2048M\2048Q\2048U\2048Y\2048]\2048a\2048e\2048i\2048m\2048q\2048u\2048y\2048}\2048\201\2048\205\2048\211\2048\215\2048\221\2048\225\2048\231\2048\235\2048\241\2048\245\2048\251\2048\255\2048\261\2048\265\2048\271\2048\275\2048\301\2048\305\2048\311\2048\315\2048\321\2048\325\2048\331\2048\335\2048\341\2048\345\2048\351\2048\355\2048\361\2048\365\2048\371\2048\375\2049\001\2049\005\2049\011\2049\015\2049\021\2049\025\2049\031\2049\035\2049!\2049%\2049)\2049-\20491\204"; -static const char b107[562] = "\27295\20499\2049=\2049A\2049E\2049I\2049M\2049Q\2049U\2049Y\2049]\2049a\2049e\2049i\2049m\2049q\2049u\2049y\2049}\2049\201\2049\205\2049\211\2049\215\2049\221\2049\225\2049\231\2049\235\2049\241\2049\245\2049\251\2049\255\2049\261\2049\265\2049\271\2049\275\2049\301\2049\305\2049\311\2049\315\2049\321\2049\325\2049\331\2049\335\2049\341\2049\345\2049\351\2049\355\2049\361\2049\365\2049\371\2049\375\204:\001\204:\005\204:\011\204:\015\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200:\021\204:\025\204:\031\204:\035\204:!\204:%\204:)\204:-\204\360\030\204\360\030\206\360\036\206\360$\206\360*\206:1\204:5\204:9\204:=\204:A\204:E\204:I\204:M\204:Q\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200:U\204:Y\204:]\204:a\204:e\204:i\204:m\204:q\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200aa\202:\000\201-\000\201ae\202b\000\201b\000\201\000\000\200dz\202dz\202dz\202dzhd\000\201d\000\201d\000\201e\000\201o\000\201fngu\000\201g\000\201g\000\201g\000\201h\000\201h\000\201h\000\201j\000\201ls\202lz\202l\000\201l\000\201l\000\201lzhlzhy\000\201y\000\201o\000\201oe\202u\000\201q\000\201r\000\201r\000\201r\000\201r\000\201r\000\201tc\202ts\202ts\202tsht\000\201v\000\201\000\000\200y\000\201'\000\201`\000\201pc\202c\000\201x\000\201qc\202q\000\201s\000\201"; -static const char b108[769] = "\377a\000\201e\000\201i\000\201o\000\201u\000\201ja\202\000\000\200\000\000\200jo\202\000\000\200ka\202ke\202ki\202ko\202ku\202la\202le\202li\202lo\202lu\202ma\202me\202mi\202mo\202mu\202na\202ne\202ni\202no\202nu\202pa\202pe\202pi\202po\202pu\202ra\202re\202ri\202ro\202ru\202sa\202se\202si\202so\202su\202ta\202te\202ti\202to\202tu\202wa\202we\202wi\202wo\202\000\000\200xa\202xe\202\000\000\200\000\000\200\000\000\200za\202\000\000\200\000\000\200zo\202'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201sh\202t\000\201\000\000\200+\000\2011\000\2012\000\2013\000\20110\20220\2021003v\2043v\205'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201sh\202t\000\201<\000\201>\000\2011\000\2012\000\2013\000\2014\000\2015\000\20110\20220\202'\000\201'\000\201b\000\201b\000\201g\000\201d\000\201h\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201y\000\201k\000\201k\000\201l\000\201l\000\201m\000\201m\000\201n\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201sh\202sh\202t\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2014\000\2015\000\20110\20220\202100\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201\000\000\200sh\202t\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2015\000\20110\20220\202100"; -static const char b109[769] = "\377'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201sh\202t\000\2011\000\20110\20220\2021002\000\2013\000\201\000\000\200\000\000\200\000\000\200 \000\201a\000\201b\000\201g\000\201d\000\201e\000\201v\000\201i\000\201y\000\201k\000\201l\000\201m\000\201n\000\201o\000\201r\000\201s\000\201t\000\201u\000\201f\000\201q\000\201s\000\201t\000\201a\000\201e\000\201l\000\201n\000\201c\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200^\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201e\000\201i\000\201o\000\201y\000\201w\000\201b\000\201b\000\201p\000\201m\000\201n\000\201n\000\201ne\202ne\202r\000\201r\000\201l\000\201x\000\201h\000\201s\000\201s\000\201se\202k\000\201q\000\201t\000\201t\000\201te\202te\202to\202d\000\201*\000\201+\000\201a\000\201e\000\201i\000\201o\000\201y\000\201w\000\201b\000\201p\000\201m\000\201n\000\201ne\202r\000\201l\000\201x\000\201h\000\201s\000\201s\000\201se\202k\000\201q\000\201t\000\201te\202to\202d\000\201\000\000\200\000\000\200\000\000\200\000\000\20011\202.5\202RMTIMN1\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\202\000\000\200\000\000\2001002003004005006007008009003v\2044g\2043\246\2043\277\2043\343\2043\333\2043\230\2044\020\2044\031\2043v\2054g\2053\246\2053\277\2053\343\2053\333\2053\230\2054\020\2054\031\2053v\2064g\2063\246\2063\277\2063\343\2063\333\2063\230\2064\020\2064\031\2061\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\202"; -static const char b10a[742] = "\366a\000\201i\000\201u\000\201r\000\201\000\000\200e\000\201o\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200m\000\201h\000\201k\000\201kh\202g\000\201gh\202\000\000\200c\000\201ch\202j\000\201\000\000\200n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201z\000\201h\000\201k\000\201th\202t\000\201vh\202\000\000\200\000\000\200'\000\201'\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\20110\20220\2021003v\204.5\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200,\000\201.\000\201*\000\201#\000\201+\000\201@\000\201,\000\201.\000\201~\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200h\000\201l\000\201h\000\201m\000\201q\000\201w\000\201s\000\201r\000\201b\000\201t\000\201s\000\201k\000\201n\000\201h\000\201s\000\201s\000\201f\000\201'\000\201`\000\201d\000\201g\000\201d\000\201g\000\201t\000\201z\000\201d\000\201y\000\201t\000\201z\000\201|\000\20150\202#\000\201h\000\201l\000\201h\000\201m\000\201q\000\201w\000\201s\000\201r\000\201b\000\201t\000\201s\000\201k\000\201n\000\201h\000\201s\000\201s\000\201f\000\201'\000\201`\000\201d\000\201g\000\201d\000\201g\000\201t\000\201z\000\201d\000\201y\000\201t\000\201z\000\201|\000\20110\20220\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201b\000\201bh\202g\000\201gh\202d\000\201h\000\201w\000\201w\000\201z\000\201zh\202j\000\201jh\202h\000\201t\000\201y\000\201k\000\201k\000\201kh\202l\000\201dh\202th\202m\000\201n\000\201s\000\201`\000\201`\000\201p\000\201f\000\201c\000\201q\000\201q\000\201qh\202r\000\201sh\202sh\202t\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2015\000\20110\20220\202100+\000\201#\000\201;\000\201,\000\201.\000\201:\000\201*\000\201"; -static const char b10b[529] = "\257a\000\201a\000\201a\000\201a\000\201a\000\201a\000\201e\000\201e\000\201e\000\201e\000\201o\000\201o\000\201i\000\201i\000\201u\000\201u\000\201k\000\201x\000\201x\000\201xv\202g\000\201g\000\201gh\202c\000\201j\000\201t\000\201th\202d\000\201dh\202t\000\201p\000\201f\000\201b\000\201bh\202ng\202ng\202ngvn\000\201n\000\201n\000\201m\000\201m\000\201y\000\201y\000\201v\000\201r\000\201l\000\201s\000\201z\000\201sh\202zh\202sh\202sh\202h\000\201\000\000\200\000\000\200\000\000\200.\000\201:\000\201;\000\201.\000\201.\000\201*\000\201*\000\201'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201sh\202t\000\201\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\20110\20220\2021003v\204'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201p\000\201s\000\201sh\202t\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\20110\20220\2021003v\204'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201p\000\201s\000\201sh\202t\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\201*\000\201+\000\201+\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\20110\20220\202100"; -static const char b10c[769] = "\377a\000\201a\000\201a\000\201i\000\201i\000\201e\000\201o\000\201o\000\201o\000\201b\000\201b\000\201b\000\201b\000\201g\000\201g\000\201g\000\201g\000\201d\000\201d\000\201d\000\201z\000\201z\000\201y\000\201y\000\201y\000\201y\000\201k\000\201k\000\201k\000\201k\000\201l\000\201l\000\201l\000\201lt\202m\000\201n\000\201n\000\201n\000\201nt\202nt\202nc\202nc\202ny\202ny\202ng\202ng\202ng\202p\000\201p\000\201c\000\201c\000\201c\000\201q\000\201q\000\201q\000\201q\000\201q\000\201q\000\201r\000\201r\000\201r\000\201s\000\201s\000\201sh\202sh\202sh\202sh\202t\000\201t\000\201t\000\201t\000\201ot\202\015\330\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200A\000\201A\000\201B\000\201Mb\202C\000\201Nc\202Cs\202D\000\201Nd\202E\000\201E\000\201E\000\201F\000\201G\000\201Gy\202H\000\201I\000\201I\000\201J\000\201K\000\201K\000\201Nk\202L\000\201Ly\202M\000\201N\000\201Ny\202O\000\201O\000\201O\000\201O\000\201O\000\201P\000\201Mp\202R\000\201R\000\201S\000\201Sz\202T\000\201Nt\202Ty\202Ch\202U\000\201U\000\201U\000\201U\000\201V\000\201Z\000\201Zs\202\301d\205S\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201a\000\201b\000\201mb\202c\000\201nc\202cs\202d\000\201nd\202e\000\201e\000\201e\000\201f\000\201g\000\201gy\202h\000\201i\000\201i\000\201j\000\201k\000\201k\000\201nk\202l\000\201ly\202m\000\201n\000\201ny\202o\000\201o\000\201o\000\201o\000\201o\000\201p\000\201mp\202r\000\201r\000\201s\000\201sz\202t\000\201nt\202ty\202ch\202u\000\201u\000\201u\000\201u\000\201v\000\201z\000\201zs\202\011\214\205s\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2015\000\20110\20250\2021003v\204"; -static const char b10d[175] = "9\000\000\200b\000\201p\000\201t\000\201t\000\201j\000\201ch\202h\000\201kh\202f\000\201d\000\201d\000\201r\000\201r\000\201z\000\201s\000\201sh\202k\000\201g\000\201l\000\201m\000\201n\000\201w\000\201u\000\201y\000\201i\000\201ng\202ny\202v\000\201a\000\201i\000\201u\000\201e\000\201o\000\201\000\000\200m\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b10e[535] = "\261\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\2021002003004005006007008009001/21/41/32/3\000\000\200a\000\201b\000\201p\000\201p'\202t'\202s\000\201c\000\201ch\202ch'h'\202x\000\201d\000\201z\000\201r\000\201r'\202z\000\201j\000\201s\000\201sh\202s\000\201d\000\201t\000\201z'\202'\000\201x'\202f\000\201v\000\201v\000\201q\000\201k\000\201k'\202g\000\201l\000\201m\000\201n\000\201u\000\201w\000\201o\000\201e\000\201h\000\201y\000\201e\000\201\000\000\200\000\000\200\000\000\200-\000\201\000\000\200\000\000\200ll\202e\000\201"; -static const char b10f[742] = "\366'\000\201'\000\201b\000\201b\000\201g\000\201h\000\201h\000\201w\000\201z\000\201h\000\201y\000\201k\000\201l\000\201m\000\201n\000\201n\000\201n\000\201s\000\201`\000\201`\000\201p\000\201s\000\201s\000\201s\000\201r\000\201sh\202t\000\201t\000\201t\000\2011\000\2012\000\2013\000\2014\000\2015\000\20110\20220\20230\202100.5\202`d\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201b\000\201g\000\201h\000\201w\000\201z\000\201h\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201s\000\201r\000\201sh\202t\000\201f\000\201l\000\201sh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\20110\20220\202100,\000\201.\000\201*\000\201**\202<\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201b\000\201g\000\201w\000\201z\000\201x\000\201y\000\201k\000\201d\000\201m\000\201n\000\201s\000\201p\000\201c\000\201r\000\201sh\202t\000\201l\000\201\000\000\200\000\000\200\000\000\200\000\000\200,\000\201.\000\201;\000\201:\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201-'\202b\000\201g\000\201d\000\201h\000\201w\000\201-w\202z\000\201h\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201r\000\201sh\202t\000\2011\000\2012\000\2013\000\2014\000\20110\20220\202100\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201b\000\201g\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201p\000\201s\000\201q\000\201r\000\201sh\202t\000\201zy\202"; -static const char b110[751] = "\371m\000\201m\000\201h\000\201h\000\201h\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201l\000\201r\000\201n\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202\000\000\200,\000\201.\000\201.\000\201:\000\201-\000\201+\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\2021003v\2040\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200e\000\201o\000\201e\000\201o\000\201l\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\201m\000\201m\000\201h\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201r\000\201dh\202rh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202\000\000\200'\000\201.\000\201#\000\201#\000\201,\000\201.\000\201,\000\201.\000\201r\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200#\000\201\000\000\200\000\000\200s\000\201t\000\201b\000\201c\000\201d\000\201g\000\201m\000\201n\000\201l\000\201n\000\201v\000\201p\000\201y\000\201r\000\201h\000\201k\000\201j\000\201n\000\201a\000\201e\000\201i\000\201u\000\201o\000\201e\000\201x\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b111[736] = "\364m\000\201m\000\201h\000\201a\000\201i\000\201u\000\201e\000\201k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201y\000\201r\000\201l\000\201w\000\201s\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202oi\202o\000\201au\202\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201*\000\201,\000\201.\000\201?\000\201lh\202a\000\201ei\202v\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201i\000\201u\000\201e\000\201o\000\201k\000\201kh\202g\000\201gh\202c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201r\000\201l\000\201v\000\201s\000\201h\000\201r\000\201'\000\201.\000\201*\000\201Sri\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200m\000\201m\000\201h\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202\000\000\200'\000\201h\000\201h\000\201Om\202,\000\201.\000\201.\000\201 \000\201\000\000\200'\000\201\000\000\200\000\000\200*\000\201e\000\201m\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\201*\000\201-\000\201-\000\201~\000\201^\000\201\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\2021003v\204"; -static const char b112[751] = "\371a\000\201a\000\201i\000\201u\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201g\000\201gh\202n\000\201c\000\201ch\202j\000\201j\000\201\000\000\200n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201d\000\201dh\202n\000\201p\000\201ph\202b\000\201b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201h\000\201r\000\201a\000\201i\000\201i\000\201u\000\201e\000\201ai\202o\000\201au\202m\000\201\000\000\200'\000\201\000\000\200,\000\201.\000\201 \000\201,\000\201.\000\201.\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201i\000\201u\000\201e\000\201k\000\201kh\202g\000\201\000\000\200gh\202\000\000\200c\000\201ch\202j\000\201j\000\201\000\000\200n\000\201t\000\201th\202d\000\201d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201\000\000\200bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201h\000\201r\000\201rh\202.\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201g\000\201gh\202n\000\201c\000\201ch\202j\000\201j\000\201jh\202n\000\201t\000\201th\202d\000\201d\000\201r\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201h\000\201m\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202'\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b113[352] = "tm\000\201m\000\201m\000\201h\000\201\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201l\000\201\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201\000\000\200p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201\000\000\200l\000\201l\000\201\000\000\200v\000\201d\000\201d\000\201d\000\201h\000\201\000\000\200'\000\201'\000\201'\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200\000\000\200e\000\201ai\202\000\000\200\000\000\200o\000\201au\202\000\000\200\000\000\200\000\000\200Om\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200u\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200`\000\201m\000\201m\000\201r\000\201l\000\201l\000\201l\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\201\000\000\200\000\000\200\000\000\200a\000\201k\000\201n\000\201v\000\201p\000\201"; -static const char b114[655] = "\331a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201hn\202c\000\201ch\202j\000\201jh\202n\000\201hn\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201hn\202p\000\201ph\202b\000\201bh\202m\000\201hm\202y\000\201r\000\201hr\202l\000\201hl\202v\000\201s\000\201s\000\201s\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202\000\000\200m\000\201m\000\201h\000\201'\000\201'\000\201m\000\201Om\202*\000\201,\000\201.\000\201,\000\201-\000\201.\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201.\000\201-\000\201\000\000\200^\000\201'\000\201m\000\201h\000\201h\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200*\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201e\000\201ai\202o\000\201o\000\201au\202m\000\201m\000\201h\000\201\000\000\200'\000\201'\000\201m\000\201.\000\201Om\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b115[667] = "\335\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200\000\000\200e\000\201ai\202o\000\201au\202m\000\201m\000\201h\000\201\000\000\200'\000\201*\000\201,\000\201.\000\201-\000\201-\000\201-\000\201-\000\201-\000\201#\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201i\000\201i\000\201i\000\201u\000\201u\000\201u\000\201"; -static const char b116[607] = "\311a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201l\000\201e\000\201ai\202o\000\201au\202m\000\201h\000\201\000\000\200'\000\201,\000\201.\000\201.\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202k\000\201s\000\201g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201h\000\201r\000\201m\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202\000\000\200'\000\201kh\202.\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b117[214] = "Fk\000\201kh\202ng\202n\000\201t\000\201t\000\201p\000\201ph\202b\000\201m\000\201j\000\201ch\202th\202r\000\201l\000\201s\000\201ny\202h\000\201\000\000\200d\000\201dh\202g\000\201g\000\201gh\202bh\202jh\202b\000\201\000\000\200\000\000\200l\000\201r\000\201r\000\201a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201av\202o\000\201ai\202m\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\202,\000\201.\000\201*\000\201!\000\201c\000\201t\000\201th\202d\000\201dh\202n\000\201l\000\201"; -static const char b118[769] = "\377a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201r\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201e\000\201ai\202o\000\201au\202m\000\201h\000\201\000\000\200'\000\201.\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200M\000\201A\000\201I\000\201U\000\201'\000\201Y\000\201I\000\201U\000\201E\000\201O\000\201N\000\201G\000\201K\000\201N\000\201J\000\201C\000\201N\000\201D\000\201T\000\201N\000\201D\000\201T\000\201M\000\201B\000\201P\000\201H\000\201L\000\201R\000\201R\000\201S\000\201S\000\201V\000\201m\000\201a\000\201i\000\201u\000\201'\000\201y\000\201i\000\201u\000\201e\000\201o\000\201n\000\201g\000\201k\000\201n\000\201j\000\201c\000\201n\000\201d\000\201t\000\201n\000\201d\000\201t\000\201m\000\201b\000\201p\000\201h\000\201l\000\201r\000\201r\000\201s\000\201s\000\201v\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Om\202"; -static const char b119[688] = "\344a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201\000\000\200\000\000\200o\000\201\000\000\200\000\000\200k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201\000\000\200n\000\201t\000\201\000\000\200d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201'\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201z\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201\000\000\200ai\202o\000\201\000\000\200\000\000\200m\000\201m\000\201\000\000\200\000\000\200n\000\201y\000\201r\000\201r\000\201'\000\201.\000\201-\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200\000\000\200e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201r\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201\000\000\200\000\000\200e\000\201ai\202o\000\201au\202m\000\201h\000\201\000\000\200'\000\201*\000\201~\000\201e\000\201"; -static const char b11a[748] = "\370\000\000\200i\000\201u\000\201u\000\201e\000\201o\000\201o\000\201ai\202au\202i\000\201\000\000\200k\000\201kh\202g\000\201gh\202ng\202c\000\201ch\202j\000\201ny\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201ts\202tshdz\202dzhzh\202z\000\201'\000\201y\000\201r\000\201l\000\201v\000\201sh\202s\000\201s\000\201h\000\201ks\202\000\000\200\000\000\200m\000\201m\000\201m\000\201m\000\201h\000\201r\000\201y\000\201r\000\201l\000\201v\000\201@\000\201#\000\201-\000\201,\000\201.\000\201:\000\201@\000\201#\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201u\000\201u\000\201e\000\201o\000\201o\000\201ai\202au\202r\000\201l\000\201\000\000\200k\000\201kh\202g\000\201gh\202ng\202c\000\201ch\202j\000\201jh\202ny\202t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201ts\202tshdz\202zh\202z\000\201'\000\201y\000\201r\000\201l\000\201v\000\201sh\202s\000\201s\000\201h\000\201ks\202h\000\201h\000\201r\000\201l\000\201sh\202s\000\201g\000\201k\000\201ng\202d\000\201n\000\201b\000\201m\000\201r\000\201l\000\201sh\202s\000\201'\000\201m\000\201h\000\201\000\000\200\000\000\200-\000\201,\000\201.\000\201`\000\201@\000\201@\000\201@\000\201#\000\201#\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200hi\202hiihu\202huuha\202haa\023l\204\023l\205\023t\204\023t\205\023\341\204\023\341\205spespispospap\000\201k\000\201l\000\201m\000\201d\000\201z\000\201v\000\201ng\202h\000\201g\000\201kh\202s\000\201b\000\201c\000\201t\000\201th\202n\000\201ph\202r\000\201f\000\201ch\202a\000\201e\000\201i\000\201o\000\201u\000\201ua\202ia\202p\000\201k\000\201t\000\201m\000\201n\000\201l\000\201w\000\201ng\202y\000\201\000\000\200\000\000\200'\000\201\000\000\200\000\000\200'\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201\000\000\200\000\000\200\000\000\200\000\000\200'\000\201\000\000\200\000\000\200'\000\201"; -static const char b11c[550] = "\266a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201\000\000\200e\000\201ai\202o\000\201au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201r\000\201l\000\201\000\000\200e\000\201ai\202o\000\201au\202m\000\201m\000\201h\000\201\000\000\200'\000\201,\000\201.\000\201 \000\201-\000\201^\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\202*\000\201\000\000\200\000\000\200\000\000\200@\000\201,\000\201k\000\201kh\202g\000\201ng\202c\000\201ch\202j\000\201ny\202t\000\201th\202d\000\201n\000\201p\000\201ph\202b\000\201m\000\201ts\202tshdz\202w\000\201zh\202z\000\201'\000\201y\000\201r\000\201l\000\201sh\202s\000\201h\000\201\000\000\200\000\000\200\000\000\200k\000\201kh\202g\000\201ng\202c\000\201ch\202j\000\201ny\202t\000\201th\202d\000\201n\000\201p\000\201ph\202b\000\201m\000\201ts\202tshdz\202w\000\201zh\202z\000\201\000\000\200y\000\201r\000\201l\000\201sh\202s\000\201h\000\201\000\000\200\000\000\200i\000\201u\000\201e\000\201o\000\201m\000\201m\000\201"; -static const char b11d[511] = "\251a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201e\000\201\000\000\200ai\202o\000\201\000\000\200au\202k\000\201kh\202g\000\201gh\202n\000\201c\000\201ch\202j\000\201jh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201t\000\201th\202d\000\201dh\202n\000\201p\000\201ph\202b\000\201bh\202m\000\201y\000\201r\000\201l\000\201v\000\201s\000\201s\000\201s\000\201h\000\201l\000\201ks\202jn\202tr\202a\000\201i\000\201i\000\201u\000\201u\000\201r\000\201\000\000\200\000\000\200\000\000\200e\000\201\000\000\200ai\202o\000\201\000\000\200au\202m\000\201h\000\201'\000\201'\000\201\000\000\200\000\000\200r\000\201r\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200a\000\201a\000\201i\000\201i\000\201u\000\201u\000\201\000\000\200e\000\201ai\202\000\000\200o\000\201au\202y\000\201v\000\201b\000\201bh\202m\000\201k\000\201kh\202t\000\201th\202l\000\201g\000\201gh\202d\000\201dh\202n\000\201c\000\201ch\202t\000\201th\202l\000\201j\000\201jh\202d\000\201dh\202n\000\201p\000\201ph\202h\000\201r\000\201s\000\201a\000\201i\000\201i\000\201u\000\201u\000\201\000\000\200e\000\201ai\202\000\000\200o\000\201au\202m\000\201h\000\201\000\000\200Om\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b11e[748] = "\370\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200k\000\201g\000\201ng\202p\000\201b\000\201m\000\201t\000\201d\000\201n\000\201c\000\201j\000\201ny\202y\000\201r\000\201l\000\201w\000\201s\000\201\000\000\200-\000\201i\000\201u\000\201e\000\201o\000\201,\000\201.\000\201"; -static const char b11f[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200yh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2014\000\2015\000\2018\000\20110\20212\20215\20216\20220\20220\20232\20240\20248\20260\20264\20280\202160160240/\000\201N\000\201C\000\201A\000\201U\000\201M\000\201K\000\201P\000\201M\000\201K\000\201P\000\201P\000\201V\000\201P\000\201K\000\201V\000\201N\000\201P\000\201N\000\201U\000\201V\000\201#\000\201N\000\201S\000\201P\000\201A\000\201V\000\201M\000\201M\000\201V\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200~\000\201"; -static const char b124[352] = "t2\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\2012\000\2013\000\2014\000\2015\000\2012\000\2013\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\2012\000\2013\000\2013\000\2014\000\2015\000\2015\021\2064e\2061\000\2012\000\2013\000\2013\000\2014\000\2015\000\2013\000\2013\000\2014\000\2014\000\2014\000\2014\000\2016\000\2017\000\2017\000\2017\000\2018\000\2018\000\2019\000\2019\000\2019\000\2019\000\2012\000\2013\000\2014\000\2015\000\2016\000\2011\000\2012\000\2013\000\2014\000\2014\000\2015\000\2015\000\2012\000\2013\000\2011\000\2012\000\2011/32/35/61/32/31/81/41/61/41/41/21/32/340\20250\2024\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200|\000\201:\000\201\134\000\201\134\000\201\134\000\201"; -static const char b12f[730] = "\362\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20211\20212\20212b13\20215\20217\20219\20221\20223\20224\20225\20226\20227\20228\20229\20230\20233\20234\20235\20236\20237\20238\20239\20240\20241\20244\20246\20247\20249\20250\20251\20252\20253\20254\20255\20256\20258\20259\20260\20261\20262\20263\20264\20266\20267\20268\20269\20270\20271\20272\20273\20274\20275\20275b76\20278\20279\20280\20281\20282\20283\20284\20285\20286\20287\20288\20289\20290\20291\20292\20294\20295\20296\20297\20298\20299\202100101102103104105107108109110112114301302"; -static const char b130[769] = "\377A1\202A2\202A3\202A4\202A5\202A5aA6\202A6aA6bA7\202A8\202A9\202A10A11mSaA13A14:u\204xr\202A16Xrd:y\204A18A19A20sr\202A22A23A24A25A26A27A28A29A30A31A32:}\204\0171\204A34A35A36A37qizA39A40:\201\204A41A42:\205\204A43:\211\204A44A45:\215\204A46iryA48A49Sps:\221\204A52A53A54A55A56A57A58A59A60A61A62A63A64A65A66A67A68A69A70B1\202B2\202msiB4\202B5\202B5aB6\202B7\202B8\202B9\202C1\202C2\202C2aC2bC2c\301i\205:\225\204C5\202\000\363\204stXmnwC9\202\017Y\204:\231\204HH\202C12C13C14C15C16C17C18C19C20C21C22C23C24tp\202Hr\202Snyir\202D5\202D6\202D7\202D8\202D8armi\004\357\204D11D12D13D14D15D16D17D18fnDD20r\000\201D22D23spt\017\306\204D26mnD:\235\204kA\202D29D30D31:\241\204D32D33aHA:\245\204D35a\000\201D37D38D39D40D41D42D43D44Dsrd\000\201:\251\204D47D48:\255\204D49Dba:\261\204:\265\204:\271\204:\275\204:\301\204:\305\204:\315\204:\321\204:\325\204D51mt\202:\331\204D53D54:\335\204D55sbqD57b\000\201ab\202wabsAHD62D63D64D65D66D67:\341\204:\345\204:\351\204:\355\204:\361\204:\365\204:\375\204;\001\204E1\202E2\202E3\202E4\202E5\202\016\263\204E7\202E8\202E8aE9\202E9aE10E11E12E13E14E15E16;\005\204zAb;\011\204E18E19E20;\015\204E21mAirw\202AbyE25E26E27E28;\021\204E29E30E31E32E33wn\202;\025\204E36E37E38F1\202F1a"; -static const char b131[769] = "\377F2\202F3\202HAtSsAF6\202F7\202F8\202F9\202F10F11wsrwp\202;\031\204F14F15db\202F17bH\202F19ns\202sDm;\035\204pH\202xpSF24wHmXn\202F27F28stiSd\202ms\202;!\204X\000\201sd\202ib\202nfrzmAF37;%\204F38;)\204\001\034\204Aw\202F41sprF43iwaF45;-\204qAb;1\204F47;5\204F48F49F50F51;9\204;=\204;A\204F52F53A\000\201AA\202G3\202tywG5\202G6\202G6aG7\202G7aG7bG8\202G9\202G10G11;E\204G12G13mwtG15\016\216\204m\000\201mm\202G19G20;I\204nH\202Db\202\000r\204G24Ax\202G26;M\204dSrgm\202bA\202G30G31\017\242\204G33G34aq\202wr\202;Q\204nDs;U\204gb\202zA\202pA\202xn\202wSAw\000\201;Y\204ww\202G45;]\204mAwTA\202G48G49G50G51G52G53snDH1\202wSmpAqnr\202H5\202Sw\202H6aH7\202H8\202aSA;a\204mzHsbksAqI5akm\202I7\202Hfnf\000\201I9aD\000\201;e\204DD\202;i\204I12I13I14I15in\202K2\202ad\202XA\202bz\202\017\004\204K7\202K8\202xprbitL2aL3\202L4\202L5\202L6\202L6a\020\015\204L8\202iAmM1aM1bHn\202xt\202M3arnpM5\202tr\202M7\202SA\202zSnM10;m\204wdnM12;q\204;u\204;y\204;}\204;\201\204;\205\204;\211\204;\215\204wADM14M15;\221\204HA\202;\225\204i\000\201Y\000\201ii\202M19sxtsm\202M22nn\202sw\202rsw;\231\204M25SmaM27M28;\235\204nDmbnrM31;\241\204M32M33;\245\204;\251\204bdtM35Dr\202M37M38M39iz\202;\255\204M41M42M43M44pt\202N2\202N3\202idtzw\202N6\202N7\202\301n\205pzDN10iaHN12N13sbA\016\370\204tA\202N17"; -static const char b132[769] = "\377iw\202;\261\204;\265\204N19wDbN21N22N23\0206\204\001\037\204;\271\204Dw\202Axtxa\202q\000\201iAtN31N32N33;\275\204N34;\301\204n\000\201mw\202N36S\000\201;\305\204N38N39Sm\202id\202N42NL1NL2NL3NL4NL5;\311\204NL6NL7NL8NL9;\315\204;\321\204;\325\204;\331\204;\335\204;\341\204;\345\204\301s\204\301s\205;\351\204;\355\204;\361\204NU1NU2NU3NU4NU5NU6NU7NU8NU9\301x\204\301x\205\301}\204\301}\205;\365\204;\371\204;\375\204<\001\204<\005\204<\011\204\301\202\204\301\202\205<\015\204<\021\204<\025\204\301\207\204\301\207\205pr\202O1aO2\202O3\202h\000\201O5\202O5aHwtO6aO6bO6cO6dO6eO6fO7\202O8\202O9\202O10<\031\204<\035\204\204ge\202\000\342\204phy\015\014\204sarhwami\202\035>\204\012T\204hwa\027\252\204\027\252\204themerlu\202\017\277\204ve\202le\202di\202ha\202shashaly\202la\202\0326\204zir\017\277\204<\354\204shyte\202wyawya\015\334\204khybi\202lenka\202ko\202\012\304\204?\000\201la\202khyma\202londi\202di\202=\360\204ka\202ryrda\202ma\202ngalu\202kho\020d\204\020D\204cheka\202zy\202\031$\204lu\202nen\000\222\204dzudonde\202"; -static const char b172[769] = "\377ly\202vu\202ka\202su\202ny\202le\202\011\247\204la\202janni\202zhi\004\245\204de\202tsa?\000\201de\202my\202dzi\015\351\204le\202ka\202zhi?\000\201di\202\010\234\204chugu\202gu\202ka\202\004\302\204\020\221\204te\202dzi=\364\204\004\310\204\015\351\204shuje\202lhashelo\202o\000\201a\000\201lwea\000\201\027\252\204\006\354\204\006\354\204narrar\027\252\204o\000\201rorjy\202sy\202\005k\205\034`\205si\202na\202\017\323\204pu\202pi\202\021$\204\012S\204\014\222\205i\000\201ghite\202ja\202tsapi\202tsatsaje\202jwe\020Z\204pu\202\014\223\204be\202\311m\204\020Z\204\024\332\204\000\000\200phi\017\323\204\0326\204\014\242\205mi\202\035>\204di\202thuzhidzeshighua\000\201chukew\014\223\204phi\035>\204gwe\000\000\200\014\242\205\0326\204go\202\034\267\205khegwe\0219\204\035>\204ka\202\035>\204\011\332\204\032\300\205kwa\035>\204vi\202my\202\022x\204honbu\202sha\011\247\204ghasy\202\012T\204rorghuna\202\024\332\204murtendi\202no\202sa\202hwino\202lo\202tsinu\202kwidonni\202zyr\024\272\205pa\202my\202ba\202shyo\000\201lheghe\010\234\204ni\202\011\247\205zhuja\202gi\202so\202ge\202ha\202ly\202ku\202chamy\202dy\202!\013\206ty\202honlonna\202ku\202se\202la\202khalu\202dzo\000\000\200\033\331\205se\202\022x\204lhulenno\202lwoha\202shoda\202by\202kyr\012\212\204chyde\202\022\042\204si\202su\202lwu\027\252\205ghu\003\230\204ja\202rerD\315\204ne\202\004\314\204\035>\205\004-\204\022x\204denke\202zyr\011(\204thaka\202swi\027\252\205vy\202vy\202nwytsalwunerkerja\202na\202kwy\004d\204zyrvirlhu\000\000\200lirvirwo\202tewphodi\202\014b\204\005\206\205ge\202di\202li\202\310;\204?\000\201su\202\011\267\205tsima\202no\202kwi\020d\204\035>\204zyrzhuur\202"; -static const char b173[769] = "\377ha\202di\202\023{\204tunlonsan\014z\204ky\202murnernwyha\202na\202\027\253\204di\202ur\202\012\304\204\036\011\205D\315\204?\000\201\011\276\205?ar?argu\202nwylhunen\027\253\204norse\202na\202\024-\204na\202\013z\204gu\202gu\202?\000\201pa\202phour\202\344\307\204penlwy\024\263\204darku\202morvi\202pu\202benva\202va\202vi\202konnerpo\202ne\202nervi\202ar\202ly\202dy\202\012C\204penghuvi\202nweew\202ne\202kyrkyr\011\362\204konhy\202su\202khyjwe\005\032\204pa\202su\202\016(\204khyva\202\000;\204kirkyrkyrvi\202pa\202vwizarky\202pa\202on\202\005\206\204dy\202\016(\204su\202po\202ba\202da\202ghylhuli\202zurhy\202\014\242\205ny\202lu\202lon\020\267\204?\000\201po\202zy\202la\202ni\202dir\036\011\204\017\332\204\017\332\204par\011H\205chaja\202ve\202\011\331\205ve\202lewcharirchaki\202vyr\010[\204vi\202vyrwo\202ky\202rervyrjonkhikwime\202ky\202murda\202\015\351\204je\202ku\202khiku\202bu\202phamirku\202ku\202phamy\202\005@\204er\202ku\202\013\016\204ponme\202mi\202khakhavu\202ka\202\000\000\200\005\134\204jyrmi\202vu\202vu\202chy\005\134\204jwekhati\202vu\202konchachabu\202va\202kon\021+\204mi\202mi\202po\202mi\202\005\206\204mi\202e\000\201\005\206\204wy\202\010Q\204di\202\003\230\204\006\376\204\007\017\204si\202\000\000\200\000\000\200ba\202shy\011\247\204no\202du\202li\202chorirrerj?\202\007\017\204\024\332\205be\202winpe\202zo\202u\000\201lo\202\007\017\204ku\202\006\376\204lerthalu\202ba\202\000\000\200\006\376\204by\202vi\202lu\202korma\202\011\247\204pente\202li\202phekarju\202ma\202phogy\202ma\202u\000\201ko\202jyrnwyrerla\202la\202"; -static const char b174[769] = "\377rerti\202ti\202shapenbe\202cholhobe\202marpenghava\202ke\202py\202lhuhonshighaswy\007\017\204pe\202chilhukhodu\202rorvargha\007\026\204chychichychychylu\202ve\202kwylu\202ne\202shishi\015\334\204ve\202ky\202\014\223\204lenke\202phyni\202by\202chenu\202li\202la\202sy\202se\202an\202miny\000\201jwa\011\361\205\012\221\204\005\007\204ji\202on\202vyrZ\217\204chugy\202ty\202ma\202dzyme\202nga\015\334\204ke\202la\202sy\202thalewmor\014\223\204di\202my\202ji\202\005\217\205se\202swe\007)\204garzyrgu\202\011H\205\011:\204vi\202rirrir\000\000\200\010P\204\010P\204che\012\030\205to\202\004%\204gi\202\312!\204by\202dzunwydy\202gur\011\247\204ka\202\032\300\205na\202=\360\204tsyzewto\202\010=\204an\202nu\202ghane\202kha\003\230\204la\202\014y\206dzuna\202la\202la\202\012\264\204hwa\017\335\204jenla\202?\000\201\011\362\204ly\202\024\332\204on\202go\202\010=\204y\000\201mi\202\036\313\204\004%\204lwejy\202kheghegheby\202u\000\201jwaminna\202nwoke\202\024\332\204shebi\202guron\202na\202ghaba\202nu\202va\202gewly\202khykhakhirir\014b\204chikhu!\217\205kwajwararly\202sha\011\247\205kur\000\331\204thumi\202lu\202lu\202mi\202sy\202gu\202\002\311\204ka\202le\202ky\202\022b\204ky\202\015\334\204ghe?\000\201shalwuji\202ghywerdzu\032\300\204\011\247\204vonga\202ju\202henpy\202ma\202nwy\016\225\204ve\202chu\005\206\205de\202rirvy\202je\202je\202\011\362\204dwughami\202ben\012\221\204phuverlwema\202?\000\201na\202te\202bo\202na\202phyer\202lo\202\030y\205na\202lwevy\202\004d\204\005\007\204lo\202\011\247\205rir"; -static const char b175[769] = "\377va\202si\202tsichiba\202kewso\202u\000\201d\013\204\034`\205\311m\204bonzi\202\004%\204ghelwunu\202ka\202vy\202?\000\201lhunir\011H\205shamo\202\036H\204phygwi\002\014\204kewmyrn?\202su\202ly\202ti\202lenkwidzimersu\202chyghekwedu\202vi\202\005k\205\004%\204dzinu\202ly\202\011\247\205zarur\202ku\202\017x\204\020Z\204ba\202er\202li\202ar\202\010=\204\010\334\204khy<\354\204o\000\201chigu\202\004p\204rirme\202lu\202lu\202nu\202\011\362\204\000\000\200ler=\370\204lernew\0326\204ky\202khyni\202di\202thephyko\202rerngyphyma\202te\202va\202phydzoty\202khozorkhy\012S\204\014\223\204bi\202thydwulo\202lwume\202rurshy!\217\206\036H\204lo\202lhighi!\217\206shy\014-\204jwagha\002\311\204\034`\205ta\202\003\230\204kholu\202da\202ku\202ne\202\017\332\204dzu#3\205?\000\201nwiswige\202khaphathoshyswygy\202la\202ke\202nwobu\202lu\202da\202lhoha\202na\202ny\202sinnwosa\202sa\202ghita\202ne\202cheka\202\002\311\204ta\202ne\202=\374\204tu\202#\353\205\024\032\205i\000\201rirli\202\026\355\205na\202\015\351\204nu\202\034`\205a\000\201<\354\204wu\202lhula\202\015\351\204bu\202swydu\202\003\230\204ka\202ku\202pu\202le\202e\000\201thythyshyshymo\202wu\202lu\202\014z\204singu\202do\202\002\311\204ku\202te\202go\202le\202\003\235\204\003\235\204ew\202ku\202ku\202\004%\204e\000\201lenlene\000\201lene\000\201\004%\204lha\012\004\205e\000\201le\202e\000\201lhalenthelwylwyzhiphyka\202zhiphaki\202\005\032\204lwu\020Z\204lwuche\010\334\204jy\202khi\010\334\204\012\027\205khiny\202ni\202va\202\014\223\204ly\202na\202na\202jy\202va\202ta\202"; -static const char b176[769] = "\377kewrir\010\334\204na\202ta\202gu\202kewchu\005\217\205\004%\204\011\331\205ka\202\024\032\205\005\206\205\005\206\205\014\213\205kweby\202kwehu\202\011\331\205\005\206\205hu\202\011\331\205\005\206\205\004%\204\011\331\205\011\331\205ga\202lu\202lhalu\202rer\034\267\205\034\267\205wyr\017\277\204\017\277\204je\202jirje\202nyr\017\277\204lu\202swathanyrve\202ba\202\003\230\204lendu\202mu\202khigy\202\010\134\204\031$\204\031$\204me\202do\202gu\202\012C\204kwypo\202bu\202my\202\020\267\204lin\012\264\204hyrha\202zewva\202\007\017\204jan\020d\204ky\202\010\334\204sewghisi\202ghila\202>\000\204\010Q\204ha\202L\211\204da\202ghikinI\002\204ly\202\014z\204kha\010\334\204ge\202ja\202a\025\204vanha\202pinde\202jinmerer\202hewkana\000\201\011\362\204rar!\217\205zirky\202ky\202rirky\202rarcha\014-\204rirrir\023a\204u\000\201chou\000\201ny\202\005\341\204u\000\201chodu\202so\202ky\202do\202lu\202lu\202le\202ghau\000\201\004\260\204chisi\202\024\272\205honshale\202do\202khutu\202\024\332\204li\202\026\355\204da\202\005\032\204\0110\204zewmu\202pu\202dzimy\202\310;\204khuny\202phapha\011\247\204zyrtu\202my\202\017Q\204rerbi\202ven\010[\204jar\011\361\205le\202le\202lha\005b\204ku\202jy\202by\202zhu\035>\204#\353\205\014\223\205tsishy\015\013\205du\202khilewkwobi\202\011\332\204ly\202lwudu\202var\014\222\205\014b\204kheshaka\202\005\007\204da\202dzorarshe\026\355\205zonlonzhubu\202ky\202ba\202khulendzeku\202lenrerdy\202vi\202ghuky\202lu\202lonpardzakhilu\202narvorgew\010[\204du\202tu\202vy\202vu\202rer\012\212\204lon\000\000\200ne\202la\202dziphavu\202\011\361\205o\000\201da\202\005y\204\000\000\200kheko\202"; -static const char b177[769] = "\377\011H\204jo\202o\000\201to\202o\000\201vu\202lhegu\202zony\000\201cha\004%\204?\000\201sa\202rormy\202my\202pa\202khashaja\202ke\202cholonbe\202chejo\202?\000\201o\000\201ge\202\034`\204gew\0261\204\011\361\205twilu\202kewke\202lwime\202my\202la\202lewsi\202lo\202da\202lu\202ly\202\005\241\204shodzijankhule\202vi\202bo\202gu\202lhi?\000\201dwulenryri\000\201\011\247\204\011\247\204lo\202ryrpen\012\325\204\000\000\200thozonzewva\202swiga\202shada\202khudu\202ghaja\202ghyky\202rurlu\202kheno\202nwy\0120\205sy\202nirdyr\005\206\205de\202gu\202si\202la\202landa\202rirmursi\202\012S\204to\202\020d\204kan\011:\204rirve\202se\202pa\202marvermy\202na\202turghechakewge\202vu\202na\202kwydi\202photen\032\300\204rerdzilu\202dy\202rur\036\011\205gu\202\034`\204bi\202si\202pu\202\026\355\204>\004\204ka\202vi\202nwutsilwe\301\237\204nwyshaphe\010\234\204\011\250\204ryrtwege\202jy\202ur\202ge\202da\202ko\202henpo\202banghy\005\217\205le\202kurda\202ky\202ni\202er\202chilenvi\202di\202hu\202ne\202li\202do\202\011\332\204merrurne\202\310;\204tsy\000\000\200\023a\204ky\202nu\202ba\202\311m\204\014y\205rar\0110\204ge\202\007\026\204ly\202khy\023a\204tsymy\202\301\237\204lenvi\202\0110\204ur\202\024\332\204lenku\202i\000\201pi\202tanko\202chakonphipo\202\012C\205lorba\202\021D\204gheli\202po\202ju\202lwugi\202ly\202\017\323\204te\202manrir\020D\204ra\202gi\202nirlwevo\202ker\034`\204\020D\204py\202\003\230\204\003\230\204khya\000\201ir\202py\202ka\202ne\202py\202phidi\202morka\202phi"; -static const char b178[769] = "\377\024\332\204bu\202rirtu\202ka\202gy\202po\202ti\202dzomyrjan\036\313\204va\202tu\202khyko\202du\202karby\202ba\202photha\007\017\204pi\202ky\202byrthelhubi\202a\000\201nwishodo\202by\202phybo\202dzido\202ti\202ky\202jwumi\202bi\202\016\015\204rorki\202a\000\201\012S\205thithedo\202shia\000\201pa\202zhyphody\202dzili\202\005@\204le\202ka\202tsumo\202lo\202nga\0110\204\011\247\204dzidzi\004j\204?\000\201ar\202bi\202?\000\201dzi\000\000\200pi\202li\202mi\202ka\202mi\202phytha\003\230\204nu\202?\000\201ar\202dy\202on\202\011H\204li\202ke\202ka\202tu\202bi\202bi\202vy\202to\202dzima\202yr\202yr\202dzijo\202hwi\011H\204sholenkhylu\202ji\202la\202se\202?\000\201le\202\014\223\204de\202shenonsi\202\017x\204berly\202ber\033\331\205no\202swaswahy\202hy\202\005\207\204\014\223\205ni\202\012\030\204kewtsatsavu\202je\202pinni\202\007\017\204si\202u\000\201rirdzungarir\024\023\204\014\212\206!\343\206swunarzo\202u\000\201?\000\201u\000\201le\202\023{\204my\202vi\202dzilhila\202da\202gi\202mir\021g\204tsapi\202lhy\017Q\204gy\202gwi\021$\204na\202\011\361\205ga\202tharervorjonkhyla\202y\000\201rirmi\202ze\202de\202\005\341\204\014a\206rerlhylhygwi\0110\204\003\230\204\012S\204\004%\204lhola\202mi\202\031$\204mi\202my\202rarlu\202ty\202du\202longi\202tu\202vi\202\011\362\204ze\202\020Z\204\001\225\204no\202kewthume\202\012c\205verde\202thy\017Q\204\012\211\204py\202\004%\204\014z\205phothethabi\202\014-\204vo\202\012\211\205e\000\201de\202kwidzibo\202se\202vinbe\202gy\202lhyne\202tsirarlhy\036\313\204li\202gy\202\024\245\204"; -static const char b179[769] = "\377she\036H\205di\202na\202yr\202me\202ly\202dewgi\202ngasu\202me\202tu\202be\202sarkyrka\202phekewthomu\202\013\272\204te\202zwidenda\202mi\202\020Z\204lonchipen\005\032\204vargi\202bi\202ma\202thungashychuju\202\010P\205\005k\205kyrni\202winnwydzi!\217\206len\011\361\205my\202be\202\0326\204ne\202ka\202chighu\027K\204va\202na\202sinlo\202lhyli\202\011\362\204khelyrty\202ty\202merty\202thyde\202ge\202my\202ne\202gu\202gu\202o\000\201norhu\202ngongo\017\277\204zu\202twyphyli\202\015\013\205zi\202ryrkwydu\202gu\202la\202me\202lu\202ji\202tsutserirghu\004d\204jwolwulene\000\201e\000\201le\202kurgwila\202dzepinli\202\015\334\204khylu\202la\202\003\230\204lo\202\005\206\204phia\000\201\0326\204gy\202pa\202ho\202ghidzihwedirkhe\004\302\204lew\001\225\204be\202\024\245\204ne\202\012\325\204?\000\201rar\007K\204lhyhu\202\005\206\205dy\202so\202\036\313\205merso\202khysi\202\011\361\205\021D\204so\202je\202kwymy\202vy\202on\202dzanwile\202\017\332\204na\202mer?\000\201to\202thyew\202gu\202zu\202pheghu\012T\204hwarirdzumi\202py\202>\004\204li\202ni\202vi\202L\211\204me\202>\004\204na\202u\000\201penlewrer\000\000\200gi\202?\000\201\007K\204ta\202<\354\204swyvi\202to\202rerno\202konke\202\034`\204bi\202phalhyngalu\202lu\202\020Z\204\042g\206vo\202ly\202denge\202lhumo\202tsizhyke\202tsedy\202na\202phazirgy\202li\202rerbo\202pe\202photho\007K\204di\202e\000\201kheswylewkhathusarni\202lwuze\202\004\274\204]\022\204jy\202dzu\0120\205thymi\202"; -static const char b17a[769] = "\377j?\202phuen\202la\202ew\202lhy\014\243\204\020Z\204birni\202kyr\010\223\204nwyhwa\005k\205jonpe\202charirsa\202newbo\202pa\202dzuba\202lhekarryrdzi\012\212\204lhej?\202lhyde\202li\202gu\202dzo\317U\204by\202kwyrorpa\202ky\202ghururzheka\202\0326\204la\202nu\202ti\202ti\202lonkwyto\202lhyghyghyle\202vi\202jweparhe\202du\204\017\247\204bi\202mer?\000\201do\202\026\355\204gwivinbu\202si\202\0120\204my\202lhuvy\202tew\012\211\204gu\202ku\202a\025\204ew\202mi\202dzadzu\017\332\204no\202phudu\202no\202\005\032\204penbi\202cheba\202ve\202\014\223\204shubi\202bo\202ko\202mi\202tsyvanlhomy\202shi\020Z\204ke\202swekwanwivi\202jwinewby\202\042g\206i\000\201\004d\204i\000\201\000\000\200\033\222\204la\202D\315\204zi\202si\202khugi\202ko\202thuthuchoswybu\202my\202zwibi\202khy\017\247\204my\202ni\202si\202ke\202\027\252\205ku\202\012S\204lonbi\202lon\024\332\205shimurdu\202\344\307\204nor\010=\204u\000\201ghughugwodzaN\273\204chichipa\202shume\202pen\011\332\204li\202kondy\202mi\202gi\202gi\202by\202\007R\204vi\202dewchepirdy\202rardzoghimartenburku\202la\202norwi\202ta\202N\273\204\024\332\204new\000\000\200shuse\202be\202by\202\034`\205ni\202shimy\202\011(\204su\202nu\202ba\202G\252\204i\000\201thowin\005\207\204\000\000\200ly\202\0261\204li\202ew\202\000\000\200dziN\273\204\005\207\204ny\202by\202pa\202nu\202jy\202\007\026\204nwy\024\366\205jyr\000\000\200honchalhudanlhipar\031$\204khekirma\202kirde\202de\202i\000\201\010\223\204\014a\206je\202ly\202khely\202kwi"; -static const char b17b[769] = "\377lwudenvarsi\202\012\304\204ma\202phila\202vi\202si\202\010\223\204\010=\204zingu\202\011\362\204lensy\202chyda\202\011\331\205lhamervi\202vi\202lo\202\022x\204ny\202rirko\202rirbe\202zirba\202bingwypy\202shude\202hewvy\202py\202ki\202lhodyrde\202ja\202dyrkwyji\202zhuda\202pe\202len\344\307\204kwa\0030\204na\202lenrarkoryr\202\000\000\200lu\202nirlenburso\202hontenjy\202ta\202ge\202bi\202chye\000\201chydonje\202shige\202lu\202shukhyghele\202le\202khypy\202tsa?\000\201sy\202\011\270\204ja\202\0110\204bi\202le\202\031$\204\012c\205!\343\206\0110\204pu\202par!\343\206dy\202swivi\202si\202pi\202pi\202dy\202>\010\204on\202\012S\204ga\202thuthuon\202rergo\202nirpe\202barpyrle\202\021+\204di\202bu\202zwebu\202zwepho\012\220\204N\273\204rerli\202dirna\202li\202phokewi\000\201dzijyrge\202thuthumy\202ly\202\021+\204my\202\014b\204by\202\014b\204\014b\204bi\202\020Z\204?\000\201\023a\204\024&\205\014a\205li\202by\202\023a\204bu\202thumy\202chilhikhili\202su\202\035>\204ly\202li\202ni\202\014\223\204si\202sa\202ge\202gurma\202ghu\003\235\204zwypy\202so\202tsybu\202pe\202rernirkwy\011\250\204\011\250\204venrurka\202swumy\202le\202vi\202ly\202\031$\204be\202\012\211\204\031$\204twyby\202\010[\204\011\361\204\012S\204dzole\202le\202\016\300\204le\202lo\202gwygu\202kwylhelhebe\202\003\230\204\016\300\204le\202gwygu\202ky\202lhelenkhyrurtwutu\202lo\202verve\202\004-\204te\202thi\010\223\204lu\202nwykhuchyma\202\005\341\204panlu\202\021\212\204ja\202ja\202marlu\202ver"; -static const char b17c[769] = "\377\004-\204jonhwo\012\263\204gwege\202lha\023a\204jwa\023a\204\004|\204\004|\204\004|\204jewu\000\201me\202me\202tyrbonlo\202ew\202?\000\201shoghau\000\201\0261\204ly\202dzemyrpi\202na\202wi\202shika\202ga\202ze\202la\202\027\252\204lwo\026\355\204ew\202wo\202\017\277\204to\202to\202shavyrlhykirgu\202\000\000\200lhygu\202gu\202\000\000\200\024\333\204\010\334\204\004p\204\024\332\204lhio\000\201\024\332\204ni\202wi\202o\000\201thysi\202thythylhi\005\007\204li\202li\202lhethythythuthuchapu\202tho\017\323\204ge\202jy\202hanrur>\014\204che\007K\204kurdzumy\202lu\202jwian\202?\000\201je\202>\014\204na\202vi\202chelhiky\202me\202lu\202nwei\000\201su\202py\202\011\250\204tendewlan\012S\204du\202rervi\202li\202du\202ky\202lu\202\017R\204me\202na\202\027\252\204dzydew\010\223\204lo\202cha\004\260\204len\034`\205\042g\206\007K\204vy\202\007\026\204jo\202thylu\202ma\202lorverna\202be\202dewen\202bo\202\004\260\204tsi\011\247\205syrrurjwikwekweky\202ky\202rarpy\202ngahinlu\202e\000\201thytsevi\202me\202zir\027\252\204janby\202ka\202vy\202>\020\204\011\267\204kwe\034`\205lwu\016\027\204lu\202li\202\017\323\204\003\230\204ty\202lu\202shutha\317U\204er\202\012\221\204me\202me\202me\202rurbi\202kyrvi\202lhodzurarthe\020Z\204ge\202te\202so\202si\202\013\016\204rarbi\202\003\230\204\012T\204jwape\202\003\230\204\000\000\200\005\007\204ka\202ka\202ka\202lhio\000\201lhavenbi\202\014b\204je\202mer\027K\204ju\202ka\202mi\202ja\202o\000\201zir\024\023\204dwuer\202u\000\201u\000\201\000\000\200tha\025@\204shy\035>\204\024\332\204\036H\204\022x\204tha\022x\204thachagewlon\036\313\204ka\202"; -static const char b17d[769] = "\377so\202ka\202N\273\204N\273\204yr\202ki\202jwylwedonphelhi\310;\204zontontontsa\007\017\204\020\003\204ka\202rirla\202pa\202ve\202pe\202\005\206\204zewpe\202\033\222\205kwuzewrirpa\202tenga\202bu\202vyrew\202mewzhavi\202sy\202sy\202myrki\202chuswude\202\000\222\204\000\222\204rorjwe\026\033\204rerlu\202\000\000\200la\202\012\304\204no\202ma\202me\202\011:\204lo\202ve\202ku\202vonkhuly\202vi\202lu\202lwu\014\243\204\012\211\204rirdonmu\202jonwerlu\202\014\243\204bu\202ne\202o\000\201ki\202lon\005@\204by\202\012\220\205rorchabo\202bu\202lu\202<\354\204lon\011\362\204\014\222\206\034`\204cheu\000\201\017\323\204se\202thuto\202de\202shylonjwege\202ve\202ko\202di\202chyti\202kirrorno\202dzatsuhe\202shehe\202my\202va\202shaghy\022\042\204ba\202bi\202lu\202mi\202tsichimy\202chu\010P\204di\202di\202zyrne\202\005\032\204\000\000\200bi\202jwylu\202mi\202\033\222\204\000\000\200bi\202ba\202an\202chachochojwyne\202swyjy\202lu\202\003\230\204bu\202dzuhu\202nermi\202lu\202kewka\202jwidarthito\202lew\000\000\200ghuga\202shane\202chota\202khoha\202shishyshyzo\202shihu\202\012\030\204shyshye\000\201\023a\204\014y\206dzashije\202zhoshyphiphity\202sheta\202\000\000\200ti\202je\202karbu\202hwiphi\000\000\200twetwu?\000\201\014y\206twoke\202lwili\202ke\202di\202me\202li\202\007)\204\033\331\204ker\020Z\204jwudu\202du\202by\202du\202en\202en\202du\202ny\202#3\206kinvonkirt?\202jengindu\202\021\255\204ty\202by\202lhiew\202\021\320\204ma\202te\202ni\202\000\000\200le\202ma\202"; -static const char b17e[769] = "\377u\000\201lwo\014z\204vi\202ni\202#\353\206\015\334\204de\202di\202jenlu\202\011H\205vo\202tsukwylwiyr\202jyrsu\202\021\255\204yr\202\010\334\204ga\202\021D\204ha\202\012\263\205ga\202\010\334\204\010\334\204\007\202\204ne\202ga\202hwa\017\332\204twaty\202tintu\202jwu?\000\201\005\206\205le\202ar\202le\202\025@\204vy\202vy\202jwutonno\202zurlannwy\011\362\204\024\245\204\024\245\204thusy\202swybyrlhi\020Z\204di\202u\000\201\0219\204margonswosy\202\011:\204ki\202swyo\000\201gonku\202\010\234\204sy\202\020n\204\317U\204dontwu\0219\204?\000\201\0219\204\024\245\204donlu\202go\202don\005\134\204nerchejwyne\202my\202my\202rerkirdo\202\003\230\204sherermy\202my\202en\202ki\202le\202te\202se\202be\202dy\202rorchyhenba\202je\202my\202landu\202\005R\205\023a\204phe\007)\204dew\027\252\204chephede\202linhenve\202rorma\202sa\202lhade\202the\036H\204gi\202\036H\204\000;\204jwy\035>\204en\202\023a\204ba\202?\000\201twi\012S\204ki\202tsaja\202ew\202zurswa?\000\201dzutontu\202\010[\204tu\202ja\202po\202shipy\202be\202rurN\273\204nirsharurby\202\024\332\204jonvi\202ghulon\012\030\204li\202va\202thoso\202ew\202zurzwyhewsi\202ha\202pa\202rarvarpa\202bi\202de\202de\202kwa\312!\204lanshashapu\202lu\202do\202\017\277\204\012\263\204bu\202lewka\202bu\202rur\343\225\204on\202ju\202sharirshu\012S\204jonno\202kewphezingu\202hini\000\201lho\011\247\205\027\252\204\012\030\204?\000\201zinsherirzinnewvor|F\204a\000\201le\202zur\011\247\205\011H\205\012c\204penthoku\202ho\202thughabu\202va\202cha\014\243\204ba\202vu\202swy"; -static const char b17f[769] = "\377gwivu\202ba\202\014\243\204\025R\204nwy\011\362\204mi\202na\202swesew\024\332\204ka\202sa\202my\202po\202\310;\204lhikhuzy\202\034`\204lo\202lo\202denN\273\204ghuon\202\025R\204ghilo\202kon\011\332\204\010\334\204pe\202zyr\007K\204vonka\202dzukew\005\007\204ghadi\202su\202bandzudzuta\202li\202\017Q\204bu\202varle\202hon\004\260\204ghalwijwodzuly\202khusewninne\202lhyghy\007\026\204bu\202ly\202chylwu\036\313\204li\202ti\202me\202\020d\204en\202dwydwydi\202dzyde\202N\273\204\000;\204by\202kon\012\211\204ly\202gy\202\000;\204kewpa\202vi\202kwa\013\016\204\010=\204lu\202verkewlon\032\300\204gurhon\027\252\204ta\202ti\202\010=\204nwe\012\211\204\011:\204na\202\004v\204bu\202dange\202\017\332\204danphy?u\202ar\202ly\202shikurkonkyrku\202sardzudzuke\202ku\202\004d\204ly\202rarjewbi\202mi\202sewve\202ti\202vergwikwivir\020D\204mo\202no\202ly\202bi\202rirgorha\202ve\202lewne\202nu\202\037\042\205>\024\204ny\202va\202rur\0160\204so\202dzighusa\202chona\202myr\010Q\204na\202se\202\007\026\204ne\202zy\202bo\202\000\000\200ne\202\012\263\204?\000\201bu\202khuhu\202ji\202bi\202\011\331\205be\202tsubo\202bo\202rirrir\005\032\204phyke\202dy\202khuy\000\201she\015\351\204kheghulonbo\202cheshalew\011\331\205\037\042\205\010\224\204\000\331\204lhy\005\007\204wu\202ngame\202\012\263\204khuha\202ban\036H\204dzidi\202mu\202\037\042\205vinzurmer\344\307\204vy\202ma\202tsy\005\341\204chesa\202kwykwymy\202py\202di\202ke\202me\202sho\017\332\204\0160\204ghale\202je\202vi\202on\202nu\202ku\202\344\307\204ma\202vi\202de\202"; -static const char b180[769] = "\377\021\255\204thokhugu\202gu\202gu\202ne\202>\004\204phu>\004\204ly\202ge\202\005\032\204na\202murpu\202>\004\204pu\202jantsephu\005\032\204ge\202\011\331\205phebo\202\034`\204ly\202\011\331\205wy\202zero\000\201kwidy\202thalendy\202lu\202me\202me\202?\000\201\007\246\204rarzy\202ghakwelhyma\202\012S\204\000\000\200khakha\024\273\204ku\202la\202ryr\024\273\204khakha\007\026\204ni\202\012\211\204\011\361\205no\202kirdzea\000\201a\000\201my\202phu\031$\204y\000\201shy\004\342\204lhi?\000\201lwylwythyby\202bu\202bo\202rorbu\202rerbu\202by\202za\202kwyjwakwyzy\202dzune\202\010\223\204do\202a\000\201za\202\001\225\204\360I\204\032\300\205te\202te\202\032\300\204bu\202\017x\204zy\202ne\202te\202\010\223\204zy\202dzilwika\202za\202dew\010\223\204tsedzy\020\221\204thy\020\221\204\025@\204\014b\204\014b\204\014b\204\004\342\204kwise\202\011\250\204nwyli\202on\202ew\202tsypenlo\202di\202?\000\201zi\202\005\206\204ghyla\202be\202be\202\012S\204shidanlo\202ta\202tsypyr\011\362\204pa\202lo\202\012\211\204zar\017\332\204le\202dewlon\005\247\204\012S\204li\202kha\011\362\204hankhabe\202shidzevy\202o\000\201lwenwobo\202shobo\202su\202zhame\202?\000\201vi\202\016(\204kenne\202chilewda\202ne\202ka\202vy\202\017R\204lenvy\202\017R\204\024\332\204vi\202vi\202rerlin\005\206\204y\000\201dzuti\202no\202pa\202pa\202\011\247\204mi\202\017Q\204na\202dy\202da\202zardy\202ke\202ly\202\024\332\204rarrarvi\202ly\202wandu\202vi\202lewvi\202vo\202du\202ly\202go\202\007K\204#3\205jwakwyo\000\201kholy\202go\202\025Y\205\025Y\205ve\202kewle\202ryrswonu\202le\202vy\202my\202in\202la\202o\000\201lhyla\202"; -static const char b181[769] = "\377chuky\202gi\202li\202zi\202lhiphomi\202o\000\201lenli\202ghyte\202ba\202gi\202ju\202\000\000\200ba\202pa\202penpensy\202du\202\024\332\204\007\202\204chedu\202lwano\202\014\223\204u\000\201\012S\204\036\313\204se\202a\000\201khuphyse\202tena\000\201tsutsurertsulentsukhy\024\245\204\036\011\204\013\016\204ly\202ly\202\012\211\204o\000\201bwema\202ner\321;\204ba\202lwakhenga\0030\204te\202ta\202rirla\202ngasa\202du\202sweti\202lhyte\202le\202\005\217\205bu\202ze\202len\004\245\204phubonla\202=\364\204\023{\204zonby\202zi\202nerrardenja\202di\202lwuner\012\211\204twuse\202\004\310\204da\202rar\004\245\204\000\000\200kwingacheta\202chuthyta\202\0120\205dzyghutwa\012\211\204\012\211\204lwalwa\005\365\204nerli\202nerden\007)\204\320\207\204\000\000\200o\000\201bu\202ver\002\014\204le\202by\202ny\202ka\202le\202le\202lu\202\000\000\200\007\202\204wo\202\014\242\205ka\202rirly\202?\000\201gi\202ghulhabarga\202\012\263\204jy\202\012\263\204ge\202ge\202na\202\012\263\204rerkhi\017R\204\011\247\204\011\247\204ta\202ka\202\011\362\204?\000\201dze\011\247\204ti\202mi\202ta\202tensheli\202chidzikwekwe\011\331\205bi\202so\202ni\202su\202tarphimyrbi\202\011\247\205kwege\202dzishe\034`\204shegu\202wu\202lwurer\0120\204bu\202ta\202li\202le\202she\021\363\204wu\202na\202phe\011\362\204ghuvirvordza\017Q\204lu\202lu\202lenvanmi\202penbi\202bi\202bi\202khybarthuthulo\202ge\202pho\005\341\204on\202\014b\204ni\202bo\202ny\202\012\304\205swida\202ni\202\037\251\205pa\202vi\202ma\202vi\202\035>\204vi\202\016\300\204chushyjo\202mu\202ge\202no\202ji\202ni\202"; -static const char b182[769] = "\377varshylu\202rarchyno\202\010[\204rarmi\202\011\331\205vi\202phevo\202no\202to\202rarar\202myrdzerarbi\202\022\042\204vi\202kan\012\030\204de\202gy\202\0110\204\0110\204\022\042\204me\202ly\202ke\202\015\334\204lenkhiharsa\202lhude\202nurlewta\202u\000\201de\202u\000\201jenby\202jenme\202by\202mo\202ga\202ni\202ryrgi\202roron\202ly\202vyrma\202\011\270\204du\202\000\000\200\005\134\204mi\202\017\332\204dzulwudza\012S\204\017Q\204\017Q\204ba\202ba\202ar\202zyrbi\202dwa\011\361\204on\202my\202mo\202ba\202dwalen\003\235\204on\202zyrthedwa\022\177\204\011\361\204na\202na\202pu\202\012\211\204pu\202dwepu\202virja\202ja\202ja\202\024\332\204lewnwogi\202rarhonphe\005\032\204nga\011\250\204gewlhidzirer\005b\204\017\247\204dyrtsu\005b\204lhithodzive\202tsuzhy\011:\204ni\202se\202nonpo\202bo\202\011\362\204\0030\204ke\202sewpo\202jewpo\202\000\342\204ke\202ke\202no\202konla\202j?nj?\202pa\202\015\351\204penmy\202vi\202dzokhiir\202lu\202\004\342\204ze\202lu\202to\202so\202thuj?\202thujew\001\225\204thushyphasa\202\012c\205tartwiphaphaphabo\202thuthuny\202nu\202ba\202ka\202nwyny\202\011U\204N\000\204ka\202ba\202gurjwiphu#\353\205phusanhwahwino\202jonjondwuchyu\000\201\310;\204ne\202ghakwagy\202gy\202le\202ho\202khedzuko\202rirdzubenrar\000;\204zar\000;\204my\202phi\012\263\204my\202jandewzhalo\202\024\332\204do\202tyrcha\012\263\204\036\313\204ar\202en\202bo\202to\202lu\202gwien\202bo\202gwi?\000\201bo\202gwi\011\362\204zhukurgha\011\362\204ne\202"; -static const char b183[769] = "\377er\202\010[\205u\000\201rir\007\202\204ze\202ka\202no\202u\000\201kwogewlhi\014\243\204ngashi\020\346\204khiso\202kon\015\334\204rirjon\301\237\205\015\351\204\007\202\204dwuly\202lwipi\202pu\202tsype\202\004v\204lwizu\202zu\202dy\202be\202zurti\202la\202#\353\205yr\202rarvy\202\033\222\204kha\034\267\205phydzi>\024\204vi\202\010>\204shi\012\211\204lu\202to\202lhyphiphily\202thybarphila\202\0326\204mo\202C\015\204ki\202\007\246\204la\202\007\246\204zirkhatewrarphiphio\000\201tsirerlen\025Y\204\010\334\204chichuwargu\202bengu\202pu\202chupy\202o\000\201o\000\201tsy\020\267\204e\000\201e\000\201\020Z\204bi\202\020\267\204e\000\201ma\202hi\202hanhu\202\0261\204ha\202swiharswi\036\313\204\036\313\204\036\313\204ge\202li\202vi\202\010\223\205te\202phivi\202vi\202la\202vi\202vi\202gi\202?\000\201shyphi\000\000\200vi\202vir\000\000\200jwyponjy\202lhodzijy\202!\343\206!\343\206swu\032\300\205chezha!\343\206lu\202\011:\204\011:\204\017Q\204lhyli\202\011:\204ve\202shita\202si\202na\202shasi\202no\202ta\202\010\334\204ty\202\012\263\204vyrva\202lhiswe\011\247\204ki\202kwinwypi\202kardo\202\033\331\204lhuvi\202ka\202ze\202kwynwyta\202du\202di\202shythy\011:\204\020\003\204ky\202de\202swekweky\202ti\202\000\000\200so\202rirva\202#3\205kursy\202ka\202ghadzuty\202\010\233\204phuphise\202\004j\204virtenchirurshati\202be\202tewN\273\204po\202a\000\201tsekhe\005\341\204lwilyrdu\202tena\000\201ly\202\010>\204ne\202ha\202karchyne\202shivy\202sew\005\134\204sha\010[\204?a\202\006\021\204di\202shytsytarrur\032\300\205switseka\202"; -static const char b184[769] = "\377phylu\202nwy\000\000\200\021$\204gi\202la\202la\202kwava\202\004\310\204vu\202la\202#\353\205pi\202ti\202ma\202rerer\202ta\202\014y\206\017\323\204lu\202ty\202ku\202\024\332\204\012\030\204ly\202pir\014\243\204\005\007\204na\202\004\342\204chygi\202phy\014y\205vu\202vu\202pi\202la\202phychykhibo\202go\202garrirkwydewlho?\000\201\003\251\204phyjwokarzyrphilo\202rer\025R\204\033\331\204ka\202ky\202ty\202rorlho\000\000\200du\202ky\202phyi\000\201ka\202khukhu\005\365\204je\202lhite\202ta\202rer\000;\204ky\202 t\205chararla\202\003\251\204shima\202?\000\201\010\334\204se\202me\202zonmy\202vorvor\010\334\204se\202e\000\201\022x\204sewsewwu\202lo\202\010\334\204kan\024\366\205zi\202dwuu\000\201\024\366\205\014z\204\020Z\204\026\355\205\026\355\205thytse?a\202\000\034\204zi\202di\202di\202rorzi\202du\202londu\202du\202ha\202lu\202\034`\204zhytwe\012\211\204ghulo\202zhy\011\247\204bo\202twi\026\355\204ga\202lo\202jwelo\202partweto\202lo\202panpantwibe\202ba\202the\032\300\205zhu>\010\204\000\000\200me\202me\202da\202li\202phythudwuphedzudu\202zewne\202zewzewzewzewta\202tyrto\202ta\202to\202hwywy\202vy\202lhunarlwenar\027\252\205\012\030\204lwilwily\202ly\202ly\202rurkhyly\202ly\202ju\202\017\277\204zyrlon\017\277\204si\202swirur\021g\204\010P\205\0326\204vy\202my\202rurkondzygu\202rurrur\021\363\204dzichyti\202je\202gharurdzeba\202va\202u\000\201le\202?\000\201rormu\202be\202chegu\202di\202rur\015\334\204\007K\204\005\206\204\005\206\205\005R\205\000\000\200\007K\204gu\202\017\247\204\007K\204va\202\005\206\205ghapy\202lo\202an\202vi\202"; -static const char b185[769] = "\377vu\202bi\202jy\202\004\314\204lo\202zur\000\000\200lha\021\255\204\021\255\204py\202\004-\204je\202u\000\201danbi\202ngane\202ne\202\023{\204nu\202ne\202ne\202ninhunne\202ne\202jy\202\037\251\205ne\202hondzyne\202ne\202\027\252\204thaku\202ku\202rirgu\202ne\202\021\255\204\017\332\204lu\202bi\202\017\332\204varkhuo\000\201pa\202me\202>\030\204du\202kwy\016\300\204se\202o\000\201by\202khikhononnon\023a\204\026\355\205dzizyrje\202je\202tantantan\007\026\204chyvi\202khyjartwu\032\300\205ne\202\005l\204ly\202u\000\201ku\202no\202ly\202so\202ve\202ku\202tsytsyne\202ke\202ga\202be\202dzi\017R\204D\315\204\017R\204by\202va\202u\000\201la\202\000\000\200da\202si\202si\202\007\026\204\005k\205bi\202bi\202hy\202hi\202phushuku\202ku\202\017\332\204\011\250\204phu\004\225\204ta\202\032\300\205gu\202gu\202gu\202gu\202nerghasi\202\012S\204\005k\205va\202khyvi\202lenlenlenkhemy\202ngymy\202gi\202ve\202my\202my\202my\202my\202li\202\014\223\204tsomy\202jy\202jy\202no\202no\202\011\362\204kwi?\000\201kyrbi\202kyr\000\000\200gi\202kyrkhe\012\304\205ta\202ghalonko\202kyrby\202nu\202khakhuryr\014\222\205zhu\000\000\200gi\202\012\324\205\016\300\204\003\251\204ma\202\004\310\204lhynu\202!\013\205van?\000\201\004\260\204gwinwyja\202\011\361\205vi\202\020d\204\012\211\204\004\310\204!\013\205lenranryrge\202zirlhu\004\314\204\024\332\204de\202v?\202bu\202gwida\202>\020\204khepo\202darbu\202de\202bu\202\004%\204lu\202vorne\202ghakurghadu\202\005b\204jy\202\000\000\200zwimy\202chulwula\202ju\202ju\202ju\202lordewdewno\202\033\331\205kirrarrarny\202vi\202vi\202vi\202\015\334\204\020\003\204zo\202lhelhe"; -static const char b186[769] = "\377shishochogi\202\014b\204ke\202la\202\014b\204\025R\204ke\202\014b\204me\202shudi\202\012c\205wu\202shevirvir\000\331\204ja\202vurli\202li\202sa\202je\202dzekewshedzeka\202za\202po\202za\202gi\202y\000\201jy\202y\000\201#3\205ka\202zy\202ky\202tonbi\202jy\202vi\202mo\202ghake\202\012T\204so\202gi\202\004\343\204sonvo\202virgi\202ky\202ky\202yr\202\020D\204me\202\021\212\204murtarse\202bi\202y\000\201\010=\205ku\202vy\202ryrmyrkenlwirirky\202lhulhitsova\202lhopi\202pi\202tewky\202ky\202zi\202ky\202\000\000\200\025Z\204\017Q\204ny\202lhy|F\204lhokonzwiba\202shimy\202lhise\202gwison\036H\204sy\202shotonlewlewbe\202lewbe\202jo\202ve\202kordzurirlu\202lo\202e\000\201e\000\201\017\277\204mu\202\032\300\205honle\202sa\202vi\202\026`\204du\202ky\202\026`\204tu\202vo\202tu\202yr\202yr\202donrerkhyjonswosonsonsonva\202me\202lonlwolonlhipy\202py\202lhi\024\245\204lu\202?\000\201lhily\202ly\202je\202ge\202\012C\205lu\202ba\202?\000\201on\202khedzily\202M\216\204vo\202ko\202ly\202ly\202ly\202ly\202\015\014\204ly\202ko\202ly\202ly\202dziswy\020\003\204di\202lwylwydy\202me\202be\202be\202be\202lu\202?\000\201dzy\011\270\204gu\202ka\202\012c\204ka\202kha\000;\204nwunewna\202twu\032\300\205\005k\205be\202nwy\012\030\204|F\204|F\204shyli\202ne\202tenzi\202tsumo\202ve\202?\000\201ji\202mersharurrurse\202lenkwaky\202bi\202lewvirse\202khegu\202khegangu\202la\202gu\202to\202\0326\204ryrjwu\000;\204be\202di\202\000\000\200lu\202lu\202ge\202"; -static const char b187[712] = "\354myrtsa\017\332\204dzi\005\217\205li\202on\202\034`\204jo\202phi\000\342\204L\211\204N\273\204ar\202le\202nardzapa\202shu\036H\204\005k\205kirdu\202ma\202rirchuko\202\010=\204be\202\005\134\204tseby\202\012T\204\012T\204a\025\204\021D\204ha\202a\025\204\027K\205kwu!\343\205thoer\202ke\202ke\202\004\260\204\004\260\204i\000\201ge\202thyshuthama\202shuthabi\202\012\263\204\020d\204ryrphaphokhuke\202?\000\201phithyjartsivir\035>\204la\202\014b\204jar?\000\201mir\024\332\204lenchuvirju\202ghe\012\220\204\011\332\204\011\332\204\011\332\204ne\202ew\202ew\202ew\202\020d\204\017\247\204\034`\205kur\000\000\200wyr\012\030\204thylor\035>\204nennon\011\247\204jy\202bo\202zo\202\000\000\200jon?\000\201le\202zyrlwubo\202ginkhodwumy\202ga\202e\000\201thela\202khavirvu\202kwokwokwoli\202li\202na\202li\202dzyjonly\202la\202bi\202bi\202tanle\202khy\014-\204|F\204\005\365\204ka\202lu\202shukinshyve\202\000\342\204vansewswyew\202ge\202be\202swy\011\276\205\024\332\204\036\313\204\024\332\204pho\020d\204\020d\204\020d\204lonlonlon\017\277\204zhelu\202te\202\005l\204\010\233\205du\204gi\202ji\202li\202vi\202\011U\204wa\202va\202dzaphukhependy\202dy\202dy\202si\202zy\202by\202ve\202le\202bi\202\003\230\204no\202ghy\032\300\204\032\300\204lo\202shy\032\300\205\022\251\204zar\004|\204zhi\011\331\205bi\202hyrhanhwi\014-\204lhi\025@\204ki\202\017x\204\007R\204ne\202dy\202|F\204\020d\204o\000\201byrkhedzulhyvi\202du\202swuby\202by\202\0030\204\0030\204ten\011\362\204ghavi\202"; -static const char b188[769] = "\3771\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20211\20212\20213\20214\20215\20216\20217\20218\20219\20220\20221\20222\20223\20224\20225\20226\20227\20228\20229\20230\20231\20232\20233\20234\20235\20236\20237\20238\20239\20240\20241\20242\20243\20244\20245\20246\20247\20248\20249\20250\20251\20252\20253\20254\20255\20256\20257\20258\20259\20260\20261\20262\20263\20264\20265\20266\20267\20268\20269\20270\20271\20272\20273\20274\20275\20276\20277\20278\20279\20280\20281\20282\20283\20284\20285\20286\20287\20288\20289\20290\20291\20292\20293\20294\20295\20296\20297\20298\20299\202100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256"; -static const char b189[769] = "\377257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512"; -static const char b18a[769] = "\377513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768"; -static const char b18b[766] = "\376-\000\201\000\000\20020\202\000\000\200\000\000\200\000\000\200ts\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2008\000\2018\000\201\000\000\200\000\000\200an\202\000\000\200\000\000\200hur\000\000\200jau\000\000\200od\202so\202\000\000\200in\202iu\202ei\202mo\202cau\000\000\200iu\202er\202xi\2021\000\2011\000\201s\000\2015\000\2015\000\201ts\202ten9\000\2019\000\201\000\000\200xu\202di\202\000\000\200kaizai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ka\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200hornen\000\000\200li\202ha\202\000\000\200\000\000\200qa\202mu\202\000\000\200\000\000\200\000\000\200xo\202mi\202unike\202ke\202\014\261\204\000\000\200lu\202\000\000\200\000\000\200tu\202eu\202us\202ri\202w\000\201ongdeuen\202tir]\023\204ho\202\000\000\200\000\000\200\000\000\200ii\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\000\201ss\202ra\202\000\000\2006\000\2016\000\201\000\000\200tz\202\000\000\200zu\202o\000\201\000\000\200yu\202ge\202ud\202ungoi\202\000\000\200e\000\201\000\000\200\000\000\200ge\202i\000\201i\000\201da\202\000\000\200\000\000\200\000\000\200qu\202al\202\000\000\200ad\202en\202deucu\202us\202\000\000\200\000\000\200\000\000\200tz\202\000\000\200\000\000\200ur\202\000\000\200\000\000\200\000\000\200\000\000\200po\202ang\000\000\200feik\000\201\000\000\200\000\000\200\000\000\200\000\000\200buniu\202an\202\000\000\200\000\000\200\000\000\200siop\000\201\000\000\200\000\000\200pu\202co\202\000\000\20080\202\000\000\200il\202inggo\202ro\202\000\000\200\000\000\200\000\000\200ho\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200b\000\2013v\205\000\000\200\000\000\200\014\261\204\000\000\200\000\000\200\000\000\200\000\000\200go\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200yo\202yo\202on\202qi\202uanden\000\000\200\000\000\200\000\000\200\000\000\200au\202gu\202\000\000\2003\000\2013\000\201qo\202qo\202baida\202uh\202\000\000\200engas\202bu\202ra\202ku\202\000\000\200\000\000\200ud\202sh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\303\204\000\000\200car\000\000\200am\202am\202o\000\201\000\000\2003v\205zo\202a\000\201a\000\201\000\000\200mu\202si\202"; -static const char b18c[643] = "\325\000\000\200u\000\201bu\202\000\000\200ae\202\000\000\200ang\000\000\200\000\000\200\000\000\200tu\202\000\000\200\000\000\200de\202li\202\000\000\200lu\202\000\000\200au\202mu\202\000\000\200n\000\201\000\000\200mu\202bi\202u\000\201\000\000\200\000\000\200lo\202ta\202jin\000\000\200\000\000\200ku\202e\271\204ri\202\000\000\200ur\202du\202\000\000\200ba\202pu\202fu\202u\000\201heun\000\201o\000\20110\202\000\000\200cen\000\000\200\000\000\200d\000\201mu\202\000\000\200s\000\201\000\000\200qu\202t\000\201du\202o\000\201or\202\000\000\200\000\000\200em\202z\000\201hurdurl\000\201\000\000\200ui\202ui\202\000\000\200\000\000\200ng\202\000\000\20060\202\000\000\200\000\000\200xi\202\000\000\200em\202\000\000\200ie\202ongun\202z\000\201neunai\301\244\205g\000\201ia\202\000\000\200\000\000\200j\000\201\000\000\200\000\000\200\000\000\200i'i\000\000\200i\000\201x\000\201er\202\000\000\200\000\000\200\000\000\200ud\202ung\000\000\200oi\202e\000\201ge\202\000\000\200\000\000\200i\000\201i\000\201dz\202\000L\204ungG\235\204en\202iau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200qidul\202>\034\2044\000\2014\000\201\000\000\200\000\000\200u\000\201\000\000\200taica\202\000\000\200oh\202dau\000\000\200\000\000\200\000\000\200ai\202ar\202\000\000\200io\202\000\000\200an\202\000\000\200\000\000\200xa\202\000\000\200u\000\201\000\000\200m\000\2012\000\2012\000\201\000\000\200\000\000\200do\202reniu\202na\202\000\000\200en\202\000\000\200\000\000\200\000\000\200xuaun\20240\202giuju\202ju\202ju\202ja\202hu\202ji\202ji\202on\20250\202\000\000\200\000\000\200\000\000\200\000\000\200gioau\202c\000\201ki\202\000\000\20030\202\000\000\200\000\000\200to\202da\202\000\000\200\000\000\200do\202\000\032\204\000\000\200da\202\000\000\200\000\000\200ia\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200bu\202un\202"; -static const char b18d[28] = "\010ga\202ta\202ghubu\202shile\202kwemi\202le\202"; -static const char b1b0[769] = "\377e\000\201e\000\201a\000\201a\000\201a\000\201a\000\201i\000\201i\000\201i\000\201i\000\201u\000\201u\000\201u\000\201u\000\201u\000\201e\000\201e\000\201e\000\201e\000\201e\000\201o\000\201o\000\201o\000\201ka\202ka\202ka\202ka\202ka\202ka\202ka\202ka\202ka\202ka\202ka\202ka\202ki\202ki\202ki\202ki\202ki\202ki\202ki\202ki\202ku\202ku\202ku\202ku\202ku\202ku\202ku\202ke\202ke\202ke\202ke\202ke\202ke\202ko\202ko\202ko\202ko\202sa\202sa\202sa\202sa\202sa\202sa\202sa\202sa\202si\202si\202si\202si\202si\202si\202su\202su\202su\202su\202su\202su\202su\202su\202se\202se\202se\202se\202se\202so\202so\202so\202so\202so\202so\202so\202ta\202ta\202ta\202ta\202ti\202ti\202ti\202ti\202ti\202ti\202ti\202tu\202tu\202tu\202tu\202tu\202te\202te\202te\202te\202te\202te\202te\202te\202te\202to\202to\202to\202to\202to\202to\202to\202na\202na\202na\202na\202na\202na\202na\202na\202na\202ni\202ni\202ni\202ni\202ni\202ni\202ni\202ni\202nu\202nu\202nu\202ne\202ne\202ne\202ne\202ne\202ne\202ne\202no\202no\202no\202no\202no\202ha\202ha\202ha\202ha\202ha\202ha\202ha\202ha\202ha\202ha\202ha\202hi\202hi\202hi\202hi\202hi\202hi\202hi\202hu\202hu\202hu\202he\202he\202he\202he\202he\202he\202he\202ho\202ho\202ho\202ho\202ho\202ho\202ho\202ho\202ma\202ma\202ma\202ma\202ma\202ma\202ma\202mi\202mi\202mi\202mi\202mi\202mi\202mi\202mu\202mu\202mu\202mu\202me\202me\202me\202mo\202mo\202mo\202mo\202mo\202mo\202ya\202ya\202ya\202ya\202ya\202ya\202yu\202yu\202yu\202yu\202yo\202yo\202yo\202yo\202yo\202yo\202ra\202ra\202ra\202ra\202ri\202ri\202ri\202ri\202ri\202ri\202ri\202ru\202ru\202ru\202ru\202ru\202ru\202re\202re\202"; -static const char b1b1[769] = "\377re\202re\202ro\202ro\202ro\202ro\202ro\202ro\202wa\202wa\202wa\202wa\202wa\202wi\202wi\202wi\202wi\202wi\202we\202we\202we\202we\202wo\202wo\202wo\202wo\202wo\202wo\202wo\202n\000\201n\000\201wu\202yi\202ye\202wu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201e\000\201o\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201e\000\201o\000\201n\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200i\000\201na\202\012S\204ie\202poesweN\352\204u\000\201cyatie\020\023\204toe\012\347\205fweliusiuthu\016\250\204vaikai\016\317\204kou\012\367\205\301\251\205\014\260\205\014\242\206\243\241\204ma\202fa\202la\202\006,\204\0066\204fwe\011\267\204ti\202ci\202fu\202fu\202fu\202\006T\204\006T\204faihaulou> \204\012\367\205\012\370\204\013\007\2055\316\204=\304\204\013\273\204\031$\205\013\016\205\020\006\204\005\347\205\005\350\204va\202\022\033\204\013B\205nielie\006r\204\013R\205\020\023\204\020\023\204ie\202ie\202mwevwevwetwe\011\267\204sweswetcici\202i\000\201liu\017\210\204ciumu\202yu\202\012\347\204njyy\000\201paipailaiai\202hautou> \204iou\011H\204\011H\204\014>\204\013\243\204\013\243\204\004\354\204C\273\204\013z\205Nu\204\301\251\205\014\257\206\026<\206H\367\204\014.\204\005\347\205\015B\207\013\222\205pa\202la\202sie\006r\204ie\202poeloe\0066\204soekoe\031\253\205ye\202pwepwe\013R\204\006v\204fu\202vu\202khuhu\202pw\202fw\202sw\202kw\202hw\202mai\006\201\204saisai\006\276\204laulaunw\202kou"; -static const char b1b2[757] = "\373\012\370\204lewsew\013\242\205uowkuw\006\320\204yn\202=\304\204\013\272\205\013\273\204\031$\205\014\257\206\014\261\204\214\237\204\020\006\204\005\347\205\021\327\205\015.\205\015.\205\025\035\205ng\202tsasa\202kuakuacyacie\004\233\204foeloe\013\312\205\013\312\205oe\202\012\347\205fwe\011\267\204ni\202\012\211\204\012\211\204si\202fu\202ang\013\332\205cyuphwfai\006\345\204lou\0076\204\004\266\204\020\230\204\014\310\206\025\370\205iou\020]\204\023%\204\013\243\204\233r\204ngu\014\341\206\014\341\206\014\260\205\014\261\204\301\256\205\015B\207\015.\205\013\223\204la\202cyapoe\006,\204noe\013\312\205kue\013\355\205kueye\202pwevwethitsitsitcitci\013\375\205pu\202tsuku\202\006T\204\016\250\204\012\347\204pw\202hw\202\0056\204mailaisaihaimau\014\015\205haukouou\202kue\014\372\206\013\356\204\012\367\205\012\370\204\013\242\2055\316\204=\304\204>$\204\015\013\206\031$\205\031$\205\301\251\205\014\342\205\014\260\205\014\260\205\020\006\204\005\215\204\020g\204Q\315\204\301\256\205\015\034\206\015\035\205\013\222\205\013\222\205\013\223\204ingng\202va\202sa\202lie\014\035\205sieie\202moeloe\012\347\205cyepi\202ti\202tci\006v\204pu\202fu\202thuhu\202tcycy\202pw\202khwlaisaisau\0076\204\004\373\204\013\355\205\025\370\205\012\370\204iouyn\202OM\204>$\204Nu\204\013{\204\013{\204\014\342\205\014\257\206\014\261\204\000\215\204\015\034\206\015\035\205\015\134\207pa\202\014\035\205sie\0066\204koe\007c\204\007c\204pwesweti\202i\000\201\007m\204ciutsu\004\310\204ku\202lw\202maikaue\240\204hou\233r\2045\316\204OM\204>$\204\000\215\204\214\237\204\014-\205\013\223\204ingtsa\007\273\204ciemoeli\202tsitcii\000\201mu\202lu\202hu\202cyuhw\202tau\013\356\204lew\011\247\205yn\202E\300\204ie\202voe\011\267\204i\000\201tu\202lu\202lou\0076\204\014=\205C\273\204\014\257\206\015n\207\015-\206\007\273\204moeku\202cyupw\202\014\341\206\014I\205\005\232\205\020g\204fu\202ku\2025\316\204\007c\204fi\202"; -static const char b1bc[481] = "\237h\000\201x\000\201p\000\201t\000\201f\000\201k\000\201l\000\201b\000\201d\000\201v\000\201g\000\201r\000\201pn\202ds\202fn\202km\202rs\202th\202dh\202dh\202kk\202j\000\201hl\202lh\202rh\202m\000\201n\000\201j\000\201s\000\201mn\202nm\202jm\202sj\202m\000\201ng\202zh\202j\000\201z\000\201s\000\201ms\202ns\202js\202ss\202mnsnmsjmssjsch\202jn\202jnsst\202strsp\202sprts\202trsw\000\201wh\202wr\202sn\202sm\202krsgrssk\202skra\000\201ow\202oa\202o\000\201aoui\000\201e\000\201ie\202i\000\201ui\202ee\202eh\202i\000\201ee\202i\000\201ye\202u\000\201eu\202xw\202un\202u\000\201u\000\201uh\202u\000\201oohow\202ou\202wa\202wo\202wi\202weiwowu\000\201o\000\201i\000\201a\000\201an\202am\202en\202an\202on\202m\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201\000\000\200\000\000\200\000\000\200'\000\201'\000\201`\000\201`\000\201'\000\201'\000\201'\000\201'\000\201'\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200'\000\201'\000\201`\000\201`\000\201'\000\201'\000\201'\000\201'\000\201'\000\201'\000\201\000\000\200\000\000\200+\000\201r\000\201-\000\201.\000\201"; -static const char b1cf[589] = "\303\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201"; -static const char b1d0[739] = "\365-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201"; -static const char b1d1[706] = "\352|\000\201|\000\201|\000\201|\000\201|\000\201|\000\201|:\202:|\202:\000\201>(\204>,\204S\000\201*\000\201/\000\201%\000\201%%\202^\000\201^\000\201'\000\201//\202{\000\201[\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201G\000\2018G\202G8\202C\000\201F\000\2018F\202F8\202N\000\201N\000\201\000\000\200\000\000\200-\000\201##\202bb\202b\000\201b\000\201#\000\201#\000\201#\000\201#\000\201#\000\201b\000\20144\20222\2028va8vb5\217\2046\022\204-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201.\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200/\000\201//\202///\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200~\000\201~\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200r\000\201s\000\201z\000\201p\000\201m\000\201f\000\201<\000\201>\000\201*\000\201*\000\201tr\202*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201HT\202NT\202T\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\2005~\204*\000\201^\000\201/\000\201\134\000\201*\000\201*\000\201*\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201C\000\201F\000\201b\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201C\000\201&\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201b\000\201#\000\201b\000\201"; -static const char b1d2[733] = "\3631\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20211\20212\20213\20214\20215\20216\20217\20218\20219\20220\20221\20222\20223\20224\20250\20251\20252\20253\20254\2021\000\2012\000\2014\000\2015\000\2017\000\2018\000\20111\20212\20213\20214\20217\20218\20219\20223\20224\20225\20226\20227\20229\20230\20232\20236\20237\20238\20239\20240\20242\20243\20245\20247\20248\20249\20250\20251\20252\20253\20254\2023\000\2014\000\2015\000\201-\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20211\20212\20213\20214\20215\20216\20217\20218\20219\202"; -static const char b1d3[364] = "xRen|\015\207|\005\205|\012\207|\002\205|\007\206\362?\205\003c\204z\374\204z\374\204\360\366\204Li\202{_\205GanShuz\374\204Cha\3628\204\010\243\204RuiDa\202\003\002\204\005\253\204Xi\202\006&\204JinShiGe\202Yi\202Le\202{Z\205Wu\202Shi\007\277\204\0070\204Yi\202\372\230\206\362?\205Mi\202Qin{\207\204z\350\205Sui\371\260\205Ju\202Fa\202\004\377\204\004\377\204Yu\202ZaoDa\202KuoWenLi\202Tao\005!\204z\355\205Du\202\003]\204Kun{\240\204Jin\002M\204Xi\202Ju\202Ji\202ShiYi\202Shi{x\204NeiQu\202Hui\006\205\204{}\205Ge\202Zhi{\240\204{x\205ZhiShiJu\202Xun{\240\205NanQin\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2011\000\2012\000\2013\000\2014\000\2015\000\2011\000\2015\000\201"; -static const char b1d4[769] = "\377A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201\000\000\200i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201\000\000\200C\000\201D\000\201\000\000\200\000\000\200G\000\201\000\000\200\000\000\200J\000\201K\000\201\000\000\200\000\000\200N\000\201O\000\201P\000\201Q\000\201\000\000\200S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201\000\000\200f\000\201\000\000\200h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201\000\000\200p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201"; -static const char b1d5[769] = "\377w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201\000\000\200D\000\201E\000\201F\000\201G\000\201\000\000\200\000\000\200J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201\000\000\200S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201\000\000\200a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201\000\000\200D\000\201E\000\201F\000\201G\000\201\000\000\200I\000\201J\000\201K\000\201L\000\201M\000\201\000\000\200O\000\201\000\000\200\000\000\200\000\000\200S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201\000\000\200a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201"; -static const char b1d6[769] = "\377s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201i\000\201j\000\201\000\000\200\000\000\200A\000\201B\000\201G\000\201D\000\201E\000\201Z\000\201E\000\201Th\202I\000\201K\000\201L\000\201M\000\201N\000\201X\000\201O\000\201P\000\201R\000\201Th\202S\000\201T\000\201Y\000\201Ph\202Ch\202Ps\202O\000\201D\000\201a\000\201b\000\201g\000\201d\000\201e\000\201z\000\201e\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201x\000\201o\000\201p\000\201r\000\201s\000\201s\000\201t\000\201y\000\201ph\202ch\202ps\202o\000\201d\000\201e\000\201th\202k\000\201ph\202r\000\201p\000\201A\000\201B\000\201G\000\201D\000\201E\000\201Z\000\201E\000\201Th\202I\000\201K\000\201L\000\201M\000\201N\000\201X\000\201O\000\201P\000\201R\000\201Th\202S\000\201T\000\201Y\000\201Ph\202Ch\202Ps\202O\000\201D\000\201a\000\201b\000\201g\000\201d\000\201"; -static const char b1d7[769] = "\377e\000\201z\000\201e\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201x\000\201o\000\201p\000\201r\000\201s\000\201s\000\201t\000\201y\000\201ph\202ch\202ps\202o\000\201d\000\201e\000\201th\202k\000\201ph\202r\000\201p\000\201A\000\201B\000\201G\000\201D\000\201E\000\201Z\000\201E\000\201Th\202I\000\201K\000\201L\000\201M\000\201N\000\201X\000\201O\000\201P\000\201R\000\201Th\202S\000\201T\000\201Y\000\201Ph\202Ch\202Ps\202O\000\201D\000\201a\000\201b\000\201g\000\201d\000\201e\000\201z\000\201e\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201x\000\201o\000\201p\000\201r\000\201s\000\201s\000\201t\000\201y\000\201ph\202ch\202ps\202o\000\201d\000\201e\000\201th\202k\000\201ph\202r\000\201p\000\201A\000\201B\000\201G\000\201D\000\201E\000\201Z\000\201E\000\201Th\202I\000\201K\000\201L\000\201M\000\201N\000\201X\000\201O\000\201P\000\201R\000\201Th\202S\000\201T\000\201Y\000\201Ph\202Ch\202Ps\202O\000\201D\000\201a\000\201b\000\201g\000\201d\000\201e\000\201z\000\201e\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201x\000\201o\000\201p\000\201r\000\201s\000\201s\000\201t\000\201y\000\201ph\202ch\202ps\202o\000\201d\000\201e\000\201th\202k\000\201ph\202r\000\201p\000\201A\000\201B\000\201G\000\201D\000\201E\000\201Z\000\201E\000\201Th\202I\000\201K\000\201L\000\201M\000\201N\000\201X\000\201O\000\201P\000\201R\000\201Th\202S\000\201T\000\201Y\000\201Ph\202Ch\202Ps\202O\000\201D\000\201a\000\201b\000\201g\000\201d\000\201e\000\201z\000\201e\000\201th\202i\000\201k\000\201l\000\201m\000\201n\000\201x\000\201o\000\201p\000\201r\000\201s\000\201s\000\201t\000\201y\000\201ph\202ch\202ps\202o\000\201d\000\201e\000\201th\202k\000\201ph\202r\000\201p\000\201W\000\201w\000\201\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b1df[94] = "\036fngg\000\201g\000\201k\000\201l\000\201lzhy\000\201ng\202r\000\201t\000\201q\000\201qc\202qc\202t\000\201x\000\201q\000\201k\000\201l\000\201dzhl\000\201ng\202r\000\201r\000\201tshzh\202dzhi\000\201o\000\201tshc\000\201s\000\201"; -static const char b1e0[130] = "*a\000\201b\000\201v\000\201g\000\201d\000\201e\000\201zh\202\000\000\200z\000\201i\000\201j\000\201i\000\201g\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201r\000\201s\000\201t\000\201u\000\201f\000\201h\000\201\000\000\200\000\000\200shtc\000\201ch\202sh\202u\000\201i\000\201e\000\201\000\000\200ju\202e\000\201\000\000\200jo\202je\202o\000\201jo\202th\202"; -static const char b1e1[241] = "Om\000\201ts\202nt\202t\000\201h\000\201n\000\201x\000\201nk\202c\000\201l\000\201s\000\201z\000\201nc\202ntsk\000\201d\000\201ny\202nr\202v\000\201ntxtx\202f\000\201r\000\201q\000\201y\000\201nq\202p\000\201xy\202np\202dl\202npl'\000\201ml\202pl\202g\000\201r\000\201a\000\201aa\202i\000\201u\000\201o\000\201oo\202e\000\201ee\202w\000\201\000\000\200\000\000\200\000\000\200b\000\201m\000\201j\000\201v\000\201s\000\201g\000\201d\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200-\000\201\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200$\000\201@\000\201"; -static const char b1e2[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200p\000\201b\000\201t\000\201d\000\201k\000\201g\000\201m\000\201n\000\201ng\202s\000\201ch\202y\000\201w\000\201j\000\201h\000\201r\000\201l\000\201i\000\201ih\202iu\202iuhu\000\201e\000\201eh\202eo\202eoho\000\201ae\202aeha\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200aa\202a\000\201b\000\201c\000\201d\000\201g\000\201y\000\201ph\202l\000\201n\000\201p\000\201t\000\201th\202f\000\201s\000\201sh\202j\000\201z\000\201w\000\201v\000\201k\000\201o\000\201au\202r\000\201m\000\201kh\202h\000\201e\000\201i\000\201ng\202u\000\201lh\202ts\202tr\202ong{\246\204angingon\202en\202aanny\202uenx\000\201\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Rs\202"; -static const char b1e7[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200xyexyuxyixya\000\023\204xy\202xyo\000\000\200hwehwi\0262\204hwi\000\000\200mwi\001\015\204\000\000\200\024P\204\024P\205\024P\204bwi\001\021\204kwi\000\321\204kwigwi\005\010\204gwifwi\001\025\204pwi\000\365\204"; -static const char b1e8[625] = "\317ki\202ka\202ku\202ke\202ke\202ko\202ko\202kuawi\202wa\202wu\202we\202we\202wo\202wo\202wuiweiwviwvawvemi\202ma\202mu\202me\202mo\202muamuebi\202ba\202bu\202be\202be\202bo\202bo\202i\000\201a\000\201u\000\201e\000\201e\000\201o\000\201o\000\201ei\202i\000\201i\000\201a\000\201e\000\201si\202sa\202su\202se\202se\202so\202so\202siali\202la\202lu\202le\202le\202lo\202lo\202leedi\202da\202du\202de\202do\202do\202ti\202ta\202tu\202te\202te\202to\202to\202ji\202ja\202ju\202je\202je\202jo\202jo\202jooyi\202ya\202yu\202ye\202ye\202yo\202yo\202fi\202fa\202fu\202fe\202fe\202fo\202fo\202fuafa\202ni\202na\202nu\202ne\202no\202hi\202ha\202hu\202he\202he\202ho\202ho\202heihouhi\202ha\202hu\202he\202ho\202hua\003z\204\005\264\204\005\277\204\005\315\204\005\315\204\005\330\204\005\330\204\005\264\205\005\277\205\005\315\205\005\330\205\005\330\205gi\202ga\202gu\202ge\202\007\255\204guangengo\005\001\204pi\202pa\202pu\202pe\202pe\202po\202po\202mbimbambumbembembembombo\020\276\204\021\007\204E/\204E/\204kpikpakpukpekpekpokpogbigbagbugbegbegbogbora\202ndindandundendendondonjanjunjenjovi\202va\202vu\202ve\202ve\202vo\202vo\202nyinyanyunyenyo\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b1e9[289] = "_A\000\201D\000\201L\000\201M\000\201B\000\201S\000\201P\000\201Bh\202R\000\201E\000\201F\000\201I\000\201O\000\201Dh\202Yh\202W\000\201N\000\201K\000\201Y\000\201U\000\201J\000\201C\000\201H\000\201Q\000\201G\000\201Ny\202T\000\201Nh\202V\000\201X\000\201Gb\202Z\000\201Kp\202Sh\202a\000\201d\000\201l\000\201m\000\201b\000\201s\000\201p\000\201bh\202r\000\201e\000\201f\000\201i\000\201o\000\201dh\202yh\202w\000\201n\000\201k\000\201y\000\201u\000\201j\000\201c\000\201h\000\201q\000\201g\000\201ny\202t\000\201nh\202v\000\201x\000\201gb\202z\000\201kp\202sh\202\000\000\200\000\000\200\000\000\200'\000\201\000\000\200\000\000\200\000\000\200'\000\201\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201\000\000\200\000\000\200\000\000\200\000\000\200!\000\201?\000\201"; -static const char b1ec[544] = "\264\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\2021002003004005006007008009003v\2044g\2043\246\2043\277\2043\343\2043\333\2043\230\2044\020\2044\031\2043v\2054g\2053\246\2053\277\2053\343\2053\333\2053\230\2054\020\2054\031\2051L\2022L\202L\000\201cr\2022cr1\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201-\000\2011/41/23/4Rs\2021\000\2012\000\2013v\205L\000\201"; -static const char b1ed[187] = "=\000\000\2001\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20220\20230\20240\20250\20260\20270\20280\20290\2021002003004005006007008009003v\2044g\2043\246\2043\277\2043\343\2043\333\2043\230\2044\020\2044\031\2043v\2054g\2053\246\2053\277\2053\343\2053\333\2053\230\2054\020\2054\031\205*\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\2024006004g\2043v\2051/21/6"; -static const char b1ee[727] = "\361a\000\201b\000\201j\000\201d\000\201\000\000\200w\000\201z\000\201h\000\201t\000\201y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201f\000\201s\000\201q\000\201r\000\201sh\202t\000\201th\202kh\202dh\202d\000\201dh\202gh\202b\000\201n\000\201f\000\201q\000\201\000\000\200b\000\201j\000\201\000\000\200h\000\201\000\000\200\000\000\200h\000\201\000\000\200y\000\201k\000\201l\000\201m\000\201n\000\201s\000\201`\000\201f\000\201s\000\201q\000\201\000\000\200sh\202t\000\201th\202kh\202\000\000\200d\000\201\000\000\200gh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200j\000\201\000\000\200\000\000\200\000\000\200\000\000\200h\000\201\000\000\200y\000\201\000\000\200l\000\201\000\000\200n\000\201s\000\201`\000\201\000\000\200s\000\201q\000\201\000\000\200sh\202\000\000\200\000\000\200kh\202\000\000\200d\000\201\000\000\200gh\202\000\000\200n\000\201\000\000\200q\000\201\000\000\200b\000\201j\000\201\000\000\200h\000\201\000\000\200\000\000\200h\000\201t\000\201y\000\201k\000\201\000\000\200m\000\201n\000\201s\000\201`\000\201f\000\201s\000\201q\000\201\000\000\200sh\202t\000\201th\202kh\202\000\000\200d\000\201dh\202gh\202b\000\201\000\000\200f\000\201\000\000\200a\000\201b\000\201j\000\201d\000\201h\000\201w\000\201z\000\201h\000\201t\000\201y\000\201\000\000\200l\000\201m\000\201n\000\201s\000\201`\000\201f\000\201s\000\201q\000\201r\000\201sh\202t\000\201th\202kh\202dh\202d\000\201dh\202gh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200b\000\201j\000\201d\000\201\000\000\200w\000\201z\000\201h\000\201t\000\201y\000\201\000\000\200l\000\201m\000\201n\000\201s\000\201`\000\201f\000\201s\000\201q\000\201r\000\201sh\202t\000\201th\202kh\202dh\202d\000\201dh\202gh\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200mh\202hd\202"; -static const char b1f0[739] = "\3651z\2022z\2023z\2024z\202H.\2116z\2025z\2021m\2022m\2023m\2024m\2025m\2026m\2027m\2028m\2029m\2021s\2022s\2023s\2024s\2025s\2026s\2027s\2028s\2029s\2021p\2022p\2023p\2024p\2025p\2026p\2027p\2028p\2029p\2021b\2022b\2024b\2023b\2025b\2026b\2027b\2028b\202j\000\201-\000\201\000\000\200\000\000\200\000\000\200\000\000\200-\000\20100\20201\20202\20203\20204\20205\20206\20210\20211\20212\20213\20214\20215\20216\20220\20221\20222\20223\20224\20225\20226\20230\20231\20232\20233\20234\20235\20236\20240\20241\20242\20243\20244\20245\20246\20250\20251\20252\20253\20254\20255\20256\20260\20261\20262\20263\20264\20265\20266\202-\000\20100\20201\20202\20203\20204\20205\20206\20210\20211\20212\20213\20214\20215\20216\20220\20221\20222\20223\20224\20225\20226\20230\20231\20232\20233\20234\20235\20236\20240\20241\20242\20243\20244\20245\20246\20250\20251\20252\20253\20254\20255\20256\20260\20261\20262\20263\20264\20265\20266\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200-\000\201As\2022s\2023s\2024s\2025s\2026s\2027s\2028s\2029s\202Ts\202Js\202Ns\202Qs\202Ks\202\000\000\200\000\000\200Ah\2022h\2023h\2024h\2025h\2026h\2027h\2028h\2029h\202Th\202Jh\202Nh\202Qh\202Kh\2020\000\201\000\000\200Ad\2022d\2023d\2024d\2025d\2026d\2027d\2028d\2029d\202Td\202Jd\202Nd\202Qd\202Kd\202V3\215\000\000\200Ac\2022c\2023c\2024c\2025c\2026c\2027c\2028c\2029c\202Tc\202Jc\202Nc\202Qc\202Kc\2020\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\20110\20211\20212\20213\20214\20215\20216\20217\20218\20219\20220\20221\202"; -static const char b1f1[769] = "\3770.\2020,\2021,\2022,\2023,\2024,\2025,\2026,\2027,\2028,\2029,\2020\000\2010\000\201CC0\373\020\212\373&\215(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)[S]C\000\201R\000\201CD\202WZ\202\372\246\210A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201HV\202MV\202SD\202SS\202PPVWC\202A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201MC\202MD\202MR\202\3733\217\373\032\214\016\372\213A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201PX\202IC\202PA\202SA\202AB\202WC\202DJ\202CL\202>0\204>7\204ID\202NEWNG\202OK\202SOSUP!VS\2023D\2025H\2062K\2024K\2028K\2025.17.15\016\20460P5{\204d\000\201HC\202HDR\3600\206\372\256\210SHVUHDVOD*M*\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201"; -static const char b1f2[307] = "e\016K\204\023\326\204sa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002M\204Zi\202\372\266\206de\202Er\202DuoJie|\015\204\003\002\204\004\377\204Wu\202\006z\204z\350\204HouZaiXinChu\362?\205\371\260\205Fan\371\260\205\257\320\204YanTouBu\202Yi\202SanYouZuo\362?\205YouZhiZouDa\202Jin\006\237\204He\202ManYouYue\371\260\204Ge\202\004\377\204Pei\000\000\200\000\000\200\000\000\200\000\000\200\301\263\205\301\270\205>?\204>C\204\3606\206>G\204\301\275\205\371\257\207\301\302\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200De\202Ke\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202Lu\202\002M\204Xi\202\372\266\210Cai"; -static const char b1f3[754] = "\372H6\211A\266\207d\277\221gi\222q\264\230H>\211O\032\213V?\215HF\211d\317\221A\274\207HN\211O$\213Z\022\216aV\220RL\214oZ\226K\354\212oo\226l\203\224m\311\225O.\213m\335\225j\006\223o\204\226]\246\217l\226\224t\312\236t\256\235m\361\225]\264\217A\302\207A\310\207VK\215*\000\201*\000\201p\354\227d\337\221o\231\226RW\214Rb\214d\357\221]\302\217>f\205j\030\223D\364\210?^\206HV\211K\365\212K\376\212ae\220at\220O8\213D\373\210Rm\214A\316\207a\203\220?c\206L\007\212OB\213H^\211?h\206VW\215?m\206gz\222Rx\214Vc\215E\002\210L\020\212E\011\210L\031\212E\020\210A\324\207R\203\214OL\213A\332\207E\027\210OV\213A\340\207Vo\215?r\206A\346\207L\042\212R\216\214O`\213A\354\207Z\037\216V{\215Z,\216Oj\213?w\206A\362\207A\370\207Ot\213A\376\207B\004\207Z9\216B\012\207?|\206B\020\207ZF\216O~\213L+\212R\231\214O\210\213L4\212E\036\210]\320\217B\026\207L=\212Hf\211O\222\213?\201\206B\034\207?\206\206Hn\211a\222\220>j\205?\213\206R\244\214LF\212a\241\220?\220\206B\042\207V\207\215g\213\222O\234\213Hv\211E%\210?\225\206LO\212a\260\220a\277\220B(\207O\246\213LX\212H~\211?\232\206]\336\217]\354\217]\372\217E,\210B.\207B4\207R\257\214R\272\214a\316\220ZS\216*\000\201*\000\201a\335\220d\377\221*\000\201V\223\215Z`\216^\010\217#\000\201#\000\201V\237\215H\206\211a\354\220Zm\216a\373\220q\002\227R\305\214Zz\216E3\210R\320\214>n\205E:\210V\253\215EA\210H\216\211e\017\221R\333\214?\237\206Z\207\216B:\207La\212H\226\211o\256\226Z\224\216B@\207O\260\213EH\210g\234\222H\236\211EO\210^\026\217r\203\231EV\210>r\205R\346\214b\012\220V\267\215b\031\220b(\220BF\207E]\210Z\241\216Lj\212b7\220e\037\221q\313\230bF\220R\361\214Ls\212Z\256\216R\374\214Z\273\216Ed\210O\272\213^$\217H\246\211BL\207j*\223BR\207O\304\213e/\221l\251\224Ek\210Er\210?\244\206H\256\211BX\207j<\223Ey\210V\303\215o\303\226L|\212?\251\206>v\205B^\207S\007\214jN\223E\200\210g\255\222H\266\211e?\221eO\221e_\221*\000\201*\000\201S\022\214S\035\214H\276\211*\000\201Bd\207O\316\213^2\217H\306\211"; -static const char b1f4[769] = "\377>z\205E\207\210>K\204^@\217?\256\206E\216\210H\316\211H\326\211?\263\206E\225\210O\330\213E\234\210Bj\207Bp\207O\342\213>~\205?\270\206Bv\207E\243\210H\336\211H\346\211?\275\206?\302\206?\307\206L\205\212H\356\211B|\207>\202\205>\206\205>\212\205V\317\215?\314\206^N\217L\216\212E\252\210bU\220S(\214^\134\217?\321\206H\366\211B\202\207E\261\210eo\221B\210\207H\376\211B\216\207>\216\205B\224\207E\270\210>\222\205V\333\215B\232\207B\240\207V\347\215>\226\205>\232\205?\326\206I\006\211?\333\206?\340\206S3\214L\227\212?\345\206L\240\212?\352\206>\236\205>\242\205?\357\206?\364\206E\277\210S>\214SI\214ST\214V\363\215B\246\207?\371\206I\016\211L\251\212S_\214?\376\206Sj\214B\254\207Su\214S\200\214I\026\211B\262\207B\270\207B\276\207E\306\210E\315\210bd\220B\304\207I\036\211B\312\207O\354\213^j\217O\366\213E\324\210@\003\206S\213\214l\274\224n\005\225>\246\205@\010\206>\252\205B\320\207E\333\210E\342\210q\030\227r\233\231bs\220uz\241g\276\222n\031\225o\330\226q.\227P\000\213V\377\215@\015\206n-\225L\262\212^x\217e\177\221B\326\207B\334\207B\342\207^\206\217>\256\205B\350\207nA\225B\356\207E\351\210L\273\212P\012\213q\342\230q\371\230E\360\210I&\211@\022\206@\027\206W\013\215@\034\206>\262\205S\226\214I.\211j`\223I6\211P\024\213Z\310\216S\241\214e\217\221S\254\214B\364\207S\267\214W\027\215Z\325\216Z\342\216S\302\214g\317\222g\340\222u\232\241@!\206B\372\207@&\206>\266\205@+\206W#\215I>\211@0\206@5\206E\367\210C\000\207b\202\220e\237\221Z\357\216>\272\205L\304\212jr\223j\204\223W/\215>\276\205E\376\210@:\206C\006\207g\361\222C\014\207@?\206L\315\212P\036\213L\326\212W;\215>N\204>\302\205WG\215h\002\222b\221\220b\240\220@D\206L\337\212S\315\214s\134\232t\134\234P(\213P2\213IF\211^\224\217P<\213b\257\220h\023\222^\242\217F\005\210L\350\212u[\240WS\215@I\206S\330\214PF\213W_\215C\022\207S\343\214F\014\210F\023\210l\317\224C\030\207>\306\205PP\213Wk\215@N\206Ww\215S\356\214IN\211F\032\210j\226\223nU\225b\276\220IV\211j\250\223o\355\226I^\211W\203\215PZ\213Z\374\216If\211b\315\220h$\222h5\222e\257\221F!\210j\272\223[\011\216>Q\204C\036\207>\312\205Pd\213*\000\201[\026\216"; -static const char b1f5[769] = "\377t\016\233F(\210S\371\214hF\222r\263\231b\334\220e\277\221@S\206In\211C$\207T\004\214Iv\211^\260\217>\316\205Pn\213j\314\223p\002\226>\322\205@X\206F/\210@]\206I~\211L\361\212@b\206[#\216@g\206>\326\205>T\204@l\206>\332\205L\372\212T\017\214[0\216@q\206@v\206I\206\211>\336\205@{\206T\032\214F6\210F=\210[=\216C*\207>\342\205T%\214Px\213[J\216hW\222M\003\212I\216\211ni\225n}\225T0\214W\217\215p\027\226l\342\224p,\226l\365\224m\010\224r\313\231b\353\220hh\222*\000\201*\000\201+\000\201+\000\201+\000\201*\000\201*\000\201M\000\201+\000\201+\000\201+\000\201P\202\213@\200\206C0\207FD\210P\214\213I\226\211*\000\201FK\210FR\210FY\210F`\210Fg\210Fn\210Fu\210F|\210F\203\210I\236\211I\246\211I\256\211M\014\212M\025\212M\036\212M'\212M0\212M9\212MB\212MK\212MT\212P\226\213P\240\213P\252\213*\000\201*\000\201*\000\201@\000\201@\000\201*\000\201*\000\201F\212\210C6\207*\000\201*\000\201@\205\206M]\212P\264\213e\317\221F\221\210T;\214Mf\212W\233\215@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201TF\214*\000\201*\000\201^\276\217[W\216TQ\214F\230\210*\000\201*\000\201[d\216*\000\201^\000\201v\000\201V\000\201^\314\217F\237\210v\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201^\000\201v\000\201^\000\201v\000\201^\000\201v\000\201W\247\215I\266\211*\000\201*\000\201I\276\211*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201m\033\224P\276\213*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201#\000\201#\000\201#\000\201W\263\215#\000\201#\000\201#\000\201#\000\201#\000\201Mo\212Mx\212[q\216#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201W\277\215b\372\220e\337\221*\000\201*\000\201*\000\201*\000\201*\000\201X\000\201aA\202Aa\202W\313\215@\212\206T\134\214#\000\201#\000\201F\246\210*\000\201^\332\217v\000\201^\000\201>\000\201<\000\201W\327\215@\000\201@\000\201@\000\201@\000\201@\000\201@\000\201W\343\215*\000\201*\000\201*\000\201Tg\214x\000\201x\000\201x\000\201x\000\201v\000\201v\000\201>\346\205Tr\214W\357\215j\336\223C<\207CB\207"; -static const char b1f6[760] = "\374M\201\212@\217\206>\352\205F\255\210CH\207W\373\215M\212\212M\223\212X\007\215@\224\206CN\207>\356\205M\234\212T}\214T\210\214CT\207[~\216c\011\220M\245\212CZ\207I\306\211M\256\212T\223\214I\316\211^\350\217pA\226n\221\225hy\222t\347\236u\004\236[\213\216I\326\211C`\207@\231\206>\362\205P\310\213I\336\211qD\227M\267\212P\322\213I\346\211Cf\207F\264\210T\236\214P\334\213>\366\205T\251\214F\273\210T\264\214F\302\210T\277\214I\356\211M\300\212T\312\214M\311\212@\236\206P\346\213I\366\211T\325\214c\030\220P\360\213X\023\215X\037\215e\357\221T\340\214[\230\216[\245\216X+\215[\262\216n\245\225n\271\225^\366\217X7\215[\277\216_\004\217n\315\225[\314\216e\377\221c'\220@\243\206*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201#\000\201#\000\201#\000\201#\000\201-\000\201|\000\201-\000\201|\000\201&\000\201&\000\201&\000\201&\000\201&\000\201&\000\201\042\000\201\042\000\201\042\000\201!?\202!?\202!?\202/\000\201\134\000\201/\000\201\134\000\201F\311\210T\353\214h\212\222XC\215h\233\222j\360\223F\320\210Cl\207T\366\214I\376\211@\250\206Cr\207>\372\205[\331\216U\001\214J\006\211J\016\211P\372\213XO\215U\014\214n\341\225@\255\206_\022\217J\026\211n\365\225M\322\212Cx\207k\002\223J\036\211M\333\212h\254\222m.\224k\024\223c6\220@\262\206mA\224Q\004\213_ \217r\020\230[\346\216cE\220r\343\231@\267\206_.\217J&\211U\027\214r\373\231_<\217_J\217k&\223@\274\206X[\215_X\217r'\230cT\220cc\220k8\223@\301\206F\327\210M\344\212Xg\215F\336\210>W\204F\345\210@\306\206J.\211h\275\222J6\211_f\217[\363\216^\000\201X\000\201i\000\201m\000\201f\000\201C~\207r>\230_t\217J>\211>\376\205h\316\222cr\220_\202\217^\000\201^\000\201\134\000\216?\002\205M\355\212\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200h\337\222C\204\207Q\016\213C\212\207F\354\210?\006\205M\366\212_\220\217Q\030\213^\000\201^\000\201^\000\201c\201\220^\000\201mT\224kJ\223\000\000\200\000\000\200\000\000\200k\134\223#\000\201#\000\201Xs\215JF\211_\236\217C\220\207@\313\206_\254\217U\042\214_\272\217\134\015\216\134\032\216"; -static const char b1f7[724] = "\360QE\202A\000\201F\000\201E\000\201W\000\201AF\202AR\202AR\202SV\202SV\202+\000\201+\000\201+\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201s\000\201n\000\201n\000\201v\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201T\000\201T\000\201T\000\201T\000\201T\000\201A\000\201MB\202VB\202R\000\201h\000\201n\000\201dn\202m\000\201\022\312\204\000e\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200<\000\201^\000\201>\000\201v\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201+\000\201x\000\201x\000\201x\000\201x\000\201x\000\201x\000\201x\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201+\000\201+\000\201+\000\201+\000\201+\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201*\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200_\310\217_\326\217\134'\216_\344\217\1344\216U-\214X\177\215_\362\217`\000\217\134A\216`\016\217\134N\216\000\000\200\000\000\200\000\000\200\000\000\200kn\223"; -static const char b1f8[535] = "\261<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201\000\000\200\000\000\200\000\000\200\000\000\200<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200<\000\201^\000\201>\000\201v\000\201\134\000\201/\000\201\134\000\201/\000\201-\000\201|\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200<\000\201^\000\201>\000\201v\000\201\134\000\201/\000\201\134\000\201/\000\201<\000\201^\000\201>\000\201v\000\201\134\000\201/\000\201\134\000\201/\000\201<\000\201^\000\201>\000\201v\000\201\134\000\201/\000\201\134\000\201/\000\201<\000\201^\000\201>\000\201v\000\201\134\000\201/\000\201\134\000\201/\000\201<\000\201^\000\201>\000\201v\000\201\134\000\201/\000\201\134\000\201/\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201<\000\201^\000\201>\000\201v\000\201-\000\201-\000\201-\000\201-\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201<\000\201>\000\201-\000\201-\000\201\000\000\200\000\000\200\134\000\201/\000\201"; -static const char b1f9[769] = "\377+\000\201+\000\201+\000\201*\000\201*\000\201*\000\201*\000\201*\000\201^\000\201^\000\201^\000\201^\000\201f\017\221X\213\215X\227\215`\034\217\134[\216X\243\215h\360\222@\320\206M\377\212\134h\216C\226\207JN\211C\234\207JV\211o\011\225i\001\222k\200\223Q\042\213f\037\221i\022\222F\363\210C\242\207c\220\220@\325\206`*\217U8\214mg\224`8\217su\232X\257\215Q,\213`F\217u!\236t(\233`T\217c\237\220c\256\220c\275\220k\222\223F\372\210G\001\210i#\222Q6\213i4\222rU\230f/\221c\314\220+\000\201iE\222tB\233s\023\231X\273\215X\307\215@\332\206f?\221`b\217C\250\207@\337\206+\000\201X\323\215\134u\216X\337\215\134\202\216pV\226`p\217N\010\212N\021\212X\353\215Q@\213J^\211N\032\212C\256\207G\010\210G\017\210\134\217\216C\264\207o\035\225k\244\223?\012\205@\344\206Jf\211@\351\206N#\212N,\212c\333\220X\367\215UC\214fO\221c\352\220Jn\211N5\212?\016\205Jv\211Y\003\215N>\212Y\017\215Y\033\215C\272\207QJ\213C\300\207tw\234\134\234\216rl\230`~\217UN\214NG\212QT\213C\306\207c\371\220s+\231`\214\217@\356\206NP\212J~\211Y'\215iV\222@\363\206Q^\213NY\212G\026\210J\206\211C\314\207@\370\206?\022\205C\322\207?\026\205?\032\205Qh\213@\375\206J\216\211G\035\210C\330\207G$\210C\336\207J\226\211C\344\207Nb\212Nk\212C\352\207J\236\211Nt\212C\360\207J\246\211\134\251\216G+\210J\256\211J\266\211N}\212J\276\211G2\210A\002\206J\306\211A\007\206C\366\207C\374\207Qr\213D\002\207N\206\212G9\210G@\210D\010\207A\014\206Q|\213\134\266\216\000\000\200\000\000\200\000\000\200\000\000\200A\021\206?\036\205A\026\206D\016\207Q\206\213\134\303\216Y3\215pk\226p\200\226k\266\223d\010\220d\027\220GG\210J\316\211A\033\206\134\320\216GN\210D\024\207J\326\211GU\210G\134\210A \206N\217\212UY\214D\032\207f_\221fo\221Y?\215k\310\223D \207D&\207YK\215d&\220p\225\226qZ\227f\177\221s\216\232A%\206D,\207J\336\211Q\220\213?\042\205D2\207Gc\210D8\207\134\335\216Ud\214D>\207Gj\210A*\206DD\207\134\352\216YW\215Gq\210Q\232\213Uo\214?&\205J\346\211Gx\210k\332\223J\356\211G\177\210G\206\210J\366\211d5\220G\215\210A/\206Uz\214U\205\214DJ\207G\224\210`\232\217A4\206G\233\210J\376\211\134\367\216"; -static const char b1fa[742] = "\366K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201N\000\201n\000\201N\000\201K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201k\000\201q\000\201r\000\201b\000\201n\000\201p\000\201K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201N\000\201n\000\201N\000\201K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201k\000\201q\000\201r\000\201b\000\201n\000\201p\000\201K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201N\000\201n\000\201N\000\201K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201k\000\201q\000\201r\000\201b\000\201n\000\201p\000\201K\000\201Q\000\201R\000\201B\000\201N\000\201P\000\201N\000\201n\000\201N\000\201E\000\201e\000\201E\000\201E\000\201e\000\201E\000\201NQ\202NR\202NB\202nq\202nr\202nb\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200G\000\201A\000\201E\000\201H\000\201R\000\201C\000\201S\000\201g\000\201a\000\201e\000\201h\000\201r\000\201c\000\201s\000\201\000\000\200\000\000\200]\004\216mz\224G\242\210G\251\210]\021\216\000\000\200\000\000\200\000\000\200`\250\217ig\222Yc\215DP\207G\260\210\000\000\200\000\000\200\000\000\200DV\207A9\206Q\244\213Q\256\213U\220\214G\267\210`\266\217\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200`\304\217D\134\207Db\207?*\205Q\270\213Dh\207f\217\221Q\302\213Q\314\213A>\206`\322\217Yo\215G\276\210AC\206G\305\210G\314\210K\006\211`\340\217AH\206G\323\210U\233\214U\246\214Q\326\213K\016\211AM\206Y{\215o1\225Y\207\215Dn\207\000\000\200\000\000\200\000\000\200?.\205AR\206G\332\210Q\340\213]\036\216AW\206K\026\211Dt\207Dz\207U\261\214dD\220\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ix\222D\200\207dS\220]+\216f\237\221k\354\223\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Y\223\215Y\237\215D\206\207Q\352\213G\341\210G\350\210G\357\210db\220D\214\207?2\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200]8\216`\356\217u\272\251qp\227s\247\232i\211\222U\274\214K\036\211\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200u\342\252f\257\221dq\220d\200\220]E\216u>\236Y\253\215"; -static const char b1fb[751] = "\371#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201|\000\201|\000\201|\000\201|\000\201|\000\201|\000\201-\000\201-\000\201-\000\201-\000\201-\000\201-\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201\000\000\200#\000\201#\000\201#\000\201#\000\201#\000\201#\000\201X\000\201X\000\201/\000\201\134\000\201/\000\201\134\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201X\000\201-\000\201^\000\201v\000\201>\000\201<\000\201<\000\201<\000\201>\000\201v\000\201^\000\201[\000\201]\000\201#\000\201]\000\201#\000\201#\000\201#\000\201X\000\201>\000\201>\000\201>\000\201?\000\201+\000\201+\000\201+\000\201+\000\201+\000\201^\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\2000\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201"; -static const char b200[754] = "\372He\202Qi\202\000\000\200Qie\000\000\200Hai\000\000\200\000\000\200\000\000\200QiuCao\000\000\200\000\000\200Shi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Si\202Jue\000\000\200\301\232\205\301\307\205\000\000\200\000\000\200\000\000\200Yu\202\000\000\200\006\237\204\000\000\200\000\000\200\000\000\200TinZi\202\000\000\200\000\000\200\000\000\200\003g\204Ba\202Cup\000\000\200KhaKhe\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MouDuaRe\202\020M\204\000\000\200\000\000\200Ji\202Ye\202Jun\000\000\200\000\000\200z\350\204Lu\202Buiv\014\204DoiDouDua\000\000\200\302\212\204\000\000\200Bik\000\000\200\000\000\200Chu\000\000\200\000\000\200\000\000\200\000\000\200Lin\000\000\200\000\000\200v\020\204\000\000\200\000\000\200 \341\204\000\000\200\000\000\200Shi\000\000\200ChaCui\000\000\200\000\000\200GomBuiGomQie\000\000\200\000\000\200\000\000\2004\000\201Ga\202\000\000\200\000\000\200\005i\204\000\000\200v\024\204\000\000\200\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\030\204\000\000\200z\355\204v\034\204v\030\204\301\314\205\301\321\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\204\000\000\200Yi\202ZuoJie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ay\202\000\000\200\000\000\200Zou\000\000\200\000\000\200Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Za\202\000\000\200Jin\000\000\200\000\000\200Pai\000\000\200Dui\006&\204\000\000\200\371\260\204\000\000\200\000\000\200BenBen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mai\000\000\200\000\000\200\000\000\200\000\000\200Yin\000\000\200Gun\301\326\205\000\000\200\000\000\200\000\000\200\007]\204\000\000\200{\303\205Wan\000\000\200JiuUl\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ut\202\000\000\200\000\000\200\000\000\200\000\000\2004\000\201It\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\257\370\204\000\000\200\371\260\204\000\000\200\000\000\200TamUt\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\222\007\204Ut\202\000\000\200\000\000\200Jiu"; -static const char b201[763] = "\375Vu\202\000\000\200\000\000\200\000\000\200\000\000\200Ye\202\000\000\200\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200JueJie\000\000\200\005,\204\000\000\200Jue\257\320\204\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\010*\204\000\000\200\005P\204\000\000\200Tho\000\000\200\000\000\200\000\000\200\000\000\2005\000\201\000\000\200Gen\000\000\200\000\000\200GopVai\000\000\200Hai\000\000\200\000\000\200Jo\202\000\000\200Ya\202Ban\000\000\200Yi\202\000\000\200Kep\000\000\200\000\000\200v\024\204\000\000\200\000\000\200\000\000\200\301\333\205LamNamVai\000\000\200Wei\000\000\200\000\000\200Jie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202MatMat\000\000\200Mat\000\000\200Mat\000\000\200\000\000\200\000\000\200\000\000\200Die\000\000\200\220\307\205Qi\202\000\000\200Le\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bao\000\000\200\000\000\200\000\000\200\000\000\200Xie\000\000\200v \204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\205\000\000\200v \204Mat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003]\204Son\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Die\000\000\200Dan\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200Gua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200Coi\000\000\200\000\000\200Mo\202\000\000\200\000\000\200Xi\202Yanv$\204\000\000\200Ni\202Dan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200Jan\000\000\200\000\000\200\000\000\200\000\000\200{\303\205\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200Voi\000\000\200TaoYu\202\000\000\200\003=\204\000\000\200MouVa\202BomKuaChu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qu\202\000\000\200Mo\202JauShi\000\000\200Gan\000\000\200\371\260\205\000\000\200\006\311\204\000\000\200\000\000\200HuaTop"; -static const char b202[757] = "\373\000\000\200Tuo\000\000\200\000\000\200\301\326\204\002M\204\000\000\200\000\000\200\000\000\200\000\000\200Nie\301\225\205Jyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lap\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YunGua\000\000\200\000\000\200Zok\000\000\200\000\000\200\000\000\200\3621\204Lao\000\000\200\000\000\200DanSuo\000\000\200\000\000\200\000\000\200\006\351\204Yi\202\000\000\200Te\202JauBi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200\000\000\200\000\000\200\010*\204Vai\302\022\204Nayv(\204v,\204\000\000\200Xi\202HunDa\202\000\000\200\000\000\200Ju\202\000\000\200Du\202Jip\000\000\200An\202\000\000\200\000\000\200\000\000\200\000\000\200\360<\206\000\000\200\000\000\200Jyu\003x\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mei\000\000\200\000\000\200Ran\000\000\200Ai\202Yu\202\000\000\200\000\000\200{\240\204\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\007\032\204\301\340\205Nhov0\204\004\371\204MinFanv4\204\000\000\200\003c\204Zhi\362?\205Nao\002\354\204\000\000\200\372\230\205ShuXunJuez\350\204\000\000\200\000\000\200Gua\000\000\200Tu\202\000\000\200\000\000\200\000\000\200\004\377\204Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\241z\204\007\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\207\204Ya\202\000\000\200\000\000\200\000\000\200\000\000\200Guo\005\014\204SheYu\202\000\000\200Si\202Sou\000\000\200ZhiMeiMu\202Qie\000\000\200Fu\202\000\000\200\000\000\200Ju\202Bei\000\000\200Bi\202\000\000\200\000\000\200Suo\000\000\200\000\000\200z\350\204\305;\204z\355\204\000\000\200\000\000\200SaoJi\202"; -static const char b203[769] = "\377\000\000\200\000\000\200San\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Paa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204{}\205\000\000\200\000\000\200\000\000\200\006N\204\000\000\200\000\000\200\000\000\200SouSouYao\000\000\200\000\000\200\000\000\200\000\000\200Wu\202NapNa\202v8\204\000\000\200\004\320\204\000\000\200\000\000\200{\276\205ZheLi\202GaiSui{\221\204\000\000\200\372\230\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200Man\000\000\200Ji\202DouMakLei\303u\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200\000\000\200{\240\204YanZhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BayButBomHen\000\000\200MeiYaoDi\202Yi\202\000\000\200Gap\000\000\200Bie\000\000\200\000\000\200Qu\202Yi\202\000\000\200\360\350\204\000\000\200\000\000\200\000\000\200Zha\000\000\200\000\000\200\000\000\200ShaJin\000\000\200Git\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xum\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\311\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GitCapBayLu\202v<\204\010\220\204\000\000\200Jue\000\000\200Qi\202\000\000\200\000\000\200Yu\202Vai\007\032\204ZaiSa\202Se\202\000\000\200\000\000\200Dun\000\000\200\000\000\200\000\000\200JieKe\202\000\000\200\000\000\200Yue\000\000\200\000\000\200\000\000\200{\240\204YaoGon\000\000\200Jyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204\000\000\200\3621\204\006\214\204\000\000\200\000\000\200\000\000\200Yu\202Qu\202\000\000\200\000\000\200\000\000\200BamGa\202z\374\204Luo\000\000\200{\012\205\007\032\204\004\256\204{x\205\305X\206Yi\202\000\000\200{Z\205\000\000\200\004#\204Dui\000\000\200\005(\204\000\000\200Tho\301\345\205\000\000\200\010X\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gaa\000\000\200\000\000\200Fei"; -static const char b204[769] = "\377Yi\202\006\205\204\000\000\200\000\000\200\000\000\200\302\034\204\000\000\200\000\000\200\303\362\204JieShu\006z\204Bi\202Su\202\000\000\200\000\000\200\000\000\200Di\202\000\000\200\0050\204Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v@\204Liu\000\000\200BeiWen\000\000\200\000\000\200\000\000\200\000\000\200\006\205\204\000\000\200z\355\204\000\000\200\000\000\200Doi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dao\000\000\200\000\000\200Doi\000\000\200Pin{\240\204LinGuiQi\202\005\335\204\000\000\200\000\000\200\000\000\200Ji\202Xie{Z\205z\355\204\000\000\200vD\204vH\204\000\000\200\003\031\204\000\000\200\000\000\200\000\000\200\000\000\200Yaoz\355\204\000\000\200\000\000\200\000\000\200vL\204\006\227\204Sin\3607\204z\367\205NeiNei\000\000\200\000\000\200\005(\204\303\362\204\000\000\200z\355\204\302\034\204\000\000\200\000\000\200Cau\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200vP\204\000\000\200\000\000\200Cu\202Xin\0050\204z\350\204\000\000\200\003\006\204\000\000\200\000\000\200\000\000\200\000\000\200Gu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200\000\000\200vT\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\251|\204Jan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gan\000\000\200\000\000\200\007:\204\002\354\204\000\000\200\000\000\200\000\000\200\000\000\200Wan\004\272\204\000\000\200\010\314\204Ro\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Vac\000\000\200\000\000\200vX\204\003\025\204\000\000\200Cin\000\000\200\000\000\200{\207\204\000\000\200TinRao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200FanDi\202\301\352\205\010\314\204\000\000\200\000\000\200\000\000\200=\350\204\000\000\200\010\230\204\000\000\200\000\000\200HuiYi\202z\374\204\000\000\200Dun\006\251\204\301\357\205Ro\202\000\000\200\000\000\200\005I\204\000\000\200LanFu\202\000\000\200{s\205\000\000\200\000\000\200{\207\205TaoJi\202\000\000\200\000\000\200\000\000\200JieZhaShi\000\000\200\000\000\200\000\000\200Vaov\134\204Qi\202\303\362\204LanLanLin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhiBi\202\371\260\205LonVo\202\3034\204Sip\371\260\205\010v\204Qin"; -static const char b205[769] = "\377\000\000\200\000\000\200\003t\204Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007q\204\000\000\200Ji\202\000\000\200Xi\202Qin\000\000\200\000\000\200Hai\000\000\200\000\000\200\000\000\200Lun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\033h\204\000\000\200{\207\204\000\000\200\000\000\200\000\000\200\000\000\200TamGomBan\000\000\200\000\000\200\005\313\204Lim\000\000\200\000\000\200Qi\202\000\000\200\000\000\200\000\000\200z\350\204{Z\205Mao\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200\000\000\200Na\202\000\000\200\000\000\200Mou\000\000\200\000\000\200\005P\204\000\000\200\004#\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\343\205\002\376\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\327\204{x\205\000\000\200\000\000\200Qia\000\000\200\000\000\200Yu\202\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002\376\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Di\202Jiu\000\000\200\000\000\200\000\000\200Sui\000\000\200\000\000\200Yao\000\000\200\000\000\200\000\000\200\305`\204\000\000\200\000\000\200\006z\204\000\000\200\3628\204\000\000\200\006\205\204\000\000\200\301\364\205\000\000\200\000\000\200You\000\000\200\000\000\200v`\204\000\000\200\000\000\200\000\000\200\000\000\200Si\202\000\000\200\000\000\200\000\000\200\000\000\200Nap\000\000\200\000\000\200Lou\000\000\200\301\371\205\000\000\200Yin\000\000\200\000\000\200\000\000\200\000\000\200Bayz\367\205\000\000\200\000\000\200\005I\204\000\000\200\000\000\200GanJiuLeo\000\000\200vd\204Day\000\000\200\000\000\200Mat\000\000\200\000\000\200Qinz\343\205\000\000\200Xie\000\000\200\000\000\200\000\000\200\000\000\200Mat\006N\204\000\000\200\000\000\200He\202Jan\000\000\200\000\000\200Tao\000\000\200QiuXie\0050\204{\327\204\0050\204\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\254\204\000\000\200\000\000\200|\015\204\000\000\200CuiDie\000\000\200\003\006\204\000\000\200Mui\301\376\205\000\000\200\000\000\200Lun=\350\204\0102\204\0102\204Ce\202DieLou\000\000\200Wun\000\000\200\000\000\200\000\000\200\301\357\204\3034\204\000\000\200\000\000\200{\207\204Han\003\247\204\005!\204\000\000\200\006&\204RetYi\202\003P\204SuoLiu\372\266\206\371\260\204"; -static const char b206[748] = "\370\000\000\200Bu\202Sou\004\352\204\000\000\200Qin\371\260\204\000\000\200z\355\204\005\335\204\010M\204\005P\204{\240\205\000\000\200Hui\000\000\200z\355\204Hei\000\000\200\000\000\200\000\000\200Xi\202Zhi\000\000\200\000\000\200LokMo\202\000\000\200\000\000\200LaiLi\202Li\202\006\333\204\000\000\200He\202\003\002\204\000\000\200Yan\000\000\200Shu\000\000\200\000\000\200Shi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010X\204{Z\204\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SuoWu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\205\006&\204\000\000\200\000\000\200SapJu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JiuWei\003\247\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Huo\000\000\200\000\000\200\000\000\200\000\000\200BayJie\000\000\200,a\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Guavh\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HaoLi\202Zhiz\374\204\000\000\200\000\000\200Bu\202z\355\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Moc\000\000\200\000\000\200YunHe\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tao\000\000\200\000\000\200\000\000\200\003t\204\000\000\200Ra\202\000\000\200\000\000\200\005,\204\000\000\200Er\202Jiu\000\000\200\000\000\200\000\000\200\000\000\200Di\202Yi\202Kun\000\000\200Zhe\000\000\200Kuo\003c\204Ju\202\000\000\200\000\000\200\000\000\200{_\204Sha\005,\204BanJi\202\000\000\200\000\000\200\362?\205\000\000\200\000\000\200Yi\202\000\000\200KouWu\202\000\000\200\000\000\200\000\000\200Ge\202Ba\202\305F\204\000\000\200Gou\000\000\200\000\000\200z\374\204GuaLiuChi\007\230\204\305X\205\000\000\200Li\202Cu\202{\276\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200Dut)\275\204\002\354\204Li\202\000\000\200\000\000\200Jiu\007\036\204Duo\0050\204Yan\301\357\204\000\000\200\000\000\200Lie\000\000\200Ke\202\000\000\200Gen{Z\204\000\000\200Fen"; -static const char b207[760] = "\374\000\000\200Yi\202\000\000\200JiuXu\202\003\002\204\000\000\200\000\000\200Lu\202Jiu\000\000\200\004\320\204\000\000\200\000\000\200z\374\204Deo\005\271\204Dui\000\000\200\000\000\200\000\000\200\000\000\200LuoXi\202QinBu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DanDamHuiCao\000\000\200Pi\202Ya\202\005\005\204GuoGua\000\000\200\000\000\200\000\000\200Ju\202\000\000\200\000\000\200Qia\000\000\200Jue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200Bao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hua\003\002\204\000\000\200Xe\202vl\204Cun,\235\204DutQia\000\000\200ZhaQia\000\000\200ZheCha\004\377\204\000\000\200\000\000\200Yan\000\000\200z\367\205\000\000\200\000\000\200\000\000\200Chi\000\000\200WanMe\202Sou\006\260\204\000\000\200\000\000\200\000\000\200\000\000\200Kan\007:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\272\204Mo\202\305F\204Mo\202\004\320\204\000\000\200SuoTu\202\000\000\200\000\000\200ZheTi\202\000\000\200Wu\202\000\000\200Da\202Li\202Cha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006N\204\003=\204Que\000\000\200Li\202\000\000\200\360\242\205\000\000\200\000\000\200TaoCao)\255\204GotBam\000\000\200Li\202\000\000\200\000\000\200Mi\202\000\000\200Chi\000\000\200\000\000\200GunLou\305X\206Suo\003\002\204Jin\000\000\200\302\003\205\000\000\200Fa\202\005(\204\000\000\200DeoDutLan\000\000\200\000\000\200\000\000\200JinCuiDeo\000\000\200\007\177\204Zun\000\000\200\002\376\204\000\000\200\000\000\200Pie{\221\204Xi\202YaoFu\202z\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cui\000\000\200\000\000\200\000\000\200Gua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\360\242\205vp\204Se\202{\221\204\005\357\204Se\202Ye\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ju\202\000\000\200Vac\000\000\200\000\000\200\000\000\200Tu\202\000\000\200GatRuaRu\202Ze\202z\362\204"; -static const char b208[769] = "\377\000\000\200z\374\204\000\000\200z\350\204\002\376\204\000\000\200\000\000\200\000\000\200\000\000\200Bua\005i\204Can\000\000\200Le\202KuoLi\202RouTet\000\000\200\000\000\200Du\202\000\000\200\000\000\200Lie\000\000\200RiuXe\202\000\000\200\004\377\204Li\202\000\000\200\000\000\200Du\202\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\352\205Wan\000\000\200Cim)\325\204\000\000\200Die\000\000\200\000\000\200\000\000\200Jiu\000\000\200Li\202Ku\202\007\243\204\000\000\200{Z\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202\000\000\200Bi\202\000\000\200Pi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\272\204\000\000\200\000\000\200\000\000\200Ran\302\010\205\000\000\200\004\334\204Dui\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\025\204\302:\204Ke\202Yi\202Mo\202\000\000\200LoiCan\000\000\200\007\277\204Ke\202Shi\000\000\200Ran\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\005\005\204\000\000\200\000\000\200\0070\204\000\000\200Min\000\000\200\000\000\200\007q\204NaoZi\202\000\000\200\302\015\205\004#\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005!\204\000\000\200\000\000\200XiaHan\000\000\200\000\000\200\000\000\200\000\000\200Luez\350\204\000\000\200\000\000\200\000\000\200vX\204\000\000\200Mo\202Ou\202Hao\000\000\200\000\000\200\000\000\200Zha\007q\204\006&\204\000\000\200Vamvt\204vt\204Li\202ZhaYou\3607\204JueBei\000\000\200\000\000\200\000\000\200YaoPie\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200JinKaiSe\202\360\350\204Jin\000\000\200\000\000\200\000\000\200Ke\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\134\204\000\000\200z\355\204\000\000\200\000\000\200{\327\204\000\000\200WanLu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YunYaoBao\000\000\200\000\000\200Jun\003P\204\000\000\200\003c\204\000\000\200\000\000\200Moc\000\000\200\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qu\202\360\366\204Sun\000\000\200\000\000\200\000\000\200Du\202\000\000\200\005\271\204Pao\000\000\200\000\000\200Bit\000\000\200\000\000\200\000\000\200Bao\000\000\200\000\000\200\000\000\200Fu\202Jiu"; -static const char b209[769] = "\377Ran\000\000\200\000\000\200\000\000\200Ju\202\000\000\200Cho\000\000\200\000\000\200\000\000\200{}\205\000\000\200Cho\003c\204HuaBao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202Me\202Yi\202Yi\202\000\000\200\000\000\200\000\000\200\000\000\200Mao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\005\253\204vx\204\000\000\200Bay1\000\201Ci\202\000\000\200\000\000\200Han\000\000\200\006&\204\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\007\036\204\000\000\200\005,\204\000\000\200Han\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ye\202v|\204\000\000\200\000\000\200\000\000\200\000\000\200E\000\201Wei\000\000\200\010:\204\005,\204\000\000\200\000\000\200WuiE\000\201Di\202\000\000\200\011\032\204\301\357\204\000\000\200\000\000\200E\000\201Ou\202\003P\204\000\000\200\000\000\200\000\000\200Wu\202\000\000\200v\200\204\000\000\200Yi\202\000\000\200Mou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hu\202\000\000\200\000\000\200\000\000\200Han\000\000\200\000\000\200\000\000\200\000\000\200Au\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shi\000\000\200\000\000\200\000\000\200Sa\202Hwe\000\000\200\000\000\200\000\000\200Bi\202\000\000\200Han\0050\204Xi\202\000\000\200QinCuoCi\202\000\000\200Ban\000\000\200\000\000\200\000\000\200\000\000\200Dui\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\006\337\204v\204\204Hu\202Ji\202\007\230\204\000\000\200\000\000\200Gan\000\000\200\000\000\200\003\247\204\302\022\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\2575\204v\210\204\005\275\204\000\000\200\000\000\200\000\000\200v\214\204Zhu\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\3034\204Yu\202\000\000\200\000\000\200\000\000\200\000\000\200v\220\204Nhu\000\000\200\000\000\200\000\000\200\000\000\200Qi\202\000\000\200\000\000\200He\202Chu\000\000\200\000\000\200\360\366\204ChiBo\202\000\000\200\000\000\200\000\000\200\007\357\204You\000\000\200\000\000\200\000\000\200Nai\000\000\200\000\000\200Sai\000\000\200Hui\007\036\204Ban\000\000\200\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200YouChi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\313\204"; -static const char b20a[766] = "\376\000\000\200\000\000\200\000\000\200Wai\000\000\200\000\000\200Xie\000\000\200\000\000\200\000\000\200Jue\000\000\200Sui\003\006\204\372\230\205\000\000\200\000\000\200\005I\204\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200Bi\202\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\004\340\204\000\000\200Ji\202\302\027\205Jun\000\000\200\000\000\200\006z\204You\000\000\200\000\000\200\000\000\200\302\034\205\000\000\200\000\000\200Ju\202\000\000\200\000\000\200\000\000\200\000\000\200Yue\000\000\200\000\000\200\006l\204\000\000\200\000\000\200Pi\202\000\000\200\000\000\200Ze\202\000\000\200\000\000\200Yi\202Di\202\000\000\200\000\000\200Qie\000\000\200Suo\000\000\200Ci\202\000\000\200ZhuYue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\002\204San\000\000\200\000\000\200\000\000\200ShiMe\202\000\000\200Yi\202Xia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007:\204\000\000\200\000\000\200\000\000\200\000\000\200Guo\000\000\200Ke\202\000\000\200\000\000\200CuiYi\202\000\000\200\000\000\200\000\000\200\010v\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\3607\204\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\303\362\204MeiLi\202\000\000\200\000\000\200Sou\000\000\200\000\000\200Lim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LiuGuiKe\202\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200Xi\202Yin\000\000\200\000\000\200\000\000\200\000\000\200Ke\202\000\000\200\000\000\200\000\000\200She\000\000\200\000\000\200\000\000\200Wo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Co\202\000\000\200Yue\005\335\204Rap\000\000\200Li\202Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LouJuez\374\204DayDay\000\000\200\000\000\200\3607\204\000\000\200\000\000\200Li\202\000\000\200\000\000\200Rot\000\000\200\000\000\200\000\000\200Tu\202\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200BaiDi\202{\221\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202\217s\204\000\000\200\000\000\200\000\000\200Dui\000\000\2006\000\201\000\000\200\000\000\200CanTu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200TanJi\202Qi\202{_\204{\327\204\000\000\200\000\000\2003\000\201Di\202"; -static const char b20b[769] = "\377\000\000\200\000\000\200\000\000\200Bo\202\000\000\200\000\000\200{\012\204\000\000\200Bi\202\302!\205\000\000\200\003g\204\000\000\200\303\254\204\000\000\200\000\000\200\000\000\200\000\000\200Cut{Z\204\000\000\200Bo\202Bo\202\000\000\200\000\000\200Sa\202\000\000\200Mo\202\000\000\200Fu\202\000\000\200\000\000\200Mot\000\000\200Tao\006l\204Jik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003t\204\000\000\200Xi\202\000\000\200Jie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Si\202\0050\204\000\000\200Chi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200TroSui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhaLi\202\000\000\200\000\000\200\000\000\200\004\334\204\000\000\200\000\000\200\000\000\200\000\000\200\303\362\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tun\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\000\000\200Fei\000\000\200\000\000\200\000\000\200De\202\000\000\200Zhu\000\000\200\000\000\200\007\215\204\000\000\200Ju\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200Ya\202\000\000\200\000\000\200ChiGuaZhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\357\204Leo\000\000\200You\000\000\200Bo\202\000\000\200Ji\202Pin\000\000\200\000\000\200\004\377\204\360\350\204\006\351\204Ge\202Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204N\000\201Sa\202\305X\205\000\000\200Ci\202Wu\202RenDucJyuRi\202DaiJi\202\000\000\200Yi\202\000\000\200Ran\000\000\200\000\000\200HuoGua\000\000\200ZhePi\202\000\000\200\000\000\200Za\202BanJie\000\000\200\000\000\200Hou\000\000\200\000\000\200z\374\204Hui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cai\000\000\200\000\000\200ZhaDaiGe\202\000\000\200Pi\202Hin\003I\204Shi{\207\205YueHu\202\303\362\204\000\000\200\000\000\200\007\357\204\000\000\200\007\357\204\000\000\200\301\326\204\026B\204Zi\202v\224\204Luk"; -static const char b20c[769] = "\377v\230\204Gay\302&\205v\024\204Yi\202Zhi\000\000\200Jin\006Z\204\010I\204\000\000\200QiuMutZhu\000\000\200ZhaPo\202An\202\000\000\200He\202\000\000\200ChuYan\000\000\200\000\000\200\301\307\204ShiHu\202E\000\201\000\000\200\000\000\200\000\000\200\004\324\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Meo\000\000\200\000\000\200\000\000\200\000\000\200Eot\302+\205Shi\000\000\200\000\000\200Lou\000\000\200TuoDaiWaiPo\202\006N\204Ju\202\000\000\200Bo\202TamDatNip\3020\205v\234\204\010\220\2042=\204TheRinSe\202Ro\202v\240\204v\244\204\000\000\200\000\000\200Yu\202Dou\000\000\200Gui\002M\204\000\000\200\000\000\200SuoNi\202\003c\204\003\031\204\002\354\204ZunYe\202Ran\000\000\200\005\357\204Sa\202\000\000\200\000\000\200LeiE\000\201\000\000\200\362?\205Ji\202\000\000\200\000\000\200E\000\201\000\000\200\000\000\200\000\000\200Zuo\000\000\200\000\000\200Na\202Yun\000\000\200\000\000\200Vo\202\305;\204\000\000\200\000\000\200\000\000\200\000\000\200\006h\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XieZuiShuDiuFa\202Ren\000\000\200\006l\204Han\005\335\204Yi\202\000\000\200Yi\202\000\000\200\000\000\200Ke\202Yi\202Hui{Z\205\000\000\200\000\000\200Ganv\250\204HaoDauv\254\204NhoLai\3025\205v\260\204Tre\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200Ge\202\000\000\200\000\000\200NouQie\000\000\200Die\000\000\200Ji\202Yi\202Yi\202\000\000\200Fu\202\010\016\204\010\016\204\003]\204KenHua\005\335\204\000\000\200\000\000\200\000\000\200He\202\000\000\200\000\000\200He\202z\350\204Qia\000\000\200Si\202Ce\202\006l\204Uc\202LoiBei\004\324\204v\264\204DapXacNhuv0\204Cai\000\000\200\000\000\200FauJue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hoi\000\000\200\000\000\200\000\000\200\0050\204Ke\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ai\202Lou\000\000\200Tu\202\000\000\200\000\000\200\305X\206Lan\000\000\200\007\023\204{x\205\000\000\200Wei"; -static const char b20d[769] = "\377\000\000\200\000\000\200Nu\202\000\000\200Jiu\000\000\200\000\000\200Bin\000\000\200\302&\205Ro\202v\270\204\302:\205\302:\204Oc\202\006\351\204NucNo\202v\274\204Day\360B\206MiuVoiDo\202\302\205\204Bo\202v\300\204\003\226\204Ke\202v\304\204Ban\000\000\200\302?\205\3621\204\371\260\205HouVum\302D\205Zhu\000\000\200{\012\204Ji\202\000\000\200Ji\202\000\000\200Xi\202\000\000\200SheOu\202Hu\202Ta\202\3621\204\000\000\200Zao\000\000\200\000\000\200Bo\202Qi\202Wa\202TuoDao\000\000\200Na\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\251\204KeuMui\005\335\204\000\000\200NetJi\202v\310\204Gu\202XapMep\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mun\000\000\200\303\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005(\204\000\000\200\000\000\200Ya\202\000\000\200\000\000\200Wu\202{Z\204De\202He\202\000\000\200AngPi\202Se\202FenGua\000\000\200Ji\202\000\000\200Po\202\305;\204\000\000\200\000\000\200\003P\204Han\006\025\204Ba\202\004#\204\006\205\204v\314\204HuoPe\202v\320\204NhuSua\302D\205Ga\202v\324\204Moi\302I\205Se\202\006l\204PhaRiaCan)\355\204Be\202\302+\205\360H\206U\000\201DatBeov\234\204vP\204\005:\204SucSatBopA\000\201\302N\205ZaiSua\302S\205Ep\202Trev@\204Du\202Mai\302X\205\016\203\204Meo\3607\204Xi\202\000\000\200\000\000\200Da\202\006\220\204\000\000\200Hei)\365\204\005,\204LuoKe\202\000\000\200\000\000\200\000\000\200\000\000\200Yi\202JueHe\202\000\000\200Ji\202\000\000\200\000\000\200He\202NieRunz\350\204Dai\360\366\204Ke\202Zhu\000\000\200ShiLu\202Jia\003I\204HouJi\202Ta\202\004\320\204Wo\202\0050\204Po\202\005(\204Xin\000\000\200\000\000\200\303\362\204\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200Gu\202Jie\000\000\200\000\000\200z\374\204\000\000\200v\270\204\026B\204\3020\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200Bo\202\007\335\204\000\000\200\000\000\200\000\000\200Za\202"; -static const char b20e[763] = "\375\000\000\200PaiTu\202\000\000\200\004\377\204\000\000\200\000\000\200\000\000\200\000\000\200KakTap\000\000\200\000\000\200MeiNaaGe\202Kam\237\376\204Bouv\330\204NiuDan\005\357\204XuaTuc\007\023\204CauTenTen\006:\204DumBaiBi\202Hucv\334\204\005\335\204v\340\204Ke\202\301\232\204v\344\204LayRenVacTauXam\000\000\200z\374\205\000\000\200\000\000\200NuoGe\202Bo\202Xie\000\000\200\000\000\200\000\000\200{Z\204Yu\202Ni\202\000\000\200Moiv\350\204Map\000\000\200XunWa\202\000\000\200AngHan\005\335\204Dan\000\000\200Nuo\000\000\200CaoJi\202\010\026\204\003]\204\3621\204\000\000\200{\252\204Yao\000\000\200Ge\202\005!\204Baoz\355\204)\255\204Xu\202\000\000\200\000\000\200Hai\000\000\200\004\320\204\000\000\200{\240\204Zuo\000\000\200\000\000\200\000\000\200WeiDa\202Pi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ko\202\000\000\200Be\202BemKhuChuGit\301\357\204\000\000\200\000\000\200NgoKamLanv\354\204ZamRiaCayv\360\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hei\000\000\200\000\000\200\000\000\200\000\000\200Gwe\000\000\200\000\000\200\000\000\200z\362\204\000\000\200Xi\202\000\000\200PenLiuMu\202Mie\005\230\204TuiBan\000\000\200\000\000\200Ge\202\000\000\200Ku\202\005\275\204\000\000\200JiaBo\202\000\000\200v\360\204v\364\204v\230\204Ri\202v\370\204\000\000\200LeuHe\202\010\344\204Thev\374\204w\000\204\005\204\204z\355\204GheHat\255\221\204w\004\204\302]\205TimRi\202QueCopXuiv\034\204v<\204\360T\205Do\202{\367\205\302\200\204Hanw\010\204Bep\302\313\204DaiOn\202v\330\204\302b\205Bua\000\000\200z\362\204\000\000\200Zu\202Luo\000\000\200\302D\205vH\204\000\000\200\000\000\200\000\000\200Li\202v`\204He\202Mo\202\000\000\200\3055\204\371\260\204\007\014\204Chi\005\357\204Luo\000\000\200\000\000\200Yan\002\376\204{\252\204Gu\202Qin\000\000\200TanFenTu\202\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\005\230\204\006\351\204\000\000\200HenZi\202TimAa\202BaiDauMoi"; -static const char b20f[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\014\204LanZanWu\202\000\000\200\000\000\200\000\000\200\000\000\200Li\202A\000\201LueZhi\004\320\204{\240\205\000\000\200{\240\204\000\000\200\301\376\204\000\000\200\000\000\200LunYi\202\000\000\200{_\205But\007\032\204Ho\202\007\014\204\000\000\200w\020\204Can\360N\206\026B\204Ninv0\204En\202GanDanJi\202Biu\033\327\204\007\023\204Ran\010\325\204Xo\202DanZapv\320\204\302g\205w\024\204Nat\303\211\204v\320\204MonNac\042\301\204Ramv\240\204HamNgoXia\010\026\204\302\200\204w\030\204w\034\204w \204\302:\204\004\272\204Nhaz\367\205OamYi\202NinHon\000\000\200\000\000\200Hui\000\000\200ZhaKik\000\000\200Han\000\000\200YinBi\202An\202XiaNi\202\000\000\200De\202\000\000\200Di\202{\240\204Pan\000\000\200\000\000\200Yu\202{\252\205Za\202\000\000\200Cha\000\000\200ZheSe\202\000\000\200PenGu\202Zhe\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202Dou\000\000\200\004\320\204\000\000\200ZuiPo\202He\202\000\000\200She\003\031\204\000\000\200Nhav\324\204w$\204DoiQi\202\000\000\200\000\000\200\000\000\200\000\000\200\360T\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ShuRumJin\005\357\204Bai\000\000\200\007\014\204La\202\000\000\200Xu\202JinWe\202\305X\205\000\000\200\000\000\200\000\000\200Yue\000\000\200\006l\204Zaa\006\311\204VaoSeuw\024\204w(\204w,\204-\225\204\3025\204w0\204\004\272\204SaoSi\202XepMoi\010\325\204\000\000\200MaiXieJiuJi\202\000\000\200Yue\000\000\200\000\000\200\000\000\200{\240\204\000\000\200HanHetSa\202Hui\006\214\204\000\000\200Se\202Zui\000\000\200w4\204Lu\202HuaChu{_\204Wo\202Ji\202\004\334\204z\374\204Yi\202GuoKui\000\000\200\000\000\200\000\000\200\000\000\200Gaaw8\204SoeWetAm\202w<\204Sutw@\204DatLemwD\204\301\232\204\360\212\205w@\204vd\204v\024\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\227\204"; -static const char b210[769] = "\377\000\000\200\000\000\200Loi\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003c\204\000\000\200\000\000\200Lu\202\000\000\200Bo\202Shi\004\377\204Ku\202\000\000\200\000\000\200\000\000\200NamZip\000\000\200Bei\026'\204\302l\205CanDu\202v\270\204On\202OaiBo\202LokVoiBamTuiCauNeu\360Z\206vH\204HaoGoi\301\357\204Ua\202\360N\205\302\200\204Ron\000\000\200ZhiXie\000\000\200\000\000\200Ye\202E\000\201Lu\202HanYe\202\000\000\200\000\000\200\000\000\200\000\000\200Luo\301\321\204FanZhi\004\377\204WenWa\202Ai\202Yu\202Am\202\000\000\200Hua\000\000\200Lie\0050\204Za\202\000\000\200\000\000\200\000\000\200wH\204HonNonWo\202\004\272\204Xao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cac\000\000\200\000\000\200\006a\204Dui\000\000\200Ji\202\000\000\200\000\000\200\000\000\200Wo\202\030:\204Ji\202Xi\202\000\000\200{\221\204\007\265\204GanZit\211\246\205\302q\205Do\202\302\200\204ZiuwL\204ChawP\204So\202wT\204wX\204NgoHunPhoMomReuMomBukTheYu\202\000\000\200XinEngLocLie\000\000\200BanZhiShi\000\000\200LaoLaiWeiPaoChi\004\377\204Dou\000\000\200Dou\000\000\200BaoQieShu\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LieZe\202\006\260\204\000\000\200Zhe\010\325\204\010\314\204Ran\010\220\204Rayv@\204Lin\302:\205\000\000\200\360\264\205\000\000\200w\134\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\000\000\200\006G\204XieJi\202Lai\004\377\204\007\177\204BaiAakGaaKhe\3034\204\302v\205)\275\204\302\274\204DoeDan\302{\205BocBo\202v\324\204\003\226\204Le\202Muaw`\204MutRen\006\227\204XacLun\000\000\200\000\000\200\000\000\200\003\031\204Xi\202\000\000\200>3\204\000\000\200Lin\006\233\204\000\000\200Gui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003g\204\010\272\204\000\000\200SekLi\202Ci\202{x\204wd\204\010\220\204wh\204Nho\302\370\204wP\204"; -static const char b211[769] = "\377La\202Lum\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\006\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200RucGamHamUng{\240\204Dao{\240\204\003\006\204Xie\004\377\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ha\202\000\000\200ZheSheMi\202z\362\204wl\204Lom\010\220\204Non\301\232\204Toewp\204Hun\302g\205RenJikTotCu\202Ru\202Sa\202HuoYi\202\000\000\200Di\202\000\000\200\006\337\204\000\000\200Yi\202\000\000\200SoeCan\000\000\200\000\000\200\000\000\200Bo\202\003\247\204TanE\000\201\006a\204\006&\204Laa\010\220\204BunHum\301\345\204wt\204vD\204Lai\0311\204\302\200\205vP\204\005(\204\000\000\200Xi\202\006\351\204\000\000\200La\202Yun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\000\204E\000\201Gam\000\000\200\000\000\200Die\000\000\200Nanwx\204Dem\360`\206wd\204w|\204{\012\204\000\000\200On\202\000\000\200z\362\204\000\000\200\360f\206\000\000\200Shi{\240\204wD\204\000\000\200{\221\204Ji\202z\362\204\000\000\200\000\000\200\000\000\200\000\000\200{\334\205vP\204Xon\000\000\200w\200\204WanLuoWokSac\000\000\200\000\000\200\000\000\200KeuSac\000\000\200Dou\000\000\200v\024\204\000\000\200\000\000\200\000\000\200{\207\204vD\204La\202Henw\204\204Gu\202\000\000\200\000\000\200\000\000\200v\200\204\000\000\200\000\000\200\000\000\200\000\000\200NieNanJiuYue\000\000\200\000\000\200Yao\305X\206\000\000\200\000\000\200\000\000\200CanLi\202DunNanNan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ri\202\000\000\200\000\000\200\000\000\200\000\000\200Yue\000\000\200\000\000\200You\000\000\200Yin\000\000\200Guo\000\000\200\000\000\200\000\000\200\010\220\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{Z\204Mi\202Die\000\000\200\000\000\200{Z\204\000\000\200\000\000\200DoeKua\000\000\200Han\007\023\204He\202Ji\202Zhe\000\000\200\000\000\200\000\000\200\002\354\204\000\000\200WeiTou\000\000\200Tu\202\000\000\200\000\000\200\006\025\204Lou\301\357\204Hun\372\230\205Que\000\000\200\005\335\204\000\000\200\010\220\204He\202Tai\007\230\204\000\000\200Yu\202w\210\204Ya\202\000\000\200\000\000\200Wan"; -static const char b212[769] = "\377Qun\000\000\200\000\000\200\000\000\200\000\000\200JueOu\202\000\000\200\360l\206\301\357\204Zhi\000\000\200\000\000\200\005\357\204Wu\202XinDa\202\000\000\200\007:\204\007:\204\000\000\200\000\000\200\000\000\200Mo\202\000\000\200You\000\000\200\301\326\204\000\000\200\000\000\200Wu\202\000\000\200{\221\205\360l\206\000\000\200\003P\204\000\000\200\000\000\200RaoGunYu\202\360l\206\000\000\200\000\000\200\000\000\200\000\000\200Xia\303\362\204You\000\000\200Yin\000\000\200\003P\204YouLei\000\000\200\000\000\200\000\000\200\3034\204\000\000\200\005P\204\000\000\200\000\000\200{Z\204\000\000\200\000\000\200\000\000\200\000\000\200ZaiGa\202La\202\000\000\200\000\000\200Que\000\000\200\000\000\200\000\000\200\000\000\200Ju\202Ji\202\256\371\204Da\202TunAi\202\000\000\200Hon\006&\204Zi\202\000\000\200\000\000\200z\362\205Yi\202\000\000\200\000\000\200\000\000\200\372\230\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ngo\000\000\200\000\000\200BaoChi\000\000\200\000\000\200Ri\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200JieShi\000\000\200\010k\204\000\000\200\010*\204LocTumMoc\000\000\200Yi\202\000\000\200\000\000\200FenFen\000\000\200\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200Shu\000\000\200\000\000\200\000\000\200w\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ao\202\000\000\200Pi\202\0102\204Po\202Jia\003c\204\000\000\200Qiu\000\000\200\000\000\200\000\000\200YouTanJuk\000\000\200\006N\204\000\000\200Mi\202\251|\204\000\000\200Tinv<\204Cho \341\204\000\000\200\000\000\200Yi\202\000\000\200\006N\204Yin\000\000\200Lie{}\205\000\000\200\000\000\200\000\000\200Rayw\220\204NenLoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Coi\000\000\200HuiJi\202\000\000\200\000\000\200\000\000\200\000\000\200Gao\000\000\200\000\000\200\000\000\200\007\042\204\303\254\204Catw\224\204YouChaDe\202Yin\000\000\200Yu\202Bei\000\000\200Bo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BitLo\202"; -static const char b213[766] = "\376Bet\000\000\200FanKokCe\202Fat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cha\000\000\200Xin\000\000\200Chi\000\000\200DayDiaHamZaoKui\000\000\200Fei\000\000\200\000\000\200Ta\202\007\230\204\000\000\200\000\000\200Duo\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200Zhi\000\000\200\010\263\204\000\000\200\000\000\200\000\000\200\006\351\204\000\000\200\000\000\200Dam\000\000\200\017\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\204Nao\000\000\200\000\000\200Hu\202\000\000\200Tao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Chev4\204LamDumMunNuiwx\204Xui\000\000\200Yi\202Go\202BenNie\005(\204z\362\204\000\000\200Du\202\000\000\200Qi\202Ce\202\000\000\200\000\000\200\257\320\204\000\000\200\000\000\200\000\000\200Da\202\000\000\200\000\000\200\303\254\204Zhi\007\277\204\000\000\200\000\000\200\000\000\200\006Z\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202\000\000\200\000\000\200\000\000\200ChiSai\000\000\200\000\000\200An\202Kuo\000\000\200Wo\202\000\000\200\000\000\200\000\000\200\004\377\204\000\000\200\003I\204BunNamCoi\360r\206\004\272\204\301\333\205Mo\202\006\227\204v<\204Me\202\006\227\204\006\227\204\000\000\200\000\000\200\000\000\200\000\000\200Zha|\024\204\302\205\205Su\202\000\000\200\000\000\200\000\000\200\000\000\200Ni\202\003\226\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhuz\355\204\000\000\200\000\000\200\005\005\204Ni\202ZhiHui\000\000\200\000\000\200\000\000\200\003\031\204{\303\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200ZhiXi\202\000\000\200\000\000\200{\240\205Dum\005\335\204\302\212\205Ma\202Xo\202\302\217\205w\230\204XayBui\000\000\200DuiFu\202\000\000\200\000\000\200\003\002\204\010I\204Bai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ao\202DapGei"; -static const char b214[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZaoChu\000\000\200\000\000\200Tuo\000\000\200\000\000\200Hao\007\014\204Yin\000\000\200z\374\204HocNutDatvL\204\000\000\200\000\000\200Fu\202Bie\000\000\200Kui\000\000\200\000\000\200\000\000\200QieSa\202\000\000\200\000\000\200Je\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ve\202He\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Da\202Ye\202\000\000\200\000\000\200\000\000\200{\221\205\000\000\200{\207\205\000\000\200Dui\000\000\200\000\000\200\000\000\200\000\000\200LaoXun\000\000\200\000\000\200\000\000\200Gam)\355\204\261\246\204SamDoi\302\224\205Zhi\000\000\200Ku\202\000\000\200\000\000\200LanSuiWo\202\000\000\200\000\000\200\000\000\200Ku\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NeoCat\000\000\200\000\000\200Coi\000\000\200{\240\204\303\033\204ConGomConDenv\374\204{\240\205\000\000\200\000\000\200\000\000\200\000\000\200\003p\204\000\000\200\372\266\206Yu\202\000\000\200\000\000\200Sa\202\000\000\200Yu\202Lan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202\000\000\200z\350\204Ju\202\000\000\200Lie\000\000\200\000\000\200Shuz\374\204\000\000\200\000\000\200GaiMunDao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tai\000\000\200\000\000\200\000\000\200\000\000\200|\015\204\000\000\200\000\000\200EchCauGhew\220\204\302X\205\006\205\204\000\000\200Di\202\000\000\200\003+\204\000\000\200\000\000\200{\303\205\000\000\200\000\000\200\000\000\200\000\000\200)\255\204\000\000\200\000\000\200Hui\000\000\200\000\000\200Bai\004\256\204Loiv4\204Am\202XepChoGheDuo\000\000\200v\020\204\000\000\200LieVaiSan\000\000\200\000\000\200LaiYinLan\000\000\200\003\002\204\000\000\200Huo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Doc\257\375\205Thow\234\204)\275\204Guo\000\000\200{x\204{\221\204\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200Mi\202\006\227\204)\355\204Kui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200FanRayYin"; -static const char b215[760] = "\374\000\000\200\000\000\200\000\000\200Nan\000\000\200\000\000\200\000\000\200Lei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v<\204\000\000\200\000\000\200\000\000\200LomNen\000\000\200Lan\003=\204Ben\000\000\200\000\000\200\000\000\200\000\000\200\005P\204Yao\000\000\200\305`\204\000\000\200\000\000\200\000\000\200\000\000\200Jie\000\000\200\000\000\200\000\000\200\000\000\200Xiu\000\000\200Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\240\204\000\000\200{\221\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ang\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\230\204\004\320\204\000\000\200Kua\000\000\200\000\000\200\000\000\200Ju\202Hai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003+\204\000\000\200\000\000\200\000\000\200\000\000\200\004\272\204\000\000\200\000\000\200\004\320\204\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\004#\204\000\000\200\000\000\200\000\000\200\000\000\200He\202\000\000\200\004\340\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\042\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kun\000\000\200\000\000\200\362?\205\000\000\200\002\376\204\000\000\200DieGouYunDanNuo\000\000\200\004\340\204\000\000\200\000\000\200\000\000\200\000\000\200\002\354\204\000\000\200Ranz\355\204\000\000\200\000\000\200w`\204\006N\204Yinz\355\204\000\000\200\000\000\200Zhi\000\000\200\000\000\200\007\230\204Nuo\371\260\204\000\000\200\000\000\200Su\202\000\000\200BonWo\202Chi\000\000\200Dem\000\000\200\000\000\200\000\000\200\000\000\200MieZhi \341\204\000\000\200Qi\202\000\000\200\000\000\200GouSai\000\000\200GomVe\202Lou\000\000\200Zi\202\302\231\205\302\231\205Lam\000\000\200\010\220\204Tumz\374\204\302\236\205Rou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200Kua\000\000\200Gui\256\371\204Jie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JieXi\202\000\000\200Ku\202w\244\204Gu\202ZhaFan\000\000\200\000\000\200Xie"; -static const char b216[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200z\362\204\000\000\200\003\025\204Xi\202\000\000\200\000\000\200Hau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\330\204\000\000\200Cu\202\000\000\200GunBan\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qia\000\000\200\000\000\200\006\351\204\000\000\200\000\000\200ZheMatLon\007q\204\000\000\200\000\000\200\000\000\200Bie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004#\204\000\000\200Bie\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\003\002\204\000\000\200\301\357\204Zhi|\015\204Kai\000\000\200\000\000\200\000\000\200\000\000\200San\000\000\200\000\000\200Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\025\204\000\000\200Jie\000\000\200\000\000\200So\202\302\236\205\000\000\200\000\000\200Bie\000\000\200DouZui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\250\204\301\225\204Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200Xon*\315\204\005\271\204\000\000\200YanWei\000\000\200z\362\204\000\000\200Hao\000\000\200La\202\000\000\200\000\000\200\003=\204Fan\000\000\200\006\205\204\000\000\200\000\000\200Lei\000\000\200Di\202Lon\002\354\204z\362\204Co\202\000\000\200Wa\202JueTo\202To\202\000\000\200\000\000\200\000\000\200Hai\000\000\200Chi\000\000\200\000\000\200\000\000\200\000\000\200Ba\202Jiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Di\202Maa{\221\205\251|\204Da\202ShiHao\000\000\200\000\000\200\3628\204MatJi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ye\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007x\204Gai\004\330\204\000\000\200Bi\202Pi\202Yao\000\000\200\000\000\200Di\202CanPinYueQiePi\202\000\000\200\000\000\200Nua\000\000\200\002\354\204\000\000\200Kaa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200TuoXie\000\000\200\000\000\200\000\000\200Jau\010\002\204JukYe\202"; -static const char b217[760] = "\374FanGuaHu\202Ru\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200RanFouz\362\205\000\000\200Zat\000\000\200\000\000\200Syu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ru\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mao\000\000\200Di\202DuiHuiXi\202Xiu\000\000\200\000\000\200RanYi\202\000\000\200\000\000\200Zhe\000\000\200Ji\202GaoYou\000\000\200Pu\202\000\000\200\000\000\200\000\000\200\000\000\200\004\272\204\007]\204Wui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bua\000\000\200\000\000\200\000\000\200\000\000\200ChuCu\202Zhe\003\025\204\000\000\200Qie\000\000\200\000\000\200Cha\000\000\200\003\025\204SuiKepVa\202No\202\261\246\204\000\000\200Cha{x\205YaoDu\202\305`\204\000\000\200{\327\204Mi\202\000\000\200\000\000\200\000\000\200Lau\000\000\200NouXi\202\000\000\200Yao\000\000\200z\355\204BouMouJi\202Dai>3\204Fan\000\000\200Zi\202\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Vo\202Di\202\010\344\204XieMie\007\243\204\000\000\200Cu\202\000\000\200\371\260\205PanHu\202\000\000\200Ke\202z\374\204\000\000\200Hou{}\205\004#\204\000\000\200\000\000\200Fu\202Nai\000\000\200Ni\202\000\000\200Ku\202Ci\202\006\327\204\0102\204\003\263\204\0102\204Wun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nen\000\000\200\000\000\200\000\000\200\000\000\200\251|\204\000\000\200\000\000\200\000\000\200Fui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ge\202\000\000\200\000\000\200\000\000\200Hou\000\000\200Ai\202\000\000\200Shi\000\000\200\000\000\200\000\000\200\010*\204\0050\204\002\354\204{\322\205\000\000\200Xiu\006&\204\003\002\204\000\000\200Zha\3621\204{\207\204Qu\202\000\000\200\000\000\200{_\204Xie\000\000\200\003=\204Mie\005\020\204\000\000\200En\202\000\000\200\000\000\200\000\000\200Dou\000\000\200Go\202\000\000\200\000\000\200\000\000\200Zi\202HaaJanFui"; -static const char b218[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kou\000\000\200\000\000\200\000\000\200\007\036\204ShiPi\202\000\000\200\000\000\200\010\230\204\000\000\200\000\000\200{\012\204\000\000\200\000\000\200\000\000\200HaoZhi\360\350\204\3628\204Bi\202\000\000\200Mo\202\000\000\200Fu\202Zuk\3628\204\000\000\200\000\000\200w\254\204\000\000\200z\350\205\000\000\200\000\000\200TaiGinMun\000\000\200\000\000\200\042\301\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\010\002\204ZouSou\000\000\200\000\000\200\003\025\204\007q\204\000\000\200\360\350\204\000\000\200z\362\205LeoMinCai\005\005\204Mo\202\010I\204\000\000\200\000\000\200\000\000\200Lu\202\360\366\204Bu\202\010\243\204Si\202\000\000\200ZuiYueZan\006\337\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\236\353\204\000\000\200\000\000\200\006\311\204\006&\204GukGeiQu\202DoiDi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\005\014\204Mei\000\000\200\000\000\200\000\000\200\000\000\200\372\230\205\000\000\200\000\000\200\006\270\204ManWan\000\000\200\000\000\200\010\220\204\000\000\200\007:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sau\000\000\200Ju\202\000\000\200\000\000\200HuiQi\202\000\000\200Yun\000\000\200Man\000\000\200Mo\202\000\000\200\0050\204Co\202Wo\202\261\246\204Jyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\335\204\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yao\000\000\200No\202Vo\202SuiGam\000\000\200ChiNi\202Sou\000\000\200Niu\000\000\200\000\000\200\000\000\200Shu\000\000\200\000\000\200\007\335\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HanBan{\226\205Gaa\011\026\204w\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yao\000\000\200Nei\000\000\200\000\000\200\000\000\200\000\000\200Maiw\254\204\000\000\200Shi\000\000\200\007:\204\000\000\200CaiJie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XieWaiSen\000\000\200Yan\3621\204"; -static const char b219[763] = "\375\000\000\200\000\000\200\000\000\200\011\000\204\006\270\204Can\000\000\200\000\000\200\000\000\200\000\000\200{\252\204XieLi\202\000\000\200Fan\000\000\200Coi{\214\205\003\217\204MoiMoiHaa\000\000\200Zhu\000\000\200Na\202\000\000\200\372\230\205Ji\202\000\000\200Kuiw\244\204Re\202\000\000\200Luo\000\000\200\000\000\200\000\000\200\000\000\200Bou\000\000\200\000\000\200\000\000\200Qia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\222\007\204\000\000\200Shu\000\000\200{x\205\000\000\200Yi\202\000\000\200\000\000\200Zi\202\000\000\200Hao\000\000\200\003\002\204\006h\204\000\000\200Huiw\264\204\3621\204Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Houv<\204Ga\202\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NoiDuaNi\202>3\204Ni\202Ti\202\236\353\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NitConJu\202\000\000\200\305;\204\000\000\200\000\000\200\000\000\200Me\202Li\202\000\000\200\362?\205\003\031\204Xu\202Chu{}\205Fu\202So\202Bin\000\000\200Gu\202\000\000\200Ji\202\000\000\200\000\000\200Qi\202Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\262\204Er\202Mun\000\000\200\000\000\200\000\000\200\000\000\200Shu\3628\204\3621\204\000\000\200Pi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200RotDan\000\000\200Ji\202)\255\204\000\000\200\000\000\200\302v\205\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200\000\000\200Coi\006&\204\000\000\200\000\000\200\000\000\200Bin\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\263\204\003+\204\000\000\200\000\000\200\000\000\200\000\000\200\003+\204\000\000\200Shu\3621\204BaoWa\202\000\000\200Pao\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gai\000\000\200Hu\202\005\313\204\000\000\200Zhu\007\230\204\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200\000\000\200\000\000\200v\030\204Coi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dai\000\000\200\000\000\200Binz\362\205"; -static const char b21a[763] = "\375Cha\000\000\200\000\000\200\000\000\200XiaJu\202\000\000\200Yao\000\000\200\000\000\200\000\000\200\000\000\200v\030\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200FenZao\000\000\200\000\000\200\000\000\200\003\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ju\202Yu\202\000\000\200\000\000\200\000\000\200Tot\000\000\200Hun\000\000\200\000\000\200\000\000\200\005i\204\000\000\200\000\000\200\000\000\200\000\000\200Jie{s\205\006\373\204Nai\000\000\200\000\000\200ChuGiuTruNou\000\000\200\371\260\205\000\000\200Yu\202\000\000\200\000\000\200z\362\204\007\277\204WanGaaTuo\006\214\204\000\000\200\000\000\200\000\000\200\006\373\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yin\000\000\200Jia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Suo\000\000\200JieXi\202\006Z\204\000\000\200\000\000\200\000\000\200\006\351\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\350\204\000\000\200Yao\000\000\200\000\000\200\000\000\200\000\000\200\006\351\204Ou\202\000\000\200\000\000\200An\202\000\000\200\000\000\200\000\000\200Lou\000\000\200{\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201Zi\202\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200An\202\000\000\200\000\000\200Xum\000\000\200Huo\000\000\200\007\177\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cho\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{s\205Ji\202\000\000\200Zuo\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200{Z\205Co\202\000\000\200\000\000\200\000\000\200\000\000\200Ji\202Qi\202\007q\204\006\373\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Rem\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Se\202\000\000\200Sao\000\000\200\000\000\200\000\000\200He\202\006N\204QinKin\000\000\200\000\000\200LanJu\202\000\000\200\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shi\005\275\204\000\000\200Ni\202z\374\204Fu\202\000\000\200\000\000\200Ru\202"; -static const char b21b[769] = "\377\000\000\200{s\205Gui\000\000\200Ji\202\000\000\200\006\205\204Fu\202\301\364\205SaiYu\202\003\002\204\006\205\204\003\031\204z\350\205\000\000\200Mi\202\000\000\200\000\000\200Yi\202\000\000\200\003\031\204HanNi\202Lao\010\356\204\000\000\200\000\000\200Lin\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200\000\000\200\000\000\200\303\362\204\000\000\200\000\000\200\303\362\204\003P\204\000\000\200{\240\204CamTac\303\362\204\000\000\200\000\000\200\000\000\200\006\025\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200De\202\000\000\200\010v\204\000\000\200\000\000\200\372\230\205\000\000\200Ban\000\000\200\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\372\266\205\000\000\200\000\000\200\000\000\200\000\000\200Cut\000\000\200\000\000\200Jia\000\000\200\000\000\200HuiMon\000\000\200{\221\204\000\000\200\000\000\200\000\000\200BaiLie\000\000\200XieBun)\365\204\000\000\200\000\000\200\000\000\200\000\000\200Be\202{\240\204\002M\204\000\000\200Xiu)\365\204\020M\204Kao\177G\204\000\000\200\000\000\200{\012\204\006\337\204\000\000\200Nhi\301\225\204\000\000\200\177G\204Nouz\355\205\000\000\200\000\000\200\177G\204\000\000\200{\264\204NheMon)\365\204NhoMonDepMayBe\202)\365\204{\207\205\000\000\200\000\000\200\000\000\200Ot\202\302\243\205May\000\000\200\000\000\200\303C\204Mo\202NaiRu\202NitXiu\000\000\200Zhi\000\000\200May\000\000\200\000\000\200Be\202Be\202Be\202Cao\000\000\200MayBe\202Khi\303a\204Mon\301\225\204MonTeoLi\202\000\000\200ThoMay\000\000\200\360l\206\360l\206Hen\301\225\204\005I\204HenLan\000\000\200\301\225\204wt\204z\355\204Oat\305`\204\005:\204\000\000\200Li\202\000\000\200\000\000\200Wu\202PaoYou\000\000\200Gan\000\000\200\000\000\200\005I\204An\202Xiu\3055\204Rui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BanYou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Huo\000\000\200\000\000\200Hui\000\000\200\000\000\200Zuo\3621\204\000\000\200\003+\204\000\000\200\000\000\200\000\000\200\000\000\200Ga\202\007:\204\000\000\200Bo\202\010I\204Tui\000\000\200Bo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ga\202\000\000\200\007\036\204"; -static const char b21c[766] = "\376Na\202\000\000\200\000\000\200\000\000\200\000\000\200Hu\202Nie\000\000\200\000\000\200\000\000\200\000\000\200HuiLou\000\000\200Ti\202\302\250\205\006\214\204\006\214\204\362?\205\000\000\200\000\000\200\000\000\200Di\202\000\000\200\000\000\200\000\000\200Lin\000\000\200\000\000\200\301\357\204\372\230\205\000\000\200Lei\000\000\200Xie\000\000\200\000\000\200Ren\000\000\200\000\000\200\010\220\204\000\000\200Du\202{\327\204\000\000\200\000\000\200\000\000\200Shi\000\000\200\000\000\200z\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KekZhi\000\000\200\000\000\200\000\000\200Ai\202Ci\202Pu\202\000\000\200Shi\000\000\200\000\000\200\000\000\200Qu\202Shu\3607\204\000\000\200\3621\204\3055\204\000\000\200z\362\204\000\000\200\000\000\200\000\000\200Yi\202\007q\204\000\000\200\000\000\200Zhi\000\000\200\302\255\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002\376\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\262\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\267\252\204Zhu\000\000\200Suo\000\000\200\000\000\200Go\202Die\006\025\204\000\000\200Qu\202\000\000\200Ke\202Hu\202Ju\202\000\000\200\003\006\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ve\202\000\000\200\000\000\200\000\000\200\000\000\200\002\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ti\202\000\000\200Jue\000\000\200\000\000\200Qiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ke\202{\240\205Va\202\010\230\204\000\000\200\000\000\200\000\000\200\000\000\200YunVai\020~\204MeiPi\202\000\000\200Qu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mi\202\000\000\200\000\000\200Ti\202\302&\204XaiKaiw\254\204Bi\202\000\000\200Qu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Va\202\007\036\204\000\000\200ChuVe\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ju\202\000\000\200Xi\202Cutw\254\204RotLin\000\000\200\000\000\200\000\000\200Do\202Do\202Do\202Toi\000\000\200\000\000\200\000\000\200Vo\202v\020\204\000\000\200\000\000\200ChiJi\202\000\000\200Cu\202\000\000\200\000\000\200w\254\204Lu\202Cu\202Cu\202\000\000\200Li\202VoiVia\000\000\200\000\000\200NocJue"; -static const char b21d[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhuLu\202\000\000\200\000\000\200Vom\000\000\200\000\000\200\000\000\200\000\000\200Nie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\225\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ya\202\000\000\200E\000\201\000\000\200Hu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\351\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zi\202\000\000\200\000\000\200Wu\202\000\000\200\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200QinJie\005\335\204\000\000\200DanEn\202Ze\202Hu\202AngJieFu\202\003]\204\004\371\204\003\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Se\202\006&\204\000\000\200\000\000\200Cu\202\007\014\204\000\000\200\000\000\200\000\000\200\000\000\200NuiDunYaoAi\202Bao\000\000\200Po\202\000\000\200ShiFan\000\000\200Ju\202Pi\202\000\000\200WeiKu\202QieGan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\202\205Sui\005\005\204JiaYa\202\000\000\200\303\014\204\000\000\200KanNie\000\000\200\003g\204\000\000\200Xi\202\000\000\200LinDuo\000\000\200z\355\204\000\000\200\003=\204\000\000\200\000\000\200\000\000\200Pui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shi\000\000\200DouDui\000\000\200{\240\205Yu\202Lu\202En\202Ci\202\000\000\200Gu\202\000\000\200WeiChez\362\204Bie\000\000\200\000\000\200HanTuiNa\202Qi\202\000\000\200Tou\007:\204\305`\204\000\000\200Wu\202Gao\000\000\200\000\000\200\007\243\204\000\000\200Yi\202\010*\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204JinGuiYa\202Sui\007\023\204\000\000\200\004\334\204"; -static const char b21e[727] = "\361\000\000\200\000\000\200Tu\202z\374\204\000\000\200\000\000\200\000\000\200DeoZe\202Li\202\000\000\200\000\000\200Zhu\000\000\200JieVoi\000\000\200Ti\202\000\000\200\000\000\200Xie{}\205\000\000\200Ya\202Ju\202\000\000\200\000\000\200YinZhi\000\000\200KanZi\202\000\000\200Ke\202\000\000\200Niez\350\205WanZe\202\000\000\200Ju\202\000\000\200Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ya\202\000\000\200\000\000\200Lin\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200\000\000\200\000\000\200\000\000\200Qi\202\000\000\200\360\350\204Sui\000\000\200Qi\202Gui\000\000\200\000\000\200\000\000\200\000\000\200\302\250\205)\325\204\302\022\204\302\250\205QinE\000\201\000\000\200Zuo\000\000\200\000\000\200Ze\202Qi\202Ji\202\000\000\200TuoDie\000\000\200HuiMao\000\000\200Xu\202\000\000\200\000\000\200HouYanz\374\205\006&\204Hu\202\000\000\200\000\000\200An\202\000\000\200\002\354\204\000\000\200\000\000\200\000\000\200\000\000\200{\214\205\000\000\200\000\000\200\000\000\200Duo\000\000\200Lei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhuDieYouQi\202ShiXunYouKan\006\214\204\000\000\200\000\000\200z\350\205Pen\000\000\200\000\000\200\301\357\204\000\000\200\004\377\204\000\000\200\000\000\200\007\234\204\302\200\205DinShaWai\000\000\200\000\000\200Tao\000\000\200\005\335\204Pi\202Yao\000\000\200\000\000\200\000\000\200\000\000\200Tu\202\005\020\204\000\000\200XiaQi\202\000\000\200{}\205\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{Z\204\000\000\200\000\000\200\000\000\200Zhu\000\000\200Xi\202\000\000\200\006Z\204\362?\205\000\000\200Voi\010\314\204SuiVonz\367\204Ke\202Kuo\007\014\204\000\000\200\000\000\200\010I\204Bi\202Mo\202ZhuHanYu\202Yi\202Ma\202\000\000\200\000\000\200Qi\202GunMan\006z\204LinZu\202LeiHu\202\305X\206Qi\202Lei"; -static const char b21f[769] = "\377\000\000\200Chi\000\000\200Po\202Die\000\000\200\000\000\200Mom)\341\204\000\000\200Lei\000\000\200\000\000\200\000\000\200Yi\202\011\000\204\000\000\200\000\000\200\000\000\200\3607\204\000\000\200\303\254\204DunGaoHu\202\000\000\200\3621\204Ga\202\006\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\371\260\204\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Votw\270\204\000\000\200Dui\010I\204Yin\005\271\204Ku\202\000\000\200ZuiGu\202\000\000\200\000\000\200YunZhi\000\000\200\000\000\200Ji\202{x\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xiez\374\204\000\000\200\000\000\200\000\000\200ZuiAn\202Hao\000\000\200\000\000\200Po\202\000\000\200Di\202Ye\202\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200FaiNon\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jie\006l\204Lan\010:\204\000\000\200Bi\202\000\000\200\000\000\200\000\000\200\000\000\200{\221\204Qi\202\000\000\200Lom\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200Lu\202\000\000\200{\202\205\000\000\200Mo\202\000\000\200LeiPao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\007\177\204\000\000\200\010\220\204Lei\000\000\200\000\000\200E\000\201\000\000\200\005\005\204Jue\000\000\200HeiHei\000\000\200Zam\000\000\200\000\000\200\000\000\200\003P\204Nie\000\000\200Hai\000\000\200\000\000\200DoiDocLomz\374\204\000\000\200{\240\204Mi\202Nie\000\000\200\000\000\200\006\227\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010:\204\007\023\204\010\243\204Yi\202\000\000\200\000\000\200\000\000\200z\367\205\000\000\200\010:\204\302\200\205\000\000\200\000\000\200\000\000\200LeiNuoLi\202\000\000\200\000\000\200Li\202Luo\000\000\200\000\000\200\000\000\200\005!\204\000\000\200\000\000\200NieNie\000\000\200Ji\202\000\000\200Lei\000\000\200\006\220\204\000\000\200\000\000\200Lin\005\357\204\000\000\200\000\000\200z\374\204Yu\202\000\000\200Zai\301\357\204Lie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202z\362\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nao\000\000\200Xun\000\000\200Ju\202Huo"; -static const char b220[760] = "\374\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202Se\202\003\002\204\003]\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shi\0050\204WanYe\202Jiu\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200\000\000\200\000\000\200=\350\204Sua\3034\204\010\230\204\000\000\200Er\202\006l\204Lonv\200\204Sam\000\000\200\000\000\200To\202Lon\000\000\200\000\000\200Han\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200Fu\202\004\334\204Ji\202\000\000\200\000\000\200\236\353\204\000\000\200\000\000\200\000\000\200\236\353\204Xuc\302\267\205\000\000\200Va\202\000\000\200\006l\204\000\000\200w\274\204Qi\202Shi\000\000\200\005,\204Peiz\374\204San\000\000\200\000\000\200\000\000\200\000\000\200z\355\205Yue\000\000\200\003=\204\000\000\200Wu\202\000\000\200Fen\000\000\200\000\000\200z\355\204\000\000\200NeiJue\000\000\200\002\376\204\000\000\200z\350\204\000\000\200\000\000\200Ao\202\000\000\200\000\000\200\000\000\200\000\000\200\305`\204\362?\205\360<\205z\362\205\000\000\200Bu\202ZhuBi\202\010I\204{Z\205Fu\202Kou\000\000\200Zuo\003P\204\000\000\200Fu\202\000\000\200\000\000\200\000\000\200Yao\000\000\200DayBo\202Du\202BeiXieShiYi\202\000\000\200\005\335\204Cui\000\000\200Yi\202\372\230\205\000\000\200\005\304\204\000\000\200VuaChi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Po\202\000\000\200\000\000\200\000\000\200Yin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302!\205\007:\204\000\000\200\000\000\200\000\000\200\000\000\200z\343\205\000\000\200\000\000\200Maoz\350\204\000\000\200Yi\202\000\000\200\000\000\200\000\000\200Wu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lei\003\031\204BitVua\000\000\200\000\000\200BeiHuo\006&\204\006\237\204\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200Hanz\350\204\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Se\202\000\000\200\000\000\200z\350\204Guo\000\000\200\000\000\200Gun\000\000\200\000\000\200{\240\204\362?\205\003+\204GuiShiMouE\000\201Ba\202La\202\000\000\200\000\000\200\000\000\200\003c\204\000\000\200Ji\202\000\000\200Mei"; -static const char b221[748] = "\370Zao\000\000\200Chow\300\204ZhaYi\202\000\000\200Gou\000\000\200\000\000\200Gui\004\377\204\007\261\204He\202\006l\204Mo\202\006\205\204\000\000\200\000\000\200Wu\202Dai\000\000\200\000\000\200z\343\205\000\000\200\000\000\200\000\000\200\000\000\200HanBau\000\000\200\3628\204KouLi\202ZhiHuiZan\000\000\200\005,\204Cu\202\000\000\200DaiLau\000\000\200\000\000\200\000\000\200\000\000\200Man\000\000\200Zhi\000\000\200Kua\000\000\200z\374\205Hua\006z\204Cui\006\214\204\003\002\204\000\000\200Xu\202Er\202\000\000\200TuoTanZhi\000\000\200\000\000\200Vaiv\330\204\033\257\204\000\000\200NaoMaoDi\202\007\177\204\000\000\200\000\000\200\003\002\204{\207\204\000\000\200ShaDan\000\000\200\000\000\200Sui{\207\204Guo\000\000\200\000\000\200\003t\204\005\275\204Ci\202\3607\204Lu\202Ni\202YanLan\000\000\200\000\000\200GaiChu\000\000\200Men\000\000\200Bi\202Zu\202Huiz\355\204Laiz\374\204FenHe\202\000\000\200\000\000\200Lim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yao{\221\204\000\000\200Nei\000\000\200Luo\000\000\200\007:\204Rem\010\026\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ren\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\274\205\000\000\200\000\000\200Nen\000\000\200\000\000\200\000\000\200Ge\202\000\000\200{\240\204\0102\204LaiNin\000\000\200Bie\000\000\200Nam{\240\204MayMay\002\354\204Mayw\304\204\000\000\200Nen\000\000\200Mi\202Hu\202\000\000\200\000\000\200\000\000\200\005,\204\000\000\200YouYao\005\005\204\000\000\200{x\204Ji\202\000\000\200Yao\000\000\200\000\000\200\000\000\200Si\202|\031\205Si\202\000\000\200\000\000\200\000\000\200{\012\204YanDoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Chi\000\000\200ShaYanYi\202Yi\202Che\000\000\200\000\000\200Hanz\362\205\000\000\200\302\301\205Sen\000\000\200\3055\204SuiRenTanZhi\000\000\200Fan\003\014\204\000\000\200\000\000\200\000\000\200\000\000\200TanHe\202Mi\202Pi\202Bu\202Na\202|\015\204Ba\202Yi\202"; -static const char b222[769] = "\377\000\000\200\000\000\200Yan\000\000\200\007\036\204\000\000\200Yao\371\260\204Ke\202\3628\204\000\000\200\003P\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200You\000\000\200Bai\005\020\204\000\000\200w\310\204XiaLu\202Kun\006a\204Qiu\000\000\200\000\000\200Cu\202ZuiLou\000\000\200Xia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\371\260\204\000\000\200LoiPu\202\000\000\200\0050\204z\350\205Yi\202\000\000\200NieDui\000\000\200JieSui{\221\204Cou\000\000\200\000\000\200\005\005\204{\012\204She\000\000\200JinDi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200Nai\000\000\200Nou\000\000\200Ji\202Yan\000\000\200Nou\000\000\200Du\202Wei\003I\204\000\000\200\000\000\200\000\000\200Hu\202\000\000\200JiaYe\202JunLanLa\202Yin\000\000\200\000\000\200\000\000\200Tui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200\000\000\200\000\000\200Zu\202\000\000\200\000\000\200KhoU\000\201Ma\202Si\202Zhi\000\000\200\000\000\200Hui\003p\204\000\000\200Hui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Chu\000\000\200Che\000\000\200VuaXiuLan\000\000\200\006&\204\371\260\204Mo\202Yi\202YaoXi\202Zui\002\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202\000\000\200Lu\202\000\000\200Vom\000\000\200\000\000\200TuiWei\000\000\200Fen\371\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006z\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ShuDan\007q\204Yu\202XinYaoSu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Huo\000\000\200z\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ma\202\000\000\200\000\000\200Kai\000\000\200\000\000\200DayLu\202\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\364\204\000\000\200z\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Day\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200YinXi\202\000\000\200\000\000\200\005(\204"; -static const char b223[769] = "\377Xie\000\000\200\000\000\200\000\000\200Qu\202\000\000\200\000\000\200\000\000\200Li\202\000\000\200\006N\204\000\000\200\006N\204z\350\204\302\306\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\006\337\204\000\000\200\000\000\200\000\000\200\000\000\200z\355\204\000\000\200\005P\204\000\000\200\000\000\200\000\000\200\000\000\200{\310\205\000\000\200\000\000\200\000\000\200w\314\204{Z\205\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YinKui\000\000\200\000\000\200\000\000\200Qu\202\000\000\200Fu\202\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200Qi\202Ji\202\007:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gao\007q\204\000\000\200Qi\202\000\000\200Gai\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200{\240\204\000\000\200Si\202\000\000\200\000\000\200Yi\202z\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200Li\202\000\000\200\000\000\200\006a\204Yi\202\000\000\200CaiYi\202Ge\202\000\000\200Die\000\000\200ZhiYi\202\000\000\200ZaiDai\000\000\200Su\202\000\000\2002\000\201\000\000\200\000\000\200\000\000\200Jie{x\204Qu\202\000\000\200Hanz\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204Jie\000\000\200\000\000\200\000\000\200\007q\204\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002\354\204Hu\202\000\000\200\000\000\200\000\000\200Jue\000\000\200Yu\202\000\000\200Kap\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202z\350\205\3055\204Ku\202\000\000\200{Z\204\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\371\260\204\000\000\200\305`\204Ban\257\320\204\000\000\200\000\000\200\3628\204\000\000\200Yi\202\000\000\200\360\350\204\000\000\200\000\000\200Tuo\003c\204Ji\202\000\000\200\302\313\205Ten\006&\204\006&\204Xun\000\000\200\371\260\204\003P\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Liu\007:\204Hu\202{Z\205\000\000\200\000\000\200\006\260\204\000\000\200\000\000\200\000\000\200Jue\000\000\200\000\000\200Bat\000\000\200\000\000\200\000\000\200\000\000\200Von"; -static const char b224[769] = "\377\000\000\200\000\000\200Zhi\003I\204\007:\204\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\003\247\204\000\000\200\000\000\200\000\000\200\372\230\205\000\000\200z\374\204\000\000\200\005\005\204\000\000\200\006&\204\000\000\200Mo\202\000\000\200\000\000\200\000\000\200Guo\000\000\200\000\000\200\000\000\200{x\205\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202,a\204\000\000\200z\350\205\000\000\200\003c\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200FanBie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bo\202\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003x\204\301\357\204JiuYao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200Zao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200Wu\202Tuo\000\000\200Hu\202\000\000\200\000\000\200Wui\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200Fei\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204\000\000\200\000\000\200{_\204\000\000\200\010\002\204\000\000\200FeiBay\000\000\200Cuo{\214\205Fu\202\000\000\200Chu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DiuLan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003t\204Yu\202SuiXi\202\000\000\200\000\000\200\000\000\200\000\000\200Pou\000\000\200{_\204\000\000\200\000\000\200Ji\202\000\000\200\003\002\204\000\000\200Yi\202\003\226\204\000\000\200WanJi\202\000\000\200WanTui\000\000\200\007V\204\000\000\200AngLiu|\015\204Chi\000\000\200\000\000\200\000\000\200Ran\000\000\200Sa\202YinPi\202Ci\202\3628\204Yin\000\000\200\000\000\200Ge\202\007\036\204{Z\205\003c\204\000\000\200Yi\202Kua\007\023\204\000\000\200\000\000\200\000\000\200Di\202\000\000\200\000\000\200\000\000\200\000\000\200Xie\236\353\204\3621\204{\012\205Tuo\003\014\204Wu\202\000\000\200\000\000\200Xiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200You"; -static const char b225[769] = "\377\000\000\200\005\357\204Yan\000\000\200\000\000\200\004\352\204Qi\202TaoHan\000\000\200Chi\007\023\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\010X\204Han\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\272\204\000\000\200\000\000\200\000\000\200RouQi\202KaiYu\202Cha{x\205Yu\202\000\000\200\002\354\204\000\000\200\006&\204Zhu\000\000\200Yu\202\000\000\200\000\000\200\000\000\200MeiJueLiuSaoYu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\276\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007:\204\000\000\200\000\000\200{\221\205\000\000\200\005\335\204{\276\205\000\000\200Chu{\221\205Sanz\374\204\000\000\200Cui\006\205\204Di\202\000\000\200\000\000\200\000\000\200ZhiAo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xiu\000\000\200\003I\204\000\000\200\003\002\204{\202\204Sa\202z\374\204Zha\3607\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202San\000\000\200Hui{_\204\000\000\200\000\000\200\000\000\200\000\000\200v\034\204\000\000\200\000\000\200\000\000\200z\367\205Yi\202XieZhi\007\036\204\000\000\200\0102\204z\374\204\000\000\200\004\272\204z\374\204Su\202\000\000\200\007A\204\000\000\200\000\000\200\000\000\200SauSau\007\023\204\000\000\200\000\000\200\000\000\200Hei\000\000\200z\374\204\000\000\200You\000\000\200Yu\202\000\000\200\000\000\200Tai\000\000\200Jue\006\220\204\000\000\200\3607\204\000\000\200Yi\202Bi\202\000\000\200At\202Gei\000\000\200Nai\000\000\200Xu\202Yi\202Ru\202\000\000\200\003=\204\000\000\200\000\000\200Yi\202\000\000\200\000\000\200Zhi\007V\204ZhiXin\000\000\200Ji\202\000\000\200Xia\000\000\200\303\134\204\000\000\200\002\376\204Ne\202Xie\000\000\200\000\000\200\000\000\200Yi\202\000\000\200Sam\000\000\200\000\000\200Yu\202\000\000\200\000\000\200v\024\204\000\000\200\000\000\200\000\000\200-\035\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200She\000\000\200\007:\204Fan\000\000\200Fu\202Wu\202Xi\202\005\335\204\000\000\200\302\224\205SauJi\202z\355\205\000\000\200Lo\202Te\202\360x\206Mo\202"; -static const char b226[742] = "\366Pei\000\000\200\000\000\200Mu\202QiuMao\000\000\200Da\202\000\000\200Xia\371\260\204Te\202\005\335\204Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200CikSi\202Ni\202\000\000\200\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\253\204\000\000\200\000\000\200\000\000\200\007H\204Sa\202w\270\204Rap\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\205ChaMi\202\000\000\200\000\000\200Yi\202\000\000\200Suo\000\000\200Wu\202\003P\204\000\000\200\000\000\200Xi\202\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NaoMaiHiuWeiLay\302\320\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\204\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010v\204RuiDoi\301\225\204E\000\201TimKan\000\000\200\000\000\200\003\031\204Lu\202\372\230\206\000\000\200De\202\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\003g\204Mui\007\277\204Jinz\374\204Ji\202Cuo\000\000\200LaoFenJu\202\000\000\200\000\000\200\000\000\200\000\000\200\005\014\204Xia\000\000\200\000\000\200\000\000\200\000\000\200Su\202\000\000\200\000\000\200\000\000\200\000\000\200Ti\202\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200Hu\202Kou\000\000\200SuoNi\202\000\000\200\000\000\200\000\000\200CayXonDanDai\302\224\204\302\313\204\003\031\204\302\325\205\005\326\204Zhuw\324\204Men\000\000\200\000\000\200\000\000\200Da\202\000\000\200QiuYa\202\000\000\200z\374\204\000\000\200\000\000\200Nei\000\000\200\000\000\200\000\000\200ZhiBie\000\000\200\000\000\200\000\000\200z\367\205Lan\004\352\204Qunz\374\205\000\000\200\3621\204WanRu\202\305`\204Ni\202\000\000\200BaiYa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Si\202Yin\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202Huo\000\000\200\000\000\200\000\000\200\000\000\200\006\351\204\006a\204Ngo"; -static const char b227[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\026\204\000\000\200\000\000\200\217s\204\000\000\200Zi\202\000\000\200\000\000\200\006l\204\000\000\200\000\000\200\000\000\200JanHo\202Sucw\330\204\003=\204\011\026\204\302\332\205Be\202Xi\202\000\000\200Jiu\000\000\200\000\000\200Xiez\350\204Nuo\003g\204DuoJi\202Wu\202Mu\202YanQi\202Na\202ChiHou\000\000\200Sao\000\000\200Nao\000\000\200\000\000\200{x\205{x\205Kui\000\000\200JiaTu\202\005\335\204Du\202\000\000\200\000\000\200Xia\362?\205Huoz\367\205Da\202\000\000\200\000\000\200MaoYao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007q\204\000\000\200\000\000\200\000\000\200\000\000\200NetVuiRayw\334\204\026B\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shi\000\000\200\000\000\200Yin\000\000\200\000\000\200\000\000\200Gu\202Wu\202Fit\000\000\200\000\000\200GuoTi\202\000\000\200\005\335\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010X\204\302\363\204\005\335\204CauEo\202\303\014\204Re\202\000\000\200Yi\202\000\000\200Tun\000\000\200\000\000\200\000\000\200{}\205Hai\000\000\200Qi\202\000\000\200\000\000\200HuoTi\202Pi\202\000\000\200\000\000\200\007\277\204\000\000\200Xie\000\000\200Mi\202GaoTa\202z\374\205\000\000\200Shu\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\372\230\205Liu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JanFit\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200You\000\000\200Ai\202\000\000\200\000\000\200{x\205Dui\000\000\200LikDuaSet{\252\204HenNanTe\202vH\204NepTomNet\255\221\204\305F\204v \204w\340\204\000\000\200\000\000\200\301\225\205Dat\000\000\200\000\000\200Li\202\360\350\204Li\202\000\000\200\000\000\200Lu\202Mu\202SuiAi\202\000\000\200\000\000\200Kou\000\000\200ZheAi\202\005\326\204\000\000\200Lu\202TuiBi\202\000\000\200\000\000\200\000\000\200\302\337\205\000\000\200\000\000\200\006\205\204\000\000\200Huiz\362\204"; -static const char b228[769] = "\377\000\000\200\000\000\200\000\000\200\007\277\204\007&\204\302g\205\360~\206Ho\202Ban\010\325\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ngo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kuo\000\000\200Xin\000\000\200\000\000\200\000\000\200Sao\000\000\200\302\313\204DanGanHonMamManMo\202\302\344\205ShuQueBa\202Tui\005\230\204\000\000\200\000\000\200Fu\202Bie\000\000\200\005!\204\000\000\200z\374\205\000\000\200Si\202Bo\202\000\000\200Mai\010\220\204\000\000\200GuiHeiXi\202\010\220\204Yi\202\000\000\200Bi\202\000\000\200Gu\202CuiSe\202\000\000\200\000\000\200\000\000\200Ge\202Yu\202Na\202\000\000\200Li\202Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MauCi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002\376\204Kok\000\000\200\000\000\200Ji\202\005\253\204\000\000\200\000\000\200\000\000\200z\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\225\204\000\000\200SonJie\000\000\200\302\351\205\302\356\205w(\204TuiHanNucDoi\302v\205z\355\205Zhe\000\000\200\000\000\200\000\000\200\000\000\200Su\202\003]\204\000\000\200\000\000\200Qi\202\004\334\204\000\000\200\000\000\200Kai\000\000\200Ye\202\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GomJyu\000\000\200\301\340\205\000\000\200\000\000\200Dep\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{s\205\011\026\204\000\000\200\000\000\200\301\232\204\000\000\200\000\000\200wD\204\003\226\204\302\022\204TuiQuow\344\204\302l\205HamNaoYi\202\004\320\204\000\000\200\000\000\200\000\000\200\007\265\204Ai\202Pin\000\000\200\000\000\200Lie\003+\204Ai\202\000\000\200Mo\202Wei\004\377\204Ni\202\000\000\200\000\000\200\000\000\200Bo\202\000\000\200Liu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\325\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Rui\000\000\200Chu\000\000\200DikNgo\005\204\204\000\000\200Lu\202Cha\000\000\200\000\000\200Chu"; -static const char b229[763] = "\375\000\000\200SaoLi\202\000\000\200\007\023\204\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200YanCuo\000\000\200Liu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\205\204\000\000\200{\221\204Bo\202\255_\205\305F\204Honz\355\204LenDoiw\350\204Ten\372\230\206\000\000\200\004\256\204\005\014\204\000\000\200Li\202\000\000\200Ju\202\000\000\200\000\000\200\000\000\200XieXie\003\031\204\003\031\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Goe\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\326\204Zhu\000\000\200Cam\005\275\204z\355\204Lo\202\302v\205\000\000\200z\355\204z\374\204\000\000\200\000\000\200\004\377\204Pei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\274\204\000\000\200Xie\000\000\200\003\002\204\000\000\200\000\000\200\000\000\200z\367\205\000\000\200\007&\204\000\000\200\303\014\204\301\345\204\000\000\200\000\000\200\000\000\200\251|\204\000\000\200\000\000\200NanWan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202\000\000\200\000\000\200\302\351\205\006\227\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tun\000\000\200\000\000\200\004#\204\000\000\200w\354\204\000\000\200Tho\005\335\204\000\000\200\000\000\200Man\000\000\200Jin\000\000\200Qu\202DouQiuZai\000\000\200\371\260\205ZaiNgo\000\000\200Yi\202\000\000\200\000\000\2003\000\201\000\000\200Hua\000\000\200\000\000\200\000\000\200\000\000\200Kan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YueNi\202Si\202\000\000\200Wo\202\000\000\200\000\000\200\000\000\200Can\000\000\200{\240\204\000\000\200Mie\360\366\204\000\000\200\006N\204Gan\000\000\200\000\000\200\000\000\200\000\000\200z\350\205\000\000\200Shu\004\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ShiZinTi\202\000\000\200\000\000\200\000\000\200\000\000\200Zha{\221\204\000\000\200\000\000\200Nen\000\000\200TitFenMie\000\000\200Ze\202\000\000\200\000\000\200\000\000\200Zhiz\350\204HanGe\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200Guo\003\002\204Ta\202\003]\204Ao\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zha\000\000\200Xi\202"; -static const char b22a[769] = "\377\000\000\200Xu\202Wu\202Mac\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JueJi\202\000\000\200Chi\000\000\200Wan\000\000\200MieZei\000\000\200\000\000\200\000\000\200\000\000\200JieShi\000\000\200Xi\202\000\000\200E\000\201\000\000\200\000\000\200\000\000\200Hu\202Hu\202\000\000\200Li\202\000\000\200\000\000\200Chu\000\000\200\000\000\200Yi\202MaoXu\202\362?\205\000\000\200Yi\202\000\000\200Ngo\000\000\200\000\000\200\000\000\200\000\000\200\006z\204\000\000\200\000\000\200\000\000\200\000\000\200{\240\204{\240\204Ju\202\000\000\200\000\000\200Zhu\000\000\200\000\000\200\000\000\200Wu\202\006&\204\301\357\205\000\000\200\000\000\200\000\000\200\000\000\200Ke\202Ke\202Li\202Bi\202Ge\202\000\000\200Xu\202Sha\005\357\204Ke\202\000\000\200\000\000\200\006&\204Ho\202\000\000\200Bo\202\303\362\204\372\266\205Qi\202{_\204\302\363\205\302\236\204\000\000\200Ji\202Hat\006\214\204\000\000\200w\360\204\000\000\200\000\000\200\360~\205Yi\202Jue{\221\205\000\000\200Xin\000\000\200\000\000\200\000\000\200\000\000\200TuoHaiXia\000\000\200TuoYi\202Day)\341\204Se\202\302\022\204\000\000\200\000\000\200Cu\202\000\000\200\000\000\200\000\000\200{\240\205Nan\000\000\200\000\000\200\006\260\204\000\000\200JieXueHu\202\000\000\200\000\000\200\000\000\200\003\217\204\000\000\200\000\000\200\000\000\200Vuc\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YouNu\202Ye\202\000\000\200\000\000\200Yin\000\000\200\006\237\204w,\204Mocv0\204vd\204Vat\006\220\204Vap\000\000\200\000\000\200\3621\204z\374\205\000\000\200\000\000\200\000\000\200\000\000\200Nao\000\000\200{\221\205\000\000\200\000\000\200\000\000\200\000\000\200Keow\364\204w\370\204Vun\000\000\200Go\202\000\000\200\005\322\204\000\000\200Tha\000\000\200\000\000\200KamJie\302\344\205\000\000\200Nu\202{_\204\010\002\204w\374\204\302\370\205LouDayXao\302\375\205v$\204w\270\204x\000\204SayOan\004\256\204JiaBac\000\000\200\000\000\200x\004\204\003c\204\006N\204\000\000\200\000\000\200Lu\202Sa\202Nu\202WunBo\202Zhe\000\000\200Qin\000\000\200Ci\202Zu\202\000\000\200Wo\202Wu\202\000\000\200\000\000\200Nie\000\000\200\000\000\200\000\000\200z\374\204"; -static const char b22b[766] = "\376\005\335\204\000\000\200\004#\204\000\000\200\037\243\204Tem\000\000\200Giu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JipWun\000\000\200Muc\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\257\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DiuTay\360\204\206\302\313\205LayNemNhu\303\002\205\000\000\200\005P\204JinDoiVot\000\000\200\000\000\200JieHe\202Tu\202ZhePinJinNan\000\000\200Cay\000\000\200\000\000\200Dun\000\000\200Xi\202Xie\000\000\200Xi\202Lao\0070\204Ji\202Cha\004\320\204\000\000\200\006\025\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\205Dao\000\000\200\302\262\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\230\204\000\000\200\000\000\200\000\000\200\000\000\200Xac\302:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\362\204\3621\204Xin\000\000\200\000\000\200Hak\302\200\204Ganx\010\204Cayx\014\204TroDanVoiv\200\204\302\325\205NhoVayVomTuaLanDuiXoiDiu\305F\204\302\363\205x\020\204So\202Yu\202z\374\204Li\202z\350\204\000\000\200\000\000\200Mei\000\000\200\006\214\204Ya\202\000\000\200Qia{}\205\000\000\200\006l\204{Z\205Luk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ze\202\372\266\205\000\000\200\000\000\200Sao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Co\202RonNho)\365\204Co\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200x\000\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200XieDikFu\202\005(\204\000\000\200\303\007\205Be\202Co\202v\234\204BopVa\202v\330\204\006\227\204x\024\204x\000\204HuoCheNhoSapx\030\204VenVo\202DutVa\202RocSua\000\000\200\303\014\205\302\200\204LayXo\202NiuZe\202\000\000\200\0070\204\000\000\200\005\262\204Yu\202\000\000\200Lu\202SauWanXue\003\002\204YueZhiWei\000\000\200Ge\202Ju\202\000\000\200YanCuoMao"; -static const char b22c[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202Ai\202\000\000\200\000\000\200\003P\204\000\000\200\006\025\204An\202\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pi\202Zhi\000\000\200\000\000\200Nuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Day\007\307\204Jau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Eo\202\000\000\200\000\000\200\000\000\200\000\000\200Wo\202\000\000\200Phu\000\000\200\000\000\200Gap\004\371\204Pan\000\000\200Yi\202\000\000\200\000\000\200Jie\000\000\200Zi\202\000\000\200JiaWai\000\000\200\000\000\200Jia\000\000\200Boi\026B\204x\034\204WaaMe\202RayBonDapMo\202Go\202\303\014\204Cai\303\021\205XoiDayw\210\204Dotz\355\204\000\000\200SuoSuoJi\202\007\023\204\000\000\200Ti\202Pi\202Po\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mi\202Lam\000\000\200\000\000\200\000\000\200\000\000\200Ye\202\000\000\200QinJin\000\000\200\000\000\200Jue\000\000\200\000\000\200\007:\204\005\253\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ban\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tou\000\000\200Run\000\000\200TiaDom\000\000\200Ro\202w\270\204Cau\305F\204XucGayHaiKapMaiMo\202Thox \204Sai\302\332\205BinCau\003\031\204\000\000\200WeiZaoQieSouLu\202\000\000\200\000\000\200\000\000\200Die{\252\205Bi\202ZhuMa\202FeiPieYin\003P\204\000\000\200Ao\202\004\334\204Zu\202\004\324\204\000\000\200Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\230\204\000\000\200Ti\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\036\204{\240\204\000\000\200w\214\204\000\000\200Dom\3628\204\302\236\205\000\000\200\000\000\200\000\000\200\000\000\200Dao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\212\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duo\004\352\204"; -static const char b22d[769] = "\377\000\000\200\000\000\200\303\362\204\000\000\200\000\000\200\000\000\200\000\000\200Zap\010\204\204Dua)\341\204z\367\205VanDan\303\026\205w,\204DayDut{\245\205Mopx$\204\006\373\204wH\204DamXayLayNucGayXau\302\200\204\3025\205\000\000\200Zhi\000\000\200Fen\000\000\200\000\000\200\000\000\200\007\014\204Zhi\005(\204Bi\202{\202\204\000\000\200BanJueQu\202\000\000\200Qi\202LeiXie\005!\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sou\000\000\200Bei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cou\000\000\200\000\000\200\360\350\204{\240\204Bam\000\000\200Dua\005\322\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\245\205\302X\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zao\000\000\200\011\000\204VaoDoix\020\204NenDonRoix\014\204MayGopx(\204\303\014\205Sumx\000\204QuoDonCatXapMoi\305F\204{\252\204VotRo\202\000\000\200\000\000\200|\024\205\000\000\200VanFan\000\000\200She\000\000\200{}\205\000\000\200Po\202\000\000\200TieShaZa\202\000\000\200\000\000\200Niu\003\025\204\007\230\204Cui\000\000\200Zin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\351\205\000\000\200\000\000\200Cuiw8\204\006\214\204z\367\205DieLoe\360\212\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200x\000\204\000\000\200\000\000\200\000\000\200\301\376\204\000\000\200\000\000\200\000\000\200PinCi\202\000\000\200\006l\204Co\202BumMamDom\037\243\204\006\227\204Am\202v\350\204DonGiuNemXanNiux,\204Tro{x\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yinx0\204Vuc\000\000\200z\374\204\000\000\200\000\000\200Yi\202\005\014\204\0070\204\003c\204\000\000\200\006\237\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\205Do\202Ban\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\322\204Xo\202\301\307\205Ru\202\004\272\204\360\220\206x\000\204Vo\202Liu\000\000\200Zhiz\355\204Du\202\007:\204\000\000\200\000\000\200SuoJie"; -static const char b22e[769] = "\377Li\202\003=\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006l\204Zan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Guo\006z\204\371\260\204\010\344\204DeoLanDim\004\256\204Kem\360N\205Xia{x\204\003\025\204\000\000\200\007A\204Wei\000\000\200Tuo\000\000\200\000\000\200Su\202\000\000\200\003\031\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204Yan r\204x4\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\042\204\003\006\204\000\000\200\256\225\204GaiMacw\270\204w\020\204Xe\202\000\000\200v\350\204Xi\202\000\000\200Yu\202\000\000\200{Z\205Xie\005\020\204Fen\000\000\200Guo\000\000\200\0050\204Lanz\374\204\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KeoXauEp\202x8\204Xo\202Tum\302X\205Tomw\334\204\000\000\200\000\000\200Lei\000\000\200\000\000\200\000\000\200Jun\3621\204\000\000\200\000\000\200\000\000\200\000\000\200\005i\204\000\000\200\000\000\200\000\000\200Za\202w,\204QueLayMo\202x<\204\000\000\200\000\000\200{\012\204QieLuoYao\006\337\204Ta\202\000\000\200x@\204\000\000\200RapRap\000\000\200\000\000\200Luo\037\243\204DimBau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SonxD\204UonBa\202z\355\204\000\000\200\004\334\204\000\000\200\000\000\200\302\212\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\036\204\000\000\200\000\000\200\000\000\200Wan\005\357\204\000\000\200\000\000\200\301\376\204Yu\202Qi\202\000\000\200Qi\202\000\000\200v\350\204v\350\204\000\000\200Ji\202Bo\202\000\000\200ShiFu\202\000\000\200Gui\000\000\200\000\000\200\3607\204\000\000\200Hao\000\000\200Gai\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\205Hui\000\000\200\000\000\200XiaShiZhiQi\202\000\000\200Hai\000\000\200\000\000\200\003\002\204Li\202\000\000\200\006z\204\000\000\200\006\214\204\000\000\200\000\000\200\000\000\200Sa\202\000\000\200Qi\202Shi\000\000\200\000\000\200JieHok\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bei\303\362\204Ba\202JunPi\202\000\000\200\000\000\200Dan\000\000\200\000\000\200\005!\204"; -static const char b22f[760] = "\374KuiKu\202\000\000\200Kou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ShiShiJi\202Bao\000\000\200\000\000\200\000\000\200Ke\202{\202\205\000\000\200\000\000\200\000\000\200\000\000\200Min\000\000\200\000\000\200\006z\204E\000\201Ge\202\000\000\200\000\000\200\000\000\200\305`\204Duo\000\000\200\000\000\200QiaHua\000\000\200\005\335\204\000\000\200\000\000\200\006\260\204\000\000\200\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200Qu\202Zi\202\003c\204{\202\205\000\000\200Sha\000\000\200Ji\202WeiPu\202Xue\000\000\200\360\366\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\230\204Zhi\005P\204\000\000\200\000\000\200Da\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\350\204JinZhi\000\000\200Ve\202\004\334\204\000\000\200Za\202z\355\204\000\000\200\000\000\200\000\000\200\000\000\200Mao\000\000\200\000\000\200\000\000\200\006\237\204\003c\204Hu\202\006\260\204\000\000\200\000\000\200\000\000\200Jiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duk\000\000\200\000\000\200\000\000\200\301\321\204Min\000\000\200\000\000\200Va\202\000\000\200\3621\204\000\000\200Du\202Wei\000\000\200CanYu\202Du\202KaiPi\202\000\000\200\000\000\200{x\205\000\000\200\000\000\200\000\000\200\256\371\204\000\000\200\360\366\204Yan\005\271\204\000\000\200Yue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202{Z\205\000\000\200Ke\202Qi\202ZhiLu\202\000\000\200\000\000\200\000\000\200\000\000\200Pi\202NuoPao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fei\000\000\200\000\000\200\000\000\200\000\000\200Wen\000\000\200\000\000\200\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{_\204\000\000\200\000\000\200\000\000\200{s\205\000\000\200Duo\003t\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200You\000\000\200Man\000\000\200\006z\204\000\000\200\000\000\200Xie\006\337\204\006\214\204\005\262\204\000\000\200{x\205{x\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\321\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ce\202\000\000\200\000\000\200\000\000\200xH\204"; -static const char b230[766] = "\376Lei{\221\204Li\202{\207\204Qun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\204\000\000\200{x\205Gu\202\000\000\200\004#\204\004\320\204\305X\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lei\010\016\204Lu\202Va\202\000\000\200\000\000\200\000\000\200Fu\202\000\000\200Li\202\000\000\200San\000\000\200\000\000\200\000\000\200San\000\000\200\000\000\200\000\000\200Sa\202\000\000\200\000\000\200\000\000\200Nie\000\000\200\000\000\200\010k\204Li\202\000\000\200\000\000\200\000\000\200Shu\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\217\204\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200Mei\000\000\200Dao\000\000\200\000\000\200\000\000\200\000\000\200Shi\000\000\200Lon\000\000\200GanTan\000\000\200\000\000\200Li\202\000\000\200Man\000\000\200\000\000\200Li\202\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\000\000\200Pan\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200Jiu\000\000\200Guo\006z\204\000\000\200\004\352\204Wo\202QiaDou\000\000\200Lie\000\000\200\003\002\204\000\000\200Lie\000\000\200FuiDau\000\000\200\000\000\200\007\036\204\000\000\200GiaGuo\000\000\200\003\247\204\006\214\204\000\000\200Di\202YunGao\000\000\200\000\000\200Mun\000\000\200\000\000\200\000\000\200Le\202\000\000\200\000\000\200\000\000\200Si\202Xin\000\000\200\000\000\200\000\000\200\000\000\200Xinz\374\205Luo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\005\204\007\036\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200Dou\000\000\200\000\000\200\000\000\200\000\000\200\010\220\204\005P\204\372\230\205\000\000\200Kan\000\000\200\000\000\200\000\000\200Ou\202KanWo\202\000\000\200\000\000\200\000\000\200Zuk\000\000\200\000\000\200Xin\005\253\204\000\000\200\000\000\200\004\334\204\010\220\204\000\000\200\000\000\200\000\000\200Cui\000\000\200\000\000\200\000\000\200\004\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204z\355\204\000\000\200\005\335\204\000\000\200\000\000\200\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200VuaVua\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\204\206\303\033\205Yan\000\000\200{Z\204\000\000\200\000\000\200\000\000\200\000\000\200Goc\000\000\200\000\000\200NuoYan"; -static const char b231[751] = "\371\000\000\200\000\000\200\000\000\200Kei\000\000\200\003%\204\000\000\200\303\033\205HuiYanYu\202\000\000\200\000\000\200Ti\202Fu\202Ben\000\000\200YanO\000\201Hui\000\000\200\000\000\200\303\033\205\000\000\200\000\000\200z\362\205\000\000\200\000\000\200GuiYan\000\000\200Hu\202\003t\204\000\000\200\000\000\200\000\000\200\000\000\200\2561\205\000\000\200Sui\000\000\200\000\000\200\000\000\200\000\000\200\031\340\204\000\000\200Zi\202Ji\202E\000\201Ji\202Kui\000\000\200{\207\205\000\000\200\000\000\200\000\000\200Huo\000\000\200Wei\004\334\204\000\000\200\211e\204\000\000\200\005P\204\000\000\200\000\000\200\000\000\200ZaiYouNay\000\000\200\000\000\200\000\000\200Ren\000\000\200\000\000\200\000\000\200\003+\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kia\302\301\205\302\301\205Na\202\000\000\200\000\000\200Tu\202\000\000\200Dan\000\000\200Jue\000\000\200\000\000\200Xu\202Di\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\205\000\000\200\000\000\200\000\000\200\000\000\200TamLuc{s\205\000\000\200\000\000\200YouGua\000\000\200PuiXi\202\000\000\200\000\000\200\000\000\200\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202\000\000\200\000\000\200\000\000\200\000\000\200\003x\204\000\000\200w\300\204Lu\202\000\000\200Xu\202\000\000\200\003c\204z\374\204z\362\205ChaShiGanNuoAn\202\000\000\200\000\000\200\000\000\200Xie\000\000\200\000\000\200\000\000\200\000\000\200\007O\204\007O\204\000\000\200Hao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\205\004\272\204xL\204DonQin\007\277\204{_\204Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ze\202\000\000\200\000\000\200Bu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DanHiu{\334\204Bua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3607\204\371\260\204\000\000\200Zu\202\000\000\200\000\000\200xP\204w\234\204GioSaoKiaKiaBie\000\000\200\000\000\200\000\000\200\257\320\204ZheDai\000\000\200JiuWo\202{}\205\000\000\200\000\000\200\000\000\200Lin\000\000\200HunJi\202\000\000\200\000\000\200\000\000\200\007O\204\007\307\204Man"; -static const char b232[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cao\000\000\200\000\000\200\000\000\200\000\000\200Mu\202\000\000\200\000\000\200DieWeiSik\000\000\200\000\000\200Kiaw\300\204DemMai\010\344\204wD\204DemRayz\355\205v\330\204wD\204Cu\202\005\335\204\000\000\200\303\362\204Ti\202Tia\004\377\204\000\000\200Tu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JyuNau{\214\205MeiMinMiu\000\000\200\007\277\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ChiCouTi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ui\202xT\204\033h\204\303\026\205\000\000\200HuoQi\202Sao\010\230\204\003P\204AngNai\000\000\200\360\350\204ShuSha\000\000\200Gou\000\000\200\000\000\200\005P\204Mai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ya\202z\362\205\000\000\200\000\000\200\000\000\200Bin\000\000\200\000\000\200\000\000\200\2561\205xP\204v\364\204RuaHaoDe\202KiaGio\000\000\200\000\000\200Ai\202\000\000\200Ou\202Cao\000\000\200Ao\202\000\000\200Mao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GeiHouSe\202NoiMo\202)\341\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\205\204\000\000\200|\015\204\000\000\200Ngu\000\000\200\000\000\200\000\000\200\000\000\200\010\230\204Xu\202Kan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\230\204\000\000\200\000\000\200\000\000\200Luk\236\353\204Luk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bie\006&\204\000\000\200\000\000\200z\374\204\000\000\200\000\000\200\000\000\200Bay\302\356\205SaoToi\302\356\205\010\314\204Tun\000\000\200\360\226\206Doi\000\000\200Yu\202Dan\004\377\204\000\000\200\002\376\204\000\000\200Pu\202\000\000\200Dip\007\042\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200HomLatComRaoAi\202Mo\202Cai\011\026\204\0050\204Lan\000\000\200\000\000\200\000\000\200\000\000\200XomLat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bao\004\272\204Lie\007\335\204\000\000\200Bo\202{}\205\000\000\200\000\000\200Bi\202\000\000\200MitGioSomw\030\204\003]\204"; -static const char b233[769] = "\377HeixT\204xT\204\000\000\200\000\000\200Li\202xT\204\000\000\200\000\000\200\302\301\205HaaSomRuaNie\000\000\200De\202\000\000\200\000\000\200Doiz\362\204\302!\204\000\000\200\000\000\200Yue\000\000\200\000\000\200\256\371\204\302!\204Li\202\006\220\204{\221\205\005\357\204\256\371\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ce\202Xun\000\000\200\000\000\200\000\000\200Ju\202Hui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303 \205xX\204\006&\204\000\000\200\000\000\200VayXeo\000\000\200\000\000\200\000\000\200\3628\204\000\000\200x\134\204VayGocIn\202\000\000\200Veo\006\373\204Ju\202\000\000\200\000\000\200HetCui\000\000\200Oam\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303%\205Zao\006&\204\000\000\200\000\000\200\000\000\200Yu\202\000\000\200\000\000\200\000\000\200Ken\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\202\205FeiJi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yunz\350\204\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200{\207\205Po\202\000\000\200Pei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dem\000\000\200\000\000\200\303*\205\007\277\204Yi\202Luo\000\000\200\000\000\200\000\000\200Me\202\000\000\200\000\000\200\000\000\200\000\000\200Co\202\000\000\200{\202\204\000\000\200\003P\204{\327\204\000\000\200)\261\204\000\000\200\000\000\200\000\000\200Hu\202Ju\202\000\000\200\000\000\200\302\267\205Xun\000\000\200\000\000\200\302\356\205\303/\205\000\000\200\000\000\200\010\314\204\000\000\200\000\000\200Ye\202\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200Yue\005!\204PinDunBei\000\000\200Ot\202\006z\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003]\204\000\000\200x`\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JipZi\202\000\000\200Ya\202\000\000\200\000\000\200\003\002\204Hon\000\000\200Kun\000\000\200{Z\204Shu\000\000\200\000\000\200Shi\000\000\200\000\000\200\000\000\200YouPai\3621\204Ji\202\267\252\204\000\000\200\000\000\200\000\000\200Muk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jan\000\000\200Qi\202He\202\000\000\200Zoi\006\237\204\000\000\200\000\000\200\000\000\200Dakw(\204"; -static const char b234[769] = "\377Man\000\000\200Ye\202Chi\360\234\206xd\204wP\204\000\000\200\000\000\200\000\000\200KaoYue\000\000\200\000\000\200Wa\202{\327\204\000\000\200Ci\202\000\000\200Yi\202\000\000\200\006\311\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xop\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\350\204Li\202\000\000\200Daiz\367\205\000\000\200\000\000\200xh\204Su\202SayYi\202\000\000\200\000\000\200\000\000\200\000\000\200Han\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200z\367\205Hu\202|\024\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200xl\204\000\000\200Roi\000\000\200Diu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\267\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{}\205Duo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tou\000\000\200\000\000\200Puiv\364\204\302\313\204w\210\204Re\202Sim\3628\204z\374\204\3034\205Nen\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\3607\204Xi\202Xie{Z\204\006\214\204Tu\202\000\000\200\000\000\200\000\000\200\000\000\200Gwo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Vay\000\000\200\000\000\200\006\351\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200xp\204Sao\006&\204TauCai\000\000\200Han{\202\205Suo\000\000\200\002M\204\007\036\204\000\000\200v\374\204\000\000\200{Z\204Hon\000\000\200Nei\000\000\200z\350\204Yin\000\000\200{\207\205ShaZi\202Pi\202Gao\000\000\200\000\000\200JinYou\000\000\200{_\204\000\000\200Mi\202Ou\202\000\000\200Hu\202\000\000\200\000\000\200\000\000\200You\000\000\200\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jauxt\204\000\000\200\000\000\200\000\000\200Hei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou"; -static const char b235[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\000\000\200\371\260\204Qi\202z\374\204Pan\007\014\204\000\000\200DonCuiBapCanPhaXoixx\204Su\202\255_\205v\240\204Do\202\007\014\204Bo\202\000\000\200\372\266\205Pi\202\000\000\200ZaiZhuZi\202Souz\343\205Tok\000\000\200z\355\204Fan\3621\204YinHouMaoTu\202GanJi\202\000\000\200\000\000\200\000\000\200Yi\202\000\000\200Yu\202z\343\205Pao\000\000\200\3621\204\000\000\200Gou\000\000\200\000\000\200GouSunz\374\204\372\230\205\000\000\200Co\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hay\000\000\200Mau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gaa\000\000\200\000\000\200\000\000\200\000\000\200Noc\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\025\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\214\204Ti\202Yun\000\000\200\000\000\200{_\204Lie\000\000\200Zhi\000\000\200\000\000\200\000\000\200Pai\000\000\200\000\000\200\000\000\200\000\000\200\006\260\204x|\204x|\204\005\335\204MeiCa\202)\335\204WaiSe\202Bi\202Ghev\034\204xD\204w\374\204Ju\202Lai\000\000\200\000\000\200SoiZi\202\000\000\200Qu\202Gu\202JueZhiAngQinPi\202Zui\000\000\200z\350\204\000\000\200Cuo\000\000\200Ji\202Ti\202Ru\202\000\000\200HaiXun\000\000\200BeiZhi\000\000\200Dun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mun\010\220\204Me\202Kei\010v\204\010X\204\007\357\204z\355\204\305F\204{\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Le\202GanSyu\000\000\200\006\025\204Ta\202\000\000\200Tuo\360\350\204Ku\202ZhiVen\000\000\200SonTu\202"; -static const char b236[766] = "\376SauCa\202UoiCaywP\204\000\000\200Nep\000\000\200SonCumDo\202\000\000\200\302]\205\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200Bay\000\000\200\000\000\200{\240\204Ni\202\371\260\204\006l\204{\276\205Dou\000\000\200z\350\204HanQiaGan\000\000\200\000\000\200\256\371\204ChaBi\202Yi\202Fu\202E\000\201\000\000\200LaoHaoLi\202\000\000\200\000\000\200\000\000\200\000\000\200Te\202\371\260\204\000\000\200Yin\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200ChaKaiNauVai\000\000\200Zap\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Man\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NieCouCuk\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\005!\204\000\000\200\000\000\200\007q\204\000\000\200\000\000\200GoiTri\302:\204Be\202\007\023\204Mo\202SopLatv\200\204x|\204RuiChiGou\000\000\200\000\000\200JieZheHu\202\006\351\204SotConMamZouSi\202\000\000\200\000\000\200FeiZi\202Zi\202\000\000\200JieSi\202\000\000\200\256\371\204Pao\000\000\200\000\000\200\000\000\200Ye\202Di\202\000\000\200LeiXu\202Ru\202\000\000\200Pa\202\007q\204Xi\202Ye\202An\202\000\000\200Yi\202{\240\204Zuk\000\000\200\007\023\204Wo\202\000\000\200Se\202ZhiBi\202\372\230\205\000\000\200\000\000\200\000\000\200{\240\205Hao\000\000\200ChiDun\000\000\200\000\000\200GukvD\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\335\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bo\202Ji\202{\252\204\000\000\200Luo\000\000\200\000\000\200Rui\000\000\200\000\000\200\000\000\200\000\000\200{\271\205MayGu\202Va\202wH\204w\274\204Be\202Du\202\3039\205\255\322\204w(\204Tu\202Hu\202\000\000\200Du\202\010*\204Rao\000\000\200Dan\000\000\200\000\000\200HanQueSha{\221\204Ze\202\305X\205Qi\202Die\000\000\200ZhaTou"; -static const char b237[763] = "\375\000\000\200Ci\202Sa\202JauLuo\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dip\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hei\000\000\200LuoQin\000\000\200\000\000\200\000\000\200{}\205\007q\204\000\000\200\000\000\200\000\000\200Ai\202{\240\204\000\000\200\277\367\204LimSonDunv\374\204Do\202HeoOt\202Sauv4\204Ti\202WenNhu\000\000\200\006\214\204{\252\204JipCanPaiHun\000\000\200\000\000\200Ai\202\000\000\200\010\016\204{\207\204Dui\000\000\200Ta\202JinBi\202YanGao\007\335\204Yu\202She\000\000\200\000\000\200{\240\204\000\000\200Hu\202\000\000\200\000\000\200Lie\000\000\200\303\362\204Su\202\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\272\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003p\204\000\000\200\000\000\200\000\000\200\000\000\200Han\000\000\200\000\000\200\000\000\200\010\002\204w\244\204Khuw\254\204)\355\204\000\000\200Dun\000\000\200\000\000\200Son\000\000\200\000\000\200Thox\200\204\000\000\200Xie\006\205\204Fu\202Lu\202Tan\000\000\200\000\000\200Liuz\374\204\010\230\204\000\000\200\000\000\200Cou\372\230\206\000\000\200{x\204\000\000\200\000\000\200Ze\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Muc\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\207\204\000\000\200\000\000\200\000\000\200Li\202\000\000\200Sen\000\000\200\000\000\200\000\000\200\000\000\200xP\204{\303\205\010\220\204w\240\204\000\000\200\006\260\204TuoFun\005I\204Tuo\000\000\200\006z\204\3621\204\257\320\204\006\333\204\003\025\204z\350\204Li\202\000\000\200\000\000\200Pao\007\036\204LiuWu\202\000\000\200\000\000\200SanMo\202Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\377\204\000\000\200Zha\000\000\200\000\000\200DuiNoc\302:\204RanMa\202Mem\000\000\200Yu\202Kyoz\374\204\003P\204\372\266\205Xi\202\000\000\200\000\000\200MeiSen{\207\204\000\000\200JiuLao"; -static const char b238[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204Zou\000\000\200\010\344\204v\320\204x\204\204\000\000\200{\252\204{\252\204QueGau\000\000\200Liu\000\000\200\002\376\204\000\000\200Zhe\000\000\200Lei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200x\200\204\000\000\200\000\000\200\000\000\200\0070\204\000\000\200\000\000\200\302\313\204x\200\204Re\202Mem\000\000\200\000\000\200Do\202{\240\204\372\266\205ZuoQie\000\000\200LaoHa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202Yi\202Ni\202\000\000\200\000\000\200Cen\000\000\200\000\000\200\000\000\200\000\000\200x\200\204\000\000\200Yan\000\000\200\005\253\204\000\000\200w\274\204w\274\204\000\000\200\000\000\200VuiYanDie\003+\204\000\000\200\000\000\200\000\000\200Nen\000\000\200\000\000\200Lei\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BayNa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200\302\010\205Lei\000\000\200\000\000\200ShaHu\202\000\000\200\000\000\200Xi\202Xi\202\000\000\200YouHan\000\000\200Hai\000\000\200Wa\202Xu\202Pi\202TanXi\202Xi\202BinQinXi\202Yu\202Xi\202\000\000\200Ci\202z\350\204Xia\000\000\200\000\000\200Wa\202E\000\201You\003g\204Ni\202HanBi\202\371\260\205\000\000\200\000\000\200{\221\204\3607\204Yu\202\000\000\200Ou\202\000\000\200Gui\305`\204z\350\204Yi\202\000\000\200\000\000\200Zu\202\000\000\200z\350\204\003x\204\007\243\204\000\000\200ChuYi\202\000\000\200LoiHan{\202\204\000\000\200\000\000\200Fun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3607\204Xi\202Zi\202\005\357\204Zi\202\000\000\200Yu\202Hun\000\000\200Si\202Kan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200An\202\000\000\200YouJi\202HunQiaHouHou\000\000\200\3607\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xie\000\000\200\000\000\200\000\000\200SheSha\000\000\200\000\000\200\000\000\200XieYaoDa\202\000\000\200XieChiYouHe\202Sha\000\000\200\000\000\200\000\000\200\000\000\200Tai"; -static const char b239[769] = "\377\000\000\200Zhu\000\000\200Ai\202\000\000\200\000\000\200\000\000\200QueZe\202\000\000\200La\202Lou{\252\205\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ti\202\000\000\200Shi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HuoChiYi\202\000\000\200\000\000\200\000\000\200\000\000\200ShuYuez\355\204E\000\201Xi\202Xi\202\004\377\204Zu\202Za\202\000\000\200\000\000\200Za\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202Wan\000\000\200\000\000\200\000\000\200Xin\000\000\200\000\000\200\305`\204Fu\202\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200Yan\000\000\200Bi\202Ken{\012\204\000\000\200\000\000\200Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\003c\204Zhiw\274\204\000\000\200Tu\202\000\000\200\000\000\200\000\000\200Ta\202\000\000\200Chu{x\205{x\205Zhu\000\000\200Da\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\274\204Bi\202\000\000\200Jia\000\000\200\000\000\200Yi\202wD\204\303*\205Yue\006\025\204\000\000\200\000\000\200\301\333\205\000\000\200\000\000\200Gan\000\000\200\000\000\200\000\000\200\000\000\200\303*\205\006\214\204\000\000\200\000\000\200\000\000\200ChuChuBi\202\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200Gu\202\002\354\204Yin\003p\204Gu\202w\304\204Li\202w\274\204\000\000\200\000\000\200\000\000\200\000\000\200E\000\201Dai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ti\202Du\202Yi\202\000\000\200\000\000\200\000\000\200Die\000\000\200Niu\000\000\200XueNe\202GuiKao\000\000\200\000\000\200\305X\205\000\000\200\000\000\200\000\000\200ZhaYou\000\000\200BaiShi\3607\204Pa\202Qiu\000\000\200Min\000\000\200Xue\000\000\200Mo\202Ke\202You\003\002\204Bo\202\000\000\200\000\000\200\000\000\200\000\000\200Xiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mi\202Luo\000\000\200Xue\000\000\200Duo\000\000\200Er\202{_\204\000\000\200KuiNao\003+\204Li\202"; -static const char b23a[757] = "\373\006\337\204\000\000\200Die\000\000\200QiaLei\000\000\200Mao\000\000\200\005\313\204CheZhi\000\000\200Gu\202Cuo\000\000\200Cou\000\000\200\000\000\200Wu\202TaoGia\000\000\200Xi\202YaoWei\000\000\200Zu\202Ma\202Yu\202\006\260\204Yi\202QinYueJue{\240\205Xu\202\005\005\204\000\000\200\303>\205\000\000\200\000\000\200Luo\003p\204\000\000\200\301\357\204w,\204Fanx\210\204\000\000\200Du\202z\374\205\000\000\200\000\000\200Hui\000\000\200\000\000\200\000\000\200Gu\202KaoTai\000\000\200\003g\204Hun\303\362\204)\305\204)\305\204\000\000\200Ke\202Kao\000\000\200\000\000\200Cuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200ZuiZao\003\002\204{\012\204\000\000\200\000\000\200\000\000\200\000\000\200YanEr\202\000\000\200\003\006\204\000\000\200\000\000\200\005\262\204Si\202Sui\006z\204\000\000\200\000\000\200\000\000\200\303%\205{_\204\000\000\200Bi\202WeiYe\202\000\000\200\005(\204\000\000\200Ye\202\005,\204Ai\202\000\000\200\000\000\200{\240\205Ban\000\000\200Su\202Toi\006\333\204Yu\202\000\000\200\000\000\200\010\314\204\000\000\200\000\000\200\3607\204\010k\204Ban\000\000\200Qin\000\000\200\000\000\200Jia\000\000\200Pi\202\000\000\200\000\000\200Tou\000\000\200\000\000\200\000\000\200\004\320\204\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JanXue\000\000\200\3607\204\000\000\200\000\000\200\303\362\204Zai\3628\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Din{_\204\000\000\200Gu\202QueHuk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gu\202\000\000\200Guk\000\000\200\000\000\200Huk\000\000\200\000\000\200Hu\202\005\271\204\000\000\200GukGou\000\000\200Su\202\000\000\200\004\320\204\000\000\200\007\243\204\000\000\200Du\202Den\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\007\032\204Daoz\350\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200Li\202\000\000\200Li\202\003\006\204\000\000\200Wei\000\000\200Mou\000\000\200Hou\000\000\200\000\000\200Qi\202\004\256\204{\240\205Xie\000\000\200\000\000\200Van\000\000\200DaiJukLou"; -static const char b23b[760] = "\374\000\000\200\000\000\200{\012\204\000\000\200\000\000\200\000\000\200Pei\000\000\200\000\000\200Pi\202\000\000\200\007q\204\000\000\200BeiJue\007q\204Shi\000\000\200\000\000\200\000\000\200\000\000\200Xie\000\000\200\000\000\200Rui\0050\204Po\202San\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200FenBeiJieSa\202\000\000\200Pi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Di\202MaoBa\202Ba\202\007\036\204\005\357\204\371\260\205{Z\204Pi\202Wu\202\000\000\200Ze\202Bao\000\000\200\000\000\200Su\202\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HaoDouFu\202Ni\202BouBom\000\000\200Ge\202\000\000\200\000\000\200Ru\202z\374\204\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MaoRiaMao\000\000\200\006N\204Qiu\000\000\200\000\000\200\000\000\200Bo\202\000\000\200HaoNaoYan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200PaoSui\000\000\200TuoNguQu\202Li\202De\202\000\000\200JieJieGun{\240\204Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200San\006l\204\256\371\204\000\000\200\000\000\200\000\000\200Nai\006l\204\000\000\200\000\000\200\006N\204JiaSou\000\000\200\000\000\200\000\000\200De\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204{\221\204Mao\000\000\200\000\000\200Zi\202\000\000\200Ji\202Qi\202\000\000\200\000\000\200\000\000\200\000\000\200Ru\202Suo\006N\204Wu\202\006N\204\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200Sou\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200MenLi\202\000\000\200\000\000\200Cui\004#\204MenXi\202\000\000\200\006\351\204Nie\000\000\200Sui\000\000\200Pei\000\000\200\000\000\200Bi\202Di\202San\000\000\200Qu\202\006\214\204\000\000\200FenSu\202"; -static const char b23c[769] = "\377\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\006N\204Ji\202\000\000\200\000\000\200Qu\202Lie\000\000\200\000\000\200\006\227\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sao\000\000\200\000\000\200Kunx\214\204CuiYe\202\002\354\204\000\000\200Jie\000\000\200Qu\202Qu\202\000\000\200\000\000\200\000\000\200\006\205\204Ran\000\000\200Bin\010I\204\000\000\200\000\000\200Du\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\003\031\204\003\031\204\010\314\204z\374\204\000\000\200\000\000\200TaoQu\202Nie\000\000\200\000\000\200ShuLu\202\000\000\200Kun\000\000\200\000\000\200\000\000\200Ho\202\000\000\200MinMin\000\000\200\000\000\200\000\000\200Dan\000\000\200\000\000\200Yin\000\000\200\000\000\200\3621\204\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200Yin\004\256\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\261\246\204\000\000\200\000\000\200Fen\362?\205\000\000\200\000\000\200\000\000\200Gu\202HoiBum\000\000\200\000\000\200RamCha\000\000\200Liu\000\000\200\000\000\200Bu\202\000\000\200\000\000\200\000\000\200Pa\202Si\202Dao{Z\204Leox\220\204{_\204\000\000\200{\252\205\000\000\200Jiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ke\202Chi\000\000\200x\224\204\000\000\200\000\000\200\000\000\200Hu\202Li\202Sha\000\000\200\000\000\200PaiWeiWu\202\007\316\204Jan\010*\204\004\377\204\000\000\200\000\000\200\000\000\200x\230\204ShaDi\202\000\000\200\000\000\200DanSeu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tu\202He\202Po\202\000\000\200ZhiNiuNi\202\000\000\200x\234\204\000\000\200\000\000\200\000\000\200\006N\204\007\230\204\000\000\200Zhi\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\003\247\204Zo\202SinSi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200JieHaiMo\202\006\227\204\000\000\200{\221\204\000\000\200Xi\202\000\000\200\005\322\204Zi\202w\330\204\000\000\200Xi\202\007\335\204La\202\000\000\200Ben\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DoePui\004\330\204Jyu"; -static const char b23d[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200Za\202\000\000\200\000\000\200Du\202Hup\3025\205x\210\204\000\000\200BenMao\000\000\200\000\000\200Zao\372\230\206\000\000\200{\202\205\000\000\200\000\000\200Bi\202\000\000\200Pai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MaoTan\000\000\200\000\000\200Nit\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sau\000\000\200\000\000\200TunLuo\000\000\200\000\000\200Tan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\037\243\204XoiLanAn\202Bon\000\000\200x\240\204x\244\204v\014\204HanZhu\000\000\200DuoDuoGan\000\000\200\003\263\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{}\205\000\000\200\305`\204\000\000\200Mo\202ZheWen\372\230\206\000\000\200JiePao\000\000\200\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Su\202\000\000\200\000\000\200\000\000\200\000\000\200Ju\202\000\000\200\000\000\200Qi\202Can\000\000\200\007\265\204Sha\000\000\200Tuo\000\000\200\000\000\200Hua\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Coi\006\251\204\002\354\204JinJi\202DikFanWan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Min\362?\205\000\000\200\003=\204\000\000\200\010\016\204\000\000\200\000\000\200\000\000\200Yi\202\305`\204Ao\202\000\000\200Be\202LoiCanw`\204SuaSuaDayVeo\000\000\200Su\202\302?\204Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GuiTuo"; -static const char b23e[766] = "\376Hui\000\000\200\000\000\200Xu\202Zan\000\000\200Zi\202\303\362\204\000\000\200Da\202Yin\301\357\204\000\000\200\000\000\200\006\333\204Na\202Za\202\220\307\205Ti\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202TanShe\010\016\204\000\000\200\003g\204\000\000\200\000\000\200You\000\000\200\000\000\200Fen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200CiuJukJamJauJim\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0102\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ke\202\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MinDay\303C\205LutTo\202\302!\204DaiO\000\201Pi\202\000\000\200Ji\202\006\214\204\362?\205Gan\007:\204Chi\000\000\200\000\000\200\000\000\200z\350\204\000\000\200Zuo\000\000\200XieMao\000\000\200Hu\202\000\000\200Pi\202Xun\000\000\200XiaTi\202\000\000\200\000\000\200Na\202{\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202LamGaaSin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\205XueTao\000\000\200\006\214\204\000\000\200\000\000\200\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZinDo\202Dam\010\220\204Baix\250\204\010X\204w\024\204\305F\204SetBuiSo\202Cat\302l\204Xoi\010\344\204v\020\204\000\000\200\000\000\200\000\000\200\010\220\204Kou\000\000\200Ju\202Sha\0050\204\000\000\200\000\000\200Mo\202NouJi\202\010\016\204\000\000\200Shu\372\230\206Fu\202\000\000\200\000\000\200\006a\204Xie\005\230\204\3628\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhe\000\000\200\000\000\200Can\000\000\200Yue\000\000\200\000\000\200\003c\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wai{\226\205GinGei\000\000\200Hou*\245\204Nit"; -static const char b23f[724] = "\360\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Son\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tan\000\000\200\000\000\200\000\000\200YanLu\202Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ze\202{\276\205\000\000\200Am\202BotCha\026\317\204Doivx\204Vui\005\275\204\010\325\204DoiXop\302v\205LeiVanLotw\210\204DonMem\000\000\200\302!\204\005\230\204Leo\000\000\200\010\325\204\004\371\204\000\000\200\000\000\200\000\000\200GuoZhu\000\000\200Ru\202Ru\202\303\254\204\000\000\200KanJi\202Gao\000\000\200\000\000\200\000\000\200Xie\000\000\200\000\000\200Ou\202{\240\204\000\000\200\000\000\200\000\000\200ZhiZha\000\000\200\005\335\204\000\000\200{\202\204\000\000\200Bo\202\000\000\200\000\000\200Se\202An\202{\240\204\000\000\200\005\326\204\000\000\200\000\000\200\007\023\204\000\000\200\006\205\204YinTanGuo\000\000\200\000\000\200\005\253\204Wei\000\000\200\000\000\200Si\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\302\204\000\000\200w\314\204WuiKei\003\272\204x\230\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\207\204\000\000\200Kei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202\000\000\200{\221\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Buk\256\307\205DoiKiuDiaw\364\204x(\204Chax\254\204XoiBuiOi\202Pou\000\000\200\000\000\200\010\325\204\000\000\200\004\352\204Fu\202\371\260\204Su\202Yi\202{\207\204\000\000\200He\202\000\000\200{Z\204\000\000\200Ze\202\000\000\200CuiCui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\014\204Li\202Kou\000\000\200\000\000\200\000\000\200\3621\204You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DipWuiJi\202\007\042\204Sam\303\254\204"; -static const char b240[763] = "\375\000\000\200\000\000\200\000\000\200Hao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HanKen\000\000\200\000\000\200\000\000\200\000\000\200vx\204Day\006\373\204NhoLocAm\202Ray\006\227\204Ruav4\204O\000\201\302\212\204Lay,u\204Yu\202{\252\204\000\000\200\000\000\200\000\000\200\000\000\200z\362\204Suo\000\000\200La\202\000\000\200Dou{\240\204Po\202\303\362\204\000\000\200\000\000\200\000\000\200\000\000\200Xue\000\000\200\303\362\204\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\303\254\204GaaSamLukJi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Daox(\204LatLoaMin\3034\205Bot\000\000\200{\252\204\000\000\200\000\000\200\000\000\200\000\000\200DaoDanJieBai\000\000\200{\327\204z\374\204Se\202\000\000\200x\260\204Hua{\252\204\000\000\200\000\000\200Ou\202LieDi\202Cai\000\000\200Zha\000\000\200Lu\202\000\000\200\000\000\200\000\000\200Huo\000\000\200\000\000\200Li\202\004\377\204\000\000\200WeiBi\202Guo\000\000\200Pi\202\000\000\200\007H\204\003t\204\000\000\200\000\000\200\000\000\200\000\000\200ZiuKitLin\000\000\200\000\000\200\000\000\200\011\013\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\372\230\205\000\000\200\000\000\200\010\344\204Mo\202RuaDan\303\021\204LoiToe\000\000\200\000\000\200\000\000\200Re\202\005\335\204\000\000\200\000\000\200\000\000\200LinE\000\201\000\000\200YinLan\000\000\200Yao\000\000\200\000\000\200\003P\204Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BeuLeox\264\204\302\236\205UngNoi\010\002\204Lom\000\000\200w@\204Rem\000\000\200\303H\205Lan\005\357\204Xi\202\005\335\204\000\000\200\003\002\204\004\334\204\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200Bo\202\005\326\204An\202\000\000\200\000\000\200XunLei\006a\204Hui"; -static const char b241[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200Gau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3628\204x,\204x\270\204Xi\202\005\335\204\000\000\200Fan{\240\204\006&\204Za\202\000\000\200Ca\202\000\000\200YouSiu\000\000\200DuiPan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200Pan\000\000\200\000\000\200\000\000\200FanXi\202Re\202\302\231\205\3034\205\302:\204DanCan\000\000\200\000\000\200\000\000\200YaoLuo\000\000\200\000\000\200\303\362\204\000\000\200JinLi\202\000\000\200Lik\0050\204\000\000\200\000\000\200\000\000\200Lim\000\000\200\000\000\200\000\000\200\000\000\200\010\314\204YanDou\000\000\200\000\000\200Man\000\000\200\003=\204\010\314\204Can\000\000\200\000\000\200CauPan\0050\204\000\000\200\000\000\200\000\000\200\000\000\200Piu\000\000\200\000\000\200Lou\000\000\200Hou\000\000\200Men\000\000\200\000\000\200\000\000\200Xon\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gu\202\372\266\205\000\000\200\000\000\200\000\000\200\302?\204\005\357\204YanBi\202Jam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003t\204{x\205Kui\000\000\200Huo\000\000\200\000\000\200\000\000\200Nay\000\000\200\000\000\200\000\000\200\000\000\200Chi\000\000\200Wo\202\000\000\200CouZhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3055\204\000\000\200\000\000\200GuaPu\202Xu\202Si\202\000\000\200Wu\202\217s\204\006:\204\007\252\204Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mou\000\000\200Fu\202\000\000\200Shi\000\000\200\000\000\200Huiz\362\205Pa\202\000\000\200LoaTomNha\005\335\204w\034\204Zhu\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200Li\202{_\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\037\243\204\000\000\200Kho!M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Min\000\000\200Ge\202\000\000\200Hu\202\000\000\200\010\276\204XenXaoLapMo\202Sayw\300\204Tat\257\370\204\000\000\200\000\000\200\005\275\204BepEn\202Fa\202\000\000\200xd\204Xu\202Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200On\202\000\000\200\004\377\204"; -static const char b242[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Chi\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200{\257\205x|\204\302\034\204LuiNhuSotx\224\204\000\000\200\000\000\200\005\335\204Di\202HuiHe\202\000\000\200ZhaCho\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yunz\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007H\204z\374\204Lao\360\366\204Shi\004\334\204\000\000\200v\340\204TroTacTroCe\202Heo\302\351\204FanSoiToa\010\314\204\000\000\200\000\000\200\000\000\200\3039\205\000\000\200\000\000\200\000\000\200BieJiuWo\202\003\002\204Fu\202\000\000\200z\374\205Kai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\003\217\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luk\000\000\200\000\000\200Coi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Roi\010\344\204\006\227\204Trox\234\204\005\357\204\303M\205RucVacRomRo\202w\300\204w\300\204Lom\000\000\200\000\000\200Ben\000\000\200Nao\000\000\200HuoJi\202La\202\000\000\200\000\000\200\000\000\200\000\000\200Fou{_\204\006z\204MieChe\000\000\200{\303\205Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\251|\204\0102\204\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duo\000\000\200\000\000\200Nao\000\000\200Ji\202Hei\000\000\200ZhuHun\000\000\200\000\000\200\000\000\200Daiw\234\204Naux\274\204Kho\007H\204w\300\204Khov\364\204Um\202Dot"; -static const char b243[769] = "\377Kip\000\000\200Su\202DuoCha\302v\205\000\000\200z\343\205\000\000\200\000\000\200ZaiHui\004\377\204Hu\202Lin\006Z\204Han\000\000\200\000\000\200\000\000\200Nan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Rat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Git\000\000\200\000\000\200Xi\202\000\000\200Gan\000\000\200\000\000\200\000\000\200\000\000\200He\202Ji\202z\374\205Sha\000\000\200HayTo\202Retx\230\204NauHei\302\351\204To\202Huc\360\242\206\000\000\200\000\000\200\000\000\200Tuiz\367\205\002\376\204Shu\000\000\200You{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zao\000\000\200\000\000\200\000\000\200Re\202\000\000\200Jim\261\246\204{\221\205\006\233\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Loa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ruo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cui\3628\204\303\324\204Mo\202\010M\204NucMomx\300\204\360\242\206\010\314\204Tat\005\335\204Ji\202{_\205\000\000\200\000\000\200Ram\003\031\204An\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201LaoTan\000\000\200Zhu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lin\000\000\200\010\243\204\000\000\200\007q\204Hu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204Siu\000\000\200Gun\000\000\200\000\000\200\000\000\200Hei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\371\260\204Huo\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\020\204To\202Ho\202x\304\204x\274\204x\310\204Se\202FanLoux\314\204\010\314\204\000\000\200\000\000\200\000\000\200\000\000\200Chu\003c\204\000\000\200\000\000\200\000\000\200Ao\202\000\000\200\004\334\204\000\000\200\000\000\200\000\000\200\000\000\200\003g\204\000\000\200Mie"; -static const char b244[769] = "\377Hu\202\000\000\200\000\000\200\000\000\200Zin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KheTan\000\000\200\000\000\200\000\000\200\000\000\200Bi\202HamNau\006\227\204Soi\000\000\200\000\000\200x\320\204x(\204\000\000\200\003x\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kai\000\000\200\003t\204\000\000\200\000\000\200\000\000\200\000\000\200HuoLie\007A\204\000\000\200\000\000\200GaaHou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204Re\202\000\000\200\000\000\200\000\000\200z\355\205Ro\202\000\000\200\000\000\200\000\000\200\005\204\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yue\000\000\200Xun\000\000\200\006z\204\000\000\200\000\000\200\0050\204Fan\000\000\200\000\000\200\000\000\200Ro\202\000\000\200\000\000\200\000\000\200Sha\000\000\200\000\000\200Shi\000\000\200\000\000\200\000\000\200Xie\037\243\204LoeLoiMo\202Sem\000\000\200\000\000\200\000\000\200\3621\204\000\000\200\000\000\200\000\000\200Ye\202LanYi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\207\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SanJin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bo\202Cao\000\000\200\000\000\200x\324\204\257\370\204\011\013\204Nau\000\000\200Yao\000\000\200v\134\204Do\202\000\000\200Lom\000\000\200\000\000\200\000\000\200{\207\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\367\204\000\000\200x\310\204\000\000\200\000\000\200\000\000\200\000\000\200Bat\000\000\200Ta\202\007O\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ram\303R\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200\000\000\200Ji\202\000\000\200Lo\202Xi\202Zhi\222\007\204\000\000\200\000\000\200\000\000\200Xi\202Diu\000\000\200Yue\000\000\200\000\000\200\000\000\200\000\000\200Nen\000\000\200z\374\204\000\000\200\004\334\204\000\000\200\000\000\200Ben\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zu\202\000\000\200Na\202\000\000\200\000\000\200Vau\000\000\200\000\000\200\000\000\200DaoLie"; -static const char b245[769] = "\377Na\202\000\000\200\000\000\200\000\000\200\000\000\200Dit\000\000\200\000\000\200\000\000\200Pao\000\000\200Ju\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\337\204\000\000\200Luo\000\000\200\000\000\200{\276\204{_\205Su\202\000\000\200Luo\000\000\200Fen\000\000\200Wai\000\000\200Bao\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200{s\205\000\000\200\000\000\200\000\000\200x\254\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\220\204\026B\204\000\000\200\000\000\200\000\000\200\005I\204\000\000\200\005I\204\005I\204\000\000\200{x\205\000\000\200\000\000\200\000\000\200{\221\205\000\000\200\000\000\200Sou\000\000\200\000\000\200\371\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ge\202\000\000\200Cha\000\000\200\000\000\200\000\000\200Yu\202\000\000\200HuiChe\000\000\200\003\002\204ZhuShu\000\000\200\000\000\200\3621\204\000\000\200\000\000\200\000\000\200\006\373\204\000\000\200\000\000\200\000\000\200Pan\000\000\200\000\000\200{\240\205\000\000\200{\240\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005,\204\004#\204\000\000\200\000\000\200\000\000\200\000\000\200z\350\205Qiu\000\000\200\003\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204Ke\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DieZe\202\000\000\200\000\000\200{\012\205Se\202Fen\000\000\200\000\000\200{\240\205\000\000\200YanZhi\000\000\200\000\000\200RiuLi\202\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200Yi\202\000\000\200Qu\202PanGou\000\000\200JiaHe\202\000\000\200\006\260\204\000\000\200Ju\202\036\036\204Che{\252\204LopLieShiPo\202z\374\205\000\000\200Pi\202LuoCu\202\000\000\200Yu\202\000\000\200\000\000\200Mui\006\237\204Xie\000\000\200\000\000\200\000\000\200\000\000\200WanYanPei\000\000\200\000\000\200\000\000\200{x\205\000\000\200\000\000\200\033\257\204\000\000\200Ti\202CheBi\202{\207\204Jia\000\000\200\005P\204\000\000\200\000\000\200\000\000\200Ti\202\000\000\200\006&\204\000\000\200\000\000\200\000\000\200Die\000\000\200ShuLi\202Lu\202Xia\000\000\200Cui\000\000\200\000\000\200TamBo\202TuiPu\202\000\000\200LinFen\360<\205Bo\202z\355\204\000\000\200\000\000\200\010\220\204Tai"; -static const char b246[757] = "\373Dao\005I\204\005I\204Li\202\000\000\200Ya\202Ya\202{\221\204\000\000\200\000\000\200Yi\202NgaQi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0238\204Hu\202\000\000\200\005P\204\000\000\200Kou\000\000\200\000\000\200\256\371\204YouFen\000\000\200Nuo|\015\204JinPi\202{x\204Pi\202\000\000\200JieGui\000\000\200\000\000\200\007x\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\372\230\206\000\000\200\000\000\200Hu\202\004\320\204ShuTaoPi\202\006N\204\006N\204\000\000\200Hou\006\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bai\000\000\200Xia\000\000\200\000\000\200\000\000\200QinNi\202\000\000\200TaoQu\202\000\000\200\000\000\200Xie\000\000\200\002\376\204HuaXin\000\000\200\002M\204\000\000\200\000\000\200Tu\202\000\000\200{\207\205Bi\202Chu\000\000\200\003g\204\000\000\200XinFu\202Hak\000\000\200\000\000\200\000\000\200Jie\000\000\200\000\000\200\000\000\200Fu\202\010\325\204LaoTe\202She\000\000\200\000\000\200\010I\204\257\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200RanHou\005\005\204\000\000\200Cai\000\000\200\000\000\200\000\000\200\000\000\200Mu\202Be\202\302\034\204\000\000\200Xu\202Die\000\000\200\000\000\200z\355\204Yu\202\362?\205\000\000\200\000\000\200\000\000\200Li\202\002M\204\000\000\200\000\000\200\241z\204\000\000\200\000\000\200Du\202\000\000\200Maoz\362\205\000\000\200Tao\000\000\200Du\202Ti\202\371\260\205Mei\000\000\200Co\202Sao{Z\204QinPi\202\005!\204\010:\204Yao\000\000\200Xiu\006l\204Gu\202\000\000\200\000\000\200\000\000\200Bu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GouBo\202\000\000\200\000\000\200\000\000\200Wen\000\000\200\000\000\200Ji\202\000\000\200\000\000\200z\355\204\000\000\200XiaLa\202\000\000\200\000\000\200CuiMinCu\202Ou\202\003]\204\000\000\200\000\000\200\301\376\204\000\000\200MaoKe\202\006\351\204\003x\204z\362\204Duo{\240\205Su\202\302\034\204\000\000\200w\240\204\000\000\200\007\177\204Ta\202\000\000\200z\362\205JueXun\000\000\200\000\000\200{s\205\000\000\200Mi\202QunLao\000\000\200\000\000\200ZhiWei\000\000\200\000\000\200\000\000\200\000\000\200Se\202\000\000\200\000\000\200\000\000\200\006a\204"; -static const char b247[769] = "\377\000\000\200An\202Wei\000\000\200\006\333\204\000\000\200\005\275\204{\221\204\000\000\200\004\377\204Ge\202Hui\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LieJu\202Ba\202Lei\000\000\200Man\005\357\204\000\000\200\000\000\200Li\202Ji\202\000\000\200\000\000\200NaiHuiXinShiZheJi\202\000\000\200Bo\202\000\000\200\000\000\200\000\000\200ChaSanTu\202\000\000\200Cha\0050\204Ba\202Bei\000\000\200\000\000\200Yan\000\000\200Hu\202\000\000\200Yu\202\000\000\200Bi\202\305X\205\000\000\200Ji\202\000\000\200\000\000\200\000\000\200Mu\202\000\000\200Mao\362?\205\000\000\200Ye\202DouYe\202\000\000\200Van\000\000\200Ri\202Yin\000\000\200Haox\330\204Na\202TieFu\202Mu\202Zai\000\000\200Hu\202\000\000\200{x\204Tuo\000\000\200\000\000\200ChuFu\202\000\000\200\000\000\200Ze\202\000\000\200\000\000\200\000\000\200\000\000\200Bao\000\000\200\000\000\200\000\000\200x\334\204Di\202CaiLu\202Po\202Da\202Ye\202\000\000\200Yi\202\000\000\200\000\000\200\000\000\200z\374\205Bi\202Zhu\000\000\200Yi\202\000\000\200Lu\202\000\000\200{\202\205\000\000\200\000\000\200ZhiWai\000\000\200\000\000\200\000\000\200Wa\202Di\202ShuLieZaoZhiNao\000\000\200Si\202z\367\204Hoi\302\200\205Sanx\210\204TayLoi\005\020\204Se\202\000\000\200\3621\204\006a\204\000\000\200\000\000\200Yu\202DouChaXie\360\350\204\000\000\200z\374\204BaoMoix\340\204Bo\202Ro\202Ro\202Rai\000\000\200\000\000\200\005(\204\000\000\200Qiu\000\000\200Hu\202ZaiJue\000\000\200Han\000\000\200\000\000\200\000\000\200CaoHumLon\302\236\205\000\000\200An\202Zao\000\000\200DocSha\000\000\200z\374\204ChiYan\000\000\200An\202\000\000\200\000\000\200\000\000\200ZheJue\000\000\200\000\000\200Li\202\000\000\200Le\202\000\000\200\000\000\200Cai\000\000\200Lu\202\000\000\200JiaTho\000\000\200Xia\3621\204YanXu\202\000\000\200Dun\004\377\204HuiTi\202NouXi\202\000\000\200\000\000\200Tu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wai{x\204\000\000\200\000\000\200\000\000\200\005\335\204\000\000\200Ti\202\003P\204"; -static const char b248[769] = "\377Za\202\000\000\200v\020\204*\245\204Ga\202VoiUoiGe\202\000\000\200\000\000\200\000\000\200Lou\005\020\204PanJi\202\000\000\200Ta\202LauSi\202Xi\202\000\000\200\000\000\200\3621\204\000\000\200SaoJiaSu\202z\362\205\000\000\200Cuo\000\000\200Ta\202{\276\205\000\000\200\000\000\200Hau\303W\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202Li\202\000\000\200She\000\000\200\005!\204GauUoix\344\204Khi\303\033\204\000\000\200\3607\204Se\202\000\000\200RaiBi\202\000\000\200GouCu\202Jyuz\350\204\000\000\200ManLeiSu\202\000\000\200\000\000\200\004#\204Hao\000\000\200\000\000\200\000\000\200\000\000\200\302\236\205\000\000\200\000\000\200ChiCao\000\000\200\000\000\200Wo\202\3621\204LieYan\000\000\200\000\000\200\000\000\200x\344\204\0238\204\000\000\200Bi\202\000\000\200z\362\204\000\000\200Xi\202ChiXu\202NaoYan\000\000\200XieZha\000\000\200Sui\000\000\200Xi\202\005\005\204Ran\010\016\204BanGuiKai{x\204\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201Li\202Xi\202z\362\204Su\202\000\000\200z\355\205\000\000\200\000\000\200x\254\204San\000\000\200Lu\202Yan\000\000\200\000\000\200\010\220\204Dan\360\350\204\000\000\200\005(\204Ju\202\303a\204DuoSaoLaiSu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ze\202\000\000\200\000\000\200\000\000\200Bi\202Bam\303\033\204Yin\000\000\200Hao\000\000\200Liex\350\204v\020\204Hao\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\016\204Ai\202{}\205\000\000\200\000\000\200LeiXie\000\000\200Shiw\264\204x\334\204Soi\000\000\200\000\000\200\000\000\200Lu\202BeoQue{\207\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200\004\377\204\000\000\200\000\000\200Xie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204Youx\334\204\000\000\200\000\000\200\000\000\200\010\220\204Lan\3621\204Doc\000\000\200\000\000\200\000\000\200\251|\204\000\000\200\000\000\200Yi\202Juk\000\000\200\000\000\200Wu\202\000\000\200Yi\202TuoBu\202Ji\202XinCin\000\000\200Si\202Jin\000\000\200Ba\202Fa\202\000\000\200Mo\202Ruo\000\000\200\000\000\200Hoi"; -static const char b249[757] = "\373\267\252\204\007O\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Da\202Ji\202\007\252\204\000\000\200\000\000\200\000\000\200Su\202{}\205Ba\202\000\000\200\000\000\200\000\000\200Fat\000\000\200\000\000\200Jai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200|\015\204You\000\000\200Tuo\000\000\200WaiYou\000\000\200\004\352\204\010\002\204VuaXi\202\006\237\204Ji\202Gok\000\000\200{}\205DuiDuo\000\000\200Yi\202\000\000\200\000\000\200\000\000\200Jin\010\276\204Do\202\305;\204Jik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\374\204Xi\202QinSu\202\000\000\200\000\000\200Liu\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KokHak\000\000\200\000\000\200\000\000\200\000\000\200Zuo\000\000\200\000\000\200\000\000\200\000\000\200CheZhu\000\000\200Mao\000\000\200\000\000\200\000\000\200Zi\202\011\007\204\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200Jin\000\000\200Yu\202\000\000\200Yi\202Mi\202\000\000\200\000\000\200LaiZhi\000\000\200\000\000\200\000\000\200Fan\277\367\204\011!\204\002\354\204Ji\202Pui\217s\204\005i\204\000\000\200\000\000\200\000\000\200\000\000\200\177\227\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202\000\000\200BanZi\202\000\000\200\000\000\200\004\352\204\005\357\204\000\000\200w\314\204Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JinBou\007H\204Kei\220\307\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0102\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cau\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\005\357\204Yu\202\006&\204Di\202Zhi\000\000\200Mei\005P\204\005\253\204\000\000\200\000\000\200{\240\204\000\000\200x\004\204\000\000\200\000\000\200\000\000\200Wan\000\000\200JinWun\003\247\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HaaZinHeiCi\202\000\000\200\005P\204"; -static const char b24a[769] = "\377\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lu\202Qu\202\000\000\200Xi\202Da\202JanCaa\000\000\200LakHu\202Luo\000\000\200Le\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204x\354\204GauZanGeiJi\202PiuManSau\303u\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\261\246\204\000\000\200\000\000\200\000\000\200Lao\000\000\200\372\230\205\241z\204\000\000\200\000\000\200\000\000\200\000\000\200Jiu\000\000\200\000\000\200\000\000\200\011\000\204w\314\204Si\202Hoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\236\353\204Git\007x\204ZaoHaoz\374\205\000\000\200\000\000\200HaoLi\202\000\000\200\000\000\200\3607\204Ge\202\000\000\200\000\000\200\000\000\200\000\000\200\241z\204\007\042\204BikJi\202\000\000\200\000\000\200z\362\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200Xia\000\000\200\000\000\200\000\000\200x\360\204{\240\204Qi\202XiaYou\000\000\200\000\000\200\000\000\200\000\000\200\241z\204\000\000\200MouFai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{Z\205\000\000\200\000\000\200\010\002\204\000\000\200Ji\202\010X\204\000\000\200\000\000\200\372\230\205\000\000\200\000\000\200\000\000\200z\355\204\000\000\200\000\000\200SauLaiWai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sam\241z\204Lin\000\000\200\000\000\200\000\000\200\241z\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200Xie\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Haa\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202|\015\204Lai\000\000\200\000\000\200LouYan\000\000\200\000\000\200\000\000\200HaoXin\005\357\204\000\000\200Ban\005\005\204\000\000\200\000\000\200\000\000\200\000\000\200Gou\005\357\204\000\000\200\000\000\200KuoQia\003\002\204\000\000\200En\202YaoDu\202\000\000\200\000\000\200\000\000\200Dua"; -static const char b24b[769] = "\377DuaHuoDu\202Pei\000\000\200\000\000\200\000\000\200\000\000\200Hau\000\000\200\000\000\200\000\000\200\007:\204\000\000\200\000\000\200Lou\003g\204\000\000\200\000\000\200{\207\204YaoXi\202Yao\000\000\200Xi\202\000\000\200\000\000\200Lu\202\000\000\200Yan\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200\010\314\204Wa\202Zu\202FanYi\202Du\202Sui\000\000\200Pi\202\000\000\200Han\000\000\200Xu\202\006\227\204\003=\204\000\000\200Di\202\000\000\200Na\202 \341\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DuoWa\202\000\000\200\000\000\200Nie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005,\204z\362\205\000\000\200\000\000\200Ti\202Fan\000\000\200\000\000\200\000\000\200Wu\202Ang\000\000\200\0102\204\000\000\200\000\000\200\000\000\200\000\000\200HanGao\006\025\204Li\202\000\000\200DunFu\202Na\202\000\000\200Cei\000\000\200\000\000\200\000\000\200\000\000\200Jie\000\000\200\003\006\204\000\000\200\004\377\204z\374\205\000\000\200\005i\204\000\000\200\000\000\200Hu\202\000\000\200\000\000\200Su\202Am\202\005\335\204v<\204 J\204\000\000\200\000\000\200Ge\202E\000\201Xu\202\000\000\200\000\000\200Ci\202\000\000\200\000\000\200Ang\016\357\204\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\007\014\204GuoJie\305X\205Lei\005\313\204ZunBe\202Hu\202\000\000\200\000\000\200Pie\000\000\200Lo\202\005\262\204Xi\202Lei\000\000\200{_\204\000\000\200\006\227\204\006\227\204\302\236\205\000\000\200\000\000\200\000\000\200\000\000\200Au\202\000\000\200Lu\202\005\275\204DuiJun\000\000\200\000\000\200z\355\204\000\000\200XieWa\202Zhe\000\000\200\372\230\205\000\000\200\000\000\200\000\000\200LiuLei\000\000\200\000\000\200\000\000\200DaiGanx\230\204x\230\204\000\000\200\000\000\200\000\000\200\000\000\200Shi\000\000\200\302\200\204Yan\000\000\200\000\000\200Che\000\000\200Gan\000\000\200\000\000\200\000\000\200YanLam\000\000\200\000\000\200\000\000\200\000\000\200Sui\000\000\200\000\000\200\000\000\200\362?\205\000\000\200Shi\000\000\200\000\000\200\000\000\200\000\000\200\371\260\205\000\000\200\000\000\200\000\000\200z\355\204\000\000\200\000\000\200\007\023\204\007\023\204\000\000\200\000\000\200\000\000\200 \341\204\000\000\200\000\000\200De\202Ga\202\000\000\200\000\000\200\000\000\200\0050\204Cu\202z\362\205Yin\000\000\200\302\010\205\006\205\204\000\000\200\000\000\200\000\000\200De\202"; -static const char b24c[763] = "\375\000\000\200Cu\202\010\314\204\000\000\200\000\000\200z\374\205\000\000\200BeiBei\007\252\204\000\000\200\000\000\200\305X\205\000\000\200\000\000\200\000\000\200\000\000\200Pu\202\000\000\200\000\000\200\000\000\200\177\227\204\000\000\200\000\000\200\000\000\200Ke\202La\202\000\000\200\000\000\200\301\357\204\000\000\200\004\272\204Chi\006\351\204\000\000\200\000\000\200\000\000\200\000\000\200Zha\000\000\200\000\000\200\000\000\200Fen\000\000\200\010I\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lie\000\000\200Na\202Na\202\3628\204\000\000\200\000\000\200\000\000\200RanZu\202Pi\202You\000\000\200Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lie\002M\204\007\265\204\000\000\200Gao\360\366\204Tuo\000\000\200Nan\000\000\200\000\000\200\000\000\200Tuo\003=\204\005,\204\000\000\200\000\000\200\236\353\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\205\204\006l\204\000\000\200XieSi\202\005P\204Gui\000\000\200\000\000\200Fu\202Gui\000\000\200\000\000\200\000\000\200v\020\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200\303\134\205\000\000\200\000\000\200\000\000\200\000\000\200Zhu\000\000\200Lai\000\000\200Lun|\015\204Ran\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200Jyuw\314\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007q\204Yan\000\000\200\000\000\200\005\253\204Dan\000\000\200\000\000\200Mao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\337\204\000\000\200Xu\202\000\000\200Xi\202\000\000\200Dai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ma\202Qi\202BoiChaw\274\204w\274\204{_\205Han\0102\204\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200Yu\202Ban\000\000\200\005\326\204\251|\204\000\000\200\000\000\200\000\000\200\004\320\204\000\000\200\000\000\200\004\320\204\000\000\200\3034\205\000\000\200Qi\202Xi\202BeiLa\202Roc\000\000\200Ye\202\000\000\200\000\000\200{\012\205\000\000\200ZhuVe\202\303\134\205\000\000\200LeiLeiCha\000\000\200BoiBoi\000\000\200\000\000\200\000\000\200\000\000\200\303\134\205"; -static const char b24d[769] = "\377{\012\205Die\000\000\200\000\000\200\000\000\200\000\000\200Cau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Die\000\000\200La\202\006\327\204\000\000\200\000\000\200Ya\202So\202\000\000\200\000\000\200\000\000\200NieShu\000\000\200Zhi\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200ZhiPi\202\000\000\200JiuJiuYi\202You\000\000\200Jiu\000\000\200DauBot\000\000\200z\362\204\000\000\200Du\202\000\000\200\000\000\200\000\000\200x\364\204Soi\000\000\200\000\000\200\000\000\200\000\000\200TaoQieQinXinz\355\204Ji\202\000\000\200Qin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202Zhi\000\000\200\000\000\200Ou\202\000\000\200Wu\202\000\000\200Wen\000\000\200\000\000\200KhoVet\000\000\200Bi\202\000\000\200To\202Bei\000\000\200Mu\202JinTao\006z\204\000\000\200\000\000\200\000\000\200\000\000\200CaoZha\000\000\200\000\000\200\000\000\200Seo\000\000\200ChiYa\202KuiYin\000\000\200\000\000\200\000\000\200BonSay\000\000\200Si\202\000\000\200\003\031\204QiaDai\004\272\204{_\205HaiCha\000\000\200\003\002\204Lao\000\000\200\000\000\200v\024\204\000\000\200\000\000\200\000\000\200Xi\202\000\000\200GuiBo\202\000\000\200\000\000\200v<\204\360\212\206z\367\204\302:\204BenZhi\000\000\200TunFu\202\000\000\200Hu\202ZaaNieYi\202\372\230\206\000\000\200\000\000\200\000\000\200Cha\000\000\200\000\000\200\000\000\200\011\032\204\000\000\200\000\000\200Yun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202\000\000\200Xi\202\305X\205\003g\204\003\002\204\371\260\204\000\000\200\000\000\200\000\000\200Naax\370\204xp\204\360H\205\006\351\204MutLanHau\305`\204BeiFei{\240\204\301\357\204Yi\202\004\352\204Xu\202Na\202Ji\202\000\000\200\000\000\200{Z\204Qi\202DuiYin\000\000\200JiuPi\202XinLunCai\005\357\204BieDaoDe\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200La\202\000\000\200Xi\202Ju\202\000\000\200\3621\204\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\006\351\204Cek\000\000\200x\374\204=\350\204\032_\204\037\243\204MonSanw`\204E\000\201Phoy\000\204\000\000\200\000\000\200Wai\000\000\200Naoz\374\205QueQieTu\202"; -static const char b24e[769] = "\377Xu\202Hui\000\000\200\000\000\200\000\000\200MinWei\000\000\200YouTuiDai\000\000\200\000\000\200\000\000\200Ke\202Na\202\000\000\200Fu\202Yu\202Zhi\000\000\200HanAi\202Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\350\204\000\000\200\000\000\200Shi\000\000\200z\355\204{\264\204Xiu\000\000\200ChiYun{\276\205Ro\202Su\202\010\230\204\000\000\200E\000\201{Z\205Ai\202SuoBu\202\000\000\200QunYi\202Yan\000\000\200Na\202Wu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202Li\202\000\000\200Xi\202JueShi\000\000\200Ya\202\000\000\200LitRomKhu\301\357\204\006l\204UonHenOngvX\204\256\225\204x\364\204{x\204\004\377\204Bi\202Che\000\000\200\000\000\200ZhaTuoHu\202\005\326\204\004\377\204Bi\202\006\373\204{\207\204XinYu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bei\000\000\200Mo\202Dui\000\000\200DaoQi\202\000\000\200Kai\000\000\200y\000\204NotHuiNgo{\276\205\000\000\200\000\000\200\3621\204\362?\205\003p\204\000\000\200\303\362\204\000\000\200WeiXi\202\000\000\200\005\262\204\000\000\200XiePanNie\000\000\200\000\000\200BieSheFeiMinQi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011!\204\000\000\200\006a\204\000\000\200\000\000\200{_\204Suo\000\000\200x\314\204GuaMuny\004\204\303a\204SonTe\202y\000\204Om\202vL\204Ji\202\000\000\200\000\000\200Dan\007q\204Lu\202\000\000\200Ao\202\000\000\200\000\000\200\000\000\200Yi\202ShuSuiWeiWanChu\000\000\200\000\000\200y\010\204\000\000\200Wo\202\000\000\200CumHuiHomRemToiGayvL\204\000\000\200Bi\202\000\000\200YinHuo\000\000\200\000\000\200Kai\006\373\204\000\000\200\000\000\200\000\000\200\000\000\200Ai\202\000\000\200Li\202\000\000\200\005(\204\000\000\200\000\000\200\000\000\200Nhow\020\204\303H\205vL\204\000\000\200\000\000\200\000\000\200Lu\202\000\000\200w\330\204\000\000\200\000\000\200\303\362\204Pan\000\000\200\000\000\200\000\000\200MetRo\202XaiRanGui"; -static const char b24f[766] = "\376Su\202\006\205\204z\374\204\003\031\204\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\204Yi\202\004\272\204Mak{\207\204{\012\204\000\000\200WeiRomy\014\204x\364\204\000\000\200JueLei\006\337\204Li\202\000\000\200Pi\202\000\000\200Gay\000\000\200\000\000\200\000\000\200z\362\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200\000\000\200\000\000\200Ju\202\000\000\200\000\000\200\005\262\204\000\000\200\010\220\204\000\000\200Fei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\020\204Zhi\000\000\200Mei\000\000\200z\362\204\000\000\200\000\000\200\000\000\200Pa\202Bi\202\000\000\200Po\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Er\202\000\000\200z\362\204\000\000\200\301\340\205\000\000\200\000\000\200\000\000\200\000\000\200Mui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\205\000\000\200LuoFou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\320\204\000\000\200Zu\202Nan\3621\204Heuy\024\204Via\000\000\200\302\267\205BaiLu\202\000\000\200Luo\000\000\200\000\000\200{\327\204Ze\202\000\000\200\251|\204\000\000\200ZhuHu\202Dau\000\000\200Hui\005!\204\004\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\205Doux\200\204=\350\204\000\000\200\000\000\200\005:\204\000\000\200\000\000\200Jit\005\014\204\000\000\200Bo\202\000\000\200Ho\202Di\202\000\000\200\005\262\204Pu\202\000\000\200\007\023\204\004\320\204\000\000\200\000\000\200Bik\000\000\200Yao\006\205\204\003\031\204\000\000\200Mon\301\340\205\303a\205{\207\204\000\000\200\000\000\200Bie\000\000\200\303f\205Faa\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200Se\202Zuo\000\000\200w\214\204\000\000\200Cun\005\357\204{Z\205Pi\202Bao\000\000\200\000\000\200Que\000\000\200Vo\202Pi\202NanPi\202Bo\202BeiFa\202\000\000\200MinMo\202Wa\202\002\376\204ZhiCu\202\000\000\200\000\000\200\000\000\200\000\000\200XunJi\202Gui\000\000\200{x\205Be\202\000\000\200Da\202Han\3621\204Que\010\022\204\301\321\204\000\000\200Fu\202\000\000\200\000\000\200\3034\205BitFu\202QinLu\202Que\3607\204z\350\204\000\000\200\000\000\200\000\000\200\000\000\200z\355\205Ta\202Bei"; -static const char b250[769] = "\377\000\000\200Du\202\005\005\204Hou\000\000\200\000\000\200\000\000\200\000\000\200ZhaZha\000\000\200\000\000\200xL\204\000\000\200QueMa\202Han\000\000\200\000\000\200LiuLu\202\000\000\200Zi\202\000\000\200Pi\202\003c\204\000\000\200Zao\000\000\200Niu\000\000\200\000\000\200Hui\000\000\200\000\000\200Xue\000\000\200La\202\000\000\200\000\000\200\000\000\200\000\000\200UngNouYanRanNao\000\000\200La\202{\012\205Du\202Mo\202\000\000\200Lu\202\000\000\200\000\000\200\000\000\200{\240\204XieQi\202\000\000\200\000\000\200z\374\205\000\000\200\000\000\200GuoJie\006\351\204\000\000\200\000\000\200XiaKui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003]\204\000\000\200HaiMi\202YaoJau\000\000\200Wen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\007q\204Wu\202\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005,\204Chu\000\000\200\000\000\200Suo\000\000\200\000\000\200z\367\205\000\000\200Vim\301\357\204She\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\006\205\204Ju\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200vD\204\000\000\200Tu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010M\204Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fen\000\000\200\000\000\200\000\000\200Am\202\000\000\200\000\000\200\000\000\200\000\000\200Ao\202GuoHu\202CanDunHai\003\002\204Gu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gu\202\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200\000\000\200\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200\000\000\200\000\000\200\000\000\200Mam\000\000\200\000\000\200Qu\202Ke\202\000\000\200\000\000\200\000\000\200\000\000\200MamMam\000\000\200\000\000\200Het\003\006\204Yi\202\000\000\200\000\000\200Kai\003\002\204\000\000\200\000\000\200\004\320\204Bu\202Gen\003\002\204Zhi\000\000\200\000\000\200Wen\000\000\200Binw0\204\000\000\200\000\000\200{s\205Fan\000\000\200\000\000\200Yi\202\305X\205Yao\000\000\200\000\000\200\360\350\204Du\202Yan"; -static const char b251[769] = "\377\000\000\200\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ChiMu\202\003\002\204\000\000\200Nu\202\000\000\200GuoXue\000\000\200\000\000\200Fu\202XueFu\202PeiMo\202Xi\202Wo\202{_\204\000\000\200\000\000\200Xi\202Qi\202\003+\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200\004\320\204\000\000\200\000\000\200GapNguNgov\024\204y\014\204\301\225\204FeiMieDa\202XueXu\202Si\202Ju\202MaoBao\000\000\200Yi\202GuaNi\202\000\000\200Yi\202\000\000\200Zuo\000\000\200\301\225\204Nu\202\000\000\200\000\000\200\000\000\200\010\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3607\204FanYi\202Shi\000\000\200\000\000\200Cu\202{Z\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shi\003\002\204HouEr\202\000\000\200\000\000\200\000\000\200\000\000\200LeiXue\007\277\204\000\000\200\002M\204\000\000\200\007q\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v<\204\000\000\200JieWei\000\000\200\002M\204\0050\204\000\000\200Xu\202z\367\205\000\000\200\011!\204\004#\204)\341\204\360\250\206y\030\204v\024\204Nho\303R\205{\240\205Mou\000\000\200\000\000\200Yu\202\000\000\200\000\000\200Jue\000\000\200\000\000\200\000\000\200\000\000\200\005P\204\000\000\200\000\000\200\3621\204\000\000\200Dou\000\000\200Guo\006\351\204\305`\204Xu\202\305`\204Suo\007q\204Yue\000\000\200Han\000\000\200\371\260\204\000\000\200XieLiuRun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\000\000\200Nao\000\000\200\000\000\200\000\000\200WanJiuQuew\324\204DauRu\202Le\202y\014\204\302S\204y\034\204\006\351\204TroBet\000\000\200Ni\202\000\000\200Mi\202Suo\301\225\204z\350\205\000\000\200\000\000\200Han\004\334\204Mi\202Xu\202\000\000\200\005\230\204Jie\003x\204z\355\205ZhiFeiJiaJunHuoQi\202Ju\202\007g\204\000\000\200\3607\204\003\002\204Ya\202\000\000\200{\221\204\020~\204Jia\000\000\200SikNoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200MaiHu\202XieShiGui\000\000\200\000\000\200Himw`\204w\344\204\007\032\204\3034\204Trow\020\204Nho\000\000\200Xu\202"; -static const char b252[769] = "\377\000\000\200\360H\206Ji\202\000\000\200\305X\206\000\000\200Mao\005\253\204Xu\202z\362\204ShaJu\202\000\000\200\000\000\200\000\000\200{\202\205\000\000\200Hou{\012\204Gua\000\000\200Mi\202DieBi\202{\207\205La\202{_\204Lu\202Xi\202\000\000\200\000\000\200Sou\007\215\204\000\000\200Mi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\302\217\204\006G\204Lay\005\335\204\302S\204Kip)\335\204\303k\205\301\225\204NamKu\202Guiw`\204DomXi\202PanSe\202Jue\005\335\204{\012\204Ju\202\000\000\200NaiHuaGe\202Li\202GouTi\202\000\000\200Ma\202\005\326\204Da\202\000\000\200\000\000\200\000\000\200Qi\202Yu\202\003\002\204Mie\007\277\204\006\205\204Wei\000\000\200Ti\202Qi\202\000\000\200\000\000\200{x\204Dou\000\000\200Pan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3034\205Hay\3034\205Lety \204Soc\303\266\204Han\000\000\200\3034\204\000\000\200Mi\202Ma\202Lu\202Qi\202\007\243\204\000\000\200DieQi\202\003\002\204\007\014\204\006\214\204Mi\202{_\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204Li\202Ke\202Xu\202\000\000\200v\264\204\000\000\200\000\000\200\000\000\200\000\000\200Man\003\014\204z\355\204Hui\000\000\200Duiy$\204Ghe\004#\204Mo\202\3034\205\303p\205)\341\204\303\324\204\302:\204\007\023\204\301\225\204\303*\205\303*\205\301\340\205DomMu\202Kou\000\000\200\000\000\200Wei{\012\204Ji\202ZunHuoXie\000\000\200\000\000\200\000\000\200\000\000\200Sui\000\000\200\005\253\204\000\000\200Te\202\000\000\200\000\000\200\000\000\200{Z\205Kunz\374\205\003+\204\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303u\205\000\000\200\000\000\200\000\000\200\000\000\200Sa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tre\360\256\206\302\027\205vD\204\000\000\200\000\000\200w8\204E\000\201MieZhuZou\006\205\204\000\000\200Xi\202\000\000\200\005!\204\000\000\200Jiaz\355\205Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\334\204\000\000\200\000\000\200\000\000\200LemCoix\240\204HimLamy\030\204SoiwD\204Dom\000\000\200y$\204y(\204\000\000\200He\202"; -static const char b253[769] = "\377ChaQi\202\003+\204{Z\204Ku\202Ye\202\003c\204\000\000\200{\240\204\000\000\200Pan\000\000\200\000\000\200Hui\236\353\204\305;\204Liu\007\215\204\000\000\200Cyu\000\000\200\000\000\200\000\000\200\000\000\200\3055\204NhoMaiLi\202\000\000\200\000\000\200\010\016\204Yi\202\000\000\200\000\000\200\000\000\200\000\000\200Li\202\303\266\204LenLo\202XieTe\202Xiu\3034\204\302S\204\003P\204Li\202\006\205\204Wei\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303z\205Dimx\240\204YaoLan\005\357\204\004\377\204\004\377\204Li\202{\240\204Gui\000\000\200\000\000\200\000\000\200{\012\204Xie\000\000\200\000\000\200She\000\000\200Zui\000\000\200Lom\302\200\205\000\000\200\000\000\200wd\204\305F\204KanLei\000\000\200vD\204\000\000\200wt\204\000\000\200\303\362\204y\014\204\000\000\200ShuNu\202Xu\202\000\000\200\000\000\200\000\000\200Hao\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200\005(\204\005\230\204\007A\204Zhi\003\014\204Qin\000\000\200Ze\202Na\202NiuYi\202\000\000\200\000\000\200\006&\204Shi{\240\204\004#\204Yan\004\377\204\000\000\200\000\000\200\000\000\200\005\253\204Mem\006N\204Xi\202\000\000\200{\012\204Kai\000\000\200Wu\202\000\000\200Qin\006&\204\000\000\200Ze\202Xie\000\000\200Yu\202Zan\305X\206Li\202Li\202Xu\202Mi\202Xu\202\005\253\204\000\000\200\000\000\200Gui\006N\204y,\204\000\000\200Mao\000\000\200Qin\007A\204\007A\204\007A\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200Fa\202Ba\202\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200QiaZhi\007\036\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhiZhi\000\000\200z\362\204\004\320\204\000\000\200ZhiTenTenTen\004\377\204\000\000\200\000\000\200\000\000\200Wu\202Bei\000\000\200\005\335\204\371\260\204\000\000\200JueKui\000\000\200\000\000\200Yi\202Ya\202\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\000\000\200Kuaz\350\204\000\000\200\000\000\200\002\376\204\000\000\200Kai{_\205\000\000\200\000\000\200An\202ZheZhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200Ji\202Van"; -static const char b254[769] = "\377Si\202Pu\202Ou\202\000\000\200\000\000\200\000\000\200Van\303\014\204So\202\303\014\204\004\334\204w<\204\000\000\200\303\014\204\000\000\200Coc\302\351\204\004\377\204Cutz\362\204VanYa\202\000\000\200\000\000\200ShiPa\202Pu\202\000\000\200\000\000\200\000\000\200\006\351\204\005\020\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007V\204DiaLoiDiaYun\000\000\200\000\000\200Gu\202\000\000\200\000\000\200x\354\204\004\324\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200Nao\000\000\200Zhe\000\000\200Hu\202\000\000\200\000\000\200\005\020\204Ben\000\000\200\007\243\204GaaDie\005P\204\000\000\200\000\000\200\007\230\204\000\000\200\000\000\200{}\205ShiJiaAo\202Na\202PinJia\000\000\200\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200x\360\204ZheBu\202Wo\202\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200NaoKany0\204y4\204\000\000\200Du\202\007\230\204{}\205Ran\006N\204Yi\202DuiLei\000\000\200\003c\204KuaE\000\201z\374\204\3607\204NuoE\000\201\003]\204Wu\202\007\243\204\000\000\200Dia\000\000\200Gai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y8\204\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200ZhiXun\000\000\200\000\000\200{Z\205\000\000\200\000\000\200\360\350\204\000\000\200HuoJi\202Nao\000\000\200\000\000\200Da\202DiaYa\202Lu\202\000\000\200\000\000\200Fu\202SanChuWei\000\000\200Fu\202\007\243\204Si\202\007\014\204\000\000\200Yi\202Hua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200Li\202MaiVo\202LinDu\202E\000\201 \341\204\000\000\200\000\000\200z\350\205Du\202\000\000\200\000\000\200Jie\301\321\204z\374\204\000\000\200\000\000\200\000\000\200Gao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dao\000\000\200\000\000\200\000\000\200\005\335\204\000\000\200\000\000\200Be\202MaiDiaVo\202w\250\204SomLoi\000\000\200\004#\204\000\000\200\000\000\200Qi\202Tuo"; -static const char b255[769] = "\377\005\335\204Pi\202\007\277\204\000\000\200Nie\000\000\200\000\000\200\006\237\204\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200y<\204\000\000\200\000\000\200\3621\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SheYu\202{\240\205\000\000\200\000\000\200Voiz\367\205\000\000\200Qi\202{x\204\010\230\204\000\000\200Suoz\350\204Hui\000\000\200{_\204E\000\201\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qiu\000\000\200Ke\202\000\000\200Ham\006Z\204Zi\202Ji\202\000\000\200Mai\000\000\200\000\000\200Da\202\000\000\200Cuo\033\257\204\000\000\200)\325\204Lou\007\014\204KuoDi\202Qie\000\000\200Mo\202\000\000\200\000\000\200Guo\005\335\204\010I\204Hei\000\000\200Gei\000\000\200v\310\204{\271\205\000\000\200\000\000\200\000\000\200CaoZheHap\004\324\204Gun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xu\202\006\260\204Jue\000\000\200\000\000\200GanSi\202\000\000\200SuiQue\000\000\200Wu\202Yan\006\260\204\3621\204Pan\000\000\200y,\204\000\000\200\000\000\200Sinx\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200La\202\000\000\200GunDoiVo\202\301\357\205Vo\202SanLo\202Vo\202\005\005\204{Z\204Ji\202\000\000\200\000\000\200Jin{\207\204Ken\000\000\200\003c\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zaow\254\204Le\202Qi\202\002\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YinPin\000\000\200Oe\202\005\375\204Me\202SouLu\202\000\000\200Di\202Du\202\006z\204\004\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\205\000\000\200\016\357\204Re\202Ghe\301\357\205Soi\000\000\200{x\204Ta\202\000\000\200Jin\000\000\200\000\000\200\000\000\200QueDaoCin{x\204\010\314\204\000\000\200Po\202Lai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\362?\205XieNen\016\357\204{\240\205Qu\202LeiCa\202Que\000\000\200\000\000\200\000\000\200\000\000\200\016\357\204\000\000\200z\374\205Lei\000\000\200\000\000\200To\202Lan\000\000\200\000\000\200Lan\000\000\200La\202"; -static const char b256[742] = "\366\006\220\204La\202Ben\000\000\200Yu\202Si\202\000\000\200\000\000\200\000\000\200\000\000\200\003\002\204QinJi\202\000\000\200\000\000\200Gan\000\000\200Va\202Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202Zhi\000\000\200\000\000\200\003t\204\371\260\205Jiu\000\000\200\000\000\200\000\000\200NgoHe\202Fu\202\000\000\200Ju\202Mei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200x\354\204TreTre\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZuoYi\202\000\000\200\000\000\200\000\000\200\000\000\200z\374\204Yi\202\000\000\200Si\202\000\000\200\257\320\204\000\000\200\000\000\200Mo\202\000\000\200\000\000\200{\257\205v,\204w\270\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204\000\000\200Xun\000\000\200\000\000\200Ru\202NheHuoLayv\210\204\000\000\200\360\366\204\000\000\200\000\000\200\000\000\200\002M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YouYu\202\000\000\200\000\000\200Jun\006\327\204LayNhe\302S\204w\330\204\000\000\200Zi\202Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\214\205\000\000\200\000\000\200\000\000\200\000\000\200ChiKun\000\000\200\000\000\200\000\000\200\000\000\200\007g\204\000\000\200\000\000\200\000\000\200ThoLaiHou\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200De\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004#\204\004\377\204\000\000\200\000\000\200Zhu\000\000\200\000\000\200Liu\000\000\200\000\000\200\000\000\200Lay\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w`\204Bi\202\000\000\200Chi\000\000\200Zu\202\003\014\204Lu\202Pu\202\000\000\200\000\000\200\000\000\200\007\211\204\000\000\200\372\230\205\000\000\200ZheShiYu\202Lu\202{\207\205\000\000\200Le\202\000\000\200Jue\006z\204\005\005\204\000\000\200\000\000\200\000\000\200\000\000\200Sin"; -static const char b257[769] = "\377Vai\000\000\200\000\000\200Yi\202{\012\204\000\000\200Lau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ao\202\000\000\200\000\000\200GuiMin\000\000\200YanLan\000\000\200\000\000\200Bo\202\000\000\200\000\000\200ZanYou\000\000\200\000\000\200Kit\000\000\200\000\000\200\000\000\200Nhe\000\000\200\000\000\200Re\202Yi\202Ni\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202GuoJun\000\000\200Shi\000\000\200z\374\204\000\000\200z\350\204QueKui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sit\000\000\200\000\000\200She\000\000\200Huo\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200FeiFeiJi\202Yu\202Gat\000\000\200\000\000\200ZhiGua\000\000\200Jie\006\351\204He\202\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202Si\202\000\000\200Li\202\000\000\200\000\000\200JieNiuBa\202Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202Ke\202\000\000\200\000\000\200\000\000\200CayDu\202Jia\000\000\200{x\204\000\000\200\257\320\204He\202\005(\204\000\000\200\000\000\200\000\000\200\000\000\200Mei\000\000\200\000\000\200He\202Zi\202Zhu\000\000\200\000\000\200Tuo\000\000\200\000\000\200\000\000\200\301\345\205\000\000\200Zun\000\000\200Ru\202Duo{\240\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jia\005\313\204\000\000\200\005\005\204Mo\202\000\000\200\000\000\200\000\000\200\000\000\200Zu\202\000\000\200\000\000\200Bie\000\000\200Ku\202Jia\000\000\200\000\000\200\000\000\200\000\000\200\004\334\204\000\000\200Xiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LoiHe\202\000\000\200\006\214\204\000\000\200Kauy@\204y@\204Ngo\000\000\200\010\344\204Fei\371\260\205\000\000\200\000\000\200\000\000\200\003p\204{\202\204Ze\202z\374\204\000\000\200Bi\202Yi\202\000\000\200z\355\205\000\000\200\000\000\200\000\000\200\000\000\200Muk\003\272\204\004\371\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200Lui\000\000\200\000\000\200BapWu\202Ku\202Wo\202"; -static const char b258[763] = "\375\003g\204Ke\202\000\000\200Jiu\0070\204z\362\204\000\000\200\000\000\200ZhiCe\202RouJi\202\000\000\200Ye\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\004#\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200w\240\204\301\345\205RomRom\000\000\200Si\202Li\202Gu\202z\355\205\000\000\200FeiLiu\000\000\200JieYun\000\000\200\000\000\200Zhi\000\000\200\000\000\200\004\320\204Bie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200MaaVua\000\000\200\000\000\200\000\000\200Luo{\240\204\000\000\200\305X\206\372\266\206\000\000\200Lu\202Jun\003\002\204\000\000\200Ti\202Zha\000\000\200\000\000\200Yi\202\000\000\200\006&\204NeiJia\000\000\200\000\000\200\003\002\204\007\252\204\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ai\202\000\000\200\000\000\200\000\000\200\000\000\200Ma\202\0238\204Mam\303\177\205\303\177\205{\240\204\000\000\200y@\204Ben\000\000\200FanSuiZun\3607\204GaoGaoLao\000\000\200\004\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tui\000\000\200\000\000\200\000\000\200Bi\202Ju\202\000\000\200\000\000\200\000\000\200GatVe\202\000\000\200Hua\000\000\200\000\000\200\000\000\200{x\205{\252\204\000\000\200\000\000\200\005\271\204\010\220\204Ge\202Xie\000\000\200Jie\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zu\202\000\000\200Pu\202\000\000\200\000\000\200ShuBu\202\000\000\200\000\000\200\000\000\200v4\204\3034\205Gio\000\000\200\000\000\200\000\000\200\000\000\200\006\373\204Yan\003c\204\000\000\200\006\205\204\000\000\200\303\362\204Dekz\374\205\000\000\200\217s\204\000\000\200\000\000\200Lu\202Li\202\000\000\200\000\000\200\000\000\200Ji\202\000\000\200MieLei\000\000\200ZhiYou\303\362\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mu\202\000\000\200Ran\000\000\200\000\000\200\301\321\205"; -static const char b259[757] = "\373\000\000\200\000\000\200\003\025\204Jau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204Zhe\000\000\200\000\000\200\000\000\200\000\000\200Lei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\220\204Jue\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\005\357\204Yan\000\000\200\000\000\200\000\000\200Yao{Z\204Qi\202Ai\202\000\000\200Nu\202\006\351\204\000\000\200\000\000\200\000\000\200\000\000\200Tu\202\000\000\200\000\000\200Kan\000\000\200JiuYan\003+\204\000\000\200YinWanYaoWa\202Pi\202Sui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\237\204Miu\000\000\200\005\335\204\000\000\200\305;\204\005\357\204Yi\202\371\260\204\000\000\200Zuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gu\202\000\000\200\000\000\200\000\000\200\000\000\200Tu\202\000\000\200\003]\204\000\000\200Wa\202Gui\005\335\204\000\000\200\000\000\200\000\000\200Shi\000\000\200{s\205\000\000\200A\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\205\000\000\200\007\243\204Yi\202\360\350\204\005P\204DouChaLiu\000\000\200\000\000\200\000\000\200Qiu\003P\204\371\260\204{\202\204\3628\204\000\000\200z\350\204\000\000\200\004\320\204\000\000\200\000\000\200\000\000\200\000\000\200Wen\000\000\200\003\031\204An\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kan\000\000\200Yao\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\005\005\204LanQia\3607\204\000\000\200\000\000\200\003\002\204Gui\000\000\200{s\205\000\000\200\000\000\200Ke\202\000\000\200\000\000\200\000\000\200{\214\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204\005:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200Ou\202Ke\202\000\000\200\000\000\200\000\000\200Ku\202Mei\000\000\200\004\272\204\000\000\200\000\000\200|\015\204GouMa\202\000\000\200Liu\000\000\200\000\000\200\000\000\200WeiWen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200Tu\202\006\373\204\000\000\200\000\000\200Mi\202\000\000\200Nup\006N\204\005\230\204z\350\204ManZhe\000\000\200Hua\003]\204Jin\000\000\200Mei\000\000\200\000\000\200Fu\202\000\000\200Tam\000\000\200Qu\202"; -static const char b25a[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204LiuFu\202Dan\000\000\200\003=\204\000\000\200Cui\000\000\200\000\000\200\003g\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tu\202\002M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xo\202\3034\205\000\000\200{}\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200\000\000\200Ji\202Tuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200yD\204\000\000\200\257\320\204\000\000\200\000\000\200\3628\204Xo\202\000\000\200\000\000\200\000\000\200\000\000\200Tan\000\000\200\005\357\204\000\000\200Yi\202\005\253\204\000\000\200Pa\202\000\000\200\000\000\200\000\000\200Ca\202\000\000\200\000\000\200\000\000\200YueQueZhuHai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\256\204SapFa\202Hai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bu\202\0102\204Lie\000\000\200\000\000\200Xoi\000\000\200\000\000\200\000\000\200\000\000\200KuiFu\202|\015\204Wo\202\000\000\200Ju\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002\354\204\000\000\200\000\000\200{Z\204\000\000\200Fu\202\000\000\200\005P\204\3034\205\3034\205\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200\000\000\200\000\000\200Xi\202|\015\204\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200{\271\205Yao\000\000\200Cu\202\000\000\200\000\000\200\003\247\204Qie\000\000\200\000\000\200\004\256\204\000\000\200\000\000\200\003\031\204Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3628\204Yi\202\000\000\200z\355\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204v@\204\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\205Zuk\000\000\200\005P\204\000\000\200\372\230\205Yi\202Yi\202Zi\202Qi\202\000\000\200\000\000\200ChaYu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200yH\204\000\000\200\000\000\200DunNua\000\000\200z\367\205Lu\202Dun\000\000\200\003%\204ShiTi\202Ji\202Qiu\3055\204{x\204\000\000\200\000\000\200z\362\205Shi"; -static const char b25b[766] = "\376Yun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200ManGouCanSe\202\000\000\200z\374\204Mo\202\000\000\200\371\260\204\000\000\200Po\202YaoQu\202Ran\000\000\200\000\000\200\000\000\200Ju\202\000\000\200\000\000\200YinBaiNie\000\000\200\004\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200)\325\204yL\204Nia\006N\204\305X\205NieLi\202{\240\205KaoCe\202z\367\205|\024\204Zi\202\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202Ji\202Dam\006\351\204MauLu\202QiuDunBaoz\355\204\000\000\200Bo\202\000\000\200ChiZhe\006\351\204\000\000\200Ji\202\005\014\204\007:\204\000\000\200Wu\202Zhi\0102\204\000\000\200\000\000\200z\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mi\202FeiCuo\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SanNa\202\006\351\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\363\205HumPouDuaThe\000\000\200Yin\006\351\204\3607\204\005,\204\000\000\200z\350\204\000\000\200\000\000\200\004\272\204ZhiJu\202{\327\204\000\000\200\000\000\200\000\000\200Mi\202Gu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200|\024\204Nie\004\334\204\000\000\200Ye\202\006&\204\000\000\200Xu\202\000\000\200Xi\202\000\000\200\000\000\200Bo\202\000\000\200\000\000\200\000\000\200\000\000\200\004\256\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200\007&\204Ro\202VanDo\202Ra\202\033\257\204TreMuiXom\006&\204\000\000\200JinToiv$\204Ju\202\010\220\204Du\202\236\353\204Ye\202\0050\204Ke\202LuoWeiTu\202YouPai\000\000\200Pi\202\003x\204\000\000\200WeiChe{\240\204\000\000\200Si\202\004\334\204Sou\000\000\200\005\253\204\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200\000\000\200Ku\202\000\000\200Zhu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia"; -static const char b25c[766] = "\376\000\000\200\007H\204\000\000\200\000\000\200Cau\000\000\200DaiKe\202\302\010\205\000\000\200x\310\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202TaoXi\202\004\320\204\007:\204Lu\202Ce\202{_\204Liu\000\000\200Xi\202Ji\202Yi\202Tan\000\000\200Hu\202\000\000\200\000\000\200CuoGe\202\000\000\200ShiSao\005\335\204z\374\204\000\000\200\000\000\200Xia\000\000\200\000\000\200\000\000\200\000\000\200Mu\202Suo\000\000\200\005(\204\000\000\200Fu\202Se\202Nu\202Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\272\204\000\000\200Qin\003\006\204\000\000\200CotSaoGhi\303\204\205NoivH\204Gio)\325\204Ken\000\000\200Vo\202Hui\372\266\206DanOu\202Mo\202z\350\204ChiPai\007q\204\000\000\200\000\000\200\010I\204Lie\002\354\204KouDan\004\320\204\3628\204DanManHu\202\006z\204z\374\204\000\000\200CaoLu\202\305X\205Wu\202Man\000\000\200\000\000\200\000\000\200Zi\202\000\000\200Du\202\000\000\200\000\000\200\372\266\206Fu\202Ju\202\003c\204\000\000\200\005,\204\305`\204\305X\206z\350\204Tui\006\233\204{\207\204\003t\204Li\202\000\000\200\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\372\230\205\000\000\200\000\000\200\000\000\200\000\000\200Wai\003\217\204x\320\204x\344\204\302\313\204Ra\202Bi\202Fu\202CuiDu\202\000\000\200Zan\003\031\204Xun{}\205Ji\202z\350\204\000\000\200{\240\204\360\366\204DuoShuBu\202Xu\202\004\352\204\000\000\200Ran\000\000\200\360\350\204RuiLin{\240\204Di\202Fen\3607\204Zui\000\000\200\006\373\204\000\000\200\000\000\200\000\000\200\000\000\200\011\032\204|\015\204An\202\000\000\200\000\000\200Ce\202\003x\204\371\260\204Du\202Ti\202\003\002\204Zui{\221\205{\240\204DanDan\007\023\204\000\000\200\000\000\200\000\000\200{\334\204"; -static const char b25d[760] = "\374\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204\005P\204Zhi\000\000\200\000\000\200YouPai\302g\205MuiDauGauv\364\204\302\356\205\000\000\200\000\000\200\000\000\200y,\204Li\202Tri\000\000\200z\350\204\000\000\200SuiJu\202Ai\202Ge\202Ju\202TunBi\202QiaBo\202Hui\007H\204{\240\204\000\000\200\000\000\200Gou\011\032\204\000\000\200\000\000\200\000\000\200\000\000\200Ci\202z\350\205\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3607\204\000\000\200\000\000\200Mie\000\000\200\000\000\200\302\356\205ToiHomRayv\200\204Lak\010M\204Po\202\005\357\204JieZhuGu\202\000\000\200\000\000\200\0070\204\002\376\204\000\000\200\360\366\204QinMi\202\000\000\200\0102\204\006&\204\004\320\204\000\000\200\000\000\200Sa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\367\205\011\026\204\302g\205LatGay\011\026\204NonLiuLu\202Lu\202Zou\372\230\205\000\000\200\000\000\200Lu\202z\362\204\000\000\200\007\036\204Tuiz\350\205LinBeiPao{\221\204\000\000\200Li\202\000\000\200\000\000\200\000\000\200Ti\202Hu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ToiCoi\011\013\204\302\370\205v\364\204Dam\000\000\200HuiQu\202\003P\204\000\000\200\0050\204DieSui\000\000\200Wei\000\000\200YanYanBan\000\000\200{\240\205Ni\202Li\202Hu\202Qi\202\362?\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\031Y\204NoiYu\202DieLinLi\202\004\334\204Ji\202Ju\202\000\000\200\003\014\204\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200xD\204LieZa\202z\350\204Jie{\012\204\000\000\200\004\334\204\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Se\202Mo\202MayCu\202"; -static const char b25e[769] = "\377\000\000\200Nan\000\000\200Huiw,\204\000\000\200yP\204\000\000\200\010\220\204\003\031\204Yi\202\000\000\200\000\000\200\302\010\205\005!\204\000\000\200\000\000\200\000\000\200NanNip\000\000\200\000\000\200\000\000\200Sa\202Yue\000\000\200Di\202\000\000\200\000\000\200v$\204\000\000\200\000\000\200TheGanZan{_\204Yu\202Bo\202\000\000\200\003x\204Fan\000\000\200Yu\202\000\000\200\371\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200MieTun\000\000\200XoiLie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ba\202TamZhaPei\000\000\200Mi\202\000\000\200\305;\204Fan\000\000\200Na\202Si\202Yi\202JiaZhu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BanYu\202\000\000\200Po\202\000\000\200\036\036\204\010I\204z\362\204Can\003\002\204\000\000\200Dai\000\000\200Tan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200Mi\202Kao\000\000\200\000\000\200DoiLauYaoDui\301\357\204Bu\202Chu\006\214\204LiuBo\202\000\000\200\007\014\204Fen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004#\204{\310\205Zi\202\000\000\200DaoSen\000\000\200\000\000\200DouGe\202\000\000\200\000\000\200\000\000\200BoiXoi\303\211\205Tam\303\211\205Lo\202XoiBa\202Ba\202\000\000\200\000\000\200\005\357\204Xi\202\000\000\200Ni\202\003c\204\003c\204\000\000\200\000\000\200\000\000\200\000\000\200\004\320\204\000\000\200\000\000\200Dim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\327\204Ji\202\000\000\200Qu\202\000\000\200OanXepComAa\202\302X\205\301\232\204Ia\202\000\000\200\000\000\200\000\000\200\000\000\200Kai\000\000\200\000\000\200z\374\204\000\000\200He\202\000\000\200Lin\000\000\200Zi\202\000\000\200\000\000\200\000\000\200Ou\202Cu\202\000\000\200\000\000\200\000\000\200\000\000\200Cha\217s\204Me\202Nam\000\000\200\000\000\200\362?\205Bu\202No\202DeoMay\303\211\205Day\004\320\204Xi\202Sa\202z\374\204Se\202\003+\204\000\000\200FanZhi\000\000\200Cui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200\000\000\200BunCheKheNepU\000\201CutNuoLi\202"; -static const char b25f[754] = "\372Zu\202\000\000\200CuiZe\202\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LepMan\000\000\200Qi\202\000\000\200\004\334\204CuiPu\202\000\000\200FanTan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zi\202Zu\202\003c\204\006N\204LinTan\000\000\200\000\000\200KeoHamU\000\201\000\000\200\000\000\200Shi\000\000\200\000\000\200\000\000\200CuiZi\202Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200\000\000\200\302g\205\000\000\200\000\000\200Cam\003\014\204\000\000\200\000\000\200CimGaoComHemz\374\204{\240\204\000\000\200Fen\000\000\200Men\000\000\200\000\000\200Li\202Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200You\000\000\200\302\274\204x$\204\000\000\200XiaHuo\000\000\200Qu\202\000\000\200XayDuc\000\000\200{\327\205\000\000\200\000\000\200\000\000\200Mi\202\000\000\200\000\000\200Qi\202\000\000\200w@\204He\202\000\000\200{\207\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zuo\000\000\200\000\000\200\005\357\204Men\000\000\200Zhu\000\000\200\003\025\204\000\000\200\000\000\200Ji\202\007\357\204JieGan\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\003c\204\000\000\200Wu\202\000\000\200DiuSoi\000\000\200\007\277\204Cu\202\000\000\200Mie\000\000\200\000\000\200\000\000\200Xun\000\000\200Zhi\3621\204\000\000\200\000\000\200Fu\202Hu\202\000\000\200\000\000\200\000\000\200Di\202\000\000\200Jue\005,\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\274\205\000\000\200\000\000\200\000\000\200\002M\204\000\000\200\000\000\200\305`\204Benx\030\204NgoVit\303\033\205TimNa\202Di\202ShiCi\202Shu\000\000\200Wa\202CheFan\000\000\200Gu\202\007:\204\000\000\200\000\000\200{\012\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200xL\204\000\000\200\000\000\200Qie\000\000\200{\221\204DaiShe\000\000\200BuaNi\202\305`\204\010I\204yL\204Soi\003c\204z\374\205\305;\204Zi\202z\362\205Mi\202\000\000\200Xi\202ZhiPaiDuo\000\000\200\000\000\200\000\000\200Ci\202Mou\000\000\200\010I\204\000\000\200Yi\202Gou"; -static const char b260[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200yT\204\000\000\200\0050\204\000\000\200\000\000\200Dai\302\363\205Nhox\264\204yX\204w\030\204z\355\205v@\204\000\000\200\010\243\204\0102\204Ye\202Jiey\134\204Pi\202\000\000\200\301\333\205Sha\372\230\206z\343\205\000\000\200\000\000\200LiuYu\202\000\000\200Ju\202\000\000\200\000\000\200\000\000\200\000\000\200Nuo\212\346\204Va\202Yem\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\351\204\301\321\205\000\000\200\000\000\200Mao\302g\204Xe\202CuiNoiKeo\010\314\204VaiBoiy`\204Ban\000\000\200{x\204So\202\372\230\205{\327\204\006\237\204JieHua\000\000\200\000\000\200XinZuoYanJue\000\000\200\000\000\200\000\000\200\000\000\200Hu\202\003c\204She\000\000\200Yan\000\000\200XieDie\000\000\200\000\000\200{x\204\000\000\200\000\000\200z\355\205Go\202Nim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204Ji\202\000\000\200\000\000\200\301\321\204\005\335\204\006\351\204Ro\202MonNitMay\303\033\205UngGo\202Da\202Doi\000\000\200\005P\204Kai\003g\204Hui{\240\204\003c\204ZhaFu\202Chi\005\005\204Nuo\000\000\200\000\000\200\000\000\200Ji\202z\350\204\000\000\200WanOu\202Bi\202\010\016\204\000\000\200\000\000\200\000\000\200The\000\000\200\000\000\200\000\000\200\000\000\200\0050\204Ye\202\000\000\200\000\000\200\0102\204Dam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Uomyd\204w,\204DotDetx\030\204\005\020\204\000\000\200\000\000\200\000\000\200Fei\000\000\200\000\000\200Li\202\000\000\200\000\000\200Li\202Pi\202\000\000\200\000\000\200\000\000\200\000\000\200Tao\000\000\200SuiLiuHe\202HunTan\010\016\204ZhiBo\202\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200Po\202Qun\000\000\200Mu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GaiToi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003]\204yd\204Vai"; -static const char b261[748] = "\370Ma\202\302g\204Dai*\015\204\301\357\204DetMayNit\301\314\205\000\000\200Qi\202\005,\204Nie\372\266\206\000\000\200\360\366\204KunSui\000\000\200DouDie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200Van\000\000\200Nut\301\376\204\000\000\200\303\235\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\372\230\205Guo\000\000\200\000\000\200\000\000\200\005\020\204DutRia\302\205\205v\214\204\010I\204\010\314\204\301\357\204Xu\202Qu\202Voc\000\000\200Xun\000\000\200\000\000\200\003\002\204Zhe\000\000\200\3607\204\010\230\204\005\005\204\000\000\200Suoz\350\204\000\000\200\000\000\200\000\000\200Xu\202\000\000\200Xun\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\000\000\200ManJauCamCyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DuiTan\302v\205Dumw\030\204Vot\000\000\200Vo\202SuiLa\202Zhu\003c\204\000\000\200Li\202\000\000\200DanJu\202\000\000\200Yunz\355\204Luo\000\000\200\000\000\200Se\202\000\000\200{\207\204\000\000\200\010k\204\000\000\200\000\000\200Lai\372\266\206Qie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DouSoiNeo\000\000\200\000\000\200\000\000\200Wu\202\006\205\204\000\000\200Ji\202\000\000\200\000\000\200Chi\000\000\200Ni\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200CyuFaiBan\000\000\200\000\000\200Liu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YaoDui\033h\204La\202\000\000\200\000\000\200Lu\202\000\000\200SuiFu\202\000\000\200\000\000\200LeiWei\000\000\200w@\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200\000\000\200\000\000\200Roi\000\000\200Li\202\000\000\200Pin\000\000\200JunJu\202\000\000\200La\202\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200Mie\000\000\200Yao\303\362\204\2570\205\000\000\200\000\000\200\006&\204Si\202\000\000\200\000\000\200Si\202\000\000\200\000\000\200He\202"; -static const char b262[769] = "\377\000\000\200\000\000\200vP\204\006\220\204\000\000\200Die\000\000\200\000\000\200CheYun\000\000\200XiuShu\000\000\200z\355\204Min{\207\204Yin\003g\204WeiGu\202TouTa\202FeiDa\202NieCu\202ZuoJie\003P\204Bo\202JinYinXu\202\000\000\200Yu\202{s\205\000\000\200Qi\202Bei\003g\204\003=\204\000\000\200\000\000\200Zui\000\000\200\000\000\200\000\000\200Jie\000\000\200Kai\000\000\200\000\000\200\003g\204BeiShuYu\202\000\000\200\003c\204{\221\204\000\000\200v<\204\000\000\200\000\000\200\000\000\200\000\000\200\362?\205\000\000\200\000\000\200\000\000\200Cha\000\000\200\257\320\204Liu\000\000\200\000\000\200\000\000\200\000\000\200Sui\000\000\200Zhu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303u\205\303\362\204\000\000\200\000\000\200\000\000\200Xin\000\000\200Ya\202\000\000\200\010}\204\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200Ya\202\000\000\200\000\000\200Sei\000\000\200\005P\2044\000\201\000\000\200\000\000\200\000\000\200Bay\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Di\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pi\202Hu\202Cen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200|\015\204Mou\007q\204\000\000\200Mou\000\000\200Ju\202Liu\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200LiuHu\202Gu\202BonTu\202\000\000\200\000\000\200\000\000\200Gu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202Hu\202\000\000\200\000\000\200E\000\201\003=\204Gu\202\000\000\200\000\000\200\000\000\200\000\000\200Gua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lue\000\000\200FanLu\202\006\205\204Fu\202Liu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XieGu\202\000\000\200z\374\204Bo\202\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\005\304\204\000\000\200\000\000\200\301\357\204Lu\202Bay\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\016\204\000\000\200\000\000\200MouYu\202Han\000\000\200\000\000\200Ra\202\000\000\200\000\000\200YueDan\000\000\200\000\000\200\000\000\200\000\000\200Yu\202{\240\204\000\000\200\000\000\200\006\025\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cao"; -static const char b263[769] = "\377\371\260\204Liu\000\000\200\000\000\200\000\000\200\000\000\200\003\002\204\000\000\200\000\000\200Su\202Su\202\362?\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006z\204\000\000\200\003P\204Lu\202\000\000\200Ji\202\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200MinTi\202\000\000\200\000\000\200\000\000\200z\362\204\000\000\200\000\000\200Yi\202Tan\000\000\200Wu\202\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\006\327\204\000\000\200Du\202Kun\000\000\200Jun\000\000\200\000\000\200\000\000\200\000\000\200ShiNanPo\202\000\000\200\000\000\200Shu\301\357\204\000\000\200\000\000\200\000\000\200La\202\000\000\200Me\202Ren\000\000\200\000\000\200Fen\000\000\200{\322\205Ta\202Tun\000\000\200\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\220\204\000\000\200\000\000\200\000\000\200\000\000\200Lik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DuoCi\202\000\000\200Gu\202Fen\000\000\200\000\000\200Rou\000\000\200\000\000\200\000\000\200Gaoz\374\205\000\000\200z\374\205Hou\000\000\200Tao{_\204\360\350\204Zi\202\000\000\200\007:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Su\202\000\000\200\000\000\200\305X\205z\374\205\000\000\200Ban\000\000\200Man\301\345\204Fu\202La\202Li\202\000\000\200JieYou\000\000\200\000\000\200\000\000\200\000\000\200Yu\202\000\000\200Chi{\367\205\305X\205Yi\202{_\204\000\000\200\000\000\200yh\204Ji\202Yan\000\000\200\000\000\200Wu\202\256\371\204\006\351\204\000\000\200\000\000\200\000\000\200,u\204Fu\202JiaGouGu\202Jia\000\000\200\000\000\200\000\000\200z\374\204\000\000\200JinZi\202Lou\000\000\200\000\000\200Gou\000\000\200Sai\000\000\200Ren\000\000\200{_\204\000\000\200DomJue\3628\204You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200yl\204Bon{\240\204Du\202\000\000\200Hu\202\000\000\200\000\000\200\000\000\200SaoYu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mai\000\000\200ZhiYanGao\000\000\200\006\333\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200\360\350\204\000\000\200Zui\000\000\200Jik\000\000\200\3621\204Yi\202Yan\005\335\204Yu\202\000\000\200\000\000\200\000\000\200Chi"; -static const char b264[769] = "\377\000\000\200ChiJik\000\000\200\004\272\204Se\202Pa\202Ta\202FenChi\000\000\200\000\000\200\005\335\204Xue\000\000\200\000\000\200ManCi\202\007\032\204\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200Qu\202\000\000\200\000\000\200\000\000\200\000\000\200Xi\202Fu\202\000\000\200ShuHai\000\000\200Po\202\000\000\200Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\020\204\000\000\200\000\000\200\005\335\204\000\000\200\000\000\200\000\000\200\000\000\200Pao\371\260\204\3621\204\000\000\200\000\000\200\003P\204Ci\202\005P\204Po\202\000\000\200\000\000\200w\250\204\000\000\200\302\212\204\000\000\200Ta\202Cha\000\000\200\007H\204Zu\202HuoXu\202Yan\005\020\204\000\000\200Tuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\330\204z\374\204\003P\204Houz\362\204Ge\202z\367\205Bi\202\005\335\204\005\335\204Chi\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zha\000\000\200\005(\204Ta\202\000\000\200\000\000\200Po\202Ta\202\000\000\200YouFu\202Ci\202Da\202Ta\202\000\000\200Liu\000\000\200\000\000\200Ci\202\000\000\200\005\335\204WaiHanLa\202\000\000\200ShiJap\000\000\200\000\000\200\000\000\200\3628\204HuiHe\202PieYu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cin\000\000\200\000\000\200\000\000\200z\374\204Han\000\000\200Po\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200La\202Huo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200Tai\000\000\200\000\000\200\000\000\200LaoKhuShuBou\000\000\200SauDao\3607\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gia\000\000\200Khu{s\205Lu\202Coi\305`\204\000\000\200CheNai\000\000\200Jue\000\000\200\000\000\200Er\202Er\202Nu\202Nu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lau\372\230\205\000\000\200\000\000\200\000\000\200Ma\202Nuo\000\000\200LieLei\000\000\200Ba\202\000\000\200\000\000\200\000\000\200\000\000\200{x\205\000\000\200\000\000\200Gui\301\357\204Ge\202\000\000\200\003=\204\360\366\204\000\000\200\000\000\200\000\000\200\000\000\200Lai{Z\205Yi\202GunWeiLunCay"; -static const char b265[763] = "\375\000\000\200\000\000\200Shi\004\377\204\371\260\205Tu\202Bi\202\000\000\200Ze\202\362?\205\000\000\200\006N\204Qi\202Fu\202Ce\202\000\000\200\000\000\200\000\000\200Zi\202Li\202Man\000\000\200{\207\204\003t\204\000\000\200Cay\000\000\200\305X\206Yi\202\000\000\200\000\000\200\000\000\200Pai\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\005\271\204\000\000\200\000\000\200\003t\204\000\000\200ChiQu\202Mo\202ZheShaSha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yao\003=\204Nai\000\000\200\000\000\200Xie\000\000\200\000\000\200|\015\204\000\000\200\000\000\200\000\000\200\006\251\204\000\000\200\000\000\200Ye\202\000\000\200MiuSha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sao\000\000\200\000\000\200\3607\204Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200yp\204\005\335\204\371\260\205\005P\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duo\000\000\200\011\007\204Lau\000\000\200\006z\204\000\000\200\005\335\204Li\202\000\000\200z\374\205\000\000\200\000\000\200\371\260\204\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BitYan\305`\204Qi\202Duo\000\000\200Huaz\350\204\000\000\200Xie\302\034\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ci\202\371\260\205\000\000\200Simx\374\204Er\202\000\000\200\003g\204\000\000\200TuiYan\000\000\200Lie\000\000\200\000\000\200Mi\202Jyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004#\204\000\000\200Zi\202TaiHu\202\004\377\204{\207\204Da\202|\015\204|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006N\204\000\000\200Ai\202\000\000\200\005\230\204Ai\202ZheGuoLu\202\002\376\204Mi\202\006z\204Zhe\000\000\200\000\000\200\000\000\200Qu\202\006&\204LomGhe\005P\204\000\000\200Tan{\221\204Hu\202\000\000\200Pie\000\000\200Da\202\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200\000\000\200\000\000\200\006\220\204\010\220\204\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ju\202Er\202x\374\204"; -static const char b266[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200GuoWai\000\000\200\000\000\200\000\000\200\000\000\200Nie\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SiuVe\202\000\000\200Pi\202Chi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200VocPi\202Yi\202Du\202Wa\202Xun\000\000\200Qi\202{_\204\000\000\200\000\000\200Xu\202\000\000\200\000\000\200He\202Pan\000\000\200Pei\000\000\200{s\205\000\000\200ChiTanZui\010k\204Qi\202Du\202\000\000\200\000\000\200\000\000\200x\134\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3055\204\000\000\200\000\000\200Na\202Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MocMao\005\335\204Tim\010I\204Yi\202\000\000\200\000\000\200{Z\205\000\000\200\000\000\200Ju\202Dai\000\000\200San\000\000\200\000\000\200ZhuWanGu\202\000\000\200SanBanJiaMaiCi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tuo\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200\372\230\206Tuo\000\000\200\000\000\200\0102\204\010I\204Cam\010\022\204Top\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\260\204{\202\205Yi\202\000\000\200XieYueHen\000\000\200Hou{Z\205\256\371\204ShiWa\202\000\000\200Xie\000\000\200\360\234\206\000\000\200Jan\000\000\200Lou\000\000\200\000\000\200\000\000\200Sai\000\000\200\000\000\200\007\277\204\007\277\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200\000\000\200\000\000\200Deoz\367\204Gatyt\204Tai\000\000\200Ku\202Na\202\000\000\200\000\000\200Ju\202\003P\204Qu\202CheLu\202He\202\371\260\205Nan\000\000\200He\202ChaYan\007\277\204Nie\000\000\200GuoYan{\012\204\000\000\200\000\000\200ZhiLao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202Qi\202Qu\202Jue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bet\302\205\204\002\354\204y\014\204Nuc\006\351\204"; -static const char b267[769] = "\377Phi\003\014\204\000\000\200Xu\202Tui\000\000\200HanKu\202\000\000\200\000\000\200\371\260\204Zhi\000\000\200\003\247\204{Z\205Li\202Wan\000\000\200FanXin\000\000\200\000\000\200Ya\202\000\000\200Vu\202\000\000\200\000\000\200Ju\202\371\260\204\000\000\200Ron\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\351\204\000\000\200Tun\004\334\204Xi\202Yin\0050\204Tun\000\000\200\000\000\200\007\277\204Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KeiDitRom\010\314\204x$\204SanDit\302\217\204De\202\3034\204MunMepSanyx\204\372\230\205\000\000\200\000\000\200Tie\000\000\200Zhi\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\004\377\204Wei\000\000\200z\362\204\005P\204z\355\204LuoJimKuiQiaBanChaTuoNanJie\000\000\200Yan\000\000\200Tu\202\000\000\200Wen\000\000\200\006&\204\000\000\200\000\000\200Xu\202Yin\000\000\200\000\000\200\005\005\204\000\000\200\302\212\204May\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200ZaiDa\202\000\000\200\000\000\200\000\000\200NieJu\202Hou\000\000\200\000\000\200\000\000\200\007\277\204Cay\360H\205Oi\202x\134\204VoiDayx\020\204\303C\204HouKan\003=\204\000\000\200HuiXie\000\000\200\000\000\200Xi\202HanMi\202\000\000\200\006Z\204HunSaoXinZheHuo\000\000\200\003=\204\000\000\200\000\000\200SaiJinWa\202\000\000\200\000\000\200\000\000\200DuiChi\007\252\204Jim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200Mi\202\006a\204\010\230\204\000\000\200\000\000\200\000\000\200\000\000\200Comw\300\204Bo\202ZinGayy|\204KhuMa\202Ia\202\301\345\204TunZhiWenMo\202NemYinTun\000\000\200z\367\205Ze\202\000\000\200\3621\204Mo\202Cu\202\000\000\200\000\000\200\303\362\204Xiu\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\302\212\204\000\000\200\000\000\200\000\000\200z\362\205\000\000\200ZhaSuoHunJu\202\000\000\200BeuNemBoi\023y\204Lon\303\216\205NacBe\202MatKhuDui"; -static const char b268[766] = "\376\000\000\200Cu\202\000\000\200\000\000\200Ji\202XunSun\007\177\204\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\003t\204\000\000\200\000\000\200\000\000\200JueLi\202\000\000\200\000\000\200Pao\000\000\200Vai\000\000\200\000\000\200Za\202Ye\202\000\000\200Bi\202ZheZhe\000\000\200JiuZhe\000\000\200\000\000\200Shu\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\301\225\204Vacy\200\204U\000\201\302X\204CamRoiSeoXu\202Naiz\374\204GunWei\000\000\200VoiJi\202Sa\202\000\000\200\000\000\200\004\352\204NuoDu\202{Z\205Ku\202\000\000\200\000\000\200\305;\204\000\000\200Ron\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BaoHui\000\000\200\000\000\200\004#\204\000\000\200\000\000\200\000\000\200\000\000\200Gam\005\275\204\007\023\204wD\204RauBam\256\371\204\023y\204\004\352\204\000\000\200San\000\000\200\005\326\204Yi\202CamYu\202PouDit\000\000\200Yao\006\373\204\000\000\200\004\320\204HunLomDui\000\000\200Qi\202\004\377\204\002\354\204\006\373\204z\362\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200xP\204\000\000\200\004\377\204\000\000\200Ji\202MatBao\000\000\200Duk\000\000\200{\012\205LeiZun\000\000\200\000\000\200Mak\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\204\000\000\200\000\000\200\000\000\200\000\000\200Cho\303\223\205\010\314\204NocNoc{\240\204\000\000\200\000\000\200\000\000\200\006\205\204\000\000\200\3621\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xin\000\000\200Li\202\000\000\200VaiLotRomDuiMa\202\000\000\200\000\000\200\006\214\204\000\000\200\000\000\200\000\000\200GayWeiNa\202\000\000\200\003\247\204\000\000\200Lei\000\000\200\000\000\200Luo\000\000\200\000\000\200\000\000\200\006\337\204\000\000\200\007\277\204Nan\006\337\204\000\000\200\000\000\200Qu\202\000\000\200\000\000\200x\204\204LuovP\204\006\220\204\006\220\204\000\000\200LuoYueJi\202Ji\202\000\000\200\000\000\200\000\000\200\3055\204\000\000\200\000\000\200Mi\202\305`\204Ce\202{\240\204\305`\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JiaNamZak\000\000\200\000\000\200z\362\204\000\000\200\000\000\200\000\000\200{\207\204Zi\202Bai\002M\204\000\000\200\000\000\200Wan"; -static const char b269[763] = "\375\004\320\204\000\000\200Shu\000\000\200\000\000\200\000\000\200\000\000\200GuiXi\202\000\000\200Ru\202Yao\000\000\200\000\000\200Gao\000\000\200\000\000\200Gou\000\000\200\000\000\200\000\000\200Yue\000\000\200\000\000\200\003]\204Wa\202Bo\202\000\000\200\000\000\200\000\000\200\000\000\200XinHoi\000\000\200Pi\202Bo\202\000\000\200\000\000\200Hai\005(\204Wo\202\000\000\200Ye\202Bi\202HaiLetvH\204v|\204y\204\204\301\232\204\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200ChiZi\202\000\000\200Zhi\000\000\200Ni\202Den\000\000\200\000\000\200Wu\202Ai\202Den\000\000\200\000\000\200\000\000\200\303\254\204Ai\202Yu\202Chi\000\000\200\000\000\200\0050\204ZhiZhiZhiJu\202\000\000\200\000\000\200\000\000\200\000\000\200Han\000\000\200\000\000\200\000\000\200\0102\204\007\322\204\000\000\200Yao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200You\0102\204\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZuoPo\202\000\000\200Xue{\202\205Yi\202Po\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003p\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202QiuCou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yao\000\000\200\000\000\200\000\000\200\000\000\200Fen\000\000\200\000\000\200\000\000\200Xia\000\000\200{\240\205ChaKyo\000\000\200\3621\204Cha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\205Cui\000\000\200\000\000\200\000\000\200{}\205JimYu\202\000\000\200Yu\202\000\000\200\000\000\200\000\000\200Wen\000\000\200ChaYu\202\000\000\200\000\000\200\005i\204\000\000\200\000\000\200\000\000\200ZuoDao\000\000\200\000\000\200\007q\204Dao\004\377\204\000\000\200\003\014\204\000\000\200Lau\000\000\200\006Z\204\000\000\200\000\000\200JinQi\202\000\000\200Qin\000\000\200Kuo\000\000\200Tanz\374\204\000\000\200|\015\204\000\000\200Kuo\000\000\200|\015\204\000\000\200Hu\202Zhu{\221\204Ta\202w\330\204|\015\204Ta\202Ta\202HuaYanTie\000\000\200TieTa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\333\204\000\000\200JiaQi\202\000\000\200Ta\202Loe\000\000\200TanHua\000\000\200wl\204\372\230\205Hua>3\204\000\000\200Lanw\330\204"; -static const char b26a[757] = "\373\000\000\200\000\000\200Mua\000\000\200\000\000\200\000\000\200ZunYi\202Fu\202Wu\202\000\000\200Fu\202\000\000\200\003x\204Ta\202\000\000\200\000\000\200\005\020\204\000\000\200\000\000\200\000\000\200\000\000\200\010I\204\000\000\200\000\000\200Ri\202\301\357\204\000\000\200Ge\202\000\000\200\000\000\200\000\000\200\000\000\200Fu\202Di\202\005,\204\003]\204\000\000\200Jia\000\000\200\000\000\200\003\031\204\000\000\200\000\000\200\003]\204Pi\202DoiHuo{}\205\000\000\200FanWu\202\3628\204\004\272\204\000\000\200\000\000\200Tan\000\000\200\000\000\200\360\264\206\000\000\200\000\000\200\005\313\204\000\000\200\000\000\200\000\000\200\241z\204\000\000\200\007\036\204\000\000\200\000\000\200\000\000\200\003c\204\000\000\200\000\000\200BaiXieDao\000\000\200Jin\000\000\200Loi\000\000\200\000\000\200\000\000\200Hu\202Bei\000\000\200\003x\204\000\000\200MuiGu\202NuoWeiYu\202\000\000\200\003g\204Fu\202z\374\204Qi\202Tu\202\000\000\200\000\000\200Ji\202\000\000\200\004\377\204\000\000\200\005\262\204WeiXi\202\000\000\200Pai\301\364\205\371\260\205YouGiaAi\202{\240\204\000\000\200GouRuo\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200Sha\005!\204\000\000\200Do\202\007\023\204\000\000\200\000\000\200\000\000\200Lu\202Ao\202\000\000\200Qi\202Xiu\000\000\200Dai\000\000\200\302\205\205\007\023\204Fa\202Wei\000\000\200Dun\006z\204Fanz\362\205JueTa\202ZunRaoCan\005\326\204\000\000\200\000\000\200HuaXu\202\000\000\200{\221\204\000\000\200\000\000\200\301\364\205Ganv,\204\000\000\200\006\260\204CanXieDa\202\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200GheLi\202\000\000\200\000\000\200Pan\000\000\200\360\264\206Ghe\003\031\204Li\202Xi\202\005\326\204\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200Li\202Ran\005\357\204\000\000\200\000\000\200\000\000\200Gun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Po\202Mo\202Pai\000\000\200BotBa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wa\202Ang\000\000\200\305;\204MinXun\006\205\204\000\000\200\000\000\200\007\230\204\000\000\200\000\000\200\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200Gai"; -static const char b26b[745] = "\367\000\000\200CaiWu\202ZheRenKou\000\000\200\000\000\200\000\000\200\000\000\200Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200No\202\000\000\200Jau\002\376\204\362?\205QiuGuo\003=\204Pu\202Hu\202\003+\204\000\000\200\000\000\200|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\305`\204\000\000\200\000\000\200\000\000\200\000\000\200Cek\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ngo\000\000\200ZhuDa\202{s\205Na\202\000\000\200\000\000\200\007q\204\000\000\200\000\000\200{\327\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hu\202Sha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cik\005P\204\007H\204Sai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200CinZhi\000\000\200\000\000\200Ta\202\000\000\200Si\202\000\000\200\000\000\200\000\000\200Yi\202TroTup\000\000\200\000\000\200\005\204\204\000\000\200\000\000\200{}\205ZhiLu\202Ru\202\000\000\200Qi\202Yu\202\003c\204\360\350\204z\374\204Mou\004\320\204HuiJiuJiu\007\335\204\000\000\200\000\000\200\000\000\200\000\000\200\003\002\204Si\202\007\230\204\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202Pu\202\000\000\200\000\000\200\000\000\200\000\000\200Jau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005I\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200Re\202KeiNen\000\000\200WenBeiYi\202Fu\202Si\202\007q\204Ji\202\000\000\200Ni\202\000\000\200Ben\000\000\200\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200QinBo\202\000\000\200\000\000\200\305`\204Zhe\000\000\200Wo\202\360\366\204Zao\360\350\204\000\000\200\000\000\200\007\023\204Nie\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cu\202z\350\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204ZhiShe\000\000\200\000\000\200Zhi\006\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Miu"; -static const char b26c[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005,\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wo\202\000\000\200ZhiBi\202\000\000\200Fen\000\000\200\000\000\200\000\000\200\302\200\204OngNa\202NuaDayLau\006l\204Cai\000\000\200\000\000\200\011\000\204QiuNi\202Bo\202Dun\000\000\200ShiXu\202z\355\205Xu\202Ye\202Mi\202\000\000\200\000\000\200\000\000\200Xin\004\334\204Fu\202\000\000\200\000\000\200Pi\202Xue\000\000\200Yu\202z\374\204Yu\202Yu\202Gu\202Ju\202Ta\202\006\237\204\000\000\200\000\000\200{Z\205\006\205\204\006\025\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mu\202Xi\202Bi\202\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200\000\000\200\000\000\200Jiu\000\000\200\000\000\200Gou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ChiJiuJiu\000\000\200\000\000\200Sha\000\000\200Fei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0102\204DiuJi\202\000\000\200\003\217\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200WanXu\202Bo\202\000\000\200\000\000\200\000\000\200\255\377\205\000\000\200LeiJyuRa\202Sa\202RomNgoJanx\330\204La\202MuiHao\000\000\200Xie\003I\204Yu\202Yan|\015\204Pi\202\000\000\200Shi\005\271\204Ji\202\000\000\200\000\000\200ZhaNaiMou\000\000\200Fu\202Du\202\000\000\200\000\000\200\371\260\205ChaTreChiGuiMin\005!\204Baiz\350\205\000\000\200\004\334\204WeiXun\000\000\200\005\014\204ZaiYou\000\000\200You\000\000\200{_\204He\202Lu\202ZhiShu\000\000\200\000\000\200\0050\204{Z\204\000\000\200\000\000\200\006\205\204You\000\000\200Wo\202Ba\202\000\000\200\000\000\200\007q\204Ru\202Cou"; -static const char b26d[769] = "\377Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{}\205\000\000\200Hu\202\360\350\204\005I\204JunSheKou\000\000\200\000\000\200z\350\204\000\000\200\000\000\200\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\036\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ci\202Ji\202\0050\204\236\353\204\007\341\204Fei\261\246\204\236\353\204Nei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004#\204Nie\003\217\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ke\202Sa\202x\250\204Nu\202DotRay\000\000\200\000\000\200ChiHe\202{s\205\000\000\200Hun\000\000\200\000\000\200Di\202\005\230\204\000\000\200ZaoCe\202SuoZu\202Sui\000\000\200Xia\000\000\200Xie\000\000\200\000\000\200JieYou\000\000\200Gou\007\277\204\000\000\200\000\000\200\000\000\200Junz\362\205Ji\202PouWu\202\000\000\200Yi\202\000\000\200\000\000\200Nai\000\000\200\006N\204Nan\000\000\200\0102\204{_\204\005,\204Ji\202HuaDui\006\237\204Ta\202\000\000\200\005\335\204\000\000\200Shu\000\000\200\000\000\200\000\000\200\005\313\204Fen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GanHou\005\335\204Lit\251|\204\000\000\200\000\000\200{\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200\000\000\200Kou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\327\204\000\000\200\000\000\200HaaChu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\350\205\000\000\200CheBom\004\365\204HoiBi\202CoiNgoMaiFau\000\000\200Xi\202Hu\202\007\023\204Wo\202\000\000\200HaiRu\202\006\205\204\000\000\200San\000\000\200Wu\202DayYou"; -static const char b26e[649] = "\327KeiTan\371\260\204\000\000\200\000\000\200KauQi\202!M\204GuoQiaz\374\204\000\000\200\000\000\200\000\000\200\000\000\200SuiLu\202\000\000\200Ji\202Qi\202\005,\204\000\000\200\000\000\200Qi\202JiaYouXi\202\010I\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mi\202LouBi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pei\000\000\200\000\000\200\000\000\200{Z\204\371\260\204z\355\204Fu\202\000\000\200\000\000\200\000\000\200\000\000\200Qu\202Si\202\000\000\200\000\000\200Zui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BouFauSiu\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002\376\204\000\000\200\000\000\200CoiCo\202Mam\003\226\204Wanw\134\204BimCo\202VoiPuiDenv\240\204RacDam\000\000\200Pi\202\000\000\200\000\000\200Cou\000\000\200\000\000\200\000\000\200\004\340\204\000\000\200GaoDu\202\241z\204Fu\202{\012\204SaoSou{\240\204Pou\000\000\200Can\005\005\204Mou\002\376\204\3621\204\000\000\200Ju\202Shu{\240\204Li\202\000\000\200\305X\205Lao\000\000\200He\202Hu\202Gu\202{\221\205Jiez\374\205\000\000\200Du\202HanJiaz\374\205Ji\202Shu\005\230\204Ji\202{_\204\000\000\200\000\000\200TaoZi\202\372\266\205\000\000\200Ji\202ChuJi\202\371\260\204Lin\006z\204\000\000\200San\000\000\200An\202\005\253\204\000\000\200Ti\202Dan\000\000\200z\362\204\000\000\200Sa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\252\204\010\002\204Mouw\314\204FeiJan\277\367\204\303\254\204"; -static const char b26f[673] = "\337\000\000\200\000\000\200\000\000\200\010\230\204\000\000\200\000\000\200RuiWu\202Ju\202z\362\204\006G\204Lu\202\000\000\200\000\000\200Tan\010\243\204\000\000\200\000\000\200\000\000\200z\350\204Leu\000\000\200\000\000\200Xi\202\000\000\200\000\000\200LumSanSanNauDuawH\204\007&\204Ci\202She\000\000\200\000\000\200Dua\010*\204Sa\202Cu\202\000\000\200MaoQu\202\000\000\200Bo\202GanZukQie\007q\204\010\220\204z\355\205\360\350\204He\202\000\000\200Ji\202\000\000\200\002\354\204\000\000\200Mei\000\000\200\000\000\200\000\000\200DunAo\202\0050\204Lu\202\003+\204\3607\204He\202\000\000\200{\240\204\000\000\200\000\000\200HuaGou\000\000\200\000\000\200Lu\202Fu\202Hui\000\000\200Zei\000\000\200JinSi\202Qun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200Wan\303\362\204\000\000\200\000\000\200\000\000\200\000\000\200Jia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DanJiuz\374\204Bo\202\000\000\200\302!\205\000\000\200\000\000\200Jyu\007H\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\003t\204\000\000\200\000\000\200\000\000\200Po\202\000\000\200\000\000\200SaoBeiShaWei\000\000\200\010:\204Lu\202\303\355\204DuaMeiRamv\364\204Do\202v4\204\000\000\200\000\000\200\000\000\200Dan\000\000\200Gu\202Za\202\006l\204Gan\000\000\200\000\000\200\010I\204Ji\202Lie\000\000\200{}\205{\240\204Lu\202\0070\204\011\032\204YaoYin\000\000\200Ta\202Yao\0050\204ChuFu\202\007:\204\360\366\204\000\000\200\002\354\204\010\220\204Shi\000\000\200\000\000\200Lu\202QieLuoPo\202\000\000\200\006\205\204Jie\000\000\200\000\000\200Ji\202\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005i\204Ji\202"; -static const char b270[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200z\355\205Mie\006\205\204{\240\204\000\000\200\000\000\200Cai\000\000\200Su\202\000\000\200Gou\007&\204Goi\301\345\205NonRu\202He\202Sa\202\000\000\200Zi\202\007\243\204\007\277\204Si\202\000\000\200Sam\000\000\200w\274\204DayTi\202{\221\204Xie\3055\204ChiYouLu\202\006\205\204LieSi\202\000\000\200\000\000\200Xi\202FanFu\202\371\260\204Ti\202\005\020\204Yue\000\000\200Fu\202{\240\204Di\202\000\000\200\000\000\200ZheXieDan\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200NieFan\006\205\204Min\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\303\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\210\204Vo\202\301\333\204Khov4\204Khoy\214\204\000\000\200\000\000\200\000\000\200LouDu\202\000\000\200{\221\204{\240\204HanDanSen{\240\204Tan\003\002\204Po\202\000\000\200\0102\204\000\000\200\372\230\205\000\000\200\006z\204Zi\202\000\000\200\004\334\204\000\000\200Hu\202\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\006\205\204Ju\202Miez\374\204\000\000\200Kui\006\205\204{\240\204\000\000\200\000\000\200\000\000\200Nou\000\000\200Di\202Sao\000\000\200\000\000\200\000\000\200\000\000\200\007H\204Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DuaRap\007\042\204\000\000\200ChuZhiz\350\204Lu\202\000\000\200\004\334\204\000\000\200\000\000\200\000\000\200ZuoHanSuiGou\000\000\200\004\320\204Ji\202Yi\202Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NouNi\202Ruo\000\000\200\000\000\200\000\000\200Lin\000\000\200\007\042\204\006\373\204\000\000\200\000\000\200\000\000\200\010\220\204\302\236\205\303\230\205Fai\000\000\200\000\000\200\000\000\200\000\000\200Ung"; -static const char b271[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Reu\004\371\204Han\000\000\200Dan\006\214\204YaoFu\202\372\266\206KuiQu\202\004\352\204Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202Ju\202Rui\000\000\200\000\000\200\000\000\200Zha\000\000\200\000\000\200\000\000\200\3621\204\000\000\200FukWan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mo\202y\220\204\302\200\205Rap\000\000\200\000\000\200MenShi\3607\204Li\202\005\262\204Zan\000\000\200LuoCan\000\000\200\000\000\200Ao\202Gi\202\000\000\200{\240\204\000\000\200\005,\204\000\000\200\000\000\200\004\377\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200RapYi\202\010\220\204Nou\000\000\200Yue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bou\004\340\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200RacMen\302\236\205Li\202Li\202Hu\202\000\000\200You\000\000\200\000\000\200Pan\000\000\200\000\000\200\000\000\200\000\000\200\006\220\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\204\000\000\200\302\262\205\000\000\200\000\000\200\000\000\200\000\000\200\003\014\204Bie\000\000\200\000\000\200\000\000\200\000\000\200ManGanHuo\000\000\200Cu\202\000\000\200You\000\000\200\000\000\200You\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200Xu\202Hu\202Lu\202\000\000\200XiaYi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hu\202Hu\202Zi\202\000\000\200Hei\000\000\200\000\000\200\000\000\200\000\000\200\003=\204TuiWu\202\005\357\204Gu\202\362?\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200Zu\202\000\000\200\000\000\200\000\000\200\3628\204XiaHe\202\000\000\200\000\000\200\000\000\200\000\000\200Yue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NanBo\202Hu\202Qi\202Shuz\350\205\003c\204YaoGu\202\000\000\200\000\000\200\000\000\200BanKan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202Ji\202Hu\202Yan\000\000\200\000\000\200\000\000\200\000\000\200\256\371\204\003x\204QiuHou\000\000\200\000\000\200Hao\000\000\200\000\000\200Zu\202"; -static const char b272[769] = "\377\000\000\200z\374\204\000\000\200\000\000\200XiaXi\202\000\000\200\000\000\200Se\202\000\000\200\000\000\200\000\000\200Ge\202Xi\202\000\000\200\000\000\200\000\000\200Ge\202\000\000\200\000\000\200Lu\202\000\000\200Ge\202Ke\202\000\000\200\002M\204ZhuSi\202\005\326\204Ya\202Ni\202\000\000\200\000\000\200\000\000\200\000\000\200Nai\000\000\200\000\000\200LuoSui\000\000\200\000\000\200z\355\204\000\000\200\000\000\200Wu\202\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zao\000\000\200Yi\202Xi\202\005\335\204\301\357\204\305`\204ChiXi\202|\015\204Yun\000\000\200Yi\202Ji\202HuiFou\000\000\200Fu\202\000\000\200\000\000\200Ji\202\003P\204\000\000\200\372\266\206Tai\000\000\200Du\202\000\000\200Can\000\000\200\007:\204\000\000\200\302\027\204VatDi\202\000\000\200CayZhuTai\000\000\200\006N\204XueYu\202FanBei\000\000\200Qu\202\000\000\200Bu\202JiaZha\000\000\200Nu\202She\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006l\204\000\000\200\000\000\200\000\000\200\000\000\200Gaa\000\000\200\000\000\200\000\000\200Gui\007\230\204\000\000\200Dai\000\000\200y\224\204\301\225\205San\010I\204\000\000\200VatGai\020M\204\000\000\200Ci\202\000\000\200Yan\007\023\204Shi\000\000\200Ku\202Zhi\3628\204Qu\202E\000\201\000\000\200\003g\204Ru\202Yu\202\000\000\200\000\000\200Yi\202Yi\202Xu\202FouGe\202\000\000\200\000\000\200\000\000\200\000\000\200He\202Yin\000\000\200\005\335\204\000\000\200Duo\010v\204\000\000\200\000\000\200\003=\204Doe\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003g\204Fan\000\000\200v<\204v\240\204Vo\202\360l\205\006&\204RanDoi\255\221\205\000\000\200Qi\202Sha\000\000\200Du\202Di\202Li\202Yi\202Xi\202\007\277\204\3628\204Kao\005\335\204KunNieChiTi\202\000\000\200\3628\204\000\000\200\000\000\200\000\000\200\000\000\200MoiLi\202Na\202\000\000\200\000\000\200\000\000\200\000\000\200Mei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204Bei\000\000\200\000\000\200\303\235\205MotGhe\302!\205w\244\204x|\204Lan\301\225\205\006\351\204Op\202\303\230\205"; -static const char b273[769] = "\377\302{\204\007\036\204Bo\202Za\202E\000\201\002M\204\006\237\204\006\260\204Fu\202Lu\202XieXieXiuLu\202|\015\204Ta\202Ci\202Qu\202\000\000\200Fu\202Zhi\000\000\200XieZouFeiMin\003g\204\000\000\200\000\000\200\3628\204Qi\202\000\000\200\007\335\204\000\000\200SuiEr\202\000\000\200\000\000\200\000\000\200Hu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\023\204\000\000\200Bie\003x\204BanShiXie\3621\204Fei\000\000\200SuaCuaSuaDomDiaw\244\204\007\032\204v<\204RayHonCuaRay\000\000\200\305X\205{\276\205YaoJue\371\260\205\000\000\200YouFan\000\000\200\000\000\200KuiDi\202\000\000\200MaoJie\000\000\200Yan\000\000\200\000\000\200Wei\000\000\200\000\000\200\010\230\204JieYu\202WeiE\000\201\301\357\204z\343\205\003\014\204\003\031\204Die\003I\204\000\000\200{\207\204Hu\202Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3607\204\000\000\200\000\000\200\000\000\200CuiMou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\305`\204\007q\204Ke\202Yan\003\002\204HaaDotOc\202v<\204\000\000\200\000\000\200Ran\003=\204\000\000\200\006N\204Sun{_\204\000\000\200\000\000\200Chi\000\000\200Qi\202Suo\000\000\200Ye\202ZaoQue{\221\204Ba\202Zu\202SuoZheXi\202\000\000\200Chu\003\002\204ZuiGe\202Wu\202\000\000\200\000\000\200LueJi\202\000\000\200\000\000\200XieXie\000\000\200\000\000\200Dou\000\000\200\000\000\200\000\000\200\000\000\200Qiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0102\204\000\000\200Liu\000\000\200\000\000\200PanCi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jie\000\000\200Hui\000\000\200\000\000\200\000\000\200Sha\000\000\200\000\000\200\000\000\200x\364\204SamDomRetBo\202v\364\204\006N\204Ranx\364\204ZhiAi\202Xu\202Bi\202\000\000\200Ye\202Ni\202Zhu"; -static const char b274[769] = "\377\000\000\200Su\202\000\000\200XieYu\202Qu\202\000\000\200\000\000\200Zu\202Zhi{\221\205LueWeiz\367\205Mi\202\000\000\200Ji\202\000\000\200Su\202Ye\202Xi\202\007\265\204{\207\204\003P\204\000\000\200Wu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mao\000\000\200\000\000\200Hou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\335\204\000\000\200\000\000\200LueDu\202\006&\204z\355\204Lu\202Su\202\000\000\200\000\000\200\000\000\200DiuDoi\360~\206w\020\204v<\204RomBo\202\007&\204LueSamCayx\350\204\004\371\204Vet\362?\205Li\202Fei\000\000\200\0050\204KuiYi\202HuaCuiZukYu\202\005\005\204TunShuDaiWu\202Ci\202\006\373\204\010\220\204Zu\202Han\000\000\200Pi\202\305X\205\000\000\200\000\000\200Du\202Pa\202\000\000\200\000\000\200Zhu\000\000\200XieZheQie\003P\204\000\000\200Sao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200Fu\202\000\000\200\011\000\204y\224\204y,\204SauLi\202RuaRayRomRuaRuaE\000\201\000\000\200Ye\202Shu\000\000\200Se\202\000\000\200Qi\202GuoSe\202\000\000\200Fu\202Mao\000\000\200Lei{\221\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\020\204\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lei\000\000\200Zei\004\377\204Ai\202Xie\000\000\200Bi\202\010M\204\360l\205\303\177\204\000\000\200\000\000\200\000\000\200z\355\204\000\000\200BanPi\202\006&\204LieQi\202\000\000\200Ji\202\0050\204\004\352\204FeiYi\202\007\265\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\205\204CanYa\202\000\000\200\000\000\200Meny\230\204\302&\204Sam\000\000\200\360\350\204\000\000\200\005P\204\000\000\200\000\000\200\000\000\200Zhi\000\000\200XieLu\202\000\000\200Li\202\000\000\200Mao"; -static const char b275[769] = "\377\000\000\200\000\000\200Xia\000\000\200\000\000\200Sou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Su\202Xue\000\000\200Bau\006&\204\302v\205RamLi\202\007:\204\000\000\200\000\000\200{\221\204\000\000\200Ta\202\003P\204WeiYe\202\003\247\204MaoTi\202Pin\000\000\200Du\202QiuYi\202\000\000\200\000\000\200\000\000\200\000\000\200Tuo\005\020\204\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200w\244\204Diuy\230\204\000\000\200\000\000\200z\355\204\004\377\204\005\357\204\000\000\200z\374\204\000\000\200Qi\202\000\000\200YueLue\004\377\204Qu\202Sit\000\000\200\000\000\200FeiZi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\006\204w\274\204\000\000\200\000\000\200\006\373\204Wei\372\266\206\000\000\200Fu\202\000\000\200\000\000\200Mo\202Mo\202Tuo\005\020\204\006a\204\000\000\200\000\000\200\000\000\200Re\202RamLi\202Li\202\000\000\200Xia\007q\204\000\000\200NanMi\202\000\000\200\000\000\200z\362\205\000\000\200\372\266\206\000\000\200Xu\202\000\000\200\000\000\200Fei\000\000\200Xie\000\000\200Hen\000\000\200\000\000\200Ta\202\003]\204\000\000\200{\221\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Romz\350\205\006\220\204\000\000\200Lin\000\000\200\000\000\200\000\000\200\006\337\204z\374\204Fu\202\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200Sao\000\000\200Hui\301\376\204\000\000\200\000\000\200Moi\000\000\200\005P\204\000\000\200\003\006\204\000\000\200z\362\205\000\000\200An\202\000\000\200MauMau\000\000\200\000\000\200\000\000\200Man\000\000\200Ni\202\000\000\200\000\000\200\000\000\200GuoOu\202\000\000\200\000\000\200z\374\205\000\000\200Jin\000\000\200\000\000\200\000\000\200Mu\202{Z\205\000\000\200N\000\201\000\000\200\000\000\200SanHu\202\000\000\200Zu\202Hui\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200Ye\202y\234\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200Hon\000\000\200\003g\204\000\000\200\000\000\200La\202Yu\202Jue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shu{Z\205\000\000\200\003]\204\000\000\200Ge\202\303\242\205{\240\204Xin\000\000\200\000\000\200Hui\004\272\204\004\272\204{\276\205"; -static const char b276[766] = "\376\000\000\200\000\000\200z\367\205\004\272\204\000\000\200\000\000\200\000\000\200Ay\202\006z\204\000\000\200\000\000\200\000\000\200\0050\204{\240\205\000\000\200\003=\204\000\000\200\004\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202\000\000\200\000\000\200\000\000\200\000\000\200z\350\204\000\000\200DouPo\202\000\000\200\000\000\200Hu\202\000\000\200\000\000\200Niu\000\000\200Qi\202\005,\204\005,\204\000\000\200Li\202\000\000\200\000\000\200{s\205\000\000\200\000\000\200\000\000\200Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xon\004\330\204\000\000\200\000\000\200\000\000\200Na\202\000\000\200{Z\205La\202Zhi\000\000\200E\000\201Bo\202Po\202Xu\202\003]\204Ci\202Li\202\000\000\200\000\000\200Pao\000\000\200\000\000\200Xiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MeiWu\202Jau\000\000\200\000\000\200\000\000\200Pu\202\000\000\200CheQi\202\000\000\200\000\000\200Yi\202\000\000\200Ti\202Duo\003\031\204\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204\007:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202\000\000\200\007\277\204\000\000\200HouLotx\264\204\360\234\206Qi\202\000\000\200Mu\202z\362\204\003\031\204Xi\202E\000\201\005\230\204FeiWan\000\000\200Cun\000\000\200\006\260\204\000\000\200\000\000\200\000\000\200Cuo\006Z\204\000\000\200\000\000\200\000\000\200\005\375\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Vay\007\023\204GaowX\204\000\000\200\000\000\200Cui\000\000\200\000\000\200Qi\202Li\202Qiez\350\204\006\237\204\005\005\204\000\000\200\002M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{_\204\000\000\200Dup\302\267\205LunMayx\264\204NemVat\000\000\200\000\000\200Zi\202\000\000\200\000\000\200Ti\202z\350\204Du\202\000\000\200\000\000\200Tu\202\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200Hu\202\003g\204\000\000\200{_\204Zhi\000\000\200\000\000\200\000\000\200\000\000\200Chi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DayToi\003c\204\006Z\204ChiSuoXie\000\000\200Ke\202"; -static const char b277[760] = "\374\305;\204\007\261\204Shi\002M\204\000\000\200Jie\000\000\200\000\000\200\000\000\200GaoLu\202\000\000\200\000\000\200\000\000\200\000\000\200PuiTre\000\000\200\000\000\200\000\000\200Xie\000\000\200z\355\204Mo\202\302I\204wX\204Zhi\000\000\200\000\000\200\000\000\200Man\000\000\200{\276\205Ke\202\000\000\200\005,\204Yi\202\000\000\200Su\202\305X\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Suk\000\000\200\000\000\200\000\000\200CuiTuo\000\000\200\000\000\200XieGin\000\000\200\000\000\200v\014\204Bau\004\256\204\000\000\200\003P\204\000\000\200\000\000\200\000\000\200\277\367\204He\202Jue\000\000\200\000\000\200Ti\202Fei\000\000\200ZhiShiTui\000\000\200\000\000\200z\367\205\000\000\200Ti\202{\221\204\005\313\204\000\000\200Qu\202Wei\000\000\200DunBao\000\000\200\000\000\200\000\000\200\006z\204>3\204Gei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Si\202\000\000\200x\264\204{x\204\255\322\204\303\247\205\003t\204XieBie\000\000\200\006&\204\000\000\200\000\000\200\000\000\200Ju\202He\202\000\000\200\000\000\200\000\000\200Kui\003]\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shu\000\000\200\000\000\200\000\000\200\010\042\204\010\204\204\000\000\200\000\000\200\000\000\200\000\000\200DaiRem\000\000\200Nie\000\000\200Yu\202\004\334\204\006\205\204Hu\202\000\000\200Ke\202Lie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jie{s\205\000\000\200\000\000\200\000\000\200\000\000\200Yanv\300\204Noi\000\000\200\000\000\200\000\000\200JieLa\202ShuJieLei\000\000\200\000\000\200Zu\202\000\000\200Shi\000\000\200Diu\000\000\200\000\000\200\000\000\200WeiDu\202Su\202\000\000\200\000\000\200\000\000\200Macx\264\204{x\204\302I\204\000\000\200Xie\010\314\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200\000\000\200\000\000\200\000\000\200z\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\220\204\005\357\204\000\000\200\000\000\200Ji\202Vat\000\000\200\000\000\200\305;\204\000\000\200\000\000\200Gu\202\000\000\200\000\000\200\000\000\200\000\000\200\003P\204\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200Bo\202\000\000\200\000\000\200\000\000\200Bo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei"; -static const char b278[766] = "\376\000\000\200\000\000\200Ku\202\000\000\200\000\000\200Up\202Wan\000\000\200Cha\000\000\200MaoKe\202\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200z\374\204Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hunz\355\204Shi{Z\204E\000\201Mi\202\000\000\200ShiQu\202Shu\000\000\200Ci\202Yan\000\000\200\000\000\200Hu\202Qi\202Zhiz\362\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GaoYaoPou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202{x\205Ji\202v0\204Ai\202\000\000\200\004\352\204\000\000\200Sui\000\000\200Jiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202{\207\204\003P\204\000\000\200\006z\204Tin\000\000\200\000\000\200\000\000\200Yun\003P\204Cou\003I\204\000\000\200Kui\000\000\200Ti\202z\362\204DanGui{x\204\000\000\200{_\205Ji\202Tai\000\000\200\000\000\200\000\000\200{\207\204Kan\371\260\205\000\000\200DouYouQi\202\000\000\200\3621\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202Lou\000\000\200\000\000\200\305X\206\000\000\200\000\000\200\000\000\200\000\000\200LaoGao\000\000\200\000\000\200\000\000\200\010\243\204DonWei\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\004\377\204FanLi\202z\350\204\360\272\206\000\000\200\000\000\200Yao\000\000\200\000\000\200\000\000\200KuiWei\000\000\200Que\000\000\200\000\000\200\3621\204Que\000\000\200\000\000\200Hu\202\000\000\200Gok\000\000\200\000\000\200DuoChu\000\000\200\000\000\200\371\260\204\000\000\200\000\000\200\004\334\204E\000\201Ji\202\000\000\200\000\000\200Tan\000\000\200Pa\202\000\000\200\000\000\200\000\000\200\000\000\200v\264\204\000\000\200\000\000\200Jie\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200z\350\204Ju\202\000\000\200\000\000\200QiuTuo\000\000\200\000\000\200\000\000\200NuoSi\202\000\000\200\000\000\200\000\000\200Yi\202\255_\205Gu\202HunPa\202Zi\202\000\000\200\003\002\204Dia\000\000\200Xi\202\360\366\204\000\000\200Yi\202Zhi\000\000\200\000\000\200\000\000\200\000\000\200w\250\204Gocy\240\204Lun\000\000\200\003c\204JueTanNuoJu\202Hu\202\000\000\200Zhi"; -static const char b279[766] = "\376\000\000\200\007&\204\007&\204Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Chi\003P\204Ji\202GuaJu\202Wo\202Tuo\000\000\200QiuWei\0070\204\000\000\200\002M\204\000\000\200{Z\204Ne\202\000\000\200\000\000\200Xi\202ZheZhi\000\000\200Na\202\007\042\204Ken\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200Ba\202YaoGuo\000\000\200\000\000\200Di\202\000\000\200Huo\0050\204\000\000\200\000\000\200MamvH\204\000\000\200\000\000\200JueYue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\364\204Ji\202\007\042\204Su\202Coi{\240\204\000\000\200KunWo\202{\202\205\003t\204Jue\000\000\200\000\000\200Bi\202\000\000\200z\355\204Va\202Zi\202Li\202\000\000\200\000\000\200\000\000\200Fo\202z\350\204Yan\000\000\200TanMo\202\000\000\200\000\000\200\000\000\200KouXi\202\000\000\200\000\000\200Jiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hu\202Hu\202\000\000\200Fu\202\000\000\200\000\000\200\360\350\204Guo\000\000\200RenYin\003\014\204Jun\000\000\200Yun\000\000\200\000\000\200Xun\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200\004\272\204\000\000\200\000\000\200GheKe\202Don\000\000\200\000\000\200\000\000\200Hu\202\000\000\200\000\000\200Hu\202Pu\202FanAak\000\000\200\000\000\200\000\000\200Jia\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200TuoNa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YinYin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\005\204\302D\204\000\000\200\000\000\200Ji\202\305`\204ShiDuiDuo\000\000\200TuoWa\202Li\202\000\000\200\000\000\200\000\000\200Re\202\000\000\200\000\000\200Ci\202Xu\202\003c\204Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\305`\204Ya\202\000\000\200Ji\202\010I\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\264\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{_\204Tu\202\000\000\200BieXi\202Pi\202Zha\000\000\200\010X\204Hui"; -static const char b27a[769] = "\377Suo\000\000\200He\202\000\000\200Yue\000\000\200Wu\202\000\000\200\005\357\204\000\000\200ZhaHua\000\000\200\000\000\200\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200{x\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sui\000\000\200|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhiTi\202Ao\202\004\334\204Zi\202Ke\202\000\000\200Se\202|\015\204Lu\202\000\000\200\000\000\200\000\000\200\000\000\200{_\204Zha\000\000\200\000\000\200\000\000\200z\367\205\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SeoMu\202Hu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007x\204Chi\000\000\200\000\000\200Su\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200Ji\202DuoHou\000\000\200\006&\204ZhaYin\000\000\200\3621\204\000\000\200\303\362\204\005\005\204La\202\000\000\200Chi\000\000\200Qia\000\000\200An\202Shi\000\000\200\000\000\200Chi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GeiNu\202\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\000\000\200Xia\000\000\200\000\000\200\005\020\204\000\000\200Ai\202\000\000\200\000\000\200\371\260\205He\202\000\000\200Ji\202ChiXi\202{Z\205\000\000\200\000\000\200Ta\202\000\000\200Ma\202\000\000\200\000\000\200Pi\202\000\000\200\000\000\200Xu\202z\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200\000\000\200\303\254\204\241z\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JieXiaLu\202\000\000\200Qie\000\000\200Cha\000\000\200\000\000\200\000\000\200\360\350\204Ji\202ShaLou\000\000\200Ji\202Zhi\305`\204\000\000\200Bi\202An\202Yi\202An\202\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gan\000\000\200\000\000\200\000\000\200\000\000\200z\374\204\000\000\200\000\000\200Mo\202\000\000\200JiuTan"; -static const char b27b[766] = "\376\000\000\200HaoHe\202\000\000\200\000\000\200Zha{\221\204Yi\202Xi\202\000\000\200Xi\202Fa\202Yan\000\000\200\000\000\200Mu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gu\202\000\000\200\000\000\200\011\000\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\362?\205\000\000\200z\355\204\305X\206HuiZa\202Gun{\240\204Ya\202\000\000\200\000\000\200\000\000\200z\374\205He\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005!\204LaiDai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200\000\000\200\000\000\200\003+\204\006\373\204\000\000\200\006\205\204\000\000\200Lie\003c\204Pu\202Tai\000\000\200\000\000\200\000\000\200\004\377\204\005\326\204Guo\000\000\200\000\000\200\000\000\200\000\000\200z\350\205\000\000\200Lu\202Sa\202LieChiXie\000\000\200\000\000\200GuoBaoLuo\007q\204\000\000\200\000\000\200\000\000\200E\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202\000\000\200Mei\000\000\200\000\000\200XiePin\000\000\200Han{x\204{_\204Hui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\377\204\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200An\202\000\000\200\000\000\200\000\000\200Ta\202Yi\202Tui\000\000\200\000\000\200\000\000\200Liu\000\000\200Zuo\000\000\200Li\202\000\000\200PinXue\000\000\200NenDou\000\000\200\000\000\200Lan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204Jue{Z\204Ji\202z\350\204\000\000\200HanFen\000\000\200Han\005\335\204He\202Hou\000\000\200\000\000\200\000\000\200{\221\204\004\320\204Taiz\350\204\000\000\200She\004\377\204\000\000\200\000\000\200Qin\004\272\204\004\272\204Huo\000\000\200Xi\202He\202Xi\202XiaHaoLao\000\000\200Li\202\000\000\200\000\000\200{x\205\000\000\200\000\000\200\000\000\200JunXi\202Han\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dou\000\000\200DouWan\000\000\200\000\000\200DouZai\007q\204\000\000\200LouChu\000\000\200{Z\205\000\000\200\000\000\200\000\000\200Qi\202KanHuoLai\000\000\200Lam\303M\205Ha\202\000\000\200\000\000\200\000\000\200Gai\000\000\200\002M\204\000\000\200\004\352\204"; -static const char b27c[769] = "\377\000\000\200\000\000\200\000\000\200Lou\007\265\204\000\000\200\000\000\200Yu\202Wu\202\000\000\200|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Guo\000\000\200\000\000\200\000\000\200\000\000\200\0238\204TanQi\202\000\000\200\000\000\200z\367\205\000\000\200\000\000\200\000\000\200LieLi\202\000\000\200Xun\000\000\200\000\000\200Ut\202y\244\204\007\277\204\005P\204HanChu\000\000\200Tun\000\000\200{s\205YouMo\202Chi\000\000\200Hu\202Du\202\000\000\200Mu\202\000\000\200Na\202\000\000\200\005\357\204\303\254\205\000\000\200\000\000\200Ai\202z\374\204\000\000\200\000\000\200\000\000\200KanSi\202San\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\3621\204\000\000\200ZhiDou\000\000\200\000\000\200\000\000\200\000\000\200Mai\000\000\200\000\000\200\000\000\200LunJue\000\000\200\000\000\200\000\000\200z\350\205\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003I\204CouDuoYu\202\000\000\200\000\000\200\000\000\200\004\334\204\000\000\200Xi\202\006\333\204\305;\204\005!\204\000\000\200\000\000\200\000\000\200Pu\202Y\000\201Mi\202Man\000\000\200\007\230\204\000\000\200z\350\204\000\000\200LinMinWei\007\177\204\000\000\200Hu\202Sui\000\000\200\000\000\200Ju\202Sha\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200WeiXi\202\005\357\204\000\000\200\000\000\200Bi\202Wei\000\000\200\000\000\200\000\000\200Li\202Zhe\000\000\200\003]\204Hu\202WanBa\202{\240\204\000\000\200\000\000\200Cop\000\000\200Zuo{\221\204Bo\202Qiu\360\350\204\000\000\200\000\000\200\004\352\204Qu\202\000\000\200\000\000\200\000\000\200\000\000\200Pi\202\005(\204Beo\000\000\200{_\204Gou\003t\204Yi\202Fu\202\000\000\200XinShi\3628\204Cop\000\000\200\003x\204\000\000\200\000\000\200Tu\202\3621\204Wu\202PeiHui\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200\000\000\200HumSi\202CuiSha\003c\204\002\376\204WeiLaiBi\202\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200NaoXieRao\007\265\204WeiYouMei\007:\204\362?\205Jeo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sou\000\000\200Gu\202\360\366\204\000\000\200\002\376\204Pi\202\000\000\200\000\000\200\3628\204"; -static const char b27d[769] = "\377\000\000\200Chi\006\260\204z\355\204\003]\204\372\266\206\000\000\200Wu\202\000\000\200Pi\202z\362\204BeoFu\202\000\000\200\003t\204\000\000\200\000\000\200\000\000\200\000\000\200Nao\000\000\200\003t\204Wei\003]\204\000\000\200Nao\007\230\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200XinYanPo\202Pei\000\000\200\000\000\200\000\000\200\000\000\200Suo\000\000\200Ren{_\204\000\000\200Me\202\000\000\200No\202Suo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200Men\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\002M\204\000\000\200\000\000\200Gan\000\000\200Gou\000\000\200HanShi\360\350\204\000\000\200Gu\202\000\000\200\000\000\200\000\000\200\000\000\200ZiuBui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ke\202\000\000\200\000\000\200Ju\202QuaPaiCe\202Bao{s\205Cai\000\000\200\007O\204LinAi\202\000\000\200\000\000\200\000\000\200Mi\202Lai\000\000\200\000\000\200\000\000\200\3621\204\000\000\200She\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HuoNi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{Z\205\000\000\200LinZha\000\000\200\000\000\200Yun\000\000\200\000\000\200Xu\202\000\000\200Fau\000\000\200\000\000\200\000\000\200\000\000\200{x\205Wo\202Xi\202\000\000\200LoiBei\000\000\200\000\000\200{_\205\000\000\200\000\000\200\000\000\200Yu\202Mi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\214\205\000\000\200\000\000\200\000\000\200y\250\204Dat\302\363\204Cua\006&\204\000\000\200\000\000\200\0070\204\000\000\200\000\000\200ChaFanZe\202{x\205\000\000\200\005P\204\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\303\254\204\000\000\200\000\000\200\000\000\200Yao\000\000\200\000\000\200Ku\202\000\000\200FenXie{x\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\007\252\204Xoe\000\000\200Bin\000\000\200Lou\000\000\200\000\000\200\000\000\200Yi\202Mi\202Xie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200Luo\000\000\200\000\000\200{_\204\000\000\200MuaTau\3034\204\000\000\200\000\000\200\000\000\200Ju\202Du\202"; -static const char b27e[769] = "\377\000\000\200\000\000\200z\374\204\000\000\200\000\000\200Zhi\000\000\200\000\000\200Bin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Vui{\252\204\000\000\200Zhi\372\230\205Xue{\207\204Sui\000\000\200\000\000\200\000\000\200Ban\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LanJu\202\003+\204Xun{\221\204Gun\000\000\200\000\000\200\000\000\200\000\000\200\301\307\205\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204Bui\000\000\200Wei\301\357\204\005\020\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302\034\205\000\000\200\000\000\200\007\357\204\000\000\200YueVayZi\202\303\355\204\000\000\200\303\355\204LuoGuiv\354\204{x\205{\271\205Ju\202|\015\204Wan\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200NanDa\202\000\000\200\000\000\200\000\000\200Han\000\000\200Do\202Do\202\000\000\200Xi\202LinSonLomYanXu\202\000\000\200\000\000\200\303\261\205v\320\204Hu\202GanXu\202\000\000\200Xi\202\000\000\200\000\000\200\000\000\200CuiDo\202Do\202Xi\202Hu\202Timv\320\204v\320\204Do\202Do\202\000\000\200Yan\000\000\200\000\000\200\000\000\200Ziu\000\000\200\000\000\200\000\000\200\000\000\200Yi\202ChiJue\000\000\200Zu\202\000\000\200\000\000\200yt\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\002\204Yi\202\000\000\200TanChiBa\202Tou\004#\204Qiu\000\000\200\000\000\200ChiXi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202\000\000\200Cu\202\000\000\200Wu\202\000\000\200ChuSu\202\003]\204Ju\202Ba\202\000\000\200Ci\202Di\202PanChi\000\000\200Qiu\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005(\204\000\000\200\000\000\200v\020\204\000\000\200z\374\204\005\005\204{\202\205Qi\202\003c\204Ju\202QieMo\202\007:\204\000\000\200GuiZui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qie\000\000\200Rao\301\225\205\000\000\200\000\000\200Day\000\000\200\000\000\200Hu\202QiuHaiFu\202\005\230\204ShaXi\202Bu\202Shi\003]\204{\012\205\000\000\200Nie\000\000\200\000\000\200Hou"; -static const char b27f[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mi\202x|\204x|\204\0311\204E\000\201z\374\204YunXu\202Qin\004\352\204\006G\204Qi\202LanFu\202Qi\202z\367\205\000\000\200LaeCu\202\000\000\200\000\000\200Mo\202Bei\000\000\200\000\000\200\000\000\200Dao\000\000\200\000\000\200\000\000\200Jiez\367\205ChiYu\202CuiSu\202Ti\202ShuZhaFu\202\000\000\200CheFo\202HouZha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JieZha{\221\204DayDayYanHaiWu\202Hua\3607\204YaoSouz\350\204Ji\202{s\205Qi\202Jun\000\000\200Hai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YanJieCui\000\000\200\007\265\204{\221\205\007\335\204Lu\202ZhiChuMi\202z\350\205\000\000\200{\207\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200\004#\204E\000\201Su\202Jue\000\000\200\000\000\200Ju\202Tan\006z\204San\004\352\204\000\000\200Za\202Zhi\000\000\200\000\000\200\000\000\200\003P\204\005\357\204\000\000\200\000\000\200\005\262\204\000\000\200\3034\204{\221\204\003P\204Qin\003\002\204Pi\202\000\000\200\000\000\200Han\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202Guo\000\000\200Xun\000\000\200\000\000\200Xunz\355\204JieJu\202YanDu\202\000\000\200\005\335\204z\374\204Xun\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204JieYi\202Qu\202Gan\003\014\204\000\000\200JueQu\202Zuk\000\000\200\000\000\200\000\000\200Jiu\000\000\200Ji\202Ji\202y\020\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\003\247\204\000\000\200{\202\205Ku\202\000\000\200Ku\202Zha\000\000\200\000\000\200Ba\202{x\204w\344\204{x\204Hu\202Nu\202E\000\201{s\205Dun\371\260\205WanFen\004\371\204\000\000\200Xi\202Zi\202\000\000\200Hu\202\000\000\200\000\000\200\000\000\200\000\000\200Bie\000\000\200TuoBanGe\202\000\000\200Ke\202\301\225\204Vet\000\000\200\000\000\200\000\000\200\000\000\200\003p\204Fu\202Mo\202JiaTuoYu\202\000\000\200Mu\202JueJu\202GuaPo\202"; -static const char b280[766] = "\376Ni\202\005\275\204Cuk\000\000\200Wa\202Yan\000\000\200\000\000\200x\030\204Cyu\010\220\204Say\0311\204\004\256\204LopDen\006N\204\302\344\205Vo\202\000\000\200\004\320\204{\202\205Hai\000\000\200z\374\205Xi\202\000\000\200Cun\3628\204Ruo\031\234\204DuoChe\000\000\200\000\000\200KeiLeiZi\202\000\000\200{Z\205Zuo\000\000\200\000\000\200\007\014\204Zai\000\000\200\007:\204{}\205\006l\204\000\000\200\000\000\200Fa\202Xun\000\000\200Ji\202\000\000\200Cha\302\313\205Let\301\225\205RaoRiuNho\010:\204Shu\003P\204XieTi\202Hanz\374\204{_\204Tun\004\272\204KunCenDouNuoYan{x\205Pu\202Qi\202YueFu\202\000\000\200\007\036\204\000\000\200\000\000\200\005P\204\302\243\205\000\000\200\000\000\200\000\000\200\000\000\200x\314\204\000\000\200Wo\202\371\260\205Tuo\000\000\200\000\000\200\000\000\200Du\202\003\031\204Noi\303\235\205Ba\202DauLiav\020\204RaoLany\254\204XuiVa\202Ap\202\000\000\200Tan\000\000\200Ya\202ZhiLu\202YanJu\202\000\000\200BonDe\202\000\000\200ChuZu\202E\000\201Zhi\006\260\204\000\000\200Bie\000\000\200Di\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200Ye\202\000\000\200DocLomy\260\204Co\202Ram\302\250\205Ron\000\000\200HaoPanTan\007\014\204Xu\202ZouJi\202Wu\202\000\000\200\000\000\200\305X\205\000\000\200\000\000\200Po\202YanTuo\000\000\200Du\202\000\000\200\003I\204ChiHun\0102\204\000\000\200\006&\204Zha\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200Re\202Dam\005\024\204Wai\000\000\200\000\000\200\000\000\200E\000\201WeiBai\000\000\200{\240\205\010:\204xL\204w`\204RiuxL\204TotLomXamxL\204\303\266\205\000\000\200Cha\000\000\200ChuKua\005\326\204ZouLi\202Ta\202Sa\202\000\000\200\000\000\200PanPan\000\000\200\000\000\200\000\000\200Sao\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200Sin\000\000\200w@\204\000\000\200Zu\202\000\000\200ZhiYan\000\000\200Jie\010\026\204\020~\204)\325\204\303\273\205\2575\204wX\204\005\230\204NapLetTo\202x\364\204v\214\204"; -static const char b281[763] = "\375\000\000\200Dam\005\275\204\000\000\200\006\337\204Qu\202\000\000\200\005\262\204{\207\205z\355\204QieLouDieCui\000\000\200\000\000\200Ji\202Bac\000\000\200\010I\204\372\266\205Zu\202\000\000\200\007\014\204\000\000\200\000\000\200z\350\205Li\202\000\000\200\000\000\200z\367\205DuiTat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\276\205Yu\202{\221\205Lei\000\000\200Bo\202SupSao\010\220\204\007&\204\030\212\204Dao\257\320\204DanDoiHomGhe\301\345\205LepSupMopwX\204\301\225\204Po\202\000\000\200Toi\000\000\200\005\275\204Zhe\3621\204\000\000\200TanCuiLanQueXu\202ShuZhaCan\000\000\200\000\000\200Bi\202\006\260\204\000\000\200\000\000\200Zuk\000\000\200{x\205w0\204\000\000\200\000\000\200\000\000\200\000\000\200\006\214\204Ji\202Bay\000\000\200\000\000\200\000\000\200\000\000\200\005(\204\000\000\200Lan\000\000\200DuaWaa\2570\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Doi\004\256\204y\020\204)\325\204y\264\204LayLonSumx\254\204\000\000\200|\015\204Sa\202JinZhuDuo\000\000\200Cha\007q\204\005!\204\005\005\204\000\000\200FanLieZeiSui\000\000\200\000\000\200\360\212\206Cam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Se\202\000\000\200\000\000\200\000\000\200Cui\003\031\204\004\256\204x\000\204DepLoiVon\301\357\204\302l\204\000\000\200ZhiTui\000\000\200\003\006\204\000\000\200\301\321\204\000\000\200\000\000\200BukTa\202\002\354\204Wen\000\000\200\000\000\200Po\202Bo\202v\020\204\302&\205w\364\204Veu\000\000\200CyuMo\202Ca\202Gac\360\300\206{\202\205\000\000\200CuoRaoBaoLai\000\000\200\000\000\200Leo\000\000\200\000\000\200\000\000\200{\327\204Li\202\000\000\200\000\000\200BaiLuiy$\204\000\000\200\003\002\204Lu\202Li\202\003\031\204Gui\000\000\200Du\202Du\202z\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lomz\374\204\000\000\200z\355\204\000\000\200Xie{\221\204\000\000\200\000\000\200Som\000\000\200\000\000\200\372\266\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w@\204\302\301\204\303%\205)\325\204Ong\000\000\200Mi\202\006\337\204Luo"; -static const char b282[766] = "\376\3607\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204Die\000\000\200WanYue\006\337\204\000\000\200\006\337\204\000\000\200\000\000\200\000\000\200Voc\006G\204\000\000\200WaiDinNen\360\366\204XiePi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mao\000\000\200Yin\000\000\200Bo\202\000\000\200Zhu\000\000\200\000\000\200z\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mu\202Tuo\000\000\200\3628\204Ye\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\205\000\000\200Ren\000\000\200Ye\202\000\000\200\000\000\200\000\000\200Pei\000\000\200Tuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\270\204\000\000\200\035\337\204\000\000\200\000\000\200\010k\204Yu\202\000\000\200\000\000\200A\000\201\000\000\200\003c\204Wan\005\275\204\035\337\204BanDuo\362?\205Ha\202z\362\205\003+\204\000\000\200\000\000\200\000\000\200\256\371\204Qie\003=\204\005P\204Mei\000\000\200\000\000\200\000\000\200\005!\204\000\000\200\000\000\200\006N\204\000\000\200\000\000\200\006N\204Qi\202Guo\000\000\200\000\000\200Wu\202z\374\205|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200\000\000\200{\221\204Cui\000\000\200MayLan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lan\000\000\200\000\000\200\000\000\200\371\260\204\000\000\200LeiLi\202\000\000\200z\355\204Nie\006\337\204\000\000\200\005P\204Hui\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202Yu\202\000\000\200Xin\000\000\200\000\000\200\000\000\200\000\000\200YueBa\202DaiJi\202\003P\204\000\000\200\000\000\200JueNiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202Ji\202\000\000\200\000\000\200{\334\205Wan\000\000\200\000\000\200Pa\202\003=\204Ben\000\000\200\007\243\204\360\350\204LiuNi\202ZhaYin{\327\204Pao\000\000\200\003=\204Bu\202He\202\006N\204GuiLip\036\036\204So\202Bi\202Xi\202Ju\202HunBi\202\000\000\200\007\036\204{Z\205\000\000\200\005\335\204Yi\202Ci\202\000\000\200\002\354\204\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200Fa\202\000\000\200\000\000\200\360\350\204Xu\202"; -static const char b283[769] = "\377Nhe\005\335\204\000\000\200\000\000\200\006a\204\005\020\204\005\335\204\000\000\200|\015\204\000\000\200\000\000\200\000\000\200Zhi\003g\204Xu\202\000\000\200\000\000\200{Z\204\000\000\200\000\000\200Wan\000\000\200\000\000\200\000\000\200Jun\000\000\200\000\000\200\000\000\200\000\000\200Wo\202\000\000\200\000\000\200Lu\202\000\000\200{Z\205\006N\204{x\205Fu\202\000\000\200E\000\201Tao\005!\204\000\000\200\007q\204\010I\204Ta\202Di\202Juk\004#\204\000\000\200\000\000\200\007\243\204Tui\000\000\200\007\243\204\000\000\200\000\000\200\000\000\200Hon\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Co\202\006N\204YunHe\202\004#\204\006&\204Qiu\000\000\200\000\000\200\000\000\200Mu\202DuoXu\202\007\243\204z\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202Kan\000\000\200\004\377\204\000\000\200\000\000\200\000\000\200Zi\202\000\000\200\000\000\200\251|\204Sauz\362\205\000\000\200\006\260\204\000\000\200Li\202\000\000\200Bo\202Ge\202Ju\202Ke\202\000\000\200Hu\202Yao\005!\204\000\000\200{}\205\006N\204LiuHuiJi\202\000\000\200\000\000\200{\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200So\202\000\000\200\000\000\200Zhi{\334\204\005!\204Zhi\007\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\350\204\000\000\200\005!\204\005\335\204\000\000\200\000\000\200\000\000\200{\207\205\000\000\200Caox\350\204\301\352\205\301\352\205Nai\004#\204\000\000\200\005\262\204\000\000\200\003\002\204\006\260\204\000\000\200{\012\205Er\202{\240\204\003\002\204NuoZao\000\000\200\000\000\200\000\000\200\000\000\200\006\260\204\010\220\204\000\000\200Qu\202{\207\204Mu\202Lan\000\000\200\000\000\200\000\000\200\000\000\200Fen\000\000\200\000\000\200\000\000\200Hun\000\000\200Nhe\000\000\200{\202\205\000\000\200Yin\372\266\205{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ge\202\010\314\204\000\000\200\000\000\200Pin\000\000\200\003\031\204\000\000\200\000\000\200\000\000\200{Z\204z\374\204\000\000\200So\202Lin{\207\204{_\204Bo\202Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XieGe\202Min{\207\204\000\000\200\000\000\200Jue\003c\204\000\000\200\000\000\200\000\000\200\000\000\200Ke\202"; -static const char b284[769] = "\377\000\000\200Die\000\000\200Zhe\000\000\200ShuJi\202\003\031\204{\012\205Zaoz\374\204z\350\204\000\000\200\371\260\204\000\000\200\000\000\200YinJieCi\202\000\000\200\371\260\204\371\260\204Sa\202\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ku\202\000\000\200Qu\202\000\000\200Ge\202Ban\000\000\200Bi\202z\350\204\000\000\200\000\000\200\000\000\200\000\000\200Cay\000\000\200BinBan\000\000\200ZuoPi\202\000\000\200Huo)\255\204\010\220\204\000\000\200\010M\204\000\000\200\000\000\200\000\000\200Ban)\255\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010M\204\000\000\200{x\204\000\000\200\006\260\204\000\000\200\000\000\200Fu\202Tu\202\000\000\200\000\000\200\000\000\200\000\000\200y\274\204\000\000\200\000\000\200\000\000\200\000\000\200Pi\202Po\202\000\000\200\000\000\200Chi\000\000\200\000\000\200XueQi\202Wu\202\000\000\200\000\000\200ZhiDi\202\006&\204You\000\000\200\000\000\200v\204\204\000\000\200\000\000\200\000\000\200\000\000\200\005P\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200DemDi\202\004\334\204\000\000\200Zou\006&\204\000\000\200JinPanYanQi\202\006N\204Jia\000\000\200ZhiQiuYue\000\000\200Shi\000\000\200\000\000\200\000\000\200Haov\204\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tuo\000\000\200\000\000\200Bie\000\000\200Kan\004\352\204\000\000\200\000\000\200\301\321\204\000\000\200Ci\202\000\000\200YinShiHai\005\253\204\000\000\200\360\350\204Chi\000\000\200Ci\202\000\000\200\000\000\200\003=\204Mi\202\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\360l\205\036F\204\301\357\205v\020\204GenZao\000\000\200\000\000\200\000\000\200\005\005\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XinKuo\000\000\200Die\000\000\200\000\000\200\005P\204\000\000\200\000\000\200La\202\360H\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3055\204\000\000\200Il\202\000\000\200Dai\000\000\200\000\000\200\005\275\204x\230\204\000\000\200\000\000\200\000\000\200Li\202\000\000\200\003]\204\003\002\204\000\000\200\000\000\200Ta\202Qu\202Yin\007:\204Jie\000\000\200z\350\204YaoYa\202\000\000\200\000\000\200\003\006\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pei"; -static const char b285[766] = "\376\000\000\200Jau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\364\204Go\202v\034\204\000\000\200Co\202La\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jia\000\000\200Tou\000\000\200Ti\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dunz\355\204JiaChi{\240\204Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JauKe\202Cho\2575\204Dit\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\007:\204\000\000\200\000\000\200Hu\202\000\000\200Lie\000\000\200\000\000\200\000\000\200Ze\202\000\000\200Chu\000\000\200\000\000\200\000\000\200Qiu\005\005\204\000\000\200\000\000\200\000\000\200\000\000\200\007\350\204y\274\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\204Kua\371\260\205\000\000\200Jie\000\000\200\305`\204\000\000\200\000\000\200\000\000\200Hu\202\000\000\200\010\230\204\000\000\200\000\000\200\000\000\200\000\000\200Ze\202Zan\360\350\204\000\000\200ChiJiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006z\204Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\303\362\204\000\000\200{\202\205\000\000\200\000\000\200\000\000\200\000\000\200MauRoi\303\300\205\000\000\200\000\000\200\004\320\204Ya\202\004\334\204\000\000\200Qiez\374\204Len\007:\204Wu\202\003\002\204z\374\205Sha\000\000\200Zhi\000\000\200\000\000\200z\367\205\000\000\200\303\362\204Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\365\204Do\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v<\204\302:\205Yu\202Tui\000\000\200\000\000\200\010I\204\000\000\200\000\000\200\000\000\200Huiz\350\204\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Man\000\000\200You\000\000\200\000\000\200\000\000\200CimDit\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Di\202\000\000\200Da\202"; -static const char b286[742] = "\366JukYouJiuTuiZan\000\000\200\000\000\200Hui\000\000\200Sha\000\000\200JiuHuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yao\000\000\200\000\000\200v\020\204Va\202z\374\204\000\000\200\000\000\200\000\000\200\000\000\200z\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Di\202\000\000\200Jiu\000\000\200\000\000\200\302:\205Hui\000\000\200KaoYou\000\000\200\000\000\200Li\202\000\000\200\000\000\200\251|\204\305X\205\000\000\200Chi\000\000\200Huo\000\000\200You\000\000\200Yue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200TitKeoTa\202Zan\000\000\200\000\000\200\000\000\200NieZhu\000\000\200v\034\204\000\000\200\000\000\200\000\000\200\000\000\200z\367\205\000\000\200Lui\000\000\200\000\000\200\000\000\200z\374\204\000\000\200\000\000\200\000\000\200\303\305\205\000\000\200\000\000\200\000\000\200Shi\000\000\200KouQi\202Tu\202FanCun\000\000\200\000\000\200TunChaCaiz\374\205Pei\0050\204Qi\202\360\366\204NiuNa\202\000\000\200Qin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202Bao\303\362\204Zi\202Na\202WeiHao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200{Z\205\000\000\200\000\000\200\000\000\200Qie\000\000\200\000\000\200Lap\262\005\204\000\000\200\000\000\200Hao\3628\204Zao\371\260\205Cunz\362\205Ru\202Zai{\327\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Juk\000\000\200z\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204Ji\202YinLi\202\006\351\204\360\366\204HanCuoJunJi\202Bu\202\003\031\204FouYou\005\271\204\000\000\200\010*\204\000\000\200\000\000\200\000\000\200z\374\205\000\000\200\000\000\200\000\000\200\000\000\200Yun\000\000\200QinHuiPu\202{\334\204\000\000\200\000\000\200\000\000\200\000\000\200Li\202PeiShuJu\202Yi\202{Z\205z\367\205\000\000\200Xi\202\000\000\200Hu\202Rou"; -static const char b287[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\204\006\214\204Zhi\004\377\204Xi\202\006\214\204Ji\202{Z\205z\362\205\000\000\200Yu\202ZouMei\000\000\200\000\000\200\000\000\200\371\260\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\205He\202\000\000\200\3628\204He\202WenYi\202\003\247\204\000\000\200\000\000\200\006Z\204z\350\204Li\202Yi\202\305X\206Xu\202Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ge\202\000\000\200Yu\202\000\000\200\000\000\200\005(\204Ganz\350\204\007\014\204Li\202\371\260\204{\012\204\000\000\200\007\335\204\000\000\200GaiLi\202\000\000\200Hu\202\000\000\200\000\000\200Tu\202\007\221\204\000\000\200Hu\202Li\202\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\010\220\204\000\000\200Zuo{_\204\000\000\200She\000\000\200\003\014\204Ju\202\3628\204\003\002\204\006\214\204GaoZi\202z\362\205{_\204\000\000\200\000\000\200Tan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tuo\000\000\200\005\357\204\000\000\200{x\205\006Z\204ZuoYu\202\000\000\200Zhu\000\000\200QunXi\202Qu\202\000\000\200Ge\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202Xu\202\000\000\200\000\000\200\000\000\200\000\000\200GaiQue\004\320\204\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\371\260\204\000\000\200\000\000\200\000\000\200\006\214\204Can\000\000\200\000\000\200Li\202\000\000\200WanLei\003g\204\005\230\204\000\000\200\000\000\200Shi{Z\205Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200Yin\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200Mo\202Wei\000\000\200\004\377\204\010\314\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dai\000\000\200YinBi\202Ge\202\000\000\200WenYan\003+\204\000\000\200\006\025\204QiuZhi"; -static const char b288[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200Jau\000\000\200\000\000\200\000\000\200\000\000\200Tam\000\000\200Gu\202\3628\204\000\000\200\005\357\204Ti\202Ci\202Yi\202FanPo\202Bi\202\000\000\200Bao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\260\204\000\000\200\011\032\204\000\000\200\360\306\206\007\023\204Wei\3621\204\000\000\200Ji\202\000\000\200\000\000\200JauHaoYan\000\000\200\000\000\200\000\000\200\000\000\200w,\204GaySua\303\305\205Yi\202Zao\004\377\204Nan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Za\202\000\000\200|\015\204Xi\202\003\002\204Yan\000\000\200\000\000\200\000\000\200\360\212\206Damy\300\204\000\000\200NeiTanYan|\015\204Zhi\004\320\204Tao\000\000\200\000\000\200\000\000\200\000\000\200Zha\000\000\200Dan\000\000\200\000\000\200\000\000\200\000\000\200\003+\204\000\000\200\000\000\200Wu\202YinYanLao\000\000\200\000\000\200\360\212\206GayPo\202\000\000\200HunHaiMu\202\006&\204\000\000\200\000\000\200Ku\202\004\320\204\000\000\200You\000\000\200\000\000\200\000\000\200\004\334\204\000\000\200KuiSouw,\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yin\000\000\200\000\000\200Zui\010\230\204LiuHanWei\006\205\204Hu\202Li\202\000\000\200Mi\202\000\000\200\006l\204{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Que\000\000\200\000\000\200Cay\006\205\204\000\000\200Mu\202\005\335\204Hu\202Mi\202\007\261\204\000\000\200\000\000\200{_\205\010I\204\000\000\200\004\334\204\000\000\200Zhi{\327\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200Ke\202{Z\205\000\000\200\3020\204Men\000\000\200\000\000\200Dan\006z\204{\221\204\003=\204LaoHua{\252\205\000\000\200{\240\204Kui\000\000\200\000\000\200\000\000\200\000\000\200She\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\204Tan\000\000\200Hu\202\006\205\204Pao{\221\204z\355\205\000\000\200Gan\000\000\200\000\000\200Yi\202\000\000\200Sui\000\000\200w,\204DauXu\202Ji\202Lan\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200Mi\202\000\000\200Mie\000\000\200\000\000\200\000\000\200\007A\204\000\000\200\000\000\200Lan\000\000\200\000\000\200Yan\000\000\200\000\000\200Mi\202"; -static const char b289[760] = "\374\000\000\200\000\000\200\003]\204\010:\204{\240\204\000\000\200\000\000\200Sou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204Yan\000\000\200\000\000\200\007q\204\000\000\200\000\000\200Ve\202E\000\201\000\000\200\000\000\200Fen\000\000\200Fen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\012\205Mai\000\000\200Lie\000\000\200\000\000\200Le\202\000\000\200z\367\205\000\000\200Li\202\000\000\200\000\000\200Damz\367\205NheZhi\000\000\200LeiXieDam\000\000\200\004\320\204\000\000\200Ji\202\000\000\200Nhe\006\220\204Pi\202\000\000\200\000\000\200\000\000\200\000\000\200Jie\000\000\200\000\000\200\000\000\200\000\000\200\003c\204Gei\006\302\204\000\000\200\000\000\200\000\000\200{s\205\000\000\200\000\000\200\000\000\200{\202\205\000\000\200\000\000\200\000\000\200\000\000\200Jam\000\000\200\000\000\200\0050\204\000\000\200Hu\202\000\000\200\000\000\200z\350\204\000\000\200\000\000\200\000\000\200\000\000\200CenSyu\000\000\200Qi\202WanMao\000\000\200Dou\000\000\200\000\000\200Pik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kou\000\000\200Dai\000\000\200Nao\000\000\200\005\335\204\000\000\200\000\000\200\000\000\200\0102\204\010I\204KeoSa\202LaiDuoz\350\204\000\000\200Yin\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200LouHui\000\000\200Le\202\000\000\200Fu\202Mao\000\000\200\003c\204\000\000\200\000\000\200\003]\204\000\000\200\000\000\200\000\000\200ChiVo\202NenPuiv\374\204{\303\205Jyu\000\000\200LaoJi\202Yi\202Liu\006&\204\000\000\200Nan\000\000\200\000\000\200\000\000\200\000\000\200Zan\000\000\200\000\000\200\000\000\200Jin\010\314\204\000\000\200\000\000\200Du\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tunz\374\205\000\000\200\000\000\200\000\000\200\303\362\204\305X\206Wu\202\000\000\200Ju\202\000\000\200\000\000\200\010\344\204Dan\0050\204\302:\204\006\025\204{\334\204BitHok\004\272\204XiePi\202\004\334\204Rui\000\000\200SaoZi\202\000\000\200{Z\205Mi\202\000\000\200Zu\202Qu\202\000\000\200Chi\000\000\200Zhi\000\000\200\000\000\200\000\000\200\305;\204\002\354\204JinFan"; -static const char b28a[760] = "\374\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200vp\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007]\204Kam\301\357\204z\350\204Ya\202\010I\204He\202Ru\202\000\000\200\000\000\200\000\000\200Ju\202Wu\202\000\000\200\000\000\200x\024\204SamMaiw\034\204\360B\206\004\371\204CheHaiChi{\202\205\000\000\200Cou\005\253\204KuoChiZu\202\003\002\204\000\000\200Yu\202Tu\202\006\205\204Da\202\010\016\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Juk\005\204\204Wai\000\000\200BuiWunJauWai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\033h\204\000\000\200\000\000\200\0050\204Bou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tin\000\000\200\000\000\200\000\000\200\000\000\200\003\014\204Gou\004\352\204ChaMaoz\355\204\303\362\204Yu\202\000\000\200\000\000\200WanZu\202\000\000\200Zi\202\000\000\200\305X\205WanWa\202\000\000\200\301\357\204\000\000\200\000\000\200Wan\000\000\200Xia\000\000\200\000\000\200Mo\202Jiu\004\365\204\005P\204\004\377\204{\240\204\000\000\200\000\000\200WeiTi\202Sao\000\000\200Qi\202ShaYu\202Ji\202Douz\355\204\007\265\204\000\000\200\000\000\200Liu\000\000\200\003p\204\000\000\200\000\000\200Hin\251|\204JanKen\360~\206\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\253\204\000\000\200\000\000\200YanGu\202\000\000\200Li\202Cha\000\000\200\000\000\200\000\000\200Di\202Liu{\221\204Po\202\000\000\200\000\000\200BamLon\005P\204)\355\204\256\225\204vx\204Sat\003\226\204\303\254\204\000\000\200Zan\000\000\200\000\000\200\000\000\200Lou\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ci\202\220\307\205yH\204Gin{\226\205Kau\000\000\200{\214\205\000\000\200\000\000\200\000\000\200\000\000\200Hon\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\304\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\257\204"; -static const char b28b[769] = "\377\000\000\200{\207\204\000\000\200\000\000\200\000\000\200Luo\000\000\200\000\000\200Ma\202Duiy\310\204\3020\205\261\246\204Duo\000\000\200\000\000\200JueLi\202Lan\010\042\204\005\253\204Gu\202z\355\204Xu\202\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\324\204Sin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HoiFu\202Zok\000\000\200Sai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XueBo\202{x\205\000\000\200ZhuHei\000\000\200\000\000\200Ban\000\000\200\000\000\200\000\000\200BayXi\202\360\212\206\007x\204\360~\206\360\212\206Die\000\000\200\000\000\200{\221\204Guo\000\000\200\000\000\200\003t\204La\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\250\204\000\000\200Co\202\000\000\200Jip\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\376\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gai\000\000\200\000\000\200\000\000\200\000\000\200\037\243\204HomCunDamv\030\204RuaVamLap\303u\204\301\225\204vH\204\006\205\204\000\000\200Yu\202\000\000\200\000\000\200\000\000\200BanHou\000\000\200\000\000\200Zim\005\322\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200\007\335\204Si\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\262\204\302\236\205Veu\000\000\200\301\321\204Di\202Ji\202z\355\204\000\000\200\000\000\200\000\000\200\004\334\204\000\000\200\000\000\200ZanSo\202\000\000\200Lai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cai\006\327\204\000\000\200\000\000\200\0050\204Kem\004\340\204WaiAm\202\000\000\200\000\000\200{\240\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JinHei\010\305\204Hon\000\000\200\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tou\000\000\200\000\000\200\004\340\204\000\000\200\010\220\204DuiDuc\000\000\200\000\000\200\000\000\200Li\202\000\000\200\011\017\204"; -static const char b28c[769] = "\377\000\000\200\000\000\200z\350\204\0050\204\000\000\200\000\000\200\301\321\204Kem\302N\205\010\022\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200\005,\204\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhiJue\011\000\204Mo\202\000\000\200Luo\000\000\200\000\000\200Lai\000\000\200\000\000\200Bao\007&\204\000\000\200\000\000\200\303\312\205Jim\000\000\200\010k\204\000\000\200\000\000\200Bou\000\000\200Lom\000\000\200NenZhe\000\000\200\000\000\200Yu\202\011\017\204BenBao\000\000\200\000\000\200Ma\202Xi\202Hu\202Yi\202E\000\201Gu\202Tu\202{Z\204MouQiuSu\202{\207\205Qu\202\005\357\204{\012\204\005\230\204TouDa\202Louz\362\205\002M\204\003\002\204ZunGaiWei\000\000\200\000\000\200Kun\0070\204\007\023\204Qi\202\360\350\204\000\000\200\000\000\200\000\000\200Shi\000\000\200Gai\000\000\200\000\000\200DaoYao\000\000\200\000\000\200y\314\204z\350\204\000\000\200\360\366\204z\355\205Miu\000\000\200Mo\202\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200\006&\204\000\000\200Nie\002\376\204CenDaiDai\007\023\204NieCi\202\000\000\200\000\000\200Jun\302v\205\360\366\204\000\000\200ZhuDuoAn\202Bi\202\000\000\200\000\000\200Ti\202\000\000\200Pi\202XiaQiu\371\260\205\000\000\200\000\000\200\302\200\205\005!\204\000\000\200\000\000\200\000\000\200Man\003I\204\000\000\200Ti\202\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200\000\000\200Ji\202\003\014\204Wu\202\003\002\204Lao\010\243\204\006\260\204Can\000\000\200\010M\204\000\000\200z\355\204\000\000\200y\314\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ManGui\003\025\204z\367\205z\355\204\000\000\200\000\000\200\000\000\200\006\220\204\000\000\200\000\000\200XiaJiuJi\202{Z\204Cat\000\000\200\000\000\200\000\000\200\005P\204Diu\000\000\200MenYue\000\000\200\362?\205TunRuiXieXi\202\000\000\200\005P\204Niu\000\000\200\305`\204{\240\204\000\000\200Fen\000\000\200\000\000\200\302X\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ngo\303\362\204\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200DieJi\202Gan\000\000\200\000\000\200{\240\204"; -static const char b28d[769] = "\377z\343\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kai\000\000\200\000\000\200\000\000\200Que\000\000\200NanMouXu\202\007\023\204\371\260\204{\202\205QueWei\000\000\200\000\000\200\000\000\200DieNan\000\000\200Ruo\003=\204Dou\000\000\200{\327\204\000\000\200\000\000\200\010I\204He\202Yan\000\000\200\000\000\200Cua\000\000\200\000\000\200Tu\202Bu\202\000\000\200Hu\202\003]\204\000\000\200ShiChu\000\000\200\000\000\200\000\000\200\002\354\204\000\000\200\000\000\200\000\000\200\000\000\200\3621\204MenLi\202Ti\202\000\000\200{\240\204\000\000\200\000\000\200\000\000\200ZhiGua{\012\204\000\000\200Qi\202\000\000\200FeiYu\202ZheWeiE\000\201z\355\204Xi\202\000\000\200Gu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200QueHui\000\000\200Xie\004\377\204\000\000\200Ta\202WaiFu\202JiePi\202\000\000\200Cua\000\000\200\371\260\205Yu\202Kua\000\000\200Pi\202XieNuez\374\204{\240\204Xu\202\000\000\200Bi\202\000\000\200\000\000\200\000\000\200Nan\000\000\200{\207\205\000\000\200\003I\204\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200|\031\205Ta\202YanAi\202\000\000\200\000\000\200\3621\204z\350\205Wu\202\005!\204\000\000\200Jun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\230\204\000\000\200\010\026\204\000\000\200\006&\204DouShu\000\000\200\003\002\204NieEunYu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ce\202\000\000\200\003\002\204\000\000\200HuaWenYe\202E\000\201{\012\205Hua\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200|\031\205Lei\000\000\200{_\205\003]\204\000\000\200\005\262\204{\012\204Niu\000\000\200Suiz\374\205\000\000\200Sa\202z\355\205\302\236\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Run\000\000\200YunMo\202Fen{\240\204Xu\202\000\000\200\000\000\200\000\000\200Xi\202Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XieLi\202\000\000\200\000\000\200Tou\000\000\200\000\000\200Mi\202z\355\204HuoCua\000\000\200\372\230\205Yue\000\000\200\000\000\200\000\000\200Cua\000\000\200\000\000\200\000\000\200\000\000\200Lan\000\000\200Yan\010\220\204z\374\205"; -static const char b28e[760] = "\374Yue\005P\204\005\005\204Sanz\374\204DiePi\202\003I\204Mo\202Ta\202\000\000\200\003\002\204Ye\202CupYueFau\007\357\204\006\214\204Qi\202\005,\204Qi\202\000\000\200\000\000\200Han\007:\204YouJi\202GaiHaiShi\000\000\200Qu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wen\000\000\200\000\000\200{Z\204Po\202YanGu\202Ju\202|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\0102\204E\000\201\000\000\200PeiYa\202LinBi\202\000\000\200Bac\000\000\200Zi\202\005\335\204\000\000\200Duo\000\000\200Dui\003P\204\000\000\200{_\204\000\000\200{_\204YaoRan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tuo\000\000\200\000\000\200\002\354\204Xu\202Tun{x\205\000\000\200DouYi\202\000\000\200\000\000\200\000\000\200Che\000\000\200\000\000\200\000\000\200Dai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007q\204Ji\202\000\000\200\002\376\204\005\005\204\000\000\200|\015\204\000\000\200\000\000\200\000\000\200\000\000\200\006\260\204\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200TuoDauz\374\204Ni\202\003\031\204\000\000\200\000\000\200\004\334\204\000\000\200{Z\205\007\221\204\004#\204\003\014\204\0070\204Pi\202YanSouQiuE\000\201z\350\204\000\000\200z\350\204\003\272\204Ca\202Xun\000\000\200\000\000\200\000\000\200Jyu\007\252\204\000\000\200\003p\204\000\000\200\000\000\200Mao\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204Pi\202Xi\202YanFeiNie\000\000\200Zhi\000\000\200Suo\000\000\200Yi\202\000\000\200LeiXu\202\000\000\200Yi\202\000\000\200\000\000\200Wei\000\000\200\000\000\200Ji\202{x\204Die\000\000\200\007O\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007:\204\000\000\200Xi\202\000\000\200LiuSuo\000\000\200\000\000\200\302\212\205Xo\202\000\000\200Ven\000\000\200\000\000\200\005\005\204XiaYan\000\000\200Cuiy\320\204\007\014\204\000\000\200\000\000\200\003\006\204LouBi\202"; -static const char b28f[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\204\007A\204Wu\202Xu\202{x\204HaoJue\000\000\200{x\204Chaz\355\204ZhiXun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Be\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ge\202{x\204Ye\202\000\000\200\000\000\200\000\000\200\000\000\200ChuQu\202Xie\000\000\200{\221\204Ken\000\000\200Jue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NhoQu\202\000\000\200\006\205\204Ye\202ZouPu\202\000\000\200Shi\000\000\200\000\000\200\000\000\200\000\000\200Shuz\355\204\000\000\200JanDu\202\000\000\200GuoLu\202Yan\000\000\200\000\000\200\000\000\200\000\000\200\003\025\204Bin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202z\362\204z\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200{\207\204\000\000\200Yi\202\000\000\200Li\202Si\202\000\000\200\000\000\200Dai\000\000\200\000\000\200Wei\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200Jiu\005\335\204\000\000\200Yu\202\000\000\200Kui\000\000\200\000\000\200\000\000\200\004\272\204Ge\202\003%\204\000\000\200\000\000\200Kui\000\000\200\000\000\200GuiChi\000\000\200\000\000\200Jiu\000\000\200\000\000\200Sui\000\000\200\000\000\200Die\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sui\000\000\200\000\000\200\000\000\200Qin\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003p\204\000\000\200\000\000\200\007\036\204\000\000\200\000\000\200Yue\000\000\200\000\000\200\000\000\200Lok\000\000\200Zui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202Cui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\3055\204\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\365\204\000\000\200z\367\205"; -static const char b290[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Run\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005,\204\000\000\200\010:\204\000\000\200Kou\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200Ma\202Ou\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200San\007\023\204\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200San\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200CaiLi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Loi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yue\000\000\200w`\204\000\000\200\000\000\200Yun\000\000\200vd\204{x\205\000\000\200\000\000\200{_\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Conx\224\204Hu\202\007\261\204Tun\000\000\200Fou\000\000\200QinXu\202\000\000\200Gan\000\000\200\305X\205Fu\202CheRam\037\243\204Yi\202\004\352\204Fu\202Fu\202Ze\202Pu\202\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\007\261\204PaoMu\202Day\000\000\200YinLuoHuaYin\005\005\204Yu\202She\000\000\200XieChu\000\000\200\000\000\200\000\000\200JauDouJi\202\000\000\200ReiShe\3607\204Set\000\000\200\000\000\200Yi\202\000\000\200Che\007\277\204\003\031\204\0102\204YunYanMo\202\000\000\200Sui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\007\023\204\003\247\204\000\000\200Ya\202Se\202Duo\000\000\200\000\000\200\305X\206Xie\000\000\200\007\265\204\003=\204\003P\204\000\000\200La\202\000\000\200\005\357\204\000\000\200DaiZha\000\000\200\000\000\200KeiPui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yin\007\023\204\000\000\200Yu\202TuoTuo\000\000\200\010\344\204Ba\202RanBo\202Dai\000\000\200ZhaHou\000\000\200\000\000\200\000\000\200Hui"; -static const char b291[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204Ru\202\000\000\200CauMua\037\243\204\003=\204NomUm\202Ropw\000\204Dan\006\205\204Xia\006Z\204HanZi\202{Z\204Se\202CuoLi\202\000\000\200\3607\204{\207\204Gou\000\000\200\000\000\200\000\000\200\006\260\204\000\000\200y\324\204\000\000\200\004\377\204\000\000\200Hou\000\000\200DuiWu\202Set\004\352\204May,u\204\010\344\204NapXoi\007\335\204He\202\000\000\200\003\031\204Mo\202FeiLu\202Ze\202Bo\202\3607\204\006\351\204\000\000\200\372\230\206Lu\202\003\247\204DuiBu\202\000\000\200\000\000\200\000\000\200\000\000\200{x\204Man\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200TocSamDoi\010X\204\010\314\204An\202\362?\205\000\000\200NanTuoHe\202\000\000\200\000\000\200DuiWan\362?\205CenLi\202\372\266\206\000\000\200\000\000\200\000\000\200Cen\000\000\200Si\202\000\000\200Dui\000\000\200Hun\000\000\200\000\000\200\000\000\200\000\000\200MayRauZyu{\240\204\010M\204DanFu\202HuoHuiCi\202\000\000\200\003]\204Sa\202\005P\204\000\000\200\000\000\200\000\000\200\000\000\200Rao\000\000\200RaoLiuRopSam\011\032\204\005\357\204Man\3607\204\000\000\200\000\000\200\000\000\200Pao\000\000\200\005\357\204\000\000\200\005\357\204Li\202\000\000\200Nou\005I\204RaoAm\202Lie{_\204\000\000\200Fei\000\000\200\010X\204\000\000\200Mit{_\204\005I\204\000\000\200\005\357\204{\221\204\000\000\200BinLi\202\000\000\200Lo\202Si\202\010\314\204{\240\204\004\334\204\000\000\200\000\000\200\005\357\204\005\357\204\006\205\204\302\301\205\372\266\206\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204Mu\202SamHun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Loa\005\357\204{\240\204Qu\202\000\000\200\000\000\200\006\327\204\010M\204\0050\204{x\204\000\000\200\000\000\200\000\000\200\000\000\200w\314\204{Z\204\003\006\204\000\000\200\003\006\204E\000\201\000\000\200y\330\204Se\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bei\000\000\200Fei\000\000\200\000\000\200FeiFei\000\000\200\000\000\200\000\000\200\000\000\200\003%\204Ku\202\000\000\200\000\000\200\000\000\200\000\000\200Za\202Hui\000\000\200Fei"; -static const char b292[769] = "\377\000\000\200DuiBay\000\000\200\000\000\200\000\000\200Pa\202Niu\003\247\204DanDanAi\202\000\000\200|\015\204\010I\204Ao\202MeiNan\000\000\200\000\000\200Bo\202Yu\202z\374\204MaiMat\000\000\200\0102\204\000\000\200Dui\000\000\200Dao\000\000\200\000\000\200\003g\204Ni\202HanChu{\276\204Man\000\000\200\000\000\200Na\202\302!\204\000\000\200WanYi\202\005,\204Yan\000\000\200Wo\202\011\032\204\000\000\200An\202LanNan\000\000\200Qiu\003+\204NuoCanCan\000\000\200\000\000\200\000\000\200Lan|\015\204Ye\202\000\000\200{\327\204\000\000\200{\276\204\000\000\200\000\000\200\000\000\200\000\000\200Ci\202\000\000\200{\240\204\000\000\200\000\000\200Gan\000\000\200\000\000\200\000\000\200{\240\204Guo\000\000\200{\221\204\000\000\200Luo\000\000\200\000\000\200Ji\202Gui\000\000\200\000\000\200\000\000\200JiaJi\202\000\000\200\000\000\200\003P\204\000\000\200\003\014\204\000\000\200\000\000\200\000\000\200Bi\202Qi\202\000\000\200\000\000\200\007:\204AngDi\202\000\000\200\000\000\200E\000\201Fen\000\000\200\000\000\200Ju\202Ni\202Tuo\000\000\200\371\260\204Fu\202XiaQu\202Po\202Wan\005\357\204Ma\202\003c\204Bao\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\005\005\204Mai\000\000\200Jia\000\000\200\360\350\204\000\000\200Kua\003\002\204\000\000\200\002\354\204\000\000\200\000\000\200\000\000\200LuoGuiDuoZhi\000\000\200\000\000\200\000\000\200{Z\204E\000\201ZhuBa\202\000\000\200\000\000\200\000\000\200{Z\204\003\014\204Dou{\327\204Bu\202DuiShaSe\202Bi\202\000\000\200\000\000\200\000\000\200ZhiZheBu\202\000\000\200\000\000\200\000\000\200JueXun\000\000\200HiaDonXi\202\000\000\200\004\334\204BaiYao\004\320\204Ta\202z\350\204\000\000\200NaoYu\202E\000\201{\240\204Yi\202\3621\204\000\000\200Nie\000\000\200\000\000\200\002\354\204\000\000\200y\334\204\000\000\200\000\000\200GuoXie\005,\204\000\000\200\000\000\200Ju\202SuoDieFu\202\003+\204Shi\003P\204Ti\202Yu\202\000\000\200\000\000\200XieFu\202ZhiNi\202\003P\204\360\350\204\000\000\200\003\014\204\004#\204\003c\204\003P\204\000\000\200\000\000\200\000\000\200Zhu\000\000\200La\202\000\000\200\004\377\204GaoKuo\000\000\200E\000\201WeiMei"; -static const char b293[769] = "\377\000\000\200\000\000\200xL\204\006\333\204\004\320\204\000\000\200SuoTa\202SuoTa\202Xue\000\000\200\003=\204Jia\000\000\200Bo\202Ta\202\007:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200\000\000\200\000\000\200\000\000\200\257\320\204\000\000\200\000\000\200{s\205He\202Suo\000\000\200\000\000\200\000\000\200\000\000\200Mo\202z\367\205SuiZe\202Lu\202{\221\205LuoXu\202{\240\204{_\204\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\205\000\000\200\000\000\200\000\000\200BaoMai\000\000\200\3628\204Xi\202\000\000\200\000\000\200\006N\204\000\000\200\371\260\205\003c\204\000\000\200{\240\204Fu\202\005\262\204\000\000\200\000\000\200\003]\204Ju\202\000\000\200Yi\202\006l\204\000\000\200Se\202Sui\000\000\200DuoXie\000\000\200\000\000\200\000\000\200z\362\204RoiDep\000\000\200Ru\202Ni\202\003c\204Gui\000\000\200Luo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhiXu\202\000\000\200Zhi\000\000\200JueJu\202\000\000\200\000\000\200\007:\204Lu\202\000\000\200\000\000\200Bo\202\000\000\200\000\000\200\006N\204Xie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202Luo\000\000\200\000\000\200\000\000\200Ge\202\000\000\200\000\000\200\010k\204Han\000\000\200\003\002\204Sa\202QinQunPaoYueCheFu\202Pei\000\000\200\000\000\200Mei\000\000\200\000\000\200Tao\000\000\200KenXi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duo\000\000\200Yi\202\000\000\200\000\000\200Sui\000\000\200Xia\007q\204\000\000\200Wei\000\000\200Yi\202\000\000\200Yu\202\000\000\200BaiTuoTa\202Pao\000\000\200\000\000\200\000\000\200\002\354\204\000\000\200\000\000\200YunYun\0070\204\005\253\204Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200WeiGui\000\000\200Da\202Xia\000\000\200\000\000\200Hun\007q\204Sui\000\000\200Sui\000\000\200\000\000\200LouBaiYu\202{Z\205Gui\000\000\200KuiGaoDan\000\000\200\000\000\200\000\000\200z\374\204\005(\204Se\202\000\000\200Ke\202Bu\202Bo\202\000\000\200\000\000\200SuiViaYu\202Bu\202JiuJiu\000\000\200\007q\204Jue\000\000\200Na\202\005(\204TaoWei"; -static const char b294[763] = "\375XiaXie\000\000\200\000\000\200\000\000\200Sa\202Ji\202\000\000\200\000\000\200Xie\000\000\200\000\000\200DuiZi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007:\204QinFu\202\006\260\204PaoWanYin\000\000\200\005\335\204Zu\202\000\000\200\003=\204\004\352\204He\202Wo\202\000\000\200\003\247\204\000\000\200\000\000\200Su\202KanNieHao\003\014\204E\000\201Ye\202\000\000\200Wan\005P\204\004\352\204Zhe\010\230\204\000\000\200\000\000\200\000\000\200Mo\202Su\202\000\000\200Le\202{\264\205Pu\202E\000\201\004\334\204Ye\202\000\000\200\000\000\200\000\000\200z\374\205{\012\205Ren\005\357\204\000\000\200\000\000\200Ao\202\000\000\200\000\000\200\005\020\204\000\000\200Duo{}\205Ku\202Xu\202z\362\204Yao{Z\204\005P\204\005\005\204\000\000\200\000\000\200Ang\000\000\200KanCheKu\202PeiYouAo\202MenMo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\003\006\204La\202DouTan\000\000\200\000\000\200z\350\204YaoWeiHu\202Mo\202He\202\003P\204JimBi\202Po\202\000\000\200Di\202\000\000\200{Z\204\000\000\200ShiKanCe\202\000\000\200\000\000\200Xu\202{Z\204\000\000\200Zhu\000\000\200\000\000\200\000\000\200\000\000\200HuiChi\000\000\200\000\000\200\005\335\204NouNieYan\000\000\200z\367\205Fu\202{\012\205Qi\202\000\000\200Gen\005P\204\000\000\200\000\000\200\000\000\200Tanz\350\204\000\000\200\000\000\200JiuXu\202Qi\202\000\000\200{Z\204\000\000\200\000\000\200\000\000\200Qiu\000\000\200E\000\201\000\000\200\000\000\200Hui\005\335\204\003\006\204\000\000\200Che\000\000\200\000\000\200Fu\202\000\000\200\005\335\204Xi\202Wu\202\006\351\204\000\000\200\000\000\200Ti\202\000\000\200\000\000\200\005\335\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bo\202\000\000\200QinGen\000\000\200\000\000\200Fu\202Kui\000\000\200\010\002\204\007\042\204y\340\204\006\351\204Bie\0050\204KanGui\000\000\200GaoXu\202An\202YueWu\202Yi\202\0050\204\000\000\200Lu\202\301\357\204Tui\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\343\205JuePieKun"; -static const char b295[766] = "\376WaiHuiDun\007:\204Jie\000\000\200GuiGaoPo\202Men\372\230\205\004\272\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003]\204Qiu\006\327\204LeiAngPi\202\006Z\204\000\000\200\000\000\200Qin\000\000\200QinMieDouMi\202{\221\204\000\000\200\003\006\204Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ban\000\000\200\000\000\200\007q\204\000\000\200Ze\202Xu\202LanMa\202Ma\202Ou\202Bei\000\000\200PouXu\202\000\000\200\000\000\200\000\000\200Ao\202\000\000\200\000\000\200\000\000\200\236\353\204\000\000\200\005\335\204\000\000\200\000\000\200\005\335\204{\221\204\000\000\200SenGao\000\000\200Po\202\006z\204\000\000\200\000\000\200\000\000\200\000\000\200Wai\003P\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200E\000\201HanSe\202\000\000\200\000\000\200Dan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003P\204\000\000\200E\000\201Gai\000\000\200Dao\000\000\200\006\205\204Yi\202\006\373\204\000\000\200Pin\000\000\200\000\000\200\000\000\200\010:\204\000\000\200\000\000\200\000\000\200\000\000\200\007:\204\000\000\200E\000\201Nie\000\000\200\000\000\200YinSo\202\000\000\200\006\214\204\000\000\200\005\335\204\005\357\204\000\000\200z\355\204\004\377\204\000\000\200\000\000\200\000\000\200\000\000\200{\012\204\000\000\200\003\025\204Xu\202TanJin\000\000\200\000\000\200\000\000\200\006\260\204\000\000\200\006z\204\007\234\204\000\000\200Bei\000\000\200\000\000\200XinTun\010I\204Gan\000\000\200Hu\202\305`\204\000\000\200\303\033\205Fu\202Pei\000\000\200NaoXunXue\000\000\200\000\000\200Liu\005\357\204XueQu\202HaoYi\202Han\000\000\200Fu\202Ba\202Yi\202\000\000\200Bo\202\000\000\200MatTo\202\005\335\204Li\202\000\000\200\000\000\200\000\000\200Sa\202Xi\202\000\000\200\000\000\200\000\000\200Shi\007\335\204HuaYi\202Bo\202Bo\202NeiQiu\000\000\200\003\217\204WeiCheYou\000\000\200WeiHuiSa\202\000\000\200\000\000\200Tao\005\335\204SouHanPao\000\000\200\003%\204\000\000\200Liu\003c\204Pi\202\000\000\200Li\202\000\000\200\000\000\200\257\320\204Xi\202{Z\205\000\000\200\005\005\204{Z\205SuiYan\000\000\200\000\000\200\000\000\200\000\000\200\003\006\204Wu\202{\207\205"; -static const char b296[763] = "\375\002\376\204{\207\205\000\000\200\000\000\200MayJie\000\000\200\005\335\204You\000\000\200La\202Hou\000\000\200\007:\204\005\335\204Ye\202\000\000\200\004\377\204\003P\204You\000\000\200\000\000\200\000\000\200\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\005!\204Suo\000\000\200Li\202SouLi\202\000\000\200To\202Yu\202\000\000\200\000\000\200Yi\202\004\352\204vH\204\301\345\205HayvH\204XiuAo\202\007\265\204Su\202{\276\205\000\000\200Yu\202\000\000\200\003\014\204\000\000\200\000\000\200\000\000\200Su\202TuiYu\202{Z\205{Z\205\000\000\200Tao\000\000\200\000\000\200\000\000\200\000\000\200Liu\000\000\200{x\205SuiSao\000\000\200\000\000\200GioGioGio\000\000\200Gu\202\003\014\204Lie\007\335\204\000\000\200\000\000\200BaoLi\202\000\000\200\003\031\204Chu\3621\204\005\335\204XieShe\000\000\200\000\000\200\003\031\204Hou\003P\204\003\014\204\000\000\200Ba\202Bo\202TaoSu\202\002\376\204\003t\204SouTuiSuo\3621\204\005\313\204Sao\000\000\200Fei\301\371\205\000\000\200\000\000\200\000\000\200Niu\006\351\204\010\344\204\000\000\200Bay\000\000\200z\362\204Zhi\000\000\200\000\000\200\000\000\200Yi\202\000\000\200Yu\202\000\000\200\000\000\200Yi\202YueChi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NhuYinNiu\006N\204\000\000\200\000\000\200\000\000\200Na\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200|\015\204\000\000\200Ba\202y\344\204Qua\000\000\200Co\202Er\202{Z\205E\000\201PouJi\202Ni\202\000\000\200z\343\205Jia\000\000\200\000\000\200Gan\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200Zui\000\000\200\000\000\200Bei\000\000\200\000\000\200\000\000\200No\202Qua\036\036\204ShuYi\202Pai\000\000\200\000\000\200\000\000\200NaoShi\000\000\200ManShi\000\000\200Ti\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200DoiLeiBao\007:\204Zuo\005\230\204Xiu\000\000\200\000\000\200Zai{x\205{\240\204MaoJiaYu\202\000\000\200\000\000\200Yu\202Yi\202\000\000\200\000\000\200\000\000\200\006\351\204Zai\000\000\200\003p\204Ti\202BuaMoiXi\202Ju\202ZanLu\202Tao"; -static const char b297[769] = "\377\003p\204\005\357\204\000\000\200Ju\202\000\000\200\000\000\200Ji\202\007q\204\000\000\200\000\000\200Zi\202\000\000\200Yue\004\352\204\000\000\200\000\000\200\000\000\200\000\000\200\006\220\204\000\000\200\000\000\200\000\000\200z\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ang\000\000\200\000\000\200\000\000\200\007\277\204\000\000\200Bo\202\003x\204Wei\000\000\200\000\000\200v\220\204Moi\301\357\204Ke\202\000\000\200\000\000\200Pi\202KanFu\202\003]\204\000\000\200\007\265\204TouYouYao\000\000\200Ye\202\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Moiz\374\204\000\000\200Ti\202\000\000\200Sui\000\000\200\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200Xu\202Wu\202CanYu\202\000\000\200\000\000\200z\355\204Xia\000\000\200Kao\010:\204ChaQiu\000\000\200\000\000\200Da\202\000\000\200Su\202\000\000\200\000\000\200Hua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\007:\204\000\000\200y\350\204z\355\204\000\000\200{\240\205z\374\205\005(\204SanMo\202\000\000\200{_\205CaoSui\305X\206Mi\202Zhuz\367\205Ji\202z\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\207\204\000\000\200\000\000\200\000\000\200MemHai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dunz\374\205{x\205{_\205Li\202z\362\205\000\000\200\000\000\200\005\262\204\000\000\200\000\000\200{\207\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Za\202\000\000\200\000\000\200\000\000\200HuoLin\000\000\200\000\000\200Du\202Han\003]\204\007:\204Guo\005\357\204Qi\202{\207\204\000\000\200Ao\202\010\220\204Yi\202\010M\204{_\204\000\000\200Xin\000\000\200\000\000\200Da\202Yu\202CanWo\202ChaBo\202\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\205\204WeiMo\202DoiBo\202\000\000\200\000\000\200\3055\204Jie\010\016\204Huo\000\000\200\000\000\200\301\321\204Soi\003\031\204\006\333\204\000\000\200Tuo\000\000\200\000\000\200Yu\202\000\000\200Ducz\355\204\003]\204Huo\000\000\200Lan\006\220\204y\350\204\000\000\200\000\000\200Na\202"; -static const char b298[760] = "\374Ba\202GanYi\202Jia\000\000\200Da\202\003x\204XunRen\007q\204\007\265\204Xu\202\007\023\204\000\000\200Cao{x\205Sau\003x\204\000\000\200GatMao\000\000\200\000\000\200\000\000\200\303\216\205\000\000\200Hai\000\000\200\000\000\200\000\000\200\000\000\200Wu\202Cui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202GucJi\202So\202\000\000\200\000\000\200\000\000\200Oc\202KuiWei\000\000\200\257\320\204\000\000\200\257\320\204Cuiv\364\204\002M\204Fu\202Noc\007\265\204\000\000\200Bie\000\000\200Tan\004\272\204Pie\000\000\200\000\000\200\000\000\200Yu\202Tan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\134\204z\374\205\000\000\200Xiu\000\000\200\000\000\200\000\000\200\000\000\200\006Z\204Hai\006\260\204Yi\202Cau\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204Tan\000\000\200Biez\374\205\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\007\335\204z\362\204Mu\202Ba\202\000\000\200Fan\000\000\200\000\000\200\000\000\200\003x\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fen\000\000\200\000\000\200Jie\000\000\200\000\000\200\000\000\200Suo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200WanGe\202\000\000\200\000\000\200Fen\000\000\200Tuo\000\000\200WenGuaDuo\000\000\200ZheCi\202Yao\000\000\200BanBu\202Mo\202\000\000\200Po\202\000\000\200\000\000\200Ge\202\000\000\200\000\000\200Liu\000\000\200\000\000\200Ran\000\000\200\000\000\200Juk\000\000\200\301\345\205\000\000\200Gan\000\000\200Hu\202MouLua\000\000\200Xiuz\362\205Fu\202HuiSaiQu\202JieTuoYu\202Mo\202\003c\204Jiu\000\000\200Shu{\202\205{}\205LieFu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200On\202\000\000\200\000\000\200\000\000\200\000\000\200Lin\000\000\200Nie\000\000\200Pi\202\000\000\200Fu\202Bu\202Yi\202\000\000\200\000\000\200Bo\202\000\000\200E\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhe\004\272\204Li\202\000\000\200\000\000\200Tu\202Da\202\000\000\200Lu\202Yan\004\352\204QieWan\305;\204ZuiFu\202Qu\202BenAo\202z\350\205"; -static const char b299[769] = "\377\000\000\200Qun\000\000\200\000\000\200\000\000\200\003\217\204\000\000\200\000\000\200QueHuaz\374\204Kun\000\000\200\000\000\200\000\000\200Cui\000\000\200\000\000\200Yi\202\000\000\200\000\000\200BiuChi\004#\204Nao{x\205\0070\204\003]\204Zhe\000\000\200Tan\360\350\204Xie\003P\204\000\000\200\0070\204{\276\204z\374\204z\374\204\000\000\200\000\000\200E\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200La\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200WeiYouYu\202\000\000\200\000\000\200Ti\202\000\000\200Jin\000\000\200\005!\204Qi\202\000\000\200\3607\204TaoLu\202{\221\204WenJi\202Ao\202Ou\202Qia\000\000\200\000\000\200\000\000\200ShiTa\202\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200Zi\202\000\000\200\000\000\200Zha\000\000\200\000\000\200Yao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010X\204z\367\205Li\202Yu\202z\355\204Yi\202\000\000\200\000\000\200Chi\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tu\202\000\000\200Zu\202\000\000\200\000\000\200z\374\204\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200BieHanQi\202\010\230\204\000\000\200Fei\000\000\200{_\204\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\000\000\200z\362\204\000\000\200\000\000\200\000\000\200\000\000\200\010*\204\000\000\200\000\000\200\006l\204Yu\202Yu\202\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\271\204\004#\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202ZhiFanLieCaiDu\202{\012\205{s\205Li\202Qi\202v\210\204\000\000\200JueTuo\000\000\200Ju\202\3621\204\000\000\200\000\000\200\000\000\200\000\000\200Qu\202\000\000\200\000\000\200\000\000\200\372\230\205\000\000\200\000\000\200\000\000\200\000\000\200Jue{x\205\000\000\200\000\000\200\000\000\200Jie\000\000\200\003c\204z\374\204\003\031\204\360\350\204RanYi\202LieBo\202HunJi\202\004\352\204\003c\204\301\357\204Jie\000\000\200\000\000\200Li\202\000\000\200Ju\202WanBen\000\000\200\000\000\200Bi\202"; -static const char b29a[754] = "\372Ge\202\256\371\204\000\000\200z\350\204SouWei{x\205LouYu\202La\202z\350\204\3607\204Ta\202{\221\204Ji\202FanLie\005P\204Ji\202z\350\204Hu\202\000\000\200\000\000\200Yu\202Qi\202Yu\202Wa\202\000\000\200Ba\202Qi\202Sa\202\006\214\204Ya\202z\374\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ci\202Fan\000\000\200KunGunQueE\000\201{}\205\000\000\200\000\000\200Ma\202Ku\202Yao\000\000\200\000\000\200QueChuJia\000\000\200Zhuy\264\204DuiWa\202\000\000\200Nao\000\000\200\000\000\200\000\000\200Yan\3628\204\000\000\200\007\023\204Kui\000\000\200\000\000\200\003g\204Gun\0102\204\000\000\200\000\000\200\000\000\200Yu\202He\202\000\000\200\004\334\204\000\000\200\007\023\204SheYu\202\000\000\200\000\000\200Ji\202\000\000\200z\350\205\3055\204\301\321\204Zu\202\006G\204Ni\202\000\000\200Wa\202Zha\000\000\200Dan\000\000\200Veu\301\364\205\301\364\205Xac\000\000\200Du\202\303\362\204JieQiaHe\202z\367\205Yan\000\000\200Yan\000\000\200\000\000\200\000\000\200\007\023\204\005\326\204Yao\000\000\200KaoHom\003p\204GuiAi\202Hai\000\000\200\000\000\200\000\000\200\000\000\200SuoXu\202\003t\204\000\000\200\003\014\204Qu\202\006\351\204\000\000\200Guo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bi\202Jue\305X\206\000\000\200\000\000\200Pu\202\000\000\200\000\000\200SunYi\202\000\000\200\000\000\200z\350\204Yi\202E\000\201\005\357\204\000\000\200Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HuoMo\202Ban\000\000\200Xun\000\000\200\000\000\200YanSo\202\000\000\200\000\000\200Li\202\000\000\200Tan\000\000\200\000\000\200Cut\006\337\204\000\000\200KaiMao\3621\204\000\000\200\000\000\200\000\000\200\000\000\200Ai\202\000\000\200\000\000\200Ta\202\000\000\200\000\000\200Mei\000\000\200Guo\000\000\200\000\000\200\000\000\200GaoNaoHao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200)\335\204\000\000\200\000\000\200\000\000\200\000\000\200Que\000\000\200\000\000\200\000\000\200\000\000\200CaoSao\000\000\200\000\000\200\000\000\200\000\000\200Pi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xie\3621\204Ju\202\000\000\200\000\000\200\000\000\200\000\000\200{x\205Nao"; -static const char b29b[763] = "\375Nei\000\000\200\000\000\200\000\000\200\000\000\200JimGay\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mu\202\000\000\200\360\366\204\000\000\200\3607\204\000\000\200\000\000\200\005\357\204\000\000\200{Z\204Yao\000\000\200Fu\202z\350\204{}\205Ju\202\002\354\204MaoZhaTai\000\000\200\000\000\200\000\000\200z\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bop\005(\204\000\000\200Shi\003]\204\000\000\200{}\205DaoTi\202\003p\204\000\000\200Yin\000\000\200NaoBo\202{\202\205ZhiDuo\006&\204BaoYa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200CopLi\202\000\000\200\000\000\200Ju\202WenLie\000\000\200\000\000\200Wo\202Shi\003\025\204\006\351\204Jiu\000\000\200\000\000\200\000\000\200\000\000\200Xiu\000\000\200\000\000\200\000\000\200XuiWo\202\000\000\200Dao\000\000\200Xi\202An\202Da\202\004#\204Han\257\320\204Bi\202\000\000\200\004\352\204\000\000\200{\221\205\000\000\200\000\000\200\000\000\200Ya\202\000\000\200\000\000\200Di\202Huo\000\000\200\301\357\204RauMin\000\000\200\007]\204Fu\202\000\000\200BaoKe\202MaoRe\202\004#\204QiaXiaSouXiuNa\202\000\000\200\000\000\200\000\000\200Man\000\000\200\000\000\200\000\000\200\000\000\200Zhaz\355\204SheWo\202\000\000\200\000\000\200\301\357\204XomAi\202\006l\204Hao\000\000\200SaoSuoTi\202Ya\202\000\000\200\002\354\204\006N\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sha\006Z\204Ria\000\000\200Ao\202\000\000\200\372\230\206\000\000\200\007\335\204SuiYi\202SouDouSouLuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200)\341\204TocRauGayFeiZun\000\000\200Nao\005\262\204ZhiCuo\006z\204Ji\202Bo\202\006&\204{x\205Bu\202\000\000\200SanZan\000\000\200\000\000\200So\202\000\000\200\000\000\200\003\002\204\000\000\200\000\000\200YaoLu\202\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202\000\000\200\000\000\200\000\000\200\000\000\200BanMony\354\204JiePu\202\372\230\206Zan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SoiLi\202\000\000\200\000\000\200La\202"; -static const char b29c[748] = "\370z\367\205\000\000\200\000\000\200{\221\204\000\000\200\000\000\200\000\000\200\000\000\200wt\204\000\000\200\000\000\200\000\000\200\000\000\200\303\362\204\006Z\204\000\000\200\000\000\200\000\000\200\000\000\200\005\335\204\000\000\200\000\000\200\000\000\200PinJiuSe\202\000\000\200\000\000\200\000\000\200\000\000\200Ni\202FenXu\202\000\000\200Shi\000\000\200Ju\202\000\000\200\000\000\200\000\000\200Jue\000\000\200Yu\202\000\000\200GuoGuo\000\000\200Hu\202\0050\204\000\000\200Li\202XieEr\202\007:\204Hai\000\000\200\000\000\200\0050\204\000\000\200Ke\202\000\000\200\004#\204Fei\000\000\200\006\260\204\007\277\204\000\000\200{\240\204Ni\202\000\000\200z\374\204Li\202\010I\204\000\000\200Er\202\007\277\204Yu\202Hu\202FeiAo\202\000\000\200\000\000\200\000\000\200Er\202\000\000\200\000\000\200\000\000\200\000\000\200Ke\202Ku\202Bo\202\000\000\200\000\000\200Ye\202\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010I\204\007\277\204Ru\202\000\000\200Yue\000\000\200Lin\000\000\200\000\000\200\000\000\200\000\000\200Yu\202Yue\005(\204\3621\204\000\000\200\000\000\200Mie\000\000\200\000\000\200\000\000\200GuiJiu\000\000\200Tuo\000\000\200\000\000\200Xi\202Wei\004\334\204WeiKui\000\000\200\000\000\200Mei\000\000\200Hao\004\272\204\003%\204NiuYouHua\000\000\200\000\000\200\005\230\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZhuGuiBi\202Jia\007\036\204v@\204Lu\202\006\237\204Zui\005\357\204Qi\202\000\000\200Zhu\007\252\204\000\000\200\000\000\200\000\000\200Gu\202Zu\202\000\000\200\360\350\204Su\202\000\000\200Kui\000\000\200z\355\205\000\000\200Yao\000\000\200\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ShuLaiYi\202Dou\000\000\200w\234\204\000\000\200Wu\202\004\377\204Fu\202\372\230\205Fu\202\000\000\200Su\202Li\202YaoTui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200\000\000\200Lu\202YanQi\202\005\230\204Zhu\000\000\200GuiHu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200Chiv@\204QueJu\202Zha\000\000\200\005\014\204"; -static const char b29d[766] = "\376ZhuGan{s\205Ji\202\000\000\200Via\000\000\200\007\261\204MeiYun\000\000\200\000\000\200Gan\002M\204\000\000\200\000\000\200Lu\202You{\240\205Nuo\000\000\200\000\000\200\000\000\200\000\000\200Ju\202Youv@\204\000\000\200Yi\202\005\326\204WeiCheLinGu\202\000\000\200Li\202\006z\204\000\000\200\000\000\200\003\002\204\360\350\204\003t\204Qi\202\000\000\200Via\000\000\200Yi\202\000\000\200\000\000\200Bin\006\205\204Cha\000\000\200Gan\000\000\200\000\000\200\000\000\200Qu\202Di\202Lei\000\000\200\000\000\200Mit\000\000\200\005\357\204\000\000\200\000\000\200v@\204z\362\204Qu\202\000\000\200Luo\000\000\200Kui\000\000\200Ju\202\000\000\200QiuYu\202Hua\000\000\200\000\000\200\000\000\200Lei\000\000\200Ren\3621\204Si\202\000\000\200\000\000\200Du\202BieCa\202\005\020\204\360\242\205\000\000\200Niu\000\000\200He\202Pei\000\000\200FeiMu\202\000\000\200\000\000\200Fu\202\000\000\200\000\000\200Hu\202\305`\204Sha\000\000\200\003\002\204Wu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200JauTomTreNgu\000\000\200\002\354\204Zhu\000\000\200ZhuChi\000\000\200\371\260\204Hu\202Bu\202\000\000\200\000\000\200\000\000\200\000\000\200Ran\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mu\202\000\000\200Li\202\000\000\200\000\000\200Jia\000\000\200\257\375\205Ma\202y\360\204\000\000\200\006\205\204Mou\003c\204z\374\204Hui\007\230\204Jiu\000\000\200Mu\202x|\204Ru\202Si\202Wu\202\000\000\200Ru\202\000\000\200Zha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NuoXie\000\000\200{\240\205\000\000\200Goi\005\204\204y\364\204y\370\204ThuLi\202ShuYi\202Di\202\003\006\204Ju\202\000\000\200\000\000\200Zhi\000\000\200\005\230\204Bu\202{\202\205Yi\202\000\000\200Bo\202y\370\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Chi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\205\000\000\200Wo\202Xun\000\000\200\000\000\200Vay\000\000\200Tun\006\351\204\000\000\200\003%\204\004\334\204\000\000\200Qia\000\000\200Ta\202Qi\202"; -static const char b29e[760] = "\374\006\260\204BieFenTu\202Hua\000\000\200JipE\000\201\000\000\200\000\000\200\000\000\200E\000\201\000\000\200\000\000\200\003x\204\000\000\200Ru\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200\301\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200YanSi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\377\204Ni\202Ni\202Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\006\327\204\010\344\204\301\321\205Go\202y\374\204SuaMoiTre\257\375\205v\024\204Roivx\204Mi\202\000\000\200\000\000\200\000\000\200\000\000\200Ye\202Po\202Cou\000\000\200Wei\000\000\200Hai\004\377\204\000\000\200\005P\204ZhiFeiYou\000\000\200\000\000\200KuiAn\202Ba\202\000\000\200Han\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NanNai\000\000\200\000\000\200\0050\204\000\000\200ThuWei\000\000\200\000\000\200\212\346\204NauMe\202TepKhox|\204Mu\202w\304\204\302!\205ChuBo\202SuoTaoQi\202\005!\204WeiGany\370\204Ge\202\000\000\200Han\000\000\200Na\202Ge\202\000\000\200\000\000\200\000\000\200\000\000\200{Z\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ngov\340\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200\000\000\200\000\000\200Si\202\000\000\200Ni\202\010\230\204\000\000\200\000\000\200Bon\255\221\205w\240\204SatSo\202\302\205\204x|\204\010\344\204VayBonXie\007\316\204\000\000\200\000\000\200Zu\202Yu\202Ni\202Qi\202\000\000\200\000\000\200\371\260\204\000\000\200\000\000\200\000\000\200\000\000\200Gay\000\000\200Bu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007&\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KunLi\202\000\000\200Gua\000\000\200MamLepSopDuaThex\200\204YanBu\202{\240\204\000\000\200Wu\202CenLin\372\230\205\000\000\200Hui\000\000\200\3628\204Zha\000\000\200Hei\000\000\200\000\000\200Guo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200Die\000\000\200\004\377\204Dai\255\322\204VayLeoZhi"; -static const char b29f[769] = "\377VayRo\202Wei\000\000\200Ji\202\006N\204\000\000\200\000\000\200Ao\202\010\220\204LuoYe\202Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\350\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ge\202Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\230\204Gwox\200\204\000\000\200Zou\000\000\200Yi\202\000\000\200\000\000\200Zha\000\000\200Lie\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200Ye\202\000\000\200\000\000\200v\020\204v\020\204\000\000\200\000\000\200\000\000\200{\221\204\000\000\200\000\000\200\000\000\200\004\320\204\003t\204\000\000\200\000\000\200\000\000\200\000\000\200Xu\202You\000\000\200SauLuiSu\202\000\000\200XieWeiLi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\000\204\303\300\205\000\000\200\000\000\200\000\000\200Bo\202{\240\204z\355\204Kun\000\000\200\000\000\200\003\006\204\000\000\200\000\000\200Sau\302\212\204\000\000\200\372\266\206Xi\202Qu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200\000\000\200\010\220\204{\327\204Li\202\000\000\200Ba\202wt\204E\000\201Fu\202Fu\202HunZhaAn\202\000\000\200\000\000\200Qiu\004\320\204\003+\204XunTu\202Ni\202Hu\202Shu\000\000\200Xu\202\362?\205\007\014\204\000\000\200You\000\000\200\000\000\200\000\000\200\3621\204\3621\204Ci\202Chi\000\000\200\005,\204Yi\202\000\000\200\003x\204\000\000\200\000\000\200HanWan\000\000\200Yi\202BaoYi\202\000\000\200\000\000\200\000\000\200\000\000\200Xun\000\000\200\000\000\200\000\000\200\000\000\200z\374\205\000\000\200\000\000\200\000\000\200Tri\000\000\200\000\000\200Bi\202\000\000\200\000\000\200JieGe\202Ze\202\000\000\200{Z\204Hu\202Xi\202Xin\3621\204Fu\202\362?\205\000\000\200MaoXinz\350\205\000\000\200\000\000\200\000\000\200FenBanz\362\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\002\204\000\000\200BaoYa\202Yao\000\000\200\000\000\200MaoQua\303\317\205Xi\202\000\000\200Ju\202CaaQu\202YueTaiTouMo\202ZhaQu\202\000\000\200Fu\202\303\317\205Qu\202Chi\000\000\200You\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\000\000\200Ti\202\000\000\200\000\000\200Wa\202\000\000\200\000\000\200Tuo\000\000\200Chu"; -static const char b2a0[769] = "\377\000\000\200Ge\202\000\000\200\000\000\200*\005\204QuaSe\202\000\000\200\000\000\200Ge\202Qu\202\000\000\200\000\000\200\000\000\200Sa\202Ju\202Bip\000\000\200DieYi\202ShiYi\202\000\000\200Gui{\240\205\000\000\200\007\023\204{}\205\000\000\200E\000\201z\362\205HuiXun\000\000\200\000\000\200Ju\202\000\000\200\005(\204ChiLao\000\000\200Qi\202Xiu\000\000\200Hui\3628\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200XunJieMi\202Yu\202\000\000\200x\374\204\360B\205KetSacHau\007\023\204\372\230\206\003\002\204Zhi{x\205\000\000\200Jie\3621\204{x\204Li\202Yue\000\000\200ZhiLaoWo\202Qu\202\000\000\200\305`\204\000\000\200Yi\202Yi\202\005\230\204\000\000\200TouAn\202JueYan\000\000\200\000\000\200\000\000\200Ju\202\000\000\200{Z\204\000\000\200Zhi\006\351\204\000\000\200\000\000\200\000\000\200Xiu\000\000\200\000\000\200\305X\206ChuTraCocCocQua\000\000\200z\350\205Feiz\355\205\000\000\200\003+\204Su\202Ao\202\000\000\200Fu\202\000\000\200\000\000\200\000\000\200WeiZhiMinz\355\205YanYu\202\000\000\200Fu\202Ta\202Ji\202\000\000\200Fei\000\000\200\000\000\200Hu\202Ju\202\000\000\200Yu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qi\202Mei\000\000\200\000\000\200BieGuo\000\000\200\000\000\200\000\000\200\305;\204\000\000\200WanWan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Co\202Go\202GieVacCo\202Cun\0050\204Yu\202z\374\204\000\000\200\000\000\200\256\371\204Ji\202\000\000\200z\374\205PenFu\202\000\000\200\000\000\200\000\000\200Liu\000\000\200SaiXueZou\000\000\200Jie\000\000\200\000\000\200{\221\204\000\000\200Yu\202Yu\202Mei\005\014\204MaoDuoFu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cha\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\204\204\000\000\200\000\000\200\000\000\200\000\000\200\005\014\204\000\000\200Ao\202\000\000\200\000\000\200\000\000\200\000\000\200Ke\202\000\000\200\000\000\200\000\000\200HauCha\0050\204Ga\202TraHou\000\000\200Jip\000\000\200Gou\000\000\200Xi\202\000\000\200\006N\204Ge\202"; -static const char b2a1[751] = "\371Pan\007:\204Xia\000\000\200\000\000\200ShaPi\202Fu\202\003\006\204\003]\204Qu\202\000\000\200\003=\204\000\000\200Ge\202z\374\204\000\000\200Su\202\000\000\200\000\000\200\000\000\200BanQi\202Hou\000\000\200\000\000\200\000\000\200Xi\202\000\000\200Wu\202So\202\000\000\200\000\000\200\000\000\200\000\000\200HukSaoCut\256\270\2043Y\204Sao\000\000\200\000\000\200\000\000\200\000\000\200Qi\202Hu\202Gui\000\000\200Di\202{_\205MaiMinJi\202Xi\202z\374\204Ji\202z\355\205Kouz\367\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\221\205\007\335\204Su\202LueLi\202\006\205\204z\367\205|\015\204\000\000\200\005\357\204\000\000\200Chi\000\000\200\000\000\200Mok\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\367\205\000\000\200\000\000\200Chi\000\000\200\000\000\200\000\000\200\003\025\204\000\000\200\003]\204\000\000\200\000\000\200\000\000\200\000\000\200KenVacy\304\204v\364\204Ri\202Sam\303\324\205Vac$\301\204Tu\202Mi\202\000\000\200Shu\000\000\200Xi\202\000\000\200E\000\201Zi\202\006&\204\000\000\200JieJi\202Hou\371\260\205Li\202\000\000\200Qi\202\000\000\200\003c\204Si\202Qu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Si\202\000\000\200\000\000\200\000\000\200Si\202\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200$\301\204Dui\303\317\205Tu\202Vet\000\000\200\000\000\200\000\000\200\004\324\204\000\000\200\000\000\200\000\000\200\010M\204Ya\202LiuJiaGuiKuiChiCanChu\000\000\200Guo\000\000\200DanLoi\000\000\200\000\000\200{\240\204\000\000\200\010\220\204Hou\000\000\200Kou\000\000\200Chuz\350\204Ai\202\000\000\200Pi\202Cui\010M\204Quax\214\204\303\235\205SaoXun\0050\204\006\205\204\000\000\200BinLanGu\202\004\320\204\000\000\200\000\000\200\003]\204GuaYu\202\003c\204Juk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bo\202\303\014\204\2604\205Cui\000\000\200Cai\000\000\200LiuBu\202LuoJie{Z\204Mie{\012\205\000\000\200Jia\000\000\200La\202"; -static const char b2a2[769] = "\377\002M\204\000\000\200\000\000\200Guo\000\000\200\000\000\200\006\205\204z\350\204Lai\000\000\200He\202\007\265\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\335\204\000\000\200\000\000\200\000\000\200Lu\202\000\000\200\000\000\200Jia\0050\204\000\000\200\000\000\200\000\000\200\000\000\200Gui\000\000\200\000\000\200Yi\202z\362\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200\000\000\200LeiJue\000\000\200\000\000\200\000\000\200{\012\204\000\000\200\000\000\200\301\357\204\003\025\204\000\000\200\302:\204Man\000\000\200\000\000\200YunWenChiChiZhi\000\000\200Ci\202\372\230\206HuaJieQu\202Tu\202MinMeiYu\202Ao\202Ban\000\000\200Pi\202{Z\204Lu\202ChiTou\000\000\200Jie\000\000\200{\221\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JinLu\202\000\000\200v\204\204{\240\204Tanz\355\205En\202Ci\202\000\000\200\000\000\200WaiCouKan\000\000\200\303\362\204\000\000\200\000\000\200v\204\204\000\000\200\000\000\200\000\000\200Wen\000\000\200\000\000\200z\350\204\000\000\200ManManGan\000\000\200\000\000\200Hui\000\000\200GanMamJi\202Gan\000\000\200\006\333\204\000\000\200\000\000\200\000\000\200Si\202\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\217s\204\000\000\200Pi\202\000\000\200Ca\202\000\000\200\000\000\200\000\000\200\000\000\200Ben\000\000\200\000\000\200\010\230\204\000\000\200\000\000\200Shi\000\000\200\000\000\200z\362\204\000\000\200Gui\000\000\200\000\000\200Ou\202\000\000\200\000\000\200Lin\000\000\200\000\000\200\000\000\200\000\000\200\217s\204Pao\241z\204\004\377\204\005P\204\3621\204\000\000\200Zhu\217s\204Yu\202\000\000\200{\334\204\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200Qu\202WanKun\003p\204\000\000\200Yu\202Guo\0102\204ZuiZu\202\000\000\200Zhu\007\326\204Zhu\000\000\200\000\000\200\000\000\200\000\000\200\007\335\204Mi\202\000\000\200\000\000\200\000\000\200\000\000\200Bi\202Su\202\000\000\200{\271\205\000\000\200Pu\202Mi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ye\202Yu\202\000\000\200Yu\202\000\000\200Zhu\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nou\000\000\200\000\000\200\000\000\200\005\357\204Buk"; -static const char b2a3[769] = "\377\006z\204\000\000\200Tuo\000\000\200Bi\202Na\202Qu\202\000\000\200Pi\202DouNieTun\000\000\200Ji\202\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200Ku\202Su\202\000\000\200\000\000\200\000\000\200Tou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200NaiZe\202\000\000\200\000\000\200\3628\204Ge\202Dui\000\000\200\000\000\200Jie\000\000\200|\015\204\007\036\204ChiQu\202\000\000\200Sha\000\000\200Bo\202Li\202\000\000\200Luo\000\000\200\006z\204Shu\005\262\204\000\000\200ChiMie\000\000\200TaoHun\000\000\200Nie\000\000\200JunHu\202\000\000\200Lu\202Ye\202\000\000\200Mo\202\010I\204\000\000\200\000\000\200\000\000\200Suo\000\000\200Ke\202Fu\202\000\000\200\010I\204\000\000\200\000\000\200Suo\000\000\200\000\000\200Qiu\000\000\200\000\000\200\000\000\200Su\202\000\000\200Yun\000\000\200SuoKu\202Bo\202\000\000\200LouMo\202\000\000\200{\207\204\003P\204SuoManBi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ti\202\000\000\200{\207\204Tan{_\204\000\000\200Qu\202Du\202z\362\204Sao\000\000\200\000\000\200\000\000\200{\202\205\000\000\200\000\000\200\000\000\200Nie\000\000\200NieLuoZuoYi\202z\374\204\010I\204TieLoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\016\204\000\000\200Mi\202\000\000\200\000\000\200Mi\202\000\000\200\000\000\200\000\000\200Wan\000\000\200Benz\350\205\000\000\200Mo\202\000\000\200\000\000\200LiuWo\202\000\000\200Mei\000\000\200TouWaa\000\000\200Mu\202\000\000\200Mei\000\000\200\000\000\200\000\000\200\000\000\200Zuo\000\000\200Tun\007\014\204Tun\000\000\200\000\000\200\000\000\200Che{Z\205\000\000\200z\367\205|\015\204\000\000\200Zhiz\355\204z\355\204\000\000\200\000\000\200\003\006\204TunHuiQue{\221\204{\240\204z\355\204\000\000\200z\362\205\000\000\200HuiChi\000\000\200z\362\205\005\313\204Yun\000\000\200\007\265\204\303\362\204\000\000\200z\362\205Yun\000\000\200\000\000\200\000\000\200\000\000\200Mo\202\003=\204\000\000\200\003=\204\000\000\200Gui\000\000\200z\355\204\000\000\200QueRui{\202\205\007\335\204\000\000\200LaiRu\202\000\000\200\000\000\200\000\000\200NiuHu\202JinNi\202Bao\000\000\200Ni\202\000\000\200Bi\202Hu\202Li\202\000\000\200\000\000\200Zhu"; -static const char b2a4[769] = "\377Na\202\000\000\200\301\357\204\003\014\204Bi\202Li\202Bie{\327\204\004\352\204\000\000\200\000\000\200{\207\204Ni\202{\207\204Ma\202Zhe\000\000\200\000\000\200\000\000\200JiaYi\202\000\000\200\003\031\204\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200DaiDu\202\000\000\200\000\000\200\000\000\200Si\202Yi\202\000\000\200Tai\004\272\204Shu\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200Su\202YaoEr\202\000\000\200{Z\204\000\000\200Zyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dou{\240\204\000\000\200\000\000\200Si\202\003\247\204Hui\000\000\200Cha{_\204Lu\202WeiYu\202\000\000\200YanWan\006\214\204LuoYu\202\000\000\200\000\000\200Tu\202Weix\240\204Tun\000\000\200\000\000\200HunBenQie\000\000\200JinLaiMeiZhiYu\202\000\000\200Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ye\202DieCha\3607\204Man\000\000\200\005\262\204Wei{\327\204Lei\002\354\204Wu\202\000\000\200{Z\204\000\000\200\000\000\200RouWaiMi\202Jie\000\000\200Hou\000\000\200\005(\204Ru\202Zi\202Pan\000\000\200Mo\202\000\000\200Mi\202\000\000\200Qi\202Mo\202\000\000\200\000\000\200ZhiBan\000\000\200Mie\000\000\200Lu\202\000\000\200Qi\202z\367\205\000\000\200Li\202Yi\202\000\000\200v\320\204\005\262\204Cuo\000\000\200DuiMa\202Yan\000\000\200\010\243\204YanDuiPu\202\000\000\200\000\000\200Yue\000\000\200\000\000\200\000\000\200HuoMai{\240\204\010M\204Qin\000\000\200Qin\000\000\200\000\000\200Ye\202\302\200\204Tai\000\000\200\000\000\200y\014\204\000\000\200{\240\204\000\000\200\000\000\200Chaz\004\204Dan\005\326\204Li\202\000\000\200\000\000\200{\327\205z\355\204\006a\204\000\000\200Den\302\306\205\000\000\200Yu\202\000\000\200Zui\303\362\204\000\000\200\000\000\200Chu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ran\000\000\200Ran\360\350\204Bo\202\000\000\200\000\000\200\000\000\200\000\000\200Cu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\302!\205SamMi\202\000\000\200Ke\202\000\000\200Cu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202\000\000\200Ma\202\000\000\200Shi\3607\204\000\000\200\000\000\200Shi"; -static const char b2a5[766] = "\376\000\000\200\000\000\200\003x\204z\343\205\000\000\200\007:\204Gan\000\000\200\000\000\200\000\000\200HuiJi\202\000\000\200\006\260\204\000\000\200\005\262\204\000\000\200\005\005\204\000\000\200\000\000\200\003\247\204Ta\202\000\000\200\007:\204Gao\007:\204\004\256\204\000\000\200\000\000\200\000\000\200\000\000\200Jia\3034\205Boi\000\000\200\006\237\204\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200z\374\204Qi\202\000\000\200\010\230\204\000\000\200\000\000\200\000\000\200Yin\000\000\200\000\000\200\003\031\204\000\000\200\000\000\200\005\326\204\003\031\204\000\000\200\000\000\200Ren\000\000\200\000\000\200Yin\0102\204Pu\202\007:\204\006N\204\000\000\200\003%\204\000\000\200\000\000\200\000\000\200\004\272\204Mi\202Hu\202Zi\202\000\000\200\005\357\204z\343\205\006N\204\000\000\200\000\000\200\000\000\200\0102\204{\012\205Er\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cu\202Jun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xiu\000\000\200Er\202Ti\202\000\000\200\360\350\204\000\000\200Ai\202Hu\202Xi\202\000\000\200Hu\202\000\000\200Si\202Li\202\000\000\200Yi\202Gu\202\000\000\200\005!\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Que\004#\204Li\202\000\000\200\003\002\204\000\000\200\000\000\200FanPu\202Si\202\000\000\200JieLu\202Li\202z\355\204\000\000\200Yao\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200\000\000\200\000\000\200Hou\3607\204QiuJue\000\000\200Pi\202\000\000\200Seo\000\000\200Kui\000\000\200\000\000\200Xi\202Ti\202\000\000\200\000\000\200Xu\202\000\000\200MuiMuiw<\204\000\000\200\303\362\204\000\000\200\000\000\200He\202{\207\204\000\000\200\000\000\200Su\202\006z\204\000\000\200\000\000\200wD\204\000\000\200Jin\000\000\200\000\000\200\000\000\200HitLi\202z\355\204\000\000\200\000\000\200Qi\202Qi\202\000\000\200\000\000\200Zi\202\000\000\200Zi\202\000\000\200Qi\202\000\000\200Qi\202Zi\202\000\000\200\005(\204\005(\204Pa\202\000\000\200Ju\202\000\000\200\000\000\200Yan\000\000\200\000\000\200\004\272\204Na\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200{\221\204ShiZhi\000\000\200\000\000\200\000\000\200\000\000\200Zha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006N\204Zha\000\000\200Yi\202\305;\204Ya\202\000\000\200Zhi\000\000\200KuoXia"; -static const char b2a6[634] = "\322\003I\204Ta\202\000\000\200Yi\202\000\000\200\000\000\200Xiu\005(\204\000\000\200DuoE\000\201\000\000\200Loi\000\000\200Yin\000\000\200E\000\201\011\032\204An\202Cuo\000\000\200Tuo\000\000\200TuoXia\000\000\200\000\000\200\301\321\204\000\000\200\011\032\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202z\350\204Zu\202\005(\204Yun{\221\204\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ya\202Yue\000\000\200\010\314\204\000\000\200\000\000\200\000\000\200He\202Qia\000\000\200\000\000\200\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\000\000\200\000\000\200\000\000\200\000\000\200Hu\202\000\000\200Yan\000\000\200QieBo\202z\350\205Jie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202\000\000\200\000\000\200z\355\204Qin\000\000\200Zao\000\000\200\000\000\200YinXie\000\000\200Qi\202{\240\204\000\000\200\000\000\200Xu\202\000\000\200\010\243\204\000\000\200E\000\201\000\000\200\000\000\200\000\000\200Zu\202Yi\202\000\000\200\000\000\200\000\000\200\000\000\200ZhiLi\202\000\000\200\000\000\200Li\202Yin\000\000\200\000\000\200{\207\204\000\000\200z\355\204\000\000\200Jue\000\000\200Za\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005(\204\003I\204\000\000\200\003\031\204\000\000\200\003\031\204\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200\3034\205\000\000\200\000\000\200\003\031\204\000\000\200\000\000\200\003\031\204\000\000\200\006\351\204\000\000\200\3034\205Zhe\000\000\200\000\000\200\000\000\200Gwi\000\000\200\000\000\200GanGouRanCu\202\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bo\202\000\000\200ZhuQiu\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200HuiQu\202\000\000\200Rua\000\000\200Rua\005\357\204\000\000\200Yin\000\000\200\000\000\200\000\000\200Pi\202\000\000\200\000\000\200\000\000\200{\207\204"; -static const char b2a7[667] = "\335\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202"; -static const char b2a8[757] = "\373Ku\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{Z\204\000\000\200Sa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ce\202\000\000\200\217s\204\000\000\200\000\000\200Huk\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200Kiu\000\000\200\000\000\200v\354\204\000\000\200\000\000\200\000\000\200\000\000\200Bai\000\000\200\000\000\200Jim\000\000\200\000\000\200\000\000\200{\221\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202\000\000\200\000\000\200Kui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sau\000\000\200\000\000\200\000\000\200w\354\204\000\000\200\000\000\200\000\000\200>3\204\000\000\200Shu\000\000\200\000\000\200z\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\337\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\256\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\326\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou"; -static const char b2a9[652] = "\330\000\000\200\000\000\200\000\000\200\000\000\200Bai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006z\204\000\000\200\000\000\200\217s\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\226\205\000\000\200\000\000\200\000\000\200\000\000\200\006\373\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Min\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\217\204"; -static const char b2aa[754] = "\372\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\010\204\000\000\200\000\000\200\007\023\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\217s\204\000\000\200Ya\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200She\303\331\205\000\000\200Tuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200Nie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\214\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003]\204{\214\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200CauJi\202\000\000\200Cim"; -static const char b2ab[613] = "\313\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\005i\204\000\000\200\000\000\200\000\000\200\000\000\200Mei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\230\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\220\307\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\270\204\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sok\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\376\204\000\000\200\000\000\200>3\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sim"; -static const char b2ac[667] = "\335\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sip\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200You"; -static const char b2ad[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010v\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200x\244\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Si\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\006\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200\010\002\204"; -static const char b2ae[754] = "\372\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zuk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ta\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200\000\000\200Kiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200Nu\202\000\000\200\011\013\204\000\000\200\303\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\261\246\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\263\204"; -static const char b2af[709] = "\353\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Boi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\271\205\000\000\200\000\000\200{\240\204Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200She\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ya\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\014\204"; -static const char b2b0[664] = "\334\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Min\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200Chu\000\000\200\010\220\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Baa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y,\204\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MouWai\000\000\200\000\000\200\000\000\200{\226\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Man\000\000\200\000\000\200~\266\204\000\000\200Fei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ai\202\000\000\200\000\000\200Su\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jiu\000\000\200\000\000\200\000\000\200\000\000\200Kou"; -static const char b2b1[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GauWu\202GamMou\005,\204Bi\202Si\202\006\025\204\004\256\204Fuk\011\013\204\010\204\204w\214\204JieYanChi\007V\204\010\230\204LitSitFuk\005P\204\000\000\200\010\344\204SikMouSi\202\031\234\204\005\005\204{\315\205Yi\202Xun\007\316\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\207\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Be\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200>3\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\025\204\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Co\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\013\204\000\000\200\302\262\205"; -static const char b2b2[757] = "\373\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\000\204\000\000\200\000\000\200\000\000\200\000\000\200,a\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qia\000\000\200\000\000\200\000\000\200\000\000\200z\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Oi\202\000\000\200\000\000\200Syu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\205\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\011\000\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Giu\000\000\200\000\000\200w\314\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Giu\000\000\200\000\000\200\000\000\200\000\000\200Te\202\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Au\202\000\000\200\000\000\200\000\000\200\000\000\200\007\373\204\000\000\200Jiu\000\000\200Kui"; -static const char b2b3[700] = "\350Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zip\000\000\200\000\000\200\000\000\200Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200Mik{\207\204\000\000\200Mei\000\000\200\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202JiuFan\006\233\204\000\000\200Hu\202Yi\202\251|\204To\202Nao\3628\204GiuTiu\011\013\204Ci\202ZanFaaGeiYan\005I\204\000\000\200Watz\374\204Xi\202y,\204\3621\204\004\371\204Lau\010\257\204Chi\007\042\204SinZe\202ShaHei\362?\205\003P\204\006\373\204Zin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\371\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\217\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204Gau{\207\204CamCan\010}\204Gamw\314\204\000\000\200\000\000\200\000\000\200Lik\000\000\200Bat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\214\205\000\000\200\000\000\200But\000\000\200\000\000\200\000\000\200\000\000\200Jue\006\327\204\000\000\200\000\000\200\000\000\200\010\305\204Luo\000\000\200\000\000\200\000\000\200\303\336\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\374\204"; -static const char b2b4[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200YueSim\005\271\204w\004\204Bat\005\357\204\007V\204Zhi\0102\204|\015\204Ji\202ZauNi\202Gun{\334\205RouKe\202Waiz\020\204BukHam\006\327\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y,\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Han\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011%\204Zi\202Fu\202Gwo\006&\204\251|\204\000\000\200\010\022\204{\303\205LiuJi\202!M\204Kiu{\334\204\000\000\200MauSan\003P\204\000\000\200\007V\204Ji\202LouNipHe\202\004\371\204Juk"; -static const char b2b5[739] = "\365LinFanDikLomJauSokBeiBaiSok\0050\204SauFunSinFanJuez\355\204\000\000\200{\221\204\000\000\200\000\000\200\007\042\204\000\000\200\010M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hoi\000\000\200DauBinLan\3621\204\000\000\200\217s\204Zi\202Nie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200Sam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fui\000\000\200\005\275\204\000\000\200Hoe\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200QinBat\002\354\204BaiGau{Z\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ku\202Zam{Z\204\000\000\200Yi\202Fu\202DuoGanWanYunZe\202\007\350\204\006\270\204\000\000\200\251|\204CukFan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yu\202Bo\202\037\243\204Am\202Sat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200Zin\007:\204{\221\205Co\202ZokBitShiWanBu\202Su\202\005\230\204Lo\202WeiWu\202\206\275\204Waiz\362\205Hau\005\322\204{\207\204\000\000\200{\240\205{\221\204{\264\205"; -static const char b2b6[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HonWenJueTo\202Po\202Zi\202{\310\205\000\000\200HanAi\202\261\246\204TaoLu\202Ti\202\005:\204\007:\204AanXi\202{\226\205\007\373\204\010:\204Zin\007\042\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kut\000\000\200\000\000\200\000\000\200\000\000\200Rau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xu\202\005\335\204{\303\205y,\204SaaFan\002\354\204Kiu\360\350\204BitFu\202LitHuiShiCi\202Gap\000\000\200Pu\202Zip\030:\204\007\042\204HuaLei\000\000\200\177\227\204ZauJinBinZi\202Haa\007\252\204CauBu\202\000\000\200WatSou\000\000\200Lie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GinZhiFauFunJue\005\275\204ZhaFuk\006\373\204WatGaa\011\007\204Wu\202\000\000\200PeiAanJyu\251|\204Tou{\202\205Bit\007O\204KeiZokDiuFukTi\202\020~\204ChiWu\202Ti\202\000\000\200HouDuo\007\042\204\031\234\204Chu"; -static const char b2b7[769] = "\377SanBai{\221\205Jam\303\254\204z\362\204\000\000\200\000\000\200\000\000\200\000\000\200Wen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010X\204Tuo\000\000\200PeiKu\202\000\000\200\000\000\200\000\000\200\004\377\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ba\202\011-\204\303\007\205\000\000\200\007\373\204Co\202YanJie{\233\204\000\000\200\005\275\204Nan\000\000\200\000\000\200Dan\002M\204Hua\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hun\000\000\200\000\000\200Shu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ran\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BuiSyuFaiCau\003=\204LoiWui\0050\204w\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Man\000\000\200\000\000\200Zi\202Zyu\000\000\200\006~\204\000\000\200\000\000\200\005\357\204\010\002\204Zhi\303u\204\000\000\200BuiZaiLou\007\234\204Men\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\271\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jam\305`\204{\207\205\005i\204Liu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200Kei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zi\202PunCin\005i\204Tan\000\000\200To\202\007\243\204Sui\000\000\200\000\000\200\000\000\200\000\000\200Li\202Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KauZi\202FanWan\006\302\204Li\202Sik\005\335\204HoiZauDa\202Zu\202Zu\202So\202"; -static const char b2b8[709] = "\353CouHap\005\357\204\000\000\200\000\000\200\010\331\204KuiCamBik\000\000\200\003P\204Luk\006l\204\000\000\200\000\000\200Mu\202\0060\204Sou{\271\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ni\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200Gui\000\000\200\000\000\200\000\000\200Dui\004\256\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lin\000\000\200LouWai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Danz\367\205z\024\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204Oi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Su\202"; -static const char b2b9[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mou\000\000\200\000\000\200\000\000\200\000\000\200Gan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200Li\202\000\000\200\030:\204\000\000\200\000\000\200Ye\202\000\000\200Ya\202\000\000\200\000\000\200\000\000\200\000\000\200Suo\000\000\200\000\000\200\000\000\200Siu\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200z\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\220\307\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\030:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BukSit\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duk"; -static const char b2ba[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\334\205Mun\000\000\200\000\000\200\000\000\200\006\025\204\005i\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ye\202GauNip\000\000\200\000\000\200Chu\000\000\200Ye\202\000\000\200\000\000\200\000\000\200Hai\000\000\200\000\000\200\000\000\200\007\032\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\254\204\000\000\200\000\000\200\005\335\204\010\263\204\000\000\200Go\202LoiYanLai{\240\204The\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZamSam\000\000\200\000\000\200\000\000\200\000\000\200\010\263\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\000\000\200\010\305\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\373\204\000\000\200\000\000\200\000\000\200\000\000\200Hiu\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Saa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ti\202\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\303\343\205\000\000\200\000\000\200E\000\201Bop\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\251\204\000\000\200Ban\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\271\204\000\000\200\000\000\200Lu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pan\005\357\204"; -static const char b2bb[742] = "\366Doe\000\000\200\000\000\200Waa\000\000\200\000\000\200\000\000\200Bok\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Coi\000\000\200\010c\204\000\000\200\000\000\200\000\000\200{\271\205\000\000\200BaaGun\000\000\200{\271\204\000\000\200\000\000\200\000\000\200Die\000\000\200\000\000\200\000\000\200\000\000\200Ne\202So\202\000\000\200\000\000\200Ang\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\017\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y,\204Ou\202\000\000\200\000\000\200Lun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011%\204\000\000\200\006h\204\000\000\200\000\000\200\000\000\200Ce\202Xun\000\000\200\000\000\200\303\331\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{_\204\000\000\200Cam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kut\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wan"; -static const char b2bc[649] = "\327\000\000\200\000\000\200Do\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003g\204\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204WaaWaiRe\202\000\000\200\000\000\200\000\000\200\000\000\200v\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\042\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Qia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010X\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Aa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dam"; -static const char b2bd[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Be\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cat\000\000\200\000\000\200\000\000\200{\303\205WaiLi\202\007\243\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Die\000\000\200\000\000\200Lan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\243\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kun\000\000\200\000\000\200Xu\202Hin\000\000\200\000\000\200Lan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200 \341\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Loi\000\000\200Jam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xin\000\000\200Lau\000\000\200\000\000\200\000\000\200\000\000\200\0050\204"; -static const char b2be[583] = "\301\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wai\000\000\200\000\000\200\007&\204\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204{\226\205\000\000\200\000\000\200\000\000\200HipHip\000\000\200\000\000\200\000\000\200Waa\000\000\200\000\000\200\000\000\200Cai\000\000\200\003\226\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mun\000\000\200\000\000\200Wit\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\303\205\255_\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200x@\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202"; -static const char b2bf[649] = "\327\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mo\202\000\000\200\000\000\200\000\000\200\005,\204\000\000\200Cau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200PieZe\202Goi\000\000\200Waa\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\010M\204\000\000\200\000\000\200\007\014\204Lay\000\000\200\000\000\200LouSuo\000\000\200z\030\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kap\000\000\200Na\202Lin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y8\204\000\000\200\000\000\200z\020\204\033\031\204\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200Niu\000\000\200\000\000\200\000\000\200\000\000\200\007\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Duk{\271\205\000\000\200Hin\000\000\200Fei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\220\204\000\000\200\000\000\200\000\000\200\003\025\204Bi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\3621\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Shu"; -static const char b2c0[733] = "\363\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Huo\000\000\200\000\000\200\000\000\200Weiz\374\204\000\000\200\000\000\200\000\000\200Dui\000\000\200\000\000\200Hoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{_\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200xT\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ma\202\000\000\200Au\202\000\000\200\000\000\200\000\000\200\000\000\200{\233\204\000\000\200\000\000\200Sun\000\000\200\000\000\200\246\355\204\000\000\200Lo\202\000\000\200\000\000\200\007x\204\000\000\200\000\000\200\000\000\200\010*\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jia\000\000\200\000\000\200\000\000\200\000\000\200\010c\204\000\000\200\011\013\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200wH\204\000\000\200\000\000\200\000\000\200\000\000\200\007\042\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200Hin\000\000\200\000\000\200Fei\000\000\200\000\000\200\000\000\200LinYan"; -static const char b2c1[751] = "\371\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jib\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200|\031\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mou\000\000\200\000\000\200\000\000\200\000\000\200{\240\204Bin\000\000\200\000\000\200Dip\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200\267\252\204Bei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Men\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Guo"; -static const char b2c2[619] = "\315\000\000\200x\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gip\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Po\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hua\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\006:\204\000\000\200\000\000\200\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\354\204\007\215\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\264\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xun\010\204\204\000\000\200\000\000\200\000\000\200Cau\003\226\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mui{\240\204\000\000\200\000\000\200\000\000\200\000\000\200Lo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\204\000\000\200Sim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3628\204\007\234\204\000\000\200\000\000\200\000\000\200Wui\000\000\200\000\000\200\000\000\200Ran\000\000\200\000\000\200\000\000\200\000\000\200{\207\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lai"; -static const char b2c3[745] = "\367\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200He\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Co\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{_\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200Li\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\220\204\000\000\200\000\000\200Xun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005i\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Maa\000\000\200\000\000\200Gai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fai\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200Gwo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fen"; -static const char b2c4[760] = "\374\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\360\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\334\204z\355\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cau\000\000\200\004\377\204\000\000\200\000\000\200KouJip\362?\205{\334\204\000\000\200\011\000\204\000\000\200Mai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Min\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JapLanQue\000\000\200w\254\204\000\000\200\000\000\200Wan\004\272\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\277\204Suk\000\000\200LanXin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ben\000\000\200\000\000\200\000\000\200\007\252\204\000\000\200\000\000\200\007\261\204\000\000\200\000\000\200\000\000\200Tui"; -static const char b2c5[526] = "\256\000\000\200\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ou\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\031\204\000\000\200Sai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\000\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Au\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y,\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\270\204\000\000\200\000\000\200\000\000\200\000\000\200\004\320\204\000\000\200Shi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0060\204"; -static const char b2c6[760] = "\374\000\000\200\000\000\200\000\000\200Saa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XunMieKau\011\000\204\000\000\200DanYueWa\202\004\324\204{\221\204Zan\005,\204SinGoiYin\262\327\205\000\000\200\006\327\204\010v\204PaiCaiZik\005P\204Limz\362\204z\350\204{x\204Mik\007g\204\251|\204YaoZhaXu\202Cau\006\025\204CauCi\202Chi\000\000\200TouHatSuiZhi\372\266\206\000\000\200\000\000\200YanYanz\350\204\000\000\200Zhu\007V\204Jin\217s\204\007x\204Mo\202z\374\205\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Suk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Vai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nie\3628\204\000\000\200\000\000\200Jyu"; -static const char b2c7[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Da\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204\000\000\200v\314\204Wai\000\000\200\000\000\200\000\000\200Man\000\000\200\000\000\200{\207\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\034\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\270\204~\266\204\000\000\200Yu\202\000\000\200Lao\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Si\202Zit\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pan\000\000\200\000\000\200\000\000\200\000\000\200Ran\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\354\204\000\000\200\000\000\200y\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pin\000\000\200\000\000\200\000\000\200Sen\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ham\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\177G\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200\000\000\200\004\352\204"; -static const char b2c8[769] = "\377\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\004\352\204\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\305`\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y0\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Moi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tuo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Niu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005,\204\003c\204\000\000\200\000\000\200\000\000\200\011\007\204DipShi\007\261\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200\000\000\200\000\000\200z\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cha\004\352\204Ci\202Zi\202TiuZi\202\000\000\200DouDanQi\202\0050\204\305;\204\000\000\200\010\220\204y\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zau\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200Cam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200TapWai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xu\202KouZi\202HouJunZhuTauGam{\240\204TuoZyu\177\227\204TouAauFai{\233\204WuiWai\000\000\200Fui\004\352\204\305;\204RenFuiZauPouHen\000\000\200\000\000\200ZaaCukHonCuk\000\000\200\005P\204\003\031\204Lin\007\373\204Lou"; -static const char b2c9[721] = "\357\007\341\204Tou{_\204\000\000\200CamJi\202{\334\204Yin\000\000\200WuiShi\006&\204Zha\005:\204\277\367\204DuoGo\202\010\331\204He\202Chi\000\000\200Ta\202Gun\000\000\200CatFu\202\004\377\204CimZhaHuiYi\202LiuYanOu\202y,\204\005\322\204\006a\204\372\230\205Wai\000\000\200Cou\303\350\205\011!\204\007\341\204\267\252\204Wai\303\355\204{\240\204FunTui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zip\000\000\200\000\000\200\000\000\200vT\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204HanYi\202Bei\303\355\205\010v\204\000\000\200Yan\005\253\204\0070\204HauLan{\221\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005!\204\007\265\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\367\204\000\000\200\000\000\200Li\202\000\000\200Bui\000\000\200\217s\204\000\000\200Zou\000\000\200Duo\000\000\200\000\000\200\000\000\200Xie\000\000\200\000\000\200\000\000\200\000\000\200\002\354\204{\221\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200|\031\205\000\000\200\000\000\200\007\234\204\000\000\200{\214\205\000\000\200\000\000\200\005\326\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\327\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3607\204\000\000\200\000\000\200\000\000\200\000\000\200\010M\204\000\000\200\000\000\200\005\275\204\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200Guo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0102\204"; -static const char b2ca[562] = "\272\000\000\200MouQi\202\000\000\200Ong{\327\204\003\226\204Hoi\301\326\204Tin\000\000\200\006a\204Pi\202GotYouXu\202Hui\007\023\204{\012\205v\264\204Bei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Huo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200XunLoi\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jyu\303\355\204\010M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\012\205"; -static const char b2cb[622] = "\316\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhe\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HonHuaYi\202KauPi\202WaiLunz\355\205Jam{\214\205JinPikQi\202\000\000\200Cam\000\000\200SekShu\371\260\204Co\202Lu\202JipZok\006\373\204\002\376\204Zi\202Mu\202\005\335\204Pei\000\000\200z\374\205Do\202Guo\007\373\204ZaiDu\202\000\000\200HuaHon\005\335\204{\303\205\000\000\200Zi\202\000\000\200TinCukDiu{\245\205z \204\000\000\200\007x\204\256\371\204Bo\202\006\327\204\007]\204Da\202CouChaZiu\003\263\204SinHou\005i\204Nau\000\000\200\010\272\204\006Z\204HatZinHuiCik\000\000\200PieJi\202\000\000\200So\202Xi\202Git\000\000\200Hei{x\205Lin\000\000\200\003t\204GiuSuiBik\000\000\200Kai\004\340\204Bok\000\000\200\010k\204\003\002\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wik\302\236\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\217s\204Haa{\240\204\005\204\204{\202\205GapCuk\000\000\200\000\000\200y8\204Qi\202Saa\000\000\200\000\000\200\007\042\204\000\000\200QueE\000\201YinJiu\010\263\204An\202z\374\204\000\000\200\000\000\200\000\000\200\005\262\204MaaWu\202\000\000\200\000\000\200\000\000\200GaiJi\202\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tui"; -static const char b2cc[769] = "\377\000\000\200\000\000\200\000\000\200Mu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Luo\000\000\200{\240\204\003c\204\220\307\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Han\000\000\200Dip\000\000\200\000\000\200\010\272\204z\355\204Yu\202\000\000\200Ye\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\042\204YouMo\202Di\202\006\251\204\000\000\200Pun\000\000\200\372\230\205\006\327\204Gen\000\000\200WeiKut\000\000\200Wan{x\204\000\000\200\005\335\204Hei\000\000\200\000\000\200\000\000\200Ji\202\003x\204SanPo\202Au\202\002M\204Pei{\221\204\000\000\200Jyu\000\000\200Wai\000\000\2002\355\204Xue\000\000\200\000\000\200\000\000\200Hoi\241z\204\000\000\200~\266\204Fat\000\000\200\000\000\200\000\000\200\000\000\200LiuYu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{x\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zi\202\000\000\200\000\000\200\000\000\200\305X\206{\327\204\000\000\200Ze\202TaiGou{_\205\000\000\200\006\373\204Yi\202Man\000\000\200Ci\202En\202Guo\006\351\204BaoTi\202Jip\000\000\200Wu\202\000\000\200Ye\202\303\007\205\007\316\204Pi\202\000\000\200SuiGin\000\000\200\000\000\200Da\202TouSikQiu\3628\204\000\000\200\000\000\200z\367\205\004\377\204\005\262\204\003]\204Mo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\355\204\007V\204PeiPi\202z\343\205GuaAk\202\000\000\200Sai{\202\205\000\000\200\371\260\204Ci\202Tu\202"; -static const char b2cd[766] = "\376\003\031\204\302\200\204FeiHuo\000\000\200{\245\205KeiChi\000\000\200\000\000\200LinTit\006\205\204BiuTuoGinFun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nao\010M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GitJanTou\000\000\200Diu\000\000\200\006l\204\003\272\204\000\000\200Wu\202\006\025\204Ju\202DoiTuoZitWei\002\376\204\000\000\200\000\000\200\005P\204HouTaiJipLou\000\000\200\000\000\200\000\000\200To\202\000\000\200\000\000\200Wu\202La\202{\207\204\000\000\200\010*\204ZaaTai\000\000\200YouJauJi\202\000\000\200Ni\202\005:\204\004\324\204Ji\202Xi\202Guo\000\000\200\0050\204{\271\205\000\000\200Pu\202|\031\205\000\000\200\000\000\200\000\000\200\000\000\200GunBa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\254\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jik\3621\204\005\204\204"; -static const char b2ce[481] = "\237ManWa\202Ge\202\000\000\200\000\000\200Co\202\010\230\204\000\000\200Ci\202{}\205Jam\000\000\200Sha\004\320\204Li\202\005\230\204\305X\206YueKei\000\000\200\000\000\200AngYan\000\000\200Yan\005\014\204Yue\005:\204PinAm\202\006\327\204\000\000\200Ge\202LanGouz\374\204\007\335\204z\367\205\004\334\204JinQi\202Ou\202Fan\000\000\200KouYa\202\007\042\204PikHok\004\324\204\000\000\200\011\000\204\000\000\200{\221\204z\355\205Cou\303\362\204Gan\000\000\200\000\000\200\000\000\200\000\000\200Cai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Coi\000\000\200Bo\202\000\000\200Wan\000\000\200HunNieMo\202{_\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{Z\204\011\013\204Lai\005\326\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\233\204Na\202Xie\004\272\204\000\000\200\000\000\200ZhaZhiNie\006\227\204Kuoz\355\204\000\000\200CuoYi\202Ze\202YunZu\202Ji\202\011\017\204Ci\202Bo\202\000\000\200\000\000\200YinChuGamx`\204Jue\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200\000\000\200Yao"; -static const char b2cf[454] = "\226\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204"; -static const char b2d0[70] = "\026\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202"; -static const char b2d1[721] = "\357\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\227\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hon\000\000\200\000\000\200Put\000\000\200\000\000\200\000\000\200\000\000\200\030:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lau"; -static const char b2d2[556] = "\270\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mu\202\004\377\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bei\000\000\200\000\000\200\303\211\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z\362\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200La\202"; -static const char b2d3[748] = "\370\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\371\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Oi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei"; -static const char b2d5[679] = "\341\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Suo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ke\202"; -static const char b2d6[502] = "\246\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\262\226\204"; -static const char b2d7[400] = "\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\301\232\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Oi\202"; -static const char b2d8[697] = "\347\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Pok\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\371\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Rap\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lan\000\000\200\000\000\200Din\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jik"; -static const char b2d9[613] = "\313\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3628\204"; -static const char b2da[655] = "\331\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\032\204\006\270\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zaa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\263\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dik"; -static const char b2db[220] = "H\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Aa\202"; -static const char b2dc[517] = "\253\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200Sha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\204\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zuk"; -static const char b2dd[34] = "\012\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mou"; -static const char b2de[640] = "\324\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lo\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lai"; -static const char b2e0[154] = "2\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\277\204"; -static const char b2e1[688] = "\344\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010M\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Aa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\357\204"; -static const char b2e2[337] = "o\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200KauLouDitZok|\031\204yX\204\000\000\200\220\307\205|\031\204\000\000\200Zau\007\215\204\010\272\204\000\000\200\004\365\204Coi"; -static const char b2e3[754] = "\372\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cha\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Du\202"; -static const char b2e4[124] = "(\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007V\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204"; -static const char b2e5[535] = "\261\000\000\200\000\000\200Zit\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\220\307\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Soe\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\220\307\205\000\000\200Gin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kit"; -static const char b2e6[649] = "\327\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JanDuk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tek"; -static const char b2e7[370] = "z\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gu\202Ji\202\000\000\200Fan\007\307\204\301\326\204Got"; -static const char b2e8[742] = "\366\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\214\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ke\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\305`\204Sinz\010\204\006\327\204"; -static const char b2e9[739] = "\365\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MunCyuDiu\000\000\200Rui\000\000\200\000\000\200Bei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200E\000\201\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\214\205Wai"; -static const char b2ea[586] = "\302\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010X\204Lau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BatHoiAi\202Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005I\204y\334\204\004\371\204Cou\210R\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\373\204"; -static const char b2eb[655] = "\331\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jyu\007\032\204\003\263\204\303u\204HuoLukHua\006Z\204\0060\204Zam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\272\204Jiu\000\000\200Mie\003=\204{x\204\000\000\200Aan\000\000\200{\226\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\025\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kaa"; -static const char b2f8[769] = "\377Li\202WanYi\202\000\000\200Ni\202Wu\202Tui\002\354\204Za\202Bei\010\356\204z\374\205JunSuo\003+\204Tu\202z\362\205Ju\202\000\000\200DinNeiZai\000\000\200&a\204\007:\204\002\354\204\004\352\204{\202\205\003\006\204z\350\204RenPi\202Ke\202LuoGe\202z\355\204Ji\202\007\252\204\003+\204Qin\360\366\204Bao\006&\204BeiHuiBeiBo\202Ji\202Ji\202\003\006\204\003\006\204\003\006\204\000\000\200HuiJi\202Sou\000\000\200\003\002\204ChiJiuz\374\204Xi\202{x\205\003c\204\007\350\204Mie\005!\204Qi\202z\374\204{_\204{_\204HuiChiZhaYaoTu\202TanTu\202HaoPenQie\372\230\206{x\205ZhiTu\202\003g\204Ci\202BaoDi\202\000\000\200MaiHu\202\003\014\204Duo\006\205\204SheChi\000\000\200Ji\202Yu\202TuiPinFu\202SaoChaRaoLanLan\000\000\200\007:\204Zhi\006\373\204BaoLao\002M\204{\240\205\010\220\204YouYaoTu\202CitXiuz\350\204Wu\202Yan\000\000\200\3607\204Zi\202z\355\204Xun\010I\204Yi\202Xun\3055\204MaoFenMan\000\000\200Yi\202\002\354\204Bi\202Shu\005\230\204\010\016\204\003=\204\000\000\200\000\000\200Yu\202TouTaoYi\202\000\000\200\000\000\200\003g\204\005,\204{_\204\004\352\204RenZhi{\202\205\007:\204z\362\205JueHui\004\352\204DunCi\202z\362\205\371\260\204z\362\205Lou\010\243\204z\374\204FenCan\006\205\204{x\205Lan{x\205JiaKu\202BaoBa\202\007q\204\000\000\200WanPinSheSaoJi\202SauJinYanYanDouMo\202{\240\205Hui\003\002\204HeiMin\0050\204\000\000\200Ji\202Shu\303\254\204WeiShuWenz\355\205Mao\003+\204ZuiPu\202Na\202Tan\005\230\204\305`\204\004#\204Qi\202\003t\204\000\000\200Hua\007\230\204Gai\010\230\204Mei\000\000\200Ao\202BenZi\202He\202ZhaYaoGaiShe\000\000\200ZhiYi\202Ci\202\000\000\200Xu\202KunSuiWenSha\006\214\204\000\000\200\000\000\200JukFan\000\000\200YanBenz\350\204Wu\202"; -static const char b2f9[769] = "\377PaiHaiLiuHaoJinNieBen\010\263\204\006\025\204Yan\003\031\204Zi\202\3607\204ShaYan\010I\204\000\000\200\000\000\200FenYue\0050\204\004\377\204Shuz\350\204Zai\372\230\205Tan\000\000\200\0070\204\000\000\200\006&\204\000\000\200\007A\204JueZha\000\000\200Xi\202BeiYan\000\000\200Ta\202\305`\204\003=\204Yue\0102\204\0102\204DaiYu\202{Z\204Suo{}\205\003g\204Rui\000\000\200Zai\000\000\200Yi\202\0102\204Yu\202\000\000\200Faa\000\000\200YanJi\202Zhi\000\000\200\000\000\200\000\000\200Da\202{Z\204{Z\204{Z\204\007q\204Jie{x\204Ye\202Shi\000\000\200\003g\204Lu\202|\015\204HuiJiuZu\202ChiLiuFu\202Shu{\240\204Gu\202Ji\202Wen\000\000\200|\015\204|\015\204\0102\204\0102\204\000\000\200\372\230\205ZhuWei\010I\204BeiXi\202{\240\205SanJi\202\000\000\200\005\005\204YaoZi\202\004#\204SaoLuo\003g\204\000\000\200Mei\000\000\200\010I\204\000\000\200\360\350\204Ao\202Zhe\000\000\200\000\000\200\0102\204\000\000\200\006&\204KenRenYu\202Cui\006&\204Pi\202\004\377\204\000\000\200\000\000\200\003P\204\000\000\200Yu\202Xi\202Ci\202\005\005\204Qi\202Yu\202ZhiLaoHua\007O\204Ya\202Ku\202\000\000\200Ruo\005\020\204\006N\204JieWu\202\006\351\204Di\202Zhe\0102\204Ju\202JunCai\000\000\200Suo\000\000\200So\202\0102\204JinCuo\000\000\200Rui\000\000\200{x\205Lu\202\010I\204Lu\202KuiNueLu\202KuiXi\202Chiz\350\204\007:\204\0102\204YunSipZhuCi\202Ji\202Guiz\374\205Ci\202\007g\204Yi\202{\240\204Liu\3055\204Lu\202YanMao\000\000\200\000\000\200Nin\007:\204{x\205Yu\202\303\362\204Shi{\240\204GunBi\202GanQi\202Shu\002\376\204Ba\202{\240\204\003I\204\000\000\200RenShu\000\000\200\000\000\200Qi\202\0102\204Zi\202\000\000\200\010I\204Bo\202\003P\204Hua\002\354\204z\350\205Zan\000\000\200Kai\006\260\204\007\261\204\000\000\200Weiz\350\204Xi\202Yun\003\247\204\0102\204Lu\202z\355\204Bi\202\000\000\200KunYanE\000\201E\000\201"; -static const char b2fa[91] = "\035\0102\204XueJi\202BanE\000\201YunBaoTuiGan{}\205{Z\204Ji\202{\240\204JiuJi\202Pi\202Yu\202Ma\202Sha\000\000\200\000\000\200Ma\202z\350\204Zhi\003+\204ZhiMi\202FenBi\202\003I\204"; -static const char b300[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007&\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\270\204\000\000\200\000\000\200\006\270\204Juk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dai\000\000\200\000\000\200\000\000\200\000\000\200y\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\327\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006&\204\000\000\200\000\000\200\000\000\200Bi\202\000\000\200\000\000\200\000\000\200Duk"; -static const char b301[760] = "\374\000\000\200\371\260\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\267\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\327\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DukDan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xia\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\334\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\256\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\007\204\005\335\204\000\000\200Ji\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200GaaHe\202\000\000\200Hei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010}\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007]\204"; -static const char b302[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hei{\226\205\000\000\200\000\000\200Dim\000\000\200\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Aak\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bok\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yan\000\000\200\000\000\200\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\003=\204Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jik\000\000\200\011\007\204\000\000\200\000\000\200\000\000\200KokJip\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hok\000\000\200\000\000\200\000\000\200\000\000\200Dit\000\000\200\000\000\200{\221\204\000\000\200\000\000\200{\214\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0060\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200\000\000\200Man\000\000\200JimCim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204y,\204\000\000\200\000\000\200\000\000\200JimBi\202"; -static const char b303[760] = "\374\0050\204\000\000\200\007H\204\000\000\200\000\000\200\000\000\200Cim\007\373\204\000\000\200Yun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Aa\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007&\204\000\000\200\005\275\204\004\256\204Lu\202Jip\000\000\200\000\000\200Jiu\000\000\200Zak\000\000\200\000\000\200\000\000\200\000\000\200\005\271\204\000\000\200\000\000\200z$\204\000\000\200\303\331\205\000\000\200Wei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\350\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010v\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200Zin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200w\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ma\202\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\211\204"; -static const char b304[760] = "\374\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\237\204\000\000\200\000\000\200\267\252\204\000\000\200\000\000\200\217s\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZapJim\000\000\200\000\000\200\000\000\200Lau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003\226\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\270\204\000\000\200z\024\204\000\000\200\000\000\200\010*\204LuoZi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dai\000\000\200\000\000\200Ai\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3628\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cit\000\000\200\000\000\200\000\000\200\005\014\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303u\205\000\000\200Wu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sim\000\000\200\000\000\200Ep\202\000\000\200Ye\202\000\000\200\000\000\200Zit\000\000\200\000\000\200Za\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\241z\204\000\000\200\000\000\200\000\000\200\000\000\200Lai\000\000\200\000\000\200\000\000\200\000\000\200\004\272\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\253\204\000\000\200\000\000\200\000\000\200\007\042\204\007]\204"; -static const char b305[754] = "\372\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dai\000\000\200\000\000\200\000\000\200\003\263\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hin\000\000\200\000\000\200\000\000\200Yu\202\000\000\200\000\000\200\000\000\200Duk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cam\000\000\200\000\000\200\000\000\200\004\324\204\000\000\200\000\000\200Giu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xie\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hui\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007O\204\000\000\200\000\000\200\217s\204\000\000\200\000\000\200\004\320\204XieSikJim\000\000\200\000\000\200\000\000\200\000\000\200\303u\204Wan\000\000\200\000\000\200\000\000\200\303\254\204\000\000\200Si\202\000\000\200\000\000\200\000\000\200Cin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sam\000\000\200\000\000\200\000\000\200SukFan"; -static const char b306[763] = "\375\007\211\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Guk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200,a\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jim\000\000\200\000\000\200Min\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3621\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200>3\204\000\000\200\000\000\200Sou\000\000\200Sau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\000\000\200\000\000\200Lim\000\000\200\000\000\200Siu\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\373\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\327\204\000\000\200\000\000\200\000\000\200Ran\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ye\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Maa\000\000\200\000\000\200\000\000\200\000\000\200\005i\204\000\000\200\000\000\200\004\256\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sim\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bat\000\000\200ZapZitJi\202Wai\000\000\200\000\000\200Sim\222\007\204\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200Lim\000\000\200\000\000\200\006\270\204\000\000\200\000\000\200\000\000\200\000\000\200Am\202\005\357\204\000\000\200\003x\204"; -static const char b307[652] = "\330\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Can{\303\205\000\000\200\000\000\200\000\000\200\000\000\200Ho\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZinEun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yin\000\000\200Fai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\000\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200SiuSin\000\000\200\000\000\200\000\000\200\000\000\200Hin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\257\320\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jik\000\000\200\004\256\204\000\000\200\000\000\200\000\000\200Zit\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Bik\000\000\200\000\000\200\000\000\200\000\000\200Zao\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jim"; -static const char b308[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\003=\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\272\204\000\000\200Yao\000\000\200\000\000\200\000\000\200\000\000\200Bei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200HiuHui\000\000\200\000\000\200LoiWo\202\000\000\200\000\000\200\000\000\200\000\000\200z\024\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ban\000\000\200\000\000\200\000\000\200\004\377\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Che\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nou\000\000\200Sau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Suk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mou\000\000\200z(\204\000\000\200Lau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wei\000\000\200\000\000\200\006\373\204\000\000\200\000\000\200Zek\000\000\200\000\000\200\011\000\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200y\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zik\222\007\204"; -static const char b309[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005!\204\000\000\200Lik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200z,\204\000\000\200\000\000\200Du\202Duk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ham\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005i\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\004\377\204\000\000\200\301\376\204\000\000\200w\214\204\007\243\204\000\000\200\000\000\200\000\000\200\000\000\200\011\000\204\000\000\200\007\042\204\000\000\200\000\000\200\006\205\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\3628\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\042\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Baa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lik\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200\000\000\200\007\373\204\000\000\200\000\000\200\000\000\200Aa\202\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\331\205To\202\000\000\200\000\000\200\000\000\200\011\000\204\000\000\200\000\000\200\000\000\200JinTo\202Zat\000\000\200\000\000\200\000\000\200\000\000\200Qin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\234\204\000\000\200\000\000\200\000\000\200Zyu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\303\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200\011\013\204"; -static const char b30a[763] = "\375\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\237\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ci\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tiu\000\000\200\000\000\200\000\000\200\010:\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\365\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\267\252\204\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Giu\004\352\204Ak\202Zaa\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\371\204\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\267\252\204\000\000\200{\271\205\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\267\252\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200w\354\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006a\204Fau"; -static const char b30b[622] = "\316GaiWu\202O\000\201Lie\000\000\200Fu\202\004\324\204ZyuJinTo\202\000\000\200\305`\204\006\025\204\006\010\204BatZyuHiu\006a\204Ci\202Goi\006l\204\000\000\200\010*\204KauFat{x\204WanZi\202Man\000\000\200CimWiky8\204CapCaiSikBik\004\371\204Hu\202\010}\204\000\000\200Sau\007]\204Zi\202Miu\005\005\204Hin\004\371\204\004\371\204Sok\010v\204JikZoi\241z\204Qi\202\006\302\204\004\365\204\010k\204\303\254\204WatLa\202\003\272\204{\207\204FukJau\006&\204\000\000\200\000\000\200Gun\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\177\227\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006:\204Dou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{\264\205\000\000\200Fu\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zo\202\000\000\200\000\000\200\000\000\200Hiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Sau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lom\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Nai\000\000\200\000\000\200Mun"; -static const char b30c[760] = "\374\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tan\000\000\200\000\000\200\000\000\200\000\000\200{\226\205\003c\204\000\000\200\000\000\200\007\211\204\000\000\200Lau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\007\316\204\000\000\200\005!\204\000\000\200Jau\000\000\200\000\000\200\000\000\200\217s\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Kui\000\000\200\000\000\200\005\322\204\000\000\200Si\202Hei\010c\204Za\202Fu\202\000\000\200LauCit\000\000\200\000\000\200\000\000\200Gwo\000\000\200\003\226\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\000\204\010\002\204\006\351\204Ung\000\000\200w\004\204Fan\000\000\200\000\000\200Zuk{\240\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\371\204\000\000\200z\374\205\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fu\202\000\000\200\000\000\200\006\327\204\000\000\200\000\000\200\000\000\200\000\000\200\006\327\204Bei\000\000\200Ci\202Zik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200>3\204\000\000\200\000\000\200y\010\204\005!\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\327\204\000\000\200\000\000\200\000\000\200Hiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wu\202\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200MouCe\202\000\000\200Hin\004\371\204\217s\204\000\000\200Wai{\221\204\005\275\204\007\373\204\004\340\204\000\000\200Ok\202\007\032\204Guo\010\204\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ji\202Zim\000\000\200Can\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fei\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ang\000\000\200\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\275\204\000\000\200\000\000\200\007\032\204\000\000\200\000\000\200\005\322\204Yan\011\013\204\010\204\204Si\202"; -static const char b30d[748] = "\370\000\000\200\000\000\200Sam\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200PitSiuLi\202\011\000\204{\334\204LouDou\010\272\204Lo\202\010\272\204\000\000\200\000\000\200\000\000\200LukHok\007\211\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\0050\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Giu\000\000\200{\303\205\303\254\204Jauv\264\204FanNgoSam!M\204Jai\000\000\200\007\032\204{\303\205\000\000\200Dit\005\357\204GauTouWo\202\010\002\204\000\000\200z$\204\004\272\204{_\204Hap{\233\205Ci\202\006h\204Zi\202ZimBou\000\000\200DouBieCimNgoSaa\004\272\204CamHei\004\334\204Cuk\007\032\204\007\316\204z\010\204\011!\204Zip\251|\204Xu\202y8\204TouHaiHokJyuJi\202\005i\204\010\022\204ZaaHaoHamTo\202Ci\202x\354\204Ji\202\000\000\200Nau\177\227\204SapJiu\000\000\200\005\275\204\000\000\200\000\000\200Duk\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Mi\202\000\000\200\000\000\200\000\000\200Lau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Tik\000\000\200Yi\202WunCi\202\000\000\200\004\365\204\005i\204Fai\303\254\204Kui\010*\204JatBiu\372\230\205\004#\204\251|\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Li\202HiuKiu\000\000\200Du\202"; -static const char b30e[733] = "\363\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\372\266\206Dip\000\000\200\003\263\204\000\000\200\000\000\200\000\000\200z\355\204\000\000\200w\214\204\000\000\200\000\000\200\000\000\200Lin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZaiCai\000\000\200\000\000\200y\010\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Do\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wai\256\371\204\007V\204\007\032\204\262\327\205Yue\267\252\204\000\000\200\007V\204Ba\202\303\355\204{\245\205z\374\204Fu\202Dai\004\324\204Pou\005\322\204\003\226\204Guk\005\335\204WunWanSin\005\357\204ZipLu\202Gwow\014\204{\245\205Ham\251|\204\010v\204Fuk\004#\204Duo\303\254\204\007\234\204\007\243\204SikEr\202Lao\007V\204\005i\204\303\355\204GikNieHatLuo\217s\204Min\000\000\200\000\000\200\000\000\200Huo\000\000\200\000\000\200\000\000\200\000\000\200{x\204\000\000\200\000\000\200\000\000\200\000\000\200\004\352\204\000\000\200\000\000\200\000\000\200\000\000\200Jiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\303\362\205\303\362\205\000\000\200\000\000\200\006\233\204\000\000\200\000\000\200\000\000\200\000\000\200Wai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Hiu\000\000\200\000\000\200\000\000\200\000\000\200Bei"; -static const char b30f[766] = "\376\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Jik\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Lao\000\000\200\000\000\200\000\000\200Lan\000\000\200Mai\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\004\340\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Gei\011%\204HuaDai\000\000\200\006\237\204CiuAu\202LikE\000\201\000\000\200Zi\202JatJinJan\000\000\200\002\354\204\005\275\204Pei\006\004\204Kaa\000\000\200\010\230\204Wo\202\010\325\204FauZyuBunFatGatHam\302q\204{\257\205\005\375\204WaiPikCi\202\003\263\204Ren\005\005\204\003]\204GwoZipBut\005\204\204\000\000\200\004\334\204MuiHamJukTunSo\202\000\000\200\006&\204Fu\202ZimBiuPaiTouFeiGamGun\010\036\204\000\000\200JipDo\202KimZamJyuWui\003\272\204\212\346\204\010\356\204\004\371\204Fuk\000\000\200{\334\205Se\202\000\000\200Haa\007\042\204\010k\204\010\257\204\000\000\200JipAa\202\011\017\204\010\036\204Oi\202Lim\3628\204\010\272\204\005i\204LukLanSi\202\000\000\200Wai\010\305\204\003x\204y,\204\000\000\200Tin\010v\204SukJitLa\202\011\017\204Ou\202\004\365\204Mit\006\327\204\000\000\200y,\204ZhaZim\006\327\204Luo\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200{Z\204\000\000\200GunXiaXieWai\006\260\204\000\000\200\000\000\200\000\000\200Ni\202\000\000\200\000\000\200\010c\204\303\367\205Yu\202\000\000\200\000\000\200\000\000\200{\012\205\005!\204Kap\000\000\200\000\000\200Pik"; -static const char b310[769] = "\377\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zat\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Fan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\005\322\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Yi\202\000\000\200DuoBat\000\000\200CinDuk\000\000\200\003\263\204Lau\000\000\200\000\000\200w\354\204w\354\204\000\000\200\000\000\200\000\000\200\000\000\200Sa\202MeiBei\011\007\204\277\367\204WanCiuSipDukHu\202Duiy\334\204\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200DuoKu\202\004\334\204JiuFui{\233\205\0102\204LoiAatFu\202\000\000\200Jim\007\042\204\010\272\204Pi\202\004\365\204HamHamSoiGao\003=\204Fui\236\353\204{\221\204Ban\000\000\200PiuCiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200BiuHaaYouToiLitLauLi\202\000\000\200Rui\006h\204Yu\202\010\022\204Biu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Xi\202JyuBok\007V\204\004\377\204\000\000\200BanZhiEn\202Tim\000\000\200BanAk\202Bau\006\251\204"; -static const char b311[769] = "\377FanTou\000\000\200GinFui\000\000\200Ci\202{_\205\011\026\204En\202\303\355\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200ZyuTok{\012\205DukBouZap\006:\204\003\217\204But\005\275\204\000\000\200CanBat\007\252\204Zi\202Ji\202\000\000\200Xu\202Fu\202TouBok\000\000\200{x\205Bo\202\007&\204Loi\277\367\204Ngo\000\000\200y\010\204Se\202To\202JiuPinHaaJauHon\003\263\204\010*\204TouPan\000\000\200\005:\204\006\233\204\000\000\200\010\022\204TimWatJin\000\000\200\006h\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\270\204\006\270\204\000\000\200KuiFei\007\234\204Mun\000\000\200\010k\204\000\000\200\000\000\200\000\000\200{\226\205\010I\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200v\264\204KuiCau\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Dan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Ya\202\000\000\200Tok\251|\204BeiPeiWu\202w\004\204Yu\202\010\263\204\217s\204\005\335\204SamMutMei\004\324\204PeiSin\006\010\204Cau\010*\204{\334\204ButYou\006\025\204Fu\202Ji\202SukGiuLokRu\202Yi\202Loi\005I\204w8\204Ye\202JauFu\202So\202Na\202ZikLukCok\0050\204Zhi\003\263\204\0060\204GauGuk\004\371\204Suk"; -static const char b312[769] = "\377Ju\202\006\302\204JyuWeiHau\004\371\204Lou\006\025\204\007\277\204KinLauHouSau\250\000\204\010\230\204Zuky,\204FaiSi\202CamCen\007V\204LaiJyu{\226\205Mit\007\350\204\006\205\204Sin\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\010\042\204Dou\000\000\200GonHanJi\202JukFu\202\267\252\204\177G\204\010\263\204z\362\204Wu\202\006~\204Go\202Pei\007x\204\007\316\204Zi\202TitZi\202Fu\202GipMou\007\373\204\006\311\204BinJiu\007\023\204GuiGatLou\007:\204Aa\202Ji\202\303\350\205ZyuGiuGuiLok{\303\205Jyu\261\246\204Mauv\354\204{\303\205LoiHonYi\202TouHeiFu\202To\202ZikGei\303\254\204\303\254\204LukKei\305;\204LeiJik\007\316\204TouGukJik\000\000\200\005\204\204Gin\003\217\204z\010\204Zi\202Fuk\003\272\204\007\307\204\007:\204Mo\202\000\000\200TaiDatJau\010v\204ZanTin\303\254\204\003\025\204\3628\204\000\000\200HatTouJiuJi\202Yan\007\252\204{_\205Ji\202\006~\204\004\324\204Tou\005\357\204JyuShuJyuLo\202GikJi\202DikBu\202\006\327\204\000\000\200\250\000\204\000\000\200\000\000\200\000\000\200\000\000\200Lu\202Lu\202{\252\205\006\333\204\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\006\302\204Hat{\202\205\000\000\200Mut\006\233\204\000\000\200TouHua\000\000\200Kuk\000\000\200\000\000\200Ge\202\002\354\204Qu\202Fu\202Fu\202ShaGwo\000\000\200\000\000\200Mo\202Bu\202\000\000\200\000\000\200\000\000\200LouCiu\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Zhi\262\327\205{\207\204\000\000\200\011\026\204\000\000\200\000\000\200Fan\000\000\200\000\000\200z\355\204\000\000\200Lou\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200Cuk\006\233\204"; -static const char b313[220] = "H\360\350\204\004\324\204\000\000\200WaaZi\202Mi\202ManBitMa\202Bik{\214\205\000\000\200\000\000\200\000\000\200\000\000\200Wan\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\011\013\204CaiZi\202Zi\202\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200JinZe\202Zauz0\204Ci\202YaoSit\263\201\204Wan\005(\204{\221\204CukYi\202Ji\202JyuDin\000\000\200\000\000\200Jik\000\000\200\000\000\200\000\000\200\003\226\204\011!\204\000\000\200RanGou\003\002\204\005\375\204Bit"; -static const char be00[382] = "~\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200\000\000\200 \000\201!\000\201\042\000\201#\000\201$\000\201%\000\201&\000\201'\000\201(\000\201)\000\201*\000\201+\000\201,\000\201-\000\201.\000\201/\000\2010\000\2011\000\2012\000\2013\000\2014\000\2015\000\2016\000\2017\000\2018\000\2019\000\201:\000\201;\000\201<\000\201=\000\201>\000\201?\000\201@\000\201A\000\201B\000\201C\000\201D\000\201E\000\201F\000\201G\000\201H\000\201I\000\201J\000\201K\000\201L\000\201M\000\201N\000\201O\000\201P\000\201Q\000\201R\000\201S\000\201T\000\201U\000\201V\000\201W\000\201X\000\201Y\000\201Z\000\201[\000\201\134\000\201]\000\201^\000\201_\000\201`\000\201a\000\201b\000\201c\000\201d\000\201e\000\201f\000\201g\000\201h\000\201i\000\201j\000\201k\000\201l\000\201m\000\201n\000\201o\000\201p\000\201q\000\201r\000\201s\000\201t\000\201u\000\201v\000\201w\000\201x\000\201y\000\201z\000\201{\000\201|\000\201}\000\201~\000\201"; -static const char bdefault[4] = "\000\000\000\200"; - -static const char *block(uint_least32_t blocknum) { - switch (blocknum) { - case 0x000: return b000; - case 0x001: return b001; - case 0x002: return b002; - case 0x003: return b003; - case 0x004: return b004; - case 0x005: return b005; - case 0x006: return b006; - case 0x007: return b007; - case 0x008: return b008; - case 0x009: return b009; - case 0x00a: return b00a; - case 0x00b: return b00b; - case 0x00c: return b00c; - case 0x00d: return b00d; - case 0x00e: return b00e; - case 0x00f: return b00f; - case 0x010: return b010; - case 0x011: return b011; - case 0x012: return b012; - case 0x013: return b013; - case 0x014: return b014; - case 0x015: return b015; - case 0x016: return b016; - case 0x017: return b017; - case 0x018: return b018; - case 0x019: return b019; - case 0x01a: return b01a; - case 0x01b: return b01b; - case 0x01c: return b01c; - case 0x01d: return b01d; - case 0x01e: return b01e; - case 0x01f: return b01f; - case 0x020: return b020; - case 0x021: return b021; - case 0x022: return b022; - case 0x023: return b023; - case 0x024: return b024; - case 0x025: return b025; - case 0x026: return b026; - case 0x027: return b027; - case 0x028: return b028; - case 0x029: return b029; - case 0x02a: return b02a; - case 0x02b: return b02b; - case 0x02c: return b02c; - case 0x02d: return b02d; - case 0x02e: return b02e; - case 0x02f: return b02f; - case 0x030: return b030; - case 0x031: return b031; - case 0x032: return b032; - case 0x033: return b033; - case 0x034: return b034; - case 0x035: return b035; - case 0x036: return b036; - case 0x037: return b037; - case 0x038: return b038; - case 0x039: return b039; - case 0x03a: return b03a; - case 0x03b: return b03b; - case 0x03c: return b03c; - case 0x03d: return b03d; - case 0x03e: return b03e; - case 0x03f: return b03f; - case 0x040: return b040; - case 0x041: return b041; - case 0x042: return b042; - case 0x043: return b043; - case 0x044: return b044; - case 0x045: return b045; - case 0x046: return b046; - case 0x047: return b047; - case 0x048: return b048; - case 0x049: return b049; - case 0x04a: return b04a; - case 0x04b: return b04b; - case 0x04c: return b04c; - case 0x04d: return b04d; - case 0x04e: return b04e; - case 0x04f: return b04f; - case 0x050: return b050; - case 0x051: return b051; - case 0x052: return b052; - case 0x053: return b053; - case 0x054: return b054; - case 0x055: return b055; - case 0x056: return b056; - case 0x057: return b057; - case 0x058: return b058; - case 0x059: return b059; - case 0x05a: return b05a; - case 0x05b: return b05b; - case 0x05c: return b05c; - case 0x05d: return b05d; - case 0x05e: return b05e; - case 0x05f: return b05f; - case 0x060: return b060; - case 0x061: return b061; - case 0x062: return b062; - case 0x063: return b063; - case 0x064: return b064; - case 0x065: return b065; - case 0x066: return b066; - case 0x067: return b067; - case 0x068: return b068; - case 0x069: return b069; - case 0x06a: return b06a; - case 0x06b: return b06b; - case 0x06c: return b06c; - case 0x06d: return b06d; - case 0x06e: return b06e; - case 0x06f: return b06f; - case 0x070: return b070; - case 0x071: return b071; - case 0x072: return b072; - case 0x073: return b073; - case 0x074: return b074; - case 0x075: return b075; - case 0x076: return b076; - case 0x077: return b077; - case 0x078: return b078; - case 0x079: return b079; - case 0x07a: return b07a; - case 0x07b: return b07b; - case 0x07c: return b07c; - case 0x07d: return b07d; - case 0x07e: return b07e; - case 0x07f: return b07f; - case 0x080: return b080; - case 0x081: return b081; - case 0x082: return b082; - case 0x083: return b083; - case 0x084: return b084; - case 0x085: return b085; - case 0x086: return b086; - case 0x087: return b087; - case 0x088: return b088; - case 0x089: return b089; - case 0x08a: return b08a; - case 0x08b: return b08b; - case 0x08c: return b08c; - case 0x08d: return b08d; - case 0x08e: return b08e; - case 0x08f: return b08f; - case 0x090: return b090; - case 0x091: return b091; - case 0x092: return b092; - case 0x093: return b093; - case 0x094: return b094; - case 0x095: return b095; - case 0x096: return b096; - case 0x097: return b097; - case 0x098: return b098; - case 0x099: return b099; - case 0x09a: return b09a; - case 0x09b: return b09b; - case 0x09c: return b09c; - case 0x09d: return b09d; - case 0x09e: return b09e; - case 0x09f: return b09f; - case 0x0a0: return b0a0; - case 0x0a1: return b0a1; - case 0x0a2: return b0a2; - case 0x0a3: return b0a3; - case 0x0a4: return b0a4; - case 0x0a5: return b0a5; - case 0x0a6: return b0a6; - case 0x0a7: return b0a7; - case 0x0a8: return b0a8; - case 0x0a9: return b0a9; - case 0x0aa: return b0aa; - case 0x0ab: return b0ab; - case 0x0ac: return b0ac; - case 0x0ad: return b0ad; - case 0x0ae: return b0ae; - case 0x0af: return b0af; - case 0x0b0: return b0b0; - case 0x0b1: return b0b1; - case 0x0b2: return b0b2; - case 0x0b3: return b0b3; - case 0x0b4: return b0b4; - case 0x0b5: return b0b5; - case 0x0b6: return b0b6; - case 0x0b7: return b0b7; - case 0x0b8: return b0b8; - case 0x0b9: return b0b9; - case 0x0ba: return b0ba; - case 0x0bb: return b0bb; - case 0x0bc: return b0bc; - case 0x0bd: return b0bd; - case 0x0be: return b0be; - case 0x0bf: return b0bf; - case 0x0c0: return b0c0; - case 0x0c1: return b0c1; - case 0x0c2: return b0c2; - case 0x0c3: return b0c3; - case 0x0c4: return b0c4; - case 0x0c5: return b0c5; - case 0x0c6: return b0c6; - case 0x0c7: return b0c7; - case 0x0c8: return b0c8; - case 0x0c9: return b0c9; - case 0x0ca: return b0ca; - case 0x0cb: return b0cb; - case 0x0cc: return b0cc; - case 0x0cd: return b0cd; - case 0x0ce: return b0ce; - case 0x0cf: return b0cf; - case 0x0d0: return b0d0; - case 0x0d1: return b0d1; - case 0x0d2: return b0d2; - case 0x0d3: return b0d3; - case 0x0d4: return b0d4; - case 0x0d5: return b0d5; - case 0x0d6: return b0d6; - case 0x0d7: return b0d7; - case 0x0f9: return b0f9; - case 0x0fa: return b0fa; - case 0x0fb: return b0fb; - case 0x0fc: return b0fc; - case 0x0fd: return b0fd; - case 0x0fe: return b0fe; - case 0x0ff: return b0ff; - case 0x100: return b100; - case 0x101: return b101; - case 0x102: return b102; - case 0x103: return b103; - case 0x104: return b104; - case 0x105: return b105; - case 0x106: return b106; - case 0x107: return b107; - case 0x108: return b108; - case 0x109: return b109; - case 0x10a: return b10a; - case 0x10b: return b10b; - case 0x10c: return b10c; - case 0x10d: return b10d; - case 0x10e: return b10e; - case 0x10f: return b10f; - case 0x110: return b110; - case 0x111: return b111; - case 0x112: return b112; - case 0x113: return b113; - case 0x114: return b114; - case 0x115: return b115; - case 0x116: return b116; - case 0x117: return b117; - case 0x118: return b118; - case 0x119: return b119; - case 0x11a: return b11a; - case 0x11c: return b11c; - case 0x11d: return b11d; - case 0x11e: return b11e; - case 0x11f: return b11f; - case 0x124: return b124; - case 0x12f: return b12f; - case 0x130: return b130; - case 0x131: return b131; - case 0x132: return b132; - case 0x133: return b133; - case 0x134: return b134; - case 0x144: return b144; - case 0x145: return b145; - case 0x146: return b146; - case 0x16a: return b16a; - case 0x16b: return b16b; - case 0x16e: return b16e; - case 0x16f: return b16f; - case 0x170: return b170; - case 0x171: return b171; - case 0x172: return b172; - case 0x173: return b173; - case 0x174: return b174; - case 0x175: return b175; - case 0x176: return b176; - case 0x177: return b177; - case 0x178: return b178; - case 0x179: return b179; - case 0x17a: return b17a; - case 0x17b: return b17b; - case 0x17c: return b17c; - case 0x17d: return b17d; - case 0x17e: return b17e; - case 0x17f: return b17f; - case 0x180: return b180; - case 0x181: return b181; - case 0x182: return b182; - case 0x183: return b183; - case 0x184: return b184; - case 0x185: return b185; - case 0x186: return b186; - case 0x187: return b187; - case 0x188: return b188; - case 0x189: return b189; - case 0x18a: return b18a; - case 0x18b: return b18b; - case 0x18c: return b18c; - case 0x18d: return b18d; - case 0x1b0: return b1b0; - case 0x1b1: return b1b1; - case 0x1b2: return b1b2; - case 0x1bc: return b1bc; - case 0x1cf: return b1cf; - case 0x1d0: return b1d0; - case 0x1d1: return b1d1; - case 0x1d2: return b1d2; - case 0x1d3: return b1d3; - case 0x1d4: return b1d4; - case 0x1d5: return b1d5; - case 0x1d6: return b1d6; - case 0x1d7: return b1d7; - case 0x1df: return b1df; - case 0x1e0: return b1e0; - case 0x1e1: return b1e1; - case 0x1e2: return b1e2; - case 0x1e7: return b1e7; - case 0x1e8: return b1e8; - case 0x1e9: return b1e9; - case 0x1ec: return b1ec; - case 0x1ed: return b1ed; - case 0x1ee: return b1ee; - case 0x1f0: return b1f0; - case 0x1f1: return b1f1; - case 0x1f2: return b1f2; - case 0x1f3: return b1f3; - case 0x1f4: return b1f4; - case 0x1f5: return b1f5; - case 0x1f6: return b1f6; - case 0x1f7: return b1f7; - case 0x1f8: return b1f8; - case 0x1f9: return b1f9; - case 0x1fa: return b1fa; - case 0x1fb: return b1fb; - case 0x200: return b200; - case 0x201: return b201; - case 0x202: return b202; - case 0x203: return b203; - case 0x204: return b204; - case 0x205: return b205; - case 0x206: return b206; - case 0x207: return b207; - case 0x208: return b208; - case 0x209: return b209; - case 0x20a: return b20a; - case 0x20b: return b20b; - case 0x20c: return b20c; - case 0x20d: return b20d; - case 0x20e: return b20e; - case 0x20f: return b20f; - case 0x210: return b210; - case 0x211: return b211; - case 0x212: return b212; - case 0x213: return b213; - case 0x214: return b214; - case 0x215: return b215; - case 0x216: return b216; - case 0x217: return b217; - case 0x218: return b218; - case 0x219: return b219; - case 0x21a: return b21a; - case 0x21b: return b21b; - case 0x21c: return b21c; - case 0x21d: return b21d; - case 0x21e: return b21e; - case 0x21f: return b21f; - case 0x220: return b220; - case 0x221: return b221; - case 0x222: return b222; - case 0x223: return b223; - case 0x224: return b224; - case 0x225: return b225; - case 0x226: return b226; - case 0x227: return b227; - case 0x228: return b228; - case 0x229: return b229; - case 0x22a: return b22a; - case 0x22b: return b22b; - case 0x22c: return b22c; - case 0x22d: return b22d; - case 0x22e: return b22e; - case 0x22f: return b22f; - case 0x230: return b230; - case 0x231: return b231; - case 0x232: return b232; - case 0x233: return b233; - case 0x234: return b234; - case 0x235: return b235; - case 0x236: return b236; - case 0x237: return b237; - case 0x238: return b238; - case 0x239: return b239; - case 0x23a: return b23a; - case 0x23b: return b23b; - case 0x23c: return b23c; - case 0x23d: return b23d; - case 0x23e: return b23e; - case 0x23f: return b23f; - case 0x240: return b240; - case 0x241: return b241; - case 0x242: return b242; - case 0x243: return b243; - case 0x244: return b244; - case 0x245: return b245; - case 0x246: return b246; - case 0x247: return b247; - case 0x248: return b248; - case 0x249: return b249; - case 0x24a: return b24a; - case 0x24b: return b24b; - case 0x24c: return b24c; - case 0x24d: return b24d; - case 0x24e: return b24e; - case 0x24f: return b24f; - case 0x250: return b250; - case 0x251: return b251; - case 0x252: return b252; - case 0x253: return b253; - case 0x254: return b254; - case 0x255: return b255; - case 0x256: return b256; - case 0x257: return b257; - case 0x258: return b258; - case 0x259: return b259; - case 0x25a: return b25a; - case 0x25b: return b25b; - case 0x25c: return b25c; - case 0x25d: return b25d; - case 0x25e: return b25e; - case 0x25f: return b25f; - case 0x260: return b260; - case 0x261: return b261; - case 0x262: return b262; - case 0x263: return b263; - case 0x264: return b264; - case 0x265: return b265; - case 0x266: return b266; - case 0x267: return b267; - case 0x268: return b268; - case 0x269: return b269; - case 0x26a: return b26a; - case 0x26b: return b26b; - case 0x26c: return b26c; - case 0x26d: return b26d; - case 0x26e: return b26e; - case 0x26f: return b26f; - case 0x270: return b270; - case 0x271: return b271; - case 0x272: return b272; - case 0x273: return b273; - case 0x274: return b274; - case 0x275: return b275; - case 0x276: return b276; - case 0x277: return b277; - case 0x278: return b278; - case 0x279: return b279; - case 0x27a: return b27a; - case 0x27b: return b27b; - case 0x27c: return b27c; - case 0x27d: return b27d; - case 0x27e: return b27e; - case 0x27f: return b27f; - case 0x280: return b280; - case 0x281: return b281; - case 0x282: return b282; - case 0x283: return b283; - case 0x284: return b284; - case 0x285: return b285; - case 0x286: return b286; - case 0x287: return b287; - case 0x288: return b288; - case 0x289: return b289; - case 0x28a: return b28a; - case 0x28b: return b28b; - case 0x28c: return b28c; - case 0x28d: return b28d; - case 0x28e: return b28e; - case 0x28f: return b28f; - case 0x290: return b290; - case 0x291: return b291; - case 0x292: return b292; - case 0x293: return b293; - case 0x294: return b294; - case 0x295: return b295; - case 0x296: return b296; - case 0x297: return b297; - case 0x298: return b298; - case 0x299: return b299; - case 0x29a: return b29a; - case 0x29b: return b29b; - case 0x29c: return b29c; - case 0x29d: return b29d; - case 0x29e: return b29e; - case 0x29f: return b29f; - case 0x2a0: return b2a0; - case 0x2a1: return b2a1; - case 0x2a2: return b2a2; - case 0x2a3: return b2a3; - case 0x2a4: return b2a4; - case 0x2a5: return b2a5; - case 0x2a6: return b2a6; - case 0x2a7: return b2a7; - case 0x2a8: return b2a8; - case 0x2a9: return b2a9; - case 0x2aa: return b2aa; - case 0x2ab: return b2ab; - case 0x2ac: return b2ac; - case 0x2ad: return b2ad; - case 0x2ae: return b2ae; - case 0x2af: return b2af; - case 0x2b0: return b2b0; - case 0x2b1: return b2b1; - case 0x2b2: return b2b2; - case 0x2b3: return b2b3; - case 0x2b4: return b2b4; - case 0x2b5: return b2b5; - case 0x2b6: return b2b6; - case 0x2b7: return b2b7; - case 0x2b8: return b2b8; - case 0x2b9: return b2b9; - case 0x2ba: return b2ba; - case 0x2bb: return b2bb; - case 0x2bc: return b2bc; - case 0x2bd: return b2bd; - case 0x2be: return b2be; - case 0x2bf: return b2bf; - case 0x2c0: return b2c0; - case 0x2c1: return b2c1; - case 0x2c2: return b2c2; - case 0x2c3: return b2c3; - case 0x2c4: return b2c4; - case 0x2c5: return b2c5; - case 0x2c6: return b2c6; - case 0x2c7: return b2c7; - case 0x2c8: return b2c8; - case 0x2c9: return b2c9; - case 0x2ca: return b2ca; - case 0x2cb: return b2cb; - case 0x2cc: return b2cc; - case 0x2cd: return b2cd; - case 0x2ce: return b2ce; - case 0x2cf: return b2cf; - case 0x2d0: return b2d0; - case 0x2d1: return b2d1; - case 0x2d2: return b2d2; - case 0x2d3: return b2d3; - case 0x2d5: return b2d5; - case 0x2d6: return b2d6; - case 0x2d7: return b2d7; - case 0x2d8: return b2d8; - case 0x2d9: return b2d9; - case 0x2da: return b2da; - case 0x2db: return b2db; - case 0x2dc: return b2dc; - case 0x2dd: return b2dd; - case 0x2de: return b2de; - case 0x2e0: return b2e0; - case 0x2e1: return b2e1; - case 0x2e2: return b2e2; - case 0x2e3: return b2e3; - case 0x2e4: return b2e4; - case 0x2e5: return b2e5; - case 0x2e6: return b2e6; - case 0x2e7: return b2e7; - case 0x2e8: return b2e8; - case 0x2e9: return b2e9; - case 0x2ea: return b2ea; - case 0x2eb: return b2eb; - case 0x2f8: return b2f8; - case 0x2f9: return b2f9; - case 0x2fa: return b2fa; - case 0x300: return b300; - case 0x301: return b301; - case 0x302: return b302; - case 0x303: return b303; - case 0x304: return b304; - case 0x305: return b305; - case 0x306: return b306; - case 0x307: return b307; - case 0x308: return b308; - case 0x309: return b309; - case 0x30a: return b30a; - case 0x30b: return b30b; - case 0x30c: return b30c; - case 0x30d: return b30d; - case 0x30e: return b30e; - case 0x30f: return b30f; - case 0x310: return b310; - case 0x311: return b311; - case 0x312: return b312; - case 0x313: return b313; - case 0xe00: return be00; - default: return bdefault; - } -} - -/** - * Gets the ASCII transliteration of a Unicode code point - * - * @param utf32 A Unicode code point - * @param ascii A pointer for the result to be written to; not null-terminated - * @return The number of chars in *ascii - */ -size_t anyascii(uint_least32_t utf32, const char **ascii) { - uint_least32_t blocknum = utf32 >> 8; - const char *b = block(blocknum); - size_t blen = ((size_t) (unsigned char) b[0]) * 3 + 1; - size_t lo = (utf32 & 0xff) * 3 + 1; - if (lo > blen) return 0; - size_t l = (unsigned char) b[lo + 2]; - size_t len = l & 0x80 ? l & 0x7f : 3; - if (len <= 3) { - *ascii = b + lo; - } else { - size_t i0 = (unsigned char) b[lo]; - size_t i1 = (unsigned char) b[lo + 1]; - size_t i = (i0 << 8) | i1; - *ascii = bank + i; - } - return len; -} - -#endif /* ANYASCII_H */ diff --git a/dep/cxong/tinydir.h b/dep/cxong/tinydir.h deleted file mode 100644 index ba20c3e..0000000 --- a/dep/cxong/tinydir.h +++ /dev/null @@ -1,838 +0,0 @@ -/* -Copyright (c) 2013-2021, tinydir authors: -- Cong Xu -- Lautis Sun -- Baudouin Feildel -- Andargor -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#ifndef TINYDIR_H -#define TINYDIR_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if ((defined _UNICODE) && !(defined UNICODE)) -#define UNICODE -#endif - -#if ((defined UNICODE) && !(defined _UNICODE)) -#define _UNICODE -#endif - -#include -#include -#include -#ifdef _MSC_VER -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# pragma warning(push) -# pragma warning (disable : 4996) -#else -# include -# include -# include -# include -#endif -#ifdef __MINGW32__ -# include -#endif - - -/* types */ - -/* Windows UNICODE wide character support */ -#if defined _MSC_VER || defined __MINGW32__ -# define _tinydir_char_t TCHAR -# define TINYDIR_STRING(s) _TEXT(s) -# define _tinydir_strlen _tcslen -# define _tinydir_strcpy _tcscpy -# define _tinydir_strcat _tcscat -# define _tinydir_strcmp _tcscmp -# define _tinydir_strrchr _tcsrchr -# define _tinydir_strncmp _tcsncmp -#else -# define _tinydir_char_t char -# define TINYDIR_STRING(s) s -# define _tinydir_strlen strlen -# define _tinydir_strcpy strcpy -# define _tinydir_strcat strcat -# define _tinydir_strcmp strcmp -# define _tinydir_strrchr strrchr -# define _tinydir_strncmp strncmp -#endif - -#if (defined _MSC_VER || defined __MINGW32__) -# include -# define _TINYDIR_PATH_MAX MAX_PATH -#elif defined __linux__ -# include -# ifdef PATH_MAX -# define _TINYDIR_PATH_MAX PATH_MAX -# endif -#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) -# include -# if defined(BSD) -# include -# ifdef PATH_MAX -# define _TINYDIR_PATH_MAX PATH_MAX -# endif -# endif -#endif - -#ifndef _TINYDIR_PATH_MAX -#define _TINYDIR_PATH_MAX 4096 -#endif - -#ifdef _MSC_VER -/* extra chars for the "\\*" mask */ -# define _TINYDIR_PATH_EXTRA 2 -#else -# define _TINYDIR_PATH_EXTRA 0 -#endif - -#define _TINYDIR_FILENAME_MAX 256 - -#if (defined _MSC_VER || defined __MINGW32__) -#define _TINYDIR_DRIVE_MAX 3 -#endif - -#ifdef _MSC_VER -# define _TINYDIR_FUNC static __inline -#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L -# define _TINYDIR_FUNC static __inline__ -#elif defined(__cplusplus) -# define _TINYDIR_FUNC static inline -#elif defined(__GNUC__) -/* Suppress unused function warning */ -# define _TINYDIR_FUNC __attribute__((unused)) static -#else -# define _TINYDIR_FUNC static -#endif - -/* readdir_r usage; define TINYDIR_USE_READDIR_R to use it (if supported) */ -#ifdef TINYDIR_USE_READDIR_R - -/* readdir_r is a POSIX-only function, and may not be available under various - * environments/settings, e.g. MinGW. Use readdir fallback */ -#if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE ||\ - _POSIX_SOURCE -# define _TINYDIR_HAS_READDIR_R -#endif -#if _POSIX_C_SOURCE >= 200112L -# define _TINYDIR_HAS_FPATHCONF -# include -#endif -#if _BSD_SOURCE || _SVID_SOURCE || \ - (_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) -# define _TINYDIR_HAS_DIRFD -# include -#endif -#if defined _TINYDIR_HAS_FPATHCONF && defined _TINYDIR_HAS_DIRFD &&\ - defined _PC_NAME_MAX -# define _TINYDIR_USE_FPATHCONF -#endif -#if defined __MINGW32__ || !defined _TINYDIR_HAS_READDIR_R ||\ - !(defined _TINYDIR_USE_FPATHCONF || defined NAME_MAX) -# define _TINYDIR_USE_READDIR -#endif - -/* Use readdir by default */ -#else -# define _TINYDIR_USE_READDIR -#endif - -/* MINGW32 has two versions of dirent, ASCII and UNICODE*/ -#ifndef _MSC_VER -#if (defined __MINGW32__) && (defined _UNICODE) -#define _TINYDIR_DIR _WDIR -#define _tinydir_dirent _wdirent -#define _tinydir_opendir _wopendir -#define _tinydir_readdir _wreaddir -#define _tinydir_closedir _wclosedir -#else -#define _TINYDIR_DIR DIR -#define _tinydir_dirent dirent -#define _tinydir_opendir opendir -#define _tinydir_readdir readdir -#define _tinydir_closedir closedir -#endif -#endif - -/* Allow user to use a custom allocator by defining _TINYDIR_MALLOC and _TINYDIR_FREE. */ -#if defined(_TINYDIR_MALLOC) && defined(_TINYDIR_FREE) -#elif !defined(_TINYDIR_MALLOC) && !defined(_TINYDIR_FREE) -#else -#error "Either define both alloc and free or none of them!" -#endif - -#if !defined(_TINYDIR_MALLOC) - #define _TINYDIR_MALLOC(_size) malloc(_size) - #define _TINYDIR_FREE(_ptr) free(_ptr) -#endif /* !defined(_TINYDIR_MALLOC) */ - -typedef struct tinydir_file -{ - _tinydir_char_t path[_TINYDIR_PATH_MAX]; - _tinydir_char_t name[_TINYDIR_FILENAME_MAX]; - _tinydir_char_t *extension; - int is_dir; - int is_reg; - -#ifndef _MSC_VER -#ifdef __MINGW32__ - struct _stat _s; -#else - struct stat _s; -#endif -#endif -} tinydir_file; - -typedef struct tinydir_dir -{ - _tinydir_char_t path[_TINYDIR_PATH_MAX]; - int has_next; - size_t n_files; - - tinydir_file *_files; -#ifdef _MSC_VER - HANDLE _h; - WIN32_FIND_DATA _f; -#else - _TINYDIR_DIR *_d; - struct _tinydir_dirent *_e; -#ifndef _TINYDIR_USE_READDIR - struct _tinydir_dirent *_ep; -#endif -#endif -} tinydir_dir; - - -/* declarations */ - -_TINYDIR_FUNC -int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path); -_TINYDIR_FUNC -int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path); -_TINYDIR_FUNC -void tinydir_close(tinydir_dir *dir); - -_TINYDIR_FUNC -int tinydir_next(tinydir_dir *dir); -_TINYDIR_FUNC -int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file); -_TINYDIR_FUNC -int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i); -_TINYDIR_FUNC -int tinydir_open_subdir_n(tinydir_dir *dir, size_t i); - -_TINYDIR_FUNC -int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path); -_TINYDIR_FUNC -void _tinydir_get_ext(tinydir_file *file); -_TINYDIR_FUNC -int _tinydir_file_cmp(const void *a, const void *b); -#ifndef _MSC_VER -#ifndef _TINYDIR_USE_READDIR -_TINYDIR_FUNC -size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp); -#endif -#endif - - -/* definitions*/ - -_TINYDIR_FUNC -int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path) -{ -#ifndef _MSC_VER -#ifndef _TINYDIR_USE_READDIR - int error; - int size; /* using int size */ -#endif -#else - _tinydir_char_t path_buf[_TINYDIR_PATH_MAX]; -#endif - _tinydir_char_t *pathp; - - if (dir == NULL || path == NULL || _tinydir_strlen(path) == 0) - { - errno = EINVAL; - return -1; - } - if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX) - { - errno = ENAMETOOLONG; - return -1; - } - - /* initialise dir */ - dir->_files = NULL; -#ifdef _MSC_VER - dir->_h = INVALID_HANDLE_VALUE; -#else - dir->_d = NULL; -#ifndef _TINYDIR_USE_READDIR - dir->_ep = NULL; -#endif -#endif - tinydir_close(dir); - - _tinydir_strcpy(dir->path, path); - /* Remove trailing slashes */ - pathp = &dir->path[_tinydir_strlen(dir->path) - 1]; - while (pathp != dir->path && (*pathp == TINYDIR_STRING('\\') || *pathp == TINYDIR_STRING('/'))) - { - *pathp = TINYDIR_STRING('\0'); - pathp++; - } -#ifdef _MSC_VER - _tinydir_strcpy(path_buf, dir->path); - _tinydir_strcat(path_buf, TINYDIR_STRING("\\*")); -#if (defined WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) - dir->_h = FindFirstFileEx(path_buf, FindExInfoStandard, &dir->_f, FindExSearchNameMatch, NULL, 0); -#else - dir->_h = FindFirstFile(path_buf, &dir->_f); -#endif - if (dir->_h == INVALID_HANDLE_VALUE) - { - errno = ENOENT; -#else - dir->_d = _tinydir_opendir(path); - if (dir->_d == NULL) - { -#endif - goto bail; - } - - /* read first file */ - dir->has_next = 1; -#ifndef _MSC_VER -#ifdef _TINYDIR_USE_READDIR - dir->_e = _tinydir_readdir(dir->_d); -#else - /* allocate dirent buffer for readdir_r */ - size = _tinydir_dirent_buf_size(dir->_d); /* conversion to int */ - if (size == -1) return -1; - dir->_ep = (struct _tinydir_dirent*)_TINYDIR_MALLOC(size); - if (dir->_ep == NULL) return -1; - - error = readdir_r(dir->_d, dir->_ep, &dir->_e); - if (error != 0) return -1; -#endif - if (dir->_e == NULL) - { - dir->has_next = 0; - } -#endif - - return 0; - -bail: - tinydir_close(dir); - return -1; -} - -_TINYDIR_FUNC -int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path) -{ - /* Count the number of files first, to pre-allocate the files array */ - size_t n_files = 0; - if (tinydir_open(dir, path) == -1) - { - return -1; - } - while (dir->has_next) - { - n_files++; - if (tinydir_next(dir) == -1) - { - goto bail; - } - } - tinydir_close(dir); - - if (n_files == 0 || tinydir_open(dir, path) == -1) - { - return -1; - } - - dir->n_files = 0; - dir->_files = (tinydir_file *)_TINYDIR_MALLOC(sizeof *dir->_files * n_files); - if (dir->_files == NULL) - { - goto bail; - } - while (dir->has_next) - { - tinydir_file *p_file; - dir->n_files++; - - p_file = &dir->_files[dir->n_files - 1]; - if (tinydir_readfile(dir, p_file) == -1) - { - goto bail; - } - - if (tinydir_next(dir) == -1) - { - goto bail; - } - - /* Just in case the number of files has changed between the first and - second reads, terminate without writing into unallocated memory */ - if (dir->n_files == n_files) - { - break; - } - } - - qsort(dir->_files, dir->n_files, sizeof(tinydir_file), _tinydir_file_cmp); - - return 0; - -bail: - tinydir_close(dir); - return -1; -} - -_TINYDIR_FUNC -void tinydir_close(tinydir_dir *dir) -{ - if (dir == NULL) - { - return; - } - - memset(dir->path, 0, sizeof(dir->path)); - dir->has_next = 0; - dir->n_files = 0; - _TINYDIR_FREE(dir->_files); - dir->_files = NULL; -#ifdef _MSC_VER - if (dir->_h != INVALID_HANDLE_VALUE) - { - FindClose(dir->_h); - } - dir->_h = INVALID_HANDLE_VALUE; -#else - if (dir->_d) - { - _tinydir_closedir(dir->_d); - } - dir->_d = NULL; - dir->_e = NULL; -#ifndef _TINYDIR_USE_READDIR - _TINYDIR_FREE(dir->_ep); - dir->_ep = NULL; -#endif -#endif -} - -_TINYDIR_FUNC -int tinydir_next(tinydir_dir *dir) -{ - if (dir == NULL) - { - errno = EINVAL; - return -1; - } - if (!dir->has_next) - { - errno = ENOENT; - return -1; - } - -#ifdef _MSC_VER - if (FindNextFile(dir->_h, &dir->_f) == 0) -#else -#ifdef _TINYDIR_USE_READDIR - dir->_e = _tinydir_readdir(dir->_d); -#else - if (dir->_ep == NULL) - { - return -1; - } - if (readdir_r(dir->_d, dir->_ep, &dir->_e) != 0) - { - return -1; - } -#endif - if (dir->_e == NULL) -#endif - { - dir->has_next = 0; -#ifdef _MSC_VER - if (GetLastError() != ERROR_SUCCESS && - GetLastError() != ERROR_NO_MORE_FILES) - { - tinydir_close(dir); - errno = EIO; - return -1; - } -#endif - } - - return 0; -} - -_TINYDIR_FUNC -int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file) -{ - const _tinydir_char_t *filename; - if (dir == NULL || file == NULL) - { - errno = EINVAL; - return -1; - } -#ifdef _MSC_VER - if (dir->_h == INVALID_HANDLE_VALUE) -#else - if (dir->_e == NULL) -#endif - { - errno = ENOENT; - return -1; - } - filename = -#ifdef _MSC_VER - dir->_f.cFileName; -#else - dir->_e->d_name; -#endif - if (_tinydir_strlen(dir->path) + - _tinydir_strlen(filename) + 1 + _TINYDIR_PATH_EXTRA >= - _TINYDIR_PATH_MAX) - { - /* the path for the file will be too long */ - errno = ENAMETOOLONG; - return -1; - } - if (_tinydir_strlen(filename) >= _TINYDIR_FILENAME_MAX) - { - errno = ENAMETOOLONG; - return -1; - } - - _tinydir_strcpy(file->path, dir->path); - if (_tinydir_strcmp(dir->path, TINYDIR_STRING("/")) != 0) - _tinydir_strcat(file->path, TINYDIR_STRING("/")); - _tinydir_strcpy(file->name, filename); - _tinydir_strcat(file->path, filename); -#ifndef _MSC_VER -#ifdef __MINGW32__ - if (_tstat( -#elif (defined _BSD_SOURCE) || (defined _DEFAULT_SOURCE) \ - || ((defined _XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)) \ - || ((defined _POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) \ - || ((defined __APPLE__) && (defined __MACH__)) \ - || (defined BSD) - if (lstat( -#else - if (stat( -#endif - file->path, &file->_s) == -1) - { - return -1; - } -#endif - _tinydir_get_ext(file); - - file->is_dir = -#ifdef _MSC_VER - !!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); -#else - S_ISDIR(file->_s.st_mode); -#endif - file->is_reg = -#ifdef _MSC_VER - !!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) || - ( - !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) && - !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && - !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) && -#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM - !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) && -#endif -#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA - !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) && -#endif - !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) && - !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY)); -#else - S_ISREG(file->_s.st_mode); -#endif - - return 0; -} - -_TINYDIR_FUNC -int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i) -{ - if (dir == NULL || file == NULL) - { - errno = EINVAL; - return -1; - } - if (i >= dir->n_files) - { - errno = ENOENT; - return -1; - } - - memcpy(file, &dir->_files[i], sizeof(tinydir_file)); - _tinydir_get_ext(file); - - return 0; -} - -_TINYDIR_FUNC -int tinydir_open_subdir_n(tinydir_dir *dir, size_t i) -{ - _tinydir_char_t path[_TINYDIR_PATH_MAX]; - if (dir == NULL) - { - errno = EINVAL; - return -1; - } - if (i >= dir->n_files || !dir->_files[i].is_dir) - { - errno = ENOENT; - return -1; - } - - _tinydir_strcpy(path, dir->_files[i].path); - tinydir_close(dir); - if (tinydir_open_sorted(dir, path) == -1) - { - return -1; - } - - return 0; -} - -/* Open a single file given its path */ -_TINYDIR_FUNC -int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path) -{ - tinydir_dir dir; - int result = 0; - int found = 0; - _tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX]; - _tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX]; - _tinydir_char_t *dir_name; - _tinydir_char_t *base_name; -#if (defined _MSC_VER || defined __MINGW32__) - _tinydir_char_t drive_buf[_TINYDIR_PATH_MAX]; - _tinydir_char_t ext_buf[_TINYDIR_FILENAME_MAX]; -#endif - - if (file == NULL || path == NULL || _tinydir_strlen(path) == 0) - { - errno = EINVAL; - return -1; - } - if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX) - { - errno = ENAMETOOLONG; - return -1; - } - - /* Get the parent path */ -#if (defined _MSC_VER || defined __MINGW32__) -#if ((defined _MSC_VER) && (_MSC_VER >= 1400)) - errno = _tsplitpath_s( - path, - drive_buf, _TINYDIR_DRIVE_MAX, - dir_name_buf, _TINYDIR_FILENAME_MAX, - file_name_buf, _TINYDIR_FILENAME_MAX, - ext_buf, _TINYDIR_FILENAME_MAX); -#else - _tsplitpath( - path, - drive_buf, - dir_name_buf, - file_name_buf, - ext_buf); -#endif - - if (errno) - { - return -1; - } - -/* _splitpath_s not work fine with only filename and widechar support */ -#ifdef _UNICODE - if (drive_buf[0] == L'\xFEFE') - drive_buf[0] = '\0'; - if (dir_name_buf[0] == L'\xFEFE') - dir_name_buf[0] = '\0'; -#endif - - /* Emulate the behavior of dirname by returning "." for dir name if it's - empty */ - if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0') - { - _tinydir_strcpy(dir_name_buf, TINYDIR_STRING(".")); - } - /* Concatenate the drive letter and dir name to form full dir name */ - _tinydir_strcat(drive_buf, dir_name_buf); - dir_name = drive_buf; - /* Concatenate the file name and extension to form base name */ - _tinydir_strcat(file_name_buf, ext_buf); - base_name = file_name_buf; -#else - _tinydir_strcpy(dir_name_buf, path); - dir_name = dirname(dir_name_buf); - _tinydir_strcpy(file_name_buf, path); - base_name = basename(file_name_buf); -#endif - - /* Special case: if the path is a root dir, open the parent dir as the file */ -#if (defined _MSC_VER || defined __MINGW32__) - if (_tinydir_strlen(base_name) == 0) -#else - if ((_tinydir_strcmp(base_name, TINYDIR_STRING("/"))) == 0) -#endif - { - memset(file, 0, sizeof * file); - file->is_dir = 1; - file->is_reg = 0; - _tinydir_strcpy(file->path, dir_name); - file->extension = file->path + _tinydir_strlen(file->path); - return 0; - } - - /* Open the parent directory */ - if (tinydir_open(&dir, dir_name) == -1) - { - return -1; - } - - /* Read through the parent directory and look for the file */ - while (dir.has_next) - { - if (tinydir_readfile(&dir, file) == -1) - { - result = -1; - goto bail; - } - if (_tinydir_strcmp(file->name, base_name) == 0) - { - /* File found */ - found = 1; - break; - } - tinydir_next(&dir); - } - if (!found) - { - result = -1; - errno = ENOENT; - } - -bail: - tinydir_close(&dir); - return result; -} - -_TINYDIR_FUNC -void _tinydir_get_ext(tinydir_file *file) -{ - _tinydir_char_t *period = _tinydir_strrchr(file->name, TINYDIR_STRING('.')); - if (period == NULL) - { - file->extension = &(file->name[_tinydir_strlen(file->name)]); - } - else - { - file->extension = period + 1; - } -} - -_TINYDIR_FUNC -int _tinydir_file_cmp(const void *a, const void *b) -{ - const tinydir_file *fa = (const tinydir_file *)a; - const tinydir_file *fb = (const tinydir_file *)b; - if (fa->is_dir != fb->is_dir) - { - return -(fa->is_dir - fb->is_dir); - } - return _tinydir_strncmp(fa->name, fb->name, _TINYDIR_FILENAME_MAX); -} - -#ifndef _MSC_VER -#ifndef _TINYDIR_USE_READDIR -/* -The following authored by Ben Hutchings -from https://womble.decadent.org.uk/readdir_r-advisory.html -*/ -/* Calculate the required buffer size (in bytes) for directory * -* entries read from the given directory handle. Return -1 if this * -* this cannot be done. * -* * -* This code does not trust values of NAME_MAX that are less than * -* 255, since some systems (including at least HP-UX) incorrectly * -* define it to be a smaller value. */ -_TINYDIR_FUNC -size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp) -{ - long name_max; - size_t name_end; - /* parameter may be unused */ - (void)dirp; - -#if defined _TINYDIR_USE_FPATHCONF - name_max = fpathconf(dirfd(dirp), _PC_NAME_MAX); - if (name_max == -1) -#if defined(NAME_MAX) - name_max = (NAME_MAX > 255) ? NAME_MAX : 255; -#else - return (size_t)(-1); -#endif -#elif defined(NAME_MAX) - name_max = (NAME_MAX > 255) ? NAME_MAX : 255; -#else -#error "buffer size for readdir_r cannot be determined" -#endif - name_end = (size_t)offsetof(struct _tinydir_dirent, d_name) + name_max + 1; - return (name_end > sizeof(struct _tinydir_dirent) ? - name_end : sizeof(struct _tinydir_dirent)); -} -#endif -#endif - -#ifdef __cplusplus -} -#endif - -# if defined (_MSC_VER) -# pragma warning(pop) -# endif - -#endif diff --git a/dep/dr_soft/miniaudio.h b/dep/dr_soft/miniaudio.h deleted file mode 100644 index f774f0d..0000000 --- a/dep/dr_soft/miniaudio.h +++ /dev/null @@ -1,90463 +0,0 @@ -/* -Audio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file. -miniaudio - v0.11.9 - 2022-04-20 - -David Reid - mackron@gmail.com - -Website: https://miniaud.io -Documentation: https://miniaud.io/docs -GitHub: https://github.com/mackron/miniaudio -*/ - -/* -1. Introduction -=============== -miniaudio is a single file library for audio playback and capture. To use it, do the following in -one .c file: - - ```c - #define MINIAUDIO_IMPLEMENTATION - #include "miniaudio.h" - ``` - -You can do `#include "miniaudio.h"` in other parts of the program just like any other header. - -miniaudio includes both low level and high level APIs. The low level API is good for those who want -to do all of their mixing themselves and only require a light weight interface to the underlying -audio device. The high level API is good for those who have complex mixing and effect requirements. - -In miniaudio, objects are transparent structures. Unlike many other libraries, there are no handles -to opaque objects which means you need to allocate memory for objects yourself. In the examples -presented in this documentation you will often see objects declared on the stack. You need to be -careful when translating these examples to your own code so that you don't accidentally declare -your objects on the stack and then cause them to become invalid once the function returns. In -addition, you must ensure the memory address of your objects remain the same throughout their -lifetime. You therefore cannot be making copies of your objects. - -A config/init pattern is used throughout the entire library. The idea is that you set up a config -object and pass that into the initialization routine. The advantage to this system is that the -config object can be initialized with logical defaults and new properties added to it without -breaking the API. The config object can be allocated on the stack and does not need to be -maintained after initialization of the corresponding object. - - -1.1. Low Level API ------------------- -The low level API gives you access to the raw audio data of an audio device. It supports playback, -capture, full-duplex and loopback (WASAPI only). You can enumerate over devices to determine which -physical device(s) you want to connect to. - -The low level API uses the concept of a "device" as the abstraction for physical devices. The idea -is that you choose a physical device to emit or capture audio from, and then move data to/from the -device when miniaudio tells you to. Data is delivered to and from devices asynchronously via a -callback which you specify when initializing the device. - -When initializing the device you first need to configure it. The device configuration allows you to -specify things like the format of the data delivered via the callback, the size of the internal -buffer and the ID of the device you want to emit or capture audio from. - -Once you have the device configuration set up you can initialize the device. When initializing a -device you need to allocate memory for the device object beforehand. This gives the application -complete control over how the memory is allocated. In the example below we initialize a playback -device on the stack, but you could allocate it on the heap if that suits your situation better. - - ```c - void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) - { - // In playback mode copy data to pOutput. In capture mode read data from pInput. In full-duplex mode, both - // pOutput and pInput will be valid and you can move data from pInput into pOutput. Never process more than - // frameCount frames. - } - - int main() - { - ma_device_config config = ma_device_config_init(ma_device_type_playback); - config.playback.format = ma_format_f32; // Set to ma_format_unknown to use the device's native format. - config.playback.channels = 2; // Set to 0 to use the device's native channel count. - config.sampleRate = 48000; // Set to 0 to use the device's native sample rate. - config.dataCallback = data_callback; // This function will be called when miniaudio needs more data. - config.pUserData = pMyCustomData; // Can be accessed from the device object (device.pUserData). - - ma_device device; - if (ma_device_init(NULL, &config, &device) != MA_SUCCESS) { - return -1; // Failed to initialize the device. - } - - ma_device_start(&device); // The device is sleeping by default so you'll need to start it manually. - - // Do something here. Probably your program's main loop. - - ma_device_uninit(&device); // This will stop the device so no need to do that manually. - return 0; - } - ``` - -In the example above, `data_callback()` is where audio data is written and read from the device. -The idea is in playback mode you cause sound to be emitted from the speakers by writing audio data -to the output buffer (`pOutput` in the example). In capture mode you read data from the input -buffer (`pInput`) to extract sound captured by the microphone. The `frameCount` parameter tells you -how many frames can be written to the output buffer and read from the input buffer. A "frame" is -one sample for each channel. For example, in a stereo stream (2 channels), one frame is 2 -samples: one for the left, one for the right. The channel count is defined by the device config. -The size in bytes of an individual sample is defined by the sample format which is also specified -in the device config. Multi-channel audio data is always interleaved, which means the samples for -each frame are stored next to each other in memory. For example, in a stereo stream the first pair -of samples will be the left and right samples for the first frame, the second pair of samples will -be the left and right samples for the second frame, etc. - -The configuration of the device is defined by the `ma_device_config` structure. The config object -is always initialized with `ma_device_config_init()`. It's important to always initialize the -config with this function as it initializes it with logical defaults and ensures your program -doesn't break when new members are added to the `ma_device_config` structure. The example above -uses a fairly simple and standard device configuration. The call to `ma_device_config_init()` takes -a single parameter, which is whether or not the device is a playback, capture, duplex or loopback -device (loopback devices are not supported on all backends). The `config.playback.format` member -sets the sample format which can be one of the following (all formats are native-endian): - - +---------------+----------------------------------------+---------------------------+ - | Symbol | Description | Range | - +---------------+----------------------------------------+---------------------------+ - | ma_format_f32 | 32-bit floating point | [-1, 1] | - | ma_format_s16 | 16-bit signed integer | [-32768, 32767] | - | ma_format_s24 | 24-bit signed integer (tightly packed) | [-8388608, 8388607] | - | ma_format_s32 | 32-bit signed integer | [-2147483648, 2147483647] | - | ma_format_u8 | 8-bit unsigned integer | [0, 255] | - +---------------+----------------------------------------+---------------------------+ - -The `config.playback.channels` member sets the number of channels to use with the device. The -channel count cannot exceed MA_MAX_CHANNELS. The `config.sampleRate` member sets the sample rate -(which must be the same for both playback and capture in full-duplex configurations). This is -usually set to 44100 or 48000, but can be set to anything. It's recommended to keep this between -8000 and 384000, however. - -Note that leaving the format, channel count and/or sample rate at their default values will result -in the internal device's native configuration being used which is useful if you want to avoid the -overhead of miniaudio's automatic data conversion. - -In addition to the sample format, channel count and sample rate, the data callback and user data -pointer are also set via the config. The user data pointer is not passed into the callback as a -parameter, but is instead set to the `pUserData` member of `ma_device` which you can access -directly since all miniaudio structures are transparent. - -Initializing the device is done with `ma_device_init()`. This will return a result code telling you -what went wrong, if anything. On success it will return `MA_SUCCESS`. After initialization is -complete the device will be in a stopped state. To start it, use `ma_device_start()`. -Uninitializing the device will stop it, which is what the example above does, but you can also stop -the device with `ma_device_stop()`. To resume the device simply call `ma_device_start()` again. -Note that it's important to never stop or start the device from inside the callback. This will -result in a deadlock. Instead you set a variable or signal an event indicating that the device -needs to stop and handle it in a different thread. The following APIs must never be called inside -the callback: - - ```c - ma_device_init() - ma_device_init_ex() - ma_device_uninit() - ma_device_start() - ma_device_stop() - ``` - -You must never try uninitializing and reinitializing a device inside the callback. You must also -never try to stop and start it from inside the callback. There are a few other things you shouldn't -do in the callback depending on your requirements, however this isn't so much a thread-safety -thing, but rather a real-time processing thing which is beyond the scope of this introduction. - -The example above demonstrates the initialization of a playback device, but it works exactly the -same for capture. All you need to do is change the device type from `ma_device_type_playback` to -`ma_device_type_capture` when setting up the config, like so: - - ```c - ma_device_config config = ma_device_config_init(ma_device_type_capture); - config.capture.format = MY_FORMAT; - config.capture.channels = MY_CHANNEL_COUNT; - ``` - -In the data callback you just read from the input buffer (`pInput` in the example above) and leave -the output buffer alone (it will be set to NULL when the device type is set to -`ma_device_type_capture`). - -These are the available device types and how you should handle the buffers in the callback: - - +-------------------------+--------------------------------------------------------+ - | Device Type | Callback Behavior | - +-------------------------+--------------------------------------------------------+ - | ma_device_type_playback | Write to output buffer, leave input buffer untouched. | - | ma_device_type_capture | Read from input buffer, leave output buffer untouched. | - | ma_device_type_duplex | Read from input buffer, write to output buffer. | - | ma_device_type_loopback | Read from input buffer, leave output buffer untouched. | - +-------------------------+--------------------------------------------------------+ - -You will notice in the example above that the sample format and channel count is specified -separately for playback and capture. This is to support different data formats between the playback -and capture devices in a full-duplex system. An example may be that you want to capture audio data -as a monaural stream (one channel), but output sound to a stereo speaker system. Note that if you -use different formats between playback and capture in a full-duplex configuration you will need to -convert the data yourself. There are functions available to help you do this which will be -explained later. - -The example above did not specify a physical device to connect to which means it will use the -operating system's default device. If you have multiple physical devices connected and you want to -use a specific one you will need to specify the device ID in the configuration, like so: - - ```c - config.playback.pDeviceID = pMyPlaybackDeviceID; // Only if requesting a playback or duplex device. - config.capture.pDeviceID = pMyCaptureDeviceID; // Only if requesting a capture, duplex or loopback device. - ``` - -To retrieve the device ID you will need to perform device enumeration, however this requires the -use of a new concept called the "context". Conceptually speaking the context sits above the device. -There is one context to many devices. The purpose of the context is to represent the backend at a -more global level and to perform operations outside the scope of an individual device. Mainly it is -used for performing run-time linking against backend libraries, initializing backends and -enumerating devices. The example below shows how to enumerate devices. - - ```c - ma_context context; - if (ma_context_init(NULL, 0, NULL, &context) != MA_SUCCESS) { - // Error. - } - - ma_device_info* pPlaybackInfos; - ma_uint32 playbackCount; - ma_device_info* pCaptureInfos; - ma_uint32 captureCount; - if (ma_context_get_devices(&context, &pPlaybackInfos, &playbackCount, &pCaptureInfos, &captureCount) != MA_SUCCESS) { - // Error. - } - - // Loop over each device info and do something with it. Here we just print the name with their index. You may want - // to give the user the opportunity to choose which device they'd prefer. - for (ma_uint32 iDevice = 0; iDevice < playbackCount; iDevice += 1) { - printf("%d - %s\n", iDevice, pPlaybackInfos[iDevice].name); - } - - ma_device_config config = ma_device_config_init(ma_device_type_playback); - config.playback.pDeviceID = &pPlaybackInfos[chosenPlaybackDeviceIndex].id; - config.playback.format = MY_FORMAT; - config.playback.channels = MY_CHANNEL_COUNT; - config.sampleRate = MY_SAMPLE_RATE; - config.dataCallback = data_callback; - config.pUserData = pMyCustomData; - - ma_device device; - if (ma_device_init(&context, &config, &device) != MA_SUCCESS) { - // Error - } - - ... - - ma_device_uninit(&device); - ma_context_uninit(&context); - ``` - -The first thing we do in this example is initialize a `ma_context` object with `ma_context_init()`. -The first parameter is a pointer to a list of `ma_backend` values which are used to override the -default backend priorities. When this is NULL, as in this example, miniaudio's default priorities -are used. The second parameter is the number of backends listed in the array pointed to by the -first parameter. The third parameter is a pointer to a `ma_context_config` object which can be -NULL, in which case defaults are used. The context configuration is used for setting the logging -callback, custom memory allocation callbacks, user-defined data and some backend-specific -configurations. - -Once the context has been initialized you can enumerate devices. In the example above we use the -simpler `ma_context_get_devices()`, however you can also use a callback for handling devices by -using `ma_context_enumerate_devices()`. When using `ma_context_get_devices()` you provide a pointer -to a pointer that will, upon output, be set to a pointer to a buffer containing a list of -`ma_device_info` structures. You also provide a pointer to an unsigned integer that will receive -the number of items in the returned buffer. Do not free the returned buffers as their memory is -managed internally by miniaudio. - -The `ma_device_info` structure contains an `id` member which is the ID you pass to the device -config. It also contains the name of the device which is useful for presenting a list of devices -to the user via the UI. - -When creating your own context you will want to pass it to `ma_device_init()` when initializing the -device. Passing in NULL, like we do in the first example, will result in miniaudio creating the -context for you, which you don't want to do since you've already created a context. Note that -internally the context is only tracked by it's pointer which means you must not change the location -of the `ma_context` object. If this is an issue, consider using `malloc()` to allocate memory for -the context. - - -1.2. High Level API -------------------- -The high level API consists of three main parts: - - * Resource management for loading and streaming sounds. - * A node graph for advanced mixing and effect processing. - * A high level "engine" that wraps around the resource manager and node graph. - -The resource manager (`ma_resource_manager`) is used for loading sounds. It supports loading sounds -fully into memory and also streaming. It will also deal with reference counting for you which -avoids the same sound being loaded multiple times. - -The node graph is used for mixing and effect processing. The idea is that you connect a number of -nodes into the graph by connecting each node's outputs to another node's inputs. Each node can -implement it's own effect. By chaining nodes together, advanced mixing and effect processing can -be achieved. - -The engine encapsulates both the resource manager and the node graph to create a simple, easy to -use high level API. The resource manager and node graph APIs are covered in more later sections of -this manual. - -The code below shows how you can initialize an engine using it's default configuration. - - ```c - ma_result result; - ma_engine engine; - - result = ma_engine_init(NULL, &engine); - if (result != MA_SUCCESS) { - return result; // Failed to initialize the engine. - } - ``` - -This creates an engine instance which will initialize a device internally which you can access with -`ma_engine_get_device()`. It will also initialize a resource manager for you which can be accessed -with `ma_engine_get_resource_manager()`. The engine itself is a node graph (`ma_node_graph`) which -means you can pass a pointer to the engine object into any of the `ma_node_graph` APIs (with a -cast). Alternatively, you can use `ma_engine_get_node_graph()` instead of a cast. - -Note that all objects in miniaudio, including the `ma_engine` object in the example above, are -transparent structures. There are no handles to opaque structures in miniaudio which means you need -to be mindful of how you declare them. In the example above we are declaring it on the stack, but -this will result in the struct being invalidated once the function encapsulating it returns. If -allocating the engine on the heap is more appropriate, you can easily do so with a standard call -to `malloc()` or whatever heap allocation routine you like: - - ```c - ma_engine* pEngine = malloc(sizeof(*pEngine)); - ``` - -The `ma_engine` API uses the same config/init pattern used all throughout miniaudio. To configure -an engine, you can fill out a `ma_engine_config` object and pass it into the first parameter of -`ma_engine_init()`: - - ```c - ma_result result; - ma_engine engine; - ma_engine_config engineConfig; - - engineConfig = ma_engine_config_init(); - engineConfig.pResourceManager = &myCustomResourceManager; // <-- Initialized as some earlier stage. - - result = ma_engine_init(&engineConfig, &engine); - if (result != MA_SUCCESS) { - return result; - } - ``` - -This creates an engine instance using a custom config. In this particular example it's showing how -you can specify a custom resource manager rather than having the engine initialize one internally. -This is particularly useful if you want to have multiple engine's share the same resource manager. - -The engine must be uninitialized with `ma_engine_uninit()` when it's no longer needed. - -By default the engine will be started, but nothing will be playing because no sounds have been -initialized. The easiest but least flexible way of playing a sound is like so: - - ```c - ma_engine_play_sound(&engine, "my_sound.wav", NULL); - ``` - -This plays what miniaudio calls an "inline" sound. It plays the sound once, and then puts the -internal sound up for recycling. The last parameter is used to specify which sound group the sound -should be associated with which will be explained later. This particular way of playing a sound is -simple, but lacks flexibility and features. A more flexible way of playing a sound is to first -initialize a sound: - - ```c - ma_result result; - ma_sound sound; - - result = ma_sound_init_from_file(&engine, "my_sound.wav", 0, NULL, NULL, &sound); - if (result != MA_SUCCESS) { - return result; - } - - ma_sound_start(&sound); - ``` - -This returns a `ma_sound` object which represents a single instance of the specified sound file. If -you want to play the same file multiple times simultaneously, you need to create one sound for each -instance. - -Sounds should be uninitialized with `ma_sound_uninit()`. - -Sounds are not started by default. Start a sound with `ma_sound_start()` and stop it with -`ma_sound_stop()`. When a sound is stopped, it is not rewound to the start. Use -`ma_sound_seek_to_pcm_frames(&sound, 0)` to seek back to the start of a sound. By default, starting -and stopping sounds happens immediately, but sometimes it might be convenient to schedule the sound -the be started and/or stopped at a specific time. This can be done with the following functions: - - ```c - ma_sound_set_start_time_in_pcm_frames() - ma_sound_set_start_time_in_milliseconds() - ma_sound_set_stop_time_in_pcm_frames() - ma_sound_set_stop_time_in_milliseconds() - ``` - -The start/stop time needs to be specified based on the absolute timer which is controlled by the -engine. The current global time time in PCM frames can be retrieved with `ma_engine_get_time()`. -The engine's global time can be changed with `ma_engine_set_time()` for synchronization purposes if -required. Note that scheduling a start time still requires an explicit call to `ma_sound_start()` -before anything will play: - - ```c - ma_sound_set_start_time_in_pcm_frames(&sound, ma_engine_get_time(&engine) + (ma_engine_get_sample_rate(&engine) * 2); - ma_sound_start(&sound); - ``` - -The third parameter of `ma_sound_init_from_file()` is a set of flags that control how the sound be -loaded and a few options on which features should be enabled for that sound. By default, the sound -is synchronously loaded fully into memory straight from the file system without any kind of -decoding. If you want to decode the sound before storing it in memory, you need to specify the -`MA_SOUND_FLAG_DECODE` flag. This is useful if you want to incur the cost of decoding at an earlier -stage, such as a loading stage. Without this option, decoding will happen dynamically at mixing -time which might be too expensive on the audio thread. - -If you want to load the sound asynchronously, you can specify the `MA_SOUND_FLAG_ASYNC` flag. This -will result in `ma_sound_init_from_file()` returning quickly, but the sound will not start playing -until the sound has had some audio decoded. - -The fourth parameter is a pointer to sound group. A sound group is used as a mechanism to organise -sounds into groups which have their own effect processing and volume control. An example is a game -which might have separate groups for sfx, voice and music. Each of these groups have their own -independent volume control. Use `ma_sound_group_init()` or `ma_sound_group_init_ex()` to initialize -a sound group. - -Sounds and sound groups are nodes in the engine's node graph and can be plugged into any `ma_node` -API. This makes it possible to connect sounds and sound groups to effect nodes to produce complex -effect chains. - -A sound can have it's volume changed with `ma_sound_set_volume()`. If you prefer decibel volume -control you can use `ma_volume_db_to_linear()` to convert from decibel representation to linear. - -Panning and pitching is supported with `ma_sound_set_pan()` and `ma_sound_set_pitch()`. If you know -a sound will never have it's pitch changed with `ma_sound_set_pitch()` or via the doppler effect, -you can specify the `MA_SOUND_FLAG_NO_PITCH` flag when initializing the sound for an optimization. - -By default, sounds and sound groups have spatialization enabled. If you don't ever want to -spatialize your sounds, initialize the sound with the `MA_SOUND_FLAG_NO_SPATIALIZATION` flag. The -spatialization model is fairly simple and is roughly on feature parity with OpenAL. HRTF and -environmental occlusion are not currently supported, but planned for the future. The supported -features include: - - * Sound and listener positioning and orientation with cones - * Attenuation models: none, inverse, linear and exponential - * Doppler effect - -Sounds can be faded in and out with `ma_sound_set_fade_in_pcm_frames()`. - -To check if a sound is currently playing, you can use `ma_sound_is_playing()`. To check if a sound -is at the end, use `ma_sound_at_end()`. Looping of a sound can be controlled with -`ma_sound_set_looping()`. Use `ma_sound_is_looping()` to check whether or not the sound is looping. - - - -2. Building -=========== -miniaudio should work cleanly out of the box without the need to download or install any -dependencies. See below for platform-specific details. - - -2.1. Windows ------------- -The Windows build should compile cleanly on all popular compilers without the need to configure any -include paths nor link to any libraries. - -The UWP build may require linking to mmdevapi.lib if you get errors about an unresolved external -symbol for `ActivateAudioInterfaceAsync()`. - - -2.2. macOS and iOS ------------------- -The macOS build should compile cleanly without the need to download any dependencies nor link to -any libraries or frameworks. The iOS build needs to be compiled as Objective-C and will need to -link the relevant frameworks but should compile cleanly out of the box with Xcode. Compiling -through the command line requires linking to `-lpthread` and `-lm`. - -Due to the way miniaudio links to frameworks at runtime, your application may not pass Apple's -notarization process. To fix this there are two options. The first is to use the -`MA_NO_RUNTIME_LINKING` option, like so: - - ```c - #ifdef __APPLE__ - #define MA_NO_RUNTIME_LINKING - #endif - #define MINIAUDIO_IMPLEMENTATION - #include "miniaudio.h" - ``` - -This will require linking with `-framework CoreFoundation -framework CoreAudio -framework AudioUnit`. -Alternatively, if you would rather keep using runtime linking you can add the following to your -entitlements.xcent file: - - ``` - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.cs.allow-unsigned-executable-memory - - ``` - -See this discussion for more info: https://github.com/mackron/miniaudio/issues/203. - - -2.3. Linux ----------- -The Linux build only requires linking to `-ldl`, `-lpthread` and `-lm`. You do not need any -development packages. You may need to link with `-latomic` if you're compiling for 32-bit ARM. - - -2.4. BSD --------- -The BSD build only requires linking to `-lpthread` and `-lm`. NetBSD uses audio(4), OpenBSD uses -sndio and FreeBSD uses OSS. You may need to link with `-latomic` if you're compiling for 32-bit -ARM. - - -2.5. Android ------------- -AAudio is the highest priority backend on Android. This should work out of the box without needing -any kind of compiler configuration. Support for AAudio starts with Android 8 which means older -versions will fall back to OpenSL|ES which requires API level 16+. - -There have been reports that the OpenSL|ES backend fails to initialize on some Android based -devices due to `dlopen()` failing to open "libOpenSLES.so". If this happens on your platform -you'll need to disable run-time linking with `MA_NO_RUNTIME_LINKING` and link with -lOpenSLES. - - -2.6. Emscripten ---------------- -The Emscripten build emits Web Audio JavaScript directly and should compile cleanly out of the box. -You cannot use `-std=c*` compiler flags, nor `-ansi`. - - -2.7. Build Options ------------------- -`#define` these options before including miniaudio.h. - - +----------------------------------+--------------------------------------------------------------------+ - | Option | Description | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_WASAPI | Disables the WASAPI backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_DSOUND | Disables the DirectSound backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_WINMM | Disables the WinMM backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_ALSA | Disables the ALSA backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_PULSEAUDIO | Disables the PulseAudio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_JACK | Disables the JACK backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_COREAUDIO | Disables the Core Audio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_SNDIO | Disables the sndio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_AUDIO4 | Disables the audio(4) backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_OSS | Disables the OSS backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_AAUDIO | Disables the AAudio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_OPENSL | Disables the OpenSL|ES backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_WEBAUDIO | Disables the Web Audio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_NULL | Disables the null backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_ONLY_SPECIFIC_BACKENDS | Disables all backends by default and requires `MA_ENABLE_*` to | - | | enable specific backends. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_WASAPI | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the WASAPI backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_DSOUND | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the DirectSound backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_WINMM | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the WinMM backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_ALSA | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the ALSA backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_PULSEAUDIO | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the PulseAudio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_JACK | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the JACK backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_COREAUDIO | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the Core Audio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_SNDIO | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the sndio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_AUDIO4 | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the audio(4) backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_OSS | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the OSS backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_AAUDIO | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the AAudio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_OPENSL | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the OpenSL|ES backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_WEBAUDIO | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the Web Audio backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_ENABLE_NULL | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to | - | | enable the null backend. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_DECODING | Disables decoding APIs. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_ENCODING | Disables encoding APIs. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_WAV | Disables the built-in WAV decoder and encoder. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_FLAC | Disables the built-in FLAC decoder. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_MP3 | Disables the built-in MP3 decoder. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_DEVICE_IO | Disables playback and recording. This will disable `ma_context` | - | | and `ma_device` APIs. This is useful if you only want to use | - | | miniaudio's data conversion and/or decoding APIs. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_THREADING | Disables the `ma_thread`, `ma_mutex`, `ma_semaphore` and | - | | `ma_event` APIs. This option is useful if you only need to use | - | | miniaudio for data conversion, decoding and/or encoding. Some | - | | families of APIsrequire threading which means the following | - | | options must also be set: | - | | | - | | ``` | - | | MA_NO_DEVICE_IO | - | | ``` | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_GENERATION | Disables generation APIs such a `ma_waveform` and `ma_noise`. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_SSE2 | Disables SSE2 optimizations. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_AVX2 | Disables AVX2 optimizations. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_NEON | Disables NEON optimizations. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_NO_RUNTIME_LINKING | Disables runtime linking. This is useful for passing Apple's | - | | notarization process. When enabling this, you may need to avoid | - | | using `-std=c89` or `-std=c99` on Linux builds or else you may end | - | | up with compilation errors due to conflicts with `timespec` and | - | | `timeval` data types. | - | | | - | | You may need to enable this if your target platform does not allow | - | | runtime linking via `dlopen()`. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_DEBUG_OUTPUT | Enable `printf()` output of debug logs (`MA_LOG_LEVEL_DEBUG`). | - +----------------------------------+--------------------------------------------------------------------+ - | MA_COINIT_VALUE | Windows only. The value to pass to internal calls to | - | | `CoInitializeEx()`. Defaults to `COINIT_MULTITHREADED`. | - +----------------------------------+--------------------------------------------------------------------+ - | MA_API | Controls how public APIs should be decorated. Default is `extern`. | - +----------------------------------+--------------------------------------------------------------------+ - - -3. Definitions -============== -This section defines common terms used throughout miniaudio. Unfortunately there is often ambiguity -in the use of terms throughout the audio space, so this section is intended to clarify how miniaudio -uses each term. - -3.1. Sample ------------ -A sample is a single unit of audio data. If the sample format is f32, then one sample is one 32-bit -floating point number. - -3.2. Frame / PCM Frame ----------------------- -A frame is a group of samples equal to the number of channels. For a stereo stream a frame is 2 -samples, a mono frame is 1 sample, a 5.1 surround sound frame is 6 samples, etc. The terms "frame" -and "PCM frame" are the same thing in miniaudio. Note that this is different to a compressed frame. -If ever miniaudio needs to refer to a compressed frame, such as a FLAC frame, it will always -clarify what it's referring to with something like "FLAC frame". - -3.3. Channel ------------- -A stream of monaural audio that is emitted from an individual speaker in a speaker system, or -received from an individual microphone in a microphone system. A stereo stream has two channels (a -left channel, and a right channel), a 5.1 surround sound system has 6 channels, etc. Some audio -systems refer to a channel as a complex audio stream that's mixed with other channels to produce -the final mix - this is completely different to miniaudio's use of the term "channel" and should -not be confused. - -3.4. Sample Rate ----------------- -The sample rate in miniaudio is always expressed in Hz, such as 44100, 48000, etc. It's the number -of PCM frames that are processed per second. - -3.5. Formats ------------- -Throughout miniaudio you will see references to different sample formats: - - +---------------+----------------------------------------+---------------------------+ - | Symbol | Description | Range | - +---------------+----------------------------------------+---------------------------+ - | ma_format_f32 | 32-bit floating point | [-1, 1] | - | ma_format_s16 | 16-bit signed integer | [-32768, 32767] | - | ma_format_s24 | 24-bit signed integer (tightly packed) | [-8388608, 8388607] | - | ma_format_s32 | 32-bit signed integer | [-2147483648, 2147483647] | - | ma_format_u8 | 8-bit unsigned integer | [0, 255] | - +---------------+----------------------------------------+---------------------------+ - -All formats are native-endian. - - - -4. Data Sources -=============== -The data source abstraction in miniaudio is used for retrieving audio data from some source. A few -examples include `ma_decoder`, `ma_noise` and `ma_waveform`. You will need to be familiar with data -sources in order to make sense of some of the higher level concepts in miniaudio. - -The `ma_data_source` API is a generic interface for reading from a data source. Any object that -implements the data source interface can be plugged into any `ma_data_source` function. - -To read data from a data source: - - ```c - ma_result result; - ma_uint64 framesRead; - - result = ma_data_source_read_pcm_frames(pDataSource, pFramesOut, frameCount, &framesRead, loop); - if (result != MA_SUCCESS) { - return result; // Failed to read data from the data source. - } - ``` - -If you don't need the number of frames that were successfully read you can pass in `NULL` to the -`pFramesRead` parameter. If this returns a value less than the number of frames requested it means -the end of the file has been reached. `MA_AT_END` will be returned only when the number of frames -read is 0. - -When calling any data source function, with the exception of `ma_data_source_init()` and -`ma_data_source_uninit()`, you can pass in any object that implements a data source. For example, -you could plug in a decoder like so: - - ```c - ma_result result; - ma_uint64 framesRead; - ma_decoder decoder; // <-- This would be initialized with `ma_decoder_init_*()`. - - result = ma_data_source_read_pcm_frames(&decoder, pFramesOut, frameCount, &framesRead, loop); - if (result != MA_SUCCESS) { - return result; // Failed to read data from the decoder. - } - ``` - -If you want to seek forward you can pass in `NULL` to the `pFramesOut` parameter. Alternatively you -can use `ma_data_source_seek_pcm_frames()`. - -To seek to a specific PCM frame: - - ```c - result = ma_data_source_seek_to_pcm_frame(pDataSource, frameIndex); - if (result != MA_SUCCESS) { - return result; // Failed to seek to PCM frame. - } - ``` - -You can retrieve the total length of a data source in PCM frames, but note that some data sources -may not have the notion of a length, such as noise and waveforms, and others may just not have a -way of determining the length such as some decoders. To retrieve the length: - - ```c - ma_uint64 length; - - result = ma_data_source_get_length_in_pcm_frames(pDataSource, &length); - if (result != MA_SUCCESS) { - return result; // Failed to retrieve the length. - } - ``` - -Care should be taken when retrieving the length of a data source where the underlying decoder is -pulling data from a data stream with an undefined length, such as internet radio or some kind of -broadcast. If you do this, `ma_data_source_get_length_in_pcm_frames()` may never return. - -The current position of the cursor in PCM frames can also be retrieved: - - ```c - ma_uint64 cursor; - - result = ma_data_source_get_cursor_in_pcm_frames(pDataSource, &cursor); - if (result != MA_SUCCESS) { - return result; // Failed to retrieve the cursor. - } - ``` - -You will often need to know the data format that will be returned after reading. This can be -retrieved like so: - - ```c - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_channel channelMap[MA_MAX_CHANNELS]; - - result = ma_data_source_get_data_format(pDataSource, &format, &channels, &sampleRate, channelMap, MA_MAX_CHANNELS); - if (result != MA_SUCCESS) { - return result; // Failed to retrieve data format. - } - ``` - -If you do not need a specific data format property, just pass in NULL to the respective parameter. - -There may be cases where you want to implement something like a sound bank where you only want to -read data within a certain range of the underlying data. To do this you can use a range: - - ```c - result = ma_data_source_set_range_in_pcm_frames(pDataSource, rangeBegInFrames, rangeEndInFrames); - if (result != MA_SUCCESS) { - return result; // Failed to set the range. - } - ``` - -This is useful if you have a sound bank where many sounds are stored in the same file and you want -the data source to only play one of those sub-sounds. - -Custom loop points can also be used with data sources. By default, data sources will loop after -they reach the end of the data source, but if you need to loop at a specific location, you can do -the following: - - ```c - result = ma_data_set_loop_point_in_pcm_frames(pDataSource, loopBegInFrames, loopEndInFrames); - if (result != MA_SUCCESS) { - return result; // Failed to set the loop point. - } - ``` - -The loop point is relative to the current range. - -It's sometimes useful to chain data sources together so that a seamless transition can be achieved. -To do this, you can use chaining: - - ```c - ma_decoder decoder1; - ma_decoder decoder2; - - // ... initialize decoders with ma_decoder_init_*() ... - - result = ma_data_source_set_next(&decoder1, &decoder2); - if (result != MA_SUCCESS) { - return result; // Failed to set the next data source. - } - - result = ma_data_source_read_pcm_frames(&decoder1, pFramesOut, frameCount, pFramesRead, MA_FALSE); - if (result != MA_SUCCESS) { - return result; // Failed to read from the decoder. - } - ``` - -In the example above we're using decoders. When reading from a chain, you always want to read from -the top level data source in the chain. In the example above, `decoder1` is the top level data -source in the chain. When `decoder1` reaches the end, `decoder2` will start seamlessly without any -gaps. - -Note that the `loop` parameter is set to false in the example above. When this is set to true, only -the current data source will be looped. You can loop the entire chain by linking in a loop like so: - - ```c - ma_data_source_set_next(&decoder1, &decoder2); // decoder1 -> decoder2 - ma_data_source_set_next(&decoder2, &decoder1); // decoder2 -> decoder1 (loop back to the start). - ``` - -Note that setting up chaining is not thread safe, so care needs to be taken if you're dynamically -changing links while the audio thread is in the middle of reading. - -Do not use `ma_decoder_seek_to_pcm_frame()` as a means to reuse a data source to play multiple -instances of the same sound simultaneously. Instead, initialize multiple data sources for each -instance. This can be extremely inefficient depending on the data source and can result in -glitching due to subtle changes to the state of internal filters. - - -4.1. Custom Data Sources ------------------------- -You can implement a custom data source by implementing the functions in `ma_data_source_vtable`. -Your custom object must have `ma_data_source_base` as it's first member: - - ```c - struct my_data_source - { - ma_data_source_base base; - ... - }; - ``` - -In your initialization routine, you need to call `ma_data_source_init()` in order to set up the -base object (`ma_data_source_base`): - - ```c - static ma_result my_data_source_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) - { - // Read data here. Output in the same format returned by my_data_source_get_data_format(). - } - - static ma_result my_data_source_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) - { - // Seek to a specific PCM frame here. Return MA_NOT_IMPLEMENTED if seeking is not supported. - } - - static ma_result my_data_source_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) - { - // Return the format of the data here. - } - - static ma_result my_data_source_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) - { - // Retrieve the current position of the cursor here. Return MA_NOT_IMPLEMENTED and set *pCursor to 0 if there is no notion of a cursor. - } - - static ma_result my_data_source_get_length(ma_data_source* pDataSource, ma_uint64* pLength) - { - // Retrieve the length in PCM frames here. Return MA_NOT_IMPLEMENTED and set *pLength to 0 if there is no notion of a length or if the length is unknown. - } - - static g_my_data_source_vtable = - { - my_data_source_read, - my_data_source_seek, - my_data_source_get_data_format, - my_data_source_get_cursor, - my_data_source_get_length - }; - - ma_result my_data_source_init(my_data_source* pMyDataSource) - { - ma_result result; - ma_data_source_config baseConfig; - - baseConfig = ma_data_source_config_init(); - baseConfig.vtable = &g_my_data_source_vtable; - - result = ma_data_source_init(&baseConfig, &pMyDataSource->base); - if (result != MA_SUCCESS) { - return result; - } - - // ... do the initialization of your custom data source here ... - - return MA_SUCCESS; - } - - void my_data_source_uninit(my_data_source* pMyDataSource) - { - // ... do the uninitialization of your custom data source here ... - - // You must uninitialize the base data source. - ma_data_source_uninit(&pMyDataSource->base); - } - ``` - -Note that `ma_data_source_init()` and `ma_data_source_uninit()` are never called directly outside -of the custom data source. It's up to the custom data source itself to call these within their own -init/uninit functions. - - - -5. Engine -========= -The `ma_engine` API is a high level API for managing and mixing sounds and effect processing. The -`ma_engine` object encapsulates a resource manager and a node graph, both of which will be -explained in more detail later. - -Sounds are called `ma_sound` and are created from an engine. Sounds can be associated with a mixing -group called `ma_sound_group` which are also created from the engine. Both `ma_sound` and -`ma_sound_group` objects are nodes within the engine's node graph. - -When the engine is initialized, it will normally create a device internally. If you would rather -manage the device yourself, you can do so and just pass a pointer to it via the engine config when -you initialize the engine. You can also just use the engine without a device, which again can be -configured via the engine config. - -The most basic way to initialize the engine is with a default config, like so: - - ```c - ma_result result; - ma_engine engine; - - result = ma_engine_init(NULL, &engine); - if (result != MA_SUCCESS) { - return result; // Failed to initialize the engine. - } - ``` - -This will result in the engine initializing a playback device using the operating system's default -device. This will be sufficient for many use cases, but if you need more flexibility you'll want to -configure the engine with an engine config: - - ```c - ma_result result; - ma_engine engine; - ma_engine_config engineConfig; - - engineConfig = ma_engine_config_init(); - engineConfig.pPlaybackDevice = &myDevice; - - result = ma_engine_init(&engineConfig, &engine); - if (result != MA_SUCCESS) { - return result; // Failed to initialize the engine. - } - ``` - -In the example above we're passing in a pre-initialized device. Since the caller is the one in -control of the device's data callback, it's their responsibility to manually call -`ma_engine_read_pcm_frames()` from inside their data callback: - - ```c - void playback_data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) - { - ma_engine_read_pcm_frames(&g_Engine, pOutput, frameCount, NULL); - } - ``` - -You can also use the engine independent of a device entirely: - - ```c - ma_result result; - ma_engine engine; - ma_engine_config engineConfig; - - engineConfig = ma_engine_config_init(); - engineConfig.noDevice = MA_TRUE; - engineConfig.channels = 2; // Must be set when not using a device. - engineConfig.sampleRate = 48000; // Must be set when not using a device. - - result = ma_engine_init(&engineConfig, &engine); - if (result != MA_SUCCESS) { - return result; // Failed to initialize the engine. - } - ``` - -Note that when you're not using a device, you must set the channel count and sample rate in the -config or else miniaudio won't know what to use (miniaudio will use the device to determine this -normally). When not using a device, you need to use `ma_engine_read_pcm_frames()` to process audio -data from the engine. This kind of setup is useful if you want to do something like offline -processing. - -When a sound is loaded it goes through a resource manager. By default the engine will initialize a -resource manager internally, but you can also specify a pre-initialized resource manager: - - ```c - ma_result result; - ma_engine engine1; - ma_engine engine2; - ma_engine_config engineConfig; - - engineConfig = ma_engine_config_init(); - engineConfig.pResourceManager = &myResourceManager; - - ma_engine_init(&engineConfig, &engine1); - ma_engine_init(&engineConfig, &engine2); - ``` - -In this example we are initializing two engines, both of which are sharing the same resource -manager. This is especially useful for saving memory when loading the same file across multiple -engines. If you were not to use a shared resource manager, each engine instance would use their own -which would result in any sounds that are used between both engine's being loaded twice. By using -a shared resource manager, it would only be loaded once. Using multiple engine's is useful when you -need to output to multiple playback devices, such as in a local multiplayer game where each player -is using their own set of headphones. - -By default an engine will be in a started state. To make it so the engine is not automatically -started you can configure it as such: - - ```c - engineConfig.noAutoStart = MA_TRUE; - - // The engine will need to be started manually. - ma_engine_start(&engine); - - // Later on the engine can be stopped with ma_engine_stop(). - ma_engine_stop(&engine); - ``` - -The concept of starting or stopping an engine is only relevant when using the engine with a -device. Attempting to start or stop an engine that is not associated with a device will result in -`MA_INVALID_OPERATION`. - -The master volume of the engine can be controlled with `ma_engine_set_volume()` which takes a -linear scale, with 0 resulting in silence and anything above 1 resulting in amplification. If you -prefer decibel based volume control, use `ma_volume_db_to_linear()` to convert from dB to linear. - -When a sound is spatialized, it is done so relative to a listener. An engine can be configured to -have multiple listeners which can be configured via the config: - - ```c - engineConfig.listenerCount = 2; - ``` - -The maximum number of listeners is restricted to `MA_ENGINE_MAX_LISTENERS`. By default, when a -sound is spatialized, it will be done so relative to the closest listener. You can also pin a sound -to a specific listener which will be explained later. Listener's have a position, direction, cone, -and velocity (for doppler effect). A listener is referenced by an index, the meaning of which is up -to the caller (the index is 0 based and cannot go beyond the listener count, minus 1). The -position, direction and velocity are all specified in absolute terms: - - ```c - ma_engine_listener_set_position(&engine, listenerIndex, worldPosX, worldPosY, worldPosZ); - ``` - -The direction of the listener represents it's forward vector. The listener's up vector can also be -specified and defaults to +1 on the Y axis. - - ```c - ma_engine_listener_set_direction(&engine, listenerIndex, forwardX, forwardY, forwardZ); - ma_engine_listener_set_world_up(&engine, listenerIndex, 0, 1, 0); - ``` - -The engine supports directional attenuation. The listener can have a cone the controls how sound is -attenuated based on the listener's direction. When a sound is between the inner and outer cones, it -will be attenuated between 1 and the cone's outer gain: - - ```c - ma_engine_listener_set_cone(&engine, listenerIndex, innerAngleInRadians, outerAngleInRadians, outerGain); - ``` - -When a sound is inside the inner code, no directional attenuation is applied. When the sound is -outside of the outer cone, the attenuation will be set to `outerGain` in the example above. When -the sound is in between the inner and outer cones, the attenuation will be interpolated between 1 -and the outer gain. - -The engine's coordinate system follows the OpenGL coordinate system where positive X points right, -positive Y points up and negative Z points forward. - -The simplest and least flexible way to play a sound is like so: - - ```c - ma_engine_play_sound(&engine, "my_sound.wav", pGroup); - ``` - -This is a "fire and forget" style of function. The engine will manage the `ma_sound` object -internally. When the sound finishes playing, it'll be put up for recycling. For more flexibility -you'll want to initialize a sound object: - - ```c - ma_sound sound; - - result = ma_sound_init_from_file(&engine, "my_sound.wav", flags, pGroup, NULL, &sound); - if (result != MA_SUCCESS) { - return result; // Failed to load sound. - } - ``` - -Sounds need to be uninitialized with `ma_sound_uninit()`. - -The example above loads a sound from a file. If the resource manager has been disabled you will not -be able to use this function and instead you'll need to initialize a sound directly from a data -source: - - ```c - ma_sound sound; - - result = ma_sound_init_from_data_source(&engine, &dataSource, flags, pGroup, &sound); - if (result != MA_SUCCESS) { - return result; - } - ``` - -Each `ma_sound` object represents a single instance of the sound. If you want to play the same -sound multiple times at the same time, you need to initialize a separate `ma_sound` object. - -For the most flexibility when initializing sounds, use `ma_sound_init_ex()`. This uses miniaudio's -standard config/init pattern: - - ```c - ma_sound sound; - ma_sound_config soundConfig; - - soundConfig = ma_sound_config_init(); - soundConfig.pFilePath = NULL; // Set this to load from a file path. - soundConfig.pDataSource = NULL; // Set this to initialize from an existing data source. - soundConfig.pInitialAttachment = &someNodeInTheNodeGraph; - soundConfig.initialAttachmentInputBusIndex = 0; - soundConfig.channelsIn = 1; - soundConfig.channelsOut = 0; // Set to 0 to use the engine's native channel count. - - result = ma_sound_init_ex(&soundConfig, &sound); - if (result != MA_SUCCESS) { - return result; - } - ``` - -In the example above, the sound is being initialized without a file nor a data source. This is -valid, in which case the sound acts as a node in the middle of the node graph. This means you can -connect other sounds to this sound and allow it to act like a sound group. Indeed, this is exactly -what a `ma_sound_group` is. - -When loading a sound, you specify a set of flags that control how the sound is loaded and what -features are enabled for that sound. When no flags are set, the sound will be fully loaded into -memory in exactly the same format as how it's stored on the file system. The resource manager will -allocate a block of memory and then load the file directly into it. When reading audio data, it -will be decoded dynamically on the fly. In order to save processing time on the audio thread, it -might be beneficial to pre-decode the sound. You can do this with the `MA_SOUND_FLAG_DECODE` flag: - - ```c - ma_sound_init_from_file(&engine, "my_sound.wav", MA_SOUND_FLAG_DECODE, pGroup, NULL, &sound); - ``` - -By default, sounds will be loaded synchronously, meaning `ma_sound_init_*()` will not return until -the sound has been fully loaded. If this is prohibitive you can instead load sounds asynchronously -by specificying the `MA_SOUND_FLAG_ASYNC` flag: - - ```c - ma_sound_init_from_file(&engine, "my_sound.wav", MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_ASYNC, pGroup, NULL, &sound); - ``` - -This will result in `ma_sound_init_*()` returning quickly, but the sound won't yet have been fully -loaded. When you start the sound, it won't output anything until some sound is available. The sound -will start outputting audio before the sound has been fully decoded when the `MA_SOUND_FLAG_DECODE` -is specified. - -If you need to wait for an asynchronously loaded sound to be fully loaded, you can use a fence. A -fence in miniaudio is a simple synchronization mechanism which simply blocks until it's internal -counter hit's zero. You can specify a fence like so: - - ```c - ma_result result; - ma_fence fence; - ma_sound sounds[4]; - - result = ma_fence_init(&fence); - if (result != MA_SUCCES) { - return result; - } - - // Load some sounds asynchronously. - for (int iSound = 0; iSound < 4; iSound += 1) { - ma_sound_init_from_file(&engine, mySoundFilesPaths[iSound], MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_ASYNC, pGroup, &fence, &sounds[iSound]); - } - - // ... do some other stuff here in the mean time ... - - // Wait for all sounds to finish loading. - ma_fence_wait(&fence); - ``` - -If loading the entire sound into memory is prohibitive, you can also configure the engine to stream -the audio data: - - ```c - ma_sound_init_from_file(&engine, "my_sound.wav", MA_SOUND_FLAG_STREAM, pGroup, NULL, &sound); - ``` - -When streaming sounds, 2 seconds worth of audio data is stored in memory. Although it should work -fine, it's inefficient to use streaming for short sounds. Streaming is useful for things like music -tracks in games. - -When you initialize a sound, if you specify a sound group the sound will be attached to that group -automatically. If you set it to NULL, it will be automatically attached to the engine's endpoint. -If you would instead rather leave the sound unattached by default, you can can specify the -`MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT` flag. This is useful if you want to set up a complex node -graph. - -Sounds are not started by default. To start a sound, use `ma_sound_start()`. Stop a sound with -`ma_sound_stop()`. - -Sounds can have their volume controlled with `ma_sound_set_volume()` in the same way as the -engine's master volume. - -Sounds support stereo panning and pitching. Set the pan with `ma_sound_set_pan()`. Setting the pan -to 0 will result in an unpanned sound. Setting it to -1 will shift everything to the left, whereas -+1 will shift it to the right. The pitch can be controlled with `ma_sound_set_pitch()`. A larger -value will result in a higher pitch. The pitch must be greater than 0. - -The engine supports 3D spatialization of sounds. By default sounds will have spatialization -enabled, but if a sound does not need to be spatialized it's best to disable it. There are two ways -to disable spatialization of a sound: - - ```c - // Disable spatialization at initialization time via a flag: - ma_sound_init_from_file(&engine, "my_sound.wav", MA_SOUND_FLAG_NO_SPATIALIZATION, NULL, NULL, &sound); - - // Dynamically disable or enable spatialization post-initialization: - ma_sound_set_spatialization_enabled(&sound, isSpatializationEnabled); - ``` - -By default sounds will be spatialized based on the closest listener. If a sound should always be -spatialized relative to a specific listener it can be pinned to one: - - ```c - ma_sound_set_pinned_listener_index(&sound, listenerIndex); - ``` - -Like listeners, sounds have a position. By default, the position of a sound is in absolute space, -but it can be changed to be relative to a listener: - - ```c - ma_sound_set_positioning(&sound, ma_positioning_relative); - ``` - -Note that relative positioning of a sound only makes sense if there is either only one listener, or -the sound is pinned to a specific listener. To set the position of a sound: - - ```c - ma_sound_set_position(&sound, posX, posY, posZ); - ``` - -The direction works the same way as a listener and represents the sound's forward direction: - - ```c - ma_sound_set_direction(&sound, forwardX, forwardY, forwardZ); - ``` - -Sound's also have a cone for controlling directional attenuation. This works exactly the same as -listeners: - - ```c - ma_sound_set_cone(&sound, innerAngleInRadians, outerAngleInRadians, outerGain); - ``` - -The velocity of a sound is used for doppler effect and can be set as such: - - ```c - ma_sound_set_velocity(&sound, velocityX, velocityY, velocityZ); - ``` - -The engine supports different attenuation models which can be configured on a per-sound basis. By -default the attenuation model is set to `ma_attenuation_model_inverse` which is the equivalent to -OpenAL's `AL_INVERSE_DISTANCE_CLAMPED`. Configure the attenuation model like so: - - ```c - ma_sound_set_attenuation_model(&sound, ma_attenuation_model_inverse); - ``` - -The supported attenuation models include the following: - - +----------------------------------+----------------------------------------------+ - | ma_attenuation_model_none | No distance attenuation. | - +----------------------------------+----------------------------------------------+ - | ma_attenuation_model_inverse | Equivalent to `AL_INVERSE_DISTANCE_CLAMPED`. | - +----------------------------------+----------------------------------------------+ - | ma_attenuation_model_linear | Linear attenuation. | - +----------------------------------+----------------------------------------------+ - | ma_attenuation_model_exponential | Exponential attenuation. | - +----------------------------------+----------------------------------------------+ - -To control how quickly a sound rolls off as it moves away from the listener, you need to configure -the rolloff: - - ```c - ma_sound_set_rolloff(&sound, rolloff); - ``` - -You can control the minimum and maximum gain to apply from spatialization: - - ```c - ma_sound_set_min_gain(&sound, minGain); - ma_sound_set_max_gain(&sound, maxGain); - ``` - -Likewise, in the calculation of attenuation, you can control the minimum and maximum distances for -the attenuation calculation. This is useful if you want to ensure sounds don't drop below a certain -volume after the listener moves further away and to have sounds play a maximum volume when the -listener is within a certain distance: - - ```c - ma_sound_set_min_distance(&sound, minDistance); - ma_sound_set_max_distance(&sound, maxDistance); - ``` - -The engine's spatialization system supports doppler effect. The doppler factor can be configure on -a per-sound basis like so: - - ```c - ma_sound_set_doppler_factor(&sound, dopplerFactor); - ``` - -You can fade sounds in and out with `ma_sound_set_fade_in_pcm_frames()` and -`ma_sound_set_fade_in_milliseconds()`. Set the volume to -1 to use the current volume as the -starting volume: - - ```c - // Fade in over 1 second. - ma_sound_set_fade_in_milliseconds(&sound, 0, 1, 1000); - - // ... sometime later ... - - // Fade out over 1 second, starting from the current volume. - ma_sound_set_fade_in_milliseconds(&sound, -1, 0, 1000); - ``` - -By default sounds will start immediately, but sometimes for timing and synchronization purposes it -can be useful to schedule a sound to start or stop: - - ```c - // Start the sound in 1 second from now. - ma_sound_set_start_time_in_pcm_frames(&sound, ma_engine_get_time(&engine) + (ma_engine_get_sample_rate(&engine) * 1)); - - // Stop the sound in 2 seconds from now. - ma_sound_set_stop_time_in_pcm_frames(&sound, ma_engine_get_time(&engine) + (ma_engine_get_sample_rate(&engine) * 2)); - ``` - -Note that scheduling a start time still requires an explicit call to `ma_sound_start()` before -anything will play. - -The time is specified in global time which is controlled by the engine. You can get the engine's -current time with `ma_engine_get_time()`. The engine's global time is incremented automatically as -audio data is read, but it can be reset with `ma_engine_set_time()` in case it needs to be -resynchronized for some reason. - -To determine whether or not a sound is currently playing, use `ma_sound_is_playing()`. This will -take the scheduled start and stop times into account. - -Whether or not a sound should loop can be controlled with `ma_sound_set_looping()`. Sounds will not -be looping by default. Use `ma_sound_is_looping()` to determine whether or not a sound is looping. - -Use `ma_sound_at_end()` to determine whether or not a sound is currently at the end. For a looping -sound this should never return true. - -Internally a sound wraps around a data source. Some APIs exist to control the underlying data -source, mainly for convenience: - - ```c - ma_sound_seek_to_pcm_frame(&sound, frameIndex); - ma_sound_get_data_format(&sound, &format, &channels, &sampleRate, pChannelMap, channelMapCapacity); - ma_sound_get_cursor_in_pcm_frames(&sound, &cursor); - ma_sound_get_length_in_pcm_frames(&sound, &length); - ``` - -Sound groups have the same API as sounds, only they are called `ma_sound_group`, and since they do -not have any notion of a data source, anything relating to a data source is unavailable. - -Internally, sound data is loaded via the `ma_decoder` API which means by default in only supports -file formats that have built-in support in miniaudio. You can extend this to support any kind of -file format through the use of custom decoders. To do this you'll need to use a self-managed -resource manager and configure it appropriately. See the "Resource Management" section below for -details on how to set this up. - - -6. Resource Management -====================== -Many programs will want to manage sound resources for things such as reference counting and -streaming. This is supported by miniaudio via the `ma_resource_manager` API. - -The resource manager is mainly responsible for the following: - - * Loading of sound files into memory with reference counting. - * Streaming of sound data - -When loading a sound file, the resource manager will give you back a `ma_data_source` compatible -object called `ma_resource_manager_data_source`. This object can be passed into any -`ma_data_source` API which is how you can read and seek audio data. When loading a sound file, you -specify whether or not you want the sound to be fully loaded into memory (and optionally -pre-decoded) or streamed. When loading into memory, you can also specify whether or not you want -the data to be loaded asynchronously. - -The example below is how you can initialize a resource manager using it's default configuration: - - ```c - ma_resource_manager_config config; - ma_resource_manager resourceManager; - - config = ma_resource_manager_config_init(); - result = ma_resource_manager_init(&config, &resourceManager); - if (result != MA_SUCCESS) { - ma_device_uninit(&device); - printf("Failed to initialize the resource manager."); - return -1; - } - ``` - -You can configure the format, channels and sample rate of the decoded audio data. By default it -will use the file's native data format, but you can configure it to use a consistent format. This -is useful for offloading the cost of data conversion to load time rather than dynamically -converting at mixing time. To do this, you configure the decoded format, channels and sample rate -like the code below: - - ```c - config = ma_resource_manager_config_init(); - config.decodedFormat = device.playback.format; - config.decodedChannels = device.playback.channels; - config.decodedSampleRate = device.sampleRate; - ``` - -In the code above, the resource manager will be configured so that any decoded audio data will be -pre-converted at load time to the device's native data format. If instead you used defaults and -the data format of the file did not match the device's data format, you would need to convert the -data at mixing time which may be prohibitive in high-performance and large scale scenarios like -games. - -Internally the resource manager uses the `ma_decoder` API to load sounds. This means by default it -only supports decoders that are built into miniaudio. It's possible to support additional encoding -formats through the use of custom decoders. To do so, pass in your `ma_decoding_backend_vtable` -vtables into the resource manager config: - - ```c - ma_decoding_backend_vtable* pCustomBackendVTables[] = - { - &g_ma_decoding_backend_vtable_libvorbis, - &g_ma_decoding_backend_vtable_libopus - }; - - ... - - resourceManagerConfig.ppCustomDecodingBackendVTables = pCustomBackendVTables; - resourceManagerConfig.customDecodingBackendCount = sizeof(pCustomBackendVTables) / sizeof(pCustomBackendVTables[0]); - resourceManagerConfig.pCustomDecodingBackendUserData = NULL; - ``` - -This system can allow you to support any kind of file format. See the "Decoding" section for -details on how to implement custom decoders. The miniaudio repository includes examples for Opus -via libopus and libopusfile and Vorbis via libvorbis and libvorbisfile. - -Asynchronicity is achieved via a job system. When an operation needs to be performed, such as the -decoding of a page, a job will be posted to a queue which will then be processed by a job thread. -By default there will be only one job thread running, but this can be configured, like so: - - ```c - config = ma_resource_manager_config_init(); - config.jobThreadCount = MY_JOB_THREAD_COUNT; - ``` - -By default job threads are managed internally by the resource manager, however you can also self -manage your job threads if, for example, you want to integrate the job processing into your -existing job infrastructure, or if you simply don't like the way the resource manager does it. To -do this, just set the job thread count to 0 and process jobs manually. To process jobs, you first -need to retrieve a job using `ma_resource_manager_next_job()` and then process it using -`ma_job_process()`: - - ```c - config = ma_resource_manager_config_init(); - config.jobThreadCount = 0; // Don't manage any job threads internally. - config.flags = MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING; // Optional. Makes `ma_resource_manager_next_job()` non-blocking. - - // ... Initialize your custom job threads ... - - void my_custom_job_thread(...) - { - for (;;) { - ma_job job; - ma_result result = ma_resource_manager_next_job(pMyResourceManager, &job); - if (result != MA_SUCCESS) { - if (result == MA_NOT_DATA_AVAILABLE) { - // No jobs are available. Keep going. Will only get this if the resource manager was initialized - // with MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING. - continue; - } else if (result == MA_CANCELLED) { - // MA_JOB_TYPE_QUIT was posted. Exit. - break; - } else { - // Some other error occurred. - break; - } - } - - ma_job_process(&job); - } - } - ``` - -In the example above, the `MA_JOB_TYPE_QUIT` event is the used as the termination -indicator, but you can use whatever you would like to terminate the thread. The call to -`ma_resource_manager_next_job()` is blocking by default, but can be configured to be non-blocking -by initializing the resource manager with the `MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING` configuration -flag. Note that the `MA_JOB_TYPE_QUIT` will never be removed from the job queue. This -is to give every thread the opportunity to catch the event and terminate naturally. - -When loading a file, it's sometimes convenient to be able to customize how files are opened and -read instead of using standard `fopen()`, `fclose()`, etc. which is what miniaudio will use by -default. This can be done by setting `pVFS` member of the resource manager's config: - - ```c - // Initialize your custom VFS object. See documentation for VFS for information on how to do this. - my_custom_vfs vfs = my_custom_vfs_init(); - - config = ma_resource_manager_config_init(); - config.pVFS = &vfs; - ``` - -This is particularly useful in programs like games where you want to read straight from an archive -rather than the normal file system. If you do not specify a custom VFS, the resource manager will -use the operating system's normal file operations. This is default. - -To load a sound file and create a data source, call `ma_resource_manager_data_source_init()`. When -loading a sound you need to specify the file path and options for how the sounds should be loaded. -By default a sound will be loaded synchronously. The returned data source is owned by the caller -which means the caller is responsible for the allocation and freeing of the data source. Below is -an example for initializing a data source: - - ```c - ma_resource_manager_data_source dataSource; - ma_result result = ma_resource_manager_data_source_init(pResourceManager, pFilePath, flags, &dataSource); - if (result != MA_SUCCESS) { - // Error. - } - - // ... - - // A ma_resource_manager_data_source object is compatible with the `ma_data_source` API. To read data, just call - // the `ma_data_source_read_pcm_frames()` like you would with any normal data source. - result = ma_data_source_read_pcm_frames(&dataSource, pDecodedData, frameCount, &framesRead); - if (result != MA_SUCCESS) { - // Failed to read PCM frames. - } - - // ... - - ma_resource_manager_data_source_uninit(pResourceManager, &dataSource); - ``` - -The `flags` parameter specifies how you want to perform loading of the sound file. It can be a -combination of the following flags: - - ``` - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT - ``` - -When no flags are specified (set to 0), the sound will be fully loaded into memory, but not -decoded, meaning the raw file data will be stored in memory, and then dynamically decoded when -`ma_data_source_read_pcm_frames()` is called. To instead decode the audio data before storing it in -memory, use the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE` flag. By default, the sound file will -be loaded synchronously, meaning `ma_resource_manager_data_source_init()` will only return after -the entire file has been loaded. This is good for simplicity, but can be prohibitively slow. You -can instead load the sound asynchronously using the `MA_RESOURCE_MANAGER_DATA_SOURCE_ASYNC` flag. -This will result in `ma_resource_manager_data_source_init()` returning quickly, but no data will be -returned by `ma_data_source_read_pcm_frames()` until some data is available. When no data is -available because the asynchronous decoding hasn't caught up, `MA_BUSY` will be returned by -`ma_data_source_read_pcm_frames()`. - -For large sounds, it's often prohibitive to store the entire file in memory. To mitigate this, you -can instead stream audio data which you can do by specifying the -`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag. When streaming, data will be decoded in 1 -second pages. When a new page needs to be decoded, a job will be posted to the job queue and then -subsequently processed in a job thread. - -For in-memory sounds, reference counting is used to ensure the data is loaded only once. This means -multiple calls to `ma_resource_manager_data_source_init()` with the same file path will result in -the file data only being loaded once. Each call to `ma_resource_manager_data_source_init()` must be -matched up with a call to `ma_resource_manager_data_source_uninit()`. Sometimes it can be useful -for a program to register self-managed raw audio data and associate it with a file path. Use the -`ma_resource_manager_register_*()` and `ma_resource_manager_unregister_*()` APIs to do this. -`ma_resource_manager_register_decoded_data()` is used to associate a pointer to raw, self-managed -decoded audio data in the specified data format with the specified name. Likewise, -`ma_resource_manager_register_encoded_data()` is used to associate a pointer to raw self-managed -encoded audio data (the raw file data) with the specified name. Note that these names need not be -actual file paths. When `ma_resource_manager_data_source_init()` is called (without the -`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag), the resource manager will look for these -explicitly registered data buffers and, if found, will use it as the backing data for the data -source. Note that the resource manager does *not* make a copy of this data so it is up to the -caller to ensure the pointer stays valid for it's lifetime. Use -`ma_resource_manager_unregister_data()` to unregister the self-managed data. You can also use -`ma_resource_manager_register_file()` and `ma_resource_manager_unregister_file()` to register and -unregister a file. It does not make sense to use the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` -flag with a self-managed data pointer. - - -6.1. Asynchronous Loading and Synchronization ---------------------------------------------- -When loading asynchronously, it can be useful to poll whether or not loading has finished. Use -`ma_resource_manager_data_source_result()` to determine this. For in-memory sounds, this will -return `MA_SUCCESS` when the file has been *entirely* decoded. If the sound is still being decoded, -`MA_BUSY` will be returned. Otherwise, some other error code will be returned if the sound failed -to load. For streaming data sources, `MA_SUCCESS` will be returned when the first page has been -decoded and the sound is ready to be played. If the first page is still being decoded, `MA_BUSY` -will be returned. Otherwise, some other error code will be returned if the sound failed to load. - -In addition to polling, you can also use a simple synchronization object called a "fence" to wait -for asynchronously loaded sounds to finish. This is called `ma_fence`. The advantage to using a -fence is that it can be used to wait for a group of sounds to finish loading rather than waiting -for sounds on an individual basis. There are two stages to loading a sound: - - * Initialization of the internal decoder; and - * Completion of decoding of the file (the file is fully decoded) - -You can specify separate fences for each of the different stages. Waiting for the initialization -of the internal decoder is important for when you need to know the sample format, channels and -sample rate of the file. - -The example below shows how you could use a fence when loading a number of sounds: - - ```c - // This fence will be released when all sounds are finished loading entirely. - ma_fence fence; - ma_fence_init(&fence); - - // This will be passed into the initialization routine for each sound. - ma_resource_manager_pipeline_notifications notifications = ma_resource_manager_pipeline_notifications_init(); - notifications.done.pFence = &fence; - - // Now load a bunch of sounds: - for (iSound = 0; iSound < soundCount; iSound += 1) { - ma_resource_manager_data_source_init(pResourceManager, pSoundFilePaths[iSound], flags, ¬ifications, &pSoundSources[iSound]); - } - - // ... DO SOMETHING ELSE WHILE SOUNDS ARE LOADING ... - - // Wait for loading of sounds to finish. - ma_fence_wait(&fence); - ``` - -In the example above we used a fence for waiting until the entire file has been fully decoded. If -you only need to wait for the initialization of the internal decoder to complete, you can use the -`init` member of the `ma_resource_manager_pipeline_notifications` object: - - ```c - notifications.init.pFence = &fence; - ``` - -If a fence is not appropriate for your situation, you can instead use a callback that is fired on -an individual sound basis. This is done in a very similar way to fences: - - ```c - typedef struct - { - ma_async_notification_callbacks cb; - void* pMyData; - } my_notification; - - void my_notification_callback(ma_async_notification* pNotification) - { - my_notification* pMyNotification = (my_notification*)pNotification; - - // Do something in response to the sound finishing loading. - } - - ... - - my_notification myCallback; - myCallback.cb.onSignal = my_notification_callback; - myCallback.pMyData = pMyData; - - ma_resource_manager_pipeline_notifications notifications = ma_resource_manager_pipeline_notifications_init(); - notifications.done.pNotification = &myCallback; - - ma_resource_manager_data_source_init(pResourceManager, "my_sound.wav", flags, ¬ifications, &mySound); - ``` - -In the example above we just extend the `ma_async_notification_callbacks` object and pass an -instantiation into the `ma_resource_manager_pipeline_notifications` in the same way as we did with -the fence, only we set `pNotification` instead of `pFence`. You can set both of these at the same -time and they should both work as expected. If using the `pNotification` system, you need to ensure -your `ma_async_notification_callbacks` object stays valid. - - - -6.2. Resource Manager Implementation Details --------------------------------------------- -Resources are managed in two main ways: - - * By storing the entire sound inside an in-memory buffer (referred to as a data buffer) - * By streaming audio data on the fly (referred to as a data stream) - -A resource managed data source (`ma_resource_manager_data_source`) encapsulates a data buffer or -data stream, depending on whether or not the data source was initialized with the -`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag. If so, it will make use of a -`ma_resource_manager_data_stream` object. Otherwise it will use a `ma_resource_manager_data_buffer` -object. Both of these objects are data sources which means they can be used with any -`ma_data_source_*()` API. - -Another major feature of the resource manager is the ability to asynchronously decode audio files. -This relieves the audio thread of time-consuming decoding which can negatively affect scalability -due to the audio thread needing to complete it's work extremely quickly to avoid glitching. -Asynchronous decoding is achieved through a job system. There is a central multi-producer, -multi-consumer, fixed-capacity job queue. When some asynchronous work needs to be done, a job is -posted to the queue which is then read by a job thread. The number of job threads can be -configured for improved scalability, and job threads can all run in parallel without needing to -worry about the order of execution (how this is achieved is explained below). - -When a sound is being loaded asynchronously, playback can begin before the sound has been fully -decoded. This enables the application to start playback of the sound quickly, while at the same -time allowing to resource manager to keep loading in the background. Since there may be less -threads than the number of sounds being loaded at a given time, a simple scheduling system is used -to keep decoding time balanced and fair. The resource manager solves this by splitting decoding -into chunks called pages. By default, each page is 1 second long. When a page has been decoded, a -new job will be posted to start decoding the next page. By dividing up decoding into pages, an -individual sound shouldn't ever delay every other sound from having their first page decoded. Of -course, when loading many sounds at the same time, there will always be an amount of time required -to process jobs in the queue so in heavy load situations there will still be some delay. To -determine if a data source is ready to have some frames read, use -`ma_resource_manager_data_source_get_available_frames()`. This will return the number of frames -available starting from the current position. - - -6.2.1. Job Queue ----------------- -The resource manager uses a job queue which is multi-producer, multi-consumer, and fixed-capacity. -This job queue is not currently lock-free, and instead uses a spinlock to achieve thread-safety. -Only a fixed number of jobs can be allocated and inserted into the queue which is done through a -lock-free data structure for allocating an index into a fixed sized array, with reference counting -for mitigation of the ABA problem. The reference count is 32-bit. - -For many types of jobs it's important that they execute in a specific order. In these cases, jobs -are executed serially. For the resource manager, serial execution of jobs is only required on a -per-object basis (per data buffer or per data stream). Each of these objects stores an execution -counter. When a job is posted it is associated with an execution counter. When the job is -processed, it checks if the execution counter of the job equals the execution counter of the -owning object and if so, processes the job. If the counters are not equal, the job will be posted -back onto the job queue for later processing. When the job finishes processing the execution order -of the main object is incremented. This system means the no matter how many job threads are -executing, decoding of an individual sound will always get processed serially. The advantage to -having multiple threads comes into play when loading multiple sounds at the same time. - -The resource manager's job queue is not 100% lock-free and will use a spinlock to achieve -thread-safety for a very small section of code. This is only relevant when the resource manager -uses more than one job thread. If only using a single job thread, which is the default, the -lock should never actually wait in practice. The amount of time spent locking should be quite -short, but it's something to be aware of for those who have pedantic lock-free requirements and -need to use more than one job thread. There are plans to remove this lock in a future version. - -In addition, posting a job will release a semaphore, which on Win32 is implemented with -`ReleaseSemaphore` and on POSIX platforms via a condition variable: - - ```c - pthread_mutex_lock(&pSemaphore->lock); - { - pSemaphore->value += 1; - pthread_cond_signal(&pSemaphore->cond); - } - pthread_mutex_unlock(&pSemaphore->lock); - ``` - -Again, this is relevant for those with strict lock-free requirements in the audio thread. To avoid -this, you can use non-blocking mode (via the `MA_JOB_QUEUE_FLAG_NON_BLOCKING` -flag) and implement your own job processing routine (see the "Resource Manager" section above for -details on how to do this). - - - -6.2.2. Data Buffers -------------------- -When the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag is excluded at initialization time, the -resource manager will try to load the data into an in-memory data buffer. Before doing so, however, -it will first check if the specified file is already loaded. If so, it will increment a reference -counter and just use the already loaded data. This saves both time and memory. When the data buffer -is uninitialized, the reference counter will be decremented. If the counter hits zero, the file -will be unloaded. This is a detail to keep in mind because it could result in excessive loading and -unloading of a sound. For example, the following sequence will result in a file be loaded twice, -once after the other: - - ```c - ma_resource_manager_data_source_init(pResourceManager, "my_file", ..., &myDataBuffer0); // Refcount = 1. Initial load. - ma_resource_manager_data_source_uninit(pResourceManager, &myDataBuffer0); // Refcount = 0. Unloaded. - - ma_resource_manager_data_source_init(pResourceManager, "my_file", ..., &myDataBuffer1); // Refcount = 1. Reloaded because previous uninit() unloaded it. - ma_resource_manager_data_source_uninit(pResourceManager, &myDataBuffer1); // Refcount = 0. Unloaded. - ``` - -A binary search tree (BST) is used for storing data buffers as it has good balance between -efficiency and simplicity. The key of the BST is a 64-bit hash of the file path that was passed -into `ma_resource_manager_data_source_init()`. The advantage of using a hash is that it saves -memory over storing the entire path, has faster comparisons, and results in a mostly balanced BST -due to the random nature of the hash. The disadvantage is that file names are case-sensitive. If -this is an issue, you should normalize your file names to upper- or lower-case before initializing -your data sources. - -When a sound file has not already been loaded and the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC` -flag is excluded, the file will be decoded synchronously by the calling thread. There are two -options for controlling how the audio is stored in the data buffer - encoded or decoded. When the -`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE` option is excluded, the raw file data will be stored -in memory. Otherwise the sound will be decoded before storing it in memory. Synchronous loading is -a very simple and standard process of simply adding an item to the BST, allocating a block of -memory and then decoding (if `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE` is specified). - -When the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC` flag is specified, loading of the data buffer -is done asynchronously. In this case, a job is posted to the queue to start loading and then the -function immediately returns, setting an internal result code to `MA_BUSY`. This result code is -returned when the program calls `ma_resource_manager_data_source_result()`. When decoding has fully -completed `MA_SUCCESS` will be returned. This can be used to know if loading has fully completed. - -When loading asynchronously, a single job is posted to the queue of the type -`MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE`. This involves making a copy of the file path and -associating it with job. When the job is processed by the job thread, it will first load the file -using the VFS associated with the resource manager. When using a custom VFS, it's important that it -be completely thread-safe because it will be used from one or more job threads at the same time. -Individual files should only ever be accessed by one thread at a time, however. After opening the -file via the VFS, the job will determine whether or not the file is being decoded. If not, it -simply allocates a block of memory and loads the raw file contents into it and returns. On the -other hand, when the file is being decoded, it will first allocate a decoder on the heap and -initialize it. Then it will check if the length of the file is known. If so it will allocate a -block of memory to store the decoded output and initialize it to silence. If the size is unknown, -it will allocate room for one page. After memory has been allocated, the first page will be -decoded. If the sound is shorter than a page, the result code will be set to `MA_SUCCESS` and the -completion event will be signalled and loading is now complete. If, however, there is more to -decode, a job with the code `MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE` is posted. This job -will decode the next page and perform the same process if it reaches the end. If there is more to -decode, the job will post another `MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE` job which will -keep on happening until the sound has been fully decoded. For sounds of an unknown length, each -page will be linked together as a linked list. Internally this is implemented via the -`ma_paged_audio_buffer` object. - - -6.2.3. Data Streams -------------------- -Data streams only ever store two pages worth of data for each instance. They are most useful for -large sounds like music tracks in games that would consume too much memory if fully decoded in -memory. After every frame from a page has been read, a job will be posted to load the next page -which is done from the VFS. - -For data streams, the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC` flag will determine whether or -not initialization of the data source waits until the two pages have been decoded. When unset, -`ma_resource_manager_data_source_init()` will wait until the two pages have been loaded, otherwise -it will return immediately. - -When frames are read from a data stream using `ma_resource_manager_data_source_read_pcm_frames()`, -`MA_BUSY` will be returned if there are no frames available. If there are some frames available, -but less than the number requested, `MA_SUCCESS` will be returned, but the actual number of frames -read will be less than the number requested. Due to the asynchronous nature of data streams, -seeking is also asynchronous. If the data stream is in the middle of a seek, `MA_BUSY` will be -returned when trying to read frames. - -When `ma_resource_manager_data_source_read_pcm_frames()` results in a page getting fully consumed -a job is posted to load the next page. This will be posted from the same thread that called -`ma_resource_manager_data_source_read_pcm_frames()`. - -Data streams are uninitialized by posting a job to the queue, but the function won't return until -that job has been processed. The reason for this is that the caller owns the data stream object and -therefore miniaudio needs to ensure everything completes before handing back control to the caller. -Also, if the data stream is uninitialized while pages are in the middle of decoding, they must -complete before destroying any underlying object and the job system handles this cleanly. - -Note that when a new page needs to be loaded, a job will be posted to the resource manager's job -thread from the audio thread. You must keep in mind the details mentioned in the "Job Queue" -section above regarding locking when posting an event if you require a strictly lock-free audio -thread. - - - -7. Node Graph -============= -miniaudio's routing infrastructure follows a node graph paradigm. The idea is that you create a -node whose outputs are attached to inputs of another node, thereby creating a graph. There are -different types of nodes, with each node in the graph processing input data to produce output, -which is then fed through the chain. Each node in the graph can apply their own custom effects. At -the start of the graph will usually be one or more data source nodes which have no inputs, but -instead pull their data from a data source. At the end of the graph is an endpoint which represents -the end of the chain and is where the final output is ultimately extracted from. - -Each node has a number of input buses and a number of output buses. An output bus from a node is -attached to an input bus of another. Multiple nodes can connect their output buses to another -node's input bus, in which case their outputs will be mixed before processing by the node. Below is -a diagram that illustrates a hypothetical node graph setup: - - ``` - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Data flows left to right >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - - +---------------+ +-----------------+ - | Data Source 1 =----+ +----------+ +----= Low Pass Filter =----+ - +---------------+ | | =----+ +-----------------+ | +----------+ - +----= Splitter | +----= ENDPOINT | - +---------------+ | | =----+ +-----------------+ | +----------+ - | Data Source 2 =----+ +----------+ +----= Echo / Delay =----+ - +---------------+ +-----------------+ - ``` - -In the above graph, it starts with two data sources whose outputs are attached to the input of a -splitter node. It's at this point that the two data sources are mixed. After mixing, the splitter -performs it's processing routine and produces two outputs which is simply a duplication of the -input stream. One output is attached to a low pass filter, whereas the other output is attached to -a echo/delay. The outputs of the the low pass filter and the echo are attached to the endpoint, and -since they're both connected to the same input but, they'll be mixed. - -Each input bus must be configured to accept the same number of channels, but the number of channels -used by input buses can be different to the number of channels for output buses in which case -miniaudio will automatically convert the input data to the output channel count before processing. -The number of channels of an output bus of one node must match the channel count of the input bus -it's attached to. The channel counts cannot be changed after the node has been initialized. If you -attempt to attach an output bus to an input bus with a different channel count, attachment will -fail. - -To use a node graph, you first need to initialize a `ma_node_graph` object. This is essentially a -container around the entire graph. The `ma_node_graph` object is required for some thread-safety -issues which will be explained later. A `ma_node_graph` object is initialized using miniaudio's -standard config/init system: - - ```c - ma_node_graph_config nodeGraphConfig = ma_node_graph_config_init(myChannelCount); - - result = ma_node_graph_init(&nodeGraphConfig, NULL, &nodeGraph); // Second parameter is a pointer to allocation callbacks. - if (result != MA_SUCCESS) { - // Failed to initialize node graph. - } - ``` - -When you initialize the node graph, you're specifying the channel count of the endpoint. The -endpoint is a special node which has one input bus and one output bus, both of which have the -same channel count, which is specified in the config. Any nodes that connect directly to the -endpoint must be configured such that their output buses have the same channel count. When you read -audio data from the node graph, it'll have the channel count you specified in the config. To read -data from the graph: - - ```c - ma_uint32 framesRead; - result = ma_node_graph_read_pcm_frames(&nodeGraph, pFramesOut, frameCount, &framesRead); - if (result != MA_SUCCESS) { - // Failed to read data from the node graph. - } - ``` - -When you read audio data, miniaudio starts at the node graph's endpoint node which then pulls in -data from it's input attachments, which in turn recusively pull in data from their inputs, and so -on. At the start of the graph there will be some kind of data source node which will have zero -inputs and will instead read directly from a data source. The base nodes don't literally need to -read from a `ma_data_source` object, but they will always have some kind of underlying object that -sources some kind of audio. The `ma_data_source_node` node can be used to read from a -`ma_data_source`. Data is always in floating-point format and in the number of channels you -specified when the graph was initialized. The sample rate is defined by the underlying data sources. -It's up to you to ensure they use a consistent and appropraite sample rate. - -The `ma_node` API is designed to allow custom nodes to be implemented with relative ease, but -miniaudio includes a few stock nodes for common functionality. This is how you would initialize a -node which reads directly from a data source (`ma_data_source_node`) which is an example of one -of the stock nodes that comes with miniaudio: - - ```c - ma_data_source_node_config config = ma_data_source_node_config_init(pMyDataSource); - - ma_data_source_node dataSourceNode; - result = ma_data_source_node_init(&nodeGraph, &config, NULL, &dataSourceNode); - if (result != MA_SUCCESS) { - // Failed to create data source node. - } - ``` - -The data source node will use the output channel count to determine the channel count of the output -bus. There will be 1 output bus and 0 input buses (data will be drawn directly from the data -source). The data source must output to floating-point (`ma_format_f32`) or else an error will be -returned from `ma_data_source_node_init()`. - -By default the node will not be attached to the graph. To do so, use `ma_node_attach_output_bus()`: - - ```c - result = ma_node_attach_output_bus(&dataSourceNode, 0, ma_node_graph_get_endpoint(&nodeGraph), 0); - if (result != MA_SUCCESS) { - // Failed to attach node. - } - ``` - -The code above connects the data source node directly to the endpoint. Since the data source node -has only a single output bus, the index will always be 0. Likewise, the endpoint only has a single -input bus which means the input bus index will also always be 0. - -To detach a specific output bus, use `ma_node_detach_output_bus()`. To detach all output buses, use -`ma_node_detach_all_output_buses()`. If you want to just move the output bus from one attachment to -another, you do not need to detach first. You can just call `ma_node_attach_output_bus()` and it'll -deal with it for you. - -Less frequently you may want to create a specialized node. This will be a node where you implement -your own processing callback to apply a custom effect of some kind. This is similar to initalizing -one of the stock node types, only this time you need to specify a pointer to a vtable containing a -pointer to the processing function and the number of input and output buses. Example: - - ```c - static void my_custom_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) - { - // Do some processing of ppFramesIn (one stream of audio data per input bus) - const float* pFramesIn_0 = ppFramesIn[0]; // Input bus @ index 0. - const float* pFramesIn_1 = ppFramesIn[1]; // Input bus @ index 1. - float* pFramesOut_0 = ppFramesOut[0]; // Output bus @ index 0. - - // Do some processing. On input, `pFrameCountIn` will be the number of input frames in each - // buffer in `ppFramesIn` and `pFrameCountOut` will be the capacity of each of the buffers - // in `ppFramesOut`. On output, `pFrameCountIn` should be set to the number of input frames - // your node consumed and `pFrameCountOut` should be set the number of output frames that - // were produced. - // - // You should process as many frames as you can. If your effect consumes input frames at the - // same rate as output frames (always the case, unless you're doing resampling), you need - // only look at `ppFramesOut` and process that exact number of frames. If you're doing - // resampling, you'll need to be sure to set both `pFrameCountIn` and `pFrameCountOut` - // properly. - } - - static ma_node_vtable my_custom_node_vtable = - { - my_custom_node_process_pcm_frames, // The function that will be called process your custom node. This is where you'd implement your effect processing. - NULL, // Optional. A callback for calculating the number of input frames that are required to process a specified number of output frames. - 2, // 2 input buses. - 1, // 1 output bus. - 0 // Default flags. - }; - - ... - - // Each bus needs to have a channel count specified. To do this you need to specify the channel - // counts in an array and then pass that into the node config. - ma_uint32 inputChannels[2]; // Equal in size to the number of input channels specified in the vtable. - ma_uint32 outputChannels[1]; // Equal in size to the number of output channels specicied in the vtable. - - inputChannels[0] = channelsIn; - inputChannels[1] = channelsIn; - outputChannels[0] = channelsOut; - - ma_node_config nodeConfig = ma_node_config_init(); - nodeConfig.vtable = &my_custom_node_vtable; - nodeConfig.pInputChannels = inputChannels; - nodeConfig.pOutputChannels = outputChannels; - - ma_node_base node; - result = ma_node_init(&nodeGraph, &nodeConfig, NULL, &node); - if (result != MA_SUCCESS) { - // Failed to initialize node. - } - ``` - -When initializing a custom node, as in the code above, you'll normally just place your vtable in -static space. The number of input and output buses are specified as part of the vtable. If you need -a variable number of buses on a per-node bases, the vtable should have the relevant bus count set -to `MA_NODE_BUS_COUNT_UNKNOWN`. In this case, the bus count should be set in the node config: - - ```c - static ma_node_vtable my_custom_node_vtable = - { - my_custom_node_process_pcm_frames, // The function that will be called process your custom node. This is where you'd implement your effect processing. - NULL, // Optional. A callback for calculating the number of input frames that are required to process a specified number of output frames. - MA_NODE_BUS_COUNT_UNKNOWN, // The number of input buses is determined on a per-node basis. - 1, // 1 output bus. - 0 // Default flags. - }; - - ... - - ma_node_config nodeConfig = ma_node_config_init(); - nodeConfig.vtable = &my_custom_node_vtable; - nodeConfig.inputBusCount = myBusCount; // <-- Since the vtable specifies MA_NODE_BUS_COUNT_UNKNOWN, the input bus count should be set here. - nodeConfig.pInputChannels = inputChannels; // <-- Make sure there are nodeConfig.inputBusCount elements in this array. - nodeConfig.pOutputChannels = outputChannels; // <-- The vtable specifies 1 output bus, so there must be 1 element in this array. - ``` - -In the above example it's important to never set the `inputBusCount` and `outputBusCount` members -to anything other than their defaults if the vtable specifies an explicit count. They can only be -set if the vtable specifies MA_NODE_BUS_COUNT_UNKNOWN in the relevant bus count. - -Most often you'll want to create a structure to encapsulate your node with some extra data. You -need to make sure the `ma_node_base` object is your first member of the structure: - - ```c - typedef struct - { - ma_node_base base; // <-- Make sure this is always the first member. - float someCustomData; - } my_custom_node; - ``` - -By doing this, your object will be compatible with all `ma_node` APIs and you can attach it to the -graph just like any other node. - -In the custom processing callback (`my_custom_node_process_pcm_frames()` in the example above), the -number of channels for each bus is what was specified by the config when the node was initialized -with `ma_node_init()`. In addition, all attachments to each of the input buses will have been -pre-mixed by miniaudio. The config allows you to specify different channel counts for each -individual input and output bus. It's up to the effect to handle it appropriate, and if it can't, -return an error in it's initialization routine. - -Custom nodes can be assigned some flags to describe their behaviour. These are set via the vtable -and include the following: - - +-----------------------------------------+---------------------------------------------------+ - | Flag Name | Description | - +-----------------------------------------+---------------------------------------------------+ - | MA_NODE_FLAG_PASSTHROUGH | Useful for nodes that do not do any kind of audio | - | | processing, but are instead used for tracking | - | | time, handling events, etc. Also used by the | - | | internal endpoint node. It reads directly from | - | | the input bus to the output bus. Nodes with this | - | | flag must have exactly 1 input bus and 1 output | - | | bus, and both buses must have the same channel | - | | counts. | - +-----------------------------------------+---------------------------------------------------+ - | MA_NODE_FLAG_CONTINUOUS_PROCESSING | Causes the processing callback to be called even | - | | when no data is available to be read from input | - | | attachments. This is useful for effects like | - | | echos where there will be a tail of audio data | - | | that still needs to be processed even when the | - | | original data sources have reached their ends. | - +-----------------------------------------+---------------------------------------------------+ - | MA_NODE_FLAG_ALLOW_NULL_INPUT | Used in conjunction with | - | | `MA_NODE_FLAG_CONTINUOUS_PROCESSING`. When this | - | | is set, the `ppFramesIn` parameter of the | - | | processing callback will be set to NULL when | - | | there are no input frames are available. When | - | | this is unset, silence will be posted to the | - | | processing callback. | - +-----------------------------------------+---------------------------------------------------+ - | MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES | Used to tell miniaudio that input and output | - | | frames are processed at different rates. You | - | | should set this for any nodes that perform | - | | resampling. | - +-----------------------------------------+---------------------------------------------------+ - | MA_NODE_FLAG_SILENT_OUTPUT | Used to tell miniaudio that a node produces only | - | | silent output. This is useful for nodes where you | - | | don't want the output to contribute to the final | - | | mix. An example might be if you want split your | - | | stream and have one branch be output to a file. | - | | When using this flag, you should avoid writing to | - | | the output buffer of the node's processing | - | | callback because miniaudio will ignore it anyway. | - +-----------------------------------------+---------------------------------------------------+ - - -If you need to make a copy of an audio stream for effect processing you can use a splitter node -called `ma_splitter_node`. This takes has 1 input bus and splits the stream into 2 output buses. -You can use it like this: - - ```c - ma_splitter_node_config splitterNodeConfig = ma_splitter_node_config_init(channelsIn, channelsOut); - - ma_splitter_node splitterNode; - result = ma_splitter_node_init(&nodeGraph, &splitterNodeConfig, NULL, &splitterNode); - if (result != MA_SUCCESS) { - // Failed to create node. - } - - // Attach your output buses to two different input buses (can be on two different nodes). - ma_node_attach_output_bus(&splitterNode, 0, ma_node_graph_get_endpoint(&nodeGraph), 0); // Attach directly to the endpoint. - ma_node_attach_output_bus(&splitterNode, 1, &myEffectNode, 0); // Attach to input bus 0 of some effect node. - ``` - -The volume of an output bus can be configured on a per-bus basis: - - ```c - ma_node_set_output_bus_volume(&splitterNode, 0, 0.5f); - ma_node_set_output_bus_volume(&splitterNode, 1, 0.5f); - ``` - -In the code above we're using the splitter node from before and changing the volume of each of the -copied streams. - -You can start and stop a node with the following: - - ```c - ma_node_set_state(&splitterNode, ma_node_state_started); // The default state. - ma_node_set_state(&splitterNode, ma_node_state_stopped); - ``` - -By default the node is in a started state, but since it won't be connected to anything won't -actually be invoked by the node graph until it's connected. When you stop a node, data will not be -read from any of it's input connections. You can use this property to stop a group of sounds -atomically. - -You can configure the initial state of a node in it's config: - - ```c - nodeConfig.initialState = ma_node_state_stopped; - ``` - -Note that for the stock specialized nodes, all of their configs will have a `nodeConfig` member -which is the config to use with the base node. This is where the initial state can be configured -for specialized nodes: - - ```c - dataSourceNodeConfig.nodeConfig.initialState = ma_node_state_stopped; - ``` - -When using a specialized node like `ma_data_source_node` or `ma_splitter_node`, be sure to not -modify the `vtable` member of the `nodeConfig` object. - - -7.1. Timing ------------ -The node graph supports starting and stopping nodes at scheduled times. This is especially useful -for data source nodes where you want to get the node set up, but only start playback at a specific -time. There are two clocks: local and global. - -A local clock is per-node, whereas the global clock is per graph. Scheduling starts and stops can -only be done based on the global clock because the local clock will not be running while the node -is stopped. The global clocks advances whenever `ma_node_graph_read_pcm_frames()` is called. On the -other hand, the local clock only advances when the node's processing callback is fired, and is -advanced based on the output frame count. - -To retrieve the global time, use `ma_node_graph_get_time()`. The global time can be set with -`ma_node_graph_set_time()` which might be useful if you want to do seeking on a global timeline. -Getting and setting the local time is similar. Use `ma_node_get_time()` to retrieve the local time, -and `ma_node_set_time()` to set the local time. The global and local times will be advanced by the -audio thread, so care should be taken to avoid data races. Ideally you should avoid calling these -outside of the node processing callbacks which are always run on the audio thread. - -There is basic support for scheduling the starting and stopping of nodes. You can only schedule one -start and one stop at a time. This is mainly intended for putting nodes into a started or stopped -state in a frame-exact manner. Without this mechanism, starting and stopping of a node is limited -to the resolution of a call to `ma_node_graph_read_pcm_frames()` which would typically be in blocks -of several milliseconds. The following APIs can be used for scheduling node states: - - ```c - ma_node_set_state_time() - ma_node_get_state_time() - ``` - -The time is absolute and must be based on the global clock. An example is below: - - ```c - ma_node_set_state_time(&myNode, ma_node_state_started, sampleRate*1); // Delay starting to 1 second. - ma_node_set_state_time(&myNode, ma_node_state_stopped, sampleRate*5); // Delay stopping to 5 seconds. - ``` - -An example for changing the state using a relative time. - - ```c - ma_node_set_state_time(&myNode, ma_node_state_started, sampleRate*1 + ma_node_graph_get_time(&myNodeGraph)); - ma_node_set_state_time(&myNode, ma_node_state_stopped, sampleRate*5 + ma_node_graph_get_time(&myNodeGraph)); - ``` - -Note that due to the nature of multi-threading the times may not be 100% exact. If this is an -issue, consider scheduling state changes from within a processing callback. An idea might be to -have some kind of passthrough trigger node that is used specifically for tracking time and handling -events. - - - -7.2. Thread Safety and Locking ------------------------------- -When processing audio, it's ideal not to have any kind of locking in the audio thread. Since it's -expected that `ma_node_graph_read_pcm_frames()` would be run on the audio thread, it does so -without the use of any locks. This section discusses the implementation used by miniaudio and goes -over some of the compromises employed by miniaudio to achieve this goal. Note that the current -implementation may not be ideal - feedback and critiques are most welcome. - -The node graph API is not *entirely* lock-free. Only `ma_node_graph_read_pcm_frames()` is expected -to be lock-free. Attachment, detachment and uninitialization of nodes use locks to simplify the -implementation, but are crafted in a way such that such locking is not required when reading audio -data from the graph. Locking in these areas are achieved by means of spinlocks. - -The main complication with keeping `ma_node_graph_read_pcm_frames()` lock-free stems from the fact -that a node can be uninitialized, and it's memory potentially freed, while in the middle of being -processed on the audio thread. There are times when the audio thread will be referencing a node, -which means the uninitialization process of a node needs to make sure it delays returning until the -audio thread is finished so that control is not handed back to the caller thereby giving them a -chance to free the node's memory. - -When the audio thread is processing a node, it does so by reading from each of the output buses of -the node. In order for a node to process data for one of it's output buses, it needs to read from -each of it's input buses, and so on an so forth. It follows that once all output buses of a node -are detached, the node as a whole will be disconnected and no further processing will occur unless -it's output buses are reattached, which won't be happening when the node is being uninitialized. -By having `ma_node_detach_output_bus()` wait until the audio thread is finished with it, we can -simplify a few things, at the expense of making `ma_node_detach_output_bus()` a bit slower. By -doing this, the implementation of `ma_node_uninit()` becomes trivial - just detach all output -nodes, followed by each of the attachments to each of it's input nodes, and then do any final clean -up. - -With the above design, the worst-case scenario is `ma_node_detach_output_bus()` taking as long as -it takes to process the output bus being detached. This will happen if it's called at just the -wrong moment where the audio thread has just iterated it and has just started processing. The -caller of `ma_node_detach_output_bus()` will stall until the audio thread is finished, which -includes the cost of recursively processing it's inputs. This is the biggest compromise made with -the approach taken by miniaudio for it's lock-free processing system. The cost of detaching nodes -earlier in the pipeline (data sources, for example) will be cheaper than the cost of detaching -higher level nodes, such as some kind of final post-processing endpoint. If you need to do mass -detachments, detach starting from the lowest level nodes and work your way towards the final -endpoint node (but don't try detaching the node graph's endpoint). If the audio thread is not -running, detachment will be fast and detachment in any order will be the same. The reason nodes -need to wait for their input attachments to complete is due to the potential for desyncs between -data sources. If the node was to terminate processing mid way through processing it's inputs, -there's a chance that some of the underlying data sources will have been read, but then others not. -That will then result in a potential desynchronization when detaching and reattaching higher-level -nodes. A possible solution to this is to have an option when detaching to terminate processing -before processing all input attachments which should be fairly simple. - -Another compromise, albeit less significant, is locking when attaching and detaching nodes. This -locking is achieved by means of a spinlock in order to reduce memory overhead. A lock is present -for each input bus and output bus. When an output bus is connected to an input bus, both the output -bus and input bus is locked. This locking is specifically for attaching and detaching across -different threads and does not affect `ma_node_graph_read_pcm_frames()` in any way. The locking and -unlocking is mostly self-explanatory, but a slightly less intuitive aspect comes into it when -considering that iterating over attachments must not break as a result of attaching or detaching a -node while iteration is occuring. - -Attaching and detaching are both quite simple. When an output bus of a node is attached to an input -bus of another node, it's added to a linked list. Basically, an input bus is a linked list, where -each item in the list is and output bus. We have some intentional (and convenient) restrictions on -what can done with the linked list in order to simplify the implementation. First of all, whenever -something needs to iterate over the list, it must do so in a forward direction. Backwards iteration -is not supported. Also, items can only be added to the start of the list. - -The linked list is a doubly-linked list where each item in the list (an output bus) holds a pointer -to the next item in the list, and another to the previous item. A pointer to the previous item is -only required for fast detachment of the node - it is never used in iteration. This is an -important property because it means from the perspective of iteration, attaching and detaching of -an item can be done with a single atomic assignment. This is exploited by both the attachment and -detachment process. When attaching the node, the first thing that is done is the setting of the -local "next" and "previous" pointers of the node. After that, the item is "attached" to the list -by simply performing an atomic exchange with the head pointer. After that, the node is "attached" -to the list from the perspective of iteration. Even though the "previous" pointer of the next item -hasn't yet been set, from the perspective of iteration it's been attached because iteration will -only be happening in a forward direction which means the "previous" pointer won't actually ever get -used. The same general process applies to detachment. See `ma_node_attach_output_bus()` and -`ma_node_detach_output_bus()` for the implementation of this mechanism. - - - -8. Decoding -=========== -The `ma_decoder` API is used for reading audio files. Decoders are completely decoupled from -devices and can be used independently. The following formats are supported: - - +---------+------------------+----------+ - | Format | Decoding Backend | Built-In | - +---------+------------------+----------+ - | WAV | dr_wav | Yes | - | MP3 | dr_mp3 | Yes | - | FLAC | dr_flac | Yes | - | Vorbis | stb_vorbis | No | - +---------+------------------+----------+ - -Vorbis is supported via stb_vorbis which can be enabled by including the header section before the -implementation of miniaudio, like the following: - - ```c - #define STB_VORBIS_HEADER_ONLY - #include "extras/stb_vorbis.c" // Enables Vorbis decoding. - - #define MINIAUDIO_IMPLEMENTATION - #include "miniaudio.h" - - // The stb_vorbis implementation must come after the implementation of miniaudio. - #undef STB_VORBIS_HEADER_ONLY - #include "extras/stb_vorbis.c" - ``` - -A copy of stb_vorbis is included in the "extras" folder in the miniaudio repository (https://github.com/mackron/miniaudio). - -Built-in decoders are amalgamated into the implementation section of miniaudio. You can disable the -built-in decoders by specifying one or more of the following options before the miniaudio -implementation: - - ```c - #define MA_NO_WAV - #define MA_NO_MP3 - #define MA_NO_FLAC - ``` - -Disabling built-in decoding libraries is useful if you use these libraries independantly of the -`ma_decoder` API. - -A decoder can be initialized from a file with `ma_decoder_init_file()`, a block of memory with -`ma_decoder_init_memory()`, or from data delivered via callbacks with `ma_decoder_init()`. Here is -an example for loading a decoder from a file: - - ```c - ma_decoder decoder; - ma_result result = ma_decoder_init_file("MySong.mp3", NULL, &decoder); - if (result != MA_SUCCESS) { - return false; // An error occurred. - } - - ... - - ma_decoder_uninit(&decoder); - ``` - -When initializing a decoder, you can optionally pass in a pointer to a `ma_decoder_config` object -(the `NULL` argument in the example above) which allows you to configure the output format, channel -count, sample rate and channel map: - - ```c - ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 2, 48000); - ``` - -When passing in `NULL` for decoder config in `ma_decoder_init*()`, the output format will be the -same as that defined by the decoding backend. - -Data is read from the decoder as PCM frames. This will output the number of PCM frames actually -read. If this is less than the requested number of PCM frames it means you've reached the end. The -return value will be `MA_AT_END` if no samples have been read and the end has been reached. - - ```c - ma_result result = ma_decoder_read_pcm_frames(pDecoder, pFrames, framesToRead, &framesRead); - if (framesRead < framesToRead) { - // Reached the end. - } - ``` - -You can also seek to a specific frame like so: - - ```c - ma_result result = ma_decoder_seek_to_pcm_frame(pDecoder, targetFrame); - if (result != MA_SUCCESS) { - return false; // An error occurred. - } - ``` - -If you want to loop back to the start, you can simply seek back to the first PCM frame: - - ```c - ma_decoder_seek_to_pcm_frame(pDecoder, 0); - ``` - -When loading a decoder, miniaudio uses a trial and error technique to find the appropriate decoding -backend. This can be unnecessarily inefficient if the type is already known. In this case you can -use `encodingFormat` variable in the device config to specify a specific encoding format you want -to decode: - - ```c - decoderConfig.encodingFormat = ma_encoding_format_wav; - ``` - -See the `ma_encoding_format` enum for possible encoding formats. - -The `ma_decoder_init_file()` API will try using the file extension to determine which decoding -backend to prefer. - - -8.1. Custom Decoders --------------------- -It's possible to implement a custom decoder and plug it into miniaudio. This is extremely useful -when you want to use the `ma_decoder` API, but need to support an encoding format that's not one of -the stock formats supported by miniaudio. This can be put to particularly good use when using the -`ma_engine` and/or `ma_resource_manager` APIs because they use `ma_decoder` internally. If, for -example, you wanted to support Opus, you can do so with a custom decoder (there if a reference -Opus decoder in the "extras" folder of the miniaudio repository which uses libopus + libopusfile). - -A custom decoder must implement a data source. A vtable called `ma_decoding_backend_vtable` needs -to be implemented which is then passed into the decoder config: - - ```c - ma_decoding_backend_vtable* pCustomBackendVTables[] = - { - &g_ma_decoding_backend_vtable_libvorbis, - &g_ma_decoding_backend_vtable_libopus - }; - - ... - - decoderConfig = ma_decoder_config_init_default(); - decoderConfig.pCustomBackendUserData = NULL; - decoderConfig.ppCustomBackendVTables = pCustomBackendVTables; - decoderConfig.customBackendCount = sizeof(pCustomBackendVTables) / sizeof(pCustomBackendVTables[0]); - ``` - -The `ma_decoding_backend_vtable` vtable has the following functions: - - ``` - onInit - onInitFile - onInitFileW - onInitMemory - onUninit - ``` - -There are only two functions that must be implemented - `onInit` and `onUninit`. The other -functions can be implemented for a small optimization for loading from a file path or memory. If -these are not specified, miniaudio will deal with it for you via a generic implementation. - -When you initialize a custom data source (by implementing the `onInit` function in the vtable) you -will need to output a pointer to a `ma_data_source` which implements your custom decoder. See the -section about data sources for details on how to implemen this. Alternatively, see the -"custom_decoders" example in the miniaudio repository. - -The `onInit` function takes a pointer to some callbacks for the purpose of reading raw audio data -from some abitrary source. You'll use these functions to read from the raw data and perform the -decoding. When you call them, you will pass in the `pReadSeekTellUserData` pointer to the relevant -parameter. - -The `pConfig` parameter in `onInit` can be used to configure the backend if appropriate. It's only -used as a hint and can be ignored. However, if any of the properties are relevant to your decoder, -an optimal implementation will handle the relevant properties appropriately. - -If memory allocation is required, it should be done so via the specified allocation callbacks if -possible (the `pAllocationCallbacks` parameter). - -If an error occurs when initializing the decoder, you should leave `ppBackend` unset, or set to -NULL, and make sure everything is cleaned up appropriately and an appropriate result code returned. -When multiple custom backends are specified, miniaudio will cycle through the vtables in the order -they're listed in the array that's passed into the decoder config so it's important that your -initialization routine is clean. - -When a decoder is uninitialized, the `onUninit` callback will be fired which will give you an -opportunity to clean up and internal data. - - - -9. Encoding -=========== -The `ma_encoding` API is used for writing audio files. The only supported output format is WAV -which is achieved via dr_wav which is amalgamated into the implementation section of miniaudio. -This can be disabled by specifying the following option before the implementation of miniaudio: - - ```c - #define MA_NO_WAV - ``` - -An encoder can be initialized to write to a file with `ma_encoder_init_file()` or from data -delivered via callbacks with `ma_encoder_init()`. Below is an example for initializing an encoder -to output to a file. - - ```c - ma_encoder_config config = ma_encoder_config_init(ma_encoding_format_wav, FORMAT, CHANNELS, SAMPLE_RATE); - ma_encoder encoder; - ma_result result = ma_encoder_init_file("my_file.wav", &config, &encoder); - if (result != MA_SUCCESS) { - // Error - } - - ... - - ma_encoder_uninit(&encoder); - ``` - -When initializing an encoder you must specify a config which is initialized with -`ma_encoder_config_init()`. Here you must specify the file type, the output sample format, output -channel count and output sample rate. The following file types are supported: - - +------------------------+-------------+ - | Enum | Description | - +------------------------+-------------+ - | ma_encoding_format_wav | WAV | - +------------------------+-------------+ - -If the format, channel count or sample rate is not supported by the output file type an error will -be returned. The encoder will not perform data conversion so you will need to convert it before -outputting any audio data. To output audio data, use `ma_encoder_write_pcm_frames()`, like in the -example below: - - ```c - framesWritten = ma_encoder_write_pcm_frames(&encoder, pPCMFramesToWrite, framesToWrite); - ``` - -Encoders must be uninitialized with `ma_encoder_uninit()`. - - - -10. Data Conversion -=================== -A data conversion API is included with miniaudio which supports the majority of data conversion -requirements. This supports conversion between sample formats, channel counts (with channel -mapping) and sample rates. - - -10.1. Sample Format Conversion ------------------------------- -Conversion between sample formats is achieved with the `ma_pcm_*_to_*()`, `ma_pcm_convert()` and -`ma_convert_pcm_frames_format()` APIs. Use `ma_pcm_*_to_*()` to convert between two specific -formats. Use `ma_pcm_convert()` to convert based on a `ma_format` variable. Use -`ma_convert_pcm_frames_format()` to convert PCM frames where you want to specify the frame count -and channel count as a variable instead of the total sample count. - - -10.1.1. Dithering ------------------ -Dithering can be set using the ditherMode parameter. - -The different dithering modes include the following, in order of efficiency: - - +-----------+--------------------------+ - | Type | Enum Token | - +-----------+--------------------------+ - | None | ma_dither_mode_none | - | Rectangle | ma_dither_mode_rectangle | - | Triangle | ma_dither_mode_triangle | - +-----------+--------------------------+ - -Note that even if the dither mode is set to something other than `ma_dither_mode_none`, it will be -ignored for conversions where dithering is not needed. Dithering is available for the following -conversions: - - ``` - s16 -> u8 - s24 -> u8 - s32 -> u8 - f32 -> u8 - s24 -> s16 - s32 -> s16 - f32 -> s16 - ``` - -Note that it is not an error to pass something other than ma_dither_mode_none for conversions where -dither is not used. It will just be ignored. - - - -10.2. Channel Conversion ------------------------- -Channel conversion is used for channel rearrangement and conversion from one channel count to -another. The `ma_channel_converter` API is used for channel conversion. Below is an example of -initializing a simple channel converter which converts from mono to stereo. - - ```c - ma_channel_converter_config config = ma_channel_converter_config_init( - ma_format, // Sample format - 1, // Input channels - NULL, // Input channel map - 2, // Output channels - NULL, // Output channel map - ma_channel_mix_mode_default); // The mixing algorithm to use when combining channels. - - result = ma_channel_converter_init(&config, NULL, &converter); - if (result != MA_SUCCESS) { - // Error. - } - ``` - -To perform the conversion simply call `ma_channel_converter_process_pcm_frames()` like so: - - ```c - ma_result result = ma_channel_converter_process_pcm_frames(&converter, pFramesOut, pFramesIn, frameCount); - if (result != MA_SUCCESS) { - // Error. - } - ``` - -It is up to the caller to ensure the output buffer is large enough to accomodate the new PCM -frames. - -Input and output PCM frames are always interleaved. Deinterleaved layouts are not supported. - - -10.2.1. Channel Mapping ------------------------ -In addition to converting from one channel count to another, like the example above, the channel -converter can also be used to rearrange channels. When initializing the channel converter, you can -optionally pass in channel maps for both the input and output frames. If the channel counts are the -same, and each channel map contains the same channel positions with the exception that they're in -a different order, a simple shuffling of the channels will be performed. If, however, there is not -a 1:1 mapping of channel positions, or the channel counts differ, the input channels will be mixed -based on a mixing mode which is specified when initializing the `ma_channel_converter_config` -object. - -When converting from mono to multi-channel, the mono channel is simply copied to each output -channel. When going the other way around, the audio of each output channel is simply averaged and -copied to the mono channel. - -In more complicated cases blending is used. The `ma_channel_mix_mode_simple` mode will drop excess -channels and silence extra channels. For example, converting from 4 to 2 channels, the 3rd and 4th -channels will be dropped, whereas converting from 2 to 4 channels will put silence into the 3rd and -4th channels. - -The `ma_channel_mix_mode_rectangle` mode uses spacial locality based on a rectangle to compute a -simple distribution between input and output. Imagine sitting in the middle of a room, with -speakers on the walls representing channel positions. The `MA_CHANNEL_FRONT_LEFT` position can be -thought of as being in the corner of the front and left walls. - -Finally, the `ma_channel_mix_mode_custom_weights` mode can be used to use custom user-defined -weights. Custom weights can be passed in as the last parameter of -`ma_channel_converter_config_init()`. - -Predefined channel maps can be retrieved with `ma_channel_map_init_standard()`. This takes a -`ma_standard_channel_map` enum as it's first parameter, which can be one of the following: - - +-----------------------------------+-----------------------------------------------------------+ - | Name | Description | - +-----------------------------------+-----------------------------------------------------------+ - | ma_standard_channel_map_default | Default channel map used by miniaudio. See below. | - | ma_standard_channel_map_microsoft | Channel map used by Microsoft's bitfield channel maps. | - | ma_standard_channel_map_alsa | Default ALSA channel map. | - | ma_standard_channel_map_rfc3551 | RFC 3551. Based on AIFF. | - | ma_standard_channel_map_flac | FLAC channel map. | - | ma_standard_channel_map_vorbis | Vorbis channel map. | - | ma_standard_channel_map_sound4 | FreeBSD's sound(4). | - | ma_standard_channel_map_sndio | sndio channel map. http://www.sndio.org/tips.html. | - | ma_standard_channel_map_webaudio | https://webaudio.github.io/web-audio-api/#ChannelOrdering | - +-----------------------------------+-----------------------------------------------------------+ - -Below are the channel maps used by default in miniaudio (`ma_standard_channel_map_default`): - - +---------------+---------------------------------+ - | Channel Count | Mapping | - +---------------+---------------------------------+ - | 1 (Mono) | 0: MA_CHANNEL_MONO | - +---------------+---------------------------------+ - | 2 (Stereo) | 0: MA_CHANNEL_FRONT_LEFT
| - | | 1: MA_CHANNEL_FRONT_RIGHT | - +---------------+---------------------------------+ - | 3 | 0: MA_CHANNEL_FRONT_LEFT
| - | | 1: MA_CHANNEL_FRONT_RIGHT
| - | | 2: MA_CHANNEL_FRONT_CENTER | - +---------------+---------------------------------+ - | 4 (Surround) | 0: MA_CHANNEL_FRONT_LEFT
| - | | 1: MA_CHANNEL_FRONT_RIGHT
| - | | 2: MA_CHANNEL_FRONT_CENTER
| - | | 3: MA_CHANNEL_BACK_CENTER | - +---------------+---------------------------------+ - | 5 | 0: MA_CHANNEL_FRONT_LEFT
| - | | 1: MA_CHANNEL_FRONT_RIGHT
| - | | 2: MA_CHANNEL_FRONT_CENTER
| - | | 3: MA_CHANNEL_BACK_LEFT
| - | | 4: MA_CHANNEL_BACK_RIGHT | - +---------------+---------------------------------+ - | 6 (5.1) | 0: MA_CHANNEL_FRONT_LEFT
| - | | 1: MA_CHANNEL_FRONT_RIGHT
| - | | 2: MA_CHANNEL_FRONT_CENTER
| - | | 3: MA_CHANNEL_LFE
| - | | 4: MA_CHANNEL_SIDE_LEFT
| - | | 5: MA_CHANNEL_SIDE_RIGHT | - +---------------+---------------------------------+ - | 7 | 0: MA_CHANNEL_FRONT_LEFT
| - | | 1: MA_CHANNEL_FRONT_RIGHT
| - | | 2: MA_CHANNEL_FRONT_CENTER
| - | | 3: MA_CHANNEL_LFE
| - | | 4: MA_CHANNEL_BACK_CENTER
| - | | 4: MA_CHANNEL_SIDE_LEFT
| - | | 5: MA_CHANNEL_SIDE_RIGHT | - +---------------+---------------------------------+ - | 8 (7.1) | 0: MA_CHANNEL_FRONT_LEFT
| - | | 1: MA_CHANNEL_FRONT_RIGHT
| - | | 2: MA_CHANNEL_FRONT_CENTER
| - | | 3: MA_CHANNEL_LFE
| - | | 4: MA_CHANNEL_BACK_LEFT
| - | | 5: MA_CHANNEL_BACK_RIGHT
| - | | 6: MA_CHANNEL_SIDE_LEFT
| - | | 7: MA_CHANNEL_SIDE_RIGHT | - +---------------+---------------------------------+ - | Other | All channels set to 0. This | - | | is equivalent to the same | - | | mapping as the device. | - +---------------+---------------------------------+ - - - -10.3. Resampling ----------------- -Resampling is achieved with the `ma_resampler` object. To create a resampler object, do something -like the following: - - ```c - ma_resampler_config config = ma_resampler_config_init( - ma_format_s16, - channels, - sampleRateIn, - sampleRateOut, - ma_resample_algorithm_linear); - - ma_resampler resampler; - ma_result result = ma_resampler_init(&config, &resampler); - if (result != MA_SUCCESS) { - // An error occurred... - } - ``` - -Do the following to uninitialize the resampler: - - ```c - ma_resampler_uninit(&resampler); - ``` - -The following example shows how data can be processed - - ```c - ma_uint64 frameCountIn = 1000; - ma_uint64 frameCountOut = 2000; - ma_result result = ma_resampler_process_pcm_frames(&resampler, pFramesIn, &frameCountIn, pFramesOut, &frameCountOut); - if (result != MA_SUCCESS) { - // An error occurred... - } - - // At this point, frameCountIn contains the number of input frames that were consumed and frameCountOut contains the - // number of output frames written. - ``` - -To initialize the resampler you first need to set up a config (`ma_resampler_config`) with -`ma_resampler_config_init()`. You need to specify the sample format you want to use, the number of -channels, the input and output sample rate, and the algorithm. - -The sample format can be either `ma_format_s16` or `ma_format_f32`. If you need a different format -you will need to perform pre- and post-conversions yourself where necessary. Note that the format -is the same for both input and output. The format cannot be changed after initialization. - -The resampler supports multiple channels and is always interleaved (both input and output). The -channel count cannot be changed after initialization. - -The sample rates can be anything other than zero, and are always specified in hertz. They should be -set to something like 44100, etc. The sample rate is the only configuration property that can be -changed after initialization. - -The miniaudio resampler has built-in support for the following algorithms: - - +-----------+------------------------------+ - | Algorithm | Enum Token | - +-----------+------------------------------+ - | Linear | ma_resample_algorithm_linear | - | Custom | ma_resample_algorithm_custom | - +-----------+------------------------------+ - -The algorithm cannot be changed after initialization. - -Processing always happens on a per PCM frame basis and always assumes interleaved input and output. -De-interleaved processing is not supported. To process frames, use -`ma_resampler_process_pcm_frames()`. On input, this function takes the number of output frames you -can fit in the output buffer and the number of input frames contained in the input buffer. On -output these variables contain the number of output frames that were written to the output buffer -and the number of input frames that were consumed in the process. You can pass in NULL for the -input buffer in which case it will be treated as an infinitely large buffer of zeros. The output -buffer can also be NULL, in which case the processing will be treated as seek. - -The sample rate can be changed dynamically on the fly. You can change this with explicit sample -rates with `ma_resampler_set_rate()` and also with a decimal ratio with -`ma_resampler_set_rate_ratio()`. The ratio is in/out. - -Sometimes it's useful to know exactly how many input frames will be required to output a specific -number of frames. You can calculate this with `ma_resampler_get_required_input_frame_count()`. -Likewise, it's sometimes useful to know exactly how many frames would be output given a certain -number of input frames. You can do this with `ma_resampler_get_expected_output_frame_count()`. - -Due to the nature of how resampling works, the resampler introduces some latency. This can be -retrieved in terms of both the input rate and the output rate with -`ma_resampler_get_input_latency()` and `ma_resampler_get_output_latency()`. - - -10.3.1. Resampling Algorithms ------------------------------ -The choice of resampling algorithm depends on your situation and requirements. - - -10.3.1.1. Linear Resampling ---------------------------- -The linear resampler is the fastest, but comes at the expense of poorer quality. There is, however, -some control over the quality of the linear resampler which may make it a suitable option depending -on your requirements. - -The linear resampler performs low-pass filtering before or after downsampling or upsampling, -depending on the sample rates you're converting between. When decreasing the sample rate, the -low-pass filter will be applied before downsampling. When increasing the rate it will be performed -after upsampling. By default a fourth order low-pass filter will be applied. This can be configured -via the `lpfOrder` configuration variable. Setting this to 0 will disable filtering. - -The low-pass filter has a cutoff frequency which defaults to half the sample rate of the lowest of -the input and output sample rates (Nyquist Frequency). - -The API for the linear resampler is the same as the main resampler API, only it's called -`ma_linear_resampler`. - - -10.3.2. Custom Resamplers -------------------------- -You can implement a custom resampler by using the `ma_resample_algorithm_custom` resampling -algorithm and setting a vtable in the resampler config: - - ```c - ma_resampler_config config = ma_resampler_config_init(..., ma_resample_algorithm_custom); - config.pBackendVTable = &g_customResamplerVTable; - ``` - -Custom resamplers are useful if the stock algorithms are not appropriate for your use case. You -need to implement the required functions in `ma_resampling_backend_vtable`. Note that not all -functions in the vtable need to be implemented, but if it's possible to implement, they should be. - -You can use the `ma_linear_resampler` object for an example on how to implement the vtable. The -`onGetHeapSize` callback is used to calculate the size of any internal heap allocation the custom -resampler will need to make given the supplied config. When you initialize the resampler via the -`onInit` callback, you'll be given a pointer to a heap allocation which is where you should store -the heap allocated data. You should not free this data in `onUninit` because miniaudio will manage -it for you. - -The `onProcess` callback is where the actual resampling takes place. On input, `pFrameCountIn` -points to a variable containing the number of frames in the `pFramesIn` buffer and -`pFrameCountOut` points to a variable containing the capacity in frames of the `pFramesOut` buffer. -On output, `pFrameCountIn` should be set to the number of input frames that were fully consumed, -whereas `pFrameCountOut` should be set to the number of frames that were written to `pFramesOut`. - -The `onSetRate` callback is optional and is used for dynamically changing the sample rate. If -dynamic rate changes are not supported, you can set this callback to NULL. - -The `onGetInputLatency` and `onGetOutputLatency` functions are used for retrieving the latency in -input and output rates respectively. These can be NULL in which case latency calculations will be -assumed to be NULL. - -The `onGetRequiredInputFrameCount` callback is used to give miniaudio a hint as to how many input -frames are required to be available to produce the given number of output frames. Likewise, the -`onGetExpectedOutputFrameCount` callback is used to determine how many output frames will be -produced given the specified number of input frames. miniaudio will use these as a hint, but they -are optional and can be set to NULL if you're unable to implement them. - - - -10.4. General Data Conversion ------------------------------ -The `ma_data_converter` API can be used to wrap sample format conversion, channel conversion and -resampling into one operation. This is what miniaudio uses internally to convert between the format -requested when the device was initialized and the format of the backend's native device. The API -for general data conversion is very similar to the resampling API. Create a `ma_data_converter` -object like this: - - ```c - ma_data_converter_config config = ma_data_converter_config_init( - inputFormat, - outputFormat, - inputChannels, - outputChannels, - inputSampleRate, - outputSampleRate - ); - - ma_data_converter converter; - ma_result result = ma_data_converter_init(&config, NULL, &converter); - if (result != MA_SUCCESS) { - // An error occurred... - } - ``` - -In the example above we use `ma_data_converter_config_init()` to initialize the config, however -there's many more properties that can be configured, such as channel maps and resampling quality. -Something like the following may be more suitable depending on your requirements: - - ```c - ma_data_converter_config config = ma_data_converter_config_init_default(); - config.formatIn = inputFormat; - config.formatOut = outputFormat; - config.channelsIn = inputChannels; - config.channelsOut = outputChannels; - config.sampleRateIn = inputSampleRate; - config.sampleRateOut = outputSampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_flac, config.channelMapIn, sizeof(config.channelMapIn)/sizeof(config.channelMapIn[0]), config.channelCountIn); - config.resampling.linear.lpfOrder = MA_MAX_FILTER_ORDER; - ``` - -Do the following to uninitialize the data converter: - - ```c - ma_data_converter_uninit(&converter, NULL); - ``` - -The following example shows how data can be processed - - ```c - ma_uint64 frameCountIn = 1000; - ma_uint64 frameCountOut = 2000; - ma_result result = ma_data_converter_process_pcm_frames(&converter, pFramesIn, &frameCountIn, pFramesOut, &frameCountOut); - if (result != MA_SUCCESS) { - // An error occurred... - } - - // At this point, frameCountIn contains the number of input frames that were consumed and frameCountOut contains the number - // of output frames written. - ``` - -The data converter supports multiple channels and is always interleaved (both input and output). -The channel count cannot be changed after initialization. - -Sample rates can be anything other than zero, and are always specified in hertz. They should be set -to something like 44100, etc. The sample rate is the only configuration property that can be -changed after initialization, but only if the `resampling.allowDynamicSampleRate` member of -`ma_data_converter_config` is set to `MA_TRUE`. To change the sample rate, use -`ma_data_converter_set_rate()` or `ma_data_converter_set_rate_ratio()`. The ratio must be in/out. -The resampling algorithm cannot be changed after initialization. - -Processing always happens on a per PCM frame basis and always assumes interleaved input and output. -De-interleaved processing is not supported. To process frames, use -`ma_data_converter_process_pcm_frames()`. On input, this function takes the number of output frames -you can fit in the output buffer and the number of input frames contained in the input buffer. On -output these variables contain the number of output frames that were written to the output buffer -and the number of input frames that were consumed in the process. You can pass in NULL for the -input buffer in which case it will be treated as an infinitely large -buffer of zeros. The output buffer can also be NULL, in which case the processing will be treated -as seek. - -Sometimes it's useful to know exactly how many input frames will be required to output a specific -number of frames. You can calculate this with `ma_data_converter_get_required_input_frame_count()`. -Likewise, it's sometimes useful to know exactly how many frames would be output given a certain -number of input frames. You can do this with `ma_data_converter_get_expected_output_frame_count()`. - -Due to the nature of how resampling works, the data converter introduces some latency if resampling -is required. This can be retrieved in terms of both the input rate and the output rate with -`ma_data_converter_get_input_latency()` and `ma_data_converter_get_output_latency()`. - - - -11. Filtering -============= - -11.1. Biquad Filtering ----------------------- -Biquad filtering is achieved with the `ma_biquad` API. Example: - - ```c - ma_biquad_config config = ma_biquad_config_init(ma_format_f32, channels, b0, b1, b2, a0, a1, a2); - ma_result result = ma_biquad_init(&config, &biquad); - if (result != MA_SUCCESS) { - // Error. - } - - ... - - ma_biquad_process_pcm_frames(&biquad, pFramesOut, pFramesIn, frameCount); - ``` - -Biquad filtering is implemented using transposed direct form 2. The numerator coefficients are b0, -b1 and b2, and the denominator coefficients are a0, a1 and a2. The a0 coefficient is required and -coefficients must not be pre-normalized. - -Supported formats are `ma_format_s16` and `ma_format_f32`. If you need to use a different format -you need to convert it yourself beforehand. When using `ma_format_s16` the biquad filter will use -fixed point arithmetic. When using `ma_format_f32`, floating point arithmetic will be used. - -Input and output frames are always interleaved. - -Filtering can be applied in-place by passing in the same pointer for both the input and output -buffers, like so: - - ```c - ma_biquad_process_pcm_frames(&biquad, pMyData, pMyData, frameCount); - ``` - -If you need to change the values of the coefficients, but maintain the values in the registers you -can do so with `ma_biquad_reinit()`. This is useful if you need to change the properties of the -filter while keeping the values of registers valid to avoid glitching. Do not use -`ma_biquad_init()` for this as it will do a full initialization which involves clearing the -registers to 0. Note that changing the format or channel count after initialization is invalid and -will result in an error. - - -11.2. Low-Pass Filtering ------------------------- -Low-pass filtering is achieved with the following APIs: - - +---------+------------------------------------------+ - | API | Description | - +---------+------------------------------------------+ - | ma_lpf1 | First order low-pass filter | - | ma_lpf2 | Second order low-pass filter | - | ma_lpf | High order low-pass filter (Butterworth) | - +---------+------------------------------------------+ - -Low-pass filter example: - - ```c - ma_lpf_config config = ma_lpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order); - ma_result result = ma_lpf_init(&config, &lpf); - if (result != MA_SUCCESS) { - // Error. - } - - ... - - ma_lpf_process_pcm_frames(&lpf, pFramesOut, pFramesIn, frameCount); - ``` - -Supported formats are `ma_format_s16` and` ma_format_f32`. If you need to use a different format -you need to convert it yourself beforehand. Input and output frames are always interleaved. - -Filtering can be applied in-place by passing in the same pointer for both the input and output -buffers, like so: - - ```c - ma_lpf_process_pcm_frames(&lpf, pMyData, pMyData, frameCount); - ``` - -The maximum filter order is limited to `MA_MAX_FILTER_ORDER` which is set to 8. If you need more, -you can chain first and second order filters together. - - ```c - for (iFilter = 0; iFilter < filterCount; iFilter += 1) { - ma_lpf2_process_pcm_frames(&lpf2[iFilter], pMyData, pMyData, frameCount); - } - ``` - -If you need to change the configuration of the filter, but need to maintain the state of internal -registers you can do so with `ma_lpf_reinit()`. This may be useful if you need to change the sample -rate and/or cutoff frequency dynamically while maintaing smooth transitions. Note that changing the -format or channel count after initialization is invalid and will result in an error. - -The `ma_lpf` object supports a configurable order, but if you only need a first order filter you -may want to consider using `ma_lpf1`. Likewise, if you only need a second order filter you can use -`ma_lpf2`. The advantage of this is that they're lighter weight and a bit more efficient. - -If an even filter order is specified, a series of second order filters will be processed in a -chain. If an odd filter order is specified, a first order filter will be applied, followed by a -series of second order filters in a chain. - - -11.3. High-Pass Filtering -------------------------- -High-pass filtering is achieved with the following APIs: - - +---------+-------------------------------------------+ - | API | Description | - +---------+-------------------------------------------+ - | ma_hpf1 | First order high-pass filter | - | ma_hpf2 | Second order high-pass filter | - | ma_hpf | High order high-pass filter (Butterworth) | - +---------+-------------------------------------------+ - -High-pass filters work exactly the same as low-pass filters, only the APIs are called `ma_hpf1`, -`ma_hpf2` and `ma_hpf`. See example code for low-pass filters for example usage. - - -11.4. Band-Pass Filtering -------------------------- -Band-pass filtering is achieved with the following APIs: - - +---------+-------------------------------+ - | API | Description | - +---------+-------------------------------+ - | ma_bpf2 | Second order band-pass filter | - | ma_bpf | High order band-pass filter | - +---------+-------------------------------+ - -Band-pass filters work exactly the same as low-pass filters, only the APIs are called `ma_bpf2` and -`ma_hpf`. See example code for low-pass filters for example usage. Note that the order for -band-pass filters must be an even number which means there is no first order band-pass filter, -unlike low-pass and high-pass filters. - - -11.5. Notch Filtering ---------------------- -Notch filtering is achieved with the following APIs: - - +-----------+------------------------------------------+ - | API | Description | - +-----------+------------------------------------------+ - | ma_notch2 | Second order notching filter | - +-----------+------------------------------------------+ - - -11.6. Peaking EQ Filtering -------------------------- -Peaking filtering is achieved with the following APIs: - - +----------+------------------------------------------+ - | API | Description | - +----------+------------------------------------------+ - | ma_peak2 | Second order peaking filter | - +----------+------------------------------------------+ - - -11.7. Low Shelf Filtering -------------------------- -Low shelf filtering is achieved with the following APIs: - - +-------------+------------------------------------------+ - | API | Description | - +-------------+------------------------------------------+ - | ma_loshelf2 | Second order low shelf filter | - +-------------+------------------------------------------+ - -Where a high-pass filter is used to eliminate lower frequencies, a low shelf filter can be used to -just turn them down rather than eliminate them entirely. - - -11.8. High Shelf Filtering --------------------------- -High shelf filtering is achieved with the following APIs: - - +-------------+------------------------------------------+ - | API | Description | - +-------------+------------------------------------------+ - | ma_hishelf2 | Second order high shelf filter | - +-------------+------------------------------------------+ - -The high shelf filter has the same API as the low shelf filter, only you would use `ma_hishelf` -instead of `ma_loshelf`. Where a low shelf filter is used to adjust the volume of low frequencies, -the high shelf filter does the same thing for high frequencies. - - - - -12. Waveform and Noise Generation -================================= - -12.1. Waveforms ---------------- -miniaudio supports generation of sine, square, triangle and sawtooth waveforms. This is achieved -with the `ma_waveform` API. Example: - - ```c - ma_waveform_config config = ma_waveform_config_init( - FORMAT, - CHANNELS, - SAMPLE_RATE, - ma_waveform_type_sine, - amplitude, - frequency); - - ma_waveform waveform; - ma_result result = ma_waveform_init(&config, &waveform); - if (result != MA_SUCCESS) { - // Error. - } - - ... - - ma_waveform_read_pcm_frames(&waveform, pOutput, frameCount); - ``` - -The amplitude, frequency, type, and sample rate can be changed dynamically with -`ma_waveform_set_amplitude()`, `ma_waveform_set_frequency()`, `ma_waveform_set_type()`, and -`ma_waveform_set_sample_rate()` respectively. - -You can invert the waveform by setting the amplitude to a negative value. You can use this to -control whether or not a sawtooth has a positive or negative ramp, for example. - -Below are the supported waveform types: - - +---------------------------+ - | Enum Name | - +---------------------------+ - | ma_waveform_type_sine | - | ma_waveform_type_square | - | ma_waveform_type_triangle | - | ma_waveform_type_sawtooth | - +---------------------------+ - - - -12.2. Noise ------------ -miniaudio supports generation of white, pink and Brownian noise via the `ma_noise` API. Example: - - ```c - ma_noise_config config = ma_noise_config_init( - FORMAT, - CHANNELS, - ma_noise_type_white, - SEED, - amplitude); - - ma_noise noise; - ma_result result = ma_noise_init(&config, &noise); - if (result != MA_SUCCESS) { - // Error. - } - - ... - - ma_noise_read_pcm_frames(&noise, pOutput, frameCount); - ``` - -The noise API uses simple LCG random number generation. It supports a custom seed which is useful -for things like automated testing requiring reproducibility. Setting the seed to zero will default -to `MA_DEFAULT_LCG_SEED`. - -The amplitude, seed, and type can be changed dynamically with `ma_noise_set_amplitude()`, -`ma_noise_set_seed()`, and `ma_noise_set_type()` respectively. - -By default, the noise API will use different values for different channels. So, for example, the -left side in a stereo stream will be different to the right side. To instead have each channel use -the same random value, set the `duplicateChannels` member of the noise config to true, like so: - - ```c - config.duplicateChannels = MA_TRUE; - ``` - -Below are the supported noise types. - - +------------------------+ - | Enum Name | - +------------------------+ - | ma_noise_type_white | - | ma_noise_type_pink | - | ma_noise_type_brownian | - +------------------------+ - - - -13. Audio Buffers -================= -miniaudio supports reading from a buffer of raw audio data via the `ma_audio_buffer` API. This can -read from memory that's managed by the application, but can also handle the memory management for -you internally. Memory management is flexible and should support most use cases. - -Audio buffers are initialised using the standard configuration system used everywhere in miniaudio: - - ```c - ma_audio_buffer_config config = ma_audio_buffer_config_init( - format, - channels, - sizeInFrames, - pExistingData, - &allocationCallbacks); - - ma_audio_buffer buffer; - result = ma_audio_buffer_init(&config, &buffer); - if (result != MA_SUCCESS) { - // Error. - } - - ... - - ma_audio_buffer_uninit(&buffer); - ``` - -In the example above, the memory pointed to by `pExistingData` will *not* be copied and is how an -application can do self-managed memory allocation. If you would rather make a copy of the data, use -`ma_audio_buffer_init_copy()`. To uninitialize the buffer, use `ma_audio_buffer_uninit()`. - -Sometimes it can be convenient to allocate the memory for the `ma_audio_buffer` structure and the -raw audio data in a contiguous block of memory. That is, the raw audio data will be located -immediately after the `ma_audio_buffer` structure. To do this, use -`ma_audio_buffer_alloc_and_init()`: - - ```c - ma_audio_buffer_config config = ma_audio_buffer_config_init( - format, - channels, - sizeInFrames, - pExistingData, - &allocationCallbacks); - - ma_audio_buffer* pBuffer - result = ma_audio_buffer_alloc_and_init(&config, &pBuffer); - if (result != MA_SUCCESS) { - // Error - } - - ... - - ma_audio_buffer_uninit_and_free(&buffer); - ``` - -If you initialize the buffer with `ma_audio_buffer_alloc_and_init()` you should uninitialize it -with `ma_audio_buffer_uninit_and_free()`. In the example above, the memory pointed to by -`pExistingData` will be copied into the buffer, which is contrary to the behavior of -`ma_audio_buffer_init()`. - -An audio buffer has a playback cursor just like a decoder. As you read frames from the buffer, the -cursor moves forward. The last parameter (`loop`) can be used to determine if the buffer should -loop. The return value is the number of frames actually read. If this is less than the number of -frames requested it means the end has been reached. This should never happen if the `loop` -parameter is set to true. If you want to manually loop back to the start, you can do so with with -`ma_audio_buffer_seek_to_pcm_frame(pAudioBuffer, 0)`. Below is an example for reading data from an -audio buffer. - - ```c - ma_uint64 framesRead = ma_audio_buffer_read_pcm_frames(pAudioBuffer, pFramesOut, desiredFrameCount, isLooping); - if (framesRead < desiredFrameCount) { - // If not looping, this means the end has been reached. This should never happen in looping mode with valid input. - } - ``` - -Sometimes you may want to avoid the cost of data movement between the internal buffer and the -output buffer. Instead you can use memory mapping to retrieve a pointer to a segment of data: - - ```c - void* pMappedFrames; - ma_uint64 frameCount = frameCountToTryMapping; - ma_result result = ma_audio_buffer_map(pAudioBuffer, &pMappedFrames, &frameCount); - if (result == MA_SUCCESS) { - // Map was successful. The value in frameCount will be how many frames were _actually_ mapped, which may be - // less due to the end of the buffer being reached. - ma_copy_pcm_frames(pFramesOut, pMappedFrames, frameCount, pAudioBuffer->format, pAudioBuffer->channels); - - // You must unmap the buffer. - ma_audio_buffer_unmap(pAudioBuffer, frameCount); - } - ``` - -When you use memory mapping, the read cursor is increment by the frame count passed in to -`ma_audio_buffer_unmap()`. If you decide not to process every frame you can pass in a value smaller -than the value returned by `ma_audio_buffer_map()`. The disadvantage to using memory mapping is -that it does not handle looping for you. You can determine if the buffer is at the end for the -purpose of looping with `ma_audio_buffer_at_end()` or by inspecting the return value of -`ma_audio_buffer_unmap()` and checking if it equals `MA_AT_END`. You should not treat `MA_AT_END` -as an error when returned by `ma_audio_buffer_unmap()`. - - - -14. Ring Buffers -================ -miniaudio supports lock free (single producer, single consumer) ring buffers which are exposed via -the `ma_rb` and `ma_pcm_rb` APIs. The `ma_rb` API operates on bytes, whereas the `ma_pcm_rb` -operates on PCM frames. They are otherwise identical as `ma_pcm_rb` is just a wrapper around -`ma_rb`. - -Unlike most other APIs in miniaudio, ring buffers support both interleaved and deinterleaved -streams. The caller can also allocate their own backing memory for the ring buffer to use -internally for added flexibility. Otherwise the ring buffer will manage it's internal memory for -you. - -The examples below use the PCM frame variant of the ring buffer since that's most likely the one -you will want to use. To initialize a ring buffer, do something like the following: - - ```c - ma_pcm_rb rb; - ma_result result = ma_pcm_rb_init(FORMAT, CHANNELS, BUFFER_SIZE_IN_FRAMES, NULL, NULL, &rb); - if (result != MA_SUCCESS) { - // Error - } - ``` - -The `ma_pcm_rb_init()` function takes the sample format and channel count as parameters because -it's the PCM varient of the ring buffer API. For the regular ring buffer that operates on bytes you -would call `ma_rb_init()` which leaves these out and just takes the size of the buffer in bytes -instead of frames. The fourth parameter is an optional pre-allocated buffer and the fifth parameter -is a pointer to a `ma_allocation_callbacks` structure for custom memory allocation routines. -Passing in `NULL` for this results in `MA_MALLOC()` and `MA_FREE()` being used. - -Use `ma_pcm_rb_init_ex()` if you need a deinterleaved buffer. The data for each sub-buffer is -offset from each other based on the stride. To manage your sub-buffers you can use -`ma_pcm_rb_get_subbuffer_stride()`, `ma_pcm_rb_get_subbuffer_offset()` and -`ma_pcm_rb_get_subbuffer_ptr()`. - -Use `ma_pcm_rb_acquire_read()` and `ma_pcm_rb_acquire_write()` to retrieve a pointer to a section -of the ring buffer. You specify the number of frames you need, and on output it will set to what -was actually acquired. If the read or write pointer is positioned such that the number of frames -requested will require a loop, it will be clamped to the end of the buffer. Therefore, the number -of frames you're given may be less than the number you requested. - -After calling `ma_pcm_rb_acquire_read()` or `ma_pcm_rb_acquire_write()`, you do your work on the -buffer and then "commit" it with `ma_pcm_rb_commit_read()` or `ma_pcm_rb_commit_write()`. This is -where the read/write pointers are updated. When you commit you need to pass in the buffer that was -returned by the earlier call to `ma_pcm_rb_acquire_read()` or `ma_pcm_rb_acquire_write()` and is -only used for validation. The number of frames passed to `ma_pcm_rb_commit_read()` and -`ma_pcm_rb_commit_write()` is what's used to increment the pointers, and can be less that what was -originally requested. - -If you want to correct for drift between the write pointer and the read pointer you can use a -combination of `ma_pcm_rb_pointer_distance()`, `ma_pcm_rb_seek_read()` and -`ma_pcm_rb_seek_write()`. Note that you can only move the pointers forward, and you should only -move the read pointer forward via the consumer thread, and the write pointer forward by the -producer thread. If there is too much space between the pointers, move the read pointer forward. If -there is too little space between the pointers, move the write pointer forward. - -You can use a ring buffer at the byte level instead of the PCM frame level by using the `ma_rb` -API. This is exactly the same, only you will use the `ma_rb` functions instead of `ma_pcm_rb` and -instead of frame counts you will pass around byte counts. - -The maximum size of the buffer in bytes is `0x7FFFFFFF-(MA_SIMD_ALIGNMENT-1)` due to the most -significant bit being used to encode a loop flag and the internally managed buffers always being -aligned to `MA_SIMD_ALIGNMENT`. - -Note that the ring buffer is only thread safe when used by a single consumer thread and single -producer thread. - - - -15. Backends -============ -The following backends are supported by miniaudio. - - +-------------+-----------------------+--------------------------------------------------------+ - | Name | Enum Name | Supported Operating Systems | - +-------------+-----------------------+--------------------------------------------------------+ - | WASAPI | ma_backend_wasapi | Windows Vista+ | - | DirectSound | ma_backend_dsound | Windows XP+ | - | WinMM | ma_backend_winmm | Windows XP+ (may work on older versions, but untested) | - | Core Audio | ma_backend_coreaudio | macOS, iOS | - | ALSA | ma_backend_alsa | Linux | - | PulseAudio | ma_backend_pulseaudio | Cross Platform (disabled on Windows, BSD and Android) | - | JACK | ma_backend_jack | Cross Platform (disabled on BSD and Android) | - | sndio | ma_backend_sndio | OpenBSD | - | audio(4) | ma_backend_audio4 | NetBSD, OpenBSD | - | OSS | ma_backend_oss | FreeBSD | - | AAudio | ma_backend_aaudio | Android 8+ | - | OpenSL ES | ma_backend_opensl | Android (API level 16+) | - | Web Audio | ma_backend_webaudio | Web (via Emscripten) | - | Custom | ma_backend_custom | Cross Platform | - | Null | ma_backend_null | Cross Platform (not used on Web) | - +-------------+-----------------------+--------------------------------------------------------+ - -Some backends have some nuance details you may want to be aware of. - -15.1. WASAPI ------------- -- Low-latency shared mode will be disabled when using an application-defined sample rate which is - different to the device's native sample rate. To work around this, set `wasapi.noAutoConvertSRC` - to true in the device config. This is due to IAudioClient3_InitializeSharedAudioStream() failing - when the `AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM` flag is specified. Setting wasapi.noAutoConvertSRC - will result in miniaudio's internal resampler being used instead which will in turn enable the - use of low-latency shared mode. - -15.2. PulseAudio ----------------- -- If you experience bad glitching/noise on Arch Linux, consider this fix from the Arch wiki: - https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Glitches,_skips_or_crackling. - Alternatively, consider using a different backend such as ALSA. - -15.3. Android -------------- -- To capture audio on Android, remember to add the RECORD_AUDIO permission to your manifest: - `` -- With OpenSL|ES, only a single ma_context can be active at any given time. This is due to a - limitation with OpenSL|ES. -- With AAudio, only default devices are enumerated. This is due to AAudio not having an enumeration - API (devices are enumerated through Java). You can however perform your own device enumeration - through Java and then set the ID in the ma_device_id structure (ma_device_id.aaudio) and pass it - to ma_device_init(). -- The backend API will perform resampling where possible. The reason for this as opposed to using - miniaudio's built-in resampler is to take advantage of any potential device-specific - optimizations the driver may implement. - -15.4. UWP ---------- -- UWP only supports default playback and capture devices. -- UWP requires the Microphone capability to be enabled in the application's manifest (Package.appxmanifest): - - ``` - - ... - - - - - ``` - -15.5. Web Audio / Emscripten ----------------------------- -- You cannot use `-std=c*` compiler flags, nor `-ansi`. This only applies to the Emscripten build. -- The first time a context is initialized it will create a global object called "miniaudio" whose - primary purpose is to act as a factory for device objects. -- Currently the Web Audio backend uses ScriptProcessorNode's, but this may need to change later as - they've been deprecated. -- Google has implemented a policy in their browsers that prevent automatic media output without - first receiving some kind of user input. The following web page has additional details: - https://developers.google.com/web/updates/2017/09/autoplay-policy-changes. Starting the device - may fail if you try to start playback without first handling some kind of user input. - - - -16. Optimization Tips -===================== - -16.1. High Level API --------------------- -- If a sound does not require doppler or pitch shifting, consider disabling pitching by - initializing the sound with the `MA_SOUND_FLAG_NO_PITCH` flag. -- If a sound does not require spatialization, disable it by initialzing the sound with the - `MA_SOUND_FLAG_NO_SPATIALIZATION` flag. It can be renabled again post-initialization with - `ma_sound_set_spatialization_enabled()`. - - - -17. Miscellaneous Notes -======================= -- Automatic stream routing is enabled on a per-backend basis. Support is explicitly enabled for - WASAPI and Core Audio, however other backends such as PulseAudio may naturally support it, though - not all have been tested. -- The contents of the output buffer passed into the data callback will always be pre-initialized to - silence unless the `noPreSilencedOutputBuffer` config variable in `ma_device_config` is set to - true, in which case it'll be undefined which will require you to write something to the entire - buffer. -- By default miniaudio will automatically clip samples. This only applies when the playback sample - format is configured as `ma_format_f32`. If you are doing clipping yourself, you can disable this - overhead by setting `noClip` to true in the device config. -- Note that GCC and Clang requires `-msse2`, `-mavx2`, etc. for SIMD optimizations. -- The sndio backend is currently only enabled on OpenBSD builds. -- The audio(4) backend is supported on OpenBSD, but you may need to disable sndiod before you can - use it. -- When compiling with VC6 and earlier, decoding is restricted to files less than 2GB in size. This - is due to 64-bit file APIs not being available. -*/ - -#ifndef miniaudio_h -#define miniaudio_h - -#ifdef __cplusplus -extern "C" { -#endif - -#define MA_STRINGIFY(x) #x -#define MA_XSTRINGIFY(x) MA_STRINGIFY(x) - -#define MA_VERSION_MAJOR 0 -#define MA_VERSION_MINOR 11 -#define MA_VERSION_REVISION 9 -#define MA_VERSION_STRING MA_XSTRINGIFY(MA_VERSION_MAJOR) "." MA_XSTRINGIFY(MA_VERSION_MINOR) "." MA_XSTRINGIFY(MA_VERSION_REVISION) - -#if defined(_MSC_VER) && !defined(__clang__) - #pragma warning(push) - #pragma warning(disable:4201) /* nonstandard extension used: nameless struct/union */ - #pragma warning(disable:4214) /* nonstandard extension used: bit field types other than int */ - #pragma warning(disable:4324) /* structure was padded due to alignment specifier */ -#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpedantic" /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */ - #if defined(__clang__) - #pragma GCC diagnostic ignored "-Wc11-extensions" /* anonymous unions are a C11 extension */ - #endif -#endif - - - -#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__) - #define MA_SIZEOF_PTR 8 -#else - #define MA_SIZEOF_PTR 4 -#endif - -#include /* For size_t. */ - -/* Sized types. */ -#if defined(MA_USE_STDINT) - #include - typedef int8_t ma_int8; - typedef uint8_t ma_uint8; - typedef int16_t ma_int16; - typedef uint16_t ma_uint16; - typedef int32_t ma_int32; - typedef uint32_t ma_uint32; - typedef int64_t ma_int64; - typedef uint64_t ma_uint64; -#else - typedef signed char ma_int8; - typedef unsigned char ma_uint8; - typedef signed short ma_int16; - typedef unsigned short ma_uint16; - typedef signed int ma_int32; - typedef unsigned int ma_uint32; - #if defined(_MSC_VER) && !defined(__clang__) - typedef signed __int64 ma_int64; - typedef unsigned __int64 ma_uint64; - #else - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wlong-long" - #if defined(__clang__) - #pragma GCC diagnostic ignored "-Wc++11-long-long" - #endif - #endif - typedef signed long long ma_int64; - typedef unsigned long long ma_uint64; - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic pop - #endif - #endif -#endif /* MA_USE_STDINT */ - -#if MA_SIZEOF_PTR == 8 - typedef ma_uint64 ma_uintptr; -#else - typedef ma_uint32 ma_uintptr; -#endif - -typedef ma_uint8 ma_bool8; -typedef ma_uint32 ma_bool32; -#define MA_TRUE 1 -#define MA_FALSE 0 - -typedef void* ma_handle; -typedef void* ma_ptr; -typedef void (* ma_proc)(void); - -#if defined(_MSC_VER) && !defined(_WCHAR_T_DEFINED) -typedef ma_uint16 wchar_t; -#endif - -/* Define NULL for some compilers. */ -#ifndef NULL -#define NULL 0 -#endif - -#if defined(SIZE_MAX) - #define MA_SIZE_MAX SIZE_MAX -#else - #define MA_SIZE_MAX 0xFFFFFFFF /* When SIZE_MAX is not defined by the standard library just default to the maximum 32-bit unsigned integer. */ -#endif - - -/* Platform/backend detection. */ -#ifdef _WIN32 - #define MA_WIN32 - #if defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_PC_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) || (defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)) - #define MA_WIN32_UWP - #elif defined(WINAPI_FAMILY) && (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES) - #define MA_WIN32_GDK - #else - #define MA_WIN32_DESKTOP - #endif -#else - #define MA_POSIX - - /* - Use the MA_NO_PTHREAD_IN_HEADER option at your own risk. This is intentionally undocumented. - You can use this to avoid including pthread.h in the header section. The downside is that it - results in some fixed sized structures being declared for the various types that are used in - miniaudio. The risk here is that these types might be too small for a given platform. This - risk is yours to take and no support will be offered if you enable this option. - */ - #ifndef MA_NO_PTHREAD_IN_HEADER - #include /* Unfortunate #include, but needed for pthread_t, pthread_mutex_t and pthread_cond_t types. */ - typedef pthread_t ma_pthread_t; - typedef pthread_mutex_t ma_pthread_mutex_t; - typedef pthread_cond_t ma_pthread_cond_t; - #else - typedef ma_uintptr ma_pthread_t; - typedef union ma_pthread_mutex_t { char __data[40]; ma_uint64 __alignment; } ma_pthread_mutex_t; - typedef union ma_pthread_cond_t { char __data[48]; ma_uint64 __alignment; } ma_pthread_cond_t; - #endif - - #ifdef __unix__ - #define MA_UNIX - #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) - #define MA_BSD - #endif - #endif - #ifdef __linux__ - #define MA_LINUX - #endif - #ifdef __APPLE__ - #define MA_APPLE - #endif - #ifdef __ANDROID__ - #define MA_ANDROID - #endif - #ifdef __EMSCRIPTEN__ - #define MA_EMSCRIPTEN - #endif -#endif - - -#ifdef _MSC_VER - #define MA_INLINE __forceinline -#elif defined(__GNUC__) - /* - I've had a bug report where GCC is emitting warnings about functions possibly not being inlineable. This warning happens when - the __attribute__((always_inline)) attribute is defined without an "inline" statement. I think therefore there must be some - case where "__inline__" is not always defined, thus the compiler emitting these warnings. When using -std=c89 or -ansi on the - command line, we cannot use the "inline" keyword and instead need to use "__inline__". In an attempt to work around this issue - I am using "__inline__" only when we're compiling in strict ANSI mode. - */ - #if defined(__STRICT_ANSI__) - #define MA_GNUC_INLINE_HINT __inline__ - #else - #define MA_GNUC_INLINE_HINT inline - #endif - - #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__) - #define MA_INLINE MA_GNUC_INLINE_HINT __attribute__((always_inline)) - #else - #define MA_INLINE MA_GNUC_INLINE_HINT - #endif -#elif defined(__WATCOMC__) - #define MA_INLINE __inline -#else - #define MA_INLINE -#endif - -#if !defined(MA_API) - #if defined(MA_DLL) - #if defined(_WIN32) - #define MA_DLL_IMPORT __declspec(dllimport) - #define MA_DLL_EXPORT __declspec(dllexport) - #define MA_DLL_PRIVATE static - #else - #if defined(__GNUC__) && __GNUC__ >= 4 - #define MA_DLL_IMPORT __attribute__((visibility("default"))) - #define MA_DLL_EXPORT __attribute__((visibility("default"))) - #define MA_DLL_PRIVATE __attribute__((visibility("hidden"))) - #else - #define MA_DLL_IMPORT - #define MA_DLL_EXPORT - #define MA_DLL_PRIVATE static - #endif - #endif - - #if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION) - #define MA_API MA_DLL_EXPORT - #else - #define MA_API MA_DLL_IMPORT - #endif - #define MA_PRIVATE MA_DLL_PRIVATE - #else - #define MA_API extern - #define MA_PRIVATE static - #endif -#endif - -/* SIMD alignment in bytes. Currently set to 32 bytes in preparation for future AVX optimizations. */ -#define MA_SIMD_ALIGNMENT 32 - - -/* -Logging Levels -============== -Log levels are only used to give logging callbacks some context as to the severity of a log message -so they can do filtering. All log levels will be posted to registered logging callbacks. If you -don't want to output a certain log level you can discriminate against the log level in the callback. - -MA_LOG_LEVEL_DEBUG - Used for debugging. Useful for debug and test builds, but should be disabled in release builds. - -MA_LOG_LEVEL_INFO - Informational logging. Useful for debugging. This will never be called from within the data - callback. - -MA_LOG_LEVEL_WARNING - Warnings. You should enable this in you development builds and action them when encounted. These - logs usually indicate a potential problem or misconfiguration, but still allow you to keep - running. This will never be called from within the data callback. - -MA_LOG_LEVEL_ERROR - Error logging. This will be fired when an operation fails and is subsequently aborted. This can - be fired from within the data callback, in which case the device will be stopped. You should - always have this log level enabled. -*/ -typedef enum -{ - MA_LOG_LEVEL_DEBUG = 4, - MA_LOG_LEVEL_INFO = 3, - MA_LOG_LEVEL_WARNING = 2, - MA_LOG_LEVEL_ERROR = 1 -} ma_log_level; - -/* -Variables needing to be accessed atomically should be declared with this macro for two reasons: - - 1) It allows people who read the code to identify a variable as such; and - 2) It forces alignment on platforms where it's required or optimal. - -Note that for x86/64, alignment is not strictly necessary, but does have some performance -implications. Where supported by the compiler, alignment will be used, but otherwise if the CPU -architecture does not require it, it will simply leave it unaligned. This is the case with old -versions of Visual Studio, which I've confirmed with at least VC6. -*/ -#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) - #include - #define MA_ATOMIC(alignment, type) alignas(alignment) type -#else - #if defined(__GNUC__) - /* GCC-style compilers. */ - #define MA_ATOMIC(alignment, type) type __attribute__((aligned(alignment))) - #elif defined(_MSC_VER) && _MSC_VER > 1200 /* 1200 = VC6. Alignment not supported, but not necessary because x86 is the only supported target. */ - /* MSVC. */ - #define MA_ATOMIC(alignment, type) __declspec(align(alignment)) type - #else - /* Other compilers. */ - #define MA_ATOMIC(alignment, type) type - #endif -#endif - -typedef struct ma_context ma_context; -typedef struct ma_device ma_device; - -typedef ma_uint8 ma_channel; -typedef enum -{ - MA_CHANNEL_NONE = 0, - MA_CHANNEL_MONO = 1, - MA_CHANNEL_FRONT_LEFT = 2, - MA_CHANNEL_FRONT_RIGHT = 3, - MA_CHANNEL_FRONT_CENTER = 4, - MA_CHANNEL_LFE = 5, - MA_CHANNEL_BACK_LEFT = 6, - MA_CHANNEL_BACK_RIGHT = 7, - MA_CHANNEL_FRONT_LEFT_CENTER = 8, - MA_CHANNEL_FRONT_RIGHT_CENTER = 9, - MA_CHANNEL_BACK_CENTER = 10, - MA_CHANNEL_SIDE_LEFT = 11, - MA_CHANNEL_SIDE_RIGHT = 12, - MA_CHANNEL_TOP_CENTER = 13, - MA_CHANNEL_TOP_FRONT_LEFT = 14, - MA_CHANNEL_TOP_FRONT_CENTER = 15, - MA_CHANNEL_TOP_FRONT_RIGHT = 16, - MA_CHANNEL_TOP_BACK_LEFT = 17, - MA_CHANNEL_TOP_BACK_CENTER = 18, - MA_CHANNEL_TOP_BACK_RIGHT = 19, - MA_CHANNEL_AUX_0 = 20, - MA_CHANNEL_AUX_1 = 21, - MA_CHANNEL_AUX_2 = 22, - MA_CHANNEL_AUX_3 = 23, - MA_CHANNEL_AUX_4 = 24, - MA_CHANNEL_AUX_5 = 25, - MA_CHANNEL_AUX_6 = 26, - MA_CHANNEL_AUX_7 = 27, - MA_CHANNEL_AUX_8 = 28, - MA_CHANNEL_AUX_9 = 29, - MA_CHANNEL_AUX_10 = 30, - MA_CHANNEL_AUX_11 = 31, - MA_CHANNEL_AUX_12 = 32, - MA_CHANNEL_AUX_13 = 33, - MA_CHANNEL_AUX_14 = 34, - MA_CHANNEL_AUX_15 = 35, - MA_CHANNEL_AUX_16 = 36, - MA_CHANNEL_AUX_17 = 37, - MA_CHANNEL_AUX_18 = 38, - MA_CHANNEL_AUX_19 = 39, - MA_CHANNEL_AUX_20 = 40, - MA_CHANNEL_AUX_21 = 41, - MA_CHANNEL_AUX_22 = 42, - MA_CHANNEL_AUX_23 = 43, - MA_CHANNEL_AUX_24 = 44, - MA_CHANNEL_AUX_25 = 45, - MA_CHANNEL_AUX_26 = 46, - MA_CHANNEL_AUX_27 = 47, - MA_CHANNEL_AUX_28 = 48, - MA_CHANNEL_AUX_29 = 49, - MA_CHANNEL_AUX_30 = 50, - MA_CHANNEL_AUX_31 = 51, - MA_CHANNEL_LEFT = MA_CHANNEL_FRONT_LEFT, - MA_CHANNEL_RIGHT = MA_CHANNEL_FRONT_RIGHT, - MA_CHANNEL_POSITION_COUNT = (MA_CHANNEL_AUX_31 + 1) -} _ma_channel_position; /* Do not use `_ma_channel_position` directly. Use `ma_channel` instead. */ - -typedef enum -{ - MA_SUCCESS = 0, - MA_ERROR = -1, /* A generic error. */ - MA_INVALID_ARGS = -2, - MA_INVALID_OPERATION = -3, - MA_OUT_OF_MEMORY = -4, - MA_OUT_OF_RANGE = -5, - MA_ACCESS_DENIED = -6, - MA_DOES_NOT_EXIST = -7, - MA_ALREADY_EXISTS = -8, - MA_TOO_MANY_OPEN_FILES = -9, - MA_INVALID_FILE = -10, - MA_TOO_BIG = -11, - MA_PATH_TOO_LONG = -12, - MA_NAME_TOO_LONG = -13, - MA_NOT_DIRECTORY = -14, - MA_IS_DIRECTORY = -15, - MA_DIRECTORY_NOT_EMPTY = -16, - MA_AT_END = -17, - MA_NO_SPACE = -18, - MA_BUSY = -19, - MA_IO_ERROR = -20, - MA_INTERRUPT = -21, - MA_UNAVAILABLE = -22, - MA_ALREADY_IN_USE = -23, - MA_BAD_ADDRESS = -24, - MA_BAD_SEEK = -25, - MA_BAD_PIPE = -26, - MA_DEADLOCK = -27, - MA_TOO_MANY_LINKS = -28, - MA_NOT_IMPLEMENTED = -29, - MA_NO_MESSAGE = -30, - MA_BAD_MESSAGE = -31, - MA_NO_DATA_AVAILABLE = -32, - MA_INVALID_DATA = -33, - MA_TIMEOUT = -34, - MA_NO_NETWORK = -35, - MA_NOT_UNIQUE = -36, - MA_NOT_SOCKET = -37, - MA_NO_ADDRESS = -38, - MA_BAD_PROTOCOL = -39, - MA_PROTOCOL_UNAVAILABLE = -40, - MA_PROTOCOL_NOT_SUPPORTED = -41, - MA_PROTOCOL_FAMILY_NOT_SUPPORTED = -42, - MA_ADDRESS_FAMILY_NOT_SUPPORTED = -43, - MA_SOCKET_NOT_SUPPORTED = -44, - MA_CONNECTION_RESET = -45, - MA_ALREADY_CONNECTED = -46, - MA_NOT_CONNECTED = -47, - MA_CONNECTION_REFUSED = -48, - MA_NO_HOST = -49, - MA_IN_PROGRESS = -50, - MA_CANCELLED = -51, - MA_MEMORY_ALREADY_MAPPED = -52, - - /* General miniaudio-specific errors. */ - MA_FORMAT_NOT_SUPPORTED = -100, - MA_DEVICE_TYPE_NOT_SUPPORTED = -101, - MA_SHARE_MODE_NOT_SUPPORTED = -102, - MA_NO_BACKEND = -103, - MA_NO_DEVICE = -104, - MA_API_NOT_FOUND = -105, - MA_INVALID_DEVICE_CONFIG = -106, - MA_LOOP = -107, - - /* State errors. */ - MA_DEVICE_NOT_INITIALIZED = -200, - MA_DEVICE_ALREADY_INITIALIZED = -201, - MA_DEVICE_NOT_STARTED = -202, - MA_DEVICE_NOT_STOPPED = -203, - - /* Operation errors. */ - MA_FAILED_TO_INIT_BACKEND = -300, - MA_FAILED_TO_OPEN_BACKEND_DEVICE = -301, - MA_FAILED_TO_START_BACKEND_DEVICE = -302, - MA_FAILED_TO_STOP_BACKEND_DEVICE = -303 -} ma_result; - - -#define MA_MIN_CHANNELS 1 -#ifndef MA_MAX_CHANNELS -#define MA_MAX_CHANNELS 254 -#endif - -#ifndef MA_MAX_FILTER_ORDER -#define MA_MAX_FILTER_ORDER 8 -#endif - -typedef enum -{ - ma_stream_format_pcm = 0 -} ma_stream_format; - -typedef enum -{ - ma_stream_layout_interleaved = 0, - ma_stream_layout_deinterleaved -} ma_stream_layout; - -typedef enum -{ - ma_dither_mode_none = 0, - ma_dither_mode_rectangle, - ma_dither_mode_triangle -} ma_dither_mode; - -typedef enum -{ - /* - I like to keep these explicitly defined because they're used as a key into a lookup table. When items are - added to this, make sure there are no gaps and that they're added to the lookup table in ma_get_bytes_per_sample(). - */ - ma_format_unknown = 0, /* Mainly used for indicating an error, but also used as the default for the output format for decoders. */ - ma_format_u8 = 1, - ma_format_s16 = 2, /* Seems to be the most widely supported format. */ - ma_format_s24 = 3, /* Tightly packed. 3 bytes per sample. */ - ma_format_s32 = 4, - ma_format_f32 = 5, - ma_format_count -} ma_format; - -typedef enum -{ - /* Standard rates need to be in priority order. */ - ma_standard_sample_rate_48000 = 48000, /* Most common */ - ma_standard_sample_rate_44100 = 44100, - - ma_standard_sample_rate_32000 = 32000, /* Lows */ - ma_standard_sample_rate_24000 = 24000, - ma_standard_sample_rate_22050 = 22050, - - ma_standard_sample_rate_88200 = 88200, /* Highs */ - ma_standard_sample_rate_96000 = 96000, - ma_standard_sample_rate_176400 = 176400, - ma_standard_sample_rate_192000 = 192000, - - ma_standard_sample_rate_16000 = 16000, /* Extreme lows */ - ma_standard_sample_rate_11025 = 11250, - ma_standard_sample_rate_8000 = 8000, - - ma_standard_sample_rate_352800 = 352800, /* Extreme highs */ - ma_standard_sample_rate_384000 = 384000, - - ma_standard_sample_rate_min = ma_standard_sample_rate_8000, - ma_standard_sample_rate_max = ma_standard_sample_rate_384000, - ma_standard_sample_rate_count = 14 /* Need to maintain the count manually. Make sure this is updated if items are added to enum. */ -} ma_standard_sample_rate; - - -typedef enum -{ - ma_channel_mix_mode_rectangular = 0, /* Simple averaging based on the plane(s) the channel is sitting on. */ - ma_channel_mix_mode_simple, /* Drop excess channels; zeroed out extra channels. */ - ma_channel_mix_mode_custom_weights, /* Use custom weights specified in ma_channel_router_config. */ - ma_channel_mix_mode_default = ma_channel_mix_mode_rectangular -} ma_channel_mix_mode; - -typedef enum -{ - ma_standard_channel_map_microsoft, - ma_standard_channel_map_alsa, - ma_standard_channel_map_rfc3551, /* Based off AIFF. */ - ma_standard_channel_map_flac, - ma_standard_channel_map_vorbis, - ma_standard_channel_map_sound4, /* FreeBSD's sound(4). */ - ma_standard_channel_map_sndio, /* www.sndio.org/tips.html */ - ma_standard_channel_map_webaudio = ma_standard_channel_map_flac, /* https://webaudio.github.io/web-audio-api/#ChannelOrdering. Only 1, 2, 4 and 6 channels are defined, but can fill in the gaps with logical assumptions. */ - ma_standard_channel_map_default = ma_standard_channel_map_microsoft -} ma_standard_channel_map; - -typedef enum -{ - ma_performance_profile_low_latency = 0, - ma_performance_profile_conservative -} ma_performance_profile; - - -typedef struct -{ - void* pUserData; - void* (* onMalloc)(size_t sz, void* pUserData); - void* (* onRealloc)(void* p, size_t sz, void* pUserData); - void (* onFree)(void* p, void* pUserData); -} ma_allocation_callbacks; - -typedef struct -{ - ma_int32 state; -} ma_lcg; - - -/* Spinlocks are 32-bit for compatibility reasons. */ -typedef ma_uint32 ma_spinlock; - -#ifndef MA_NO_THREADING -/* Thread priorities should be ordered such that the default priority of the worker thread is 0. */ -typedef enum -{ - ma_thread_priority_idle = -5, - ma_thread_priority_lowest = -4, - ma_thread_priority_low = -3, - ma_thread_priority_normal = -2, - ma_thread_priority_high = -1, - ma_thread_priority_highest = 0, - ma_thread_priority_realtime = 1, - ma_thread_priority_default = 0 -} ma_thread_priority; - -#if defined(MA_WIN32) -typedef ma_handle ma_thread; -#endif -#if defined(MA_POSIX) -typedef ma_pthread_t ma_thread; -#endif - -#if defined(MA_WIN32) -typedef ma_handle ma_mutex; -#endif -#if defined(MA_POSIX) -typedef ma_pthread_mutex_t ma_mutex; -#endif - -#if defined(MA_WIN32) -typedef ma_handle ma_event; -#endif -#if defined(MA_POSIX) -typedef struct -{ - ma_uint32 value; - ma_pthread_mutex_t lock; - ma_pthread_cond_t cond; -} ma_event; -#endif /* MA_POSIX */ - -#if defined(MA_WIN32) -typedef ma_handle ma_semaphore; -#endif -#if defined(MA_POSIX) -typedef struct -{ - int value; - ma_pthread_mutex_t lock; - ma_pthread_cond_t cond; -} ma_semaphore; -#endif /* MA_POSIX */ -#else -/* MA_NO_THREADING is set which means threading is disabled. Threading is required by some API families. If any of these are enabled we need to throw an error. */ -#ifndef MA_NO_DEVICE_IO -#error "MA_NO_THREADING cannot be used without MA_NO_DEVICE_IO"; -#endif -#endif /* MA_NO_THREADING */ - - -/* -Retrieves the version of miniaudio as separated integers. Each component can be NULL if it's not required. -*/ -MA_API void ma_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision); - -/* -Retrieves the version of miniaudio as a string which can be useful for logging purposes. -*/ -MA_API const char* ma_version_string(void); - - -/************************************************************************************************************************************************************** - -Logging - -**************************************************************************************************************************************************************/ -#include /* For va_list. */ - -#if defined(__has_attribute) - #if __has_attribute(format) - #define MA_ATTRIBUTE_FORMAT(fmt, va) __attribute__((format(printf, fmt, va))) - #endif -#endif -#ifndef MA_ATTRIBUTE_FORMAT -#define MA_ATTRIBUTE_FORMAT(fmt,va) -#endif - -#ifndef MA_MAX_LOG_CALLBACKS -#define MA_MAX_LOG_CALLBACKS 4 -#endif - - -/* -The callback for handling log messages. - - -Parameters ----------- -pUserData (in) - The user data pointer that was passed into ma_log_register_callback(). - -logLevel (in) - The log level. This can be one of the following: - - +----------------------+ - | Log Level | - +----------------------+ - | MA_LOG_LEVEL_DEBUG | - | MA_LOG_LEVEL_INFO | - | MA_LOG_LEVEL_WARNING | - | MA_LOG_LEVEL_ERROR | - +----------------------+ - -pMessage (in) - The log message. - - -Remarks -------- -Do not modify the state of the device from inside the callback. -*/ -typedef void (* ma_log_callback_proc)(void* pUserData, ma_uint32 level, const char* pMessage); - -typedef struct -{ - ma_log_callback_proc onLog; - void* pUserData; -} ma_log_callback; - -MA_API ma_log_callback ma_log_callback_init(ma_log_callback_proc onLog, void* pUserData); - - -typedef struct -{ - ma_log_callback callbacks[MA_MAX_LOG_CALLBACKS]; - ma_uint32 callbackCount; - ma_allocation_callbacks allocationCallbacks; /* Need to store these persistently because ma_log_postv() might need to allocate a buffer on the heap. */ -#ifndef MA_NO_THREADING - ma_mutex lock; /* For thread safety just to make it easier and safer for the logging implementation. */ -#endif -} ma_log; - -MA_API ma_result ma_log_init(const ma_allocation_callbacks* pAllocationCallbacks, ma_log* pLog); -MA_API void ma_log_uninit(ma_log* pLog); -MA_API ma_result ma_log_register_callback(ma_log* pLog, ma_log_callback callback); -MA_API ma_result ma_log_unregister_callback(ma_log* pLog, ma_log_callback callback); -MA_API ma_result ma_log_post(ma_log* pLog, ma_uint32 level, const char* pMessage); -MA_API ma_result ma_log_postv(ma_log* pLog, ma_uint32 level, const char* pFormat, va_list args); -MA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat, ...) MA_ATTRIBUTE_FORMAT(3, 4); - - -/************************************************************************************************************************************************************** - -Biquad Filtering - -**************************************************************************************************************************************************************/ -typedef union -{ - float f32; - ma_int32 s32; -} ma_biquad_coefficient; - -typedef struct -{ - ma_format format; - ma_uint32 channels; - double b0; - double b1; - double b2; - double a0; - double a1; - double a2; -} ma_biquad_config; - -MA_API ma_biquad_config ma_biquad_config_init(ma_format format, ma_uint32 channels, double b0, double b1, double b2, double a0, double a1, double a2); - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_biquad_coefficient b0; - ma_biquad_coefficient b1; - ma_biquad_coefficient b2; - ma_biquad_coefficient a1; - ma_biquad_coefficient a2; - ma_biquad_coefficient* pR1; - ma_biquad_coefficient* pR2; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_biquad; - -MA_API ma_result ma_biquad_get_heap_size(const ma_biquad_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_biquad_init_preallocated(const ma_biquad_config* pConfig, void* pHeap, ma_biquad* pBQ); -MA_API ma_result ma_biquad_init(const ma_biquad_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad* pBQ); -MA_API void ma_biquad_uninit(ma_biquad* pBQ, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_biquad_reinit(const ma_biquad_config* pConfig, ma_biquad* pBQ); -MA_API ma_result ma_biquad_clear_cache(ma_biquad* pBQ); -MA_API ma_result ma_biquad_process_pcm_frames(ma_biquad* pBQ, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_biquad_get_latency(const ma_biquad* pBQ); - - -/************************************************************************************************************************************************************** - -Low-Pass Filtering - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double cutoffFrequency; - double q; -} ma_lpf1_config, ma_lpf2_config; - -MA_API ma_lpf1_config ma_lpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency); -MA_API ma_lpf2_config ma_lpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q); - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_biquad_coefficient a; - ma_biquad_coefficient* pR1; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_lpf1; - -MA_API ma_result ma_lpf1_get_heap_size(const ma_lpf1_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_lpf1_init_preallocated(const ma_lpf1_config* pConfig, void* pHeap, ma_lpf1* pLPF); -MA_API ma_result ma_lpf1_init(const ma_lpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf1* pLPF); -MA_API void ma_lpf1_uninit(ma_lpf1* pLPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_lpf1_reinit(const ma_lpf1_config* pConfig, ma_lpf1* pLPF); -MA_API ma_result ma_lpf1_clear_cache(ma_lpf1* pLPF); -MA_API ma_result ma_lpf1_process_pcm_frames(ma_lpf1* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_lpf1_get_latency(const ma_lpf1* pLPF); - -typedef struct -{ - ma_biquad bq; /* The second order low-pass filter is implemented as a biquad filter. */ -} ma_lpf2; - -MA_API ma_result ma_lpf2_get_heap_size(const ma_lpf2_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_lpf2_init_preallocated(const ma_lpf2_config* pConfig, void* pHeap, ma_lpf2* pHPF); -MA_API ma_result ma_lpf2_init(const ma_lpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf2* pLPF); -MA_API void ma_lpf2_uninit(ma_lpf2* pLPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_lpf2_reinit(const ma_lpf2_config* pConfig, ma_lpf2* pLPF); -MA_API ma_result ma_lpf2_clear_cache(ma_lpf2* pLPF); -MA_API ma_result ma_lpf2_process_pcm_frames(ma_lpf2* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_lpf2_get_latency(const ma_lpf2* pLPF); - - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double cutoffFrequency; - ma_uint32 order; /* If set to 0, will be treated as a passthrough (no filtering will be applied). */ -} ma_lpf_config; - -MA_API ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order); - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_uint32 lpf1Count; - ma_uint32 lpf2Count; - ma_lpf1* pLPF1; - ma_lpf2* pLPF2; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_lpf; - -MA_API ma_result ma_lpf_get_heap_size(const ma_lpf_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_lpf_init_preallocated(const ma_lpf_config* pConfig, void* pHeap, ma_lpf* pLPF); -MA_API ma_result ma_lpf_init(const ma_lpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf* pLPF); -MA_API void ma_lpf_uninit(ma_lpf* pLPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_lpf_reinit(const ma_lpf_config* pConfig, ma_lpf* pLPF); -MA_API ma_result ma_lpf_clear_cache(ma_lpf* pLPF); -MA_API ma_result ma_lpf_process_pcm_frames(ma_lpf* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_lpf_get_latency(const ma_lpf* pLPF); - - -/************************************************************************************************************************************************************** - -High-Pass Filtering - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double cutoffFrequency; - double q; -} ma_hpf1_config, ma_hpf2_config; - -MA_API ma_hpf1_config ma_hpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency); -MA_API ma_hpf2_config ma_hpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q); - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_biquad_coefficient a; - ma_biquad_coefficient* pR1; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_hpf1; - -MA_API ma_result ma_hpf1_get_heap_size(const ma_hpf1_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_hpf1_init_preallocated(const ma_hpf1_config* pConfig, void* pHeap, ma_hpf1* pLPF); -MA_API ma_result ma_hpf1_init(const ma_hpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf1* pHPF); -MA_API void ma_hpf1_uninit(ma_hpf1* pHPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_hpf1_reinit(const ma_hpf1_config* pConfig, ma_hpf1* pHPF); -MA_API ma_result ma_hpf1_process_pcm_frames(ma_hpf1* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_hpf1_get_latency(const ma_hpf1* pHPF); - -typedef struct -{ - ma_biquad bq; /* The second order high-pass filter is implemented as a biquad filter. */ -} ma_hpf2; - -MA_API ma_result ma_hpf2_get_heap_size(const ma_hpf2_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_hpf2_init_preallocated(const ma_hpf2_config* pConfig, void* pHeap, ma_hpf2* pHPF); -MA_API ma_result ma_hpf2_init(const ma_hpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf2* pHPF); -MA_API void ma_hpf2_uninit(ma_hpf2* pHPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_hpf2_reinit(const ma_hpf2_config* pConfig, ma_hpf2* pHPF); -MA_API ma_result ma_hpf2_process_pcm_frames(ma_hpf2* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_hpf2_get_latency(const ma_hpf2* pHPF); - - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double cutoffFrequency; - ma_uint32 order; /* If set to 0, will be treated as a passthrough (no filtering will be applied). */ -} ma_hpf_config; - -MA_API ma_hpf_config ma_hpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order); - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_uint32 hpf1Count; - ma_uint32 hpf2Count; - ma_hpf1* pHPF1; - ma_hpf2* pHPF2; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_hpf; - -MA_API ma_result ma_hpf_get_heap_size(const ma_hpf_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_hpf_init_preallocated(const ma_hpf_config* pConfig, void* pHeap, ma_hpf* pLPF); -MA_API ma_result ma_hpf_init(const ma_hpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf* pHPF); -MA_API void ma_hpf_uninit(ma_hpf* pHPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_hpf_reinit(const ma_hpf_config* pConfig, ma_hpf* pHPF); -MA_API ma_result ma_hpf_process_pcm_frames(ma_hpf* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_hpf_get_latency(const ma_hpf* pHPF); - - -/************************************************************************************************************************************************************** - -Band-Pass Filtering - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double cutoffFrequency; - double q; -} ma_bpf2_config; - -MA_API ma_bpf2_config ma_bpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q); - -typedef struct -{ - ma_biquad bq; /* The second order band-pass filter is implemented as a biquad filter. */ -} ma_bpf2; - -MA_API ma_result ma_bpf2_get_heap_size(const ma_bpf2_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_bpf2_init_preallocated(const ma_bpf2_config* pConfig, void* pHeap, ma_bpf2* pBPF); -MA_API ma_result ma_bpf2_init(const ma_bpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf2* pBPF); -MA_API void ma_bpf2_uninit(ma_bpf2* pBPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_bpf2_reinit(const ma_bpf2_config* pConfig, ma_bpf2* pBPF); -MA_API ma_result ma_bpf2_process_pcm_frames(ma_bpf2* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_bpf2_get_latency(const ma_bpf2* pBPF); - - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double cutoffFrequency; - ma_uint32 order; /* If set to 0, will be treated as a passthrough (no filtering will be applied). */ -} ma_bpf_config; - -MA_API ma_bpf_config ma_bpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order); - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 bpf2Count; - ma_bpf2* pBPF2; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_bpf; - -MA_API ma_result ma_bpf_get_heap_size(const ma_bpf_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_bpf_init_preallocated(const ma_bpf_config* pConfig, void* pHeap, ma_bpf* pBPF); -MA_API ma_result ma_bpf_init(const ma_bpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf* pBPF); -MA_API void ma_bpf_uninit(ma_bpf* pBPF, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_bpf_reinit(const ma_bpf_config* pConfig, ma_bpf* pBPF); -MA_API ma_result ma_bpf_process_pcm_frames(ma_bpf* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_bpf_get_latency(const ma_bpf* pBPF); - - -/************************************************************************************************************************************************************** - -Notching Filter - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double q; - double frequency; -} ma_notch2_config, ma_notch_config; - -MA_API ma_notch2_config ma_notch2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency); - -typedef struct -{ - ma_biquad bq; -} ma_notch2; - -MA_API ma_result ma_notch2_get_heap_size(const ma_notch2_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_notch2_init_preallocated(const ma_notch2_config* pConfig, void* pHeap, ma_notch2* pFilter); -MA_API ma_result ma_notch2_init(const ma_notch2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch2* pFilter); -MA_API void ma_notch2_uninit(ma_notch2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_notch2_reinit(const ma_notch2_config* pConfig, ma_notch2* pFilter); -MA_API ma_result ma_notch2_process_pcm_frames(ma_notch2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_notch2_get_latency(const ma_notch2* pFilter); - - -/************************************************************************************************************************************************************** - -Peaking EQ Filter - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double gainDB; - double q; - double frequency; -} ma_peak2_config, ma_peak_config; - -MA_API ma_peak2_config ma_peak2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency); - -typedef struct -{ - ma_biquad bq; -} ma_peak2; - -MA_API ma_result ma_peak2_get_heap_size(const ma_peak2_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_peak2_init_preallocated(const ma_peak2_config* pConfig, void* pHeap, ma_peak2* pFilter); -MA_API ma_result ma_peak2_init(const ma_peak2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak2* pFilter); -MA_API void ma_peak2_uninit(ma_peak2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_peak2_reinit(const ma_peak2_config* pConfig, ma_peak2* pFilter); -MA_API ma_result ma_peak2_process_pcm_frames(ma_peak2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_peak2_get_latency(const ma_peak2* pFilter); - - -/************************************************************************************************************************************************************** - -Low Shelf Filter - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double gainDB; - double shelfSlope; - double frequency; -} ma_loshelf2_config, ma_loshelf_config; - -MA_API ma_loshelf2_config ma_loshelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency); - -typedef struct -{ - ma_biquad bq; -} ma_loshelf2; - -MA_API ma_result ma_loshelf2_get_heap_size(const ma_loshelf2_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_loshelf2_init_preallocated(const ma_loshelf2_config* pConfig, void* pHeap, ma_loshelf2* pFilter); -MA_API ma_result ma_loshelf2_init(const ma_loshelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf2* pFilter); -MA_API void ma_loshelf2_uninit(ma_loshelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_loshelf2_reinit(const ma_loshelf2_config* pConfig, ma_loshelf2* pFilter); -MA_API ma_result ma_loshelf2_process_pcm_frames(ma_loshelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_loshelf2_get_latency(const ma_loshelf2* pFilter); - - -/************************************************************************************************************************************************************** - -High Shelf Filter - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - double gainDB; - double shelfSlope; - double frequency; -} ma_hishelf2_config, ma_hishelf_config; - -MA_API ma_hishelf2_config ma_hishelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency); - -typedef struct -{ - ma_biquad bq; -} ma_hishelf2; - -MA_API ma_result ma_hishelf2_get_heap_size(const ma_hishelf2_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_hishelf2_init_preallocated(const ma_hishelf2_config* pConfig, void* pHeap, ma_hishelf2* pFilter); -MA_API ma_result ma_hishelf2_init(const ma_hishelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf2* pFilter); -MA_API void ma_hishelf2_uninit(ma_hishelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_hishelf2_reinit(const ma_hishelf2_config* pConfig, ma_hishelf2* pFilter); -MA_API ma_result ma_hishelf2_process_pcm_frames(ma_hishelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_hishelf2_get_latency(const ma_hishelf2* pFilter); - - - -/* -Delay -*/ -typedef struct -{ - ma_uint32 channels; - ma_uint32 sampleRate; - ma_uint32 delayInFrames; - ma_bool32 delayStart; /* Set to true to delay the start of the output; false otherwise. */ - float wet; /* 0..1. Default = 1. */ - float dry; /* 0..1. Default = 1. */ - float decay; /* 0..1. Default = 0 (no feedback). Feedback decay. Use this for echo. */ -} ma_delay_config; - -MA_API ma_delay_config ma_delay_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay); - - -typedef struct -{ - ma_delay_config config; - ma_uint32 cursor; /* Feedback is written to this cursor. Always equal or in front of the read cursor. */ - ma_uint32 bufferSizeInFrames; /* The maximum of config.startDelayInFrames and config.feedbackDelayInFrames. */ - float* pBuffer; -} ma_delay; - -MA_API ma_result ma_delay_init(const ma_delay_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay* pDelay); -MA_API void ma_delay_uninit(ma_delay* pDelay, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_delay_process_pcm_frames(ma_delay* pDelay, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount); -MA_API void ma_delay_set_wet(ma_delay* pDelay, float value); -MA_API float ma_delay_get_wet(const ma_delay* pDelay); -MA_API void ma_delay_set_dry(ma_delay* pDelay, float value); -MA_API float ma_delay_get_dry(const ma_delay* pDelay); -MA_API void ma_delay_set_decay(ma_delay* pDelay, float value); -MA_API float ma_delay_get_decay(const ma_delay* pDelay); - - -/* Gainer for smooth volume changes. */ -typedef struct -{ - ma_uint32 channels; - ma_uint32 smoothTimeInFrames; -} ma_gainer_config; - -MA_API ma_gainer_config ma_gainer_config_init(ma_uint32 channels, ma_uint32 smoothTimeInFrames); - - -typedef struct -{ - ma_gainer_config config; - ma_uint32 t; - float* pOldGains; - float* pNewGains; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_gainer; - -MA_API ma_result ma_gainer_get_heap_size(const ma_gainer_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_gainer_init_preallocated(const ma_gainer_config* pConfig, void* pHeap, ma_gainer* pGainer); -MA_API ma_result ma_gainer_init(const ma_gainer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_gainer* pGainer); -MA_API void ma_gainer_uninit(ma_gainer* pGainer, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_gainer_process_pcm_frames(ma_gainer* pGainer, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_result ma_gainer_set_gain(ma_gainer* pGainer, float newGain); -MA_API ma_result ma_gainer_set_gains(ma_gainer* pGainer, float* pNewGains); - - - -/* Stereo panner. */ -typedef enum -{ - ma_pan_mode_balance = 0, /* Does not blend one side with the other. Technically just a balance. Compatible with other popular audio engines and therefore the default. */ - ma_pan_mode_pan /* A true pan. The sound from one side will "move" to the other side and blend with it. */ -} ma_pan_mode; - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_pan_mode mode; - float pan; -} ma_panner_config; - -MA_API ma_panner_config ma_panner_config_init(ma_format format, ma_uint32 channels); - - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_pan_mode mode; - float pan; /* -1..1 where 0 is no pan, -1 is left side, +1 is right side. Defaults to 0. */ -} ma_panner; - -MA_API ma_result ma_panner_init(const ma_panner_config* pConfig, ma_panner* pPanner); -MA_API ma_result ma_panner_process_pcm_frames(ma_panner* pPanner, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API void ma_panner_set_mode(ma_panner* pPanner, ma_pan_mode mode); -MA_API ma_pan_mode ma_panner_get_mode(const ma_panner* pPanner); -MA_API void ma_panner_set_pan(ma_panner* pPanner, float pan); -MA_API float ma_panner_get_pan(const ma_panner* pPanner); - - - -/* Fader. */ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; -} ma_fader_config; - -MA_API ma_fader_config ma_fader_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate); - -typedef struct -{ - ma_fader_config config; - float volumeBeg; /* If volumeBeg and volumeEnd is equal to 1, no fading happens (ma_fader_process_pcm_frames() will run as a passthrough). */ - float volumeEnd; - ma_uint64 lengthInFrames; /* The total length of the fade. */ - ma_uint64 cursorInFrames; /* The current time in frames. Incremented by ma_fader_process_pcm_frames(). */ -} ma_fader; - -MA_API ma_result ma_fader_init(const ma_fader_config* pConfig, ma_fader* pFader); -MA_API ma_result ma_fader_process_pcm_frames(ma_fader* pFader, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API void ma_fader_get_data_format(const ma_fader* pFader, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate); -MA_API void ma_fader_set_fade(ma_fader* pFader, float volumeBeg, float volumeEnd, ma_uint64 lengthInFrames); -MA_API float ma_fader_get_current_volume(ma_fader* pFader); - - - -/* Spatializer. */ -typedef struct -{ - float x; - float y; - float z; -} ma_vec3f; - -typedef enum -{ - ma_attenuation_model_none, /* No distance attenuation and no spatialization. */ - ma_attenuation_model_inverse, /* Equivalent to OpenAL's AL_INVERSE_DISTANCE_CLAMPED. */ - ma_attenuation_model_linear, /* Linear attenuation. Equivalent to OpenAL's AL_LINEAR_DISTANCE_CLAMPED. */ - ma_attenuation_model_exponential /* Exponential attenuation. Equivalent to OpenAL's AL_EXPONENT_DISTANCE_CLAMPED. */ -} ma_attenuation_model; - -typedef enum -{ - ma_positioning_absolute, - ma_positioning_relative -} ma_positioning; - -typedef enum -{ - ma_handedness_right, - ma_handedness_left -} ma_handedness; - - -typedef struct -{ - ma_uint32 channelsOut; - ma_channel* pChannelMapOut; - ma_handedness handedness; /* Defaults to right. Forward is -1 on the Z axis. In a left handed system, forward is +1 on the Z axis. */ - float coneInnerAngleInRadians; - float coneOuterAngleInRadians; - float coneOuterGain; - float speedOfSound; - ma_vec3f worldUp; -} ma_spatializer_listener_config; - -MA_API ma_spatializer_listener_config ma_spatializer_listener_config_init(ma_uint32 channelsOut); - - -typedef struct -{ - ma_spatializer_listener_config config; - ma_vec3f position; /* The absolute position of the listener. */ - ma_vec3f direction; /* The direction the listener is facing. The world up vector is config.worldUp. */ - ma_vec3f velocity; - ma_bool32 isEnabled; - - /* Memory management. */ - ma_bool32 _ownsHeap; - void* _pHeap; -} ma_spatializer_listener; - -MA_API ma_result ma_spatializer_listener_get_heap_size(const ma_spatializer_listener_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_spatializer_listener_init_preallocated(const ma_spatializer_listener_config* pConfig, void* pHeap, ma_spatializer_listener* pListener); -MA_API ma_result ma_spatializer_listener_init(const ma_spatializer_listener_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer_listener* pListener); -MA_API void ma_spatializer_listener_uninit(ma_spatializer_listener* pListener, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_channel* ma_spatializer_listener_get_channel_map(ma_spatializer_listener* pListener); -MA_API void ma_spatializer_listener_set_cone(ma_spatializer_listener* pListener, float innerAngleInRadians, float outerAngleInRadians, float outerGain); -MA_API void ma_spatializer_listener_get_cone(const ma_spatializer_listener* pListener, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain); -MA_API void ma_spatializer_listener_set_position(ma_spatializer_listener* pListener, float x, float y, float z); -MA_API ma_vec3f ma_spatializer_listener_get_position(const ma_spatializer_listener* pListener); -MA_API void ma_spatializer_listener_set_direction(ma_spatializer_listener* pListener, float x, float y, float z); -MA_API ma_vec3f ma_spatializer_listener_get_direction(const ma_spatializer_listener* pListener); -MA_API void ma_spatializer_listener_set_velocity(ma_spatializer_listener* pListener, float x, float y, float z); -MA_API ma_vec3f ma_spatializer_listener_get_velocity(const ma_spatializer_listener* pListener); -MA_API void ma_spatializer_listener_set_speed_of_sound(ma_spatializer_listener* pListener, float speedOfSound); -MA_API float ma_spatializer_listener_get_speed_of_sound(const ma_spatializer_listener* pListener); -MA_API void ma_spatializer_listener_set_world_up(ma_spatializer_listener* pListener, float x, float y, float z); -MA_API ma_vec3f ma_spatializer_listener_get_world_up(const ma_spatializer_listener* pListener); -MA_API void ma_spatializer_listener_set_enabled(ma_spatializer_listener* pListener, ma_bool32 isEnabled); -MA_API ma_bool32 ma_spatializer_listener_is_enabled(const ma_spatializer_listener* pListener); - - -typedef struct -{ - ma_uint32 channelsIn; - ma_uint32 channelsOut; - ma_channel* pChannelMapIn; - ma_attenuation_model attenuationModel; - ma_positioning positioning; - ma_handedness handedness; /* Defaults to right. Forward is -1 on the Z axis. In a left handed system, forward is +1 on the Z axis. */ - float minGain; - float maxGain; - float minDistance; - float maxDistance; - float rolloff; - float coneInnerAngleInRadians; - float coneOuterAngleInRadians; - float coneOuterGain; - float dopplerFactor; /* Set to 0 to disable doppler effect. */ - float directionalAttenuationFactor; /* Set to 0 to disable directional attenuation. */ - ma_uint32 gainSmoothTimeInFrames; /* When the gain of a channel changes during spatialization, the transition will be linearly interpolated over this number of frames. */ -} ma_spatializer_config; - -MA_API ma_spatializer_config ma_spatializer_config_init(ma_uint32 channelsIn, ma_uint32 channelsOut); - - -typedef struct -{ - ma_uint32 channelsIn; - ma_uint32 channelsOut; - ma_channel* pChannelMapIn; - ma_attenuation_model attenuationModel; - ma_positioning positioning; - ma_handedness handedness; /* Defaults to right. Forward is -1 on the Z axis. In a left handed system, forward is +1 on the Z axis. */ - float minGain; - float maxGain; - float minDistance; - float maxDistance; - float rolloff; - float coneInnerAngleInRadians; - float coneOuterAngleInRadians; - float coneOuterGain; - float dopplerFactor; /* Set to 0 to disable doppler effect. */ - float directionalAttenuationFactor; /* Set to 0 to disable directional attenuation. */ - ma_uint32 gainSmoothTimeInFrames; /* When the gain of a channel changes during spatialization, the transition will be linearly interpolated over this number of frames. */ - ma_vec3f position; - ma_vec3f direction; - ma_vec3f velocity; /* For doppler effect. */ - float dopplerPitch; /* Will be updated by ma_spatializer_process_pcm_frames() and can be used by higher level functions to apply a pitch shift for doppler effect. */ - ma_gainer gainer; /* For smooth gain transitions. */ - float* pNewChannelGainsOut; /* An offset of _pHeap. Used by ma_spatializer_process_pcm_frames() to store new channel gains. The number of elements in this array is equal to config.channelsOut. */ - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_spatializer; - -MA_API ma_result ma_spatializer_get_heap_size(const ma_spatializer_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_spatializer_init_preallocated(const ma_spatializer_config* pConfig, void* pHeap, ma_spatializer* pSpatializer); -MA_API ma_result ma_spatializer_init(const ma_spatializer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer* pSpatializer); -MA_API void ma_spatializer_uninit(ma_spatializer* pSpatializer, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_spatializer_process_pcm_frames(ma_spatializer* pSpatializer, ma_spatializer_listener* pListener, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_uint32 ma_spatializer_get_input_channels(const ma_spatializer* pSpatializer); -MA_API ma_uint32 ma_spatializer_get_output_channels(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_attenuation_model(ma_spatializer* pSpatializer, ma_attenuation_model attenuationModel); -MA_API ma_attenuation_model ma_spatializer_get_attenuation_model(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_positioning(ma_spatializer* pSpatializer, ma_positioning positioning); -MA_API ma_positioning ma_spatializer_get_positioning(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_rolloff(ma_spatializer* pSpatializer, float rolloff); -MA_API float ma_spatializer_get_rolloff(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_min_gain(ma_spatializer* pSpatializer, float minGain); -MA_API float ma_spatializer_get_min_gain(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_max_gain(ma_spatializer* pSpatializer, float maxGain); -MA_API float ma_spatializer_get_max_gain(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_min_distance(ma_spatializer* pSpatializer, float minDistance); -MA_API float ma_spatializer_get_min_distance(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_max_distance(ma_spatializer* pSpatializer, float maxDistance); -MA_API float ma_spatializer_get_max_distance(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_cone(ma_spatializer* pSpatializer, float innerAngleInRadians, float outerAngleInRadians, float outerGain); -MA_API void ma_spatializer_get_cone(const ma_spatializer* pSpatializer, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain); -MA_API void ma_spatializer_set_doppler_factor(ma_spatializer* pSpatializer, float dopplerFactor); -MA_API float ma_spatializer_get_doppler_factor(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_directional_attenuation_factor(ma_spatializer* pSpatializer, float directionalAttenuationFactor); -MA_API float ma_spatializer_get_directional_attenuation_factor(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_position(ma_spatializer* pSpatializer, float x, float y, float z); -MA_API ma_vec3f ma_spatializer_get_position(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_direction(ma_spatializer* pSpatializer, float x, float y, float z); -MA_API ma_vec3f ma_spatializer_get_direction(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_set_velocity(ma_spatializer* pSpatializer, float x, float y, float z); -MA_API ma_vec3f ma_spatializer_get_velocity(const ma_spatializer* pSpatializer); -MA_API void ma_spatializer_get_relative_position_and_direction(const ma_spatializer* pSpatializer, const ma_spatializer_listener* pListener, ma_vec3f* pRelativePos, ma_vec3f* pRelativeDir); - - - -/************************************************************************************************************************************************************ -************************************************************************************************************************************************************* - -DATA CONVERSION -=============== - -This section contains the APIs for data conversion. You will find everything here for channel mapping, sample format conversion, resampling, etc. - -************************************************************************************************************************************************************* -************************************************************************************************************************************************************/ - -/************************************************************************************************************************************************************** - -Resampling - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRateIn; - ma_uint32 sampleRateOut; - ma_uint32 lpfOrder; /* The low-pass filter order. Setting this to 0 will disable low-pass filtering. */ - double lpfNyquistFactor; /* 0..1. Defaults to 1. 1 = Half the sampling frequency (Nyquist Frequency), 0.5 = Quarter the sampling frequency (half Nyquest Frequency), etc. */ -} ma_linear_resampler_config; - -MA_API ma_linear_resampler_config ma_linear_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut); - -typedef struct -{ - ma_linear_resampler_config config; - ma_uint32 inAdvanceInt; - ma_uint32 inAdvanceFrac; - ma_uint32 inTimeInt; - ma_uint32 inTimeFrac; - union - { - float* f32; - ma_int16* s16; - } x0; /* The previous input frame. */ - union - { - float* f32; - ma_int16* s16; - } x1; /* The next input frame. */ - ma_lpf lpf; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_linear_resampler; - -MA_API ma_result ma_linear_resampler_get_heap_size(const ma_linear_resampler_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_linear_resampler_init_preallocated(const ma_linear_resampler_config* pConfig, void* pHeap, ma_linear_resampler* pResampler); -MA_API ma_result ma_linear_resampler_init(const ma_linear_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_linear_resampler* pResampler); -MA_API void ma_linear_resampler_uninit(ma_linear_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_linear_resampler_process_pcm_frames(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut); -MA_API ma_result ma_linear_resampler_set_rate(ma_linear_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut); -MA_API ma_result ma_linear_resampler_set_rate_ratio(ma_linear_resampler* pResampler, float ratioInOut); -MA_API ma_uint64 ma_linear_resampler_get_input_latency(const ma_linear_resampler* pResampler); -MA_API ma_uint64 ma_linear_resampler_get_output_latency(const ma_linear_resampler* pResampler); -MA_API ma_result ma_linear_resampler_get_required_input_frame_count(const ma_linear_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount); -MA_API ma_result ma_linear_resampler_get_expected_output_frame_count(const ma_linear_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount); -MA_API ma_result ma_linear_resampler_reset(ma_linear_resampler* pResampler); - - -typedef struct ma_resampler_config ma_resampler_config; - -typedef void ma_resampling_backend; -typedef struct -{ - ma_result (* onGetHeapSize )(void* pUserData, const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes); - ma_result (* onInit )(void* pUserData, const ma_resampler_config* pConfig, void* pHeap, ma_resampling_backend** ppBackend); - void (* onUninit )(void* pUserData, ma_resampling_backend* pBackend, const ma_allocation_callbacks* pAllocationCallbacks); - ma_result (* onProcess )(void* pUserData, ma_resampling_backend* pBackend, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut); - ma_result (* onSetRate )(void* pUserData, ma_resampling_backend* pBackend, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut); /* Optional. Rate changes will be disabled. */ - ma_uint64 (* onGetInputLatency )(void* pUserData, const ma_resampling_backend* pBackend); /* Optional. Latency will be reported as 0. */ - ma_uint64 (* onGetOutputLatency )(void* pUserData, const ma_resampling_backend* pBackend); /* Optional. Latency will be reported as 0. */ - ma_result (* onGetRequiredInputFrameCount )(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount); /* Optional. Latency mitigation will be disabled. */ - ma_result (* onGetExpectedOutputFrameCount)(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount); /* Optional. Latency mitigation will be disabled. */ - ma_result (* onReset )(void* pUserData, ma_resampling_backend* pBackend); -} ma_resampling_backend_vtable; - -typedef enum -{ - ma_resample_algorithm_linear = 0, /* Fastest, lowest quality. Optional low-pass filtering. Default. */ - ma_resample_algorithm_custom, -} ma_resample_algorithm; - -struct ma_resampler_config -{ - ma_format format; /* Must be either ma_format_f32 or ma_format_s16. */ - ma_uint32 channels; - ma_uint32 sampleRateIn; - ma_uint32 sampleRateOut; - ma_resample_algorithm algorithm; /* When set to ma_resample_algorithm_custom, pBackendVTable will be used. */ - ma_resampling_backend_vtable* pBackendVTable; - void* pBackendUserData; - struct - { - ma_uint32 lpfOrder; - } linear; -}; - -MA_API ma_resampler_config ma_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_resample_algorithm algorithm); - -typedef struct -{ - ma_resampling_backend* pBackend; - ma_resampling_backend_vtable* pBackendVTable; - void* pBackendUserData; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRateIn; - ma_uint32 sampleRateOut; - union - { - ma_linear_resampler linear; - } state; /* State for stock resamplers so we can avoid a malloc. For stock resamplers, pBackend will point here. */ - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_resampler; - -MA_API ma_result ma_resampler_get_heap_size(const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_resampler_init_preallocated(const ma_resampler_config* pConfig, void* pHeap, ma_resampler* pResampler); - -/* -Initializes a new resampler object from a config. -*/ -MA_API ma_result ma_resampler_init(const ma_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_resampler* pResampler); - -/* -Uninitializes a resampler. -*/ -MA_API void ma_resampler_uninit(ma_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks); - -/* -Converts the given input data. - -Both the input and output frames must be in the format specified in the config when the resampler was initilized. - -On input, [pFrameCountOut] contains the number of output frames to process. On output it contains the number of output frames that -were actually processed, which may be less than the requested amount which will happen if there's not enough input data. You can use -ma_resampler_get_expected_output_frame_count() to know how many output frames will be processed for a given number of input frames. - -On input, [pFrameCountIn] contains the number of input frames contained in [pFramesIn]. On output it contains the number of whole -input frames that were actually processed. You can use ma_resampler_get_required_input_frame_count() to know how many input frames -you should provide for a given number of output frames. [pFramesIn] can be NULL, in which case zeroes will be used instead. - -If [pFramesOut] is NULL, a seek is performed. In this case, if [pFrameCountOut] is not NULL it will seek by the specified number of -output frames. Otherwise, if [pFramesCountOut] is NULL and [pFrameCountIn] is not NULL, it will seek by the specified number of input -frames. When seeking, [pFramesIn] is allowed to NULL, in which case the internal timing state will be updated, but no input will be -processed. In this case, any internal filter state will be updated as if zeroes were passed in. - -It is an error for [pFramesOut] to be non-NULL and [pFrameCountOut] to be NULL. - -It is an error for both [pFrameCountOut] and [pFrameCountIn] to be NULL. -*/ -MA_API ma_result ma_resampler_process_pcm_frames(ma_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut); - - -/* -Sets the input and output sample sample rate. -*/ -MA_API ma_result ma_resampler_set_rate(ma_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut); - -/* -Sets the input and output sample rate as a ratio. - -The ration is in/out. -*/ -MA_API ma_result ma_resampler_set_rate_ratio(ma_resampler* pResampler, float ratio); - -/* -Retrieves the latency introduced by the resampler in input frames. -*/ -MA_API ma_uint64 ma_resampler_get_input_latency(const ma_resampler* pResampler); - -/* -Retrieves the latency introduced by the resampler in output frames. -*/ -MA_API ma_uint64 ma_resampler_get_output_latency(const ma_resampler* pResampler); - -/* -Calculates the number of whole input frames that would need to be read from the client in order to output the specified -number of output frames. - -The returned value does not include cached input frames. It only returns the number of extra frames that would need to be -read from the input buffer in order to output the specified number of output frames. -*/ -MA_API ma_result ma_resampler_get_required_input_frame_count(const ma_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount); - -/* -Calculates the number of whole output frames that would be output after fully reading and consuming the specified number of -input frames. -*/ -MA_API ma_result ma_resampler_get_expected_output_frame_count(const ma_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount); - -/* -Resets the resampler's timer and clears it's internal cache. -*/ -MA_API ma_result ma_resampler_reset(ma_resampler* pResampler); - - -/************************************************************************************************************************************************************** - -Channel Conversion - -**************************************************************************************************************************************************************/ -typedef enum -{ - ma_channel_conversion_path_unknown, - ma_channel_conversion_path_passthrough, - ma_channel_conversion_path_mono_out, /* Converting to mono. */ - ma_channel_conversion_path_mono_in, /* Converting from mono. */ - ma_channel_conversion_path_shuffle, /* Simple shuffle. Will use this when all channels are present in both input and output channel maps, but just in a different order. */ - ma_channel_conversion_path_weights /* Blended based on weights. */ -} ma_channel_conversion_path; - -typedef enum -{ - ma_mono_expansion_mode_duplicate = 0, /* The default. */ - ma_mono_expansion_mode_average, /* Average the mono channel across all channels. */ - ma_mono_expansion_mode_stereo_only, /* Duplicate to the left and right channels only and ignore the others. */ - ma_mono_expansion_mode_default = ma_mono_expansion_mode_duplicate -} ma_mono_expansion_mode; - -typedef struct -{ - ma_format format; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - const ma_channel* pChannelMapIn; - const ma_channel* pChannelMapOut; - ma_channel_mix_mode mixingMode; - float** ppWeights; /* [in][out]. Only used when mixingMode is set to ma_channel_mix_mode_custom_weights. */ -} ma_channel_converter_config; - -MA_API ma_channel_converter_config ma_channel_converter_config_init(ma_format format, ma_uint32 channelsIn, const ma_channel* pChannelMapIn, ma_uint32 channelsOut, const ma_channel* pChannelMapOut, ma_channel_mix_mode mixingMode); - -typedef struct -{ - ma_format format; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - ma_channel_mix_mode mixingMode; - ma_channel_conversion_path conversionPath; - ma_channel* pChannelMapIn; - ma_channel* pChannelMapOut; - ma_uint8* pShuffleTable; /* Indexed by output channel index. */ - union - { - float** f32; - ma_int32** s16; - } weights; /* [in][out] */ - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_channel_converter; - -MA_API ma_result ma_channel_converter_get_heap_size(const ma_channel_converter_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_channel_converter_init_preallocated(const ma_channel_converter_config* pConfig, void* pHeap, ma_channel_converter* pConverter); -MA_API ma_result ma_channel_converter_init(const ma_channel_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_channel_converter* pConverter); -MA_API void ma_channel_converter_uninit(ma_channel_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_channel_converter_process_pcm_frames(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount); -MA_API ma_result ma_channel_converter_get_input_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_channel_converter_get_output_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap); - - -/************************************************************************************************************************************************************** - -Data Conversion - -**************************************************************************************************************************************************************/ -typedef struct -{ - ma_format formatIn; - ma_format formatOut; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - ma_uint32 sampleRateIn; - ma_uint32 sampleRateOut; - ma_channel* pChannelMapIn; - ma_channel* pChannelMapOut; - ma_dither_mode ditherMode; - ma_channel_mix_mode channelMixMode; - float** ppChannelWeights; /* [in][out]. Only used when mixingMode is set to ma_channel_mix_mode_custom_weights. */ - ma_bool32 allowDynamicSampleRate; - ma_resampler_config resampling; -} ma_data_converter_config; - -MA_API ma_data_converter_config ma_data_converter_config_init_default(void); -MA_API ma_data_converter_config ma_data_converter_config_init(ma_format formatIn, ma_format formatOut, ma_uint32 channelsIn, ma_uint32 channelsOut, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut); - - -typedef enum -{ - ma_data_converter_execution_path_passthrough, /* No conversion. */ - ma_data_converter_execution_path_format_only, /* Only format conversion. */ - ma_data_converter_execution_path_channels_only, /* Only channel conversion. */ - ma_data_converter_execution_path_resample_only, /* Only resampling. */ - ma_data_converter_execution_path_resample_first, /* All conversions, but resample as the first step. */ - ma_data_converter_execution_path_channels_first /* All conversions, but channels as the first step. */ -} ma_data_converter_execution_path; - -typedef struct -{ - ma_format formatIn; - ma_format formatOut; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - ma_uint32 sampleRateIn; - ma_uint32 sampleRateOut; - ma_dither_mode ditherMode; - ma_data_converter_execution_path executionPath; /* The execution path the data converter will follow when processing. */ - ma_channel_converter channelConverter; - ma_resampler resampler; - ma_bool8 hasPreFormatConversion; - ma_bool8 hasPostFormatConversion; - ma_bool8 hasChannelConverter; - ma_bool8 hasResampler; - ma_bool8 isPassthrough; - - /* Memory management. */ - ma_bool8 _ownsHeap; - void* _pHeap; -} ma_data_converter; - -MA_API ma_result ma_data_converter_get_heap_size(const ma_data_converter_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_data_converter_init_preallocated(const ma_data_converter_config* pConfig, void* pHeap, ma_data_converter* pConverter); -MA_API ma_result ma_data_converter_init(const ma_data_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_converter* pConverter); -MA_API void ma_data_converter_uninit(ma_data_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_data_converter_process_pcm_frames(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut); -MA_API ma_result ma_data_converter_set_rate(ma_data_converter* pConverter, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut); -MA_API ma_result ma_data_converter_set_rate_ratio(ma_data_converter* pConverter, float ratioInOut); -MA_API ma_uint64 ma_data_converter_get_input_latency(const ma_data_converter* pConverter); -MA_API ma_uint64 ma_data_converter_get_output_latency(const ma_data_converter* pConverter); -MA_API ma_result ma_data_converter_get_required_input_frame_count(const ma_data_converter* pConverter, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount); -MA_API ma_result ma_data_converter_get_expected_output_frame_count(const ma_data_converter* pConverter, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount); -MA_API ma_result ma_data_converter_get_input_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_data_converter_get_output_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_data_converter_reset(ma_data_converter* pConverter); - - -/************************************************************************************************************************************************************ - -Format Conversion - -************************************************************************************************************************************************************/ -MA_API void ma_pcm_u8_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_u8_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_u8_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_u8_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s16_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s16_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s16_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s16_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s24_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s24_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s24_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s24_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s32_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s32_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s32_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_s32_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_f32_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_f32_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_f32_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_f32_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode); -MA_API void ma_pcm_convert(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 sampleCount, ma_dither_mode ditherMode); -MA_API void ma_convert_pcm_frames_format(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 frameCount, ma_uint32 channels, ma_dither_mode ditherMode); - -/* -Deinterleaves an interleaved buffer. -*/ -MA_API void ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void* pInterleavedPCMFrames, void** ppDeinterleavedPCMFrames); - -/* -Interleaves a group of deinterleaved buffers. -*/ -MA_API void ma_interleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void** ppDeinterleavedPCMFrames, void* pInterleavedPCMFrames); - - -/************************************************************************************************************************************************************ - -Channel Maps - -************************************************************************************************************************************************************/ -/* -This is used in the shuffle table to indicate that the channel index is undefined and should be ignored. -*/ -#define MA_CHANNEL_INDEX_NULL 255 - -/* -Retrieves the channel position of the specified channel in the given channel map. - -The pChannelMap parameter can be null, in which case miniaudio's default channel map will be assumed. -*/ -MA_API ma_channel ma_channel_map_get_channel(const ma_channel* pChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex); - -/* -Initializes a blank channel map. - -When a blank channel map is specified anywhere it indicates that the native channel map should be used. -*/ -MA_API void ma_channel_map_init_blank(ma_channel* pChannelMap, ma_uint32 channels); - -/* -Helper for retrieving a standard channel map. - -The output channel map buffer must have a capacity of at least `channelMapCap`. -*/ -MA_API void ma_channel_map_init_standard(ma_standard_channel_map standardChannelMap, ma_channel* pChannelMap, size_t channelMapCap, ma_uint32 channels); - -/* -Copies a channel map. - -Both input and output channel map buffers must have a capacity of at at least `channels`. -*/ -MA_API void ma_channel_map_copy(ma_channel* pOut, const ma_channel* pIn, ma_uint32 channels); - -/* -Copies a channel map if one is specified, otherwise copies the default channel map. - -The output buffer must have a capacity of at least `channels`. If not NULL, the input channel map must also have a capacity of at least `channels`. -*/ -MA_API void ma_channel_map_copy_or_default(ma_channel* pOut, size_t channelMapCapOut, const ma_channel* pIn, ma_uint32 channels); - - -/* -Determines whether or not a channel map is valid. - -A blank channel map is valid (all channels set to MA_CHANNEL_NONE). The way a blank channel map is handled is context specific, but -is usually treated as a passthrough. - -Invalid channel maps: - - A channel map with no channels - - A channel map with more than one channel and a mono channel - -The channel map buffer must have a capacity of at least `channels`. -*/ -MA_API ma_bool32 ma_channel_map_is_valid(const ma_channel* pChannelMap, ma_uint32 channels); - -/* -Helper for comparing two channel maps for equality. - -This assumes the channel count is the same between the two. - -Both channels map buffers must have a capacity of at least `channels`. -*/ -MA_API ma_bool32 ma_channel_map_is_equal(const ma_channel* pChannelMapA, const ma_channel* pChannelMapB, ma_uint32 channels); - -/* -Helper for determining if a channel map is blank (all channels set to MA_CHANNEL_NONE). - -The channel map buffer must have a capacity of at least `channels`. -*/ -MA_API ma_bool32 ma_channel_map_is_blank(const ma_channel* pChannelMap, ma_uint32 channels); - -/* -Helper for determining whether or not a channel is present in the given channel map. - -The channel map buffer must have a capacity of at least `channels`. -*/ -MA_API ma_bool32 ma_channel_map_contains_channel_position(ma_uint32 channels, const ma_channel* pChannelMap, ma_channel channelPosition); - - -/************************************************************************************************************************************************************ - -Conversion Helpers - -************************************************************************************************************************************************************/ - -/* -High-level helper for doing a full format conversion in one go. Returns the number of output frames. Call this with pOut set to NULL to -determine the required size of the output buffer. frameCountOut should be set to the capacity of pOut. If pOut is NULL, frameCountOut is -ignored. - -A return value of 0 indicates an error. - -This function is useful for one-off bulk conversions, but if you're streaming data you should use the ma_data_converter APIs instead. -*/ -MA_API ma_uint64 ma_convert_frames(void* pOut, ma_uint64 frameCountOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, const void* pIn, ma_uint64 frameCountIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn); -MA_API ma_uint64 ma_convert_frames_ex(void* pOut, ma_uint64 frameCountOut, const void* pIn, ma_uint64 frameCountIn, const ma_data_converter_config* pConfig); - - -/************************************************************************************************************************************************************ - -Ring Buffer - -************************************************************************************************************************************************************/ -typedef struct -{ - void* pBuffer; - ma_uint32 subbufferSizeInBytes; - ma_uint32 subbufferCount; - ma_uint32 subbufferStrideInBytes; - MA_ATOMIC(4, ma_uint32) encodedReadOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. Must be used atomically. */ - MA_ATOMIC(4, ma_uint32) encodedWriteOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. Must be used atomically. */ - ma_bool8 ownsBuffer; /* Used to know whether or not miniaudio is responsible for free()-ing the buffer. */ - ma_bool8 clearOnWriteAcquire; /* When set, clears the acquired write buffer before returning from ma_rb_acquire_write(). */ - ma_allocation_callbacks allocationCallbacks; -} ma_rb; - -MA_API ma_result ma_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB); -MA_API ma_result ma_rb_init(size_t bufferSizeInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB); -MA_API void ma_rb_uninit(ma_rb* pRB); -MA_API void ma_rb_reset(ma_rb* pRB); -MA_API ma_result ma_rb_acquire_read(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut); -MA_API ma_result ma_rb_commit_read(ma_rb* pRB, size_t sizeInBytes); -MA_API ma_result ma_rb_acquire_write(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut); -MA_API ma_result ma_rb_commit_write(ma_rb* pRB, size_t sizeInBytes); -MA_API ma_result ma_rb_seek_read(ma_rb* pRB, size_t offsetInBytes); -MA_API ma_result ma_rb_seek_write(ma_rb* pRB, size_t offsetInBytes); -MA_API ma_int32 ma_rb_pointer_distance(ma_rb* pRB); /* Returns the distance between the write pointer and the read pointer. Should never be negative for a correct program. Will return the number of bytes that can be read before the read pointer hits the write pointer. */ -MA_API ma_uint32 ma_rb_available_read(ma_rb* pRB); -MA_API ma_uint32 ma_rb_available_write(ma_rb* pRB); -MA_API size_t ma_rb_get_subbuffer_size(ma_rb* pRB); -MA_API size_t ma_rb_get_subbuffer_stride(ma_rb* pRB); -MA_API size_t ma_rb_get_subbuffer_offset(ma_rb* pRB, size_t subbufferIndex); -MA_API void* ma_rb_get_subbuffer_ptr(ma_rb* pRB, size_t subbufferIndex, void* pBuffer); - - -typedef struct -{ - ma_rb rb; - ma_format format; - ma_uint32 channels; -} ma_pcm_rb; - -MA_API ma_result ma_pcm_rb_init_ex(ma_format format, ma_uint32 channels, ma_uint32 subbufferSizeInFrames, ma_uint32 subbufferCount, ma_uint32 subbufferStrideInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB); -MA_API ma_result ma_pcm_rb_init(ma_format format, ma_uint32 channels, ma_uint32 bufferSizeInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB); -MA_API void ma_pcm_rb_uninit(ma_pcm_rb* pRB); -MA_API void ma_pcm_rb_reset(ma_pcm_rb* pRB); -MA_API ma_result ma_pcm_rb_acquire_read(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut); -MA_API ma_result ma_pcm_rb_commit_read(ma_pcm_rb* pRB, ma_uint32 sizeInFrames); -MA_API ma_result ma_pcm_rb_acquire_write(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut); -MA_API ma_result ma_pcm_rb_commit_write(ma_pcm_rb* pRB, ma_uint32 sizeInFrames); -MA_API ma_result ma_pcm_rb_seek_read(ma_pcm_rb* pRB, ma_uint32 offsetInFrames); -MA_API ma_result ma_pcm_rb_seek_write(ma_pcm_rb* pRB, ma_uint32 offsetInFrames); -MA_API ma_int32 ma_pcm_rb_pointer_distance(ma_pcm_rb* pRB); /* Return value is in frames. */ -MA_API ma_uint32 ma_pcm_rb_available_read(ma_pcm_rb* pRB); -MA_API ma_uint32 ma_pcm_rb_available_write(ma_pcm_rb* pRB); -MA_API ma_uint32 ma_pcm_rb_get_subbuffer_size(ma_pcm_rb* pRB); -MA_API ma_uint32 ma_pcm_rb_get_subbuffer_stride(ma_pcm_rb* pRB); -MA_API ma_uint32 ma_pcm_rb_get_subbuffer_offset(ma_pcm_rb* pRB, ma_uint32 subbufferIndex); -MA_API void* ma_pcm_rb_get_subbuffer_ptr(ma_pcm_rb* pRB, ma_uint32 subbufferIndex, void* pBuffer); - - -/* -The idea of the duplex ring buffer is to act as the intermediary buffer when running two asynchronous devices in a duplex set up. The -capture device writes to it, and then a playback device reads from it. - -At the moment this is just a simple naive implementation, but in the future I want to implement some dynamic resampling to seamlessly -handle desyncs. Note that the API is work in progress and may change at any time in any version. - -The size of the buffer is based on the capture side since that's what'll be written to the buffer. It is based on the capture period size -in frames. The internal sample rate of the capture device is also needed in order to calculate the size. -*/ -typedef struct -{ - ma_pcm_rb rb; -} ma_duplex_rb; - -MA_API ma_result ma_duplex_rb_init(ma_format captureFormat, ma_uint32 captureChannels, ma_uint32 sampleRate, ma_uint32 captureInternalSampleRate, ma_uint32 captureInternalPeriodSizeInFrames, const ma_allocation_callbacks* pAllocationCallbacks, ma_duplex_rb* pRB); -MA_API ma_result ma_duplex_rb_uninit(ma_duplex_rb* pRB); - - -/************************************************************************************************************************************************************ - -Miscellaneous Helpers - -************************************************************************************************************************************************************/ -/* -Retrieves a human readable description of the given result code. -*/ -MA_API const char* ma_result_description(ma_result result); - -/* -malloc() -*/ -MA_API void* ma_malloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks); - -/* -calloc() -*/ -MA_API void* ma_calloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks); - -/* -realloc() -*/ -MA_API void* ma_realloc(void* p, size_t sz, const ma_allocation_callbacks* pAllocationCallbacks); - -/* -free() -*/ -MA_API void ma_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks); - -/* -Performs an aligned malloc, with the assumption that the alignment is a power of 2. -*/ -MA_API void* ma_aligned_malloc(size_t sz, size_t alignment, const ma_allocation_callbacks* pAllocationCallbacks); - -/* -Free's an aligned malloc'd buffer. -*/ -MA_API void ma_aligned_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks); - -/* -Retrieves a friendly name for a format. -*/ -MA_API const char* ma_get_format_name(ma_format format); - -/* -Blends two frames in floating point format. -*/ -MA_API void ma_blend_f32(float* pOut, float* pInA, float* pInB, float factor, ma_uint32 channels); - -/* -Retrieves the size of a sample in bytes for the given format. - -This API is efficient and is implemented using a lookup table. - -Thread Safety: SAFE - This API is pure. -*/ -MA_API ma_uint32 ma_get_bytes_per_sample(ma_format format); -static MA_INLINE ma_uint32 ma_get_bytes_per_frame(ma_format format, ma_uint32 channels) { return ma_get_bytes_per_sample(format) * channels; } - -/* -Converts a log level to a string. -*/ -MA_API const char* ma_log_level_to_string(ma_uint32 logLevel); - - - - -/************************************************************************************************************************************************************ - -Synchronization - -************************************************************************************************************************************************************/ -/* -Locks a spinlock. -*/ -MA_API ma_result ma_spinlock_lock(volatile ma_spinlock* pSpinlock); - -/* -Locks a spinlock, but does not yield() when looping. -*/ -MA_API ma_result ma_spinlock_lock_noyield(volatile ma_spinlock* pSpinlock); - -/* -Unlocks a spinlock. -*/ -MA_API ma_result ma_spinlock_unlock(volatile ma_spinlock* pSpinlock); - - -#ifndef MA_NO_THREADING - -/* -Creates a mutex. - -A mutex must be created from a valid context. A mutex is initially unlocked. -*/ -MA_API ma_result ma_mutex_init(ma_mutex* pMutex); - -/* -Deletes a mutex. -*/ -MA_API void ma_mutex_uninit(ma_mutex* pMutex); - -/* -Locks a mutex with an infinite timeout. -*/ -MA_API void ma_mutex_lock(ma_mutex* pMutex); - -/* -Unlocks a mutex. -*/ -MA_API void ma_mutex_unlock(ma_mutex* pMutex); - - -/* -Initializes an auto-reset event. -*/ -MA_API ma_result ma_event_init(ma_event* pEvent); - -/* -Uninitializes an auto-reset event. -*/ -MA_API void ma_event_uninit(ma_event* pEvent); - -/* -Waits for the specified auto-reset event to become signalled. -*/ -MA_API ma_result ma_event_wait(ma_event* pEvent); - -/* -Signals the specified auto-reset event. -*/ -MA_API ma_result ma_event_signal(ma_event* pEvent); -#endif /* MA_NO_THREADING */ - - -/* -Fence -===== -This locks while the counter is larger than 0. Counter can be incremented and decremented by any -thread, but care needs to be taken when waiting. It is possible for one thread to acquire the -fence just as another thread returns from ma_fence_wait(). - -The idea behind a fence is to allow you to wait for a group of operations to complete. When an -operation starts, the counter is incremented which locks the fence. When the operation completes, -the fence will be released which decrements the counter. ma_fence_wait() will block until the -counter hits zero. - -If threading is disabled, ma_fence_wait() will spin on the counter. -*/ -typedef struct -{ -#ifndef MA_NO_THREADING - ma_event e; -#endif - ma_uint32 counter; -} ma_fence; - -MA_API ma_result ma_fence_init(ma_fence* pFence); -MA_API void ma_fence_uninit(ma_fence* pFence); -MA_API ma_result ma_fence_acquire(ma_fence* pFence); /* Increment counter. */ -MA_API ma_result ma_fence_release(ma_fence* pFence); /* Decrement counter. */ -MA_API ma_result ma_fence_wait(ma_fence* pFence); /* Wait for counter to reach 0. */ - - - -/* -Notification callback for asynchronous operations. -*/ -typedef void ma_async_notification; - -typedef struct -{ - void (* onSignal)(ma_async_notification* pNotification); -} ma_async_notification_callbacks; - -MA_API ma_result ma_async_notification_signal(ma_async_notification* pNotification); - - -/* -Simple polling notification. - -This just sets a variable when the notification has been signalled which is then polled with ma_async_notification_poll_is_signalled() -*/ -typedef struct -{ - ma_async_notification_callbacks cb; - ma_bool32 signalled; -} ma_async_notification_poll; - -MA_API ma_result ma_async_notification_poll_init(ma_async_notification_poll* pNotificationPoll); -MA_API ma_bool32 ma_async_notification_poll_is_signalled(const ma_async_notification_poll* pNotificationPoll); - - -/* -Event Notification - -This uses an ma_event. If threading is disabled (MA_NO_THREADING), initialization will fail. -*/ -typedef struct -{ - ma_async_notification_callbacks cb; -#ifndef MA_NO_THREADING - ma_event e; -#endif -} ma_async_notification_event; - -MA_API ma_result ma_async_notification_event_init(ma_async_notification_event* pNotificationEvent); -MA_API ma_result ma_async_notification_event_uninit(ma_async_notification_event* pNotificationEvent); -MA_API ma_result ma_async_notification_event_wait(ma_async_notification_event* pNotificationEvent); -MA_API ma_result ma_async_notification_event_signal(ma_async_notification_event* pNotificationEvent); - - - - -/************************************************************************************************************************************************************ - -Job Queue - -************************************************************************************************************************************************************/ - -/* -Slot Allocator --------------- -The idea of the slot allocator is for it to be used in conjunction with a fixed sized buffer. You use the slot allocator to allocator an index that can be used -as the insertion point for an object. - -Slots are reference counted to help mitigate the ABA problem in the lock-free queue we use for tracking jobs. - -The slot index is stored in the low 32 bits. The reference counter is stored in the high 32 bits: - - +-----------------+-----------------+ - | 32 Bits | 32 Bits | - +-----------------+-----------------+ - | Reference Count | Slot Index | - +-----------------+-----------------+ -*/ -typedef struct -{ - ma_uint32 capacity; /* The number of slots to make available. */ -} ma_slot_allocator_config; - -MA_API ma_slot_allocator_config ma_slot_allocator_config_init(ma_uint32 capacity); - - -typedef struct -{ - MA_ATOMIC(4, ma_uint32) bitfield; /* Must be used atomically because the allocation and freeing routines need to make copies of this which must never be optimized away by the compiler. */ -} ma_slot_allocator_group; - -typedef struct -{ - ma_slot_allocator_group* pGroups; /* Slots are grouped in chunks of 32. */ - ma_uint32* pSlots; /* 32 bits for reference counting for ABA mitigation. */ - ma_uint32 count; /* Allocation count. */ - ma_uint32 capacity; - - /* Memory management. */ - ma_bool32 _ownsHeap; - void* _pHeap; -} ma_slot_allocator; - -MA_API ma_result ma_slot_allocator_get_heap_size(const ma_slot_allocator_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_slot_allocator_init_preallocated(const ma_slot_allocator_config* pConfig, void* pHeap, ma_slot_allocator* pAllocator); -MA_API ma_result ma_slot_allocator_init(const ma_slot_allocator_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_slot_allocator* pAllocator); -MA_API void ma_slot_allocator_uninit(ma_slot_allocator* pAllocator, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_slot_allocator_alloc(ma_slot_allocator* pAllocator, ma_uint64* pSlot); -MA_API ma_result ma_slot_allocator_free(ma_slot_allocator* pAllocator, ma_uint64 slot); - - -typedef struct ma_job ma_job; - -/* -Callback for processing a job. Each job type will have their own processing callback which will be -called by ma_job_process(). -*/ -typedef ma_result (* ma_job_proc)(ma_job* pJob); - -/* When a job type is added here an callback needs to be added go "g_jobVTable" in the implementation section. */ -typedef enum -{ - /* Miscellaneous. */ - MA_JOB_TYPE_QUIT = 0, - MA_JOB_TYPE_CUSTOM, - - /* Resource Manager. */ - MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE, - MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE, - MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE, - MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER, - MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER, - MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM, - MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM, - MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM, - MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM, - - /* Device. */ - MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE, - - /* Count. Must always be last. */ - MA_JOB_TYPE_COUNT -} ma_job_type; - -struct ma_job -{ - union - { - struct - { - ma_uint16 code; /* Job type. */ - ma_uint16 slot; /* Index into a ma_slot_allocator. */ - ma_uint32 refcount; - } breakup; - ma_uint64 allocation; - } toc; /* 8 bytes. We encode the job code into the slot allocation data to save space. */ - MA_ATOMIC(8, ma_uint64) next; /* refcount + slot for the next item. Does not include the job code. */ - ma_uint32 order; /* Execution order. Used to create a data dependency and ensure a job is executed in order. Usage is contextual depending on the job type. */ - - union - { - /* Miscellaneous. */ - struct - { - ma_job_proc proc; - ma_uintptr data0; - ma_uintptr data1; - } custom; - - /* Resource Manager */ - union - { - struct - { - /*ma_resource_manager**/ void* pResourceManager; - /*ma_resource_manager_data_buffer_node**/ void* pDataBufferNode; - char* pFilePath; - wchar_t* pFilePathW; - ma_uint32 flags; /* Resource manager data source flags that were used when initializing the data buffer. */ - ma_async_notification* pInitNotification; /* Signalled when the data buffer has been initialized and the format/channels/rate can be retrieved. */ - ma_async_notification* pDoneNotification; /* Signalled when the data buffer has been fully decoded. Will be passed through to MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE when decoding. */ - ma_fence* pInitFence; /* Released when initialization of the decoder is complete. */ - ma_fence* pDoneFence; /* Released if initialization of the decoder fails. Passed through to PAGE_DATA_BUFFER_NODE untouched if init is successful. */ - } loadDataBufferNode; - struct - { - /*ma_resource_manager**/ void* pResourceManager; - /*ma_resource_manager_data_buffer_node**/ void* pDataBufferNode; - ma_async_notification* pDoneNotification; - ma_fence* pDoneFence; - } freeDataBufferNode; - struct - { - /*ma_resource_manager**/ void* pResourceManager; - /*ma_resource_manager_data_buffer_node**/ void* pDataBufferNode; - /*ma_decoder**/ void* pDecoder; - ma_async_notification* pDoneNotification; /* Signalled when the data buffer has been fully decoded. */ - ma_fence* pDoneFence; /* Passed through from LOAD_DATA_BUFFER_NODE and released when the data buffer completes decoding or an error occurs. */ - } pageDataBufferNode; - - struct - { - /*ma_resource_manager_data_buffer**/ void* pDataBuffer; - ma_async_notification* pInitNotification; /* Signalled when the data buffer has been initialized and the format/channels/rate can be retrieved. */ - ma_async_notification* pDoneNotification; /* Signalled when the data buffer has been fully decoded. */ - ma_fence* pInitFence; /* Released when the data buffer has been initialized and the format/channels/rate can be retrieved. */ - ma_fence* pDoneFence; /* Released when the data buffer has been fully decoded. */ - ma_uint64 rangeBegInPCMFrames; - ma_uint64 rangeEndInPCMFrames; - ma_uint64 loopPointBegInPCMFrames; - ma_uint64 loopPointEndInPCMFrames; - ma_uint32 isLooping; - } loadDataBuffer; - struct - { - /*ma_resource_manager_data_buffer**/ void* pDataBuffer; - ma_async_notification* pDoneNotification; - ma_fence* pDoneFence; - } freeDataBuffer; - - struct - { - /*ma_resource_manager_data_stream**/ void* pDataStream; - char* pFilePath; /* Allocated when the job is posted, freed by the job thread after loading. */ - wchar_t* pFilePathW; /* ^ As above ^. Only used if pFilePath is NULL. */ - ma_uint64 initialSeekPoint; - ma_async_notification* pInitNotification; /* Signalled after the first two pages have been decoded and frames can be read from the stream. */ - ma_fence* pInitFence; - } loadDataStream; - struct - { - /*ma_resource_manager_data_stream**/ void* pDataStream; - ma_async_notification* pDoneNotification; - ma_fence* pDoneFence; - } freeDataStream; - struct - { - /*ma_resource_manager_data_stream**/ void* pDataStream; - ma_uint32 pageIndex; /* The index of the page to decode into. */ - } pageDataStream; - struct - { - /*ma_resource_manager_data_stream**/ void* pDataStream; - ma_uint64 frameIndex; - } seekDataStream; - } resourceManager; - - /* Device. */ - union - { - union - { - struct - { - /*ma_device**/ void* pDevice; - /*ma_device_type*/ ma_uint32 deviceType; - } reroute; - } aaudio; - } device; - } data; -}; - -MA_API ma_job ma_job_init(ma_uint16 code); -MA_API ma_result ma_job_process(ma_job* pJob); - - -/* -When set, ma_job_queue_next() will not wait and no semaphore will be signaled in -ma_job_queue_post(). ma_job_queue_next() will return MA_NO_DATA_AVAILABLE if nothing is available. - -This flag should always be used for platforms that do not support multithreading. -*/ -typedef enum -{ - MA_JOB_QUEUE_FLAG_NON_BLOCKING = 0x00000001 -} ma_job_queue_flags; - -typedef struct -{ - ma_uint32 flags; - ma_uint32 capacity; /* The maximum number of jobs that can fit in the queue at a time. */ -} ma_job_queue_config; - -MA_API ma_job_queue_config ma_job_queue_config_init(ma_uint32 flags, ma_uint32 capacity); - - -typedef struct -{ - ma_uint32 flags; /* Flags passed in at initialization time. */ - ma_uint32 capacity; /* The maximum number of jobs that can fit in the queue at a time. Set by the config. */ - MA_ATOMIC(8, ma_uint64) head; /* The first item in the list. Required for removing from the top of the list. */ - MA_ATOMIC(8, ma_uint64) tail; /* The last item in the list. Required for appending to the end of the list. */ -#ifndef MA_NO_THREADING - ma_semaphore sem; /* Only used when MA_JOB_QUEUE_FLAG_NON_BLOCKING is unset. */ -#endif - ma_slot_allocator allocator; - ma_job* pJobs; -#ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE - ma_spinlock lock; -#endif - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_job_queue; - -MA_API ma_result ma_job_queue_get_heap_size(const ma_job_queue_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_job_queue_init_preallocated(const ma_job_queue_config* pConfig, void* pHeap, ma_job_queue* pQueue); -MA_API ma_result ma_job_queue_init(const ma_job_queue_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_job_queue* pQueue); -MA_API void ma_job_queue_uninit(ma_job_queue* pQueue, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_job_queue_post(ma_job_queue* pQueue, const ma_job* pJob); -MA_API ma_result ma_job_queue_next(ma_job_queue* pQueue, ma_job* pJob); /* Returns MA_CANCELLED if the next job is a quit job. */ - - - -/************************************************************************************************************************************************************ -************************************************************************************************************************************************************* - -DEVICE I/O -========== - -This section contains the APIs for device playback and capture. Here is where you'll find ma_device_init(), etc. - -************************************************************************************************************************************************************* -************************************************************************************************************************************************************/ -#ifndef MA_NO_DEVICE_IO -/* Some backends are only supported on certain platforms. */ -#if defined(MA_WIN32) - #define MA_SUPPORT_WASAPI - #if defined(MA_WIN32_DESKTOP) /* DirectSound and WinMM backends are only supported on desktops. */ - #define MA_SUPPORT_DSOUND - #define MA_SUPPORT_WINMM - #define MA_SUPPORT_JACK /* JACK is technically supported on Windows, but I don't know how many people use it in practice... */ - #endif -#endif -#if defined(MA_UNIX) - #if defined(MA_LINUX) - #if !defined(MA_ANDROID) /* ALSA is not supported on Android. */ - #define MA_SUPPORT_ALSA - #endif - #endif - #if !defined(MA_BSD) && !defined(MA_ANDROID) && !defined(MA_EMSCRIPTEN) - #define MA_SUPPORT_PULSEAUDIO - #define MA_SUPPORT_JACK - #endif - #if defined(MA_ANDROID) - #define MA_SUPPORT_AAUDIO - #define MA_SUPPORT_OPENSL - #endif - #if defined(__OpenBSD__) /* <-- Change this to "#if defined(MA_BSD)" to enable sndio on all BSD flavors. */ - #define MA_SUPPORT_SNDIO /* sndio is only supported on OpenBSD for now. May be expanded later if there's demand. */ - #endif - #if defined(__NetBSD__) || defined(__OpenBSD__) - #define MA_SUPPORT_AUDIO4 /* Only support audio(4) on platforms with known support. */ - #endif - #if defined(__FreeBSD__) || defined(__DragonFly__) - #define MA_SUPPORT_OSS /* Only support OSS on specific platforms with known support. */ - #endif -#endif -#if defined(MA_APPLE) - #define MA_SUPPORT_COREAUDIO -#endif -#if defined(MA_EMSCRIPTEN) - #define MA_SUPPORT_WEBAUDIO -#endif - -/* All platforms should support custom backends. */ -#define MA_SUPPORT_CUSTOM - -/* Explicitly disable the Null backend for Emscripten because it uses a background thread which is not properly supported right now. */ -#if !defined(MA_EMSCRIPTEN) -#define MA_SUPPORT_NULL -#endif - - -#if defined(MA_SUPPORT_WASAPI) && !defined(MA_NO_WASAPI) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_WASAPI)) - #define MA_HAS_WASAPI -#endif -#if defined(MA_SUPPORT_DSOUND) && !defined(MA_NO_DSOUND) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_DSOUND)) - #define MA_HAS_DSOUND -#endif -#if defined(MA_SUPPORT_WINMM) && !defined(MA_NO_WINMM) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_WINMM)) - #define MA_HAS_WINMM -#endif -#if defined(MA_SUPPORT_ALSA) && !defined(MA_NO_ALSA) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_ALSA)) - #define MA_HAS_ALSA -#endif -#if defined(MA_SUPPORT_PULSEAUDIO) && !defined(MA_NO_PULSEAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_PULSEAUDIO)) - #define MA_HAS_PULSEAUDIO -#endif -#if defined(MA_SUPPORT_JACK) && !defined(MA_NO_JACK) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_JACK)) - #define MA_HAS_JACK -#endif -#if defined(MA_SUPPORT_COREAUDIO) && !defined(MA_NO_COREAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_COREAUDIO)) - #define MA_HAS_COREAUDIO -#endif -#if defined(MA_SUPPORT_SNDIO) && !defined(MA_NO_SNDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_SNDIO)) - #define MA_HAS_SNDIO -#endif -#if defined(MA_SUPPORT_AUDIO4) && !defined(MA_NO_AUDIO4) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_AUDIO4)) - #define MA_HAS_AUDIO4 -#endif -#if defined(MA_SUPPORT_OSS) && !defined(MA_NO_OSS) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_OSS)) - #define MA_HAS_OSS -#endif -#if defined(MA_SUPPORT_AAUDIO) && !defined(MA_NO_AAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_AAUDIO)) - #define MA_HAS_AAUDIO -#endif -#if defined(MA_SUPPORT_OPENSL) && !defined(MA_NO_OPENSL) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_OPENSL)) - #define MA_HAS_OPENSL -#endif -#if defined(MA_SUPPORT_WEBAUDIO) && !defined(MA_NO_WEBAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_WEBAUDIO)) - #define MA_HAS_WEBAUDIO -#endif -#if defined(MA_SUPPORT_CUSTOM) && !defined(MA_NO_CUSTOM) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_CUSTOM)) - #define MA_HAS_CUSTOM -#endif -#if defined(MA_SUPPORT_NULL) && !defined(MA_NO_NULL) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_NULL)) - #define MA_HAS_NULL -#endif - -typedef enum -{ - ma_device_state_uninitialized = 0, - ma_device_state_stopped = 1, /* The device's default state after initialization. */ - ma_device_state_started = 2, /* The device is started and is requesting and/or delivering audio data. */ - ma_device_state_starting = 3, /* Transitioning from a stopped state to started. */ - ma_device_state_stopping = 4 /* Transitioning from a started state to stopped. */ -} ma_device_state; - -#ifdef MA_SUPPORT_WASAPI -/* We need a IMMNotificationClient object for WASAPI. */ -typedef struct -{ - void* lpVtbl; - ma_uint32 counter; - ma_device* pDevice; -} ma_IMMNotificationClient; -#endif - -/* Backend enums must be in priority order. */ -typedef enum -{ - ma_backend_wasapi, - ma_backend_dsound, - ma_backend_winmm, - ma_backend_coreaudio, - ma_backend_sndio, - ma_backend_audio4, - ma_backend_oss, - ma_backend_pulseaudio, - ma_backend_alsa, - ma_backend_jack, - ma_backend_aaudio, - ma_backend_opensl, - ma_backend_webaudio, - ma_backend_custom, /* <-- Custom backend, with callbacks defined by the context config. */ - ma_backend_null /* <-- Must always be the last item. Lowest priority, and used as the terminator for backend enumeration. */ -} ma_backend; - -#define MA_BACKEND_COUNT (ma_backend_null+1) - - -/* -Device job thread. This is used by backends that require asynchronous processing of certain -operations. It is not used by all backends. - -The device job thread is made up of a thread and a job queue. You can post a job to the thread with -ma_device_job_thread_post(). The thread will do the processing of the job. -*/ -typedef struct -{ - ma_bool32 noThread; /* Set this to true if you want to process jobs yourself. */ - ma_uint32 jobQueueCapacity; - ma_uint32 jobQueueFlags; -} ma_device_job_thread_config; - -MA_API ma_device_job_thread_config ma_device_job_thread_config_init(void); - -typedef struct -{ - ma_thread thread; - ma_job_queue jobQueue; - ma_bool32 _hasThread; -} ma_device_job_thread; - -MA_API ma_result ma_device_job_thread_init(const ma_device_job_thread_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_device_job_thread* pJobThread); -MA_API void ma_device_job_thread_uninit(ma_device_job_thread* pJobThread, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_device_job_thread_post(ma_device_job_thread* pJobThread, const ma_job* pJob); -MA_API ma_result ma_device_job_thread_next(ma_device_job_thread* pJobThread, ma_job* pJob); - - - -/* Device notification types. */ -typedef enum -{ - ma_device_notification_type_started, - ma_device_notification_type_stopped, - ma_device_notification_type_rerouted, - ma_device_notification_type_interruption_began, - ma_device_notification_type_interruption_ended -} ma_device_notification_type; - -typedef struct -{ - ma_device* pDevice; - ma_device_notification_type type; - union - { - struct - { - int _unused; - } started; - struct - { - int _unused; - } stopped; - struct - { - int _unused; - } rerouted; - struct - { - int _unused; - } interruption; - } data; -} ma_device_notification; - -/* -The notification callback for when the application should be notified of a change to the device. - -This callback is used for notifying the application of changes such as when the device has started, -stopped, rerouted or an interruption has occurred. Note that not all backends will post all -notification types. For example, some backends will perform automatic stream routing without any -kind of notification to the host program which means miniaudio will never know about it and will -never be able to fire the rerouted notification. You should keep this in mind when designing your -program. - -The stopped notification will *not* get fired when a device is rerouted. - - -Parameters ----------- -pNotification (in) - A pointer to a structure containing information about the event. Use the `pDevice` member of - this object to retrieve the relevant device. The `type` member can be used to discriminate - against each of the notification types. - - -Remarks -------- -Do not restart or uninitialize the device from the callback. - -Not all notifications will be triggered by all backends, however the started and stopped events -should be reliable for all backends. Some backends do not have a good way to detect device -stoppages due to unplugging the device which may result in the stopped callback not getting -fired. This has been observed with at least one BSD variant. - -The rerouted notification is fired *after* the reroute has occurred. The stopped notification will -*not* get fired when a device is rerouted. The following backends are known to do automatic stream -rerouting, but do not have a way to be notified of the change: - - * DirectSound - -The interruption notifications are used on mobile platforms for detecting when audio is interrupted -due to things like an incoming phone call. Currently this is only implemented on iOS. None of the -Android backends will report this notification. -*/ -typedef void (* ma_device_notification_proc)(const ma_device_notification* pNotification); - - -/* -The callback for processing audio data from the device. - -The data callback is fired by miniaudio whenever the device needs to have more data delivered to a playback device, or when a capture device has some data -available. This is called as soon as the backend asks for more data which means it may be called with inconsistent frame counts. You cannot assume the -callback will be fired with a consistent frame count. - - -Parameters ----------- -pDevice (in) - A pointer to the relevant device. - -pOutput (out) - A pointer to the output buffer that will receive audio data that will later be played back through the speakers. This will be non-null for a playback or - full-duplex device and null for a capture and loopback device. - -pInput (in) - A pointer to the buffer containing input data from a recording device. This will be non-null for a capture, full-duplex or loopback device and null for a - playback device. - -frameCount (in) - The number of PCM frames to process. Note that this will not necessarily be equal to what you requested when you initialized the device. The - `periodSizeInFrames` and `periodSizeInMilliseconds` members of the device config are just hints, and are not necessarily exactly what you'll get. You must - not assume this will always be the same value each time the callback is fired. - - -Remarks -------- -You cannot stop and start the device from inside the callback or else you'll get a deadlock. You must also not uninitialize the device from inside the -callback. The following APIs cannot be called from inside the callback: - - ma_device_init() - ma_device_init_ex() - ma_device_uninit() - ma_device_start() - ma_device_stop() - -The proper way to stop the device is to call `ma_device_stop()` from a different thread, normally the main application thread. -*/ -typedef void (* ma_device_data_proc)(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount); - - - - -/* -DEPRECATED. Use ma_device_notification_proc instead. - -The callback for when the device has been stopped. - -This will be called when the device is stopped explicitly with `ma_device_stop()` and also called implicitly when the device is stopped through external forces -such as being unplugged or an internal error occuring. - - -Parameters ----------- -pDevice (in) - A pointer to the device that has just stopped. - - -Remarks -------- -Do not restart or uninitialize the device from the callback. -*/ -typedef void (* ma_stop_proc)(ma_device* pDevice); /* DEPRECATED. Use ma_device_notification_proc instead. */ - -typedef enum -{ - ma_device_type_playback = 1, - ma_device_type_capture = 2, - ma_device_type_duplex = ma_device_type_playback | ma_device_type_capture, /* 3 */ - ma_device_type_loopback = 4 -} ma_device_type; - -typedef enum -{ - ma_share_mode_shared = 0, - ma_share_mode_exclusive -} ma_share_mode; - -/* iOS/tvOS/watchOS session categories. */ -typedef enum -{ - ma_ios_session_category_default = 0, /* AVAudioSessionCategoryPlayAndRecord with AVAudioSessionCategoryOptionDefaultToSpeaker. */ - ma_ios_session_category_none, /* Leave the session category unchanged. */ - ma_ios_session_category_ambient, /* AVAudioSessionCategoryAmbient */ - ma_ios_session_category_solo_ambient, /* AVAudioSessionCategorySoloAmbient */ - ma_ios_session_category_playback, /* AVAudioSessionCategoryPlayback */ - ma_ios_session_category_record, /* AVAudioSessionCategoryRecord */ - ma_ios_session_category_play_and_record, /* AVAudioSessionCategoryPlayAndRecord */ - ma_ios_session_category_multi_route /* AVAudioSessionCategoryMultiRoute */ -} ma_ios_session_category; - -/* iOS/tvOS/watchOS session category options */ -typedef enum -{ - ma_ios_session_category_option_mix_with_others = 0x01, /* AVAudioSessionCategoryOptionMixWithOthers */ - ma_ios_session_category_option_duck_others = 0x02, /* AVAudioSessionCategoryOptionDuckOthers */ - ma_ios_session_category_option_allow_bluetooth = 0x04, /* AVAudioSessionCategoryOptionAllowBluetooth */ - ma_ios_session_category_option_default_to_speaker = 0x08, /* AVAudioSessionCategoryOptionDefaultToSpeaker */ - ma_ios_session_category_option_interrupt_spoken_audio_and_mix_with_others = 0x11, /* AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers */ - ma_ios_session_category_option_allow_bluetooth_a2dp = 0x20, /* AVAudioSessionCategoryOptionAllowBluetoothA2DP */ - ma_ios_session_category_option_allow_air_play = 0x40, /* AVAudioSessionCategoryOptionAllowAirPlay */ -} ma_ios_session_category_option; - -/* OpenSL stream types. */ -typedef enum -{ - ma_opensl_stream_type_default = 0, /* Leaves the stream type unset. */ - ma_opensl_stream_type_voice, /* SL_ANDROID_STREAM_VOICE */ - ma_opensl_stream_type_system, /* SL_ANDROID_STREAM_SYSTEM */ - ma_opensl_stream_type_ring, /* SL_ANDROID_STREAM_RING */ - ma_opensl_stream_type_media, /* SL_ANDROID_STREAM_MEDIA */ - ma_opensl_stream_type_alarm, /* SL_ANDROID_STREAM_ALARM */ - ma_opensl_stream_type_notification /* SL_ANDROID_STREAM_NOTIFICATION */ -} ma_opensl_stream_type; - -/* OpenSL recording presets. */ -typedef enum -{ - ma_opensl_recording_preset_default = 0, /* Leaves the input preset unset. */ - ma_opensl_recording_preset_generic, /* SL_ANDROID_RECORDING_PRESET_GENERIC */ - ma_opensl_recording_preset_camcorder, /* SL_ANDROID_RECORDING_PRESET_CAMCORDER */ - ma_opensl_recording_preset_voice_recognition, /* SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION */ - ma_opensl_recording_preset_voice_communication, /* SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION */ - ma_opensl_recording_preset_voice_unprocessed /* SL_ANDROID_RECORDING_PRESET_UNPROCESSED */ -} ma_opensl_recording_preset; - -/* AAudio usage types. */ -typedef enum -{ - ma_aaudio_usage_default = 0, /* Leaves the usage type unset. */ - ma_aaudio_usage_announcement, /* AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT */ - ma_aaudio_usage_emergency, /* AAUDIO_SYSTEM_USAGE_EMERGENCY */ - ma_aaudio_usage_safety, /* AAUDIO_SYSTEM_USAGE_SAFETY */ - ma_aaudio_usage_vehicle_status, /* AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS */ - ma_aaudio_usage_alarm, /* AAUDIO_USAGE_ALARM */ - ma_aaudio_usage_assistance_accessibility, /* AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY */ - ma_aaudio_usage_assistance_navigation_guidance, /* AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE */ - ma_aaudio_usage_assistance_sonification, /* AAUDIO_USAGE_ASSISTANCE_SONIFICATION */ - ma_aaudio_usage_assitant, /* AAUDIO_USAGE_ASSISTANT */ - ma_aaudio_usage_game, /* AAUDIO_USAGE_GAME */ - ma_aaudio_usage_media, /* AAUDIO_USAGE_MEDIA */ - ma_aaudio_usage_notification, /* AAUDIO_USAGE_NOTIFICATION */ - ma_aaudio_usage_notification_event, /* AAUDIO_USAGE_NOTIFICATION_EVENT */ - ma_aaudio_usage_notification_ringtone, /* AAUDIO_USAGE_NOTIFICATION_RINGTONE */ - ma_aaudio_usage_voice_communication, /* AAUDIO_USAGE_VOICE_COMMUNICATION */ - ma_aaudio_usage_voice_communication_signalling /* AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING */ -} ma_aaudio_usage; - -/* AAudio content types. */ -typedef enum -{ - ma_aaudio_content_type_default = 0, /* Leaves the content type unset. */ - ma_aaudio_content_type_movie, /* AAUDIO_CONTENT_TYPE_MOVIE */ - ma_aaudio_content_type_music, /* AAUDIO_CONTENT_TYPE_MUSIC */ - ma_aaudio_content_type_sonification, /* AAUDIO_CONTENT_TYPE_SONIFICATION */ - ma_aaudio_content_type_speech /* AAUDIO_CONTENT_TYPE_SPEECH */ -} ma_aaudio_content_type; - -/* AAudio input presets. */ -typedef enum -{ - ma_aaudio_input_preset_default = 0, /* Leaves the input preset unset. */ - ma_aaudio_input_preset_generic, /* AAUDIO_INPUT_PRESET_GENERIC */ - ma_aaudio_input_preset_camcorder, /* AAUDIO_INPUT_PRESET_CAMCORDER */ - ma_aaudio_input_preset_unprocessed, /* AAUDIO_INPUT_PRESET_UNPROCESSED */ - ma_aaudio_input_preset_voice_recognition, /* AAUDIO_INPUT_PRESET_VOICE_RECOGNITION */ - ma_aaudio_input_preset_voice_communication, /* AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION */ - ma_aaudio_input_preset_voice_performance /* AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE */ -} ma_aaudio_input_preset; - - -typedef union -{ - ma_int64 counter; - double counterD; -} ma_timer; - -typedef union -{ - wchar_t wasapi[64]; /* WASAPI uses a wchar_t string for identification. */ - ma_uint8 dsound[16]; /* DirectSound uses a GUID for identification. */ - /*UINT_PTR*/ ma_uint32 winmm; /* When creating a device, WinMM expects a Win32 UINT_PTR for device identification. In practice it's actually just a UINT. */ - char alsa[256]; /* ALSA uses a name string for identification. */ - char pulse[256]; /* PulseAudio uses a name string for identification. */ - int jack; /* JACK always uses default devices. */ - char coreaudio[256]; /* Core Audio uses a string for identification. */ - char sndio[256]; /* "snd/0", etc. */ - char audio4[256]; /* "/dev/audio", etc. */ - char oss[64]; /* "dev/dsp0", etc. "dev/dsp" for the default device. */ - ma_int32 aaudio; /* AAudio uses a 32-bit integer for identification. */ - ma_uint32 opensl; /* OpenSL|ES uses a 32-bit unsigned integer for identification. */ - char webaudio[32]; /* Web Audio always uses default devices for now, but if this changes it'll be a GUID. */ - union - { - int i; - char s[256]; - void* p; - } custom; /* The custom backend could be anything. Give them a few options. */ - int nullbackend; /* The null backend uses an integer for device IDs. */ -} ma_device_id; - - -typedef struct ma_context_config ma_context_config; -typedef struct ma_device_config ma_device_config; -typedef struct ma_backend_callbacks ma_backend_callbacks; - -#define MA_DATA_FORMAT_FLAG_EXCLUSIVE_MODE (1U << 1) /* If set, this is supported in exclusive mode. Otherwise not natively supported by exclusive mode. */ - -#ifndef MA_MAX_DEVICE_NAME_LENGTH -#define MA_MAX_DEVICE_NAME_LENGTH 255 -#endif - -typedef struct -{ - /* Basic info. This is the only information guaranteed to be filled in during device enumeration. */ - ma_device_id id; - char name[MA_MAX_DEVICE_NAME_LENGTH + 1]; /* +1 for null terminator. */ - ma_bool32 isDefault; - - ma_uint32 nativeDataFormatCount; - struct - { - ma_format format; /* Sample format. If set to ma_format_unknown, all sample formats are supported. */ - ma_uint32 channels; /* If set to 0, all channels are supported. */ - ma_uint32 sampleRate; /* If set to 0, all sample rates are supported. */ - ma_uint32 flags; /* A combination of MA_DATA_FORMAT_FLAG_* flags. */ - } nativeDataFormats[/*ma_format_count * ma_standard_sample_rate_count * MA_MAX_CHANNELS*/ 64]; /* Not sure how big to make this. There can be *many* permutations for virtual devices which can support anything. */ -} ma_device_info; - -struct ma_device_config -{ - ma_device_type deviceType; - ma_uint32 sampleRate; - ma_uint32 periodSizeInFrames; - ma_uint32 periodSizeInMilliseconds; - ma_uint32 periods; - ma_performance_profile performanceProfile; - ma_bool8 noPreSilencedOutputBuffer; /* When set to true, the contents of the output buffer passed into the data callback will be left undefined rather than initialized to silence. */ - ma_bool8 noClip; /* When set to true, the contents of the output buffer passed into the data callback will be clipped after returning. Only applies when the playback sample format is f32. */ - ma_bool8 noDisableDenormals; /* Do not disable denormals when firing the data callback. */ - ma_bool8 noFixedSizedCallback; /* Disables strict fixed-sized data callbacks. Setting this to true will result in the period size being treated only as a hint to the backend. This is an optimization for those who don't need fixed sized callbacks. */ - ma_device_data_proc dataCallback; - ma_device_notification_proc notificationCallback; - ma_stop_proc stopCallback; - void* pUserData; - ma_resampler_config resampling; - struct - { - const ma_device_id* pDeviceID; - ma_format format; - ma_uint32 channels; - ma_channel* pChannelMap; - ma_channel_mix_mode channelMixMode; - ma_share_mode shareMode; - } playback; - struct - { - const ma_device_id* pDeviceID; - ma_format format; - ma_uint32 channels; - ma_channel* pChannelMap; - ma_channel_mix_mode channelMixMode; - ma_share_mode shareMode; - } capture; - - struct - { - ma_bool8 noAutoConvertSRC; /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM. */ - ma_bool8 noDefaultQualitySRC; /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY. */ - ma_bool8 noAutoStreamRouting; /* Disables automatic stream routing. */ - ma_bool8 noHardwareOffloading; /* Disables WASAPI's hardware offloading feature. */ - } wasapi; - struct - { - ma_bool32 noMMap; /* Disables MMap mode. */ - ma_bool32 noAutoFormat; /* Opens the ALSA device with SND_PCM_NO_AUTO_FORMAT. */ - ma_bool32 noAutoChannels; /* Opens the ALSA device with SND_PCM_NO_AUTO_CHANNELS. */ - ma_bool32 noAutoResample; /* Opens the ALSA device with SND_PCM_NO_AUTO_RESAMPLE. */ - } alsa; - struct - { - const char* pStreamNamePlayback; - const char* pStreamNameCapture; - } pulse; - struct - { - ma_bool32 allowNominalSampleRateChange; /* Desktop only. When enabled, allows changing of the sample rate at the operating system level. */ - } coreaudio; - struct - { - ma_opensl_stream_type streamType; - ma_opensl_recording_preset recordingPreset; - } opensl; - struct - { - ma_aaudio_usage usage; - ma_aaudio_content_type contentType; - ma_aaudio_input_preset inputPreset; - ma_bool32 noAutoStartAfterReroute; - } aaudio; -}; - - -/* -The callback for handling device enumeration. This is fired from `ma_context_enumerated_devices()`. - - -Parameters ----------- -pContext (in) - A pointer to the context performing the enumeration. - -deviceType (in) - The type of the device being enumerated. This will always be either `ma_device_type_playback` or `ma_device_type_capture`. - -pInfo (in) - A pointer to a `ma_device_info` containing the ID and name of the enumerated device. Note that this will not include detailed information about the device, - only basic information (ID and name). The reason for this is that it would otherwise require opening the backend device to probe for the information which - is too inefficient. - -pUserData (in) - The user data pointer passed into `ma_context_enumerate_devices()`. -*/ -typedef ma_bool32 (* ma_enum_devices_callback_proc)(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData); - - -/* -Describes some basic details about a playback or capture device. -*/ -typedef struct -{ - const ma_device_id* pDeviceID; - ma_share_mode shareMode; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_channel channelMap[MA_MAX_CHANNELS]; - ma_uint32 periodSizeInFrames; - ma_uint32 periodSizeInMilliseconds; - ma_uint32 periodCount; -} ma_device_descriptor; - -/* -These are the callbacks required to be implemented for a backend. These callbacks are grouped into two parts: context and device. There is one context -to many devices. A device is created from a context. - -The general flow goes like this: - - 1) A context is created with `onContextInit()` - 1a) Available devices can be enumerated with `onContextEnumerateDevices()` if required. - 1b) Detailed information about a device can be queried with `onContextGetDeviceInfo()` if required. - 2) A device is created from the context that was created in the first step using `onDeviceInit()`, and optionally a device ID that was - selected from device enumeration via `onContextEnumerateDevices()`. - 3) A device is started or stopped with `onDeviceStart()` / `onDeviceStop()` - 4) Data is delivered to and from the device by the backend. This is always done based on the native format returned by the prior call - to `onDeviceInit()`. Conversion between the device's native format and the format requested by the application will be handled by - miniaudio internally. - -Initialization of the context is quite simple. You need to do any necessary initialization of internal objects and then output the -callbacks defined in this structure. - -Once the context has been initialized you can initialize a device. Before doing so, however, the application may want to know which -physical devices are available. This is where `onContextEnumerateDevices()` comes in. This is fairly simple. For each device, fire the -given callback with, at a minimum, the basic information filled out in `ma_device_info`. When the callback returns `MA_FALSE`, enumeration -needs to stop and the `onContextEnumerateDevices()` function returns with a success code. - -Detailed device information can be retrieved from a device ID using `onContextGetDeviceInfo()`. This takes as input the device type and ID, -and on output returns detailed information about the device in `ma_device_info`. The `onContextGetDeviceInfo()` callback must handle the -case when the device ID is NULL, in which case information about the default device needs to be retrieved. - -Once the context has been created and the device ID retrieved (if using anything other than the default device), the device can be created. -This is a little bit more complicated than initialization of the context due to it's more complicated configuration. When initializing a -device, a duplex device may be requested. This means a separate data format needs to be specified for both playback and capture. On input, -the data format is set to what the application wants. On output it's set to the native format which should match as closely as possible to -the requested format. The conversion between the format requested by the application and the device's native format will be handled -internally by miniaudio. - -On input, if the sample format is set to `ma_format_unknown`, the backend is free to use whatever sample format it desires, so long as it's -supported by miniaudio. When the channel count is set to 0, the backend should use the device's native channel count. The same applies for -sample rate. For the channel map, the default should be used when `ma_channel_map_is_blank()` returns true (all channels set to -`MA_CHANNEL_NONE`). On input, the `periodSizeInFrames` or `periodSizeInMilliseconds` option should always be set. The backend should -inspect both of these variables. If `periodSizeInFrames` is set, it should take priority, otherwise it needs to be derived from the period -size in milliseconds (`periodSizeInMilliseconds`) and the sample rate, keeping in mind that the sample rate may be 0, in which case the -sample rate will need to be determined before calculating the period size in frames. On output, all members of the `ma_device_data_format` -object should be set to a valid value, except for `periodSizeInMilliseconds` which is optional (`periodSizeInFrames` *must* be set). - -Starting and stopping of the device is done with `onDeviceStart()` and `onDeviceStop()` and should be self-explanatory. If the backend uses -asynchronous reading and writing, `onDeviceStart()` and `onDeviceStop()` should always be implemented. - -The handling of data delivery between the application and the device is the most complicated part of the process. To make this a bit -easier, some helper callbacks are available. If the backend uses a blocking read/write style of API, the `onDeviceRead()` and -`onDeviceWrite()` callbacks can optionally be implemented. These are blocking and work just like reading and writing from a file. If the -backend uses a callback for data delivery, that callback must call `ma_device_handle_backend_data_callback()` from within it's callback. -This allows miniaudio to then process any necessary data conversion and then pass it to the miniaudio data callback. - -If the backend requires absolute flexibility with it's data delivery, it can optionally implement the `onDeviceDataLoop()` callback -which will allow it to implement the logic that will run on the audio thread. This is much more advanced and is completely optional. - -The audio thread should run data delivery logic in a loop while `ma_device_get_state() == ma_device_state_started` and no errors have been -encounted. Do not start or stop the device here. That will be handled from outside the `onDeviceDataLoop()` callback. - -The invocation of the `onDeviceDataLoop()` callback will be handled by miniaudio. When you start the device, miniaudio will fire this -callback. When the device is stopped, the `ma_device_get_state() == ma_device_state_started` condition will fail and the loop will be terminated -which will then fall through to the part that stops the device. For an example on how to implement the `onDeviceDataLoop()` callback, -look at `ma_device_audio_thread__default_read_write()`. Implement the `onDeviceDataLoopWakeup()` callback if you need a mechanism to -wake up the audio thread. - -If the backend supports an optimized retrieval of device information from an initialized `ma_device` object, it should implement the -`onDeviceGetInfo()` callback. This is optional, in which case it will fall back to `onContextGetDeviceInfo()` which is less efficient. -*/ -struct ma_backend_callbacks -{ - ma_result (* onContextInit)(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks); - ma_result (* onContextUninit)(ma_context* pContext); - ma_result (* onContextEnumerateDevices)(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData); - ma_result (* onContextGetDeviceInfo)(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo); - ma_result (* onDeviceInit)(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture); - ma_result (* onDeviceUninit)(ma_device* pDevice); - ma_result (* onDeviceStart)(ma_device* pDevice); - ma_result (* onDeviceStop)(ma_device* pDevice); - ma_result (* onDeviceRead)(ma_device* pDevice, void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesRead); - ma_result (* onDeviceWrite)(ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten); - ma_result (* onDeviceDataLoop)(ma_device* pDevice); - ma_result (* onDeviceDataLoopWakeup)(ma_device* pDevice); - ma_result (* onDeviceGetInfo)(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo); -}; - -struct ma_context_config -{ - ma_log* pLog; - ma_thread_priority threadPriority; - size_t threadStackSize; - void* pUserData; - ma_allocation_callbacks allocationCallbacks; - struct - { - ma_bool32 useVerboseDeviceEnumeration; - } alsa; - struct - { - const char* pApplicationName; - const char* pServerName; - ma_bool32 tryAutoSpawn; /* Enables autospawning of the PulseAudio daemon if necessary. */ - } pulse; - struct - { - ma_ios_session_category sessionCategory; - ma_uint32 sessionCategoryOptions; - ma_bool32 noAudioSessionActivate; /* iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:true] on initialization. */ - ma_bool32 noAudioSessionDeactivate; /* iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:false] on uninitialization. */ - } coreaudio; - struct - { - const char* pClientName; - ma_bool32 tryStartServer; - } jack; - ma_backend_callbacks custom; -}; - -/* WASAPI specific structure for some commands which must run on a common thread due to bugs in WASAPI. */ -typedef struct -{ - int code; - ma_event* pEvent; /* This will be signalled when the event is complete. */ - union - { - struct - { - int _unused; - } quit; - struct - { - ma_device_type deviceType; - void* pAudioClient; - void** ppAudioClientService; - ma_result* pResult; /* The result from creating the audio client service. */ - } createAudioClient; - struct - { - ma_device* pDevice; - ma_device_type deviceType; - } releaseAudioClient; - } data; -} ma_context_command__wasapi; - -struct ma_context -{ - ma_backend_callbacks callbacks; - ma_backend backend; /* DirectSound, ALSA, etc. */ - ma_log* pLog; - ma_log log; /* Only used if the log is owned by the context. The pLog member will be set to &log in this case. */ - ma_thread_priority threadPriority; - size_t threadStackSize; - void* pUserData; - ma_allocation_callbacks allocationCallbacks; - ma_mutex deviceEnumLock; /* Used to make ma_context_get_devices() thread safe. */ - ma_mutex deviceInfoLock; /* Used to make ma_context_get_device_info() thread safe. */ - ma_uint32 deviceInfoCapacity; /* Total capacity of pDeviceInfos. */ - ma_uint32 playbackDeviceInfoCount; - ma_uint32 captureDeviceInfoCount; - ma_device_info* pDeviceInfos; /* Playback devices first, then capture. */ - - union - { -#ifdef MA_SUPPORT_WASAPI - struct - { - ma_thread commandThread; - ma_mutex commandLock; - ma_semaphore commandSem; - ma_uint32 commandIndex; - ma_uint32 commandCount; - ma_context_command__wasapi commands[4]; - } wasapi; -#endif -#ifdef MA_SUPPORT_DSOUND - struct - { - ma_handle hDSoundDLL; - ma_proc DirectSoundCreate; - ma_proc DirectSoundEnumerateA; - ma_proc DirectSoundCaptureCreate; - ma_proc DirectSoundCaptureEnumerateA; - } dsound; -#endif -#ifdef MA_SUPPORT_WINMM - struct - { - ma_handle hWinMM; - ma_proc waveOutGetNumDevs; - ma_proc waveOutGetDevCapsA; - ma_proc waveOutOpen; - ma_proc waveOutClose; - ma_proc waveOutPrepareHeader; - ma_proc waveOutUnprepareHeader; - ma_proc waveOutWrite; - ma_proc waveOutReset; - ma_proc waveInGetNumDevs; - ma_proc waveInGetDevCapsA; - ma_proc waveInOpen; - ma_proc waveInClose; - ma_proc waveInPrepareHeader; - ma_proc waveInUnprepareHeader; - ma_proc waveInAddBuffer; - ma_proc waveInStart; - ma_proc waveInReset; - } winmm; -#endif -#ifdef MA_SUPPORT_ALSA - struct - { - ma_handle asoundSO; - ma_proc snd_pcm_open; - ma_proc snd_pcm_close; - ma_proc snd_pcm_hw_params_sizeof; - ma_proc snd_pcm_hw_params_any; - ma_proc snd_pcm_hw_params_set_format; - ma_proc snd_pcm_hw_params_set_format_first; - ma_proc snd_pcm_hw_params_get_format_mask; - ma_proc snd_pcm_hw_params_set_channels; - ma_proc snd_pcm_hw_params_set_channels_near; - ma_proc snd_pcm_hw_params_set_channels_minmax; - ma_proc snd_pcm_hw_params_set_rate_resample; - ma_proc snd_pcm_hw_params_set_rate; - ma_proc snd_pcm_hw_params_set_rate_near; - ma_proc snd_pcm_hw_params_set_buffer_size_near; - ma_proc snd_pcm_hw_params_set_periods_near; - ma_proc snd_pcm_hw_params_set_access; - ma_proc snd_pcm_hw_params_get_format; - ma_proc snd_pcm_hw_params_get_channels; - ma_proc snd_pcm_hw_params_get_channels_min; - ma_proc snd_pcm_hw_params_get_channels_max; - ma_proc snd_pcm_hw_params_get_rate; - ma_proc snd_pcm_hw_params_get_rate_min; - ma_proc snd_pcm_hw_params_get_rate_max; - ma_proc snd_pcm_hw_params_get_buffer_size; - ma_proc snd_pcm_hw_params_get_periods; - ma_proc snd_pcm_hw_params_get_access; - ma_proc snd_pcm_hw_params_test_format; - ma_proc snd_pcm_hw_params_test_channels; - ma_proc snd_pcm_hw_params_test_rate; - ma_proc snd_pcm_hw_params; - ma_proc snd_pcm_sw_params_sizeof; - ma_proc snd_pcm_sw_params_current; - ma_proc snd_pcm_sw_params_get_boundary; - ma_proc snd_pcm_sw_params_set_avail_min; - ma_proc snd_pcm_sw_params_set_start_threshold; - ma_proc snd_pcm_sw_params_set_stop_threshold; - ma_proc snd_pcm_sw_params; - ma_proc snd_pcm_format_mask_sizeof; - ma_proc snd_pcm_format_mask_test; - ma_proc snd_pcm_get_chmap; - ma_proc snd_pcm_state; - ma_proc snd_pcm_prepare; - ma_proc snd_pcm_start; - ma_proc snd_pcm_drop; - ma_proc snd_pcm_drain; - ma_proc snd_pcm_reset; - ma_proc snd_device_name_hint; - ma_proc snd_device_name_get_hint; - ma_proc snd_card_get_index; - ma_proc snd_device_name_free_hint; - ma_proc snd_pcm_mmap_begin; - ma_proc snd_pcm_mmap_commit; - ma_proc snd_pcm_recover; - ma_proc snd_pcm_readi; - ma_proc snd_pcm_writei; - ma_proc snd_pcm_avail; - ma_proc snd_pcm_avail_update; - ma_proc snd_pcm_wait; - ma_proc snd_pcm_nonblock; - ma_proc snd_pcm_info; - ma_proc snd_pcm_info_sizeof; - ma_proc snd_pcm_info_get_name; - ma_proc snd_pcm_poll_descriptors; - ma_proc snd_pcm_poll_descriptors_count; - ma_proc snd_pcm_poll_descriptors_revents; - ma_proc snd_config_update_free_global; - - ma_mutex internalDeviceEnumLock; - ma_bool32 useVerboseDeviceEnumeration; - } alsa; -#endif -#ifdef MA_SUPPORT_PULSEAUDIO - struct - { - ma_handle pulseSO; - ma_proc pa_mainloop_new; - ma_proc pa_mainloop_free; - ma_proc pa_mainloop_quit; - ma_proc pa_mainloop_get_api; - ma_proc pa_mainloop_iterate; - ma_proc pa_mainloop_wakeup; - ma_proc pa_threaded_mainloop_new; - ma_proc pa_threaded_mainloop_free; - ma_proc pa_threaded_mainloop_start; - ma_proc pa_threaded_mainloop_stop; - ma_proc pa_threaded_mainloop_lock; - ma_proc pa_threaded_mainloop_unlock; - ma_proc pa_threaded_mainloop_wait; - ma_proc pa_threaded_mainloop_signal; - ma_proc pa_threaded_mainloop_accept; - ma_proc pa_threaded_mainloop_get_retval; - ma_proc pa_threaded_mainloop_get_api; - ma_proc pa_threaded_mainloop_in_thread; - ma_proc pa_threaded_mainloop_set_name; - ma_proc pa_context_new; - ma_proc pa_context_unref; - ma_proc pa_context_connect; - ma_proc pa_context_disconnect; - ma_proc pa_context_set_state_callback; - ma_proc pa_context_get_state; - ma_proc pa_context_get_sink_info_list; - ma_proc pa_context_get_source_info_list; - ma_proc pa_context_get_sink_info_by_name; - ma_proc pa_context_get_source_info_by_name; - ma_proc pa_operation_unref; - ma_proc pa_operation_get_state; - ma_proc pa_channel_map_init_extend; - ma_proc pa_channel_map_valid; - ma_proc pa_channel_map_compatible; - ma_proc pa_stream_new; - ma_proc pa_stream_unref; - ma_proc pa_stream_connect_playback; - ma_proc pa_stream_connect_record; - ma_proc pa_stream_disconnect; - ma_proc pa_stream_get_state; - ma_proc pa_stream_get_sample_spec; - ma_proc pa_stream_get_channel_map; - ma_proc pa_stream_get_buffer_attr; - ma_proc pa_stream_set_buffer_attr; - ma_proc pa_stream_get_device_name; - ma_proc pa_stream_set_write_callback; - ma_proc pa_stream_set_read_callback; - ma_proc pa_stream_set_suspended_callback; - ma_proc pa_stream_set_moved_callback; - ma_proc pa_stream_is_suspended; - ma_proc pa_stream_flush; - ma_proc pa_stream_drain; - ma_proc pa_stream_is_corked; - ma_proc pa_stream_cork; - ma_proc pa_stream_trigger; - ma_proc pa_stream_begin_write; - ma_proc pa_stream_write; - ma_proc pa_stream_peek; - ma_proc pa_stream_drop; - ma_proc pa_stream_writable_size; - ma_proc pa_stream_readable_size; - - /*pa_mainloop**/ ma_ptr pMainLoop; - /*pa_context**/ ma_ptr pPulseContext; - char* pApplicationName; /* Set when the context is initialized. Used by devices for their local pa_context objects. */ - char* pServerName; /* Set when the context is initialized. Used by devices for their local pa_context objects. */ - } pulse; -#endif -#ifdef MA_SUPPORT_JACK - struct - { - ma_handle jackSO; - ma_proc jack_client_open; - ma_proc jack_client_close; - ma_proc jack_client_name_size; - ma_proc jack_set_process_callback; - ma_proc jack_set_buffer_size_callback; - ma_proc jack_on_shutdown; - ma_proc jack_get_sample_rate; - ma_proc jack_get_buffer_size; - ma_proc jack_get_ports; - ma_proc jack_activate; - ma_proc jack_deactivate; - ma_proc jack_connect; - ma_proc jack_port_register; - ma_proc jack_port_name; - ma_proc jack_port_get_buffer; - ma_proc jack_free; - - char* pClientName; - ma_bool32 tryStartServer; - } jack; -#endif -#ifdef MA_SUPPORT_COREAUDIO - struct - { - ma_handle hCoreFoundation; - ma_proc CFStringGetCString; - ma_proc CFRelease; - - ma_handle hCoreAudio; - ma_proc AudioObjectGetPropertyData; - ma_proc AudioObjectGetPropertyDataSize; - ma_proc AudioObjectSetPropertyData; - ma_proc AudioObjectAddPropertyListener; - ma_proc AudioObjectRemovePropertyListener; - - ma_handle hAudioUnit; /* Could possibly be set to AudioToolbox on later versions of macOS. */ - ma_proc AudioComponentFindNext; - ma_proc AudioComponentInstanceDispose; - ma_proc AudioComponentInstanceNew; - ma_proc AudioOutputUnitStart; - ma_proc AudioOutputUnitStop; - ma_proc AudioUnitAddPropertyListener; - ma_proc AudioUnitGetPropertyInfo; - ma_proc AudioUnitGetProperty; - ma_proc AudioUnitSetProperty; - ma_proc AudioUnitInitialize; - ma_proc AudioUnitRender; - - /*AudioComponent*/ ma_ptr component; - ma_bool32 noAudioSessionDeactivate; /* For tracking whether or not the iOS audio session should be explicitly deactivated. Set from the config in ma_context_init__coreaudio(). */ - } coreaudio; -#endif -#ifdef MA_SUPPORT_SNDIO - struct - { - ma_handle sndioSO; - ma_proc sio_open; - ma_proc sio_close; - ma_proc sio_setpar; - ma_proc sio_getpar; - ma_proc sio_getcap; - ma_proc sio_start; - ma_proc sio_stop; - ma_proc sio_read; - ma_proc sio_write; - ma_proc sio_onmove; - ma_proc sio_nfds; - ma_proc sio_pollfd; - ma_proc sio_revents; - ma_proc sio_eof; - ma_proc sio_setvol; - ma_proc sio_onvol; - ma_proc sio_initpar; - } sndio; -#endif -#ifdef MA_SUPPORT_AUDIO4 - struct - { - int _unused; - } audio4; -#endif -#ifdef MA_SUPPORT_OSS - struct - { - int versionMajor; - int versionMinor; - } oss; -#endif -#ifdef MA_SUPPORT_AAUDIO - struct - { - ma_handle hAAudio; /* libaaudio.so */ - ma_proc AAudio_createStreamBuilder; - ma_proc AAudioStreamBuilder_delete; - ma_proc AAudioStreamBuilder_setDeviceId; - ma_proc AAudioStreamBuilder_setDirection; - ma_proc AAudioStreamBuilder_setSharingMode; - ma_proc AAudioStreamBuilder_setFormat; - ma_proc AAudioStreamBuilder_setChannelCount; - ma_proc AAudioStreamBuilder_setSampleRate; - ma_proc AAudioStreamBuilder_setBufferCapacityInFrames; - ma_proc AAudioStreamBuilder_setFramesPerDataCallback; - ma_proc AAudioStreamBuilder_setDataCallback; - ma_proc AAudioStreamBuilder_setErrorCallback; - ma_proc AAudioStreamBuilder_setPerformanceMode; - ma_proc AAudioStreamBuilder_setUsage; - ma_proc AAudioStreamBuilder_setContentType; - ma_proc AAudioStreamBuilder_setInputPreset; - ma_proc AAudioStreamBuilder_openStream; - ma_proc AAudioStream_close; - ma_proc AAudioStream_getState; - ma_proc AAudioStream_waitForStateChange; - ma_proc AAudioStream_getFormat; - ma_proc AAudioStream_getChannelCount; - ma_proc AAudioStream_getSampleRate; - ma_proc AAudioStream_getBufferCapacityInFrames; - ma_proc AAudioStream_getFramesPerDataCallback; - ma_proc AAudioStream_getFramesPerBurst; - ma_proc AAudioStream_requestStart; - ma_proc AAudioStream_requestStop; - ma_device_job_thread jobThread; /* For processing operations outside of the error callback, specifically device disconnections and rerouting. */ - } aaudio; -#endif -#ifdef MA_SUPPORT_OPENSL - struct - { - ma_handle libOpenSLES; - ma_handle SL_IID_ENGINE; - ma_handle SL_IID_AUDIOIODEVICECAPABILITIES; - ma_handle SL_IID_ANDROIDSIMPLEBUFFERQUEUE; - ma_handle SL_IID_RECORD; - ma_handle SL_IID_PLAY; - ma_handle SL_IID_OUTPUTMIX; - ma_handle SL_IID_ANDROIDCONFIGURATION; - ma_proc slCreateEngine; - } opensl; -#endif -#ifdef MA_SUPPORT_WEBAUDIO - struct - { - int _unused; - } webaudio; -#endif -#ifdef MA_SUPPORT_NULL - struct - { - int _unused; - } null_backend; -#endif - }; - - union - { -#ifdef MA_WIN32 - struct - { - /*HMODULE*/ ma_handle hOle32DLL; - ma_proc CoInitializeEx; - ma_proc CoUninitialize; - ma_proc CoCreateInstance; - ma_proc CoTaskMemFree; - ma_proc PropVariantClear; - ma_proc StringFromGUID2; - - /*HMODULE*/ ma_handle hUser32DLL; - ma_proc GetForegroundWindow; - ma_proc GetDesktopWindow; - - /*HMODULE*/ ma_handle hAdvapi32DLL; - ma_proc RegOpenKeyExA; - ma_proc RegCloseKey; - ma_proc RegQueryValueExA; - } win32; -#endif -#ifdef MA_POSIX - struct - { - ma_handle pthreadSO; - ma_proc pthread_create; - ma_proc pthread_join; - ma_proc pthread_mutex_init; - ma_proc pthread_mutex_destroy; - ma_proc pthread_mutex_lock; - ma_proc pthread_mutex_unlock; - ma_proc pthread_cond_init; - ma_proc pthread_cond_destroy; - ma_proc pthread_cond_wait; - ma_proc pthread_cond_signal; - ma_proc pthread_attr_init; - ma_proc pthread_attr_destroy; - ma_proc pthread_attr_setschedpolicy; - ma_proc pthread_attr_getschedparam; - ma_proc pthread_attr_setschedparam; - } posix; -#endif - int _unused; - }; -}; - -struct ma_device -{ - ma_context* pContext; - ma_device_type type; - ma_uint32 sampleRate; - MA_ATOMIC(4, ma_device_state) state; /* The state of the device is variable and can change at any time on any thread. Must be used atomically. */ - ma_device_data_proc onData; /* Set once at initialization time and should not be changed after. */ - ma_device_notification_proc onNotification; /* Set once at initialization time and should not be changed after. */ - ma_stop_proc onStop; /* DEPRECATED. Use the notification callback instead. Set once at initialization time and should not be changed after. */ - void* pUserData; /* Application defined data. */ - ma_mutex startStopLock; - ma_event wakeupEvent; - ma_event startEvent; - ma_event stopEvent; - ma_thread thread; - ma_result workResult; /* This is set by the worker thread after it's finished doing a job. */ - ma_bool8 isOwnerOfContext; /* When set to true, uninitializing the device will also uninitialize the context. Set to true when NULL is passed into ma_device_init(). */ - ma_bool8 noPreSilencedOutputBuffer; - ma_bool8 noClip; - ma_bool8 noDisableDenormals; - ma_bool8 noFixedSizedCallback; - MA_ATOMIC(4, float) masterVolumeFactor; /* Linear 0..1. Can be read and written simultaneously by different threads. Must be used atomically. */ - ma_duplex_rb duplexRB; /* Intermediary buffer for duplex device on asynchronous backends. */ - struct - { - ma_resample_algorithm algorithm; - ma_resampling_backend_vtable* pBackendVTable; - void* pBackendUserData; - struct - { - ma_uint32 lpfOrder; - } linear; - } resampling; - struct - { - ma_device_id* pID; /* Set to NULL if using default ID, otherwise set to the address of "id". */ - ma_device_id id; /* If using an explicit device, will be set to a copy of the ID used for initialization. Otherwise cleared to 0. */ - char name[MA_MAX_DEVICE_NAME_LENGTH + 1]; /* Maybe temporary. Likely to be replaced with a query API. */ - ma_share_mode shareMode; /* Set to whatever was passed in when the device was initialized. */ - ma_format format; - ma_uint32 channels; - ma_channel channelMap[MA_MAX_CHANNELS]; - ma_format internalFormat; - ma_uint32 internalChannels; - ma_uint32 internalSampleRate; - ma_channel internalChannelMap[MA_MAX_CHANNELS]; - ma_uint32 internalPeriodSizeInFrames; - ma_uint32 internalPeriods; - ma_channel_mix_mode channelMixMode; - ma_data_converter converter; - void* pIntermediaryBuffer; /* For implementing fixed sized buffer callbacks. Will be null if using variable sized callbacks. */ - ma_uint32 intermediaryBufferCap; - ma_uint32 intermediaryBufferLen; /* How many valid frames are sitting in the intermediary buffer. */ - void* pInputCache; /* In external format. Can be null. */ - ma_uint64 inputCacheCap; - ma_uint64 inputCacheConsumed; - ma_uint64 inputCacheRemaining; - } playback; - struct - { - ma_device_id* pID; /* Set to NULL if using default ID, otherwise set to the address of "id". */ - ma_device_id id; /* If using an explicit device, will be set to a copy of the ID used for initialization. Otherwise cleared to 0. */ - char name[MA_MAX_DEVICE_NAME_LENGTH + 1]; /* Maybe temporary. Likely to be replaced with a query API. */ - ma_share_mode shareMode; /* Set to whatever was passed in when the device was initialized. */ - ma_format format; - ma_uint32 channels; - ma_channel channelMap[MA_MAX_CHANNELS]; - ma_format internalFormat; - ma_uint32 internalChannels; - ma_uint32 internalSampleRate; - ma_channel internalChannelMap[MA_MAX_CHANNELS]; - ma_uint32 internalPeriodSizeInFrames; - ma_uint32 internalPeriods; - ma_channel_mix_mode channelMixMode; - ma_data_converter converter; - void* pIntermediaryBuffer; /* For implementing fixed sized buffer callbacks. Will be null if using variable sized callbacks. */ - ma_uint32 intermediaryBufferCap; - ma_uint32 intermediaryBufferLen; /* How many valid frames are sitting in the intermediary buffer. */ - } capture; - - union - { -#ifdef MA_SUPPORT_WASAPI - struct - { - /*IAudioClient**/ ma_ptr pAudioClientPlayback; - /*IAudioClient**/ ma_ptr pAudioClientCapture; - /*IAudioRenderClient**/ ma_ptr pRenderClient; - /*IAudioCaptureClient**/ ma_ptr pCaptureClient; - /*IMMDeviceEnumerator**/ ma_ptr pDeviceEnumerator; /* Used for IMMNotificationClient notifications. Required for detecting default device changes. */ - ma_IMMNotificationClient notificationClient; - /*HANDLE*/ ma_handle hEventPlayback; /* Auto reset. Initialized to signaled. */ - /*HANDLE*/ ma_handle hEventCapture; /* Auto reset. Initialized to unsignaled. */ - ma_uint32 actualBufferSizeInFramesPlayback; /* Value from GetBufferSize(). internalPeriodSizeInFrames is not set to the _actual_ buffer size when low-latency shared mode is being used due to the way the IAudioClient3 API works. */ - ma_uint32 actualBufferSizeInFramesCapture; - ma_uint32 originalPeriodSizeInFrames; - ma_uint32 originalPeriodSizeInMilliseconds; - ma_uint32 originalPeriods; - ma_performance_profile originalPerformanceProfile; - ma_uint32 periodSizeInFramesPlayback; - ma_uint32 periodSizeInFramesCapture; - void* pMappedBufferCapture; - ma_uint32 mappedBufferCaptureCap; - ma_uint32 mappedBufferCaptureLen; - void* pMappedBufferPlayback; - ma_uint32 mappedBufferPlaybackCap; - ma_uint32 mappedBufferPlaybackLen; - MA_ATOMIC(4, ma_bool32) isStartedCapture; /* Can be read and written simultaneously across different threads. Must be used atomically, and must be 32-bit. */ - MA_ATOMIC(4, ma_bool32) isStartedPlayback; /* Can be read and written simultaneously across different threads. Must be used atomically, and must be 32-bit. */ - ma_bool8 noAutoConvertSRC; /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM. */ - ma_bool8 noDefaultQualitySRC; /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY. */ - ma_bool8 noHardwareOffloading; - ma_bool8 allowCaptureAutoStreamRouting; - ma_bool8 allowPlaybackAutoStreamRouting; - ma_bool8 isDetachedPlayback; - ma_bool8 isDetachedCapture; - } wasapi; -#endif -#ifdef MA_SUPPORT_DSOUND - struct - { - /*LPDIRECTSOUND*/ ma_ptr pPlayback; - /*LPDIRECTSOUNDBUFFER*/ ma_ptr pPlaybackPrimaryBuffer; - /*LPDIRECTSOUNDBUFFER*/ ma_ptr pPlaybackBuffer; - /*LPDIRECTSOUNDCAPTURE*/ ma_ptr pCapture; - /*LPDIRECTSOUNDCAPTUREBUFFER*/ ma_ptr pCaptureBuffer; - } dsound; -#endif -#ifdef MA_SUPPORT_WINMM - struct - { - /*HWAVEOUT*/ ma_handle hDevicePlayback; - /*HWAVEIN*/ ma_handle hDeviceCapture; - /*HANDLE*/ ma_handle hEventPlayback; - /*HANDLE*/ ma_handle hEventCapture; - ma_uint32 fragmentSizeInFrames; - ma_uint32 iNextHeaderPlayback; /* [0,periods). Used as an index into pWAVEHDRPlayback. */ - ma_uint32 iNextHeaderCapture; /* [0,periods). Used as an index into pWAVEHDRCapture. */ - ma_uint32 headerFramesConsumedPlayback; /* The number of PCM frames consumed in the buffer in pWAVEHEADER[iNextHeader]. */ - ma_uint32 headerFramesConsumedCapture; /* ^^^ */ - /*WAVEHDR**/ ma_uint8* pWAVEHDRPlayback; /* One instantiation for each period. */ - /*WAVEHDR**/ ma_uint8* pWAVEHDRCapture; /* One instantiation for each period. */ - ma_uint8* pIntermediaryBufferPlayback; - ma_uint8* pIntermediaryBufferCapture; - ma_uint8* _pHeapData; /* Used internally and is used for the heap allocated data for the intermediary buffer and the WAVEHDR structures. */ - } winmm; -#endif -#ifdef MA_SUPPORT_ALSA - struct - { - /*snd_pcm_t**/ ma_ptr pPCMPlayback; - /*snd_pcm_t**/ ma_ptr pPCMCapture; - /*struct pollfd**/ void* pPollDescriptorsPlayback; - /*struct pollfd**/ void* pPollDescriptorsCapture; - int pollDescriptorCountPlayback; - int pollDescriptorCountCapture; - int wakeupfdPlayback; /* eventfd for waking up from poll() when the playback device is stopped. */ - int wakeupfdCapture; /* eventfd for waking up from poll() when the capture device is stopped. */ - ma_bool8 isUsingMMapPlayback; - ma_bool8 isUsingMMapCapture; - } alsa; -#endif -#ifdef MA_SUPPORT_PULSEAUDIO - struct - { - /*pa_mainloop**/ ma_ptr pMainLoop; - /*pa_context**/ ma_ptr pPulseContext; - /*pa_stream**/ ma_ptr pStreamPlayback; - /*pa_stream**/ ma_ptr pStreamCapture; - } pulse; -#endif -#ifdef MA_SUPPORT_JACK - struct - { - /*jack_client_t**/ ma_ptr pClient; - /*jack_port_t**/ ma_ptr* ppPortsPlayback; - /*jack_port_t**/ ma_ptr* ppPortsCapture; - float* pIntermediaryBufferPlayback; /* Typed as a float because JACK is always floating point. */ - float* pIntermediaryBufferCapture; - } jack; -#endif -#ifdef MA_SUPPORT_COREAUDIO - struct - { - ma_uint32 deviceObjectIDPlayback; - ma_uint32 deviceObjectIDCapture; - /*AudioUnit*/ ma_ptr audioUnitPlayback; - /*AudioUnit*/ ma_ptr audioUnitCapture; - /*AudioBufferList**/ ma_ptr pAudioBufferList; /* Only used for input devices. */ - ma_uint32 audioBufferCapInFrames; /* Only used for input devices. The capacity in frames of each buffer in pAudioBufferList. */ - ma_event stopEvent; - ma_uint32 originalPeriodSizeInFrames; - ma_uint32 originalPeriodSizeInMilliseconds; - ma_uint32 originalPeriods; - ma_performance_profile originalPerformanceProfile; - ma_bool32 isDefaultPlaybackDevice; - ma_bool32 isDefaultCaptureDevice; - ma_bool32 isSwitchingPlaybackDevice; /* <-- Set to true when the default device has changed and miniaudio is in the process of switching. */ - ma_bool32 isSwitchingCaptureDevice; /* <-- Set to true when the default device has changed and miniaudio is in the process of switching. */ - void* pNotificationHandler; /* Only used on mobile platforms. Obj-C object for handling route changes. */ - } coreaudio; -#endif -#ifdef MA_SUPPORT_SNDIO - struct - { - ma_ptr handlePlayback; - ma_ptr handleCapture; - ma_bool32 isStartedPlayback; - ma_bool32 isStartedCapture; - } sndio; -#endif -#ifdef MA_SUPPORT_AUDIO4 - struct - { - int fdPlayback; - int fdCapture; - } audio4; -#endif -#ifdef MA_SUPPORT_OSS - struct - { - int fdPlayback; - int fdCapture; - } oss; -#endif -#ifdef MA_SUPPORT_AAUDIO - struct - { - /*AAudioStream**/ ma_ptr pStreamPlayback; - /*AAudioStream**/ ma_ptr pStreamCapture; - ma_aaudio_usage usage; - ma_aaudio_content_type contentType; - ma_aaudio_input_preset inputPreset; - ma_bool32 noAutoStartAfterReroute; - } aaudio; -#endif -#ifdef MA_SUPPORT_OPENSL - struct - { - /*SLObjectItf*/ ma_ptr pOutputMixObj; - /*SLOutputMixItf*/ ma_ptr pOutputMix; - /*SLObjectItf*/ ma_ptr pAudioPlayerObj; - /*SLPlayItf*/ ma_ptr pAudioPlayer; - /*SLObjectItf*/ ma_ptr pAudioRecorderObj; - /*SLRecordItf*/ ma_ptr pAudioRecorder; - /*SLAndroidSimpleBufferQueueItf*/ ma_ptr pBufferQueuePlayback; - /*SLAndroidSimpleBufferQueueItf*/ ma_ptr pBufferQueueCapture; - ma_bool32 isDrainingCapture; - ma_bool32 isDrainingPlayback; - ma_uint32 currentBufferIndexPlayback; - ma_uint32 currentBufferIndexCapture; - ma_uint8* pBufferPlayback; /* This is malloc()'d and is used for storing audio data. Typed as ma_uint8 for easy offsetting. */ - ma_uint8* pBufferCapture; - } opensl; -#endif -#ifdef MA_SUPPORT_WEBAUDIO - struct - { - int indexPlayback; /* We use a factory on the JavaScript side to manage devices and use an index for JS/C interop. */ - int indexCapture; - } webaudio; -#endif -#ifdef MA_SUPPORT_NULL - struct - { - ma_thread deviceThread; - ma_event operationEvent; - ma_event operationCompletionEvent; - ma_semaphore operationSemaphore; - ma_uint32 operation; - ma_result operationResult; - ma_timer timer; - double priorRunTime; - ma_uint32 currentPeriodFramesRemainingPlayback; - ma_uint32 currentPeriodFramesRemainingCapture; - ma_uint64 lastProcessedFramePlayback; - ma_uint64 lastProcessedFrameCapture; - MA_ATOMIC(4, ma_bool32) isStarted; /* Read and written by multiple threads. Must be used atomically, and must be 32-bit for compiler compatibility. */ - } null_device; -#endif - }; -}; -#if defined(_MSC_VER) && !defined(__clang__) - #pragma warning(pop) -#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) - #pragma GCC diagnostic pop /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */ -#endif - -/* -Initializes a `ma_context_config` object. - - -Return Value ------------- -A `ma_context_config` initialized to defaults. - - -Remarks -------- -You must always use this to initialize the default state of the `ma_context_config` object. Not using this will result in your program breaking when miniaudio -is updated and new members are added to `ma_context_config`. It also sets logical defaults. - -You can override members of the returned object by changing it's members directly. - - -See Also --------- -ma_context_init() -*/ -MA_API ma_context_config ma_context_config_init(void); - -/* -Initializes a context. - -The context is used for selecting and initializing an appropriate backend and to represent the backend at a more global level than that of an individual -device. There is one context to many devices, and a device is created from a context. A context is required to enumerate devices. - - -Parameters ----------- -backends (in, optional) - A list of backends to try initializing, in priority order. Can be NULL, in which case it uses default priority order. - -backendCount (in, optional) - The number of items in `backend`. Ignored if `backend` is NULL. - -pConfig (in, optional) - The context configuration. - -pContext (in) - A pointer to the context object being initialized. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Unsafe. Do not call this function across multiple threads as some backends read and write to global state. - - -Remarks -------- -When `backends` is NULL, the default priority order will be used. Below is a list of backends in priority order: - - |-------------|-----------------------|--------------------------------------------------------| - | Name | Enum Name | Supported Operating Systems | - |-------------|-----------------------|--------------------------------------------------------| - | WASAPI | ma_backend_wasapi | Windows Vista+ | - | DirectSound | ma_backend_dsound | Windows XP+ | - | WinMM | ma_backend_winmm | Windows XP+ (may work on older versions, but untested) | - | Core Audio | ma_backend_coreaudio | macOS, iOS | - | ALSA | ma_backend_alsa | Linux | - | PulseAudio | ma_backend_pulseaudio | Cross Platform (disabled on Windows, BSD and Android) | - | JACK | ma_backend_jack | Cross Platform (disabled on BSD and Android) | - | sndio | ma_backend_sndio | OpenBSD | - | audio(4) | ma_backend_audio4 | NetBSD, OpenBSD | - | OSS | ma_backend_oss | FreeBSD | - | AAudio | ma_backend_aaudio | Android 8+ | - | OpenSL|ES | ma_backend_opensl | Android (API level 16+) | - | Web Audio | ma_backend_webaudio | Web (via Emscripten) | - | Null | ma_backend_null | Cross Platform (not used on Web) | - |-------------|-----------------------|--------------------------------------------------------| - -The context can be configured via the `pConfig` argument. The config object is initialized with `ma_context_config_init()`. Individual configuration settings -can then be set directly on the structure. Below are the members of the `ma_context_config` object. - - pLog - A pointer to the `ma_log` to post log messages to. Can be NULL if the application does not - require logging. See the `ma_log` API for details on how to use the logging system. - - threadPriority - The desired priority to use for the audio thread. Allowable values include the following: - - |--------------------------------------| - | Thread Priority | - |--------------------------------------| - | ma_thread_priority_idle | - | ma_thread_priority_lowest | - | ma_thread_priority_low | - | ma_thread_priority_normal | - | ma_thread_priority_high | - | ma_thread_priority_highest (default) | - | ma_thread_priority_realtime | - | ma_thread_priority_default | - |--------------------------------------| - - threadStackSize - The desired size of the stack for the audio thread. Defaults to the operating system's default. - - pUserData - A pointer to application-defined data. This can be accessed from the context object directly such as `context.pUserData`. - - allocationCallbacks - Structure containing custom allocation callbacks. Leaving this at defaults will cause it to use MA_MALLOC, MA_REALLOC and MA_FREE. These allocation - callbacks will be used for anything tied to the context, including devices. - - alsa.useVerboseDeviceEnumeration - ALSA will typically enumerate many different devices which can be intrusive and not user-friendly. To combat this, miniaudio will enumerate only unique - card/device pairs by default. The problem with this is that you lose a bit of flexibility and control. Setting alsa.useVerboseDeviceEnumeration makes - it so the ALSA backend includes all devices. Defaults to false. - - pulse.pApplicationName - PulseAudio only. The application name to use when initializing the PulseAudio context with `pa_context_new()`. - - pulse.pServerName - PulseAudio only. The name of the server to connect to with `pa_context_connect()`. - - pulse.tryAutoSpawn - PulseAudio only. Whether or not to try automatically starting the PulseAudio daemon. Defaults to false. If you set this to true, keep in mind that - miniaudio uses a trial and error method to find the most appropriate backend, and this will result in the PulseAudio daemon starting which may be - intrusive for the end user. - - coreaudio.sessionCategory - iOS only. The session category to use for the shared AudioSession instance. Below is a list of allowable values and their Core Audio equivalents. - - |-----------------------------------------|-------------------------------------| - | miniaudio Token | Core Audio Token | - |-----------------------------------------|-------------------------------------| - | ma_ios_session_category_ambient | AVAudioSessionCategoryAmbient | - | ma_ios_session_category_solo_ambient | AVAudioSessionCategorySoloAmbient | - | ma_ios_session_category_playback | AVAudioSessionCategoryPlayback | - | ma_ios_session_category_record | AVAudioSessionCategoryRecord | - | ma_ios_session_category_play_and_record | AVAudioSessionCategoryPlayAndRecord | - | ma_ios_session_category_multi_route | AVAudioSessionCategoryMultiRoute | - | ma_ios_session_category_none | AVAudioSessionCategoryAmbient | - | ma_ios_session_category_default | AVAudioSessionCategoryAmbient | - |-----------------------------------------|-------------------------------------| - - coreaudio.sessionCategoryOptions - iOS only. Session category options to use with the shared AudioSession instance. Below is a list of allowable values and their Core Audio equivalents. - - |---------------------------------------------------------------------------|------------------------------------------------------------------| - | miniaudio Token | Core Audio Token | - |---------------------------------------------------------------------------|------------------------------------------------------------------| - | ma_ios_session_category_option_mix_with_others | AVAudioSessionCategoryOptionMixWithOthers | - | ma_ios_session_category_option_duck_others | AVAudioSessionCategoryOptionDuckOthers | - | ma_ios_session_category_option_allow_bluetooth | AVAudioSessionCategoryOptionAllowBluetooth | - | ma_ios_session_category_option_default_to_speaker | AVAudioSessionCategoryOptionDefaultToSpeaker | - | ma_ios_session_category_option_interrupt_spoken_audio_and_mix_with_others | AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers | - | ma_ios_session_category_option_allow_bluetooth_a2dp | AVAudioSessionCategoryOptionAllowBluetoothA2DP | - | ma_ios_session_category_option_allow_air_play | AVAudioSessionCategoryOptionAllowAirPlay | - |---------------------------------------------------------------------------|------------------------------------------------------------------| - - coreaudio.noAudioSessionActivate - iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:true] on initialization. - - coreaudio.noAudioSessionDeactivate - iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:false] on uninitialization. - - jack.pClientName - The name of the client to pass to `jack_client_open()`. - - jack.tryStartServer - Whether or not to try auto-starting the JACK server. Defaults to false. - - -It is recommended that only a single context is active at any given time because it's a bulky data structure which performs run-time linking for the -relevant backends every time it's initialized. - -The location of the context cannot change throughout it's lifetime. Consider allocating the `ma_context` object with `malloc()` if this is an issue. The -reason for this is that a pointer to the context is stored in the `ma_device` structure. - - -Example 1 - Default Initialization ----------------------------------- -The example below shows how to initialize the context using the default configuration. - -```c -ma_context context; -ma_result result = ma_context_init(NULL, 0, NULL, &context); -if (result != MA_SUCCESS) { - // Error. -} -``` - - -Example 2 - Custom Configuration --------------------------------- -The example below shows how to initialize the context using custom backend priorities and a custom configuration. In this hypothetical example, the program -wants to prioritize ALSA over PulseAudio on Linux. They also want to avoid using the WinMM backend on Windows because it's latency is too high. They also -want an error to be returned if no valid backend is available which they achieve by excluding the Null backend. - -For the configuration, the program wants to capture any log messages so they can, for example, route it to a log file and user interface. - -```c -ma_backend backends[] = { - ma_backend_alsa, - ma_backend_pulseaudio, - ma_backend_wasapi, - ma_backend_dsound -}; - -ma_log log; -ma_log_init(&log); -ma_log_register_callback(&log, ma_log_callback_init(my_log_callbac, pMyLogUserData)); - -ma_context_config config = ma_context_config_init(); -config.pLog = &log; // Specify a custom log object in the config so any logs that are posted from ma_context_init() are captured. - -ma_context context; -ma_result result = ma_context_init(backends, sizeof(backends)/sizeof(backends[0]), &config, &context); -if (result != MA_SUCCESS) { - // Error. - if (result == MA_NO_BACKEND) { - // Couldn't find an appropriate backend. - } -} - -// You could also attach a log callback post-initialization: -ma_log_register_callback(ma_context_get_log(&context), ma_log_callback_init(my_log_callback, pMyLogUserData)); -``` - - -See Also --------- -ma_context_config_init() -ma_context_uninit() -*/ -MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pConfig, ma_context* pContext); - -/* -Uninitializes a context. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Unsafe. Do not call this function across multiple threads as some backends read and write to global state. - - -Remarks -------- -Results are undefined if you call this while any device created by this context is still active. - - -See Also --------- -ma_context_init() -*/ -MA_API ma_result ma_context_uninit(ma_context* pContext); - -/* -Retrieves the size of the ma_context object. - -This is mainly for the purpose of bindings to know how much memory to allocate. -*/ -MA_API size_t ma_context_sizeof(void); - -/* -Retrieves a pointer to the log object associated with this context. - - -Remarks -------- -Pass the returned pointer to `ma_log_post()`, `ma_log_postv()` or `ma_log_postf()` to post a log -message. - -You can attach your own logging callback to the log with `ma_log_register_callback()` - - -Return Value ------------- -A pointer to the `ma_log` object that the context uses to post log messages. If some error occurs, -NULL will be returned. -*/ -MA_API ma_log* ma_context_get_log(ma_context* pContext); - -/* -Enumerates over every device (both playback and capture). - -This is a lower-level enumeration function to the easier to use `ma_context_get_devices()`. Use `ma_context_enumerate_devices()` if you would rather not incur -an internal heap allocation, or it simply suits your code better. - -Note that this only retrieves the ID and name/description of the device. The reason for only retrieving basic information is that it would otherwise require -opening the backend device in order to probe it for more detailed information which can be inefficient. Consider using `ma_context_get_device_info()` for this, -but don't call it from within the enumeration callback. - -Returning false from the callback will stop enumeration. Returning true will continue enumeration. - - -Parameters ----------- -pContext (in) - A pointer to the context performing the enumeration. - -callback (in) - The callback to fire for each enumerated device. - -pUserData (in) - A pointer to application-defined data passed to the callback. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Safe. This is guarded using a simple mutex lock. - - -Remarks -------- -Do _not_ assume the first enumerated device of a given type is the default device. - -Some backends and platforms may only support default playback and capture devices. - -In general, you should not do anything complicated from within the callback. In particular, do not try initializing a device from within the callback. Also, -do not try to call `ma_context_get_device_info()` from within the callback. - -Consider using `ma_context_get_devices()` for a simpler and safer API, albeit at the expense of an internal heap allocation. - - -Example 1 - Simple Enumeration ------------------------------- -ma_bool32 ma_device_enum_callback(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData) -{ - printf("Device Name: %s\n", pInfo->name); - return MA_TRUE; -} - -ma_result result = ma_context_enumerate_devices(&context, my_device_enum_callback, pMyUserData); -if (result != MA_SUCCESS) { - // Error. -} - - -See Also --------- -ma_context_get_devices() -*/ -MA_API ma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData); - -/* -Retrieves basic information about every active playback and/or capture device. - -This function will allocate memory internally for the device lists and return a pointer to them through the `ppPlaybackDeviceInfos` and `ppCaptureDeviceInfos` -parameters. If you do not want to incur the overhead of these allocations consider using `ma_context_enumerate_devices()` which will instead use a callback. - - -Parameters ----------- -pContext (in) - A pointer to the context performing the enumeration. - -ppPlaybackDeviceInfos (out) - A pointer to a pointer that will receive the address of a buffer containing the list of `ma_device_info` structures for playback devices. - -pPlaybackDeviceCount (out) - A pointer to an unsigned integer that will receive the number of playback devices. - -ppCaptureDeviceInfos (out) - A pointer to a pointer that will receive the address of a buffer containing the list of `ma_device_info` structures for capture devices. - -pCaptureDeviceCount (out) - A pointer to an unsigned integer that will receive the number of capture devices. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Unsafe. Since each call to this function invalidates the pointers from the previous call, you should not be calling this simultaneously across multiple -threads. Instead, you need to make a copy of the returned data with your own higher level synchronization. - - -Remarks -------- -It is _not_ safe to assume the first device in the list is the default device. - -You can pass in NULL for the playback or capture lists in which case they'll be ignored. - -The returned pointers will become invalid upon the next call this this function, or when the context is uninitialized. Do not free the returned pointers. - - -See Also --------- -ma_context_get_devices() -*/ -MA_API ma_result ma_context_get_devices(ma_context* pContext, ma_device_info** ppPlaybackDeviceInfos, ma_uint32* pPlaybackDeviceCount, ma_device_info** ppCaptureDeviceInfos, ma_uint32* pCaptureDeviceCount); - -/* -Retrieves information about a device of the given type, with the specified ID and share mode. - - -Parameters ----------- -pContext (in) - A pointer to the context performing the query. - -deviceType (in) - The type of the device being queried. Must be either `ma_device_type_playback` or `ma_device_type_capture`. - -pDeviceID (in) - The ID of the device being queried. - -pDeviceInfo (out) - A pointer to the `ma_device_info` structure that will receive the device information. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Safe. This is guarded using a simple mutex lock. - - -Remarks -------- -Do _not_ call this from within the `ma_context_enumerate_devices()` callback. - -It's possible for a device to have different information and capabilities depending on whether or not it's opened in shared or exclusive mode. For example, in -shared mode, WASAPI always uses floating point samples for mixing, but in exclusive mode it can be anything. Therefore, this function allows you to specify -which share mode you want information for. Note that not all backends and devices support shared or exclusive mode, in which case this function will fail if -the requested share mode is unsupported. - -This leaves pDeviceInfo unmodified in the result of an error. -*/ -MA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo); - -/* -Determines if the given context supports loopback mode. - - -Parameters ----------- -pContext (in) - A pointer to the context getting queried. - - -Return Value ------------- -MA_TRUE if the context supports loopback mode; MA_FALSE otherwise. -*/ -MA_API ma_bool32 ma_context_is_loopback_supported(ma_context* pContext); - - - -/* -Initializes a device config with default settings. - - -Parameters ----------- -deviceType (in) - The type of the device this config is being initialized for. This must set to one of the following: - - |-------------------------| - | Device Type | - |-------------------------| - | ma_device_type_playback | - | ma_device_type_capture | - | ma_device_type_duplex | - | ma_device_type_loopback | - |-------------------------| - - -Return Value ------------- -A new device config object with default settings. You will typically want to adjust the config after this function returns. See remarks. - - -Thread Safety -------------- -Safe. - - -Callback Safety ---------------- -Safe, but don't try initializing a device in a callback. - - -Remarks -------- -The returned config will be initialized to defaults. You will normally want to customize a few variables before initializing the device. See Example 1 for a -typical configuration which sets the sample format, channel count, sample rate, data callback and user data. These are usually things you will want to change -before initializing the device. - -See `ma_device_init()` for details on specific configuration options. - - -Example 1 - Simple Configuration --------------------------------- -The example below is what a program will typically want to configure for each device at a minimum. Notice how `ma_device_config_init()` is called first, and -then the returned object is modified directly. This is important because it ensures that your program continues to work as new configuration options are added -to the `ma_device_config` structure. - -```c -ma_device_config config = ma_device_config_init(ma_device_type_playback); -config.playback.format = ma_format_f32; -config.playback.channels = 2; -config.sampleRate = 48000; -config.dataCallback = ma_data_callback; -config.pUserData = pMyUserData; -``` - - -See Also --------- -ma_device_init() -ma_device_init_ex() -*/ -MA_API ma_device_config ma_device_config_init(ma_device_type deviceType); - - -/* -Initializes a device. - -A device represents a physical audio device. The idea is you send or receive audio data from the device to either play it back through a speaker, or capture it -from a microphone. Whether or not you should send or receive data from the device (or both) depends on the type of device you are initializing which can be -playback, capture, full-duplex or loopback. (Note that loopback mode is only supported on select backends.) Sending and receiving audio data to and from the -device is done via a callback which is fired by miniaudio at periodic time intervals. - -The frequency at which data is delivered to and from a device depends on the size of it's period. The size of the period can be defined in terms of PCM frames -or milliseconds, whichever is more convenient. Generally speaking, the smaller the period, the lower the latency at the expense of higher CPU usage and -increased risk of glitching due to the more frequent and granular data deliver intervals. The size of a period will depend on your requirements, but -miniaudio's defaults should work fine for most scenarios. If you're building a game you should leave this fairly small, whereas if you're building a simple -media player you can make it larger. Note that the period size you request is actually just a hint - miniaudio will tell the backend what you want, but the -backend is ultimately responsible for what it gives you. You cannot assume you will get exactly what you ask for. - -When delivering data to and from a device you need to make sure it's in the correct format which you can set through the device configuration. You just set the -format that you want to use and miniaudio will perform all of the necessary conversion for you internally. When delivering data to and from the callback you -can assume the format is the same as what you requested when you initialized the device. See Remarks for more details on miniaudio's data conversion pipeline. - - -Parameters ----------- -pContext (in, optional) - A pointer to the context that owns the device. This can be null, in which case it creates a default context internally. - -pConfig (in) - A pointer to the device configuration. Cannot be null. See remarks for details. - -pDevice (out) - A pointer to the device object being initialized. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Unsafe. It is not safe to call this function simultaneously for different devices because some backends depend on and mutate global state. The same applies to -calling this at the same time as `ma_device_uninit()`. - - -Callback Safety ---------------- -Unsafe. It is not safe to call this inside any callback. - - -Remarks -------- -Setting `pContext` to NULL will result in miniaudio creating a default context internally and is equivalent to passing in a context initialized like so: - - ```c - ma_context_init(NULL, 0, NULL, &context); - ``` - -Do not set `pContext` to NULL if you are needing to open multiple devices. You can, however, use NULL when initializing the first device, and then use -device.pContext for the initialization of other devices. - -The device can be configured via the `pConfig` argument. The config object is initialized with `ma_device_config_init()`. Individual configuration settings can -then be set directly on the structure. Below are the members of the `ma_device_config` object. - - deviceType - Must be `ma_device_type_playback`, `ma_device_type_capture`, `ma_device_type_duplex` of `ma_device_type_loopback`. - - sampleRate - The sample rate, in hertz. The most common sample rates are 48000 and 44100. Setting this to 0 will use the device's native sample rate. - - periodSizeInFrames - The desired size of a period in PCM frames. If this is 0, `periodSizeInMilliseconds` will be used instead. If both are 0 the default buffer size will - be used depending on the selected performance profile. This value affects latency. See below for details. - - periodSizeInMilliseconds - The desired size of a period in milliseconds. If this is 0, `periodSizeInFrames` will be used instead. If both are 0 the default buffer size will be - used depending on the selected performance profile. The value affects latency. See below for details. - - periods - The number of periods making up the device's entire buffer. The total buffer size is `periodSizeInFrames` or `periodSizeInMilliseconds` multiplied by - this value. This is just a hint as backends will be the ones who ultimately decide how your periods will be configured. - - performanceProfile - A hint to miniaudio as to the performance requirements of your program. Can be either `ma_performance_profile_low_latency` (default) or - `ma_performance_profile_conservative`. This mainly affects the size of default buffers and can usually be left at it's default value. - - noPreSilencedOutputBuffer - When set to true, the contents of the output buffer passed into the data callback will be left undefined. When set to false (default), the contents of - the output buffer will be cleared the zero. You can use this to avoid the overhead of zeroing out the buffer if you can guarantee that your data - callback will write to every sample in the output buffer, or if you are doing your own clearing. - - noClip - When set to true, the contents of the output buffer passed into the data callback will be clipped after returning. When set to false (default), the - contents of the output buffer are left alone after returning and it will be left up to the backend itself to decide whether or not the clip. This only - applies when the playback sample format is f32. - - noDisableDenormals - By default, miniaudio will disable denormals when the data callback is called. Setting this to true will prevent the disabling of denormals. - - noFixedSizedCallback - Allows miniaudio to fire the data callback with any frame count. When this is set to true, the data callback will be fired with a consistent frame - count as specified by `periodSizeInFrames` or `periodSizeInMilliseconds`. When set to false, miniaudio will fire the callback with whatever the - backend requests, which could be anything. - - dataCallback - The callback to fire whenever data is ready to be delivered to or from the device. - - notificationCallback - The callback to fire when something has changed with the device, such as whether or not it has been started or stopped. - - pUserData - The user data pointer to use with the device. You can access this directly from the device object like `device.pUserData`. - - resampling.algorithm - The resampling algorithm to use when miniaudio needs to perform resampling between the rate specified by `sampleRate` and the device's native rate. The - default value is `ma_resample_algorithm_linear`, and the quality can be configured with `resampling.linear.lpfOrder`. - - resampling.pBackendVTable - A pointer to an optional vtable that can be used for plugging in a custom resampler. - - resampling.pBackendUserData - A pointer that will passed to callbacks in pBackendVTable. - - resampling.linear.lpfOrder - The linear resampler applies a low-pass filter as part of it's procesing for anti-aliasing. This setting controls the order of the filter. The higher - the value, the better the quality, in general. Setting this to 0 will disable low-pass filtering altogether. The maximum value is - `MA_MAX_FILTER_ORDER`. The default value is `min(4, MA_MAX_FILTER_ORDER)`. - - playback.pDeviceID - A pointer to a `ma_device_id` structure containing the ID of the playback device to initialize. Setting this NULL (default) will use the system's - default playback device. Retrieve the device ID from the `ma_device_info` structure, which can be retrieved using device enumeration. - - playback.format - The sample format to use for playback. When set to `ma_format_unknown` the device's native format will be used. This can be retrieved after - initialization from the device object directly with `device.playback.format`. - - playback.channels - The number of channels to use for playback. When set to 0 the device's native channel count will be used. This can be retrieved after initialization - from the device object directly with `device.playback.channels`. - - playback.pChannelMap - The channel map to use for playback. When left empty, the device's native channel map will be used. This can be retrieved after initialization from the - device object direct with `device.playback.pChannelMap`. When set, the buffer should contain `channels` items. - - playback.shareMode - The preferred share mode to use for playback. Can be either `ma_share_mode_shared` (default) or `ma_share_mode_exclusive`. Note that if you specify - exclusive mode, but it's not supported by the backend, initialization will fail. You can then fall back to shared mode if desired by changing this to - ma_share_mode_shared and reinitializing. - - capture.pDeviceID - A pointer to a `ma_device_id` structure containing the ID of the capture device to initialize. Setting this NULL (default) will use the system's - default capture device. Retrieve the device ID from the `ma_device_info` structure, which can be retrieved using device enumeration. - - capture.format - The sample format to use for capture. When set to `ma_format_unknown` the device's native format will be used. This can be retrieved after - initialization from the device object directly with `device.capture.format`. - - capture.channels - The number of channels to use for capture. When set to 0 the device's native channel count will be used. This can be retrieved after initialization - from the device object directly with `device.capture.channels`. - - capture.pChannelMap - The channel map to use for capture. When left empty, the device's native channel map will be used. This can be retrieved after initialization from the - device object direct with `device.capture.pChannelMap`. When set, the buffer should contain `channels` items. - - capture.shareMode - The preferred share mode to use for capture. Can be either `ma_share_mode_shared` (default) or `ma_share_mode_exclusive`. Note that if you specify - exclusive mode, but it's not supported by the backend, initialization will fail. You can then fall back to shared mode if desired by changing this to - ma_share_mode_shared and reinitializing. - - wasapi.noAutoConvertSRC - WASAPI only. When set to true, disables WASAPI's automatic resampling and forces the use of miniaudio's resampler. Defaults to false. - - wasapi.noDefaultQualitySRC - WASAPI only. Only used when `wasapi.noAutoConvertSRC` is set to false. When set to true, disables the use of `AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY`. - You should usually leave this set to false, which is the default. - - wasapi.noAutoStreamRouting - WASAPI only. When set to true, disables automatic stream routing on the WASAPI backend. Defaults to false. - - wasapi.noHardwareOffloading - WASAPI only. When set to true, disables the use of WASAPI's hardware offloading feature. Defaults to false. - - alsa.noMMap - ALSA only. When set to true, disables MMap mode. Defaults to false. - - alsa.noAutoFormat - ALSA only. When set to true, disables ALSA's automatic format conversion by including the SND_PCM_NO_AUTO_FORMAT flag. Defaults to false. - - alsa.noAutoChannels - ALSA only. When set to true, disables ALSA's automatic channel conversion by including the SND_PCM_NO_AUTO_CHANNELS flag. Defaults to false. - - alsa.noAutoResample - ALSA only. When set to true, disables ALSA's automatic resampling by including the SND_PCM_NO_AUTO_RESAMPLE flag. Defaults to false. - - pulse.pStreamNamePlayback - PulseAudio only. Sets the stream name for playback. - - pulse.pStreamNameCapture - PulseAudio only. Sets the stream name for capture. - - coreaudio.allowNominalSampleRateChange - Core Audio only. Desktop only. When enabled, allows the sample rate of the device to be changed at the operating system level. This - is disabled by default in order to prevent intrusive changes to the user's system. This is useful if you want to use a sample rate - that is known to be natively supported by the hardware thereby avoiding the cost of resampling. When set to true, miniaudio will - find the closest match between the sample rate requested in the device config and the sample rates natively supported by the - hardware. When set to false, the sample rate currently set by the operating system will always be used. - - opensl.streamType - OpenSL only. Explicitly sets the stream type. If left unset (`ma_opensl_stream_type_default`), the - stream type will be left unset. Think of this as the type of audio you're playing. - - opensl.recordingPreset - OpenSL only. Explicitly sets the type of recording your program will be doing. When left - unset, the recording preset will be left unchanged. - - aaudio.usage - AAudio only. Explicitly sets the nature of the audio the program will be consuming. When - left unset, the usage will be left unchanged. - - aaudio.contentType - AAudio only. Sets the content type. When left unset, the content type will be left unchanged. - - aaudio.inputPreset - AAudio only. Explicitly sets the type of recording your program will be doing. When left - unset, the input preset will be left unchanged. - - aaudio.noAutoStartAfterReroute - AAudio only. Controls whether or not the device should be automatically restarted after a - stream reroute. When set to false (default) the device will be restarted automatically; - otherwise the device will be stopped. - - -Once initialized, the device's config is immutable. If you need to change the config you will need to initialize a new device. - -After initializing the device it will be in a stopped state. To start it, use `ma_device_start()`. - -If both `periodSizeInFrames` and `periodSizeInMilliseconds` are set to zero, it will default to `MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY` or -`MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE`, depending on whether or not `performanceProfile` is set to `ma_performance_profile_low_latency` or -`ma_performance_profile_conservative`. - -If you request exclusive mode and the backend does not support it an error will be returned. For robustness, you may want to first try initializing the device -in exclusive mode, and then fall back to shared mode if required. Alternatively you can just request shared mode (the default if you leave it unset in the -config) which is the most reliable option. Some backends do not have a practical way of choosing whether or not the device should be exclusive or not (ALSA, -for example) in which case it just acts as a hint. Unless you have special requirements you should try avoiding exclusive mode as it's intrusive to the user. -Starting with Windows 10, miniaudio will use low-latency shared mode where possible which may make exclusive mode unnecessary. - -When sending or receiving data to/from a device, miniaudio will internally perform a format conversion to convert between the format specified by the config -and the format used internally by the backend. If you pass in 0 for the sample format, channel count, sample rate _and_ channel map, data transmission will run -on an optimized pass-through fast path. You can retrieve the format, channel count and sample rate by inspecting the `playback/capture.format`, -`playback/capture.channels` and `sampleRate` members of the device object. - -When compiling for UWP you must ensure you call this function on the main UI thread because the operating system may need to present the user with a message -asking for permissions. Please refer to the official documentation for ActivateAudioInterfaceAsync() for more information. - -ALSA Specific: When initializing the default device, requesting shared mode will try using the "dmix" device for playback and the "dsnoop" device for capture. -If these fail it will try falling back to the "hw" device. - - -Example 1 - Simple Initialization ---------------------------------- -This example shows how to initialize a simple playback device using a standard configuration. If you are just needing to do simple playback from the default -playback device this is usually all you need. - -```c -ma_device_config config = ma_device_config_init(ma_device_type_playback); -config.playback.format = ma_format_f32; -config.playback.channels = 2; -config.sampleRate = 48000; -config.dataCallback = ma_data_callback; -config.pMyUserData = pMyUserData; - -ma_device device; -ma_result result = ma_device_init(NULL, &config, &device); -if (result != MA_SUCCESS) { - // Error -} -``` - - -Example 2 - Advanced Initialization ------------------------------------ -This example shows how you might do some more advanced initialization. In this hypothetical example we want to control the latency by setting the buffer size -and period count. We also want to allow the user to be able to choose which device to output from which means we need a context so we can perform device -enumeration. - -```c -ma_context context; -ma_result result = ma_context_init(NULL, 0, NULL, &context); -if (result != MA_SUCCESS) { - // Error -} - -ma_device_info* pPlaybackDeviceInfos; -ma_uint32 playbackDeviceCount; -result = ma_context_get_devices(&context, &pPlaybackDeviceInfos, &playbackDeviceCount, NULL, NULL); -if (result != MA_SUCCESS) { - // Error -} - -// ... choose a device from pPlaybackDeviceInfos ... - -ma_device_config config = ma_device_config_init(ma_device_type_playback); -config.playback.pDeviceID = pMyChosenDeviceID; // <-- Get this from the `id` member of one of the `ma_device_info` objects returned by ma_context_get_devices(). -config.playback.format = ma_format_f32; -config.playback.channels = 2; -config.sampleRate = 48000; -config.dataCallback = ma_data_callback; -config.pUserData = pMyUserData; -config.periodSizeInMilliseconds = 10; -config.periods = 3; - -ma_device device; -result = ma_device_init(&context, &config, &device); -if (result != MA_SUCCESS) { - // Error -} -``` - - -See Also --------- -ma_device_config_init() -ma_device_uninit() -ma_device_start() -ma_context_init() -ma_context_get_devices() -ma_context_enumerate_devices() -*/ -MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice); - -/* -Initializes a device without a context, with extra parameters for controlling the configuration of the internal self-managed context. - -This is the same as `ma_device_init()`, only instead of a context being passed in, the parameters from `ma_context_init()` are passed in instead. This function -allows you to configure the internally created context. - - -Parameters ----------- -backends (in, optional) - A list of backends to try initializing, in priority order. Can be NULL, in which case it uses default priority order. - -backendCount (in, optional) - The number of items in `backend`. Ignored if `backend` is NULL. - -pContextConfig (in, optional) - The context configuration. - -pConfig (in) - A pointer to the device configuration. Cannot be null. See remarks for details. - -pDevice (out) - A pointer to the device object being initialized. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Unsafe. It is not safe to call this function simultaneously for different devices because some backends depend on and mutate global state. The same applies to -calling this at the same time as `ma_device_uninit()`. - - -Callback Safety ---------------- -Unsafe. It is not safe to call this inside any callback. - - -Remarks -------- -You only need to use this function if you want to configure the context differently to it's defaults. You should never use this function if you want to manage -your own context. - -See the documentation for `ma_context_init()` for information on the different context configuration options. - - -See Also --------- -ma_device_init() -ma_device_uninit() -ma_device_config_init() -ma_context_init() -*/ -MA_API ma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pContextConfig, const ma_device_config* pConfig, ma_device* pDevice); - -/* -Uninitializes a device. - -This will explicitly stop the device. You do not need to call `ma_device_stop()` beforehand, but it's harmless if you do. - - -Parameters ----------- -pDevice (in) - A pointer to the device to stop. - - -Return Value ------------- -Nothing - - -Thread Safety -------------- -Unsafe. As soon as this API is called the device should be considered undefined. - - -Callback Safety ---------------- -Unsafe. It is not safe to call this inside any callback. Doing this will result in a deadlock. - - -See Also --------- -ma_device_init() -ma_device_stop() -*/ -MA_API void ma_device_uninit(ma_device* pDevice); - - -/* -Retrieves a pointer to the context that owns the given device. -*/ -MA_API ma_context* ma_device_get_context(ma_device* pDevice); - -/* -Helper function for retrieving the log object associated with the context that owns this device. -*/ -MA_API ma_log* ma_device_get_log(ma_device* pDevice); - - -/* -Retrieves information about the device. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose information is being retrieved. - -type (in) - The device type. This parameter is required for duplex devices. When retrieving device - information, you are doing so for an individual playback or capture device. - -pDeviceInfo (out) - A pointer to the `ma_device_info` that will receive the device information. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Unsafe. This should be considered unsafe because it may be calling into the backend which may or -may not be safe. - - -Callback Safety ---------------- -Unsafe. You should avoid calling this in the data callback because it may call into the backend -which may or may not be safe. -*/ -MA_API ma_result ma_device_get_info(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo); - - -/* -Retrieves the name of the device. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose information is being retrieved. - -type (in) - The device type. This parameter is required for duplex devices. When retrieving device - information, you are doing so for an individual playback or capture device. - -pName (out) - A pointer to the buffer that will receive the name. - -nameCap (in) - The capacity of the output buffer, including space for the null terminator. - -pLengthNotIncludingNullTerminator (out, optional) - A pointer to the variable that will receive the length of the name, not including the null - terminator. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Unsafe. This should be considered unsafe because it may be calling into the backend which may or -may not be safe. - - -Callback Safety ---------------- -Unsafe. You should avoid calling this in the data callback because it may call into the backend -which may or may not be safe. - - -Remarks -------- -If the name does not fully fit into the output buffer, it'll be truncated. You can pass in NULL to -`pName` if you want to first get the length of the name for the purpose of memory allocation of the -output buffer. Allocating a buffer of size `MA_MAX_DEVICE_NAME_LENGTH + 1` should be enough for -most cases and will avoid the need for the inefficiency of calling this function twice. - -This is implemented in terms of `ma_device_get_info()`. -*/ -MA_API ma_result ma_device_get_name(ma_device* pDevice, ma_device_type type, char* pName, size_t nameCap, size_t* pLengthNotIncludingNullTerminator); - - -/* -Starts the device. For playback devices this begins playback. For capture devices it begins recording. - -Use `ma_device_stop()` to stop the device. - - -Parameters ----------- -pDevice (in) - A pointer to the device to start. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Safe. It's safe to call this from any thread with the exception of the callback thread. - - -Callback Safety ---------------- -Unsafe. It is not safe to call this inside any callback. - - -Remarks -------- -For a playback device, this will retrieve an initial chunk of audio data from the client before returning. The reason for this is to ensure there is valid -audio data in the buffer, which needs to be done before the device begins playback. - -This API waits until the backend device has been started for real by the worker thread. It also waits on a mutex for thread-safety. - -Do not call this in any callback. - - -See Also --------- -ma_device_stop() -*/ -MA_API ma_result ma_device_start(ma_device* pDevice); - -/* -Stops the device. For playback devices this stops playback. For capture devices it stops recording. - -Use `ma_device_start()` to start the device again. - - -Parameters ----------- -pDevice (in) - A pointer to the device to stop. - - -Return Value ------------- -MA_SUCCESS if successful; any other error code otherwise. - - -Thread Safety -------------- -Safe. It's safe to call this from any thread with the exception of the callback thread. - - -Callback Safety ---------------- -Unsafe. It is not safe to call this inside any callback. Doing this will result in a deadlock. - - -Remarks -------- -This API needs to wait on the worker thread to stop the backend device properly before returning. It also waits on a mutex for thread-safety. In addition, some -backends need to wait for the device to finish playback/recording of the current fragment which can take some time (usually proportionate to the buffer size -that was specified at initialization time). - -Backends are required to either pause the stream in-place or drain the buffer if pausing is not possible. The reason for this is that stopping the device and -the resuming it with ma_device_start() (which you might do when your program loses focus) may result in a situation where those samples are never output to the -speakers or received from the microphone which can in turn result in de-syncs. - -Do not call this in any callback. - -This will be called implicitly by `ma_device_uninit()`. - - -See Also --------- -ma_device_start() -*/ -MA_API ma_result ma_device_stop(ma_device* pDevice); - -/* -Determines whether or not the device is started. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose start state is being retrieved. - - -Return Value ------------- -True if the device is started, false otherwise. - - -Thread Safety -------------- -Safe. If another thread calls `ma_device_start()` or `ma_device_stop()` at this same time as this function is called, there's a very small chance the return -value will be out of sync. - - -Callback Safety ---------------- -Safe. This is implemented as a simple accessor. - - -See Also --------- -ma_device_start() -ma_device_stop() -*/ -MA_API ma_bool32 ma_device_is_started(const ma_device* pDevice); - - -/* -Retrieves the state of the device. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose state is being retrieved. - - -Return Value ------------- -The current state of the device. The return value will be one of the following: - - +-------------------------------+------------------------------------------------------------------------------+ - | ma_device_state_uninitialized | Will only be returned if the device is in the middle of initialization. | - +-------------------------------+------------------------------------------------------------------------------+ - | ma_device_state_stopped | The device is stopped. The initial state of the device after initialization. | - +-------------------------------+------------------------------------------------------------------------------+ - | ma_device_state_started | The device started and requesting and/or delivering audio data. | - +-------------------------------+------------------------------------------------------------------------------+ - | ma_device_state_starting | The device is in the process of starting. | - +-------------------------------+------------------------------------------------------------------------------+ - | ma_device_state_stopping | The device is in the process of stopping. | - +-------------------------------+------------------------------------------------------------------------------+ - - -Thread Safety -------------- -Safe. This is implemented as a simple accessor. Note that if the device is started or stopped at the same time as this function is called, -there's a possibility the return value could be out of sync. See remarks. - - -Callback Safety ---------------- -Safe. This is implemented as a simple accessor. - - -Remarks -------- -The general flow of a devices state goes like this: - - ``` - ma_device_init() -> ma_device_state_uninitialized -> ma_device_state_stopped - ma_device_start() -> ma_device_state_starting -> ma_device_state_started - ma_device_stop() -> ma_device_state_stopping -> ma_device_state_stopped - ``` - -When the state of the device is changed with `ma_device_start()` or `ma_device_stop()` at this same time as this function is called, the -value returned by this function could potentially be out of sync. If this is significant to your program you need to implement your own -synchronization. -*/ -MA_API ma_device_state ma_device_get_state(const ma_device* pDevice); - - -/* -Performs post backend initialization routines for setting up internal data conversion. - -This should be called whenever the backend is initialized. The only time this should be called from -outside of miniaudio is if you're implementing a custom backend, and you would only do it if you -are reinitializing the backend due to rerouting or reinitializing for some reason. - - -Parameters ----------- -pDevice [in] - A pointer to the device. - -deviceType [in] - The type of the device that was just reinitialized. - -pPlaybackDescriptor [in] - The descriptor of the playback device containing the internal data format and buffer sizes. - -pPlaybackDescriptor [in] - The descriptor of the capture device containing the internal data format and buffer sizes. - - -Return Value ------------- -MA_SUCCESS if successful; any other error otherwise. - - -Thread Safety -------------- -Unsafe. This will be reinitializing internal data converters which may be in use by another thread. - - -Callback Safety ---------------- -Unsafe. This will be reinitializing internal data converters which may be in use by the callback. - - -Remarks -------- -For a duplex device, you can call this for only one side of the system. This is why the deviceType -is specified as a parameter rather than deriving it from the device. - -You do not need to call this manually unless you are doing a custom backend, in which case you need -only do it if you're manually performing rerouting or reinitialization. -*/ -MA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceType, const ma_device_descriptor* pPlaybackDescriptor, const ma_device_descriptor* pCaptureDescriptor); - - -/* -Sets the master volume factor for the device. - -The volume factor must be between 0 (silence) and 1 (full volume). Use `ma_device_set_master_volume_db()` to use decibel notation, where 0 is full volume and -values less than 0 decreases the volume. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose volume is being set. - -volume (in) - The new volume factor. Must be >= 0. - - -Return Value ------------- -MA_SUCCESS if the volume was set successfully. -MA_INVALID_ARGS if pDevice is NULL. -MA_INVALID_ARGS if volume is negative. - - -Thread Safety -------------- -Safe. This just sets a local member of the device object. - - -Callback Safety ---------------- -Safe. If you set the volume in the data callback, that data written to the output buffer will have the new volume applied. - - -Remarks -------- -This applies the volume factor across all channels. - -This does not change the operating system's volume. It only affects the volume for the given `ma_device` object's audio stream. - - -See Also --------- -ma_device_get_master_volume() -ma_device_set_master_volume_db() -ma_device_get_master_volume_db() -*/ -MA_API ma_result ma_device_set_master_volume(ma_device* pDevice, float volume); - -/* -Retrieves the master volume factor for the device. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose volume factor is being retrieved. - -pVolume (in) - A pointer to the variable that will receive the volume factor. The returned value will be in the range of [0, 1]. - - -Return Value ------------- -MA_SUCCESS if successful. -MA_INVALID_ARGS if pDevice is NULL. -MA_INVALID_ARGS if pVolume is NULL. - - -Thread Safety -------------- -Safe. This just a simple member retrieval. - - -Callback Safety ---------------- -Safe. - - -Remarks -------- -If an error occurs, `*pVolume` will be set to 0. - - -See Also --------- -ma_device_set_master_volume() -ma_device_set_master_volume_gain_db() -ma_device_get_master_volume_gain_db() -*/ -MA_API ma_result ma_device_get_master_volume(ma_device* pDevice, float* pVolume); - -/* -Sets the master volume for the device as gain in decibels. - -A gain of 0 is full volume, whereas a gain of < 0 will decrease the volume. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose gain is being set. - -gainDB (in) - The new volume as gain in decibels. Must be less than or equal to 0, where 0 is full volume and anything less than 0 decreases the volume. - - -Return Value ------------- -MA_SUCCESS if the volume was set successfully. -MA_INVALID_ARGS if pDevice is NULL. -MA_INVALID_ARGS if the gain is > 0. - - -Thread Safety -------------- -Safe. This just sets a local member of the device object. - - -Callback Safety ---------------- -Safe. If you set the volume in the data callback, that data written to the output buffer will have the new volume applied. - - -Remarks -------- -This applies the gain across all channels. - -This does not change the operating system's volume. It only affects the volume for the given `ma_device` object's audio stream. - - -See Also --------- -ma_device_get_master_volume_gain_db() -ma_device_set_master_volume() -ma_device_get_master_volume() -*/ -MA_API ma_result ma_device_set_master_volume_db(ma_device* pDevice, float gainDB); - -/* -Retrieves the master gain in decibels. - - -Parameters ----------- -pDevice (in) - A pointer to the device whose gain is being retrieved. - -pGainDB (in) - A pointer to the variable that will receive the gain in decibels. The returned value will be <= 0. - - -Return Value ------------- -MA_SUCCESS if successful. -MA_INVALID_ARGS if pDevice is NULL. -MA_INVALID_ARGS if pGainDB is NULL. - - -Thread Safety -------------- -Safe. This just a simple member retrieval. - - -Callback Safety ---------------- -Safe. - - -Remarks -------- -If an error occurs, `*pGainDB` will be set to 0. - - -See Also --------- -ma_device_set_master_volume_db() -ma_device_set_master_volume() -ma_device_get_master_volume() -*/ -MA_API ma_result ma_device_get_master_volume_db(ma_device* pDevice, float* pGainDB); - - -/* -Called from the data callback of asynchronous backends to allow miniaudio to process the data and fire the miniaudio data callback. - - -Parameters ----------- -pDevice (in) - A pointer to device whose processing the data callback. - -pOutput (out) - A pointer to the buffer that will receive the output PCM frame data. On a playback device this must not be NULL. On a duplex device - this can be NULL, in which case pInput must not be NULL. - -pInput (in) - A pointer to the buffer containing input PCM frame data. On a capture device this must not be NULL. On a duplex device this can be - NULL, in which case `pOutput` must not be NULL. - -frameCount (in) - The number of frames being processed. - - -Return Value ------------- -MA_SUCCESS if successful; any other result code otherwise. - - -Thread Safety -------------- -This function should only ever be called from the internal data callback of the backend. It is safe to call this simultaneously between a -playback and capture device in duplex setups. - - -Callback Safety ---------------- -Do not call this from the miniaudio data callback. It should only ever be called from the internal data callback of the backend. - - -Remarks -------- -If both `pOutput` and `pInput` are NULL, and error will be returned. In duplex scenarios, both `pOutput` and `pInput` can be non-NULL, in -which case `pInput` will be processed first, followed by `pOutput`. - -If you are implementing a custom backend, and that backend uses a callback for data delivery, you'll need to call this from inside that -callback. -*/ -MA_API ma_result ma_device_handle_backend_data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount); - - -/* -Calculates an appropriate buffer size from a descriptor, native sample rate and performance profile. - -This function is used by backends for helping determine an appropriately sized buffer to use with -the device depending on the values of `periodSizeInFrames` and `periodSizeInMilliseconds` in the -`pDescriptor` object. Since buffer size calculations based on time depends on the sample rate, a -best guess at the device's native sample rate is also required which is where `nativeSampleRate` -comes in. In addition, the performance profile is also needed for cases where both the period size -in frames and milliseconds are both zero. - - -Parameters ----------- -pDescriptor (in) - A pointer to device descriptor whose `periodSizeInFrames` and `periodSizeInMilliseconds` members - will be used for the calculation of the buffer size. - -nativeSampleRate (in) - The device's native sample rate. This is only ever used when the `periodSizeInFrames` member of - `pDescriptor` is zero. In this case, `periodSizeInMilliseconds` will be used instead, in which - case a sample rate is required to convert to a size in frames. - -performanceProfile (in) - When both the `periodSizeInFrames` and `periodSizeInMilliseconds` members of `pDescriptor` are - zero, miniaudio will fall back to a buffer size based on the performance profile. The profile - to use for this calculation is determine by this parameter. - - -Return Value ------------- -The calculated buffer size in frames. - - -Thread Safety -------------- -This is safe so long as nothing modifies `pDescriptor` at the same time. However, this function -should only ever be called from within the backend's device initialization routine and therefore -shouldn't have any multithreading concerns. - - -Callback Safety ---------------- -This is safe to call within the data callback, but there is no reason to ever do this. - - -Remarks -------- -If `nativeSampleRate` is zero, this function will fall back to `pDescriptor->sampleRate`. If that -is also zero, `MA_DEFAULT_SAMPLE_RATE` will be used instead. -*/ -MA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_descriptor(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile); - - - -/* -Retrieves a friendly name for a backend. -*/ -MA_API const char* ma_get_backend_name(ma_backend backend); - -/* -Determines whether or not the given backend is available by the compilation environment. -*/ -MA_API ma_bool32 ma_is_backend_enabled(ma_backend backend); - -/* -Retrieves compile-time enabled backends. - - -Parameters ----------- -pBackends (out, optional) - A pointer to the buffer that will receive the enabled backends. Set to NULL to retrieve the backend count. Setting - the capacity of the buffer to `MA_BUFFER_COUNT` will guarantee it's large enough for all backends. - -backendCap (in) - The capacity of the `pBackends` buffer. - -pBackendCount (out) - A pointer to the variable that will receive the enabled backend count. - - -Return Value ------------- -MA_SUCCESS if successful. -MA_INVALID_ARGS if `pBackendCount` is NULL. -MA_NO_SPACE if the capacity of `pBackends` is not large enough. - -If `MA_NO_SPACE` is returned, the `pBackends` buffer will be filled with `*pBackendCount` values. - - -Thread Safety -------------- -Safe. - - -Callback Safety ---------------- -Safe. - - -Remarks -------- -If you want to retrieve the number of backends so you can determine the capacity of `pBackends` buffer, you can call -this function with `pBackends` set to NULL. - -This will also enumerate the null backend. If you don't want to include this you need to check for `ma_backend_null` -when you enumerate over the returned backends and handle it appropriately. Alternatively, you can disable it at -compile time with `MA_NO_NULL`. - -The returned backends are determined based on compile time settings, not the platform it's currently running on. For -example, PulseAudio will be returned if it was enabled at compile time, even when the user doesn't actually have -PulseAudio installed. - - -Example 1 ---------- -The example below retrieves the enabled backend count using a fixed sized buffer allocated on the stack. The buffer is -given a capacity of `MA_BACKEND_COUNT` which will guarantee it'll be large enough to store all available backends. -Since `MA_BACKEND_COUNT` is always a relatively small value, this should be suitable for most scenarios. - -``` -ma_backend enabledBackends[MA_BACKEND_COUNT]; -size_t enabledBackendCount; - -result = ma_get_enabled_backends(enabledBackends, MA_BACKEND_COUNT, &enabledBackendCount); -if (result != MA_SUCCESS) { - // Failed to retrieve enabled backends. Should never happen in this example since all inputs are valid. -} -``` - - -See Also --------- -ma_is_backend_enabled() -*/ -MA_API ma_result ma_get_enabled_backends(ma_backend* pBackends, size_t backendCap, size_t* pBackendCount); - -/* -Determines whether or not loopback mode is support by a backend. -*/ -MA_API ma_bool32 ma_is_loopback_supported(ma_backend backend); - -#endif /* MA_NO_DEVICE_IO */ - - - -/************************************************************************************************************************************************************ - -Utiltities - -************************************************************************************************************************************************************/ - -/* -Calculates a buffer size in milliseconds from the specified number of frames and sample rate. -*/ -MA_API ma_uint32 ma_calculate_buffer_size_in_milliseconds_from_frames(ma_uint32 bufferSizeInFrames, ma_uint32 sampleRate); - -/* -Calculates a buffer size in frames from the specified number of milliseconds and sample rate. -*/ -MA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_milliseconds(ma_uint32 bufferSizeInMilliseconds, ma_uint32 sampleRate); - -/* -Copies PCM frames from one buffer to another. -*/ -MA_API void ma_copy_pcm_frames(void* dst, const void* src, ma_uint64 frameCount, ma_format format, ma_uint32 channels); - -/* -Copies silent frames into the given buffer. - -Remarks -------- -For all formats except `ma_format_u8`, the output buffer will be filled with 0. For `ma_format_u8` it will be filled with 128. The reason for this is that it -makes more sense for the purpose of mixing to initialize it to the center point. -*/ -MA_API void ma_silence_pcm_frames(void* p, ma_uint64 frameCount, ma_format format, ma_uint32 channels); - - -/* -Offsets a pointer by the specified number of PCM frames. -*/ -MA_API void* ma_offset_pcm_frames_ptr(void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels); -MA_API const void* ma_offset_pcm_frames_const_ptr(const void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels); -static MA_INLINE float* ma_offset_pcm_frames_ptr_f32(float* p, ma_uint64 offsetInFrames, ma_uint32 channels) { return (float*)ma_offset_pcm_frames_ptr((void*)p, offsetInFrames, ma_format_f32, channels); } -static MA_INLINE const float* ma_offset_pcm_frames_const_ptr_f32(const float* p, ma_uint64 offsetInFrames, ma_uint32 channels) { return (const float*)ma_offset_pcm_frames_const_ptr((const void*)p, offsetInFrames, ma_format_f32, channels); } - - -/* -Clips samples. -*/ -MA_API void ma_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count); -MA_API void ma_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count); -MA_API void ma_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count); -MA_API void ma_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count); -MA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count); -MA_API void ma_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels); - -/* -Helper for applying a volume factor to samples. - -Note that the source and destination buffers can be the same, in which case it'll perform the operation in-place. -*/ -MA_API void ma_copy_and_apply_volume_factor_u8(ma_uint8* pSamplesOut, const ma_uint8* pSamplesIn, ma_uint64 sampleCount, float factor); -MA_API void ma_copy_and_apply_volume_factor_s16(ma_int16* pSamplesOut, const ma_int16* pSamplesIn, ma_uint64 sampleCount, float factor); -MA_API void ma_copy_and_apply_volume_factor_s24(void* pSamplesOut, const void* pSamplesIn, ma_uint64 sampleCount, float factor); -MA_API void ma_copy_and_apply_volume_factor_s32(ma_int32* pSamplesOut, const ma_int32* pSamplesIn, ma_uint64 sampleCount, float factor); -MA_API void ma_copy_and_apply_volume_factor_f32(float* pSamplesOut, const float* pSamplesIn, ma_uint64 sampleCount, float factor); - -MA_API void ma_apply_volume_factor_u8(ma_uint8* pSamples, ma_uint64 sampleCount, float factor); -MA_API void ma_apply_volume_factor_s16(ma_int16* pSamples, ma_uint64 sampleCount, float factor); -MA_API void ma_apply_volume_factor_s24(void* pSamples, ma_uint64 sampleCount, float factor); -MA_API void ma_apply_volume_factor_s32(ma_int32* pSamples, ma_uint64 sampleCount, float factor); -MA_API void ma_apply_volume_factor_f32(float* pSamples, ma_uint64 sampleCount, float factor); - -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_u8(ma_uint8* pFramesOut, const ma_uint8* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_s16(ma_int16* pFramesOut, const ma_int16* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_s24(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_s32(ma_int32* pFramesOut, const ma_int32* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_copy_and_apply_volume_factor_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor); - -MA_API void ma_apply_volume_factor_pcm_frames_u8(ma_uint8* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_apply_volume_factor_pcm_frames_s16(ma_int16* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_apply_volume_factor_pcm_frames_s24(void* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_apply_volume_factor_pcm_frames_s32(ma_int32* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_apply_volume_factor_pcm_frames_f32(float* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor); -MA_API void ma_apply_volume_factor_pcm_frames(void* pFrames, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor); - -MA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float* pChannelGains); - - -MA_API void ma_copy_and_apply_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume); -MA_API void ma_copy_and_apply_volume_and_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count, float volume); -MA_API void ma_copy_and_apply_volume_and_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count, float volume); -MA_API void ma_copy_and_apply_volume_and_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count, float volume); -MA_API void ma_copy_and_apply_volume_and_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count, float volume); -MA_API void ma_copy_and_apply_volume_and_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float volume); - - -/* -Helper for converting a linear factor to gain in decibels. -*/ -MA_API float ma_volume_linear_to_db(float factor); - -/* -Helper for converting gain in decibels to a linear factor. -*/ -MA_API float ma_volume_db_to_linear(float gain); - - - - -/************************************************************************************************** - -Data Source - -**************************************************************************************************/ -typedef void ma_data_source; - -#define MA_DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT 0x00000001 - -typedef struct -{ - ma_result (* onRead)(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); - ma_result (* onSeek)(ma_data_source* pDataSource, ma_uint64 frameIndex); - ma_result (* onGetDataFormat)(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); - ma_result (* onGetCursor)(ma_data_source* pDataSource, ma_uint64* pCursor); - ma_result (* onGetLength)(ma_data_source* pDataSource, ma_uint64* pLength); - ma_result (* onSetLooping)(ma_data_source* pDataSource, ma_bool32 isLooping); - ma_uint32 flags; -} ma_data_source_vtable; - -typedef ma_data_source* (* ma_data_source_get_next_proc)(ma_data_source* pDataSource); - -typedef struct -{ - const ma_data_source_vtable* vtable; -} ma_data_source_config; - -MA_API ma_data_source_config ma_data_source_config_init(void); - - -typedef struct -{ - const ma_data_source_vtable* vtable; - ma_uint64 rangeBegInFrames; - ma_uint64 rangeEndInFrames; /* Set to -1 for unranged (default). */ - ma_uint64 loopBegInFrames; /* Relative to rangeBegInFrames. */ - ma_uint64 loopEndInFrames; /* Relative to rangeBegInFrames. Set to -1 for the end of the range. */ - ma_data_source* pCurrent; /* When non-NULL, the data source being initialized will act as a proxy and will route all operations to pCurrent. Used in conjunction with pNext/onGetNext for seamless chaining. */ - ma_data_source* pNext; /* When set to NULL, onGetNext will be used. */ - ma_data_source_get_next_proc onGetNext; /* Will be used when pNext is NULL. If both are NULL, no next will be used. */ - MA_ATOMIC(4, ma_bool32) isLooping; -} ma_data_source_base; - -MA_API ma_result ma_data_source_init(const ma_data_source_config* pConfig, ma_data_source* pDataSource); -MA_API void ma_data_source_uninit(ma_data_source* pDataSource); -MA_API ma_result ma_data_source_read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); /* Must support pFramesOut = NULL in which case a forward seek should be performed. */ -MA_API ma_result ma_data_source_seek_pcm_frames(ma_data_source* pDataSource, ma_uint64 frameCount, ma_uint64* pFramesSeeked); /* Can only seek forward. Equivalent to ma_data_source_read_pcm_frames(pDataSource, NULL, frameCount, &framesRead); */ -MA_API ma_result ma_data_source_seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex); -MA_API ma_result ma_data_source_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_data_source_get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor); -MA_API ma_result ma_data_source_get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength); /* Returns MA_NOT_IMPLEMENTED if the length is unknown or cannot be determined. Decoders can return this. */ -MA_API ma_result ma_data_source_get_cursor_in_seconds(ma_data_source* pDataSource, float* pCursor); -MA_API ma_result ma_data_source_get_length_in_seconds(ma_data_source* pDataSource, float* pLength); -MA_API ma_result ma_data_source_set_looping(ma_data_source* pDataSource, ma_bool32 isLooping); -MA_API ma_bool32 ma_data_source_is_looping(const ma_data_source* pDataSource); -MA_API ma_result ma_data_source_set_range_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 rangeBegInFrames, ma_uint64 rangeEndInFrames); -MA_API void ma_data_source_get_range_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pRangeBegInFrames, ma_uint64* pRangeEndInFrames); -MA_API ma_result ma_data_source_set_loop_point_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 loopBegInFrames, ma_uint64 loopEndInFrames); -MA_API void ma_data_source_get_loop_point_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pLoopBegInFrames, ma_uint64* pLoopEndInFrames); -MA_API ma_result ma_data_source_set_current(ma_data_source* pDataSource, ma_data_source* pCurrentDataSource); -MA_API ma_data_source* ma_data_source_get_current(const ma_data_source* pDataSource); -MA_API ma_result ma_data_source_set_next(ma_data_source* pDataSource, ma_data_source* pNextDataSource); -MA_API ma_data_source* ma_data_source_get_next(const ma_data_source* pDataSource); -MA_API ma_result ma_data_source_set_next_callback(ma_data_source* pDataSource, ma_data_source_get_next_proc onGetNext); -MA_API ma_data_source_get_next_proc ma_data_source_get_next_callback(const ma_data_source* pDataSource); - - -typedef struct -{ - ma_data_source_base ds; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_uint64 cursor; - ma_uint64 sizeInFrames; - const void* pData; -} ma_audio_buffer_ref; - -MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef); -MA_API void ma_audio_buffer_ref_uninit(ma_audio_buffer_ref* pAudioBufferRef); -MA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferRef, const void* pData, ma_uint64 sizeInFrames); -MA_API ma_uint64 ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop); -MA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex); -MA_API ma_result ma_audio_buffer_ref_map(ma_audio_buffer_ref* pAudioBufferRef, void** ppFramesOut, ma_uint64* pFrameCount); -MA_API ma_result ma_audio_buffer_ref_unmap(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameCount); /* Returns MA_AT_END if the end has been reached. This should be considered successful. */ -MA_API ma_bool32 ma_audio_buffer_ref_at_end(const ma_audio_buffer_ref* pAudioBufferRef); -MA_API ma_result ma_audio_buffer_ref_get_cursor_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pCursor); -MA_API ma_result ma_audio_buffer_ref_get_length_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pLength); -MA_API ma_result ma_audio_buffer_ref_get_available_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pAvailableFrames); - - - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_uint64 sizeInFrames; - const void* pData; /* If set to NULL, will allocate a block of memory for you. */ - ma_allocation_callbacks allocationCallbacks; -} ma_audio_buffer_config; - -MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks); - -typedef struct -{ - ma_audio_buffer_ref ref; - ma_allocation_callbacks allocationCallbacks; - ma_bool32 ownsData; /* Used to control whether or not miniaudio owns the data buffer. If set to true, pData will be freed in ma_audio_buffer_uninit(). */ - ma_uint8 _pExtraData[1]; /* For allocating a buffer with the memory located directly after the other memory of the structure. */ -} ma_audio_buffer; - -MA_API ma_result ma_audio_buffer_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer); -MA_API ma_result ma_audio_buffer_init_copy(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer); -MA_API ma_result ma_audio_buffer_alloc_and_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer** ppAudioBuffer); /* Always copies the data. Doesn't make sense to use this otherwise. Use ma_audio_buffer_uninit_and_free() to uninit. */ -MA_API void ma_audio_buffer_uninit(ma_audio_buffer* pAudioBuffer); -MA_API void ma_audio_buffer_uninit_and_free(ma_audio_buffer* pAudioBuffer); -MA_API ma_uint64 ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop); -MA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer, ma_uint64 frameIndex); -MA_API ma_result ma_audio_buffer_map(ma_audio_buffer* pAudioBuffer, void** ppFramesOut, ma_uint64* pFrameCount); -MA_API ma_result ma_audio_buffer_unmap(ma_audio_buffer* pAudioBuffer, ma_uint64 frameCount); /* Returns MA_AT_END if the end has been reached. This should be considered successful. */ -MA_API ma_bool32 ma_audio_buffer_at_end(const ma_audio_buffer* pAudioBuffer); -MA_API ma_result ma_audio_buffer_get_cursor_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pCursor); -MA_API ma_result ma_audio_buffer_get_length_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pLength); -MA_API ma_result ma_audio_buffer_get_available_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pAvailableFrames); - - -/* -Paged Audio Buffer -================== -A paged audio buffer is made up of a linked list of pages. It's expandable, but not shrinkable. It -can be used for cases where audio data is streamed in asynchronously while allowing data to be read -at the same time. - -This is lock-free, but not 100% thread safe. You can append a page and read from the buffer across -simultaneously across different threads, however only one thread at a time can append, and only one -thread at a time can read and seek. -*/ -typedef struct ma_paged_audio_buffer_page ma_paged_audio_buffer_page; -struct ma_paged_audio_buffer_page -{ - MA_ATOMIC(MA_SIZEOF_PTR, ma_paged_audio_buffer_page*) pNext; - ma_uint64 sizeInFrames; - ma_uint8 pAudioData[1]; -}; - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_paged_audio_buffer_page head; /* Dummy head for the lock-free algorithm. Always has a size of 0. */ - MA_ATOMIC(MA_SIZEOF_PTR, ma_paged_audio_buffer_page*) pTail; /* Never null. Initially set to &head. */ -} ma_paged_audio_buffer_data; - -MA_API ma_result ma_paged_audio_buffer_data_init(ma_format format, ma_uint32 channels, ma_paged_audio_buffer_data* pData); -MA_API void ma_paged_audio_buffer_data_uninit(ma_paged_audio_buffer_data* pData, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_head(ma_paged_audio_buffer_data* pData); -MA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_tail(ma_paged_audio_buffer_data* pData); -MA_API ma_result ma_paged_audio_buffer_data_get_length_in_pcm_frames(ma_paged_audio_buffer_data* pData, ma_uint64* pLength); -MA_API ma_result ma_paged_audio_buffer_data_allocate_page(ma_paged_audio_buffer_data* pData, ma_uint64 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks, ma_paged_audio_buffer_page** ppPage); -MA_API ma_result ma_paged_audio_buffer_data_free_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_paged_audio_buffer_data_append_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage); -MA_API ma_result ma_paged_audio_buffer_data_allocate_and_append_page(ma_paged_audio_buffer_data* pData, ma_uint32 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks); - - -typedef struct -{ - ma_paged_audio_buffer_data* pData; /* Must not be null. */ -} ma_paged_audio_buffer_config; - -MA_API ma_paged_audio_buffer_config ma_paged_audio_buffer_config_init(ma_paged_audio_buffer_data* pData); - - -typedef struct -{ - ma_data_source_base ds; - ma_paged_audio_buffer_data* pData; /* Audio data is read from here. Cannot be null. */ - ma_paged_audio_buffer_page* pCurrent; - ma_uint64 relativeCursor; /* Relative to the current page. */ - ma_uint64 absoluteCursor; -} ma_paged_audio_buffer; - -MA_API ma_result ma_paged_audio_buffer_init(const ma_paged_audio_buffer_config* pConfig, ma_paged_audio_buffer* pPagedAudioBuffer); -MA_API void ma_paged_audio_buffer_uninit(ma_paged_audio_buffer* pPagedAudioBuffer); -MA_API ma_result ma_paged_audio_buffer_read_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); /* Returns MA_AT_END if no more pages available. */ -MA_API ma_result ma_paged_audio_buffer_seek_to_pcm_frame(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64 frameIndex); -MA_API ma_result ma_paged_audio_buffer_get_cursor_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pCursor); -MA_API ma_result ma_paged_audio_buffer_get_length_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pLength); - - - -/************************************************************************************************************************************************************ - -VFS -=== - -The VFS object (virtual file system) is what's used to customize file access. This is useful in cases where stdio FILE* based APIs may not be entirely -appropriate for a given situation. - -************************************************************************************************************************************************************/ -typedef void ma_vfs; -typedef ma_handle ma_vfs_file; - -typedef enum -{ - MA_OPEN_MODE_READ = 0x00000001, - MA_OPEN_MODE_WRITE = 0x00000002 -} ma_open_mode_flags; - -typedef enum -{ - ma_seek_origin_start, - ma_seek_origin_current, - ma_seek_origin_end /* Not used by decoders. */ -} ma_seek_origin; - -typedef struct -{ - ma_uint64 sizeInBytes; -} ma_file_info; - -typedef struct -{ - ma_result (* onOpen) (ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile); - ma_result (* onOpenW)(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile); - ma_result (* onClose)(ma_vfs* pVFS, ma_vfs_file file); - ma_result (* onRead) (ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead); - ma_result (* onWrite)(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten); - ma_result (* onSeek) (ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin); - ma_result (* onTell) (ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor); - ma_result (* onInfo) (ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo); -} ma_vfs_callbacks; - -MA_API ma_result ma_vfs_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile); -MA_API ma_result ma_vfs_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile); -MA_API ma_result ma_vfs_close(ma_vfs* pVFS, ma_vfs_file file); -MA_API ma_result ma_vfs_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead); -MA_API ma_result ma_vfs_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten); -MA_API ma_result ma_vfs_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin); -MA_API ma_result ma_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor); -MA_API ma_result ma_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo); -MA_API ma_result ma_vfs_open_and_read_file(ma_vfs* pVFS, const char* pFilePath, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks); - -typedef struct -{ - ma_vfs_callbacks cb; - ma_allocation_callbacks allocationCallbacks; /* Only used for the wchar_t version of open() on non-Windows platforms. */ -} ma_default_vfs; - -MA_API ma_result ma_default_vfs_init(ma_default_vfs* pVFS, const ma_allocation_callbacks* pAllocationCallbacks); - - - -typedef ma_result (* ma_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead); -typedef ma_result (* ma_seek_proc)(void* pUserData, ma_int64 offset, ma_seek_origin origin); -typedef ma_result (* ma_tell_proc)(void* pUserData, ma_int64* pCursor); - - - -#if !defined(MA_NO_DECODING) || !defined(MA_NO_ENCODING) -typedef enum -{ - ma_encoding_format_unknown = 0, - ma_encoding_format_wav, - ma_encoding_format_flac, - ma_encoding_format_mp3, - ma_encoding_format_vorbis -} ma_encoding_format; -#endif - -/************************************************************************************************************************************************************ - -Decoding -======== - -Decoders are independent of the main device API. Decoding APIs can be called freely inside the device's data callback, but they are not thread safe unless -you do your own synchronization. - -************************************************************************************************************************************************************/ -#ifndef MA_NO_DECODING -typedef struct ma_decoder ma_decoder; - - -typedef struct -{ - ma_format preferredFormat; - ma_uint32 seekPointCount; /* Set to > 0 to generate a seektable if the decoding backend supports it. */ -} ma_decoding_backend_config; - -MA_API ma_decoding_backend_config ma_decoding_backend_config_init(ma_format preferredFormat, ma_uint32 seekPointCount); - - -typedef struct -{ - ma_result (* onInit )(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); - ma_result (* onInitFile )(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ - ma_result (* onInitFileW )(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ - ma_result (* onInitMemory)(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend); /* Optional. */ - void (* onUninit )(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks); -} ma_decoding_backend_vtable; - - -typedef ma_result (* ma_decoder_read_proc)(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead); /* Returns the number of bytes read. */ -typedef ma_result (* ma_decoder_seek_proc)(ma_decoder* pDecoder, ma_int64 byteOffset, ma_seek_origin origin); -typedef ma_result (* ma_decoder_tell_proc)(ma_decoder* pDecoder, ma_int64* pCursor); - -typedef struct -{ - ma_format format; /* Set to 0 or ma_format_unknown to use the stream's internal format. */ - ma_uint32 channels; /* Set to 0 to use the stream's internal channels. */ - ma_uint32 sampleRate; /* Set to 0 to use the stream's internal sample rate. */ - ma_channel* pChannelMap; - ma_channel_mix_mode channelMixMode; - ma_dither_mode ditherMode; - ma_resampler_config resampling; - ma_allocation_callbacks allocationCallbacks; - ma_encoding_format encodingFormat; - ma_uint32 seekPointCount; /* When set to > 0, specifies the number of seek points to use for the generation of a seek table. Not all decoding backends support this. */ - ma_decoding_backend_vtable** ppCustomBackendVTables; - ma_uint32 customBackendCount; - void* pCustomBackendUserData; -} ma_decoder_config; - -struct ma_decoder -{ - ma_data_source_base ds; - ma_data_source* pBackend; /* The decoding backend we'll be pulling data from. */ - const ma_decoding_backend_vtable* pBackendVTable; /* The vtable for the decoding backend. This needs to be stored so we can access the onUninit() callback. */ - void* pBackendUserData; - ma_decoder_read_proc onRead; - ma_decoder_seek_proc onSeek; - ma_decoder_tell_proc onTell; - void* pUserData; - ma_uint64 readPointerInPCMFrames; /* In output sample rate. Used for keeping track of how many frames are available for decoding. */ - ma_format outputFormat; - ma_uint32 outputChannels; - ma_uint32 outputSampleRate; - ma_data_converter converter; /* Data conversion is achieved by running frames through this. */ - void* pInputCache; /* In input format. Can be null if it's not needed. */ - ma_uint64 inputCacheCap; /* The capacity of the input cache. */ - ma_uint64 inputCacheConsumed; /* The number of frames that have been consumed in the cache. Used for determining the next valid frame. */ - ma_uint64 inputCacheRemaining; /* The number of valid frames remaining in the cahce. */ - ma_allocation_callbacks allocationCallbacks; - union - { - struct - { - ma_vfs* pVFS; - ma_vfs_file file; - } vfs; - struct - { - const ma_uint8* pData; - size_t dataSize; - size_t currentReadPos; - } memory; /* Only used for decoders that were opened against a block of memory. */ - } data; -}; - -MA_API ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate); -MA_API ma_decoder_config ma_decoder_config_init_default(void); - -MA_API ma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder); -MA_API ma_result ma_decoder_init_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder); -MA_API ma_result ma_decoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder); -MA_API ma_result ma_decoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder); -MA_API ma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder); -MA_API ma_result ma_decoder_init_file_w(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder); - -/* -Uninitializes a decoder. -*/ -MA_API ma_result ma_decoder_uninit(ma_decoder* pDecoder); - -/* -Reads PCM frames from the given decoder. - -This is not thread safe without your own synchronization. -*/ -MA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); - -/* -Seeks to a PCM frame based on it's absolute index. - -This is not thread safe without your own synchronization. -*/ -MA_API ma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex); - -/* -Retrieves the decoder's output data format. -*/ -MA_API ma_result ma_decoder_get_data_format(ma_decoder* pDecoder, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); - -/* -Retrieves the current position of the read cursor in PCM frames. -*/ -MA_API ma_result ma_decoder_get_cursor_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pCursor); - -/* -Retrieves the length of the decoder in PCM frames. - -Do not call this on streams of an undefined length, such as internet radio. - -If the length is unknown or an error occurs, 0 will be returned. - -This will always return 0 for Vorbis decoders. This is due to a limitation with stb_vorbis in push mode which is what miniaudio -uses internally. - -For MP3's, this will decode the entire file. Do not call this in time critical scenarios. - -This function is not thread safe without your own synchronization. -*/ -MA_API ma_result ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pLength); - -/* -Retrieves the number of frames that can be read before reaching the end. - -This calls `ma_decoder_get_length_in_pcm_frames()` so you need to be aware of the rules for that function, in -particular ensuring you do not call it on streams of an undefined length, such as internet radio. - -If the total length of the decoder cannot be retrieved, such as with Vorbis decoders, `MA_NOT_IMPLEMENTED` will be -returned. -*/ -MA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64* pAvailableFrames); - -/* -Helper for opening and decoding a file into a heap allocated block of memory. Free the returned pointer with ma_free(). On input, -pConfig should be set to what you want. On output it will be set to what you got. -*/ -MA_API ma_result ma_decode_from_vfs(ma_vfs* pVFS, const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut); -MA_API ma_result ma_decode_file(const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut); -MA_API ma_result ma_decode_memory(const void* pData, size_t dataSize, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut); - -#endif /* MA_NO_DECODING */ - - -/************************************************************************************************************************************************************ - -Encoding -======== - -Encoders do not perform any format conversion for you. If your target format does not support the format, and error will be returned. - -************************************************************************************************************************************************************/ -#ifndef MA_NO_ENCODING -typedef struct ma_encoder ma_encoder; - -typedef ma_result (* ma_encoder_write_proc) (ma_encoder* pEncoder, const void* pBufferIn, size_t bytesToWrite, size_t* pBytesWritten); -typedef ma_result (* ma_encoder_seek_proc) (ma_encoder* pEncoder, ma_int64 offset, ma_seek_origin origin); -typedef ma_result (* ma_encoder_init_proc) (ma_encoder* pEncoder); -typedef void (* ma_encoder_uninit_proc) (ma_encoder* pEncoder); -typedef ma_result (* ma_encoder_write_pcm_frames_proc)(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten); - -typedef struct -{ - ma_encoding_format encodingFormat; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_allocation_callbacks allocationCallbacks; -} ma_encoder_config; - -MA_API ma_encoder_config ma_encoder_config_init(ma_encoding_format encodingFormat, ma_format format, ma_uint32 channels, ma_uint32 sampleRate); - -struct ma_encoder -{ - ma_encoder_config config; - ma_encoder_write_proc onWrite; - ma_encoder_seek_proc onSeek; - ma_encoder_init_proc onInit; - ma_encoder_uninit_proc onUninit; - ma_encoder_write_pcm_frames_proc onWritePCMFrames; - void* pUserData; - void* pInternalEncoder; /* <-- The drwav/drflac/stb_vorbis/etc. objects. */ - union - { - struct - { - ma_vfs* pVFS; - ma_vfs_file file; - } vfs; - } data; -}; - -MA_API ma_result ma_encoder_init(ma_encoder_write_proc onWrite, ma_encoder_seek_proc onSeek, void* pUserData, const ma_encoder_config* pConfig, ma_encoder* pEncoder); -MA_API ma_result ma_encoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder); -MA_API ma_result ma_encoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder); -MA_API ma_result ma_encoder_init_file(const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder); -MA_API ma_result ma_encoder_init_file_w(const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder); -MA_API void ma_encoder_uninit(ma_encoder* pEncoder); -MA_API ma_result ma_encoder_write_pcm_frames(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten); - -#endif /* MA_NO_ENCODING */ - - -/************************************************************************************************************************************************************ - -Generation - -************************************************************************************************************************************************************/ -#ifndef MA_NO_GENERATION -typedef enum -{ - ma_waveform_type_sine, - ma_waveform_type_square, - ma_waveform_type_triangle, - ma_waveform_type_sawtooth -} ma_waveform_type; - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_waveform_type type; - double amplitude; - double frequency; -} ma_waveform_config; - -MA_API ma_waveform_config ma_waveform_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_waveform_type type, double amplitude, double frequency); - -typedef struct -{ - ma_data_source_base ds; - ma_waveform_config config; - double advance; - double time; -} ma_waveform; - -MA_API ma_result ma_waveform_init(const ma_waveform_config* pConfig, ma_waveform* pWaveform); -MA_API void ma_waveform_uninit(ma_waveform* pWaveform); -MA_API ma_result ma_waveform_read_pcm_frames(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_waveform_seek_to_pcm_frame(ma_waveform* pWaveform, ma_uint64 frameIndex); -MA_API ma_result ma_waveform_set_amplitude(ma_waveform* pWaveform, double amplitude); -MA_API ma_result ma_waveform_set_frequency(ma_waveform* pWaveform, double frequency); -MA_API ma_result ma_waveform_set_type(ma_waveform* pWaveform, ma_waveform_type type); -MA_API ma_result ma_waveform_set_sample_rate(ma_waveform* pWaveform, ma_uint32 sampleRate); - -typedef enum -{ - ma_noise_type_white, - ma_noise_type_pink, - ma_noise_type_brownian -} ma_noise_type; - - -typedef struct -{ - ma_format format; - ma_uint32 channels; - ma_noise_type type; - ma_int32 seed; - double amplitude; - ma_bool32 duplicateChannels; -} ma_noise_config; - -MA_API ma_noise_config ma_noise_config_init(ma_format format, ma_uint32 channels, ma_noise_type type, ma_int32 seed, double amplitude); - -typedef struct -{ - ma_data_source_vtable ds; - ma_noise_config config; - ma_lcg lcg; - union - { - struct - { - double** bin; - double* accumulation; - ma_uint32* counter; - } pink; - struct - { - double* accumulation; - } brownian; - } state; - - /* Memory management. */ - void* _pHeap; - ma_bool32 _ownsHeap; -} ma_noise; - -MA_API ma_result ma_noise_get_heap_size(const ma_noise_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_noise_init_preallocated(const ma_noise_config* pConfig, void* pHeap, ma_noise* pNoise); -MA_API ma_result ma_noise_init(const ma_noise_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_noise* pNoise); -MA_API void ma_noise_uninit(ma_noise* pNoise, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_noise_read_pcm_frames(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_noise_set_amplitude(ma_noise* pNoise, double amplitude); -MA_API ma_result ma_noise_set_seed(ma_noise* pNoise, ma_int32 seed); -MA_API ma_result ma_noise_set_type(ma_noise* pNoise, ma_noise_type type); - -#endif /* MA_NO_GENERATION */ - - - -/************************************************************************************************************************************************************ - -Resource Manager - -************************************************************************************************************************************************************/ -/* The resource manager cannot be enabled if there is no decoder. */ -#if !defined(MA_NO_RESOURCE_MANAGER) && defined(MA_NO_DECODING) -#define MA_NO_RESOURCE_MANAGER -#endif - -#ifndef MA_NO_RESOURCE_MANAGER -typedef struct ma_resource_manager ma_resource_manager; -typedef struct ma_resource_manager_data_buffer_node ma_resource_manager_data_buffer_node; -typedef struct ma_resource_manager_data_buffer ma_resource_manager_data_buffer; -typedef struct ma_resource_manager_data_stream ma_resource_manager_data_stream; -typedef struct ma_resource_manager_data_source ma_resource_manager_data_source; - -typedef enum -{ - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM = 0x00000001, /* When set, does not load the entire data source in memory. Disk I/O will happen on job threads. */ - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE = 0x00000002, /* Decode data before storing in memory. When set, decoding is done at the resource manager level rather than the mixing thread. Results in faster mixing, but higher memory usage. */ - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC = 0x00000004, /* When set, the resource manager will load the data source asynchronously. */ - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT = 0x00000008, /* When set, waits for initialization of the underlying data source before returning from ma_resource_manager_data_source_init(). */ - MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH = 0x00000010 /* Gives the resource manager a hint that the length of the data source is unknown and calling `ma_data_source_get_length_in_pcm_frames()` should be avoided. */ -} ma_resource_manager_data_source_flags; - - -/* -Pipeline notifications used by the resource manager. Made up of both an async notification and a fence, both of which are optional. -*/ -typedef struct -{ - ma_async_notification* pNotification; - ma_fence* pFence; -} ma_resource_manager_pipeline_stage_notification; - -typedef struct -{ - ma_resource_manager_pipeline_stage_notification init; /* Initialization of the decoder. */ - ma_resource_manager_pipeline_stage_notification done; /* Decoding fully completed. */ -} ma_resource_manager_pipeline_notifications; - -MA_API ma_resource_manager_pipeline_notifications ma_resource_manager_pipeline_notifications_init(void); - - - -/* BEGIN BACKWARDS COMPATIBILITY */ -/* TODO: Remove this block in version 0.12. */ -#if 1 -#define ma_resource_manager_job ma_job -#define ma_resource_manager_job_init ma_job_init -#define MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_FLAG_NON_BLOCKING MA_JOB_QUEUE_FLAG_NON_BLOCKING -#define ma_resource_manager_job_queue_config ma_job_queue_config -#define ma_resource_manager_job_queue_config_init ma_job_queue_config_init -#define ma_resource_manager_job_queue ma_job_queue -#define ma_resource_manager_job_queue_get_heap_size ma_job_queue_get_heap_size -#define ma_resource_manager_job_queue_init_preallocated ma_job_queue_init_preallocated -#define ma_resource_manager_job_queue_init ma_job_queue_init -#define ma_resource_manager_job_queue_uninit ma_job_queue_uninit -#define ma_resource_manager_job_queue_post ma_job_queue_post -#define ma_resource_manager_job_queue_next ma_job_queue_next -#endif -/* END BACKWARDS COMPATIBILITY */ - - - - -/* Maximum job thread count will be restricted to this, but this may be removed later and replaced with a heap allocation thereby removing any limitation. */ -#ifndef MA_RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT -#define MA_RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT 64 -#endif - -typedef enum -{ - /* Indicates ma_resource_manager_next_job() should not block. Only valid when the job thread count is 0. */ - MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING = 0x00000001, - - /* Disables any kind of multithreading. Implicitly enables MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING. */ - MA_RESOURCE_MANAGER_FLAG_NO_THREADING = 0x00000002 -} ma_resource_manager_flags; - -typedef struct -{ - const char* pFilePath; - const wchar_t* pFilePathW; - const ma_resource_manager_pipeline_notifications* pNotifications; - ma_uint64 initialSeekPointInPCMFrames; - ma_uint64 rangeBegInPCMFrames; - ma_uint64 rangeEndInPCMFrames; - ma_uint64 loopPointBegInPCMFrames; - ma_uint64 loopPointEndInPCMFrames; - ma_bool32 isLooping; - ma_uint32 flags; -} ma_resource_manager_data_source_config; - -MA_API ma_resource_manager_data_source_config ma_resource_manager_data_source_config_init(void); - - -typedef enum -{ - ma_resource_manager_data_supply_type_unknown = 0, /* Used for determining whether or the data supply has been initialized. */ - ma_resource_manager_data_supply_type_encoded, /* Data supply is an encoded buffer. Connector is ma_decoder. */ - ma_resource_manager_data_supply_type_decoded, /* Data supply is a decoded buffer. Connector is ma_audio_buffer. */ - ma_resource_manager_data_supply_type_decoded_paged /* Data supply is a linked list of decoded buffers. Connector is ma_paged_audio_buffer. */ -} ma_resource_manager_data_supply_type; - -typedef struct -{ - MA_ATOMIC(4, ma_resource_manager_data_supply_type) type; /* Read and written from different threads so needs to be accessed atomically. */ - union - { - struct - { - const void* pData; - size_t sizeInBytes; - } encoded; - struct - { - const void* pData; - ma_uint64 totalFrameCount; - ma_uint64 decodedFrameCount; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - } decoded; - struct - { - ma_paged_audio_buffer_data data; - ma_uint64 decodedFrameCount; - ma_uint32 sampleRate; - } decodedPaged; - } backend; -} ma_resource_manager_data_supply; - -struct ma_resource_manager_data_buffer_node -{ - ma_uint32 hashedName32; /* The hashed name. This is the key. */ - ma_uint32 refCount; - MA_ATOMIC(4, ma_result) result; /* Result from asynchronous loading. When loading set to MA_BUSY. When fully loaded set to MA_SUCCESS. When deleting set to MA_UNAVAILABLE. */ - MA_ATOMIC(4, ma_uint32) executionCounter; /* For allocating execution orders for jobs. */ - MA_ATOMIC(4, ma_uint32) executionPointer; /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */ - ma_bool32 isDataOwnedByResourceManager; /* Set to true when the underlying data buffer was allocated the resource manager. Set to false if it is owned by the application (via ma_resource_manager_register_*()). */ - ma_resource_manager_data_supply data; - ma_resource_manager_data_buffer_node* pParent; - ma_resource_manager_data_buffer_node* pChildLo; - ma_resource_manager_data_buffer_node* pChildHi; -}; - -struct ma_resource_manager_data_buffer -{ - ma_data_source_base ds; /* Base data source. A data buffer is a data source. */ - ma_resource_manager* pResourceManager; /* A pointer to the resource manager that owns this buffer. */ - ma_resource_manager_data_buffer_node* pNode; /* The data node. This is reference counted and is what supplies the data. */ - ma_uint32 flags; /* The flags that were passed used to initialize the buffer. */ - MA_ATOMIC(4, ma_uint32) executionCounter; /* For allocating execution orders for jobs. */ - MA_ATOMIC(4, ma_uint32) executionPointer; /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */ - ma_uint64 seekTargetInPCMFrames; /* Only updated by the public API. Never written nor read from the job thread. */ - ma_bool32 seekToCursorOnNextRead; /* On the next read we need to seek to the frame cursor. */ - MA_ATOMIC(4, ma_result) result; /* Keeps track of a result of decoding. Set to MA_BUSY while the buffer is still loading. Set to MA_SUCCESS when loading is finished successfully. Otherwise set to some other code. */ - MA_ATOMIC(4, ma_bool32) isLooping; /* Can be read and written by different threads at the same time. Must be used atomically. */ - ma_bool32 isConnectorInitialized; /* Used for asynchronous loading to ensure we don't try to initialize the connector multiple times while waiting for the node to fully load. */ - union - { - ma_decoder decoder; /* Supply type is ma_resource_manager_data_supply_type_encoded */ - ma_audio_buffer buffer; /* Supply type is ma_resource_manager_data_supply_type_decoded */ - ma_paged_audio_buffer pagedBuffer; /* Supply type is ma_resource_manager_data_supply_type_decoded_paged */ - } connector; /* Connects this object to the node's data supply. */ -}; - -struct ma_resource_manager_data_stream -{ - ma_data_source_base ds; /* Base data source. A data stream is a data source. */ - ma_resource_manager* pResourceManager; /* A pointer to the resource manager that owns this data stream. */ - ma_uint32 flags; /* The flags that were passed used to initialize the stream. */ - ma_decoder decoder; /* Used for filling pages with data. This is only ever accessed by the job thread. The public API should never touch this. */ - ma_bool32 isDecoderInitialized; /* Required for determining whether or not the decoder should be uninitialized in MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM. */ - ma_uint64 totalLengthInPCMFrames; /* This is calculated when first loaded by the MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM. */ - ma_uint32 relativeCursor; /* The playback cursor, relative to the current page. Only ever accessed by the public API. Never accessed by the job thread. */ - MA_ATOMIC(8, ma_uint64) absoluteCursor; /* The playback cursor, in absolute position starting from the start of the file. */ - ma_uint32 currentPageIndex; /* Toggles between 0 and 1. Index 0 is the first half of pPageData. Index 1 is the second half. Only ever accessed by the public API. Never accessed by the job thread. */ - MA_ATOMIC(4, ma_uint32) executionCounter; /* For allocating execution orders for jobs. */ - MA_ATOMIC(4, ma_uint32) executionPointer; /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */ - - /* Written by the public API, read by the job thread. */ - MA_ATOMIC(4, ma_bool32) isLooping; /* Whether or not the stream is looping. It's important to set the looping flag at the data stream level for smooth loop transitions. */ - - /* Written by the job thread, read by the public API. */ - void* pPageData; /* Buffer containing the decoded data of each page. Allocated once at initialization time. */ - MA_ATOMIC(4, ma_uint32) pageFrameCount[2]; /* The number of valid PCM frames in each page. Used to determine the last valid frame. */ - - /* Written and read by both the public API and the job thread. These must be atomic. */ - MA_ATOMIC(4, ma_result) result; /* Result from asynchronous loading. When loading set to MA_BUSY. When initialized set to MA_SUCCESS. When deleting set to MA_UNAVAILABLE. If an error occurs when loading, set to an error code. */ - MA_ATOMIC(4, ma_bool32) isDecoderAtEnd; /* Whether or not the decoder has reached the end. */ - MA_ATOMIC(4, ma_bool32) isPageValid[2]; /* Booleans to indicate whether or not a page is valid. Set to false by the public API, set to true by the job thread. Set to false as the pages are consumed, true when they are filled. */ - MA_ATOMIC(4, ma_bool32) seekCounter; /* When 0, no seeking is being performed. When > 0, a seek is being performed and reading should be delayed with MA_BUSY. */ -}; - -struct ma_resource_manager_data_source -{ - union - { - ma_resource_manager_data_buffer buffer; - ma_resource_manager_data_stream stream; - } backend; /* Must be the first item because we need the first item to be the data source callbacks for the buffer or stream. */ - - ma_uint32 flags; /* The flags that were passed in to ma_resource_manager_data_source_init(). */ - MA_ATOMIC(4, ma_uint32) executionCounter; /* For allocating execution orders for jobs. */ - MA_ATOMIC(4, ma_uint32) executionPointer; /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */ -}; - -typedef struct -{ - ma_allocation_callbacks allocationCallbacks; - ma_log* pLog; - ma_format decodedFormat; /* The decoded format to use. Set to ma_format_unknown (default) to use the file's native format. */ - ma_uint32 decodedChannels; /* The decoded channel count to use. Set to 0 (default) to use the file's native channel count. */ - ma_uint32 decodedSampleRate; /* the decoded sample rate to use. Set to 0 (default) to use the file's native sample rate. */ - ma_uint32 jobThreadCount; /* Set to 0 if you want to self-manage your job threads. Defaults to 1. */ - ma_uint32 jobQueueCapacity; /* The maximum number of jobs that can fit in the queue at a time. Defaults to MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY. Cannot be zero. */ - ma_uint32 flags; - ma_vfs* pVFS; /* Can be NULL in which case defaults will be used. */ - ma_decoding_backend_vtable** ppCustomDecodingBackendVTables; - ma_uint32 customDecodingBackendCount; - void* pCustomDecodingBackendUserData; -} ma_resource_manager_config; - -MA_API ma_resource_manager_config ma_resource_manager_config_init(void); - -struct ma_resource_manager -{ - ma_resource_manager_config config; - ma_resource_manager_data_buffer_node* pRootDataBufferNode; /* The root buffer in the binary tree. */ -#ifndef MA_NO_THREADING - ma_mutex dataBufferBSTLock; /* For synchronizing access to the data buffer binary tree. */ - ma_thread jobThreads[MA_RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT]; /* The threads for executing jobs. */ -#endif - ma_job_queue jobQueue; /* Multi-consumer, multi-producer job queue for managing jobs for asynchronous decoding and streaming. */ - ma_default_vfs defaultVFS; /* Only used if a custom VFS is not specified. */ - ma_log log; /* Only used if no log was specified in the config. */ -}; - -/* Init. */ -MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pConfig, ma_resource_manager* pResourceManager); -MA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager); -MA_API ma_log* ma_resource_manager_get_log(ma_resource_manager* pResourceManager); - -/* Registration. */ -MA_API ma_result ma_resource_manager_register_file(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags); -MA_API ma_result ma_resource_manager_register_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags); -MA_API ma_result ma_resource_manager_register_decoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate); /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */ -MA_API ma_result ma_resource_manager_register_decoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate); -MA_API ma_result ma_resource_manager_register_encoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, size_t sizeInBytes); /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */ -MA_API ma_result ma_resource_manager_register_encoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, size_t sizeInBytes); -MA_API ma_result ma_resource_manager_unregister_file(ma_resource_manager* pResourceManager, const char* pFilePath); -MA_API ma_result ma_resource_manager_unregister_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath); -MA_API ma_result ma_resource_manager_unregister_data(ma_resource_manager* pResourceManager, const char* pName); -MA_API ma_result ma_resource_manager_unregister_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName); - -/* Data Buffers. */ -MA_API ma_result ma_resource_manager_data_buffer_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_buffer* pDataBuffer); -MA_API ma_result ma_resource_manager_data_buffer_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer); -MA_API ma_result ma_resource_manager_data_buffer_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer); -MA_API ma_result ma_resource_manager_data_buffer_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pExistingDataBuffer, ma_resource_manager_data_buffer* pDataBuffer); -MA_API ma_result ma_resource_manager_data_buffer_uninit(ma_resource_manager_data_buffer* pDataBuffer); -MA_API ma_result ma_resource_manager_data_buffer_read_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_resource_manager_data_buffer_seek_to_pcm_frame(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64 frameIndex); -MA_API ma_result ma_resource_manager_data_buffer_get_data_format(ma_resource_manager_data_buffer* pDataBuffer, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pCursor); -MA_API ma_result ma_resource_manager_data_buffer_get_length_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pLength); -MA_API ma_result ma_resource_manager_data_buffer_result(const ma_resource_manager_data_buffer* pDataBuffer); -MA_API ma_result ma_resource_manager_data_buffer_set_looping(ma_resource_manager_data_buffer* pDataBuffer, ma_bool32 isLooping); -MA_API ma_bool32 ma_resource_manager_data_buffer_is_looping(const ma_resource_manager_data_buffer* pDataBuffer); -MA_API ma_result ma_resource_manager_data_buffer_get_available_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pAvailableFrames); - -/* Data Streams. */ -MA_API ma_result ma_resource_manager_data_stream_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_stream* pDataStream); -MA_API ma_result ma_resource_manager_data_stream_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream); -MA_API ma_result ma_resource_manager_data_stream_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream); -MA_API ma_result ma_resource_manager_data_stream_uninit(ma_resource_manager_data_stream* pDataStream); -MA_API ma_result ma_resource_manager_data_stream_read_pcm_frames(ma_resource_manager_data_stream* pDataStream, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_resource_manager_data_stream_seek_to_pcm_frame(ma_resource_manager_data_stream* pDataStream, ma_uint64 frameIndex); -MA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_manager_data_stream* pDataStream, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_resource_manager_data_stream_get_cursor_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pCursor); -MA_API ma_result ma_resource_manager_data_stream_get_length_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pLength); -MA_API ma_result ma_resource_manager_data_stream_result(const ma_resource_manager_data_stream* pDataStream); -MA_API ma_result ma_resource_manager_data_stream_set_looping(ma_resource_manager_data_stream* pDataStream, ma_bool32 isLooping); -MA_API ma_bool32 ma_resource_manager_data_stream_is_looping(const ma_resource_manager_data_stream* pDataStream); -MA_API ma_result ma_resource_manager_data_stream_get_available_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pAvailableFrames); - -/* Data Sources. */ -MA_API ma_result ma_resource_manager_data_source_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_source* pDataSource); -MA_API ma_result ma_resource_manager_data_source_init(ma_resource_manager* pResourceManager, const char* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource); -MA_API ma_result ma_resource_manager_data_source_init_w(ma_resource_manager* pResourceManager, const wchar_t* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource); -MA_API ma_result ma_resource_manager_data_source_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source* pExistingDataSource, ma_resource_manager_data_source* pDataSource); -MA_API ma_result ma_resource_manager_data_source_uninit(ma_resource_manager_data_source* pDataSource); -MA_API ma_result ma_resource_manager_data_source_read_pcm_frames(ma_resource_manager_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_manager_data_source* pDataSource, ma_uint64 frameIndex); -MA_API ma_result ma_resource_manager_data_source_get_data_format(ma_resource_manager_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_resource_manager_data_source_get_cursor_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pCursor); -MA_API ma_result ma_resource_manager_data_source_get_length_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pLength); -MA_API ma_result ma_resource_manager_data_source_result(const ma_resource_manager_data_source* pDataSource); -MA_API ma_result ma_resource_manager_data_source_set_looping(ma_resource_manager_data_source* pDataSource, ma_bool32 isLooping); -MA_API ma_bool32 ma_resource_manager_data_source_is_looping(const ma_resource_manager_data_source* pDataSource); -MA_API ma_result ma_resource_manager_data_source_get_available_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pAvailableFrames); - -/* Job management. */ -MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob); -MA_API ma_result ma_resource_manager_post_job_quit(ma_resource_manager* pResourceManager); /* Helper for posting a quit job. */ -MA_API ma_result ma_resource_manager_next_job(ma_resource_manager* pResourceManager, ma_job* pJob); -MA_API ma_result ma_resource_manager_process_job(ma_resource_manager* pResourceManager, ma_job* pJob); /* DEPRECATED. Use ma_job_process(). Will be removed in version 0.12. */ -MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager); /* Returns MA_CANCELLED if a MA_JOB_TYPE_QUIT job is found. In non-blocking mode, returns MA_NO_DATA_AVAILABLE if no jobs are available. */ -#endif /* MA_NO_RESOURCE_MANAGER */ - - - -/************************************************************************************************************************************************************ - -Node Graph - -************************************************************************************************************************************************************/ -#ifndef MA_NO_NODE_GRAPH -/* Must never exceed 254. */ -#ifndef MA_MAX_NODE_BUS_COUNT -#define MA_MAX_NODE_BUS_COUNT 254 -#endif - -/* Used internally by miniaudio for memory management. Must never exceed MA_MAX_NODE_BUS_COUNT. */ -#ifndef MA_MAX_NODE_LOCAL_BUS_COUNT -#define MA_MAX_NODE_LOCAL_BUS_COUNT 2 -#endif - -/* Use this when the bus count is determined by the node instance rather than the vtable. */ -#define MA_NODE_BUS_COUNT_UNKNOWN 255 - -typedef struct ma_node_graph ma_node_graph; -typedef void ma_node; - - -/* Node flags. */ -typedef enum -{ - MA_NODE_FLAG_PASSTHROUGH = 0x00000001, - MA_NODE_FLAG_CONTINUOUS_PROCESSING = 0x00000002, - MA_NODE_FLAG_ALLOW_NULL_INPUT = 0x00000004, - MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES = 0x00000008, - MA_NODE_FLAG_SILENT_OUTPUT = 0x00000010 -} ma_node_flags; - - -/* The playback state of a node. Either started or stopped. */ -typedef enum -{ - ma_node_state_started = 0, - ma_node_state_stopped = 1 -} ma_node_state; - - -typedef struct -{ - /* - Extended processing callback. This callback is used for effects that process input and output - at different rates (i.e. they perform resampling). This is similar to the simple version, only - they take two seperate frame counts: one for input, and one for output. - - On input, `pFrameCountOut` is equal to the capacity of the output buffer for each bus, whereas - `pFrameCountIn` will be equal to the number of PCM frames in each of the buffers in `ppFramesIn`. - - On output, set `pFrameCountOut` to the number of PCM frames that were actually output and set - `pFrameCountIn` to the number of input frames that were consumed. - */ - void (* onProcess)(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut); - - /* - A callback for retrieving the number of a input frames that are required to output the - specified number of output frames. You would only want to implement this when the node performs - resampling. This is optional, even for nodes that perform resampling, but it does offer a - small reduction in latency as it allows miniaudio to calculate the exact number of input frames - to read at a time instead of having to estimate. - */ - ma_result (* onGetRequiredInputFrameCount)(ma_node* pNode, ma_uint32 outputFrameCount, ma_uint32* pInputFrameCount); - - /* - The number of input buses. This is how many sub-buffers will be contained in the `ppFramesIn` - parameters of the callbacks above. - */ - ma_uint8 inputBusCount; - - /* - The number of output buses. This is how many sub-buffers will be contained in the `ppFramesOut` - parameters of the callbacks above. - */ - ma_uint8 outputBusCount; - - /* - Flags describing characteristics of the node. This is currently just a placeholder for some - ideas for later on. - */ - ma_uint32 flags; -} ma_node_vtable; - -typedef struct -{ - const ma_node_vtable* vtable; /* Should never be null. Initialization of the node will fail if so. */ - ma_node_state initialState; /* Defaults to ma_node_state_started. */ - ma_uint32 inputBusCount; /* Only used if the vtable specifies an input bus count of `MA_NODE_BUS_COUNT_UNKNOWN`, otherwise must be set to `MA_NODE_BUS_COUNT_UNKNOWN` (default). */ - ma_uint32 outputBusCount; /* Only used if the vtable specifies an output bus count of `MA_NODE_BUS_COUNT_UNKNOWN`, otherwise be set to `MA_NODE_BUS_COUNT_UNKNOWN` (default). */ - const ma_uint32* pInputChannels; /* The number of elements are determined by the input bus count as determined by the vtable, or `inputBusCount` if the vtable specifies `MA_NODE_BUS_COUNT_UNKNOWN`. */ - const ma_uint32* pOutputChannels; /* The number of elements are determined by the output bus count as determined by the vtable, or `outputBusCount` if the vtable specifies `MA_NODE_BUS_COUNT_UNKNOWN`. */ -} ma_node_config; - -MA_API ma_node_config ma_node_config_init(void); - - -/* -A node has multiple output buses. An output bus is attached to an input bus as an item in a linked -list. Think of the input bus as a linked list, with the output bus being an item in that list. -*/ -typedef struct ma_node_output_bus ma_node_output_bus; -struct ma_node_output_bus -{ - /* Immutable. */ - ma_node* pNode; /* The node that owns this output bus. The input node. Will be null for dummy head and tail nodes. */ - ma_uint8 outputBusIndex; /* The index of the output bus on pNode that this output bus represents. */ - ma_uint8 channels; /* The number of channels in the audio stream for this bus. */ - - /* Mutable via multiple threads. Must be used atomically. The weird ordering here is for packing reasons. */ - MA_ATOMIC(1, ma_uint8) inputNodeInputBusIndex; /* The index of the input bus on the input. Required for detaching. */ - MA_ATOMIC(4, ma_uint32) flags; /* Some state flags for tracking the read state of the output buffer. A combination of MA_NODE_OUTPUT_BUS_FLAG_*. */ - MA_ATOMIC(4, ma_uint32) refCount; /* Reference count for some thread-safety when detaching. */ - MA_ATOMIC(4, ma_bool32) isAttached; /* This is used to prevent iteration of nodes that are in the middle of being detached. Used for thread safety. */ - MA_ATOMIC(4, ma_spinlock) lock; /* Unfortunate lock, but significantly simplifies the implementation. Required for thread-safe attaching and detaching. */ - MA_ATOMIC(4, float) volume; /* Linear. */ - MA_ATOMIC(MA_SIZEOF_PTR, ma_node_output_bus*) pNext; /* If null, it's the tail node or detached. */ - MA_ATOMIC(MA_SIZEOF_PTR, ma_node_output_bus*) pPrev; /* If null, it's the head node or detached. */ - MA_ATOMIC(MA_SIZEOF_PTR, ma_node*) pInputNode; /* The node that this output bus is attached to. Required for detaching. */ -}; - -/* -A node has multiple input buses. The output buses of a node are connecting to the input busses of -another. An input bus is essentially just a linked list of output buses. -*/ -typedef struct ma_node_input_bus ma_node_input_bus; -struct ma_node_input_bus -{ - /* Mutable via multiple threads. */ - ma_node_output_bus head; /* Dummy head node for simplifying some lock-free thread-safety stuff. */ - MA_ATOMIC(4, ma_uint32) nextCounter; /* This is used to determine whether or not the input bus is finding the next node in the list. Used for thread safety when detaching output buses. */ - MA_ATOMIC(4, ma_spinlock) lock; /* Unfortunate lock, but significantly simplifies the implementation. Required for thread-safe attaching and detaching. */ - - /* Set once at startup. */ - ma_uint8 channels; /* The number of channels in the audio stream for this bus. */ -}; - - -typedef struct ma_node_base ma_node_base; -struct ma_node_base -{ - /* These variables are set once at startup. */ - ma_node_graph* pNodeGraph; /* The graph this node belongs to. */ - const ma_node_vtable* vtable; - float* pCachedData; /* Allocated on the heap. Fixed size. Needs to be stored on the heap because reading from output buses is done in separate function calls. */ - ma_uint16 cachedDataCapInFramesPerBus; /* The capacity of the input data cache in frames, per bus. */ - - /* These variables are read and written only from the audio thread. */ - ma_uint16 cachedFrameCountOut; - ma_uint16 cachedFrameCountIn; - ma_uint16 consumedFrameCountIn; - - /* These variables are read and written between different threads. */ - MA_ATOMIC(4, ma_node_state) state; /* When set to stopped, nothing will be read, regardless of the times in stateTimes. */ - MA_ATOMIC(8, ma_uint64) stateTimes[2]; /* Indexed by ma_node_state. Specifies the time based on the global clock that a node should be considered to be in the relevant state. */ - MA_ATOMIC(8, ma_uint64) localTime; /* The node's local clock. This is just a running sum of the number of output frames that have been processed. Can be modified by any thread with `ma_node_set_time()`. */ - ma_uint32 inputBusCount; - ma_uint32 outputBusCount; - ma_node_input_bus* pInputBuses; - ma_node_output_bus* pOutputBuses; - - /* Memory management. */ - ma_node_input_bus _inputBuses[MA_MAX_NODE_LOCAL_BUS_COUNT]; - ma_node_output_bus _outputBuses[MA_MAX_NODE_LOCAL_BUS_COUNT]; - void* _pHeap; /* A heap allocation for internal use only. pInputBuses and/or pOutputBuses will point to this if the bus count exceeds MA_MAX_NODE_LOCAL_BUS_COUNT. */ - ma_bool32 _ownsHeap; /* If set to true, the node owns the heap allocation and _pHeap will be freed in ma_node_uninit(). */ -}; - -MA_API ma_result ma_node_get_heap_size(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_node_init_preallocated(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, void* pHeap, ma_node* pNode); -MA_API ma_result ma_node_init(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node* pNode); -MA_API void ma_node_uninit(ma_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_node_graph* ma_node_get_node_graph(const ma_node* pNode); -MA_API ma_uint32 ma_node_get_input_bus_count(const ma_node* pNode); -MA_API ma_uint32 ma_node_get_output_bus_count(const ma_node* pNode); -MA_API ma_uint32 ma_node_get_input_channels(const ma_node* pNode, ma_uint32 inputBusIndex); -MA_API ma_uint32 ma_node_get_output_channels(const ma_node* pNode, ma_uint32 outputBusIndex); -MA_API ma_result ma_node_attach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex, ma_node* pOtherNode, ma_uint32 otherNodeInputBusIndex); -MA_API ma_result ma_node_detach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex); -MA_API ma_result ma_node_detach_all_output_buses(ma_node* pNode); -MA_API ma_result ma_node_set_output_bus_volume(ma_node* pNode, ma_uint32 outputBusIndex, float volume); -MA_API float ma_node_get_output_bus_volume(const ma_node* pNode, ma_uint32 outputBusIndex); -MA_API ma_result ma_node_set_state(ma_node* pNode, ma_node_state state); -MA_API ma_node_state ma_node_get_state(const ma_node* pNode); -MA_API ma_result ma_node_set_state_time(ma_node* pNode, ma_node_state state, ma_uint64 globalTime); -MA_API ma_uint64 ma_node_get_state_time(const ma_node* pNode, ma_node_state state); -MA_API ma_node_state ma_node_get_state_by_time(const ma_node* pNode, ma_uint64 globalTime); -MA_API ma_node_state ma_node_get_state_by_time_range(const ma_node* pNode, ma_uint64 globalTimeBeg, ma_uint64 globalTimeEnd); -MA_API ma_uint64 ma_node_get_time(const ma_node* pNode); -MA_API ma_result ma_node_set_time(ma_node* pNode, ma_uint64 localTime); - - -typedef struct -{ - ma_uint32 channels; - ma_uint16 nodeCacheCapInFrames; -} ma_node_graph_config; - -MA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels); - - -struct ma_node_graph -{ - /* Immutable. */ - ma_node_base base; /* The node graph itself is a node so it can be connected as an input to different node graph. This has zero inputs and calls ma_node_graph_read_pcm_frames() to generate it's output. */ - ma_node_base endpoint; /* Special node that all nodes eventually connect to. Data is read from this node in ma_node_graph_read_pcm_frames(). */ - ma_uint16 nodeCacheCapInFrames; - - /* Read and written by multiple threads. */ - MA_ATOMIC(4, ma_bool32) isReading; -}; - -MA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node_graph* pNodeGraph); -MA_API void ma_node_graph_uninit(ma_node_graph* pNodeGraph, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_node* ma_node_graph_get_endpoint(ma_node_graph* pNodeGraph); -MA_API ma_result ma_node_graph_read_pcm_frames(ma_node_graph* pNodeGraph, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_uint32 ma_node_graph_get_channels(const ma_node_graph* pNodeGraph); -MA_API ma_uint64 ma_node_graph_get_time(const ma_node_graph* pNodeGraph); -MA_API ma_result ma_node_graph_set_time(ma_node_graph* pNodeGraph, ma_uint64 globalTime); - - - -/* Data source node. 0 input buses, 1 output bus. Used for reading from a data source. */ -typedef struct -{ - ma_node_config nodeConfig; - ma_data_source* pDataSource; -} ma_data_source_node_config; - -MA_API ma_data_source_node_config ma_data_source_node_config_init(ma_data_source* pDataSource); - - -typedef struct -{ - ma_node_base base; - ma_data_source* pDataSource; -} ma_data_source_node; - -MA_API ma_result ma_data_source_node_init(ma_node_graph* pNodeGraph, const ma_data_source_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source_node* pDataSourceNode); -MA_API void ma_data_source_node_uninit(ma_data_source_node* pDataSourceNode, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_data_source_node_set_looping(ma_data_source_node* pDataSourceNode, ma_bool32 isLooping); -MA_API ma_bool32 ma_data_source_node_is_looping(ma_data_source_node* pDataSourceNode); - - -/* Splitter Node. 1 input, 2 outputs. Used for splitting/copying a stream so it can be as input into two separate output nodes. */ -typedef struct -{ - ma_node_config nodeConfig; - ma_uint32 channels; -} ma_splitter_node_config; - -MA_API ma_splitter_node_config ma_splitter_node_config_init(ma_uint32 channels); - - -typedef struct -{ - ma_node_base base; -} ma_splitter_node; - -MA_API ma_result ma_splitter_node_init(ma_node_graph* pNodeGraph, const ma_splitter_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_splitter_node* pSplitterNode); -MA_API void ma_splitter_node_uninit(ma_splitter_node* pSplitterNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -Biquad Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_biquad_config biquad; -} ma_biquad_node_config; - -MA_API ma_biquad_node_config ma_biquad_node_config_init(ma_uint32 channels, float b0, float b1, float b2, float a0, float a1, float a2); - - -typedef struct -{ - ma_node_base baseNode; - ma_biquad biquad; -} ma_biquad_node; - -MA_API ma_result ma_biquad_node_init(ma_node_graph* pNodeGraph, const ma_biquad_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad_node* pNode); -MA_API ma_result ma_biquad_node_reinit(const ma_biquad_config* pConfig, ma_biquad_node* pNode); -MA_API void ma_biquad_node_uninit(ma_biquad_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -Low Pass Filter Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_lpf_config lpf; -} ma_lpf_node_config; - -MA_API ma_lpf_node_config ma_lpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order); - - -typedef struct -{ - ma_node_base baseNode; - ma_lpf lpf; -} ma_lpf_node; - -MA_API ma_result ma_lpf_node_init(ma_node_graph* pNodeGraph, const ma_lpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf_node* pNode); -MA_API ma_result ma_lpf_node_reinit(const ma_lpf_config* pConfig, ma_lpf_node* pNode); -MA_API void ma_lpf_node_uninit(ma_lpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -High Pass Filter Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_hpf_config hpf; -} ma_hpf_node_config; - -MA_API ma_hpf_node_config ma_hpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order); - - -typedef struct -{ - ma_node_base baseNode; - ma_hpf hpf; -} ma_hpf_node; - -MA_API ma_result ma_hpf_node_init(ma_node_graph* pNodeGraph, const ma_hpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf_node* pNode); -MA_API ma_result ma_hpf_node_reinit(const ma_hpf_config* pConfig, ma_hpf_node* pNode); -MA_API void ma_hpf_node_uninit(ma_hpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -Band Pass Filter Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_bpf_config bpf; -} ma_bpf_node_config; - -MA_API ma_bpf_node_config ma_bpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order); - - -typedef struct -{ - ma_node_base baseNode; - ma_bpf bpf; -} ma_bpf_node; - -MA_API ma_result ma_bpf_node_init(ma_node_graph* pNodeGraph, const ma_bpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf_node* pNode); -MA_API ma_result ma_bpf_node_reinit(const ma_bpf_config* pConfig, ma_bpf_node* pNode); -MA_API void ma_bpf_node_uninit(ma_bpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -Notching Filter Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_notch_config notch; -} ma_notch_node_config; - -MA_API ma_notch_node_config ma_notch_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency); - - -typedef struct -{ - ma_node_base baseNode; - ma_notch2 notch; -} ma_notch_node; - -MA_API ma_result ma_notch_node_init(ma_node_graph* pNodeGraph, const ma_notch_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch_node* pNode); -MA_API ma_result ma_notch_node_reinit(const ma_notch_config* pConfig, ma_notch_node* pNode); -MA_API void ma_notch_node_uninit(ma_notch_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -Peaking Filter Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_peak_config peak; -} ma_peak_node_config; - -MA_API ma_peak_node_config ma_peak_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency); - - -typedef struct -{ - ma_node_base baseNode; - ma_peak2 peak; -} ma_peak_node; - -MA_API ma_result ma_peak_node_init(ma_node_graph* pNodeGraph, const ma_peak_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak_node* pNode); -MA_API ma_result ma_peak_node_reinit(const ma_peak_config* pConfig, ma_peak_node* pNode); -MA_API void ma_peak_node_uninit(ma_peak_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -Low Shelf Filter Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_loshelf_config loshelf; -} ma_loshelf_node_config; - -MA_API ma_loshelf_node_config ma_loshelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency); - - -typedef struct -{ - ma_node_base baseNode; - ma_loshelf2 loshelf; -} ma_loshelf_node; - -MA_API ma_result ma_loshelf_node_init(ma_node_graph* pNodeGraph, const ma_loshelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf_node* pNode); -MA_API ma_result ma_loshelf_node_reinit(const ma_loshelf_config* pConfig, ma_loshelf_node* pNode); -MA_API void ma_loshelf_node_uninit(ma_loshelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -/* -High Shelf Filter Node -*/ -typedef struct -{ - ma_node_config nodeConfig; - ma_hishelf_config hishelf; -} ma_hishelf_node_config; - -MA_API ma_hishelf_node_config ma_hishelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency); - - -typedef struct -{ - ma_node_base baseNode; - ma_hishelf2 hishelf; -} ma_hishelf_node; - -MA_API ma_result ma_hishelf_node_init(ma_node_graph* pNodeGraph, const ma_hishelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf_node* pNode); -MA_API ma_result ma_hishelf_node_reinit(const ma_hishelf_config* pConfig, ma_hishelf_node* pNode); -MA_API void ma_hishelf_node_uninit(ma_hishelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -typedef struct -{ - ma_node_config nodeConfig; - ma_delay_config delay; -} ma_delay_node_config; - -MA_API ma_delay_node_config ma_delay_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay); - - -typedef struct -{ - ma_node_base baseNode; - ma_delay delay; -} ma_delay_node; - -MA_API ma_result ma_delay_node_init(ma_node_graph* pNodeGraph, const ma_delay_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay_node* pDelayNode); -MA_API void ma_delay_node_uninit(ma_delay_node* pDelayNode, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API void ma_delay_node_set_wet(ma_delay_node* pDelayNode, float value); -MA_API float ma_delay_node_get_wet(const ma_delay_node* pDelayNode); -MA_API void ma_delay_node_set_dry(ma_delay_node* pDelayNode, float value); -MA_API float ma_delay_node_get_dry(const ma_delay_node* pDelayNode); -MA_API void ma_delay_node_set_decay(ma_delay_node* pDelayNode, float value); -MA_API float ma_delay_node_get_decay(const ma_delay_node* pDelayNode); -#endif /* MA_NO_NODE_GRAPH */ - - -/************************************************************************************************************************************************************ - -Engine - -************************************************************************************************************************************************************/ -#if !defined(MA_NO_ENGINE) && !defined(MA_NO_NODE_GRAPH) -typedef struct ma_engine ma_engine; -typedef struct ma_sound ma_sound; - - -/* Sound flags. */ -typedef enum -{ - MA_SOUND_FLAG_STREAM = 0x00000001, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM */ - MA_SOUND_FLAG_DECODE = 0x00000002, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE */ - MA_SOUND_FLAG_ASYNC = 0x00000004, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC */ - MA_SOUND_FLAG_WAIT_INIT = 0x00000008, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT */ - MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT = 0x00000010, /* Do not attach to the endpoint by default. Useful for when setting up nodes in a complex graph system. */ - MA_SOUND_FLAG_NO_PITCH = 0x00000020, /* Disable pitch shifting with ma_sound_set_pitch() and ma_sound_group_set_pitch(). This is an optimization. */ - MA_SOUND_FLAG_NO_SPATIALIZATION = 0x00000040 /* Disable spatialization. */ -} ma_sound_flags; - -#ifndef MA_ENGINE_MAX_LISTENERS -#define MA_ENGINE_MAX_LISTENERS 4 -#endif - -#define MA_LISTENER_INDEX_CLOSEST ((ma_uint8)-1) - -typedef enum -{ - ma_engine_node_type_sound, - ma_engine_node_type_group -} ma_engine_node_type; - -typedef struct -{ - ma_engine* pEngine; - ma_engine_node_type type; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - ma_uint32 sampleRate; /* Only used when the type is set to ma_engine_node_type_sound. */ - ma_bool8 isPitchDisabled; /* Pitching can be explicitly disable with MA_SOUND_FLAG_NO_PITCH to optimize processing. */ - ma_bool8 isSpatializationDisabled; /* Spatialization can be explicitly disabled with MA_SOUND_FLAG_NO_SPATIALIZATION. */ - ma_uint8 pinnedListenerIndex; /* The index of the listener this node should always use for spatialization. If set to MA_LISTENER_INDEX_CLOSEST the engine will use the closest listener. */ -} ma_engine_node_config; - -MA_API ma_engine_node_config ma_engine_node_config_init(ma_engine* pEngine, ma_engine_node_type type, ma_uint32 flags); - - -/* Base node object for both ma_sound and ma_sound_group. */ -typedef struct -{ - ma_node_base baseNode; /* Must be the first member for compatiblity with the ma_node API. */ - ma_engine* pEngine; /* A pointer to the engine. Set based on the value from the config. */ - ma_uint32 sampleRate; /* The sample rate of the input data. For sounds backed by a data source, this will be the data source's sample rate. Otherwise it'll be the engine's sample rate. */ - ma_fader fader; - ma_linear_resampler resampler; /* For pitch shift. */ - ma_spatializer spatializer; - ma_panner panner; - MA_ATOMIC(4, float) pitch; - float oldPitch; /* For determining whether or not the resampler needs to be updated to reflect the new pitch. The resampler will be updated on the mixing thread. */ - float oldDopplerPitch; /* For determining whether or not the resampler needs to be updated to take a new doppler pitch into account. */ - MA_ATOMIC(4, ma_bool32) isPitchDisabled; /* When set to true, pitching will be disabled which will allow the resampler to be bypassed to save some computation. */ - MA_ATOMIC(4, ma_bool32) isSpatializationDisabled; /* Set to false by default. When set to false, will not have spatialisation applied. */ - MA_ATOMIC(4, ma_uint32) pinnedListenerIndex; /* The index of the listener this node should always use for spatialization. If set to MA_LISTENER_INDEX_CLOSEST the engine will use the closest listener. */ - - /* Memory management. */ - ma_bool8 _ownsHeap; - void* _pHeap; -} ma_engine_node; - -MA_API ma_result ma_engine_node_get_heap_size(const ma_engine_node_config* pConfig, size_t* pHeapSizeInBytes); -MA_API ma_result ma_engine_node_init_preallocated(const ma_engine_node_config* pConfig, void* pHeap, ma_engine_node* pEngineNode); -MA_API ma_result ma_engine_node_init(const ma_engine_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_engine_node* pEngineNode); -MA_API void ma_engine_node_uninit(ma_engine_node* pEngineNode, const ma_allocation_callbacks* pAllocationCallbacks); - - -#define MA_SOUND_SOURCE_CHANNEL_COUNT 0xFFFFFFFF - -typedef struct -{ - const char* pFilePath; /* Set this to load from the resource manager. */ - const wchar_t* pFilePathW; /* Set this to load from the resource manager. */ - ma_data_source* pDataSource; /* Set this to load from an existing data source. */ - ma_node* pInitialAttachment; /* If set, the sound will be attached to an input of this node. This can be set to a ma_sound. If set to NULL, the sound will be attached directly to the endpoint unless MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT is set in `flags`. */ - ma_uint32 initialAttachmentInputBusIndex; /* The index of the input bus of pInitialAttachment to attach the sound to. */ - ma_uint32 channelsIn; /* Ignored if using a data source as input (the data source's channel count will be used always). Otherwise, setting to 0 will cause the engine's channel count to be used. */ - ma_uint32 channelsOut; /* Set this to 0 (default) to use the engine's channel count. Set to MA_SOUND_SOURCE_CHANNEL_COUNT to use the data source's channel count (only used if using a data source as input). */ - ma_uint32 flags; /* A combination of MA_SOUND_FLAG_* flags. */ - ma_uint64 initialSeekPointInPCMFrames; /* Initializes the sound such that it's seeked to this location by default. */ - ma_uint64 rangeBegInPCMFrames; - ma_uint64 rangeEndInPCMFrames; - ma_uint64 loopPointBegInPCMFrames; - ma_uint64 loopPointEndInPCMFrames; - ma_bool32 isLooping; - ma_fence* pDoneFence; /* Released when the resource manager has finished decoding the entire sound. Not used with streams. */ -} ma_sound_config; - -MA_API ma_sound_config ma_sound_config_init(void); - -struct ma_sound -{ - ma_engine_node engineNode; /* Must be the first member for compatibility with the ma_node API. */ - ma_data_source* pDataSource; - MA_ATOMIC(8, ma_uint64) seekTarget; /* The PCM frame index to seek to in the mixing thread. Set to (~(ma_uint64)0) to not perform any seeking. */ - MA_ATOMIC(4, ma_bool32) atEnd; - ma_bool8 ownsDataSource; - - /* - We're declaring a resource manager data source object here to save us a malloc when loading a - sound via the resource manager, which I *think* will be the most common scenario. - */ -#ifndef MA_NO_RESOURCE_MANAGER - ma_resource_manager_data_source* pResourceManagerDataSource; -#endif -}; - -/* Structure specifically for sounds played with ma_engine_play_sound(). Making this a separate structure to reduce overhead. */ -typedef struct ma_sound_inlined ma_sound_inlined; -struct ma_sound_inlined -{ - ma_sound sound; - ma_sound_inlined* pNext; - ma_sound_inlined* pPrev; -}; - -/* A sound group is just a sound. */ -typedef ma_sound_config ma_sound_group_config; -typedef ma_sound ma_sound_group; - -MA_API ma_sound_group_config ma_sound_group_config_init(void); - - -typedef struct -{ -#if !defined(MA_NO_RESOURCE_MANAGER) - ma_resource_manager* pResourceManager; /* Can be null in which case a resource manager will be created for you. */ -#endif -#if !defined(MA_NO_DEVICE_IO) - ma_context* pContext; - ma_device* pDevice; /* If set, the caller is responsible for calling ma_engine_data_callback() in the device's data callback. */ - ma_device_id* pPlaybackDeviceID; /* The ID of the playback device to use with the default listener. */ -#endif - ma_log* pLog; /* When set to NULL, will use the context's log. */ - ma_uint32 listenerCount; /* Must be between 1 and MA_ENGINE_MAX_LISTENERS. */ - ma_uint32 channels; /* The number of channels to use when mixing and spatializing. When set to 0, will use the native channel count of the device. */ - ma_uint32 sampleRate; /* The sample rate. When set to 0 will use the native channel count of the device. */ - ma_uint32 periodSizeInFrames; /* If set to something other than 0, updates will always be exactly this size. The underlying device may be a different size, but from the perspective of the mixer that won't matter.*/ - ma_uint32 periodSizeInMilliseconds; /* Used if periodSizeInFrames is unset. */ - ma_uint32 gainSmoothTimeInFrames; /* The number of frames to interpolate the gain of spatialized sounds across. If set to 0, will use gainSmoothTimeInMilliseconds. */ - ma_uint32 gainSmoothTimeInMilliseconds; /* When set to 0, gainSmoothTimeInFrames will be used. If both are set to 0, a default value will be used. */ - ma_allocation_callbacks allocationCallbacks; - ma_bool32 noAutoStart; /* When set to true, requires an explicit call to ma_engine_start(). This is false by default, meaning the engine will be started automatically in ma_engine_init(). */ - ma_bool32 noDevice; /* When set to true, don't create a default device. ma_engine_read_pcm_frames() can be called manually to read data. */ - ma_mono_expansion_mode monoExpansionMode; /* Controls how the mono channel should be expanded to other channels when spatialization is disabled on a sound. */ - ma_vfs* pResourceManagerVFS; /* A pointer to a pre-allocated VFS object to use with the resource manager. This is ignored if pResourceManager is not NULL. */ -} ma_engine_config; - -MA_API ma_engine_config ma_engine_config_init(void); - - -struct ma_engine -{ - ma_node_graph nodeGraph; /* An engine is a node graph. It should be able to be plugged into any ma_node_graph API (with a cast) which means this must be the first member of this struct. */ -#if !defined(MA_NO_RESOURCE_MANAGER) - ma_resource_manager* pResourceManager; -#endif -#if !defined(MA_NO_DEVICE_IO) - ma_device* pDevice; /* Optionally set via the config, otherwise allocated by the engine in ma_engine_init(). */ -#endif - ma_log* pLog; - ma_uint32 sampleRate; - ma_uint32 listenerCount; - ma_spatializer_listener listeners[MA_ENGINE_MAX_LISTENERS]; - ma_allocation_callbacks allocationCallbacks; - ma_bool8 ownsResourceManager; - ma_bool8 ownsDevice; - ma_spinlock inlinedSoundLock; /* For synchronizing access so the inlined sound list. */ - ma_sound_inlined* pInlinedSoundHead; /* The first inlined sound. Inlined sounds are tracked in a linked list. */ - MA_ATOMIC(4, ma_uint32) inlinedSoundCount; /* The total number of allocated inlined sound objects. Used for debugging. */ - ma_uint32 gainSmoothTimeInFrames; /* The number of frames to interpolate the gain of spatialized sounds across. */ - ma_mono_expansion_mode monoExpansionMode; -}; - -MA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEngine); -MA_API void ma_engine_uninit(ma_engine* pEngine); -MA_API ma_result ma_engine_read_pcm_frames(ma_engine* pEngine, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_node_graph* ma_engine_get_node_graph(ma_engine* pEngine); -#if !defined(MA_NO_RESOURCE_MANAGER) -MA_API ma_resource_manager* ma_engine_get_resource_manager(ma_engine* pEngine); -#endif -MA_API ma_device* ma_engine_get_device(ma_engine* pEngine); -MA_API ma_log* ma_engine_get_log(ma_engine* pEngine); -MA_API ma_node* ma_engine_get_endpoint(ma_engine* pEngine); -MA_API ma_uint64 ma_engine_get_time(const ma_engine* pEngine); -MA_API ma_result ma_engine_set_time(ma_engine* pEngine, ma_uint64 globalTime); -MA_API ma_uint32 ma_engine_get_channels(const ma_engine* pEngine); -MA_API ma_uint32 ma_engine_get_sample_rate(const ma_engine* pEngine); - -MA_API ma_result ma_engine_start(ma_engine* pEngine); -MA_API ma_result ma_engine_stop(ma_engine* pEngine); -MA_API ma_result ma_engine_set_volume(ma_engine* pEngine, float volume); -MA_API ma_result ma_engine_set_gain_db(ma_engine* pEngine, float gainDB); - -MA_API ma_uint32 ma_engine_get_listener_count(const ma_engine* pEngine); -MA_API ma_uint32 ma_engine_find_closest_listener(const ma_engine* pEngine, float absolutePosX, float absolutePosY, float absolutePosZ); -MA_API void ma_engine_listener_set_position(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z); -MA_API ma_vec3f ma_engine_listener_get_position(const ma_engine* pEngine, ma_uint32 listenerIndex); -MA_API void ma_engine_listener_set_direction(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z); -MA_API ma_vec3f ma_engine_listener_get_direction(const ma_engine* pEngine, ma_uint32 listenerIndex); -MA_API void ma_engine_listener_set_velocity(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z); -MA_API ma_vec3f ma_engine_listener_get_velocity(const ma_engine* pEngine, ma_uint32 listenerIndex); -MA_API void ma_engine_listener_set_cone(ma_engine* pEngine, ma_uint32 listenerIndex, float innerAngleInRadians, float outerAngleInRadians, float outerGain); -MA_API void ma_engine_listener_get_cone(const ma_engine* pEngine, ma_uint32 listenerIndex, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain); -MA_API void ma_engine_listener_set_world_up(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z); -MA_API ma_vec3f ma_engine_listener_get_world_up(const ma_engine* pEngine, ma_uint32 listenerIndex); -MA_API void ma_engine_listener_set_enabled(ma_engine* pEngine, ma_uint32 listenerIndex, ma_bool32 isEnabled); -MA_API ma_bool32 ma_engine_listener_is_enabled(const ma_engine* pEngine, ma_uint32 listenerIndex); - -#ifndef MA_NO_RESOURCE_MANAGER -MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePath, ma_node* pNode, ma_uint32 nodeInputBusIndex); -MA_API ma_result ma_engine_play_sound(ma_engine* pEngine, const char* pFilePath, ma_sound_group* pGroup); /* Fire and forget. */ -#endif - -#ifndef MA_NO_RESOURCE_MANAGER -MA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound); -MA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound); -MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound); -#endif -MA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound); -MA_API ma_result ma_sound_init_ex(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound); -MA_API void ma_sound_uninit(ma_sound* pSound); -MA_API ma_engine* ma_sound_get_engine(const ma_sound* pSound); -MA_API ma_data_source* ma_sound_get_data_source(const ma_sound* pSound); -MA_API ma_result ma_sound_start(ma_sound* pSound); -MA_API ma_result ma_sound_stop(ma_sound* pSound); -MA_API void ma_sound_set_volume(ma_sound* pSound, float volume); -MA_API float ma_sound_get_volume(const ma_sound* pSound); -MA_API void ma_sound_set_pan(ma_sound* pSound, float pan); -MA_API float ma_sound_get_pan(const ma_sound* pSound); -MA_API void ma_sound_set_pan_mode(ma_sound* pSound, ma_pan_mode panMode); -MA_API ma_pan_mode ma_sound_get_pan_mode(const ma_sound* pSound); -MA_API void ma_sound_set_pitch(ma_sound* pSound, float pitch); -MA_API float ma_sound_get_pitch(const ma_sound* pSound); -MA_API void ma_sound_set_spatialization_enabled(ma_sound* pSound, ma_bool32 enabled); -MA_API ma_bool32 ma_sound_is_spatialization_enabled(const ma_sound* pSound); -MA_API void ma_sound_set_pinned_listener_index(ma_sound* pSound, ma_uint32 listenerIndex); -MA_API ma_uint32 ma_sound_get_pinned_listener_index(const ma_sound* pSound); -MA_API ma_uint32 ma_sound_get_listener_index(const ma_sound* pSound); -MA_API ma_vec3f ma_sound_get_direction_to_listener(const ma_sound* pSound); -MA_API void ma_sound_set_position(ma_sound* pSound, float x, float y, float z); -MA_API ma_vec3f ma_sound_get_position(const ma_sound* pSound); -MA_API void ma_sound_set_direction(ma_sound* pSound, float x, float y, float z); -MA_API ma_vec3f ma_sound_get_direction(const ma_sound* pSound); -MA_API void ma_sound_set_velocity(ma_sound* pSound, float x, float y, float z); -MA_API ma_vec3f ma_sound_get_velocity(const ma_sound* pSound); -MA_API void ma_sound_set_attenuation_model(ma_sound* pSound, ma_attenuation_model attenuationModel); -MA_API ma_attenuation_model ma_sound_get_attenuation_model(const ma_sound* pSound); -MA_API void ma_sound_set_positioning(ma_sound* pSound, ma_positioning positioning); -MA_API ma_positioning ma_sound_get_positioning(const ma_sound* pSound); -MA_API void ma_sound_set_rolloff(ma_sound* pSound, float rolloff); -MA_API float ma_sound_get_rolloff(const ma_sound* pSound); -MA_API void ma_sound_set_min_gain(ma_sound* pSound, float minGain); -MA_API float ma_sound_get_min_gain(const ma_sound* pSound); -MA_API void ma_sound_set_max_gain(ma_sound* pSound, float maxGain); -MA_API float ma_sound_get_max_gain(const ma_sound* pSound); -MA_API void ma_sound_set_min_distance(ma_sound* pSound, float minDistance); -MA_API float ma_sound_get_min_distance(const ma_sound* pSound); -MA_API void ma_sound_set_max_distance(ma_sound* pSound, float maxDistance); -MA_API float ma_sound_get_max_distance(const ma_sound* pSound); -MA_API void ma_sound_set_cone(ma_sound* pSound, float innerAngleInRadians, float outerAngleInRadians, float outerGain); -MA_API void ma_sound_get_cone(const ma_sound* pSound, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain); -MA_API void ma_sound_set_doppler_factor(ma_sound* pSound, float dopplerFactor); -MA_API float ma_sound_get_doppler_factor(const ma_sound* pSound); -MA_API void ma_sound_set_directional_attenuation_factor(ma_sound* pSound, float directionalAttenuationFactor); -MA_API float ma_sound_get_directional_attenuation_factor(const ma_sound* pSound); -MA_API void ma_sound_set_fade_in_pcm_frames(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames); -MA_API void ma_sound_set_fade_in_milliseconds(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds); -MA_API float ma_sound_get_current_fade_volume(ma_sound* pSound); -MA_API void ma_sound_set_start_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames); -MA_API void ma_sound_set_start_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds); -MA_API void ma_sound_set_stop_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames); -MA_API void ma_sound_set_stop_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds); -MA_API ma_bool32 ma_sound_is_playing(const ma_sound* pSound); -MA_API ma_uint64 ma_sound_get_time_in_pcm_frames(const ma_sound* pSound); -MA_API void ma_sound_set_looping(ma_sound* pSound, ma_bool32 isLooping); -MA_API ma_bool32 ma_sound_is_looping(const ma_sound* pSound); -MA_API ma_bool32 ma_sound_at_end(const ma_sound* pSound); -MA_API ma_result ma_sound_seek_to_pcm_frame(ma_sound* pSound, ma_uint64 frameIndex); /* Just a wrapper around ma_data_source_seek_to_pcm_frame(). */ -MA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* pCursor); -MA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* pLength); -MA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor); -MA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength); - -MA_API ma_result ma_sound_group_init(ma_engine* pEngine, ma_uint32 flags, ma_sound_group* pParentGroup, ma_sound_group* pGroup); -MA_API ma_result ma_sound_group_init_ex(ma_engine* pEngine, const ma_sound_group_config* pConfig, ma_sound_group* pGroup); -MA_API void ma_sound_group_uninit(ma_sound_group* pGroup); -MA_API ma_engine* ma_sound_group_get_engine(const ma_sound_group* pGroup); -MA_API ma_result ma_sound_group_start(ma_sound_group* pGroup); -MA_API ma_result ma_sound_group_stop(ma_sound_group* pGroup); -MA_API void ma_sound_group_set_volume(ma_sound_group* pGroup, float volume); -MA_API float ma_sound_group_get_volume(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_pan(ma_sound_group* pGroup, float pan); -MA_API float ma_sound_group_get_pan(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_pan_mode(ma_sound_group* pGroup, ma_pan_mode panMode); -MA_API ma_pan_mode ma_sound_group_get_pan_mode(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_pitch(ma_sound_group* pGroup, float pitch); -MA_API float ma_sound_group_get_pitch(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_spatialization_enabled(ma_sound_group* pGroup, ma_bool32 enabled); -MA_API ma_bool32 ma_sound_group_is_spatialization_enabled(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_pinned_listener_index(ma_sound_group* pGroup, ma_uint32 listenerIndex); -MA_API ma_uint32 ma_sound_group_get_pinned_listener_index(const ma_sound_group* pGroup); -MA_API ma_uint32 ma_sound_group_get_listener_index(const ma_sound_group* pGroup); -MA_API ma_vec3f ma_sound_group_get_direction_to_listener(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_position(ma_sound_group* pGroup, float x, float y, float z); -MA_API ma_vec3f ma_sound_group_get_position(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_direction(ma_sound_group* pGroup, float x, float y, float z); -MA_API ma_vec3f ma_sound_group_get_direction(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_velocity(ma_sound_group* pGroup, float x, float y, float z); -MA_API ma_vec3f ma_sound_group_get_velocity(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_attenuation_model(ma_sound_group* pGroup, ma_attenuation_model attenuationModel); -MA_API ma_attenuation_model ma_sound_group_get_attenuation_model(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_positioning(ma_sound_group* pGroup, ma_positioning positioning); -MA_API ma_positioning ma_sound_group_get_positioning(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_rolloff(ma_sound_group* pGroup, float rolloff); -MA_API float ma_sound_group_get_rolloff(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_min_gain(ma_sound_group* pGroup, float minGain); -MA_API float ma_sound_group_get_min_gain(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_max_gain(ma_sound_group* pGroup, float maxGain); -MA_API float ma_sound_group_get_max_gain(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_min_distance(ma_sound_group* pGroup, float minDistance); -MA_API float ma_sound_group_get_min_distance(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_max_distance(ma_sound_group* pGroup, float maxDistance); -MA_API float ma_sound_group_get_max_distance(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_cone(ma_sound_group* pGroup, float innerAngleInRadians, float outerAngleInRadians, float outerGain); -MA_API void ma_sound_group_get_cone(const ma_sound_group* pGroup, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain); -MA_API void ma_sound_group_set_doppler_factor(ma_sound_group* pGroup, float dopplerFactor); -MA_API float ma_sound_group_get_doppler_factor(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_directional_attenuation_factor(ma_sound_group* pGroup, float directionalAttenuationFactor); -MA_API float ma_sound_group_get_directional_attenuation_factor(const ma_sound_group* pGroup); -MA_API void ma_sound_group_set_fade_in_pcm_frames(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames); -MA_API void ma_sound_group_set_fade_in_milliseconds(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds); -MA_API float ma_sound_group_get_current_fade_volume(ma_sound_group* pGroup); -MA_API void ma_sound_group_set_start_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames); -MA_API void ma_sound_group_set_start_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds); -MA_API void ma_sound_group_set_stop_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames); -MA_API void ma_sound_group_set_stop_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds); -MA_API ma_bool32 ma_sound_group_is_playing(const ma_sound_group* pGroup); -MA_API ma_uint64 ma_sound_group_get_time_in_pcm_frames(const ma_sound_group* pGroup); -#endif /* MA_NO_ENGINE */ - -#ifdef __cplusplus -} -#endif -#endif /* miniaudio_h */ - - -/* -This is for preventing greying out of the implementation section. -*/ -#if defined(Q_CREATOR_RUN) || defined(__INTELLISENSE__) || defined(__CDT_PARSER__) -#define MINIAUDIO_IMPLEMENTATION -#endif - -/************************************************************************************************************************************************************ -************************************************************************************************************************************************************* - -IMPLEMENTATION - -************************************************************************************************************************************************************* -************************************************************************************************************************************************************/ -#if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION) -#ifndef miniaudio_c -#define miniaudio_c - -#include -#include /* For INT_MAX */ -#include /* sin(), etc. */ - -#include -#include -#if !defined(_MSC_VER) && !defined(__DMC__) - #include /* For strcasecmp(). */ - #include /* For wcslen(), wcsrtombs() */ -#endif -#ifdef _MSC_VER - #include /* For _controlfp_s constants */ -#endif - -#ifdef MA_WIN32 -#include -#else -#include /* For malloc(), free(), wcstombs(). */ -#include /* For memset() */ -#include -#include /* select() (used for ma_sleep()). */ -#include -#endif - -#include /* For fstat(), etc. */ - -#ifdef MA_EMSCRIPTEN -#include -#endif - -#if !defined(MA_64BIT) && !defined(MA_32BIT) -#ifdef _WIN32 -#ifdef _WIN64 -#define MA_64BIT -#else -#define MA_32BIT -#endif -#endif -#endif - -#if !defined(MA_64BIT) && !defined(MA_32BIT) -#ifdef __GNUC__ -#ifdef __LP64__ -#define MA_64BIT -#else -#define MA_32BIT -#endif -#endif -#endif - -#if !defined(MA_64BIT) && !defined(MA_32BIT) -#include -#if INTPTR_MAX == INT64_MAX -#define MA_64BIT -#else -#define MA_32BIT -#endif -#endif - -/* Architecture Detection */ -#if defined(__x86_64__) || defined(_M_X64) -#define MA_X64 -#elif defined(__i386) || defined(_M_IX86) -#define MA_X86 -#elif defined(__arm__) || defined(_M_ARM) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) -#define MA_ARM -#endif - -/* Intrinsics Support */ -#if defined(MA_X64) || defined(MA_X86) - #if defined(_MSC_VER) && !defined(__clang__) - /* MSVC. */ - #if _MSC_VER >= 1400 && !defined(MA_NO_SSE2) /* 2005 */ - #define MA_SUPPORT_SSE2 - #endif - /*#if _MSC_VER >= 1600 && !defined(MA_NO_AVX)*/ /* 2010 */ - /* #define MA_SUPPORT_AVX*/ - /*#endif*/ - #if _MSC_VER >= 1700 && !defined(MA_NO_AVX2) /* 2012 */ - #define MA_SUPPORT_AVX2 - #endif - #else - /* Assume GNUC-style. */ - #if defined(__SSE2__) && !defined(MA_NO_SSE2) - #define MA_SUPPORT_SSE2 - #endif - /*#if defined(__AVX__) && !defined(MA_NO_AVX)*/ - /* #define MA_SUPPORT_AVX*/ - /*#endif*/ - #if defined(__AVX2__) && !defined(MA_NO_AVX2) - #define MA_SUPPORT_AVX2 - #endif - #endif - - /* If at this point we still haven't determined compiler support for the intrinsics just fall back to __has_include. */ - #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include) - #if !defined(MA_SUPPORT_SSE2) && !defined(MA_NO_SSE2) && __has_include() - #define MA_SUPPORT_SSE2 - #endif - /*#if !defined(MA_SUPPORT_AVX) && !defined(MA_NO_AVX) && __has_include()*/ - /* #define MA_SUPPORT_AVX*/ - /*#endif*/ - #if !defined(MA_SUPPORT_AVX2) && !defined(MA_NO_AVX2) && __has_include() - #define MA_SUPPORT_AVX2 - #endif - #endif - - #if defined(MA_SUPPORT_AVX2) || defined(MA_SUPPORT_AVX) - #include - #elif defined(MA_SUPPORT_SSE2) - #include - #endif -#endif - -#if defined(MA_ARM) - #if !defined(MA_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)) - #define MA_SUPPORT_NEON - #include - #endif -#endif - -/* Begin globally disabled warnings. */ -#if defined(_MSC_VER) - #pragma warning(push) - #pragma warning(disable:4752) /* found Intel(R) Advanced Vector Extensions; consider using /arch:AVX */ - #pragma warning(disable:4049) /* compiler limit : terminating line number emission */ -#endif - -#if defined(MA_X64) || defined(MA_X86) - #if defined(_MSC_VER) && !defined(__clang__) - #if _MSC_VER >= 1400 - #include - static MA_INLINE void ma_cpuid(int info[4], int fid) - { - __cpuid(info, fid); - } - #else - #define MA_NO_CPUID - #endif - - #if _MSC_VER >= 1600 && (defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 160040219) - static MA_INLINE unsigned __int64 ma_xgetbv(int reg) - { - return _xgetbv(reg); - } - #else - #define MA_NO_XGETBV - #endif - #elif (defined(__GNUC__) || defined(__clang__)) && !defined(MA_ANDROID) - static MA_INLINE void ma_cpuid(int info[4], int fid) - { - /* - It looks like the -fPIC option uses the ebx register which GCC complains about. We can work around this by just using a different register, the - specific register of which I'm letting the compiler decide on. The "k" prefix is used to specify a 32-bit register. The {...} syntax is for - supporting different assembly dialects. - - What's basically happening is that we're saving and restoring the ebx register manually. - */ - #if defined(DRFLAC_X86) && defined(__PIC__) - __asm__ __volatile__ ( - "xchg{l} {%%}ebx, %k1;" - "cpuid;" - "xchg{l} {%%}ebx, %k1;" - : "=a"(info[0]), "=&r"(info[1]), "=c"(info[2]), "=d"(info[3]) : "a"(fid), "c"(0) - ); - #else - __asm__ __volatile__ ( - "cpuid" : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3]) : "a"(fid), "c"(0) - ); - #endif - } - - static MA_INLINE ma_uint64 ma_xgetbv(int reg) - { - unsigned int hi; - unsigned int lo; - - __asm__ __volatile__ ( - "xgetbv" : "=a"(lo), "=d"(hi) : "c"(reg) - ); - - return ((ma_uint64)hi << 32) | (ma_uint64)lo; - } - #else - #define MA_NO_CPUID - #define MA_NO_XGETBV - #endif -#else - #define MA_NO_CPUID - #define MA_NO_XGETBV -#endif - -static MA_INLINE ma_bool32 ma_has_sse2(void) -{ -#if defined(MA_SUPPORT_SSE2) - #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_SSE2) - #if defined(MA_X64) - return MA_TRUE; /* 64-bit targets always support SSE2. */ - #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__) - return MA_TRUE; /* If the compiler is allowed to freely generate SSE2 code we can assume support. */ - #else - #if defined(MA_NO_CPUID) - return MA_FALSE; - #else - int info[4]; - ma_cpuid(info, 1); - return (info[3] & (1 << 26)) != 0; - #endif - #endif - #else - return MA_FALSE; /* SSE2 is only supported on x86 and x64 architectures. */ - #endif -#else - return MA_FALSE; /* No compiler support. */ -#endif -} - -#if 0 -static MA_INLINE ma_bool32 ma_has_avx() -{ -#if defined(MA_SUPPORT_AVX) - #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_AVX) - #if defined(_AVX_) || defined(__AVX__) - return MA_TRUE; /* If the compiler is allowed to freely generate AVX code we can assume support. */ - #else - /* AVX requires both CPU and OS support. */ - #if defined(MA_NO_CPUID) || defined(MA_NO_XGETBV) - return MA_FALSE; - #else - int info[4]; - ma_cpuid(info, 1); - if (((info[2] & (1 << 27)) != 0) && ((info[2] & (1 << 28)) != 0)) { - ma_uint64 xrc = ma_xgetbv(0); - if ((xrc & 0x06) == 0x06) { - return MA_TRUE; - } else { - return MA_FALSE; - } - } else { - return MA_FALSE; - } - #endif - #endif - #else - return MA_FALSE; /* AVX is only supported on x86 and x64 architectures. */ - #endif -#else - return MA_FALSE; /* No compiler support. */ -#endif -} -#endif - -static MA_INLINE ma_bool32 ma_has_avx2(void) -{ -#if defined(MA_SUPPORT_AVX2) - #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_AVX2) - #if defined(_AVX2_) || defined(__AVX2__) - return MA_TRUE; /* If the compiler is allowed to freely generate AVX2 code we can assume support. */ - #else - /* AVX2 requires both CPU and OS support. */ - #if defined(MA_NO_CPUID) || defined(MA_NO_XGETBV) - return MA_FALSE; - #else - int info1[4]; - int info7[4]; - ma_cpuid(info1, 1); - ma_cpuid(info7, 7); - if (((info1[2] & (1 << 27)) != 0) && ((info7[1] & (1 << 5)) != 0)) { - ma_uint64 xrc = ma_xgetbv(0); - if ((xrc & 0x06) == 0x06) { - return MA_TRUE; - } else { - return MA_FALSE; - } - } else { - return MA_FALSE; - } - #endif - #endif - #else - return MA_FALSE; /* AVX2 is only supported on x86 and x64 architectures. */ - #endif -#else - return MA_FALSE; /* No compiler support. */ -#endif -} - -static MA_INLINE ma_bool32 ma_has_neon(void) -{ -#if defined(MA_SUPPORT_NEON) - #if defined(MA_ARM) && !defined(MA_NO_NEON) - #if (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)) - return MA_TRUE; /* If the compiler is allowed to freely generate NEON code we can assume support. */ - #else - /* TODO: Runtime check. */ - return MA_FALSE; - #endif - #else - return MA_FALSE; /* NEON is only supported on ARM architectures. */ - #endif -#else - return MA_FALSE; /* No compiler support. */ -#endif -} - -#define MA_SIMD_NONE 0 -#define MA_SIMD_SSE2 1 -#define MA_SIMD_AVX2 2 -#define MA_SIMD_NEON 3 - -#ifndef MA_PREFERRED_SIMD - # if defined(MA_SUPPORT_SSE2) && defined(MA_PREFER_SSE2) - #define MA_PREFERRED_SIMD MA_SIMD_SSE2 - #elif defined(MA_SUPPORT_AVX2) && defined(MA_PREFER_AVX2) - #define MA_PREFERRED_SIMD MA_SIMD_AVX2 - #elif defined(MA_SUPPORT_NEON) && defined(MA_PREFER_NEON) - #define MA_PREFERRED_SIMD MA_SIMD_NEON - #else - #define MA_PREFERRED_SIMD MA_SIMD_NONE - #endif -#endif - -#if defined(__has_builtin) - #define MA_COMPILER_HAS_BUILTIN(x) __has_builtin(x) -#else - #define MA_COMPILER_HAS_BUILTIN(x) 0 -#endif - -#ifndef MA_ASSUME - #if MA_COMPILER_HAS_BUILTIN(__builtin_assume) - #define MA_ASSUME(x) __builtin_assume(x) - #elif MA_COMPILER_HAS_BUILTIN(__builtin_unreachable) - #define MA_ASSUME(x) do { if (!(x)) __builtin_unreachable(); } while (0) - #elif defined(_MSC_VER) - #define MA_ASSUME(x) __assume(x) - #else - #define MA_ASSUME(x) (void)(x) - #endif -#endif - -#ifndef MA_RESTRICT - #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER) - #define MA_RESTRICT __restrict - #else - #define MA_RESTRICT - #endif -#endif - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - #define MA_HAS_BYTESWAP16_INTRINSIC - #define MA_HAS_BYTESWAP32_INTRINSIC - #define MA_HAS_BYTESWAP64_INTRINSIC -#elif defined(__clang__) - #if MA_COMPILER_HAS_BUILTIN(__builtin_bswap16) - #define MA_HAS_BYTESWAP16_INTRINSIC - #endif - #if MA_COMPILER_HAS_BUILTIN(__builtin_bswap32) - #define MA_HAS_BYTESWAP32_INTRINSIC - #endif - #if MA_COMPILER_HAS_BUILTIN(__builtin_bswap64) - #define MA_HAS_BYTESWAP64_INTRINSIC - #endif -#elif defined(__GNUC__) - #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define MA_HAS_BYTESWAP32_INTRINSIC - #define MA_HAS_BYTESWAP64_INTRINSIC - #endif - #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) - #define MA_HAS_BYTESWAP16_INTRINSIC - #endif -#endif - - -static MA_INLINE ma_bool32 ma_is_little_endian(void) -{ -#if defined(MA_X86) || defined(MA_X64) - return MA_TRUE; -#else - int n = 1; - return (*(char*)&n) == 1; -#endif -} - -static MA_INLINE ma_bool32 ma_is_big_endian(void) -{ - return !ma_is_little_endian(); -} - - -static MA_INLINE ma_uint32 ma_swap_endian_uint32(ma_uint32 n) -{ -#ifdef MA_HAS_BYTESWAP32_INTRINSIC - #if defined(_MSC_VER) - return _byteswap_ulong(n); - #elif defined(__GNUC__) || defined(__clang__) - #if defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(MA_64BIT) /* <-- 64-bit inline assembly has not been tested, so disabling for now. */ - /* Inline assembly optimized implementation for ARM. In my testing, GCC does not generate optimized code with __builtin_bswap32(). */ - ma_uint32 r; - __asm__ __volatile__ ( - #if defined(MA_64BIT) - "rev %w[out], %w[in]" : [out]"=r"(r) : [in]"r"(n) /* <-- This is untested. If someone in the community could test this, that would be appreciated! */ - #else - "rev %[out], %[in]" : [out]"=r"(r) : [in]"r"(n) - #endif - ); - return r; - #else - return __builtin_bswap32(n); - #endif - #else - #error "This compiler does not support the byte swap intrinsic." - #endif -#else - return ((n & 0xFF000000) >> 24) | - ((n & 0x00FF0000) >> 8) | - ((n & 0x0000FF00) << 8) | - ((n & 0x000000FF) << 24); -#endif -} - - -#if !defined(MA_EMSCRIPTEN) -#ifdef MA_WIN32 -static void ma_sleep__win32(ma_uint32 milliseconds) -{ - Sleep((DWORD)milliseconds); -} -#endif -#ifdef MA_POSIX -static void ma_sleep__posix(ma_uint32 milliseconds) -{ -#ifdef MA_EMSCRIPTEN - (void)milliseconds; - MA_ASSERT(MA_FALSE); /* The Emscripten build should never sleep. */ -#else - #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L - struct timespec ts; - ts.tv_sec = milliseconds / 1000; - ts.tv_nsec = milliseconds % 1000 * 1000000; - nanosleep(&ts, NULL); - #else - struct timeval tv; - tv.tv_sec = milliseconds / 1000; - tv.tv_usec = milliseconds % 1000 * 1000; - select(0, NULL, NULL, NULL, &tv); - #endif -#endif -} -#endif - -static MA_INLINE void ma_sleep(ma_uint32 milliseconds) -{ -#ifdef MA_WIN32 - ma_sleep__win32(milliseconds); -#endif -#ifdef MA_POSIX - ma_sleep__posix(milliseconds); -#endif -} -#endif - -static MA_INLINE void ma_yield() -{ -#if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) - /* x86/x64 */ - #if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__)) && !defined(__clang__) - #if _MSC_VER >= 1400 - _mm_pause(); - #else - #if defined(__DMC__) - /* Digital Mars does not recognize the PAUSE opcode. Fall back to NOP. */ - __asm nop; - #else - __asm pause; - #endif - #endif - #else - __asm__ __volatile__ ("pause"); - #endif -#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(_M_ARM64) || (defined(_M_ARM) && _M_ARM >= 7) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) - /* ARM */ - #if defined(_MSC_VER) - /* Apparently there is a __yield() intrinsic that's compatible with ARM, but I cannot find documentation for it nor can I find where it's declared. */ - __yield(); - #else - __asm__ __volatile__ ("yield"); /* ARMv6K/ARMv6T2 and above. */ - #endif -#else - /* Unknown or unsupported architecture. No-op. */ -#endif -} - - -#define MA_MM_DENORMALS_ZERO_MASK 0x0040 -#define MA_MM_FLUSH_ZERO_MASK 0x8000 - -static MA_INLINE unsigned int ma_disable_denormals() -{ - unsigned int prevState; - - #if defined(_MSC_VER) - { - /* - Older versions of Visual Studio don't support the "safe" versions of _controlfp_s(). I don't - know which version of Visual Studio first added support for _controlfp_s(), but I do know - that VC6 lacks support. _MSC_VER = 1200 is VC6, but if you get compilation errors on older - versions of Visual Studio, let me know and I'll make the necessary adjustment. - */ - #if _MSC_VER <= 1200 - { - prevState = _statusfp(); - _controlfp(prevState | _DN_FLUSH, _MCW_DN); - } - #else - { - unsigned int unused; - _controlfp_s(&prevState, 0, 0); - _controlfp_s(&unused, prevState | _DN_FLUSH, _MCW_DN); - } - #endif - } - #elif defined(MA_X86) || defined(MA_X64) - { - #if defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__)) /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */ - { - prevState = _mm_getcsr(); - _mm_setcsr(prevState | MA_MM_DENORMALS_ZERO_MASK | MA_MM_FLUSH_ZERO_MASK); - } - #else - { - /* x88/64, but no support for _mm_getcsr()/_mm_setcsr(). May need to fall back to inlined assembly here. */ - prevState = 0; - } - #endif - } - #else - { - /* Unknown or unsupported architecture. No-op. */ - prevState = 0; - } - #endif - - return prevState; -} - -static MA_INLINE void ma_restore_denormals(unsigned int prevState) -{ - #if defined(_MSC_VER) - { - /* Older versions of Visual Studio do not support _controlfp_s(). See ma_disable_denormals(). */ - #if _MSC_VER <= 1200 - { - _controlfp(prevState, _MCW_DN); - } - #else - { - unsigned int unused; - _controlfp_s(&unused, prevState, _MCW_DN); - } - #endif - } - #elif defined(MA_X86) || defined(MA_X64) - { - #if defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__)) /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */ - { - _mm_setcsr(prevState); - } - #else - { - /* x88/64, but no support for _mm_getcsr()/_mm_setcsr(). May need to fall back to inlined assembly here. */ - (void)prevState; - } - #endif - } - #else - { - /* Unknown or unsupported architecture. No-op. */ - (void)prevState; - } - #endif -} - - - -#ifndef MA_COINIT_VALUE -#define MA_COINIT_VALUE 0 /* 0 = COINIT_MULTITHREADED */ -#endif - - -#ifndef MA_FLT_MAX - #ifdef FLT_MAX - #define MA_FLT_MAX FLT_MAX - #else - #define MA_FLT_MAX 3.402823466e+38F - #endif -#endif - - -#ifndef MA_PI -#define MA_PI 3.14159265358979323846264f -#endif -#ifndef MA_PI_D -#define MA_PI_D 3.14159265358979323846264 -#endif -#ifndef MA_TAU -#define MA_TAU 6.28318530717958647693f -#endif -#ifndef MA_TAU_D -#define MA_TAU_D 6.28318530717958647693 -#endif - - -/* The default format when ma_format_unknown (0) is requested when initializing a device. */ -#ifndef MA_DEFAULT_FORMAT -#define MA_DEFAULT_FORMAT ma_format_f32 -#endif - -/* The default channel count to use when 0 is used when initializing a device. */ -#ifndef MA_DEFAULT_CHANNELS -#define MA_DEFAULT_CHANNELS 2 -#endif - -/* The default sample rate to use when 0 is used when initializing a device. */ -#ifndef MA_DEFAULT_SAMPLE_RATE -#define MA_DEFAULT_SAMPLE_RATE 48000 -#endif - -/* Default periods when none is specified in ma_device_init(). More periods means more work on the CPU. */ -#ifndef MA_DEFAULT_PERIODS -#define MA_DEFAULT_PERIODS 3 -#endif - -/* The default period size in milliseconds for low latency mode. */ -#ifndef MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY -#define MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY 10 -#endif - -/* The default buffer size in milliseconds for conservative mode. */ -#ifndef MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE -#define MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE 100 -#endif - -/* The default LPF filter order for linear resampling. Note that this is clamped to MA_MAX_FILTER_ORDER. */ -#ifndef MA_DEFAULT_RESAMPLER_LPF_ORDER - #if MA_MAX_FILTER_ORDER >= 4 - #define MA_DEFAULT_RESAMPLER_LPF_ORDER 4 - #else - #define MA_DEFAULT_RESAMPLER_LPF_ORDER MA_MAX_FILTER_ORDER - #endif -#endif - - -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wunused-variable" -#endif - -/* Standard sample rates, in order of priority. */ -static ma_uint32 g_maStandardSampleRatePriorities[] = { - (ma_uint32)ma_standard_sample_rate_48000, - (ma_uint32)ma_standard_sample_rate_44100, - - (ma_uint32)ma_standard_sample_rate_32000, - (ma_uint32)ma_standard_sample_rate_24000, - (ma_uint32)ma_standard_sample_rate_22050, - - (ma_uint32)ma_standard_sample_rate_88200, - (ma_uint32)ma_standard_sample_rate_96000, - (ma_uint32)ma_standard_sample_rate_176400, - (ma_uint32)ma_standard_sample_rate_192000, - - (ma_uint32)ma_standard_sample_rate_16000, - (ma_uint32)ma_standard_sample_rate_11025, - (ma_uint32)ma_standard_sample_rate_8000, - - (ma_uint32)ma_standard_sample_rate_352800, - (ma_uint32)ma_standard_sample_rate_384000 -}; - -static MA_INLINE ma_bool32 ma_is_standard_sample_rate(ma_uint32 sampleRate) -{ - ma_uint32 iSampleRate; - - for (iSampleRate = 0; iSampleRate < sizeof(g_maStandardSampleRatePriorities) / sizeof(g_maStandardSampleRatePriorities[0]); iSampleRate += 1) { - if (g_maStandardSampleRatePriorities[iSampleRate] == sampleRate) { - return MA_TRUE; - } - } - - /* Getting here means the sample rate is not supported. */ - return MA_FALSE; -} - - -static ma_format g_maFormatPriorities[] = { - ma_format_s16, /* Most common */ - ma_format_f32, - - /*ma_format_s24_32,*/ /* Clean alignment */ - ma_format_s32, - - ma_format_s24, /* Unclean alignment */ - - ma_format_u8 /* Low quality */ -}; -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic pop -#endif - - -MA_API void ma_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision) -{ - if (pMajor) { - *pMajor = MA_VERSION_MAJOR; - } - - if (pMinor) { - *pMinor = MA_VERSION_MINOR; - } - - if (pRevision) { - *pRevision = MA_VERSION_REVISION; - } -} - -MA_API const char* ma_version_string(void) -{ - return MA_VERSION_STRING; -} - - -/****************************************************************************** - -Standard Library Stuff - -******************************************************************************/ -#ifndef MA_MALLOC -#ifdef MA_WIN32 -#define MA_MALLOC(sz) HeapAlloc(GetProcessHeap(), 0, (sz)) -#else -#define MA_MALLOC(sz) malloc((sz)) -#endif -#endif - -#ifndef MA_REALLOC -#ifdef MA_WIN32 -#define MA_REALLOC(p, sz) (((sz) > 0) ? ((p) ? HeapReAlloc(GetProcessHeap(), 0, (p), (sz)) : HeapAlloc(GetProcessHeap(), 0, (sz))) : ((VOID*)(size_t)(HeapFree(GetProcessHeap(), 0, (p)) & 0))) -#else -#define MA_REALLOC(p, sz) realloc((p), (sz)) -#endif -#endif - -#ifndef MA_FREE -#ifdef MA_WIN32 -#define MA_FREE(p) HeapFree(GetProcessHeap(), 0, (p)) -#else -#define MA_FREE(p) free((p)) -#endif -#endif - -#ifndef MA_ZERO_MEMORY -#ifdef MA_WIN32 -#define MA_ZERO_MEMORY(p, sz) ZeroMemory((p), (sz)) -#else -#define MA_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) -#endif -#endif - -#ifndef MA_COPY_MEMORY -#ifdef MA_WIN32 -#define MA_COPY_MEMORY(dst, src, sz) CopyMemory((dst), (src), (sz)) -#else -#define MA_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) -#endif -#endif - -#ifndef MA_MOVE_MEMORY -#ifdef MA_WIN32 -#define MA_MOVE_MEMORY(dst, src, sz) MoveMemory((dst), (src), (sz)) -#else -#define MA_MOVE_MEMORY(dst, src, sz) memmove((dst), (src), (sz)) -#endif -#endif - -#ifndef MA_ASSERT -#ifdef MA_WIN32 -#define MA_ASSERT(condition) assert(condition) -#else -#define MA_ASSERT(condition) assert(condition) -#endif -#endif - -#define MA_ZERO_OBJECT(p) MA_ZERO_MEMORY((p), sizeof(*(p))) - -#define ma_countof(x) (sizeof(x) / sizeof(x[0])) -#define ma_max(x, y) (((x) > (y)) ? (x) : (y)) -#define ma_min(x, y) (((x) < (y)) ? (x) : (y)) -#define ma_abs(x) (((x) > 0) ? (x) : -(x)) -#define ma_clamp(x, lo, hi) (ma_max(lo, ma_min(x, hi))) -#define ma_offset_ptr(p, offset) (((ma_uint8*)(p)) + (offset)) -#define ma_align(x, a) ((x + (a-1)) & ~(a-1)) -#define ma_align_64(x) ma_align(x, 8) - -#define ma_buffer_frame_capacity(buffer, channels, format) (sizeof(buffer) / ma_get_bytes_per_sample(format) / (channels)) - -static MA_INLINE double ma_sind(double x) -{ - /* TODO: Implement custom sin(x). */ - return sin(x); -} - -static MA_INLINE double ma_expd(double x) -{ - /* TODO: Implement custom exp(x). */ - return exp(x); -} - -static MA_INLINE double ma_logd(double x) -{ - /* TODO: Implement custom log(x). */ - return log(x); -} - -static MA_INLINE double ma_powd(double x, double y) -{ - /* TODO: Implement custom pow(x, y). */ - return pow(x, y); -} - -static MA_INLINE double ma_sqrtd(double x) -{ - /* TODO: Implement custom sqrt(x). */ - return sqrt(x); -} - - -static MA_INLINE float ma_sinf(float x) -{ - return (float)ma_sind((float)x); -} - -static MA_INLINE double ma_cosd(double x) -{ - return ma_sind((MA_PI_D*0.5) - x); -} - -static MA_INLINE float ma_cosf(float x) -{ - return (float)ma_cosd((float)x); -} - -static MA_INLINE double ma_log10d(double x) -{ - return ma_logd(x) * 0.43429448190325182765; -} - -static MA_INLINE float ma_powf(float x, float y) -{ - return (float)ma_powd((double)x, (double)y); -} - -static MA_INLINE float ma_log10f(float x) -{ - return (float)ma_log10d((double)x); -} - - -static MA_INLINE double ma_degrees_to_radians(double degrees) -{ - return degrees * 0.01745329252; -} - -static MA_INLINE double ma_radians_to_degrees(double radians) -{ - return radians * 57.295779512896; -} - -static MA_INLINE float ma_degrees_to_radians_f(float degrees) -{ - return degrees * 0.01745329252f; -} - -static MA_INLINE float ma_radians_to_degrees_f(float radians) -{ - return radians * 57.295779512896f; -} - - -/* -Return Values: - 0: Success - 22: EINVAL - 34: ERANGE - -Not using symbolic constants for errors because I want to avoid #including errno.h -*/ -MA_API int ma_strcpy_s(char* dst, size_t dstSizeInBytes, const char* src) -{ - size_t i; - - if (dst == 0) { - return 22; - } - if (dstSizeInBytes == 0) { - return 34; - } - if (src == 0) { - dst[0] = '\0'; - return 22; - } - - for (i = 0; i < dstSizeInBytes && src[i] != '\0'; ++i) { - dst[i] = src[i]; - } - - if (i < dstSizeInBytes) { - dst[i] = '\0'; - return 0; - } - - dst[0] = '\0'; - return 34; -} - -MA_API int ma_wcscpy_s(wchar_t* dst, size_t dstCap, const wchar_t* src) -{ - size_t i; - - if (dst == 0) { - return 22; - } - if (dstCap == 0) { - return 34; - } - if (src == 0) { - dst[0] = '\0'; - return 22; - } - - for (i = 0; i < dstCap && src[i] != '\0'; ++i) { - dst[i] = src[i]; - } - - if (i < dstCap) { - dst[i] = '\0'; - return 0; - } - - dst[0] = '\0'; - return 34; -} - - -MA_API int ma_strncpy_s(char* dst, size_t dstSizeInBytes, const char* src, size_t count) -{ - size_t maxcount; - size_t i; - - if (dst == 0) { - return 22; - } - if (dstSizeInBytes == 0) { - return 34; - } - if (src == 0) { - dst[0] = '\0'; - return 22; - } - - maxcount = count; - if (count == ((size_t)-1) || count >= dstSizeInBytes) { /* -1 = _TRUNCATE */ - maxcount = dstSizeInBytes - 1; - } - - for (i = 0; i < maxcount && src[i] != '\0'; ++i) { - dst[i] = src[i]; - } - - if (src[i] == '\0' || i == count || count == ((size_t)-1)) { - dst[i] = '\0'; - return 0; - } - - dst[0] = '\0'; - return 34; -} - -MA_API int ma_strcat_s(char* dst, size_t dstSizeInBytes, const char* src) -{ - char* dstorig; - - if (dst == 0) { - return 22; - } - if (dstSizeInBytes == 0) { - return 34; - } - if (src == 0) { - dst[0] = '\0'; - return 22; - } - - dstorig = dst; - - while (dstSizeInBytes > 0 && dst[0] != '\0') { - dst += 1; - dstSizeInBytes -= 1; - } - - if (dstSizeInBytes == 0) { - return 22; /* Unterminated. */ - } - - - while (dstSizeInBytes > 0 && src[0] != '\0') { - *dst++ = *src++; - dstSizeInBytes -= 1; - } - - if (dstSizeInBytes > 0) { - dst[0] = '\0'; - } else { - dstorig[0] = '\0'; - return 34; - } - - return 0; -} - -MA_API int ma_strncat_s(char* dst, size_t dstSizeInBytes, const char* src, size_t count) -{ - char* dstorig; - - if (dst == 0) { - return 22; - } - if (dstSizeInBytes == 0) { - return 34; - } - if (src == 0) { - return 22; - } - - dstorig = dst; - - while (dstSizeInBytes > 0 && dst[0] != '\0') { - dst += 1; - dstSizeInBytes -= 1; - } - - if (dstSizeInBytes == 0) { - return 22; /* Unterminated. */ - } - - - if (count == ((size_t)-1)) { /* _TRUNCATE */ - count = dstSizeInBytes - 1; - } - - while (dstSizeInBytes > 0 && src[0] != '\0' && count > 0) { - *dst++ = *src++; - dstSizeInBytes -= 1; - count -= 1; - } - - if (dstSizeInBytes > 0) { - dst[0] = '\0'; - } else { - dstorig[0] = '\0'; - return 34; - } - - return 0; -} - -MA_API int ma_itoa_s(int value, char* dst, size_t dstSizeInBytes, int radix) -{ - int sign; - unsigned int valueU; - char* dstEnd; - - if (dst == NULL || dstSizeInBytes == 0) { - return 22; - } - if (radix < 2 || radix > 36) { - dst[0] = '\0'; - return 22; - } - - sign = (value < 0 && radix == 10) ? -1 : 1; /* The negative sign is only used when the base is 10. */ - - if (value < 0) { - valueU = -value; - } else { - valueU = value; - } - - dstEnd = dst; - do - { - int remainder = valueU % radix; - if (remainder > 9) { - *dstEnd = (char)((remainder - 10) + 'a'); - } else { - *dstEnd = (char)(remainder + '0'); - } - - dstEnd += 1; - dstSizeInBytes -= 1; - valueU /= radix; - } while (dstSizeInBytes > 0 && valueU > 0); - - if (dstSizeInBytes == 0) { - dst[0] = '\0'; - return 22; /* Ran out of room in the output buffer. */ - } - - if (sign < 0) { - *dstEnd++ = '-'; - dstSizeInBytes -= 1; - } - - if (dstSizeInBytes == 0) { - dst[0] = '\0'; - return 22; /* Ran out of room in the output buffer. */ - } - - *dstEnd = '\0'; - - - /* At this point the string will be reversed. */ - dstEnd -= 1; - while (dst < dstEnd) { - char temp = *dst; - *dst = *dstEnd; - *dstEnd = temp; - - dst += 1; - dstEnd -= 1; - } - - return 0; -} - -MA_API int ma_strcmp(const char* str1, const char* str2) -{ - if (str1 == str2) return 0; - - /* These checks differ from the standard implementation. It's not important, but I prefer it just for sanity. */ - if (str1 == NULL) return -1; - if (str2 == NULL) return 1; - - for (;;) { - if (str1[0] == '\0') { - break; - } - if (str1[0] != str2[0]) { - break; - } - - str1 += 1; - str2 += 1; - } - - return ((unsigned char*)str1)[0] - ((unsigned char*)str2)[0]; -} - -MA_API int ma_strappend(char* dst, size_t dstSize, const char* srcA, const char* srcB) -{ - int result; - - result = ma_strncpy_s(dst, dstSize, srcA, (size_t)-1); - if (result != 0) { - return result; - } - - result = ma_strncat_s(dst, dstSize, srcB, (size_t)-1); - if (result != 0) { - return result; - } - - return result; -} - -MA_API char* ma_copy_string(const char* src, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (src == NULL) { - return NULL; - } - - size_t sz = strlen(src)+1; - char* dst = (char*)ma_malloc(sz, pAllocationCallbacks); - if (dst == NULL) { - return NULL; - } - - ma_strcpy_s(dst, sz, src); - - return dst; -} - -MA_API wchar_t* ma_copy_string_w(const wchar_t* src, const ma_allocation_callbacks* pAllocationCallbacks) -{ - size_t sz = wcslen(src)+1; - wchar_t* dst = (wchar_t*)ma_malloc(sz * sizeof(*dst), pAllocationCallbacks); - if (dst == NULL) { - return NULL; - } - - ma_wcscpy_s(dst, sz, src); - - return dst; -} - - -#include -static ma_result ma_result_from_errno(int e) -{ - switch (e) - { - case 0: return MA_SUCCESS; - #ifdef EPERM - case EPERM: return MA_INVALID_OPERATION; - #endif - #ifdef ENOENT - case ENOENT: return MA_DOES_NOT_EXIST; - #endif - #ifdef ESRCH - case ESRCH: return MA_DOES_NOT_EXIST; - #endif - #ifdef EINTR - case EINTR: return MA_INTERRUPT; - #endif - #ifdef EIO - case EIO: return MA_IO_ERROR; - #endif - #ifdef ENXIO - case ENXIO: return MA_DOES_NOT_EXIST; - #endif - #ifdef E2BIG - case E2BIG: return MA_INVALID_ARGS; - #endif - #ifdef ENOEXEC - case ENOEXEC: return MA_INVALID_FILE; - #endif - #ifdef EBADF - case EBADF: return MA_INVALID_FILE; - #endif - #ifdef ECHILD - case ECHILD: return MA_ERROR; - #endif - #ifdef EAGAIN - case EAGAIN: return MA_UNAVAILABLE; - #endif - #ifdef ENOMEM - case ENOMEM: return MA_OUT_OF_MEMORY; - #endif - #ifdef EACCES - case EACCES: return MA_ACCESS_DENIED; - #endif - #ifdef EFAULT - case EFAULT: return MA_BAD_ADDRESS; - #endif - #ifdef ENOTBLK - case ENOTBLK: return MA_ERROR; - #endif - #ifdef EBUSY - case EBUSY: return MA_BUSY; - #endif - #ifdef EEXIST - case EEXIST: return MA_ALREADY_EXISTS; - #endif - #ifdef EXDEV - case EXDEV: return MA_ERROR; - #endif - #ifdef ENODEV - case ENODEV: return MA_DOES_NOT_EXIST; - #endif - #ifdef ENOTDIR - case ENOTDIR: return MA_NOT_DIRECTORY; - #endif - #ifdef EISDIR - case EISDIR: return MA_IS_DIRECTORY; - #endif - #ifdef EINVAL - case EINVAL: return MA_INVALID_ARGS; - #endif - #ifdef ENFILE - case ENFILE: return MA_TOO_MANY_OPEN_FILES; - #endif - #ifdef EMFILE - case EMFILE: return MA_TOO_MANY_OPEN_FILES; - #endif - #ifdef ENOTTY - case ENOTTY: return MA_INVALID_OPERATION; - #endif - #ifdef ETXTBSY - case ETXTBSY: return MA_BUSY; - #endif - #ifdef EFBIG - case EFBIG: return MA_TOO_BIG; - #endif - #ifdef ENOSPC - case ENOSPC: return MA_NO_SPACE; - #endif - #ifdef ESPIPE - case ESPIPE: return MA_BAD_SEEK; - #endif - #ifdef EROFS - case EROFS: return MA_ACCESS_DENIED; - #endif - #ifdef EMLINK - case EMLINK: return MA_TOO_MANY_LINKS; - #endif - #ifdef EPIPE - case EPIPE: return MA_BAD_PIPE; - #endif - #ifdef EDOM - case EDOM: return MA_OUT_OF_RANGE; - #endif - #ifdef ERANGE - case ERANGE: return MA_OUT_OF_RANGE; - #endif - #ifdef EDEADLK - case EDEADLK: return MA_DEADLOCK; - #endif - #ifdef ENAMETOOLONG - case ENAMETOOLONG: return MA_PATH_TOO_LONG; - #endif - #ifdef ENOLCK - case ENOLCK: return MA_ERROR; - #endif - #ifdef ENOSYS - case ENOSYS: return MA_NOT_IMPLEMENTED; - #endif - #ifdef ENOTEMPTY - case ENOTEMPTY: return MA_DIRECTORY_NOT_EMPTY; - #endif - #ifdef ELOOP - case ELOOP: return MA_TOO_MANY_LINKS; - #endif - #ifdef ENOMSG - case ENOMSG: return MA_NO_MESSAGE; - #endif - #ifdef EIDRM - case EIDRM: return MA_ERROR; - #endif - #ifdef ECHRNG - case ECHRNG: return MA_ERROR; - #endif - #ifdef EL2NSYNC - case EL2NSYNC: return MA_ERROR; - #endif - #ifdef EL3HLT - case EL3HLT: return MA_ERROR; - #endif - #ifdef EL3RST - case EL3RST: return MA_ERROR; - #endif - #ifdef ELNRNG - case ELNRNG: return MA_OUT_OF_RANGE; - #endif - #ifdef EUNATCH - case EUNATCH: return MA_ERROR; - #endif - #ifdef ENOCSI - case ENOCSI: return MA_ERROR; - #endif - #ifdef EL2HLT - case EL2HLT: return MA_ERROR; - #endif - #ifdef EBADE - case EBADE: return MA_ERROR; - #endif - #ifdef EBADR - case EBADR: return MA_ERROR; - #endif - #ifdef EXFULL - case EXFULL: return MA_ERROR; - #endif - #ifdef ENOANO - case ENOANO: return MA_ERROR; - #endif - #ifdef EBADRQC - case EBADRQC: return MA_ERROR; - #endif - #ifdef EBADSLT - case EBADSLT: return MA_ERROR; - #endif - #ifdef EBFONT - case EBFONT: return MA_INVALID_FILE; - #endif - #ifdef ENOSTR - case ENOSTR: return MA_ERROR; - #endif - #ifdef ENODATA - case ENODATA: return MA_NO_DATA_AVAILABLE; - #endif - #ifdef ETIME - case ETIME: return MA_TIMEOUT; - #endif - #ifdef ENOSR - case ENOSR: return MA_NO_DATA_AVAILABLE; - #endif - #ifdef ENONET - case ENONET: return MA_NO_NETWORK; - #endif - #ifdef ENOPKG - case ENOPKG: return MA_ERROR; - #endif - #ifdef EREMOTE - case EREMOTE: return MA_ERROR; - #endif - #ifdef ENOLINK - case ENOLINK: return MA_ERROR; - #endif - #ifdef EADV - case EADV: return MA_ERROR; - #endif - #ifdef ESRMNT - case ESRMNT: return MA_ERROR; - #endif - #ifdef ECOMM - case ECOMM: return MA_ERROR; - #endif - #ifdef EPROTO - case EPROTO: return MA_ERROR; - #endif - #ifdef EMULTIHOP - case EMULTIHOP: return MA_ERROR; - #endif - #ifdef EDOTDOT - case EDOTDOT: return MA_ERROR; - #endif - #ifdef EBADMSG - case EBADMSG: return MA_BAD_MESSAGE; - #endif - #ifdef EOVERFLOW - case EOVERFLOW: return MA_TOO_BIG; - #endif - #ifdef ENOTUNIQ - case ENOTUNIQ: return MA_NOT_UNIQUE; - #endif - #ifdef EBADFD - case EBADFD: return MA_ERROR; - #endif - #ifdef EREMCHG - case EREMCHG: return MA_ERROR; - #endif - #ifdef ELIBACC - case ELIBACC: return MA_ACCESS_DENIED; - #endif - #ifdef ELIBBAD - case ELIBBAD: return MA_INVALID_FILE; - #endif - #ifdef ELIBSCN - case ELIBSCN: return MA_INVALID_FILE; - #endif - #ifdef ELIBMAX - case ELIBMAX: return MA_ERROR; - #endif - #ifdef ELIBEXEC - case ELIBEXEC: return MA_ERROR; - #endif - #ifdef EILSEQ - case EILSEQ: return MA_INVALID_DATA; - #endif - #ifdef ERESTART - case ERESTART: return MA_ERROR; - #endif - #ifdef ESTRPIPE - case ESTRPIPE: return MA_ERROR; - #endif - #ifdef EUSERS - case EUSERS: return MA_ERROR; - #endif - #ifdef ENOTSOCK - case ENOTSOCK: return MA_NOT_SOCKET; - #endif - #ifdef EDESTADDRREQ - case EDESTADDRREQ: return MA_NO_ADDRESS; - #endif - #ifdef EMSGSIZE - case EMSGSIZE: return MA_TOO_BIG; - #endif - #ifdef EPROTOTYPE - case EPROTOTYPE: return MA_BAD_PROTOCOL; - #endif - #ifdef ENOPROTOOPT - case ENOPROTOOPT: return MA_PROTOCOL_UNAVAILABLE; - #endif - #ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return MA_PROTOCOL_NOT_SUPPORTED; - #endif - #ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return MA_SOCKET_NOT_SUPPORTED; - #endif - #ifdef EOPNOTSUPP - case EOPNOTSUPP: return MA_INVALID_OPERATION; - #endif - #ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return MA_PROTOCOL_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return MA_ADDRESS_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EADDRINUSE - case EADDRINUSE: return MA_ALREADY_IN_USE; - #endif - #ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return MA_ERROR; - #endif - #ifdef ENETDOWN - case ENETDOWN: return MA_NO_NETWORK; - #endif - #ifdef ENETUNREACH - case ENETUNREACH: return MA_NO_NETWORK; - #endif - #ifdef ENETRESET - case ENETRESET: return MA_NO_NETWORK; - #endif - #ifdef ECONNABORTED - case ECONNABORTED: return MA_NO_NETWORK; - #endif - #ifdef ECONNRESET - case ECONNRESET: return MA_CONNECTION_RESET; - #endif - #ifdef ENOBUFS - case ENOBUFS: return MA_NO_SPACE; - #endif - #ifdef EISCONN - case EISCONN: return MA_ALREADY_CONNECTED; - #endif - #ifdef ENOTCONN - case ENOTCONN: return MA_NOT_CONNECTED; - #endif - #ifdef ESHUTDOWN - case ESHUTDOWN: return MA_ERROR; - #endif - #ifdef ETOOMANYREFS - case ETOOMANYREFS: return MA_ERROR; - #endif - #ifdef ETIMEDOUT - case ETIMEDOUT: return MA_TIMEOUT; - #endif - #ifdef ECONNREFUSED - case ECONNREFUSED: return MA_CONNECTION_REFUSED; - #endif - #ifdef EHOSTDOWN - case EHOSTDOWN: return MA_NO_HOST; - #endif - #ifdef EHOSTUNREACH - case EHOSTUNREACH: return MA_NO_HOST; - #endif - #ifdef EALREADY - case EALREADY: return MA_IN_PROGRESS; - #endif - #ifdef EINPROGRESS - case EINPROGRESS: return MA_IN_PROGRESS; - #endif - #ifdef ESTALE - case ESTALE: return MA_INVALID_FILE; - #endif - #ifdef EUCLEAN - case EUCLEAN: return MA_ERROR; - #endif - #ifdef ENOTNAM - case ENOTNAM: return MA_ERROR; - #endif - #ifdef ENAVAIL - case ENAVAIL: return MA_ERROR; - #endif - #ifdef EISNAM - case EISNAM: return MA_ERROR; - #endif - #ifdef EREMOTEIO - case EREMOTEIO: return MA_IO_ERROR; - #endif - #ifdef EDQUOT - case EDQUOT: return MA_NO_SPACE; - #endif - #ifdef ENOMEDIUM - case ENOMEDIUM: return MA_DOES_NOT_EXIST; - #endif - #ifdef EMEDIUMTYPE - case EMEDIUMTYPE: return MA_ERROR; - #endif - #ifdef ECANCELED - case ECANCELED: return MA_CANCELLED; - #endif - #ifdef ENOKEY - case ENOKEY: return MA_ERROR; - #endif - #ifdef EKEYEXPIRED - case EKEYEXPIRED: return MA_ERROR; - #endif - #ifdef EKEYREVOKED - case EKEYREVOKED: return MA_ERROR; - #endif - #ifdef EKEYREJECTED - case EKEYREJECTED: return MA_ERROR; - #endif - #ifdef EOWNERDEAD - case EOWNERDEAD: return MA_ERROR; - #endif - #ifdef ENOTRECOVERABLE - case ENOTRECOVERABLE: return MA_ERROR; - #endif - #ifdef ERFKILL - case ERFKILL: return MA_ERROR; - #endif - #ifdef EHWPOISON - case EHWPOISON: return MA_ERROR; - #endif - default: return MA_ERROR; - } -} - -MA_API ma_result ma_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode) -{ -#if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err; -#endif - - if (ppFile != NULL) { - *ppFile = NULL; /* Safety. */ - } - - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - err = fopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return ma_result_from_errno(err); - } -#else -#if defined(_WIN32) || defined(__APPLE__) - *ppFile = fopen(pFilePath, pOpenMode); -#else - #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE) - *ppFile = fopen64(pFilePath, pOpenMode); - #else - *ppFile = fopen(pFilePath, pOpenMode); - #endif -#endif - if (*ppFile == NULL) { - ma_result result = ma_result_from_errno(errno); - if (result == MA_SUCCESS) { - result = MA_ERROR; /* Just a safety check to make sure we never ever return success when pFile == NULL. */ - } - - return result; - } -#endif - - return MA_SUCCESS; -} - - - -/* -_wfopen() isn't always available in all compilation environments. - - * Windows only. - * MSVC seems to support it universally as far back as VC6 from what I can tell (haven't checked further back). - * MinGW-64 (both 32- and 64-bit) seems to support it. - * MinGW wraps it in !defined(__STRICT_ANSI__). - * OpenWatcom wraps it in !defined(_NO_EXT_KEYS). - -This can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs() -fallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support. -*/ -#if defined(_WIN32) - #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) - #define MA_HAS_WFOPEN - #endif -#endif - -MA_API ma_result ma_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (ppFile != NULL) { - *ppFile = NULL; /* Safety. */ - } - - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(MA_HAS_WFOPEN) - { - /* Use _wfopen() on Windows. */ - #if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return ma_result_from_errno(err); - } - #else - *ppFile = _wfopen(pFilePath, pOpenMode); - if (*ppFile == NULL) { - return ma_result_from_errno(errno); - } - #endif - (void)pAllocationCallbacks; - } -#else - /* - Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can - think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for - maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility. - */ - { - mbstate_t mbs; - size_t lenMB; - const wchar_t* pFilePathTemp = pFilePath; - char* pFilePathMB = NULL; - char pOpenModeMB[32] = {0}; - - /* Get the length first. */ - MA_ZERO_OBJECT(&mbs); - lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs); - if (lenMB == (size_t)-1) { - return ma_result_from_errno(errno); - } - - pFilePathMB = (char*)ma_malloc(lenMB + 1, pAllocationCallbacks); - if (pFilePathMB == NULL) { - return MA_OUT_OF_MEMORY; - } - - pFilePathTemp = pFilePath; - MA_ZERO_OBJECT(&mbs); - wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs); - - /* The open mode should always consist of ASCII characters so we should be able to do a trivial conversion. */ - { - size_t i = 0; - for (;;) { - if (pOpenMode[i] == 0) { - pOpenModeMB[i] = '\0'; - break; - } - - pOpenModeMB[i] = (char)pOpenMode[i]; - i += 1; - } - } - - *ppFile = fopen(pFilePathMB, pOpenModeMB); - - ma_free(pFilePathMB, pAllocationCallbacks); - } - - if (*ppFile == NULL) { - return MA_ERROR; - } -#endif - - return MA_SUCCESS; -} - - - -static MA_INLINE void ma_copy_memory_64(void* dst, const void* src, ma_uint64 sizeInBytes) -{ -#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX - MA_COPY_MEMORY(dst, src, (size_t)sizeInBytes); -#else - while (sizeInBytes > 0) { - ma_uint64 bytesToCopyNow = sizeInBytes; - if (bytesToCopyNow > MA_SIZE_MAX) { - bytesToCopyNow = MA_SIZE_MAX; - } - - MA_COPY_MEMORY(dst, src, (size_t)bytesToCopyNow); /* Safe cast to size_t. */ - - sizeInBytes -= bytesToCopyNow; - dst = ( void*)(( ma_uint8*)dst + bytesToCopyNow); - src = (const void*)((const ma_uint8*)src + bytesToCopyNow); - } -#endif -} - -static MA_INLINE void ma_zero_memory_64(void* dst, ma_uint64 sizeInBytes) -{ -#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX - MA_ZERO_MEMORY(dst, (size_t)sizeInBytes); -#else - while (sizeInBytes > 0) { - ma_uint64 bytesToZeroNow = sizeInBytes; - if (bytesToZeroNow > MA_SIZE_MAX) { - bytesToZeroNow = MA_SIZE_MAX; - } - - MA_ZERO_MEMORY(dst, (size_t)bytesToZeroNow); /* Safe cast to size_t. */ - - sizeInBytes -= bytesToZeroNow; - dst = (void*)((ma_uint8*)dst + bytesToZeroNow); - } -#endif -} - - -/* Thanks to good old Bit Twiddling Hacks for this one: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */ -static MA_INLINE unsigned int ma_next_power_of_2(unsigned int x) -{ - x--; - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; - x++; - - return x; -} - -static MA_INLINE unsigned int ma_prev_power_of_2(unsigned int x) -{ - return ma_next_power_of_2(x) >> 1; -} - -static MA_INLINE unsigned int ma_round_to_power_of_2(unsigned int x) -{ - unsigned int prev = ma_prev_power_of_2(x); - unsigned int next = ma_next_power_of_2(x); - if ((next - x) > (x - prev)) { - return prev; - } else { - return next; - } -} - -static MA_INLINE unsigned int ma_count_set_bits(unsigned int x) -{ - unsigned int count = 0; - while (x != 0) { - if (x & 1) { - count += 1; - } - - x = x >> 1; - } - - return count; -} - - - -/************************************************************************************************************************************************************** - -Allocation Callbacks - -**************************************************************************************************************************************************************/ -static void* ma__malloc_default(size_t sz, void* pUserData) -{ - (void)pUserData; - return MA_MALLOC(sz); -} - -static void* ma__realloc_default(void* p, size_t sz, void* pUserData) -{ - (void)pUserData; - return MA_REALLOC(p, sz); -} - -static void ma__free_default(void* p, void* pUserData) -{ - (void)pUserData; - MA_FREE(p); -} - -static ma_allocation_callbacks ma_allocation_callbacks_init_default(void) -{ - ma_allocation_callbacks callbacks; - callbacks.pUserData = NULL; - callbacks.onMalloc = ma__malloc_default; - callbacks.onRealloc = ma__realloc_default; - callbacks.onFree = ma__free_default; - - return callbacks; -} - -static ma_result ma_allocation_callbacks_init_copy(ma_allocation_callbacks* pDst, const ma_allocation_callbacks* pSrc) -{ - if (pDst == NULL) { - return MA_INVALID_ARGS; - } - - if (pSrc == NULL) { - *pDst = ma_allocation_callbacks_init_default(); - } else { - if (pSrc->pUserData == NULL && pSrc->onFree == NULL && pSrc->onMalloc == NULL && pSrc->onRealloc == NULL) { - *pDst = ma_allocation_callbacks_init_default(); - } else { - if (pSrc->onFree == NULL || (pSrc->onMalloc == NULL && pSrc->onRealloc == NULL)) { - return MA_INVALID_ARGS; /* Invalid allocation callbacks. */ - } else { - *pDst = *pSrc; - } - } - } - - return MA_SUCCESS; -} - - - - -/************************************************************************************************************************************************************** - -Logging - -**************************************************************************************************************************************************************/ -MA_API const char* ma_log_level_to_string(ma_uint32 logLevel) -{ - switch (logLevel) - { - case MA_LOG_LEVEL_DEBUG: return "DEBUG"; - case MA_LOG_LEVEL_INFO: return "INFO"; - case MA_LOG_LEVEL_WARNING: return "WARNING"; - case MA_LOG_LEVEL_ERROR: return "ERROR"; - default: return "ERROR"; - } -} - -#if defined(MA_DEBUG_OUTPUT) - -/* Customize this to use a specific tag in __android_log_print() for debug output messages. */ -#ifndef MA_ANDROID_LOG_TAG -#define MA_ANDROID_LOG_TAG "miniaudio" -#endif - -void ma_log_callback_debug(void* pUserData, ma_uint32 level, const char* pMessage) -{ - (void)pUserData; - - /* Special handling for some platforms. */ - #if defined(MA_ANDROID) - { - /* Android. */ - __android_log_print(ANDROID_LOG_DEBUG, MA_ANDROID_LOG_TAG, "%s: %s", ma_log_level_to_string(level), pMessage); - } - #else - { - /* Everything else. */ - printf("%s: %s", ma_log_level_to_string(level), pMessage); - } - #endif -} -#endif - -MA_API ma_log_callback ma_log_callback_init(ma_log_callback_proc onLog, void* pUserData) -{ - ma_log_callback callback; - - MA_ZERO_OBJECT(&callback); - callback.onLog = onLog; - callback.pUserData = pUserData; - - return callback; -} - - -MA_API ma_result ma_log_init(const ma_allocation_callbacks* pAllocationCallbacks, ma_log* pLog) -{ - if (pLog == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pLog); - ma_allocation_callbacks_init_copy(&pLog->allocationCallbacks, pAllocationCallbacks); - - /* We need a mutex for thread safety. */ - #ifndef MA_NO_THREADING - { - ma_result result = ma_mutex_init(&pLog->lock); - if (result != MA_SUCCESS) { - return result; - } - } - #endif - - /* If we're using debug output, enable it. */ - #if defined(MA_DEBUG_OUTPUT) - { - ma_log_register_callback(pLog, ma_log_callback_init(ma_log_callback_debug, NULL)); /* Doesn't really matter if this fails. */ - } - #endif - - return MA_SUCCESS; -} - -MA_API void ma_log_uninit(ma_log* pLog) -{ - if (pLog == NULL) { - return; - } - -#ifndef MA_NO_THREADING - ma_mutex_uninit(&pLog->lock); -#endif -} - -static void ma_log_lock(ma_log* pLog) -{ -#ifndef MA_NO_THREADING - ma_mutex_lock(&pLog->lock); -#else - (void)pLog; -#endif -} - -static void ma_log_unlock(ma_log* pLog) -{ -#ifndef MA_NO_THREADING - ma_mutex_unlock(&pLog->lock); -#else - (void)pLog; -#endif -} - -MA_API ma_result ma_log_register_callback(ma_log* pLog, ma_log_callback callback) -{ - ma_result result = MA_SUCCESS; - - if (pLog == NULL || callback.onLog == NULL) { - return MA_INVALID_ARGS; - } - - ma_log_lock(pLog); - { - if (pLog->callbackCount == ma_countof(pLog->callbacks)) { - result = MA_OUT_OF_MEMORY; /* Reached the maximum allowed log callbacks. */ - } else { - pLog->callbacks[pLog->callbackCount] = callback; - pLog->callbackCount += 1; - } - } - ma_log_unlock(pLog); - - return result; -} - -MA_API ma_result ma_log_unregister_callback(ma_log* pLog, ma_log_callback callback) -{ - if (pLog == NULL) { - return MA_INVALID_ARGS; - } - - ma_log_lock(pLog); - { - ma_uint32 iLog; - for (iLog = 0; iLog < pLog->callbackCount; ) { - if (pLog->callbacks[iLog].onLog == callback.onLog) { - /* Found. Move everything down a slot. */ - ma_uint32 jLog; - for (jLog = iLog; jLog < pLog->callbackCount-1; jLog += 1) { - pLog->callbacks[jLog] = pLog->callbacks[jLog + 1]; - } - - pLog->callbackCount -= 1; - } else { - /* Not found. */ - iLog += 1; - } - } - } - ma_log_unlock(pLog); - - return MA_SUCCESS; -} - -MA_API ma_result ma_log_post(ma_log* pLog, ma_uint32 level, const char* pMessage) -{ - if (pLog == NULL || pMessage == NULL) { - return MA_INVALID_ARGS; - } - - ma_log_lock(pLog); - { - ma_uint32 iLog; - for (iLog = 0; iLog < pLog->callbackCount; iLog += 1) { - if (pLog->callbacks[iLog].onLog) { - pLog->callbacks[iLog].onLog(pLog->callbacks[iLog].pUserData, level, pMessage); - } - } - } - ma_log_unlock(pLog); - - return MA_SUCCESS; -} - - -/* -We need to emulate _vscprintf() for the VC6 build. This can be more efficient, but since it's only VC6, and it's just a -logging function, I'm happy to keep this simple. In the VC6 build we can implement this in terms of _vsnprintf(). -*/ -#if defined(_MSC_VER) && _MSC_VER < 1900 -static int ma_vscprintf(const ma_allocation_callbacks* pAllocationCallbacks, const char* format, va_list args) -{ -#if _MSC_VER > 1200 - return _vscprintf(format, args); -#else - int result; - char* pTempBuffer = NULL; - size_t tempBufferCap = 1024; - - if (format == NULL) { - errno = EINVAL; - return -1; - } - - for (;;) { - char* pNewTempBuffer = (char*)ma_realloc(pTempBuffer, tempBufferCap, pAllocationCallbacks); - if (pNewTempBuffer == NULL) { - ma_free(pTempBuffer, pAllocationCallbacks); - errno = ENOMEM; - return -1; /* Out of memory. */ - } - - pTempBuffer = pNewTempBuffer; - - result = _vsnprintf(pTempBuffer, tempBufferCap, format, args); - ma_free(pTempBuffer, NULL); - - if (result != -1) { - break; /* Got it. */ - } - - /* Buffer wasn't big enough. Ideally it'd be nice to use an error code to know the reason for sure, but this is reliable enough. */ - tempBufferCap *= 2; - } - - return result; -#endif -} -#endif - -MA_API ma_result ma_log_postv(ma_log* pLog, ma_uint32 level, const char* pFormat, va_list args) -{ - if (pLog == NULL || pFormat == NULL) { - return MA_INVALID_ARGS; - } - - #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || ((!defined(_MSC_VER) || _MSC_VER >= 1900) && !defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) - { - ma_result result; - int length; - char pFormattedMessageStack[1024]; - char* pFormattedMessageHeap = NULL; - - /* First try formatting into our fixed sized stack allocated buffer. If this is too small we'll fallback to a heap allocation. */ - length = vsnprintf(pFormattedMessageStack, sizeof(pFormattedMessageStack), pFormat, args); - if (length < 0) { - return MA_INVALID_OPERATION; /* An error occured when trying to convert the buffer. */ - } - - if ((size_t)length < sizeof(pFormattedMessageStack)) { - /* The string was written to the stack. */ - result = ma_log_post(pLog, level, pFormattedMessageStack); - } else { - /* The stack buffer was too small, try the heap. */ - pFormattedMessageHeap = (char*)ma_malloc(length + 1, &pLog->allocationCallbacks); - if (pFormattedMessageHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - - length = vsnprintf(pFormattedMessageHeap, length + 1, pFormat, args); - if (length < 0) { - ma_free(pFormattedMessageHeap, &pLog->allocationCallbacks); - return MA_INVALID_OPERATION; - } - - result = ma_log_post(pLog, level, pFormattedMessageHeap); - ma_free(pFormattedMessageHeap, &pLog->allocationCallbacks); - } - - return result; - } - #else - { - /* - Without snprintf() we need to first measure the string and then heap allocate it. I'm only aware of Visual Studio having support for this without snprintf(), so we'll - need to restrict this branch to Visual Studio. For other compilers we need to just not support formatted logging because I don't want the security risk of overflowing - a fixed sized stack allocated buffer. - */ - #if defined(_MSC_VER) && _MSC_VER >= 1200 /* 1200 = VC6 */ - { - ma_result result; - int formattedLen; - char* pFormattedMessage = NULL; - va_list args2; - - #if _MSC_VER >= 1800 - { - va_copy(args2, args); - } - #else - { - args2 = args; - } - #endif - - formattedLen = ma_vscprintf(&pLog->allocationCallbacks, pFormat, args2); - va_end(args2); - - if (formattedLen <= 0) { - return MA_INVALID_OPERATION; - } - - pFormattedMessage = (char*)ma_malloc(formattedLen + 1, &pLog->allocationCallbacks); - if (pFormattedMessage == NULL) { - return MA_OUT_OF_MEMORY; - } - - /* We'll get errors on newer versions of Visual Studio if we try to use vsprintf(). */ - #if _MSC_VER >= 1400 /* 1400 = Visual Studio 2005 */ - { - vsprintf_s(pFormattedMessage, formattedLen + 1, pFormat, args); - } - #else - { - vsprintf(pFormattedMessage, pFormat, args); - } - #endif - - result = ma_log_post(pLog, level, pFormattedMessage); - ma_free(pFormattedMessage, &pLog->allocationCallbacks); - - return result; - } - #else - { - /* Can't do anything because we don't have a safe way of to emulate vsnprintf() without a manual solution. */ - (void)level; - (void)args; - - return MA_INVALID_OPERATION; - } - #endif - } - #endif -} - -MA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat, ...) -{ - ma_result result; - va_list args; - - if (pLog == NULL || pFormat == NULL) { - return MA_INVALID_ARGS; - } - - va_start(args, pFormat); - { - result = ma_log_postv(pLog, level, pFormat, args); - } - va_end(args); - - return result; -} - - - -static MA_INLINE ma_uint8 ma_clip_u8(ma_int32 x) -{ - return (ma_uint8)(ma_clamp(x, -128, 127) + 128); -} - -static MA_INLINE ma_int16 ma_clip_s16(ma_int32 x) -{ - return (ma_int16)ma_clamp(x, -32768, 32767); -} - -static MA_INLINE ma_int64 ma_clip_s24(ma_int64 x) -{ - return (ma_int64)ma_clamp(x, -8388608, 8388607); -} - -static MA_INLINE ma_int32 ma_clip_s32(ma_int64 x) -{ - /* This dance is to silence warnings with -std=c89. A good compiler should be able to optimize this away. */ - ma_int64 clipMin; - ma_int64 clipMax; - clipMin = -((ma_int64)2147483647 + 1); - clipMax = (ma_int64)2147483647; - - return (ma_int32)ma_clamp(x, clipMin, clipMax); -} - -static MA_INLINE float ma_clip_f32(float x) -{ - if (x < -1) return -1; - if (x > +1) return +1; - return x; -} - - -static MA_INLINE float ma_mix_f32(float x, float y, float a) -{ - return x*(1-a) + y*a; -} -static MA_INLINE float ma_mix_f32_fast(float x, float y, float a) -{ - float r0 = (y - x); - float r1 = r0*a; - return x + r1; - /*return x + (y - x)*a;*/ -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE __m128 ma_mix_f32_fast__sse2(__m128 x, __m128 y, __m128 a) -{ - return _mm_add_ps(x, _mm_mul_ps(_mm_sub_ps(y, x), a)); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE __m256 ma_mix_f32_fast__avx2(__m256 x, __m256 y, __m256 a) -{ - return _mm256_add_ps(x, _mm256_mul_ps(_mm256_sub_ps(y, x), a)); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE float32x4_t ma_mix_f32_fast__neon(float32x4_t x, float32x4_t y, float32x4_t a) -{ - return vaddq_f32(x, vmulq_f32(vsubq_f32(y, x), a)); -} -#endif - - -static MA_INLINE double ma_mix_f64(double x, double y, double a) -{ - return x*(1-a) + y*a; -} -static MA_INLINE double ma_mix_f64_fast(double x, double y, double a) -{ - return x + (y - x)*a; -} - -static MA_INLINE float ma_scale_to_range_f32(float x, float lo, float hi) -{ - return lo + x*(hi-lo); -} - - -/* -Greatest common factor using Euclid's algorithm iteratively. -*/ -static MA_INLINE ma_uint32 ma_gcf_u32(ma_uint32 a, ma_uint32 b) -{ - for (;;) { - if (b == 0) { - break; - } else { - ma_uint32 t = a; - a = b; - b = t % a; - } - } - - return a; -} - - -static ma_uint32 ma_ffs_32(ma_uint32 x) -{ - ma_uint32 i; - - /* Just a naive implementation just to get things working for now. Will optimize this later. */ - for (i = 0; i < 32; i += 1) { - if ((x & (1 << i)) != 0) { - return i; - } - } - - return i; -} - -static MA_INLINE ma_int16 ma_float_to_fixed_16(float x) -{ - return (ma_int16)(x * (1 << 8)); -} - - - -/* -Random Number Generation - -miniaudio uses the LCG random number generation algorithm. This is good enough for audio. - -Note that miniaudio's global LCG implementation uses global state which is _not_ thread-local. When this is called across -multiple threads, results will be unpredictable. However, it won't crash and results will still be random enough for -miniaudio's purposes. -*/ -#ifndef MA_DEFAULT_LCG_SEED -#define MA_DEFAULT_LCG_SEED 4321 -#endif - -#define MA_LCG_M 2147483647 -#define MA_LCG_A 48271 -#define MA_LCG_C 0 - -static ma_lcg g_maLCG = {MA_DEFAULT_LCG_SEED}; /* Non-zero initial seed. Use ma_seed() to use an explicit seed. */ - -static MA_INLINE void ma_lcg_seed(ma_lcg* pLCG, ma_int32 seed) -{ - MA_ASSERT(pLCG != NULL); - pLCG->state = seed; -} - -static MA_INLINE ma_int32 ma_lcg_rand_s32(ma_lcg* pLCG) -{ - pLCG->state = (MA_LCG_A * pLCG->state + MA_LCG_C) % MA_LCG_M; - return pLCG->state; -} - -static MA_INLINE ma_uint32 ma_lcg_rand_u32(ma_lcg* pLCG) -{ - return (ma_uint32)ma_lcg_rand_s32(pLCG); -} - -static MA_INLINE ma_int16 ma_lcg_rand_s16(ma_lcg* pLCG) -{ - return (ma_int16)(ma_lcg_rand_s32(pLCG) & 0xFFFF); -} - -static MA_INLINE double ma_lcg_rand_f64(ma_lcg* pLCG) -{ - return ma_lcg_rand_s32(pLCG) / (double)0x7FFFFFFF; -} - -static MA_INLINE float ma_lcg_rand_f32(ma_lcg* pLCG) -{ - return (float)ma_lcg_rand_f64(pLCG); -} - -static MA_INLINE float ma_lcg_rand_range_f32(ma_lcg* pLCG, float lo, float hi) -{ - return ma_scale_to_range_f32(ma_lcg_rand_f32(pLCG), lo, hi); -} - -static MA_INLINE ma_int32 ma_lcg_rand_range_s32(ma_lcg* pLCG, ma_int32 lo, ma_int32 hi) -{ - if (lo == hi) { - return lo; - } - - return lo + ma_lcg_rand_u32(pLCG) / (0xFFFFFFFF / (hi - lo + 1) + 1); -} - - - -static MA_INLINE void ma_seed(ma_int32 seed) -{ - ma_lcg_seed(&g_maLCG, seed); -} - -static MA_INLINE ma_int32 ma_rand_s32(void) -{ - return ma_lcg_rand_s32(&g_maLCG); -} - -static MA_INLINE ma_uint32 ma_rand_u32(void) -{ - return ma_lcg_rand_u32(&g_maLCG); -} - -static MA_INLINE double ma_rand_f64(void) -{ - return ma_lcg_rand_f64(&g_maLCG); -} - -static MA_INLINE float ma_rand_f32(void) -{ - return ma_lcg_rand_f32(&g_maLCG); -} - -static MA_INLINE float ma_rand_range_f32(float lo, float hi) -{ - return ma_lcg_rand_range_f32(&g_maLCG, lo, hi); -} - -static MA_INLINE ma_int32 ma_rand_range_s32(ma_int32 lo, ma_int32 hi) -{ - return ma_lcg_rand_range_s32(&g_maLCG, lo, hi); -} - - -static MA_INLINE float ma_dither_f32_rectangle(float ditherMin, float ditherMax) -{ - return ma_rand_range_f32(ditherMin, ditherMax); -} - -static MA_INLINE float ma_dither_f32_triangle(float ditherMin, float ditherMax) -{ - float a = ma_rand_range_f32(ditherMin, 0); - float b = ma_rand_range_f32(0, ditherMax); - return a + b; -} - -static MA_INLINE float ma_dither_f32(ma_dither_mode ditherMode, float ditherMin, float ditherMax) -{ - if (ditherMode == ma_dither_mode_rectangle) { - return ma_dither_f32_rectangle(ditherMin, ditherMax); - } - if (ditherMode == ma_dither_mode_triangle) { - return ma_dither_f32_triangle(ditherMin, ditherMax); - } - - return 0; -} - -static MA_INLINE ma_int32 ma_dither_s32(ma_dither_mode ditherMode, ma_int32 ditherMin, ma_int32 ditherMax) -{ - if (ditherMode == ma_dither_mode_rectangle) { - ma_int32 a = ma_rand_range_s32(ditherMin, ditherMax); - return a; - } - if (ditherMode == ma_dither_mode_triangle) { - ma_int32 a = ma_rand_range_s32(ditherMin, 0); - ma_int32 b = ma_rand_range_s32(0, ditherMax); - return a + b; - } - - return 0; -} - - -/************************************************************************************************************************************************************** - -Atomics - -**************************************************************************************************************************************************************/ -/* c89atomic.h begin */ -#ifndef c89atomic_h -#define c89atomic_h -#if defined(__cplusplus) -extern "C" { -#endif -typedef signed char c89atomic_int8; -typedef unsigned char c89atomic_uint8; -typedef signed short c89atomic_int16; -typedef unsigned short c89atomic_uint16; -typedef signed int c89atomic_int32; -typedef unsigned int c89atomic_uint32; -#if defined(_MSC_VER) && !defined(__clang__) - typedef signed __int64 c89atomic_int64; - typedef unsigned __int64 c89atomic_uint64; -#else - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wlong-long" - #if defined(__clang__) - #pragma GCC diagnostic ignored "-Wc++11-long-long" - #endif - #endif - typedef signed long long c89atomic_int64; - typedef unsigned long long c89atomic_uint64; - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic pop - #endif -#endif -typedef int c89atomic_memory_order; -typedef unsigned char c89atomic_bool; -#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT) -#ifdef _WIN32 -#ifdef _WIN64 -#define C89ATOMIC_64BIT -#else -#define C89ATOMIC_32BIT -#endif -#endif -#endif -#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT) -#ifdef __GNUC__ -#ifdef __LP64__ -#define C89ATOMIC_64BIT -#else -#define C89ATOMIC_32BIT -#endif -#endif -#endif -#if !defined(C89ATOMIC_64BIT) && !defined(C89ATOMIC_32BIT) -#include -#if INTPTR_MAX == INT64_MAX -#define C89ATOMIC_64BIT -#else -#define C89ATOMIC_32BIT -#endif -#endif -#if defined(__x86_64__) || defined(_M_X64) -#define C89ATOMIC_X64 -#elif defined(__i386) || defined(_M_IX86) -#define C89ATOMIC_X86 -#elif defined(__arm__) || defined(_M_ARM) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) -#define C89ATOMIC_ARM -#endif -#if defined(_MSC_VER) - #define C89ATOMIC_INLINE __forceinline -#elif defined(__GNUC__) - #if defined(__STRICT_ANSI__) - #define C89ATOMIC_INLINE __inline__ __attribute__((always_inline)) - #else - #define C89ATOMIC_INLINE inline __attribute__((always_inline)) - #endif -#elif defined(__WATCOMC__) || defined(__DMC__) - #define C89ATOMIC_INLINE __inline -#else - #define C89ATOMIC_INLINE -#endif -#define C89ATOMIC_HAS_8 -#define C89ATOMIC_HAS_16 -#define C89ATOMIC_HAS_32 -#define C89ATOMIC_HAS_64 -#if (defined(_MSC_VER) ) || defined(__WATCOMC__) || defined(__DMC__) - #define c89atomic_memory_order_relaxed 0 - #define c89atomic_memory_order_consume 1 - #define c89atomic_memory_order_acquire 2 - #define c89atomic_memory_order_release 3 - #define c89atomic_memory_order_acq_rel 4 - #define c89atomic_memory_order_seq_cst 5 - #if _MSC_VER < 1600 && defined(C89ATOMIC_X86) - #define C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY - #endif - #if _MSC_VER < 1600 - #undef C89ATOMIC_HAS_8 - #undef C89ATOMIC_HAS_16 - #endif - #if !defined(C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #include - #endif - #if defined(C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_compare_and_swap_8(volatile c89atomic_uint8* dst, c89atomic_uint8 expected, c89atomic_uint8 desired) - { - c89atomic_uint8 result = 0; - __asm { - mov ecx, dst - mov al, expected - mov dl, desired - lock cmpxchg [ecx], dl - mov result, al - } - return result; - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_compare_and_swap_16(volatile c89atomic_uint16* dst, c89atomic_uint16 expected, c89atomic_uint16 desired) - { - c89atomic_uint16 result = 0; - __asm { - mov ecx, dst - mov ax, expected - mov dx, desired - lock cmpxchg [ecx], dx - mov result, ax - } - return result; - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_compare_and_swap_32(volatile c89atomic_uint32* dst, c89atomic_uint32 expected, c89atomic_uint32 desired) - { - c89atomic_uint32 result = 0; - __asm { - mov ecx, dst - mov eax, expected - mov edx, desired - lock cmpxchg [ecx], edx - mov result, eax - } - return result; - } - #endif - #if defined(C89ATOMIC_HAS_64) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_compare_and_swap_64(volatile c89atomic_uint64* dst, c89atomic_uint64 expected, c89atomic_uint64 desired) - { - c89atomic_uint32 resultEAX = 0; - c89atomic_uint32 resultEDX = 0; - __asm { - mov esi, dst - mov eax, dword ptr expected - mov edx, dword ptr expected + 4 - mov ebx, dword ptr desired - mov ecx, dword ptr desired + 4 - lock cmpxchg8b qword ptr [esi] - mov resultEAX, eax - mov resultEDX, edx - } - return ((c89atomic_uint64)resultEDX << 32) | resultEAX; - } - #endif - #else - #if defined(C89ATOMIC_HAS_8) - #define c89atomic_compare_and_swap_8( dst, expected, desired) (c89atomic_uint8 )_InterlockedCompareExchange8((volatile char*)dst, (char)desired, (char)expected) - #endif - #if defined(C89ATOMIC_HAS_16) - #define c89atomic_compare_and_swap_16(dst, expected, desired) (c89atomic_uint16)_InterlockedCompareExchange16((volatile short*)dst, (short)desired, (short)expected) - #endif - #if defined(C89ATOMIC_HAS_32) - #define c89atomic_compare_and_swap_32(dst, expected, desired) (c89atomic_uint32)_InterlockedCompareExchange((volatile long*)dst, (long)desired, (long)expected) - #endif - #if defined(C89ATOMIC_HAS_64) - #define c89atomic_compare_and_swap_64(dst, expected, desired) (c89atomic_uint64)_InterlockedCompareExchange64((volatile c89atomic_int64*)dst, (c89atomic_int64)desired, (c89atomic_int64)expected) - #endif - #endif - #if defined(C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 result = 0; - (void)order; - __asm { - mov ecx, dst - mov al, src - lock xchg [ecx], al - mov result, al - } - return result; - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 result = 0; - (void)order; - __asm { - mov ecx, dst - mov ax, src - lock xchg [ecx], ax - mov result, ax - } - return result; - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 result = 0; - (void)order; - __asm { - mov ecx, dst - mov eax, src - lock xchg [ecx], eax - mov result, eax - } - return result; - } - #endif - #else - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint8)_InterlockedExchange8((volatile char*)dst, (char)src); - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint16)_InterlockedExchange16((volatile short*)dst, (short)src); - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint32)_InterlockedExchange((volatile long*)dst, (long)src); - } - #endif - #if defined(C89ATOMIC_HAS_64) && defined(C89ATOMIC_64BIT) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint64)_InterlockedExchange64((volatile long long*)dst, (long long)src); - } - #else - #endif - #endif - #if defined(C89ATOMIC_HAS_64) && !defined(C89ATOMIC_64BIT) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - do { - oldValue = *dst; - } while (c89atomic_compare_and_swap_64(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_add_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 result = 0; - (void)order; - __asm { - mov ecx, dst - mov al, src - lock xadd [ecx], al - mov result, al - } - return result; - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_add_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 result = 0; - (void)order; - __asm { - mov ecx, dst - mov ax, src - lock xadd [ecx], ax - mov result, ax - } - return result; - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_add_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 result = 0; - (void)order; - __asm { - mov ecx, dst - mov eax, src - lock xadd [ecx], eax - mov result, eax - } - return result; - } - #endif - #else - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_add_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint8)_InterlockedExchangeAdd8((volatile char*)dst, (char)src); - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_add_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint16)_InterlockedExchangeAdd16((volatile short*)dst, (short)src); - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_add_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint32)_InterlockedExchangeAdd((volatile long*)dst, (long)src); - } - #endif - #if defined(C89ATOMIC_HAS_64) && defined(C89ATOMIC_64BIT) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_add_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - (void)order; - return (c89atomic_uint64)_InterlockedExchangeAdd64((volatile long long*)dst, (long long)src); - } - #else - #endif - #endif - #if defined(C89ATOMIC_HAS_64) && !defined(C89ATOMIC_64BIT) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_add_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue + src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_MSVC_USE_INLINED_ASSEMBLY) - static C89ATOMIC_INLINE void __stdcall c89atomic_thread_fence(c89atomic_memory_order order) - { - (void)order; - __asm { - lock add [esp], 0 - } - } - #else - #if defined(C89ATOMIC_X64) - #define c89atomic_thread_fence(order) __faststorefence(), (void)order - #else - static C89ATOMIC_INLINE void c89atomic_thread_fence(c89atomic_memory_order order) - { - volatile c89atomic_uint32 barrier = 0; - c89atomic_fetch_add_explicit_32(&barrier, 0, order); - } - #endif - #endif - #define c89atomic_compiler_fence() c89atomic_thread_fence(c89atomic_memory_order_seq_cst) - #define c89atomic_signal_fence(order) c89atomic_thread_fence(order) - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_load_explicit_8(volatile const c89atomic_uint8* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_8((volatile c89atomic_uint8*)ptr, 0, 0); - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_load_explicit_16(volatile const c89atomic_uint16* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_16((volatile c89atomic_uint16*)ptr, 0, 0); - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_load_explicit_32(volatile const c89atomic_uint32* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_32((volatile c89atomic_uint32*)ptr, 0, 0); - } - #endif - #if defined(C89ATOMIC_HAS_64) - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_load_explicit_64(volatile const c89atomic_uint64* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_64((volatile c89atomic_uint64*)ptr, 0, 0); - } - #endif - #if defined(C89ATOMIC_HAS_8) - #define c89atomic_store_explicit_8( dst, src, order) (void)c89atomic_exchange_explicit_8 (dst, src, order) - #endif - #if defined(C89ATOMIC_HAS_16) - #define c89atomic_store_explicit_16(dst, src, order) (void)c89atomic_exchange_explicit_16(dst, src, order) - #endif - #if defined(C89ATOMIC_HAS_32) - #define c89atomic_store_explicit_32(dst, src, order) (void)c89atomic_exchange_explicit_32(dst, src, order) - #endif - #if defined(C89ATOMIC_HAS_64) - #define c89atomic_store_explicit_64(dst, src, order) (void)c89atomic_exchange_explicit_64(dst, src, order) - #endif - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_sub_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue - src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_sub_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue - src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_sub_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_64) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_sub_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_and_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue & src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_and_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue & src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_and_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_64) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_and_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_xor_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue ^ src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_xor_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue ^ src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_xor_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_64) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_xor_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_8) - static C89ATOMIC_INLINE c89atomic_uint8 __stdcall c89atomic_fetch_or_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue | src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_16) - static C89ATOMIC_INLINE c89atomic_uint16 __stdcall c89atomic_fetch_or_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue | src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_32) - static C89ATOMIC_INLINE c89atomic_uint32 __stdcall c89atomic_fetch_or_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_64) - static C89ATOMIC_INLINE c89atomic_uint64 __stdcall c89atomic_fetch_or_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #if defined(C89ATOMIC_HAS_8) - #define c89atomic_test_and_set_explicit_8( dst, order) c89atomic_exchange_explicit_8 (dst, 1, order) - #endif - #if defined(C89ATOMIC_HAS_16) - #define c89atomic_test_and_set_explicit_16(dst, order) c89atomic_exchange_explicit_16(dst, 1, order) - #endif - #if defined(C89ATOMIC_HAS_32) - #define c89atomic_test_and_set_explicit_32(dst, order) c89atomic_exchange_explicit_32(dst, 1, order) - #endif - #if defined(C89ATOMIC_HAS_64) - #define c89atomic_test_and_set_explicit_64(dst, order) c89atomic_exchange_explicit_64(dst, 1, order) - #endif - #if defined(C89ATOMIC_HAS_8) - #define c89atomic_clear_explicit_8( dst, order) c89atomic_store_explicit_8 (dst, 0, order) - #endif - #if defined(C89ATOMIC_HAS_16) - #define c89atomic_clear_explicit_16(dst, order) c89atomic_store_explicit_16(dst, 0, order) - #endif - #if defined(C89ATOMIC_HAS_32) - #define c89atomic_clear_explicit_32(dst, order) c89atomic_store_explicit_32(dst, 0, order) - #endif - #if defined(C89ATOMIC_HAS_64) - #define c89atomic_clear_explicit_64(dst, order) c89atomic_store_explicit_64(dst, 0, order) - #endif - #if defined(C89ATOMIC_HAS_8) - typedef c89atomic_uint8 c89atomic_flag; - #define c89atomic_flag_test_and_set_explicit(ptr, order) (c89atomic_bool)c89atomic_test_and_set_explicit_8(ptr, order) - #define c89atomic_flag_clear_explicit(ptr, order) c89atomic_clear_explicit_8(ptr, order) - #define c89atoimc_flag_load_explicit(ptr, order) c89atomic_load_explicit_8(ptr, order) - #else - typedef c89atomic_uint32 c89atomic_flag; - #define c89atomic_flag_test_and_set_explicit(ptr, order) (c89atomic_bool)c89atomic_test_and_set_explicit_32(ptr, order) - #define c89atomic_flag_clear_explicit(ptr, order) c89atomic_clear_explicit_32(ptr, order) - #define c89atoimc_flag_load_explicit(ptr, order) c89atomic_load_explicit_32(ptr, order) - #endif -#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) - #define C89ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE - #define C89ATOMIC_HAS_NATIVE_IS_LOCK_FREE - #define c89atomic_memory_order_relaxed __ATOMIC_RELAXED - #define c89atomic_memory_order_consume __ATOMIC_CONSUME - #define c89atomic_memory_order_acquire __ATOMIC_ACQUIRE - #define c89atomic_memory_order_release __ATOMIC_RELEASE - #define c89atomic_memory_order_acq_rel __ATOMIC_ACQ_REL - #define c89atomic_memory_order_seq_cst __ATOMIC_SEQ_CST - #define c89atomic_compiler_fence() __asm__ __volatile__("":::"memory") - #define c89atomic_thread_fence(order) __atomic_thread_fence(order) - #define c89atomic_signal_fence(order) __atomic_signal_fence(order) - #define c89atomic_is_lock_free_8(ptr) __atomic_is_lock_free(1, ptr) - #define c89atomic_is_lock_free_16(ptr) __atomic_is_lock_free(2, ptr) - #define c89atomic_is_lock_free_32(ptr) __atomic_is_lock_free(4, ptr) - #define c89atomic_is_lock_free_64(ptr) __atomic_is_lock_free(8, ptr) - #define c89atomic_test_and_set_explicit_8( dst, order) __atomic_exchange_n(dst, 1, order) - #define c89atomic_test_and_set_explicit_16(dst, order) __atomic_exchange_n(dst, 1, order) - #define c89atomic_test_and_set_explicit_32(dst, order) __atomic_exchange_n(dst, 1, order) - #define c89atomic_test_and_set_explicit_64(dst, order) __atomic_exchange_n(dst, 1, order) - #define c89atomic_clear_explicit_8( dst, order) __atomic_store_n(dst, 0, order) - #define c89atomic_clear_explicit_16(dst, order) __atomic_store_n(dst, 0, order) - #define c89atomic_clear_explicit_32(dst, order) __atomic_store_n(dst, 0, order) - #define c89atomic_clear_explicit_64(dst, order) __atomic_store_n(dst, 0, order) - #define c89atomic_store_explicit_8( dst, src, order) __atomic_store_n(dst, src, order) - #define c89atomic_store_explicit_16(dst, src, order) __atomic_store_n(dst, src, order) - #define c89atomic_store_explicit_32(dst, src, order) __atomic_store_n(dst, src, order) - #define c89atomic_store_explicit_64(dst, src, order) __atomic_store_n(dst, src, order) - #define c89atomic_load_explicit_8( dst, order) __atomic_load_n(dst, order) - #define c89atomic_load_explicit_16(dst, order) __atomic_load_n(dst, order) - #define c89atomic_load_explicit_32(dst, order) __atomic_load_n(dst, order) - #define c89atomic_load_explicit_64(dst, order) __atomic_load_n(dst, order) - #define c89atomic_exchange_explicit_8( dst, src, order) __atomic_exchange_n(dst, src, order) - #define c89atomic_exchange_explicit_16(dst, src, order) __atomic_exchange_n(dst, src, order) - #define c89atomic_exchange_explicit_32(dst, src, order) __atomic_exchange_n(dst, src, order) - #define c89atomic_exchange_explicit_64(dst, src, order) __atomic_exchange_n(dst, src, order) - #define c89atomic_compare_exchange_strong_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define c89atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define c89atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define c89atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder) - #define c89atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) - #define c89atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) - #define c89atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) - #define c89atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder) - #define c89atomic_fetch_add_explicit_8( dst, src, order) __atomic_fetch_add(dst, src, order) - #define c89atomic_fetch_add_explicit_16(dst, src, order) __atomic_fetch_add(dst, src, order) - #define c89atomic_fetch_add_explicit_32(dst, src, order) __atomic_fetch_add(dst, src, order) - #define c89atomic_fetch_add_explicit_64(dst, src, order) __atomic_fetch_add(dst, src, order) - #define c89atomic_fetch_sub_explicit_8( dst, src, order) __atomic_fetch_sub(dst, src, order) - #define c89atomic_fetch_sub_explicit_16(dst, src, order) __atomic_fetch_sub(dst, src, order) - #define c89atomic_fetch_sub_explicit_32(dst, src, order) __atomic_fetch_sub(dst, src, order) - #define c89atomic_fetch_sub_explicit_64(dst, src, order) __atomic_fetch_sub(dst, src, order) - #define c89atomic_fetch_or_explicit_8( dst, src, order) __atomic_fetch_or(dst, src, order) - #define c89atomic_fetch_or_explicit_16(dst, src, order) __atomic_fetch_or(dst, src, order) - #define c89atomic_fetch_or_explicit_32(dst, src, order) __atomic_fetch_or(dst, src, order) - #define c89atomic_fetch_or_explicit_64(dst, src, order) __atomic_fetch_or(dst, src, order) - #define c89atomic_fetch_xor_explicit_8( dst, src, order) __atomic_fetch_xor(dst, src, order) - #define c89atomic_fetch_xor_explicit_16(dst, src, order) __atomic_fetch_xor(dst, src, order) - #define c89atomic_fetch_xor_explicit_32(dst, src, order) __atomic_fetch_xor(dst, src, order) - #define c89atomic_fetch_xor_explicit_64(dst, src, order) __atomic_fetch_xor(dst, src, order) - #define c89atomic_fetch_and_explicit_8( dst, src, order) __atomic_fetch_and(dst, src, order) - #define c89atomic_fetch_and_explicit_16(dst, src, order) __atomic_fetch_and(dst, src, order) - #define c89atomic_fetch_and_explicit_32(dst, src, order) __atomic_fetch_and(dst, src, order) - #define c89atomic_fetch_and_explicit_64(dst, src, order) __atomic_fetch_and(dst, src, order) - #define c89atomic_compare_and_swap_8 (dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define c89atomic_compare_and_swap_16(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define c89atomic_compare_and_swap_32(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define c89atomic_compare_and_swap_64(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - typedef c89atomic_uint8 c89atomic_flag; - #define c89atomic_flag_test_and_set_explicit(dst, order) (c89atomic_bool)__atomic_test_and_set(dst, order) - #define c89atomic_flag_clear_explicit(dst, order) __atomic_clear(dst, order) - #define c89atoimc_flag_load_explicit(ptr, order) c89atomic_load_explicit_8(ptr, order) -#else - #define c89atomic_memory_order_relaxed 1 - #define c89atomic_memory_order_consume 2 - #define c89atomic_memory_order_acquire 3 - #define c89atomic_memory_order_release 4 - #define c89atomic_memory_order_acq_rel 5 - #define c89atomic_memory_order_seq_cst 6 - #define c89atomic_compiler_fence() __asm__ __volatile__("":::"memory") - #if defined(__GNUC__) - #define c89atomic_thread_fence(order) __sync_synchronize(), (void)order - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - if (order > c89atomic_memory_order_acquire) { - __sync_synchronize(); - } - return __sync_lock_test_and_set(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - do { - oldValue = *dst; - } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - do { - oldValue = *dst; - } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - do { - oldValue = *dst; - } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_add_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_add(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_add_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_add(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_add_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_add(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_add_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_add(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_sub_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_sub_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_sub_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_sub_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_sub(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_or_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_or_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_or_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_or_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_or(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_xor_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_xor_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_xor_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_xor_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_xor(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_and_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_and_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_and_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_and_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - (void)order; - return __sync_fetch_and_and(dst, src); - } - #define c89atomic_compare_and_swap_8( dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define c89atomic_compare_and_swap_16(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define c89atomic_compare_and_swap_32(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #define c89atomic_compare_and_swap_64(dst, expected, desired) __sync_val_compare_and_swap(dst, expected, desired) - #else - #if defined(C89ATOMIC_X86) - #define c89atomic_thread_fence(order) __asm__ __volatile__("lock; addl $0, (%%esp)" ::: "memory", "cc") - #elif defined(C89ATOMIC_X64) - #define c89atomic_thread_fence(order) __asm__ __volatile__("lock; addq $0, (%%rsp)" ::: "memory", "cc") - #else - #error Unsupported architecture. Please submit a feature request. - #endif - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_compare_and_swap_8(volatile c89atomic_uint8* dst, c89atomic_uint8 expected, c89atomic_uint8 desired) - { - c89atomic_uint8 result; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_compare_and_swap_16(volatile c89atomic_uint16* dst, c89atomic_uint16 expected, c89atomic_uint16 desired) - { - c89atomic_uint16 result; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_compare_and_swap_32(volatile c89atomic_uint32* dst, c89atomic_uint32 expected, c89atomic_uint32 desired) - { - c89atomic_uint32 result; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_compare_and_swap_64(volatile c89atomic_uint64* dst, c89atomic_uint64 expected, c89atomic_uint64 desired) - { - volatile c89atomic_uint64 result; - #if defined(C89ATOMIC_X86) - c89atomic_uint32 resultEAX; - c89atomic_uint32 resultEDX; - __asm__ __volatile__("push %%ebx; xchg %5, %%ebx; lock; cmpxchg8b %0; pop %%ebx" : "+m"(*dst), "=a"(resultEAX), "=d"(resultEDX) : "a"(expected & 0xFFFFFFFF), "d"(expected >> 32), "r"(desired & 0xFFFFFFFF), "c"(desired >> 32) : "cc"); - result = ((c89atomic_uint64)resultEDX << 32) | resultEAX; - #elif defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; cmpxchg %3, %0" : "+m"(*dst), "=a"(result) : "a"(expected), "d"(desired) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_exchange_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 result = 0; - (void)order; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_exchange_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 result = 0; - (void)order; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_exchange_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 result; - (void)order; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_exchange_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 result; - (void)order; - #if defined(C89ATOMIC_X86) - do { - result = *dst; - } while (c89atomic_compare_and_swap_64(dst, result, src) != result); - #elif defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; xchg %1, %0" : "+m"(*dst), "=a"(result) : "a"(src)); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_add_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 result; - (void)order; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_add_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 result; - (void)order; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_add_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 result; - (void)order; - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - #else - #error Unsupported architecture. Please submit a feature request. - #endif - return result; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_add_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - #if defined(C89ATOMIC_X86) - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - (void)order; - do { - oldValue = *dst; - newValue = oldValue + src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - return oldValue; - #elif defined(C89ATOMIC_X64) - c89atomic_uint64 result; - (void)order; - __asm__ __volatile__("lock; xadd %1, %0" : "+m"(*dst), "=a"(result) : "a"(src) : "cc"); - return result; - #endif - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_sub_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue - src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_sub_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue - src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_sub_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_sub_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue - src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_and_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue & src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_and_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue & src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_and_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_and_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue & src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_xor_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue ^ src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_xor_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue ^ src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_xor_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_xor_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue ^ src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_fetch_or_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8 src, c89atomic_memory_order order) - { - c89atomic_uint8 oldValue; - c89atomic_uint8 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint8)(oldValue | src); - } while (c89atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_fetch_or_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16 src, c89atomic_memory_order order) - { - c89atomic_uint16 oldValue; - c89atomic_uint16 newValue; - do { - oldValue = *dst; - newValue = (c89atomic_uint16)(oldValue | src); - } while (c89atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_fetch_or_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32 src, c89atomic_memory_order order) - { - c89atomic_uint32 oldValue; - c89atomic_uint32 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (c89atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_fetch_or_explicit_64(volatile c89atomic_uint64* dst, c89atomic_uint64 src, c89atomic_memory_order order) - { - c89atomic_uint64 oldValue; - c89atomic_uint64 newValue; - do { - oldValue = *dst; - newValue = oldValue | src; - } while (c89atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue); - (void)order; - return oldValue; - } - #endif - #define c89atomic_signal_fence(order) c89atomic_thread_fence(order) - static C89ATOMIC_INLINE c89atomic_uint8 c89atomic_load_explicit_8(volatile const c89atomic_uint8* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_8((c89atomic_uint8*)ptr, 0, 0); - } - static C89ATOMIC_INLINE c89atomic_uint16 c89atomic_load_explicit_16(volatile const c89atomic_uint16* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_16((c89atomic_uint16*)ptr, 0, 0); - } - static C89ATOMIC_INLINE c89atomic_uint32 c89atomic_load_explicit_32(volatile const c89atomic_uint32* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_32((c89atomic_uint32*)ptr, 0, 0); - } - static C89ATOMIC_INLINE c89atomic_uint64 c89atomic_load_explicit_64(volatile const c89atomic_uint64* ptr, c89atomic_memory_order order) - { - (void)order; - return c89atomic_compare_and_swap_64((c89atomic_uint64*)ptr, 0, 0); - } - #define c89atomic_store_explicit_8( dst, src, order) (void)c89atomic_exchange_explicit_8 (dst, src, order) - #define c89atomic_store_explicit_16(dst, src, order) (void)c89atomic_exchange_explicit_16(dst, src, order) - #define c89atomic_store_explicit_32(dst, src, order) (void)c89atomic_exchange_explicit_32(dst, src, order) - #define c89atomic_store_explicit_64(dst, src, order) (void)c89atomic_exchange_explicit_64(dst, src, order) - #define c89atomic_test_and_set_explicit_8( dst, order) c89atomic_exchange_explicit_8 (dst, 1, order) - #define c89atomic_test_and_set_explicit_16(dst, order) c89atomic_exchange_explicit_16(dst, 1, order) - #define c89atomic_test_and_set_explicit_32(dst, order) c89atomic_exchange_explicit_32(dst, 1, order) - #define c89atomic_test_and_set_explicit_64(dst, order) c89atomic_exchange_explicit_64(dst, 1, order) - #define c89atomic_clear_explicit_8( dst, order) c89atomic_store_explicit_8 (dst, 0, order) - #define c89atomic_clear_explicit_16(dst, order) c89atomic_store_explicit_16(dst, 0, order) - #define c89atomic_clear_explicit_32(dst, order) c89atomic_store_explicit_32(dst, 0, order) - #define c89atomic_clear_explicit_64(dst, order) c89atomic_store_explicit_64(dst, 0, order) - typedef c89atomic_uint8 c89atomic_flag; - #define c89atomic_flag_test_and_set_explicit(ptr, order) (c89atomic_bool)c89atomic_test_and_set_explicit_8(ptr, order) - #define c89atomic_flag_clear_explicit(ptr, order) c89atomic_clear_explicit_8(ptr, order) - #define c89atoimc_flag_load_explicit(ptr, order) c89atomic_load_explicit_8(ptr, order) -#endif -#if !defined(C89ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE) - #if defined(C89ATOMIC_HAS_8) - c89atomic_bool c89atomic_compare_exchange_strong_explicit_8(volatile c89atomic_uint8* dst, c89atomic_uint8* expected, c89atomic_uint8 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - c89atomic_uint8 expectedValue; - c89atomic_uint8 result; - (void)successOrder; - (void)failureOrder; - expectedValue = c89atomic_load_explicit_8(expected, c89atomic_memory_order_seq_cst); - result = c89atomic_compare_and_swap_8(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - c89atomic_store_explicit_8(expected, result, failureOrder); - return 0; - } - } - #endif - #if defined(C89ATOMIC_HAS_16) - c89atomic_bool c89atomic_compare_exchange_strong_explicit_16(volatile c89atomic_uint16* dst, c89atomic_uint16* expected, c89atomic_uint16 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - c89atomic_uint16 expectedValue; - c89atomic_uint16 result; - (void)successOrder; - (void)failureOrder; - expectedValue = c89atomic_load_explicit_16(expected, c89atomic_memory_order_seq_cst); - result = c89atomic_compare_and_swap_16(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - c89atomic_store_explicit_16(expected, result, failureOrder); - return 0; - } - } - #endif - #if defined(C89ATOMIC_HAS_32) - c89atomic_bool c89atomic_compare_exchange_strong_explicit_32(volatile c89atomic_uint32* dst, c89atomic_uint32* expected, c89atomic_uint32 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - c89atomic_uint32 expectedValue; - c89atomic_uint32 result; - (void)successOrder; - (void)failureOrder; - expectedValue = c89atomic_load_explicit_32(expected, c89atomic_memory_order_seq_cst); - result = c89atomic_compare_and_swap_32(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - c89atomic_store_explicit_32(expected, result, failureOrder); - return 0; - } - } - #endif - #if defined(C89ATOMIC_HAS_64) - c89atomic_bool c89atomic_compare_exchange_strong_explicit_64(volatile c89atomic_uint64* dst, volatile c89atomic_uint64* expected, c89atomic_uint64 desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - c89atomic_uint64 expectedValue; - c89atomic_uint64 result; - (void)successOrder; - (void)failureOrder; - expectedValue = c89atomic_load_explicit_64(expected, c89atomic_memory_order_seq_cst); - result = c89atomic_compare_and_swap_64(dst, expectedValue, desired); - if (result == expectedValue) { - return 1; - } else { - c89atomic_store_explicit_64(expected, result, failureOrder); - return 0; - } - } - #endif - #define c89atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_8 (dst, expected, desired, successOrder, failureOrder) - #define c89atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder) - #define c89atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder) - #define c89atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder) -#endif -#if !defined(C89ATOMIC_HAS_NATIVE_IS_LOCK_FREE) - static C89ATOMIC_INLINE c89atomic_bool c89atomic_is_lock_free_8(volatile void* ptr) - { - (void)ptr; - return 1; - } - static C89ATOMIC_INLINE c89atomic_bool c89atomic_is_lock_free_16(volatile void* ptr) - { - (void)ptr; - return 1; - } - static C89ATOMIC_INLINE c89atomic_bool c89atomic_is_lock_free_32(volatile void* ptr) - { - (void)ptr; - return 1; - } - static C89ATOMIC_INLINE c89atomic_bool c89atomic_is_lock_free_64(volatile void* ptr) - { - (void)ptr; - #if defined(C89ATOMIC_64BIT) - return 1; - #else - #if defined(C89ATOMIC_X86) || defined(C89ATOMIC_X64) - return 1; - #else - return 0; - #endif - #endif - } -#endif -#if defined(C89ATOMIC_64BIT) - static C89ATOMIC_INLINE c89atomic_bool c89atomic_is_lock_free_ptr(volatile void** ptr) - { - return c89atomic_is_lock_free_64((volatile c89atomic_uint64*)ptr); - } - static C89ATOMIC_INLINE void* c89atomic_load_explicit_ptr(volatile void** ptr, c89atomic_memory_order order) - { - return (void*)c89atomic_load_explicit_64((volatile c89atomic_uint64*)ptr, order); - } - static C89ATOMIC_INLINE void c89atomic_store_explicit_ptr(volatile void** dst, void* src, c89atomic_memory_order order) - { - c89atomic_store_explicit_64((volatile c89atomic_uint64*)dst, (c89atomic_uint64)src, order); - } - static C89ATOMIC_INLINE void* c89atomic_exchange_explicit_ptr(volatile void** dst, void* src, c89atomic_memory_order order) - { - return (void*)c89atomic_exchange_explicit_64((volatile c89atomic_uint64*)dst, (c89atomic_uint64)src, order); - } - static C89ATOMIC_INLINE c89atomic_bool c89atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - return c89atomic_compare_exchange_strong_explicit_64((volatile c89atomic_uint64*)dst, (c89atomic_uint64*)expected, (c89atomic_uint64)desired, successOrder, failureOrder); - } - static C89ATOMIC_INLINE c89atomic_bool c89atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - return c89atomic_compare_exchange_weak_explicit_64((volatile c89atomic_uint64*)dst, (c89atomic_uint64*)expected, (c89atomic_uint64)desired, successOrder, failureOrder); - } - static C89ATOMIC_INLINE void* c89atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* desired) - { - return (void*)c89atomic_compare_and_swap_64((volatile c89atomic_uint64*)dst, (c89atomic_uint64)expected, (c89atomic_uint64)desired); - } -#elif defined(C89ATOMIC_32BIT) - static C89ATOMIC_INLINE c89atomic_bool c89atomic_is_lock_free_ptr(volatile void** ptr) - { - return c89atomic_is_lock_free_32((volatile c89atomic_uint32*)ptr); - } - static C89ATOMIC_INLINE void* c89atomic_load_explicit_ptr(volatile void** ptr, c89atomic_memory_order order) - { - return (void*)c89atomic_load_explicit_32((volatile c89atomic_uint32*)ptr, order); - } - static C89ATOMIC_INLINE void c89atomic_store_explicit_ptr(volatile void** dst, void* src, c89atomic_memory_order order) - { - c89atomic_store_explicit_32((volatile c89atomic_uint32*)dst, (c89atomic_uint32)src, order); - } - static C89ATOMIC_INLINE void* c89atomic_exchange_explicit_ptr(volatile void** dst, void* src, c89atomic_memory_order order) - { - return (void*)c89atomic_exchange_explicit_32((volatile c89atomic_uint32*)dst, (c89atomic_uint32)src, order); - } - static C89ATOMIC_INLINE c89atomic_bool c89atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - return c89atomic_compare_exchange_strong_explicit_32((volatile c89atomic_uint32*)dst, (c89atomic_uint32*)expected, (c89atomic_uint32)desired, successOrder, failureOrder); - } - static C89ATOMIC_INLINE c89atomic_bool c89atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* desired, c89atomic_memory_order successOrder, c89atomic_memory_order failureOrder) - { - return c89atomic_compare_exchange_weak_explicit_32((volatile c89atomic_uint32*)dst, (c89atomic_uint32*)expected, (c89atomic_uint32)desired, successOrder, failureOrder); - } - static C89ATOMIC_INLINE void* c89atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* desired) - { - return (void*)c89atomic_compare_and_swap_32((volatile c89atomic_uint32*)dst, (c89atomic_uint32)expected, (c89atomic_uint32)desired); - } -#else - #error Unsupported architecture. -#endif -#define c89atomic_flag_test_and_set(ptr) c89atomic_flag_test_and_set_explicit(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_flag_clear(ptr) c89atomic_flag_clear_explicit(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_store_ptr(dst, src) c89atomic_store_explicit_ptr((volatile void**)dst, (void*)src, c89atomic_memory_order_seq_cst) -#define c89atomic_load_ptr(ptr) c89atomic_load_explicit_ptr((volatile void**)ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_ptr(dst, src) c89atomic_exchange_explicit_ptr((volatile void**)dst, (void*)src, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_ptr(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_ptr((volatile void**)dst, (void**)expected, (void*)desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_ptr(dst, expected, desired) c89atomic_compare_exchange_weak_explicit_ptr((volatile void**)dst, (void**)expected, (void*)desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_8( ptr) c89atomic_test_and_set_explicit_8( ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_16(ptr) c89atomic_test_and_set_explicit_16(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_32(ptr) c89atomic_test_and_set_explicit_32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_64(ptr) c89atomic_test_and_set_explicit_64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_8( ptr) c89atomic_clear_explicit_8( ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_16(ptr) c89atomic_clear_explicit_16(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_32(ptr) c89atomic_clear_explicit_32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_64(ptr) c89atomic_clear_explicit_64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_store_8( dst, src) c89atomic_store_explicit_8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_store_16(dst, src) c89atomic_store_explicit_16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_store_32(dst, src) c89atomic_store_explicit_32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_store_64(dst, src) c89atomic_store_explicit_64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_load_8( ptr) c89atomic_load_explicit_8( ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_load_16(ptr) c89atomic_load_explicit_16(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_load_32(ptr) c89atomic_load_explicit_32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_load_64(ptr) c89atomic_load_explicit_64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_8( dst, src) c89atomic_exchange_explicit_8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_16(dst, src) c89atomic_exchange_explicit_16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_32(dst, src) c89atomic_exchange_explicit_32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_64(dst, src) c89atomic_exchange_explicit_64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_8( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_8( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_16(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_16(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_32(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_32(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_64(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_64(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_8( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_8( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_16( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_16(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_32( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_32(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_64( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_64(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_8( dst, src) c89atomic_fetch_add_explicit_8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_16(dst, src) c89atomic_fetch_add_explicit_16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_32(dst, src) c89atomic_fetch_add_explicit_32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_64(dst, src) c89atomic_fetch_add_explicit_64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_8( dst, src) c89atomic_fetch_sub_explicit_8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_16(dst, src) c89atomic_fetch_sub_explicit_16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_32(dst, src) c89atomic_fetch_sub_explicit_32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_64(dst, src) c89atomic_fetch_sub_explicit_64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_8( dst, src) c89atomic_fetch_or_explicit_8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_16(dst, src) c89atomic_fetch_or_explicit_16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_32(dst, src) c89atomic_fetch_or_explicit_32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_64(dst, src) c89atomic_fetch_or_explicit_64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_8( dst, src) c89atomic_fetch_xor_explicit_8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_16(dst, src) c89atomic_fetch_xor_explicit_16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_32(dst, src) c89atomic_fetch_xor_explicit_32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_64(dst, src) c89atomic_fetch_xor_explicit_64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_8( dst, src) c89atomic_fetch_and_explicit_8 (dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_16(dst, src) c89atomic_fetch_and_explicit_16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_32(dst, src) c89atomic_fetch_and_explicit_32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_64(dst, src) c89atomic_fetch_and_explicit_64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_explicit_i8( ptr, order) (c89atomic_int8 )c89atomic_test_and_set_explicit_8( (c89atomic_uint8* )ptr, order) -#define c89atomic_test_and_set_explicit_i16(ptr, order) (c89atomic_int16)c89atomic_test_and_set_explicit_16((c89atomic_uint16*)ptr, order) -#define c89atomic_test_and_set_explicit_i32(ptr, order) (c89atomic_int32)c89atomic_test_and_set_explicit_32((c89atomic_uint32*)ptr, order) -#define c89atomic_test_and_set_explicit_i64(ptr, order) (c89atomic_int64)c89atomic_test_and_set_explicit_64((c89atomic_uint64*)ptr, order) -#define c89atomic_clear_explicit_i8( ptr, order) c89atomic_clear_explicit_8( (c89atomic_uint8* )ptr, order) -#define c89atomic_clear_explicit_i16(ptr, order) c89atomic_clear_explicit_16((c89atomic_uint16*)ptr, order) -#define c89atomic_clear_explicit_i32(ptr, order) c89atomic_clear_explicit_32((c89atomic_uint32*)ptr, order) -#define c89atomic_clear_explicit_i64(ptr, order) c89atomic_clear_explicit_64((c89atomic_uint64*)ptr, order) -#define c89atomic_store_explicit_i8( dst, src, order) (c89atomic_int8 )c89atomic_store_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )src, order) -#define c89atomic_store_explicit_i16(dst, src, order) (c89atomic_int16)c89atomic_store_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16)src, order) -#define c89atomic_store_explicit_i32(dst, src, order) (c89atomic_int32)c89atomic_store_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32)src, order) -#define c89atomic_store_explicit_i64(dst, src, order) (c89atomic_int64)c89atomic_store_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64)src, order) -#define c89atomic_load_explicit_i8( ptr, order) (c89atomic_int8 )c89atomic_load_explicit_8( (c89atomic_uint8* )ptr, order) -#define c89atomic_load_explicit_i16(ptr, order) (c89atomic_int16)c89atomic_load_explicit_16((c89atomic_uint16*)ptr, order) -#define c89atomic_load_explicit_i32(ptr, order) (c89atomic_int32)c89atomic_load_explicit_32((c89atomic_uint32*)ptr, order) -#define c89atomic_load_explicit_i64(ptr, order) (c89atomic_int64)c89atomic_load_explicit_64((c89atomic_uint64*)ptr, order) -#define c89atomic_exchange_explicit_i8( dst, src, order) (c89atomic_int8 )c89atomic_exchange_explicit_8 ((c89atomic_uint8* )dst, (c89atomic_uint8 )src, order) -#define c89atomic_exchange_explicit_i16(dst, src, order) (c89atomic_int16)c89atomic_exchange_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16)src, order) -#define c89atomic_exchange_explicit_i32(dst, src, order) (c89atomic_int32)c89atomic_exchange_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32)src, order) -#define c89atomic_exchange_explicit_i64(dst, src, order) (c89atomic_int64)c89atomic_exchange_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64)src, order) -#define c89atomic_compare_exchange_strong_explicit_i8( dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8* )expected, (c89atomic_uint8 )desired, successOrder, failureOrder) -#define c89atomic_compare_exchange_strong_explicit_i16(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16*)expected, (c89atomic_uint16)desired, successOrder, failureOrder) -#define c89atomic_compare_exchange_strong_explicit_i32(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32*)expected, (c89atomic_uint32)desired, successOrder, failureOrder) -#define c89atomic_compare_exchange_strong_explicit_i64(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_strong_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64*)expected, (c89atomic_uint64)desired, successOrder, failureOrder) -#define c89atomic_compare_exchange_weak_explicit_i8( dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_weak_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8* )expected, (c89atomic_uint8 )desired, successOrder, failureOrder) -#define c89atomic_compare_exchange_weak_explicit_i16(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_weak_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16*)expected, (c89atomic_uint16)desired, successOrder, failureOrder) -#define c89atomic_compare_exchange_weak_explicit_i32(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_weak_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32*)expected, (c89atomic_uint32)desired, successOrder, failureOrder) -#define c89atomic_compare_exchange_weak_explicit_i64(dst, expected, desired, successOrder, failureOrder) c89atomic_compare_exchange_weak_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64*)expected, (c89atomic_uint64)desired, successOrder, failureOrder) -#define c89atomic_fetch_add_explicit_i8( dst, src, order) (c89atomic_int8 )c89atomic_fetch_add_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )src, order) -#define c89atomic_fetch_add_explicit_i16(dst, src, order) (c89atomic_int16)c89atomic_fetch_add_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16)src, order) -#define c89atomic_fetch_add_explicit_i32(dst, src, order) (c89atomic_int32)c89atomic_fetch_add_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32)src, order) -#define c89atomic_fetch_add_explicit_i64(dst, src, order) (c89atomic_int64)c89atomic_fetch_add_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64)src, order) -#define c89atomic_fetch_sub_explicit_i8( dst, src, order) (c89atomic_int8 )c89atomic_fetch_sub_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )src, order) -#define c89atomic_fetch_sub_explicit_i16(dst, src, order) (c89atomic_int16)c89atomic_fetch_sub_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16)src, order) -#define c89atomic_fetch_sub_explicit_i32(dst, src, order) (c89atomic_int32)c89atomic_fetch_sub_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32)src, order) -#define c89atomic_fetch_sub_explicit_i64(dst, src, order) (c89atomic_int64)c89atomic_fetch_sub_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64)src, order) -#define c89atomic_fetch_or_explicit_i8( dst, src, order) (c89atomic_int8 )c89atomic_fetch_or_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )src, order) -#define c89atomic_fetch_or_explicit_i16(dst, src, order) (c89atomic_int16)c89atomic_fetch_or_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16)src, order) -#define c89atomic_fetch_or_explicit_i32(dst, src, order) (c89atomic_int32)c89atomic_fetch_or_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32)src, order) -#define c89atomic_fetch_or_explicit_i64(dst, src, order) (c89atomic_int64)c89atomic_fetch_or_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64)src, order) -#define c89atomic_fetch_xor_explicit_i8( dst, src, order) (c89atomic_int8 )c89atomic_fetch_xor_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )src, order) -#define c89atomic_fetch_xor_explicit_i16(dst, src, order) (c89atomic_int16)c89atomic_fetch_xor_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16)src, order) -#define c89atomic_fetch_xor_explicit_i32(dst, src, order) (c89atomic_int32)c89atomic_fetch_xor_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32)src, order) -#define c89atomic_fetch_xor_explicit_i64(dst, src, order) (c89atomic_int64)c89atomic_fetch_xor_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64)src, order) -#define c89atomic_fetch_and_explicit_i8( dst, src, order) (c89atomic_int8 )c89atomic_fetch_and_explicit_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )src, order) -#define c89atomic_fetch_and_explicit_i16(dst, src, order) (c89atomic_int16)c89atomic_fetch_and_explicit_16((c89atomic_uint16*)dst, (c89atomic_uint16)src, order) -#define c89atomic_fetch_and_explicit_i32(dst, src, order) (c89atomic_int32)c89atomic_fetch_and_explicit_32((c89atomic_uint32*)dst, (c89atomic_uint32)src, order) -#define c89atomic_fetch_and_explicit_i64(dst, src, order) (c89atomic_int64)c89atomic_fetch_and_explicit_64((c89atomic_uint64*)dst, (c89atomic_uint64)src, order) -#define c89atomic_test_and_set_i8( ptr) c89atomic_test_and_set_explicit_i8( ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_i16(ptr) c89atomic_test_and_set_explicit_i16(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_i32(ptr) c89atomic_test_and_set_explicit_i32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_test_and_set_i64(ptr) c89atomic_test_and_set_explicit_i64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_i8( ptr) c89atomic_clear_explicit_i8( ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_i16(ptr) c89atomic_clear_explicit_i16(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_i32(ptr) c89atomic_clear_explicit_i32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_i64(ptr) c89atomic_clear_explicit_i64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_store_i8( dst, src) c89atomic_store_explicit_i8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_store_i16(dst, src) c89atomic_store_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_store_i32(dst, src) c89atomic_store_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_store_i64(dst, src) c89atomic_store_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_load_i8( ptr) c89atomic_load_explicit_i8( ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_load_i16(ptr) c89atomic_load_explicit_i16(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_load_i32(ptr) c89atomic_load_explicit_i32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_load_i64(ptr) c89atomic_load_explicit_i64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_i8( dst, src) c89atomic_exchange_explicit_i8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_i16(dst, src) c89atomic_exchange_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_i32(dst, src) c89atomic_exchange_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_i64(dst, src) c89atomic_exchange_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_i8( dst, expected, desired) c89atomic_compare_exchange_strong_explicit_i8( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_i16(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_i16(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_i32(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_i32(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_strong_i64(dst, expected, desired) c89atomic_compare_exchange_strong_explicit_i64(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_i8( dst, expected, desired) c89atomic_compare_exchange_weak_explicit_i8( dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_i16(dst, expected, desired) c89atomic_compare_exchange_weak_explicit_i16(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_i32(dst, expected, desired) c89atomic_compare_exchange_weak_explicit_i32(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_exchange_weak_i64(dst, expected, desired) c89atomic_compare_exchange_weak_explicit_i64(dst, expected, desired, c89atomic_memory_order_seq_cst, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_i8( dst, src) c89atomic_fetch_add_explicit_i8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_i16(dst, src) c89atomic_fetch_add_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_i32(dst, src) c89atomic_fetch_add_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_add_i64(dst, src) c89atomic_fetch_add_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_i8( dst, src) c89atomic_fetch_sub_explicit_i8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_i16(dst, src) c89atomic_fetch_sub_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_i32(dst, src) c89atomic_fetch_sub_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_sub_i64(dst, src) c89atomic_fetch_sub_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_i8( dst, src) c89atomic_fetch_or_explicit_i8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_i16(dst, src) c89atomic_fetch_or_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_i32(dst, src) c89atomic_fetch_or_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_or_i64(dst, src) c89atomic_fetch_or_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_i8( dst, src) c89atomic_fetch_xor_explicit_i8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_i16(dst, src) c89atomic_fetch_xor_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_i32(dst, src) c89atomic_fetch_xor_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_xor_i64(dst, src) c89atomic_fetch_xor_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_i8( dst, src) c89atomic_fetch_and_explicit_i8( dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_i16(dst, src) c89atomic_fetch_and_explicit_i16(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_i32(dst, src) c89atomic_fetch_and_explicit_i32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_fetch_and_i64(dst, src) c89atomic_fetch_and_explicit_i64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_compare_and_swap_i8( dst, expected, dedsired) (c89atomic_int8 )c89atomic_compare_and_swap_8( (c89atomic_uint8* )dst, (c89atomic_uint8 )expected, (c89atomic_uint8 )dedsired) -#define c89atomic_compare_and_swap_i16(dst, expected, dedsired) (c89atomic_int16)c89atomic_compare_and_swap_16((c89atomic_uint16*)dst, (c89atomic_uint16)expected, (c89atomic_uint16)dedsired) -#define c89atomic_compare_and_swap_i32(dst, expected, dedsired) (c89atomic_int32)c89atomic_compare_and_swap_32((c89atomic_uint32*)dst, (c89atomic_uint32)expected, (c89atomic_uint32)dedsired) -#define c89atomic_compare_and_swap_i64(dst, expected, dedsired) (c89atomic_int64)c89atomic_compare_and_swap_64((c89atomic_uint64*)dst, (c89atomic_uint64)expected, (c89atomic_uint64)dedsired) -typedef union -{ - c89atomic_uint32 i; - float f; -} c89atomic_if32; -typedef union -{ - c89atomic_uint64 i; - double f; -} c89atomic_if64; -#define c89atomic_clear_explicit_f32(ptr, order) c89atomic_clear_explicit_32((c89atomic_uint32*)ptr, order) -#define c89atomic_clear_explicit_f64(ptr, order) c89atomic_clear_explicit_64((c89atomic_uint64*)ptr, order) -static C89ATOMIC_INLINE void c89atomic_store_explicit_f32(volatile float* dst, float src, c89atomic_memory_order order) -{ - c89atomic_if32 x; - x.f = src; - c89atomic_store_explicit_32((volatile c89atomic_uint32*)dst, x.i, order); -} -static C89ATOMIC_INLINE void c89atomic_store_explicit_f64(volatile double* dst, double src, c89atomic_memory_order order) -{ - c89atomic_if64 x; - x.f = src; - c89atomic_store_explicit_64((volatile c89atomic_uint64*)dst, x.i, order); -} -static C89ATOMIC_INLINE float c89atomic_load_explicit_f32(volatile const float* ptr, c89atomic_memory_order order) -{ - c89atomic_if32 r; - r.i = c89atomic_load_explicit_32((volatile const c89atomic_uint32*)ptr, order); - return r.f; -} -static C89ATOMIC_INLINE double c89atomic_load_explicit_f64(volatile const double* ptr, c89atomic_memory_order order) -{ - c89atomic_if64 r; - r.i = c89atomic_load_explicit_64((volatile const c89atomic_uint64*)ptr, order); - return r.f; -} -static C89ATOMIC_INLINE float c89atomic_exchange_explicit_f32(volatile float* dst, float src, c89atomic_memory_order order) -{ - c89atomic_if32 r; - c89atomic_if32 x; - x.f = src; - r.i = c89atomic_exchange_explicit_32((volatile c89atomic_uint32*)dst, x.i, order); - return r.f; -} -static C89ATOMIC_INLINE double c89atomic_exchange_explicit_f64(volatile double* dst, double src, c89atomic_memory_order order) -{ - c89atomic_if64 r; - c89atomic_if64 x; - x.f = src; - r.i = c89atomic_exchange_explicit_64((volatile c89atomic_uint64*)dst, x.i, order); - return r.f; -} -#define c89atomic_clear_f32(ptr) (float )c89atomic_clear_explicit_f32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_clear_f64(ptr) (double)c89atomic_clear_explicit_f64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_store_f32(dst, src) c89atomic_store_explicit_f32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_store_f64(dst, src) c89atomic_store_explicit_f64(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_load_f32(ptr) (float )c89atomic_load_explicit_f32(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_load_f64(ptr) (double)c89atomic_load_explicit_f64(ptr, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_f32(dst, src) (float )c89atomic_exchange_explicit_f32(dst, src, c89atomic_memory_order_seq_cst) -#define c89atomic_exchange_f64(dst, src) (double)c89atomic_exchange_explicit_f64(dst, src, c89atomic_memory_order_seq_cst) -typedef c89atomic_flag c89atomic_spinlock; -static C89ATOMIC_INLINE void c89atomic_spinlock_lock(volatile c89atomic_spinlock* pSpinlock) -{ - for (;;) { - if (c89atomic_flag_test_and_set_explicit(pSpinlock, c89atomic_memory_order_acquire) == 0) { - break; - } - while (c89atoimc_flag_load_explicit(pSpinlock, c89atomic_memory_order_relaxed) == 1) { - } - } -} -static C89ATOMIC_INLINE void c89atomic_spinlock_unlock(volatile c89atomic_spinlock* pSpinlock) -{ - c89atomic_flag_clear_explicit(pSpinlock, c89atomic_memory_order_release); -} -#if defined(__cplusplus) -} -#endif -#endif -/* c89atomic.h end */ - - - -MA_API ma_uint64 ma_calculate_frame_count_after_resampling(ma_uint32 sampleRateOut, ma_uint32 sampleRateIn, ma_uint64 frameCountIn) -{ - /* This is based on the calculation in ma_linear_resampler_get_expected_output_frame_count(). */ - ma_uint64 outputFrameCount; - ma_uint64 preliminaryInputFrameCountFromFrac; - ma_uint64 preliminaryInputFrameCount; - - if (sampleRateIn == 0 || sampleRateOut == 0 || frameCountIn == 0) { - return 0; - } - - if (sampleRateOut == sampleRateIn) { - return frameCountIn; - } - - outputFrameCount = (frameCountIn * sampleRateOut) / sampleRateIn; - - preliminaryInputFrameCountFromFrac = (outputFrameCount * (sampleRateIn / sampleRateOut)) / sampleRateOut; - preliminaryInputFrameCount = (outputFrameCount * (sampleRateIn % sampleRateOut)) + preliminaryInputFrameCountFromFrac; - - if (preliminaryInputFrameCount <= frameCountIn) { - outputFrameCount += 1; - } - - return outputFrameCount; -} - -#ifndef MA_DATA_CONVERTER_STACK_BUFFER_SIZE -#define MA_DATA_CONVERTER_STACK_BUFFER_SIZE 4096 -#endif - - - -#if defined(MA_WIN32) -static ma_result ma_result_from_GetLastError(DWORD error) -{ - switch (error) - { - case ERROR_SUCCESS: return MA_SUCCESS; - case ERROR_PATH_NOT_FOUND: return MA_DOES_NOT_EXIST; - case ERROR_TOO_MANY_OPEN_FILES: return MA_TOO_MANY_OPEN_FILES; - case ERROR_NOT_ENOUGH_MEMORY: return MA_OUT_OF_MEMORY; - case ERROR_DISK_FULL: return MA_NO_SPACE; - case ERROR_HANDLE_EOF: return MA_AT_END; - case ERROR_NEGATIVE_SEEK: return MA_BAD_SEEK; - case ERROR_INVALID_PARAMETER: return MA_INVALID_ARGS; - case ERROR_ACCESS_DENIED: return MA_ACCESS_DENIED; - case ERROR_SEM_TIMEOUT: return MA_TIMEOUT; - case ERROR_FILE_NOT_FOUND: return MA_DOES_NOT_EXIST; - default: break; - } - - return MA_ERROR; -} -#endif /* MA_WIN32 */ - - -/******************************************************************************* - -Threading - -*******************************************************************************/ -static MA_INLINE ma_result ma_spinlock_lock_ex(volatile ma_spinlock* pSpinlock, ma_bool32 yield) -{ - if (pSpinlock == NULL) { - return MA_INVALID_ARGS; - } - - for (;;) { - if (c89atomic_exchange_explicit_32(pSpinlock, 1, c89atomic_memory_order_acquire) == 0) { - break; - } - - while (c89atomic_load_explicit_32(pSpinlock, c89atomic_memory_order_relaxed) == 1) { - if (yield) { - ma_yield(); - } - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_spinlock_lock(volatile ma_spinlock* pSpinlock) -{ - return ma_spinlock_lock_ex(pSpinlock, MA_TRUE); -} - -MA_API ma_result ma_spinlock_lock_noyield(volatile ma_spinlock* pSpinlock) -{ - return ma_spinlock_lock_ex(pSpinlock, MA_FALSE); -} - -MA_API ma_result ma_spinlock_unlock(volatile ma_spinlock* pSpinlock) -{ - if (pSpinlock == NULL) { - return MA_INVALID_ARGS; - } - - c89atomic_store_explicit_32(pSpinlock, 0, c89atomic_memory_order_release); - return MA_SUCCESS; -} - - -#ifndef MA_NO_THREADING -#ifdef MA_WIN32 - #define MA_THREADCALL WINAPI - typedef unsigned long ma_thread_result; -#else - #define MA_THREADCALL - typedef void* ma_thread_result; -#endif -typedef ma_thread_result (MA_THREADCALL * ma_thread_entry_proc)(void* pData); - -#ifdef MA_WIN32 -static int ma_thread_priority_to_win32(ma_thread_priority priority) -{ - switch (priority) { - case ma_thread_priority_idle: return THREAD_PRIORITY_IDLE; - case ma_thread_priority_lowest: return THREAD_PRIORITY_LOWEST; - case ma_thread_priority_low: return THREAD_PRIORITY_BELOW_NORMAL; - case ma_thread_priority_normal: return THREAD_PRIORITY_NORMAL; - case ma_thread_priority_high: return THREAD_PRIORITY_ABOVE_NORMAL; - case ma_thread_priority_highest: return THREAD_PRIORITY_HIGHEST; - case ma_thread_priority_realtime: return THREAD_PRIORITY_TIME_CRITICAL; - default: return THREAD_PRIORITY_NORMAL; - } -} - -static ma_result ma_thread_create__win32(ma_thread* pThread, ma_thread_priority priority, size_t stackSize, ma_thread_entry_proc entryProc, void* pData) -{ - *pThread = CreateThread(NULL, stackSize, entryProc, pData, 0, NULL); - if (*pThread == NULL) { - return ma_result_from_GetLastError(GetLastError()); - } - - SetThreadPriority((HANDLE)*pThread, ma_thread_priority_to_win32(priority)); - - return MA_SUCCESS; -} - -static void ma_thread_wait__win32(ma_thread* pThread) -{ - WaitForSingleObject((HANDLE)*pThread, INFINITE); - CloseHandle((HANDLE)*pThread); -} - - -static ma_result ma_mutex_init__win32(ma_mutex* pMutex) -{ - *pMutex = CreateEventW(NULL, FALSE, TRUE, NULL); - if (*pMutex == NULL) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} - -static void ma_mutex_uninit__win32(ma_mutex* pMutex) -{ - CloseHandle((HANDLE)*pMutex); -} - -static void ma_mutex_lock__win32(ma_mutex* pMutex) -{ - WaitForSingleObject((HANDLE)*pMutex, INFINITE); -} - -static void ma_mutex_unlock__win32(ma_mutex* pMutex) -{ - SetEvent((HANDLE)*pMutex); -} - - -static ma_result ma_event_init__win32(ma_event* pEvent) -{ - *pEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - if (*pEvent == NULL) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} - -static void ma_event_uninit__win32(ma_event* pEvent) -{ - CloseHandle((HANDLE)*pEvent); -} - -static ma_result ma_event_wait__win32(ma_event* pEvent) -{ - DWORD result = WaitForSingleObject((HANDLE)*pEvent, INFINITE); - if (result == WAIT_OBJECT_0) { - return MA_SUCCESS; - } - - if (result == WAIT_TIMEOUT) { - return MA_TIMEOUT; - } - - return ma_result_from_GetLastError(GetLastError()); -} - -static ma_result ma_event_signal__win32(ma_event* pEvent) -{ - BOOL result = SetEvent((HANDLE)*pEvent); - if (result == 0) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} - - -static ma_result ma_semaphore_init__win32(int initialValue, ma_semaphore* pSemaphore) -{ - *pSemaphore = CreateSemaphoreW(NULL, (LONG)initialValue, LONG_MAX, NULL); - if (*pSemaphore == NULL) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} - -static void ma_semaphore_uninit__win32(ma_semaphore* pSemaphore) -{ - CloseHandle((HANDLE)*pSemaphore); -} - -static ma_result ma_semaphore_wait__win32(ma_semaphore* pSemaphore) -{ - DWORD result = WaitForSingleObject((HANDLE)*pSemaphore, INFINITE); - if (result == WAIT_OBJECT_0) { - return MA_SUCCESS; - } - - if (result == WAIT_TIMEOUT) { - return MA_TIMEOUT; - } - - return ma_result_from_GetLastError(GetLastError()); -} - -static ma_result ma_semaphore_release__win32(ma_semaphore* pSemaphore) -{ - BOOL result = ReleaseSemaphore((HANDLE)*pSemaphore, 1, NULL); - if (result == 0) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} -#endif - - -#ifdef MA_POSIX -static ma_result ma_thread_create__posix(ma_thread* pThread, ma_thread_priority priority, size_t stackSize, ma_thread_entry_proc entryProc, void* pData) -{ - int result; - pthread_attr_t* pAttr = NULL; - -#if !defined(__EMSCRIPTEN__) - /* Try setting the thread priority. It's not critical if anything fails here. */ - pthread_attr_t attr; - if (pthread_attr_init(&attr) == 0) { - int scheduler = -1; - if (priority == ma_thread_priority_idle) { -#ifdef SCHED_IDLE - if (pthread_attr_setschedpolicy(&attr, SCHED_IDLE) == 0) { - scheduler = SCHED_IDLE; - } -#endif - } else if (priority == ma_thread_priority_realtime) { -#ifdef SCHED_FIFO - if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO) == 0) { - scheduler = SCHED_FIFO; - } -#endif -#ifdef MA_LINUX - } else { - scheduler = sched_getscheduler(0); -#endif - } - - if (stackSize > 0) { - pthread_attr_setstacksize(&attr, stackSize); - } - - if (scheduler != -1) { - int priorityMin = sched_get_priority_min(scheduler); - int priorityMax = sched_get_priority_max(scheduler); - int priorityStep = (priorityMax - priorityMin) / 7; /* 7 = number of priorities supported by miniaudio. */ - - struct sched_param sched; - if (pthread_attr_getschedparam(&attr, &sched) == 0) { - if (priority == ma_thread_priority_idle) { - sched.sched_priority = priorityMin; - } else if (priority == ma_thread_priority_realtime) { - sched.sched_priority = priorityMax; - } else { - sched.sched_priority += ((int)priority + 5) * priorityStep; /* +5 because the lowest priority is -5. */ - if (sched.sched_priority < priorityMin) { - sched.sched_priority = priorityMin; - } - if (sched.sched_priority > priorityMax) { - sched.sched_priority = priorityMax; - } - } - - if (pthread_attr_setschedparam(&attr, &sched) == 0) { - pAttr = &attr; - } - } - } - } -#else - /* It's the emscripten build. We'll have a few unused parameters. */ - (void)priority; - (void)stackSize; -#endif - - result = pthread_create((pthread_t*)pThread, pAttr, entryProc, pData); - - /* The thread attributes object is no longer required. */ - if (pAttr != NULL) { - pthread_attr_destroy(pAttr); - } - - if (result != 0) { - return ma_result_from_errno(result); - } - - return MA_SUCCESS; -} - -static void ma_thread_wait__posix(ma_thread* pThread) -{ - pthread_join((pthread_t)*pThread, NULL); -} - - -static ma_result ma_mutex_init__posix(ma_mutex* pMutex) -{ - int result = pthread_mutex_init((pthread_mutex_t*)pMutex, NULL); - if (result != 0) { - return ma_result_from_errno(result); - } - - return MA_SUCCESS; -} - -static void ma_mutex_uninit__posix(ma_mutex* pMutex) -{ - pthread_mutex_destroy((pthread_mutex_t*)pMutex); -} - -static void ma_mutex_lock__posix(ma_mutex* pMutex) -{ - pthread_mutex_lock((pthread_mutex_t*)pMutex); -} - -static void ma_mutex_unlock__posix(ma_mutex* pMutex) -{ - pthread_mutex_unlock((pthread_mutex_t*)pMutex); -} - - -static ma_result ma_event_init__posix(ma_event* pEvent) -{ - int result; - - result = pthread_mutex_init((pthread_mutex_t*)&pEvent->lock, NULL); - if (result != 0) { - return ma_result_from_errno(result); - } - - result = pthread_cond_init((pthread_cond_t*)&pEvent->cond, NULL); - if (result != 0) { - pthread_mutex_destroy((pthread_mutex_t*)&pEvent->lock); - return ma_result_from_errno(result); - } - - pEvent->value = 0; - return MA_SUCCESS; -} - -static void ma_event_uninit__posix(ma_event* pEvent) -{ - pthread_cond_destroy((pthread_cond_t*)&pEvent->cond); - pthread_mutex_destroy((pthread_mutex_t*)&pEvent->lock); -} - -static ma_result ma_event_wait__posix(ma_event* pEvent) -{ - pthread_mutex_lock((pthread_mutex_t*)&pEvent->lock); - { - while (pEvent->value == 0) { - pthread_cond_wait((pthread_cond_t*)&pEvent->cond, (pthread_mutex_t*)&pEvent->lock); - } - pEvent->value = 0; /* Auto-reset. */ - } - pthread_mutex_unlock((pthread_mutex_t*)&pEvent->lock); - - return MA_SUCCESS; -} - -static ma_result ma_event_signal__posix(ma_event* pEvent) -{ - pthread_mutex_lock((pthread_mutex_t*)&pEvent->lock); - { - pEvent->value = 1; - pthread_cond_signal((pthread_cond_t*)&pEvent->cond); - } - pthread_mutex_unlock((pthread_mutex_t*)&pEvent->lock); - - return MA_SUCCESS; -} - - -static ma_result ma_semaphore_init__posix(int initialValue, ma_semaphore* pSemaphore) -{ - int result; - - if (pSemaphore == NULL) { - return MA_INVALID_ARGS; - } - - pSemaphore->value = initialValue; - - result = pthread_mutex_init((pthread_mutex_t*)&pSemaphore->lock, NULL); - if (result != 0) { - return ma_result_from_errno(result); /* Failed to create mutex. */ - } - - result = pthread_cond_init((pthread_cond_t*)&pSemaphore->cond, NULL); - if (result != 0) { - pthread_mutex_destroy((pthread_mutex_t*)&pSemaphore->lock); - return ma_result_from_errno(result); /* Failed to create condition variable. */ - } - - return MA_SUCCESS; -} - -static void ma_semaphore_uninit__posix(ma_semaphore* pSemaphore) -{ - if (pSemaphore == NULL) { - return; - } - - pthread_cond_destroy((pthread_cond_t*)&pSemaphore->cond); - pthread_mutex_destroy((pthread_mutex_t*)&pSemaphore->lock); -} - -static ma_result ma_semaphore_wait__posix(ma_semaphore* pSemaphore) -{ - if (pSemaphore == NULL) { - return MA_INVALID_ARGS; - } - - pthread_mutex_lock((pthread_mutex_t*)&pSemaphore->lock); - { - /* We need to wait on a condition variable before escaping. We can't return from this function until the semaphore has been signaled. */ - while (pSemaphore->value == 0) { - pthread_cond_wait((pthread_cond_t*)&pSemaphore->cond, (pthread_mutex_t*)&pSemaphore->lock); - } - - pSemaphore->value -= 1; - } - pthread_mutex_unlock((pthread_mutex_t*)&pSemaphore->lock); - - return MA_SUCCESS; -} - -static ma_result ma_semaphore_release__posix(ma_semaphore* pSemaphore) -{ - if (pSemaphore == NULL) { - return MA_INVALID_ARGS; - } - - pthread_mutex_lock((pthread_mutex_t*)&pSemaphore->lock); - { - pSemaphore->value += 1; - pthread_cond_signal((pthread_cond_t*)&pSemaphore->cond); - } - pthread_mutex_unlock((pthread_mutex_t*)&pSemaphore->lock); - - return MA_SUCCESS; -} -#endif - -typedef struct -{ - ma_thread_entry_proc entryProc; - void* pData; - ma_allocation_callbacks allocationCallbacks; -} ma_thread_proxy_data; - -static ma_thread_result MA_THREADCALL ma_thread_entry_proxy(void* pData) -{ - ma_thread_proxy_data* pProxyData = (ma_thread_proxy_data*)pData; - ma_thread_entry_proc entryProc; - void* pEntryProcData; - ma_thread_result result; - - #if defined(MA_ON_THREAD_ENTRY) - MA_ON_THREAD_ENTRY - #endif - - entryProc = pProxyData->entryProc; - pEntryProcData = pProxyData->pData; - - /* Free the proxy data before getting into the real thread entry proc. */ - ma_free(pProxyData, &pProxyData->allocationCallbacks); - - result = entryProc(pEntryProcData); - - #if defined(MA_ON_THREAD_EXIT) - MA_ON_THREAD_EXIT - #endif - - return result; -} - -static ma_result ma_thread_create(ma_thread* pThread, ma_thread_priority priority, size_t stackSize, ma_thread_entry_proc entryProc, void* pData, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_result result; - ma_thread_proxy_data* pProxyData; - - if (pThread == NULL || entryProc == NULL) { - return MA_INVALID_ARGS; - } - - pProxyData = (ma_thread_proxy_data*)ma_malloc(sizeof(*pProxyData), pAllocationCallbacks); /* Will be freed by the proxy entry proc. */ - if (pProxyData == NULL) { - return MA_OUT_OF_MEMORY; - } - - pProxyData->entryProc = entryProc; - pProxyData->pData = pData; - ma_allocation_callbacks_init_copy(&pProxyData->allocationCallbacks, pAllocationCallbacks); - -#ifdef MA_WIN32 - result = ma_thread_create__win32(pThread, priority, stackSize, ma_thread_entry_proxy, pProxyData); -#endif -#ifdef MA_POSIX - result = ma_thread_create__posix(pThread, priority, stackSize, ma_thread_entry_proxy, pProxyData); -#endif - - if (result != MA_SUCCESS) { - ma_free(pProxyData, pAllocationCallbacks); - return result; - } - - return MA_SUCCESS; -} - -static void ma_thread_wait(ma_thread* pThread) -{ - if (pThread == NULL) { - return; - } - -#ifdef MA_WIN32 - ma_thread_wait__win32(pThread); -#endif -#ifdef MA_POSIX - ma_thread_wait__posix(pThread); -#endif -} - - -MA_API ma_result ma_mutex_init(ma_mutex* pMutex) -{ - if (pMutex == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return MA_INVALID_ARGS; - } - -#ifdef MA_WIN32 - return ma_mutex_init__win32(pMutex); -#endif -#ifdef MA_POSIX - return ma_mutex_init__posix(pMutex); -#endif -} - -MA_API void ma_mutex_uninit(ma_mutex* pMutex) -{ - if (pMutex == NULL) { - return; - } - -#ifdef MA_WIN32 - ma_mutex_uninit__win32(pMutex); -#endif -#ifdef MA_POSIX - ma_mutex_uninit__posix(pMutex); -#endif -} - -MA_API void ma_mutex_lock(ma_mutex* pMutex) -{ - if (pMutex == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return; - } - -#ifdef MA_WIN32 - ma_mutex_lock__win32(pMutex); -#endif -#ifdef MA_POSIX - ma_mutex_lock__posix(pMutex); -#endif -} - -MA_API void ma_mutex_unlock(ma_mutex* pMutex) -{ - if (pMutex == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return; -} - -#ifdef MA_WIN32 - ma_mutex_unlock__win32(pMutex); -#endif -#ifdef MA_POSIX - ma_mutex_unlock__posix(pMutex); -#endif -} - - -MA_API ma_result ma_event_init(ma_event* pEvent) -{ - if (pEvent == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return MA_INVALID_ARGS; - } - -#ifdef MA_WIN32 - return ma_event_init__win32(pEvent); -#endif -#ifdef MA_POSIX - return ma_event_init__posix(pEvent); -#endif -} - -#if 0 -static ma_result ma_event_alloc_and_init(ma_event** ppEvent, ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_result result; - ma_event* pEvent; - - if (ppEvent == NULL) { - return MA_INVALID_ARGS; - } - - *ppEvent = NULL; - - pEvent = ma_malloc(sizeof(*pEvent), pAllocationCallbacks); - if (pEvent == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_event_init(pEvent); - if (result != MA_SUCCESS) { - ma_free(pEvent, pAllocationCallbacks); - return result; - } - - *ppEvent = pEvent; - return result; -} -#endif - -MA_API void ma_event_uninit(ma_event* pEvent) -{ - if (pEvent == NULL) { - return; - } - -#ifdef MA_WIN32 - ma_event_uninit__win32(pEvent); -#endif -#ifdef MA_POSIX - ma_event_uninit__posix(pEvent); -#endif -} - -#if 0 -static void ma_event_uninit_and_free(ma_event* pEvent, ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pEvent == NULL) { - return; - } - - ma_event_uninit(pEvent); - ma_free(pEvent, pAllocationCallbacks); -} -#endif - -MA_API ma_result ma_event_wait(ma_event* pEvent) -{ - if (pEvent == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert to the caller is aware of this bug. */ - return MA_INVALID_ARGS; - } - -#ifdef MA_WIN32 - return ma_event_wait__win32(pEvent); -#endif -#ifdef MA_POSIX - return ma_event_wait__posix(pEvent); -#endif -} - -MA_API ma_result ma_event_signal(ma_event* pEvent) -{ - if (pEvent == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert to the caller is aware of this bug. */ - return MA_INVALID_ARGS; - } - -#ifdef MA_WIN32 - return ma_event_signal__win32(pEvent); -#endif -#ifdef MA_POSIX - return ma_event_signal__posix(pEvent); -#endif -} - - -MA_API ma_result ma_semaphore_init(int initialValue, ma_semaphore* pSemaphore) -{ - if (pSemaphore == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return MA_INVALID_ARGS; - } - -#ifdef MA_WIN32 - return ma_semaphore_init__win32(initialValue, pSemaphore); -#endif -#ifdef MA_POSIX - return ma_semaphore_init__posix(initialValue, pSemaphore); -#endif -} - -MA_API void ma_semaphore_uninit(ma_semaphore* pSemaphore) -{ - if (pSemaphore == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return; - } - -#ifdef MA_WIN32 - ma_semaphore_uninit__win32(pSemaphore); -#endif -#ifdef MA_POSIX - ma_semaphore_uninit__posix(pSemaphore); -#endif -} - -MA_API ma_result ma_semaphore_wait(ma_semaphore* pSemaphore) -{ - if (pSemaphore == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return MA_INVALID_ARGS; - } - -#ifdef MA_WIN32 - return ma_semaphore_wait__win32(pSemaphore); -#endif -#ifdef MA_POSIX - return ma_semaphore_wait__posix(pSemaphore); -#endif -} - -MA_API ma_result ma_semaphore_release(ma_semaphore* pSemaphore) -{ - if (pSemaphore == NULL) { - MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */ - return MA_INVALID_ARGS; - } - -#ifdef MA_WIN32 - return ma_semaphore_release__win32(pSemaphore); -#endif -#ifdef MA_POSIX - return ma_semaphore_release__posix(pSemaphore); -#endif -} -#else -/* MA_NO_THREADING is set which means threading is disabled. Threading is required by some API families. If any of these are enabled we need to throw an error. */ -#ifndef MA_NO_DEVICE_IO -#error "MA_NO_THREADING cannot be used without MA_NO_DEVICE_IO"; -#endif -#endif /* MA_NO_THREADING */ - - - -#define MA_FENCE_COUNTER_MAX 0x7FFFFFFF - -MA_API ma_result ma_fence_init(ma_fence* pFence) -{ - if (pFence == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pFence); - pFence->counter = 0; - - #ifndef MA_NO_THREADING - { - ma_result result; - - result = ma_event_init(&pFence->e); - if (result != MA_SUCCESS) { - return result; - } - } - #endif - - return MA_SUCCESS; -} - -MA_API void ma_fence_uninit(ma_fence* pFence) -{ - if (pFence == NULL) { - return; - } - - #ifndef MA_NO_THREADING - { - ma_event_uninit(&pFence->e); - } - #endif - - MA_ZERO_OBJECT(pFence); -} - -MA_API ma_result ma_fence_acquire(ma_fence* pFence) -{ - if (pFence == NULL) { - return MA_INVALID_ARGS; - } - - for (;;) { - ma_uint32 oldCounter = c89atomic_load_32(&pFence->counter); - ma_uint32 newCounter = oldCounter + 1; - - /* Make sure we're not about to exceed our maximum value. */ - if (newCounter > MA_FENCE_COUNTER_MAX) { - MA_ASSERT(MA_FALSE); - return MA_OUT_OF_RANGE; - } - - if (c89atomic_compare_exchange_weak_32(&pFence->counter, &oldCounter, newCounter)) { - return MA_SUCCESS; - } else { - if (oldCounter == MA_FENCE_COUNTER_MAX) { - MA_ASSERT(MA_FALSE); - return MA_OUT_OF_RANGE; /* The other thread took the last available slot. Abort. */ - } - } - } - - /* Should never get here. */ - /*return MA_SUCCESS;*/ -} - -MA_API ma_result ma_fence_release(ma_fence* pFence) -{ - if (pFence == NULL) { - return MA_INVALID_ARGS; - } - - for (;;) { - ma_uint32 oldCounter = c89atomic_load_32(&pFence->counter); - ma_uint32 newCounter = oldCounter - 1; - - if (oldCounter == 0) { - MA_ASSERT(MA_FALSE); - return MA_INVALID_OPERATION; /* Acquire/release mismatch. */ - } - - if (c89atomic_compare_exchange_weak_32(&pFence->counter, &oldCounter, newCounter)) { - #ifndef MA_NO_THREADING - { - if (newCounter == 0) { - ma_event_signal(&pFence->e); /* <-- ma_fence_wait() will be waiting on this. */ - } - } - #endif - - return MA_SUCCESS; - } else { - if (oldCounter == 0) { - MA_ASSERT(MA_FALSE); - return MA_INVALID_OPERATION; /* Another thread has taken the 0 slot. Acquire/release mismatch. */ - } - } - } - - /* Should never get here. */ - /*return MA_SUCCESS;*/ -} - -MA_API ma_result ma_fence_wait(ma_fence* pFence) -{ - if (pFence == NULL) { - return MA_INVALID_ARGS; - } - - for (;;) { - ma_uint32 counter; - - counter = c89atomic_load_32(&pFence->counter); - if (counter == 0) { - /* - Counter has hit zero. By the time we get here some other thread may have acquired the - fence again, but that is where the caller needs to take care with how they se the fence. - */ - return MA_SUCCESS; - } - - /* Getting here means the counter is > 0. We'll need to wait for something to happen. */ - #ifndef MA_NO_THREADING - { - ma_result result; - - result = ma_event_wait(&pFence->e); - if (result != MA_SUCCESS) { - return result; - } - } - #endif - } - - /* Should never get here. */ - /*return MA_INVALID_OPERATION;*/ -} - - -MA_API ma_result ma_async_notification_signal(ma_async_notification* pNotification) -{ - ma_async_notification_callbacks* pNotificationCallbacks = (ma_async_notification_callbacks*)pNotification; - - if (pNotification == NULL) { - return MA_INVALID_ARGS; - } - - if (pNotificationCallbacks->onSignal == NULL) { - return MA_NOT_IMPLEMENTED; - } - - pNotificationCallbacks->onSignal(pNotification); - return MA_INVALID_ARGS; -} - - -static void ma_async_notification_poll__on_signal(ma_async_notification* pNotification) -{ - ((ma_async_notification_poll*)pNotification)->signalled = MA_TRUE; -} - -MA_API ma_result ma_async_notification_poll_init(ma_async_notification_poll* pNotificationPoll) -{ - if (pNotificationPoll == NULL) { - return MA_INVALID_ARGS; - } - - pNotificationPoll->cb.onSignal = ma_async_notification_poll__on_signal; - pNotificationPoll->signalled = MA_FALSE; - - return MA_SUCCESS; -} - -MA_API ma_bool32 ma_async_notification_poll_is_signalled(const ma_async_notification_poll* pNotificationPoll) -{ - if (pNotificationPoll == NULL) { - return MA_FALSE; - } - - return pNotificationPoll->signalled; -} - - -static void ma_async_notification_event__on_signal(ma_async_notification* pNotification) -{ - ma_async_notification_event_signal((ma_async_notification_event*)pNotification); -} - -MA_API ma_result ma_async_notification_event_init(ma_async_notification_event* pNotificationEvent) -{ - if (pNotificationEvent == NULL) { - return MA_INVALID_ARGS; - } - - pNotificationEvent->cb.onSignal = ma_async_notification_event__on_signal; - - #ifndef MA_NO_THREADING - { - ma_result result; - - result = ma_event_init(&pNotificationEvent->e); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; - } - #else - { - return MA_NOT_IMPLEMENTED; /* Threading is disabled. */ - } - #endif -} - -MA_API ma_result ma_async_notification_event_uninit(ma_async_notification_event* pNotificationEvent) -{ - if (pNotificationEvent == NULL) { - return MA_INVALID_ARGS; - } - - #ifndef MA_NO_THREADING - { - ma_event_uninit(&pNotificationEvent->e); - return MA_SUCCESS; - } - #else - { - return MA_NOT_IMPLEMENTED; /* Threading is disabled. */ - } - #endif -} - -MA_API ma_result ma_async_notification_event_wait(ma_async_notification_event* pNotificationEvent) -{ - if (pNotificationEvent == NULL) { - return MA_INVALID_ARGS; - } - - #ifndef MA_NO_THREADING - { - return ma_event_wait(&pNotificationEvent->e); - } - #else - { - return MA_NOT_IMPLEMENTED; /* Threading is disabled. */ - } - #endif -} - -MA_API ma_result ma_async_notification_event_signal(ma_async_notification_event* pNotificationEvent) -{ - if (pNotificationEvent == NULL) { - return MA_INVALID_ARGS; - } - - #ifndef MA_NO_THREADING - { - return ma_event_signal(&pNotificationEvent->e); - } - #else - { - return MA_NOT_IMPLEMENTED; /* Threading is disabled. */ - } - #endif -} - - - -/************************************************************************************************************************************************************ - -Job Queue - -************************************************************************************************************************************************************/ -MA_API ma_slot_allocator_config ma_slot_allocator_config_init(ma_uint32 capacity) -{ - ma_slot_allocator_config config; - - MA_ZERO_OBJECT(&config); - config.capacity = capacity; - - return config; -} - - -static MA_INLINE ma_uint32 ma_slot_allocator_calculate_group_capacity(ma_uint32 slotCapacity) -{ - ma_uint32 cap = slotCapacity / 32; - if ((slotCapacity % 32) != 0) { - cap += 1; - } - - return cap; -} - -static MA_INLINE ma_uint32 ma_slot_allocator_group_capacity(const ma_slot_allocator* pAllocator) -{ - return ma_slot_allocator_calculate_group_capacity(pAllocator->capacity); -} - - -typedef struct -{ - size_t sizeInBytes; - size_t groupsOffset; - size_t slotsOffset; -} ma_slot_allocator_heap_layout; - -static ma_result ma_slot_allocator_get_heap_layout(const ma_slot_allocator_config* pConfig, ma_slot_allocator_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->capacity == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* Groups. */ - pHeapLayout->groupsOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(ma_slot_allocator_calculate_group_capacity(pConfig->capacity) * sizeof(ma_slot_allocator_group)); - - /* Slots. */ - pHeapLayout->slotsOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(pConfig->capacity * sizeof(ma_uint32)); - - return MA_SUCCESS; -} - -MA_API ma_result ma_slot_allocator_get_heap_size(const ma_slot_allocator_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_slot_allocator_heap_layout layout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_slot_allocator_get_heap_layout(pConfig, &layout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = layout.sizeInBytes; - - return result; -} - -MA_API ma_result ma_slot_allocator_init_preallocated(const ma_slot_allocator_config* pConfig, void* pHeap, ma_slot_allocator* pAllocator) -{ - ma_result result; - ma_slot_allocator_heap_layout heapLayout; - - if (pAllocator == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pAllocator); - - if (pHeap == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_slot_allocator_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pAllocator->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pAllocator->pGroups = (ma_slot_allocator_group*)ma_offset_ptr(pHeap, heapLayout.groupsOffset); - pAllocator->pSlots = (ma_uint32*)ma_offset_ptr(pHeap, heapLayout.slotsOffset); - pAllocator->capacity = pConfig->capacity; - - return MA_SUCCESS; -} - -MA_API ma_result ma_slot_allocator_init(const ma_slot_allocator_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_slot_allocator* pAllocator) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_slot_allocator_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the size of the heap allocation. */ - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_slot_allocator_init_preallocated(pConfig, pHeap, pAllocator); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pAllocator->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_slot_allocator_uninit(ma_slot_allocator* pAllocator, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocator == NULL) { - return; - } - - if (pAllocator->_ownsHeap) { - ma_free(pAllocator->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_slot_allocator_alloc(ma_slot_allocator* pAllocator, ma_uint64* pSlot) -{ - ma_uint32 iAttempt; - const ma_uint32 maxAttempts = 2; /* The number of iterations to perform until returning MA_OUT_OF_MEMORY if no slots can be found. */ - - if (pAllocator == NULL || pSlot == NULL) { - return MA_INVALID_ARGS; - } - - for (iAttempt = 0; iAttempt < maxAttempts; iAttempt += 1) { - /* We need to acquire a suitable bitfield first. This is a bitfield that's got an available slot within it. */ - ma_uint32 iGroup; - for (iGroup = 0; iGroup < ma_slot_allocator_group_capacity(pAllocator); iGroup += 1) { - /* CAS */ - for (;;) { - ma_uint32 oldBitfield; - ma_uint32 newBitfield; - ma_uint32 bitOffset; - - oldBitfield = c89atomic_load_32(&pAllocator->pGroups[iGroup].bitfield); /* <-- This copy must happen. The compiler must not optimize this away. */ - - /* Fast check to see if anything is available. */ - if (oldBitfield == 0xFFFFFFFF) { - break; /* No available bits in this bitfield. */ - } - - bitOffset = ma_ffs_32(~oldBitfield); - MA_ASSERT(bitOffset < 32); - - newBitfield = oldBitfield | (1 << bitOffset); - - if (c89atomic_compare_and_swap_32(&pAllocator->pGroups[iGroup].bitfield, oldBitfield, newBitfield) == oldBitfield) { - ma_uint32 slotIndex; - - /* Increment the counter as soon as possible to have other threads report out-of-memory sooner than later. */ - c89atomic_fetch_add_32(&pAllocator->count, 1); - - /* The slot index is required for constructing the output value. */ - slotIndex = (iGroup << 5) + bitOffset; /* iGroup << 5 = iGroup * 32 */ - if (slotIndex >= pAllocator->capacity) { - return MA_OUT_OF_MEMORY; - } - - /* Increment the reference count before constructing the output value. */ - pAllocator->pSlots[slotIndex] += 1; - - /* Construct the output value. */ - *pSlot = (((ma_uint64)pAllocator->pSlots[slotIndex] << 32) | slotIndex); - - return MA_SUCCESS; - } - } - } - - /* We weren't able to find a slot. If it's because we've reached our capacity we need to return MA_OUT_OF_MEMORY. Otherwise we need to do another iteration and try again. */ - if (pAllocator->count < pAllocator->capacity) { - ma_yield(); - } else { - return MA_OUT_OF_MEMORY; - } - } - - /* We couldn't find a slot within the maximum number of attempts. */ - return MA_OUT_OF_MEMORY; -} - -MA_API ma_result ma_slot_allocator_free(ma_slot_allocator* pAllocator, ma_uint64 slot) -{ - ma_uint32 iGroup; - ma_uint32 iBit; - - if (pAllocator == NULL) { - return MA_INVALID_ARGS; - } - - iGroup = (ma_uint32)((slot & 0xFFFFFFFF) >> 5); /* slot / 32 */ - iBit = (ma_uint32)((slot & 0xFFFFFFFF) & 31); /* slot % 32 */ - - if (iGroup >= ma_slot_allocator_group_capacity(pAllocator)) { - return MA_INVALID_ARGS; - } - - MA_ASSERT(iBit < 32); /* This must be true due to the logic we used to actually calculate it. */ - - while (c89atomic_load_32(&pAllocator->count) > 0) { - /* CAS */ - ma_uint32 oldBitfield; - ma_uint32 newBitfield; - - oldBitfield = c89atomic_load_32(&pAllocator->pGroups[iGroup].bitfield); /* <-- This copy must happen. The compiler must not optimize this away. */ - newBitfield = oldBitfield & ~(1 << iBit); - - /* Debugging for checking for double-frees. */ - #if defined(MA_DEBUG_OUTPUT) - { - if ((oldBitfield & (1 << iBit)) == 0) { - MA_ASSERT(MA_FALSE); /* Double free detected.*/ - } - } - #endif - - if (c89atomic_compare_and_swap_32(&pAllocator->pGroups[iGroup].bitfield, oldBitfield, newBitfield) == oldBitfield) { - c89atomic_fetch_sub_32(&pAllocator->count, 1); - return MA_SUCCESS; - } - } - - /* Getting here means there are no allocations available for freeing. */ - return MA_INVALID_OPERATION; -} - - -#define MA_JOB_ID_NONE ~((ma_uint64)0) -#define MA_JOB_SLOT_NONE (ma_uint16)(~0) - -static MA_INLINE ma_uint32 ma_job_extract_refcount(ma_uint64 toc) -{ - return (ma_uint32)(toc >> 32); -} - -static MA_INLINE ma_uint16 ma_job_extract_slot(ma_uint64 toc) -{ - return (ma_uint16)(toc & 0x0000FFFF); -} - -static MA_INLINE ma_uint16 ma_job_extract_code(ma_uint64 toc) -{ - return (ma_uint16)((toc & 0xFFFF0000) >> 16); -} - -static MA_INLINE ma_uint64 ma_job_toc_to_allocation(ma_uint64 toc) -{ - return ((ma_uint64)ma_job_extract_refcount(toc) << 32) | (ma_uint64)ma_job_extract_slot(toc); -} - -static MA_INLINE ma_uint64 ma_job_set_refcount(ma_uint64 toc, ma_uint32 refcount) -{ - /* Clear the reference count first. */ - toc = toc & ~((ma_uint64)0xFFFFFFFF << 32); - toc = toc | ((ma_uint64)refcount << 32); - - return toc; -} - - -MA_API ma_job ma_job_init(ma_uint16 code) -{ - ma_job job; - - MA_ZERO_OBJECT(&job); - job.toc.breakup.code = code; - job.toc.breakup.slot = MA_JOB_SLOT_NONE; /* Temp value. Will be allocated when posted to a queue. */ - job.next = MA_JOB_ID_NONE; - - return job; -} - - -static ma_result ma_job_process__noop(ma_job* pJob); -static ma_result ma_job_process__quit(ma_job* pJob); -static ma_result ma_job_process__custom(ma_job* pJob); -static ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob); -static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob); -static ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob); -static ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob); -static ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob); -static ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob); -static ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob); -static ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob); -static ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob); - -#if !defined(MA_NO_DEVICE_IO) -static ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob); -#endif - -static ma_job_proc g_jobVTable[MA_JOB_TYPE_COUNT] = -{ - /* Miscellaneous. */ - ma_job_process__quit, /* MA_JOB_TYPE_QUIT */ - ma_job_process__custom, /* MA_JOB_TYPE_CUSTOM */ - - /* Resource Manager. */ - ma_job_process__resource_manager__load_data_buffer_node, /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE */ - ma_job_process__resource_manager__free_data_buffer_node, /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE */ - ma_job_process__resource_manager__page_data_buffer_node, /* MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE */ - ma_job_process__resource_manager__load_data_buffer, /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER */ - ma_job_process__resource_manager__free_data_buffer, /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER */ - ma_job_process__resource_manager__load_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM */ - ma_job_process__resource_manager__free_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM */ - ma_job_process__resource_manager__page_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM */ - ma_job_process__resource_manager__seek_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM */ - - /* Device. */ -#if !defined(MA_NO_DEVICE_IO) - ma_job_process__device__aaudio_reroute /*MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE*/ -#endif -}; - -MA_API ma_result ma_job_process(ma_job* pJob) -{ - if (pJob == NULL) { - return MA_INVALID_ARGS; - } - - if (pJob->toc.breakup.code > MA_JOB_TYPE_COUNT) { - return MA_INVALID_OPERATION; - } - - return g_jobVTable[pJob->toc.breakup.code](pJob); -} - -static ma_result ma_job_process__noop(ma_job* pJob) -{ - MA_ASSERT(pJob != NULL); - - /* No-op. */ - (void)pJob; - - return MA_SUCCESS; -} - -static ma_result ma_job_process__quit(ma_job* pJob) -{ - return ma_job_process__noop(pJob); -} - -static ma_result ma_job_process__custom(ma_job* pJob) -{ - MA_ASSERT(pJob != NULL); - - /* No-op if there's no callback. */ - if (pJob->data.custom.proc == NULL) { - return MA_SUCCESS; - } - - return pJob->data.custom.proc(pJob); -} - - - -MA_API ma_job_queue_config ma_job_queue_config_init(ma_uint32 flags, ma_uint32 capacity) -{ - ma_job_queue_config config; - - config.flags = flags; - config.capacity = capacity; - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t allocatorOffset; - size_t jobsOffset; -} ma_job_queue_heap_layout; - -static ma_result ma_job_queue_get_heap_layout(const ma_job_queue_config* pConfig, ma_job_queue_heap_layout* pHeapLayout) -{ - ma_result result; - - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->capacity == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* Allocator. */ - { - ma_slot_allocator_config allocatorConfig; - size_t allocatorHeapSizeInBytes; - - allocatorConfig = ma_slot_allocator_config_init(pConfig->capacity); - result = ma_slot_allocator_get_heap_size(&allocatorConfig, &allocatorHeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->allocatorOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += allocatorHeapSizeInBytes; - } - - /* Jobs. */ - pHeapLayout->jobsOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(pConfig->capacity * sizeof(ma_job)); - - return MA_SUCCESS; -} - -MA_API ma_result ma_job_queue_get_heap_size(const ma_job_queue_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_job_queue_heap_layout layout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_job_queue_get_heap_layout(pConfig, &layout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = layout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_job_queue_init_preallocated(const ma_job_queue_config* pConfig, void* pHeap, ma_job_queue* pQueue) -{ - ma_result result; - ma_job_queue_heap_layout heapLayout; - ma_slot_allocator_config allocatorConfig; - - if (pQueue == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pQueue); - - result = ma_job_queue_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pQueue->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pQueue->flags = pConfig->flags; - pQueue->capacity = pConfig->capacity; - pQueue->pJobs = (ma_job*)ma_offset_ptr(pHeap, heapLayout.jobsOffset); - - allocatorConfig = ma_slot_allocator_config_init(pConfig->capacity); - result = ma_slot_allocator_init_preallocated(&allocatorConfig, ma_offset_ptr(pHeap, heapLayout.allocatorOffset), &pQueue->allocator); - if (result != MA_SUCCESS) { - return result; - } - - /* We need a semaphore if we're running in non-blocking mode. If threading is disabled we need to return an error. */ - if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) { - #ifndef MA_NO_THREADING - { - ma_semaphore_init(0, &pQueue->sem); - } - #else - { - /* Threading is disabled and we've requested non-blocking mode. */ - return MA_INVALID_OPERATION; - } - #endif - } - - /* - Our queue needs to be initialized with a free standing node. This should always be slot 0. Required for the lock free algorithm. The first job in the queue is - just a dummy item for giving us the first item in the list which is stored in the "next" member. - */ - ma_slot_allocator_alloc(&pQueue->allocator, &pQueue->head); /* Will never fail. */ - pQueue->pJobs[ma_job_extract_slot(pQueue->head)].next = MA_JOB_ID_NONE; - pQueue->tail = pQueue->head; - - return MA_SUCCESS; -} - -MA_API ma_result ma_job_queue_init(const ma_job_queue_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_job_queue* pQueue) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_job_queue_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_job_queue_init_preallocated(pConfig, pHeap, pQueue); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pQueue->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_job_queue_uninit(ma_job_queue* pQueue, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pQueue == NULL) { - return; - } - - /* All we need to do is uninitialize the semaphore. */ - if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) { - #ifndef MA_NO_THREADING - { - ma_semaphore_uninit(&pQueue->sem); - } - #else - { - MA_ASSERT(MA_FALSE); /* Should never get here. Should have been checked at initialization time. */ - } - #endif - } - - ma_slot_allocator_uninit(&pQueue->allocator, pAllocationCallbacks); - - if (pQueue->_ownsHeap) { - ma_free(pQueue->_pHeap, pAllocationCallbacks); - } -} - -static ma_bool32 ma_job_queue_cas(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired) -{ - /* The new counter is taken from the expected value. */ - return c89atomic_compare_and_swap_64(dst, expected, ma_job_set_refcount(desired, ma_job_extract_refcount(expected) + 1)) == expected; -} - -MA_API ma_result ma_job_queue_post(ma_job_queue* pQueue, const ma_job* pJob) -{ - /* - Lock free queue implementation based on the paper by Michael and Scott: Nonblocking Algorithms and Preemption-Safe Locking on Multiprogrammed Shared Memory Multiprocessors - */ - ma_result result; - ma_uint64 slot; - ma_uint64 tail; - ma_uint64 next; - - if (pQueue == NULL || pJob == NULL) { - return MA_INVALID_ARGS; - } - - /* We need a new slot. */ - result = ma_slot_allocator_alloc(&pQueue->allocator, &slot); - if (result != MA_SUCCESS) { - return result; /* Probably ran out of slots. If so, MA_OUT_OF_MEMORY will be returned. */ - } - - /* At this point we should have a slot to place the job. */ - MA_ASSERT(ma_job_extract_slot(slot) < pQueue->capacity); - - /* We need to put the job into memory before we do anything. */ - pQueue->pJobs[ma_job_extract_slot(slot)] = *pJob; - pQueue->pJobs[ma_job_extract_slot(slot)].toc.allocation = slot; /* This will overwrite the job code. */ - pQueue->pJobs[ma_job_extract_slot(slot)].toc.breakup.code = pJob->toc.breakup.code; /* The job code needs to be applied again because the line above overwrote it. */ - pQueue->pJobs[ma_job_extract_slot(slot)].next = MA_JOB_ID_NONE; /* Reset for safety. */ - - #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE - ma_spinlock_lock(&pQueue->lock); - #endif - { - /* The job is stored in memory so now we need to add it to our linked list. We only ever add items to the end of the list. */ - for (;;) { - tail = c89atomic_load_64(&pQueue->tail); - next = c89atomic_load_64(&pQueue->pJobs[ma_job_extract_slot(tail)].next); - - if (ma_job_toc_to_allocation(tail) == ma_job_toc_to_allocation(c89atomic_load_64(&pQueue->tail))) { - if (ma_job_extract_slot(next) == 0xFFFF) { - if (ma_job_queue_cas(&pQueue->pJobs[ma_job_extract_slot(tail)].next, next, slot)) { - break; - } - } else { - ma_job_queue_cas(&pQueue->tail, tail, ma_job_extract_slot(next)); - } - } - } - ma_job_queue_cas(&pQueue->tail, tail, slot); - } - #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE - ma_spinlock_unlock(&pQueue->lock); - #endif - - - /* Signal the semaphore as the last step if we're using synchronous mode. */ - if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) { - #ifndef MA_NO_THREADING - { - ma_semaphore_release(&pQueue->sem); - } - #else - { - MA_ASSERT(MA_FALSE); /* Should never get here. Should have been checked at initialization time. */ - } - #endif - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_job_queue_next(ma_job_queue* pQueue, ma_job* pJob) -{ - ma_uint64 head; - ma_uint64 tail; - ma_uint64 next; - - if (pQueue == NULL || pJob == NULL) { - return MA_INVALID_ARGS; - } - - /* If we're running in synchronous mode we'll need to wait on a semaphore. */ - if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) { - #ifndef MA_NO_THREADING - { - ma_semaphore_wait(&pQueue->sem); - } - #else - { - MA_ASSERT(MA_FALSE); /* Should never get here. Should have been checked at initialization time. */ - } - #endif - } - - #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE - ma_spinlock_lock(&pQueue->lock); - #endif - { - /* - BUG: In lock-free mode, multiple threads can be in this section of code. The "head" variable in the loop below - is stored. One thread can fall through to the freeing of this item while another is still using "head" for the - retrieval of the "next" variable. - - The slot allocator might need to make use of some reference counting to ensure it's only truely freed when - there are no more references to the item. This must be fixed before removing these locks. - */ - - /* Now we need to remove the root item from the list. */ - for (;;) { - head = c89atomic_load_64(&pQueue->head); - tail = c89atomic_load_64(&pQueue->tail); - next = c89atomic_load_64(&pQueue->pJobs[ma_job_extract_slot(head)].next); - - if (ma_job_toc_to_allocation(head) == ma_job_toc_to_allocation(c89atomic_load_64(&pQueue->head))) { - if (ma_job_extract_slot(head) == ma_job_extract_slot(tail)) { - if (ma_job_extract_slot(next) == 0xFFFF) { - #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE - ma_spinlock_unlock(&pQueue->lock); - #endif - return MA_NO_DATA_AVAILABLE; - } - ma_job_queue_cas(&pQueue->tail, tail, ma_job_extract_slot(next)); - } else { - *pJob = pQueue->pJobs[ma_job_extract_slot(next)]; - if (ma_job_queue_cas(&pQueue->head, head, ma_job_extract_slot(next))) { - break; - } - } - } - } - } - #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE - ma_spinlock_unlock(&pQueue->lock); - #endif - - ma_slot_allocator_free(&pQueue->allocator, head); - - /* - If it's a quit job make sure it's put back on the queue to ensure other threads have an opportunity to detect it and terminate naturally. We - could instead just leave it on the queue, but that would involve fiddling with the lock-free code above and I want to keep that as simple as - possible. - */ - if (pJob->toc.breakup.code == MA_JOB_TYPE_QUIT) { - ma_job_queue_post(pQueue, pJob); - return MA_CANCELLED; /* Return a cancelled status just in case the thread is checking return codes and not properly checking for a quit job. */ - } - - return MA_SUCCESS; -} - - - - -/************************************************************************************************************************************************************ -************************************************************************************************************************************************************* - -DEVICE I/O -========== - -************************************************************************************************************************************************************* -************************************************************************************************************************************************************/ -#ifndef MA_NO_DEVICE_IO -#ifdef MA_WIN32 - #include - #include - #include -#endif - -#if defined(MA_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200) - #include /* For mach_absolute_time() */ -#endif - -#ifdef MA_POSIX - #include - #include - #include -#endif - -/* -Unfortunately using runtime linking for pthreads causes problems. This has occurred for me when testing on FreeBSD. When -using runtime linking, deadlocks can occur (for me it happens when loading data from fread()). It turns out that doing -compile-time linking fixes this. I'm not sure why this happens, but the safest way I can think of to fix this is to simply -disable runtime linking by default. To enable runtime linking, #define this before the implementation of this file. I am -not officially supporting this, but I'm leaving it here in case it's useful for somebody, somewhere. -*/ -/*#define MA_USE_RUNTIME_LINKING_FOR_PTHREAD*/ - -/* Disable run-time linking on certain backends. */ -#ifndef MA_NO_RUNTIME_LINKING - #if defined(MA_EMSCRIPTEN) - #define MA_NO_RUNTIME_LINKING - #endif -#endif - - -MA_API void ma_device_info_add_native_data_format(ma_device_info* pDeviceInfo, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 flags) -{ - if (pDeviceInfo == NULL) { - return; - } - - if (pDeviceInfo->nativeDataFormatCount < ma_countof(pDeviceInfo->nativeDataFormats)) { - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = format; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels = channels; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = flags; - pDeviceInfo->nativeDataFormatCount += 1; - } -} - - -MA_API const char* ma_get_backend_name(ma_backend backend) -{ - switch (backend) - { - case ma_backend_wasapi: return "WASAPI"; - case ma_backend_dsound: return "DirectSound"; - case ma_backend_winmm: return "WinMM"; - case ma_backend_coreaudio: return "Core Audio"; - case ma_backend_sndio: return "sndio"; - case ma_backend_audio4: return "audio(4)"; - case ma_backend_oss: return "OSS"; - case ma_backend_pulseaudio: return "PulseAudio"; - case ma_backend_alsa: return "ALSA"; - case ma_backend_jack: return "JACK"; - case ma_backend_aaudio: return "AAudio"; - case ma_backend_opensl: return "OpenSL|ES"; - case ma_backend_webaudio: return "Web Audio"; - case ma_backend_custom: return "Custom"; - case ma_backend_null: return "Null"; - default: return "Unknown"; - } -} - -MA_API ma_bool32 ma_is_backend_enabled(ma_backend backend) -{ - /* - This looks a little bit gross, but we want all backends to be included in the switch to avoid warnings on some compilers - about some enums not being handled by the switch statement. - */ - switch (backend) - { - case ma_backend_wasapi: - #if defined(MA_HAS_WASAPI) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_dsound: - #if defined(MA_HAS_DSOUND) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_winmm: - #if defined(MA_HAS_WINMM) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_coreaudio: - #if defined(MA_HAS_COREAUDIO) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_sndio: - #if defined(MA_HAS_SNDIO) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_audio4: - #if defined(MA_HAS_AUDIO4) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_oss: - #if defined(MA_HAS_OSS) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_pulseaudio: - #if defined(MA_HAS_PULSEAUDIO) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_alsa: - #if defined(MA_HAS_ALSA) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_jack: - #if defined(MA_HAS_JACK) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_aaudio: - #if defined(MA_HAS_AAUDIO) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_opensl: - #if defined(MA_HAS_OPENSL) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_webaudio: - #if defined(MA_HAS_WEBAUDIO) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_custom: - #if defined(MA_HAS_CUSTOM) - return MA_TRUE; - #else - return MA_FALSE; - #endif - case ma_backend_null: - #if defined(MA_HAS_NULL) - return MA_TRUE; - #else - return MA_FALSE; - #endif - - default: return MA_FALSE; - } -} - -MA_API ma_result ma_get_enabled_backends(ma_backend* pBackends, size_t backendCap, size_t* pBackendCount) -{ - size_t backendCount; - size_t iBackend; - ma_result result = MA_SUCCESS; - - if (pBackendCount == NULL) { - return MA_INVALID_ARGS; - } - - backendCount = 0; - - for (iBackend = 0; iBackend <= ma_backend_null; iBackend += 1) { - ma_backend backend = (ma_backend)iBackend; - - if (ma_is_backend_enabled(backend)) { - /* The backend is enabled. Try adding it to the list. If there's no room, MA_NO_SPACE needs to be returned. */ - if (backendCount == backendCap) { - result = MA_NO_SPACE; - break; - } else { - pBackends[backendCount] = backend; - backendCount += 1; - } - } - } - - if (pBackendCount != NULL) { - *pBackendCount = backendCount; - } - - return result; -} - -MA_API ma_bool32 ma_is_loopback_supported(ma_backend backend) -{ - switch (backend) - { - case ma_backend_wasapi: return MA_TRUE; - case ma_backend_dsound: return MA_FALSE; - case ma_backend_winmm: return MA_FALSE; - case ma_backend_coreaudio: return MA_FALSE; - case ma_backend_sndio: return MA_FALSE; - case ma_backend_audio4: return MA_FALSE; - case ma_backend_oss: return MA_FALSE; - case ma_backend_pulseaudio: return MA_FALSE; - case ma_backend_alsa: return MA_FALSE; - case ma_backend_jack: return MA_FALSE; - case ma_backend_aaudio: return MA_FALSE; - case ma_backend_opensl: return MA_FALSE; - case ma_backend_webaudio: return MA_FALSE; - case ma_backend_custom: return MA_FALSE; /* <-- Will depend on the implementation of the backend. */ - case ma_backend_null: return MA_FALSE; - default: return MA_FALSE; - } -} - - - -#ifdef MA_WIN32 -/* WASAPI error codes. */ -#define MA_AUDCLNT_E_NOT_INITIALIZED ((HRESULT)0x88890001) -#define MA_AUDCLNT_E_ALREADY_INITIALIZED ((HRESULT)0x88890002) -#define MA_AUDCLNT_E_WRONG_ENDPOINT_TYPE ((HRESULT)0x88890003) -#define MA_AUDCLNT_E_DEVICE_INVALIDATED ((HRESULT)0x88890004) -#define MA_AUDCLNT_E_NOT_STOPPED ((HRESULT)0x88890005) -#define MA_AUDCLNT_E_BUFFER_TOO_LARGE ((HRESULT)0x88890006) -#define MA_AUDCLNT_E_OUT_OF_ORDER ((HRESULT)0x88890007) -#define MA_AUDCLNT_E_UNSUPPORTED_FORMAT ((HRESULT)0x88890008) -#define MA_AUDCLNT_E_INVALID_SIZE ((HRESULT)0x88890009) -#define MA_AUDCLNT_E_DEVICE_IN_USE ((HRESULT)0x8889000A) -#define MA_AUDCLNT_E_BUFFER_OPERATION_PENDING ((HRESULT)0x8889000B) -#define MA_AUDCLNT_E_THREAD_NOT_REGISTERED ((HRESULT)0x8889000C) -#define MA_AUDCLNT_E_NO_SINGLE_PROCESS ((HRESULT)0x8889000D) -#define MA_AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED ((HRESULT)0x8889000E) -#define MA_AUDCLNT_E_ENDPOINT_CREATE_FAILED ((HRESULT)0x8889000F) -#define MA_AUDCLNT_E_SERVICE_NOT_RUNNING ((HRESULT)0x88890010) -#define MA_AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED ((HRESULT)0x88890011) -#define MA_AUDCLNT_E_EXCLUSIVE_MODE_ONLY ((HRESULT)0x88890012) -#define MA_AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL ((HRESULT)0x88890013) -#define MA_AUDCLNT_E_EVENTHANDLE_NOT_SET ((HRESULT)0x88890014) -#define MA_AUDCLNT_E_INCORRECT_BUFFER_SIZE ((HRESULT)0x88890015) -#define MA_AUDCLNT_E_BUFFER_SIZE_ERROR ((HRESULT)0x88890016) -#define MA_AUDCLNT_E_CPUUSAGE_EXCEEDED ((HRESULT)0x88890017) -#define MA_AUDCLNT_E_BUFFER_ERROR ((HRESULT)0x88890018) -#define MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED ((HRESULT)0x88890019) -#define MA_AUDCLNT_E_INVALID_DEVICE_PERIOD ((HRESULT)0x88890020) -#define MA_AUDCLNT_E_INVALID_STREAM_FLAG ((HRESULT)0x88890021) -#define MA_AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE ((HRESULT)0x88890022) -#define MA_AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES ((HRESULT)0x88890023) -#define MA_AUDCLNT_E_OFFLOAD_MODE_ONLY ((HRESULT)0x88890024) -#define MA_AUDCLNT_E_NONOFFLOAD_MODE_ONLY ((HRESULT)0x88890025) -#define MA_AUDCLNT_E_RESOURCES_INVALIDATED ((HRESULT)0x88890026) -#define MA_AUDCLNT_E_RAW_MODE_UNSUPPORTED ((HRESULT)0x88890027) -#define MA_AUDCLNT_E_ENGINE_PERIODICITY_LOCKED ((HRESULT)0x88890028) -#define MA_AUDCLNT_E_ENGINE_FORMAT_LOCKED ((HRESULT)0x88890029) -#define MA_AUDCLNT_E_HEADTRACKING_ENABLED ((HRESULT)0x88890030) -#define MA_AUDCLNT_E_HEADTRACKING_UNSUPPORTED ((HRESULT)0x88890040) -#define MA_AUDCLNT_S_BUFFER_EMPTY ((HRESULT)0x08890001) -#define MA_AUDCLNT_S_THREAD_ALREADY_REGISTERED ((HRESULT)0x08890002) -#define MA_AUDCLNT_S_POSITION_STALLED ((HRESULT)0x08890003) - -#define MA_DS_OK ((HRESULT)0) -#define MA_DS_NO_VIRTUALIZATION ((HRESULT)0x0878000A) -#define MA_DSERR_ALLOCATED ((HRESULT)0x8878000A) -#define MA_DSERR_CONTROLUNAVAIL ((HRESULT)0x8878001E) -#define MA_DSERR_INVALIDPARAM ((HRESULT)0x80070057) /*E_INVALIDARG*/ -#define MA_DSERR_INVALIDCALL ((HRESULT)0x88780032) -#define MA_DSERR_GENERIC ((HRESULT)0x80004005) /*E_FAIL*/ -#define MA_DSERR_PRIOLEVELNEEDED ((HRESULT)0x88780046) -#define MA_DSERR_OUTOFMEMORY ((HRESULT)0x8007000E) /*E_OUTOFMEMORY*/ -#define MA_DSERR_BADFORMAT ((HRESULT)0x88780064) -#define MA_DSERR_UNSUPPORTED ((HRESULT)0x80004001) /*E_NOTIMPL*/ -#define MA_DSERR_NODRIVER ((HRESULT)0x88780078) -#define MA_DSERR_ALREADYINITIALIZED ((HRESULT)0x88780082) -#define MA_DSERR_NOAGGREGATION ((HRESULT)0x80040110) /*CLASS_E_NOAGGREGATION*/ -#define MA_DSERR_BUFFERLOST ((HRESULT)0x88780096) -#define MA_DSERR_OTHERAPPHASPRIO ((HRESULT)0x887800A0) -#define MA_DSERR_UNINITIALIZED ((HRESULT)0x887800AA) -#define MA_DSERR_NOINTERFACE ((HRESULT)0x80004002) /*E_NOINTERFACE*/ -#define MA_DSERR_ACCESSDENIED ((HRESULT)0x80070005) /*E_ACCESSDENIED*/ -#define MA_DSERR_BUFFERTOOSMALL ((HRESULT)0x887800B4) -#define MA_DSERR_DS8_REQUIRED ((HRESULT)0x887800BE) -#define MA_DSERR_SENDLOOP ((HRESULT)0x887800C8) -#define MA_DSERR_BADSENDBUFFERGUID ((HRESULT)0x887800D2) -#define MA_DSERR_OBJECTNOTFOUND ((HRESULT)0x88781161) -#define MA_DSERR_FXUNAVAILABLE ((HRESULT)0x887800DC) - -static ma_result ma_result_from_HRESULT(HRESULT hr) -{ - switch (hr) - { - case NOERROR: return MA_SUCCESS; - /*case S_OK: return MA_SUCCESS;*/ - - case E_POINTER: return MA_INVALID_ARGS; - case E_UNEXPECTED: return MA_ERROR; - case E_NOTIMPL: return MA_NOT_IMPLEMENTED; - case E_OUTOFMEMORY: return MA_OUT_OF_MEMORY; - case E_INVALIDARG: return MA_INVALID_ARGS; - case E_NOINTERFACE: return MA_API_NOT_FOUND; - case E_HANDLE: return MA_INVALID_ARGS; - case E_ABORT: return MA_ERROR; - case E_FAIL: return MA_ERROR; - case E_ACCESSDENIED: return MA_ACCESS_DENIED; - - /* WASAPI */ - case MA_AUDCLNT_E_NOT_INITIALIZED: return MA_DEVICE_NOT_INITIALIZED; - case MA_AUDCLNT_E_ALREADY_INITIALIZED: return MA_DEVICE_ALREADY_INITIALIZED; - case MA_AUDCLNT_E_WRONG_ENDPOINT_TYPE: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_DEVICE_INVALIDATED: return MA_UNAVAILABLE; - case MA_AUDCLNT_E_NOT_STOPPED: return MA_DEVICE_NOT_STOPPED; - case MA_AUDCLNT_E_BUFFER_TOO_LARGE: return MA_TOO_BIG; - case MA_AUDCLNT_E_OUT_OF_ORDER: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_UNSUPPORTED_FORMAT: return MA_FORMAT_NOT_SUPPORTED; - case MA_AUDCLNT_E_INVALID_SIZE: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_DEVICE_IN_USE: return MA_BUSY; - case MA_AUDCLNT_E_BUFFER_OPERATION_PENDING: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_THREAD_NOT_REGISTERED: return MA_DOES_NOT_EXIST; - case MA_AUDCLNT_E_NO_SINGLE_PROCESS: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED: return MA_SHARE_MODE_NOT_SUPPORTED; - case MA_AUDCLNT_E_ENDPOINT_CREATE_FAILED: return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - case MA_AUDCLNT_E_SERVICE_NOT_RUNNING: return MA_NOT_CONNECTED; - case MA_AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_EXCLUSIVE_MODE_ONLY: return MA_SHARE_MODE_NOT_SUPPORTED; - case MA_AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_EVENTHANDLE_NOT_SET: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_INCORRECT_BUFFER_SIZE: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_BUFFER_SIZE_ERROR: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_CPUUSAGE_EXCEEDED: return MA_ERROR; - case MA_AUDCLNT_E_BUFFER_ERROR: return MA_ERROR; - case MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_INVALID_DEVICE_PERIOD: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_INVALID_STREAM_FLAG: return MA_INVALID_ARGS; - case MA_AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES: return MA_OUT_OF_MEMORY; - case MA_AUDCLNT_E_OFFLOAD_MODE_ONLY: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_NONOFFLOAD_MODE_ONLY: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_RESOURCES_INVALIDATED: return MA_INVALID_DATA; - case MA_AUDCLNT_E_RAW_MODE_UNSUPPORTED: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_ENGINE_PERIODICITY_LOCKED: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_ENGINE_FORMAT_LOCKED: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_HEADTRACKING_ENABLED: return MA_INVALID_OPERATION; - case MA_AUDCLNT_E_HEADTRACKING_UNSUPPORTED: return MA_INVALID_OPERATION; - case MA_AUDCLNT_S_BUFFER_EMPTY: return MA_NO_SPACE; - case MA_AUDCLNT_S_THREAD_ALREADY_REGISTERED: return MA_ALREADY_EXISTS; - case MA_AUDCLNT_S_POSITION_STALLED: return MA_ERROR; - - /* DirectSound */ - /*case MA_DS_OK: return MA_SUCCESS;*/ /* S_OK */ - case MA_DS_NO_VIRTUALIZATION: return MA_SUCCESS; - case MA_DSERR_ALLOCATED: return MA_ALREADY_IN_USE; - case MA_DSERR_CONTROLUNAVAIL: return MA_INVALID_OPERATION; - /*case MA_DSERR_INVALIDPARAM: return MA_INVALID_ARGS;*/ /* E_INVALIDARG */ - case MA_DSERR_INVALIDCALL: return MA_INVALID_OPERATION; - /*case MA_DSERR_GENERIC: return MA_ERROR;*/ /* E_FAIL */ - case MA_DSERR_PRIOLEVELNEEDED: return MA_INVALID_OPERATION; - /*case MA_DSERR_OUTOFMEMORY: return MA_OUT_OF_MEMORY;*/ /* E_OUTOFMEMORY */ - case MA_DSERR_BADFORMAT: return MA_FORMAT_NOT_SUPPORTED; - /*case MA_DSERR_UNSUPPORTED: return MA_NOT_IMPLEMENTED;*/ /* E_NOTIMPL */ - case MA_DSERR_NODRIVER: return MA_FAILED_TO_INIT_BACKEND; - case MA_DSERR_ALREADYINITIALIZED: return MA_DEVICE_ALREADY_INITIALIZED; - case MA_DSERR_NOAGGREGATION: return MA_ERROR; - case MA_DSERR_BUFFERLOST: return MA_UNAVAILABLE; - case MA_DSERR_OTHERAPPHASPRIO: return MA_ACCESS_DENIED; - case MA_DSERR_UNINITIALIZED: return MA_DEVICE_NOT_INITIALIZED; - /*case MA_DSERR_NOINTERFACE: return MA_API_NOT_FOUND;*/ /* E_NOINTERFACE */ - /*case MA_DSERR_ACCESSDENIED: return MA_ACCESS_DENIED;*/ /* E_ACCESSDENIED */ - case MA_DSERR_BUFFERTOOSMALL: return MA_NO_SPACE; - case MA_DSERR_DS8_REQUIRED: return MA_INVALID_OPERATION; - case MA_DSERR_SENDLOOP: return MA_DEADLOCK; - case MA_DSERR_BADSENDBUFFERGUID: return MA_INVALID_ARGS; - case MA_DSERR_OBJECTNOTFOUND: return MA_NO_DEVICE; - case MA_DSERR_FXUNAVAILABLE: return MA_UNAVAILABLE; - - default: return MA_ERROR; - } -} - -typedef HRESULT (WINAPI * MA_PFN_CoInitializeEx)(LPVOID pvReserved, DWORD dwCoInit); -typedef void (WINAPI * MA_PFN_CoUninitialize)(void); -typedef HRESULT (WINAPI * MA_PFN_CoCreateInstance)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv); -typedef void (WINAPI * MA_PFN_CoTaskMemFree)(LPVOID pv); -typedef HRESULT (WINAPI * MA_PFN_PropVariantClear)(PROPVARIANT *pvar); -typedef int (WINAPI * MA_PFN_StringFromGUID2)(const GUID* const rguid, LPOLESTR lpsz, int cchMax); - -typedef HWND (WINAPI * MA_PFN_GetForegroundWindow)(void); -typedef HWND (WINAPI * MA_PFN_GetDesktopWindow)(void); - -#if defined(MA_WIN32_DESKTOP) -/* Microsoft documents these APIs as returning LSTATUS, but the Win32 API shipping with some compilers do not define it. It's just a LONG. */ -typedef LONG (WINAPI * MA_PFN_RegOpenKeyExA)(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult); -typedef LONG (WINAPI * MA_PFN_RegCloseKey)(HKEY hKey); -typedef LONG (WINAPI * MA_PFN_RegQueryValueExA)(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData); -#endif /* MA_WIN32_DESKTOP */ -#endif /* MA_WIN32 */ - - -#define MA_DEFAULT_PLAYBACK_DEVICE_NAME "Default Playback Device" -#define MA_DEFAULT_CAPTURE_DEVICE_NAME "Default Capture Device" - - - - -/******************************************************************************* - -Timing - -*******************************************************************************/ -#ifdef MA_WIN32 - static LARGE_INTEGER g_ma_TimerFrequency; /* <-- Initialized to zero since it's static. */ - void ma_timer_init(ma_timer* pTimer) - { - LARGE_INTEGER counter; - - if (g_ma_TimerFrequency.QuadPart == 0) { - QueryPerformanceFrequency(&g_ma_TimerFrequency); - } - - QueryPerformanceCounter(&counter); - pTimer->counter = counter.QuadPart; - } - - double ma_timer_get_time_in_seconds(ma_timer* pTimer) - { - LARGE_INTEGER counter; - if (!QueryPerformanceCounter(&counter)) { - return 0; - } - - return (double)(counter.QuadPart - pTimer->counter) / g_ma_TimerFrequency.QuadPart; - } -#elif defined(MA_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200) - static ma_uint64 g_ma_TimerFrequency = 0; - static void ma_timer_init(ma_timer* pTimer) - { - mach_timebase_info_data_t baseTime; - mach_timebase_info(&baseTime); - g_ma_TimerFrequency = (baseTime.denom * 1e9) / baseTime.numer; - - pTimer->counter = mach_absolute_time(); - } - - static double ma_timer_get_time_in_seconds(ma_timer* pTimer) - { - ma_uint64 newTimeCounter = mach_absolute_time(); - ma_uint64 oldTimeCounter = pTimer->counter; - - return (newTimeCounter - oldTimeCounter) / g_ma_TimerFrequency; - } -#elif defined(MA_EMSCRIPTEN) - static MA_INLINE void ma_timer_init(ma_timer* pTimer) - { - pTimer->counterD = emscripten_get_now(); - } - - static MA_INLINE double ma_timer_get_time_in_seconds(ma_timer* pTimer) - { - return (emscripten_get_now() - pTimer->counterD) / 1000; /* Emscripten is in milliseconds. */ - } -#else - #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L - #if defined(CLOCK_MONOTONIC) - #define MA_CLOCK_ID CLOCK_MONOTONIC - #else - #define MA_CLOCK_ID CLOCK_REALTIME - #endif - - static void ma_timer_init(ma_timer* pTimer) - { - struct timespec newTime; - clock_gettime(MA_CLOCK_ID, &newTime); - - pTimer->counter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec; - } - - static double ma_timer_get_time_in_seconds(ma_timer* pTimer) - { - ma_uint64 newTimeCounter; - ma_uint64 oldTimeCounter; - - struct timespec newTime; - clock_gettime(MA_CLOCK_ID, &newTime); - - newTimeCounter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec; - oldTimeCounter = pTimer->counter; - - return (newTimeCounter - oldTimeCounter) / 1000000000.0; - } - #else - static void ma_timer_init(ma_timer* pTimer) - { - struct timeval newTime; - gettimeofday(&newTime, NULL); - - pTimer->counter = (newTime.tv_sec * 1000000) + newTime.tv_usec; - } - - static double ma_timer_get_time_in_seconds(ma_timer* pTimer) - { - ma_uint64 newTimeCounter; - ma_uint64 oldTimeCounter; - - struct timeval newTime; - gettimeofday(&newTime, NULL); - - newTimeCounter = (newTime.tv_sec * 1000000) + newTime.tv_usec; - oldTimeCounter = pTimer->counter; - - return (newTimeCounter - oldTimeCounter) / 1000000.0; - } - #endif -#endif - - -/******************************************************************************* - -Dynamic Linking - -*******************************************************************************/ -MA_API ma_handle ma_dlopen(ma_context* pContext, const char* filename) -{ - ma_handle handle; - - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Loading library: %s\n", filename); - -#ifdef _WIN32 -#ifdef MA_WIN32_DESKTOP - handle = (ma_handle)LoadLibraryA(filename); -#else - /* *sigh* It appears there is no ANSI version of LoadPackagedLibrary()... */ - WCHAR filenameW[4096]; - if (MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, sizeof(filenameW)) == 0) { - handle = NULL; - } else { - handle = (ma_handle)LoadPackagedLibrary(filenameW, 0); - } -#endif -#else - handle = (ma_handle)dlopen(filename, RTLD_NOW); -#endif - - /* - I'm not considering failure to load a library an error nor a warning because seamlessly falling through to a lower-priority - backend is a deliberate design choice. Instead I'm logging it as an informational message. - */ - if (handle == NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, "Failed to load library: %s\n", filename); - } - - (void)pContext; /* It's possible for pContext to be unused. */ - return handle; -} - -MA_API void ma_dlclose(ma_context* pContext, ma_handle handle) -{ -#ifdef _WIN32 - FreeLibrary((HMODULE)handle); -#else - dlclose((void*)handle); -#endif - - (void)pContext; -} - -MA_API ma_proc ma_dlsym(ma_context* pContext, ma_handle handle, const char* symbol) -{ - ma_proc proc; - - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Loading symbol: %s\n", symbol); - -#ifdef _WIN32 - proc = (ma_proc)GetProcAddress((HMODULE)handle, symbol); -#else -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wpedantic" -#endif - proc = (ma_proc)dlsym((void*)handle, symbol); -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) - #pragma GCC diagnostic pop -#endif -#endif - - if (proc == NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "Failed to load symbol: %s\n", symbol); - } - - (void)pContext; /* It's possible for pContext to be unused. */ - return proc; -} - - -#if 0 -static ma_uint32 ma_get_closest_standard_sample_rate(ma_uint32 sampleRateIn) -{ - ma_uint32 closestRate = 0; - ma_uint32 closestDiff = 0xFFFFFFFF; - size_t iStandardRate; - - for (iStandardRate = 0; iStandardRate < ma_countof(g_maStandardSampleRatePriorities); ++iStandardRate) { - ma_uint32 standardRate = g_maStandardSampleRatePriorities[iStandardRate]; - ma_uint32 diff; - - if (sampleRateIn > standardRate) { - diff = sampleRateIn - standardRate; - } else { - diff = standardRate - sampleRateIn; - } - - if (diff == 0) { - return standardRate; /* The input sample rate is a standard rate. */ - } - - if (closestDiff > diff) { - closestDiff = diff; - closestRate = standardRate; - } - } - - return closestRate; -} -#endif - - -static MA_INLINE unsigned int ma_device_disable_denormals(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (!pDevice->noDisableDenormals) { - return ma_disable_denormals(); - } else { - return 0; - } -} - -static MA_INLINE void ma_device_restore_denormals(ma_device* pDevice, unsigned int prevState) -{ - MA_ASSERT(pDevice != NULL); - - if (!pDevice->noDisableDenormals) { - ma_restore_denormals(prevState); - } else { - /* Do nothing. */ - (void)prevState; - } -} - -static ma_device_notification ma_device_notification_init(ma_device* pDevice, ma_device_notification_type type) -{ - ma_device_notification notification; - - MA_ZERO_OBJECT(¬ification); - notification.pDevice = pDevice; - notification.type = type; - - return notification; -} - -static void ma_device__on_notification(ma_device_notification notification) -{ - MA_ASSERT(notification.pDevice != NULL); - - if (notification.pDevice->onNotification != NULL) { - notification.pDevice->onNotification(¬ification); - } - - /* TEMP FOR COMPATIBILITY: If it's a stopped notification, fire the onStop callback as well. This is only for backwards compatibility and will be removed. */ - if (notification.pDevice->onStop != NULL && notification.type == ma_device_notification_type_stopped) { - notification.pDevice->onStop(notification.pDevice); - } -} - -void ma_device__on_notification_started(ma_device* pDevice) -{ - ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_started)); -} - -void ma_device__on_notification_stopped(ma_device* pDevice) -{ - ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_stopped)); -} - -void ma_device__on_notification_rerouted(ma_device* pDevice) -{ - ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_rerouted)); -} - -void ma_device__on_notification_interruption_began(ma_device* pDevice) -{ - ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_interruption_began)); -} - -void ma_device__on_notification_interruption_ended(ma_device* pDevice) -{ - ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_interruption_ended)); -} - - -static void ma_device__on_data_inner(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount) -{ - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pDevice->onData != NULL); - - if (!pDevice->noPreSilencedOutputBuffer && pFramesOut != NULL) { - ma_silence_pcm_frames(pFramesOut, frameCount, pDevice->playback.format, pDevice->playback.channels); - } - - pDevice->onData(pDevice, pFramesOut, pFramesIn, frameCount); -} - -static void ma_device__on_data(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->noFixedSizedCallback) { - /* Fast path. Not using a fixed sized callback. Process directly from the specified buffers. */ - ma_device__on_data_inner(pDevice, pFramesOut, pFramesIn, frameCount); - } else { - /* Slow path. Using a fixed sized callback. Need to use the intermediary buffer. */ - ma_uint32 totalFramesProcessed = 0; - - while (totalFramesProcessed < frameCount) { - ma_uint32 totalFramesRemaining = frameCount - totalFramesProcessed; - ma_uint32 framesToProcessThisIteration = 0; - - if (pFramesIn != NULL) { - /* Capturing. Write to the intermediary buffer. If there's no room, fire the callback to empty it. */ - if (pDevice->capture.intermediaryBufferLen < pDevice->capture.intermediaryBufferCap) { - /* There's some room left in the intermediary buffer. Write to it without firing the callback. */ - framesToProcessThisIteration = totalFramesRemaining; - if (framesToProcessThisIteration > pDevice->capture.intermediaryBufferCap - pDevice->capture.intermediaryBufferLen) { - framesToProcessThisIteration = pDevice->capture.intermediaryBufferCap - pDevice->capture.intermediaryBufferLen; - } - - ma_copy_pcm_frames( - ma_offset_pcm_frames_ptr(pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferLen, pDevice->capture.format, pDevice->capture.channels), - ma_offset_pcm_frames_const_ptr(pFramesIn, totalFramesProcessed, pDevice->capture.format, pDevice->capture.channels), - framesToProcessThisIteration, - pDevice->capture.format, pDevice->capture.channels); - - pDevice->capture.intermediaryBufferLen += framesToProcessThisIteration; - } - - if (pDevice->capture.intermediaryBufferLen == pDevice->capture.intermediaryBufferCap) { - /* No room left in the intermediary buffer. Fire the data callback. */ - if (pDevice->type == ma_device_type_duplex) { - /* We'll do the duplex data callback later after we've processed the playback data. */ - } else { - ma_device__on_data_inner(pDevice, NULL, pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferCap); - - /* The intermediary buffer has just been drained. */ - pDevice->capture.intermediaryBufferLen = 0; - } - } - } - - if (pFramesOut != NULL) { - /* Playing back. Read from the intermediary buffer. If there's nothing in it, fire the callback to fill it. */ - if (pDevice->playback.intermediaryBufferLen > 0) { - /* There's some content in the intermediary buffer. Read from that without firing the callback. */ - if (pDevice->type == ma_device_type_duplex) { - /* The frames processed this iteration for a duplex device will always be based on the capture side. Leave it unmodified. */ - } else { - framesToProcessThisIteration = totalFramesRemaining; - if (framesToProcessThisIteration > pDevice->playback.intermediaryBufferLen) { - framesToProcessThisIteration = pDevice->playback.intermediaryBufferLen; - } - } - - ma_copy_pcm_frames( - ma_offset_pcm_frames_ptr(pFramesOut, totalFramesProcessed, pDevice->playback.format, pDevice->playback.channels), - ma_offset_pcm_frames_ptr(pDevice->playback.pIntermediaryBuffer, pDevice->playback.intermediaryBufferCap - pDevice->playback.intermediaryBufferLen, pDevice->playback.format, pDevice->playback.channels), - framesToProcessThisIteration, - pDevice->playback.format, pDevice->playback.channels); - - pDevice->playback.intermediaryBufferLen -= framesToProcessThisIteration; - } - - if (pDevice->playback.intermediaryBufferLen == 0) { - /* There's nothing in the intermediary buffer. Fire the data callback to fill it. */ - if (pDevice->type == ma_device_type_duplex) { - /* In duplex mode, the data callback will be fired later. Nothing to do here. */ - } else { - ma_device__on_data_inner(pDevice, pDevice->playback.pIntermediaryBuffer, NULL, pDevice->playback.intermediaryBufferCap); - - /* The intermediary buffer has just been filled. */ - pDevice->playback.intermediaryBufferLen = pDevice->playback.intermediaryBufferCap; - } - } - } - - /* If we're in duplex mode we might need to do a refill of the data. */ - if (pDevice->type == ma_device_type_duplex) { - if (pDevice->capture.intermediaryBufferLen == pDevice->capture.intermediaryBufferCap) { - ma_device__on_data_inner(pDevice, pDevice->playback.pIntermediaryBuffer, pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferCap); - - pDevice->playback.intermediaryBufferLen = pDevice->playback.intermediaryBufferCap; /* The playback buffer will have just been filled. */ - pDevice->capture.intermediaryBufferLen = 0; /* The intermediary buffer has just been drained. */ - } - } - - /* Make sure this is only incremented once in the duplex case. */ - totalFramesProcessed += framesToProcessThisIteration; - } - } -} - -static void ma_device__handle_data_callback(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount) -{ - float masterVolumeFactor; - - ma_device_get_master_volume(pDevice, &masterVolumeFactor); /* Use ma_device_get_master_volume() to ensure the volume is loaded atomically. */ - - if (pDevice->onData) { - unsigned int prevDenormalState = ma_device_disable_denormals(pDevice); - { - /* Volume control of input makes things a bit awkward because the input buffer is read-only. We'll need to use a temp buffer and loop in this case. */ - if (pFramesIn != NULL && masterVolumeFactor < 1) { - ma_uint8 tempFramesIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint32 bpfCapture = ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels); - ma_uint32 bpfPlayback = ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); - ma_uint32 totalFramesProcessed = 0; - while (totalFramesProcessed < frameCount) { - ma_uint32 framesToProcessThisIteration = frameCount - totalFramesProcessed; - if (framesToProcessThisIteration > sizeof(tempFramesIn)/bpfCapture) { - framesToProcessThisIteration = sizeof(tempFramesIn)/bpfCapture; - } - - ma_copy_and_apply_volume_factor_pcm_frames(tempFramesIn, ma_offset_ptr(pFramesIn, totalFramesProcessed*bpfCapture), framesToProcessThisIteration, pDevice->capture.format, pDevice->capture.channels, masterVolumeFactor); - - ma_device__on_data(pDevice, ma_offset_ptr(pFramesOut, totalFramesProcessed*bpfPlayback), tempFramesIn, framesToProcessThisIteration); - - totalFramesProcessed += framesToProcessThisIteration; - } - } else { - ma_device__on_data(pDevice, pFramesOut, pFramesIn, frameCount); - } - - /* Volume control and clipping for playback devices. */ - if (pFramesOut != NULL) { - if (masterVolumeFactor < 1) { - if (pFramesIn == NULL) { /* <-- In full-duplex situations, the volume will have been applied to the input samples before the data callback. Applying it again post-callback will incorrectly compound it. */ - ma_apply_volume_factor_pcm_frames(pFramesOut, frameCount, pDevice->playback.format, pDevice->playback.channels, masterVolumeFactor); - } - } - - if (!pDevice->noClip && pDevice->playback.format == ma_format_f32) { - ma_clip_samples_f32((float*)pFramesOut, (const float*)pFramesOut, frameCount * pDevice->playback.channels); /* Intentionally specifying the same pointer for both input and output for in-place processing. */ - } - } - } - ma_device_restore_denormals(pDevice, prevDenormalState); - } -} - - - -/* A helper function for reading sample data from the client. */ -static void ma_device__read_frames_from_client(ma_device* pDevice, ma_uint32 frameCount, void* pFramesOut) -{ - MA_ASSERT(pDevice != NULL); - MA_ASSERT(frameCount > 0); - MA_ASSERT(pFramesOut != NULL); - - if (pDevice->playback.converter.isPassthrough) { - ma_device__handle_data_callback(pDevice, pFramesOut, NULL, frameCount); - } else { - ma_result result; - ma_uint64 totalFramesReadOut; - void* pRunningFramesOut; - - totalFramesReadOut = 0; - pRunningFramesOut = pFramesOut; - - /* - We run slightly different logic depending on whether or not we're using a heap-allocated - buffer for caching input data. This will be the case if the data converter does not have - the ability to retrieve the required input frame count for a given output frame count. - */ - if (pDevice->playback.pInputCache != NULL) { - while (totalFramesReadOut < frameCount) { - ma_uint64 framesToReadThisIterationIn; - ma_uint64 framesToReadThisIterationOut; - - /* If there's any data available in the cache, that needs to get processed first. */ - if (pDevice->playback.inputCacheRemaining > 0) { - framesToReadThisIterationOut = (frameCount - totalFramesReadOut); - framesToReadThisIterationIn = framesToReadThisIterationOut; - if (framesToReadThisIterationIn > pDevice->playback.inputCacheRemaining) { - framesToReadThisIterationIn = pDevice->playback.inputCacheRemaining; - } - - result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, ma_offset_pcm_frames_ptr(pDevice->playback.pInputCache, pDevice->playback.inputCacheConsumed, pDevice->playback.format, pDevice->playback.channels), &framesToReadThisIterationIn, pRunningFramesOut, &framesToReadThisIterationOut); - if (result != MA_SUCCESS) { - break; - } - - pDevice->playback.inputCacheConsumed += framesToReadThisIterationIn; - pDevice->playback.inputCacheRemaining -= framesToReadThisIterationIn; - - totalFramesReadOut += framesToReadThisIterationOut; - pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesToReadThisIterationOut * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels)); - - if (framesToReadThisIterationIn == 0 && framesToReadThisIterationOut == 0) { - break; /* We're done. */ - } - } - - /* Getting here means there's no data in the cache and we need to fill it up with data from the client. */ - if (pDevice->playback.inputCacheRemaining == 0) { - ma_device__handle_data_callback(pDevice, pDevice->playback.pInputCache, NULL, (ma_uint32)pDevice->playback.inputCacheCap); - - pDevice->playback.inputCacheConsumed = 0; - pDevice->playback.inputCacheRemaining = pDevice->playback.inputCacheCap; - } - } - } else { - while (totalFramesReadOut < frameCount) { - ma_uint8 pIntermediaryBuffer[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In client format. */ - ma_uint64 intermediaryBufferCap = sizeof(pIntermediaryBuffer) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); - ma_uint64 framesToReadThisIterationIn; - ma_uint64 framesReadThisIterationIn; - ma_uint64 framesToReadThisIterationOut; - ma_uint64 framesReadThisIterationOut; - ma_uint64 requiredInputFrameCount; - - framesToReadThisIterationOut = (frameCount - totalFramesReadOut); - framesToReadThisIterationIn = framesToReadThisIterationOut; - if (framesToReadThisIterationIn > intermediaryBufferCap) { - framesToReadThisIterationIn = intermediaryBufferCap; - } - - ma_data_converter_get_required_input_frame_count(&pDevice->playback.converter, framesToReadThisIterationOut, &requiredInputFrameCount); - if (framesToReadThisIterationIn > requiredInputFrameCount) { - framesToReadThisIterationIn = requiredInputFrameCount; - } - - if (framesToReadThisIterationIn > 0) { - ma_device__handle_data_callback(pDevice, pIntermediaryBuffer, NULL, (ma_uint32)framesToReadThisIterationIn); - } - - /* - At this point we have our decoded data in input format and now we need to convert to output format. Note that even if we didn't read any - input frames, we still want to try processing frames because there may some output frames generated from cached input data. - */ - framesReadThisIterationIn = framesToReadThisIterationIn; - framesReadThisIterationOut = framesToReadThisIterationOut; - result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, pIntermediaryBuffer, &framesReadThisIterationIn, pRunningFramesOut, &framesReadThisIterationOut); - if (result != MA_SUCCESS) { - break; - } - - totalFramesReadOut += framesReadThisIterationOut; - pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesReadThisIterationOut * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels)); - - if (framesReadThisIterationIn == 0 && framesReadThisIterationOut == 0) { - break; /* We're done. */ - } - } - } - } -} - -/* A helper for sending sample data to the client. */ -static void ma_device__send_frames_to_client(ma_device* pDevice, ma_uint32 frameCountInDeviceFormat, const void* pFramesInDeviceFormat) -{ - MA_ASSERT(pDevice != NULL); - MA_ASSERT(frameCountInDeviceFormat > 0); - MA_ASSERT(pFramesInDeviceFormat != NULL); - - if (pDevice->capture.converter.isPassthrough) { - ma_device__handle_data_callback(pDevice, NULL, pFramesInDeviceFormat, frameCountInDeviceFormat); - } else { - ma_result result; - ma_uint8 pFramesInClientFormat[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint64 framesInClientFormatCap = sizeof(pFramesInClientFormat) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels); - ma_uint64 totalDeviceFramesProcessed = 0; - ma_uint64 totalClientFramesProcessed = 0; - const void* pRunningFramesInDeviceFormat = pFramesInDeviceFormat; - - /* We just keep going until we've exhaused all of our input frames and cannot generate any more output frames. */ - for (;;) { - ma_uint64 deviceFramesProcessedThisIteration; - ma_uint64 clientFramesProcessedThisIteration; - - deviceFramesProcessedThisIteration = (frameCountInDeviceFormat - totalDeviceFramesProcessed); - clientFramesProcessedThisIteration = framesInClientFormatCap; - - result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningFramesInDeviceFormat, &deviceFramesProcessedThisIteration, pFramesInClientFormat, &clientFramesProcessedThisIteration); - if (result != MA_SUCCESS) { - break; - } - - if (clientFramesProcessedThisIteration > 0) { - ma_device__handle_data_callback(pDevice, NULL, pFramesInClientFormat, (ma_uint32)clientFramesProcessedThisIteration); /* Safe cast. */ - } - - pRunningFramesInDeviceFormat = ma_offset_ptr(pRunningFramesInDeviceFormat, deviceFramesProcessedThisIteration * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels)); - totalDeviceFramesProcessed += deviceFramesProcessedThisIteration; - totalClientFramesProcessed += clientFramesProcessedThisIteration; - - if (deviceFramesProcessedThisIteration == 0 && clientFramesProcessedThisIteration == 0) { - break; /* We're done. */ - } - } - } -} - -static ma_result ma_device__handle_duplex_callback_capture(ma_device* pDevice, ma_uint32 frameCountInDeviceFormat, const void* pFramesInDeviceFormat, ma_pcm_rb* pRB) -{ - ma_result result; - ma_uint32 totalDeviceFramesProcessed = 0; - const void* pRunningFramesInDeviceFormat = pFramesInDeviceFormat; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(frameCountInDeviceFormat > 0); - MA_ASSERT(pFramesInDeviceFormat != NULL); - MA_ASSERT(pRB != NULL); - - /* Write to the ring buffer. The ring buffer is in the client format which means we need to convert. */ - for (;;) { - ma_uint32 framesToProcessInDeviceFormat = (frameCountInDeviceFormat - totalDeviceFramesProcessed); - ma_uint32 framesToProcessInClientFormat = MA_DATA_CONVERTER_STACK_BUFFER_SIZE / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels); - ma_uint64 framesProcessedInDeviceFormat; - ma_uint64 framesProcessedInClientFormat; - void* pFramesInClientFormat; - - result = ma_pcm_rb_acquire_write(pRB, &framesToProcessInClientFormat, &pFramesInClientFormat); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "Failed to acquire capture PCM frames from ring buffer."); - break; - } - - if (framesToProcessInClientFormat == 0) { - if (ma_pcm_rb_pointer_distance(pRB) == (ma_int32)ma_pcm_rb_get_subbuffer_size(pRB)) { - break; /* Overrun. Not enough room in the ring buffer for input frame. Excess frames are dropped. */ - } - } - - /* Convert. */ - framesProcessedInDeviceFormat = framesToProcessInDeviceFormat; - framesProcessedInClientFormat = framesToProcessInClientFormat; - result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningFramesInDeviceFormat, &framesProcessedInDeviceFormat, pFramesInClientFormat, &framesProcessedInClientFormat); - if (result != MA_SUCCESS) { - break; - } - - result = ma_pcm_rb_commit_write(pRB, (ma_uint32)framesProcessedInClientFormat); /* Safe cast. */ - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "Failed to commit capture PCM frames to ring buffer."); - break; - } - - pRunningFramesInDeviceFormat = ma_offset_ptr(pRunningFramesInDeviceFormat, framesProcessedInDeviceFormat * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels)); - totalDeviceFramesProcessed += (ma_uint32)framesProcessedInDeviceFormat; /* Safe cast. */ - - /* We're done when we're unable to process any client nor device frames. */ - if (framesProcessedInClientFormat == 0 && framesProcessedInDeviceFormat == 0) { - break; /* Done. */ - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device__handle_duplex_callback_playback(ma_device* pDevice, ma_uint32 frameCount, void* pFramesInInternalFormat, ma_pcm_rb* pRB) -{ - ma_result result; - ma_uint8 silentInputFrames[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint32 totalFramesReadOut = 0; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(frameCount > 0); - MA_ASSERT(pFramesInInternalFormat != NULL); - MA_ASSERT(pRB != NULL); - MA_ASSERT(pDevice->playback.pInputCache != NULL); - - /* - Sitting in the ring buffer should be captured data from the capture callback in external format. If there's not enough data in there for - the whole frameCount frames we just use silence instead for the input data. - */ - MA_ZERO_MEMORY(silentInputFrames, sizeof(silentInputFrames)); - - while (totalFramesReadOut < frameCount && ma_device_is_started(pDevice)) { - /* - We should have a buffer allocated on the heap. Any playback frames still sitting in there - need to be sent to the internal device before we process any more data from the client. - */ - if (pDevice->playback.inputCacheRemaining > 0) { - ma_uint64 framesConvertedIn = pDevice->playback.inputCacheRemaining; - ma_uint64 framesConvertedOut = (frameCount - totalFramesReadOut); - ma_data_converter_process_pcm_frames(&pDevice->playback.converter, ma_offset_pcm_frames_ptr(pDevice->playback.pInputCache, pDevice->playback.inputCacheConsumed, pDevice->playback.format, pDevice->playback.channels), &framesConvertedIn, pFramesInInternalFormat, &framesConvertedOut); - - pDevice->playback.inputCacheConsumed += framesConvertedIn; - pDevice->playback.inputCacheRemaining -= framesConvertedIn; - - totalFramesReadOut += (ma_uint32)framesConvertedOut; /* Safe cast. */ - pFramesInInternalFormat = ma_offset_ptr(pFramesInInternalFormat, framesConvertedOut * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels)); - } - - /* If there's no more data in the cache we'll need to fill it with some. */ - if (totalFramesReadOut < frameCount && pDevice->playback.inputCacheRemaining == 0) { - ma_uint32 inputFrameCount; - void* pInputFrames; - - inputFrameCount = (ma_uint32)pDevice->playback.inputCacheCap; - result = ma_pcm_rb_acquire_read(pRB, &inputFrameCount, &pInputFrames); - if (result == MA_SUCCESS) { - if (inputFrameCount > 0) { - ma_device__handle_data_callback(pDevice, pDevice->playback.pInputCache, pInputFrames, inputFrameCount); - } else { - if (ma_pcm_rb_pointer_distance(pRB) == 0) { - break; /* Underrun. */ - } - } - } else { - /* No capture data available. Feed in silence. */ - inputFrameCount = (ma_uint32)ma_min(pDevice->playback.inputCacheCap, sizeof(silentInputFrames) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels)); - ma_device__handle_data_callback(pDevice, pDevice->playback.pInputCache, silentInputFrames, inputFrameCount); - } - - pDevice->playback.inputCacheConsumed = 0; - pDevice->playback.inputCacheRemaining = inputFrameCount; - - result = ma_pcm_rb_commit_read(pRB, inputFrameCount); - if (result != MA_SUCCESS) { - return result; /* Should never happen. */ - } - } - } - - return MA_SUCCESS; -} - -/* A helper for changing the state of the device. */ -static MA_INLINE void ma_device__set_state(ma_device* pDevice, ma_device_state newState) -{ - c89atomic_exchange_i32((ma_int32*)&pDevice->state, (ma_int32)newState); -} - - -#ifdef MA_WIN32 - GUID MA_GUID_KSDATAFORMAT_SUBTYPE_PCM = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; - GUID MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; - /*GUID MA_GUID_KSDATAFORMAT_SUBTYPE_ALAW = {0x00000006, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/ - /*GUID MA_GUID_KSDATAFORMAT_SUBTYPE_MULAW = {0x00000007, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/ -#endif - - - -MA_API ma_uint32 ma_get_format_priority_index(ma_format format) /* Lower = better. */ -{ - ma_uint32 i; - for (i = 0; i < ma_countof(g_maFormatPriorities); ++i) { - if (g_maFormatPriorities[i] == format) { - return i; - } - } - - /* Getting here means the format could not be found or is equal to ma_format_unknown. */ - return (ma_uint32)-1; -} - -static ma_result ma_device__post_init_setup(ma_device* pDevice, ma_device_type deviceType); - -static ma_bool32 ma_device_descriptor_is_valid(const ma_device_descriptor* pDeviceDescriptor) -{ - if (pDeviceDescriptor == NULL) { - return MA_FALSE; - } - - if (pDeviceDescriptor->format == ma_format_unknown) { - return MA_FALSE; - } - - if (pDeviceDescriptor->channels == 0 || pDeviceDescriptor->channels > MA_MAX_CHANNELS) { - return MA_FALSE; - } - - if (pDeviceDescriptor->sampleRate == 0) { - return MA_FALSE; - } - - return MA_TRUE; -} - - -static ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice) -{ - ma_result result = MA_SUCCESS; - ma_bool32 exitLoop = MA_FALSE; - ma_uint8 capturedDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint8 playbackDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint32 capturedDeviceDataCapInFrames = 0; - ma_uint32 playbackDeviceDataCapInFrames = 0; - - MA_ASSERT(pDevice != NULL); - - /* Just some quick validation on the device type and the available callbacks. */ - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) { - if (pDevice->pContext->callbacks.onDeviceRead == NULL) { - return MA_NOT_IMPLEMENTED; - } - - capturedDeviceDataCapInFrames = sizeof(capturedDeviceData) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - if (pDevice->pContext->callbacks.onDeviceWrite == NULL) { - return MA_NOT_IMPLEMENTED; - } - - playbackDeviceDataCapInFrames = sizeof(playbackDeviceData) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - } - - /* NOTE: The device was started outside of this function, in the worker thread. */ - - while (ma_device_get_state(pDevice) == ma_device_state_started && !exitLoop) { - switch (pDevice->type) { - case ma_device_type_duplex: - { - /* The process is: onDeviceRead() -> convert -> callback -> convert -> onDeviceWrite() */ - ma_uint32 totalCapturedDeviceFramesProcessed = 0; - ma_uint32 capturedDevicePeriodSizeInFrames = ma_min(pDevice->capture.internalPeriodSizeInFrames, pDevice->playback.internalPeriodSizeInFrames); - - while (totalCapturedDeviceFramesProcessed < capturedDevicePeriodSizeInFrames) { - ma_uint32 capturedDeviceFramesRemaining; - ma_uint32 capturedDeviceFramesProcessed; - ma_uint32 capturedDeviceFramesToProcess; - ma_uint32 capturedDeviceFramesToTryProcessing = capturedDevicePeriodSizeInFrames - totalCapturedDeviceFramesProcessed; - if (capturedDeviceFramesToTryProcessing > capturedDeviceDataCapInFrames) { - capturedDeviceFramesToTryProcessing = capturedDeviceDataCapInFrames; - } - - result = pDevice->pContext->callbacks.onDeviceRead(pDevice, capturedDeviceData, capturedDeviceFramesToTryProcessing, &capturedDeviceFramesToProcess); - if (result != MA_SUCCESS) { - exitLoop = MA_TRUE; - break; - } - - capturedDeviceFramesRemaining = capturedDeviceFramesToProcess; - capturedDeviceFramesProcessed = 0; - - /* At this point we have our captured data in device format and we now need to convert it to client format. */ - for (;;) { - ma_uint8 capturedClientData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint8 playbackClientData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint32 capturedClientDataCapInFrames = sizeof(capturedClientData) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels); - ma_uint32 playbackClientDataCapInFrames = sizeof(playbackClientData) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); - ma_uint64 capturedClientFramesToProcessThisIteration = ma_min(capturedClientDataCapInFrames, playbackClientDataCapInFrames); - ma_uint64 capturedDeviceFramesToProcessThisIteration = capturedDeviceFramesRemaining; - ma_uint8* pRunningCapturedDeviceFrames = ma_offset_ptr(capturedDeviceData, capturedDeviceFramesProcessed * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels)); - - /* Convert capture data from device format to client format. */ - result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningCapturedDeviceFrames, &capturedDeviceFramesToProcessThisIteration, capturedClientData, &capturedClientFramesToProcessThisIteration); - if (result != MA_SUCCESS) { - break; - } - - /* - If we weren't able to generate any output frames it must mean we've exhaused all of our input. The only time this would not be the case is if capturedClientData was too small - which should never be the case when it's of the size MA_DATA_CONVERTER_STACK_BUFFER_SIZE. - */ - if (capturedClientFramesToProcessThisIteration == 0) { - break; - } - - ma_device__handle_data_callback(pDevice, playbackClientData, capturedClientData, (ma_uint32)capturedClientFramesToProcessThisIteration); /* Safe cast .*/ - - capturedDeviceFramesProcessed += (ma_uint32)capturedDeviceFramesToProcessThisIteration; /* Safe cast. */ - capturedDeviceFramesRemaining -= (ma_uint32)capturedDeviceFramesToProcessThisIteration; /* Safe cast. */ - - /* At this point the playbackClientData buffer should be holding data that needs to be written to the device. */ - for (;;) { - ma_uint64 convertedClientFrameCount = capturedClientFramesToProcessThisIteration; - ma_uint64 convertedDeviceFrameCount = playbackDeviceDataCapInFrames; - result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, playbackClientData, &convertedClientFrameCount, playbackDeviceData, &convertedDeviceFrameCount); - if (result != MA_SUCCESS) { - break; - } - - result = pDevice->pContext->callbacks.onDeviceWrite(pDevice, playbackDeviceData, (ma_uint32)convertedDeviceFrameCount, NULL); /* Safe cast. */ - if (result != MA_SUCCESS) { - exitLoop = MA_TRUE; - break; - } - - capturedClientFramesToProcessThisIteration -= (ma_uint32)convertedClientFrameCount; /* Safe cast. */ - if (capturedClientFramesToProcessThisIteration == 0) { - break; - } - } - - /* In case an error happened from ma_device_write__null()... */ - if (result != MA_SUCCESS) { - exitLoop = MA_TRUE; - break; - } - } - - /* Make sure we don't get stuck in the inner loop. */ - if (capturedDeviceFramesProcessed == 0) { - break; - } - - totalCapturedDeviceFramesProcessed += capturedDeviceFramesProcessed; - } - } break; - - case ma_device_type_capture: - case ma_device_type_loopback: - { - ma_uint32 periodSizeInFrames = pDevice->capture.internalPeriodSizeInFrames; - ma_uint32 framesReadThisPeriod = 0; - while (framesReadThisPeriod < periodSizeInFrames) { - ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesReadThisPeriod; - ma_uint32 framesProcessed; - ma_uint32 framesToReadThisIteration = framesRemainingInPeriod; - if (framesToReadThisIteration > capturedDeviceDataCapInFrames) { - framesToReadThisIteration = capturedDeviceDataCapInFrames; - } - - result = pDevice->pContext->callbacks.onDeviceRead(pDevice, capturedDeviceData, framesToReadThisIteration, &framesProcessed); - if (result != MA_SUCCESS) { - exitLoop = MA_TRUE; - break; - } - - /* Make sure we don't get stuck in the inner loop. */ - if (framesProcessed == 0) { - break; - } - - ma_device__send_frames_to_client(pDevice, framesProcessed, capturedDeviceData); - - framesReadThisPeriod += framesProcessed; - } - } break; - - case ma_device_type_playback: - { - /* We write in chunks of the period size, but use a stack allocated buffer for the intermediary. */ - ma_uint32 periodSizeInFrames = pDevice->playback.internalPeriodSizeInFrames; - ma_uint32 framesWrittenThisPeriod = 0; - while (framesWrittenThisPeriod < periodSizeInFrames) { - ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesWrittenThisPeriod; - ma_uint32 framesProcessed; - ma_uint32 framesToWriteThisIteration = framesRemainingInPeriod; - if (framesToWriteThisIteration > playbackDeviceDataCapInFrames) { - framesToWriteThisIteration = playbackDeviceDataCapInFrames; - } - - ma_device__read_frames_from_client(pDevice, framesToWriteThisIteration, playbackDeviceData); - - result = pDevice->pContext->callbacks.onDeviceWrite(pDevice, playbackDeviceData, framesToWriteThisIteration, &framesProcessed); - if (result != MA_SUCCESS) { - exitLoop = MA_TRUE; - break; - } - - /* Make sure we don't get stuck in the inner loop. */ - if (framesProcessed == 0) { - break; - } - - framesWrittenThisPeriod += framesProcessed; - } - } break; - - /* Should never get here. */ - default: break; - } - } - - return result; -} - - - -/******************************************************************************* - -Null Backend - -*******************************************************************************/ -#ifdef MA_HAS_NULL - -#define MA_DEVICE_OP_NONE__NULL 0 -#define MA_DEVICE_OP_START__NULL 1 -#define MA_DEVICE_OP_SUSPEND__NULL 2 -#define MA_DEVICE_OP_KILL__NULL 3 - -static ma_thread_result MA_THREADCALL ma_device_thread__null(void* pData) -{ - ma_device* pDevice = (ma_device*)pData; - MA_ASSERT(pDevice != NULL); - - for (;;) { /* Keep the thread alive until the device is uninitialized. */ - ma_uint32 operation; - - /* Wait for an operation to be requested. */ - ma_event_wait(&pDevice->null_device.operationEvent); - - /* At this point an event should have been triggered. */ - operation = pDevice->null_device.operation; - - /* Starting the device needs to put the thread into a loop. */ - if (operation == MA_DEVICE_OP_START__NULL) { - /* Reset the timer just in case. */ - ma_timer_init(&pDevice->null_device.timer); - - /* Getting here means a suspend or kill operation has been requested. */ - pDevice->null_device.operationResult = MA_SUCCESS; - ma_event_signal(&pDevice->null_device.operationCompletionEvent); - ma_semaphore_release(&pDevice->null_device.operationSemaphore); - continue; - } - - /* Suspending the device means we need to stop the timer and just continue the loop. */ - if (operation == MA_DEVICE_OP_SUSPEND__NULL) { - /* We need to add the current run time to the prior run time, then reset the timer. */ - pDevice->null_device.priorRunTime += ma_timer_get_time_in_seconds(&pDevice->null_device.timer); - ma_timer_init(&pDevice->null_device.timer); - - /* We're done. */ - pDevice->null_device.operationResult = MA_SUCCESS; - ma_event_signal(&pDevice->null_device.operationCompletionEvent); - ma_semaphore_release(&pDevice->null_device.operationSemaphore); - continue; - } - - /* Killing the device means we need to get out of this loop so that this thread can terminate. */ - if (operation == MA_DEVICE_OP_KILL__NULL) { - pDevice->null_device.operationResult = MA_SUCCESS; - ma_event_signal(&pDevice->null_device.operationCompletionEvent); - ma_semaphore_release(&pDevice->null_device.operationSemaphore); - break; - } - - /* Getting a signal on a "none" operation probably means an error. Return invalid operation. */ - if (operation == MA_DEVICE_OP_NONE__NULL) { - MA_ASSERT(MA_FALSE); /* <-- Trigger this in debug mode to ensure developers are aware they're doing something wrong (or there's a bug in a miniaudio). */ - pDevice->null_device.operationResult = MA_INVALID_OPERATION; - ma_event_signal(&pDevice->null_device.operationCompletionEvent); - ma_semaphore_release(&pDevice->null_device.operationSemaphore); - continue; /* Continue the loop. Don't terminate. */ - } - } - - return (ma_thread_result)0; -} - -static ma_result ma_device_do_operation__null(ma_device* pDevice, ma_uint32 operation) -{ - ma_result result; - - /* - TODO: Need to review this and consider just using mutual exclusion. I think the original motivation - for this was to just post the event to a queue and return immediately, but that has since changed - and now this function is synchronous. I think this can be simplified to just use a mutex. - */ - - /* - The first thing to do is wait for an operation slot to become available. We only have a single slot for this, but we could extend this later - to support queing of operations. - */ - result = ma_semaphore_wait(&pDevice->null_device.operationSemaphore); - if (result != MA_SUCCESS) { - return result; /* Failed to wait for the event. */ - } - - /* - When we get here it means the background thread is not referencing the operation code and it can be changed. After changing this we need to - signal an event to the worker thread to let it know that it can start work. - */ - pDevice->null_device.operation = operation; - - /* Once the operation code has been set, the worker thread can start work. */ - if (ma_event_signal(&pDevice->null_device.operationEvent) != MA_SUCCESS) { - return MA_ERROR; - } - - /* We want everything to be synchronous so we're going to wait for the worker thread to complete it's operation. */ - if (ma_event_wait(&pDevice->null_device.operationCompletionEvent) != MA_SUCCESS) { - return MA_ERROR; - } - - return pDevice->null_device.operationResult; -} - -static ma_uint64 ma_device_get_total_run_time_in_frames__null(ma_device* pDevice) -{ - ma_uint32 internalSampleRate; - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - internalSampleRate = pDevice->capture.internalSampleRate; - } else { - internalSampleRate = pDevice->playback.internalSampleRate; - } - - return (ma_uint64)((pDevice->null_device.priorRunTime + ma_timer_get_time_in_seconds(&pDevice->null_device.timer)) * internalSampleRate); -} - -static ma_result ma_context_enumerate_devices__null(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_bool32 cbResult = MA_TRUE; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* Playback. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), "NULL Playback Device", (size_t)-1); - deviceInfo.isDefault = MA_TRUE; /* Only one playback and capture device for the null backend, so might as well mark as default. */ - cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - - /* Capture. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), "NULL Capture Device", (size_t)-1); - deviceInfo.isDefault = MA_TRUE; /* Only one playback and capture device for the null backend, so might as well mark as default. */ - cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - - (void)cbResult; /* Silence a static analysis warning. */ - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__null(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - MA_ASSERT(pContext != NULL); - - if (pDeviceID != NULL && pDeviceID->nullbackend != 0) { - return MA_NO_DEVICE; /* Don't know the device. */ - } - - /* Name / Description */ - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), "NULL Playback Device", (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), "NULL Capture Device", (size_t)-1); - } - - pDeviceInfo->isDefault = MA_TRUE; /* Only one playback and capture device for the null backend, so might as well mark as default. */ - - /* Support everything on the null backend. */ - pDeviceInfo->nativeDataFormats[0].format = ma_format_unknown; - pDeviceInfo->nativeDataFormats[0].channels = 0; - pDeviceInfo->nativeDataFormats[0].sampleRate = 0; - pDeviceInfo->nativeDataFormats[0].flags = 0; - pDeviceInfo->nativeDataFormatCount = 1; - - (void)pContext; - return MA_SUCCESS; -} - - -static ma_result ma_device_uninit__null(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - /* Keep it clean and wait for the device thread to finish before returning. */ - ma_device_do_operation__null(pDevice, MA_DEVICE_OP_KILL__NULL); - - /* Wait for the thread to finish before continuing. */ - ma_thread_wait(&pDevice->null_device.deviceThread); - - /* At this point the loop in the device thread is as good as terminated so we can uninitialize our events. */ - ma_semaphore_uninit(&pDevice->null_device.operationSemaphore); - ma_event_uninit(&pDevice->null_device.operationCompletionEvent); - ma_event_uninit(&pDevice->null_device.operationEvent); - - return MA_SUCCESS; -} - -static ma_result ma_device_init__null(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - ma_result result; - - MA_ASSERT(pDevice != NULL); - - MA_ZERO_OBJECT(&pDevice->null_device); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* The null backend supports everything exactly as we specify it. */ - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - pDescriptorCapture->format = (pDescriptorCapture->format != ma_format_unknown) ? pDescriptorCapture->format : MA_DEFAULT_FORMAT; - pDescriptorCapture->channels = (pDescriptorCapture->channels != 0) ? pDescriptorCapture->channels : MA_DEFAULT_CHANNELS; - pDescriptorCapture->sampleRate = (pDescriptorCapture->sampleRate != 0) ? pDescriptorCapture->sampleRate : MA_DEFAULT_SAMPLE_RATE; - - if (pDescriptorCapture->channelMap[0] == MA_CHANNEL_NONE) { - ma_channel_map_init_standard(ma_standard_channel_map_default, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorCapture->channels); - } - - pDescriptorCapture->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorCapture, pDescriptorCapture->sampleRate, pConfig->performanceProfile); - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - pDescriptorPlayback->format = (pDescriptorPlayback->format != ma_format_unknown) ? pDescriptorPlayback->format : MA_DEFAULT_FORMAT; - pDescriptorPlayback->channels = (pDescriptorPlayback->channels != 0) ? pDescriptorPlayback->channels : MA_DEFAULT_CHANNELS; - pDescriptorPlayback->sampleRate = (pDescriptorPlayback->sampleRate != 0) ? pDescriptorPlayback->sampleRate : MA_DEFAULT_SAMPLE_RATE; - - if (pDescriptorPlayback->channelMap[0] == MA_CHANNEL_NONE) { - ma_channel_map_init_standard(ma_standard_channel_map_default, pDescriptorPlayback->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorPlayback->channels); - } - - pDescriptorPlayback->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile); - } - - /* - In order to get timing right, we need to create a thread that does nothing but keeps track of the timer. This timer is started when the - first period is "written" to it, and then stopped in ma_device_stop__null(). - */ - result = ma_event_init(&pDevice->null_device.operationEvent); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_event_init(&pDevice->null_device.operationCompletionEvent); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_semaphore_init(1, &pDevice->null_device.operationSemaphore); /* <-- It's important that the initial value is set to 1. */ - if (result != MA_SUCCESS) { - return result; - } - - result = ma_thread_create(&pDevice->null_device.deviceThread, pDevice->pContext->threadPriority, 0, ma_device_thread__null, pDevice, &pDevice->pContext->allocationCallbacks); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start__null(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - ma_device_do_operation__null(pDevice, MA_DEVICE_OP_START__NULL); - - c89atomic_exchange_32(&pDevice->null_device.isStarted, MA_TRUE); - return MA_SUCCESS; -} - -static ma_result ma_device_stop__null(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - ma_device_do_operation__null(pDevice, MA_DEVICE_OP_SUSPEND__NULL); - - c89atomic_exchange_32(&pDevice->null_device.isStarted, MA_FALSE); - return MA_SUCCESS; -} - -static ma_result ma_device_write__null(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - ma_result result = MA_SUCCESS; - ma_uint32 totalPCMFramesProcessed; - ma_bool32 wasStartedOnEntry; - - if (pFramesWritten != NULL) { - *pFramesWritten = 0; - } - - wasStartedOnEntry = c89atomic_load_32(&pDevice->null_device.isStarted); - - /* Keep going until everything has been read. */ - totalPCMFramesProcessed = 0; - while (totalPCMFramesProcessed < frameCount) { - ma_uint64 targetFrame; - - /* If there are any frames remaining in the current period, consume those first. */ - if (pDevice->null_device.currentPeriodFramesRemainingPlayback > 0) { - ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed); - ma_uint32 framesToProcess = pDevice->null_device.currentPeriodFramesRemainingPlayback; - if (framesToProcess > framesRemaining) { - framesToProcess = framesRemaining; - } - - /* We don't actually do anything with pPCMFrames, so just mark it as unused to prevent a warning. */ - (void)pPCMFrames; - - pDevice->null_device.currentPeriodFramesRemainingPlayback -= framesToProcess; - totalPCMFramesProcessed += framesToProcess; - } - - /* If we've consumed the current period we'll need to mark it as such an ensure the device is started if it's not already. */ - if (pDevice->null_device.currentPeriodFramesRemainingPlayback == 0) { - pDevice->null_device.currentPeriodFramesRemainingPlayback = 0; - - if (!c89atomic_load_32(&pDevice->null_device.isStarted) && !wasStartedOnEntry) { - result = ma_device_start__null(pDevice); - if (result != MA_SUCCESS) { - break; - } - } - } - - /* If we've consumed the whole buffer we can return now. */ - MA_ASSERT(totalPCMFramesProcessed <= frameCount); - if (totalPCMFramesProcessed == frameCount) { - break; - } - - /* Getting here means we've still got more frames to consume, we but need to wait for it to become available. */ - targetFrame = pDevice->null_device.lastProcessedFramePlayback; - for (;;) { - ma_uint64 currentFrame; - - /* Stop waiting if the device has been stopped. */ - if (!c89atomic_load_32(&pDevice->null_device.isStarted)) { - break; - } - - currentFrame = ma_device_get_total_run_time_in_frames__null(pDevice); - if (currentFrame >= targetFrame) { - break; - } - - /* Getting here means we haven't yet reached the target sample, so continue waiting. */ - ma_sleep(10); - } - - pDevice->null_device.lastProcessedFramePlayback += pDevice->playback.internalPeriodSizeInFrames; - pDevice->null_device.currentPeriodFramesRemainingPlayback = pDevice->playback.internalPeriodSizeInFrames; - } - - if (pFramesWritten != NULL) { - *pFramesWritten = totalPCMFramesProcessed; - } - - return result; -} - -static ma_result ma_device_read__null(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_uint32 totalPCMFramesProcessed; - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - /* Keep going until everything has been read. */ - totalPCMFramesProcessed = 0; - while (totalPCMFramesProcessed < frameCount) { - ma_uint64 targetFrame; - - /* If there are any frames remaining in the current period, consume those first. */ - if (pDevice->null_device.currentPeriodFramesRemainingCapture > 0) { - ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed); - ma_uint32 framesToProcess = pDevice->null_device.currentPeriodFramesRemainingCapture; - if (framesToProcess > framesRemaining) { - framesToProcess = framesRemaining; - } - - /* We need to ensure the output buffer is zeroed. */ - MA_ZERO_MEMORY(ma_offset_ptr(pPCMFrames, totalPCMFramesProcessed*bpf), framesToProcess*bpf); - - pDevice->null_device.currentPeriodFramesRemainingCapture -= framesToProcess; - totalPCMFramesProcessed += framesToProcess; - } - - /* If we've consumed the current period we'll need to mark it as such an ensure the device is started if it's not already. */ - if (pDevice->null_device.currentPeriodFramesRemainingCapture == 0) { - pDevice->null_device.currentPeriodFramesRemainingCapture = 0; - } - - /* If we've consumed the whole buffer we can return now. */ - MA_ASSERT(totalPCMFramesProcessed <= frameCount); - if (totalPCMFramesProcessed == frameCount) { - break; - } - - /* Getting here means we've still got more frames to consume, we but need to wait for it to become available. */ - targetFrame = pDevice->null_device.lastProcessedFrameCapture + pDevice->capture.internalPeriodSizeInFrames; - for (;;) { - ma_uint64 currentFrame; - - /* Stop waiting if the device has been stopped. */ - if (!c89atomic_load_32(&pDevice->null_device.isStarted)) { - break; - } - - currentFrame = ma_device_get_total_run_time_in_frames__null(pDevice); - if (currentFrame >= targetFrame) { - break; - } - - /* Getting here means we haven't yet reached the target sample, so continue waiting. */ - ma_sleep(10); - } - - pDevice->null_device.lastProcessedFrameCapture += pDevice->capture.internalPeriodSizeInFrames; - pDevice->null_device.currentPeriodFramesRemainingCapture = pDevice->capture.internalPeriodSizeInFrames; - } - - if (pFramesRead != NULL) { - *pFramesRead = totalPCMFramesProcessed; - } - - return result; -} - -static ma_result ma_context_uninit__null(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_null); - - (void)pContext; - return MA_SUCCESS; -} - -static ma_result ma_context_init__null(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - MA_ASSERT(pContext != NULL); - - (void)pConfig; - (void)pContext; - - pCallbacks->onContextInit = ma_context_init__null; - pCallbacks->onContextUninit = ma_context_uninit__null; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__null; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__null; - pCallbacks->onDeviceInit = ma_device_init__null; - pCallbacks->onDeviceUninit = ma_device_uninit__null; - pCallbacks->onDeviceStart = ma_device_start__null; - pCallbacks->onDeviceStop = ma_device_stop__null; - pCallbacks->onDeviceRead = ma_device_read__null; - pCallbacks->onDeviceWrite = ma_device_write__null; - pCallbacks->onDeviceDataLoop = NULL; /* Our backend is asynchronous with a blocking read-write API which means we can get miniaudio to deal with the audio thread. */ - - /* The null backend always works. */ - return MA_SUCCESS; -} -#endif - - - -/******************************************************************************* - -WIN32 COMMON - -*******************************************************************************/ -#if defined(MA_WIN32) -#if defined(MA_WIN32_DESKTOP) - #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit) ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit) - #define ma_CoUninitialize(pContext) ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)() - #define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv) ((MA_PFN_CoCreateInstance)pContext->win32.CoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv) - #define ma_CoTaskMemFree(pContext, pv) ((MA_PFN_CoTaskMemFree)pContext->win32.CoTaskMemFree)(pv) - #define ma_PropVariantClear(pContext, pvar) ((MA_PFN_PropVariantClear)pContext->win32.PropVariantClear)(pvar) -#else - #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit) CoInitializeEx(pvReserved, dwCoInit) - #define ma_CoUninitialize(pContext) CoUninitialize() - #define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv) CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv) - #define ma_CoTaskMemFree(pContext, pv) CoTaskMemFree(pv) - #define ma_PropVariantClear(pContext, pvar) PropVariantClear(pvar) -#endif - -#if !defined(MAXULONG_PTR) && !defined(__WATCOMC__) -typedef size_t DWORD_PTR; -#endif - -#if !defined(WAVE_FORMAT_44M08) -#define WAVE_FORMAT_44M08 0x00000100 -#define WAVE_FORMAT_44S08 0x00000200 -#define WAVE_FORMAT_44M16 0x00000400 -#define WAVE_FORMAT_44S16 0x00000800 -#define WAVE_FORMAT_48M08 0x00001000 -#define WAVE_FORMAT_48S08 0x00002000 -#define WAVE_FORMAT_48M16 0x00004000 -#define WAVE_FORMAT_48S16 0x00008000 -#define WAVE_FORMAT_96M08 0x00010000 -#define WAVE_FORMAT_96S08 0x00020000 -#define WAVE_FORMAT_96M16 0x00040000 -#define WAVE_FORMAT_96S16 0x00080000 -#endif - -#ifndef SPEAKER_FRONT_LEFT -#define SPEAKER_FRONT_LEFT 0x1 -#define SPEAKER_FRONT_RIGHT 0x2 -#define SPEAKER_FRONT_CENTER 0x4 -#define SPEAKER_LOW_FREQUENCY 0x8 -#define SPEAKER_BACK_LEFT 0x10 -#define SPEAKER_BACK_RIGHT 0x20 -#define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 -#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 -#define SPEAKER_BACK_CENTER 0x100 -#define SPEAKER_SIDE_LEFT 0x200 -#define SPEAKER_SIDE_RIGHT 0x400 -#define SPEAKER_TOP_CENTER 0x800 -#define SPEAKER_TOP_FRONT_LEFT 0x1000 -#define SPEAKER_TOP_FRONT_CENTER 0x2000 -#define SPEAKER_TOP_FRONT_RIGHT 0x4000 -#define SPEAKER_TOP_BACK_LEFT 0x8000 -#define SPEAKER_TOP_BACK_CENTER 0x10000 -#define SPEAKER_TOP_BACK_RIGHT 0x20000 -#endif - -/* -The SDK that comes with old versions of MSVC (VC6, for example) does not appear to define WAVEFORMATEXTENSIBLE. We -define our own implementation in this case. -*/ -#if (defined(_MSC_VER) && !defined(_WAVEFORMATEXTENSIBLE_)) || defined(__DMC__) -typedef struct -{ - WAVEFORMATEX Format; - union - { - WORD wValidBitsPerSample; - WORD wSamplesPerBlock; - WORD wReserved; - } Samples; - DWORD dwChannelMask; - GUID SubFormat; -} WAVEFORMATEXTENSIBLE; -#endif - -#ifndef WAVE_FORMAT_EXTENSIBLE -#define WAVE_FORMAT_EXTENSIBLE 0xFFFE -#endif - -#ifndef WAVE_FORMAT_IEEE_FLOAT -#define WAVE_FORMAT_IEEE_FLOAT 0x0003 -#endif - -/* Converts an individual Win32-style channel identifier (SPEAKER_FRONT_LEFT, etc.) to miniaudio. */ -static ma_uint8 ma_channel_id_to_ma__win32(DWORD id) -{ - switch (id) - { - case SPEAKER_FRONT_LEFT: return MA_CHANNEL_FRONT_LEFT; - case SPEAKER_FRONT_RIGHT: return MA_CHANNEL_FRONT_RIGHT; - case SPEAKER_FRONT_CENTER: return MA_CHANNEL_FRONT_CENTER; - case SPEAKER_LOW_FREQUENCY: return MA_CHANNEL_LFE; - case SPEAKER_BACK_LEFT: return MA_CHANNEL_BACK_LEFT; - case SPEAKER_BACK_RIGHT: return MA_CHANNEL_BACK_RIGHT; - case SPEAKER_FRONT_LEFT_OF_CENTER: return MA_CHANNEL_FRONT_LEFT_CENTER; - case SPEAKER_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER; - case SPEAKER_BACK_CENTER: return MA_CHANNEL_BACK_CENTER; - case SPEAKER_SIDE_LEFT: return MA_CHANNEL_SIDE_LEFT; - case SPEAKER_SIDE_RIGHT: return MA_CHANNEL_SIDE_RIGHT; - case SPEAKER_TOP_CENTER: return MA_CHANNEL_TOP_CENTER; - case SPEAKER_TOP_FRONT_LEFT: return MA_CHANNEL_TOP_FRONT_LEFT; - case SPEAKER_TOP_FRONT_CENTER: return MA_CHANNEL_TOP_FRONT_CENTER; - case SPEAKER_TOP_FRONT_RIGHT: return MA_CHANNEL_TOP_FRONT_RIGHT; - case SPEAKER_TOP_BACK_LEFT: return MA_CHANNEL_TOP_BACK_LEFT; - case SPEAKER_TOP_BACK_CENTER: return MA_CHANNEL_TOP_BACK_CENTER; - case SPEAKER_TOP_BACK_RIGHT: return MA_CHANNEL_TOP_BACK_RIGHT; - default: return 0; - } -} - -/* Converts an individual miniaudio channel identifier (MA_CHANNEL_FRONT_LEFT, etc.) to Win32-style. */ -static DWORD ma_channel_id_to_win32(DWORD id) -{ - switch (id) - { - case MA_CHANNEL_MONO: return SPEAKER_FRONT_CENTER; - case MA_CHANNEL_FRONT_LEFT: return SPEAKER_FRONT_LEFT; - case MA_CHANNEL_FRONT_RIGHT: return SPEAKER_FRONT_RIGHT; - case MA_CHANNEL_FRONT_CENTER: return SPEAKER_FRONT_CENTER; - case MA_CHANNEL_LFE: return SPEAKER_LOW_FREQUENCY; - case MA_CHANNEL_BACK_LEFT: return SPEAKER_BACK_LEFT; - case MA_CHANNEL_BACK_RIGHT: return SPEAKER_BACK_RIGHT; - case MA_CHANNEL_FRONT_LEFT_CENTER: return SPEAKER_FRONT_LEFT_OF_CENTER; - case MA_CHANNEL_FRONT_RIGHT_CENTER: return SPEAKER_FRONT_RIGHT_OF_CENTER; - case MA_CHANNEL_BACK_CENTER: return SPEAKER_BACK_CENTER; - case MA_CHANNEL_SIDE_LEFT: return SPEAKER_SIDE_LEFT; - case MA_CHANNEL_SIDE_RIGHT: return SPEAKER_SIDE_RIGHT; - case MA_CHANNEL_TOP_CENTER: return SPEAKER_TOP_CENTER; - case MA_CHANNEL_TOP_FRONT_LEFT: return SPEAKER_TOP_FRONT_LEFT; - case MA_CHANNEL_TOP_FRONT_CENTER: return SPEAKER_TOP_FRONT_CENTER; - case MA_CHANNEL_TOP_FRONT_RIGHT: return SPEAKER_TOP_FRONT_RIGHT; - case MA_CHANNEL_TOP_BACK_LEFT: return SPEAKER_TOP_BACK_LEFT; - case MA_CHANNEL_TOP_BACK_CENTER: return SPEAKER_TOP_BACK_CENTER; - case MA_CHANNEL_TOP_BACK_RIGHT: return SPEAKER_TOP_BACK_RIGHT; - default: return 0; - } -} - -/* Converts a channel mapping to a Win32-style channel mask. */ -static DWORD ma_channel_map_to_channel_mask__win32(const ma_channel* pChannelMap, ma_uint32 channels) -{ - DWORD dwChannelMask = 0; - ma_uint32 iChannel; - - for (iChannel = 0; iChannel < channels; ++iChannel) { - dwChannelMask |= ma_channel_id_to_win32(pChannelMap[iChannel]); - } - - return dwChannelMask; -} - -/* Converts a Win32-style channel mask to a miniaudio channel map. */ -static void ma_channel_mask_to_channel_map__win32(DWORD dwChannelMask, ma_uint32 channels, ma_channel* pChannelMap) -{ - if (channels == 1 && dwChannelMask == 0) { - pChannelMap[0] = MA_CHANNEL_MONO; - } else if (channels == 2 && dwChannelMask == 0) { - pChannelMap[0] = MA_CHANNEL_FRONT_LEFT; - pChannelMap[1] = MA_CHANNEL_FRONT_RIGHT; - } else { - if (channels == 1 && (dwChannelMask & SPEAKER_FRONT_CENTER) != 0) { - pChannelMap[0] = MA_CHANNEL_MONO; - } else { - /* Just iterate over each bit. */ - ma_uint32 iChannel = 0; - ma_uint32 iBit; - - for (iBit = 0; iBit < 32 && iChannel < channels; ++iBit) { - DWORD bitValue = (dwChannelMask & (1UL << iBit)); - if (bitValue != 0) { - /* The bit is set. */ - pChannelMap[iChannel] = ma_channel_id_to_ma__win32(bitValue); - iChannel += 1; - } - } - } - } -} - -#ifdef __cplusplus -static ma_bool32 ma_is_guid_equal(const void* a, const void* b) -{ - return IsEqualGUID(*(const GUID*)a, *(const GUID*)b); -} -#else -#define ma_is_guid_equal(a, b) IsEqualGUID((const GUID*)a, (const GUID*)b) -#endif - -static MA_INLINE ma_bool32 ma_is_guid_null(const void* guid) -{ - static GUID nullguid = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; - return ma_is_guid_equal(guid, &nullguid); -} - -static ma_format ma_format_from_WAVEFORMATEX(const WAVEFORMATEX* pWF) -{ - MA_ASSERT(pWF != NULL); - - if (pWF->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { - const WAVEFORMATEXTENSIBLE* pWFEX = (const WAVEFORMATEXTENSIBLE*)pWF; - if (ma_is_guid_equal(&pWFEX->SubFormat, &MA_GUID_KSDATAFORMAT_SUBTYPE_PCM)) { - if (pWFEX->Samples.wValidBitsPerSample == 32) { - return ma_format_s32; - } - if (pWFEX->Samples.wValidBitsPerSample == 24) { - if (pWFEX->Format.wBitsPerSample == 32) { - /*return ma_format_s24_32;*/ - } - if (pWFEX->Format.wBitsPerSample == 24) { - return ma_format_s24; - } - } - if (pWFEX->Samples.wValidBitsPerSample == 16) { - return ma_format_s16; - } - if (pWFEX->Samples.wValidBitsPerSample == 8) { - return ma_format_u8; - } - } - if (ma_is_guid_equal(&pWFEX->SubFormat, &MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) { - if (pWFEX->Samples.wValidBitsPerSample == 32) { - return ma_format_f32; - } - /* - if (pWFEX->Samples.wValidBitsPerSample == 64) { - return ma_format_f64; - } - */ - } - } else { - if (pWF->wFormatTag == WAVE_FORMAT_PCM) { - if (pWF->wBitsPerSample == 32) { - return ma_format_s32; - } - if (pWF->wBitsPerSample == 24) { - return ma_format_s24; - } - if (pWF->wBitsPerSample == 16) { - return ma_format_s16; - } - if (pWF->wBitsPerSample == 8) { - return ma_format_u8; - } - } - if (pWF->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) { - if (pWF->wBitsPerSample == 32) { - return ma_format_f32; - } - if (pWF->wBitsPerSample == 64) { - /*return ma_format_f64;*/ - } - } - } - - return ma_format_unknown; -} -#endif - - -/******************************************************************************* - -WASAPI Backend - -*******************************************************************************/ -#ifdef MA_HAS_WASAPI -#if 0 -#if defined(_MSC_VER) - #pragma warning(push) - #pragma warning(disable:4091) /* 'typedef ': ignored on left of '' when no variable is declared */ -#endif -#include -#include -#if defined(_MSC_VER) - #pragma warning(pop) -#endif -#endif /* 0 */ - -static ma_result ma_device_reroute__wasapi(ma_device* pDevice, ma_device_type deviceType); - -/* Some compilers don't define VerifyVersionInfoW. Need to write this ourselves. */ -#define MA_WIN32_WINNT_VISTA 0x0600 -#define MA_VER_MINORVERSION 0x01 -#define MA_VER_MAJORVERSION 0x02 -#define MA_VER_SERVICEPACKMAJOR 0x20 -#define MA_VER_GREATER_EQUAL 0x03 - -typedef struct { - DWORD dwOSVersionInfoSize; - DWORD dwMajorVersion; - DWORD dwMinorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformId; - WCHAR szCSDVersion[128]; - WORD wServicePackMajor; - WORD wServicePackMinor; - WORD wSuiteMask; - BYTE wProductType; - BYTE wReserved; -} ma_OSVERSIONINFOEXW; - -typedef BOOL (WINAPI * ma_PFNVerifyVersionInfoW) (ma_OSVERSIONINFOEXW* lpVersionInfo, DWORD dwTypeMask, DWORDLONG dwlConditionMask); -typedef ULONGLONG (WINAPI * ma_PFNVerSetConditionMask)(ULONGLONG dwlConditionMask, DWORD dwTypeBitMask, BYTE dwConditionMask); - - -#ifndef PROPERTYKEY_DEFINED -#define PROPERTYKEY_DEFINED -#ifndef __WATCOMC__ -typedef struct -{ - GUID fmtid; - DWORD pid; -} PROPERTYKEY; -#endif -#endif - -/* Some compilers don't define PropVariantInit(). We just do this ourselves since it's just a memset(). */ -static MA_INLINE void ma_PropVariantInit(PROPVARIANT* pProp) -{ - MA_ZERO_OBJECT(pProp); -} - - -static const PROPERTYKEY MA_PKEY_Device_FriendlyName = {{0xA45C254E, 0xDF1C, 0x4EFD, {0x80, 0x20, 0x67, 0xD1, 0x46, 0xA8, 0x50, 0xE0}}, 14}; -static const PROPERTYKEY MA_PKEY_AudioEngine_DeviceFormat = {{0xF19F064D, 0x82C, 0x4E27, {0xBC, 0x73, 0x68, 0x82, 0xA1, 0xBB, 0x8E, 0x4C}}, 0}; - -static const IID MA_IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; /* 00000000-0000-0000-C000-000000000046 */ -#if !defined(MA_WIN32_DESKTOP) && !defined(MA_WIN32_GDK) -static const IID MA_IID_IAgileObject = {0x94EA2B94, 0xE9CC, 0x49E0, {0xC0, 0xFF, 0xEE, 0x64, 0xCA, 0x8F, 0x5B, 0x90}}; /* 94EA2B94-E9CC-49E0-C0FF-EE64CA8F5B90 */ -#endif - -static const IID MA_IID_IAudioClient = {0x1CB9AD4C, 0xDBFA, 0x4C32, {0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2}}; /* 1CB9AD4C-DBFA-4C32-B178-C2F568A703B2 = __uuidof(IAudioClient) */ -static const IID MA_IID_IAudioClient2 = {0x726778CD, 0xF60A, 0x4EDA, {0x82, 0xDE, 0xE4, 0x76, 0x10, 0xCD, 0x78, 0xAA}}; /* 726778CD-F60A-4EDA-82DE-E47610CD78AA = __uuidof(IAudioClient2) */ -static const IID MA_IID_IAudioClient3 = {0x7ED4EE07, 0x8E67, 0x4CD4, {0x8C, 0x1A, 0x2B, 0x7A, 0x59, 0x87, 0xAD, 0x42}}; /* 7ED4EE07-8E67-4CD4-8C1A-2B7A5987AD42 = __uuidof(IAudioClient3) */ -static const IID MA_IID_IAudioRenderClient = {0xF294ACFC, 0x3146, 0x4483, {0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2}}; /* F294ACFC-3146-4483-A7BF-ADDCA7C260E2 = __uuidof(IAudioRenderClient) */ -static const IID MA_IID_IAudioCaptureClient = {0xC8ADBD64, 0xE71E, 0x48A0, {0xA4, 0xDE, 0x18, 0x5C, 0x39, 0x5C, 0xD3, 0x17}}; /* C8ADBD64-E71E-48A0-A4DE-185C395CD317 = __uuidof(IAudioCaptureClient) */ -static const IID MA_IID_IMMNotificationClient = {0x7991EEC9, 0x7E89, 0x4D85, {0x83, 0x90, 0x6C, 0x70, 0x3C, 0xEC, 0x60, 0xC0}}; /* 7991EEC9-7E89-4D85-8390-6C703CEC60C0 = __uuidof(IMMNotificationClient) */ -#if !defined(MA_WIN32_DESKTOP) && !defined(MA_WIN32_GDK) -static const IID MA_IID_DEVINTERFACE_AUDIO_RENDER = {0xE6327CAD, 0xDCEC, 0x4949, {0xAE, 0x8A, 0x99, 0x1E, 0x97, 0x6A, 0x79, 0xD2}}; /* E6327CAD-DCEC-4949-AE8A-991E976A79D2 */ -static const IID MA_IID_DEVINTERFACE_AUDIO_CAPTURE = {0x2EEF81BE, 0x33FA, 0x4800, {0x96, 0x70, 0x1C, 0xD4, 0x74, 0x97, 0x2C, 0x3F}}; /* 2EEF81BE-33FA-4800-9670-1CD474972C3F */ -static const IID MA_IID_IActivateAudioInterfaceCompletionHandler = {0x41D949AB, 0x9862, 0x444A, {0x80, 0xF6, 0xC2, 0x61, 0x33, 0x4D, 0xA5, 0xEB}}; /* 41D949AB-9862-444A-80F6-C261334DA5EB */ -#endif - -static const IID MA_CLSID_MMDeviceEnumerator_Instance = {0xBCDE0395, 0xE52F, 0x467C, {0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E}}; /* BCDE0395-E52F-467C-8E3D-C4579291692E = __uuidof(MMDeviceEnumerator) */ -static const IID MA_IID_IMMDeviceEnumerator_Instance = {0xA95664D2, 0x9614, 0x4F35, {0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6}}; /* A95664D2-9614-4F35-A746-DE8DB63617E6 = __uuidof(IMMDeviceEnumerator) */ -#ifdef __cplusplus -#define MA_CLSID_MMDeviceEnumerator MA_CLSID_MMDeviceEnumerator_Instance -#define MA_IID_IMMDeviceEnumerator MA_IID_IMMDeviceEnumerator_Instance -#else -#define MA_CLSID_MMDeviceEnumerator &MA_CLSID_MMDeviceEnumerator_Instance -#define MA_IID_IMMDeviceEnumerator &MA_IID_IMMDeviceEnumerator_Instance -#endif - -typedef struct ma_IUnknown ma_IUnknown; -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) -#define MA_MM_DEVICE_STATE_ACTIVE 1 -#define MA_MM_DEVICE_STATE_DISABLED 2 -#define MA_MM_DEVICE_STATE_NOTPRESENT 4 -#define MA_MM_DEVICE_STATE_UNPLUGGED 8 - -typedef struct ma_IMMDeviceEnumerator ma_IMMDeviceEnumerator; -typedef struct ma_IMMDeviceCollection ma_IMMDeviceCollection; -typedef struct ma_IMMDevice ma_IMMDevice; -#else -typedef struct ma_IActivateAudioInterfaceCompletionHandler ma_IActivateAudioInterfaceCompletionHandler; -typedef struct ma_IActivateAudioInterfaceAsyncOperation ma_IActivateAudioInterfaceAsyncOperation; -#endif -typedef struct ma_IPropertyStore ma_IPropertyStore; -typedef struct ma_IAudioClient ma_IAudioClient; -typedef struct ma_IAudioClient2 ma_IAudioClient2; -typedef struct ma_IAudioClient3 ma_IAudioClient3; -typedef struct ma_IAudioRenderClient ma_IAudioRenderClient; -typedef struct ma_IAudioCaptureClient ma_IAudioCaptureClient; - -typedef ma_int64 MA_REFERENCE_TIME; - -#define MA_AUDCLNT_STREAMFLAGS_CROSSPROCESS 0x00010000 -#define MA_AUDCLNT_STREAMFLAGS_LOOPBACK 0x00020000 -#define MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK 0x00040000 -#define MA_AUDCLNT_STREAMFLAGS_NOPERSIST 0x00080000 -#define MA_AUDCLNT_STREAMFLAGS_RATEADJUST 0x00100000 -#define MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 -#define MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000 -#define MA_AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED 0x10000000 -#define MA_AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE 0x20000000 -#define MA_AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED 0x40000000 - -/* Buffer flags. */ -#define MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY 1 -#define MA_AUDCLNT_BUFFERFLAGS_SILENT 2 -#define MA_AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR 4 - -typedef enum -{ - ma_eRender = 0, - ma_eCapture = 1, - ma_eAll = 2 -} ma_EDataFlow; - -typedef enum -{ - ma_eConsole = 0, - ma_eMultimedia = 1, - ma_eCommunications = 2 -} ma_ERole; - -typedef enum -{ - MA_AUDCLNT_SHAREMODE_SHARED, - MA_AUDCLNT_SHAREMODE_EXCLUSIVE -} MA_AUDCLNT_SHAREMODE; - -typedef enum -{ - MA_AudioCategory_Other = 0 /* <-- miniaudio is only caring about Other. */ -} MA_AUDIO_STREAM_CATEGORY; - -typedef struct -{ - ma_uint32 cbSize; - BOOL bIsOffload; - MA_AUDIO_STREAM_CATEGORY eCategory; -} ma_AudioClientProperties; - -/* IUnknown */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IUnknown* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IUnknown* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IUnknown* pThis); -} ma_IUnknownVtbl; -struct ma_IUnknown -{ - ma_IUnknownVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IUnknown_QueryInterface(ma_IUnknown* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IUnknown_AddRef(ma_IUnknown* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IUnknown_Release(ma_IUnknown* pThis) { return pThis->lpVtbl->Release(pThis); } - -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - /* IMMNotificationClient */ - typedef struct - { - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMNotificationClient* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IMMNotificationClient* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IMMNotificationClient* pThis); - - /* IMMNotificationClient */ - HRESULT (STDMETHODCALLTYPE * OnDeviceStateChanged) (ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, DWORD dwNewState); - HRESULT (STDMETHODCALLTYPE * OnDeviceAdded) (ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID); - HRESULT (STDMETHODCALLTYPE * OnDeviceRemoved) (ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID); - HRESULT (STDMETHODCALLTYPE * OnDefaultDeviceChanged)(ma_IMMNotificationClient* pThis, ma_EDataFlow dataFlow, ma_ERole role, LPCWSTR pDefaultDeviceID); - HRESULT (STDMETHODCALLTYPE * OnPropertyValueChanged)(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, const PROPERTYKEY key); - } ma_IMMNotificationClientVtbl; - - /* IMMDeviceEnumerator */ - typedef struct - { - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDeviceEnumerator* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IMMDeviceEnumerator* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IMMDeviceEnumerator* pThis); - - /* IMMDeviceEnumerator */ - HRESULT (STDMETHODCALLTYPE * EnumAudioEndpoints) (ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, DWORD dwStateMask, ma_IMMDeviceCollection** ppDevices); - HRESULT (STDMETHODCALLTYPE * GetDefaultAudioEndpoint) (ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, ma_ERole role, ma_IMMDevice** ppEndpoint); - HRESULT (STDMETHODCALLTYPE * GetDevice) (ma_IMMDeviceEnumerator* pThis, LPCWSTR pID, ma_IMMDevice** ppDevice); - HRESULT (STDMETHODCALLTYPE * RegisterEndpointNotificationCallback) (ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient); - HRESULT (STDMETHODCALLTYPE * UnregisterEndpointNotificationCallback)(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient); - } ma_IMMDeviceEnumeratorVtbl; - struct ma_IMMDeviceEnumerator - { - ma_IMMDeviceEnumeratorVtbl* lpVtbl; - }; - static MA_INLINE HRESULT ma_IMMDeviceEnumerator_QueryInterface(ma_IMMDeviceEnumerator* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } - static MA_INLINE ULONG ma_IMMDeviceEnumerator_AddRef(ma_IMMDeviceEnumerator* pThis) { return pThis->lpVtbl->AddRef(pThis); } - static MA_INLINE ULONG ma_IMMDeviceEnumerator_Release(ma_IMMDeviceEnumerator* pThis) { return pThis->lpVtbl->Release(pThis); } - static MA_INLINE HRESULT ma_IMMDeviceEnumerator_EnumAudioEndpoints(ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, DWORD dwStateMask, ma_IMMDeviceCollection** ppDevices) { return pThis->lpVtbl->EnumAudioEndpoints(pThis, dataFlow, dwStateMask, ppDevices); } - static MA_INLINE HRESULT ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, ma_ERole role, ma_IMMDevice** ppEndpoint) { return pThis->lpVtbl->GetDefaultAudioEndpoint(pThis, dataFlow, role, ppEndpoint); } - static MA_INLINE HRESULT ma_IMMDeviceEnumerator_GetDevice(ma_IMMDeviceEnumerator* pThis, LPCWSTR pID, ma_IMMDevice** ppDevice) { return pThis->lpVtbl->GetDevice(pThis, pID, ppDevice); } - static MA_INLINE HRESULT ma_IMMDeviceEnumerator_RegisterEndpointNotificationCallback(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient) { return pThis->lpVtbl->RegisterEndpointNotificationCallback(pThis, pClient); } - static MA_INLINE HRESULT ma_IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient) { return pThis->lpVtbl->UnregisterEndpointNotificationCallback(pThis, pClient); } - - - /* IMMDeviceCollection */ - typedef struct - { - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDeviceCollection* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IMMDeviceCollection* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IMMDeviceCollection* pThis); - - /* IMMDeviceCollection */ - HRESULT (STDMETHODCALLTYPE * GetCount)(ma_IMMDeviceCollection* pThis, UINT* pDevices); - HRESULT (STDMETHODCALLTYPE * Item) (ma_IMMDeviceCollection* pThis, UINT nDevice, ma_IMMDevice** ppDevice); - } ma_IMMDeviceCollectionVtbl; - struct ma_IMMDeviceCollection - { - ma_IMMDeviceCollectionVtbl* lpVtbl; - }; - static MA_INLINE HRESULT ma_IMMDeviceCollection_QueryInterface(ma_IMMDeviceCollection* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } - static MA_INLINE ULONG ma_IMMDeviceCollection_AddRef(ma_IMMDeviceCollection* pThis) { return pThis->lpVtbl->AddRef(pThis); } - static MA_INLINE ULONG ma_IMMDeviceCollection_Release(ma_IMMDeviceCollection* pThis) { return pThis->lpVtbl->Release(pThis); } - static MA_INLINE HRESULT ma_IMMDeviceCollection_GetCount(ma_IMMDeviceCollection* pThis, UINT* pDevices) { return pThis->lpVtbl->GetCount(pThis, pDevices); } - static MA_INLINE HRESULT ma_IMMDeviceCollection_Item(ma_IMMDeviceCollection* pThis, UINT nDevice, ma_IMMDevice** ppDevice) { return pThis->lpVtbl->Item(pThis, nDevice, ppDevice); } - - - /* IMMDevice */ - typedef struct - { - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDevice* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IMMDevice* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IMMDevice* pThis); - - /* IMMDevice */ - HRESULT (STDMETHODCALLTYPE * Activate) (ma_IMMDevice* pThis, const IID* const iid, DWORD dwClsCtx, PROPVARIANT* pActivationParams, void** ppInterface); - HRESULT (STDMETHODCALLTYPE * OpenPropertyStore)(ma_IMMDevice* pThis, DWORD stgmAccess, ma_IPropertyStore** ppProperties); - HRESULT (STDMETHODCALLTYPE * GetId) (ma_IMMDevice* pThis, LPWSTR *pID); - HRESULT (STDMETHODCALLTYPE * GetState) (ma_IMMDevice* pThis, DWORD *pState); - } ma_IMMDeviceVtbl; - struct ma_IMMDevice - { - ma_IMMDeviceVtbl* lpVtbl; - }; - static MA_INLINE HRESULT ma_IMMDevice_QueryInterface(ma_IMMDevice* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } - static MA_INLINE ULONG ma_IMMDevice_AddRef(ma_IMMDevice* pThis) { return pThis->lpVtbl->AddRef(pThis); } - static MA_INLINE ULONG ma_IMMDevice_Release(ma_IMMDevice* pThis) { return pThis->lpVtbl->Release(pThis); } - static MA_INLINE HRESULT ma_IMMDevice_Activate(ma_IMMDevice* pThis, const IID* const iid, DWORD dwClsCtx, PROPVARIANT* pActivationParams, void** ppInterface) { return pThis->lpVtbl->Activate(pThis, iid, dwClsCtx, pActivationParams, ppInterface); } - static MA_INLINE HRESULT ma_IMMDevice_OpenPropertyStore(ma_IMMDevice* pThis, DWORD stgmAccess, ma_IPropertyStore** ppProperties) { return pThis->lpVtbl->OpenPropertyStore(pThis, stgmAccess, ppProperties); } - static MA_INLINE HRESULT ma_IMMDevice_GetId(ma_IMMDevice* pThis, LPWSTR *pID) { return pThis->lpVtbl->GetId(pThis, pID); } - static MA_INLINE HRESULT ma_IMMDevice_GetState(ma_IMMDevice* pThis, DWORD *pState) { return pThis->lpVtbl->GetState(pThis, pState); } -#else - /* IActivateAudioInterfaceAsyncOperation */ - typedef struct - { - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IActivateAudioInterfaceAsyncOperation* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IActivateAudioInterfaceAsyncOperation* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IActivateAudioInterfaceAsyncOperation* pThis); - - /* IActivateAudioInterfaceAsyncOperation */ - HRESULT (STDMETHODCALLTYPE * GetActivateResult)(ma_IActivateAudioInterfaceAsyncOperation* pThis, HRESULT *pActivateResult, ma_IUnknown** ppActivatedInterface); - } ma_IActivateAudioInterfaceAsyncOperationVtbl; - struct ma_IActivateAudioInterfaceAsyncOperation - { - ma_IActivateAudioInterfaceAsyncOperationVtbl* lpVtbl; - }; - static MA_INLINE HRESULT ma_IActivateAudioInterfaceAsyncOperation_QueryInterface(ma_IActivateAudioInterfaceAsyncOperation* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } - static MA_INLINE ULONG ma_IActivateAudioInterfaceAsyncOperation_AddRef(ma_IActivateAudioInterfaceAsyncOperation* pThis) { return pThis->lpVtbl->AddRef(pThis); } - static MA_INLINE ULONG ma_IActivateAudioInterfaceAsyncOperation_Release(ma_IActivateAudioInterfaceAsyncOperation* pThis) { return pThis->lpVtbl->Release(pThis); } - static MA_INLINE HRESULT ma_IActivateAudioInterfaceAsyncOperation_GetActivateResult(ma_IActivateAudioInterfaceAsyncOperation* pThis, HRESULT *pActivateResult, ma_IUnknown** ppActivatedInterface) { return pThis->lpVtbl->GetActivateResult(pThis, pActivateResult, ppActivatedInterface); } -#endif - -/* IPropertyStore */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IPropertyStore* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IPropertyStore* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IPropertyStore* pThis); - - /* IPropertyStore */ - HRESULT (STDMETHODCALLTYPE * GetCount)(ma_IPropertyStore* pThis, DWORD* pPropCount); - HRESULT (STDMETHODCALLTYPE * GetAt) (ma_IPropertyStore* pThis, DWORD propIndex, PROPERTYKEY* pPropKey); - HRESULT (STDMETHODCALLTYPE * GetValue)(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, PROPVARIANT* pPropVar); - HRESULT (STDMETHODCALLTYPE * SetValue)(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, const PROPVARIANT* const pPropVar); - HRESULT (STDMETHODCALLTYPE * Commit) (ma_IPropertyStore* pThis); -} ma_IPropertyStoreVtbl; -struct ma_IPropertyStore -{ - ma_IPropertyStoreVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IPropertyStore_QueryInterface(ma_IPropertyStore* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IPropertyStore_AddRef(ma_IPropertyStore* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IPropertyStore_Release(ma_IPropertyStore* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IPropertyStore_GetCount(ma_IPropertyStore* pThis, DWORD* pPropCount) { return pThis->lpVtbl->GetCount(pThis, pPropCount); } -static MA_INLINE HRESULT ma_IPropertyStore_GetAt(ma_IPropertyStore* pThis, DWORD propIndex, PROPERTYKEY* pPropKey) { return pThis->lpVtbl->GetAt(pThis, propIndex, pPropKey); } -static MA_INLINE HRESULT ma_IPropertyStore_GetValue(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, PROPVARIANT* pPropVar) { return pThis->lpVtbl->GetValue(pThis, pKey, pPropVar); } -static MA_INLINE HRESULT ma_IPropertyStore_SetValue(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, const PROPVARIANT* const pPropVar) { return pThis->lpVtbl->SetValue(pThis, pKey, pPropVar); } -static MA_INLINE HRESULT ma_IPropertyStore_Commit(ma_IPropertyStore* pThis) { return pThis->lpVtbl->Commit(pThis); } - - -/* IAudioClient */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IAudioClient* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IAudioClient* pThis); - - /* IAudioClient */ - HRESULT (STDMETHODCALLTYPE * Initialize) (ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid); - HRESULT (STDMETHODCALLTYPE * GetBufferSize) (ma_IAudioClient* pThis, ma_uint32* pNumBufferFrames); - HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient* pThis, MA_REFERENCE_TIME* pLatency); - HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient* pThis, ma_uint32* pNumPaddingFrames); - HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch); - HRESULT (STDMETHODCALLTYPE * GetMixFormat) (ma_IAudioClient* pThis, WAVEFORMATEX** ppDeviceFormat); - HRESULT (STDMETHODCALLTYPE * GetDevicePeriod) (ma_IAudioClient* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod); - HRESULT (STDMETHODCALLTYPE * Start) (ma_IAudioClient* pThis); - HRESULT (STDMETHODCALLTYPE * Stop) (ma_IAudioClient* pThis); - HRESULT (STDMETHODCALLTYPE * Reset) (ma_IAudioClient* pThis); - HRESULT (STDMETHODCALLTYPE * SetEventHandle) (ma_IAudioClient* pThis, HANDLE eventHandle); - HRESULT (STDMETHODCALLTYPE * GetService) (ma_IAudioClient* pThis, const IID* const riid, void** pp); -} ma_IAudioClientVtbl; -struct ma_IAudioClient -{ - ma_IAudioClientVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IAudioClient_QueryInterface(ma_IAudioClient* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IAudioClient_AddRef(ma_IAudioClient* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IAudioClient_Release(ma_IAudioClient* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IAudioClient_Initialize(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); } -static MA_INLINE HRESULT ma_IAudioClient_GetBufferSize(ma_IAudioClient* pThis, ma_uint32* pNumBufferFrames) { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); } -static MA_INLINE HRESULT ma_IAudioClient_GetStreamLatency(ma_IAudioClient* pThis, MA_REFERENCE_TIME* pLatency) { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); } -static MA_INLINE HRESULT ma_IAudioClient_GetCurrentPadding(ma_IAudioClient* pThis, ma_uint32* pNumPaddingFrames) { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); } -static MA_INLINE HRESULT ma_IAudioClient_IsFormatSupported(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); } -static MA_INLINE HRESULT ma_IAudioClient_GetMixFormat(ma_IAudioClient* pThis, WAVEFORMATEX** ppDeviceFormat) { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); } -static MA_INLINE HRESULT ma_IAudioClient_GetDevicePeriod(ma_IAudioClient* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); } -static MA_INLINE HRESULT ma_IAudioClient_Start(ma_IAudioClient* pThis) { return pThis->lpVtbl->Start(pThis); } -static MA_INLINE HRESULT ma_IAudioClient_Stop(ma_IAudioClient* pThis) { return pThis->lpVtbl->Stop(pThis); } -static MA_INLINE HRESULT ma_IAudioClient_Reset(ma_IAudioClient* pThis) { return pThis->lpVtbl->Reset(pThis); } -static MA_INLINE HRESULT ma_IAudioClient_SetEventHandle(ma_IAudioClient* pThis, HANDLE eventHandle) { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); } -static MA_INLINE HRESULT ma_IAudioClient_GetService(ma_IAudioClient* pThis, const IID* const riid, void** pp) { return pThis->lpVtbl->GetService(pThis, riid, pp); } - -/* IAudioClient2 */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient2* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IAudioClient2* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IAudioClient2* pThis); - - /* IAudioClient */ - HRESULT (STDMETHODCALLTYPE * Initialize) (ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid); - HRESULT (STDMETHODCALLTYPE * GetBufferSize) (ma_IAudioClient2* pThis, ma_uint32* pNumBufferFrames); - HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pLatency); - HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient2* pThis, ma_uint32* pNumPaddingFrames); - HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch); - HRESULT (STDMETHODCALLTYPE * GetMixFormat) (ma_IAudioClient2* pThis, WAVEFORMATEX** ppDeviceFormat); - HRESULT (STDMETHODCALLTYPE * GetDevicePeriod) (ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod); - HRESULT (STDMETHODCALLTYPE * Start) (ma_IAudioClient2* pThis); - HRESULT (STDMETHODCALLTYPE * Stop) (ma_IAudioClient2* pThis); - HRESULT (STDMETHODCALLTYPE * Reset) (ma_IAudioClient2* pThis); - HRESULT (STDMETHODCALLTYPE * SetEventHandle) (ma_IAudioClient2* pThis, HANDLE eventHandle); - HRESULT (STDMETHODCALLTYPE * GetService) (ma_IAudioClient2* pThis, const IID* const riid, void** pp); - - /* IAudioClient2 */ - HRESULT (STDMETHODCALLTYPE * IsOffloadCapable) (ma_IAudioClient2* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable); - HRESULT (STDMETHODCALLTYPE * SetClientProperties)(ma_IAudioClient2* pThis, const ma_AudioClientProperties* pProperties); - HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient2* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration); -} ma_IAudioClient2Vtbl; -struct ma_IAudioClient2 -{ - ma_IAudioClient2Vtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IAudioClient2_QueryInterface(ma_IAudioClient2* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IAudioClient2_AddRef(ma_IAudioClient2* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IAudioClient2_Release(ma_IAudioClient2* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IAudioClient2_Initialize(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); } -static MA_INLINE HRESULT ma_IAudioClient2_GetBufferSize(ma_IAudioClient2* pThis, ma_uint32* pNumBufferFrames) { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); } -static MA_INLINE HRESULT ma_IAudioClient2_GetStreamLatency(ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pLatency) { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); } -static MA_INLINE HRESULT ma_IAudioClient2_GetCurrentPadding(ma_IAudioClient2* pThis, ma_uint32* pNumPaddingFrames) { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); } -static MA_INLINE HRESULT ma_IAudioClient2_IsFormatSupported(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); } -static MA_INLINE HRESULT ma_IAudioClient2_GetMixFormat(ma_IAudioClient2* pThis, WAVEFORMATEX** ppDeviceFormat) { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); } -static MA_INLINE HRESULT ma_IAudioClient2_GetDevicePeriod(ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); } -static MA_INLINE HRESULT ma_IAudioClient2_Start(ma_IAudioClient2* pThis) { return pThis->lpVtbl->Start(pThis); } -static MA_INLINE HRESULT ma_IAudioClient2_Stop(ma_IAudioClient2* pThis) { return pThis->lpVtbl->Stop(pThis); } -static MA_INLINE HRESULT ma_IAudioClient2_Reset(ma_IAudioClient2* pThis) { return pThis->lpVtbl->Reset(pThis); } -static MA_INLINE HRESULT ma_IAudioClient2_SetEventHandle(ma_IAudioClient2* pThis, HANDLE eventHandle) { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); } -static MA_INLINE HRESULT ma_IAudioClient2_GetService(ma_IAudioClient2* pThis, const IID* const riid, void** pp) { return pThis->lpVtbl->GetService(pThis, riid, pp); } -static MA_INLINE HRESULT ma_IAudioClient2_IsOffloadCapable(ma_IAudioClient2* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); } -static MA_INLINE HRESULT ma_IAudioClient2_SetClientProperties(ma_IAudioClient2* pThis, const ma_AudioClientProperties* pProperties) { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); } -static MA_INLINE HRESULT ma_IAudioClient2_GetBufferSizeLimits(ma_IAudioClient2* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); } - - -/* IAudioClient3 */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient3* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IAudioClient3* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IAudioClient3* pThis); - - /* IAudioClient */ - HRESULT (STDMETHODCALLTYPE * Initialize) (ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid); - HRESULT (STDMETHODCALLTYPE * GetBufferSize) (ma_IAudioClient3* pThis, ma_uint32* pNumBufferFrames); - HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pLatency); - HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient3* pThis, ma_uint32* pNumPaddingFrames); - HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch); - HRESULT (STDMETHODCALLTYPE * GetMixFormat) (ma_IAudioClient3* pThis, WAVEFORMATEX** ppDeviceFormat); - HRESULT (STDMETHODCALLTYPE * GetDevicePeriod) (ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod); - HRESULT (STDMETHODCALLTYPE * Start) (ma_IAudioClient3* pThis); - HRESULT (STDMETHODCALLTYPE * Stop) (ma_IAudioClient3* pThis); - HRESULT (STDMETHODCALLTYPE * Reset) (ma_IAudioClient3* pThis); - HRESULT (STDMETHODCALLTYPE * SetEventHandle) (ma_IAudioClient3* pThis, HANDLE eventHandle); - HRESULT (STDMETHODCALLTYPE * GetService) (ma_IAudioClient3* pThis, const IID* const riid, void** pp); - - /* IAudioClient2 */ - HRESULT (STDMETHODCALLTYPE * IsOffloadCapable) (ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable); - HRESULT (STDMETHODCALLTYPE * SetClientProperties)(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties); - HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration); - - /* IAudioClient3 */ - HRESULT (STDMETHODCALLTYPE * GetSharedModeEnginePeriod) (ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, ma_uint32* pDefaultPeriodInFrames, ma_uint32* pFundamentalPeriodInFrames, ma_uint32* pMinPeriodInFrames, ma_uint32* pMaxPeriodInFrames); - HRESULT (STDMETHODCALLTYPE * GetCurrentSharedModeEnginePeriod)(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, ma_uint32* pCurrentPeriodInFrames); - HRESULT (STDMETHODCALLTYPE * InitializeSharedAudioStream) (ma_IAudioClient3* pThis, DWORD streamFlags, ma_uint32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid); -} ma_IAudioClient3Vtbl; -struct ma_IAudioClient3 -{ - ma_IAudioClient3Vtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IAudioClient3_QueryInterface(ma_IAudioClient3* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IAudioClient3_AddRef(ma_IAudioClient3* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IAudioClient3_Release(ma_IAudioClient3* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IAudioClient3_Initialize(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); } -static MA_INLINE HRESULT ma_IAudioClient3_GetBufferSize(ma_IAudioClient3* pThis, ma_uint32* pNumBufferFrames) { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); } -static MA_INLINE HRESULT ma_IAudioClient3_GetStreamLatency(ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pLatency) { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); } -static MA_INLINE HRESULT ma_IAudioClient3_GetCurrentPadding(ma_IAudioClient3* pThis, ma_uint32* pNumPaddingFrames) { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); } -static MA_INLINE HRESULT ma_IAudioClient3_IsFormatSupported(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, const WAVEFORMATEX* pFormat, WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); } -static MA_INLINE HRESULT ma_IAudioClient3_GetMixFormat(ma_IAudioClient3* pThis, WAVEFORMATEX** ppDeviceFormat) { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); } -static MA_INLINE HRESULT ma_IAudioClient3_GetDevicePeriod(ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); } -static MA_INLINE HRESULT ma_IAudioClient3_Start(ma_IAudioClient3* pThis) { return pThis->lpVtbl->Start(pThis); } -static MA_INLINE HRESULT ma_IAudioClient3_Stop(ma_IAudioClient3* pThis) { return pThis->lpVtbl->Stop(pThis); } -static MA_INLINE HRESULT ma_IAudioClient3_Reset(ma_IAudioClient3* pThis) { return pThis->lpVtbl->Reset(pThis); } -static MA_INLINE HRESULT ma_IAudioClient3_SetEventHandle(ma_IAudioClient3* pThis, HANDLE eventHandle) { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); } -static MA_INLINE HRESULT ma_IAudioClient3_GetService(ma_IAudioClient3* pThis, const IID* const riid, void** pp) { return pThis->lpVtbl->GetService(pThis, riid, pp); } -static MA_INLINE HRESULT ma_IAudioClient3_IsOffloadCapable(ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); } -static MA_INLINE HRESULT ma_IAudioClient3_SetClientProperties(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties) { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); } -static MA_INLINE HRESULT ma_IAudioClient3_GetBufferSizeLimits(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); } -static MA_INLINE HRESULT ma_IAudioClient3_GetSharedModeEnginePeriod(ma_IAudioClient3* pThis, const WAVEFORMATEX* pFormat, ma_uint32* pDefaultPeriodInFrames, ma_uint32* pFundamentalPeriodInFrames, ma_uint32* pMinPeriodInFrames, ma_uint32* pMaxPeriodInFrames) { return pThis->lpVtbl->GetSharedModeEnginePeriod(pThis, pFormat, pDefaultPeriodInFrames, pFundamentalPeriodInFrames, pMinPeriodInFrames, pMaxPeriodInFrames); } -static MA_INLINE HRESULT ma_IAudioClient3_GetCurrentSharedModeEnginePeriod(ma_IAudioClient3* pThis, WAVEFORMATEX** ppFormat, ma_uint32* pCurrentPeriodInFrames) { return pThis->lpVtbl->GetCurrentSharedModeEnginePeriod(pThis, ppFormat, pCurrentPeriodInFrames); } -static MA_INLINE HRESULT ma_IAudioClient3_InitializeSharedAudioStream(ma_IAudioClient3* pThis, DWORD streamFlags, ma_uint32 periodInFrames, const WAVEFORMATEX* pFormat, const GUID* pAudioSessionGUID) { return pThis->lpVtbl->InitializeSharedAudioStream(pThis, streamFlags, periodInFrames, pFormat, pAudioSessionGUID); } - - -/* IAudioRenderClient */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioRenderClient* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IAudioRenderClient* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IAudioRenderClient* pThis); - - /* IAudioRenderClient */ - HRESULT (STDMETHODCALLTYPE * GetBuffer) (ma_IAudioRenderClient* pThis, ma_uint32 numFramesRequested, BYTE** ppData); - HRESULT (STDMETHODCALLTYPE * ReleaseBuffer)(ma_IAudioRenderClient* pThis, ma_uint32 numFramesWritten, DWORD dwFlags); -} ma_IAudioRenderClientVtbl; -struct ma_IAudioRenderClient -{ - ma_IAudioRenderClientVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IAudioRenderClient_QueryInterface(ma_IAudioRenderClient* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IAudioRenderClient_AddRef(ma_IAudioRenderClient* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IAudioRenderClient_Release(ma_IAudioRenderClient* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IAudioRenderClient_GetBuffer(ma_IAudioRenderClient* pThis, ma_uint32 numFramesRequested, BYTE** ppData) { return pThis->lpVtbl->GetBuffer(pThis, numFramesRequested, ppData); } -static MA_INLINE HRESULT ma_IAudioRenderClient_ReleaseBuffer(ma_IAudioRenderClient* pThis, ma_uint32 numFramesWritten, DWORD dwFlags) { return pThis->lpVtbl->ReleaseBuffer(pThis, numFramesWritten, dwFlags); } - - -/* IAudioCaptureClient */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioCaptureClient* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IAudioCaptureClient* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IAudioCaptureClient* pThis); - - /* IAudioRenderClient */ - HRESULT (STDMETHODCALLTYPE * GetBuffer) (ma_IAudioCaptureClient* pThis, BYTE** ppData, ma_uint32* pNumFramesToRead, DWORD* pFlags, ma_uint64* pDevicePosition, ma_uint64* pQPCPosition); - HRESULT (STDMETHODCALLTYPE * ReleaseBuffer) (ma_IAudioCaptureClient* pThis, ma_uint32 numFramesRead); - HRESULT (STDMETHODCALLTYPE * GetNextPacketSize)(ma_IAudioCaptureClient* pThis, ma_uint32* pNumFramesInNextPacket); -} ma_IAudioCaptureClientVtbl; -struct ma_IAudioCaptureClient -{ - ma_IAudioCaptureClientVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IAudioCaptureClient_QueryInterface(ma_IAudioCaptureClient* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IAudioCaptureClient_AddRef(ma_IAudioCaptureClient* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IAudioCaptureClient_Release(ma_IAudioCaptureClient* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IAudioCaptureClient_GetBuffer(ma_IAudioCaptureClient* pThis, BYTE** ppData, ma_uint32* pNumFramesToRead, DWORD* pFlags, ma_uint64* pDevicePosition, ma_uint64* pQPCPosition) { return pThis->lpVtbl->GetBuffer(pThis, ppData, pNumFramesToRead, pFlags, pDevicePosition, pQPCPosition); } -static MA_INLINE HRESULT ma_IAudioCaptureClient_ReleaseBuffer(ma_IAudioCaptureClient* pThis, ma_uint32 numFramesRead) { return pThis->lpVtbl->ReleaseBuffer(pThis, numFramesRead); } -static MA_INLINE HRESULT ma_IAudioCaptureClient_GetNextPacketSize(ma_IAudioCaptureClient* pThis, ma_uint32* pNumFramesInNextPacket) { return pThis->lpVtbl->GetNextPacketSize(pThis, pNumFramesInNextPacket); } - -#if !defined(MA_WIN32_DESKTOP) && !defined(MA_WIN32_GDK) -#include -typedef struct ma_completion_handler_uwp ma_completion_handler_uwp; - -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_completion_handler_uwp* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_completion_handler_uwp* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_completion_handler_uwp* pThis); - - /* IActivateAudioInterfaceCompletionHandler */ - HRESULT (STDMETHODCALLTYPE * ActivateCompleted)(ma_completion_handler_uwp* pThis, ma_IActivateAudioInterfaceAsyncOperation* pActivateOperation); -} ma_completion_handler_uwp_vtbl; -struct ma_completion_handler_uwp -{ - ma_completion_handler_uwp_vtbl* lpVtbl; - MA_ATOMIC(4, ma_uint32) counter; - HANDLE hEvent; -}; - -static HRESULT STDMETHODCALLTYPE ma_completion_handler_uwp_QueryInterface(ma_completion_handler_uwp* pThis, const IID* const riid, void** ppObject) -{ - /* - We need to "implement" IAgileObject which is just an indicator that's used internally by WASAPI for some multithreading management. To - "implement" this, we just make sure we return pThis when the IAgileObject is requested. - */ - if (!ma_is_guid_equal(riid, &MA_IID_IUnknown) && !ma_is_guid_equal(riid, &MA_IID_IActivateAudioInterfaceCompletionHandler) && !ma_is_guid_equal(riid, &MA_IID_IAgileObject)) { - *ppObject = NULL; - return E_NOINTERFACE; - } - - /* Getting here means the IID is IUnknown or IMMNotificationClient. */ - *ppObject = (void*)pThis; - ((ma_completion_handler_uwp_vtbl*)pThis->lpVtbl)->AddRef(pThis); - return S_OK; -} - -static ULONG STDMETHODCALLTYPE ma_completion_handler_uwp_AddRef(ma_completion_handler_uwp* pThis) -{ - return (ULONG)c89atomic_fetch_add_32(&pThis->counter, 1) + 1; -} - -static ULONG STDMETHODCALLTYPE ma_completion_handler_uwp_Release(ma_completion_handler_uwp* pThis) -{ - ma_uint32 newRefCount = c89atomic_fetch_sub_32(&pThis->counter, 1) - 1; - if (newRefCount == 0) { - return 0; /* We don't free anything here because we never allocate the object on the heap. */ - } - - return (ULONG)newRefCount; -} - -static HRESULT STDMETHODCALLTYPE ma_completion_handler_uwp_ActivateCompleted(ma_completion_handler_uwp* pThis, ma_IActivateAudioInterfaceAsyncOperation* pActivateOperation) -{ - (void)pActivateOperation; - SetEvent(pThis->hEvent); - return S_OK; -} - - -static ma_completion_handler_uwp_vtbl g_maCompletionHandlerVtblInstance = { - ma_completion_handler_uwp_QueryInterface, - ma_completion_handler_uwp_AddRef, - ma_completion_handler_uwp_Release, - ma_completion_handler_uwp_ActivateCompleted -}; - -static ma_result ma_completion_handler_uwp_init(ma_completion_handler_uwp* pHandler) -{ - MA_ASSERT(pHandler != NULL); - MA_ZERO_OBJECT(pHandler); - - pHandler->lpVtbl = &g_maCompletionHandlerVtblInstance; - pHandler->counter = 1; - pHandler->hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - if (pHandler->hEvent == NULL) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} - -static void ma_completion_handler_uwp_uninit(ma_completion_handler_uwp* pHandler) -{ - if (pHandler->hEvent != NULL) { - CloseHandle(pHandler->hEvent); - } -} - -static void ma_completion_handler_uwp_wait(ma_completion_handler_uwp* pHandler) -{ - WaitForSingleObject(pHandler->hEvent, INFINITE); -} -#endif /* !MA_WIN32_DESKTOP */ - -/* We need a virtual table for our notification client object that's used for detecting changes to the default device. */ -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) -static HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_QueryInterface(ma_IMMNotificationClient* pThis, const IID* const riid, void** ppObject) -{ - /* - We care about two interfaces - IUnknown and IMMNotificationClient. If the requested IID is something else - we just return E_NOINTERFACE. Otherwise we need to increment the reference counter and return S_OK. - */ - if (!ma_is_guid_equal(riid, &MA_IID_IUnknown) && !ma_is_guid_equal(riid, &MA_IID_IMMNotificationClient)) { - *ppObject = NULL; - return E_NOINTERFACE; - } - - /* Getting here means the IID is IUnknown or IMMNotificationClient. */ - *ppObject = (void*)pThis; - ((ma_IMMNotificationClientVtbl*)pThis->lpVtbl)->AddRef(pThis); - return S_OK; -} - -static ULONG STDMETHODCALLTYPE ma_IMMNotificationClient_AddRef(ma_IMMNotificationClient* pThis) -{ - return (ULONG)c89atomic_fetch_add_32(&pThis->counter, 1) + 1; -} - -static ULONG STDMETHODCALLTYPE ma_IMMNotificationClient_Release(ma_IMMNotificationClient* pThis) -{ - ma_uint32 newRefCount = c89atomic_fetch_sub_32(&pThis->counter, 1) - 1; - if (newRefCount == 0) { - return 0; /* We don't free anything here because we never allocate the object on the heap. */ - } - - return (ULONG)newRefCount; -} - -static HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceStateChanged(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, DWORD dwNewState) -{ - ma_bool32 isThisDevice = MA_FALSE; - ma_bool32 isCapture = MA_FALSE; - ma_bool32 isPlayback = MA_FALSE; - -#ifdef MA_DEBUG_OUTPUT - /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "IMMNotificationClient_OnDeviceStateChanged(pDeviceID=%S, dwNewState=%u)\n", (pDeviceID != NULL) ? pDeviceID : L"(NULL)", (unsigned int)dwNewState);*/ -#endif - - /* - There have been reports of a hang when a playback device is disconnected. The idea with this code is to explicitly stop the device if we detect - that the device is disabled or has been unplugged. - */ - if (pThis->pDevice->wasapi.allowCaptureAutoStreamRouting && (pThis->pDevice->type == ma_device_type_capture || pThis->pDevice->type == ma_device_type_duplex || pThis->pDevice->type == ma_device_type_loopback)) { - isCapture = MA_TRUE; - if (wcscmp(pThis->pDevice->capture.id.wasapi, pDeviceID) == 0) { - isThisDevice = MA_TRUE; - } - } - - if (pThis->pDevice->wasapi.allowPlaybackAutoStreamRouting && (pThis->pDevice->type == ma_device_type_playback || pThis->pDevice->type == ma_device_type_duplex)) { - isPlayback = MA_TRUE; - if (wcscmp(pThis->pDevice->playback.id.wasapi, pDeviceID) == 0) { - isThisDevice = MA_TRUE; - } - } - - - /* - If the device ID matches our device we need to mark our device as detached and stop it. When a - device is added in OnDeviceAdded(), we'll restart it. We only mark it as detached if the device - was started at the time of being removed. - */ - if (isThisDevice) { - if ((dwNewState & MA_MM_DEVICE_STATE_ACTIVE) == 0) { - /* - Unplugged or otherwise unavailable. Mark as detached if we were in a playing state. We'll - use this to determine whether or not we need to automatically start the device when it's - plugged back in again. - */ - if (ma_device_get_state(pThis->pDevice) == ma_device_state_started) { - if (isPlayback) { - pThis->pDevice->wasapi.isDetachedPlayback = MA_TRUE; - } - if (isCapture) { - pThis->pDevice->wasapi.isDetachedCapture = MA_TRUE; - } - - ma_device_stop(pThis->pDevice); - } - } - - if ((dwNewState & MA_MM_DEVICE_STATE_ACTIVE) != 0) { - /* The device was activated. If we were detached, we need to start it again. */ - ma_bool8 tryRestartingDevice = MA_FALSE; - - if (isPlayback) { - if (pThis->pDevice->wasapi.isDetachedPlayback) { - pThis->pDevice->wasapi.isDetachedPlayback = MA_FALSE; - ma_device_reroute__wasapi(pThis->pDevice, ma_device_type_playback); - tryRestartingDevice = MA_TRUE; - } - } - - if (isCapture) { - if (pThis->pDevice->wasapi.isDetachedCapture) { - pThis->pDevice->wasapi.isDetachedCapture = MA_FALSE; - ma_device_reroute__wasapi(pThis->pDevice, (pThis->pDevice->type == ma_device_type_loopback) ? ma_device_type_loopback : ma_device_type_capture); - tryRestartingDevice = MA_TRUE; - } - } - - if (tryRestartingDevice) { - if (pThis->pDevice->wasapi.isDetachedPlayback == MA_FALSE && pThis->pDevice->wasapi.isDetachedCapture == MA_FALSE) { - ma_device_start(pThis->pDevice); - } - } - } - } - - return S_OK; -} - -static HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceAdded(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID) -{ -#ifdef MA_DEBUG_OUTPUT - /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "IMMNotificationClient_OnDeviceAdded(pDeviceID=%S)\n", (pDeviceID != NULL) ? pDeviceID : L"(NULL)");*/ -#endif - - /* We don't need to worry about this event for our purposes. */ - (void)pThis; - (void)pDeviceID; - return S_OK; -} - -static HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceRemoved(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID) -{ -#ifdef MA_DEBUG_OUTPUT - /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "IMMNotificationClient_OnDeviceRemoved(pDeviceID=%S)\n", (pDeviceID != NULL) ? pDeviceID : L"(NULL)");*/ -#endif - - /* We don't need to worry about this event for our purposes. */ - (void)pThis; - (void)pDeviceID; - return S_OK; -} - -static HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDefaultDeviceChanged(ma_IMMNotificationClient* pThis, ma_EDataFlow dataFlow, ma_ERole role, LPCWSTR pDefaultDeviceID) -{ -#ifdef MA_DEBUG_OUTPUT - /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "IMMNotificationClient_OnDefaultDeviceChanged(dataFlow=%d, role=%d, pDefaultDeviceID=%S)\n", dataFlow, role, (pDefaultDeviceID != NULL) ? pDefaultDeviceID : L"(NULL)");*/ -#endif - - /* We only ever use the eConsole role in miniaudio. */ - if (role != ma_eConsole) { - ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "[WASAPI] Stream rerouting: role != eConsole\n"); - return S_OK; - } - - /* We only care about devices with the same data flow and role as the current device. */ - if ((pThis->pDevice->type == ma_device_type_playback && dataFlow != ma_eRender) || - (pThis->pDevice->type == ma_device_type_capture && dataFlow != ma_eCapture)) { - ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "[WASAPI] Stream rerouting abandoned because dataFlow does match device type.\n"); - return S_OK; - } - - /* Don't do automatic stream routing if we're not allowed. */ - if ((dataFlow == ma_eRender && pThis->pDevice->wasapi.allowPlaybackAutoStreamRouting == MA_FALSE) || - (dataFlow == ma_eCapture && pThis->pDevice->wasapi.allowCaptureAutoStreamRouting == MA_FALSE)) { - ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "[WASAPI] Stream rerouting abandoned because automatic stream routing has been disabled by the device config.\n"); - return S_OK; - } - - /* - Not currently supporting automatic stream routing in exclusive mode. This is not working correctly on my machine due to - AUDCLNT_E_DEVICE_IN_USE errors when reinitializing the device. If this is a bug in miniaudio, we can try re-enabling this once - it's fixed. - */ - if ((dataFlow == ma_eRender && pThis->pDevice->playback.shareMode == ma_share_mode_exclusive) || - (dataFlow == ma_eCapture && pThis->pDevice->capture.shareMode == ma_share_mode_exclusive)) { - ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "[WASAPI] Stream rerouting abandoned because the device shared mode is exclusive.\n"); - return S_OK; - } - - - - - /* - Second attempt at device rerouting. We're going to retrieve the device's state at the time of - the route change. We're then going to stop the device, reinitialize the device, and then start - it again if the state before stopping was ma_device_state_started. - */ - { - ma_uint32 previousState = ma_device_get_state(pThis->pDevice); - ma_bool8 restartDevice = MA_FALSE; - - if (previousState == ma_device_state_started) { - ma_device_stop(pThis->pDevice); - restartDevice = MA_TRUE; - } - - if (pDefaultDeviceID != NULL) { /* <-- The input device ID will be null if there's no other device available. */ - if (dataFlow == ma_eRender) { - ma_device_reroute__wasapi(pThis->pDevice, ma_device_type_playback); - - if (pThis->pDevice->wasapi.isDetachedPlayback) { - pThis->pDevice->wasapi.isDetachedPlayback = MA_FALSE; - - if (pThis->pDevice->type == ma_device_type_duplex && pThis->pDevice->wasapi.isDetachedCapture) { - restartDevice = MA_FALSE; /* It's a duplex device and the capture side is detached. We cannot be restarting the device just yet. */ - } else { - restartDevice = MA_TRUE; /* It's not a duplex device, or the capture side is also attached so we can go ahead and restart the device. */ - } - } - } else { - ma_device_reroute__wasapi(pThis->pDevice, (pThis->pDevice->type == ma_device_type_loopback) ? ma_device_type_loopback : ma_device_type_capture); - - if (pThis->pDevice->wasapi.isDetachedCapture) { - pThis->pDevice->wasapi.isDetachedCapture = MA_FALSE; - - if (pThis->pDevice->type == ma_device_type_duplex && pThis->pDevice->wasapi.isDetachedPlayback) { - restartDevice = MA_FALSE; /* It's a duplex device and the playback side is detached. We cannot be restarting the device just yet. */ - } else { - restartDevice = MA_TRUE; /* It's not a duplex device, or the playback side is also attached so we can go ahead and restart the device. */ - } - } - } - - if (restartDevice) { - ma_device_start(pThis->pDevice); - } - } - } - - return S_OK; -} - -static HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnPropertyValueChanged(ma_IMMNotificationClient* pThis, LPCWSTR pDeviceID, const PROPERTYKEY key) -{ -#ifdef MA_DEBUG_OUTPUT - /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, "IMMNotificationClient_OnPropertyValueChanged(pDeviceID=%S)\n", (pDeviceID != NULL) ? pDeviceID : L"(NULL)");*/ -#endif - - (void)pThis; - (void)pDeviceID; - (void)key; - return S_OK; -} - -static ma_IMMNotificationClientVtbl g_maNotificationCientVtbl = { - ma_IMMNotificationClient_QueryInterface, - ma_IMMNotificationClient_AddRef, - ma_IMMNotificationClient_Release, - ma_IMMNotificationClient_OnDeviceStateChanged, - ma_IMMNotificationClient_OnDeviceAdded, - ma_IMMNotificationClient_OnDeviceRemoved, - ma_IMMNotificationClient_OnDefaultDeviceChanged, - ma_IMMNotificationClient_OnPropertyValueChanged -}; -#endif /* MA_WIN32_DESKTOP */ - -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) -typedef ma_IMMDevice ma_WASAPIDeviceInterface; -#else -typedef ma_IUnknown ma_WASAPIDeviceInterface; -#endif - - -#define MA_CONTEXT_COMMAND_QUIT__WASAPI 1 -#define MA_CONTEXT_COMMAND_CREATE_IAUDIOCLIENT__WASAPI 2 -#define MA_CONTEXT_COMMAND_RELEASE_IAUDIOCLIENT__WASAPI 3 - -static ma_context_command__wasapi ma_context_init_command__wasapi(int code) -{ - ma_context_command__wasapi cmd; - - MA_ZERO_OBJECT(&cmd); - cmd.code = code; - - return cmd; -} - -static ma_result ma_context_post_command__wasapi(ma_context* pContext, const ma_context_command__wasapi* pCmd) -{ - /* For now we are doing everything synchronously, but I might relax this later if the need arises. */ - ma_result result; - ma_bool32 isUsingLocalEvent = MA_FALSE; - ma_event localEvent; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pCmd != NULL); - - if (pCmd->pEvent == NULL) { - isUsingLocalEvent = MA_TRUE; - - result = ma_event_init(&localEvent); - if (result != MA_SUCCESS) { - return result; /* Failed to create the event for this command. */ - } - } - - /* Here is where we add the command to the list. If there's not enough room we'll spin until there is. */ - ma_mutex_lock(&pContext->wasapi.commandLock); - { - ma_uint32 index; - - /* Spin until we've got some space available. */ - while (pContext->wasapi.commandCount == ma_countof(pContext->wasapi.commands)) { - ma_yield(); - } - - /* Space is now available. Can safely add to the list. */ - index = (pContext->wasapi.commandIndex + pContext->wasapi.commandCount) % ma_countof(pContext->wasapi.commands); - pContext->wasapi.commands[index] = *pCmd; - pContext->wasapi.commands[index].pEvent = &localEvent; - pContext->wasapi.commandCount += 1; - - /* Now that the command has been added, release the semaphore so ma_context_next_command__wasapi() can return. */ - ma_semaphore_release(&pContext->wasapi.commandSem); - } - ma_mutex_unlock(&pContext->wasapi.commandLock); - - if (isUsingLocalEvent) { - ma_event_wait(&localEvent); - ma_event_uninit(&localEvent); - } - - return MA_SUCCESS; -} - -static ma_result ma_context_next_command__wasapi(ma_context* pContext, ma_context_command__wasapi* pCmd) -{ - ma_result result = MA_SUCCESS; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pCmd != NULL); - - result = ma_semaphore_wait(&pContext->wasapi.commandSem); - if (result == MA_SUCCESS) { - ma_mutex_lock(&pContext->wasapi.commandLock); - { - *pCmd = pContext->wasapi.commands[pContext->wasapi.commandIndex]; - pContext->wasapi.commandIndex = (pContext->wasapi.commandIndex + 1) % ma_countof(pContext->wasapi.commands); - pContext->wasapi.commandCount -= 1; - } - ma_mutex_unlock(&pContext->wasapi.commandLock); - } - - return result; -} - -static ma_thread_result MA_THREADCALL ma_context_command_thread__wasapi(void* pUserData) -{ - ma_result result; - ma_context* pContext = (ma_context*)pUserData; - MA_ASSERT(pContext != NULL); - - for (;;) { - ma_context_command__wasapi cmd; - result = ma_context_next_command__wasapi(pContext, &cmd); - if (result != MA_SUCCESS) { - break; - } - - switch (cmd.code) - { - case MA_CONTEXT_COMMAND_QUIT__WASAPI: - { - /* Do nothing. Handled after the switch. */ - } break; - - case MA_CONTEXT_COMMAND_CREATE_IAUDIOCLIENT__WASAPI: - { - if (cmd.data.createAudioClient.deviceType == ma_device_type_playback) { - *cmd.data.createAudioClient.pResult = ma_result_from_HRESULT(ma_IAudioClient_GetService((ma_IAudioClient*)cmd.data.createAudioClient.pAudioClient, &MA_IID_IAudioRenderClient, cmd.data.createAudioClient.ppAudioClientService)); - } else { - *cmd.data.createAudioClient.pResult = ma_result_from_HRESULT(ma_IAudioClient_GetService((ma_IAudioClient*)cmd.data.createAudioClient.pAudioClient, &MA_IID_IAudioCaptureClient, cmd.data.createAudioClient.ppAudioClientService)); - } - } break; - - case MA_CONTEXT_COMMAND_RELEASE_IAUDIOCLIENT__WASAPI: - { - if (cmd.data.releaseAudioClient.deviceType == ma_device_type_playback) { - if (cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientPlayback != NULL) { - ma_IAudioClient_Release((ma_IAudioClient*)cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientPlayback); - cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientPlayback = NULL; - } - } - - if (cmd.data.releaseAudioClient.deviceType == ma_device_type_capture) { - if (cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientCapture != NULL) { - ma_IAudioClient_Release((ma_IAudioClient*)cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientCapture); - cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientCapture = NULL; - } - } - } break; - - default: - { - /* Unknown command. Ignore it, but trigger an assert in debug mode so we're aware of it. */ - MA_ASSERT(MA_FALSE); - } break; - } - - if (cmd.pEvent != NULL) { - ma_event_signal(cmd.pEvent); - } - - if (cmd.code == MA_CONTEXT_COMMAND_QUIT__WASAPI) { - break; /* Received a quit message. Get out of here. */ - } - } - - return (ma_thread_result)0; -} - -static ma_result ma_device_create_IAudioClient_service__wasapi(ma_context* pContext, ma_device_type deviceType, ma_IAudioClient* pAudioClient, void** ppAudioClientService) -{ - ma_result result; - ma_result cmdResult; - ma_context_command__wasapi cmd = ma_context_init_command__wasapi(MA_CONTEXT_COMMAND_CREATE_IAUDIOCLIENT__WASAPI); - cmd.data.createAudioClient.deviceType = deviceType; - cmd.data.createAudioClient.pAudioClient = (void*)pAudioClient; - cmd.data.createAudioClient.ppAudioClientService = ppAudioClientService; - cmd.data.createAudioClient.pResult = &cmdResult; /* Declared locally, but won't be dereferenced after this function returns since execution of the command will wait here. */ - - result = ma_context_post_command__wasapi(pContext, &cmd); /* This will not return until the command has actually been run. */ - if (result != MA_SUCCESS) { - return result; - } - - return *cmd.data.createAudioClient.pResult; -} - -#if 0 /* Not used at the moment, but leaving here for future use. */ -static ma_result ma_device_release_IAudioClient_service__wasapi(ma_device* pDevice, ma_device_type deviceType) -{ - ma_result result; - ma_context_command__wasapi cmd = ma_context_init_command__wasapi(MA_CONTEXT_COMMAND_RELEASE_IAUDIOCLIENT__WASAPI); - cmd.data.releaseAudioClient.pDevice = pDevice; - cmd.data.releaseAudioClient.deviceType = deviceType; - - result = ma_context_post_command__wasapi(pDevice->pContext, &cmd); /* This will not return until the command has actually been run. */ - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} -#endif - - -static void ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(const WAVEFORMATEX* pWF, ma_share_mode shareMode, ma_device_info* pInfo) -{ - MA_ASSERT(pWF != NULL); - MA_ASSERT(pInfo != NULL); - - if (pInfo->nativeDataFormatCount >= ma_countof(pInfo->nativeDataFormats)) { - return; /* Too many data formats. Need to ignore this one. Don't think this should ever happen with WASAPI. */ - } - - pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].format = ma_format_from_WAVEFORMATEX(pWF); - pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].channels = pWF->nChannels; - pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].sampleRate = pWF->nSamplesPerSec; - pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].flags = (shareMode == ma_share_mode_exclusive) ? MA_DATA_FORMAT_FLAG_EXCLUSIVE_MODE : 0; - pInfo->nativeDataFormatCount += 1; -} - -static ma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context* pContext, /*ma_IMMDevice**/void* pMMDevice, ma_IAudioClient* pAudioClient, ma_device_info* pInfo) -{ - HRESULT hr; - WAVEFORMATEX* pWF = NULL; - - MA_ASSERT(pAudioClient != NULL); - MA_ASSERT(pInfo != NULL); - - /* Shared Mode. We use GetMixFormat() here. */ - hr = ma_IAudioClient_GetMixFormat((ma_IAudioClient*)pAudioClient, (WAVEFORMATEX**)&pWF); - if (SUCCEEDED(hr)) { - ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(pWF, ma_share_mode_shared, pInfo); - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to retrieve mix format for device info retrieval."); - return ma_result_from_HRESULT(hr); - } - - /* - Exlcusive Mode. We repeatedly call IsFormatSupported() here. This is not currently supported on - UWP. Failure to retrieve the exclusive mode format is not considered an error, so from here on - out, MA_SUCCESS is guaranteed to be returned. - */ - #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - { - ma_IPropertyStore *pProperties; - - /* - The first thing to do is get the format from PKEY_AudioEngine_DeviceFormat. This should give us a channel count we assume is - correct which will simplify our searching. - */ - hr = ma_IMMDevice_OpenPropertyStore((ma_IMMDevice*)pMMDevice, STGM_READ, &pProperties); - if (SUCCEEDED(hr)) { - PROPVARIANT var; - ma_PropVariantInit(&var); - - hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_AudioEngine_DeviceFormat, &var); - if (SUCCEEDED(hr)) { - pWF = (WAVEFORMATEX*)var.blob.pBlobData; - - /* - In my testing, the format returned by PKEY_AudioEngine_DeviceFormat is suitable for exclusive mode so we check this format - first. If this fails, fall back to a search. - */ - hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pWF, NULL); - if (SUCCEEDED(hr)) { - /* The format returned by PKEY_AudioEngine_DeviceFormat is supported. */ - ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(pWF, ma_share_mode_exclusive, pInfo); - } else { - /* - The format returned by PKEY_AudioEngine_DeviceFormat is not supported, so fall back to a search. We assume the channel - count returned by MA_PKEY_AudioEngine_DeviceFormat is valid and correct. For simplicity we're only returning one format. - */ - ma_uint32 channels = pWF->nChannels; - ma_channel defaultChannelMap[MA_MAX_CHANNELS]; - WAVEFORMATEXTENSIBLE wf; - ma_bool32 found; - ma_uint32 iFormat; - - /* Make sure we don't overflow the channel map. */ - if (channels > MA_MAX_CHANNELS) { - channels = MA_MAX_CHANNELS; - } - - ma_channel_map_init_standard(ma_standard_channel_map_microsoft, defaultChannelMap, ma_countof(defaultChannelMap), channels); - - MA_ZERO_OBJECT(&wf); - wf.Format.cbSize = sizeof(wf); - wf.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - wf.Format.nChannels = (WORD)channels; - wf.dwChannelMask = ma_channel_map_to_channel_mask__win32(defaultChannelMap, channels); - - found = MA_FALSE; - for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); ++iFormat) { - ma_format format = g_maFormatPriorities[iFormat]; - ma_uint32 iSampleRate; - - wf.Format.wBitsPerSample = (WORD)(ma_get_bytes_per_sample(format)*8); - wf.Format.nBlockAlign = (WORD)(wf.Format.nChannels * wf.Format.wBitsPerSample / 8); - wf.Format.nAvgBytesPerSec = wf.Format.nBlockAlign * wf.Format.nSamplesPerSec; - wf.Samples.wValidBitsPerSample = /*(format == ma_format_s24_32) ? 24 :*/ wf.Format.wBitsPerSample; - if (format == ma_format_f32) { - wf.SubFormat = MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - } else { - wf.SubFormat = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM; - } - - for (iSampleRate = 0; iSampleRate < ma_countof(g_maStandardSampleRatePriorities); ++iSampleRate) { - wf.Format.nSamplesPerSec = g_maStandardSampleRatePriorities[iSampleRate]; - - hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, (WAVEFORMATEX*)&wf, NULL); - if (SUCCEEDED(hr)) { - ma_add_native_data_format_to_device_info_from_WAVEFORMATEX((WAVEFORMATEX*)&wf, ma_share_mode_exclusive, pInfo); - found = MA_TRUE; - break; - } - } - - if (found) { - break; - } - } - - ma_PropVariantClear(pContext, &var); - - if (!found) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "[WASAPI] Failed to find suitable device format for device info retrieval."); - } - } - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "[WASAPI] Failed to retrieve device format for device info retrieval."); - } - - ma_IPropertyStore_Release(pProperties); - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "[WASAPI] Failed to open property store for device info retrieval."); - } - } - #endif - - return MA_SUCCESS; -} - -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) -static ma_EDataFlow ma_device_type_to_EDataFlow(ma_device_type deviceType) -{ - if (deviceType == ma_device_type_playback) { - return ma_eRender; - } else if (deviceType == ma_device_type_capture) { - return ma_eCapture; - } else { - MA_ASSERT(MA_FALSE); - return ma_eRender; /* Should never hit this. */ - } -} - -static ma_result ma_context_create_IMMDeviceEnumerator__wasapi(ma_context* pContext, ma_IMMDeviceEnumerator** ppDeviceEnumerator) -{ - HRESULT hr; - ma_IMMDeviceEnumerator* pDeviceEnumerator; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppDeviceEnumerator != NULL); - - *ppDeviceEnumerator = NULL; /* Safety. */ - - hr = ma_CoCreateInstance(pContext, MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create device enumerator."); - return ma_result_from_HRESULT(hr); - } - - *ppDeviceEnumerator = pDeviceEnumerator; - - return MA_SUCCESS; -} - -static LPWSTR ma_context_get_default_device_id_from_IMMDeviceEnumerator__wasapi(ma_context* pContext, ma_IMMDeviceEnumerator* pDeviceEnumerator, ma_device_type deviceType) -{ - HRESULT hr; - ma_IMMDevice* pMMDefaultDevice = NULL; - LPWSTR pDefaultDeviceID = NULL; - ma_EDataFlow dataFlow; - ma_ERole role; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDeviceEnumerator != NULL); - - (void)pContext; - - /* Grab the EDataFlow type from the device type. */ - dataFlow = ma_device_type_to_EDataFlow(deviceType); - - /* The role is always eConsole, but we may make this configurable later. */ - role = ma_eConsole; - - hr = ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(pDeviceEnumerator, dataFlow, role, &pMMDefaultDevice); - if (FAILED(hr)) { - return NULL; - } - - hr = ma_IMMDevice_GetId(pMMDefaultDevice, &pDefaultDeviceID); - - ma_IMMDevice_Release(pMMDefaultDevice); - pMMDefaultDevice = NULL; - - if (FAILED(hr)) { - return NULL; - } - - return pDefaultDeviceID; -} - -static LPWSTR ma_context_get_default_device_id__wasapi(ma_context* pContext, ma_device_type deviceType) /* Free the returned pointer with ma_CoTaskMemFree() */ -{ - ma_result result; - ma_IMMDeviceEnumerator* pDeviceEnumerator; - LPWSTR pDefaultDeviceID = NULL; - - MA_ASSERT(pContext != NULL); - - result = ma_context_create_IMMDeviceEnumerator__wasapi(pContext, &pDeviceEnumerator); - if (result != MA_SUCCESS) { - return NULL; - } - - pDefaultDeviceID = ma_context_get_default_device_id_from_IMMDeviceEnumerator__wasapi(pContext, pDeviceEnumerator, deviceType); - - ma_IMMDeviceEnumerator_Release(pDeviceEnumerator); - return pDefaultDeviceID; -} - -static ma_result ma_context_get_MMDevice__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IMMDevice** ppMMDevice) -{ - ma_IMMDeviceEnumerator* pDeviceEnumerator; - HRESULT hr; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppMMDevice != NULL); - - hr = ma_CoCreateInstance(pContext, MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create IMMDeviceEnumerator."); - return ma_result_from_HRESULT(hr); - } - - if (pDeviceID == NULL) { - hr = ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(pDeviceEnumerator, (deviceType == ma_device_type_capture) ? ma_eCapture : ma_eRender, ma_eConsole, ppMMDevice); - } else { - hr = ma_IMMDeviceEnumerator_GetDevice(pDeviceEnumerator, pDeviceID->wasapi, ppMMDevice); - } - - ma_IMMDeviceEnumerator_Release(pDeviceEnumerator); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to retrieve IMMDevice."); - return ma_result_from_HRESULT(hr); - } - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_id_from_MMDevice__wasapi(ma_context* pContext, ma_IMMDevice* pMMDevice, ma_device_id* pDeviceID) -{ - LPWSTR pDeviceIDString; - HRESULT hr; - - MA_ASSERT(pDeviceID != NULL); - - hr = ma_IMMDevice_GetId(pMMDevice, &pDeviceIDString); - if (SUCCEEDED(hr)) { - size_t idlen = wcslen(pDeviceIDString); - if (idlen+1 > ma_countof(pDeviceID->wasapi)) { - ma_CoTaskMemFree(pContext, pDeviceIDString); - MA_ASSERT(MA_FALSE); /* NOTE: If this is triggered, please report it. It means the format of the ID must haved change and is too long to fit in our fixed sized buffer. */ - return MA_ERROR; - } - - MA_COPY_MEMORY(pDeviceID->wasapi, pDeviceIDString, idlen * sizeof(wchar_t)); - pDeviceID->wasapi[idlen] = '\0'; - - ma_CoTaskMemFree(pContext, pDeviceIDString); - - return MA_SUCCESS; - } - - return MA_ERROR; -} - -static ma_result ma_context_get_device_info_from_MMDevice__wasapi(ma_context* pContext, ma_IMMDevice* pMMDevice, LPWSTR pDefaultDeviceID, ma_bool32 onlySimpleInfo, ma_device_info* pInfo) -{ - ma_result result; - HRESULT hr; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pMMDevice != NULL); - MA_ASSERT(pInfo != NULL); - - /* ID. */ - result = ma_context_get_device_id_from_MMDevice__wasapi(pContext, pMMDevice, &pInfo->id); - if (result == MA_SUCCESS) { - if (pDefaultDeviceID != NULL) { - if (wcscmp(pInfo->id.wasapi, pDefaultDeviceID) == 0) { - pInfo->isDefault = MA_TRUE; - } - } - } - - /* Description / Friendly Name */ - { - ma_IPropertyStore *pProperties; - hr = ma_IMMDevice_OpenPropertyStore(pMMDevice, STGM_READ, &pProperties); - if (SUCCEEDED(hr)) { - PROPVARIANT var; - - ma_PropVariantInit(&var); - hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_Device_FriendlyName, &var); - if (SUCCEEDED(hr)) { - WideCharToMultiByte(CP_UTF8, 0, var.pwszVal, -1, pInfo->name, sizeof(pInfo->name), 0, FALSE); - ma_PropVariantClear(pContext, &var); - } - - ma_IPropertyStore_Release(pProperties); - } - } - - /* Format */ - if (!onlySimpleInfo) { - ma_IAudioClient* pAudioClient; - hr = ma_IMMDevice_Activate(pMMDevice, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pAudioClient); - if (SUCCEEDED(hr)) { - result = ma_context_get_device_info_from_IAudioClient__wasapi(pContext, pMMDevice, pAudioClient, pInfo); - - ma_IAudioClient_Release(pAudioClient); - return result; - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to activate audio client for device info retrieval."); - return ma_result_from_HRESULT(hr); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_context_enumerate_devices_by_type__wasapi(ma_context* pContext, ma_IMMDeviceEnumerator* pDeviceEnumerator, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_result result = MA_SUCCESS; - UINT deviceCount; - HRESULT hr; - ma_uint32 iDevice; - LPWSTR pDefaultDeviceID = NULL; - ma_IMMDeviceCollection* pDeviceCollection = NULL; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* Grab the default device. We use this to know whether or not flag the returned device info as being the default. */ - pDefaultDeviceID = ma_context_get_default_device_id_from_IMMDeviceEnumerator__wasapi(pContext, pDeviceEnumerator, deviceType); - - /* We need to enumerate the devices which returns a device collection. */ - hr = ma_IMMDeviceEnumerator_EnumAudioEndpoints(pDeviceEnumerator, ma_device_type_to_EDataFlow(deviceType), MA_MM_DEVICE_STATE_ACTIVE, &pDeviceCollection); - if (SUCCEEDED(hr)) { - hr = ma_IMMDeviceCollection_GetCount(pDeviceCollection, &deviceCount); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to get device count."); - result = ma_result_from_HRESULT(hr); - goto done; - } - - for (iDevice = 0; iDevice < deviceCount; ++iDevice) { - ma_device_info deviceInfo; - ma_IMMDevice* pMMDevice; - - MA_ZERO_OBJECT(&deviceInfo); - - hr = ma_IMMDeviceCollection_Item(pDeviceCollection, iDevice, &pMMDevice); - if (SUCCEEDED(hr)) { - result = ma_context_get_device_info_from_MMDevice__wasapi(pContext, pMMDevice, pDefaultDeviceID, MA_TRUE, &deviceInfo); /* MA_TRUE = onlySimpleInfo. */ - - ma_IMMDevice_Release(pMMDevice); - if (result == MA_SUCCESS) { - ma_bool32 cbResult = callback(pContext, deviceType, &deviceInfo, pUserData); - if (cbResult == MA_FALSE) { - break; - } - } - } - } - } - -done: - if (pDefaultDeviceID != NULL) { - ma_CoTaskMemFree(pContext, pDefaultDeviceID); - pDefaultDeviceID = NULL; - } - - if (pDeviceCollection != NULL) { - ma_IMMDeviceCollection_Release(pDeviceCollection); - pDeviceCollection = NULL; - } - - return result; -} - -static ma_result ma_context_get_IAudioClient_Desktop__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IAudioClient** ppAudioClient, ma_IMMDevice** ppMMDevice) -{ - ma_result result; - HRESULT hr; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppAudioClient != NULL); - MA_ASSERT(ppMMDevice != NULL); - - result = ma_context_get_MMDevice__wasapi(pContext, deviceType, pDeviceID, ppMMDevice); - if (result != MA_SUCCESS) { - return result; - } - - hr = ma_IMMDevice_Activate(*ppMMDevice, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)ppAudioClient); - if (FAILED(hr)) { - return ma_result_from_HRESULT(hr); - } - - return MA_SUCCESS; -} -#else -static ma_result ma_context_get_IAudioClient_UWP__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IAudioClient** ppAudioClient, ma_IUnknown** ppActivatedInterface) -{ - ma_IActivateAudioInterfaceAsyncOperation *pAsyncOp = NULL; - ma_completion_handler_uwp completionHandler; - IID iid; - LPOLESTR iidStr; - HRESULT hr; - ma_result result; - HRESULT activateResult; - ma_IUnknown* pActivatedInterface; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppAudioClient != NULL); - - if (pDeviceID != NULL) { - MA_COPY_MEMORY(&iid, pDeviceID->wasapi, sizeof(iid)); - } else { - if (deviceType == ma_device_type_playback) { - iid = MA_IID_DEVINTERFACE_AUDIO_RENDER; - } else { - iid = MA_IID_DEVINTERFACE_AUDIO_CAPTURE; - } - } - -#if defined(__cplusplus) - hr = StringFromIID(iid, &iidStr); -#else - hr = StringFromIID(&iid, &iidStr); -#endif - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to convert device IID to string for ActivateAudioInterfaceAsync(). Out of memory."); - return ma_result_from_HRESULT(hr); - } - - result = ma_completion_handler_uwp_init(&completionHandler); - if (result != MA_SUCCESS) { - ma_CoTaskMemFree(pContext, iidStr); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create event for waiting for ActivateAudioInterfaceAsync()."); - return result; - } - -#if defined(__cplusplus) - hr = ActivateAudioInterfaceAsync(iidStr, MA_IID_IAudioClient, NULL, (IActivateAudioInterfaceCompletionHandler*)&completionHandler, (IActivateAudioInterfaceAsyncOperation**)&pAsyncOp); -#else - hr = ActivateAudioInterfaceAsync(iidStr, &MA_IID_IAudioClient, NULL, (IActivateAudioInterfaceCompletionHandler*)&completionHandler, (IActivateAudioInterfaceAsyncOperation**)&pAsyncOp); -#endif - if (FAILED(hr)) { - ma_completion_handler_uwp_uninit(&completionHandler); - ma_CoTaskMemFree(pContext, iidStr); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] ActivateAudioInterfaceAsync() failed."); - return ma_result_from_HRESULT(hr); - } - - ma_CoTaskMemFree(pContext, iidStr); - - /* Wait for the async operation for finish. */ - ma_completion_handler_uwp_wait(&completionHandler); - ma_completion_handler_uwp_uninit(&completionHandler); - - hr = ma_IActivateAudioInterfaceAsyncOperation_GetActivateResult(pAsyncOp, &activateResult, &pActivatedInterface); - ma_IActivateAudioInterfaceAsyncOperation_Release(pAsyncOp); - - if (FAILED(hr) || FAILED(activateResult)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to activate device."); - return FAILED(hr) ? ma_result_from_HRESULT(hr) : ma_result_from_HRESULT(activateResult); - } - - /* Here is where we grab the IAudioClient interface. */ - hr = ma_IUnknown_QueryInterface(pActivatedInterface, &MA_IID_IAudioClient, (void**)ppAudioClient); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to query IAudioClient interface."); - return ma_result_from_HRESULT(hr); - } - - if (ppActivatedInterface) { - *ppActivatedInterface = pActivatedInterface; - } else { - ma_IUnknown_Release(pActivatedInterface); - } - - return MA_SUCCESS; -} -#endif - -static ma_result ma_context_get_IAudioClient__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IAudioClient** ppAudioClient, ma_WASAPIDeviceInterface** ppDeviceInterface) -{ -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - return ma_context_get_IAudioClient_Desktop__wasapi(pContext, deviceType, pDeviceID, ppAudioClient, ppDeviceInterface); -#else - return ma_context_get_IAudioClient_UWP__wasapi(pContext, deviceType, pDeviceID, ppAudioClient, ppDeviceInterface); -#endif -} - - -static ma_result ma_context_enumerate_devices__wasapi(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - /* Different enumeration for desktop and UWP. */ -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - /* Desktop */ - HRESULT hr; - ma_IMMDeviceEnumerator* pDeviceEnumerator; - - hr = ma_CoCreateInstance(pContext, MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create device enumerator."); - return ma_result_from_HRESULT(hr); - } - - ma_context_enumerate_devices_by_type__wasapi(pContext, pDeviceEnumerator, ma_device_type_playback, callback, pUserData); - ma_context_enumerate_devices_by_type__wasapi(pContext, pDeviceEnumerator, ma_device_type_capture, callback, pUserData); - - ma_IMMDeviceEnumerator_Release(pDeviceEnumerator); -#else - /* - UWP - - The MMDevice API is only supported on desktop applications. For now, while I'm still figuring out how to properly enumerate - over devices without using MMDevice, I'm restricting devices to defaults. - - Hint: DeviceInformation::FindAllAsync() with DeviceClass.AudioCapture/AudioRender. https://blogs.windows.com/buildingapps/2014/05/15/real-time-audio-in-windows-store-and-windows-phone-apps/ - */ - if (callback) { - ma_bool32 cbResult = MA_TRUE; - - /* Playback. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - deviceInfo.isDefault = MA_TRUE; - cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - - /* Capture. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - deviceInfo.isDefault = MA_TRUE; - cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - } -#endif - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - ma_result result; - ma_IMMDevice* pMMDevice = NULL; - LPWSTR pDefaultDeviceID = NULL; - - result = ma_context_get_MMDevice__wasapi(pContext, deviceType, pDeviceID, &pMMDevice); - if (result != MA_SUCCESS) { - return result; - } - - /* We need the default device ID so we can set the isDefault flag in the device info. */ - pDefaultDeviceID = ma_context_get_default_device_id__wasapi(pContext, deviceType); - - result = ma_context_get_device_info_from_MMDevice__wasapi(pContext, pMMDevice, pDefaultDeviceID, MA_FALSE, pDeviceInfo); /* MA_FALSE = !onlySimpleInfo. */ - - if (pDefaultDeviceID != NULL) { - ma_CoTaskMemFree(pContext, pDefaultDeviceID); - pDefaultDeviceID = NULL; - } - - ma_IMMDevice_Release(pMMDevice); - - return result; -#else - ma_IAudioClient* pAudioClient; - ma_result result; - - /* UWP currently only uses default devices. */ - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - - result = ma_context_get_IAudioClient_UWP__wasapi(pContext, deviceType, pDeviceID, &pAudioClient, NULL); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_context_get_device_info_from_IAudioClient__wasapi(pContext, NULL, pAudioClient, pDeviceInfo); - - pDeviceInfo->isDefault = MA_TRUE; /* UWP only supports default devices. */ - - ma_IAudioClient_Release(pAudioClient); - return result; -#endif -} - -static ma_result ma_device_uninit__wasapi(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - if (pDevice->wasapi.pDeviceEnumerator) { - ((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator)->lpVtbl->UnregisterEndpointNotificationCallback((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator, &pDevice->wasapi.notificationClient); - ma_IMMDeviceEnumerator_Release((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator); - } -#endif - - if (pDevice->wasapi.pRenderClient) { - if (pDevice->wasapi.pMappedBufferPlayback != NULL) { - ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, pDevice->wasapi.mappedBufferPlaybackCap, 0); - pDevice->wasapi.pMappedBufferPlayback = NULL; - pDevice->wasapi.mappedBufferPlaybackCap = 0; - pDevice->wasapi.mappedBufferPlaybackLen = 0; - } - - ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient); - } - if (pDevice->wasapi.pCaptureClient) { - if (pDevice->wasapi.pMappedBufferCapture != NULL) { - ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap); - pDevice->wasapi.pMappedBufferCapture = NULL; - pDevice->wasapi.mappedBufferCaptureCap = 0; - pDevice->wasapi.mappedBufferCaptureLen = 0; - } - - ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient); - } - - if (pDevice->wasapi.pAudioClientPlayback) { - ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback); - } - if (pDevice->wasapi.pAudioClientCapture) { - ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture); - } - - if (pDevice->wasapi.hEventPlayback) { - CloseHandle(pDevice->wasapi.hEventPlayback); - } - if (pDevice->wasapi.hEventCapture) { - CloseHandle(pDevice->wasapi.hEventCapture); - } - - return MA_SUCCESS; -} - - -typedef struct -{ - /* Input. */ - ma_format formatIn; - ma_uint32 channelsIn; - ma_uint32 sampleRateIn; - ma_channel channelMapIn[MA_MAX_CHANNELS]; - ma_uint32 periodSizeInFramesIn; - ma_uint32 periodSizeInMillisecondsIn; - ma_uint32 periodsIn; - ma_share_mode shareMode; - ma_performance_profile performanceProfile; - ma_bool32 noAutoConvertSRC; - ma_bool32 noDefaultQualitySRC; - ma_bool32 noHardwareOffloading; - - /* Output. */ - ma_IAudioClient* pAudioClient; - ma_IAudioRenderClient* pRenderClient; - ma_IAudioCaptureClient* pCaptureClient; - ma_format formatOut; - ma_uint32 channelsOut; - ma_uint32 sampleRateOut; - ma_channel channelMapOut[MA_MAX_CHANNELS]; - ma_uint32 periodSizeInFramesOut; - ma_uint32 periodsOut; - ma_bool32 usingAudioClient3; - char deviceName[256]; - ma_device_id id; -} ma_device_init_internal_data__wasapi; - -static ma_result ma_device_init_internal__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_init_internal_data__wasapi* pData) -{ - HRESULT hr; - ma_result result = MA_SUCCESS; - const char* errorMsg = ""; - MA_AUDCLNT_SHAREMODE shareMode = MA_AUDCLNT_SHAREMODE_SHARED; - DWORD streamFlags = 0; - MA_REFERENCE_TIME periodDurationInMicroseconds; - ma_bool32 wasInitializedUsingIAudioClient3 = MA_FALSE; - WAVEFORMATEXTENSIBLE wf; - ma_WASAPIDeviceInterface* pDeviceInterface = NULL; - ma_IAudioClient2* pAudioClient2; - ma_uint32 nativeSampleRate; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pData != NULL); - - /* This function is only used to initialize one device type: either playback, capture or loopback. Never full-duplex. */ - if (deviceType == ma_device_type_duplex) { - return MA_INVALID_ARGS; - } - - pData->pAudioClient = NULL; - pData->pRenderClient = NULL; - pData->pCaptureClient = NULL; - - streamFlags = MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK; - if (!pData->noAutoConvertSRC && pData->sampleRateIn != 0 && pData->shareMode != ma_share_mode_exclusive) { /* <-- Exclusive streams must use the native sample rate. */ - streamFlags |= MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM; - } - if (!pData->noDefaultQualitySRC && pData->sampleRateIn != 0 && (streamFlags & MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM) != 0) { - streamFlags |= MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY; - } - if (deviceType == ma_device_type_loopback) { - streamFlags |= MA_AUDCLNT_STREAMFLAGS_LOOPBACK; - } - - result = ma_context_get_IAudioClient__wasapi(pContext, deviceType, pDeviceID, &pData->pAudioClient, &pDeviceInterface); - if (result != MA_SUCCESS) { - goto done; - } - - MA_ZERO_OBJECT(&wf); - - /* Try enabling hardware offloading. */ - if (!pData->noHardwareOffloading) { - hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient2, (void**)&pAudioClient2); - if (SUCCEEDED(hr)) { - BOOL isHardwareOffloadingSupported = 0; - hr = ma_IAudioClient2_IsOffloadCapable(pAudioClient2, MA_AudioCategory_Other, &isHardwareOffloadingSupported); - if (SUCCEEDED(hr) && isHardwareOffloadingSupported) { - ma_AudioClientProperties clientProperties; - MA_ZERO_OBJECT(&clientProperties); - clientProperties.cbSize = sizeof(clientProperties); - clientProperties.bIsOffload = 1; - clientProperties.eCategory = MA_AudioCategory_Other; - ma_IAudioClient2_SetClientProperties(pAudioClient2, &clientProperties); - } - - pAudioClient2->lpVtbl->Release(pAudioClient2); - } - } - - /* Here is where we try to determine the best format to use with the device. If the client if wanting exclusive mode, first try finding the best format for that. If this fails, fall back to shared mode. */ - result = MA_FORMAT_NOT_SUPPORTED; - if (pData->shareMode == ma_share_mode_exclusive) { - #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - /* In exclusive mode on desktop we always use the backend's native format. */ - ma_IPropertyStore* pStore = NULL; - hr = ma_IMMDevice_OpenPropertyStore(pDeviceInterface, STGM_READ, &pStore); - if (SUCCEEDED(hr)) { - PROPVARIANT prop; - ma_PropVariantInit(&prop); - hr = ma_IPropertyStore_GetValue(pStore, &MA_PKEY_AudioEngine_DeviceFormat, &prop); - if (SUCCEEDED(hr)) { - WAVEFORMATEX* pActualFormat = (WAVEFORMATEX*)prop.blob.pBlobData; - hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pData->pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pActualFormat, NULL); - if (SUCCEEDED(hr)) { - MA_COPY_MEMORY(&wf, pActualFormat, sizeof(WAVEFORMATEXTENSIBLE)); - } - - ma_PropVariantClear(pContext, &prop); - } - - ma_IPropertyStore_Release(pStore); - } - #else - /* - I do not know how to query the device's native format on UWP so for now I'm just disabling support for - exclusive mode. The alternative is to enumerate over different formats and check IsFormatSupported() - until you find one that works. - - TODO: Add support for exclusive mode to UWP. - */ - hr = S_FALSE; - #endif - - if (hr == S_OK) { - shareMode = MA_AUDCLNT_SHAREMODE_EXCLUSIVE; - result = MA_SUCCESS; - } else { - result = MA_SHARE_MODE_NOT_SUPPORTED; - } - } else { - /* In shared mode we are always using the format reported by the operating system. */ - WAVEFORMATEXTENSIBLE* pNativeFormat = NULL; - hr = ma_IAudioClient_GetMixFormat((ma_IAudioClient*)pData->pAudioClient, (WAVEFORMATEX**)&pNativeFormat); - if (hr != S_OK) { - result = MA_FORMAT_NOT_SUPPORTED; - } else { - MA_COPY_MEMORY(&wf, pNativeFormat, sizeof(wf)); - result = MA_SUCCESS; - } - - ma_CoTaskMemFree(pContext, pNativeFormat); - - shareMode = MA_AUDCLNT_SHAREMODE_SHARED; - } - - /* Return an error if we still haven't found a format. */ - if (result != MA_SUCCESS) { - errorMsg = "[WASAPI] Failed to find best device mix format."; - goto done; - } - - /* - Override the native sample rate with the one requested by the caller, but only if we're not using the default sample rate. We'll use - WASAPI to perform the sample rate conversion. - */ - nativeSampleRate = wf.Format.nSamplesPerSec; - if (streamFlags & MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM) { - wf.Format.nSamplesPerSec = (pData->sampleRateIn != 0) ? pData->sampleRateIn : MA_DEFAULT_SAMPLE_RATE; - wf.Format.nAvgBytesPerSec = wf.Format.nSamplesPerSec * wf.Format.nBlockAlign; - } - - pData->formatOut = ma_format_from_WAVEFORMATEX((WAVEFORMATEX*)&wf); - if (pData->formatOut == ma_format_unknown) { - /* - The format isn't supported. This is almost certainly because the exclusive mode format isn't supported by miniaudio. We need to return MA_SHARE_MODE_NOT_SUPPORTED - in this case so that the caller can detect it and fall back to shared mode if desired. We should never get here if shared mode was requested, but just for - completeness we'll check for it and return MA_FORMAT_NOT_SUPPORTED. - */ - if (shareMode == MA_AUDCLNT_SHAREMODE_EXCLUSIVE) { - result = MA_SHARE_MODE_NOT_SUPPORTED; - } else { - result = MA_FORMAT_NOT_SUPPORTED; - } - - errorMsg = "[WASAPI] Native format not supported."; - goto done; - } - - pData->channelsOut = wf.Format.nChannels; - pData->sampleRateOut = wf.Format.nSamplesPerSec; - - /* Get the internal channel map based on the channel mask. */ - ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pData->channelsOut, pData->channelMapOut); - - /* Period size. */ - pData->periodsOut = (pData->periodsIn != 0) ? pData->periodsIn : MA_DEFAULT_PERIODS; - pData->periodSizeInFramesOut = pData->periodSizeInFramesIn; - if (pData->periodSizeInFramesOut == 0) { - if (pData->periodSizeInMillisecondsIn == 0) { - if (pData->performanceProfile == ma_performance_profile_low_latency) { - pData->periodSizeInFramesOut = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY, wf.Format.nSamplesPerSec); - } else { - pData->periodSizeInFramesOut = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE, wf.Format.nSamplesPerSec); - } - } else { - pData->periodSizeInFramesOut = ma_calculate_buffer_size_in_frames_from_milliseconds(pData->periodSizeInMillisecondsIn, wf.Format.nSamplesPerSec); - } - } - - periodDurationInMicroseconds = ((ma_uint64)pData->periodSizeInFramesOut * 1000 * 1000) / wf.Format.nSamplesPerSec; - - - /* Slightly different initialization for shared and exclusive modes. We try exclusive mode first, and if it fails, fall back to shared mode. */ - if (shareMode == MA_AUDCLNT_SHAREMODE_EXCLUSIVE) { - MA_REFERENCE_TIME bufferDuration = periodDurationInMicroseconds * pData->periodsOut * 10; - - /* - If the periodicy is too small, Initialize() will fail with AUDCLNT_E_INVALID_DEVICE_PERIOD. In this case we should just keep increasing - it and trying it again. - */ - hr = E_FAIL; - for (;;) { - hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, streamFlags, bufferDuration, bufferDuration, (WAVEFORMATEX*)&wf, NULL); - if (hr == MA_AUDCLNT_E_INVALID_DEVICE_PERIOD) { - if (bufferDuration > 500*10000) { - break; - } else { - if (bufferDuration == 0) { /* <-- Just a sanity check to prevent an infinit loop. Should never happen, but it makes me feel better. */ - break; - } - - bufferDuration = bufferDuration * 2; - continue; - } - } else { - break; - } - } - - if (hr == MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) { - ma_uint32 bufferSizeInFrames; - hr = ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pData->pAudioClient, &bufferSizeInFrames); - if (SUCCEEDED(hr)) { - bufferDuration = (MA_REFERENCE_TIME)((10000.0 * 1000 / wf.Format.nSamplesPerSec * bufferSizeInFrames) + 0.5); - - /* Unfortunately we need to release and re-acquire the audio client according to MSDN. Seems silly - why not just call IAudioClient_Initialize() again?! */ - ma_IAudioClient_Release((ma_IAudioClient*)pData->pAudioClient); - - #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - hr = ma_IMMDevice_Activate(pDeviceInterface, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pData->pAudioClient); - #else - hr = ma_IUnknown_QueryInterface(pDeviceInterface, &MA_IID_IAudioClient, (void**)&pData->pAudioClient); - #endif - - if (SUCCEEDED(hr)) { - hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, streamFlags, bufferDuration, bufferDuration, (WAVEFORMATEX*)&wf, NULL); - } - } - } - - if (FAILED(hr)) { - /* Failed to initialize in exclusive mode. Don't fall back to shared mode - instead tell the client about it. They can reinitialize in shared mode if they want. */ - if (hr == E_ACCESSDENIED) { - errorMsg = "[WASAPI] Failed to initialize device in exclusive mode. Access denied.", result = MA_ACCESS_DENIED; - } else if (hr == MA_AUDCLNT_E_DEVICE_IN_USE) { - errorMsg = "[WASAPI] Failed to initialize device in exclusive mode. Device in use.", result = MA_BUSY; - } else { - errorMsg = "[WASAPI] Failed to initialize device in exclusive mode."; result = ma_result_from_HRESULT(hr); - } - goto done; - } - } - - if (shareMode == MA_AUDCLNT_SHAREMODE_SHARED) { - /* - Low latency shared mode via IAudioClient3. - - NOTE - ==== - Contrary to the documentation on MSDN (https://docs.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudioclient3-initializesharedaudiostream), the - use of AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM and AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY with IAudioClient3_InitializeSharedAudioStream() absolutely does not work. Using - any of these flags will result in HRESULT code 0x88890021. The other problem is that calling IAudioClient3_GetSharedModeEnginePeriod() with a sample rate different to - that returned by IAudioClient_GetMixFormat() also results in an error. I'm therefore disabling low-latency shared mode with AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM. - */ - #ifndef MA_WASAPI_NO_LOW_LATENCY_SHARED_MODE - { - if ((streamFlags & MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM) == 0 || nativeSampleRate == wf.Format.nSamplesPerSec) { - ma_IAudioClient3* pAudioClient3 = NULL; - hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient3, (void**)&pAudioClient3); - if (SUCCEEDED(hr)) { - ma_uint32 defaultPeriodInFrames; - ma_uint32 fundamentalPeriodInFrames; - ma_uint32 minPeriodInFrames; - ma_uint32 maxPeriodInFrames; - hr = ma_IAudioClient3_GetSharedModeEnginePeriod(pAudioClient3, (WAVEFORMATEX*)&wf, &defaultPeriodInFrames, &fundamentalPeriodInFrames, &minPeriodInFrames, &maxPeriodInFrames); - if (SUCCEEDED(hr)) { - ma_uint32 desiredPeriodInFrames = pData->periodSizeInFramesOut; - ma_uint32 actualPeriodInFrames = desiredPeriodInFrames; - - /* Make sure the period size is a multiple of fundamentalPeriodInFrames. */ - actualPeriodInFrames = actualPeriodInFrames / fundamentalPeriodInFrames; - actualPeriodInFrames = actualPeriodInFrames * fundamentalPeriodInFrames; - - /* The period needs to be clamped between minPeriodInFrames and maxPeriodInFrames. */ - actualPeriodInFrames = ma_clamp(actualPeriodInFrames, minPeriodInFrames, maxPeriodInFrames); - - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "[WASAPI] Trying IAudioClient3_InitializeSharedAudioStream(actualPeriodInFrames=%d)\n", actualPeriodInFrames); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " defaultPeriodInFrames=%d\n", defaultPeriodInFrames); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " fundamentalPeriodInFrames=%d\n", fundamentalPeriodInFrames); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " minPeriodInFrames=%d\n", minPeriodInFrames); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " maxPeriodInFrames=%d\n", maxPeriodInFrames); - - /* If the client requested a largish buffer than we don't actually want to use low latency shared mode because it forces small buffers. */ - if (actualPeriodInFrames >= desiredPeriodInFrames) { - /* - MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY must not be in the stream flags. If either of these are specified, - IAudioClient3_InitializeSharedAudioStream() will fail. - */ - hr = ma_IAudioClient3_InitializeSharedAudioStream(pAudioClient3, streamFlags & ~(MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY), actualPeriodInFrames, (WAVEFORMATEX*)&wf, NULL); - if (SUCCEEDED(hr)) { - wasInitializedUsingIAudioClient3 = MA_TRUE; - pData->periodSizeInFramesOut = actualPeriodInFrames; - - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "[WASAPI] Using IAudioClient3\n"); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " periodSizeInFramesOut=%d\n", pData->periodSizeInFramesOut); - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "[WASAPI] IAudioClient3_InitializeSharedAudioStream failed. Falling back to IAudioClient.\n"); - } - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "[WASAPI] Not using IAudioClient3 because the desired period size is larger than the maximum supported by IAudioClient3.\n"); - } - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "[WASAPI] IAudioClient3_GetSharedModeEnginePeriod failed. Falling back to IAudioClient.\n"); - } - - ma_IAudioClient3_Release(pAudioClient3); - pAudioClient3 = NULL; - } - } - } - #else - { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "[WASAPI] Not using IAudioClient3 because MA_WASAPI_NO_LOW_LATENCY_SHARED_MODE is enabled.\n"); - } - #endif - - /* If we don't have an IAudioClient3 then we need to use the normal initialization routine. */ - if (!wasInitializedUsingIAudioClient3) { - MA_REFERENCE_TIME bufferDuration = periodDurationInMicroseconds * pData->periodsOut * 10; /* <-- Multiply by 10 for microseconds to 100-nanoseconds. */ - hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, streamFlags, bufferDuration, 0, (WAVEFORMATEX*)&wf, NULL); - if (FAILED(hr)) { - if (hr == E_ACCESSDENIED) { - errorMsg = "[WASAPI] Failed to initialize device. Access denied.", result = MA_ACCESS_DENIED; - } else if (hr == MA_AUDCLNT_E_DEVICE_IN_USE) { - errorMsg = "[WASAPI] Failed to initialize device. Device in use.", result = MA_BUSY; - } else { - errorMsg = "[WASAPI] Failed to initialize device.", result = ma_result_from_HRESULT(hr); - } - - goto done; - } - } - } - - if (!wasInitializedUsingIAudioClient3) { - ma_uint32 bufferSizeInFrames; - hr = ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pData->pAudioClient, &bufferSizeInFrames); - if (FAILED(hr)) { - errorMsg = "[WASAPI] Failed to get audio client's actual buffer size.", result = ma_result_from_HRESULT(hr); - goto done; - } - - pData->periodSizeInFramesOut = bufferSizeInFrames / pData->periodsOut; - } - - pData->usingAudioClient3 = wasInitializedUsingIAudioClient3; - - - if (deviceType == ma_device_type_playback) { - result = ma_device_create_IAudioClient_service__wasapi(pContext, deviceType, (ma_IAudioClient*)pData->pAudioClient, (void**)&pData->pRenderClient); - } else { - result = ma_device_create_IAudioClient_service__wasapi(pContext, deviceType, (ma_IAudioClient*)pData->pAudioClient, (void**)&pData->pCaptureClient); - } - - /*if (FAILED(hr)) {*/ - if (result != MA_SUCCESS) { - errorMsg = "[WASAPI] Failed to get audio client service."; - goto done; - } - - - /* Grab the name of the device. */ - #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - { - ma_IPropertyStore *pProperties; - hr = ma_IMMDevice_OpenPropertyStore(pDeviceInterface, STGM_READ, &pProperties); - if (SUCCEEDED(hr)) { - PROPVARIANT varName; - ma_PropVariantInit(&varName); - hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_Device_FriendlyName, &varName); - if (SUCCEEDED(hr)) { - WideCharToMultiByte(CP_UTF8, 0, varName.pwszVal, -1, pData->deviceName, sizeof(pData->deviceName), 0, FALSE); - ma_PropVariantClear(pContext, &varName); - } - - ma_IPropertyStore_Release(pProperties); - } - } - #endif - - /* - For the WASAPI backend we need to know the actual IDs of the device in order to do automatic - stream routing so that IDs can be compared and we can determine which device has been detached - and whether or not it matches with our ma_device. - */ - #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - { - /* Desktop */ - ma_context_get_device_id_from_MMDevice__wasapi(pContext, pDeviceInterface, &pData->id); - } - #else - { - /* UWP */ - /* TODO: Implement me. Need to figure out how to get the ID of the default device. */ - } - #endif - -done: - /* Clean up. */ -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - if (pDeviceInterface != NULL) { - ma_IMMDevice_Release(pDeviceInterface); - } -#else - if (pDeviceInterface != NULL) { - ma_IUnknown_Release(pDeviceInterface); - } -#endif - - if (result != MA_SUCCESS) { - if (pData->pRenderClient) { - ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pData->pRenderClient); - pData->pRenderClient = NULL; - } - if (pData->pCaptureClient) { - ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pData->pCaptureClient); - pData->pCaptureClient = NULL; - } - if (pData->pAudioClient) { - ma_IAudioClient_Release((ma_IAudioClient*)pData->pAudioClient); - pData->pAudioClient = NULL; - } - - if (errorMsg != NULL && errorMsg[0] != '\0') { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "%s", errorMsg); - } - - return result; - } else { - return MA_SUCCESS; - } -} - -static ma_result ma_device_reinit__wasapi(ma_device* pDevice, ma_device_type deviceType) -{ - ma_device_init_internal_data__wasapi data; - ma_result result; - - MA_ASSERT(pDevice != NULL); - - /* We only re-initialize the playback or capture device. Never a full-duplex device. */ - if (deviceType == ma_device_type_duplex) { - return MA_INVALID_ARGS; - } - - - /* - Before reinitializing the device we need to free the previous audio clients. - - There's a known memory leak here. We will be calling this from the routing change callback that - is fired by WASAPI. If we attempt to release the IAudioClient we will deadlock. In my opinion - this is a bug. I'm not sure what I need to do to handle this cleanly, but I think we'll probably - need some system where we post an event, but delay the execution of it until the callback has - returned. I'm not sure how to do this reliably, however. I have set up some infrastructure for - a command thread which might be useful for this. - */ - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_loopback) { - if (pDevice->wasapi.pCaptureClient) { - ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient); - pDevice->wasapi.pCaptureClient = NULL; - } - - if (pDevice->wasapi.pAudioClientCapture) { - /*ma_device_release_IAudioClient_service__wasapi(pDevice, ma_device_type_capture);*/ - pDevice->wasapi.pAudioClientCapture = NULL; - } - } - - if (deviceType == ma_device_type_playback) { - if (pDevice->wasapi.pRenderClient) { - ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient); - pDevice->wasapi.pRenderClient = NULL; - } - - if (pDevice->wasapi.pAudioClientPlayback) { - /*ma_device_release_IAudioClient_service__wasapi(pDevice, ma_device_type_playback);*/ - pDevice->wasapi.pAudioClientPlayback = NULL; - } - } - - - if (deviceType == ma_device_type_playback) { - data.formatIn = pDevice->playback.format; - data.channelsIn = pDevice->playback.channels; - MA_COPY_MEMORY(data.channelMapIn, pDevice->playback.channelMap, sizeof(pDevice->playback.channelMap)); - data.shareMode = pDevice->playback.shareMode; - } else { - data.formatIn = pDevice->capture.format; - data.channelsIn = pDevice->capture.channels; - MA_COPY_MEMORY(data.channelMapIn, pDevice->capture.channelMap, sizeof(pDevice->capture.channelMap)); - data.shareMode = pDevice->capture.shareMode; - } - - data.sampleRateIn = pDevice->sampleRate; - data.periodSizeInFramesIn = pDevice->wasapi.originalPeriodSizeInFrames; - data.periodSizeInMillisecondsIn = pDevice->wasapi.originalPeriodSizeInMilliseconds; - data.periodsIn = pDevice->wasapi.originalPeriods; - data.performanceProfile = pDevice->wasapi.originalPerformanceProfile; - data.noAutoConvertSRC = pDevice->wasapi.noAutoConvertSRC; - data.noDefaultQualitySRC = pDevice->wasapi.noDefaultQualitySRC; - data.noHardwareOffloading = pDevice->wasapi.noHardwareOffloading; - result = ma_device_init_internal__wasapi(pDevice->pContext, deviceType, NULL, &data); - if (result != MA_SUCCESS) { - return result; - } - - /* At this point we have some new objects ready to go. We need to uninitialize the previous ones and then set the new ones. */ - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_loopback) { - pDevice->wasapi.pAudioClientCapture = data.pAudioClient; - pDevice->wasapi.pCaptureClient = data.pCaptureClient; - - pDevice->capture.internalFormat = data.formatOut; - pDevice->capture.internalChannels = data.channelsOut; - pDevice->capture.internalSampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDevice->capture.internalPeriodSizeInFrames = data.periodSizeInFramesOut; - pDevice->capture.internalPeriods = data.periodsOut; - ma_strcpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), data.deviceName); - - ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, pDevice->wasapi.hEventCapture); - - pDevice->wasapi.periodSizeInFramesCapture = data.periodSizeInFramesOut; - ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &pDevice->wasapi.actualBufferSizeInFramesCapture); - - /* We must always have a valid ID. */ - ma_wcscpy_s(pDevice->capture.id.wasapi, sizeof(pDevice->capture.id.wasapi), data.id.wasapi); - } - - if (deviceType == ma_device_type_playback) { - pDevice->wasapi.pAudioClientPlayback = data.pAudioClient; - pDevice->wasapi.pRenderClient = data.pRenderClient; - - pDevice->playback.internalFormat = data.formatOut; - pDevice->playback.internalChannels = data.channelsOut; - pDevice->playback.internalSampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDevice->playback.internalPeriodSizeInFrames = data.periodSizeInFramesOut; - pDevice->playback.internalPeriods = data.periodsOut; - ma_strcpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), data.deviceName); - - ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, pDevice->wasapi.hEventPlayback); - - pDevice->wasapi.periodSizeInFramesPlayback = data.periodSizeInFramesOut; - ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &pDevice->wasapi.actualBufferSizeInFramesPlayback); - - /* We must always have a valid ID because rerouting will look at it. */ - ma_wcscpy_s(pDevice->playback.id.wasapi, sizeof(pDevice->playback.id.wasapi), data.id.wasapi); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_init__wasapi(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - ma_result result = MA_SUCCESS; - -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - HRESULT hr; - ma_IMMDeviceEnumerator* pDeviceEnumerator; -#endif - - MA_ASSERT(pDevice != NULL); - - MA_ZERO_OBJECT(&pDevice->wasapi); - pDevice->wasapi.noAutoConvertSRC = pConfig->wasapi.noAutoConvertSRC; - pDevice->wasapi.noDefaultQualitySRC = pConfig->wasapi.noDefaultQualitySRC; - pDevice->wasapi.noHardwareOffloading = pConfig->wasapi.noHardwareOffloading; - - /* Exclusive mode is not allowed with loopback. */ - if (pConfig->deviceType == ma_device_type_loopback && pConfig->playback.shareMode == ma_share_mode_exclusive) { - return MA_INVALID_DEVICE_CONFIG; - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) { - ma_device_init_internal_data__wasapi data; - data.formatIn = pDescriptorCapture->format; - data.channelsIn = pDescriptorCapture->channels; - data.sampleRateIn = pDescriptorCapture->sampleRate; - MA_COPY_MEMORY(data.channelMapIn, pDescriptorCapture->channelMap, sizeof(pDescriptorCapture->channelMap)); - data.periodSizeInFramesIn = pDescriptorCapture->periodSizeInFrames; - data.periodSizeInMillisecondsIn = pDescriptorCapture->periodSizeInMilliseconds; - data.periodsIn = pDescriptorCapture->periodCount; - data.shareMode = pDescriptorCapture->shareMode; - data.performanceProfile = pConfig->performanceProfile; - data.noAutoConvertSRC = pConfig->wasapi.noAutoConvertSRC; - data.noDefaultQualitySRC = pConfig->wasapi.noDefaultQualitySRC; - data.noHardwareOffloading = pConfig->wasapi.noHardwareOffloading; - - result = ma_device_init_internal__wasapi(pDevice->pContext, (pConfig->deviceType == ma_device_type_loopback) ? ma_device_type_loopback : ma_device_type_capture, pDescriptorCapture->pDeviceID, &data); - if (result != MA_SUCCESS) { - return result; - } - - pDevice->wasapi.pAudioClientCapture = data.pAudioClient; - pDevice->wasapi.pCaptureClient = data.pCaptureClient; - pDevice->wasapi.originalPeriodSizeInMilliseconds = pDescriptorCapture->periodSizeInMilliseconds; - pDevice->wasapi.originalPeriodSizeInFrames = pDescriptorCapture->periodSizeInFrames; - pDevice->wasapi.originalPeriods = pDescriptorCapture->periodCount; - pDevice->wasapi.originalPerformanceProfile = pConfig->performanceProfile; - - /* - The event for capture needs to be manual reset for the same reason as playback. We keep the initial state set to unsignaled, - however, because we want to block until we actually have something for the first call to ma_device_read(). - */ - pDevice->wasapi.hEventCapture = CreateEventW(NULL, FALSE, FALSE, NULL); /* Auto reset, unsignaled by default. */ - if (pDevice->wasapi.hEventCapture == NULL) { - result = ma_result_from_GetLastError(GetLastError()); - - if (pDevice->wasapi.pCaptureClient != NULL) { - ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient); - pDevice->wasapi.pCaptureClient = NULL; - } - if (pDevice->wasapi.pAudioClientCapture != NULL) { - ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture); - pDevice->wasapi.pAudioClientCapture = NULL; - } - - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create event for capture."); - return result; - } - ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, pDevice->wasapi.hEventCapture); - - pDevice->wasapi.periodSizeInFramesCapture = data.periodSizeInFramesOut; - ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &pDevice->wasapi.actualBufferSizeInFramesCapture); - - /* We must always have a valid ID. */ - ma_wcscpy_s(pDevice->capture.id.wasapi, sizeof(pDevice->capture.id.wasapi), data.id.wasapi); - - /* The descriptor needs to be updated with actual values. */ - pDescriptorCapture->format = data.formatOut; - pDescriptorCapture->channels = data.channelsOut; - pDescriptorCapture->sampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDescriptorCapture->channelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDescriptorCapture->periodSizeInFrames = data.periodSizeInFramesOut; - pDescriptorCapture->periodCount = data.periodsOut; - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_device_init_internal_data__wasapi data; - data.formatIn = pDescriptorPlayback->format; - data.channelsIn = pDescriptorPlayback->channels; - data.sampleRateIn = pDescriptorPlayback->sampleRate; - MA_COPY_MEMORY(data.channelMapIn, pDescriptorPlayback->channelMap, sizeof(pDescriptorPlayback->channelMap)); - data.periodSizeInFramesIn = pDescriptorPlayback->periodSizeInFrames; - data.periodSizeInMillisecondsIn = pDescriptorPlayback->periodSizeInMilliseconds; - data.periodsIn = pDescriptorPlayback->periodCount; - data.shareMode = pDescriptorPlayback->shareMode; - data.performanceProfile = pConfig->performanceProfile; - data.noAutoConvertSRC = pConfig->wasapi.noAutoConvertSRC; - data.noDefaultQualitySRC = pConfig->wasapi.noDefaultQualitySRC; - data.noHardwareOffloading = pConfig->wasapi.noHardwareOffloading; - - result = ma_device_init_internal__wasapi(pDevice->pContext, ma_device_type_playback, pDescriptorPlayback->pDeviceID, &data); - if (result != MA_SUCCESS) { - if (pConfig->deviceType == ma_device_type_duplex) { - if (pDevice->wasapi.pCaptureClient != NULL) { - ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient); - pDevice->wasapi.pCaptureClient = NULL; - } - if (pDevice->wasapi.pAudioClientCapture != NULL) { - ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture); - pDevice->wasapi.pAudioClientCapture = NULL; - } - - CloseHandle(pDevice->wasapi.hEventCapture); - pDevice->wasapi.hEventCapture = NULL; - } - return result; - } - - pDevice->wasapi.pAudioClientPlayback = data.pAudioClient; - pDevice->wasapi.pRenderClient = data.pRenderClient; - pDevice->wasapi.originalPeriodSizeInMilliseconds = pDescriptorPlayback->periodSizeInMilliseconds; - pDevice->wasapi.originalPeriodSizeInFrames = pDescriptorPlayback->periodSizeInFrames; - pDevice->wasapi.originalPeriods = pDescriptorPlayback->periodCount; - pDevice->wasapi.originalPerformanceProfile = pConfig->performanceProfile; - - /* - The event for playback is needs to be manual reset because we want to explicitly control the fact that it becomes signalled - only after the whole available space has been filled, never before. - - The playback event also needs to be initially set to a signaled state so that the first call to ma_device_write() is able - to get passed WaitForMultipleObjects(). - */ - pDevice->wasapi.hEventPlayback = CreateEventW(NULL, FALSE, TRUE, NULL); /* Auto reset, signaled by default. */ - if (pDevice->wasapi.hEventPlayback == NULL) { - result = ma_result_from_GetLastError(GetLastError()); - - if (pConfig->deviceType == ma_device_type_duplex) { - if (pDevice->wasapi.pCaptureClient != NULL) { - ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient); - pDevice->wasapi.pCaptureClient = NULL; - } - if (pDevice->wasapi.pAudioClientCapture != NULL) { - ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture); - pDevice->wasapi.pAudioClientCapture = NULL; - } - - CloseHandle(pDevice->wasapi.hEventCapture); - pDevice->wasapi.hEventCapture = NULL; - } - - if (pDevice->wasapi.pRenderClient != NULL) { - ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient); - pDevice->wasapi.pRenderClient = NULL; - } - if (pDevice->wasapi.pAudioClientPlayback != NULL) { - ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback); - pDevice->wasapi.pAudioClientPlayback = NULL; - } - - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create event for playback."); - return result; - } - ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, pDevice->wasapi.hEventPlayback); - - pDevice->wasapi.periodSizeInFramesPlayback = data.periodSizeInFramesOut; - ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &pDevice->wasapi.actualBufferSizeInFramesPlayback); - - /* We must always have a valid ID because rerouting will look at it. */ - ma_wcscpy_s(pDevice->playback.id.wasapi, sizeof(pDevice->playback.id.wasapi), data.id.wasapi); - - /* The descriptor needs to be updated with actual values. */ - pDescriptorPlayback->format = data.formatOut; - pDescriptorPlayback->channels = data.channelsOut; - pDescriptorPlayback->sampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDescriptorPlayback->channelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDescriptorPlayback->periodSizeInFrames = data.periodSizeInFramesOut; - pDescriptorPlayback->periodCount = data.periodsOut; - } - - /* - We need to register a notification client to detect when the device has been disabled, unplugged or re-routed (when the default device changes). When - we are connecting to the default device we want to do automatic stream routing when the device is disabled or unplugged. Otherwise we want to just - stop the device outright and let the application handle it. - */ -#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK) - if (pConfig->wasapi.noAutoStreamRouting == MA_FALSE) { - if ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.pDeviceID == NULL) { - pDevice->wasapi.allowCaptureAutoStreamRouting = MA_TRUE; - } - if ((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.pDeviceID == NULL) { - pDevice->wasapi.allowPlaybackAutoStreamRouting = MA_TRUE; - } - } - - hr = ma_CoCreateInstance(pDevice->pContext, MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator); - if (FAILED(hr)) { - ma_device_uninit__wasapi(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create device enumerator."); - return ma_result_from_HRESULT(hr); - } - - pDevice->wasapi.notificationClient.lpVtbl = (void*)&g_maNotificationCientVtbl; - pDevice->wasapi.notificationClient.counter = 1; - pDevice->wasapi.notificationClient.pDevice = pDevice; - - hr = pDeviceEnumerator->lpVtbl->RegisterEndpointNotificationCallback(pDeviceEnumerator, &pDevice->wasapi.notificationClient); - if (SUCCEEDED(hr)) { - pDevice->wasapi.pDeviceEnumerator = (ma_ptr)pDeviceEnumerator; - } else { - /* Not the end of the world if we fail to register the notification callback. We just won't support automatic stream routing. */ - ma_IMMDeviceEnumerator_Release(pDeviceEnumerator); - } -#endif - - c89atomic_exchange_32(&pDevice->wasapi.isStartedCapture, MA_FALSE); - c89atomic_exchange_32(&pDevice->wasapi.isStartedPlayback, MA_FALSE); - - return MA_SUCCESS; -} - -static ma_result ma_device__get_available_frames__wasapi(ma_device* pDevice, ma_IAudioClient* pAudioClient, ma_uint32* pFrameCount) -{ - ma_uint32 paddingFramesCount; - HRESULT hr; - ma_share_mode shareMode; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pFrameCount != NULL); - - *pFrameCount = 0; - - if ((ma_ptr)pAudioClient != pDevice->wasapi.pAudioClientPlayback && (ma_ptr)pAudioClient != pDevice->wasapi.pAudioClientCapture) { - return MA_INVALID_OPERATION; - } - - /* - I've had a report that GetCurrentPadding() is returning a frame count of 0 which is preventing - higher level function calls from doing anything because it thinks nothing is available. I have - taken a look at the documentation and it looks like this is unnecessary in exclusive mode. - - From Microsoft's documentation: - - For an exclusive-mode rendering or capture stream that was initialized with the - AUDCLNT_STREAMFLAGS_EVENTCALLBACK flag, the client typically has no use for the padding - value reported by GetCurrentPadding. Instead, the client accesses an entire buffer during - each processing pass. - - Considering this, I'm going to skip GetCurrentPadding() for exclusive mode and just report the - entire buffer. This depends on the caller making sure they wait on the event handler. - */ - shareMode = ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) ? pDevice->playback.shareMode : pDevice->capture.shareMode; - if (shareMode == ma_share_mode_shared) { - /* Shared mode. */ - hr = ma_IAudioClient_GetCurrentPadding(pAudioClient, &paddingFramesCount); - if (FAILED(hr)) { - return ma_result_from_HRESULT(hr); - } - - if ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) { - *pFrameCount = pDevice->wasapi.actualBufferSizeInFramesPlayback - paddingFramesCount; - } else { - *pFrameCount = paddingFramesCount; - } - } else { - /* Exclusive mode. */ - if ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) { - *pFrameCount = pDevice->wasapi.actualBufferSizeInFramesPlayback; - } else { - *pFrameCount = pDevice->wasapi.actualBufferSizeInFramesCapture; - } - } - - return MA_SUCCESS; -} - - -static ma_result ma_device_reroute__wasapi(ma_device* pDevice, ma_device_type deviceType) -{ - ma_result result; - - if (deviceType == ma_device_type_duplex) { - return MA_INVALID_ARGS; - } - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "=== CHANGING DEVICE ===\n"); - - result = ma_device_reinit__wasapi(pDevice, deviceType); - if (result != MA_SUCCESS) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[WASAPI] Reinitializing device after route change failed.\n"); - return result; - } - - ma_device__post_init_setup(pDevice, deviceType); - - ma_device__on_notification_rerouted(pDevice); - - return MA_SUCCESS; -} - -static ma_result ma_device_start__wasapi(ma_device* pDevice) -{ - HRESULT hr; - - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) { - hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to start internal capture device."); - return ma_result_from_HRESULT(hr); - } - - c89atomic_exchange_32(&pDevice->wasapi.isStartedCapture, MA_TRUE); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to start internal playback device."); - return ma_result_from_HRESULT(hr); - } - - c89atomic_exchange_32(&pDevice->wasapi.isStartedPlayback, MA_TRUE); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__wasapi(ma_device* pDevice) -{ - ma_result result; - HRESULT hr; - - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) { - hr = ma_IAudioClient_Stop((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to stop internal capture device."); - return ma_result_from_HRESULT(hr); - } - - /* The audio client needs to be reset otherwise restarting will fail. */ - hr = ma_IAudioClient_Reset((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to reset internal capture device."); - return ma_result_from_HRESULT(hr); - } - - /* If we have a mapped buffer we need to release it. */ - if (pDevice->wasapi.pMappedBufferCapture != NULL) { - ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap); - pDevice->wasapi.pMappedBufferCapture = NULL; - pDevice->wasapi.mappedBufferCaptureCap = 0; - pDevice->wasapi.mappedBufferCaptureLen = 0; - } - - c89atomic_exchange_32(&pDevice->wasapi.isStartedCapture, MA_FALSE); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - /* - The buffer needs to be drained before stopping the device. Not doing this will result in the last few frames not getting output to - the speakers. This is a problem for very short sounds because it'll result in a significant portion of it not getting played. - */ - if (c89atomic_load_32(&pDevice->wasapi.isStartedPlayback)) { - /* We need to make sure we put a timeout here or else we'll risk getting stuck in a deadlock in some cases. */ - DWORD waitTime = pDevice->wasapi.actualBufferSizeInFramesPlayback / pDevice->playback.internalSampleRate; - - if (pDevice->playback.shareMode == ma_share_mode_exclusive) { - WaitForSingleObject(pDevice->wasapi.hEventPlayback, waitTime); - } else { - ma_uint32 prevFramesAvaialablePlayback = (ma_uint32)-1; - ma_uint32 framesAvailablePlayback; - for (;;) { - result = ma_device__get_available_frames__wasapi(pDevice, (ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &framesAvailablePlayback); - if (result != MA_SUCCESS) { - break; - } - - if (framesAvailablePlayback >= pDevice->wasapi.actualBufferSizeInFramesPlayback) { - break; - } - - /* - Just a safety check to avoid an infinite loop. If this iteration results in a situation where the number of available frames - has not changed, get out of the loop. I don't think this should ever happen, but I think it's nice to have just in case. - */ - if (framesAvailablePlayback == prevFramesAvaialablePlayback) { - break; - } - prevFramesAvaialablePlayback = framesAvailablePlayback; - - WaitForSingleObject(pDevice->wasapi.hEventPlayback, waitTime); - ResetEvent(pDevice->wasapi.hEventPlayback); /* Manual reset. */ - } - } - } - - hr = ma_IAudioClient_Stop((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to stop internal playback device."); - return ma_result_from_HRESULT(hr); - } - - /* The audio client needs to be reset otherwise restarting will fail. */ - hr = ma_IAudioClient_Reset((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to reset internal playback device."); - return ma_result_from_HRESULT(hr); - } - - if (pDevice->wasapi.pMappedBufferPlayback != NULL) { - ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, pDevice->wasapi.mappedBufferPlaybackCap, 0); - pDevice->wasapi.pMappedBufferPlayback = NULL; - pDevice->wasapi.mappedBufferPlaybackCap = 0; - pDevice->wasapi.mappedBufferPlaybackLen = 0; - } - - c89atomic_exchange_32(&pDevice->wasapi.isStartedPlayback, MA_FALSE); - } - - return MA_SUCCESS; -} - - -#ifndef MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS -#define MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS 5000 -#endif - -static ma_result ma_device_read__wasapi(ma_device* pDevice, void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_uint32 totalFramesProcessed = 0; - - /* - When reading, we need to get a buffer and process all of it before releasing it. Because the - frame count (frameCount) can be different to the size of the buffer, we'll need to cache the - pointer to the buffer. - */ - - /* Keep running until we've processed the requested number of frames. */ - while (ma_device_get_state(pDevice) == ma_device_state_started && totalFramesProcessed < frameCount) { - ma_uint32 framesRemaining = frameCount - totalFramesProcessed; - - /* If we have a mapped data buffer, consume that first. */ - if (pDevice->wasapi.pMappedBufferCapture != NULL) { - /* We have a cached data pointer so consume that before grabbing another one from WASAPI. */ - ma_uint32 framesToProcessNow = framesRemaining; - if (framesToProcessNow > pDevice->wasapi.mappedBufferCaptureLen) { - framesToProcessNow = pDevice->wasapi.mappedBufferCaptureLen; - } - - /* Now just copy the data over to the output buffer. */ - ma_copy_pcm_frames( - ma_offset_pcm_frames_ptr(pFrames, totalFramesProcessed, pDevice->capture.internalFormat, pDevice->capture.internalChannels), - ma_offset_pcm_frames_const_ptr(pDevice->wasapi.pMappedBufferCapture, pDevice->wasapi.mappedBufferCaptureCap - pDevice->wasapi.mappedBufferCaptureLen, pDevice->capture.internalFormat, pDevice->capture.internalChannels), - framesToProcessNow, - pDevice->capture.internalFormat, pDevice->capture.internalChannels - ); - - totalFramesProcessed += framesToProcessNow; - pDevice->wasapi.mappedBufferCaptureLen -= framesToProcessNow; - - /* If the data buffer has been fully consumed we need to release it. */ - if (pDevice->wasapi.mappedBufferCaptureLen == 0) { - ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap); - pDevice->wasapi.pMappedBufferCapture = NULL; - pDevice->wasapi.mappedBufferCaptureCap = 0; - } - } else { - /* We don't have any cached data pointer, so grab another one. */ - HRESULT hr; - DWORD flags; - - /* First just ask WASAPI for a data buffer. If it's not available, we'll wait for more. */ - hr = ma_IAudioCaptureClient_GetBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, (BYTE**)&pDevice->wasapi.pMappedBufferCapture, &pDevice->wasapi.mappedBufferCaptureCap, &flags, NULL, NULL); - if (hr == S_OK) { - /* We got a data buffer. Continue to the next loop iteration which will then read from the mapped pointer. */ - - /* Overrun detection. */ - if ((flags & MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) != 0) { - /* Glitched. Probably due to an overrun. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[WASAPI] Data discontinuity (possible overrun). Attempting recovery. mappedBufferCaptureCap=%d\n", pDevice->wasapi.mappedBufferCaptureCap); - - /* - If we got an overrun it probably means we're straddling the end of the buffer. In order to prevent - a never-ending sequence of glitches we're going to recover by completely clearing out the capture - buffer. - */ - { - ma_uint32 iterationCount = 4; /* Safety to prevent an infinite loop. */ - ma_uint32 i; - - for (i = 0; i < iterationCount; i += 1) { - hr = ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap); - if (FAILED(hr)) { - break; - } - - hr = ma_IAudioCaptureClient_GetBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, (BYTE**)&pDevice->wasapi.pMappedBufferCapture, &pDevice->wasapi.mappedBufferCaptureCap, &flags, NULL, NULL); - if (hr == MA_AUDCLNT_S_BUFFER_EMPTY || FAILED(hr)) { - break; - } - } - } - - /* We should not have a valid buffer at this point so make sure everything is empty. */ - pDevice->wasapi.pMappedBufferCapture = NULL; - pDevice->wasapi.mappedBufferCaptureCap = 0; - pDevice->wasapi.mappedBufferCaptureLen = 0; - } else { - /* The data is clean. */ - pDevice->wasapi.mappedBufferCaptureLen = pDevice->wasapi.mappedBufferCaptureCap; - - if (flags != 0) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[WASAPI] Capture Flags: %ld\n", flags); - } - } - - continue; - } else { - if (hr == MA_AUDCLNT_S_BUFFER_EMPTY || hr == MA_AUDCLNT_E_BUFFER_ERROR) { - /* - No data is available. We need to wait for more. There's two situations to consider - here. The first is normal capture mode. If this times out it probably means the - microphone isn't delivering data for whatever reason. In this case we'll just - abort the read and return whatever we were able to get. The other situations is - loopback mode, in which case a timeout probably just means the nothing is playing - through the speakers. - */ - if (WaitForSingleObject(pDevice->wasapi.hEventCapture, MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS) != WAIT_OBJECT_0) { - if (pDevice->type == ma_device_type_loopback) { - continue; /* Keep waiting in loopback mode. */ - } else { - result = MA_ERROR; - break; /* Wait failed. */ - } - } - - /* At this point we should be able to loop back to the start of the loop and try retrieving a data buffer again. */ - } else { - /* An error occured and we need to abort. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to retrieve internal buffer from capture device in preparation for reading from the device. HRESULT = %d. Stopping device.\n", (int)hr); - result = ma_result_from_HRESULT(hr); - break; - } - } - } - } - - /* - If we were unable to process the entire requested frame count, but we still have a mapped buffer, - there's a good chance either an error occurred or the device was stopped mid-read. In this case - we'll need to make sure the buffer is released. - */ - if (totalFramesProcessed < frameCount && pDevice->wasapi.pMappedBufferCapture != NULL) { - ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap); - pDevice->wasapi.pMappedBufferCapture = NULL; - pDevice->wasapi.mappedBufferCaptureCap = 0; - pDevice->wasapi.mappedBufferCaptureLen = 0; - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesProcessed; - } - - return result; -} - -static ma_result ma_device_write__wasapi(ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - ma_result result = MA_SUCCESS; - ma_uint32 totalFramesProcessed = 0; - - /* Keep writing to the device until it's stopped or we've consumed all of our input. */ - while (ma_device_get_state(pDevice) == ma_device_state_started && totalFramesProcessed < frameCount) { - ma_uint32 framesRemaining = frameCount - totalFramesProcessed; - - /* - We're going to do this in a similar way to capture. We'll first check if the cached data pointer - is valid, and if so, read from that. Otherwise We will call IAudioRenderClient_GetBuffer() with - a requested buffer size equal to our actual period size. If it returns AUDCLNT_E_BUFFER_TOO_LARGE - it means we need to wait for some data to become available. - */ - if (pDevice->wasapi.pMappedBufferPlayback != NULL) { - /* We still have some space available in the mapped data buffer. Write to it. */ - ma_uint32 framesToProcessNow = framesRemaining; - if (framesToProcessNow > (pDevice->wasapi.mappedBufferPlaybackCap - pDevice->wasapi.mappedBufferPlaybackLen)) { - framesToProcessNow = (pDevice->wasapi.mappedBufferPlaybackCap - pDevice->wasapi.mappedBufferPlaybackLen); - } - - /* Now just copy the data over to the output buffer. */ - ma_copy_pcm_frames( - ma_offset_pcm_frames_ptr(pDevice->wasapi.pMappedBufferPlayback, pDevice->wasapi.mappedBufferPlaybackLen, pDevice->playback.internalFormat, pDevice->playback.internalChannels), - ma_offset_pcm_frames_const_ptr(pFrames, totalFramesProcessed, pDevice->playback.internalFormat, pDevice->playback.internalChannels), - framesToProcessNow, - pDevice->playback.internalFormat, pDevice->playback.internalChannels - ); - - totalFramesProcessed += framesToProcessNow; - pDevice->wasapi.mappedBufferPlaybackLen += framesToProcessNow; - - /* If the data buffer has been fully consumed we need to release it. */ - if (pDevice->wasapi.mappedBufferPlaybackLen == pDevice->wasapi.mappedBufferPlaybackCap) { - ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, pDevice->wasapi.mappedBufferPlaybackCap, 0); - pDevice->wasapi.pMappedBufferPlayback = NULL; - pDevice->wasapi.mappedBufferPlaybackCap = 0; - pDevice->wasapi.mappedBufferPlaybackLen = 0; - - /* - In exclusive mode we need to wait here. Exclusive mode is weird because GetBuffer() never - seems to return AUDCLNT_E_BUFFER_TOO_LARGE, which is what we normally use to determine - whether or not we need to wait for more data. - */ - if (pDevice->playback.shareMode == ma_share_mode_exclusive) { - if (WaitForSingleObject(pDevice->wasapi.hEventPlayback, MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS) != WAIT_OBJECT_0) { - result = MA_ERROR; - break; /* Wait failed. Probably timed out. */ - } - } - } - } else { - /* We don't have a mapped data buffer so we'll need to get one. */ - HRESULT hr; - ma_uint32 bufferSizeInFrames; - - /* Special rules for exclusive mode. */ - if (pDevice->playback.shareMode == ma_share_mode_exclusive) { - bufferSizeInFrames = pDevice->wasapi.actualBufferSizeInFramesPlayback; - } else { - bufferSizeInFrames = pDevice->wasapi.periodSizeInFramesPlayback; - } - - hr = ma_IAudioRenderClient_GetBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, bufferSizeInFrames, (BYTE**)&pDevice->wasapi.pMappedBufferPlayback); - if (hr == S_OK) { - /* We have data available. */ - pDevice->wasapi.mappedBufferPlaybackCap = bufferSizeInFrames; - pDevice->wasapi.mappedBufferPlaybackLen = 0; - } else { - if (hr == MA_AUDCLNT_E_BUFFER_TOO_LARGE || hr == MA_AUDCLNT_E_BUFFER_ERROR) { - /* Not enough data available. We need to wait for more. */ - if (WaitForSingleObject(pDevice->wasapi.hEventPlayback, MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS) != WAIT_OBJECT_0) { - result = MA_ERROR; - break; /* Wait failed. Probably timed out. */ - } - } else { - /* Some error occurred. We'll need to abort. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to retrieve internal buffer from playback device in preparation for writing to the device. HRESULT = %d. Stopping device.\n", (int)hr); - result = ma_result_from_HRESULT(hr); - break; - } - } - } - } - - if (pFramesWritten != NULL) { - *pFramesWritten = totalFramesProcessed; - } - - return result; -} - -static ma_result ma_device_data_loop_wakeup__wasapi(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) { - SetEvent((HANDLE)pDevice->wasapi.hEventCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - SetEvent((HANDLE)pDevice->wasapi.hEventPlayback); - } - - return MA_SUCCESS; -} - - -static ma_result ma_context_uninit__wasapi(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_wasapi); - - if (pContext->wasapi.commandThread != NULL) { - ma_context_command__wasapi cmd = ma_context_init_command__wasapi(MA_CONTEXT_COMMAND_QUIT__WASAPI); - ma_context_post_command__wasapi(pContext, &cmd); - ma_thread_wait(&pContext->wasapi.commandThread); - - /* Only after the thread has been terminated can we uninitialize the sync objects for the command thread. */ - ma_semaphore_uninit(&pContext->wasapi.commandSem); - ma_mutex_uninit(&pContext->wasapi.commandLock); - } - - return MA_SUCCESS; -} - -static ma_result ma_context_init__wasapi(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - ma_result result = MA_SUCCESS; - - MA_ASSERT(pContext != NULL); - - (void)pConfig; - -#ifdef MA_WIN32_DESKTOP - /* - WASAPI is only supported in Vista SP1 and newer. The reason for SP1 and not the base version of Vista is that event-driven - exclusive mode does not work until SP1. - - Unfortunately older compilers don't define these functions so we need to dynamically load them in order to avoid a link error. - */ - { - ma_OSVERSIONINFOEXW osvi; - ma_handle kernel32DLL; - ma_PFNVerifyVersionInfoW _VerifyVersionInfoW; - ma_PFNVerSetConditionMask _VerSetConditionMask; - - kernel32DLL = ma_dlopen(pContext, "kernel32.dll"); - if (kernel32DLL == NULL) { - return MA_NO_BACKEND; - } - - _VerifyVersionInfoW = (ma_PFNVerifyVersionInfoW )ma_dlsym(pContext, kernel32DLL, "VerifyVersionInfoW"); - _VerSetConditionMask = (ma_PFNVerSetConditionMask)ma_dlsym(pContext, kernel32DLL, "VerSetConditionMask"); - if (_VerifyVersionInfoW == NULL || _VerSetConditionMask == NULL) { - ma_dlclose(pContext, kernel32DLL); - return MA_NO_BACKEND; - } - - MA_ZERO_OBJECT(&osvi); - osvi.dwOSVersionInfoSize = sizeof(osvi); - osvi.dwMajorVersion = ((MA_WIN32_WINNT_VISTA >> 8) & 0xFF); - osvi.dwMinorVersion = ((MA_WIN32_WINNT_VISTA >> 0) & 0xFF); - osvi.wServicePackMajor = 1; - if (_VerifyVersionInfoW(&osvi, MA_VER_MAJORVERSION | MA_VER_MINORVERSION | MA_VER_SERVICEPACKMAJOR, _VerSetConditionMask(_VerSetConditionMask(_VerSetConditionMask(0, MA_VER_MAJORVERSION, MA_VER_GREATER_EQUAL), MA_VER_MINORVERSION, MA_VER_GREATER_EQUAL), MA_VER_SERVICEPACKMAJOR, MA_VER_GREATER_EQUAL))) { - result = MA_SUCCESS; - } else { - result = MA_NO_BACKEND; - } - - ma_dlclose(pContext, kernel32DLL); - } -#endif - - if (result != MA_SUCCESS) { - return result; - } - - MA_ZERO_OBJECT(&pContext->wasapi); - - /* - Annoyingly, WASAPI does not allow you to release an IAudioClient object from a different thread - than the one that retrieved it with GetService(). This can result in a deadlock in two - situations: - - 1) When calling ma_device_uninit() from a different thread to ma_device_init(); and - 2) When uninitializing and reinitializing the internal IAudioClient object in response to - automatic stream routing. - - We could define ma_device_uninit() such that it must be called on the same thread as - ma_device_init(). We could also just not release the IAudioClient when performing automatic - stream routing to avoid the deadlock. Neither of these are acceptable solutions in my view so - we're going to have to work around this with a worker thread. This is not ideal, but I can't - think of a better way to do this. - - More information about this can be found here: - - https://docs.microsoft.com/en-us/windows/win32/api/audioclient/nn-audioclient-iaudiorenderclient - - Note this section: - - When releasing an IAudioRenderClient interface instance, the client must call the interface's - Release method from the same thread as the call to IAudioClient::GetService that created the - object. - */ - { - result = ma_mutex_init(&pContext->wasapi.commandLock); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_semaphore_init(0, &pContext->wasapi.commandSem); - if (result != MA_SUCCESS) { - ma_mutex_uninit(&pContext->wasapi.commandLock); - return result; - } - - result = ma_thread_create(&pContext->wasapi.commandThread, ma_thread_priority_normal, 0, ma_context_command_thread__wasapi, pContext, &pContext->allocationCallbacks); - if (result != MA_SUCCESS) { - ma_semaphore_uninit(&pContext->wasapi.commandSem); - ma_mutex_uninit(&pContext->wasapi.commandLock); - return result; - } - } - - - pCallbacks->onContextInit = ma_context_init__wasapi; - pCallbacks->onContextUninit = ma_context_uninit__wasapi; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__wasapi; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__wasapi; - pCallbacks->onDeviceInit = ma_device_init__wasapi; - pCallbacks->onDeviceUninit = ma_device_uninit__wasapi; - pCallbacks->onDeviceStart = ma_device_start__wasapi; - pCallbacks->onDeviceStop = ma_device_stop__wasapi; - pCallbacks->onDeviceRead = ma_device_read__wasapi; - pCallbacks->onDeviceWrite = ma_device_write__wasapi; - pCallbacks->onDeviceDataLoop = NULL; - pCallbacks->onDeviceDataLoopWakeup = ma_device_data_loop_wakeup__wasapi; - - return MA_SUCCESS; -} -#endif - -/****************************************************************************** - -DirectSound Backend - -******************************************************************************/ -#ifdef MA_HAS_DSOUND -/*#include */ - -/*static const GUID MA_GUID_IID_DirectSoundNotify = {0xb0210783, 0x89cd, 0x11d0, {0xaf, 0x08, 0x00, 0xa0, 0xc9, 0x25, 0xcd, 0x16}};*/ - -/* miniaudio only uses priority or exclusive modes. */ -#define MA_DSSCL_NORMAL 1 -#define MA_DSSCL_PRIORITY 2 -#define MA_DSSCL_EXCLUSIVE 3 -#define MA_DSSCL_WRITEPRIMARY 4 - -#define MA_DSCAPS_PRIMARYMONO 0x00000001 -#define MA_DSCAPS_PRIMARYSTEREO 0x00000002 -#define MA_DSCAPS_PRIMARY8BIT 0x00000004 -#define MA_DSCAPS_PRIMARY16BIT 0x00000008 -#define MA_DSCAPS_CONTINUOUSRATE 0x00000010 -#define MA_DSCAPS_EMULDRIVER 0x00000020 -#define MA_DSCAPS_CERTIFIED 0x00000040 -#define MA_DSCAPS_SECONDARYMONO 0x00000100 -#define MA_DSCAPS_SECONDARYSTEREO 0x00000200 -#define MA_DSCAPS_SECONDARY8BIT 0x00000400 -#define MA_DSCAPS_SECONDARY16BIT 0x00000800 - -#define MA_DSBCAPS_PRIMARYBUFFER 0x00000001 -#define MA_DSBCAPS_STATIC 0x00000002 -#define MA_DSBCAPS_LOCHARDWARE 0x00000004 -#define MA_DSBCAPS_LOCSOFTWARE 0x00000008 -#define MA_DSBCAPS_CTRL3D 0x00000010 -#define MA_DSBCAPS_CTRLFREQUENCY 0x00000020 -#define MA_DSBCAPS_CTRLPAN 0x00000040 -#define MA_DSBCAPS_CTRLVOLUME 0x00000080 -#define MA_DSBCAPS_CTRLPOSITIONNOTIFY 0x00000100 -#define MA_DSBCAPS_CTRLFX 0x00000200 -#define MA_DSBCAPS_STICKYFOCUS 0x00004000 -#define MA_DSBCAPS_GLOBALFOCUS 0x00008000 -#define MA_DSBCAPS_GETCURRENTPOSITION2 0x00010000 -#define MA_DSBCAPS_MUTE3DATMAXDISTANCE 0x00020000 -#define MA_DSBCAPS_LOCDEFER 0x00040000 -#define MA_DSBCAPS_TRUEPLAYPOSITION 0x00080000 - -#define MA_DSBPLAY_LOOPING 0x00000001 -#define MA_DSBPLAY_LOCHARDWARE 0x00000002 -#define MA_DSBPLAY_LOCSOFTWARE 0x00000004 -#define MA_DSBPLAY_TERMINATEBY_TIME 0x00000008 -#define MA_DSBPLAY_TERMINATEBY_DISTANCE 0x00000010 -#define MA_DSBPLAY_TERMINATEBY_PRIORITY 0x00000020 - -#define MA_DSCBSTART_LOOPING 0x00000001 - -typedef struct -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - WAVEFORMATEX* lpwfxFormat; - GUID guid3DAlgorithm; -} MA_DSBUFFERDESC; - -typedef struct -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - WAVEFORMATEX* lpwfxFormat; - DWORD dwFXCount; - void* lpDSCFXDesc; /* <-- miniaudio doesn't use this, so set to void*. */ -} MA_DSCBUFFERDESC; - -typedef struct -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwMinSecondarySampleRate; - DWORD dwMaxSecondarySampleRate; - DWORD dwPrimaryBuffers; - DWORD dwMaxHwMixingAllBuffers; - DWORD dwMaxHwMixingStaticBuffers; - DWORD dwMaxHwMixingStreamingBuffers; - DWORD dwFreeHwMixingAllBuffers; - DWORD dwFreeHwMixingStaticBuffers; - DWORD dwFreeHwMixingStreamingBuffers; - DWORD dwMaxHw3DAllBuffers; - DWORD dwMaxHw3DStaticBuffers; - DWORD dwMaxHw3DStreamingBuffers; - DWORD dwFreeHw3DAllBuffers; - DWORD dwFreeHw3DStaticBuffers; - DWORD dwFreeHw3DStreamingBuffers; - DWORD dwTotalHwMemBytes; - DWORD dwFreeHwMemBytes; - DWORD dwMaxContigFreeHwMemBytes; - DWORD dwUnlockTransferRateHwBuffers; - DWORD dwPlayCpuOverheadSwBuffers; - DWORD dwReserved1; - DWORD dwReserved2; -} MA_DSCAPS; - -typedef struct -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwUnlockTransferRate; - DWORD dwPlayCpuOverhead; -} MA_DSBCAPS; - -typedef struct -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwFormats; - DWORD dwChannels; -} MA_DSCCAPS; - -typedef struct -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; -} MA_DSCBCAPS; - -typedef struct -{ - DWORD dwOffset; - HANDLE hEventNotify; -} MA_DSBPOSITIONNOTIFY; - -typedef struct ma_IDirectSound ma_IDirectSound; -typedef struct ma_IDirectSoundBuffer ma_IDirectSoundBuffer; -typedef struct ma_IDirectSoundCapture ma_IDirectSoundCapture; -typedef struct ma_IDirectSoundCaptureBuffer ma_IDirectSoundCaptureBuffer; -typedef struct ma_IDirectSoundNotify ma_IDirectSoundNotify; - - -/* -COM objects. The way these work is that you have a vtable (a list of function pointers, kind of -like how C++ works internally), and then you have a structure with a single member, which is a -pointer to the vtable. The vtable is where the methods of the object are defined. Methods need -to be in a specific order, and parent classes need to have their methods declared first. -*/ - -/* IDirectSound */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSound* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IDirectSound* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IDirectSound* pThis); - - /* IDirectSound */ - HRESULT (STDMETHODCALLTYPE * CreateSoundBuffer) (ma_IDirectSound* pThis, const MA_DSBUFFERDESC* pDSBufferDesc, ma_IDirectSoundBuffer** ppDSBuffer, void* pUnkOuter); - HRESULT (STDMETHODCALLTYPE * GetCaps) (ma_IDirectSound* pThis, MA_DSCAPS* pDSCaps); - HRESULT (STDMETHODCALLTYPE * DuplicateSoundBuffer)(ma_IDirectSound* pThis, ma_IDirectSoundBuffer* pDSBufferOriginal, ma_IDirectSoundBuffer** ppDSBufferDuplicate); - HRESULT (STDMETHODCALLTYPE * SetCooperativeLevel) (ma_IDirectSound* pThis, HWND hwnd, DWORD dwLevel); - HRESULT (STDMETHODCALLTYPE * Compact) (ma_IDirectSound* pThis); - HRESULT (STDMETHODCALLTYPE * GetSpeakerConfig) (ma_IDirectSound* pThis, DWORD* pSpeakerConfig); - HRESULT (STDMETHODCALLTYPE * SetSpeakerConfig) (ma_IDirectSound* pThis, DWORD dwSpeakerConfig); - HRESULT (STDMETHODCALLTYPE * Initialize) (ma_IDirectSound* pThis, const GUID* pGuidDevice); -} ma_IDirectSoundVtbl; -struct ma_IDirectSound -{ - ma_IDirectSoundVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IDirectSound_QueryInterface(ma_IDirectSound* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IDirectSound_AddRef(ma_IDirectSound* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IDirectSound_Release(ma_IDirectSound* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IDirectSound_CreateSoundBuffer(ma_IDirectSound* pThis, const MA_DSBUFFERDESC* pDSBufferDesc, ma_IDirectSoundBuffer** ppDSBuffer, void* pUnkOuter) { return pThis->lpVtbl->CreateSoundBuffer(pThis, pDSBufferDesc, ppDSBuffer, pUnkOuter); } -static MA_INLINE HRESULT ma_IDirectSound_GetCaps(ma_IDirectSound* pThis, MA_DSCAPS* pDSCaps) { return pThis->lpVtbl->GetCaps(pThis, pDSCaps); } -static MA_INLINE HRESULT ma_IDirectSound_DuplicateSoundBuffer(ma_IDirectSound* pThis, ma_IDirectSoundBuffer* pDSBufferOriginal, ma_IDirectSoundBuffer** ppDSBufferDuplicate) { return pThis->lpVtbl->DuplicateSoundBuffer(pThis, pDSBufferOriginal, ppDSBufferDuplicate); } -static MA_INLINE HRESULT ma_IDirectSound_SetCooperativeLevel(ma_IDirectSound* pThis, HWND hwnd, DWORD dwLevel) { return pThis->lpVtbl->SetCooperativeLevel(pThis, hwnd, dwLevel); } -static MA_INLINE HRESULT ma_IDirectSound_Compact(ma_IDirectSound* pThis) { return pThis->lpVtbl->Compact(pThis); } -static MA_INLINE HRESULT ma_IDirectSound_GetSpeakerConfig(ma_IDirectSound* pThis, DWORD* pSpeakerConfig) { return pThis->lpVtbl->GetSpeakerConfig(pThis, pSpeakerConfig); } -static MA_INLINE HRESULT ma_IDirectSound_SetSpeakerConfig(ma_IDirectSound* pThis, DWORD dwSpeakerConfig) { return pThis->lpVtbl->SetSpeakerConfig(pThis, dwSpeakerConfig); } -static MA_INLINE HRESULT ma_IDirectSound_Initialize(ma_IDirectSound* pThis, const GUID* pGuidDevice) { return pThis->lpVtbl->Initialize(pThis, pGuidDevice); } - - -/* IDirectSoundBuffer */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundBuffer* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IDirectSoundBuffer* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IDirectSoundBuffer* pThis); - - /* IDirectSoundBuffer */ - HRESULT (STDMETHODCALLTYPE * GetCaps) (ma_IDirectSoundBuffer* pThis, MA_DSBCAPS* pDSBufferCaps); - HRESULT (STDMETHODCALLTYPE * GetCurrentPosition)(ma_IDirectSoundBuffer* pThis, DWORD* pCurrentPlayCursor, DWORD* pCurrentWriteCursor); - HRESULT (STDMETHODCALLTYPE * GetFormat) (ma_IDirectSoundBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten); - HRESULT (STDMETHODCALLTYPE * GetVolume) (ma_IDirectSoundBuffer* pThis, LONG* pVolume); - HRESULT (STDMETHODCALLTYPE * GetPan) (ma_IDirectSoundBuffer* pThis, LONG* pPan); - HRESULT (STDMETHODCALLTYPE * GetFrequency) (ma_IDirectSoundBuffer* pThis, DWORD* pFrequency); - HRESULT (STDMETHODCALLTYPE * GetStatus) (ma_IDirectSoundBuffer* pThis, DWORD* pStatus); - HRESULT (STDMETHODCALLTYPE * Initialize) (ma_IDirectSoundBuffer* pThis, ma_IDirectSound* pDirectSound, const MA_DSBUFFERDESC* pDSBufferDesc); - HRESULT (STDMETHODCALLTYPE * Lock) (ma_IDirectSoundBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags); - HRESULT (STDMETHODCALLTYPE * Play) (ma_IDirectSoundBuffer* pThis, DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags); - HRESULT (STDMETHODCALLTYPE * SetCurrentPosition)(ma_IDirectSoundBuffer* pThis, DWORD dwNewPosition); - HRESULT (STDMETHODCALLTYPE * SetFormat) (ma_IDirectSoundBuffer* pThis, const WAVEFORMATEX* pFormat); - HRESULT (STDMETHODCALLTYPE * SetVolume) (ma_IDirectSoundBuffer* pThis, LONG volume); - HRESULT (STDMETHODCALLTYPE * SetPan) (ma_IDirectSoundBuffer* pThis, LONG pan); - HRESULT (STDMETHODCALLTYPE * SetFrequency) (ma_IDirectSoundBuffer* pThis, DWORD dwFrequency); - HRESULT (STDMETHODCALLTYPE * Stop) (ma_IDirectSoundBuffer* pThis); - HRESULT (STDMETHODCALLTYPE * Unlock) (ma_IDirectSoundBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2); - HRESULT (STDMETHODCALLTYPE * Restore) (ma_IDirectSoundBuffer* pThis); -} ma_IDirectSoundBufferVtbl; -struct ma_IDirectSoundBuffer -{ - ma_IDirectSoundBufferVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IDirectSoundBuffer_QueryInterface(ma_IDirectSoundBuffer* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IDirectSoundBuffer_AddRef(ma_IDirectSoundBuffer* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IDirectSoundBuffer_Release(ma_IDirectSoundBuffer* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_GetCaps(ma_IDirectSoundBuffer* pThis, MA_DSBCAPS* pDSBufferCaps) { return pThis->lpVtbl->GetCaps(pThis, pDSBufferCaps); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_GetCurrentPosition(ma_IDirectSoundBuffer* pThis, DWORD* pCurrentPlayCursor, DWORD* pCurrentWriteCursor) { return pThis->lpVtbl->GetCurrentPosition(pThis, pCurrentPlayCursor, pCurrentWriteCursor); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_GetFormat(ma_IDirectSoundBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten) { return pThis->lpVtbl->GetFormat(pThis, pFormat, dwSizeAllocated, pSizeWritten); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_GetVolume(ma_IDirectSoundBuffer* pThis, LONG* pVolume) { return pThis->lpVtbl->GetVolume(pThis, pVolume); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_GetPan(ma_IDirectSoundBuffer* pThis, LONG* pPan) { return pThis->lpVtbl->GetPan(pThis, pPan); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_GetFrequency(ma_IDirectSoundBuffer* pThis, DWORD* pFrequency) { return pThis->lpVtbl->GetFrequency(pThis, pFrequency); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_GetStatus(ma_IDirectSoundBuffer* pThis, DWORD* pStatus) { return pThis->lpVtbl->GetStatus(pThis, pStatus); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_Initialize(ma_IDirectSoundBuffer* pThis, ma_IDirectSound* pDirectSound, const MA_DSBUFFERDESC* pDSBufferDesc) { return pThis->lpVtbl->Initialize(pThis, pDirectSound, pDSBufferDesc); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_Lock(ma_IDirectSoundBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags) { return pThis->lpVtbl->Lock(pThis, dwOffset, dwBytes, ppAudioPtr1, pAudioBytes1, ppAudioPtr2, pAudioBytes2, dwFlags); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_Play(ma_IDirectSoundBuffer* pThis, DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) { return pThis->lpVtbl->Play(pThis, dwReserved1, dwPriority, dwFlags); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_SetCurrentPosition(ma_IDirectSoundBuffer* pThis, DWORD dwNewPosition) { return pThis->lpVtbl->SetCurrentPosition(pThis, dwNewPosition); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_SetFormat(ma_IDirectSoundBuffer* pThis, const WAVEFORMATEX* pFormat) { return pThis->lpVtbl->SetFormat(pThis, pFormat); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_SetVolume(ma_IDirectSoundBuffer* pThis, LONG volume) { return pThis->lpVtbl->SetVolume(pThis, volume); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_SetPan(ma_IDirectSoundBuffer* pThis, LONG pan) { return pThis->lpVtbl->SetPan(pThis, pan); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_SetFrequency(ma_IDirectSoundBuffer* pThis, DWORD dwFrequency) { return pThis->lpVtbl->SetFrequency(pThis, dwFrequency); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_Stop(ma_IDirectSoundBuffer* pThis) { return pThis->lpVtbl->Stop(pThis); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_Unlock(ma_IDirectSoundBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2) { return pThis->lpVtbl->Unlock(pThis, pAudioPtr1, dwAudioBytes1, pAudioPtr2, dwAudioBytes2); } -static MA_INLINE HRESULT ma_IDirectSoundBuffer_Restore(ma_IDirectSoundBuffer* pThis) { return pThis->lpVtbl->Restore(pThis); } - - -/* IDirectSoundCapture */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundCapture* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IDirectSoundCapture* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IDirectSoundCapture* pThis); - - /* IDirectSoundCapture */ - HRESULT (STDMETHODCALLTYPE * CreateCaptureBuffer)(ma_IDirectSoundCapture* pThis, const MA_DSCBUFFERDESC* pDSCBufferDesc, ma_IDirectSoundCaptureBuffer** ppDSCBuffer, void* pUnkOuter); - HRESULT (STDMETHODCALLTYPE * GetCaps) (ma_IDirectSoundCapture* pThis, MA_DSCCAPS* pDSCCaps); - HRESULT (STDMETHODCALLTYPE * Initialize) (ma_IDirectSoundCapture* pThis, const GUID* pGuidDevice); -} ma_IDirectSoundCaptureVtbl; -struct ma_IDirectSoundCapture -{ - ma_IDirectSoundCaptureVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IDirectSoundCapture_QueryInterface (ma_IDirectSoundCapture* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IDirectSoundCapture_AddRef (ma_IDirectSoundCapture* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IDirectSoundCapture_Release (ma_IDirectSoundCapture* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IDirectSoundCapture_CreateCaptureBuffer(ma_IDirectSoundCapture* pThis, const MA_DSCBUFFERDESC* pDSCBufferDesc, ma_IDirectSoundCaptureBuffer** ppDSCBuffer, void* pUnkOuter) { return pThis->lpVtbl->CreateCaptureBuffer(pThis, pDSCBufferDesc, ppDSCBuffer, pUnkOuter); } -static MA_INLINE HRESULT ma_IDirectSoundCapture_GetCaps (ma_IDirectSoundCapture* pThis, MA_DSCCAPS* pDSCCaps) { return pThis->lpVtbl->GetCaps(pThis, pDSCCaps); } -static MA_INLINE HRESULT ma_IDirectSoundCapture_Initialize (ma_IDirectSoundCapture* pThis, const GUID* pGuidDevice) { return pThis->lpVtbl->Initialize(pThis, pGuidDevice); } - - -/* IDirectSoundCaptureBuffer */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundCaptureBuffer* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IDirectSoundCaptureBuffer* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IDirectSoundCaptureBuffer* pThis); - - /* IDirectSoundCaptureBuffer */ - HRESULT (STDMETHODCALLTYPE * GetCaps) (ma_IDirectSoundCaptureBuffer* pThis, MA_DSCBCAPS* pDSCBCaps); - HRESULT (STDMETHODCALLTYPE * GetCurrentPosition)(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pCapturePosition, DWORD* pReadPosition); - HRESULT (STDMETHODCALLTYPE * GetFormat) (ma_IDirectSoundCaptureBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten); - HRESULT (STDMETHODCALLTYPE * GetStatus) (ma_IDirectSoundCaptureBuffer* pThis, DWORD* pStatus); - HRESULT (STDMETHODCALLTYPE * Initialize) (ma_IDirectSoundCaptureBuffer* pThis, ma_IDirectSoundCapture* pDirectSoundCapture, const MA_DSCBUFFERDESC* pDSCBufferDesc); - HRESULT (STDMETHODCALLTYPE * Lock) (ma_IDirectSoundCaptureBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags); - HRESULT (STDMETHODCALLTYPE * Start) (ma_IDirectSoundCaptureBuffer* pThis, DWORD dwFlags); - HRESULT (STDMETHODCALLTYPE * Stop) (ma_IDirectSoundCaptureBuffer* pThis); - HRESULT (STDMETHODCALLTYPE * Unlock) (ma_IDirectSoundCaptureBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2); -} ma_IDirectSoundCaptureBufferVtbl; -struct ma_IDirectSoundCaptureBuffer -{ - ma_IDirectSoundCaptureBufferVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_QueryInterface(ma_IDirectSoundCaptureBuffer* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IDirectSoundCaptureBuffer_AddRef(ma_IDirectSoundCaptureBuffer* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IDirectSoundCaptureBuffer_Release(ma_IDirectSoundCaptureBuffer* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetCaps(ma_IDirectSoundCaptureBuffer* pThis, MA_DSCBCAPS* pDSCBCaps) { return pThis->lpVtbl->GetCaps(pThis, pDSCBCaps); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetCurrentPosition(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pCapturePosition, DWORD* pReadPosition) { return pThis->lpVtbl->GetCurrentPosition(pThis, pCapturePosition, pReadPosition); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetFormat(ma_IDirectSoundCaptureBuffer* pThis, WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten) { return pThis->lpVtbl->GetFormat(pThis, pFormat, dwSizeAllocated, pSizeWritten); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetStatus(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pStatus) { return pThis->lpVtbl->GetStatus(pThis, pStatus); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Initialize(ma_IDirectSoundCaptureBuffer* pThis, ma_IDirectSoundCapture* pDirectSoundCapture, const MA_DSCBUFFERDESC* pDSCBufferDesc) { return pThis->lpVtbl->Initialize(pThis, pDirectSoundCapture, pDSCBufferDesc); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Lock(ma_IDirectSoundCaptureBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags) { return pThis->lpVtbl->Lock(pThis, dwOffset, dwBytes, ppAudioPtr1, pAudioBytes1, ppAudioPtr2, pAudioBytes2, dwFlags); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Start(ma_IDirectSoundCaptureBuffer* pThis, DWORD dwFlags) { return pThis->lpVtbl->Start(pThis, dwFlags); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Stop(ma_IDirectSoundCaptureBuffer* pThis) { return pThis->lpVtbl->Stop(pThis); } -static MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Unlock(ma_IDirectSoundCaptureBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2) { return pThis->lpVtbl->Unlock(pThis, pAudioPtr1, dwAudioBytes1, pAudioPtr2, dwAudioBytes2); } - - -/* IDirectSoundNotify */ -typedef struct -{ - /* IUnknown */ - HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundNotify* pThis, const IID* const riid, void** ppObject); - ULONG (STDMETHODCALLTYPE * AddRef) (ma_IDirectSoundNotify* pThis); - ULONG (STDMETHODCALLTYPE * Release) (ma_IDirectSoundNotify* pThis); - - /* IDirectSoundNotify */ - HRESULT (STDMETHODCALLTYPE * SetNotificationPositions)(ma_IDirectSoundNotify* pThis, DWORD dwPositionNotifies, const MA_DSBPOSITIONNOTIFY* pPositionNotifies); -} ma_IDirectSoundNotifyVtbl; -struct ma_IDirectSoundNotify -{ - ma_IDirectSoundNotifyVtbl* lpVtbl; -}; -static MA_INLINE HRESULT ma_IDirectSoundNotify_QueryInterface(ma_IDirectSoundNotify* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); } -static MA_INLINE ULONG ma_IDirectSoundNotify_AddRef(ma_IDirectSoundNotify* pThis) { return pThis->lpVtbl->AddRef(pThis); } -static MA_INLINE ULONG ma_IDirectSoundNotify_Release(ma_IDirectSoundNotify* pThis) { return pThis->lpVtbl->Release(pThis); } -static MA_INLINE HRESULT ma_IDirectSoundNotify_SetNotificationPositions(ma_IDirectSoundNotify* pThis, DWORD dwPositionNotifies, const MA_DSBPOSITIONNOTIFY* pPositionNotifies) { return pThis->lpVtbl->SetNotificationPositions(pThis, dwPositionNotifies, pPositionNotifies); } - - -typedef BOOL (CALLBACK * ma_DSEnumCallbackAProc) (LPGUID pDeviceGUID, LPCSTR pDeviceDescription, LPCSTR pModule, LPVOID pContext); -typedef HRESULT (WINAPI * ma_DirectSoundCreateProc) (const GUID* pcGuidDevice, ma_IDirectSound** ppDS8, LPUNKNOWN pUnkOuter); -typedef HRESULT (WINAPI * ma_DirectSoundEnumerateAProc) (ma_DSEnumCallbackAProc pDSEnumCallback, LPVOID pContext); -typedef HRESULT (WINAPI * ma_DirectSoundCaptureCreateProc) (const GUID* pcGuidDevice, ma_IDirectSoundCapture** ppDSC8, LPUNKNOWN pUnkOuter); -typedef HRESULT (WINAPI * ma_DirectSoundCaptureEnumerateAProc)(ma_DSEnumCallbackAProc pDSEnumCallback, LPVOID pContext); - -static ma_uint32 ma_get_best_sample_rate_within_range(ma_uint32 sampleRateMin, ma_uint32 sampleRateMax) -{ - /* Normalize the range in case we were given something stupid. */ - if (sampleRateMin < (ma_uint32)ma_standard_sample_rate_min) { - sampleRateMin = (ma_uint32)ma_standard_sample_rate_min; - } - if (sampleRateMax > (ma_uint32)ma_standard_sample_rate_max) { - sampleRateMax = (ma_uint32)ma_standard_sample_rate_max; - } - if (sampleRateMin > sampleRateMax) { - sampleRateMin = sampleRateMax; - } - - if (sampleRateMin == sampleRateMax) { - return sampleRateMax; - } else { - size_t iStandardRate; - for (iStandardRate = 0; iStandardRate < ma_countof(g_maStandardSampleRatePriorities); ++iStandardRate) { - ma_uint32 standardRate = g_maStandardSampleRatePriorities[iStandardRate]; - if (standardRate >= sampleRateMin && standardRate <= sampleRateMax) { - return standardRate; - } - } - } - - /* Should never get here. */ - MA_ASSERT(MA_FALSE); - return 0; -} - -/* -Retrieves the channel count and channel map for the given speaker configuration. If the speaker configuration is unknown, -the channel count and channel map will be left unmodified. -*/ -static void ma_get_channels_from_speaker_config__dsound(DWORD speakerConfig, WORD* pChannelsOut, DWORD* pChannelMapOut) -{ - WORD channels; - DWORD channelMap; - - channels = 0; - if (pChannelsOut != NULL) { - channels = *pChannelsOut; - } - - channelMap = 0; - if (pChannelMapOut != NULL) { - channelMap = *pChannelMapOut; - } - - /* - The speaker configuration is a combination of speaker config and speaker geometry. The lower 8 bits is what we care about. The upper - 16 bits is for the geometry. - */ - switch ((BYTE)(speakerConfig)) { - case 1 /*DSSPEAKER_HEADPHONE*/: channels = 2; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; break; - case 2 /*DSSPEAKER_MONO*/: channels = 1; channelMap = SPEAKER_FRONT_CENTER; break; - case 3 /*DSSPEAKER_QUAD*/: channels = 4; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break; - case 4 /*DSSPEAKER_STEREO*/: channels = 2; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; break; - case 5 /*DSSPEAKER_SURROUND*/: channels = 4; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER; break; - case 6 /*DSSPEAKER_5POINT1_BACK*/ /*DSSPEAKER_5POINT1*/: channels = 6; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break; - case 7 /*DSSPEAKER_7POINT1_WIDE*/ /*DSSPEAKER_7POINT1*/: channels = 8; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER; break; - case 8 /*DSSPEAKER_7POINT1_SURROUND*/: channels = 8; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; break; - case 9 /*DSSPEAKER_5POINT1_SURROUND*/: channels = 6; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; break; - default: break; - } - - if (pChannelsOut != NULL) { - *pChannelsOut = channels; - } - - if (pChannelMapOut != NULL) { - *pChannelMapOut = channelMap; - } -} - - -static ma_result ma_context_create_IDirectSound__dsound(ma_context* pContext, ma_share_mode shareMode, const ma_device_id* pDeviceID, ma_IDirectSound** ppDirectSound) -{ - ma_IDirectSound* pDirectSound; - HWND hWnd; - HRESULT hr; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppDirectSound != NULL); - - *ppDirectSound = NULL; - pDirectSound = NULL; - - if (FAILED(((ma_DirectSoundCreateProc)pContext->dsound.DirectSoundCreate)((pDeviceID == NULL) ? NULL : (const GUID*)pDeviceID->dsound, &pDirectSound, NULL))) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[DirectSound] DirectSoundCreate() failed for playback device."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - /* The cooperative level must be set before doing anything else. */ - hWnd = ((MA_PFN_GetForegroundWindow)pContext->win32.GetForegroundWindow)(); - if (hWnd == NULL) { - hWnd = ((MA_PFN_GetDesktopWindow)pContext->win32.GetDesktopWindow)(); - } - - hr = ma_IDirectSound_SetCooperativeLevel(pDirectSound, hWnd, (shareMode == ma_share_mode_exclusive) ? MA_DSSCL_EXCLUSIVE : MA_DSSCL_PRIORITY); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSound_SetCooperateiveLevel() failed for playback device."); - return ma_result_from_HRESULT(hr); - } - - *ppDirectSound = pDirectSound; - return MA_SUCCESS; -} - -static ma_result ma_context_create_IDirectSoundCapture__dsound(ma_context* pContext, ma_share_mode shareMode, const ma_device_id* pDeviceID, ma_IDirectSoundCapture** ppDirectSoundCapture) -{ - ma_IDirectSoundCapture* pDirectSoundCapture; - HRESULT hr; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppDirectSoundCapture != NULL); - - /* DirectSound does not support exclusive mode for capture. */ - if (shareMode == ma_share_mode_exclusive) { - return MA_SHARE_MODE_NOT_SUPPORTED; - } - - *ppDirectSoundCapture = NULL; - pDirectSoundCapture = NULL; - - hr = ((ma_DirectSoundCaptureCreateProc)pContext->dsound.DirectSoundCaptureCreate)((pDeviceID == NULL) ? NULL : (const GUID*)pDeviceID->dsound, &pDirectSoundCapture, NULL); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[DirectSound] DirectSoundCaptureCreate() failed for capture device."); - return ma_result_from_HRESULT(hr); - } - - *ppDirectSoundCapture = pDirectSoundCapture; - return MA_SUCCESS; -} - -static ma_result ma_context_get_format_info_for_IDirectSoundCapture__dsound(ma_context* pContext, ma_IDirectSoundCapture* pDirectSoundCapture, WORD* pChannels, WORD* pBitsPerSample, DWORD* pSampleRate) -{ - HRESULT hr; - MA_DSCCAPS caps; - WORD bitsPerSample; - DWORD sampleRate; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDirectSoundCapture != NULL); - - if (pChannels) { - *pChannels = 0; - } - if (pBitsPerSample) { - *pBitsPerSample = 0; - } - if (pSampleRate) { - *pSampleRate = 0; - } - - MA_ZERO_OBJECT(&caps); - caps.dwSize = sizeof(caps); - hr = ma_IDirectSoundCapture_GetCaps(pDirectSoundCapture, &caps); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundCapture_GetCaps() failed for capture device."); - return ma_result_from_HRESULT(hr); - } - - if (pChannels) { - *pChannels = (WORD)caps.dwChannels; - } - - /* The device can support multiple formats. We just go through the different formats in order of priority and pick the first one. This the same type of system as the WinMM backend. */ - bitsPerSample = 16; - sampleRate = 48000; - - if (caps.dwChannels == 1) { - if ((caps.dwFormats & WAVE_FORMAT_48M16) != 0) { - sampleRate = 48000; - } else if ((caps.dwFormats & WAVE_FORMAT_44M16) != 0) { - sampleRate = 44100; - } else if ((caps.dwFormats & WAVE_FORMAT_2M16) != 0) { - sampleRate = 22050; - } else if ((caps.dwFormats & WAVE_FORMAT_1M16) != 0) { - sampleRate = 11025; - } else if ((caps.dwFormats & WAVE_FORMAT_96M16) != 0) { - sampleRate = 96000; - } else { - bitsPerSample = 8; - if ((caps.dwFormats & WAVE_FORMAT_48M08) != 0) { - sampleRate = 48000; - } else if ((caps.dwFormats & WAVE_FORMAT_44M08) != 0) { - sampleRate = 44100; - } else if ((caps.dwFormats & WAVE_FORMAT_2M08) != 0) { - sampleRate = 22050; - } else if ((caps.dwFormats & WAVE_FORMAT_1M08) != 0) { - sampleRate = 11025; - } else if ((caps.dwFormats & WAVE_FORMAT_96M08) != 0) { - sampleRate = 96000; - } else { - bitsPerSample = 16; /* Didn't find it. Just fall back to 16-bit. */ - } - } - } else if (caps.dwChannels == 2) { - if ((caps.dwFormats & WAVE_FORMAT_48S16) != 0) { - sampleRate = 48000; - } else if ((caps.dwFormats & WAVE_FORMAT_44S16) != 0) { - sampleRate = 44100; - } else if ((caps.dwFormats & WAVE_FORMAT_2S16) != 0) { - sampleRate = 22050; - } else if ((caps.dwFormats & WAVE_FORMAT_1S16) != 0) { - sampleRate = 11025; - } else if ((caps.dwFormats & WAVE_FORMAT_96S16) != 0) { - sampleRate = 96000; - } else { - bitsPerSample = 8; - if ((caps.dwFormats & WAVE_FORMAT_48S08) != 0) { - sampleRate = 48000; - } else if ((caps.dwFormats & WAVE_FORMAT_44S08) != 0) { - sampleRate = 44100; - } else if ((caps.dwFormats & WAVE_FORMAT_2S08) != 0) { - sampleRate = 22050; - } else if ((caps.dwFormats & WAVE_FORMAT_1S08) != 0) { - sampleRate = 11025; - } else if ((caps.dwFormats & WAVE_FORMAT_96S08) != 0) { - sampleRate = 96000; - } else { - bitsPerSample = 16; /* Didn't find it. Just fall back to 16-bit. */ - } - } - } - - if (pBitsPerSample) { - *pBitsPerSample = bitsPerSample; - } - if (pSampleRate) { - *pSampleRate = sampleRate; - } - - return MA_SUCCESS; -} - - -typedef struct -{ - ma_context* pContext; - ma_device_type deviceType; - ma_enum_devices_callback_proc callback; - void* pUserData; - ma_bool32 terminated; -} ma_context_enumerate_devices_callback_data__dsound; - -static BOOL CALLBACK ma_context_enumerate_devices_callback__dsound(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) -{ - ma_context_enumerate_devices_callback_data__dsound* pData = (ma_context_enumerate_devices_callback_data__dsound*)lpContext; - ma_device_info deviceInfo; - - (void)lpcstrModule; - - MA_ZERO_OBJECT(&deviceInfo); - - /* ID. */ - if (lpGuid != NULL) { - MA_COPY_MEMORY(deviceInfo.id.dsound, lpGuid, 16); - } else { - MA_ZERO_MEMORY(deviceInfo.id.dsound, 16); - deviceInfo.isDefault = MA_TRUE; - } - - /* Name / Description */ - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), lpcstrDescription, (size_t)-1); - - - /* Call the callback function, but make sure we stop enumerating if the callee requested so. */ - MA_ASSERT(pData != NULL); - pData->terminated = !pData->callback(pData->pContext, pData->deviceType, &deviceInfo, pData->pUserData); - if (pData->terminated) { - return FALSE; /* Stop enumeration. */ - } else { - return TRUE; /* Continue enumeration. */ - } -} - -static ma_result ma_context_enumerate_devices__dsound(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_context_enumerate_devices_callback_data__dsound data; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - data.pContext = pContext; - data.callback = callback; - data.pUserData = pUserData; - data.terminated = MA_FALSE; - - /* Playback. */ - if (!data.terminated) { - data.deviceType = ma_device_type_playback; - ((ma_DirectSoundEnumerateAProc)pContext->dsound.DirectSoundEnumerateA)(ma_context_enumerate_devices_callback__dsound, &data); - } - - /* Capture. */ - if (!data.terminated) { - data.deviceType = ma_device_type_capture; - ((ma_DirectSoundCaptureEnumerateAProc)pContext->dsound.DirectSoundCaptureEnumerateA)(ma_context_enumerate_devices_callback__dsound, &data); - } - - return MA_SUCCESS; -} - - -typedef struct -{ - const ma_device_id* pDeviceID; - ma_device_info* pDeviceInfo; - ma_bool32 found; -} ma_context_get_device_info_callback_data__dsound; - -static BOOL CALLBACK ma_context_get_device_info_callback__dsound(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) -{ - ma_context_get_device_info_callback_data__dsound* pData = (ma_context_get_device_info_callback_data__dsound*)lpContext; - MA_ASSERT(pData != NULL); - - if ((pData->pDeviceID == NULL || ma_is_guid_null(pData->pDeviceID->dsound)) && (lpGuid == NULL || ma_is_guid_null(lpGuid))) { - /* Default device. */ - ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1); - pData->pDeviceInfo->isDefault = MA_TRUE; - pData->found = MA_TRUE; - return FALSE; /* Stop enumeration. */ - } else { - /* Not the default device. */ - if (lpGuid != NULL && pData->pDeviceID != NULL) { - if (memcmp(pData->pDeviceID->dsound, lpGuid, sizeof(pData->pDeviceID->dsound)) == 0) { - ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1); - pData->found = MA_TRUE; - return FALSE; /* Stop enumeration. */ - } - } - } - - (void)lpcstrModule; - return TRUE; -} - -static ma_result ma_context_get_device_info__dsound(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_result result; - HRESULT hr; - - if (pDeviceID != NULL) { - ma_context_get_device_info_callback_data__dsound data; - - /* ID. */ - MA_COPY_MEMORY(pDeviceInfo->id.dsound, pDeviceID->dsound, 16); - - /* Name / Description. This is retrieved by enumerating over each device until we find that one that matches the input ID. */ - data.pDeviceID = pDeviceID; - data.pDeviceInfo = pDeviceInfo; - data.found = MA_FALSE; - if (deviceType == ma_device_type_playback) { - ((ma_DirectSoundEnumerateAProc)pContext->dsound.DirectSoundEnumerateA)(ma_context_get_device_info_callback__dsound, &data); - } else { - ((ma_DirectSoundCaptureEnumerateAProc)pContext->dsound.DirectSoundCaptureEnumerateA)(ma_context_get_device_info_callback__dsound, &data); - } - - if (!data.found) { - return MA_NO_DEVICE; - } - } else { - /* I don't think there's a way to get the name of the default device with DirectSound. In this case we just need to use defaults. */ - - /* ID */ - MA_ZERO_MEMORY(pDeviceInfo->id.dsound, 16); - - /* Name / Description */ - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - - pDeviceInfo->isDefault = MA_TRUE; - } - - /* Retrieving detailed information is slightly different depending on the device type. */ - if (deviceType == ma_device_type_playback) { - /* Playback. */ - ma_IDirectSound* pDirectSound; - MA_DSCAPS caps; - WORD channels; - - result = ma_context_create_IDirectSound__dsound(pContext, ma_share_mode_shared, pDeviceID, &pDirectSound); - if (result != MA_SUCCESS) { - return result; - } - - MA_ZERO_OBJECT(&caps); - caps.dwSize = sizeof(caps); - hr = ma_IDirectSound_GetCaps(pDirectSound, &caps); - if (FAILED(hr)) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSound_GetCaps() failed for playback device."); - return ma_result_from_HRESULT(hr); - } - - - /* Channels. Only a single channel count is reported for DirectSound. */ - if ((caps.dwFlags & MA_DSCAPS_PRIMARYSTEREO) != 0) { - /* It supports at least stereo, but could support more. */ - DWORD speakerConfig; - - channels = 2; - - /* Look at the speaker configuration to get a better idea on the channel count. */ - hr = ma_IDirectSound_GetSpeakerConfig(pDirectSound, &speakerConfig); - if (SUCCEEDED(hr)) { - ma_get_channels_from_speaker_config__dsound(speakerConfig, &channels, NULL); - } - } else { - /* It does not support stereo, which means we are stuck with mono. */ - channels = 1; - } - - - /* - In DirectSound, our native formats are centered around sample rates. All formats are supported, and we're only reporting a single channel - count. However, DirectSound can report a range of supported sample rates. We're only going to include standard rates known by miniaudio - in order to keep the size of this within reason. - */ - if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) { - /* Multiple sample rates are supported. We'll report in order of our preferred sample rates. */ - size_t iStandardSampleRate; - for (iStandardSampleRate = 0; iStandardSampleRate < ma_countof(g_maStandardSampleRatePriorities); iStandardSampleRate += 1) { - ma_uint32 sampleRate = g_maStandardSampleRatePriorities[iStandardSampleRate]; - if (sampleRate >= caps.dwMinSecondarySampleRate && sampleRate <= caps.dwMaxSecondarySampleRate) { - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = ma_format_unknown; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels = channels; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = 0; - pDeviceInfo->nativeDataFormatCount += 1; - } - } - } else { - /* Only a single sample rate is supported. */ - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = ma_format_unknown; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels = channels; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = caps.dwMaxSecondarySampleRate; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = 0; - pDeviceInfo->nativeDataFormatCount += 1; - } - - ma_IDirectSound_Release(pDirectSound); - } else { - /* - Capture. This is a little different to playback due to the say the supported formats are reported. Technically capture - devices can support a number of different formats, but for simplicity and consistency with ma_device_init() I'm just - reporting the best format. - */ - ma_IDirectSoundCapture* pDirectSoundCapture; - WORD channels; - WORD bitsPerSample; - DWORD sampleRate; - - result = ma_context_create_IDirectSoundCapture__dsound(pContext, ma_share_mode_shared, pDeviceID, &pDirectSoundCapture); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_context_get_format_info_for_IDirectSoundCapture__dsound(pContext, pDirectSoundCapture, &channels, &bitsPerSample, &sampleRate); - if (result != MA_SUCCESS) { - ma_IDirectSoundCapture_Release(pDirectSoundCapture); - return result; - } - - ma_IDirectSoundCapture_Release(pDirectSoundCapture); - - /* The format is always an integer format and is based on the bits per sample. */ - if (bitsPerSample == 8) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_u8; - } else if (bitsPerSample == 16) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_s16; - } else if (bitsPerSample == 24) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_s24; - } else if (bitsPerSample == 32) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_s32; - } else { - return MA_FORMAT_NOT_SUPPORTED; - } - - pDeviceInfo->nativeDataFormats[0].channels = channels; - pDeviceInfo->nativeDataFormats[0].sampleRate = sampleRate; - pDeviceInfo->nativeDataFormats[0].flags = 0; - pDeviceInfo->nativeDataFormatCount = 1; - } - - return MA_SUCCESS; -} - - - -static ma_result ma_device_uninit__dsound(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->dsound.pCaptureBuffer != NULL) { - ma_IDirectSoundCaptureBuffer_Release((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer); - } - if (pDevice->dsound.pCapture != NULL) { - ma_IDirectSoundCapture_Release((ma_IDirectSoundCapture*)pDevice->dsound.pCapture); - } - - if (pDevice->dsound.pPlaybackBuffer != NULL) { - ma_IDirectSoundBuffer_Release((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer); - } - if (pDevice->dsound.pPlaybackPrimaryBuffer != NULL) { - ma_IDirectSoundBuffer_Release((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer); - } - if (pDevice->dsound.pPlayback != NULL) { - ma_IDirectSound_Release((ma_IDirectSound*)pDevice->dsound.pPlayback); - } - - return MA_SUCCESS; -} - -static ma_result ma_config_to_WAVEFORMATEXTENSIBLE(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const ma_channel* pChannelMap, WAVEFORMATEXTENSIBLE* pWF) -{ - GUID subformat; - - if (format == ma_format_unknown) { - format = MA_DEFAULT_FORMAT; - } - - if (channels == 0) { - channels = MA_DEFAULT_CHANNELS; - } - - if (sampleRate == 0) { - sampleRate = MA_DEFAULT_SAMPLE_RATE; - } - - switch (format) - { - case ma_format_u8: - case ma_format_s16: - case ma_format_s24: - /*case ma_format_s24_32:*/ - case ma_format_s32: - { - subformat = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM; - } break; - - case ma_format_f32: - { - subformat = MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - } break; - - default: - return MA_FORMAT_NOT_SUPPORTED; - } - - MA_ZERO_OBJECT(pWF); - pWF->Format.cbSize = sizeof(*pWF); - pWF->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - pWF->Format.nChannels = (WORD)channels; - pWF->Format.nSamplesPerSec = (DWORD)sampleRate; - pWF->Format.wBitsPerSample = (WORD)(ma_get_bytes_per_sample(format)*8); - pWF->Format.nBlockAlign = (WORD)(pWF->Format.nChannels * pWF->Format.wBitsPerSample / 8); - pWF->Format.nAvgBytesPerSec = pWF->Format.nBlockAlign * pWF->Format.nSamplesPerSec; - pWF->Samples.wValidBitsPerSample = pWF->Format.wBitsPerSample; - pWF->dwChannelMask = ma_channel_map_to_channel_mask__win32(pChannelMap, channels); - pWF->SubFormat = subformat; - - return MA_SUCCESS; -} - -static ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__dsound(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile) -{ - /* - DirectSound has a minimum period size of 20ms. In practice, this doesn't seem to be enough for - reliable glitch-free processing so going to use 30ms instead. - */ - ma_uint32 minPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(30, nativeSampleRate); - ma_uint32 periodSizeInFrames; - - periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, nativeSampleRate, performanceProfile); - if (periodSizeInFrames < minPeriodSizeInFrames) { - periodSizeInFrames = minPeriodSizeInFrames; - } - - return periodSizeInFrames; -} - -static ma_result ma_device_init__dsound(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - ma_result result; - HRESULT hr; - - MA_ASSERT(pDevice != NULL); - - MA_ZERO_OBJECT(&pDevice->dsound); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* - Unfortunately DirectSound uses different APIs and data structures for playback and catpure devices. We need to initialize - the capture device first because we'll want to match it's buffer size and period count on the playback side if we're using - full-duplex mode. - */ - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - WAVEFORMATEXTENSIBLE wf; - MA_DSCBUFFERDESC descDS; - ma_uint32 periodSizeInFrames; - ma_uint32 periodCount; - char rawdata[1024]; /* <-- Ugly hack to avoid a malloc() due to a crappy DirectSound API. */ - WAVEFORMATEXTENSIBLE* pActualFormat; - - result = ma_config_to_WAVEFORMATEXTENSIBLE(pDescriptorCapture->format, pDescriptorCapture->channels, pDescriptorCapture->sampleRate, pDescriptorCapture->channelMap, &wf); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_context_create_IDirectSoundCapture__dsound(pDevice->pContext, pDescriptorCapture->shareMode, pDescriptorCapture->pDeviceID, (ma_IDirectSoundCapture**)&pDevice->dsound.pCapture); - if (result != MA_SUCCESS) { - ma_device_uninit__dsound(pDevice); - return result; - } - - result = ma_context_get_format_info_for_IDirectSoundCapture__dsound(pDevice->pContext, (ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &wf.Format.nChannels, &wf.Format.wBitsPerSample, &wf.Format.nSamplesPerSec); - if (result != MA_SUCCESS) { - ma_device_uninit__dsound(pDevice); - return result; - } - - wf.Format.nBlockAlign = (WORD)(wf.Format.nChannels * wf.Format.wBitsPerSample / 8); - wf.Format.nAvgBytesPerSec = wf.Format.nBlockAlign * wf.Format.nSamplesPerSec; - wf.Samples.wValidBitsPerSample = wf.Format.wBitsPerSample; - wf.SubFormat = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM; - - /* The size of the buffer must be a clean multiple of the period count. */ - periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__dsound(pDescriptorCapture, wf.Format.nSamplesPerSec, pConfig->performanceProfile); - periodCount = (pDescriptorCapture->periodCount > 0) ? pDescriptorCapture->periodCount : MA_DEFAULT_PERIODS; - - MA_ZERO_OBJECT(&descDS); - descDS.dwSize = sizeof(descDS); - descDS.dwFlags = 0; - descDS.dwBufferBytes = periodSizeInFrames * periodCount * wf.Format.nBlockAlign; - descDS.lpwfxFormat = (WAVEFORMATEX*)&wf; - hr = ma_IDirectSoundCapture_CreateCaptureBuffer((ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &descDS, (ma_IDirectSoundCaptureBuffer**)&pDevice->dsound.pCaptureBuffer, NULL); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundCapture_CreateCaptureBuffer() failed for capture device."); - return ma_result_from_HRESULT(hr); - } - - /* Get the _actual_ properties of the buffer. */ - pActualFormat = (WAVEFORMATEXTENSIBLE*)rawdata; - hr = ma_IDirectSoundCaptureBuffer_GetFormat((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, (WAVEFORMATEX*)pActualFormat, sizeof(rawdata), NULL); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to retrieve the actual format of the capture device's buffer."); - return ma_result_from_HRESULT(hr); - } - - /* We can now start setting the output data formats. */ - pDescriptorCapture->format = ma_format_from_WAVEFORMATEX((WAVEFORMATEX*)pActualFormat); - pDescriptorCapture->channels = pActualFormat->Format.nChannels; - pDescriptorCapture->sampleRate = pActualFormat->Format.nSamplesPerSec; - - /* Get the native channel map based on the channel mask. */ - if (pActualFormat->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE) { - ma_channel_mask_to_channel_map__win32(pActualFormat->dwChannelMask, pDescriptorCapture->channels, pDescriptorCapture->channelMap); - } else { - ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pDescriptorCapture->channels, pDescriptorCapture->channelMap); - } - - /* - After getting the actual format the size of the buffer in frames may have actually changed. However, we want this to be as close to what the - user has asked for as possible, so let's go ahead and release the old capture buffer and create a new one in this case. - */ - if (periodSizeInFrames != (descDS.dwBufferBytes / ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) / periodCount)) { - descDS.dwBufferBytes = periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) * periodCount; - ma_IDirectSoundCaptureBuffer_Release((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer); - - hr = ma_IDirectSoundCapture_CreateCaptureBuffer((ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &descDS, (ma_IDirectSoundCaptureBuffer**)&pDevice->dsound.pCaptureBuffer, NULL); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Second attempt at IDirectSoundCapture_CreateCaptureBuffer() failed for capture device."); - return ma_result_from_HRESULT(hr); - } - } - - /* DirectSound should give us a buffer exactly the size we asked for. */ - pDescriptorCapture->periodSizeInFrames = periodSizeInFrames; - pDescriptorCapture->periodCount = periodCount; - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - WAVEFORMATEXTENSIBLE wf; - MA_DSBUFFERDESC descDSPrimary; - MA_DSCAPS caps; - char rawdata[1024]; /* <-- Ugly hack to avoid a malloc() due to a crappy DirectSound API. */ - WAVEFORMATEXTENSIBLE* pActualFormat; - ma_uint32 periodSizeInFrames; - ma_uint32 periodCount; - MA_DSBUFFERDESC descDS; - - result = ma_config_to_WAVEFORMATEXTENSIBLE(pDescriptorPlayback->format, pDescriptorPlayback->channels, pDescriptorPlayback->sampleRate, pDescriptorPlayback->channelMap, &wf); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_context_create_IDirectSound__dsound(pDevice->pContext, pDescriptorPlayback->shareMode, pDescriptorPlayback->pDeviceID, (ma_IDirectSound**)&pDevice->dsound.pPlayback); - if (result != MA_SUCCESS) { - ma_device_uninit__dsound(pDevice); - return result; - } - - MA_ZERO_OBJECT(&descDSPrimary); - descDSPrimary.dwSize = sizeof(MA_DSBUFFERDESC); - descDSPrimary.dwFlags = MA_DSBCAPS_PRIMARYBUFFER | MA_DSBCAPS_CTRLVOLUME; - hr = ma_IDirectSound_CreateSoundBuffer((ma_IDirectSound*)pDevice->dsound.pPlayback, &descDSPrimary, (ma_IDirectSoundBuffer**)&pDevice->dsound.pPlaybackPrimaryBuffer, NULL); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSound_CreateSoundBuffer() failed for playback device's primary buffer."); - return ma_result_from_HRESULT(hr); - } - - - /* We may want to make some adjustments to the format if we are using defaults. */ - MA_ZERO_OBJECT(&caps); - caps.dwSize = sizeof(caps); - hr = ma_IDirectSound_GetCaps((ma_IDirectSound*)pDevice->dsound.pPlayback, &caps); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSound_GetCaps() failed for playback device."); - return ma_result_from_HRESULT(hr); - } - - if (pDescriptorPlayback->channels == 0) { - if ((caps.dwFlags & MA_DSCAPS_PRIMARYSTEREO) != 0) { - DWORD speakerConfig; - - /* It supports at least stereo, but could support more. */ - wf.Format.nChannels = 2; - - /* Look at the speaker configuration to get a better idea on the channel count. */ - if (SUCCEEDED(ma_IDirectSound_GetSpeakerConfig((ma_IDirectSound*)pDevice->dsound.pPlayback, &speakerConfig))) { - ma_get_channels_from_speaker_config__dsound(speakerConfig, &wf.Format.nChannels, &wf.dwChannelMask); - } - } else { - /* It does not support stereo, which means we are stuck with mono. */ - wf.Format.nChannels = 1; - } - } - - if (pDescriptorPlayback->sampleRate == 0) { - /* We base the sample rate on the values returned by GetCaps(). */ - if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) { - wf.Format.nSamplesPerSec = ma_get_best_sample_rate_within_range(caps.dwMinSecondarySampleRate, caps.dwMaxSecondarySampleRate); - } else { - wf.Format.nSamplesPerSec = caps.dwMaxSecondarySampleRate; - } - } - - wf.Format.nBlockAlign = (WORD)(wf.Format.nChannels * wf.Format.wBitsPerSample / 8); - wf.Format.nAvgBytesPerSec = wf.Format.nBlockAlign * wf.Format.nSamplesPerSec; - - /* - From MSDN: - - The method succeeds even if the hardware does not support the requested format; DirectSound sets the buffer to the closest - supported format. To determine whether this has happened, an application can call the GetFormat method for the primary buffer - and compare the result with the format that was requested with the SetFormat method. - */ - hr = ma_IDirectSoundBuffer_SetFormat((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer, (WAVEFORMATEX*)&wf); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to set format of playback device's primary buffer."); - return ma_result_from_HRESULT(hr); - } - - /* Get the _actual_ properties of the buffer. */ - pActualFormat = (WAVEFORMATEXTENSIBLE*)rawdata; - hr = ma_IDirectSoundBuffer_GetFormat((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer, (WAVEFORMATEX*)pActualFormat, sizeof(rawdata), NULL); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to retrieve the actual format of the playback device's primary buffer."); - return ma_result_from_HRESULT(hr); - } - - /* We now have enough information to start setting some output properties. */ - pDescriptorPlayback->format = ma_format_from_WAVEFORMATEX((WAVEFORMATEX*)pActualFormat); - pDescriptorPlayback->channels = pActualFormat->Format.nChannels; - pDescriptorPlayback->sampleRate = pActualFormat->Format.nSamplesPerSec; - - /* Get the internal channel map based on the channel mask. */ - if (pActualFormat->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE) { - ma_channel_mask_to_channel_map__win32(pActualFormat->dwChannelMask, pDescriptorPlayback->channels, pDescriptorPlayback->channelMap); - } else { - ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pDescriptorPlayback->channels, pDescriptorPlayback->channelMap); - } - - /* The size of the buffer must be a clean multiple of the period count. */ - periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__dsound(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile); - periodCount = (pDescriptorPlayback->periodCount > 0) ? pDescriptorPlayback->periodCount : MA_DEFAULT_PERIODS; - - /* - Meaning of dwFlags (from MSDN): - - DSBCAPS_CTRLPOSITIONNOTIFY - The buffer has position notification capability. - - DSBCAPS_GLOBALFOCUS - With this flag set, an application using DirectSound can continue to play its buffers if the user switches focus to - another application, even if the new application uses DirectSound. - - DSBCAPS_GETCURRENTPOSITION2 - In the first version of DirectSound, the play cursor was significantly ahead of the actual playing sound on emulated - sound cards; it was directly behind the write cursor. Now, if the DSBCAPS_GETCURRENTPOSITION2 flag is specified, the - application can get a more accurate play cursor. - */ - MA_ZERO_OBJECT(&descDS); - descDS.dwSize = sizeof(descDS); - descDS.dwFlags = MA_DSBCAPS_CTRLPOSITIONNOTIFY | MA_DSBCAPS_GLOBALFOCUS | MA_DSBCAPS_GETCURRENTPOSITION2; - descDS.dwBufferBytes = periodSizeInFrames * periodCount * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels); - descDS.lpwfxFormat = (WAVEFORMATEX*)&wf; - hr = ma_IDirectSound_CreateSoundBuffer((ma_IDirectSound*)pDevice->dsound.pPlayback, &descDS, (ma_IDirectSoundBuffer**)&pDevice->dsound.pPlaybackBuffer, NULL); - if (FAILED(hr)) { - ma_device_uninit__dsound(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSound_CreateSoundBuffer() failed for playback device's secondary buffer."); - return ma_result_from_HRESULT(hr); - } - - /* DirectSound should give us a buffer exactly the size we asked for. */ - pDescriptorPlayback->periodSizeInFrames = periodSizeInFrames; - pDescriptorPlayback->periodCount = periodCount; - } - - return MA_SUCCESS; -} - - -static ma_result ma_device_data_loop__dsound(ma_device* pDevice) -{ - ma_result result = MA_SUCCESS; - ma_uint32 bpfDeviceCapture = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - ma_uint32 bpfDevicePlayback = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - HRESULT hr; - DWORD lockOffsetInBytesCapture; - DWORD lockSizeInBytesCapture; - DWORD mappedSizeInBytesCapture; - DWORD mappedDeviceFramesProcessedCapture; - void* pMappedDeviceBufferCapture; - DWORD lockOffsetInBytesPlayback; - DWORD lockSizeInBytesPlayback; - DWORD mappedSizeInBytesPlayback; - void* pMappedDeviceBufferPlayback; - DWORD prevReadCursorInBytesCapture = 0; - DWORD prevPlayCursorInBytesPlayback = 0; - ma_bool32 physicalPlayCursorLoopFlagPlayback = 0; - DWORD virtualWriteCursorInBytesPlayback = 0; - ma_bool32 virtualWriteCursorLoopFlagPlayback = 0; - ma_bool32 isPlaybackDeviceStarted = MA_FALSE; - ma_uint32 framesWrittenToPlaybackDevice = 0; /* For knowing whether or not the playback device needs to be started. */ - ma_uint32 waitTimeInMilliseconds = 1; - - MA_ASSERT(pDevice != NULL); - - /* The first thing to do is start the capture device. The playback device is only started after the first period is written. */ - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - hr = ma_IDirectSoundCaptureBuffer_Start((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, MA_DSCBSTART_LOOPING); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundCaptureBuffer_Start() failed."); - return ma_result_from_HRESULT(hr); - } - } - - while (ma_device_get_state(pDevice) == ma_device_state_started) { - switch (pDevice->type) - { - case ma_device_type_duplex: - { - DWORD physicalCaptureCursorInBytes; - DWORD physicalReadCursorInBytes; - hr = ma_IDirectSoundCaptureBuffer_GetCurrentPosition((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, &physicalCaptureCursorInBytes, &physicalReadCursorInBytes); - if (FAILED(hr)) { - return ma_result_from_HRESULT(hr); - } - - /* If nothing is available we just sleep for a bit and return from this iteration. */ - if (physicalReadCursorInBytes == prevReadCursorInBytesCapture) { - ma_sleep(waitTimeInMilliseconds); - continue; /* Nothing is available in the capture buffer. */ - } - - /* - The current position has moved. We need to map all of the captured samples and write them to the playback device, making sure - we don't return until every frame has been copied over. - */ - if (prevReadCursorInBytesCapture < physicalReadCursorInBytes) { - /* The capture position has not looped. This is the simple case. */ - lockOffsetInBytesCapture = prevReadCursorInBytesCapture; - lockSizeInBytesCapture = (physicalReadCursorInBytes - prevReadCursorInBytesCapture); - } else { - /* - The capture position has looped. This is the more complex case. Map to the end of the buffer. If this does not return anything, - do it again from the start. - */ - if (prevReadCursorInBytesCapture < pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) { - /* Lock up to the end of the buffer. */ - lockOffsetInBytesCapture = prevReadCursorInBytesCapture; - lockSizeInBytesCapture = (pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) - prevReadCursorInBytesCapture; - } else { - /* Lock starting from the start of the buffer. */ - lockOffsetInBytesCapture = 0; - lockSizeInBytesCapture = physicalReadCursorInBytes; - } - } - - if (lockSizeInBytesCapture == 0) { - ma_sleep(waitTimeInMilliseconds); - continue; /* Nothing is available in the capture buffer. */ - } - - hr = ma_IDirectSoundCaptureBuffer_Lock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, lockOffsetInBytesCapture, lockSizeInBytesCapture, &pMappedDeviceBufferCapture, &mappedSizeInBytesCapture, NULL, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to map buffer from capture device in preparation for writing to the device."); - return ma_result_from_HRESULT(hr); - } - - - /* At this point we have some input data that we need to output. We do not return until every mapped frame of the input data is written to the playback device. */ - mappedDeviceFramesProcessedCapture = 0; - - for (;;) { /* Keep writing to the playback device. */ - ma_uint8 inputFramesInClientFormat[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint32 inputFramesInClientFormatCap = sizeof(inputFramesInClientFormat) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels); - ma_uint8 outputFramesInClientFormat[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint32 outputFramesInClientFormatCap = sizeof(outputFramesInClientFormat) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); - ma_uint32 outputFramesInClientFormatCount; - ma_uint32 outputFramesInClientFormatConsumed = 0; - ma_uint64 clientCapturedFramesToProcess = ma_min(inputFramesInClientFormatCap, outputFramesInClientFormatCap); - ma_uint64 deviceCapturedFramesToProcess = (mappedSizeInBytesCapture / bpfDeviceCapture) - mappedDeviceFramesProcessedCapture; - void* pRunningMappedDeviceBufferCapture = ma_offset_ptr(pMappedDeviceBufferCapture, mappedDeviceFramesProcessedCapture * bpfDeviceCapture); - - result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningMappedDeviceBufferCapture, &deviceCapturedFramesToProcess, inputFramesInClientFormat, &clientCapturedFramesToProcess); - if (result != MA_SUCCESS) { - break; - } - - outputFramesInClientFormatCount = (ma_uint32)clientCapturedFramesToProcess; - mappedDeviceFramesProcessedCapture += (ma_uint32)deviceCapturedFramesToProcess; - - ma_device__handle_data_callback(pDevice, outputFramesInClientFormat, inputFramesInClientFormat, (ma_uint32)clientCapturedFramesToProcess); - - /* At this point we have input and output data in client format. All we need to do now is convert it to the output device format. This may take a few passes. */ - for (;;) { - ma_uint32 framesWrittenThisIteration; - DWORD physicalPlayCursorInBytes; - DWORD physicalWriteCursorInBytes; - DWORD availableBytesPlayback; - DWORD silentPaddingInBytes = 0; /* <-- Must be initialized to 0. */ - - /* We need the physical play and write cursors. */ - if (FAILED(ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes))) { - break; - } - - if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) { - physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback; - } - prevPlayCursorInBytesPlayback = physicalPlayCursorInBytes; - - /* If there's any bytes available for writing we can do that now. The space between the virtual cursor position and play cursor. */ - if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) { - /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */ - if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) { - availableBytesPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback; - availableBytesPlayback += physicalPlayCursorInBytes; /* Wrap around. */ - } else { - /* This is an error. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[DirectSound] (Duplex/Playback): Play cursor has moved in front of the write cursor (same loop iteration). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\n", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback); - availableBytesPlayback = 0; - } - } else { - /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */ - if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) { - availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback; - } else { - /* This is an error. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[DirectSound] (Duplex/Playback): Write cursor has moved behind the play cursor (different loop iterations). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\n", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback); - availableBytesPlayback = 0; - } - } - - /* If there's no room available for writing we need to wait for more. */ - if (availableBytesPlayback == 0) { - /* If we haven't started the device yet, this will never get beyond 0. In this case we need to get the device started. */ - if (!isPlaybackDeviceStarted) { - hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING); - if (FAILED(hr)) { - ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundBuffer_Play() failed."); - return ma_result_from_HRESULT(hr); - } - isPlaybackDeviceStarted = MA_TRUE; - } else { - ma_sleep(waitTimeInMilliseconds); - continue; - } - } - - - /* Getting here means there room available somewhere. We limit this to either the end of the buffer or the physical play cursor, whichever is closest. */ - lockOffsetInBytesPlayback = virtualWriteCursorInBytesPlayback; - if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) { - /* Same loop iteration. Go up to the end of the buffer. */ - lockSizeInBytesPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback; - } else { - /* Different loop iterations. Go up to the physical play cursor. */ - lockSizeInBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback; - } - - hr = ma_IDirectSoundBuffer_Lock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, lockOffsetInBytesPlayback, lockSizeInBytesPlayback, &pMappedDeviceBufferPlayback, &mappedSizeInBytesPlayback, NULL, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to map buffer from playback device in preparation for writing to the device."); - result = ma_result_from_HRESULT(hr); - break; - } - - /* - Experiment: If the playback buffer is being starved, pad it with some silence to get it back in sync. This will cause a glitch, but it may prevent - endless glitching due to it constantly running out of data. - */ - if (isPlaybackDeviceStarted) { - DWORD bytesQueuedForPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - availableBytesPlayback; - if (bytesQueuedForPlayback < (pDevice->playback.internalPeriodSizeInFrames*bpfDevicePlayback)) { - silentPaddingInBytes = (pDevice->playback.internalPeriodSizeInFrames*2*bpfDevicePlayback) - bytesQueuedForPlayback; - if (silentPaddingInBytes > lockSizeInBytesPlayback) { - silentPaddingInBytes = lockSizeInBytesPlayback; - } - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[DirectSound] (Duplex/Playback) Playback buffer starved. availableBytesPlayback=%ld, silentPaddingInBytes=%ld\n", availableBytesPlayback, silentPaddingInBytes); - } - } - - /* At this point we have a buffer for output. */ - if (silentPaddingInBytes > 0) { - MA_ZERO_MEMORY(pMappedDeviceBufferPlayback, silentPaddingInBytes); - framesWrittenThisIteration = silentPaddingInBytes/bpfDevicePlayback; - } else { - ma_uint64 convertedFrameCountIn = (outputFramesInClientFormatCount - outputFramesInClientFormatConsumed); - ma_uint64 convertedFrameCountOut = mappedSizeInBytesPlayback/bpfDevicePlayback; - void* pConvertedFramesIn = ma_offset_ptr(outputFramesInClientFormat, outputFramesInClientFormatConsumed * bpfDevicePlayback); - void* pConvertedFramesOut = pMappedDeviceBufferPlayback; - - result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, pConvertedFramesIn, &convertedFrameCountIn, pConvertedFramesOut, &convertedFrameCountOut); - if (result != MA_SUCCESS) { - break; - } - - outputFramesInClientFormatConsumed += (ma_uint32)convertedFrameCountOut; - framesWrittenThisIteration = (ma_uint32)convertedFrameCountOut; - } - - - hr = ma_IDirectSoundBuffer_Unlock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, pMappedDeviceBufferPlayback, framesWrittenThisIteration*bpfDevicePlayback, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to unlock internal buffer from playback device after writing to the device."); - result = ma_result_from_HRESULT(hr); - break; - } - - virtualWriteCursorInBytesPlayback += framesWrittenThisIteration*bpfDevicePlayback; - if ((virtualWriteCursorInBytesPlayback/bpfDevicePlayback) == pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods) { - virtualWriteCursorInBytesPlayback = 0; - virtualWriteCursorLoopFlagPlayback = !virtualWriteCursorLoopFlagPlayback; - } - - /* - We may need to start the device. We want two full periods to be written before starting the playback device. Having an extra period adds - a bit of a buffer to prevent the playback buffer from getting starved. - */ - framesWrittenToPlaybackDevice += framesWrittenThisIteration; - if (!isPlaybackDeviceStarted && framesWrittenToPlaybackDevice >= (pDevice->playback.internalPeriodSizeInFrames*2)) { - hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING); - if (FAILED(hr)) { - ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundBuffer_Play() failed."); - return ma_result_from_HRESULT(hr); - } - isPlaybackDeviceStarted = MA_TRUE; - } - - if (framesWrittenThisIteration < mappedSizeInBytesPlayback/bpfDevicePlayback) { - break; /* We're finished with the output data.*/ - } - } - - if (clientCapturedFramesToProcess == 0) { - break; /* We just consumed every input sample. */ - } - } - - - /* At this point we're done with the mapped portion of the capture buffer. */ - hr = ma_IDirectSoundCaptureBuffer_Unlock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, pMappedDeviceBufferCapture, mappedSizeInBytesCapture, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to unlock internal buffer from capture device after reading from the device."); - return ma_result_from_HRESULT(hr); - } - prevReadCursorInBytesCapture = (lockOffsetInBytesCapture + mappedSizeInBytesCapture); - } break; - - - - case ma_device_type_capture: - { - DWORD physicalCaptureCursorInBytes; - DWORD physicalReadCursorInBytes; - hr = ma_IDirectSoundCaptureBuffer_GetCurrentPosition((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, &physicalCaptureCursorInBytes, &physicalReadCursorInBytes); - if (FAILED(hr)) { - return MA_ERROR; - } - - /* If the previous capture position is the same as the current position we need to wait a bit longer. */ - if (prevReadCursorInBytesCapture == physicalReadCursorInBytes) { - ma_sleep(waitTimeInMilliseconds); - continue; - } - - /* Getting here means we have capture data available. */ - if (prevReadCursorInBytesCapture < physicalReadCursorInBytes) { - /* The capture position has not looped. This is the simple case. */ - lockOffsetInBytesCapture = prevReadCursorInBytesCapture; - lockSizeInBytesCapture = (physicalReadCursorInBytes - prevReadCursorInBytesCapture); - } else { - /* - The capture position has looped. This is the more complex case. Map to the end of the buffer. If this does not return anything, - do it again from the start. - */ - if (prevReadCursorInBytesCapture < pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) { - /* Lock up to the end of the buffer. */ - lockOffsetInBytesCapture = prevReadCursorInBytesCapture; - lockSizeInBytesCapture = (pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) - prevReadCursorInBytesCapture; - } else { - /* Lock starting from the start of the buffer. */ - lockOffsetInBytesCapture = 0; - lockSizeInBytesCapture = physicalReadCursorInBytes; - } - } - - if (lockSizeInBytesCapture < pDevice->capture.internalPeriodSizeInFrames) { - ma_sleep(waitTimeInMilliseconds); - continue; /* Nothing is available in the capture buffer. */ - } - - hr = ma_IDirectSoundCaptureBuffer_Lock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, lockOffsetInBytesCapture, lockSizeInBytesCapture, &pMappedDeviceBufferCapture, &mappedSizeInBytesCapture, NULL, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to map buffer from capture device in preparation for writing to the device."); - result = ma_result_from_HRESULT(hr); - } - - if (lockSizeInBytesCapture != mappedSizeInBytesCapture) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[DirectSound] (Capture) lockSizeInBytesCapture=%ld != mappedSizeInBytesCapture=%ld\n", lockSizeInBytesCapture, mappedSizeInBytesCapture); - } - - ma_device__send_frames_to_client(pDevice, mappedSizeInBytesCapture/bpfDeviceCapture, pMappedDeviceBufferCapture); - - hr = ma_IDirectSoundCaptureBuffer_Unlock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, pMappedDeviceBufferCapture, mappedSizeInBytesCapture, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to unlock internal buffer from capture device after reading from the device."); - return ma_result_from_HRESULT(hr); - } - prevReadCursorInBytesCapture = lockOffsetInBytesCapture + mappedSizeInBytesCapture; - - if (prevReadCursorInBytesCapture == (pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture)) { - prevReadCursorInBytesCapture = 0; - } - } break; - - - - case ma_device_type_playback: - { - DWORD availableBytesPlayback; - DWORD physicalPlayCursorInBytes; - DWORD physicalWriteCursorInBytes; - hr = ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes); - if (FAILED(hr)) { - break; - } - - if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) { - physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback; - } - prevPlayCursorInBytesPlayback = physicalPlayCursorInBytes; - - /* If there's any bytes available for writing we can do that now. The space between the virtual cursor position and play cursor. */ - if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) { - /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */ - if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) { - availableBytesPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback; - availableBytesPlayback += physicalPlayCursorInBytes; /* Wrap around. */ - } else { - /* This is an error. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[DirectSound] (Playback): Play cursor has moved in front of the write cursor (same loop iterations). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\n", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback); - availableBytesPlayback = 0; - } - } else { - /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */ - if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) { - availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback; - } else { - /* This is an error. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[DirectSound] (Playback): Write cursor has moved behind the play cursor (different loop iterations). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\n", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback); - availableBytesPlayback = 0; - } - } - - /* If there's no room available for writing we need to wait for more. */ - if (availableBytesPlayback < pDevice->playback.internalPeriodSizeInFrames) { - /* If we haven't started the device yet, this will never get beyond 0. In this case we need to get the device started. */ - if (availableBytesPlayback == 0 && !isPlaybackDeviceStarted) { - hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundBuffer_Play() failed."); - return ma_result_from_HRESULT(hr); - } - isPlaybackDeviceStarted = MA_TRUE; - } else { - ma_sleep(waitTimeInMilliseconds); - continue; - } - } - - /* Getting here means there room available somewhere. We limit this to either the end of the buffer or the physical play cursor, whichever is closest. */ - lockOffsetInBytesPlayback = virtualWriteCursorInBytesPlayback; - if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) { - /* Same loop iteration. Go up to the end of the buffer. */ - lockSizeInBytesPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback; - } else { - /* Different loop iterations. Go up to the physical play cursor. */ - lockSizeInBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback; - } - - hr = ma_IDirectSoundBuffer_Lock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, lockOffsetInBytesPlayback, lockSizeInBytesPlayback, &pMappedDeviceBufferPlayback, &mappedSizeInBytesPlayback, NULL, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to map buffer from playback device in preparation for writing to the device."); - result = ma_result_from_HRESULT(hr); - break; - } - - /* At this point we have a buffer for output. */ - ma_device__read_frames_from_client(pDevice, (mappedSizeInBytesPlayback/bpfDevicePlayback), pMappedDeviceBufferPlayback); - - hr = ma_IDirectSoundBuffer_Unlock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, pMappedDeviceBufferPlayback, mappedSizeInBytesPlayback, NULL, 0); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] Failed to unlock internal buffer from playback device after writing to the device."); - result = ma_result_from_HRESULT(hr); - break; - } - - virtualWriteCursorInBytesPlayback += mappedSizeInBytesPlayback; - if (virtualWriteCursorInBytesPlayback == pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) { - virtualWriteCursorInBytesPlayback = 0; - virtualWriteCursorLoopFlagPlayback = !virtualWriteCursorLoopFlagPlayback; - } - - /* - We may need to start the device. We want two full periods to be written before starting the playback device. Having an extra period adds - a bit of a buffer to prevent the playback buffer from getting starved. - */ - framesWrittenToPlaybackDevice += mappedSizeInBytesPlayback/bpfDevicePlayback; - if (!isPlaybackDeviceStarted && framesWrittenToPlaybackDevice >= pDevice->playback.internalPeriodSizeInFrames) { - hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundBuffer_Play() failed."); - return ma_result_from_HRESULT(hr); - } - isPlaybackDeviceStarted = MA_TRUE; - } - } break; - - - default: return MA_INVALID_ARGS; /* Invalid device type. */ - } - - if (result != MA_SUCCESS) { - return result; - } - } - - /* Getting here means the device is being stopped. */ - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - hr = ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundCaptureBuffer_Stop() failed."); - return ma_result_from_HRESULT(hr); - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - /* The playback device should be drained before stopping. All we do is wait until the available bytes is equal to the size of the buffer. */ - if (isPlaybackDeviceStarted) { - for (;;) { - DWORD availableBytesPlayback = 0; - DWORD physicalPlayCursorInBytes; - DWORD physicalWriteCursorInBytes; - hr = ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes); - if (FAILED(hr)) { - break; - } - - if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) { - physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback; - } - prevPlayCursorInBytesPlayback = physicalPlayCursorInBytes; - - if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) { - /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */ - if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) { - availableBytesPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback; - availableBytesPlayback += physicalPlayCursorInBytes; /* Wrap around. */ - } else { - break; - } - } else { - /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */ - if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) { - availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback; - } else { - break; - } - } - - if (availableBytesPlayback >= (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback)) { - break; - } - - ma_sleep(waitTimeInMilliseconds); - } - } - - hr = ma_IDirectSoundBuffer_Stop((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer); - if (FAILED(hr)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[DirectSound] IDirectSoundBuffer_Stop() failed."); - return ma_result_from_HRESULT(hr); - } - - ma_IDirectSoundBuffer_SetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0); - } - - return MA_SUCCESS; -} - -static ma_result ma_context_uninit__dsound(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_dsound); - - ma_dlclose(pContext, pContext->dsound.hDSoundDLL); - - return MA_SUCCESS; -} - -static ma_result ma_context_init__dsound(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - MA_ASSERT(pContext != NULL); - - (void)pConfig; - - pContext->dsound.hDSoundDLL = ma_dlopen(pContext, "dsound.dll"); - if (pContext->dsound.hDSoundDLL == NULL) { - return MA_API_NOT_FOUND; - } - - pContext->dsound.DirectSoundCreate = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, "DirectSoundCreate"); - pContext->dsound.DirectSoundEnumerateA = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, "DirectSoundEnumerateA"); - pContext->dsound.DirectSoundCaptureCreate = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, "DirectSoundCaptureCreate"); - pContext->dsound.DirectSoundCaptureEnumerateA = ma_dlsym(pContext, pContext->dsound.hDSoundDLL, "DirectSoundCaptureEnumerateA"); - - pCallbacks->onContextInit = ma_context_init__dsound; - pCallbacks->onContextUninit = ma_context_uninit__dsound; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__dsound; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__dsound; - pCallbacks->onDeviceInit = ma_device_init__dsound; - pCallbacks->onDeviceUninit = ma_device_uninit__dsound; - pCallbacks->onDeviceStart = NULL; /* Not used. Started in onDeviceDataLoop. */ - pCallbacks->onDeviceStop = NULL; /* Not used. Stopped in onDeviceDataLoop. */ - pCallbacks->onDeviceRead = NULL; /* Not used. Data is read directly in onDeviceDataLoop. */ - pCallbacks->onDeviceWrite = NULL; /* Not used. Data is written directly in onDeviceDataLoop. */ - pCallbacks->onDeviceDataLoop = ma_device_data_loop__dsound; - - return MA_SUCCESS; -} -#endif - - - -/****************************************************************************** - -WinMM Backend - -******************************************************************************/ -#ifdef MA_HAS_WINMM - -/* -Some older compilers don't have WAVEOUTCAPS2A and WAVEINCAPS2A, so we'll need to write this ourselves. These structures -are exactly the same as the older ones but they have a few GUIDs for manufacturer/product/name identification. I'm keeping -the names the same as the Win32 library for consistency, but namespaced to avoid naming conflicts with the Win32 version. -*/ -typedef struct -{ - WORD wMid; - WORD wPid; - MMVERSION vDriverVersion; - CHAR szPname[MAXPNAMELEN]; - DWORD dwFormats; - WORD wChannels; - WORD wReserved1; - DWORD dwSupport; - GUID ManufacturerGuid; - GUID ProductGuid; - GUID NameGuid; -} MA_WAVEOUTCAPS2A; -typedef struct -{ - WORD wMid; - WORD wPid; - MMVERSION vDriverVersion; - CHAR szPname[MAXPNAMELEN]; - DWORD dwFormats; - WORD wChannels; - WORD wReserved1; - GUID ManufacturerGuid; - GUID ProductGuid; - GUID NameGuid; -} MA_WAVEINCAPS2A; - -typedef UINT (WINAPI * MA_PFN_waveOutGetNumDevs)(void); -typedef MMRESULT (WINAPI * MA_PFN_waveOutGetDevCapsA)(ma_uintptr uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc); -typedef MMRESULT (WINAPI * MA_PFN_waveOutOpen)(LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -typedef MMRESULT (WINAPI * MA_PFN_waveOutClose)(HWAVEOUT hwo); -typedef MMRESULT (WINAPI * MA_PFN_waveOutPrepareHeader)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); -typedef MMRESULT (WINAPI * MA_PFN_waveOutUnprepareHeader)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); -typedef MMRESULT (WINAPI * MA_PFN_waveOutWrite)(HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); -typedef MMRESULT (WINAPI * MA_PFN_waveOutReset)(HWAVEOUT hwo); -typedef UINT (WINAPI * MA_PFN_waveInGetNumDevs)(void); -typedef MMRESULT (WINAPI * MA_PFN_waveInGetDevCapsA)(ma_uintptr uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic); -typedef MMRESULT (WINAPI * MA_PFN_waveInOpen)(LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -typedef MMRESULT (WINAPI * MA_PFN_waveInClose)(HWAVEIN hwi); -typedef MMRESULT (WINAPI * MA_PFN_waveInPrepareHeader)(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); -typedef MMRESULT (WINAPI * MA_PFN_waveInUnprepareHeader)(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); -typedef MMRESULT (WINAPI * MA_PFN_waveInAddBuffer)(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); -typedef MMRESULT (WINAPI * MA_PFN_waveInStart)(HWAVEIN hwi); -typedef MMRESULT (WINAPI * MA_PFN_waveInReset)(HWAVEIN hwi); - -static ma_result ma_result_from_MMRESULT(MMRESULT resultMM) -{ - switch (resultMM) { - case MMSYSERR_NOERROR: return MA_SUCCESS; - case MMSYSERR_BADDEVICEID: return MA_INVALID_ARGS; - case MMSYSERR_INVALHANDLE: return MA_INVALID_ARGS; - case MMSYSERR_NOMEM: return MA_OUT_OF_MEMORY; - case MMSYSERR_INVALFLAG: return MA_INVALID_ARGS; - case MMSYSERR_INVALPARAM: return MA_INVALID_ARGS; - case MMSYSERR_HANDLEBUSY: return MA_BUSY; - case MMSYSERR_ERROR: return MA_ERROR; - default: return MA_ERROR; - } -} - -static char* ma_find_last_character(char* str, char ch) -{ - char* last; - - if (str == NULL) { - return NULL; - } - - last = NULL; - while (*str != '\0') { - if (*str == ch) { - last = str; - } - - str += 1; - } - - return last; -} - -static ma_uint32 ma_get_period_size_in_bytes(ma_uint32 periodSizeInFrames, ma_format format, ma_uint32 channels) -{ - return periodSizeInFrames * ma_get_bytes_per_frame(format, channels); -} - - -/* -Our own "WAVECAPS" structure that contains generic information shared between WAVEOUTCAPS2 and WAVEINCAPS2 so -we can do things generically and typesafely. Names are being kept the same for consistency. -*/ -typedef struct -{ - CHAR szPname[MAXPNAMELEN]; - DWORD dwFormats; - WORD wChannels; - GUID NameGuid; -} MA_WAVECAPSA; - -static ma_result ma_get_best_info_from_formats_flags__winmm(DWORD dwFormats, WORD channels, WORD* pBitsPerSample, DWORD* pSampleRate) -{ - WORD bitsPerSample = 0; - DWORD sampleRate = 0; - - if (pBitsPerSample) { - *pBitsPerSample = 0; - } - if (pSampleRate) { - *pSampleRate = 0; - } - - if (channels == 1) { - bitsPerSample = 16; - if ((dwFormats & WAVE_FORMAT_48M16) != 0) { - sampleRate = 48000; - } else if ((dwFormats & WAVE_FORMAT_44M16) != 0) { - sampleRate = 44100; - } else if ((dwFormats & WAVE_FORMAT_2M16) != 0) { - sampleRate = 22050; - } else if ((dwFormats & WAVE_FORMAT_1M16) != 0) { - sampleRate = 11025; - } else if ((dwFormats & WAVE_FORMAT_96M16) != 0) { - sampleRate = 96000; - } else { - bitsPerSample = 8; - if ((dwFormats & WAVE_FORMAT_48M08) != 0) { - sampleRate = 48000; - } else if ((dwFormats & WAVE_FORMAT_44M08) != 0) { - sampleRate = 44100; - } else if ((dwFormats & WAVE_FORMAT_2M08) != 0) { - sampleRate = 22050; - } else if ((dwFormats & WAVE_FORMAT_1M08) != 0) { - sampleRate = 11025; - } else if ((dwFormats & WAVE_FORMAT_96M08) != 0) { - sampleRate = 96000; - } else { - return MA_FORMAT_NOT_SUPPORTED; - } - } - } else { - bitsPerSample = 16; - if ((dwFormats & WAVE_FORMAT_48S16) != 0) { - sampleRate = 48000; - } else if ((dwFormats & WAVE_FORMAT_44S16) != 0) { - sampleRate = 44100; - } else if ((dwFormats & WAVE_FORMAT_2S16) != 0) { - sampleRate = 22050; - } else if ((dwFormats & WAVE_FORMAT_1S16) != 0) { - sampleRate = 11025; - } else if ((dwFormats & WAVE_FORMAT_96S16) != 0) { - sampleRate = 96000; - } else { - bitsPerSample = 8; - if ((dwFormats & WAVE_FORMAT_48S08) != 0) { - sampleRate = 48000; - } else if ((dwFormats & WAVE_FORMAT_44S08) != 0) { - sampleRate = 44100; - } else if ((dwFormats & WAVE_FORMAT_2S08) != 0) { - sampleRate = 22050; - } else if ((dwFormats & WAVE_FORMAT_1S08) != 0) { - sampleRate = 11025; - } else if ((dwFormats & WAVE_FORMAT_96S08) != 0) { - sampleRate = 96000; - } else { - return MA_FORMAT_NOT_SUPPORTED; - } - } - } - - if (pBitsPerSample) { - *pBitsPerSample = bitsPerSample; - } - if (pSampleRate) { - *pSampleRate = sampleRate; - } - - return MA_SUCCESS; -} - -static ma_result ma_formats_flags_to_WAVEFORMATEX__winmm(DWORD dwFormats, WORD channels, WAVEFORMATEX* pWF) -{ - ma_result result; - - MA_ASSERT(pWF != NULL); - - MA_ZERO_OBJECT(pWF); - pWF->cbSize = sizeof(*pWF); - pWF->wFormatTag = WAVE_FORMAT_PCM; - pWF->nChannels = (WORD)channels; - if (pWF->nChannels > 2) { - pWF->nChannels = 2; - } - - result = ma_get_best_info_from_formats_flags__winmm(dwFormats, channels, &pWF->wBitsPerSample, &pWF->nSamplesPerSec); - if (result != MA_SUCCESS) { - return result; - } - - pWF->nBlockAlign = (WORD)(pWF->nChannels * pWF->wBitsPerSample / 8); - pWF->nAvgBytesPerSec = pWF->nBlockAlign * pWF->nSamplesPerSec; - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info_from_WAVECAPS(ma_context* pContext, MA_WAVECAPSA* pCaps, ma_device_info* pDeviceInfo) -{ - WORD bitsPerSample; - DWORD sampleRate; - ma_result result; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pCaps != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - /* - Name / Description - - Unfortunately the name specified in WAVE(OUT/IN)CAPS2 is limited to 31 characters. This results in an unprofessional looking - situation where the names of the devices are truncated. To help work around this, we need to look at the name GUID and try - looking in the registry for the full name. If we can't find it there, we need to just fall back to the default name. - */ - - /* Set the default to begin with. */ - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), pCaps->szPname, (size_t)-1); - - /* - Now try the registry. There's a few things to consider here: - - The name GUID can be null, in which we case we just need to stick to the original 31 characters. - - If the name GUID is not present in the registry we'll also need to stick to the original 31 characters. - - I like consistency, so I want the returned device names to be consistent with those returned by WASAPI and DirectSound. The - problem, however is that WASAPI and DirectSound use " ()" format (such as "Speakers (High Definition Audio)"), - but WinMM does not specificy the component name. From my admittedly limited testing, I've notice the component name seems to - usually fit within the 31 characters of the fixed sized buffer, so what I'm going to do is parse that string for the component - name, and then concatenate the name from the registry. - */ - if (!ma_is_guid_null(&pCaps->NameGuid)) { - wchar_t guidStrW[256]; - if (((MA_PFN_StringFromGUID2)pContext->win32.StringFromGUID2)(&pCaps->NameGuid, guidStrW, ma_countof(guidStrW)) > 0) { - char guidStr[256]; - char keyStr[1024]; - HKEY hKey; - - WideCharToMultiByte(CP_UTF8, 0, guidStrW, -1, guidStr, sizeof(guidStr), 0, FALSE); - - ma_strcpy_s(keyStr, sizeof(keyStr), "SYSTEM\\CurrentControlSet\\Control\\MediaCategories\\"); - ma_strcat_s(keyStr, sizeof(keyStr), guidStr); - - if (((MA_PFN_RegOpenKeyExA)pContext->win32.RegOpenKeyExA)(HKEY_LOCAL_MACHINE, keyStr, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - BYTE nameFromReg[512]; - DWORD nameFromRegSize = sizeof(nameFromReg); - LONG resultWin32 = ((MA_PFN_RegQueryValueExA)pContext->win32.RegQueryValueExA)(hKey, "Name", 0, NULL, (LPBYTE)nameFromReg, (LPDWORD)&nameFromRegSize); - ((MA_PFN_RegCloseKey)pContext->win32.RegCloseKey)(hKey); - - if (resultWin32 == ERROR_SUCCESS) { - /* We have the value from the registry, so now we need to construct the name string. */ - char name[1024]; - if (ma_strcpy_s(name, sizeof(name), pDeviceInfo->name) == 0) { - char* nameBeg = ma_find_last_character(name, '('); - if (nameBeg != NULL) { - size_t leadingLen = (nameBeg - name); - ma_strncpy_s(nameBeg + 1, sizeof(name) - leadingLen, (const char*)nameFromReg, (size_t)-1); - - /* The closing ")", if it can fit. */ - if (leadingLen + nameFromRegSize < sizeof(name)-1) { - ma_strcat_s(name, sizeof(name), ")"); - } - - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), name, (size_t)-1); - } - } - } - } - } - } - - - result = ma_get_best_info_from_formats_flags__winmm(pCaps->dwFormats, pCaps->wChannels, &bitsPerSample, &sampleRate); - if (result != MA_SUCCESS) { - return result; - } - - if (bitsPerSample == 8) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_u8; - } else if (bitsPerSample == 16) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_s16; - } else if (bitsPerSample == 24) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_s24; - } else if (bitsPerSample == 32) { - pDeviceInfo->nativeDataFormats[0].format = ma_format_s32; - } else { - return MA_FORMAT_NOT_SUPPORTED; - } - pDeviceInfo->nativeDataFormats[0].channels = pCaps->wChannels; - pDeviceInfo->nativeDataFormats[0].sampleRate = sampleRate; - pDeviceInfo->nativeDataFormats[0].flags = 0; - pDeviceInfo->nativeDataFormatCount = 1; - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info_from_WAVEOUTCAPS2(ma_context* pContext, MA_WAVEOUTCAPS2A* pCaps, ma_device_info* pDeviceInfo) -{ - MA_WAVECAPSA caps; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pCaps != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - MA_COPY_MEMORY(caps.szPname, pCaps->szPname, sizeof(caps.szPname)); - caps.dwFormats = pCaps->dwFormats; - caps.wChannels = pCaps->wChannels; - caps.NameGuid = pCaps->NameGuid; - return ma_context_get_device_info_from_WAVECAPS(pContext, &caps, pDeviceInfo); -} - -static ma_result ma_context_get_device_info_from_WAVEINCAPS2(ma_context* pContext, MA_WAVEINCAPS2A* pCaps, ma_device_info* pDeviceInfo) -{ - MA_WAVECAPSA caps; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pCaps != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - MA_COPY_MEMORY(caps.szPname, pCaps->szPname, sizeof(caps.szPname)); - caps.dwFormats = pCaps->dwFormats; - caps.wChannels = pCaps->wChannels; - caps.NameGuid = pCaps->NameGuid; - return ma_context_get_device_info_from_WAVECAPS(pContext, &caps, pDeviceInfo); -} - - -static ma_result ma_context_enumerate_devices__winmm(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - UINT playbackDeviceCount; - UINT captureDeviceCount; - UINT iPlaybackDevice; - UINT iCaptureDevice; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* Playback. */ - playbackDeviceCount = ((MA_PFN_waveOutGetNumDevs)pContext->winmm.waveOutGetNumDevs)(); - for (iPlaybackDevice = 0; iPlaybackDevice < playbackDeviceCount; ++iPlaybackDevice) { - MMRESULT result; - MA_WAVEOUTCAPS2A caps; - - MA_ZERO_OBJECT(&caps); - - result = ((MA_PFN_waveOutGetDevCapsA)pContext->winmm.waveOutGetDevCapsA)(iPlaybackDevice, (WAVEOUTCAPSA*)&caps, sizeof(caps)); - if (result == MMSYSERR_NOERROR) { - ma_device_info deviceInfo; - - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.winmm = iPlaybackDevice; - - /* The first enumerated device is the default device. */ - if (iPlaybackDevice == 0) { - deviceInfo.isDefault = MA_TRUE; - } - - if (ma_context_get_device_info_from_WAVEOUTCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) { - ma_bool32 cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - if (cbResult == MA_FALSE) { - return MA_SUCCESS; /* Enumeration was stopped. */ - } - } - } - } - - /* Capture. */ - captureDeviceCount = ((MA_PFN_waveInGetNumDevs)pContext->winmm.waveInGetNumDevs)(); - for (iCaptureDevice = 0; iCaptureDevice < captureDeviceCount; ++iCaptureDevice) { - MMRESULT result; - MA_WAVEINCAPS2A caps; - - MA_ZERO_OBJECT(&caps); - - result = ((MA_PFN_waveInGetDevCapsA)pContext->winmm.waveInGetDevCapsA)(iCaptureDevice, (WAVEINCAPSA*)&caps, sizeof(caps)); - if (result == MMSYSERR_NOERROR) { - ma_device_info deviceInfo; - - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.winmm = iCaptureDevice; - - /* The first enumerated device is the default device. */ - if (iCaptureDevice == 0) { - deviceInfo.isDefault = MA_TRUE; - } - - if (ma_context_get_device_info_from_WAVEINCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) { - ma_bool32 cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - if (cbResult == MA_FALSE) { - return MA_SUCCESS; /* Enumeration was stopped. */ - } - } - } - } - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__winmm(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - UINT winMMDeviceID; - - MA_ASSERT(pContext != NULL); - - winMMDeviceID = 0; - if (pDeviceID != NULL) { - winMMDeviceID = (UINT)pDeviceID->winmm; - } - - pDeviceInfo->id.winmm = winMMDeviceID; - - /* The first ID is the default device. */ - if (winMMDeviceID == 0) { - pDeviceInfo->isDefault = MA_TRUE; - } - - if (deviceType == ma_device_type_playback) { - MMRESULT result; - MA_WAVEOUTCAPS2A caps; - - MA_ZERO_OBJECT(&caps); - - result = ((MA_PFN_waveOutGetDevCapsA)pContext->winmm.waveOutGetDevCapsA)(winMMDeviceID, (WAVEOUTCAPSA*)&caps, sizeof(caps)); - if (result == MMSYSERR_NOERROR) { - return ma_context_get_device_info_from_WAVEOUTCAPS2(pContext, &caps, pDeviceInfo); - } - } else { - MMRESULT result; - MA_WAVEINCAPS2A caps; - - MA_ZERO_OBJECT(&caps); - - result = ((MA_PFN_waveInGetDevCapsA)pContext->winmm.waveInGetDevCapsA)(winMMDeviceID, (WAVEINCAPSA*)&caps, sizeof(caps)); - if (result == MMSYSERR_NOERROR) { - return ma_context_get_device_info_from_WAVEINCAPS2(pContext, &caps, pDeviceInfo); - } - } - - return MA_NO_DEVICE; -} - - -static ma_result ma_device_uninit__winmm(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ((MA_PFN_waveInClose)pDevice->pContext->winmm.waveInClose)((HWAVEIN)pDevice->winmm.hDeviceCapture); - CloseHandle((HANDLE)pDevice->winmm.hEventCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ((MA_PFN_waveOutReset)pDevice->pContext->winmm.waveOutReset)((HWAVEOUT)pDevice->winmm.hDevicePlayback); - ((MA_PFN_waveOutClose)pDevice->pContext->winmm.waveOutClose)((HWAVEOUT)pDevice->winmm.hDevicePlayback); - CloseHandle((HANDLE)pDevice->winmm.hEventPlayback); - } - - ma_free(pDevice->winmm._pHeapData, &pDevice->pContext->allocationCallbacks); - - MA_ZERO_OBJECT(&pDevice->winmm); /* Safety. */ - - return MA_SUCCESS; -} - -static ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__winmm(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile) -{ - /* WinMM has a minimum period size of 40ms. */ - ma_uint32 minPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(40, nativeSampleRate); - ma_uint32 periodSizeInFrames; - - periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, nativeSampleRate, performanceProfile); - if (periodSizeInFrames < minPeriodSizeInFrames) { - periodSizeInFrames = minPeriodSizeInFrames; - } - - return periodSizeInFrames; -} - -static ma_result ma_device_init__winmm(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - const char* errorMsg = ""; - ma_result errorCode = MA_ERROR; - ma_result result = MA_SUCCESS; - ma_uint32 heapSize; - UINT winMMDeviceIDPlayback = 0; - UINT winMMDeviceIDCapture = 0; - - MA_ASSERT(pDevice != NULL); - - MA_ZERO_OBJECT(&pDevice->winmm); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* No exlusive mode with WinMM. */ - if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) || - ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode == ma_share_mode_exclusive)) { - return MA_SHARE_MODE_NOT_SUPPORTED; - } - - if (pDescriptorPlayback->pDeviceID != NULL) { - winMMDeviceIDPlayback = (UINT)pDescriptorPlayback->pDeviceID->winmm; - } - if (pDescriptorCapture->pDeviceID != NULL) { - winMMDeviceIDCapture = (UINT)pDescriptorCapture->pDeviceID->winmm; - } - - /* The capture device needs to be initialized first. */ - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - WAVEINCAPSA caps; - WAVEFORMATEX wf; - MMRESULT resultMM; - - /* We use an event to know when a new fragment needs to be enqueued. */ - pDevice->winmm.hEventCapture = (ma_handle)CreateEventW(NULL, TRUE, TRUE, NULL); - if (pDevice->winmm.hEventCapture == NULL) { - errorMsg = "[WinMM] Failed to create event for fragment enqueing for the capture device.", errorCode = ma_result_from_GetLastError(GetLastError()); - goto on_error; - } - - /* The format should be based on the device's actual format. */ - if (((MA_PFN_waveInGetDevCapsA)pDevice->pContext->winmm.waveInGetDevCapsA)(winMMDeviceIDCapture, &caps, sizeof(caps)) != MMSYSERR_NOERROR) { - errorMsg = "[WinMM] Failed to retrieve internal device caps.", errorCode = MA_FORMAT_NOT_SUPPORTED; - goto on_error; - } - - result = ma_formats_flags_to_WAVEFORMATEX__winmm(caps.dwFormats, caps.wChannels, &wf); - if (result != MA_SUCCESS) { - errorMsg = "[WinMM] Could not find appropriate format for internal device.", errorCode = result; - goto on_error; - } - - resultMM = ((MA_PFN_waveInOpen)pDevice->pContext->winmm.waveInOpen)((LPHWAVEIN)&pDevice->winmm.hDeviceCapture, winMMDeviceIDCapture, &wf, (DWORD_PTR)pDevice->winmm.hEventCapture, (DWORD_PTR)pDevice, CALLBACK_EVENT | WAVE_ALLOWSYNC); - if (resultMM != MMSYSERR_NOERROR) { - errorMsg = "[WinMM] Failed to open capture device.", errorCode = MA_FAILED_TO_OPEN_BACKEND_DEVICE; - goto on_error; - } - - pDescriptorCapture->format = ma_format_from_WAVEFORMATEX(&wf); - pDescriptorCapture->channels = wf.nChannels; - pDescriptorCapture->sampleRate = wf.nSamplesPerSec; - ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorCapture->channels); - pDescriptorCapture->periodCount = pDescriptorCapture->periodCount; - pDescriptorCapture->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__winmm(pDescriptorCapture, pDescriptorCapture->sampleRate, pConfig->performanceProfile); - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - WAVEOUTCAPSA caps; - WAVEFORMATEX wf; - MMRESULT resultMM; - - /* We use an event to know when a new fragment needs to be enqueued. */ - pDevice->winmm.hEventPlayback = (ma_handle)CreateEventW(NULL, TRUE, TRUE, NULL); - if (pDevice->winmm.hEventPlayback == NULL) { - errorMsg = "[WinMM] Failed to create event for fragment enqueing for the playback device.", errorCode = ma_result_from_GetLastError(GetLastError()); - goto on_error; - } - - /* The format should be based on the device's actual format. */ - if (((MA_PFN_waveOutGetDevCapsA)pDevice->pContext->winmm.waveOutGetDevCapsA)(winMMDeviceIDPlayback, &caps, sizeof(caps)) != MMSYSERR_NOERROR) { - errorMsg = "[WinMM] Failed to retrieve internal device caps.", errorCode = MA_FORMAT_NOT_SUPPORTED; - goto on_error; - } - - result = ma_formats_flags_to_WAVEFORMATEX__winmm(caps.dwFormats, caps.wChannels, &wf); - if (result != MA_SUCCESS) { - errorMsg = "[WinMM] Could not find appropriate format for internal device.", errorCode = result; - goto on_error; - } - - resultMM = ((MA_PFN_waveOutOpen)pDevice->pContext->winmm.waveOutOpen)((LPHWAVEOUT)&pDevice->winmm.hDevicePlayback, winMMDeviceIDPlayback, &wf, (DWORD_PTR)pDevice->winmm.hEventPlayback, (DWORD_PTR)pDevice, CALLBACK_EVENT | WAVE_ALLOWSYNC); - if (resultMM != MMSYSERR_NOERROR) { - errorMsg = "[WinMM] Failed to open playback device.", errorCode = MA_FAILED_TO_OPEN_BACKEND_DEVICE; - goto on_error; - } - - pDescriptorPlayback->format = ma_format_from_WAVEFORMATEX(&wf); - pDescriptorPlayback->channels = wf.nChannels; - pDescriptorPlayback->sampleRate = wf.nSamplesPerSec; - ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pDescriptorPlayback->channelMap, ma_countof(pDescriptorPlayback->channelMap), pDescriptorPlayback->channels); - pDescriptorPlayback->periodCount = pDescriptorPlayback->periodCount; - pDescriptorPlayback->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__winmm(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile); - } - - /* - The heap allocated data is allocated like so: - - [Capture WAVEHDRs][Playback WAVEHDRs][Capture Intermediary Buffer][Playback Intermediary Buffer] - */ - heapSize = 0; - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - heapSize += sizeof(WAVEHDR)*pDescriptorCapture->periodCount + (pDescriptorCapture->periodSizeInFrames * pDescriptorCapture->periodCount * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels)); - } - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - heapSize += sizeof(WAVEHDR)*pDescriptorPlayback->periodCount + (pDescriptorPlayback->periodSizeInFrames * pDescriptorPlayback->periodCount * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels)); - } - - pDevice->winmm._pHeapData = (ma_uint8*)ma_calloc(heapSize, &pDevice->pContext->allocationCallbacks); - if (pDevice->winmm._pHeapData == NULL) { - errorMsg = "[WinMM] Failed to allocate memory for the intermediary buffer.", errorCode = MA_OUT_OF_MEMORY; - goto on_error; - } - - MA_ZERO_MEMORY(pDevice->winmm._pHeapData, heapSize); - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_uint32 iPeriod; - - if (pConfig->deviceType == ma_device_type_capture) { - pDevice->winmm.pWAVEHDRCapture = pDevice->winmm._pHeapData; - pDevice->winmm.pIntermediaryBufferCapture = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDescriptorCapture->periodCount)); - } else { - pDevice->winmm.pWAVEHDRCapture = pDevice->winmm._pHeapData; - pDevice->winmm.pIntermediaryBufferCapture = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDescriptorCapture->periodCount + pDescriptorPlayback->periodCount)); - } - - /* Prepare headers. */ - for (iPeriod = 0; iPeriod < pDescriptorCapture->periodCount; ++iPeriod) { - ma_uint32 periodSizeInBytes = ma_get_period_size_in_bytes(pDescriptorCapture->periodSizeInFrames, pDescriptorCapture->format, pDescriptorCapture->channels); - - ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].lpData = (LPSTR)(pDevice->winmm.pIntermediaryBufferCapture + (periodSizeInBytes*iPeriod)); - ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwBufferLength = periodSizeInBytes; - ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwFlags = 0L; - ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwLoops = 0L; - ((MA_PFN_waveInPrepareHeader)pDevice->pContext->winmm.waveInPrepareHeader)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(WAVEHDR)); - - /* - The user data of the WAVEHDR structure is a single flag the controls whether or not it is ready for writing. Consider it to be named "isLocked". A value of 0 means - it's unlocked and available for writing. A value of 1 means it's locked. - */ - ((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwUser = 0; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_uint32 iPeriod; - - if (pConfig->deviceType == ma_device_type_playback) { - pDevice->winmm.pWAVEHDRPlayback = pDevice->winmm._pHeapData; - pDevice->winmm.pIntermediaryBufferPlayback = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*pDescriptorPlayback->periodCount); - } else { - pDevice->winmm.pWAVEHDRPlayback = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDescriptorCapture->periodCount)); - pDevice->winmm.pIntermediaryBufferPlayback = pDevice->winmm._pHeapData + (sizeof(WAVEHDR)*(pDescriptorCapture->periodCount + pDescriptorPlayback->periodCount)) + (pDescriptorCapture->periodSizeInFrames*pDescriptorCapture->periodCount*ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels)); - } - - /* Prepare headers. */ - for (iPeriod = 0; iPeriod < pDescriptorPlayback->periodCount; ++iPeriod) { - ma_uint32 periodSizeInBytes = ma_get_period_size_in_bytes(pDescriptorPlayback->periodSizeInFrames, pDescriptorPlayback->format, pDescriptorPlayback->channels); - - ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].lpData = (LPSTR)(pDevice->winmm.pIntermediaryBufferPlayback + (periodSizeInBytes*iPeriod)); - ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwBufferLength = periodSizeInBytes; - ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwFlags = 0L; - ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwLoops = 0L; - ((MA_PFN_waveOutPrepareHeader)pDevice->pContext->winmm.waveOutPrepareHeader)((HWAVEOUT)pDevice->winmm.hDevicePlayback, &((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod], sizeof(WAVEHDR)); - - /* - The user data of the WAVEHDR structure is a single flag the controls whether or not it is ready for writing. Consider it to be named "isLocked". A value of 0 means - it's unlocked and available for writing. A value of 1 means it's locked. - */ - ((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwUser = 0; - } - } - - return MA_SUCCESS; - -on_error: - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - if (pDevice->winmm.pWAVEHDRCapture != NULL) { - ma_uint32 iPeriod; - for (iPeriod = 0; iPeriod < pDescriptorCapture->periodCount; ++iPeriod) { - ((MA_PFN_waveInUnprepareHeader)pDevice->pContext->winmm.waveInUnprepareHeader)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(WAVEHDR)); - } - } - - ((MA_PFN_waveInClose)pDevice->pContext->winmm.waveInClose)((HWAVEIN)pDevice->winmm.hDeviceCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - if (pDevice->winmm.pWAVEHDRCapture != NULL) { - ma_uint32 iPeriod; - for (iPeriod = 0; iPeriod < pDescriptorPlayback->periodCount; ++iPeriod) { - ((MA_PFN_waveOutUnprepareHeader)pDevice->pContext->winmm.waveOutUnprepareHeader)((HWAVEOUT)pDevice->winmm.hDevicePlayback, &((WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod], sizeof(WAVEHDR)); - } - } - - ((MA_PFN_waveOutClose)pDevice->pContext->winmm.waveOutClose)((HWAVEOUT)pDevice->winmm.hDevicePlayback); - } - - ma_free(pDevice->winmm._pHeapData, &pDevice->pContext->allocationCallbacks); - - if (errorMsg != NULL && errorMsg[0] != '\0') { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "%s", errorMsg); - } - - return errorCode; -} - -static ma_result ma_device_start__winmm(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - MMRESULT resultMM; - WAVEHDR* pWAVEHDR; - ma_uint32 iPeriod; - - pWAVEHDR = (WAVEHDR*)pDevice->winmm.pWAVEHDRCapture; - - /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */ - ResetEvent((HANDLE)pDevice->winmm.hEventCapture); - - /* To start the device we attach all of the buffers and then start it. As the buffers are filled with data we will get notifications. */ - for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) { - resultMM = ((MA_PFN_waveInAddBuffer)pDevice->pContext->winmm.waveInAddBuffer)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((LPWAVEHDR)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(WAVEHDR)); - if (resultMM != MMSYSERR_NOERROR) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WinMM] Failed to attach input buffers to capture device in preparation for capture."); - return ma_result_from_MMRESULT(resultMM); - } - - /* Make sure all of the buffers start out locked. We don't want to access them until the backend tells us we can. */ - pWAVEHDR[iPeriod].dwUser = 1; /* 1 = locked. */ - } - - /* Capture devices need to be explicitly started, unlike playback devices. */ - resultMM = ((MA_PFN_waveInStart)pDevice->pContext->winmm.waveInStart)((HWAVEIN)pDevice->winmm.hDeviceCapture); - if (resultMM != MMSYSERR_NOERROR) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WinMM] Failed to start backend device."); - return ma_result_from_MMRESULT(resultMM); - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - /* Don't need to do anything for playback. It'll be started automatically in ma_device_start__winmm(). */ - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__winmm(ma_device* pDevice) -{ - MMRESULT resultMM; - - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - if (pDevice->winmm.hDeviceCapture == NULL) { - return MA_INVALID_ARGS; - } - - resultMM = ((MA_PFN_waveInReset)pDevice->pContext->winmm.waveInReset)((HWAVEIN)pDevice->winmm.hDeviceCapture); - if (resultMM != MMSYSERR_NOERROR) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[WinMM] WARNING: Failed to reset capture device."); - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_uint32 iPeriod; - WAVEHDR* pWAVEHDR; - - if (pDevice->winmm.hDevicePlayback == NULL) { - return MA_INVALID_ARGS; - } - - /* We need to drain the device. To do this we just loop over each header and if it's locked just wait for the event. */ - pWAVEHDR = (WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback; - for (iPeriod = 0; iPeriod < pDevice->playback.internalPeriods; iPeriod += 1) { - if (pWAVEHDR[iPeriod].dwUser == 1) { /* 1 = locked. */ - if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventPlayback, INFINITE) != WAIT_OBJECT_0) { - break; /* An error occurred so just abandon ship and stop the device without draining. */ - } - - pWAVEHDR[iPeriod].dwUser = 0; - } - } - - resultMM = ((MA_PFN_waveOutReset)pDevice->pContext->winmm.waveOutReset)((HWAVEOUT)pDevice->winmm.hDevicePlayback); - if (resultMM != MMSYSERR_NOERROR) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, "[WinMM] WARNING: Failed to reset playback device."); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_write__winmm(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - ma_result result = MA_SUCCESS; - MMRESULT resultMM; - ma_uint32 totalFramesWritten; - WAVEHDR* pWAVEHDR; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pPCMFrames != NULL); - - if (pFramesWritten != NULL) { - *pFramesWritten = 0; - } - - pWAVEHDR = (WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback; - - /* Keep processing as much data as possible. */ - totalFramesWritten = 0; - while (totalFramesWritten < frameCount) { - /* If the current header has some space available we need to write part of it. */ - if (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser == 0) { /* 0 = unlocked. */ - /* - This header has room in it. We copy as much of it as we can. If we end up fully consuming the buffer we need to - write it out and move on to the next iteration. - */ - ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - ma_uint32 framesRemainingInHeader = (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwBufferLength/bpf) - pDevice->winmm.headerFramesConsumedPlayback; - - ma_uint32 framesToCopy = ma_min(framesRemainingInHeader, (frameCount - totalFramesWritten)); - const void* pSrc = ma_offset_ptr(pPCMFrames, totalFramesWritten*bpf); - void* pDst = ma_offset_ptr(pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].lpData, pDevice->winmm.headerFramesConsumedPlayback*bpf); - MA_COPY_MEMORY(pDst, pSrc, framesToCopy*bpf); - - pDevice->winmm.headerFramesConsumedPlayback += framesToCopy; - totalFramesWritten += framesToCopy; - - /* If we've consumed the buffer entirely we need to write it out to the device. */ - if (pDevice->winmm.headerFramesConsumedPlayback == (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwBufferLength/bpf)) { - pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser = 1; /* 1 = locked. */ - pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwFlags &= ~WHDR_DONE; /* <-- Need to make sure the WHDR_DONE flag is unset. */ - - /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */ - ResetEvent((HANDLE)pDevice->winmm.hEventPlayback); - - /* The device will be started here. */ - resultMM = ((MA_PFN_waveOutWrite)pDevice->pContext->winmm.waveOutWrite)((HWAVEOUT)pDevice->winmm.hDevicePlayback, &pWAVEHDR[pDevice->winmm.iNextHeaderPlayback], sizeof(WAVEHDR)); - if (resultMM != MMSYSERR_NOERROR) { - result = ma_result_from_MMRESULT(resultMM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WinMM] waveOutWrite() failed."); - break; - } - - /* Make sure we move to the next header. */ - pDevice->winmm.iNextHeaderPlayback = (pDevice->winmm.iNextHeaderPlayback + 1) % pDevice->playback.internalPeriods; - pDevice->winmm.headerFramesConsumedPlayback = 0; - } - - /* If at this point we have consumed the entire input buffer we can return. */ - MA_ASSERT(totalFramesWritten <= frameCount); - if (totalFramesWritten == frameCount) { - break; - } - - /* Getting here means there's more to process. */ - continue; - } - - /* Getting here means there isn't enough room in the buffer and we need to wait for one to become available. */ - if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventPlayback, INFINITE) != WAIT_OBJECT_0) { - result = MA_ERROR; - break; - } - - /* Something happened. If the next buffer has been marked as done we need to reset a bit of state. */ - if ((pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwFlags & WHDR_DONE) != 0) { - pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser = 0; /* 0 = unlocked (make it available for writing). */ - pDevice->winmm.headerFramesConsumedPlayback = 0; - } - - /* If the device has been stopped we need to break. */ - if (ma_device_get_state(pDevice) != ma_device_state_started) { - break; - } - } - - if (pFramesWritten != NULL) { - *pFramesWritten = totalFramesWritten; - } - - return result; -} - -static ma_result ma_device_read__winmm(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - ma_result result = MA_SUCCESS; - MMRESULT resultMM; - ma_uint32 totalFramesRead; - WAVEHDR* pWAVEHDR; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pPCMFrames != NULL); - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - pWAVEHDR = (WAVEHDR*)pDevice->winmm.pWAVEHDRCapture; - - /* Keep processing as much data as possible. */ - totalFramesRead = 0; - while (totalFramesRead < frameCount) { - /* If the current header has some space available we need to write part of it. */ - if (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser == 0) { /* 0 = unlocked. */ - /* The buffer is available for reading. If we fully consume it we need to add it back to the buffer. */ - ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - ma_uint32 framesRemainingInHeader = (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwBufferLength/bpf) - pDevice->winmm.headerFramesConsumedCapture; - - ma_uint32 framesToCopy = ma_min(framesRemainingInHeader, (frameCount - totalFramesRead)); - const void* pSrc = ma_offset_ptr(pWAVEHDR[pDevice->winmm.iNextHeaderCapture].lpData, pDevice->winmm.headerFramesConsumedCapture*bpf); - void* pDst = ma_offset_ptr(pPCMFrames, totalFramesRead*bpf); - MA_COPY_MEMORY(pDst, pSrc, framesToCopy*bpf); - - pDevice->winmm.headerFramesConsumedCapture += framesToCopy; - totalFramesRead += framesToCopy; - - /* If we've consumed the buffer entirely we need to add it back to the device. */ - if (pDevice->winmm.headerFramesConsumedCapture == (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwBufferLength/bpf)) { - pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser = 1; /* 1 = locked. */ - pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwFlags &= ~WHDR_DONE; /* <-- Need to make sure the WHDR_DONE flag is unset. */ - - /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */ - ResetEvent((HANDLE)pDevice->winmm.hEventCapture); - - /* The device will be started here. */ - resultMM = ((MA_PFN_waveInAddBuffer)pDevice->pContext->winmm.waveInAddBuffer)((HWAVEIN)pDevice->winmm.hDeviceCapture, &((LPWAVEHDR)pDevice->winmm.pWAVEHDRCapture)[pDevice->winmm.iNextHeaderCapture], sizeof(WAVEHDR)); - if (resultMM != MMSYSERR_NOERROR) { - result = ma_result_from_MMRESULT(resultMM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[WinMM] waveInAddBuffer() failed."); - break; - } - - /* Make sure we move to the next header. */ - pDevice->winmm.iNextHeaderCapture = (pDevice->winmm.iNextHeaderCapture + 1) % pDevice->capture.internalPeriods; - pDevice->winmm.headerFramesConsumedCapture = 0; - } - - /* If at this point we have filled the entire input buffer we can return. */ - MA_ASSERT(totalFramesRead <= frameCount); - if (totalFramesRead == frameCount) { - break; - } - - /* Getting here means there's more to process. */ - continue; - } - - /* Getting here means there isn't enough any data left to send to the client which means we need to wait for more. */ - if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventCapture, INFINITE) != WAIT_OBJECT_0) { - result = MA_ERROR; - break; - } - - /* Something happened. If the next buffer has been marked as done we need to reset a bit of state. */ - if ((pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwFlags & WHDR_DONE) != 0) { - pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser = 0; /* 0 = unlocked (make it available for reading). */ - pDevice->winmm.headerFramesConsumedCapture = 0; - } - - /* If the device has been stopped we need to break. */ - if (ma_device_get_state(pDevice) != ma_device_state_started) { - break; - } - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesRead; - } - - return result; -} - -static ma_result ma_context_uninit__winmm(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_winmm); - - ma_dlclose(pContext, pContext->winmm.hWinMM); - return MA_SUCCESS; -} - -static ma_result ma_context_init__winmm(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - MA_ASSERT(pContext != NULL); - - (void)pConfig; - - pContext->winmm.hWinMM = ma_dlopen(pContext, "winmm.dll"); - if (pContext->winmm.hWinMM == NULL) { - return MA_NO_BACKEND; - } - - pContext->winmm.waveOutGetNumDevs = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutGetNumDevs"); - pContext->winmm.waveOutGetDevCapsA = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutGetDevCapsA"); - pContext->winmm.waveOutOpen = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutOpen"); - pContext->winmm.waveOutClose = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutClose"); - pContext->winmm.waveOutPrepareHeader = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutPrepareHeader"); - pContext->winmm.waveOutUnprepareHeader = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutUnprepareHeader"); - pContext->winmm.waveOutWrite = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutWrite"); - pContext->winmm.waveOutReset = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveOutReset"); - pContext->winmm.waveInGetNumDevs = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInGetNumDevs"); - pContext->winmm.waveInGetDevCapsA = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInGetDevCapsA"); - pContext->winmm.waveInOpen = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInOpen"); - pContext->winmm.waveInClose = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInClose"); - pContext->winmm.waveInPrepareHeader = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInPrepareHeader"); - pContext->winmm.waveInUnprepareHeader = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInUnprepareHeader"); - pContext->winmm.waveInAddBuffer = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInAddBuffer"); - pContext->winmm.waveInStart = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInStart"); - pContext->winmm.waveInReset = ma_dlsym(pContext, pContext->winmm.hWinMM, "waveInReset"); - - pCallbacks->onContextInit = ma_context_init__winmm; - pCallbacks->onContextUninit = ma_context_uninit__winmm; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__winmm; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__winmm; - pCallbacks->onDeviceInit = ma_device_init__winmm; - pCallbacks->onDeviceUninit = ma_device_uninit__winmm; - pCallbacks->onDeviceStart = ma_device_start__winmm; - pCallbacks->onDeviceStop = ma_device_stop__winmm; - pCallbacks->onDeviceRead = ma_device_read__winmm; - pCallbacks->onDeviceWrite = ma_device_write__winmm; - pCallbacks->onDeviceDataLoop = NULL; /* This is a blocking read-write API, so this can be NULL since miniaudio will manage the audio thread for us. */ - - return MA_SUCCESS; -} -#endif - - - - -/****************************************************************************** - -ALSA Backend - -******************************************************************************/ -#ifdef MA_HAS_ALSA - -#include /* poll(), struct pollfd */ -#include /* eventfd() */ - -#ifdef MA_NO_RUNTIME_LINKING - -/* asoundlib.h marks some functions with "inline" which isn't always supported. Need to emulate it. */ -#if !defined(__cplusplus) - #if defined(__STRICT_ANSI__) - #if !defined(inline) - #define inline __inline__ __attribute__((always_inline)) - #define MA_INLINE_DEFINED - #endif - #endif -#endif -#include -#if defined(MA_INLINE_DEFINED) - #undef inline - #undef MA_INLINE_DEFINED -#endif - -typedef snd_pcm_uframes_t ma_snd_pcm_uframes_t; -typedef snd_pcm_sframes_t ma_snd_pcm_sframes_t; -typedef snd_pcm_stream_t ma_snd_pcm_stream_t; -typedef snd_pcm_format_t ma_snd_pcm_format_t; -typedef snd_pcm_access_t ma_snd_pcm_access_t; -typedef snd_pcm_t ma_snd_pcm_t; -typedef snd_pcm_hw_params_t ma_snd_pcm_hw_params_t; -typedef snd_pcm_sw_params_t ma_snd_pcm_sw_params_t; -typedef snd_pcm_format_mask_t ma_snd_pcm_format_mask_t; -typedef snd_pcm_info_t ma_snd_pcm_info_t; -typedef snd_pcm_channel_area_t ma_snd_pcm_channel_area_t; -typedef snd_pcm_chmap_t ma_snd_pcm_chmap_t; -typedef snd_pcm_state_t ma_snd_pcm_state_t; - -/* snd_pcm_stream_t */ -#define MA_SND_PCM_STREAM_PLAYBACK SND_PCM_STREAM_PLAYBACK -#define MA_SND_PCM_STREAM_CAPTURE SND_PCM_STREAM_CAPTURE - -/* snd_pcm_format_t */ -#define MA_SND_PCM_FORMAT_UNKNOWN SND_PCM_FORMAT_UNKNOWN -#define MA_SND_PCM_FORMAT_U8 SND_PCM_FORMAT_U8 -#define MA_SND_PCM_FORMAT_S16_LE SND_PCM_FORMAT_S16_LE -#define MA_SND_PCM_FORMAT_S16_BE SND_PCM_FORMAT_S16_BE -#define MA_SND_PCM_FORMAT_S24_LE SND_PCM_FORMAT_S24_LE -#define MA_SND_PCM_FORMAT_S24_BE SND_PCM_FORMAT_S24_BE -#define MA_SND_PCM_FORMAT_S32_LE SND_PCM_FORMAT_S32_LE -#define MA_SND_PCM_FORMAT_S32_BE SND_PCM_FORMAT_S32_BE -#define MA_SND_PCM_FORMAT_FLOAT_LE SND_PCM_FORMAT_FLOAT_LE -#define MA_SND_PCM_FORMAT_FLOAT_BE SND_PCM_FORMAT_FLOAT_BE -#define MA_SND_PCM_FORMAT_FLOAT64_LE SND_PCM_FORMAT_FLOAT64_LE -#define MA_SND_PCM_FORMAT_FLOAT64_BE SND_PCM_FORMAT_FLOAT64_BE -#define MA_SND_PCM_FORMAT_MU_LAW SND_PCM_FORMAT_MU_LAW -#define MA_SND_PCM_FORMAT_A_LAW SND_PCM_FORMAT_A_LAW -#define MA_SND_PCM_FORMAT_S24_3LE SND_PCM_FORMAT_S24_3LE -#define MA_SND_PCM_FORMAT_S24_3BE SND_PCM_FORMAT_S24_3BE - -/* ma_snd_pcm_access_t */ -#define MA_SND_PCM_ACCESS_MMAP_INTERLEAVED SND_PCM_ACCESS_MMAP_INTERLEAVED -#define MA_SND_PCM_ACCESS_MMAP_NONINTERLEAVED SND_PCM_ACCESS_MMAP_NONINTERLEAVED -#define MA_SND_PCM_ACCESS_MMAP_COMPLEX SND_PCM_ACCESS_MMAP_COMPLEX -#define MA_SND_PCM_ACCESS_RW_INTERLEAVED SND_PCM_ACCESS_RW_INTERLEAVED -#define MA_SND_PCM_ACCESS_RW_NONINTERLEAVED SND_PCM_ACCESS_RW_NONINTERLEAVED - -/* Channel positions. */ -#define MA_SND_CHMAP_UNKNOWN SND_CHMAP_UNKNOWN -#define MA_SND_CHMAP_NA SND_CHMAP_NA -#define MA_SND_CHMAP_MONO SND_CHMAP_MONO -#define MA_SND_CHMAP_FL SND_CHMAP_FL -#define MA_SND_CHMAP_FR SND_CHMAP_FR -#define MA_SND_CHMAP_RL SND_CHMAP_RL -#define MA_SND_CHMAP_RR SND_CHMAP_RR -#define MA_SND_CHMAP_FC SND_CHMAP_FC -#define MA_SND_CHMAP_LFE SND_CHMAP_LFE -#define MA_SND_CHMAP_SL SND_CHMAP_SL -#define MA_SND_CHMAP_SR SND_CHMAP_SR -#define MA_SND_CHMAP_RC SND_CHMAP_RC -#define MA_SND_CHMAP_FLC SND_CHMAP_FLC -#define MA_SND_CHMAP_FRC SND_CHMAP_FRC -#define MA_SND_CHMAP_RLC SND_CHMAP_RLC -#define MA_SND_CHMAP_RRC SND_CHMAP_RRC -#define MA_SND_CHMAP_FLW SND_CHMAP_FLW -#define MA_SND_CHMAP_FRW SND_CHMAP_FRW -#define MA_SND_CHMAP_FLH SND_CHMAP_FLH -#define MA_SND_CHMAP_FCH SND_CHMAP_FCH -#define MA_SND_CHMAP_FRH SND_CHMAP_FRH -#define MA_SND_CHMAP_TC SND_CHMAP_TC -#define MA_SND_CHMAP_TFL SND_CHMAP_TFL -#define MA_SND_CHMAP_TFR SND_CHMAP_TFR -#define MA_SND_CHMAP_TFC SND_CHMAP_TFC -#define MA_SND_CHMAP_TRL SND_CHMAP_TRL -#define MA_SND_CHMAP_TRR SND_CHMAP_TRR -#define MA_SND_CHMAP_TRC SND_CHMAP_TRC -#define MA_SND_CHMAP_TFLC SND_CHMAP_TFLC -#define MA_SND_CHMAP_TFRC SND_CHMAP_TFRC -#define MA_SND_CHMAP_TSL SND_CHMAP_TSL -#define MA_SND_CHMAP_TSR SND_CHMAP_TSR -#define MA_SND_CHMAP_LLFE SND_CHMAP_LLFE -#define MA_SND_CHMAP_RLFE SND_CHMAP_RLFE -#define MA_SND_CHMAP_BC SND_CHMAP_BC -#define MA_SND_CHMAP_BLC SND_CHMAP_BLC -#define MA_SND_CHMAP_BRC SND_CHMAP_BRC - -/* Open mode flags. */ -#define MA_SND_PCM_NO_AUTO_RESAMPLE SND_PCM_NO_AUTO_RESAMPLE -#define MA_SND_PCM_NO_AUTO_CHANNELS SND_PCM_NO_AUTO_CHANNELS -#define MA_SND_PCM_NO_AUTO_FORMAT SND_PCM_NO_AUTO_FORMAT -#else -#include /* For EPIPE, etc. */ -typedef unsigned long ma_snd_pcm_uframes_t; -typedef long ma_snd_pcm_sframes_t; -typedef int ma_snd_pcm_stream_t; -typedef int ma_snd_pcm_format_t; -typedef int ma_snd_pcm_access_t; -typedef int ma_snd_pcm_state_t; -typedef struct ma_snd_pcm_t ma_snd_pcm_t; -typedef struct ma_snd_pcm_hw_params_t ma_snd_pcm_hw_params_t; -typedef struct ma_snd_pcm_sw_params_t ma_snd_pcm_sw_params_t; -typedef struct ma_snd_pcm_format_mask_t ma_snd_pcm_format_mask_t; -typedef struct ma_snd_pcm_info_t ma_snd_pcm_info_t; -typedef struct -{ - void* addr; - unsigned int first; - unsigned int step; -} ma_snd_pcm_channel_area_t; -typedef struct -{ - unsigned int channels; - unsigned int pos[1]; -} ma_snd_pcm_chmap_t; - -/* snd_pcm_state_t */ -#define MA_SND_PCM_STATE_OPEN 0 -#define MA_SND_PCM_STATE_SETUP 1 -#define MA_SND_PCM_STATE_PREPARED 2 -#define MA_SND_PCM_STATE_RUNNING 3 -#define MA_SND_PCM_STATE_XRUN 4 -#define MA_SND_PCM_STATE_DRAINING 5 -#define MA_SND_PCM_STATE_PAUSED 6 -#define MA_SND_PCM_STATE_SUSPENDED 7 -#define MA_SND_PCM_STATE_DISCONNECTED 8 - -/* snd_pcm_stream_t */ -#define MA_SND_PCM_STREAM_PLAYBACK 0 -#define MA_SND_PCM_STREAM_CAPTURE 1 - -/* snd_pcm_format_t */ -#define MA_SND_PCM_FORMAT_UNKNOWN -1 -#define MA_SND_PCM_FORMAT_U8 1 -#define MA_SND_PCM_FORMAT_S16_LE 2 -#define MA_SND_PCM_FORMAT_S16_BE 3 -#define MA_SND_PCM_FORMAT_S24_LE 6 -#define MA_SND_PCM_FORMAT_S24_BE 7 -#define MA_SND_PCM_FORMAT_S32_LE 10 -#define MA_SND_PCM_FORMAT_S32_BE 11 -#define MA_SND_PCM_FORMAT_FLOAT_LE 14 -#define MA_SND_PCM_FORMAT_FLOAT_BE 15 -#define MA_SND_PCM_FORMAT_FLOAT64_LE 16 -#define MA_SND_PCM_FORMAT_FLOAT64_BE 17 -#define MA_SND_PCM_FORMAT_MU_LAW 20 -#define MA_SND_PCM_FORMAT_A_LAW 21 -#define MA_SND_PCM_FORMAT_S24_3LE 32 -#define MA_SND_PCM_FORMAT_S24_3BE 33 - -/* snd_pcm_access_t */ -#define MA_SND_PCM_ACCESS_MMAP_INTERLEAVED 0 -#define MA_SND_PCM_ACCESS_MMAP_NONINTERLEAVED 1 -#define MA_SND_PCM_ACCESS_MMAP_COMPLEX 2 -#define MA_SND_PCM_ACCESS_RW_INTERLEAVED 3 -#define MA_SND_PCM_ACCESS_RW_NONINTERLEAVED 4 - -/* Channel positions. */ -#define MA_SND_CHMAP_UNKNOWN 0 -#define MA_SND_CHMAP_NA 1 -#define MA_SND_CHMAP_MONO 2 -#define MA_SND_CHMAP_FL 3 -#define MA_SND_CHMAP_FR 4 -#define MA_SND_CHMAP_RL 5 -#define MA_SND_CHMAP_RR 6 -#define MA_SND_CHMAP_FC 7 -#define MA_SND_CHMAP_LFE 8 -#define MA_SND_CHMAP_SL 9 -#define MA_SND_CHMAP_SR 10 -#define MA_SND_CHMAP_RC 11 -#define MA_SND_CHMAP_FLC 12 -#define MA_SND_CHMAP_FRC 13 -#define MA_SND_CHMAP_RLC 14 -#define MA_SND_CHMAP_RRC 15 -#define MA_SND_CHMAP_FLW 16 -#define MA_SND_CHMAP_FRW 17 -#define MA_SND_CHMAP_FLH 18 -#define MA_SND_CHMAP_FCH 19 -#define MA_SND_CHMAP_FRH 20 -#define MA_SND_CHMAP_TC 21 -#define MA_SND_CHMAP_TFL 22 -#define MA_SND_CHMAP_TFR 23 -#define MA_SND_CHMAP_TFC 24 -#define MA_SND_CHMAP_TRL 25 -#define MA_SND_CHMAP_TRR 26 -#define MA_SND_CHMAP_TRC 27 -#define MA_SND_CHMAP_TFLC 28 -#define MA_SND_CHMAP_TFRC 29 -#define MA_SND_CHMAP_TSL 30 -#define MA_SND_CHMAP_TSR 31 -#define MA_SND_CHMAP_LLFE 32 -#define MA_SND_CHMAP_RLFE 33 -#define MA_SND_CHMAP_BC 34 -#define MA_SND_CHMAP_BLC 35 -#define MA_SND_CHMAP_BRC 36 - -/* Open mode flags. */ -#define MA_SND_PCM_NO_AUTO_RESAMPLE 0x00010000 -#define MA_SND_PCM_NO_AUTO_CHANNELS 0x00020000 -#define MA_SND_PCM_NO_AUTO_FORMAT 0x00040000 -#endif - -typedef int (* ma_snd_pcm_open_proc) (ma_snd_pcm_t **pcm, const char *name, ma_snd_pcm_stream_t stream, int mode); -typedef int (* ma_snd_pcm_close_proc) (ma_snd_pcm_t *pcm); -typedef size_t (* ma_snd_pcm_hw_params_sizeof_proc) (void); -typedef int (* ma_snd_pcm_hw_params_any_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params); -typedef int (* ma_snd_pcm_hw_params_set_format_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t val); -typedef int (* ma_snd_pcm_hw_params_set_format_first_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t *format); -typedef void (* ma_snd_pcm_hw_params_get_format_mask_proc) (ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_mask_t *mask); -typedef int (* ma_snd_pcm_hw_params_set_channels_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val); -typedef int (* ma_snd_pcm_hw_params_set_channels_near_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val); -typedef int (* ma_snd_pcm_hw_params_set_channels_minmax_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *minimum, unsigned int *maximum); -typedef int (* ma_snd_pcm_hw_params_set_rate_resample_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val); -typedef int (* ma_snd_pcm_hw_params_set_rate_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val, int dir); -typedef int (* ma_snd_pcm_hw_params_set_rate_near_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir); -typedef int (* ma_snd_pcm_hw_params_set_buffer_size_near_proc)(ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val); -typedef int (* ma_snd_pcm_hw_params_set_periods_near_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir); -typedef int (* ma_snd_pcm_hw_params_set_access_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t _access); -typedef int (* ma_snd_pcm_hw_params_get_format_proc) (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t *format); -typedef int (* ma_snd_pcm_hw_params_get_channels_proc) (const ma_snd_pcm_hw_params_t *params, unsigned int *val); -typedef int (* ma_snd_pcm_hw_params_get_channels_min_proc) (const ma_snd_pcm_hw_params_t *params, unsigned int *val); -typedef int (* ma_snd_pcm_hw_params_get_channels_max_proc) (const ma_snd_pcm_hw_params_t *params, unsigned int *val); -typedef int (* ma_snd_pcm_hw_params_get_rate_proc) (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir); -typedef int (* ma_snd_pcm_hw_params_get_rate_min_proc) (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir); -typedef int (* ma_snd_pcm_hw_params_get_rate_max_proc) (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir); -typedef int (* ma_snd_pcm_hw_params_get_buffer_size_proc) (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val); -typedef int (* ma_snd_pcm_hw_params_get_periods_proc) (const ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir); -typedef int (* ma_snd_pcm_hw_params_get_access_proc) (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t *_access); -typedef int (* ma_snd_pcm_hw_params_test_format_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t val); -typedef int (* ma_snd_pcm_hw_params_test_channels_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val); -typedef int (* ma_snd_pcm_hw_params_test_rate_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val, int dir); -typedef int (* ma_snd_pcm_hw_params_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params); -typedef size_t (* ma_snd_pcm_sw_params_sizeof_proc) (void); -typedef int (* ma_snd_pcm_sw_params_current_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params); -typedef int (* ma_snd_pcm_sw_params_get_boundary_proc) (const ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t* val); -typedef int (* ma_snd_pcm_sw_params_set_avail_min_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val); -typedef int (* ma_snd_pcm_sw_params_set_start_threshold_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val); -typedef int (* ma_snd_pcm_sw_params_set_stop_threshold_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val); -typedef int (* ma_snd_pcm_sw_params_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params); -typedef size_t (* ma_snd_pcm_format_mask_sizeof_proc) (void); -typedef int (* ma_snd_pcm_format_mask_test_proc) (const ma_snd_pcm_format_mask_t *mask, ma_snd_pcm_format_t val); -typedef ma_snd_pcm_chmap_t * (* ma_snd_pcm_get_chmap_proc) (ma_snd_pcm_t *pcm); -typedef ma_snd_pcm_state_t (* ma_snd_pcm_state_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_pcm_prepare_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_pcm_start_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_pcm_drop_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_pcm_drain_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_pcm_reset_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_device_name_hint_proc) (int card, const char *iface, void ***hints); -typedef char * (* ma_snd_device_name_get_hint_proc) (const void *hint, const char *id); -typedef int (* ma_snd_card_get_index_proc) (const char *name); -typedef int (* ma_snd_device_name_free_hint_proc) (void **hints); -typedef int (* ma_snd_pcm_mmap_begin_proc) (ma_snd_pcm_t *pcm, const ma_snd_pcm_channel_area_t **areas, ma_snd_pcm_uframes_t *offset, ma_snd_pcm_uframes_t *frames); -typedef ma_snd_pcm_sframes_t (* ma_snd_pcm_mmap_commit_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_uframes_t offset, ma_snd_pcm_uframes_t frames); -typedef int (* ma_snd_pcm_recover_proc) (ma_snd_pcm_t *pcm, int err, int silent); -typedef ma_snd_pcm_sframes_t (* ma_snd_pcm_readi_proc) (ma_snd_pcm_t *pcm, void *buffer, ma_snd_pcm_uframes_t size); -typedef ma_snd_pcm_sframes_t (* ma_snd_pcm_writei_proc) (ma_snd_pcm_t *pcm, const void *buffer, ma_snd_pcm_uframes_t size); -typedef ma_snd_pcm_sframes_t (* ma_snd_pcm_avail_proc) (ma_snd_pcm_t *pcm); -typedef ma_snd_pcm_sframes_t (* ma_snd_pcm_avail_update_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_pcm_wait_proc) (ma_snd_pcm_t *pcm, int timeout); -typedef int (* ma_snd_pcm_nonblock_proc) (ma_snd_pcm_t *pcm, int nonblock); -typedef int (* ma_snd_pcm_info_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_info_t* info); -typedef size_t (* ma_snd_pcm_info_sizeof_proc) (void); -typedef const char* (* ma_snd_pcm_info_get_name_proc) (const ma_snd_pcm_info_t* info); -typedef int (* ma_snd_pcm_poll_descriptors_proc) (ma_snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space); -typedef int (* ma_snd_pcm_poll_descriptors_count_proc) (ma_snd_pcm_t *pcm); -typedef int (* ma_snd_pcm_poll_descriptors_revents_proc) (ma_snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents); -typedef int (* ma_snd_config_update_free_global_proc) (void); - -/* This array specifies each of the common devices that can be used for both playback and capture. */ -static const char* g_maCommonDeviceNamesALSA[] = { - "default", - "null", - "pulse", - "jack" -}; - -/* This array allows us to blacklist specific playback devices. */ -static const char* g_maBlacklistedPlaybackDeviceNamesALSA[] = { - "" -}; - -/* This array allows us to blacklist specific capture devices. */ -static const char* g_maBlacklistedCaptureDeviceNamesALSA[] = { - "" -}; - - -static ma_snd_pcm_format_t ma_convert_ma_format_to_alsa_format(ma_format format) -{ - ma_snd_pcm_format_t ALSAFormats[] = { - MA_SND_PCM_FORMAT_UNKNOWN, /* ma_format_unknown */ - MA_SND_PCM_FORMAT_U8, /* ma_format_u8 */ - MA_SND_PCM_FORMAT_S16_LE, /* ma_format_s16 */ - MA_SND_PCM_FORMAT_S24_3LE, /* ma_format_s24 */ - MA_SND_PCM_FORMAT_S32_LE, /* ma_format_s32 */ - MA_SND_PCM_FORMAT_FLOAT_LE /* ma_format_f32 */ - }; - - if (ma_is_big_endian()) { - ALSAFormats[0] = MA_SND_PCM_FORMAT_UNKNOWN; - ALSAFormats[1] = MA_SND_PCM_FORMAT_U8; - ALSAFormats[2] = MA_SND_PCM_FORMAT_S16_BE; - ALSAFormats[3] = MA_SND_PCM_FORMAT_S24_3BE; - ALSAFormats[4] = MA_SND_PCM_FORMAT_S32_BE; - ALSAFormats[5] = MA_SND_PCM_FORMAT_FLOAT_BE; - } - - return ALSAFormats[format]; -} - -static ma_format ma_format_from_alsa(ma_snd_pcm_format_t formatALSA) -{ - if (ma_is_little_endian()) { - switch (formatALSA) { - case MA_SND_PCM_FORMAT_S16_LE: return ma_format_s16; - case MA_SND_PCM_FORMAT_S24_3LE: return ma_format_s24; - case MA_SND_PCM_FORMAT_S32_LE: return ma_format_s32; - case MA_SND_PCM_FORMAT_FLOAT_LE: return ma_format_f32; - default: break; - } - } else { - switch (formatALSA) { - case MA_SND_PCM_FORMAT_S16_BE: return ma_format_s16; - case MA_SND_PCM_FORMAT_S24_3BE: return ma_format_s24; - case MA_SND_PCM_FORMAT_S32_BE: return ma_format_s32; - case MA_SND_PCM_FORMAT_FLOAT_BE: return ma_format_f32; - default: break; - } - } - - /* Endian agnostic. */ - switch (formatALSA) { - case MA_SND_PCM_FORMAT_U8: return ma_format_u8; - default: return ma_format_unknown; - } -} - -static ma_channel ma_convert_alsa_channel_position_to_ma_channel(unsigned int alsaChannelPos) -{ - switch (alsaChannelPos) - { - case MA_SND_CHMAP_MONO: return MA_CHANNEL_MONO; - case MA_SND_CHMAP_FL: return MA_CHANNEL_FRONT_LEFT; - case MA_SND_CHMAP_FR: return MA_CHANNEL_FRONT_RIGHT; - case MA_SND_CHMAP_RL: return MA_CHANNEL_BACK_LEFT; - case MA_SND_CHMAP_RR: return MA_CHANNEL_BACK_RIGHT; - case MA_SND_CHMAP_FC: return MA_CHANNEL_FRONT_CENTER; - case MA_SND_CHMAP_LFE: return MA_CHANNEL_LFE; - case MA_SND_CHMAP_SL: return MA_CHANNEL_SIDE_LEFT; - case MA_SND_CHMAP_SR: return MA_CHANNEL_SIDE_RIGHT; - case MA_SND_CHMAP_RC: return MA_CHANNEL_BACK_CENTER; - case MA_SND_CHMAP_FLC: return MA_CHANNEL_FRONT_LEFT_CENTER; - case MA_SND_CHMAP_FRC: return MA_CHANNEL_FRONT_RIGHT_CENTER; - case MA_SND_CHMAP_RLC: return 0; - case MA_SND_CHMAP_RRC: return 0; - case MA_SND_CHMAP_FLW: return 0; - case MA_SND_CHMAP_FRW: return 0; - case MA_SND_CHMAP_FLH: return 0; - case MA_SND_CHMAP_FCH: return 0; - case MA_SND_CHMAP_FRH: return 0; - case MA_SND_CHMAP_TC: return MA_CHANNEL_TOP_CENTER; - case MA_SND_CHMAP_TFL: return MA_CHANNEL_TOP_FRONT_LEFT; - case MA_SND_CHMAP_TFR: return MA_CHANNEL_TOP_FRONT_RIGHT; - case MA_SND_CHMAP_TFC: return MA_CHANNEL_TOP_FRONT_CENTER; - case MA_SND_CHMAP_TRL: return MA_CHANNEL_TOP_BACK_LEFT; - case MA_SND_CHMAP_TRR: return MA_CHANNEL_TOP_BACK_RIGHT; - case MA_SND_CHMAP_TRC: return MA_CHANNEL_TOP_BACK_CENTER; - default: break; - } - - return 0; -} - -static ma_bool32 ma_is_common_device_name__alsa(const char* name) -{ - size_t iName; - for (iName = 0; iName < ma_countof(g_maCommonDeviceNamesALSA); ++iName) { - if (ma_strcmp(name, g_maCommonDeviceNamesALSA[iName]) == 0) { - return MA_TRUE; - } - } - - return MA_FALSE; -} - - -static ma_bool32 ma_is_playback_device_blacklisted__alsa(const char* name) -{ - size_t iName; - for (iName = 0; iName < ma_countof(g_maBlacklistedPlaybackDeviceNamesALSA); ++iName) { - if (ma_strcmp(name, g_maBlacklistedPlaybackDeviceNamesALSA[iName]) == 0) { - return MA_TRUE; - } - } - - return MA_FALSE; -} - -static ma_bool32 ma_is_capture_device_blacklisted__alsa(const char* name) -{ - size_t iName; - for (iName = 0; iName < ma_countof(g_maBlacklistedCaptureDeviceNamesALSA); ++iName) { - if (ma_strcmp(name, g_maBlacklistedCaptureDeviceNamesALSA[iName]) == 0) { - return MA_TRUE; - } - } - - return MA_FALSE; -} - -static ma_bool32 ma_is_device_blacklisted__alsa(ma_device_type deviceType, const char* name) -{ - if (deviceType == ma_device_type_playback) { - return ma_is_playback_device_blacklisted__alsa(name); - } else { - return ma_is_capture_device_blacklisted__alsa(name); - } -} - - -static const char* ma_find_char(const char* str, char c, int* index) -{ - int i = 0; - for (;;) { - if (str[i] == '\0') { - if (index) *index = -1; - return NULL; - } - - if (str[i] == c) { - if (index) *index = i; - return str + i; - } - - i += 1; - } - - /* Should never get here, but treat it as though the character was not found to make me feel better inside. */ - if (index) *index = -1; - return NULL; -} - -static ma_bool32 ma_is_device_name_in_hw_format__alsa(const char* hwid) -{ - /* This function is just checking whether or not hwid is in "hw:%d,%d" format. */ - - int commaPos; - const char* dev; - int i; - - if (hwid == NULL) { - return MA_FALSE; - } - - if (hwid[0] != 'h' || hwid[1] != 'w' || hwid[2] != ':') { - return MA_FALSE; - } - - hwid += 3; - - dev = ma_find_char(hwid, ',', &commaPos); - if (dev == NULL) { - return MA_FALSE; - } else { - dev += 1; /* Skip past the ",". */ - } - - /* Check if the part between the ":" and the "," contains only numbers. If not, return false. */ - for (i = 0; i < commaPos; ++i) { - if (hwid[i] < '0' || hwid[i] > '9') { - return MA_FALSE; - } - } - - /* Check if everything after the "," is numeric. If not, return false. */ - i = 0; - while (dev[i] != '\0') { - if (dev[i] < '0' || dev[i] > '9') { - return MA_FALSE; - } - i += 1; - } - - return MA_TRUE; -} - -static int ma_convert_device_name_to_hw_format__alsa(ma_context* pContext, char* dst, size_t dstSize, const char* src) /* Returns 0 on success, non-0 on error. */ -{ - /* src should look something like this: "hw:CARD=I82801AAICH,DEV=0" */ - - int colonPos; - int commaPos; - char card[256]; - const char* dev; - int cardIndex; - - if (dst == NULL) { - return -1; - } - if (dstSize < 7) { - return -1; /* Absolute minimum size of the output buffer is 7 bytes. */ - } - - *dst = '\0'; /* Safety. */ - if (src == NULL) { - return -1; - } - - /* If the input name is already in "hw:%d,%d" format, just return that verbatim. */ - if (ma_is_device_name_in_hw_format__alsa(src)) { - return ma_strcpy_s(dst, dstSize, src); - } - - src = ma_find_char(src, ':', &colonPos); - if (src == NULL) { - return -1; /* Couldn't find a colon */ - } - - dev = ma_find_char(src, ',', &commaPos); - if (dev == NULL) { - dev = "0"; - ma_strncpy_s(card, sizeof(card), src+6, (size_t)-1); /* +6 = ":CARD=" */ - } else { - dev = dev + 5; /* +5 = ",DEV=" */ - ma_strncpy_s(card, sizeof(card), src+6, commaPos-6); /* +6 = ":CARD=" */ - } - - cardIndex = ((ma_snd_card_get_index_proc)pContext->alsa.snd_card_get_index)(card); - if (cardIndex < 0) { - return -2; /* Failed to retrieve the card index. */ - } - - - /* Construction. */ - dst[0] = 'h'; dst[1] = 'w'; dst[2] = ':'; - if (ma_itoa_s(cardIndex, dst+3, dstSize-3, 10) != 0) { - return -3; - } - if (ma_strcat_s(dst, dstSize, ",") != 0) { - return -3; - } - if (ma_strcat_s(dst, dstSize, dev) != 0) { - return -3; - } - - return 0; -} - -static ma_bool32 ma_does_id_exist_in_list__alsa(ma_device_id* pUniqueIDs, ma_uint32 count, const char* pHWID) -{ - ma_uint32 i; - - MA_ASSERT(pHWID != NULL); - - for (i = 0; i < count; ++i) { - if (ma_strcmp(pUniqueIDs[i].alsa, pHWID) == 0) { - return MA_TRUE; - } - } - - return MA_FALSE; -} - - -static ma_result ma_context_open_pcm__alsa(ma_context* pContext, ma_share_mode shareMode, ma_device_type deviceType, const ma_device_id* pDeviceID, int openMode, ma_snd_pcm_t** ppPCM) -{ - ma_snd_pcm_t* pPCM; - ma_snd_pcm_stream_t stream; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppPCM != NULL); - - *ppPCM = NULL; - pPCM = NULL; - - stream = (deviceType == ma_device_type_playback) ? MA_SND_PCM_STREAM_PLAYBACK : MA_SND_PCM_STREAM_CAPTURE; - - if (pDeviceID == NULL) { - ma_bool32 isDeviceOpen; - size_t i; - - /* - We're opening the default device. I don't know if trying anything other than "default" is necessary, but it makes - me feel better to try as hard as we can get to get _something_ working. - */ - const char* defaultDeviceNames[] = { - "default", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL - }; - - if (shareMode == ma_share_mode_exclusive) { - defaultDeviceNames[1] = "hw"; - defaultDeviceNames[2] = "hw:0"; - defaultDeviceNames[3] = "hw:0,0"; - } else { - if (deviceType == ma_device_type_playback) { - defaultDeviceNames[1] = "dmix"; - defaultDeviceNames[2] = "dmix:0"; - defaultDeviceNames[3] = "dmix:0,0"; - } else { - defaultDeviceNames[1] = "dsnoop"; - defaultDeviceNames[2] = "dsnoop:0"; - defaultDeviceNames[3] = "dsnoop:0,0"; - } - defaultDeviceNames[4] = "hw"; - defaultDeviceNames[5] = "hw:0"; - defaultDeviceNames[6] = "hw:0,0"; - } - - isDeviceOpen = MA_FALSE; - for (i = 0; i < ma_countof(defaultDeviceNames); ++i) { - if (defaultDeviceNames[i] != NULL && defaultDeviceNames[i][0] != '\0') { - if (((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, defaultDeviceNames[i], stream, openMode) == 0) { - isDeviceOpen = MA_TRUE; - break; - } - } - } - - if (!isDeviceOpen) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[ALSA] snd_pcm_open() failed when trying to open an appropriate default device."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - } else { - /* - We're trying to open a specific device. There's a few things to consider here: - - miniaudio recongnizes a special format of device id that excludes the "hw", "dmix", etc. prefix. It looks like this: ":0,0", ":0,1", etc. When - an ID of this format is specified, it indicates to miniaudio that it can try different combinations of plugins ("hw", "dmix", etc.) until it - finds an appropriate one that works. This comes in very handy when trying to open a device in shared mode ("dmix"), vs exclusive mode ("hw"). - */ - - /* May end up needing to make small adjustments to the ID, so make a copy. */ - ma_device_id deviceID = *pDeviceID; - int resultALSA = -ENODEV; - - if (deviceID.alsa[0] != ':') { - /* The ID is not in ":0,0" format. Use the ID exactly as-is. */ - resultALSA = ((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, deviceID.alsa, stream, openMode); - } else { - char hwid[256]; - - /* The ID is in ":0,0" format. Try different plugins depending on the shared mode. */ - if (deviceID.alsa[1] == '\0') { - deviceID.alsa[0] = '\0'; /* An ID of ":" should be converted to "". */ - } - - if (shareMode == ma_share_mode_shared) { - if (deviceType == ma_device_type_playback) { - ma_strcpy_s(hwid, sizeof(hwid), "dmix"); - } else { - ma_strcpy_s(hwid, sizeof(hwid), "dsnoop"); - } - - if (ma_strcat_s(hwid, sizeof(hwid), deviceID.alsa) == 0) { - resultALSA = ((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, hwid, stream, openMode); - } - } - - /* If at this point we still don't have an open device it means we're either preferencing exclusive mode or opening with "dmix"/"dsnoop" failed. */ - if (resultALSA != 0) { - ma_strcpy_s(hwid, sizeof(hwid), "hw"); - if (ma_strcat_s(hwid, sizeof(hwid), deviceID.alsa) == 0) { - resultALSA = ((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, hwid, stream, openMode); - } - } - } - - if (resultALSA < 0) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[ALSA] snd_pcm_open() failed."); - return ma_result_from_errno(-resultALSA); - } - } - - *ppPCM = pPCM; - return MA_SUCCESS; -} - - -static ma_result ma_context_enumerate_devices__alsa(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - int resultALSA; - ma_bool32 cbResult = MA_TRUE; - char** ppDeviceHints; - ma_device_id* pUniqueIDs = NULL; - ma_uint32 uniqueIDCount = 0; - char** ppNextDeviceHint; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - ma_mutex_lock(&pContext->alsa.internalDeviceEnumLock); - - resultALSA = ((ma_snd_device_name_hint_proc)pContext->alsa.snd_device_name_hint)(-1, "pcm", (void***)&ppDeviceHints); - if (resultALSA < 0) { - ma_mutex_unlock(&pContext->alsa.internalDeviceEnumLock); - return ma_result_from_errno(-resultALSA); - } - - ppNextDeviceHint = ppDeviceHints; - while (*ppNextDeviceHint != NULL) { - char* NAME = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, "NAME"); - char* DESC = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, "DESC"); - char* IOID = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, "IOID"); - ma_device_type deviceType = ma_device_type_playback; - ma_bool32 stopEnumeration = MA_FALSE; - char hwid[sizeof(pUniqueIDs->alsa)]; - ma_device_info deviceInfo; - - if ((IOID == NULL || ma_strcmp(IOID, "Output") == 0)) { - deviceType = ma_device_type_playback; - } - if ((IOID != NULL && ma_strcmp(IOID, "Input" ) == 0)) { - deviceType = ma_device_type_capture; - } - - if (NAME != NULL) { - if (pContext->alsa.useVerboseDeviceEnumeration) { - /* Verbose mode. Use the name exactly as-is. */ - ma_strncpy_s(hwid, sizeof(hwid), NAME, (size_t)-1); - } else { - /* Simplified mode. Use ":%d,%d" format. */ - if (ma_convert_device_name_to_hw_format__alsa(pContext, hwid, sizeof(hwid), NAME) == 0) { - /* - At this point, hwid looks like "hw:0,0". In simplified enumeration mode, we actually want to strip off the - plugin name so it looks like ":0,0". The reason for this is that this special format is detected at device - initialization time and is used as an indicator to try and use the most appropriate plugin depending on the - device type and sharing mode. - */ - char* dst = hwid; - char* src = hwid+2; - while ((*dst++ = *src++)); - } else { - /* Conversion to "hw:%d,%d" failed. Just use the name as-is. */ - ma_strncpy_s(hwid, sizeof(hwid), NAME, (size_t)-1); - } - - if (ma_does_id_exist_in_list__alsa(pUniqueIDs, uniqueIDCount, hwid)) { - goto next_device; /* The device has already been enumerated. Move on to the next one. */ - } else { - /* The device has not yet been enumerated. Make sure it's added to our list so that it's not enumerated again. */ - size_t newCapacity = sizeof(*pUniqueIDs) * (uniqueIDCount + 1); - ma_device_id* pNewUniqueIDs = (ma_device_id*)ma_realloc(pUniqueIDs, newCapacity, &pContext->allocationCallbacks); - if (pNewUniqueIDs == NULL) { - goto next_device; /* Failed to allocate memory. */ - } - - pUniqueIDs = pNewUniqueIDs; - MA_COPY_MEMORY(pUniqueIDs[uniqueIDCount].alsa, hwid, sizeof(hwid)); - uniqueIDCount += 1; - } - } - } else { - MA_ZERO_MEMORY(hwid, sizeof(hwid)); - } - - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.id.alsa, sizeof(deviceInfo.id.alsa), hwid, (size_t)-1); - - /* - There's no good way to determine whether or not a device is the default on Linux. We're just going to do something simple and - just use the name of "default" as the indicator. - */ - if (ma_strcmp(deviceInfo.id.alsa, "default") == 0) { - deviceInfo.isDefault = MA_TRUE; - } - - - /* - DESC is the friendly name. We treat this slightly differently depending on whether or not we are using verbose - device enumeration. In verbose mode we want to take the entire description so that the end-user can distinguish - between the subdevices of each card/dev pair. In simplified mode, however, we only want the first part of the - description. - - The value in DESC seems to be split into two lines, with the first line being the name of the device and the - second line being a description of the device. I don't like having the description be across two lines because - it makes formatting ugly and annoying. I'm therefore deciding to put it all on a single line with the second line - being put into parentheses. In simplified mode I'm just stripping the second line entirely. - */ - if (DESC != NULL) { - int lfPos; - const char* line2 = ma_find_char(DESC, '\n', &lfPos); - if (line2 != NULL) { - line2 += 1; /* Skip past the new-line character. */ - - if (pContext->alsa.useVerboseDeviceEnumeration) { - /* Verbose mode. Put the second line in brackets. */ - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, lfPos); - ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), " ("); - ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), line2); - ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), ")"); - } else { - /* Simplified mode. Strip the second line entirely. */ - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, lfPos); - } - } else { - /* There's no second line. Just copy the whole description. */ - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, (size_t)-1); - } - } - - if (!ma_is_device_blacklisted__alsa(deviceType, NAME)) { - cbResult = callback(pContext, deviceType, &deviceInfo, pUserData); - } - - /* - Some devices are both playback and capture, but they are only enumerated by ALSA once. We need to fire the callback - again for the other device type in this case. We do this for known devices and where the IOID hint is NULL, which - means both Input and Output. - */ - if (cbResult) { - if (ma_is_common_device_name__alsa(NAME) || IOID == NULL) { - if (deviceType == ma_device_type_playback) { - if (!ma_is_capture_device_blacklisted__alsa(NAME)) { - cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - } else { - if (!ma_is_playback_device_blacklisted__alsa(NAME)) { - cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - } - } - } - - if (cbResult == MA_FALSE) { - stopEnumeration = MA_TRUE; - } - - next_device: - free(NAME); - free(DESC); - free(IOID); - ppNextDeviceHint += 1; - - /* We need to stop enumeration if the callback returned false. */ - if (stopEnumeration) { - break; - } - } - - ma_free(pUniqueIDs, &pContext->allocationCallbacks); - ((ma_snd_device_name_free_hint_proc)pContext->alsa.snd_device_name_free_hint)((void**)ppDeviceHints); - - ma_mutex_unlock(&pContext->alsa.internalDeviceEnumLock); - - return MA_SUCCESS; -} - - -typedef struct -{ - ma_device_type deviceType; - const ma_device_id* pDeviceID; - ma_share_mode shareMode; - ma_device_info* pDeviceInfo; - ma_bool32 foundDevice; -} ma_context_get_device_info_enum_callback_data__alsa; - -static ma_bool32 ma_context_get_device_info_enum_callback__alsa(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pDeviceInfo, void* pUserData) -{ - ma_context_get_device_info_enum_callback_data__alsa* pData = (ma_context_get_device_info_enum_callback_data__alsa*)pUserData; - MA_ASSERT(pData != NULL); - - (void)pContext; - - if (pData->pDeviceID == NULL && ma_strcmp(pDeviceInfo->id.alsa, "default") == 0) { - ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pDeviceInfo->name, (size_t)-1); - pData->foundDevice = MA_TRUE; - } else { - if (pData->deviceType == deviceType && (pData->pDeviceID != NULL && ma_strcmp(pData->pDeviceID->alsa, pDeviceInfo->id.alsa) == 0)) { - ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pDeviceInfo->name, (size_t)-1); - pData->foundDevice = MA_TRUE; - } - } - - /* Keep enumerating until we have found the device. */ - return !pData->foundDevice; -} - -static void ma_context_test_rate_and_add_native_data_format__alsa(ma_context* pContext, ma_snd_pcm_t* pPCM, ma_snd_pcm_hw_params_t* pHWParams, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 flags, ma_device_info* pDeviceInfo) -{ - MA_ASSERT(pPCM != NULL); - MA_ASSERT(pHWParams != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - if (pDeviceInfo->nativeDataFormatCount < ma_countof(pDeviceInfo->nativeDataFormats) && ((ma_snd_pcm_hw_params_test_rate_proc)pContext->alsa.snd_pcm_hw_params_test_rate)(pPCM, pHWParams, sampleRate, 0) == 0) { - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = format; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels = channels; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = flags; - pDeviceInfo->nativeDataFormatCount += 1; - } -} - -static void ma_context_iterate_rates_and_add_native_data_format__alsa(ma_context* pContext, ma_snd_pcm_t* pPCM, ma_snd_pcm_hw_params_t* pHWParams, ma_format format, ma_uint32 channels, ma_uint32 flags, ma_device_info* pDeviceInfo) -{ - ma_uint32 iSampleRate; - unsigned int minSampleRate; - unsigned int maxSampleRate; - int sampleRateDir; /* Not used. Just passed into snd_pcm_hw_params_get_rate_min/max(). */ - - /* There could be a range. */ - ((ma_snd_pcm_hw_params_get_rate_min_proc)pContext->alsa.snd_pcm_hw_params_get_rate_min)(pHWParams, &minSampleRate, &sampleRateDir); - ((ma_snd_pcm_hw_params_get_rate_max_proc)pContext->alsa.snd_pcm_hw_params_get_rate_max)(pHWParams, &maxSampleRate, &sampleRateDir); - - /* Make sure our sample rates are clamped to sane values. Stupid devices like "pulse" will reports rates like "1" which is ridiculus. */ - minSampleRate = ma_clamp(minSampleRate, (unsigned int)ma_standard_sample_rate_min, (unsigned int)ma_standard_sample_rate_max); - maxSampleRate = ma_clamp(maxSampleRate, (unsigned int)ma_standard_sample_rate_min, (unsigned int)ma_standard_sample_rate_max); - - for (iSampleRate = 0; iSampleRate < ma_countof(g_maStandardSampleRatePriorities); iSampleRate += 1) { - ma_uint32 standardSampleRate = g_maStandardSampleRatePriorities[iSampleRate]; - - if (standardSampleRate >= minSampleRate && standardSampleRate <= maxSampleRate) { - ma_context_test_rate_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, standardSampleRate, flags, pDeviceInfo); - } - } - - /* Now make sure our min and max rates are included just in case they aren't in the range of our standard rates. */ - if (!ma_is_standard_sample_rate(minSampleRate)) { - ma_context_test_rate_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, minSampleRate, flags, pDeviceInfo); - } - - if (!ma_is_standard_sample_rate(maxSampleRate) && maxSampleRate != minSampleRate) { - ma_context_test_rate_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, maxSampleRate, flags, pDeviceInfo); - } -} - -static ma_result ma_context_get_device_info__alsa(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_context_get_device_info_enum_callback_data__alsa data; - ma_result result; - int resultALSA; - ma_snd_pcm_t* pPCM; - ma_snd_pcm_hw_params_t* pHWParams; - ma_uint32 iFormat; - ma_uint32 iChannel; - - MA_ASSERT(pContext != NULL); - - /* We just enumerate to find basic information about the device. */ - data.deviceType = deviceType; - data.pDeviceID = pDeviceID; - data.pDeviceInfo = pDeviceInfo; - data.foundDevice = MA_FALSE; - result = ma_context_enumerate_devices__alsa(pContext, ma_context_get_device_info_enum_callback__alsa, &data); - if (result != MA_SUCCESS) { - return result; - } - - if (!data.foundDevice) { - return MA_NO_DEVICE; - } - - if (ma_strcmp(pDeviceInfo->id.alsa, "default") == 0) { - pDeviceInfo->isDefault = MA_TRUE; - } - - /* For detailed info we need to open the device. */ - result = ma_context_open_pcm__alsa(pContext, ma_share_mode_shared, deviceType, pDeviceID, 0, &pPCM); - if (result != MA_SUCCESS) { - return result; - } - - /* We need to initialize a HW parameters object in order to know what formats are supported. */ - pHWParams = (ma_snd_pcm_hw_params_t*)ma_calloc(((ma_snd_pcm_hw_params_sizeof_proc)pContext->alsa.snd_pcm_hw_params_sizeof)(), &pContext->allocationCallbacks); - if (pHWParams == NULL) { - ((ma_snd_pcm_close_proc)pContext->alsa.snd_pcm_close)(pPCM); - return MA_OUT_OF_MEMORY; - } - - resultALSA = ((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams); - if (resultALSA < 0) { - ma_free(pHWParams, &pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pContext->alsa.snd_pcm_close)(pPCM); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to initialize hardware parameters. snd_pcm_hw_params_any() failed."); - return ma_result_from_errno(-resultALSA); - } - - /* - Some ALSA devices can support many permutations of formats, channels and rates. We only support - a fixed number of permutations which means we need to employ some strategies to ensure the best - combinations are returned. An example is the "pulse" device which can do it's own data conversion - in software and as a result can support any combination of format, channels and rate. - - We want to ensure the the first data formats are the best. We have a list of favored sample - formats and sample rates, so these will be the basis of our iteration. - */ - - /* Formats. We just iterate over our standard formats and test them, making sure we reset the configuration space each iteration. */ - for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); iFormat += 1) { - ma_format format = g_maFormatPriorities[iFormat]; - - /* - For each format we need to make sure we reset the configuration space so we don't return - channel counts and rates that aren't compatible with a format. - */ - ((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams); - - /* Test the format first. If this fails it means the format is not supported and we can skip it. */ - if (((ma_snd_pcm_hw_params_test_format_proc)pContext->alsa.snd_pcm_hw_params_test_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(format)) == 0) { - /* The format is supported. */ - unsigned int minChannels; - unsigned int maxChannels; - - /* - The configuration space needs to be restricted to this format so we can get an accurate - picture of which sample rates and channel counts are support with this format. - */ - ((ma_snd_pcm_hw_params_set_format_proc)pContext->alsa.snd_pcm_hw_params_set_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(format)); - - /* Now we need to check for supported channels. */ - ((ma_snd_pcm_hw_params_get_channels_min_proc)pContext->alsa.snd_pcm_hw_params_get_channels_min)(pHWParams, &minChannels); - ((ma_snd_pcm_hw_params_get_channels_max_proc)pContext->alsa.snd_pcm_hw_params_get_channels_max)(pHWParams, &maxChannels); - - if (minChannels > MA_MAX_CHANNELS) { - continue; /* Too many channels. */ - } - if (maxChannels < MA_MIN_CHANNELS) { - continue; /* Not enough channels. */ - } - - /* - Make sure the channel count is clamped. This is mainly intended for the max channels - because some devices can report an unbound maximum. - */ - minChannels = ma_clamp(minChannels, MA_MIN_CHANNELS, MA_MAX_CHANNELS); - maxChannels = ma_clamp(maxChannels, MA_MIN_CHANNELS, MA_MAX_CHANNELS); - - if (minChannels == MA_MIN_CHANNELS && maxChannels == MA_MAX_CHANNELS) { - /* The device supports all channels. Don't iterate over every single one. Instead just set the channels to 0 which means all channels are supported. */ - ma_context_iterate_rates_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, 0, 0, pDeviceInfo); /* Intentionally setting the channel count to 0 as that means all channels are supported. */ - } else { - /* The device only supports a specific set of channels. We need to iterate over all of them. */ - for (iChannel = minChannels; iChannel <= maxChannels; iChannel += 1) { - /* Test the channel before applying it to the configuration space. */ - unsigned int channels = iChannel; - - /* Make sure our channel range is reset before testing again or else we'll always fail the test. */ - ((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams); - ((ma_snd_pcm_hw_params_set_format_proc)pContext->alsa.snd_pcm_hw_params_set_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(format)); - - if (((ma_snd_pcm_hw_params_test_channels_proc)pContext->alsa.snd_pcm_hw_params_test_channels)(pPCM, pHWParams, channels) == 0) { - /* The channel count is supported. */ - - /* The configuration space now needs to be restricted to the channel count before extracting the sample rate. */ - ((ma_snd_pcm_hw_params_set_channels_proc)pContext->alsa.snd_pcm_hw_params_set_channels)(pPCM, pHWParams, channels); - - /* Only after the configuration space has been restricted to the specific channel count should we iterate over our sample rates. */ - ma_context_iterate_rates_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, 0, pDeviceInfo); - } else { - /* The channel count is not supported. Skip. */ - } - } - } - } else { - /* The format is not supported. Skip. */ - } - } - - ma_free(pHWParams, &pContext->allocationCallbacks); - - ((ma_snd_pcm_close_proc)pContext->alsa.snd_pcm_close)(pPCM); - return MA_SUCCESS; -} - -static ma_result ma_device_uninit__alsa(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if ((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) { - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture); - close(pDevice->alsa.wakeupfdCapture); - ma_free(pDevice->alsa.pPollDescriptorsCapture, &pDevice->pContext->allocationCallbacks); - } - - if ((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback) { - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback); - close(pDevice->alsa.wakeupfdPlayback); - ma_free(pDevice->alsa.pPollDescriptorsPlayback, &pDevice->pContext->allocationCallbacks); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_init_by_type__alsa(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType) -{ - ma_result result; - int resultALSA; - ma_snd_pcm_t* pPCM; - ma_bool32 isUsingMMap; - ma_snd_pcm_format_t formatALSA; - ma_format internalFormat; - ma_uint32 internalChannels; - ma_uint32 internalSampleRate; - ma_channel internalChannelMap[MA_MAX_CHANNELS]; - ma_uint32 internalPeriodSizeInFrames; - ma_uint32 internalPeriods; - int openMode; - ma_snd_pcm_hw_params_t* pHWParams; - ma_snd_pcm_sw_params_t* pSWParams; - ma_snd_pcm_uframes_t bufferBoundary; - int pollDescriptorCount; - struct pollfd* pPollDescriptors; - int wakeupfd; - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(deviceType != ma_device_type_duplex); /* This function should only be called for playback _or_ capture, never duplex. */ - MA_ASSERT(pDevice != NULL); - - formatALSA = ma_convert_ma_format_to_alsa_format(pDescriptor->format); - - openMode = 0; - if (pConfig->alsa.noAutoResample) { - openMode |= MA_SND_PCM_NO_AUTO_RESAMPLE; - } - if (pConfig->alsa.noAutoChannels) { - openMode |= MA_SND_PCM_NO_AUTO_CHANNELS; - } - if (pConfig->alsa.noAutoFormat) { - openMode |= MA_SND_PCM_NO_AUTO_FORMAT; - } - - result = ma_context_open_pcm__alsa(pDevice->pContext, pDescriptor->shareMode, deviceType, pDescriptor->pDeviceID, openMode, &pPCM); - if (result != MA_SUCCESS) { - return result; - } - - - /* Hardware parameters. */ - pHWParams = (ma_snd_pcm_hw_params_t*)ma_calloc(((ma_snd_pcm_hw_params_sizeof_proc)pDevice->pContext->alsa.snd_pcm_hw_params_sizeof)(), &pDevice->pContext->allocationCallbacks); - if (pHWParams == NULL) { - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to allocate memory for hardware parameters."); - return MA_OUT_OF_MEMORY; - } - - resultALSA = ((ma_snd_pcm_hw_params_any_proc)pDevice->pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to initialize hardware parameters. snd_pcm_hw_params_any() failed."); - return ma_result_from_errno(-resultALSA); - } - - /* MMAP Mode. Try using interleaved MMAP access. If this fails, fall back to standard readi/writei. */ - isUsingMMap = MA_FALSE; -#if 0 /* NOTE: MMAP mode temporarily disabled. */ - if (deviceType != ma_device_type_capture) { /* <-- Disabling MMAP mode for capture devices because I apparently do not have a device that supports it which means I can't test it... Contributions welcome. */ - if (!pConfig->alsa.noMMap && ma_device__is_async(pDevice)) { - if (((ma_snd_pcm_hw_params_set_access_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_access)(pPCM, pHWParams, MA_SND_PCM_ACCESS_MMAP_INTERLEAVED) == 0) { - pDevice->alsa.isUsingMMap = MA_TRUE; - } - } - } -#endif - - if (!isUsingMMap) { - resultALSA = ((ma_snd_pcm_hw_params_set_access_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_access)(pPCM, pHWParams, MA_SND_PCM_ACCESS_RW_INTERLEAVED); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set access mode to neither SND_PCM_ACCESS_MMAP_INTERLEAVED nor SND_PCM_ACCESS_RW_INTERLEAVED. snd_pcm_hw_params_set_access() failed."); - return ma_result_from_errno(-resultALSA); - } - } - - /* - Most important properties first. The documentation for OSS (yes, I know this is ALSA!) recommends format, channels, then sample rate. I can't - find any documentation for ALSA specifically, so I'm going to copy the recommendation for OSS. - */ - - /* Format. */ - { - /* - At this point we should have a list of supported formats, so now we need to find the best one. We first check if the requested format is - supported, and if so, use that one. If it's not supported, we just run though a list of formats and try to find the best one. - */ - if (formatALSA == MA_SND_PCM_FORMAT_UNKNOWN || ((ma_snd_pcm_hw_params_test_format_proc)pDevice->pContext->alsa.snd_pcm_hw_params_test_format)(pPCM, pHWParams, formatALSA) != 0) { - /* We're either requesting the native format or the specified format is not supported. */ - size_t iFormat; - - formatALSA = MA_SND_PCM_FORMAT_UNKNOWN; - for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); ++iFormat) { - if (((ma_snd_pcm_hw_params_test_format_proc)pDevice->pContext->alsa.snd_pcm_hw_params_test_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(g_maFormatPriorities[iFormat])) == 0) { - formatALSA = ma_convert_ma_format_to_alsa_format(g_maFormatPriorities[iFormat]); - break; - } - } - - if (formatALSA == MA_SND_PCM_FORMAT_UNKNOWN) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Format not supported. The device does not support any miniaudio formats."); - return MA_FORMAT_NOT_SUPPORTED; - } - } - - resultALSA = ((ma_snd_pcm_hw_params_set_format_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_format)(pPCM, pHWParams, formatALSA); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Format not supported. snd_pcm_hw_params_set_format() failed."); - return ma_result_from_errno(-resultALSA); - } - - internalFormat = ma_format_from_alsa(formatALSA); - if (internalFormat == ma_format_unknown) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] The chosen format is not supported by miniaudio."); - return MA_FORMAT_NOT_SUPPORTED; - } - } - - /* Channels. */ - { - unsigned int channels = pDescriptor->channels; - if (channels == 0) { - channels = MA_DEFAULT_CHANNELS; - } - - resultALSA = ((ma_snd_pcm_hw_params_set_channels_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_channels_near)(pPCM, pHWParams, &channels); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set channel count. snd_pcm_hw_params_set_channels_near() failed."); - return ma_result_from_errno(-resultALSA); - } - - internalChannels = (ma_uint32)channels; - } - - /* Sample Rate */ - { - unsigned int sampleRate; - - /* - It appears there's either a bug in ALSA, a bug in some drivers, or I'm doing something silly; but having resampling enabled causes - problems with some device configurations when used in conjunction with MMAP access mode. To fix this problem we need to disable - resampling. - - To reproduce this problem, open the "plug:dmix" device, and set the sample rate to 44100. Internally, it looks like dmix uses a - sample rate of 48000. The hardware parameters will get set correctly with no errors, but it looks like the 44100 -> 48000 resampling - doesn't work properly - but only with MMAP access mode. You will notice skipping/crackling in the audio, and it'll run at a slightly - faster rate. - - miniaudio has built-in support for sample rate conversion (albeit low quality at the moment), so disabling resampling should be fine - for us. The only problem is that it won't be taking advantage of any kind of hardware-accelerated resampling and it won't be very - good quality until I get a chance to improve the quality of miniaudio's software sample rate conversion. - - I don't currently know if the dmix plugin is the only one with this error. Indeed, this is the only one I've been able to reproduce - this error with. In the future, we may want to restrict the disabling of resampling to only known bad plugins. - */ - ((ma_snd_pcm_hw_params_set_rate_resample_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_rate_resample)(pPCM, pHWParams, 0); - - sampleRate = pDescriptor->sampleRate; - if (sampleRate == 0) { - sampleRate = MA_DEFAULT_SAMPLE_RATE; - } - - resultALSA = ((ma_snd_pcm_hw_params_set_rate_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_rate_near)(pPCM, pHWParams, &sampleRate, 0); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Sample rate not supported. snd_pcm_hw_params_set_rate_near() failed."); - return ma_result_from_errno(-resultALSA); - } - - internalSampleRate = (ma_uint32)sampleRate; - } - - /* Periods. */ - { - ma_uint32 periods = pDescriptor->periodCount; - - resultALSA = ((ma_snd_pcm_hw_params_set_periods_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_periods_near)(pPCM, pHWParams, &periods, NULL); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set period count. snd_pcm_hw_params_set_periods_near() failed."); - return ma_result_from_errno(-resultALSA); - } - - internalPeriods = periods; - } - - /* Buffer Size */ - { - ma_snd_pcm_uframes_t actualBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, internalSampleRate, pConfig->performanceProfile) * internalPeriods; - - resultALSA = ((ma_snd_pcm_hw_params_set_buffer_size_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_buffer_size_near)(pPCM, pHWParams, &actualBufferSizeInFrames); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set buffer size for device. snd_pcm_hw_params_set_buffer_size() failed."); - return ma_result_from_errno(-resultALSA); - } - - internalPeriodSizeInFrames = actualBufferSizeInFrames / internalPeriods; - } - - /* Apply hardware parameters. */ - resultALSA = ((ma_snd_pcm_hw_params_proc)pDevice->pContext->alsa.snd_pcm_hw_params)(pPCM, pHWParams); - if (resultALSA < 0) { - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set hardware parameters. snd_pcm_hw_params() failed."); - return ma_result_from_errno(-resultALSA); - } - - ma_free(pHWParams, &pDevice->pContext->allocationCallbacks); - pHWParams = NULL; - - - /* Software parameters. */ - pSWParams = (ma_snd_pcm_sw_params_t*)ma_calloc(((ma_snd_pcm_sw_params_sizeof_proc)pDevice->pContext->alsa.snd_pcm_sw_params_sizeof)(), &pDevice->pContext->allocationCallbacks); - if (pSWParams == NULL) { - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to allocate memory for software parameters."); - return MA_OUT_OF_MEMORY; - } - - resultALSA = ((ma_snd_pcm_sw_params_current_proc)pDevice->pContext->alsa.snd_pcm_sw_params_current)(pPCM, pSWParams); - if (resultALSA < 0) { - ma_free(pSWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to initialize software parameters. snd_pcm_sw_params_current() failed."); - return ma_result_from_errno(-resultALSA); - } - - resultALSA = ((ma_snd_pcm_sw_params_set_avail_min_proc)pDevice->pContext->alsa.snd_pcm_sw_params_set_avail_min)(pPCM, pSWParams, ma_prev_power_of_2(internalPeriodSizeInFrames)); - if (resultALSA < 0) { - ma_free(pSWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] snd_pcm_sw_params_set_avail_min() failed."); - return ma_result_from_errno(-resultALSA); - } - - resultALSA = ((ma_snd_pcm_sw_params_get_boundary_proc)pDevice->pContext->alsa.snd_pcm_sw_params_get_boundary)(pSWParams, &bufferBoundary); - if (resultALSA < 0) { - bufferBoundary = internalPeriodSizeInFrames * internalPeriods; - } - - if (deviceType == ma_device_type_playback && !isUsingMMap) { /* Only playback devices in writei/readi mode need a start threshold. */ - /* - Subtle detail here with the start threshold. When in playback-only mode (no full-duplex) we can set the start threshold to - the size of a period. But for full-duplex we need to set it such that it is at least two periods. - */ - resultALSA = ((ma_snd_pcm_sw_params_set_start_threshold_proc)pDevice->pContext->alsa.snd_pcm_sw_params_set_start_threshold)(pPCM, pSWParams, internalPeriodSizeInFrames*2); - if (resultALSA < 0) { - ma_free(pSWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set start threshold for playback device. snd_pcm_sw_params_set_start_threshold() failed."); - return ma_result_from_errno(-resultALSA); - } - - resultALSA = ((ma_snd_pcm_sw_params_set_stop_threshold_proc)pDevice->pContext->alsa.snd_pcm_sw_params_set_stop_threshold)(pPCM, pSWParams, bufferBoundary); - if (resultALSA < 0) { /* Set to boundary to loop instead of stop in the event of an xrun. */ - ma_free(pSWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set stop threshold for playback device. snd_pcm_sw_params_set_stop_threshold() failed."); - return ma_result_from_errno(-resultALSA); - } - } - - resultALSA = ((ma_snd_pcm_sw_params_proc)pDevice->pContext->alsa.snd_pcm_sw_params)(pPCM, pSWParams); - if (resultALSA < 0) { - ma_free(pSWParams, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to set software parameters. snd_pcm_sw_params() failed."); - return ma_result_from_errno(-resultALSA); - } - - ma_free(pSWParams, &pDevice->pContext->allocationCallbacks); - pSWParams = NULL; - - - /* Grab the internal channel map. For now we're not going to bother trying to change the channel map and instead just do it ourselves. */ - { - ma_snd_pcm_chmap_t* pChmap = ((ma_snd_pcm_get_chmap_proc)pDevice->pContext->alsa.snd_pcm_get_chmap)(pPCM); - if (pChmap != NULL) { - ma_uint32 iChannel; - - /* There are cases where the returned channel map can have a different channel count than was returned by snd_pcm_hw_params_set_channels_near(). */ - if (pChmap->channels >= internalChannels) { - /* Drop excess channels. */ - for (iChannel = 0; iChannel < internalChannels; ++iChannel) { - internalChannelMap[iChannel] = ma_convert_alsa_channel_position_to_ma_channel(pChmap->pos[iChannel]); - } - } else { - ma_uint32 i; - - /* - Excess channels use defaults. Do an initial fill with defaults, overwrite the first pChmap->channels, validate to ensure there are no duplicate - channels. If validation fails, fall back to defaults. - */ - ma_bool32 isValid = MA_TRUE; - - /* Fill with defaults. */ - ma_channel_map_init_standard(ma_standard_channel_map_alsa, internalChannelMap, ma_countof(internalChannelMap), internalChannels); - - /* Overwrite first pChmap->channels channels. */ - for (iChannel = 0; iChannel < pChmap->channels; ++iChannel) { - internalChannelMap[iChannel] = ma_convert_alsa_channel_position_to_ma_channel(pChmap->pos[iChannel]); - } - - /* Validate. */ - for (i = 0; i < internalChannels && isValid; ++i) { - ma_uint32 j; - for (j = i+1; j < internalChannels; ++j) { - if (internalChannelMap[i] == internalChannelMap[j]) { - isValid = MA_FALSE; - break; - } - } - } - - /* If our channel map is invalid, fall back to defaults. */ - if (!isValid) { - ma_channel_map_init_standard(ma_standard_channel_map_alsa, internalChannelMap, ma_countof(internalChannelMap), internalChannels); - } - } - - free(pChmap); - pChmap = NULL; - } else { - /* Could not retrieve the channel map. Fall back to a hard-coded assumption. */ - ma_channel_map_init_standard(ma_standard_channel_map_alsa, internalChannelMap, ma_countof(internalChannelMap), internalChannels); - } - } - - - /* - We need to retrieve the poll descriptors so we can use poll() to wait for data to become - available for reading or writing. There's no well defined maximum for this so we're just going - to allocate this on the heap. - */ - pollDescriptorCount = ((ma_snd_pcm_poll_descriptors_count_proc)pDevice->pContext->alsa.snd_pcm_poll_descriptors_count)(pPCM); - if (pollDescriptorCount <= 0) { - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to retrieve poll descriptors count."); - return MA_ERROR; - } - - pPollDescriptors = (struct pollfd*)ma_malloc(sizeof(*pPollDescriptors) * (pollDescriptorCount + 1), &pDevice->pContext->allocationCallbacks); /* +1 because we want room for the wakeup descriptor. */ - if (pPollDescriptors == NULL) { - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to allocate memory for poll descriptors."); - return MA_OUT_OF_MEMORY; - } - - /* - We need an eventfd to wakeup from poll() and avoid a deadlock in situations where the driver - never returns from writei() and readi(). This has been observed with the "pulse" device. - */ - wakeupfd = eventfd(0, 0); - if (wakeupfd < 0) { - ma_free(pPollDescriptors, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to create eventfd for poll wakeup."); - return ma_result_from_errno(errno); - } - - /* We'll place the wakeup fd at the start of the buffer. */ - pPollDescriptors[0].fd = wakeupfd; - pPollDescriptors[0].events = POLLIN; /* We only care about waiting to read from the wakeup file descriptor. */ - pPollDescriptors[0].revents = 0; - - /* We can now extract the PCM poll descriptors which we place after the wakeup descriptor. */ - pollDescriptorCount = ((ma_snd_pcm_poll_descriptors_proc)pDevice->pContext->alsa.snd_pcm_poll_descriptors)(pPCM, pPollDescriptors + 1, pollDescriptorCount); /* +1 because we want to place these descriptors after the wakeup descriptor. */ - if (pollDescriptorCount <= 0) { - close(wakeupfd); - ma_free(pPollDescriptors, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to retrieve poll descriptors."); - return MA_ERROR; - } - - if (deviceType == ma_device_type_capture) { - pDevice->alsa.pollDescriptorCountCapture = pollDescriptorCount; - pDevice->alsa.pPollDescriptorsCapture = pPollDescriptors; - pDevice->alsa.wakeupfdCapture = wakeupfd; - } else { - pDevice->alsa.pollDescriptorCountPlayback = pollDescriptorCount; - pDevice->alsa.pPollDescriptorsPlayback = pPollDescriptors; - pDevice->alsa.wakeupfdPlayback = wakeupfd; - } - - - /* We're done. Prepare the device. */ - resultALSA = ((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)(pPCM); - if (resultALSA < 0) { - close(wakeupfd); - ma_free(pPollDescriptors, &pDevice->pContext->allocationCallbacks); - ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to prepare device."); - return ma_result_from_errno(-resultALSA); - } - - - if (deviceType == ma_device_type_capture) { - pDevice->alsa.pPCMCapture = (ma_ptr)pPCM; - pDevice->alsa.isUsingMMapCapture = isUsingMMap; - } else { - pDevice->alsa.pPCMPlayback = (ma_ptr)pPCM; - pDevice->alsa.isUsingMMapPlayback = isUsingMMap; - } - - pDescriptor->format = internalFormat; - pDescriptor->channels = internalChannels; - pDescriptor->sampleRate = internalSampleRate; - ma_channel_map_copy(pDescriptor->channelMap, internalChannelMap, ma_min(internalChannels, MA_MAX_CHANNELS)); - pDescriptor->periodSizeInFrames = internalPeriodSizeInFrames; - pDescriptor->periodCount = internalPeriods; - - return MA_SUCCESS; -} - -static ma_result ma_device_init__alsa(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - MA_ASSERT(pDevice != NULL); - - MA_ZERO_OBJECT(&pDevice->alsa); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_by_type__alsa(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_by_type__alsa(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start__alsa(ma_device* pDevice) -{ - int resultALSA; - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - resultALSA = ((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture); - if (resultALSA < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to start capture device."); - return ma_result_from_errno(-resultALSA); - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - /* Don't need to do anything for playback because it'll be started automatically when enough data has been written. */ - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__alsa(ma_device* pDevice) -{ - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Dropping capture device...\n"); - ((ma_snd_pcm_drop_proc)pDevice->pContext->alsa.snd_pcm_drop)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Dropping capture device successful.\n"); - - /* We need to prepare the device again, otherwise we won't be able to restart the device. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Preparing capture device...\n"); - if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) < 0) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Preparing capture device failed.\n"); - } else { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Preparing capture device successful.\n"); - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Dropping playback device...\n"); - ((ma_snd_pcm_drop_proc)pDevice->pContext->alsa.snd_pcm_drop)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Dropping playback device successful.\n"); - - /* We need to prepare the device again, otherwise we won't be able to restart the device. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Preparing playback device...\n"); - if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback) < 0) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Preparing playback device failed.\n"); - } else { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Preparing playback device successful.\n"); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_wait__alsa(ma_device* pDevice, ma_snd_pcm_t* pPCM, struct pollfd* pPollDescriptors, int pollDescriptorCount, short requiredEvent) -{ - for (;;) { - unsigned short revents; - int resultALSA; - int resultPoll = poll(pPollDescriptors, pollDescriptorCount, -1); - if (resultPoll < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] poll() failed."); - return ma_result_from_errno(errno); - } - - /* - Before checking the ALSA poll descriptor flag we need to check if the wakeup descriptor - has had it's POLLIN flag set. If so, we need to actually read the data and then exit - function. The wakeup descriptor will be the first item in the descriptors buffer. - */ - if ((pPollDescriptors[0].revents & POLLIN) != 0) { - ma_uint64 t; - int resultRead = read(pPollDescriptors[0].fd, &t, sizeof(t)); /* <-- Important that we read here so that the next write() does not block. */ - if (resultRead < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] read() failed."); - return ma_result_from_errno(errno); - } - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] POLLIN set for wakeupfd\n"); - return MA_DEVICE_NOT_STARTED; - } - - /* - Getting here means that some data should be able to be read. We need to use ALSA to - translate the revents flags for us. - */ - resultALSA = ((ma_snd_pcm_poll_descriptors_revents_proc)pDevice->pContext->alsa.snd_pcm_poll_descriptors_revents)(pPCM, pPollDescriptors + 1, pollDescriptorCount - 1, &revents); /* +1, -1 to ignore the wakeup descriptor. */ - if (resultALSA < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] snd_pcm_poll_descriptors_revents() failed."); - return ma_result_from_errno(-resultALSA); - } - - if ((revents & POLLERR) != 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] POLLERR detected."); - return ma_result_from_errno(errno); - } - - if ((revents & requiredEvent) == requiredEvent) { - break; /* We're done. Data available for reading or writing. */ - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_wait_read__alsa(ma_device* pDevice) -{ - return ma_device_wait__alsa(pDevice, (ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, (struct pollfd*)pDevice->alsa.pPollDescriptorsCapture, pDevice->alsa.pollDescriptorCountCapture + 1, POLLIN); /* +1 to account for the wakeup descriptor. */ -} - -static ma_result ma_device_wait_write__alsa(ma_device* pDevice) -{ - return ma_device_wait__alsa(pDevice, (ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, (struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback, pDevice->alsa.pollDescriptorCountPlayback + 1, POLLOUT); /* +1 to account for the wakeup descriptor. */ -} - -static ma_result ma_device_read__alsa(ma_device* pDevice, void* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - ma_snd_pcm_sframes_t resultALSA = 0; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pFramesOut != NULL); - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - while (ma_device_get_state(pDevice) == ma_device_state_started) { - ma_result result; - - /* The first thing to do is wait for data to become available for reading. This will return an error code if the device has been stopped. */ - result = ma_device_wait_read__alsa(pDevice); - if (result != MA_SUCCESS) { - return result; - } - - /* Getting here means we should have data available. */ - resultALSA = ((ma_snd_pcm_readi_proc)pDevice->pContext->alsa.snd_pcm_readi)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, pFramesOut, frameCount); - if (resultALSA >= 0) { - break; /* Success. */ - } else { - if (resultALSA == -EAGAIN) { - /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "EGAIN (read)\n");*/ - continue; /* Try again. */ - } else if (resultALSA == -EPIPE) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "EPIPE (read)\n"); - - /* Overrun. Recover and try again. If this fails we need to return an error. */ - resultALSA = ((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, resultALSA, MA_TRUE); - if (resultALSA < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to recover device after overrun."); - return ma_result_from_errno((int)-resultALSA); - } - - resultALSA = ((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture); - if (resultALSA < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to start device after underrun."); - return ma_result_from_errno((int)-resultALSA); - } - - continue; /* Try reading again. */ - } - } - } - - if (pFramesRead != NULL) { - *pFramesRead = resultALSA; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_write__alsa(ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - ma_snd_pcm_sframes_t resultALSA = 0; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pFrames != NULL); - - if (pFramesWritten != NULL) { - *pFramesWritten = 0; - } - - while (ma_device_get_state(pDevice) == ma_device_state_started) { - ma_result result; - - /* The first thing to do is wait for space to become available for writing. This will return an error code if the device has been stopped. */ - result = ma_device_wait_write__alsa(pDevice); - if (result != MA_SUCCESS) { - return result; - } - - resultALSA = ((ma_snd_pcm_writei_proc)pDevice->pContext->alsa.snd_pcm_writei)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, pFrames, frameCount); - if (resultALSA >= 0) { - break; /* Success. */ - } else { - if (resultALSA == -EAGAIN) { - /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "EGAIN (write)\n");*/ - continue; /* Try again. */ - } else if (resultALSA == -EPIPE) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "EPIPE (write)\n"); - - /* Underrun. Recover and try again. If this fails we need to return an error. */ - resultALSA = ((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, resultALSA, MA_TRUE); /* MA_TRUE=silent (don't print anything on error). */ - if (resultALSA < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to recover device after underrun."); - return ma_result_from_errno((int)-resultALSA); - } - - /* - In my testing I have had a situation where writei() does not automatically restart the device even though I've set it - up as such in the software parameters. What will happen is writei() will block indefinitely even though the number of - frames is well beyond the auto-start threshold. To work around this I've needed to add an explicit start here. Not sure - if this is me just being stupid and not recovering the device properly, but this definitely feels like something isn't - quite right here. - */ - resultALSA = ((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback); - if (resultALSA < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] Failed to start device after underrun."); - return ma_result_from_errno((int)-resultALSA); - } - - continue; /* Try writing again. */ - } - } - } - - if (pFramesWritten != NULL) { - *pFramesWritten = resultALSA; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_data_loop_wakeup__alsa(ma_device* pDevice) -{ - ma_uint64 t = 1; - int resultWrite = 0; - - MA_ASSERT(pDevice != NULL); - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Waking up...\n"); - - /* Write to an eventfd to trigger a wakeup from poll() and abort any reading or writing. */ - if (pDevice->alsa.pPollDescriptorsCapture != NULL) { - resultWrite = write(pDevice->alsa.wakeupfdCapture, &t, sizeof(t)); - } - if (pDevice->alsa.pPollDescriptorsPlayback != NULL) { - resultWrite = write(pDevice->alsa.wakeupfdPlayback, &t, sizeof(t)); - } - - if (resultWrite < 0) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[ALSA] write() failed.\n"); - return ma_result_from_errno(errno); - } - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[ALSA] Waking up completed successfully.\n"); - - return MA_SUCCESS; -} - -static ma_result ma_context_uninit__alsa(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_alsa); - - /* Clean up memory for memory leak checkers. */ - ((ma_snd_config_update_free_global_proc)pContext->alsa.snd_config_update_free_global)(); - -#ifndef MA_NO_RUNTIME_LINKING - ma_dlclose(pContext, pContext->alsa.asoundSO); -#endif - - ma_mutex_uninit(&pContext->alsa.internalDeviceEnumLock); - - return MA_SUCCESS; -} - -static ma_result ma_context_init__alsa(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - ma_result result; -#ifndef MA_NO_RUNTIME_LINKING - const char* libasoundNames[] = { - "libasound.so.2", - "libasound.so" - }; - size_t i; - - for (i = 0; i < ma_countof(libasoundNames); ++i) { - pContext->alsa.asoundSO = ma_dlopen(pContext, libasoundNames[i]); - if (pContext->alsa.asoundSO != NULL) { - break; - } - } - - if (pContext->alsa.asoundSO == NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "[ALSA] Failed to open shared object.\n"); - return MA_NO_BACKEND; - } - - pContext->alsa.snd_pcm_open = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_open"); - pContext->alsa.snd_pcm_close = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_close"); - pContext->alsa.snd_pcm_hw_params_sizeof = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_sizeof"); - pContext->alsa.snd_pcm_hw_params_any = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_any"); - pContext->alsa.snd_pcm_hw_params_set_format = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_format"); - pContext->alsa.snd_pcm_hw_params_set_format_first = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_format_first"); - pContext->alsa.snd_pcm_hw_params_get_format_mask = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_format_mask"); - pContext->alsa.snd_pcm_hw_params_set_channels = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_channels"); - pContext->alsa.snd_pcm_hw_params_set_channels_near = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_channels_near"); - pContext->alsa.snd_pcm_hw_params_set_channels_minmax = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_channels_minmax"); - pContext->alsa.snd_pcm_hw_params_set_rate_resample = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_rate_resample"); - pContext->alsa.snd_pcm_hw_params_set_rate = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_rate"); - pContext->alsa.snd_pcm_hw_params_set_rate_near = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_rate_near"); - pContext->alsa.snd_pcm_hw_params_set_buffer_size_near = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_buffer_size_near"); - pContext->alsa.snd_pcm_hw_params_set_periods_near = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_periods_near"); - pContext->alsa.snd_pcm_hw_params_set_access = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_set_access"); - pContext->alsa.snd_pcm_hw_params_get_format = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_format"); - pContext->alsa.snd_pcm_hw_params_get_channels = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_channels"); - pContext->alsa.snd_pcm_hw_params_get_channels_min = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_channels_min"); - pContext->alsa.snd_pcm_hw_params_get_channels_max = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_channels_max"); - pContext->alsa.snd_pcm_hw_params_get_rate = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_rate"); - pContext->alsa.snd_pcm_hw_params_get_rate_min = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_rate_min"); - pContext->alsa.snd_pcm_hw_params_get_rate_max = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_rate_max"); - pContext->alsa.snd_pcm_hw_params_get_buffer_size = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_buffer_size"); - pContext->alsa.snd_pcm_hw_params_get_periods = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_periods"); - pContext->alsa.snd_pcm_hw_params_get_access = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_get_access"); - pContext->alsa.snd_pcm_hw_params_test_format = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_test_format"); - pContext->alsa.snd_pcm_hw_params_test_channels = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_test_channels"); - pContext->alsa.snd_pcm_hw_params_test_rate = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params_test_rate"); - pContext->alsa.snd_pcm_hw_params = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_hw_params"); - pContext->alsa.snd_pcm_sw_params_sizeof = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_sw_params_sizeof"); - pContext->alsa.snd_pcm_sw_params_current = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_sw_params_current"); - pContext->alsa.snd_pcm_sw_params_get_boundary = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_sw_params_get_boundary"); - pContext->alsa.snd_pcm_sw_params_set_avail_min = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_sw_params_set_avail_min"); - pContext->alsa.snd_pcm_sw_params_set_start_threshold = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_sw_params_set_start_threshold"); - pContext->alsa.snd_pcm_sw_params_set_stop_threshold = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_sw_params_set_stop_threshold"); - pContext->alsa.snd_pcm_sw_params = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_sw_params"); - pContext->alsa.snd_pcm_format_mask_sizeof = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_format_mask_sizeof"); - pContext->alsa.snd_pcm_format_mask_test = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_format_mask_test"); - pContext->alsa.snd_pcm_get_chmap = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_get_chmap"); - pContext->alsa.snd_pcm_state = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_state"); - pContext->alsa.snd_pcm_prepare = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_prepare"); - pContext->alsa.snd_pcm_start = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_start"); - pContext->alsa.snd_pcm_drop = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_drop"); - pContext->alsa.snd_pcm_drain = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_drain"); - pContext->alsa.snd_pcm_reset = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_reset"); - pContext->alsa.snd_device_name_hint = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_device_name_hint"); - pContext->alsa.snd_device_name_get_hint = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_device_name_get_hint"); - pContext->alsa.snd_card_get_index = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_card_get_index"); - pContext->alsa.snd_device_name_free_hint = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_device_name_free_hint"); - pContext->alsa.snd_pcm_mmap_begin = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_mmap_begin"); - pContext->alsa.snd_pcm_mmap_commit = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_mmap_commit"); - pContext->alsa.snd_pcm_recover = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_recover"); - pContext->alsa.snd_pcm_readi = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_readi"); - pContext->alsa.snd_pcm_writei = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_writei"); - pContext->alsa.snd_pcm_avail = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_avail"); - pContext->alsa.snd_pcm_avail_update = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_avail_update"); - pContext->alsa.snd_pcm_wait = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_wait"); - pContext->alsa.snd_pcm_nonblock = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_nonblock"); - pContext->alsa.snd_pcm_info = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_info"); - pContext->alsa.snd_pcm_info_sizeof = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_info_sizeof"); - pContext->alsa.snd_pcm_info_get_name = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_info_get_name"); - pContext->alsa.snd_pcm_poll_descriptors = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_poll_descriptors"); - pContext->alsa.snd_pcm_poll_descriptors_count = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_poll_descriptors_count"); - pContext->alsa.snd_pcm_poll_descriptors_revents = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_pcm_poll_descriptors_revents"); - pContext->alsa.snd_config_update_free_global = (ma_proc)ma_dlsym(pContext, pContext->alsa.asoundSO, "snd_config_update_free_global"); -#else - /* The system below is just for type safety. */ - ma_snd_pcm_open_proc _snd_pcm_open = snd_pcm_open; - ma_snd_pcm_close_proc _snd_pcm_close = snd_pcm_close; - ma_snd_pcm_hw_params_sizeof_proc _snd_pcm_hw_params_sizeof = snd_pcm_hw_params_sizeof; - ma_snd_pcm_hw_params_any_proc _snd_pcm_hw_params_any = snd_pcm_hw_params_any; - ma_snd_pcm_hw_params_set_format_proc _snd_pcm_hw_params_set_format = snd_pcm_hw_params_set_format; - ma_snd_pcm_hw_params_set_format_first_proc _snd_pcm_hw_params_set_format_first = snd_pcm_hw_params_set_format_first; - ma_snd_pcm_hw_params_get_format_mask_proc _snd_pcm_hw_params_get_format_mask = snd_pcm_hw_params_get_format_mask; - ma_snd_pcm_hw_params_set_channels_proc _snd_pcm_hw_params_set_channels = snd_pcm_hw_params_set_channels; - ma_snd_pcm_hw_params_set_channels_near_proc _snd_pcm_hw_params_set_channels_near = snd_pcm_hw_params_set_channels_near; - ma_snd_pcm_hw_params_set_rate_resample_proc _snd_pcm_hw_params_set_rate_resample = snd_pcm_hw_params_set_rate_resample; - ma_snd_pcm_hw_params_set_rate_near _snd_pcm_hw_params_set_rate = snd_pcm_hw_params_set_rate; - ma_snd_pcm_hw_params_set_rate_near_proc _snd_pcm_hw_params_set_rate_near = snd_pcm_hw_params_set_rate_near; - ma_snd_pcm_hw_params_set_rate_minmax_proc _snd_pcm_hw_params_set_rate_minmax = snd_pcm_hw_params_set_rate_minmax; - ma_snd_pcm_hw_params_set_buffer_size_near_proc _snd_pcm_hw_params_set_buffer_size_near = snd_pcm_hw_params_set_buffer_size_near; - ma_snd_pcm_hw_params_set_periods_near_proc _snd_pcm_hw_params_set_periods_near = snd_pcm_hw_params_set_periods_near; - ma_snd_pcm_hw_params_set_access_proc _snd_pcm_hw_params_set_access = snd_pcm_hw_params_set_access; - ma_snd_pcm_hw_params_get_format_proc _snd_pcm_hw_params_get_format = snd_pcm_hw_params_get_format; - ma_snd_pcm_hw_params_get_channels_proc _snd_pcm_hw_params_get_channels = snd_pcm_hw_params_get_channels; - ma_snd_pcm_hw_params_get_channels_min_proc _snd_pcm_hw_params_get_channels_min = snd_pcm_hw_params_get_channels_min; - ma_snd_pcm_hw_params_get_channels_max_proc _snd_pcm_hw_params_get_channels_max = snd_pcm_hw_params_get_channels_max; - ma_snd_pcm_hw_params_get_rate_proc _snd_pcm_hw_params_get_rate = snd_pcm_hw_params_get_rate; - ma_snd_pcm_hw_params_get_rate_min_proc _snd_pcm_hw_params_get_rate_min = snd_pcm_hw_params_get_rate_min; - ma_snd_pcm_hw_params_get_rate_max_proc _snd_pcm_hw_params_get_rate_max = snd_pcm_hw_params_get_rate_max; - ma_snd_pcm_hw_params_get_buffer_size_proc _snd_pcm_hw_params_get_buffer_size = snd_pcm_hw_params_get_buffer_size; - ma_snd_pcm_hw_params_get_periods_proc _snd_pcm_hw_params_get_periods = snd_pcm_hw_params_get_periods; - ma_snd_pcm_hw_params_get_access_proc _snd_pcm_hw_params_get_access = snd_pcm_hw_params_get_access; - ma_snd_pcm_hw_params_test_format_proc _snd_pcm_hw_params_test_format = snd_pcm_hw_params_test_format; - ma_snd_pcm_hw_params_test_channels_proc _snd_pcm_hw_params_test_channels = snd_pcm_hw_params_test_channels; - ma_snd_pcm_hw_params_test_rate_proc _snd_pcm_hw_params_test_rate = snd_pcm_hw_params_test_rate; - ma_snd_pcm_hw_params_proc _snd_pcm_hw_params = snd_pcm_hw_params; - ma_snd_pcm_sw_params_sizeof_proc _snd_pcm_sw_params_sizeof = snd_pcm_sw_params_sizeof; - ma_snd_pcm_sw_params_current_proc _snd_pcm_sw_params_current = snd_pcm_sw_params_current; - ma_snd_pcm_sw_params_get_boundary_proc _snd_pcm_sw_params_get_boundary = snd_pcm_sw_params_get_boundary; - ma_snd_pcm_sw_params_set_avail_min_proc _snd_pcm_sw_params_set_avail_min = snd_pcm_sw_params_set_avail_min; - ma_snd_pcm_sw_params_set_start_threshold_proc _snd_pcm_sw_params_set_start_threshold = snd_pcm_sw_params_set_start_threshold; - ma_snd_pcm_sw_params_set_stop_threshold_proc _snd_pcm_sw_params_set_stop_threshold = snd_pcm_sw_params_set_stop_threshold; - ma_snd_pcm_sw_params_proc _snd_pcm_sw_params = snd_pcm_sw_params; - ma_snd_pcm_format_mask_sizeof_proc _snd_pcm_format_mask_sizeof = snd_pcm_format_mask_sizeof; - ma_snd_pcm_format_mask_test_proc _snd_pcm_format_mask_test = snd_pcm_format_mask_test; - ma_snd_pcm_get_chmap_proc _snd_pcm_get_chmap = snd_pcm_get_chmap; - ma_snd_pcm_state_proc _snd_pcm_state = snd_pcm_state; - ma_snd_pcm_prepare_proc _snd_pcm_prepare = snd_pcm_prepare; - ma_snd_pcm_start_proc _snd_pcm_start = snd_pcm_start; - ma_snd_pcm_drop_proc _snd_pcm_drop = snd_pcm_drop; - ma_snd_pcm_drain_proc _snd_pcm_drain = snd_pcm_drain; - ma_snd_pcm_reset_proc _snd_pcm_reset = snd_pcm_reset; - ma_snd_device_name_hint_proc _snd_device_name_hint = snd_device_name_hint; - ma_snd_device_name_get_hint_proc _snd_device_name_get_hint = snd_device_name_get_hint; - ma_snd_card_get_index_proc _snd_card_get_index = snd_card_get_index; - ma_snd_device_name_free_hint_proc _snd_device_name_free_hint = snd_device_name_free_hint; - ma_snd_pcm_mmap_begin_proc _snd_pcm_mmap_begin = snd_pcm_mmap_begin; - ma_snd_pcm_mmap_commit_proc _snd_pcm_mmap_commit = snd_pcm_mmap_commit; - ma_snd_pcm_recover_proc _snd_pcm_recover = snd_pcm_recover; - ma_snd_pcm_readi_proc _snd_pcm_readi = snd_pcm_readi; - ma_snd_pcm_writei_proc _snd_pcm_writei = snd_pcm_writei; - ma_snd_pcm_avail_proc _snd_pcm_avail = snd_pcm_avail; - ma_snd_pcm_avail_update_proc _snd_pcm_avail_update = snd_pcm_avail_update; - ma_snd_pcm_wait_proc _snd_pcm_wait = snd_pcm_wait; - ma_snd_pcm_nonblock_proc _snd_pcm_nonblock = snd_pcm_nonblock; - ma_snd_pcm_info_proc _snd_pcm_info = snd_pcm_info; - ma_snd_pcm_info_sizeof_proc _snd_pcm_info_sizeof = snd_pcm_info_sizeof; - ma_snd_pcm_info_get_name_proc _snd_pcm_info_get_name = snd_pcm_info_get_name; - ma_snd_pcm_poll_descriptors _snd_pcm_poll_descriptors = snd_pcm_poll_descriptors; - ma_snd_pcm_poll_descriptors_count _snd_pcm_poll_descriptors_count = snd_pcm_poll_descriptors_count; - ma_snd_pcm_poll_descriptors_revents _snd_pcm_poll_descriptors_revents = snd_pcm_poll_descriptors_revents; - ma_snd_config_update_free_global_proc _snd_config_update_free_global = snd_config_update_free_global; - - pContext->alsa.snd_pcm_open = (ma_proc)_snd_pcm_open; - pContext->alsa.snd_pcm_close = (ma_proc)_snd_pcm_close; - pContext->alsa.snd_pcm_hw_params_sizeof = (ma_proc)_snd_pcm_hw_params_sizeof; - pContext->alsa.snd_pcm_hw_params_any = (ma_proc)_snd_pcm_hw_params_any; - pContext->alsa.snd_pcm_hw_params_set_format = (ma_proc)_snd_pcm_hw_params_set_format; - pContext->alsa.snd_pcm_hw_params_set_format_first = (ma_proc)_snd_pcm_hw_params_set_format_first; - pContext->alsa.snd_pcm_hw_params_get_format_mask = (ma_proc)_snd_pcm_hw_params_get_format_mask; - pContext->alsa.snd_pcm_hw_params_set_channels = (ma_proc)_snd_pcm_hw_params_set_channels; - pContext->alsa.snd_pcm_hw_params_set_channels_near = (ma_proc)_snd_pcm_hw_params_set_channels_near; - pContext->alsa.snd_pcm_hw_params_set_channels_minmax = (ma_proc)_snd_pcm_hw_params_set_channels_minmax; - pContext->alsa.snd_pcm_hw_params_set_rate_resample = (ma_proc)_snd_pcm_hw_params_set_rate_resample; - pContext->alsa.snd_pcm_hw_params_set_rate = (ma_proc)_snd_pcm_hw_params_set_rate; - pContext->alsa.snd_pcm_hw_params_set_rate_near = (ma_proc)_snd_pcm_hw_params_set_rate_near; - pContext->alsa.snd_pcm_hw_params_set_buffer_size_near = (ma_proc)_snd_pcm_hw_params_set_buffer_size_near; - pContext->alsa.snd_pcm_hw_params_set_periods_near = (ma_proc)_snd_pcm_hw_params_set_periods_near; - pContext->alsa.snd_pcm_hw_params_set_access = (ma_proc)_snd_pcm_hw_params_set_access; - pContext->alsa.snd_pcm_hw_params_get_format = (ma_proc)_snd_pcm_hw_params_get_format; - pContext->alsa.snd_pcm_hw_params_get_channels = (ma_proc)_snd_pcm_hw_params_get_channels; - pContext->alsa.snd_pcm_hw_params_get_channels_min = (ma_proc)_snd_pcm_hw_params_get_channels_min; - pContext->alsa.snd_pcm_hw_params_get_channels_max = (ma_proc)_snd_pcm_hw_params_get_channels_max; - pContext->alsa.snd_pcm_hw_params_get_rate = (ma_proc)_snd_pcm_hw_params_get_rate; - pContext->alsa.snd_pcm_hw_params_get_rate_min = (ma_proc)_snd_pcm_hw_params_get_rate_min; - pContext->alsa.snd_pcm_hw_params_get_rate_max = (ma_proc)_snd_pcm_hw_params_get_rate_max; - pContext->alsa.snd_pcm_hw_params_get_buffer_size = (ma_proc)_snd_pcm_hw_params_get_buffer_size; - pContext->alsa.snd_pcm_hw_params_get_periods = (ma_proc)_snd_pcm_hw_params_get_periods; - pContext->alsa.snd_pcm_hw_params_get_access = (ma_proc)_snd_pcm_hw_params_get_access; - pContext->alsa.snd_pcm_hw_params_test_format = (ma_proc)_snd_pcm_hw_params_test_format; - pContext->alsa.snd_pcm_hw_params_test_channels = (ma_proc)_snd_pcm_hw_params_test_channels; - pContext->alsa.snd_pcm_hw_params_test_rate = (ma_proc)_snd_pcm_hw_params_test_rate; - pContext->alsa.snd_pcm_hw_params = (ma_proc)_snd_pcm_hw_params; - pContext->alsa.snd_pcm_sw_params_sizeof = (ma_proc)_snd_pcm_sw_params_sizeof; - pContext->alsa.snd_pcm_sw_params_current = (ma_proc)_snd_pcm_sw_params_current; - pContext->alsa.snd_pcm_sw_params_get_boundary = (ma_proc)_snd_pcm_sw_params_get_boundary; - pContext->alsa.snd_pcm_sw_params_set_avail_min = (ma_proc)_snd_pcm_sw_params_set_avail_min; - pContext->alsa.snd_pcm_sw_params_set_start_threshold = (ma_proc)_snd_pcm_sw_params_set_start_threshold; - pContext->alsa.snd_pcm_sw_params_set_stop_threshold = (ma_proc)_snd_pcm_sw_params_set_stop_threshold; - pContext->alsa.snd_pcm_sw_params = (ma_proc)_snd_pcm_sw_params; - pContext->alsa.snd_pcm_format_mask_sizeof = (ma_proc)_snd_pcm_format_mask_sizeof; - pContext->alsa.snd_pcm_format_mask_test = (ma_proc)_snd_pcm_format_mask_test; - pContext->alsa.snd_pcm_get_chmap = (ma_proc)_snd_pcm_get_chmap; - pContext->alsa.snd_pcm_state = (ma_proc)_snd_pcm_state; - pContext->alsa.snd_pcm_prepare = (ma_proc)_snd_pcm_prepare; - pContext->alsa.snd_pcm_start = (ma_proc)_snd_pcm_start; - pContext->alsa.snd_pcm_drop = (ma_proc)_snd_pcm_drop; - pContext->alsa.snd_pcm_drain = (ma_proc)_snd_pcm_drain; - pContext->alsa.snd_pcm_reset = (ma_proc)_snd_pcm_reset; - pContext->alsa.snd_device_name_hint = (ma_proc)_snd_device_name_hint; - pContext->alsa.snd_device_name_get_hint = (ma_proc)_snd_device_name_get_hint; - pContext->alsa.snd_card_get_index = (ma_proc)_snd_card_get_index; - pContext->alsa.snd_device_name_free_hint = (ma_proc)_snd_device_name_free_hint; - pContext->alsa.snd_pcm_mmap_begin = (ma_proc)_snd_pcm_mmap_begin; - pContext->alsa.snd_pcm_mmap_commit = (ma_proc)_snd_pcm_mmap_commit; - pContext->alsa.snd_pcm_recover = (ma_proc)_snd_pcm_recover; - pContext->alsa.snd_pcm_readi = (ma_proc)_snd_pcm_readi; - pContext->alsa.snd_pcm_writei = (ma_proc)_snd_pcm_writei; - pContext->alsa.snd_pcm_avail = (ma_proc)_snd_pcm_avail; - pContext->alsa.snd_pcm_avail_update = (ma_proc)_snd_pcm_avail_update; - pContext->alsa.snd_pcm_wait = (ma_proc)_snd_pcm_wait; - pContext->alsa.snd_pcm_nonblock = (ma_proc)_snd_pcm_nonblock; - pContext->alsa.snd_pcm_info = (ma_proc)_snd_pcm_info; - pContext->alsa.snd_pcm_info_sizeof = (ma_proc)_snd_pcm_info_sizeof; - pContext->alsa.snd_pcm_info_get_name = (ma_proc)_snd_pcm_info_get_name; - pContext->alsa.snd_pcm_poll_descriptors = (ma_proc)_snd_pcm_poll_descriptors; - pContext->alsa.snd_pcm_poll_descriptors_count = (ma_proc)_snd_pcm_poll_descriptors_count; - pContext->alsa.snd_pcm_poll_descriptors_revents = (ma_proc)_snd_pcm_poll_descriptors_revents; - pContext->alsa.snd_config_update_free_global = (ma_proc)_snd_config_update_free_global; -#endif - - pContext->alsa.useVerboseDeviceEnumeration = pConfig->alsa.useVerboseDeviceEnumeration; - - result = ma_mutex_init(&pContext->alsa.internalDeviceEnumLock); - if (result != MA_SUCCESS) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[ALSA] WARNING: Failed to initialize mutex for internal device enumeration."); - return result; - } - - pCallbacks->onContextInit = ma_context_init__alsa; - pCallbacks->onContextUninit = ma_context_uninit__alsa; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__alsa; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__alsa; - pCallbacks->onDeviceInit = ma_device_init__alsa; - pCallbacks->onDeviceUninit = ma_device_uninit__alsa; - pCallbacks->onDeviceStart = ma_device_start__alsa; - pCallbacks->onDeviceStop = ma_device_stop__alsa; - pCallbacks->onDeviceRead = ma_device_read__alsa; - pCallbacks->onDeviceWrite = ma_device_write__alsa; - pCallbacks->onDeviceDataLoop = NULL; - pCallbacks->onDeviceDataLoopWakeup = ma_device_data_loop_wakeup__alsa; - - return MA_SUCCESS; -} -#endif /* ALSA */ - - - -/****************************************************************************** - -PulseAudio Backend - -******************************************************************************/ -#ifdef MA_HAS_PULSEAUDIO -/* -The PulseAudio API, along with Apple's Core Audio, is the worst of the maintream audio APIs. This is a brief description of what's going on -in the PulseAudio backend. I apologize if this gets a bit ranty for your liking - you might want to skip this discussion. - -PulseAudio has something they call the "Simple API", which unfortunately isn't suitable for miniaudio. I've not seen anywhere where it -allows you to enumerate over devices, nor does it seem to support the ability to stop and start streams. Looking at the documentation, it -appears as though the stream is constantly running and you prevent sound from being emitted or captured by simply not calling the read or -write functions. This is not a professional solution as it would be much better to *actually* stop the underlying stream. Perhaps the -simple API has some smarts to do this automatically, but I'm not sure. Another limitation with the simple API is that it seems inefficient -when you want to have multiple streams to a single context. For these reasons, miniaudio is not using the simple API. - -Since we're not using the simple API, we're left with the asynchronous API as our only other option. And boy, is this where it starts to -get fun, and I don't mean that in a good way... - -The problems start with the very name of the API - "asynchronous". Yes, this is an asynchronous oriented API which means your commands -don't immediately take effect. You instead need to issue your commands, and then wait for them to complete. The waiting mechanism is -enabled through the use of a "main loop". In the asychronous API you cannot get away from the main loop, and the main loop is where almost -all of PulseAudio's problems stem from. - -When you first initialize PulseAudio you need an object referred to as "main loop". You can implement this yourself by defining your own -vtable, but it's much easier to just use one of the built-in main loop implementations. There's two generic implementations called -pa_mainloop and pa_threaded_mainloop, and another implementation specific to GLib called pa_glib_mainloop. We're using pa_threaded_mainloop -because it simplifies management of the worker thread. The idea of the main loop object is pretty self explanatory - you're supposed to use -it to implement a worker thread which runs in a loop. The main loop is where operations are actually executed. - -To initialize the main loop, you just use `pa_threaded_mainloop_new()`. This is the first function you'll call. You can then get a pointer -to the vtable with `pa_threaded_mainloop_get_api()` (the main loop vtable is called `pa_mainloop_api`). Again, you can bypass the threaded -main loop object entirely and just implement `pa_mainloop_api` directly, but there's no need for it unless you're doing something extremely -specialized such as if you want to integrate it into your application's existing main loop infrastructure. - -(EDIT 2021-01-26: miniaudio is no longer using `pa_threaded_mainloop` due to this issue: https://github.com/mackron/miniaudio/issues/262. -It is now using `pa_mainloop` which turns out to be a simpler solution anyway. The rest of this rant still applies, however.) - -Once you have your main loop vtable (the `pa_mainloop_api` object) you can create the PulseAudio context. This is very similar to -miniaudio's context and they map to each other quite well. You have one context to many streams, which is basically the same as miniaudio's -one `ma_context` to many `ma_device`s. Here's where it starts to get annoying, however. When you first create the PulseAudio context, which -is done with `pa_context_new()`, it's not actually connected to anything. When you connect, you call `pa_context_connect()`. However, if -you remember, PulseAudio is an asynchronous API. That means you cannot just assume the context is connected after `pa_context_context()` -has returned. You instead need to wait for it to connect. To do this, you need to either wait for a callback to get fired, which you can -set with `pa_context_set_state_callback()`, or you can continuously poll the context's state. Either way, you need to run this in a loop. -All objects from here out are created from the context, and, I believe, you can't be creating these objects until the context is connected. -This waiting loop is therefore unavoidable. In order for the waiting to ever complete, however, the main loop needs to be running. Before -attempting to connect the context, the main loop needs to be started with `pa_threaded_mainloop_start()`. - -The reason for this asynchronous design is to support cases where you're connecting to a remote server, say through a local network or an -internet connection. However, the *VAST* majority of cases don't involve this at all - they just connect to a local "server" running on the -host machine. The fact that this would be the default rather than making `pa_context_connect()` synchronous tends to boggle the mind. - -Once the context has been created and connected you can start creating a stream. A PulseAudio stream is analogous to miniaudio's device. -The initialization of a stream is fairly standard - you configure some attributes (analogous to miniaudio's device config) and then call -`pa_stream_new()` to actually create it. Here is where we start to get into "operations". When configuring the stream, you can get -information about the source (such as sample format, sample rate, etc.), however it's not synchronous. Instead, a `pa_operation` object -is returned from `pa_context_get_source_info_by_name()` (capture) or `pa_context_get_sink_info_by_name()` (playback). Then, you need to -run a loop (again!) to wait for the operation to complete which you can determine via a callback or polling, just like we did with the -context. Then, as an added bonus, you need to decrement the reference counter of the `pa_operation` object to ensure memory is cleaned up. -All of that just to retrieve basic information about a device! - -Once the basic information about the device has been retrieved, miniaudio can now create the stream with `ma_stream_new()`. Like the -context, this needs to be connected. But we need to be careful here, because we're now about to introduce one of the most horrific design -choices in PulseAudio. - -PulseAudio allows you to specify a callback that is fired when data can be written to or read from a stream. The language is important here -because PulseAudio takes it literally, specifically the "can be". You would think these callbacks would be appropriate as the place for -writing and reading data to and from the stream, and that would be right, except when it's not. When you initialize the stream, you can -set a flag that tells PulseAudio to not start the stream automatically. This is required because miniaudio does not auto-start devices -straight after initialization - you need to call `ma_device_start()` manually. The problem is that even when this flag is specified, -PulseAudio will immediately fire it's write or read callback. This is *technically* correct (based on the wording in the documentation) -because indeed, data *can* be written at this point. The problem is that it's not *practical*. It makes sense that the write/read callback -would be where a program will want to write or read data to or from the stream, but when it's called before the application has even -requested that the stream be started, it's just not practical because the program probably isn't ready for any kind of data delivery at -that point (it may still need to load files or whatnot). Instead, this callback should only be fired when the application requests the -stream be started which is how it works with literally *every* other callback-based audio API. Since miniaudio forbids firing of the data -callback until the device has been started (as it should be with *all* callback based APIs), logic needs to be added to ensure miniaudio -doesn't just blindly fire the application-defined data callback from within the PulseAudio callback before the stream has actually been -started. The device state is used for this - if the state is anything other than `ma_device_state_starting` or `ma_device_state_started`, the main data -callback is not fired. - -This, unfortunately, is not the end of the problems with the PulseAudio write callback. Any normal callback based audio API will -continuously fire the callback at regular intervals based on the size of the internal buffer. This will only ever be fired when the device -is running, and will be fired regardless of whether or not the user actually wrote anything to the device/stream. This not the case in -PulseAudio. In PulseAudio, the data callback will *only* be called if you wrote something to it previously. That means, if you don't call -`pa_stream_write()`, the callback will not get fired. On the surface you wouldn't think this would matter because you should be always -writing data, and if you don't have anything to write, just write silence. That's fine until you want to drain the stream. You see, if -you're continuously writing data to the stream, the stream will never get drained! That means in order to drain the stream, you need to -*not* write data to it! But remember, when you don't write data to the stream, the callback won't get fired again! Why is draining -important? Because that's how we've defined stopping to work in miniaudio. In miniaudio, stopping the device requires it to be drained -before returning from ma_device_stop(). So we've stopped the device, which requires us to drain, but draining requires us to *not* write -data to the stream (or else it won't ever complete draining), but not writing to the stream means the callback won't get fired again! - -This becomes a problem when stopping and then restarting the device. When the device is stopped, it's drained, which requires us to *not* -write anything to the stream. But then, since we didn't write anything to it, the write callback will *never* get called again if we just -resume the stream naively. This means that starting the stream requires us to write data to the stream from outside the callback. This -disconnect is something PulseAudio has got seriously wrong - there should only ever be a single source of data delivery, that being the -callback. (I have tried using `pa_stream_flush()` to trigger the write callback to fire, but this just doesn't work for some reason.) - -Once you've created the stream, you need to connect it which involves the whole waiting procedure. This is the same process as the context, -only this time you'll poll for the state with `pa_stream_get_status()`. The starting and stopping of a streaming is referred to as -"corking" in PulseAudio. The analogy is corking a barrel. To start the stream, you uncork it, to stop it you cork it. Personally I think -it's silly - why would you not just call it "starting" and "stopping" like any other normal audio API? Anyway, the act of corking is, you -guessed it, asynchronous. This means you'll need our waiting loop as usual. Again, why this asynchronous design is the default is -absolutely beyond me. Would it really be that hard to just make it run synchronously? - -Teardown is pretty simple (what?!). It's just a matter of calling the relevant `_unref()` function on each object in reverse order that -they were initialized in. - -That's about it from the PulseAudio side. A bit ranty, I know, but they really need to fix that main loop and callback system. They're -embarrassingly unpractical. The main loop thing is an easy fix - have synchronous versions of all APIs. If an application wants these to -run asynchronously, they can execute them in a separate thread themselves. The desire to run these asynchronously is such a niche -requirement - it makes no sense to make it the default. The stream write callback needs to be change, or an alternative provided, that is -constantly fired, regardless of whether or not `pa_stream_write()` has been called, and it needs to take a pointer to a buffer as a -parameter which the program just writes to directly rather than having to call `pa_stream_writable_size()` and `pa_stream_write()`. These -changes alone will change PulseAudio from one of the worst audio APIs to one of the best. -*/ - - -/* -It is assumed pulseaudio.h is available when linking at compile time. When linking at compile time, we use the declarations in the header -to check for type safety. We cannot do this when linking at run time because the header might not be available. -*/ -#ifdef MA_NO_RUNTIME_LINKING - -/* pulseaudio.h marks some functions with "inline" which isn't always supported. Need to emulate it. */ -#if !defined(__cplusplus) - #if defined(__STRICT_ANSI__) - #if !defined(inline) - #define inline __inline__ __attribute__((always_inline)) - #define MA_INLINE_DEFINED - #endif - #endif -#endif -#include -#if defined(MA_INLINE_DEFINED) - #undef inline - #undef MA_INLINE_DEFINED -#endif - -#define MA_PA_OK PA_OK -#define MA_PA_ERR_ACCESS PA_ERR_ACCESS -#define MA_PA_ERR_INVALID PA_ERR_INVALID -#define MA_PA_ERR_NOENTITY PA_ERR_NOENTITY -#define MA_PA_ERR_NOTSUPPORTED PA_ERR_NOTSUPPORTED - -#define MA_PA_CHANNELS_MAX PA_CHANNELS_MAX -#define MA_PA_RATE_MAX PA_RATE_MAX - -typedef pa_context_flags_t ma_pa_context_flags_t; -#define MA_PA_CONTEXT_NOFLAGS PA_CONTEXT_NOFLAGS -#define MA_PA_CONTEXT_NOAUTOSPAWN PA_CONTEXT_NOAUTOSPAWN -#define MA_PA_CONTEXT_NOFAIL PA_CONTEXT_NOFAIL - -typedef pa_stream_flags_t ma_pa_stream_flags_t; -#define MA_PA_STREAM_NOFLAGS PA_STREAM_NOFLAGS -#define MA_PA_STREAM_START_CORKED PA_STREAM_START_CORKED -#define MA_PA_STREAM_INTERPOLATE_TIMING PA_STREAM_INTERPOLATE_TIMING -#define MA_PA_STREAM_NOT_MONOTONIC PA_STREAM_NOT_MONOTONIC -#define MA_PA_STREAM_AUTO_TIMING_UPDATE PA_STREAM_AUTO_TIMING_UPDATE -#define MA_PA_STREAM_NO_REMAP_CHANNELS PA_STREAM_NO_REMAP_CHANNELS -#define MA_PA_STREAM_NO_REMIX_CHANNELS PA_STREAM_NO_REMIX_CHANNELS -#define MA_PA_STREAM_FIX_FORMAT PA_STREAM_FIX_FORMAT -#define MA_PA_STREAM_FIX_RATE PA_STREAM_FIX_RATE -#define MA_PA_STREAM_FIX_CHANNELS PA_STREAM_FIX_CHANNELS -#define MA_PA_STREAM_DONT_MOVE PA_STREAM_DONT_MOVE -#define MA_PA_STREAM_VARIABLE_RATE PA_STREAM_VARIABLE_RATE -#define MA_PA_STREAM_PEAK_DETECT PA_STREAM_PEAK_DETECT -#define MA_PA_STREAM_START_MUTED PA_STREAM_START_MUTED -#define MA_PA_STREAM_ADJUST_LATENCY PA_STREAM_ADJUST_LATENCY -#define MA_PA_STREAM_EARLY_REQUESTS PA_STREAM_EARLY_REQUESTS -#define MA_PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND -#define MA_PA_STREAM_START_UNMUTED PA_STREAM_START_UNMUTED -#define MA_PA_STREAM_FAIL_ON_SUSPEND PA_STREAM_FAIL_ON_SUSPEND -#define MA_PA_STREAM_RELATIVE_VOLUME PA_STREAM_RELATIVE_VOLUME -#define MA_PA_STREAM_PASSTHROUGH PA_STREAM_PASSTHROUGH - -typedef pa_sink_flags_t ma_pa_sink_flags_t; -#define MA_PA_SINK_NOFLAGS PA_SINK_NOFLAGS -#define MA_PA_SINK_HW_VOLUME_CTRL PA_SINK_HW_VOLUME_CTRL -#define MA_PA_SINK_LATENCY PA_SINK_LATENCY -#define MA_PA_SINK_HARDWARE PA_SINK_HARDWARE -#define MA_PA_SINK_NETWORK PA_SINK_NETWORK -#define MA_PA_SINK_HW_MUTE_CTRL PA_SINK_HW_MUTE_CTRL -#define MA_PA_SINK_DECIBEL_VOLUME PA_SINK_DECIBEL_VOLUME -#define MA_PA_SINK_FLAT_VOLUME PA_SINK_FLAT_VOLUME -#define MA_PA_SINK_DYNAMIC_LATENCY PA_SINK_DYNAMIC_LATENCY -#define MA_PA_SINK_SET_FORMATS PA_SINK_SET_FORMATS - -typedef pa_source_flags_t ma_pa_source_flags_t; -#define MA_PA_SOURCE_NOFLAGS PA_SOURCE_NOFLAGS -#define MA_PA_SOURCE_HW_VOLUME_CTRL PA_SOURCE_HW_VOLUME_CTRL -#define MA_PA_SOURCE_LATENCY PA_SOURCE_LATENCY -#define MA_PA_SOURCE_HARDWARE PA_SOURCE_HARDWARE -#define MA_PA_SOURCE_NETWORK PA_SOURCE_NETWORK -#define MA_PA_SOURCE_HW_MUTE_CTRL PA_SOURCE_HW_MUTE_CTRL -#define MA_PA_SOURCE_DECIBEL_VOLUME PA_SOURCE_DECIBEL_VOLUME -#define MA_PA_SOURCE_DYNAMIC_LATENCY PA_SOURCE_DYNAMIC_LATENCY -#define MA_PA_SOURCE_FLAT_VOLUME PA_SOURCE_FLAT_VOLUME - -typedef pa_context_state_t ma_pa_context_state_t; -#define MA_PA_CONTEXT_UNCONNECTED PA_CONTEXT_UNCONNECTED -#define MA_PA_CONTEXT_CONNECTING PA_CONTEXT_CONNECTING -#define MA_PA_CONTEXT_AUTHORIZING PA_CONTEXT_AUTHORIZING -#define MA_PA_CONTEXT_SETTING_NAME PA_CONTEXT_SETTING_NAME -#define MA_PA_CONTEXT_READY PA_CONTEXT_READY -#define MA_PA_CONTEXT_FAILED PA_CONTEXT_FAILED -#define MA_PA_CONTEXT_TERMINATED PA_CONTEXT_TERMINATED - -typedef pa_stream_state_t ma_pa_stream_state_t; -#define MA_PA_STREAM_UNCONNECTED PA_STREAM_UNCONNECTED -#define MA_PA_STREAM_CREATING PA_STREAM_CREATING -#define MA_PA_STREAM_READY PA_STREAM_READY -#define MA_PA_STREAM_FAILED PA_STREAM_FAILED -#define MA_PA_STREAM_TERMINATED PA_STREAM_TERMINATED - -typedef pa_operation_state_t ma_pa_operation_state_t; -#define MA_PA_OPERATION_RUNNING PA_OPERATION_RUNNING -#define MA_PA_OPERATION_DONE PA_OPERATION_DONE -#define MA_PA_OPERATION_CANCELLED PA_OPERATION_CANCELLED - -typedef pa_sink_state_t ma_pa_sink_state_t; -#define MA_PA_SINK_INVALID_STATE PA_SINK_INVALID_STATE -#define MA_PA_SINK_RUNNING PA_SINK_RUNNING -#define MA_PA_SINK_IDLE PA_SINK_IDLE -#define MA_PA_SINK_SUSPENDED PA_SINK_SUSPENDED - -typedef pa_source_state_t ma_pa_source_state_t; -#define MA_PA_SOURCE_INVALID_STATE PA_SOURCE_INVALID_STATE -#define MA_PA_SOURCE_RUNNING PA_SOURCE_RUNNING -#define MA_PA_SOURCE_IDLE PA_SOURCE_IDLE -#define MA_PA_SOURCE_SUSPENDED PA_SOURCE_SUSPENDED - -typedef pa_seek_mode_t ma_pa_seek_mode_t; -#define MA_PA_SEEK_RELATIVE PA_SEEK_RELATIVE -#define MA_PA_SEEK_ABSOLUTE PA_SEEK_ABSOLUTE -#define MA_PA_SEEK_RELATIVE_ON_READ PA_SEEK_RELATIVE_ON_READ -#define MA_PA_SEEK_RELATIVE_END PA_SEEK_RELATIVE_END - -typedef pa_channel_position_t ma_pa_channel_position_t; -#define MA_PA_CHANNEL_POSITION_INVALID PA_CHANNEL_POSITION_INVALID -#define MA_PA_CHANNEL_POSITION_MONO PA_CHANNEL_POSITION_MONO -#define MA_PA_CHANNEL_POSITION_FRONT_LEFT PA_CHANNEL_POSITION_FRONT_LEFT -#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT PA_CHANNEL_POSITION_FRONT_RIGHT -#define MA_PA_CHANNEL_POSITION_FRONT_CENTER PA_CHANNEL_POSITION_FRONT_CENTER -#define MA_PA_CHANNEL_POSITION_REAR_CENTER PA_CHANNEL_POSITION_REAR_CENTER -#define MA_PA_CHANNEL_POSITION_REAR_LEFT PA_CHANNEL_POSITION_REAR_LEFT -#define MA_PA_CHANNEL_POSITION_REAR_RIGHT PA_CHANNEL_POSITION_REAR_RIGHT -#define MA_PA_CHANNEL_POSITION_LFE PA_CHANNEL_POSITION_LFE -#define MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER -#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER -#define MA_PA_CHANNEL_POSITION_SIDE_LEFT PA_CHANNEL_POSITION_SIDE_LEFT -#define MA_PA_CHANNEL_POSITION_SIDE_RIGHT PA_CHANNEL_POSITION_SIDE_RIGHT -#define MA_PA_CHANNEL_POSITION_AUX0 PA_CHANNEL_POSITION_AUX0 -#define MA_PA_CHANNEL_POSITION_AUX1 PA_CHANNEL_POSITION_AUX1 -#define MA_PA_CHANNEL_POSITION_AUX2 PA_CHANNEL_POSITION_AUX2 -#define MA_PA_CHANNEL_POSITION_AUX3 PA_CHANNEL_POSITION_AUX3 -#define MA_PA_CHANNEL_POSITION_AUX4 PA_CHANNEL_POSITION_AUX4 -#define MA_PA_CHANNEL_POSITION_AUX5 PA_CHANNEL_POSITION_AUX5 -#define MA_PA_CHANNEL_POSITION_AUX6 PA_CHANNEL_POSITION_AUX6 -#define MA_PA_CHANNEL_POSITION_AUX7 PA_CHANNEL_POSITION_AUX7 -#define MA_PA_CHANNEL_POSITION_AUX8 PA_CHANNEL_POSITION_AUX8 -#define MA_PA_CHANNEL_POSITION_AUX9 PA_CHANNEL_POSITION_AUX9 -#define MA_PA_CHANNEL_POSITION_AUX10 PA_CHANNEL_POSITION_AUX10 -#define MA_PA_CHANNEL_POSITION_AUX11 PA_CHANNEL_POSITION_AUX11 -#define MA_PA_CHANNEL_POSITION_AUX12 PA_CHANNEL_POSITION_AUX12 -#define MA_PA_CHANNEL_POSITION_AUX13 PA_CHANNEL_POSITION_AUX13 -#define MA_PA_CHANNEL_POSITION_AUX14 PA_CHANNEL_POSITION_AUX14 -#define MA_PA_CHANNEL_POSITION_AUX15 PA_CHANNEL_POSITION_AUX15 -#define MA_PA_CHANNEL_POSITION_AUX16 PA_CHANNEL_POSITION_AUX16 -#define MA_PA_CHANNEL_POSITION_AUX17 PA_CHANNEL_POSITION_AUX17 -#define MA_PA_CHANNEL_POSITION_AUX18 PA_CHANNEL_POSITION_AUX18 -#define MA_PA_CHANNEL_POSITION_AUX19 PA_CHANNEL_POSITION_AUX19 -#define MA_PA_CHANNEL_POSITION_AUX20 PA_CHANNEL_POSITION_AUX20 -#define MA_PA_CHANNEL_POSITION_AUX21 PA_CHANNEL_POSITION_AUX21 -#define MA_PA_CHANNEL_POSITION_AUX22 PA_CHANNEL_POSITION_AUX22 -#define MA_PA_CHANNEL_POSITION_AUX23 PA_CHANNEL_POSITION_AUX23 -#define MA_PA_CHANNEL_POSITION_AUX24 PA_CHANNEL_POSITION_AUX24 -#define MA_PA_CHANNEL_POSITION_AUX25 PA_CHANNEL_POSITION_AUX25 -#define MA_PA_CHANNEL_POSITION_AUX26 PA_CHANNEL_POSITION_AUX26 -#define MA_PA_CHANNEL_POSITION_AUX27 PA_CHANNEL_POSITION_AUX27 -#define MA_PA_CHANNEL_POSITION_AUX28 PA_CHANNEL_POSITION_AUX28 -#define MA_PA_CHANNEL_POSITION_AUX29 PA_CHANNEL_POSITION_AUX29 -#define MA_PA_CHANNEL_POSITION_AUX30 PA_CHANNEL_POSITION_AUX30 -#define MA_PA_CHANNEL_POSITION_AUX31 PA_CHANNEL_POSITION_AUX31 -#define MA_PA_CHANNEL_POSITION_TOP_CENTER PA_CHANNEL_POSITION_TOP_CENTER -#define MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT PA_CHANNEL_POSITION_TOP_FRONT_LEFT -#define MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT PA_CHANNEL_POSITION_TOP_FRONT_RIGHT -#define MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER PA_CHANNEL_POSITION_TOP_FRONT_CENTER -#define MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT PA_CHANNEL_POSITION_TOP_REAR_LEFT -#define MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT PA_CHANNEL_POSITION_TOP_REAR_RIGHT -#define MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER PA_CHANNEL_POSITION_TOP_REAR_CENTER -#define MA_PA_CHANNEL_POSITION_LEFT PA_CHANNEL_POSITION_LEFT -#define MA_PA_CHANNEL_POSITION_RIGHT PA_CHANNEL_POSITION_RIGHT -#define MA_PA_CHANNEL_POSITION_CENTER PA_CHANNEL_POSITION_CENTER -#define MA_PA_CHANNEL_POSITION_SUBWOOFER PA_CHANNEL_POSITION_SUBWOOFER - -typedef pa_channel_map_def_t ma_pa_channel_map_def_t; -#define MA_PA_CHANNEL_MAP_AIFF PA_CHANNEL_MAP_AIFF -#define MA_PA_CHANNEL_MAP_ALSA PA_CHANNEL_MAP_ALSA -#define MA_PA_CHANNEL_MAP_AUX PA_CHANNEL_MAP_AUX -#define MA_PA_CHANNEL_MAP_WAVEEX PA_CHANNEL_MAP_WAVEEX -#define MA_PA_CHANNEL_MAP_OSS PA_CHANNEL_MAP_OSS -#define MA_PA_CHANNEL_MAP_DEFAULT PA_CHANNEL_MAP_DEFAULT - -typedef pa_sample_format_t ma_pa_sample_format_t; -#define MA_PA_SAMPLE_INVALID PA_SAMPLE_INVALID -#define MA_PA_SAMPLE_U8 PA_SAMPLE_U8 -#define MA_PA_SAMPLE_ALAW PA_SAMPLE_ALAW -#define MA_PA_SAMPLE_ULAW PA_SAMPLE_ULAW -#define MA_PA_SAMPLE_S16LE PA_SAMPLE_S16LE -#define MA_PA_SAMPLE_S16BE PA_SAMPLE_S16BE -#define MA_PA_SAMPLE_FLOAT32LE PA_SAMPLE_FLOAT32LE -#define MA_PA_SAMPLE_FLOAT32BE PA_SAMPLE_FLOAT32BE -#define MA_PA_SAMPLE_S32LE PA_SAMPLE_S32LE -#define MA_PA_SAMPLE_S32BE PA_SAMPLE_S32BE -#define MA_PA_SAMPLE_S24LE PA_SAMPLE_S24LE -#define MA_PA_SAMPLE_S24BE PA_SAMPLE_S24BE -#define MA_PA_SAMPLE_S24_32LE PA_SAMPLE_S24_32LE -#define MA_PA_SAMPLE_S24_32BE PA_SAMPLE_S24_32BE - -typedef pa_mainloop ma_pa_mainloop; -typedef pa_threaded_mainloop ma_pa_threaded_mainloop; -typedef pa_mainloop_api ma_pa_mainloop_api; -typedef pa_context ma_pa_context; -typedef pa_operation ma_pa_operation; -typedef pa_stream ma_pa_stream; -typedef pa_spawn_api ma_pa_spawn_api; -typedef pa_buffer_attr ma_pa_buffer_attr; -typedef pa_channel_map ma_pa_channel_map; -typedef pa_cvolume ma_pa_cvolume; -typedef pa_sample_spec ma_pa_sample_spec; -typedef pa_sink_info ma_pa_sink_info; -typedef pa_source_info ma_pa_source_info; - -typedef pa_context_notify_cb_t ma_pa_context_notify_cb_t; -typedef pa_sink_info_cb_t ma_pa_sink_info_cb_t; -typedef pa_source_info_cb_t ma_pa_source_info_cb_t; -typedef pa_stream_success_cb_t ma_pa_stream_success_cb_t; -typedef pa_stream_request_cb_t ma_pa_stream_request_cb_t; -typedef pa_stream_notify_cb_t ma_pa_stream_notify_cb_t; -typedef pa_free_cb_t ma_pa_free_cb_t; -#else -#define MA_PA_OK 0 -#define MA_PA_ERR_ACCESS 1 -#define MA_PA_ERR_INVALID 2 -#define MA_PA_ERR_NOENTITY 5 -#define MA_PA_ERR_NOTSUPPORTED 19 - -#define MA_PA_CHANNELS_MAX 32 -#define MA_PA_RATE_MAX 384000 - -typedef int ma_pa_context_flags_t; -#define MA_PA_CONTEXT_NOFLAGS 0x00000000 -#define MA_PA_CONTEXT_NOAUTOSPAWN 0x00000001 -#define MA_PA_CONTEXT_NOFAIL 0x00000002 - -typedef int ma_pa_stream_flags_t; -#define MA_PA_STREAM_NOFLAGS 0x00000000 -#define MA_PA_STREAM_START_CORKED 0x00000001 -#define MA_PA_STREAM_INTERPOLATE_TIMING 0x00000002 -#define MA_PA_STREAM_NOT_MONOTONIC 0x00000004 -#define MA_PA_STREAM_AUTO_TIMING_UPDATE 0x00000008 -#define MA_PA_STREAM_NO_REMAP_CHANNELS 0x00000010 -#define MA_PA_STREAM_NO_REMIX_CHANNELS 0x00000020 -#define MA_PA_STREAM_FIX_FORMAT 0x00000040 -#define MA_PA_STREAM_FIX_RATE 0x00000080 -#define MA_PA_STREAM_FIX_CHANNELS 0x00000100 -#define MA_PA_STREAM_DONT_MOVE 0x00000200 -#define MA_PA_STREAM_VARIABLE_RATE 0x00000400 -#define MA_PA_STREAM_PEAK_DETECT 0x00000800 -#define MA_PA_STREAM_START_MUTED 0x00001000 -#define MA_PA_STREAM_ADJUST_LATENCY 0x00002000 -#define MA_PA_STREAM_EARLY_REQUESTS 0x00004000 -#define MA_PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND 0x00008000 -#define MA_PA_STREAM_START_UNMUTED 0x00010000 -#define MA_PA_STREAM_FAIL_ON_SUSPEND 0x00020000 -#define MA_PA_STREAM_RELATIVE_VOLUME 0x00040000 -#define MA_PA_STREAM_PASSTHROUGH 0x00080000 - -typedef int ma_pa_sink_flags_t; -#define MA_PA_SINK_NOFLAGS 0x00000000 -#define MA_PA_SINK_HW_VOLUME_CTRL 0x00000001 -#define MA_PA_SINK_LATENCY 0x00000002 -#define MA_PA_SINK_HARDWARE 0x00000004 -#define MA_PA_SINK_NETWORK 0x00000008 -#define MA_PA_SINK_HW_MUTE_CTRL 0x00000010 -#define MA_PA_SINK_DECIBEL_VOLUME 0x00000020 -#define MA_PA_SINK_FLAT_VOLUME 0x00000040 -#define MA_PA_SINK_DYNAMIC_LATENCY 0x00000080 -#define MA_PA_SINK_SET_FORMATS 0x00000100 - -typedef int ma_pa_source_flags_t; -#define MA_PA_SOURCE_NOFLAGS 0x00000000 -#define MA_PA_SOURCE_HW_VOLUME_CTRL 0x00000001 -#define MA_PA_SOURCE_LATENCY 0x00000002 -#define MA_PA_SOURCE_HARDWARE 0x00000004 -#define MA_PA_SOURCE_NETWORK 0x00000008 -#define MA_PA_SOURCE_HW_MUTE_CTRL 0x00000010 -#define MA_PA_SOURCE_DECIBEL_VOLUME 0x00000020 -#define MA_PA_SOURCE_DYNAMIC_LATENCY 0x00000040 -#define MA_PA_SOURCE_FLAT_VOLUME 0x00000080 - -typedef int ma_pa_context_state_t; -#define MA_PA_CONTEXT_UNCONNECTED 0 -#define MA_PA_CONTEXT_CONNECTING 1 -#define MA_PA_CONTEXT_AUTHORIZING 2 -#define MA_PA_CONTEXT_SETTING_NAME 3 -#define MA_PA_CONTEXT_READY 4 -#define MA_PA_CONTEXT_FAILED 5 -#define MA_PA_CONTEXT_TERMINATED 6 - -typedef int ma_pa_stream_state_t; -#define MA_PA_STREAM_UNCONNECTED 0 -#define MA_PA_STREAM_CREATING 1 -#define MA_PA_STREAM_READY 2 -#define MA_PA_STREAM_FAILED 3 -#define MA_PA_STREAM_TERMINATED 4 - -typedef int ma_pa_operation_state_t; -#define MA_PA_OPERATION_RUNNING 0 -#define MA_PA_OPERATION_DONE 1 -#define MA_PA_OPERATION_CANCELLED 2 - -typedef int ma_pa_sink_state_t; -#define MA_PA_SINK_INVALID_STATE -1 -#define MA_PA_SINK_RUNNING 0 -#define MA_PA_SINK_IDLE 1 -#define MA_PA_SINK_SUSPENDED 2 - -typedef int ma_pa_source_state_t; -#define MA_PA_SOURCE_INVALID_STATE -1 -#define MA_PA_SOURCE_RUNNING 0 -#define MA_PA_SOURCE_IDLE 1 -#define MA_PA_SOURCE_SUSPENDED 2 - -typedef int ma_pa_seek_mode_t; -#define MA_PA_SEEK_RELATIVE 0 -#define MA_PA_SEEK_ABSOLUTE 1 -#define MA_PA_SEEK_RELATIVE_ON_READ 2 -#define MA_PA_SEEK_RELATIVE_END 3 - -typedef int ma_pa_channel_position_t; -#define MA_PA_CHANNEL_POSITION_INVALID -1 -#define MA_PA_CHANNEL_POSITION_MONO 0 -#define MA_PA_CHANNEL_POSITION_FRONT_LEFT 1 -#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT 2 -#define MA_PA_CHANNEL_POSITION_FRONT_CENTER 3 -#define MA_PA_CHANNEL_POSITION_REAR_CENTER 4 -#define MA_PA_CHANNEL_POSITION_REAR_LEFT 5 -#define MA_PA_CHANNEL_POSITION_REAR_RIGHT 6 -#define MA_PA_CHANNEL_POSITION_LFE 7 -#define MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER 8 -#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER 9 -#define MA_PA_CHANNEL_POSITION_SIDE_LEFT 10 -#define MA_PA_CHANNEL_POSITION_SIDE_RIGHT 11 -#define MA_PA_CHANNEL_POSITION_AUX0 12 -#define MA_PA_CHANNEL_POSITION_AUX1 13 -#define MA_PA_CHANNEL_POSITION_AUX2 14 -#define MA_PA_CHANNEL_POSITION_AUX3 15 -#define MA_PA_CHANNEL_POSITION_AUX4 16 -#define MA_PA_CHANNEL_POSITION_AUX5 17 -#define MA_PA_CHANNEL_POSITION_AUX6 18 -#define MA_PA_CHANNEL_POSITION_AUX7 19 -#define MA_PA_CHANNEL_POSITION_AUX8 20 -#define MA_PA_CHANNEL_POSITION_AUX9 21 -#define MA_PA_CHANNEL_POSITION_AUX10 22 -#define MA_PA_CHANNEL_POSITION_AUX11 23 -#define MA_PA_CHANNEL_POSITION_AUX12 24 -#define MA_PA_CHANNEL_POSITION_AUX13 25 -#define MA_PA_CHANNEL_POSITION_AUX14 26 -#define MA_PA_CHANNEL_POSITION_AUX15 27 -#define MA_PA_CHANNEL_POSITION_AUX16 28 -#define MA_PA_CHANNEL_POSITION_AUX17 29 -#define MA_PA_CHANNEL_POSITION_AUX18 30 -#define MA_PA_CHANNEL_POSITION_AUX19 31 -#define MA_PA_CHANNEL_POSITION_AUX20 32 -#define MA_PA_CHANNEL_POSITION_AUX21 33 -#define MA_PA_CHANNEL_POSITION_AUX22 34 -#define MA_PA_CHANNEL_POSITION_AUX23 35 -#define MA_PA_CHANNEL_POSITION_AUX24 36 -#define MA_PA_CHANNEL_POSITION_AUX25 37 -#define MA_PA_CHANNEL_POSITION_AUX26 38 -#define MA_PA_CHANNEL_POSITION_AUX27 39 -#define MA_PA_CHANNEL_POSITION_AUX28 40 -#define MA_PA_CHANNEL_POSITION_AUX29 41 -#define MA_PA_CHANNEL_POSITION_AUX30 42 -#define MA_PA_CHANNEL_POSITION_AUX31 43 -#define MA_PA_CHANNEL_POSITION_TOP_CENTER 44 -#define MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT 45 -#define MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT 46 -#define MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER 47 -#define MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT 48 -#define MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT 49 -#define MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER 50 -#define MA_PA_CHANNEL_POSITION_LEFT MA_PA_CHANNEL_POSITION_FRONT_LEFT -#define MA_PA_CHANNEL_POSITION_RIGHT MA_PA_CHANNEL_POSITION_FRONT_RIGHT -#define MA_PA_CHANNEL_POSITION_CENTER MA_PA_CHANNEL_POSITION_FRONT_CENTER -#define MA_PA_CHANNEL_POSITION_SUBWOOFER MA_PA_CHANNEL_POSITION_LFE - -typedef int ma_pa_channel_map_def_t; -#define MA_PA_CHANNEL_MAP_AIFF 0 -#define MA_PA_CHANNEL_MAP_ALSA 1 -#define MA_PA_CHANNEL_MAP_AUX 2 -#define MA_PA_CHANNEL_MAP_WAVEEX 3 -#define MA_PA_CHANNEL_MAP_OSS 4 -#define MA_PA_CHANNEL_MAP_DEFAULT MA_PA_CHANNEL_MAP_AIFF - -typedef int ma_pa_sample_format_t; -#define MA_PA_SAMPLE_INVALID -1 -#define MA_PA_SAMPLE_U8 0 -#define MA_PA_SAMPLE_ALAW 1 -#define MA_PA_SAMPLE_ULAW 2 -#define MA_PA_SAMPLE_S16LE 3 -#define MA_PA_SAMPLE_S16BE 4 -#define MA_PA_SAMPLE_FLOAT32LE 5 -#define MA_PA_SAMPLE_FLOAT32BE 6 -#define MA_PA_SAMPLE_S32LE 7 -#define MA_PA_SAMPLE_S32BE 8 -#define MA_PA_SAMPLE_S24LE 9 -#define MA_PA_SAMPLE_S24BE 10 -#define MA_PA_SAMPLE_S24_32LE 11 -#define MA_PA_SAMPLE_S24_32BE 12 - -typedef struct ma_pa_mainloop ma_pa_mainloop; -typedef struct ma_pa_threaded_mainloop ma_pa_threaded_mainloop; -typedef struct ma_pa_mainloop_api ma_pa_mainloop_api; -typedef struct ma_pa_context ma_pa_context; -typedef struct ma_pa_operation ma_pa_operation; -typedef struct ma_pa_stream ma_pa_stream; -typedef struct ma_pa_spawn_api ma_pa_spawn_api; - -typedef struct -{ - ma_uint32 maxlength; - ma_uint32 tlength; - ma_uint32 prebuf; - ma_uint32 minreq; - ma_uint32 fragsize; -} ma_pa_buffer_attr; - -typedef struct -{ - ma_uint8 channels; - ma_pa_channel_position_t map[MA_PA_CHANNELS_MAX]; -} ma_pa_channel_map; - -typedef struct -{ - ma_uint8 channels; - ma_uint32 values[MA_PA_CHANNELS_MAX]; -} ma_pa_cvolume; - -typedef struct -{ - ma_pa_sample_format_t format; - ma_uint32 rate; - ma_uint8 channels; -} ma_pa_sample_spec; - -typedef struct -{ - const char* name; - ma_uint32 index; - const char* description; - ma_pa_sample_spec sample_spec; - ma_pa_channel_map channel_map; - ma_uint32 owner_module; - ma_pa_cvolume volume; - int mute; - ma_uint32 monitor_source; - const char* monitor_source_name; - ma_uint64 latency; - const char* driver; - ma_pa_sink_flags_t flags; - void* proplist; - ma_uint64 configured_latency; - ma_uint32 base_volume; - ma_pa_sink_state_t state; - ma_uint32 n_volume_steps; - ma_uint32 card; - ma_uint32 n_ports; - void** ports; - void* active_port; - ma_uint8 n_formats; - void** formats; -} ma_pa_sink_info; - -typedef struct -{ - const char *name; - ma_uint32 index; - const char *description; - ma_pa_sample_spec sample_spec; - ma_pa_channel_map channel_map; - ma_uint32 owner_module; - ma_pa_cvolume volume; - int mute; - ma_uint32 monitor_of_sink; - const char *monitor_of_sink_name; - ma_uint64 latency; - const char *driver; - ma_pa_source_flags_t flags; - void* proplist; - ma_uint64 configured_latency; - ma_uint32 base_volume; - ma_pa_source_state_t state; - ma_uint32 n_volume_steps; - ma_uint32 card; - ma_uint32 n_ports; - void** ports; - void* active_port; - ma_uint8 n_formats; - void** formats; -} ma_pa_source_info; - -typedef void (* ma_pa_context_notify_cb_t)(ma_pa_context* c, void* userdata); -typedef void (* ma_pa_sink_info_cb_t) (ma_pa_context* c, const ma_pa_sink_info* i, int eol, void* userdata); -typedef void (* ma_pa_source_info_cb_t) (ma_pa_context* c, const ma_pa_source_info* i, int eol, void* userdata); -typedef void (* ma_pa_stream_success_cb_t)(ma_pa_stream* s, int success, void* userdata); -typedef void (* ma_pa_stream_request_cb_t)(ma_pa_stream* s, size_t nbytes, void* userdata); -typedef void (* ma_pa_stream_notify_cb_t) (ma_pa_stream* s, void* userdata); -typedef void (* ma_pa_free_cb_t) (void* p); -#endif - - -typedef ma_pa_mainloop* (* ma_pa_mainloop_new_proc) (void); -typedef void (* ma_pa_mainloop_free_proc) (ma_pa_mainloop* m); -typedef void (* ma_pa_mainloop_quit_proc) (ma_pa_mainloop* m, int retval); -typedef ma_pa_mainloop_api* (* ma_pa_mainloop_get_api_proc) (ma_pa_mainloop* m); -typedef int (* ma_pa_mainloop_iterate_proc) (ma_pa_mainloop* m, int block, int* retval); -typedef void (* ma_pa_mainloop_wakeup_proc) (ma_pa_mainloop* m); -typedef ma_pa_threaded_mainloop* (* ma_pa_threaded_mainloop_new_proc) (void); -typedef void (* ma_pa_threaded_mainloop_free_proc) (ma_pa_threaded_mainloop* m); -typedef int (* ma_pa_threaded_mainloop_start_proc) (ma_pa_threaded_mainloop* m); -typedef void (* ma_pa_threaded_mainloop_stop_proc) (ma_pa_threaded_mainloop* m); -typedef void (* ma_pa_threaded_mainloop_lock_proc) (ma_pa_threaded_mainloop* m); -typedef void (* ma_pa_threaded_mainloop_unlock_proc) (ma_pa_threaded_mainloop* m); -typedef void (* ma_pa_threaded_mainloop_wait_proc) (ma_pa_threaded_mainloop* m); -typedef void (* ma_pa_threaded_mainloop_signal_proc) (ma_pa_threaded_mainloop* m, int wait_for_accept); -typedef void (* ma_pa_threaded_mainloop_accept_proc) (ma_pa_threaded_mainloop* m); -typedef int (* ma_pa_threaded_mainloop_get_retval_proc) (ma_pa_threaded_mainloop* m); -typedef ma_pa_mainloop_api* (* ma_pa_threaded_mainloop_get_api_proc) (ma_pa_threaded_mainloop* m); -typedef int (* ma_pa_threaded_mainloop_in_thread_proc) (ma_pa_threaded_mainloop* m); -typedef void (* ma_pa_threaded_mainloop_set_name_proc) (ma_pa_threaded_mainloop* m, const char* name); -typedef ma_pa_context* (* ma_pa_context_new_proc) (ma_pa_mainloop_api* mainloop, const char* name); -typedef void (* ma_pa_context_unref_proc) (ma_pa_context* c); -typedef int (* ma_pa_context_connect_proc) (ma_pa_context* c, const char* server, ma_pa_context_flags_t flags, const ma_pa_spawn_api* api); -typedef void (* ma_pa_context_disconnect_proc) (ma_pa_context* c); -typedef void (* ma_pa_context_set_state_callback_proc) (ma_pa_context* c, ma_pa_context_notify_cb_t cb, void* userdata); -typedef ma_pa_context_state_t (* ma_pa_context_get_state_proc) (ma_pa_context* c); -typedef ma_pa_operation* (* ma_pa_context_get_sink_info_list_proc) (ma_pa_context* c, ma_pa_sink_info_cb_t cb, void* userdata); -typedef ma_pa_operation* (* ma_pa_context_get_source_info_list_proc) (ma_pa_context* c, ma_pa_source_info_cb_t cb, void* userdata); -typedef ma_pa_operation* (* ma_pa_context_get_sink_info_by_name_proc) (ma_pa_context* c, const char* name, ma_pa_sink_info_cb_t cb, void* userdata); -typedef ma_pa_operation* (* ma_pa_context_get_source_info_by_name_proc)(ma_pa_context* c, const char* name, ma_pa_source_info_cb_t cb, void* userdata); -typedef void (* ma_pa_operation_unref_proc) (ma_pa_operation* o); -typedef ma_pa_operation_state_t (* ma_pa_operation_get_state_proc) (ma_pa_operation* o); -typedef ma_pa_channel_map* (* ma_pa_channel_map_init_extend_proc) (ma_pa_channel_map* m, unsigned channels, ma_pa_channel_map_def_t def); -typedef int (* ma_pa_channel_map_valid_proc) (const ma_pa_channel_map* m); -typedef int (* ma_pa_channel_map_compatible_proc) (const ma_pa_channel_map* m, const ma_pa_sample_spec* ss); -typedef ma_pa_stream* (* ma_pa_stream_new_proc) (ma_pa_context* c, const char* name, const ma_pa_sample_spec* ss, const ma_pa_channel_map* map); -typedef void (* ma_pa_stream_unref_proc) (ma_pa_stream* s); -typedef int (* ma_pa_stream_connect_playback_proc) (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags, const ma_pa_cvolume* volume, ma_pa_stream* sync_stream); -typedef int (* ma_pa_stream_connect_record_proc) (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags); -typedef int (* ma_pa_stream_disconnect_proc) (ma_pa_stream* s); -typedef ma_pa_stream_state_t (* ma_pa_stream_get_state_proc) (ma_pa_stream* s); -typedef const ma_pa_sample_spec* (* ma_pa_stream_get_sample_spec_proc) (ma_pa_stream* s); -typedef const ma_pa_channel_map* (* ma_pa_stream_get_channel_map_proc) (ma_pa_stream* s); -typedef const ma_pa_buffer_attr* (* ma_pa_stream_get_buffer_attr_proc) (ma_pa_stream* s); -typedef ma_pa_operation* (* ma_pa_stream_set_buffer_attr_proc) (ma_pa_stream* s, const ma_pa_buffer_attr* attr, ma_pa_stream_success_cb_t cb, void* userdata); -typedef const char* (* ma_pa_stream_get_device_name_proc) (ma_pa_stream* s); -typedef void (* ma_pa_stream_set_write_callback_proc) (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata); -typedef void (* ma_pa_stream_set_read_callback_proc) (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata); -typedef void (* ma_pa_stream_set_suspended_callback_proc) (ma_pa_stream* s, ma_pa_stream_notify_cb_t cb, void* userdata); -typedef void (* ma_pa_stream_set_moved_callback_proc) (ma_pa_stream* s, ma_pa_stream_notify_cb_t cb, void* userdata); -typedef int (* ma_pa_stream_is_suspended_proc) (const ma_pa_stream* s); -typedef ma_pa_operation* (* ma_pa_stream_flush_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata); -typedef ma_pa_operation* (* ma_pa_stream_drain_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata); -typedef int (* ma_pa_stream_is_corked_proc) (ma_pa_stream* s); -typedef ma_pa_operation* (* ma_pa_stream_cork_proc) (ma_pa_stream* s, int b, ma_pa_stream_success_cb_t cb, void* userdata); -typedef ma_pa_operation* (* ma_pa_stream_trigger_proc) (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata); -typedef int (* ma_pa_stream_begin_write_proc) (ma_pa_stream* s, void** data, size_t* nbytes); -typedef int (* ma_pa_stream_write_proc) (ma_pa_stream* s, const void* data, size_t nbytes, ma_pa_free_cb_t free_cb, int64_t offset, ma_pa_seek_mode_t seek); -typedef int (* ma_pa_stream_peek_proc) (ma_pa_stream* s, const void** data, size_t* nbytes); -typedef int (* ma_pa_stream_drop_proc) (ma_pa_stream* s); -typedef size_t (* ma_pa_stream_writable_size_proc) (ma_pa_stream* s); -typedef size_t (* ma_pa_stream_readable_size_proc) (ma_pa_stream* s); - -typedef struct -{ - ma_uint32 count; - ma_uint32 capacity; - ma_device_info* pInfo; -} ma_pulse_device_enum_data; - -static ma_result ma_result_from_pulse(int result) -{ - if (result < 0) { - return MA_ERROR; - } - - switch (result) { - case MA_PA_OK: return MA_SUCCESS; - case MA_PA_ERR_ACCESS: return MA_ACCESS_DENIED; - case MA_PA_ERR_INVALID: return MA_INVALID_ARGS; - case MA_PA_ERR_NOENTITY: return MA_NO_DEVICE; - default: return MA_ERROR; - } -} - -#if 0 -static ma_pa_sample_format_t ma_format_to_pulse(ma_format format) -{ - if (ma_is_little_endian()) { - switch (format) { - case ma_format_s16: return MA_PA_SAMPLE_S16LE; - case ma_format_s24: return MA_PA_SAMPLE_S24LE; - case ma_format_s32: return MA_PA_SAMPLE_S32LE; - case ma_format_f32: return MA_PA_SAMPLE_FLOAT32LE; - default: break; - } - } else { - switch (format) { - case ma_format_s16: return MA_PA_SAMPLE_S16BE; - case ma_format_s24: return MA_PA_SAMPLE_S24BE; - case ma_format_s32: return MA_PA_SAMPLE_S32BE; - case ma_format_f32: return MA_PA_SAMPLE_FLOAT32BE; - default: break; - } - } - - /* Endian agnostic. */ - switch (format) { - case ma_format_u8: return MA_PA_SAMPLE_U8; - default: return MA_PA_SAMPLE_INVALID; - } -} -#endif - -static ma_format ma_format_from_pulse(ma_pa_sample_format_t format) -{ - if (ma_is_little_endian()) { - switch (format) { - case MA_PA_SAMPLE_S16LE: return ma_format_s16; - case MA_PA_SAMPLE_S24LE: return ma_format_s24; - case MA_PA_SAMPLE_S32LE: return ma_format_s32; - case MA_PA_SAMPLE_FLOAT32LE: return ma_format_f32; - default: break; - } - } else { - switch (format) { - case MA_PA_SAMPLE_S16BE: return ma_format_s16; - case MA_PA_SAMPLE_S24BE: return ma_format_s24; - case MA_PA_SAMPLE_S32BE: return ma_format_s32; - case MA_PA_SAMPLE_FLOAT32BE: return ma_format_f32; - default: break; - } - } - - /* Endian agnostic. */ - switch (format) { - case MA_PA_SAMPLE_U8: return ma_format_u8; - default: return ma_format_unknown; - } -} - -static ma_channel ma_channel_position_from_pulse(ma_pa_channel_position_t position) -{ - switch (position) - { - case MA_PA_CHANNEL_POSITION_INVALID: return MA_CHANNEL_NONE; - case MA_PA_CHANNEL_POSITION_MONO: return MA_CHANNEL_MONO; - case MA_PA_CHANNEL_POSITION_FRONT_LEFT: return MA_CHANNEL_FRONT_LEFT; - case MA_PA_CHANNEL_POSITION_FRONT_RIGHT: return MA_CHANNEL_FRONT_RIGHT; - case MA_PA_CHANNEL_POSITION_FRONT_CENTER: return MA_CHANNEL_FRONT_CENTER; - case MA_PA_CHANNEL_POSITION_REAR_CENTER: return MA_CHANNEL_BACK_CENTER; - case MA_PA_CHANNEL_POSITION_REAR_LEFT: return MA_CHANNEL_BACK_LEFT; - case MA_PA_CHANNEL_POSITION_REAR_RIGHT: return MA_CHANNEL_BACK_RIGHT; - case MA_PA_CHANNEL_POSITION_LFE: return MA_CHANNEL_LFE; - case MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: return MA_CHANNEL_FRONT_LEFT_CENTER; - case MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER; - case MA_PA_CHANNEL_POSITION_SIDE_LEFT: return MA_CHANNEL_SIDE_LEFT; - case MA_PA_CHANNEL_POSITION_SIDE_RIGHT: return MA_CHANNEL_SIDE_RIGHT; - case MA_PA_CHANNEL_POSITION_AUX0: return MA_CHANNEL_AUX_0; - case MA_PA_CHANNEL_POSITION_AUX1: return MA_CHANNEL_AUX_1; - case MA_PA_CHANNEL_POSITION_AUX2: return MA_CHANNEL_AUX_2; - case MA_PA_CHANNEL_POSITION_AUX3: return MA_CHANNEL_AUX_3; - case MA_PA_CHANNEL_POSITION_AUX4: return MA_CHANNEL_AUX_4; - case MA_PA_CHANNEL_POSITION_AUX5: return MA_CHANNEL_AUX_5; - case MA_PA_CHANNEL_POSITION_AUX6: return MA_CHANNEL_AUX_6; - case MA_PA_CHANNEL_POSITION_AUX7: return MA_CHANNEL_AUX_7; - case MA_PA_CHANNEL_POSITION_AUX8: return MA_CHANNEL_AUX_8; - case MA_PA_CHANNEL_POSITION_AUX9: return MA_CHANNEL_AUX_9; - case MA_PA_CHANNEL_POSITION_AUX10: return MA_CHANNEL_AUX_10; - case MA_PA_CHANNEL_POSITION_AUX11: return MA_CHANNEL_AUX_11; - case MA_PA_CHANNEL_POSITION_AUX12: return MA_CHANNEL_AUX_12; - case MA_PA_CHANNEL_POSITION_AUX13: return MA_CHANNEL_AUX_13; - case MA_PA_CHANNEL_POSITION_AUX14: return MA_CHANNEL_AUX_14; - case MA_PA_CHANNEL_POSITION_AUX15: return MA_CHANNEL_AUX_15; - case MA_PA_CHANNEL_POSITION_AUX16: return MA_CHANNEL_AUX_16; - case MA_PA_CHANNEL_POSITION_AUX17: return MA_CHANNEL_AUX_17; - case MA_PA_CHANNEL_POSITION_AUX18: return MA_CHANNEL_AUX_18; - case MA_PA_CHANNEL_POSITION_AUX19: return MA_CHANNEL_AUX_19; - case MA_PA_CHANNEL_POSITION_AUX20: return MA_CHANNEL_AUX_20; - case MA_PA_CHANNEL_POSITION_AUX21: return MA_CHANNEL_AUX_21; - case MA_PA_CHANNEL_POSITION_AUX22: return MA_CHANNEL_AUX_22; - case MA_PA_CHANNEL_POSITION_AUX23: return MA_CHANNEL_AUX_23; - case MA_PA_CHANNEL_POSITION_AUX24: return MA_CHANNEL_AUX_24; - case MA_PA_CHANNEL_POSITION_AUX25: return MA_CHANNEL_AUX_25; - case MA_PA_CHANNEL_POSITION_AUX26: return MA_CHANNEL_AUX_26; - case MA_PA_CHANNEL_POSITION_AUX27: return MA_CHANNEL_AUX_27; - case MA_PA_CHANNEL_POSITION_AUX28: return MA_CHANNEL_AUX_28; - case MA_PA_CHANNEL_POSITION_AUX29: return MA_CHANNEL_AUX_29; - case MA_PA_CHANNEL_POSITION_AUX30: return MA_CHANNEL_AUX_30; - case MA_PA_CHANNEL_POSITION_AUX31: return MA_CHANNEL_AUX_31; - case MA_PA_CHANNEL_POSITION_TOP_CENTER: return MA_CHANNEL_TOP_CENTER; - case MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT: return MA_CHANNEL_TOP_FRONT_LEFT; - case MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT: return MA_CHANNEL_TOP_FRONT_RIGHT; - case MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER: return MA_CHANNEL_TOP_FRONT_CENTER; - case MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT: return MA_CHANNEL_TOP_BACK_LEFT; - case MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT: return MA_CHANNEL_TOP_BACK_RIGHT; - case MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER: return MA_CHANNEL_TOP_BACK_CENTER; - default: return MA_CHANNEL_NONE; - } -} - -#if 0 -static ma_pa_channel_position_t ma_channel_position_to_pulse(ma_channel position) -{ - switch (position) - { - case MA_CHANNEL_NONE: return MA_PA_CHANNEL_POSITION_INVALID; - case MA_CHANNEL_FRONT_LEFT: return MA_PA_CHANNEL_POSITION_FRONT_LEFT; - case MA_CHANNEL_FRONT_RIGHT: return MA_PA_CHANNEL_POSITION_FRONT_RIGHT; - case MA_CHANNEL_FRONT_CENTER: return MA_PA_CHANNEL_POSITION_FRONT_CENTER; - case MA_CHANNEL_LFE: return MA_PA_CHANNEL_POSITION_LFE; - case MA_CHANNEL_BACK_LEFT: return MA_PA_CHANNEL_POSITION_REAR_LEFT; - case MA_CHANNEL_BACK_RIGHT: return MA_PA_CHANNEL_POSITION_REAR_RIGHT; - case MA_CHANNEL_FRONT_LEFT_CENTER: return MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER; - case MA_CHANNEL_FRONT_RIGHT_CENTER: return MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER; - case MA_CHANNEL_BACK_CENTER: return MA_PA_CHANNEL_POSITION_REAR_CENTER; - case MA_CHANNEL_SIDE_LEFT: return MA_PA_CHANNEL_POSITION_SIDE_LEFT; - case MA_CHANNEL_SIDE_RIGHT: return MA_PA_CHANNEL_POSITION_SIDE_RIGHT; - case MA_CHANNEL_TOP_CENTER: return MA_PA_CHANNEL_POSITION_TOP_CENTER; - case MA_CHANNEL_TOP_FRONT_LEFT: return MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT; - case MA_CHANNEL_TOP_FRONT_CENTER: return MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER; - case MA_CHANNEL_TOP_FRONT_RIGHT: return MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT; - case MA_CHANNEL_TOP_BACK_LEFT: return MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT; - case MA_CHANNEL_TOP_BACK_CENTER: return MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER; - case MA_CHANNEL_TOP_BACK_RIGHT: return MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT; - case MA_CHANNEL_19: return MA_PA_CHANNEL_POSITION_AUX18; - case MA_CHANNEL_20: return MA_PA_CHANNEL_POSITION_AUX19; - case MA_CHANNEL_21: return MA_PA_CHANNEL_POSITION_AUX20; - case MA_CHANNEL_22: return MA_PA_CHANNEL_POSITION_AUX21; - case MA_CHANNEL_23: return MA_PA_CHANNEL_POSITION_AUX22; - case MA_CHANNEL_24: return MA_PA_CHANNEL_POSITION_AUX23; - case MA_CHANNEL_25: return MA_PA_CHANNEL_POSITION_AUX24; - case MA_CHANNEL_26: return MA_PA_CHANNEL_POSITION_AUX25; - case MA_CHANNEL_27: return MA_PA_CHANNEL_POSITION_AUX26; - case MA_CHANNEL_28: return MA_PA_CHANNEL_POSITION_AUX27; - case MA_CHANNEL_29: return MA_PA_CHANNEL_POSITION_AUX28; - case MA_CHANNEL_30: return MA_PA_CHANNEL_POSITION_AUX29; - case MA_CHANNEL_31: return MA_PA_CHANNEL_POSITION_AUX30; - case MA_CHANNEL_32: return MA_PA_CHANNEL_POSITION_AUX31; - default: return (ma_pa_channel_position_t)position; - } -} -#endif - -static ma_result ma_wait_for_operation__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_pa_operation* pOP) -{ - int resultPA; - ma_pa_operation_state_t state; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pOP != NULL); - - for (;;) { - state = ((ma_pa_operation_get_state_proc)pContext->pulse.pa_operation_get_state)(pOP); - if (state != MA_PA_OPERATION_RUNNING) { - break; /* Done. */ - } - - resultPA = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pMainLoop, 1, NULL); - if (resultPA < 0) { - return ma_result_from_pulse(resultPA); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_wait_for_operation_and_unref__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_pa_operation* pOP) -{ - ma_result result; - - if (pOP == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_wait_for_operation__pulse(pContext, pMainLoop, pOP); - ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP); - - return result; -} - -static ma_result ma_wait_for_pa_context_to_connect__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_ptr pPulseContext) -{ - int resultPA; - ma_pa_context_state_t state; - - for (;;) { - state = ((ma_pa_context_get_state_proc)pContext->pulse.pa_context_get_state)((ma_pa_context*)pPulseContext); - if (state == MA_PA_CONTEXT_READY) { - break; /* Done. */ - } - - if (state == MA_PA_CONTEXT_FAILED || state == MA_PA_CONTEXT_TERMINATED) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] An error occurred while connecting the PulseAudio context."); - return MA_ERROR; - } - - resultPA = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pMainLoop, 1, NULL); - if (resultPA < 0) { - return ma_result_from_pulse(resultPA); - } - } - - /* Should never get here. */ - return MA_SUCCESS; -} - -static ma_result ma_wait_for_pa_stream_to_connect__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_ptr pStream) -{ - int resultPA; - ma_pa_stream_state_t state; - - for (;;) { - state = ((ma_pa_stream_get_state_proc)pContext->pulse.pa_stream_get_state)((ma_pa_stream*)pStream); - if (state == MA_PA_STREAM_READY) { - break; /* Done. */ - } - - if (state == MA_PA_STREAM_FAILED || state == MA_PA_STREAM_TERMINATED) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] An error occurred while connecting the PulseAudio stream."); - return MA_ERROR; - } - - resultPA = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pMainLoop, 1, NULL); - if (resultPA < 0) { - return ma_result_from_pulse(resultPA); - } - } - - return MA_SUCCESS; -} - - -static ma_result ma_init_pa_mainloop_and_pa_context__pulse(ma_context* pContext, const char* pApplicationName, const char* pServerName, ma_bool32 tryAutoSpawn, ma_ptr* ppMainLoop, ma_ptr* ppPulseContext) -{ - ma_result result; - ma_ptr pMainLoop; - ma_ptr pPulseContext; - - MA_ASSERT(ppMainLoop != NULL); - MA_ASSERT(ppPulseContext != NULL); - - /* The PulseAudio context maps well to miniaudio's notion of a context. The pa_context object will be initialized as part of the ma_context. */ - pMainLoop = ((ma_pa_mainloop_new_proc)pContext->pulse.pa_mainloop_new)(); - if (pMainLoop == NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to create mainloop."); - return MA_FAILED_TO_INIT_BACKEND; - } - - pPulseContext = ((ma_pa_context_new_proc)pContext->pulse.pa_context_new)(((ma_pa_mainloop_get_api_proc)pContext->pulse.pa_mainloop_get_api)((ma_pa_mainloop*)pMainLoop), pApplicationName); - if (pPulseContext == NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to create PulseAudio context."); - ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop)); - return MA_FAILED_TO_INIT_BACKEND; - } - - /* Now we need to connect to the context. Everything is asynchronous so we need to wait for it to connect before returning. */ - result = ma_result_from_pulse(((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)((ma_pa_context*)pPulseContext, pServerName, (tryAutoSpawn) ? 0 : MA_PA_CONTEXT_NOAUTOSPAWN, NULL)); - if (result != MA_SUCCESS) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to connect PulseAudio context."); - ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop)); - return result; - } - - /* Since ma_context_init() runs synchronously we need to wait for the PulseAudio context to connect before we return. */ - result = ma_wait_for_pa_context_to_connect__pulse(pContext, pMainLoop, pPulseContext); - if (result != MA_SUCCESS) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[PulseAudio] Waiting for connection failed."); - ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop)); - return result; - } - - *ppMainLoop = pMainLoop; - *ppPulseContext = pPulseContext; - - return MA_SUCCESS; -} - - -static void ma_device_sink_info_callback(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData) -{ - ma_pa_sink_info* pInfoOut; - - if (endOfList > 0) { - return; - } - - pInfoOut = (ma_pa_sink_info*)pUserData; - MA_ASSERT(pInfoOut != NULL); - - *pInfoOut = *pInfo; - - (void)pPulseContext; /* Unused. */ -} - -static void ma_device_source_info_callback(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData) -{ - ma_pa_source_info* pInfoOut; - - if (endOfList > 0) { - return; - } - - pInfoOut = (ma_pa_source_info*)pUserData; - MA_ASSERT(pInfoOut != NULL); - - *pInfoOut = *pInfo; - - (void)pPulseContext; /* Unused. */ -} - -#if 0 -static void ma_device_sink_name_callback(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData) -{ - ma_device* pDevice; - - if (endOfList > 0) { - return; - } - - pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), pInfo->description, (size_t)-1); - - (void)pPulseContext; /* Unused. */ -} - -static void ma_device_source_name_callback(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData) -{ - ma_device* pDevice; - - if (endOfList > 0) { - return; - } - - pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), pInfo->description, (size_t)-1); - - (void)pPulseContext; /* Unused. */ -} -#endif - -static ma_result ma_context_get_sink_info__pulse(ma_context* pContext, const char* pDeviceName, ma_pa_sink_info* pSinkInfo) -{ - ma_pa_operation* pOP; - - pOP = ((ma_pa_context_get_sink_info_by_name_proc)pContext->pulse.pa_context_get_sink_info_by_name)((ma_pa_context*)pContext->pulse.pPulseContext, pDeviceName, ma_device_sink_info_callback, pSinkInfo); - if (pOP == NULL) { - return MA_ERROR; - } - - return ma_wait_for_operation_and_unref__pulse(pContext, pContext->pulse.pMainLoop, pOP); -} - -static ma_result ma_context_get_source_info__pulse(ma_context* pContext, const char* pDeviceName, ma_pa_source_info* pSourceInfo) -{ - ma_pa_operation* pOP; - - pOP = ((ma_pa_context_get_source_info_by_name_proc)pContext->pulse.pa_context_get_source_info_by_name)((ma_pa_context*)pContext->pulse.pPulseContext, pDeviceName, ma_device_source_info_callback, pSourceInfo); - if (pOP == NULL) { - return MA_ERROR; - } - - return ma_wait_for_operation_and_unref__pulse(pContext, pContext->pulse.pMainLoop, pOP); -} - -static ma_result ma_context_get_default_device_index__pulse(ma_context* pContext, ma_device_type deviceType, ma_uint32* pIndex) -{ - ma_result result; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pIndex != NULL); - - if (pIndex != NULL) { - *pIndex = (ma_uint32)-1; - } - - if (deviceType == ma_device_type_playback) { - ma_pa_sink_info sinkInfo; - result = ma_context_get_sink_info__pulse(pContext, NULL, &sinkInfo); - if (result != MA_SUCCESS) { - return result; - } - - if (pIndex != NULL) { - *pIndex = sinkInfo.index; - } - } - - if (deviceType == ma_device_type_capture) { - ma_pa_source_info sourceInfo; - result = ma_context_get_source_info__pulse(pContext, NULL, &sourceInfo); - if (result != MA_SUCCESS) { - return result; - } - - if (pIndex != NULL) { - *pIndex = sourceInfo.index; - } - } - - return MA_SUCCESS; -} - - -typedef struct -{ - ma_context* pContext; - ma_enum_devices_callback_proc callback; - void* pUserData; - ma_bool32 isTerminated; - ma_uint32 defaultDeviceIndexPlayback; - ma_uint32 defaultDeviceIndexCapture; -} ma_context_enumerate_devices_callback_data__pulse; - -static void ma_context_enumerate_devices_sink_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_sink_info* pSinkInfo, int endOfList, void* pUserData) -{ - ma_context_enumerate_devices_callback_data__pulse* pData = (ma_context_enumerate_devices_callback_data__pulse*)pUserData; - ma_device_info deviceInfo; - - MA_ASSERT(pData != NULL); - - if (endOfList || pData->isTerminated) { - return; - } - - MA_ZERO_OBJECT(&deviceInfo); - - /* The name from PulseAudio is the ID for miniaudio. */ - if (pSinkInfo->name != NULL) { - ma_strncpy_s(deviceInfo.id.pulse, sizeof(deviceInfo.id.pulse), pSinkInfo->name, (size_t)-1); - } - - /* The description from PulseAudio is the name for miniaudio. */ - if (pSinkInfo->description != NULL) { - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), pSinkInfo->description, (size_t)-1); - } - - if (pSinkInfo->index == pData->defaultDeviceIndexPlayback) { - deviceInfo.isDefault = MA_TRUE; - } - - pData->isTerminated = !pData->callback(pData->pContext, ma_device_type_playback, &deviceInfo, pData->pUserData); - - (void)pPulseContext; /* Unused. */ -} - -static void ma_context_enumerate_devices_source_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_source_info* pSourceInfo, int endOfList, void* pUserData) -{ - ma_context_enumerate_devices_callback_data__pulse* pData = (ma_context_enumerate_devices_callback_data__pulse*)pUserData; - ma_device_info deviceInfo; - - MA_ASSERT(pData != NULL); - - if (endOfList || pData->isTerminated) { - return; - } - - MA_ZERO_OBJECT(&deviceInfo); - - /* The name from PulseAudio is the ID for miniaudio. */ - if (pSourceInfo->name != NULL) { - ma_strncpy_s(deviceInfo.id.pulse, sizeof(deviceInfo.id.pulse), pSourceInfo->name, (size_t)-1); - } - - /* The description from PulseAudio is the name for miniaudio. */ - if (pSourceInfo->description != NULL) { - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), pSourceInfo->description, (size_t)-1); - } - - if (pSourceInfo->index == pData->defaultDeviceIndexCapture) { - deviceInfo.isDefault = MA_TRUE; - } - - pData->isTerminated = !pData->callback(pData->pContext, ma_device_type_capture, &deviceInfo, pData->pUserData); - - (void)pPulseContext; /* Unused. */ -} - -static ma_result ma_context_enumerate_devices__pulse(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_result result = MA_SUCCESS; - ma_context_enumerate_devices_callback_data__pulse callbackData; - ma_pa_operation* pOP = NULL; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - callbackData.pContext = pContext; - callbackData.callback = callback; - callbackData.pUserData = pUserData; - callbackData.isTerminated = MA_FALSE; - callbackData.defaultDeviceIndexPlayback = (ma_uint32)-1; - callbackData.defaultDeviceIndexCapture = (ma_uint32)-1; - - /* We need to get the index of the default devices. */ - ma_context_get_default_device_index__pulse(pContext, ma_device_type_playback, &callbackData.defaultDeviceIndexPlayback); - ma_context_get_default_device_index__pulse(pContext, ma_device_type_capture, &callbackData.defaultDeviceIndexCapture); - - /* Playback. */ - if (!callbackData.isTerminated) { - pOP = ((ma_pa_context_get_sink_info_list_proc)pContext->pulse.pa_context_get_sink_info_list)((ma_pa_context*)(pContext->pulse.pPulseContext), ma_context_enumerate_devices_sink_callback__pulse, &callbackData); - if (pOP == NULL) { - result = MA_ERROR; - goto done; - } - - result = ma_wait_for_operation__pulse(pContext, pContext->pulse.pMainLoop, pOP); - ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP); - - if (result != MA_SUCCESS) { - goto done; - } - } - - - /* Capture. */ - if (!callbackData.isTerminated) { - pOP = ((ma_pa_context_get_source_info_list_proc)pContext->pulse.pa_context_get_source_info_list)((ma_pa_context*)(pContext->pulse.pPulseContext), ma_context_enumerate_devices_source_callback__pulse, &callbackData); - if (pOP == NULL) { - result = MA_ERROR; - goto done; - } - - result = ma_wait_for_operation__pulse(pContext, pContext->pulse.pMainLoop, pOP); - ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP); - - if (result != MA_SUCCESS) { - goto done; - } - } - -done: - return result; -} - - -typedef struct -{ - ma_device_info* pDeviceInfo; - ma_uint32 defaultDeviceIndex; - ma_bool32 foundDevice; -} ma_context_get_device_info_callback_data__pulse; - -static void ma_context_get_device_info_sink_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData) -{ - ma_context_get_device_info_callback_data__pulse* pData = (ma_context_get_device_info_callback_data__pulse*)pUserData; - - if (endOfList > 0) { - return; - } - - MA_ASSERT(pData != NULL); - pData->foundDevice = MA_TRUE; - - if (pInfo->name != NULL) { - ma_strncpy_s(pData->pDeviceInfo->id.pulse, sizeof(pData->pDeviceInfo->id.pulse), pInfo->name, (size_t)-1); - } - - if (pInfo->description != NULL) { - ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pInfo->description, (size_t)-1); - } - - /* - We're just reporting a single data format here. I think technically PulseAudio might support - all formats, but I don't trust that PulseAudio will do *anything* right, so I'm just going to - report the "native" device format. - */ - pData->pDeviceInfo->nativeDataFormats[0].format = ma_format_from_pulse(pInfo->sample_spec.format); - pData->pDeviceInfo->nativeDataFormats[0].channels = pInfo->sample_spec.channels; - pData->pDeviceInfo->nativeDataFormats[0].sampleRate = pInfo->sample_spec.rate; - pData->pDeviceInfo->nativeDataFormats[0].flags = 0; - pData->pDeviceInfo->nativeDataFormatCount = 1; - - if (pData->defaultDeviceIndex == pInfo->index) { - pData->pDeviceInfo->isDefault = MA_TRUE; - } - - (void)pPulseContext; /* Unused. */ -} - -static void ma_context_get_device_info_source_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData) -{ - ma_context_get_device_info_callback_data__pulse* pData = (ma_context_get_device_info_callback_data__pulse*)pUserData; - - if (endOfList > 0) { - return; - } - - MA_ASSERT(pData != NULL); - pData->foundDevice = MA_TRUE; - - if (pInfo->name != NULL) { - ma_strncpy_s(pData->pDeviceInfo->id.pulse, sizeof(pData->pDeviceInfo->id.pulse), pInfo->name, (size_t)-1); - } - - if (pInfo->description != NULL) { - ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pInfo->description, (size_t)-1); - } - - /* - We're just reporting a single data format here. I think technically PulseAudio might support - all formats, but I don't trust that PulseAudio will do *anything* right, so I'm just going to - report the "native" device format. - */ - pData->pDeviceInfo->nativeDataFormats[0].format = ma_format_from_pulse(pInfo->sample_spec.format); - pData->pDeviceInfo->nativeDataFormats[0].channels = pInfo->sample_spec.channels; - pData->pDeviceInfo->nativeDataFormats[0].sampleRate = pInfo->sample_spec.rate; - pData->pDeviceInfo->nativeDataFormats[0].flags = 0; - pData->pDeviceInfo->nativeDataFormatCount = 1; - - if (pData->defaultDeviceIndex == pInfo->index) { - pData->pDeviceInfo->isDefault = MA_TRUE; - } - - (void)pPulseContext; /* Unused. */ -} - -static ma_result ma_context_get_device_info__pulse(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_result result = MA_SUCCESS; - ma_context_get_device_info_callback_data__pulse callbackData; - ma_pa_operation* pOP = NULL; - const char* pDeviceName = NULL; - - MA_ASSERT(pContext != NULL); - - callbackData.pDeviceInfo = pDeviceInfo; - callbackData.foundDevice = MA_FALSE; - - if (pDeviceID != NULL) { - pDeviceName = pDeviceID->pulse; - } else { - pDeviceName = NULL; - } - - result = ma_context_get_default_device_index__pulse(pContext, deviceType, &callbackData.defaultDeviceIndex); - - if (deviceType == ma_device_type_playback) { - pOP = ((ma_pa_context_get_sink_info_by_name_proc)pContext->pulse.pa_context_get_sink_info_by_name)((ma_pa_context*)(pContext->pulse.pPulseContext), pDeviceName, ma_context_get_device_info_sink_callback__pulse, &callbackData); - } else { - pOP = ((ma_pa_context_get_source_info_by_name_proc)pContext->pulse.pa_context_get_source_info_by_name)((ma_pa_context*)(pContext->pulse.pPulseContext), pDeviceName, ma_context_get_device_info_source_callback__pulse, &callbackData); - } - - if (pOP != NULL) { - ma_wait_for_operation_and_unref__pulse(pContext, pContext->pulse.pMainLoop, pOP); - } else { - result = MA_ERROR; - goto done; - } - - if (!callbackData.foundDevice) { - result = MA_NO_DEVICE; - goto done; - } - -done: - return result; -} - -static ma_result ma_device_uninit__pulse(ma_device* pDevice) -{ - ma_context* pContext; - - MA_ASSERT(pDevice != NULL); - - pContext = pDevice->pContext; - MA_ASSERT(pContext != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - } - - if (pDevice->type == ma_device_type_duplex) { - ma_duplex_rb_uninit(&pDevice->duplexRB); - } - - ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)((ma_pa_context*)pDevice->pulse.pPulseContext); - ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)pDevice->pulse.pPulseContext); - ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)pDevice->pulse.pMainLoop); - - return MA_SUCCESS; -} - -static ma_pa_buffer_attr ma_device__pa_buffer_attr_new(ma_uint32 periodSizeInFrames, ma_uint32 periods, const ma_pa_sample_spec* ss) -{ - ma_pa_buffer_attr attr; - attr.maxlength = periodSizeInFrames * periods * ma_get_bytes_per_frame(ma_format_from_pulse(ss->format), ss->channels); - attr.tlength = attr.maxlength / periods; - attr.prebuf = (ma_uint32)-1; - attr.minreq = (ma_uint32)-1; - attr.fragsize = attr.maxlength / periods; - - return attr; -} - -static ma_pa_stream* ma_device__pa_stream_new__pulse(ma_device* pDevice, const char* pStreamName, const ma_pa_sample_spec* ss, const ma_pa_channel_map* cmap) -{ - static int g_StreamCounter = 0; - char actualStreamName[256]; - - if (pStreamName != NULL) { - ma_strncpy_s(actualStreamName, sizeof(actualStreamName), pStreamName, (size_t)-1); - } else { - ma_strcpy_s(actualStreamName, sizeof(actualStreamName), "miniaudio:"); - ma_itoa_s(g_StreamCounter, actualStreamName + 8, sizeof(actualStreamName)-8, 10); /* 8 = strlen("miniaudio:") */ - } - g_StreamCounter += 1; - - return ((ma_pa_stream_new_proc)pDevice->pContext->pulse.pa_stream_new)((ma_pa_context*)pDevice->pulse.pPulseContext, actualStreamName, ss, cmap); -} - - -static void ma_device_on_read__pulse(ma_pa_stream* pStream, size_t byteCount, void* pUserData) -{ - ma_device* pDevice = (ma_device*)pUserData; - ma_uint32 bpf; - ma_uint32 deviceState; - ma_uint64 frameCount; - ma_uint64 framesProcessed; - - MA_ASSERT(pDevice != NULL); - - /* - Don't do anything if the device isn't initialized yet. Yes, this can happen because PulseAudio - can fire this callback before the stream has even started. Ridiculous. - */ - deviceState = ma_device_get_state(pDevice); - if (deviceState != ma_device_state_starting && deviceState != ma_device_state_started) { - return; - } - - bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - MA_ASSERT(bpf > 0); - - frameCount = byteCount / bpf; - framesProcessed = 0; - - while (ma_device_get_state(pDevice) == ma_device_state_started && framesProcessed < frameCount) { - const void* pMappedPCMFrames; - size_t bytesMapped; - ma_uint64 framesMapped; - - int pulseResult = ((ma_pa_stream_peek_proc)pDevice->pContext->pulse.pa_stream_peek)(pStream, &pMappedPCMFrames, &bytesMapped); - if (pulseResult < 0) { - break; /* Failed to map. Abort. */ - } - - framesMapped = bytesMapped / bpf; - if (framesMapped > 0) { - if (pMappedPCMFrames != NULL) { - ma_device_handle_backend_data_callback(pDevice, NULL, pMappedPCMFrames, framesMapped); - } else { - /* It's a hole. */ - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[PulseAudio] ma_device_on_read__pulse: Hole.\n"); - } - - pulseResult = ((ma_pa_stream_drop_proc)pDevice->pContext->pulse.pa_stream_drop)(pStream); - if (pulseResult < 0) { - break; /* Failed to drop the buffer. */ - } - - framesProcessed += framesMapped; - - } else { - /* Nothing was mapped. Just abort. */ - break; - } - } -} - -static ma_result ma_device_write_to_stream__pulse(ma_device* pDevice, ma_pa_stream* pStream, ma_uint64* pFramesProcessed) -{ - ma_result result = MA_SUCCESS; - ma_uint64 framesProcessed = 0; - size_t bytesMapped; - ma_uint32 bpf; - ma_uint32 deviceState; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pStream != NULL); - - bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - MA_ASSERT(bpf > 0); - - deviceState = ma_device_get_state(pDevice); - - bytesMapped = ((ma_pa_stream_writable_size_proc)pDevice->pContext->pulse.pa_stream_writable_size)(pStream); - if (bytesMapped != (size_t)-1) { - if (bytesMapped > 0) { - ma_uint64 framesMapped; - void* pMappedPCMFrames; - int pulseResult = ((ma_pa_stream_begin_write_proc)pDevice->pContext->pulse.pa_stream_begin_write)(pStream, &pMappedPCMFrames, &bytesMapped); - if (pulseResult < 0) { - result = ma_result_from_pulse(pulseResult); - goto done; - } - - framesMapped = bytesMapped / bpf; - - if (deviceState == ma_device_state_started || deviceState == ma_device_state_starting) { /* Check for starting state just in case this is being used to do the initial fill. */ - ma_device_handle_backend_data_callback(pDevice, pMappedPCMFrames, NULL, framesMapped); - } else { - /* Device is not started. Write silence. */ - ma_silence_pcm_frames(pMappedPCMFrames, framesMapped, pDevice->playback.format, pDevice->playback.channels); - } - - pulseResult = ((ma_pa_stream_write_proc)pDevice->pContext->pulse.pa_stream_write)(pStream, pMappedPCMFrames, bytesMapped, NULL, 0, MA_PA_SEEK_RELATIVE); - if (pulseResult < 0) { - result = ma_result_from_pulse(pulseResult); - goto done; /* Failed to write data to stream. */ - } - - framesProcessed += framesMapped; - } else { - result = MA_SUCCESS; /* No data available for writing. */ - goto done; - } - } else { - result = MA_ERROR; /* Failed to retrieve the writable size. Abort. */ - goto done; - } - -done: - if (pFramesProcessed != NULL) { - *pFramesProcessed = framesProcessed; - } - - return result; -} - -static void ma_device_on_write__pulse(ma_pa_stream* pStream, size_t byteCount, void* pUserData) -{ - ma_device* pDevice = (ma_device*)pUserData; - ma_uint32 bpf; - ma_uint64 frameCount; - ma_uint64 framesProcessed; - ma_uint32 deviceState; - ma_result result; - - MA_ASSERT(pDevice != NULL); - - /* - Don't do anything if the device isn't initialized yet. Yes, this can happen because PulseAudio - can fire this callback before the stream has even started. Ridiculous. - */ - deviceState = ma_device_get_state(pDevice); - if (deviceState != ma_device_state_starting && deviceState != ma_device_state_started) { - return; - } - - bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - MA_ASSERT(bpf > 0); - - frameCount = byteCount / bpf; - framesProcessed = 0; - - while (framesProcessed < frameCount) { - ma_uint64 framesProcessedThisIteration; - - /* Don't keep trying to process frames if the device isn't started. */ - deviceState = ma_device_get_state(pDevice); - if (deviceState != ma_device_state_starting && deviceState != ma_device_state_started) { - break; - } - - result = ma_device_write_to_stream__pulse(pDevice, pStream, &framesProcessedThisIteration); - if (result != MA_SUCCESS) { - break; - } - - framesProcessed += framesProcessedThisIteration; - } -} - -static void ma_device_on_suspended__pulse(ma_pa_stream* pStream, void* pUserData) -{ - ma_device* pDevice = (ma_device*)pUserData; - int suspended; - - (void)pStream; - - suspended = ((ma_pa_stream_is_suspended_proc)pDevice->pContext->pulse.pa_stream_is_suspended)(pStream); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[Pulse] Device suspended state changed. pa_stream_is_suspended() returned %d.\n", suspended); - - if (suspended < 0) { - return; - } - - if (suspended == 1) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[Pulse] Device suspended state changed. Suspended.\n"); - ma_device__on_notification_stopped(pDevice); - } else { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "[Pulse] Device suspended state changed. Resumed.\n"); - ma_device__on_notification_started(pDevice); - } -} - -static void ma_device_on_rerouted__pulse(ma_pa_stream* pStream, void* pUserData) -{ - ma_device* pDevice = (ma_device*)pUserData; - - (void)pStream; - (void)pUserData; - - ma_device__on_notification_rerouted(pDevice); -} - -static ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__pulse(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile) -{ - /* - There have been reports from users where buffers of < ~20ms result glitches when running through - PipeWire. To work around this we're going to have to use a different default buffer size. - */ - const ma_uint32 defaultPeriodSizeInMilliseconds_LowLatency = 25; - const ma_uint32 defaultPeriodSizeInMilliseconds_Conservative = MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE; - - MA_ASSERT(nativeSampleRate != 0); - - if (pDescriptor->periodSizeInFrames == 0) { - if (pDescriptor->periodSizeInMilliseconds == 0) { - if (performanceProfile == ma_performance_profile_low_latency) { - return ma_calculate_buffer_size_in_frames_from_milliseconds(defaultPeriodSizeInMilliseconds_LowLatency, nativeSampleRate); - } else { - return ma_calculate_buffer_size_in_frames_from_milliseconds(defaultPeriodSizeInMilliseconds_Conservative, nativeSampleRate); - } - } else { - return ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptor->periodSizeInMilliseconds, nativeSampleRate); - } - } else { - return pDescriptor->periodSizeInFrames; - } -} - -static ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - /* - Notes for PulseAudio: - - - We're always using native format/channels/rate regardless of whether or not PulseAudio - supports the format directly through their own data conversion system. I'm doing this to - reduce as much variability from the PulseAudio side as possible because it's seems to be - extremely unreliable at everything it does. - - - When both the period size in frames and milliseconds are 0, we default to miniaudio's - default buffer sizes rather than leaving it up to PulseAudio because I don't trust - PulseAudio to give us any kind of reasonable latency by default. - - - Do not ever, *ever* forget to use MA_PA_STREAM_ADJUST_LATENCY. If you don't specify this - flag, capture mode will just not work properly until you open another PulseAudio app. - */ - - ma_result result = MA_SUCCESS; - int error = 0; - const char* devPlayback = NULL; - const char* devCapture = NULL; - ma_format format = ma_format_unknown; - ma_uint32 channels = 0; - ma_uint32 sampleRate = 0; - ma_pa_sink_info sinkInfo; - ma_pa_source_info sourceInfo; - ma_pa_sample_spec ss; - ma_pa_channel_map cmap; - ma_pa_buffer_attr attr; - const ma_pa_sample_spec* pActualSS = NULL; - const ma_pa_channel_map* pActualCMap = NULL; - const ma_pa_buffer_attr* pActualAttr = NULL; - ma_uint32 iChannel; - ma_pa_stream_flags_t streamFlags; - - MA_ASSERT(pDevice != NULL); - MA_ZERO_OBJECT(&pDevice->pulse); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* No exclusive mode with the PulseAudio backend. */ - if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) || - ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode == ma_share_mode_exclusive)) { - return MA_SHARE_MODE_NOT_SUPPORTED; - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - if (pDescriptorPlayback->pDeviceID != NULL) { - devPlayback = pDescriptorPlayback->pDeviceID->pulse; - } - - format = pDescriptorPlayback->format; - channels = pDescriptorPlayback->channels; - sampleRate = pDescriptorPlayback->sampleRate; - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - if (pDescriptorCapture->pDeviceID != NULL) { - devCapture = pDescriptorCapture->pDeviceID->pulse; - } - - format = pDescriptorCapture->format; - channels = pDescriptorCapture->channels; - sampleRate = pDescriptorCapture->sampleRate; - } - - - - result = ma_init_pa_mainloop_and_pa_context__pulse(pDevice->pContext, pDevice->pContext->pulse.pApplicationName, pDevice->pContext->pulse.pServerName, MA_FALSE, &pDevice->pulse.pMainLoop, &pDevice->pulse.pPulseContext); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to initialize PA mainloop and context for device.\n"); - return result; - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - result = ma_context_get_source_info__pulse(pDevice->pContext, devCapture, &sourceInfo); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to retrieve source info for capture device."); - goto on_error0; - } - - ss = sourceInfo.sample_spec; - cmap = sourceInfo.channel_map; - - if (ma_format_from_pulse(ss.format) == ma_format_unknown) { - if (ma_is_little_endian()) { - ss.format = MA_PA_SAMPLE_FLOAT32LE; - } else { - ss.format = MA_PA_SAMPLE_FLOAT32BE; - } - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] sample_spec.format not supported by miniaudio. Defaulting to PA_SAMPLE_FLOAT32.\n"); - } - if (ss.rate == 0) { - ss.rate = MA_DEFAULT_SAMPLE_RATE; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] sample_spec.rate = 0. Defaulting to %d.\n", ss.rate); - } - if (ss.channels == 0) { - ss.channels = MA_DEFAULT_CHANNELS; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] sample_spec.channels = 0. Defaulting to %d.\n", ss.channels); - } - - /* We now have enough information to calculate our actual period size in frames. */ - pDescriptorCapture->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__pulse(pDescriptorCapture, ss.rate, pConfig->performanceProfile); - - attr = ma_device__pa_buffer_attr_new(pDescriptorCapture->periodSizeInFrames, pDescriptorCapture->periodCount, &ss); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Capture attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; periodSizeInFrames=%d\n", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorCapture->periodSizeInFrames); - - pDevice->pulse.pStreamCapture = ma_device__pa_stream_new__pulse(pDevice, pConfig->pulse.pStreamNameCapture, &ss, &cmap); - if (pDevice->pulse.pStreamCapture == NULL) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to create PulseAudio capture stream.\n"); - result = MA_ERROR; - goto on_error0; - } - - - /* The callback needs to be set before connecting the stream. */ - ((ma_pa_stream_set_read_callback_proc)pDevice->pContext->pulse.pa_stream_set_read_callback)((ma_pa_stream*)pDevice->pulse.pStreamCapture, ma_device_on_read__pulse, pDevice); - - /* State callback for checking when the device has been corked. */ - ((ma_pa_stream_set_suspended_callback_proc)pDevice->pContext->pulse.pa_stream_set_suspended_callback)((ma_pa_stream*)pDevice->pulse.pStreamCapture, ma_device_on_suspended__pulse, pDevice); - - /* Rerouting notification. */ - ((ma_pa_stream_set_moved_callback_proc)pDevice->pContext->pulse.pa_stream_set_moved_callback)((ma_pa_stream*)pDevice->pulse.pStreamCapture, ma_device_on_rerouted__pulse, pDevice); - - - /* Connect after we've got all of our internal state set up. */ - streamFlags = MA_PA_STREAM_START_CORKED | MA_PA_STREAM_ADJUST_LATENCY | MA_PA_STREAM_FIX_FORMAT | MA_PA_STREAM_FIX_RATE | MA_PA_STREAM_FIX_CHANNELS; - if (devCapture != NULL) { - streamFlags |= MA_PA_STREAM_DONT_MOVE; - } - - error = ((ma_pa_stream_connect_record_proc)pDevice->pContext->pulse.pa_stream_connect_record)((ma_pa_stream*)pDevice->pulse.pStreamCapture, devCapture, &attr, streamFlags); - if (error != MA_PA_OK) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to connect PulseAudio capture stream."); - result = ma_result_from_pulse(error); - goto on_error1; - } - - result = ma_wait_for_pa_stream_to_connect__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, (ma_pa_stream*)pDevice->pulse.pStreamCapture); - if (result != MA_SUCCESS) { - goto on_error2; - } - - - /* Internal format. */ - pActualSS = ((ma_pa_stream_get_sample_spec_proc)pDevice->pContext->pulse.pa_stream_get_sample_spec)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - if (pActualSS != NULL) { - ss = *pActualSS; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Capture sample spec: format=%s, channels=%d, rate=%d\n", ma_get_format_name(ma_format_from_pulse(ss.format)), ss.channels, ss.rate); - } else { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Failed to retrieve capture sample spec.\n"); - } - - pDescriptorCapture->format = ma_format_from_pulse(ss.format); - pDescriptorCapture->channels = ss.channels; - pDescriptorCapture->sampleRate = ss.rate; - - if (pDescriptorCapture->format == ma_format_unknown || pDescriptorCapture->channels == 0 || pDescriptorCapture->sampleRate == 0) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Capture sample spec is invalid. Device unusable by miniaudio. format=%s, channels=%d, sampleRate=%d.\n", ma_get_format_name(pDescriptorCapture->format), pDescriptorCapture->channels, pDescriptorCapture->sampleRate); - result = MA_ERROR; - goto on_error4; - } - - /* Internal channel map. */ - - /* - Bug in PipeWire. There have been reports that PipeWire is returning AUX channels when reporting - the channel map. To somewhat workaround this, I'm hacking in a hard coded channel map for mono - and stereo. In this case it should be safe to assume mono = MONO and stereo = LEFT/RIGHT. For - all other channel counts we need to just put up with whatever PipeWire reports and hope it gets - fixed sooner than later. I might remove this hack later. - */ - if (pDescriptorCapture->channels > 2) { - pActualCMap = ((ma_pa_stream_get_channel_map_proc)pDevice->pContext->pulse.pa_stream_get_channel_map)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - if (pActualCMap != NULL) { - cmap = *pActualCMap; - } - - for (iChannel = 0; iChannel < pDescriptorCapture->channels; ++iChannel) { - pDescriptorCapture->channelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]); - } - } else { - /* Hack for mono and stereo. */ - if (pDescriptorCapture->channels == 1) { - pDescriptorCapture->channelMap[0] = MA_CHANNEL_MONO; - } else if (pDescriptorCapture->channels == 2) { - pDescriptorCapture->channelMap[0] = MA_CHANNEL_FRONT_LEFT; - pDescriptorCapture->channelMap[1] = MA_CHANNEL_FRONT_RIGHT; - } else { - MA_ASSERT(MA_FALSE); /* Should never hit this. */ - } - } - - - /* Buffer. */ - pActualAttr = ((ma_pa_stream_get_buffer_attr_proc)pDevice->pContext->pulse.pa_stream_get_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - if (pActualAttr != NULL) { - attr = *pActualAttr; - } - - if (attr.fragsize > 0) { - pDescriptorCapture->periodCount = ma_max(attr.maxlength / attr.fragsize, 1); - } else { - pDescriptorCapture->periodCount = 1; - } - - pDescriptorCapture->periodSizeInFrames = attr.maxlength / ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) / pDescriptorCapture->periodCount; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Capture actual attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; periodSizeInFrames=%d\n", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorCapture->periodSizeInFrames); - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - result = ma_context_get_sink_info__pulse(pDevice->pContext, devPlayback, &sinkInfo); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to retrieve sink info for playback device.\n"); - goto on_error2; - } - - ss = sinkInfo.sample_spec; - cmap = sinkInfo.channel_map; - - if (ma_format_from_pulse(ss.format) == ma_format_unknown) { - if (ma_is_little_endian()) { - ss.format = MA_PA_SAMPLE_FLOAT32LE; - } else { - ss.format = MA_PA_SAMPLE_FLOAT32BE; - } - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] sample_spec.format not supported by miniaudio. Defaulting to PA_SAMPLE_FLOAT32.\n"); - } - if (ss.rate == 0) { - ss.rate = MA_DEFAULT_SAMPLE_RATE; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] sample_spec.rate = 0. Defaulting to %d.\n", ss.rate); - } - if (ss.channels == 0) { - ss.channels = MA_DEFAULT_CHANNELS; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] sample_spec.channels = 0. Defaulting to %d.\n", ss.channels); - } - - /* We now have enough information to calculate the actual buffer size in frames. */ - pDescriptorPlayback->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__pulse(pDescriptorPlayback, ss.rate, pConfig->performanceProfile); - - attr = ma_device__pa_buffer_attr_new(pDescriptorPlayback->periodSizeInFrames, pDescriptorPlayback->periodCount, &ss); - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Playback attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; periodSizeInFrames=%d\n", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorPlayback->periodSizeInFrames); - - pDevice->pulse.pStreamPlayback = ma_device__pa_stream_new__pulse(pDevice, pConfig->pulse.pStreamNamePlayback, &ss, &cmap); - if (pDevice->pulse.pStreamPlayback == NULL) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to create PulseAudio playback stream.\n"); - result = MA_ERROR; - goto on_error2; - } - - - /* - Note that this callback will be fired as soon as the stream is connected, even though it's started as corked. The callback needs to handle a - device state of ma_device_state_uninitialized. - */ - ((ma_pa_stream_set_write_callback_proc)pDevice->pContext->pulse.pa_stream_set_write_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_write__pulse, pDevice); - - /* State callback for checking when the device has been corked. */ - ((ma_pa_stream_set_suspended_callback_proc)pDevice->pContext->pulse.pa_stream_set_suspended_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_suspended__pulse, pDevice); - - /* Rerouting notification. */ - ((ma_pa_stream_set_moved_callback_proc)pDevice->pContext->pulse.pa_stream_set_moved_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_rerouted__pulse, pDevice); - - - /* Connect after we've got all of our internal state set up. */ - streamFlags = MA_PA_STREAM_START_CORKED | MA_PA_STREAM_ADJUST_LATENCY | MA_PA_STREAM_FIX_FORMAT | MA_PA_STREAM_FIX_RATE | MA_PA_STREAM_FIX_CHANNELS; - if (devPlayback != NULL) { - streamFlags |= MA_PA_STREAM_DONT_MOVE; - } - - error = ((ma_pa_stream_connect_playback_proc)pDevice->pContext->pulse.pa_stream_connect_playback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, devPlayback, &attr, streamFlags, NULL, NULL); - if (error != MA_PA_OK) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to connect PulseAudio playback stream."); - result = ma_result_from_pulse(error); - goto on_error3; - } - - result = ma_wait_for_pa_stream_to_connect__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, (ma_pa_stream*)pDevice->pulse.pStreamPlayback); - if (result != MA_SUCCESS) { - goto on_error3; - } - - - /* Internal format. */ - pActualSS = ((ma_pa_stream_get_sample_spec_proc)pDevice->pContext->pulse.pa_stream_get_sample_spec)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - if (pActualSS != NULL) { - ss = *pActualSS; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Playback sample spec: format=%s, channels=%d, rate=%d\n", ma_get_format_name(ma_format_from_pulse(ss.format)), ss.channels, ss.rate); - } else { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Failed to retrieve playback sample spec.\n"); - } - - pDescriptorPlayback->format = ma_format_from_pulse(ss.format); - pDescriptorPlayback->channels = ss.channels; - pDescriptorPlayback->sampleRate = ss.rate; - - if (pDescriptorPlayback->format == ma_format_unknown || pDescriptorPlayback->channels == 0 || pDescriptorPlayback->sampleRate == 0) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Playback sample spec is invalid. Device unusable by miniaudio. format=%s, channels=%d, sampleRate=%d.\n", ma_get_format_name(pDescriptorPlayback->format), pDescriptorPlayback->channels, pDescriptorPlayback->sampleRate); - result = MA_ERROR; - goto on_error4; - } - - /* Internal channel map. */ - - /* - Bug in PipeWire. There have been reports that PipeWire is returning AUX channels when reporting - the channel map. To somewhat workaround this, I'm hacking in a hard coded channel map for mono - and stereo. In this case it should be safe to assume mono = MONO and stereo = LEFT/RIGHT. For - all other channel counts we need to just put up with whatever PipeWire reports and hope it gets - fixed sooner than later. I might remove this hack later. - */ - if (pDescriptorPlayback->channels > 2) { - pActualCMap = ((ma_pa_stream_get_channel_map_proc)pDevice->pContext->pulse.pa_stream_get_channel_map)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - if (pActualCMap != NULL) { - cmap = *pActualCMap; - } - - for (iChannel = 0; iChannel < pDescriptorPlayback->channels; ++iChannel) { - pDescriptorPlayback->channelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]); - } - } else { - /* Hack for mono and stereo. */ - if (pDescriptorPlayback->channels == 1) { - pDescriptorPlayback->channelMap[0] = MA_CHANNEL_MONO; - } else if (pDescriptorPlayback->channels == 2) { - pDescriptorPlayback->channelMap[0] = MA_CHANNEL_FRONT_LEFT; - pDescriptorPlayback->channelMap[1] = MA_CHANNEL_FRONT_RIGHT; - } else { - MA_ASSERT(MA_FALSE); /* Should never hit this. */ - } - } - - - /* Buffer. */ - pActualAttr = ((ma_pa_stream_get_buffer_attr_proc)pDevice->pContext->pulse.pa_stream_get_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - if (pActualAttr != NULL) { - attr = *pActualAttr; - } - - if (attr.tlength > 0) { - pDescriptorPlayback->periodCount = ma_max(attr.maxlength / attr.tlength, 1); - } else { - pDescriptorPlayback->periodCount = 1; - } - - pDescriptorPlayback->periodSizeInFrames = attr.maxlength / ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels) / pDescriptorPlayback->periodCount; - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[PulseAudio] Playback actual attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; internalPeriodSizeInFrames=%d\n", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorPlayback->periodSizeInFrames); - } - - - /* - We need a ring buffer for handling duplex mode. We can use the main duplex ring buffer in the main - part of the ma_device struct. We cannot, however, depend on ma_device_init() initializing this for - us later on because that will only do it if it's a fully asynchronous backend - i.e. the - onDeviceDataLoop callback is NULL, which is not the case for PulseAudio. - */ - if (pConfig->deviceType == ma_device_type_duplex) { - ma_format rbFormat = (format != ma_format_unknown) ? format : pDescriptorCapture->format; - ma_uint32 rbChannels = (channels > 0) ? channels : pDescriptorCapture->channels; - ma_uint32 rbSampleRate = (sampleRate > 0) ? sampleRate : pDescriptorCapture->sampleRate; - - result = ma_duplex_rb_init(rbFormat, rbChannels, rbSampleRate, pDescriptorCapture->sampleRate, pDescriptorCapture->periodSizeInFrames, &pDevice->pContext->allocationCallbacks, &pDevice->duplexRB); - if (result != MA_SUCCESS) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to initialize ring buffer. %s.\n", ma_result_description(result)); - goto on_error4; - } - } - - return MA_SUCCESS; - - -on_error4: - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ((ma_pa_stream_disconnect_proc)pDevice->pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - } -on_error3: - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ((ma_pa_stream_unref_proc)pDevice->pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamPlayback); - } -on_error2: - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ((ma_pa_stream_disconnect_proc)pDevice->pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - } -on_error1: - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ((ma_pa_stream_unref_proc)pDevice->pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamCapture); - } -on_error0: - return result; -} - - -static void ma_pulse_operation_complete_callback(ma_pa_stream* pStream, int success, void* pUserData) -{ - ma_bool32* pIsSuccessful = (ma_bool32*)pUserData; - MA_ASSERT(pIsSuccessful != NULL); - - *pIsSuccessful = (ma_bool32)success; - - (void)pStream; /* Unused. */ -} - -static ma_result ma_device__cork_stream__pulse(ma_device* pDevice, ma_device_type deviceType, int cork) -{ - ma_context* pContext = pDevice->pContext; - ma_bool32 wasSuccessful; - ma_pa_stream* pStream; - ma_pa_operation* pOP; - ma_result result; - - /* This should not be called with a duplex device type. */ - if (deviceType == ma_device_type_duplex) { - return MA_INVALID_ARGS; - } - - wasSuccessful = MA_FALSE; - - pStream = (ma_pa_stream*)((deviceType == ma_device_type_capture) ? pDevice->pulse.pStreamCapture : pDevice->pulse.pStreamPlayback); - MA_ASSERT(pStream != NULL); - - pOP = ((ma_pa_stream_cork_proc)pContext->pulse.pa_stream_cork)(pStream, cork, ma_pulse_operation_complete_callback, &wasSuccessful); - if (pOP == NULL) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to cork PulseAudio stream."); - return MA_ERROR; - } - - result = ma_wait_for_operation_and_unref__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, pOP); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] An error occurred while waiting for the PulseAudio stream to cork."); - return result; - } - - if (!wasSuccessful) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[PulseAudio] Failed to %s PulseAudio stream.", (cork) ? "stop" : "start"); - return MA_ERROR; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start__pulse(ma_device* pDevice) -{ - ma_result result; - - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - result = ma_device__cork_stream__pulse(pDevice, ma_device_type_capture, 0); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - /* - We need to fill some data before uncorking. Not doing this will result in the write callback - never getting fired. We're not going to abort if writing fails because I still want the device - to get uncorked. - */ - ma_device_write_to_stream__pulse(pDevice, (ma_pa_stream*)(pDevice->pulse.pStreamPlayback), NULL); /* No need to check the result here. Always want to fall through an uncork.*/ - - result = ma_device__cork_stream__pulse(pDevice, ma_device_type_playback, 0); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__pulse(ma_device* pDevice) -{ - ma_result result; - - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - result = ma_device__cork_stream__pulse(pDevice, ma_device_type_capture, 1); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - /* - Ideally we would drain the device here, but there's been cases where PulseAudio seems to be - broken on some systems to the point where no audio processing seems to happen. When this - happens, draining never completes and we get stuck here. For now I'm disabling draining of - the device so we don't just freeze the application. - */ - #if 0 - ma_pa_operation* pOP = ((ma_pa_stream_drain_proc)pDevice->pContext->pulse.pa_stream_drain)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_pulse_operation_complete_callback, &wasSuccessful); - ma_wait_for_operation_and_unref__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, pOP); - #endif - - result = ma_device__cork_stream__pulse(pDevice, ma_device_type_playback, 1); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_data_loop__pulse(ma_device* pDevice) -{ - int resultPA; - - MA_ASSERT(pDevice != NULL); - - /* NOTE: Don't start the device here. It'll be done at a higher level. */ - - /* - All data is handled through callbacks. All we need to do is iterate over the main loop and let - the callbacks deal with it. - */ - while (ma_device_get_state(pDevice) == ma_device_state_started) { - resultPA = ((ma_pa_mainloop_iterate_proc)pDevice->pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pDevice->pulse.pMainLoop, 1, NULL); - if (resultPA < 0) { - break; - } - } - - /* NOTE: Don't stop the device here. It'll be done at a higher level. */ - return MA_SUCCESS; -} - -static ma_result ma_device_data_loop_wakeup__pulse(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - ((ma_pa_mainloop_wakeup_proc)pDevice->pContext->pulse.pa_mainloop_wakeup)((ma_pa_mainloop*)pDevice->pulse.pMainLoop); - - return MA_SUCCESS; -} - -static ma_result ma_context_uninit__pulse(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_pulseaudio); - - ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)((ma_pa_context*)pContext->pulse.pPulseContext); - ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)pContext->pulse.pPulseContext); - ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)pContext->pulse.pMainLoop); - - ma_free(pContext->pulse.pServerName, &pContext->allocationCallbacks); - ma_free(pContext->pulse.pApplicationName, &pContext->allocationCallbacks); - -#ifndef MA_NO_RUNTIME_LINKING - ma_dlclose(pContext, pContext->pulse.pulseSO); -#endif - - return MA_SUCCESS; -} - -static ma_result ma_context_init__pulse(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - ma_result result; -#ifndef MA_NO_RUNTIME_LINKING - const char* libpulseNames[] = { - "libpulse.so", - "libpulse.so.0" - }; - size_t i; - - for (i = 0; i < ma_countof(libpulseNames); ++i) { - pContext->pulse.pulseSO = ma_dlopen(pContext, libpulseNames[i]); - if (pContext->pulse.pulseSO != NULL) { - break; - } - } - - if (pContext->pulse.pulseSO == NULL) { - return MA_NO_BACKEND; - } - - pContext->pulse.pa_mainloop_new = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_mainloop_new"); - pContext->pulse.pa_mainloop_free = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_mainloop_free"); - pContext->pulse.pa_mainloop_quit = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_mainloop_quit"); - pContext->pulse.pa_mainloop_get_api = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_mainloop_get_api"); - pContext->pulse.pa_mainloop_iterate = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_mainloop_iterate"); - pContext->pulse.pa_mainloop_wakeup = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_mainloop_wakeup"); - pContext->pulse.pa_threaded_mainloop_new = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_new"); - pContext->pulse.pa_threaded_mainloop_free = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_free"); - pContext->pulse.pa_threaded_mainloop_start = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_start"); - pContext->pulse.pa_threaded_mainloop_stop = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_stop"); - pContext->pulse.pa_threaded_mainloop_lock = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_lock"); - pContext->pulse.pa_threaded_mainloop_unlock = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_unlock"); - pContext->pulse.pa_threaded_mainloop_wait = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_wait"); - pContext->pulse.pa_threaded_mainloop_signal = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_signal"); - pContext->pulse.pa_threaded_mainloop_accept = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_accept"); - pContext->pulse.pa_threaded_mainloop_get_retval = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_get_retval"); - pContext->pulse.pa_threaded_mainloop_get_api = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_get_api"); - pContext->pulse.pa_threaded_mainloop_in_thread = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_in_thread"); - pContext->pulse.pa_threaded_mainloop_set_name = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_threaded_mainloop_set_name"); - pContext->pulse.pa_context_new = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_new"); - pContext->pulse.pa_context_unref = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_unref"); - pContext->pulse.pa_context_connect = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_connect"); - pContext->pulse.pa_context_disconnect = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_disconnect"); - pContext->pulse.pa_context_set_state_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_set_state_callback"); - pContext->pulse.pa_context_get_state = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_get_state"); - pContext->pulse.pa_context_get_sink_info_list = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_get_sink_info_list"); - pContext->pulse.pa_context_get_source_info_list = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_get_source_info_list"); - pContext->pulse.pa_context_get_sink_info_by_name = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_get_sink_info_by_name"); - pContext->pulse.pa_context_get_source_info_by_name = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_context_get_source_info_by_name"); - pContext->pulse.pa_operation_unref = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_operation_unref"); - pContext->pulse.pa_operation_get_state = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_operation_get_state"); - pContext->pulse.pa_channel_map_init_extend = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_channel_map_init_extend"); - pContext->pulse.pa_channel_map_valid = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_channel_map_valid"); - pContext->pulse.pa_channel_map_compatible = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_channel_map_compatible"); - pContext->pulse.pa_stream_new = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_new"); - pContext->pulse.pa_stream_unref = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_unref"); - pContext->pulse.pa_stream_connect_playback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_connect_playback"); - pContext->pulse.pa_stream_connect_record = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_connect_record"); - pContext->pulse.pa_stream_disconnect = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_disconnect"); - pContext->pulse.pa_stream_get_state = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_get_state"); - pContext->pulse.pa_stream_get_sample_spec = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_get_sample_spec"); - pContext->pulse.pa_stream_get_channel_map = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_get_channel_map"); - pContext->pulse.pa_stream_get_buffer_attr = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_get_buffer_attr"); - pContext->pulse.pa_stream_set_buffer_attr = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_buffer_attr"); - pContext->pulse.pa_stream_get_device_name = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_get_device_name"); - pContext->pulse.pa_stream_set_write_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_write_callback"); - pContext->pulse.pa_stream_set_read_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_read_callback"); - pContext->pulse.pa_stream_set_suspended_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_suspended_callback"); - pContext->pulse.pa_stream_set_moved_callback = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_set_moved_callback"); - pContext->pulse.pa_stream_is_suspended = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_is_suspended"); - pContext->pulse.pa_stream_flush = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_flush"); - pContext->pulse.pa_stream_drain = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_drain"); - pContext->pulse.pa_stream_is_corked = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_is_corked"); - pContext->pulse.pa_stream_cork = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_cork"); - pContext->pulse.pa_stream_trigger = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_trigger"); - pContext->pulse.pa_stream_begin_write = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_begin_write"); - pContext->pulse.pa_stream_write = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_write"); - pContext->pulse.pa_stream_peek = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_peek"); - pContext->pulse.pa_stream_drop = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_drop"); - pContext->pulse.pa_stream_writable_size = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_writable_size"); - pContext->pulse.pa_stream_readable_size = (ma_proc)ma_dlsym(pContext, pContext->pulse.pulseSO, "pa_stream_readable_size"); -#else - /* This strange assignment system is just for type safety. */ - ma_pa_mainloop_new_proc _pa_mainloop_new = pa_mainloop_new; - ma_pa_mainloop_free_proc _pa_mainloop_free = pa_mainloop_free; - ma_pa_mainloop_quit_proc _pa_mainloop_quit = pa_mainloop_quit; - ma_pa_mainloop_get_api_proc _pa_mainloop_get_api = pa_mainloop_get_api; - ma_pa_mainloop_iterate_proc _pa_mainloop_iterate = pa_mainloop_iterate; - ma_pa_mainloop_wakeup_proc _pa_mainloop_wakeup = pa_mainloop_wakeup; - ma_pa_threaded_mainloop_new_proc _pa_threaded_mainloop_new = pa_threaded_mainloop_new; - ma_pa_threaded_mainloop_free_proc _pa_threaded_mainloop_free = pa_threaded_mainloop_free; - ma_pa_threaded_mainloop_start_proc _pa_threaded_mainloop_start = pa_threaded_mainloop_start; - ma_pa_threaded_mainloop_stop_proc _pa_threaded_mainloop_stop = pa_threaded_mainloop_stop; - ma_pa_threaded_mainloop_lock_proc _pa_threaded_mainloop_lock = pa_threaded_mainloop_lock; - ma_pa_threaded_mainloop_unlock_proc _pa_threaded_mainloop_unlock = pa_threaded_mainloop_unlock; - ma_pa_threaded_mainloop_wait_proc _pa_threaded_mainloop_wait = pa_threaded_mainloop_wait; - ma_pa_threaded_mainloop_signal_proc _pa_threaded_mainloop_signal = pa_threaded_mainloop_signal; - ma_pa_threaded_mainloop_accept_proc _pa_threaded_mainloop_accept = pa_threaded_mainloop_accept; - ma_pa_threaded_mainloop_get_retval_proc _pa_threaded_mainloop_get_retval = pa_threaded_mainloop_get_retval; - ma_pa_threaded_mainloop_get_api_proc _pa_threaded_mainloop_get_api = pa_threaded_mainloop_get_api; - ma_pa_threaded_mainloop_in_thread_proc _pa_threaded_mainloop_in_thread = pa_threaded_mainloop_in_thread; - ma_pa_threaded_mainloop_set_name_proc _pa_threaded_mainloop_set_name = pa_threaded_mainloop_set_name; - ma_pa_context_new_proc _pa_context_new = pa_context_new; - ma_pa_context_unref_proc _pa_context_unref = pa_context_unref; - ma_pa_context_connect_proc _pa_context_connect = pa_context_connect; - ma_pa_context_disconnect_proc _pa_context_disconnect = pa_context_disconnect; - ma_pa_context_set_state_callback_proc _pa_context_set_state_callback = pa_context_set_state_callback; - ma_pa_context_get_state_proc _pa_context_get_state = pa_context_get_state; - ma_pa_context_get_sink_info_list_proc _pa_context_get_sink_info_list = pa_context_get_sink_info_list; - ma_pa_context_get_source_info_list_proc _pa_context_get_source_info_list = pa_context_get_source_info_list; - ma_pa_context_get_sink_info_by_name_proc _pa_context_get_sink_info_by_name = pa_context_get_sink_info_by_name; - ma_pa_context_get_source_info_by_name_proc _pa_context_get_source_info_by_name= pa_context_get_source_info_by_name; - ma_pa_operation_unref_proc _pa_operation_unref = pa_operation_unref; - ma_pa_operation_get_state_proc _pa_operation_get_state = pa_operation_get_state; - ma_pa_channel_map_init_extend_proc _pa_channel_map_init_extend = pa_channel_map_init_extend; - ma_pa_channel_map_valid_proc _pa_channel_map_valid = pa_channel_map_valid; - ma_pa_channel_map_compatible_proc _pa_channel_map_compatible = pa_channel_map_compatible; - ma_pa_stream_new_proc _pa_stream_new = pa_stream_new; - ma_pa_stream_unref_proc _pa_stream_unref = pa_stream_unref; - ma_pa_stream_connect_playback_proc _pa_stream_connect_playback = pa_stream_connect_playback; - ma_pa_stream_connect_record_proc _pa_stream_connect_record = pa_stream_connect_record; - ma_pa_stream_disconnect_proc _pa_stream_disconnect = pa_stream_disconnect; - ma_pa_stream_get_state_proc _pa_stream_get_state = pa_stream_get_state; - ma_pa_stream_get_sample_spec_proc _pa_stream_get_sample_spec = pa_stream_get_sample_spec; - ma_pa_stream_get_channel_map_proc _pa_stream_get_channel_map = pa_stream_get_channel_map; - ma_pa_stream_get_buffer_attr_proc _pa_stream_get_buffer_attr = pa_stream_get_buffer_attr; - ma_pa_stream_set_buffer_attr_proc _pa_stream_set_buffer_attr = pa_stream_set_buffer_attr; - ma_pa_stream_get_device_name_proc _pa_stream_get_device_name = pa_stream_get_device_name; - ma_pa_stream_set_write_callback_proc _pa_stream_set_write_callback = pa_stream_set_write_callback; - ma_pa_stream_set_read_callback_proc _pa_stream_set_read_callback = pa_stream_set_read_callback; - ma_pa_stream_set_suspended_callback_proc _pa_stream_set_suspended_callback = pa_stream_set_suspended_callback; - ma_pa_stream_set_moved_callback_proc _pa_stream_set_moved_callback = pa_stream_set_moved_callback; - ma_pa_stream_is_suspended_proc _pa_stream_is_suspended = pa_stream_is_suspended; - ma_pa_stream_flush_proc _pa_stream_flush = pa_stream_flush; - ma_pa_stream_drain_proc _pa_stream_drain = pa_stream_drain; - ma_pa_stream_is_corked_proc _pa_stream_is_corked = pa_stream_is_corked; - ma_pa_stream_cork_proc _pa_stream_cork = pa_stream_cork; - ma_pa_stream_trigger_proc _pa_stream_trigger = pa_stream_trigger; - ma_pa_stream_begin_write_proc _pa_stream_begin_write = pa_stream_begin_write; - ma_pa_stream_write_proc _pa_stream_write = pa_stream_write; - ma_pa_stream_peek_proc _pa_stream_peek = pa_stream_peek; - ma_pa_stream_drop_proc _pa_stream_drop = pa_stream_drop; - ma_pa_stream_writable_size_proc _pa_stream_writable_size = pa_stream_writable_size; - ma_pa_stream_readable_size_proc _pa_stream_readable_size = pa_stream_readable_size; - - pContext->pulse.pa_mainloop_new = (ma_proc)_pa_mainloop_new; - pContext->pulse.pa_mainloop_free = (ma_proc)_pa_mainloop_free; - pContext->pulse.pa_mainloop_quit = (ma_proc)_pa_mainloop_quit; - pContext->pulse.pa_mainloop_get_api = (ma_proc)_pa_mainloop_get_api; - pContext->pulse.pa_mainloop_iterate = (ma_proc)_pa_mainloop_iterate; - pContext->pulse.pa_mainloop_wakeup = (ma_proc)_pa_mainloop_wakeup; - pContext->pulse.pa_threaded_mainloop_new = (ma_proc)_pa_threaded_mainloop_new; - pContext->pulse.pa_threaded_mainloop_free = (ma_proc)_pa_threaded_mainloop_free; - pContext->pulse.pa_threaded_mainloop_start = (ma_proc)_pa_threaded_mainloop_start; - pContext->pulse.pa_threaded_mainloop_stop = (ma_proc)_pa_threaded_mainloop_stop; - pContext->pulse.pa_threaded_mainloop_lock = (ma_proc)_pa_threaded_mainloop_lock; - pContext->pulse.pa_threaded_mainloop_unlock = (ma_proc)_pa_threaded_mainloop_unlock; - pContext->pulse.pa_threaded_mainloop_wait = (ma_proc)_pa_threaded_mainloop_wait; - pContext->pulse.pa_threaded_mainloop_signal = (ma_proc)_pa_threaded_mainloop_signal; - pContext->pulse.pa_threaded_mainloop_accept = (ma_proc)_pa_threaded_mainloop_accept; - pContext->pulse.pa_threaded_mainloop_get_retval = (ma_proc)_pa_threaded_mainloop_get_retval; - pContext->pulse.pa_threaded_mainloop_get_api = (ma_proc)_pa_threaded_mainloop_get_api; - pContext->pulse.pa_threaded_mainloop_in_thread = (ma_proc)_pa_threaded_mainloop_in_thread; - pContext->pulse.pa_threaded_mainloop_set_name = (ma_proc)_pa_threaded_mainloop_set_name; - pContext->pulse.pa_context_new = (ma_proc)_pa_context_new; - pContext->pulse.pa_context_unref = (ma_proc)_pa_context_unref; - pContext->pulse.pa_context_connect = (ma_proc)_pa_context_connect; - pContext->pulse.pa_context_disconnect = (ma_proc)_pa_context_disconnect; - pContext->pulse.pa_context_set_state_callback = (ma_proc)_pa_context_set_state_callback; - pContext->pulse.pa_context_get_state = (ma_proc)_pa_context_get_state; - pContext->pulse.pa_context_get_sink_info_list = (ma_proc)_pa_context_get_sink_info_list; - pContext->pulse.pa_context_get_source_info_list = (ma_proc)_pa_context_get_source_info_list; - pContext->pulse.pa_context_get_sink_info_by_name = (ma_proc)_pa_context_get_sink_info_by_name; - pContext->pulse.pa_context_get_source_info_by_name = (ma_proc)_pa_context_get_source_info_by_name; - pContext->pulse.pa_operation_unref = (ma_proc)_pa_operation_unref; - pContext->pulse.pa_operation_get_state = (ma_proc)_pa_operation_get_state; - pContext->pulse.pa_channel_map_init_extend = (ma_proc)_pa_channel_map_init_extend; - pContext->pulse.pa_channel_map_valid = (ma_proc)_pa_channel_map_valid; - pContext->pulse.pa_channel_map_compatible = (ma_proc)_pa_channel_map_compatible; - pContext->pulse.pa_stream_new = (ma_proc)_pa_stream_new; - pContext->pulse.pa_stream_unref = (ma_proc)_pa_stream_unref; - pContext->pulse.pa_stream_connect_playback = (ma_proc)_pa_stream_connect_playback; - pContext->pulse.pa_stream_connect_record = (ma_proc)_pa_stream_connect_record; - pContext->pulse.pa_stream_disconnect = (ma_proc)_pa_stream_disconnect; - pContext->pulse.pa_stream_get_state = (ma_proc)_pa_stream_get_state; - pContext->pulse.pa_stream_get_sample_spec = (ma_proc)_pa_stream_get_sample_spec; - pContext->pulse.pa_stream_get_channel_map = (ma_proc)_pa_stream_get_channel_map; - pContext->pulse.pa_stream_get_buffer_attr = (ma_proc)_pa_stream_get_buffer_attr; - pContext->pulse.pa_stream_set_buffer_attr = (ma_proc)_pa_stream_set_buffer_attr; - pContext->pulse.pa_stream_get_device_name = (ma_proc)_pa_stream_get_device_name; - pContext->pulse.pa_stream_set_write_callback = (ma_proc)_pa_stream_set_write_callback; - pContext->pulse.pa_stream_set_read_callback = (ma_proc)_pa_stream_set_read_callback; - pContext->pulse.pa_stream_set_suspended_callback = (ma_proc)_pa_stream_set_suspended_callback; - pContext->pulse.pa_stream_set_moved_callback = (ma_proc)_pa_stream_set_moved_callback; - pContext->pulse.pa_stream_is_suspended = (ma_proc)_pa_stream_is_suspended; - pContext->pulse.pa_stream_flush = (ma_proc)_pa_stream_flush; - pContext->pulse.pa_stream_drain = (ma_proc)_pa_stream_drain; - pContext->pulse.pa_stream_is_corked = (ma_proc)_pa_stream_is_corked; - pContext->pulse.pa_stream_cork = (ma_proc)_pa_stream_cork; - pContext->pulse.pa_stream_trigger = (ma_proc)_pa_stream_trigger; - pContext->pulse.pa_stream_begin_write = (ma_proc)_pa_stream_begin_write; - pContext->pulse.pa_stream_write = (ma_proc)_pa_stream_write; - pContext->pulse.pa_stream_peek = (ma_proc)_pa_stream_peek; - pContext->pulse.pa_stream_drop = (ma_proc)_pa_stream_drop; - pContext->pulse.pa_stream_writable_size = (ma_proc)_pa_stream_writable_size; - pContext->pulse.pa_stream_readable_size = (ma_proc)_pa_stream_readable_size; -#endif - - /* We need to make a copy of the application and server names so we can pass them to the pa_context of each device. */ - pContext->pulse.pApplicationName = ma_copy_string(pConfig->pulse.pApplicationName, &pContext->allocationCallbacks); - if (pContext->pulse.pApplicationName == NULL && pConfig->pulse.pApplicationName != NULL) { - return MA_OUT_OF_MEMORY; - } - - pContext->pulse.pServerName = ma_copy_string(pConfig->pulse.pServerName, &pContext->allocationCallbacks); - if (pContext->pulse.pServerName == NULL && pConfig->pulse.pServerName != NULL) { - ma_free(pContext->pulse.pApplicationName, &pContext->allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - result = ma_init_pa_mainloop_and_pa_context__pulse(pContext, pConfig->pulse.pApplicationName, pConfig->pulse.pServerName, pConfig->pulse.tryAutoSpawn, &pContext->pulse.pMainLoop, &pContext->pulse.pPulseContext); - if (result != MA_SUCCESS) { - ma_free(pContext->pulse.pServerName, &pContext->allocationCallbacks); - ma_free(pContext->pulse.pApplicationName, &pContext->allocationCallbacks); - #ifndef MA_NO_RUNTIME_LINKING - ma_dlclose(pContext, pContext->pulse.pulseSO); - #endif - return result; - } - - /* With pa_mainloop we run a synchronous backend, but we implement our own main loop. */ - pCallbacks->onContextInit = ma_context_init__pulse; - pCallbacks->onContextUninit = ma_context_uninit__pulse; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__pulse; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__pulse; - pCallbacks->onDeviceInit = ma_device_init__pulse; - pCallbacks->onDeviceUninit = ma_device_uninit__pulse; - pCallbacks->onDeviceStart = ma_device_start__pulse; - pCallbacks->onDeviceStop = ma_device_stop__pulse; - pCallbacks->onDeviceRead = NULL; /* Not used because we're implementing onDeviceDataLoop. */ - pCallbacks->onDeviceWrite = NULL; /* Not used because we're implementing onDeviceDataLoop. */ - pCallbacks->onDeviceDataLoop = ma_device_data_loop__pulse; - pCallbacks->onDeviceDataLoopWakeup = ma_device_data_loop_wakeup__pulse; - - return MA_SUCCESS; -} -#endif - - -/****************************************************************************** - -JACK Backend - -******************************************************************************/ -#ifdef MA_HAS_JACK - -/* It is assumed jack.h is available when compile-time linking is being used. */ -#ifdef MA_NO_RUNTIME_LINKING -#include - -typedef jack_nframes_t ma_jack_nframes_t; -typedef jack_options_t ma_jack_options_t; -typedef jack_status_t ma_jack_status_t; -typedef jack_client_t ma_jack_client_t; -typedef jack_port_t ma_jack_port_t; -typedef JackProcessCallback ma_JackProcessCallback; -typedef JackBufferSizeCallback ma_JackBufferSizeCallback; -typedef JackShutdownCallback ma_JackShutdownCallback; -#define MA_JACK_DEFAULT_AUDIO_TYPE JACK_DEFAULT_AUDIO_TYPE -#define ma_JackNoStartServer JackNoStartServer -#define ma_JackPortIsInput JackPortIsInput -#define ma_JackPortIsOutput JackPortIsOutput -#define ma_JackPortIsPhysical JackPortIsPhysical -#else -typedef ma_uint32 ma_jack_nframes_t; -typedef int ma_jack_options_t; -typedef int ma_jack_status_t; -typedef struct ma_jack_client_t ma_jack_client_t; -typedef struct ma_jack_port_t ma_jack_port_t; -typedef int (* ma_JackProcessCallback) (ma_jack_nframes_t nframes, void* arg); -typedef int (* ma_JackBufferSizeCallback)(ma_jack_nframes_t nframes, void* arg); -typedef void (* ma_JackShutdownCallback) (void* arg); -#define MA_JACK_DEFAULT_AUDIO_TYPE "32 bit float mono audio" -#define ma_JackNoStartServer 1 -#define ma_JackPortIsInput 1 -#define ma_JackPortIsOutput 2 -#define ma_JackPortIsPhysical 4 -#endif - -typedef ma_jack_client_t* (* ma_jack_client_open_proc) (const char* client_name, ma_jack_options_t options, ma_jack_status_t* status, ...); -typedef int (* ma_jack_client_close_proc) (ma_jack_client_t* client); -typedef int (* ma_jack_client_name_size_proc) (void); -typedef int (* ma_jack_set_process_callback_proc) (ma_jack_client_t* client, ma_JackProcessCallback process_callback, void* arg); -typedef int (* ma_jack_set_buffer_size_callback_proc)(ma_jack_client_t* client, ma_JackBufferSizeCallback bufsize_callback, void* arg); -typedef void (* ma_jack_on_shutdown_proc) (ma_jack_client_t* client, ma_JackShutdownCallback function, void* arg); -typedef ma_jack_nframes_t (* ma_jack_get_sample_rate_proc) (ma_jack_client_t* client); -typedef ma_jack_nframes_t (* ma_jack_get_buffer_size_proc) (ma_jack_client_t* client); -typedef const char** (* ma_jack_get_ports_proc) (ma_jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags); -typedef int (* ma_jack_activate_proc) (ma_jack_client_t* client); -typedef int (* ma_jack_deactivate_proc) (ma_jack_client_t* client); -typedef int (* ma_jack_connect_proc) (ma_jack_client_t* client, const char* source_port, const char* destination_port); -typedef ma_jack_port_t* (* ma_jack_port_register_proc) (ma_jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size); -typedef const char* (* ma_jack_port_name_proc) (const ma_jack_port_t* port); -typedef void* (* ma_jack_port_get_buffer_proc) (ma_jack_port_t* port, ma_jack_nframes_t nframes); -typedef void (* ma_jack_free_proc) (void* ptr); - -static ma_result ma_context_open_client__jack(ma_context* pContext, ma_jack_client_t** ppClient) -{ - size_t maxClientNameSize; - char clientName[256]; - ma_jack_status_t status; - ma_jack_client_t* pClient; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppClient != NULL); - - if (ppClient) { - *ppClient = NULL; - } - - maxClientNameSize = ((ma_jack_client_name_size_proc)pContext->jack.jack_client_name_size)(); /* Includes null terminator. */ - ma_strncpy_s(clientName, ma_min(sizeof(clientName), maxClientNameSize), (pContext->jack.pClientName != NULL) ? pContext->jack.pClientName : "miniaudio", (size_t)-1); - - pClient = ((ma_jack_client_open_proc)pContext->jack.jack_client_open)(clientName, (pContext->jack.tryStartServer) ? 0 : ma_JackNoStartServer, &status, NULL); - if (pClient == NULL) { - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - if (ppClient) { - *ppClient = pClient; - } - - return MA_SUCCESS; -} - - -static ma_result ma_context_enumerate_devices__jack(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_bool32 cbResult = MA_TRUE; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* Playback. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - deviceInfo.isDefault = MA_TRUE; /* JACK only uses default devices. */ - cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - - /* Capture. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - deviceInfo.isDefault = MA_TRUE; /* JACK only uses default devices. */ - cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - - (void)cbResult; /* For silencing a static analysis warning. */ - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__jack(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_jack_client_t* pClient; - ma_result result; - const char** ppPorts; - - MA_ASSERT(pContext != NULL); - - if (pDeviceID != NULL && pDeviceID->jack != 0) { - return MA_NO_DEVICE; /* Don't know the device. */ - } - - /* Name / Description */ - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - - /* Jack only uses default devices. */ - pDeviceInfo->isDefault = MA_TRUE; - - /* Jack only supports f32 and has a specific channel count and sample rate. */ - pDeviceInfo->nativeDataFormats[0].format = ma_format_f32; - - /* The channel count and sample rate can only be determined by opening the device. */ - result = ma_context_open_client__jack(pContext, &pClient); - if (result != MA_SUCCESS) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[JACK] Failed to open client."); - return result; - } - - pDeviceInfo->nativeDataFormats[0].sampleRate = ((ma_jack_get_sample_rate_proc)pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pClient); - pDeviceInfo->nativeDataFormats[0].channels = 0; - - ppPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ((deviceType == ma_device_type_playback) ? ma_JackPortIsInput : ma_JackPortIsOutput)); - if (ppPorts == NULL) { - ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pClient); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[JACK] Failed to query physical ports."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - while (ppPorts[pDeviceInfo->nativeDataFormats[0].channels] != NULL) { - pDeviceInfo->nativeDataFormats[0].channels += 1; - } - - pDeviceInfo->nativeDataFormats[0].flags = 0; - pDeviceInfo->nativeDataFormatCount = 1; - - ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppPorts); - ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pClient); - - (void)pContext; - return MA_SUCCESS; -} - - -static ma_result ma_device_uninit__jack(ma_device* pDevice) -{ - ma_context* pContext; - - MA_ASSERT(pDevice != NULL); - - pContext = pDevice->pContext; - MA_ASSERT(pContext != NULL); - - if (pDevice->jack.pClient != NULL) { - ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pDevice->jack.pClient); - } - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_free(pDevice->jack.pIntermediaryBufferCapture, &pDevice->pContext->allocationCallbacks); - ma_free(pDevice->jack.ppPortsCapture, &pDevice->pContext->allocationCallbacks); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_free(pDevice->jack.pIntermediaryBufferPlayback, &pDevice->pContext->allocationCallbacks); - ma_free(pDevice->jack.ppPortsPlayback, &pDevice->pContext->allocationCallbacks); - } - - return MA_SUCCESS; -} - -static void ma_device__jack_shutdown_callback(void* pUserData) -{ - /* JACK died. Stop the device. */ - ma_device* pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - ma_device_stop(pDevice); -} - -static int ma_device__jack_buffer_size_callback(ma_jack_nframes_t frameCount, void* pUserData) -{ - ma_device* pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - size_t newBufferSize = frameCount * (pDevice->capture.internalChannels * ma_get_bytes_per_sample(pDevice->capture.internalFormat)); - float* pNewBuffer = (float*)ma_calloc(newBufferSize, &pDevice->pContext->allocationCallbacks); - if (pNewBuffer == NULL) { - return MA_OUT_OF_MEMORY; - } - - ma_free(pDevice->jack.pIntermediaryBufferCapture, &pDevice->pContext->allocationCallbacks); - - pDevice->jack.pIntermediaryBufferCapture = pNewBuffer; - pDevice->playback.internalPeriodSizeInFrames = frameCount; - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - size_t newBufferSize = frameCount * (pDevice->playback.internalChannels * ma_get_bytes_per_sample(pDevice->playback.internalFormat)); - float* pNewBuffer = (float*)ma_calloc(newBufferSize, &pDevice->pContext->allocationCallbacks); - if (pNewBuffer == NULL) { - return MA_OUT_OF_MEMORY; - } - - ma_free(pDevice->jack.pIntermediaryBufferPlayback, &pDevice->pContext->allocationCallbacks); - - pDevice->jack.pIntermediaryBufferPlayback = pNewBuffer; - pDevice->playback.internalPeriodSizeInFrames = frameCount; - } - - return 0; -} - -static int ma_device__jack_process_callback(ma_jack_nframes_t frameCount, void* pUserData) -{ - ma_device* pDevice; - ma_context* pContext; - ma_uint32 iChannel; - - pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - pContext = pDevice->pContext; - MA_ASSERT(pContext != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - /* Channels need to be interleaved. */ - for (iChannel = 0; iChannel < pDevice->capture.internalChannels; ++iChannel) { - const float* pSrc = (const float*)((ma_jack_port_get_buffer_proc)pContext->jack.jack_port_get_buffer)((ma_jack_port_t*)pDevice->jack.ppPortsCapture[iChannel], frameCount); - if (pSrc != NULL) { - float* pDst = pDevice->jack.pIntermediaryBufferCapture + iChannel; - ma_jack_nframes_t iFrame; - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - *pDst = *pSrc; - - pDst += pDevice->capture.internalChannels; - pSrc += 1; - } - } - } - - ma_device_handle_backend_data_callback(pDevice, NULL, pDevice->jack.pIntermediaryBufferCapture, frameCount); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_device_handle_backend_data_callback(pDevice, pDevice->jack.pIntermediaryBufferPlayback, NULL, frameCount); - - /* Channels need to be deinterleaved. */ - for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) { - float* pDst = (float*)((ma_jack_port_get_buffer_proc)pContext->jack.jack_port_get_buffer)((ma_jack_port_t*)pDevice->jack.ppPortsPlayback[iChannel], frameCount); - if (pDst != NULL) { - const float* pSrc = pDevice->jack.pIntermediaryBufferPlayback + iChannel; - ma_jack_nframes_t iFrame; - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - *pDst = *pSrc; - - pDst += 1; - pSrc += pDevice->playback.internalChannels; - } - } - } - } - - return 0; -} - -static ma_result ma_device_init__jack(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - ma_result result; - ma_uint32 periodSizeInFrames; - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDevice != NULL); - - if (pConfig->deviceType == ma_device_type_loopback) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Loopback mode not supported."); - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* Only supporting default devices with JACK. */ - if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->pDeviceID != NULL && pDescriptorPlayback->pDeviceID->jack != 0) || - ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->pDeviceID != NULL && pDescriptorCapture->pDeviceID->jack != 0)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Only default devices are supported."); - return MA_NO_DEVICE; - } - - /* No exclusive mode with the JACK backend. */ - if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) || - ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode == ma_share_mode_exclusive)) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Exclusive mode not supported."); - return MA_SHARE_MODE_NOT_SUPPORTED; - } - - /* Open the client. */ - result = ma_context_open_client__jack(pDevice->pContext, (ma_jack_client_t**)&pDevice->jack.pClient); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to open client."); - return result; - } - - /* Callbacks. */ - if (((ma_jack_set_process_callback_proc)pDevice->pContext->jack.jack_set_process_callback)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_process_callback, pDevice) != 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to set process callback."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - if (((ma_jack_set_buffer_size_callback_proc)pDevice->pContext->jack.jack_set_buffer_size_callback)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_buffer_size_callback, pDevice) != 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to set buffer size callback."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - ((ma_jack_on_shutdown_proc)pDevice->pContext->jack.jack_on_shutdown)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_shutdown_callback, pDevice); - - - /* The buffer size in frames can change. */ - periodSizeInFrames = ((ma_jack_get_buffer_size_proc)pDevice->pContext->jack.jack_get_buffer_size)((ma_jack_client_t*)pDevice->jack.pClient); - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_uint32 iPort; - const char** ppPorts; - - pDescriptorCapture->format = ma_format_f32; - pDescriptorCapture->channels = 0; - pDescriptorCapture->sampleRate = ((ma_jack_get_sample_rate_proc)pDevice->pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pDevice->jack.pClient); - ma_channel_map_init_standard(ma_standard_channel_map_alsa, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorCapture->channels); - - ppPorts = ((ma_jack_get_ports_proc)pDevice->pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsOutput); - if (ppPorts == NULL) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to query physical ports."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - /* Need to count the number of ports first so we can allocate some memory. */ - while (ppPorts[pDescriptorCapture->channels] != NULL) { - pDescriptorCapture->channels += 1; - } - - pDevice->jack.ppPortsCapture = (ma_ptr*)ma_malloc(sizeof(*pDevice->jack.ppPortsCapture) * pDescriptorCapture->channels, &pDevice->pContext->allocationCallbacks); - if (pDevice->jack.ppPortsCapture == NULL) { - return MA_OUT_OF_MEMORY; - } - - for (iPort = 0; iPort < pDescriptorCapture->channels; iPort += 1) { - char name[64]; - ma_strcpy_s(name, sizeof(name), "capture"); - ma_itoa_s((int)iPort, name+7, sizeof(name)-7, 10); /* 7 = length of "capture" */ - - pDevice->jack.ppPortsCapture[iPort] = ((ma_jack_port_register_proc)pDevice->pContext->jack.jack_port_register)((ma_jack_client_t*)pDevice->jack.pClient, name, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsInput, 0); - if (pDevice->jack.ppPortsCapture[iPort] == NULL) { - ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts); - ma_device_uninit__jack(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to register ports."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - } - - ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts); - - pDescriptorCapture->periodSizeInFrames = periodSizeInFrames; - pDescriptorCapture->periodCount = 1; /* There's no notion of a period in JACK. Just set to 1. */ - - pDevice->jack.pIntermediaryBufferCapture = (float*)ma_calloc(pDescriptorCapture->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels), &pDevice->pContext->allocationCallbacks); - if (pDevice->jack.pIntermediaryBufferCapture == NULL) { - ma_device_uninit__jack(pDevice); - return MA_OUT_OF_MEMORY; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_uint32 iPort; - const char** ppPorts; - - pDescriptorPlayback->format = ma_format_f32; - pDescriptorPlayback->channels = 0; - pDescriptorPlayback->sampleRate = ((ma_jack_get_sample_rate_proc)pDevice->pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pDevice->jack.pClient); - ma_channel_map_init_standard(ma_standard_channel_map_alsa, pDescriptorPlayback->channelMap, ma_countof(pDescriptorPlayback->channelMap), pDescriptorPlayback->channels); - - ppPorts = ((ma_jack_get_ports_proc)pDevice->pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsInput); - if (ppPorts == NULL) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to query physical ports."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - /* Need to count the number of ports first so we can allocate some memory. */ - while (ppPorts[pDescriptorPlayback->channels] != NULL) { - pDescriptorPlayback->channels += 1; - } - - pDevice->jack.ppPortsPlayback = (ma_ptr*)ma_malloc(sizeof(*pDevice->jack.ppPortsPlayback) * pDescriptorPlayback->channels, &pDevice->pContext->allocationCallbacks); - if (pDevice->jack.ppPortsPlayback == NULL) { - ma_free(pDevice->jack.ppPortsCapture, &pDevice->pContext->allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - for (iPort = 0; iPort < pDescriptorPlayback->channels; iPort += 1) { - char name[64]; - ma_strcpy_s(name, sizeof(name), "playback"); - ma_itoa_s((int)iPort, name+8, sizeof(name)-8, 10); /* 8 = length of "playback" */ - - pDevice->jack.ppPortsPlayback[iPort] = ((ma_jack_port_register_proc)pDevice->pContext->jack.jack_port_register)((ma_jack_client_t*)pDevice->jack.pClient, name, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsOutput, 0); - if (pDevice->jack.ppPortsPlayback[iPort] == NULL) { - ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts); - ma_device_uninit__jack(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to register ports."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - } - - ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts); - - pDescriptorPlayback->periodSizeInFrames = periodSizeInFrames; - pDescriptorPlayback->periodCount = 1; /* There's no notion of a period in JACK. Just set to 1. */ - - pDevice->jack.pIntermediaryBufferPlayback = (float*)ma_calloc(pDescriptorPlayback->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels), &pDevice->pContext->allocationCallbacks); - if (pDevice->jack.pIntermediaryBufferPlayback == NULL) { - ma_device_uninit__jack(pDevice); - return MA_OUT_OF_MEMORY; - } - } - - return MA_SUCCESS; -} - - -static ma_result ma_device_start__jack(ma_device* pDevice) -{ - ma_context* pContext = pDevice->pContext; - int resultJACK; - size_t i; - - resultJACK = ((ma_jack_activate_proc)pContext->jack.jack_activate)((ma_jack_client_t*)pDevice->jack.pClient); - if (resultJACK != 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to activate the JACK client."); - return MA_FAILED_TO_START_BACKEND_DEVICE; - } - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - const char** ppServerPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsOutput); - if (ppServerPorts == NULL) { - ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to retrieve physical ports."); - return MA_ERROR; - } - - for (i = 0; ppServerPorts[i] != NULL; ++i) { - const char* pServerPort = ppServerPorts[i]; - const char* pClientPort = ((ma_jack_port_name_proc)pContext->jack.jack_port_name)((ma_jack_port_t*)pDevice->jack.ppPortsCapture[i]); - - resultJACK = ((ma_jack_connect_proc)pContext->jack.jack_connect)((ma_jack_client_t*)pDevice->jack.pClient, pServerPort, pClientPort); - if (resultJACK != 0) { - ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts); - ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to connect ports."); - return MA_ERROR; - } - } - - ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - const char** ppServerPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsInput); - if (ppServerPorts == NULL) { - ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to retrieve physical ports."); - return MA_ERROR; - } - - for (i = 0; ppServerPorts[i] != NULL; ++i) { - const char* pServerPort = ppServerPorts[i]; - const char* pClientPort = ((ma_jack_port_name_proc)pContext->jack.jack_port_name)((ma_jack_port_t*)pDevice->jack.ppPortsPlayback[i]); - - resultJACK = ((ma_jack_connect_proc)pContext->jack.jack_connect)((ma_jack_client_t*)pDevice->jack.pClient, pClientPort, pServerPort); - if (resultJACK != 0) { - ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts); - ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] Failed to connect ports."); - return MA_ERROR; - } - } - - ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__jack(ma_device* pDevice) -{ - ma_context* pContext = pDevice->pContext; - - if (((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient) != 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[JACK] An error occurred when deactivating the JACK client."); - return MA_ERROR; - } - - ma_device__on_notification_stopped(pDevice); - - return MA_SUCCESS; -} - - -static ma_result ma_context_uninit__jack(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_jack); - - ma_free(pContext->jack.pClientName, &pContext->allocationCallbacks); - pContext->jack.pClientName = NULL; - -#ifndef MA_NO_RUNTIME_LINKING - ma_dlclose(pContext, pContext->jack.jackSO); -#endif - - return MA_SUCCESS; -} - -static ma_result ma_context_init__jack(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ -#ifndef MA_NO_RUNTIME_LINKING - const char* libjackNames[] = { -#ifdef MA_WIN32 - "libjack.dll", - "libjack64.dll" -#else - "libjack.so", - "libjack.so.0" -#endif - }; - size_t i; - - for (i = 0; i < ma_countof(libjackNames); ++i) { - pContext->jack.jackSO = ma_dlopen(pContext, libjackNames[i]); - if (pContext->jack.jackSO != NULL) { - break; - } - } - - if (pContext->jack.jackSO == NULL) { - return MA_NO_BACKEND; - } - - pContext->jack.jack_client_open = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_client_open"); - pContext->jack.jack_client_close = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_client_close"); - pContext->jack.jack_client_name_size = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_client_name_size"); - pContext->jack.jack_set_process_callback = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_set_process_callback"); - pContext->jack.jack_set_buffer_size_callback = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_set_buffer_size_callback"); - pContext->jack.jack_on_shutdown = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_on_shutdown"); - pContext->jack.jack_get_sample_rate = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_get_sample_rate"); - pContext->jack.jack_get_buffer_size = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_get_buffer_size"); - pContext->jack.jack_get_ports = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_get_ports"); - pContext->jack.jack_activate = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_activate"); - pContext->jack.jack_deactivate = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_deactivate"); - pContext->jack.jack_connect = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_connect"); - pContext->jack.jack_port_register = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_port_register"); - pContext->jack.jack_port_name = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_port_name"); - pContext->jack.jack_port_get_buffer = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_port_get_buffer"); - pContext->jack.jack_free = (ma_proc)ma_dlsym(pContext, pContext->jack.jackSO, "jack_free"); -#else - /* - This strange assignment system is here just to ensure type safety of miniaudio's function pointer - types. If anything differs slightly the compiler should throw a warning. - */ - ma_jack_client_open_proc _jack_client_open = jack_client_open; - ma_jack_client_close_proc _jack_client_close = jack_client_close; - ma_jack_client_name_size_proc _jack_client_name_size = jack_client_name_size; - ma_jack_set_process_callback_proc _jack_set_process_callback = jack_set_process_callback; - ma_jack_set_buffer_size_callback_proc _jack_set_buffer_size_callback = jack_set_buffer_size_callback; - ma_jack_on_shutdown_proc _jack_on_shutdown = jack_on_shutdown; - ma_jack_get_sample_rate_proc _jack_get_sample_rate = jack_get_sample_rate; - ma_jack_get_buffer_size_proc _jack_get_buffer_size = jack_get_buffer_size; - ma_jack_get_ports_proc _jack_get_ports = jack_get_ports; - ma_jack_activate_proc _jack_activate = jack_activate; - ma_jack_deactivate_proc _jack_deactivate = jack_deactivate; - ma_jack_connect_proc _jack_connect = jack_connect; - ma_jack_port_register_proc _jack_port_register = jack_port_register; - ma_jack_port_name_proc _jack_port_name = jack_port_name; - ma_jack_port_get_buffer_proc _jack_port_get_buffer = jack_port_get_buffer; - ma_jack_free_proc _jack_free = jack_free; - - pContext->jack.jack_client_open = (ma_proc)_jack_client_open; - pContext->jack.jack_client_close = (ma_proc)_jack_client_close; - pContext->jack.jack_client_name_size = (ma_proc)_jack_client_name_size; - pContext->jack.jack_set_process_callback = (ma_proc)_jack_set_process_callback; - pContext->jack.jack_set_buffer_size_callback = (ma_proc)_jack_set_buffer_size_callback; - pContext->jack.jack_on_shutdown = (ma_proc)_jack_on_shutdown; - pContext->jack.jack_get_sample_rate = (ma_proc)_jack_get_sample_rate; - pContext->jack.jack_get_buffer_size = (ma_proc)_jack_get_buffer_size; - pContext->jack.jack_get_ports = (ma_proc)_jack_get_ports; - pContext->jack.jack_activate = (ma_proc)_jack_activate; - pContext->jack.jack_deactivate = (ma_proc)_jack_deactivate; - pContext->jack.jack_connect = (ma_proc)_jack_connect; - pContext->jack.jack_port_register = (ma_proc)_jack_port_register; - pContext->jack.jack_port_name = (ma_proc)_jack_port_name; - pContext->jack.jack_port_get_buffer = (ma_proc)_jack_port_get_buffer; - pContext->jack.jack_free = (ma_proc)_jack_free; -#endif - - if (pConfig->jack.pClientName != NULL) { - pContext->jack.pClientName = ma_copy_string(pConfig->jack.pClientName, &pContext->allocationCallbacks); - } - pContext->jack.tryStartServer = pConfig->jack.tryStartServer; - - /* - Getting here means the JACK library is installed, but it doesn't necessarily mean it's usable. We need to quickly test this by connecting - a temporary client. - */ - { - ma_jack_client_t* pDummyClient; - ma_result result = ma_context_open_client__jack(pContext, &pDummyClient); - if (result != MA_SUCCESS) { - ma_free(pContext->jack.pClientName, &pContext->allocationCallbacks); - #ifndef MA_NO_RUNTIME_LINKING - ma_dlclose(pContext, pContext->jack.jackSO); - #endif - return MA_NO_BACKEND; - } - - ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pDummyClient); - } - - - pCallbacks->onContextInit = ma_context_init__jack; - pCallbacks->onContextUninit = ma_context_uninit__jack; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__jack; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__jack; - pCallbacks->onDeviceInit = ma_device_init__jack; - pCallbacks->onDeviceUninit = ma_device_uninit__jack; - pCallbacks->onDeviceStart = ma_device_start__jack; - pCallbacks->onDeviceStop = ma_device_stop__jack; - pCallbacks->onDeviceRead = NULL; /* Not used because JACK is asynchronous. */ - pCallbacks->onDeviceWrite = NULL; /* Not used because JACK is asynchronous. */ - pCallbacks->onDeviceDataLoop = NULL; /* Not used because JACK is asynchronous. */ - - return MA_SUCCESS; -} -#endif /* JACK */ - - - -/****************************************************************************** - -Core Audio Backend - -References -========== -- Technical Note TN2091: Device input using the HAL Output Audio Unit - https://developer.apple.com/library/archive/technotes/tn2091/_index.html - -******************************************************************************/ -#ifdef MA_HAS_COREAUDIO -#include - -#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1 - #define MA_APPLE_MOBILE - #if defined(TARGET_OS_TV) && TARGET_OS_TV == 1 - #define MA_APPLE_TV - #endif - #if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1 - #define MA_APPLE_WATCH - #endif - #if __has_feature(objc_arc) - #define MA_BRIDGE_TRANSFER __bridge_transfer - #define MA_BRIDGE_RETAINED __bridge_retained - #else - #define MA_BRIDGE_TRANSFER - #define MA_BRIDGE_RETAINED - #endif -#else - #define MA_APPLE_DESKTOP -#endif - -#if defined(MA_APPLE_DESKTOP) -#include -#else -#include -#endif - -#include - -/* CoreFoundation */ -typedef Boolean (* ma_CFStringGetCString_proc)(CFStringRef theString, char* buffer, CFIndex bufferSize, CFStringEncoding encoding); -typedef void (* ma_CFRelease_proc)(CFTypeRef cf); - -/* CoreAudio */ -#if defined(MA_APPLE_DESKTOP) -typedef OSStatus (* ma_AudioObjectGetPropertyData_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* ioDataSize, void* outData); -typedef OSStatus (* ma_AudioObjectGetPropertyDataSize_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* outDataSize); -typedef OSStatus (* ma_AudioObjectSetPropertyData_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32 inDataSize, const void* inData); -typedef OSStatus (* ma_AudioObjectAddPropertyListener_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData); -typedef OSStatus (* ma_AudioObjectRemovePropertyListener_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData); -#endif - -/* AudioToolbox */ -typedef AudioComponent (* ma_AudioComponentFindNext_proc)(AudioComponent inComponent, const AudioComponentDescription* inDesc); -typedef OSStatus (* ma_AudioComponentInstanceDispose_proc)(AudioComponentInstance inInstance); -typedef OSStatus (* ma_AudioComponentInstanceNew_proc)(AudioComponent inComponent, AudioComponentInstance* outInstance); -typedef OSStatus (* ma_AudioOutputUnitStart_proc)(AudioUnit inUnit); -typedef OSStatus (* ma_AudioOutputUnitStop_proc)(AudioUnit inUnit); -typedef OSStatus (* ma_AudioUnitAddPropertyListener_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitPropertyListenerProc inProc, void* inProcUserData); -typedef OSStatus (* ma_AudioUnitGetPropertyInfo_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, UInt32* outDataSize, Boolean* outWriteable); -typedef OSStatus (* ma_AudioUnitGetProperty_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void* outData, UInt32* ioDataSize); -typedef OSStatus (* ma_AudioUnitSetProperty_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void* inData, UInt32 inDataSize); -typedef OSStatus (* ma_AudioUnitInitialize_proc)(AudioUnit inUnit); -typedef OSStatus (* ma_AudioUnitRender_proc)(AudioUnit inUnit, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData); - - -#define MA_COREAUDIO_OUTPUT_BUS 0 -#define MA_COREAUDIO_INPUT_BUS 1 - -#if defined(MA_APPLE_DESKTOP) -static ma_result ma_device_reinit_internal__coreaudio(ma_device* pDevice, ma_device_type deviceType, ma_bool32 disposePreviousAudioUnit); -#endif - -/* -Core Audio - -So far, Core Audio has been the worst backend to work with due to being both unintuitive and having almost no documentation -apart from comments in the headers (which admittedly are quite good). For my own purposes, and for anybody out there whose -needing to figure out how this darn thing works, I'm going to outline a few things here. - -Since miniaudio is a fairly low-level API, one of the things it needs is control over specific devices, and it needs to be -able to identify whether or not it can be used as playback and/or capture. The AudioObject API is the only one I've seen -that supports this level of detail. There was some public domain sample code I stumbled across that used the AudioComponent -and AudioUnit APIs, but I couldn't see anything that gave low-level control over device selection and capabilities (the -distinction between playback and capture in particular). Therefore, miniaudio is using the AudioObject API. - -Most (all?) functions in the AudioObject API take a AudioObjectID as it's input. This is the device identifier. When -retrieving global information, such as the device list, you use kAudioObjectSystemObject. When retrieving device-specific -data, you pass in the ID for that device. In order to retrieve device-specific IDs you need to enumerate over each of the -devices. This is done using the AudioObjectGetPropertyDataSize() and AudioObjectGetPropertyData() APIs which seem to be -the central APIs for retrieving information about the system and specific devices. - -To use the AudioObjectGetPropertyData() API you need to use the notion of a property address. A property address is a -structure with three variables and is used to identify which property you are getting or setting. The first is the "selector" -which is basically the specific property that you're wanting to retrieve or set. The second is the "scope", which is -typically set to kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyScopeInput for input-specific properties and -kAudioObjectPropertyScopeOutput for output-specific properties. The last is the "element" which is always set to -kAudioObjectPropertyElementMaster in miniaudio's case. I don't know of any cases where this would be set to anything different. - -Back to the earlier issue of device retrieval, you first use the AudioObjectGetPropertyDataSize() API to retrieve the size -of the raw data which is just a list of AudioDeviceID's. You use the kAudioObjectSystemObject AudioObjectID, and a property -address with the kAudioHardwarePropertyDevices selector and the kAudioObjectPropertyScopeGlobal scope. Once you have the -size, allocate a block of memory of that size and then call AudioObjectGetPropertyData(). The data is just a list of -AudioDeviceID's so just do "dataSize/sizeof(AudioDeviceID)" to know the device count. -*/ - -static ma_result ma_result_from_OSStatus(OSStatus status) -{ - switch (status) - { - case noErr: return MA_SUCCESS; - #if defined(MA_APPLE_DESKTOP) - case kAudioHardwareNotRunningError: return MA_DEVICE_NOT_STARTED; - case kAudioHardwareUnspecifiedError: return MA_ERROR; - case kAudioHardwareUnknownPropertyError: return MA_INVALID_ARGS; - case kAudioHardwareBadPropertySizeError: return MA_INVALID_OPERATION; - case kAudioHardwareIllegalOperationError: return MA_INVALID_OPERATION; - case kAudioHardwareBadObjectError: return MA_INVALID_ARGS; - case kAudioHardwareBadDeviceError: return MA_INVALID_ARGS; - case kAudioHardwareBadStreamError: return MA_INVALID_ARGS; - case kAudioHardwareUnsupportedOperationError: return MA_INVALID_OPERATION; - case kAudioDeviceUnsupportedFormatError: return MA_FORMAT_NOT_SUPPORTED; - case kAudioDevicePermissionsError: return MA_ACCESS_DENIED; - #endif - default: return MA_ERROR; - } -} - -#if 0 -static ma_channel ma_channel_from_AudioChannelBitmap(AudioChannelBitmap bit) -{ - switch (bit) - { - case kAudioChannelBit_Left: return MA_CHANNEL_LEFT; - case kAudioChannelBit_Right: return MA_CHANNEL_RIGHT; - case kAudioChannelBit_Center: return MA_CHANNEL_FRONT_CENTER; - case kAudioChannelBit_LFEScreen: return MA_CHANNEL_LFE; - case kAudioChannelBit_LeftSurround: return MA_CHANNEL_BACK_LEFT; - case kAudioChannelBit_RightSurround: return MA_CHANNEL_BACK_RIGHT; - case kAudioChannelBit_LeftCenter: return MA_CHANNEL_FRONT_LEFT_CENTER; - case kAudioChannelBit_RightCenter: return MA_CHANNEL_FRONT_RIGHT_CENTER; - case kAudioChannelBit_CenterSurround: return MA_CHANNEL_BACK_CENTER; - case kAudioChannelBit_LeftSurroundDirect: return MA_CHANNEL_SIDE_LEFT; - case kAudioChannelBit_RightSurroundDirect: return MA_CHANNEL_SIDE_RIGHT; - case kAudioChannelBit_TopCenterSurround: return MA_CHANNEL_TOP_CENTER; - case kAudioChannelBit_VerticalHeightLeft: return MA_CHANNEL_TOP_FRONT_LEFT; - case kAudioChannelBit_VerticalHeightCenter: return MA_CHANNEL_TOP_FRONT_CENTER; - case kAudioChannelBit_VerticalHeightRight: return MA_CHANNEL_TOP_FRONT_RIGHT; - case kAudioChannelBit_TopBackLeft: return MA_CHANNEL_TOP_BACK_LEFT; - case kAudioChannelBit_TopBackCenter: return MA_CHANNEL_TOP_BACK_CENTER; - case kAudioChannelBit_TopBackRight: return MA_CHANNEL_TOP_BACK_RIGHT; - default: return MA_CHANNEL_NONE; - } -} -#endif - -static ma_result ma_format_from_AudioStreamBasicDescription(const AudioStreamBasicDescription* pDescription, ma_format* pFormatOut) -{ - MA_ASSERT(pDescription != NULL); - MA_ASSERT(pFormatOut != NULL); - - *pFormatOut = ma_format_unknown; /* Safety. */ - - /* There's a few things miniaudio doesn't support. */ - if (pDescription->mFormatID != kAudioFormatLinearPCM) { - return MA_FORMAT_NOT_SUPPORTED; - } - - /* We don't support any non-packed formats that are aligned high. */ - if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsAlignedHigh) != 0) { - return MA_FORMAT_NOT_SUPPORTED; - } - - /* Only supporting native-endian. */ - if ((ma_is_little_endian() && (pDescription->mFormatFlags & kAudioFormatFlagIsBigEndian) != 0) || (ma_is_big_endian() && (pDescription->mFormatFlags & kAudioFormatFlagIsBigEndian) == 0)) { - return MA_FORMAT_NOT_SUPPORTED; - } - - /* We are not currently supporting non-interleaved formats (this will be added in a future version of miniaudio). */ - /*if ((pDescription->mFormatFlags & kAudioFormatFlagIsNonInterleaved) != 0) { - return MA_FORMAT_NOT_SUPPORTED; - }*/ - - if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsFloat) != 0) { - if (pDescription->mBitsPerChannel == 32) { - *pFormatOut = ma_format_f32; - return MA_SUCCESS; - } - } else { - if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) != 0) { - if (pDescription->mBitsPerChannel == 16) { - *pFormatOut = ma_format_s16; - return MA_SUCCESS; - } else if (pDescription->mBitsPerChannel == 24) { - if (pDescription->mBytesPerFrame == (pDescription->mBitsPerChannel/8 * pDescription->mChannelsPerFrame)) { - *pFormatOut = ma_format_s24; - return MA_SUCCESS; - } else { - if (pDescription->mBytesPerFrame/pDescription->mChannelsPerFrame == sizeof(ma_int32)) { - /* TODO: Implement ma_format_s24_32. */ - /**pFormatOut = ma_format_s24_32;*/ - /*return MA_SUCCESS;*/ - return MA_FORMAT_NOT_SUPPORTED; - } - } - } else if (pDescription->mBitsPerChannel == 32) { - *pFormatOut = ma_format_s32; - return MA_SUCCESS; - } - } else { - if (pDescription->mBitsPerChannel == 8) { - *pFormatOut = ma_format_u8; - return MA_SUCCESS; - } - } - } - - /* Getting here means the format is not supported. */ - return MA_FORMAT_NOT_SUPPORTED; -} - -#if defined(MA_APPLE_DESKTOP) -static ma_channel ma_channel_from_AudioChannelLabel(AudioChannelLabel label) -{ - switch (label) - { - case kAudioChannelLabel_Unknown: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Unused: return MA_CHANNEL_NONE; - case kAudioChannelLabel_UseCoordinates: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Left: return MA_CHANNEL_LEFT; - case kAudioChannelLabel_Right: return MA_CHANNEL_RIGHT; - case kAudioChannelLabel_Center: return MA_CHANNEL_FRONT_CENTER; - case kAudioChannelLabel_LFEScreen: return MA_CHANNEL_LFE; - case kAudioChannelLabel_LeftSurround: return MA_CHANNEL_BACK_LEFT; - case kAudioChannelLabel_RightSurround: return MA_CHANNEL_BACK_RIGHT; - case kAudioChannelLabel_LeftCenter: return MA_CHANNEL_FRONT_LEFT_CENTER; - case kAudioChannelLabel_RightCenter: return MA_CHANNEL_FRONT_RIGHT_CENTER; - case kAudioChannelLabel_CenterSurround: return MA_CHANNEL_BACK_CENTER; - case kAudioChannelLabel_LeftSurroundDirect: return MA_CHANNEL_SIDE_LEFT; - case kAudioChannelLabel_RightSurroundDirect: return MA_CHANNEL_SIDE_RIGHT; - case kAudioChannelLabel_TopCenterSurround: return MA_CHANNEL_TOP_CENTER; - case kAudioChannelLabel_VerticalHeightLeft: return MA_CHANNEL_TOP_FRONT_LEFT; - case kAudioChannelLabel_VerticalHeightCenter: return MA_CHANNEL_TOP_FRONT_CENTER; - case kAudioChannelLabel_VerticalHeightRight: return MA_CHANNEL_TOP_FRONT_RIGHT; - case kAudioChannelLabel_TopBackLeft: return MA_CHANNEL_TOP_BACK_LEFT; - case kAudioChannelLabel_TopBackCenter: return MA_CHANNEL_TOP_BACK_CENTER; - case kAudioChannelLabel_TopBackRight: return MA_CHANNEL_TOP_BACK_RIGHT; - case kAudioChannelLabel_RearSurroundLeft: return MA_CHANNEL_BACK_LEFT; - case kAudioChannelLabel_RearSurroundRight: return MA_CHANNEL_BACK_RIGHT; - case kAudioChannelLabel_LeftWide: return MA_CHANNEL_SIDE_LEFT; - case kAudioChannelLabel_RightWide: return MA_CHANNEL_SIDE_RIGHT; - case kAudioChannelLabel_LFE2: return MA_CHANNEL_LFE; - case kAudioChannelLabel_LeftTotal: return MA_CHANNEL_LEFT; - case kAudioChannelLabel_RightTotal: return MA_CHANNEL_RIGHT; - case kAudioChannelLabel_HearingImpaired: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Narration: return MA_CHANNEL_MONO; - case kAudioChannelLabel_Mono: return MA_CHANNEL_MONO; - case kAudioChannelLabel_DialogCentricMix: return MA_CHANNEL_MONO; - case kAudioChannelLabel_CenterSurroundDirect: return MA_CHANNEL_BACK_CENTER; - case kAudioChannelLabel_Haptic: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Ambisonic_W: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Ambisonic_X: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Ambisonic_Y: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Ambisonic_Z: return MA_CHANNEL_NONE; - case kAudioChannelLabel_MS_Mid: return MA_CHANNEL_LEFT; - case kAudioChannelLabel_MS_Side: return MA_CHANNEL_RIGHT; - case kAudioChannelLabel_XY_X: return MA_CHANNEL_LEFT; - case kAudioChannelLabel_XY_Y: return MA_CHANNEL_RIGHT; - case kAudioChannelLabel_HeadphonesLeft: return MA_CHANNEL_LEFT; - case kAudioChannelLabel_HeadphonesRight: return MA_CHANNEL_RIGHT; - case kAudioChannelLabel_ClickTrack: return MA_CHANNEL_NONE; - case kAudioChannelLabel_ForeignLanguage: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Discrete: return MA_CHANNEL_NONE; - case kAudioChannelLabel_Discrete_0: return MA_CHANNEL_AUX_0; - case kAudioChannelLabel_Discrete_1: return MA_CHANNEL_AUX_1; - case kAudioChannelLabel_Discrete_2: return MA_CHANNEL_AUX_2; - case kAudioChannelLabel_Discrete_3: return MA_CHANNEL_AUX_3; - case kAudioChannelLabel_Discrete_4: return MA_CHANNEL_AUX_4; - case kAudioChannelLabel_Discrete_5: return MA_CHANNEL_AUX_5; - case kAudioChannelLabel_Discrete_6: return MA_CHANNEL_AUX_6; - case kAudioChannelLabel_Discrete_7: return MA_CHANNEL_AUX_7; - case kAudioChannelLabel_Discrete_8: return MA_CHANNEL_AUX_8; - case kAudioChannelLabel_Discrete_9: return MA_CHANNEL_AUX_9; - case kAudioChannelLabel_Discrete_10: return MA_CHANNEL_AUX_10; - case kAudioChannelLabel_Discrete_11: return MA_CHANNEL_AUX_11; - case kAudioChannelLabel_Discrete_12: return MA_CHANNEL_AUX_12; - case kAudioChannelLabel_Discrete_13: return MA_CHANNEL_AUX_13; - case kAudioChannelLabel_Discrete_14: return MA_CHANNEL_AUX_14; - case kAudioChannelLabel_Discrete_15: return MA_CHANNEL_AUX_15; - case kAudioChannelLabel_Discrete_65535: return MA_CHANNEL_NONE; - - #if 0 /* Introduced in a later version of macOS. */ - case kAudioChannelLabel_HOA_ACN: return MA_CHANNEL_NONE; - case kAudioChannelLabel_HOA_ACN_0: return MA_CHANNEL_AUX_0; - case kAudioChannelLabel_HOA_ACN_1: return MA_CHANNEL_AUX_1; - case kAudioChannelLabel_HOA_ACN_2: return MA_CHANNEL_AUX_2; - case kAudioChannelLabel_HOA_ACN_3: return MA_CHANNEL_AUX_3; - case kAudioChannelLabel_HOA_ACN_4: return MA_CHANNEL_AUX_4; - case kAudioChannelLabel_HOA_ACN_5: return MA_CHANNEL_AUX_5; - case kAudioChannelLabel_HOA_ACN_6: return MA_CHANNEL_AUX_6; - case kAudioChannelLabel_HOA_ACN_7: return MA_CHANNEL_AUX_7; - case kAudioChannelLabel_HOA_ACN_8: return MA_CHANNEL_AUX_8; - case kAudioChannelLabel_HOA_ACN_9: return MA_CHANNEL_AUX_9; - case kAudioChannelLabel_HOA_ACN_10: return MA_CHANNEL_AUX_10; - case kAudioChannelLabel_HOA_ACN_11: return MA_CHANNEL_AUX_11; - case kAudioChannelLabel_HOA_ACN_12: return MA_CHANNEL_AUX_12; - case kAudioChannelLabel_HOA_ACN_13: return MA_CHANNEL_AUX_13; - case kAudioChannelLabel_HOA_ACN_14: return MA_CHANNEL_AUX_14; - case kAudioChannelLabel_HOA_ACN_15: return MA_CHANNEL_AUX_15; - case kAudioChannelLabel_HOA_ACN_65024: return MA_CHANNEL_NONE; - #endif - - default: return MA_CHANNEL_NONE; - } -} - -static ma_result ma_get_channel_map_from_AudioChannelLayout(AudioChannelLayout* pChannelLayout, ma_channel* pChannelMap, size_t channelMapCap) -{ - MA_ASSERT(pChannelLayout != NULL); - - if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions) { - UInt32 iChannel; - for (iChannel = 0; iChannel < pChannelLayout->mNumberChannelDescriptions && iChannel < channelMapCap; ++iChannel) { - pChannelMap[iChannel] = ma_channel_from_AudioChannelLabel(pChannelLayout->mChannelDescriptions[iChannel].mChannelLabel); - } - } else -#if 0 - if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap) { - /* This is the same kind of system that's used by Windows audio APIs. */ - UInt32 iChannel = 0; - UInt32 iBit; - AudioChannelBitmap bitmap = pChannelLayout->mChannelBitmap; - for (iBit = 0; iBit < 32 && iChannel < channelMapCap; ++iBit) { - AudioChannelBitmap bit = bitmap & (1 << iBit); - if (bit != 0) { - pChannelMap[iChannel++] = ma_channel_from_AudioChannelBit(bit); - } - } - } else -#endif - { - /* - Need to use the tag to determine the channel map. For now I'm just assuming a default channel map, but later on this should - be updated to determine the mapping based on the tag. - */ - UInt32 channelCount; - - /* Our channel map retrieval APIs below take 32-bit integers, so we'll want to clamp the channel map capacity. */ - if (channelMapCap > 0xFFFFFFFF) { - channelMapCap = 0xFFFFFFFF; - } - - channelCount = ma_min(AudioChannelLayoutTag_GetNumberOfChannels(pChannelLayout->mChannelLayoutTag), (UInt32)channelMapCap); - - switch (pChannelLayout->mChannelLayoutTag) - { - case kAudioChannelLayoutTag_Mono: - case kAudioChannelLayoutTag_Stereo: - case kAudioChannelLayoutTag_StereoHeadphones: - case kAudioChannelLayoutTag_MatrixStereo: - case kAudioChannelLayoutTag_MidSide: - case kAudioChannelLayoutTag_XY: - case kAudioChannelLayoutTag_Binaural: - case kAudioChannelLayoutTag_Ambisonic_B_Format: - { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channelCount); - } break; - - case kAudioChannelLayoutTag_Octagonal: - { - pChannelMap[7] = MA_CHANNEL_SIDE_RIGHT; - pChannelMap[6] = MA_CHANNEL_SIDE_LEFT; - } /* Intentional fallthrough. */ - case kAudioChannelLayoutTag_Hexagonal: - { - pChannelMap[5] = MA_CHANNEL_BACK_CENTER; - } /* Intentional fallthrough. */ - case kAudioChannelLayoutTag_Pentagonal: - { - pChannelMap[4] = MA_CHANNEL_FRONT_CENTER; - } /* Intentional fallghrough. */ - case kAudioChannelLayoutTag_Quadraphonic: - { - pChannelMap[3] = MA_CHANNEL_BACK_RIGHT; - pChannelMap[2] = MA_CHANNEL_BACK_LEFT; - pChannelMap[1] = MA_CHANNEL_RIGHT; - pChannelMap[0] = MA_CHANNEL_LEFT; - } break; - - /* TODO: Add support for more tags here. */ - - default: - { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channelCount); - } break; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_get_device_object_ids__coreaudio(ma_context* pContext, UInt32* pDeviceCount, AudioObjectID** ppDeviceObjectIDs) /* NOTE: Free the returned buffer with ma_free(). */ -{ - AudioObjectPropertyAddress propAddressDevices; - UInt32 deviceObjectsDataSize; - OSStatus status; - AudioObjectID* pDeviceObjectIDs; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDeviceCount != NULL); - MA_ASSERT(ppDeviceObjectIDs != NULL); - - /* Safety. */ - *pDeviceCount = 0; - *ppDeviceObjectIDs = NULL; - - propAddressDevices.mSelector = kAudioHardwarePropertyDevices; - propAddressDevices.mScope = kAudioObjectPropertyScopeGlobal; - propAddressDevices.mElement = kAudioObjectPropertyElementMaster; - - status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(kAudioObjectSystemObject, &propAddressDevices, 0, NULL, &deviceObjectsDataSize); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - pDeviceObjectIDs = (AudioObjectID*)ma_malloc(deviceObjectsDataSize, &pContext->allocationCallbacks); - if (pDeviceObjectIDs == NULL) { - return MA_OUT_OF_MEMORY; - } - - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(kAudioObjectSystemObject, &propAddressDevices, 0, NULL, &deviceObjectsDataSize, pDeviceObjectIDs); - if (status != noErr) { - ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks); - return ma_result_from_OSStatus(status); - } - - *pDeviceCount = deviceObjectsDataSize / sizeof(AudioObjectID); - *ppDeviceObjectIDs = pDeviceObjectIDs; - - return MA_SUCCESS; -} - -static ma_result ma_get_AudioObject_uid_as_CFStringRef(ma_context* pContext, AudioObjectID objectID, CFStringRef* pUID) -{ - AudioObjectPropertyAddress propAddress; - UInt32 dataSize; - OSStatus status; - - MA_ASSERT(pContext != NULL); - - propAddress.mSelector = kAudioDevicePropertyDeviceUID; - propAddress.mScope = kAudioObjectPropertyScopeGlobal; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - dataSize = sizeof(*pUID); - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(objectID, &propAddress, 0, NULL, &dataSize, pUID); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - return MA_SUCCESS; -} - -static ma_result ma_get_AudioObject_uid(ma_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut) -{ - CFStringRef uid; - ma_result result; - - MA_ASSERT(pContext != NULL); - - result = ma_get_AudioObject_uid_as_CFStringRef(pContext, objectID, &uid); - if (result != MA_SUCCESS) { - return result; - } - - if (!((ma_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(uid, bufferOut, bufferSize, kCFStringEncodingUTF8)) { - return MA_ERROR; - } - - ((ma_CFRelease_proc)pContext->coreaudio.CFRelease)(uid); - return MA_SUCCESS; -} - -static ma_result ma_get_AudioObject_name(ma_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut) -{ - AudioObjectPropertyAddress propAddress; - CFStringRef deviceName = NULL; - UInt32 dataSize; - OSStatus status; - - MA_ASSERT(pContext != NULL); - - propAddress.mSelector = kAudioDevicePropertyDeviceNameCFString; - propAddress.mScope = kAudioObjectPropertyScopeGlobal; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - dataSize = sizeof(deviceName); - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(objectID, &propAddress, 0, NULL, &dataSize, &deviceName); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - if (!((ma_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(deviceName, bufferOut, bufferSize, kCFStringEncodingUTF8)) { - return MA_ERROR; - } - - ((ma_CFRelease_proc)pContext->coreaudio.CFRelease)(deviceName); - return MA_SUCCESS; -} - -static ma_bool32 ma_does_AudioObject_support_scope(ma_context* pContext, AudioObjectID deviceObjectID, AudioObjectPropertyScope scope) -{ - AudioObjectPropertyAddress propAddress; - UInt32 dataSize; - OSStatus status; - AudioBufferList* pBufferList; - ma_bool32 isSupported; - - MA_ASSERT(pContext != NULL); - - /* To know whether or not a device is an input device we need ot look at the stream configuration. If it has an output channel it's a playback device. */ - propAddress.mSelector = kAudioDevicePropertyStreamConfiguration; - propAddress.mScope = scope; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize); - if (status != noErr) { - return MA_FALSE; - } - - pBufferList = (AudioBufferList*)ma_malloc(dataSize, &pContext->allocationCallbacks); - if (pBufferList == NULL) { - return MA_FALSE; /* Out of memory. */ - } - - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pBufferList); - if (status != noErr) { - ma_free(pBufferList, &pContext->allocationCallbacks); - return MA_FALSE; - } - - isSupported = MA_FALSE; - if (pBufferList->mNumberBuffers > 0) { - isSupported = MA_TRUE; - } - - ma_free(pBufferList, &pContext->allocationCallbacks); - return isSupported; -} - -static ma_bool32 ma_does_AudioObject_support_playback(ma_context* pContext, AudioObjectID deviceObjectID) -{ - return ma_does_AudioObject_support_scope(pContext, deviceObjectID, kAudioObjectPropertyScopeOutput); -} - -static ma_bool32 ma_does_AudioObject_support_capture(ma_context* pContext, AudioObjectID deviceObjectID) -{ - return ma_does_AudioObject_support_scope(pContext, deviceObjectID, kAudioObjectPropertyScopeInput); -} - - -static ma_result ma_get_AudioObject_stream_descriptions(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, UInt32* pDescriptionCount, AudioStreamRangedDescription** ppDescriptions) /* NOTE: Free the returned pointer with ma_free(). */ -{ - AudioObjectPropertyAddress propAddress; - UInt32 dataSize; - OSStatus status; - AudioStreamRangedDescription* pDescriptions; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDescriptionCount != NULL); - MA_ASSERT(ppDescriptions != NULL); - - /* - TODO: Experiment with kAudioStreamPropertyAvailablePhysicalFormats instead of (or in addition to) kAudioStreamPropertyAvailableVirtualFormats. My - MacBook Pro uses s24/32 format, however, which miniaudio does not currently support. - */ - propAddress.mSelector = kAudioStreamPropertyAvailableVirtualFormats; /*kAudioStreamPropertyAvailablePhysicalFormats;*/ - propAddress.mScope = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - pDescriptions = (AudioStreamRangedDescription*)ma_malloc(dataSize, &pContext->allocationCallbacks); - if (pDescriptions == NULL) { - return MA_OUT_OF_MEMORY; - } - - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pDescriptions); - if (status != noErr) { - ma_free(pDescriptions, &pContext->allocationCallbacks); - return ma_result_from_OSStatus(status); - } - - *pDescriptionCount = dataSize / sizeof(*pDescriptions); - *ppDescriptions = pDescriptions; - return MA_SUCCESS; -} - - -static ma_result ma_get_AudioObject_channel_layout(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, AudioChannelLayout** ppChannelLayout) /* NOTE: Free the returned pointer with ma_free(). */ -{ - AudioObjectPropertyAddress propAddress; - UInt32 dataSize; - OSStatus status; - AudioChannelLayout* pChannelLayout; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(ppChannelLayout != NULL); - - *ppChannelLayout = NULL; /* Safety. */ - - propAddress.mSelector = kAudioDevicePropertyPreferredChannelLayout; - propAddress.mScope = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - pChannelLayout = (AudioChannelLayout*)ma_malloc(dataSize, &pContext->allocationCallbacks); - if (pChannelLayout == NULL) { - return MA_OUT_OF_MEMORY; - } - - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pChannelLayout); - if (status != noErr) { - ma_free(pChannelLayout, &pContext->allocationCallbacks); - return ma_result_from_OSStatus(status); - } - - *ppChannelLayout = pChannelLayout; - return MA_SUCCESS; -} - -static ma_result ma_get_AudioObject_channel_count(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32* pChannelCount) -{ - AudioChannelLayout* pChannelLayout; - ma_result result; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pChannelCount != NULL); - - *pChannelCount = 0; /* Safety. */ - - result = ma_get_AudioObject_channel_layout(pContext, deviceObjectID, deviceType, &pChannelLayout); - if (result != MA_SUCCESS) { - return result; - } - - if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions) { - *pChannelCount = pChannelLayout->mNumberChannelDescriptions; - } else if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap) { - *pChannelCount = ma_count_set_bits(pChannelLayout->mChannelBitmap); - } else { - *pChannelCount = AudioChannelLayoutTag_GetNumberOfChannels(pChannelLayout->mChannelLayoutTag); - } - - ma_free(pChannelLayout, &pContext->allocationCallbacks); - return MA_SUCCESS; -} - -#if 0 -static ma_result ma_get_AudioObject_channel_map(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_channel* pChannelMap, size_t channelMapCap) -{ - AudioChannelLayout* pChannelLayout; - ma_result result; - - MA_ASSERT(pContext != NULL); - - result = ma_get_AudioObject_channel_layout(pContext, deviceObjectID, deviceType, &pChannelLayout); - if (result != MA_SUCCESS) { - return result; /* Rather than always failing here, would it be more robust to simply assume a default? */ - } - - result = ma_get_channel_map_from_AudioChannelLayout(pChannelLayout, pChannelMap, channelMapCap); - if (result != MA_SUCCESS) { - ma_free(pChannelLayout, &pContext->allocationCallbacks); - return result; - } - - ma_free(pChannelLayout, &pContext->allocationCallbacks); - return result; -} -#endif - -static ma_result ma_get_AudioObject_sample_rates(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, UInt32* pSampleRateRangesCount, AudioValueRange** ppSampleRateRanges) /* NOTE: Free the returned pointer with ma_free(). */ -{ - AudioObjectPropertyAddress propAddress; - UInt32 dataSize; - OSStatus status; - AudioValueRange* pSampleRateRanges; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pSampleRateRangesCount != NULL); - MA_ASSERT(ppSampleRateRanges != NULL); - - /* Safety. */ - *pSampleRateRangesCount = 0; - *ppSampleRateRanges = NULL; - - propAddress.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; - propAddress.mScope = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - pSampleRateRanges = (AudioValueRange*)ma_malloc(dataSize, &pContext->allocationCallbacks); - if (pSampleRateRanges == NULL) { - return MA_OUT_OF_MEMORY; - } - - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pSampleRateRanges); - if (status != noErr) { - ma_free(pSampleRateRanges, &pContext->allocationCallbacks); - return ma_result_from_OSStatus(status); - } - - *pSampleRateRangesCount = dataSize / sizeof(*pSampleRateRanges); - *ppSampleRateRanges = pSampleRateRanges; - return MA_SUCCESS; -} - -#if 0 -static ma_result ma_get_AudioObject_get_closest_sample_rate(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32 sampleRateIn, ma_uint32* pSampleRateOut) -{ - UInt32 sampleRateRangeCount; - AudioValueRange* pSampleRateRanges; - ma_result result; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pSampleRateOut != NULL); - - *pSampleRateOut = 0; /* Safety. */ - - result = ma_get_AudioObject_sample_rates(pContext, deviceObjectID, deviceType, &sampleRateRangeCount, &pSampleRateRanges); - if (result != MA_SUCCESS) { - return result; - } - - if (sampleRateRangeCount == 0) { - ma_free(pSampleRateRanges, &pContext->allocationCallbacks); - return MA_ERROR; /* Should never hit this case should we? */ - } - - if (sampleRateIn == 0) { - /* Search in order of miniaudio's preferred priority. */ - UInt32 iMALSampleRate; - for (iMALSampleRate = 0; iMALSampleRate < ma_countof(g_maStandardSampleRatePriorities); ++iMALSampleRate) { - ma_uint32 malSampleRate = g_maStandardSampleRatePriorities[iMALSampleRate]; - UInt32 iCASampleRate; - for (iCASampleRate = 0; iCASampleRate < sampleRateRangeCount; ++iCASampleRate) { - AudioValueRange caSampleRate = pSampleRateRanges[iCASampleRate]; - if (caSampleRate.mMinimum <= malSampleRate && caSampleRate.mMaximum >= malSampleRate) { - *pSampleRateOut = malSampleRate; - ma_free(pSampleRateRanges, &pContext->allocationCallbacks); - return MA_SUCCESS; - } - } - } - - /* - If we get here it means none of miniaudio's standard sample rates matched any of the supported sample rates from the device. In this - case we just fall back to the first one reported by Core Audio. - */ - MA_ASSERT(sampleRateRangeCount > 0); - - *pSampleRateOut = pSampleRateRanges[0].mMinimum; - ma_free(pSampleRateRanges, &pContext->allocationCallbacks); - return MA_SUCCESS; - } else { - /* Find the closest match to this sample rate. */ - UInt32 currentAbsoluteDifference = INT32_MAX; - UInt32 iCurrentClosestRange = (UInt32)-1; - UInt32 iRange; - for (iRange = 0; iRange < sampleRateRangeCount; ++iRange) { - if (pSampleRateRanges[iRange].mMinimum <= sampleRateIn && pSampleRateRanges[iRange].mMaximum >= sampleRateIn) { - *pSampleRateOut = sampleRateIn; - ma_free(pSampleRateRanges, &pContext->allocationCallbacks); - return MA_SUCCESS; - } else { - UInt32 absoluteDifference; - if (pSampleRateRanges[iRange].mMinimum > sampleRateIn) { - absoluteDifference = pSampleRateRanges[iRange].mMinimum - sampleRateIn; - } else { - absoluteDifference = sampleRateIn - pSampleRateRanges[iRange].mMaximum; - } - - if (currentAbsoluteDifference > absoluteDifference) { - currentAbsoluteDifference = absoluteDifference; - iCurrentClosestRange = iRange; - } - } - } - - MA_ASSERT(iCurrentClosestRange != (UInt32)-1); - - *pSampleRateOut = pSampleRateRanges[iCurrentClosestRange].mMinimum; - ma_free(pSampleRateRanges, &pContext->allocationCallbacks); - return MA_SUCCESS; - } - - /* Should never get here, but it would mean we weren't able to find any suitable sample rates. */ - /*ma_free(pSampleRateRanges, &pContext->allocationCallbacks);*/ - /*return MA_ERROR;*/ -} -#endif - -static ma_result ma_get_AudioObject_closest_buffer_size_in_frames(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32 bufferSizeInFramesIn, ma_uint32* pBufferSizeInFramesOut) -{ - AudioObjectPropertyAddress propAddress; - AudioValueRange bufferSizeRange; - UInt32 dataSize; - OSStatus status; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pBufferSizeInFramesOut != NULL); - - *pBufferSizeInFramesOut = 0; /* Safety. */ - - propAddress.mSelector = kAudioDevicePropertyBufferFrameSizeRange; - propAddress.mScope = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - dataSize = sizeof(bufferSizeRange); - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, &bufferSizeRange); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - /* This is just a clamp. */ - if (bufferSizeInFramesIn < bufferSizeRange.mMinimum) { - *pBufferSizeInFramesOut = (ma_uint32)bufferSizeRange.mMinimum; - } else if (bufferSizeInFramesIn > bufferSizeRange.mMaximum) { - *pBufferSizeInFramesOut = (ma_uint32)bufferSizeRange.mMaximum; - } else { - *pBufferSizeInFramesOut = bufferSizeInFramesIn; - } - - return MA_SUCCESS; -} - -static ma_result ma_set_AudioObject_buffer_size_in_frames(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32* pPeriodSizeInOut) -{ - ma_result result; - ma_uint32 chosenBufferSizeInFrames; - AudioObjectPropertyAddress propAddress; - UInt32 dataSize; - OSStatus status; - - MA_ASSERT(pContext != NULL); - - result = ma_get_AudioObject_closest_buffer_size_in_frames(pContext, deviceObjectID, deviceType, *pPeriodSizeInOut, &chosenBufferSizeInFrames); - if (result != MA_SUCCESS) { - return result; - } - - /* Try setting the size of the buffer... If this fails we just use whatever is currently set. */ - propAddress.mSelector = kAudioDevicePropertyBufferFrameSize; - propAddress.mScope = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - ((ma_AudioObjectSetPropertyData_proc)pContext->coreaudio.AudioObjectSetPropertyData)(deviceObjectID, &propAddress, 0, NULL, sizeof(chosenBufferSizeInFrames), &chosenBufferSizeInFrames); - - /* Get the actual size of the buffer. */ - dataSize = sizeof(*pPeriodSizeInOut); - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, &chosenBufferSizeInFrames); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - *pPeriodSizeInOut = chosenBufferSizeInFrames; - return MA_SUCCESS; -} - -static ma_result ma_find_default_AudioObjectID(ma_context* pContext, ma_device_type deviceType, AudioObjectID* pDeviceObjectID) -{ - AudioObjectPropertyAddress propAddressDefaultDevice; - UInt32 defaultDeviceObjectIDSize = sizeof(AudioObjectID); - AudioObjectID defaultDeviceObjectID; - OSStatus status; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDeviceObjectID != NULL); - - /* Safety. */ - *pDeviceObjectID = 0; - - propAddressDefaultDevice.mScope = kAudioObjectPropertyScopeGlobal; - propAddressDefaultDevice.mElement = kAudioObjectPropertyElementMaster; - if (deviceType == ma_device_type_playback) { - propAddressDefaultDevice.mSelector = kAudioHardwarePropertyDefaultOutputDevice; - } else { - propAddressDefaultDevice.mSelector = kAudioHardwarePropertyDefaultInputDevice; - } - - defaultDeviceObjectIDSize = sizeof(AudioObjectID); - status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(kAudioObjectSystemObject, &propAddressDefaultDevice, 0, NULL, &defaultDeviceObjectIDSize, &defaultDeviceObjectID); - if (status == noErr) { - *pDeviceObjectID = defaultDeviceObjectID; - return MA_SUCCESS; - } - - /* If we get here it means we couldn't find the device. */ - return MA_NO_DEVICE; -} - -static ma_result ma_find_AudioObjectID(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, AudioObjectID* pDeviceObjectID) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDeviceObjectID != NULL); - - /* Safety. */ - *pDeviceObjectID = 0; - - if (pDeviceID == NULL) { - /* Default device. */ - return ma_find_default_AudioObjectID(pContext, deviceType, pDeviceObjectID); - } else { - /* Explicit device. */ - UInt32 deviceCount; - AudioObjectID* pDeviceObjectIDs; - ma_result result; - UInt32 iDevice; - - result = ma_get_device_object_ids__coreaudio(pContext, &deviceCount, &pDeviceObjectIDs); - if (result != MA_SUCCESS) { - return result; - } - - for (iDevice = 0; iDevice < deviceCount; ++iDevice) { - AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice]; - - char uid[256]; - if (ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(uid), uid) != MA_SUCCESS) { - continue; - } - - if (deviceType == ma_device_type_playback) { - if (ma_does_AudioObject_support_playback(pContext, deviceObjectID)) { - if (strcmp(uid, pDeviceID->coreaudio) == 0) { - *pDeviceObjectID = deviceObjectID; - ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks); - return MA_SUCCESS; - } - } - } else { - if (ma_does_AudioObject_support_capture(pContext, deviceObjectID)) { - if (strcmp(uid, pDeviceID->coreaudio) == 0) { - *pDeviceObjectID = deviceObjectID; - ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks); - return MA_SUCCESS; - } - } - } - } - - ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks); - } - - /* If we get here it means we couldn't find the device. */ - return MA_NO_DEVICE; -} - - -static ma_result ma_find_best_format__coreaudio(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const AudioStreamBasicDescription* pOrigFormat, AudioStreamBasicDescription* pFormat) -{ - UInt32 deviceFormatDescriptionCount; - AudioStreamRangedDescription* pDeviceFormatDescriptions; - ma_result result; - ma_uint32 desiredSampleRate; - ma_uint32 desiredChannelCount; - ma_format desiredFormat; - AudioStreamBasicDescription bestDeviceFormatSoFar; - ma_bool32 hasSupportedFormat; - UInt32 iFormat; - - result = ma_get_AudioObject_stream_descriptions(pContext, deviceObjectID, deviceType, &deviceFormatDescriptionCount, &pDeviceFormatDescriptions); - if (result != MA_SUCCESS) { - return result; - } - - desiredSampleRate = sampleRate; - if (desiredSampleRate == 0) { - desiredSampleRate = pOrigFormat->mSampleRate; - } - - desiredChannelCount = channels; - if (desiredChannelCount == 0) { - desiredChannelCount = pOrigFormat->mChannelsPerFrame; - } - - desiredFormat = format; - if (desiredFormat == ma_format_unknown) { - result = ma_format_from_AudioStreamBasicDescription(pOrigFormat, &desiredFormat); - if (result != MA_SUCCESS || desiredFormat == ma_format_unknown) { - desiredFormat = g_maFormatPriorities[0]; - } - } - - /* - If we get here it means we don't have an exact match to what the client is asking for. We'll need to find the closest one. The next - loop will check for formats that have the same sample rate to what we're asking for. If there is, we prefer that one in all cases. - */ - MA_ZERO_OBJECT(&bestDeviceFormatSoFar); - - hasSupportedFormat = MA_FALSE; - for (iFormat = 0; iFormat < deviceFormatDescriptionCount; ++iFormat) { - ma_format format; - ma_result formatResult = ma_format_from_AudioStreamBasicDescription(&pDeviceFormatDescriptions[iFormat].mFormat, &format); - if (formatResult == MA_SUCCESS && format != ma_format_unknown) { - hasSupportedFormat = MA_TRUE; - bestDeviceFormatSoFar = pDeviceFormatDescriptions[iFormat].mFormat; - break; - } - } - - if (!hasSupportedFormat) { - ma_free(pDeviceFormatDescriptions, &pContext->allocationCallbacks); - return MA_FORMAT_NOT_SUPPORTED; - } - - - for (iFormat = 0; iFormat < deviceFormatDescriptionCount; ++iFormat) { - AudioStreamBasicDescription thisDeviceFormat = pDeviceFormatDescriptions[iFormat].mFormat; - ma_format thisSampleFormat; - ma_result formatResult; - ma_format bestSampleFormatSoFar; - - /* If the format is not supported by miniaudio we need to skip this one entirely. */ - formatResult = ma_format_from_AudioStreamBasicDescription(&pDeviceFormatDescriptions[iFormat].mFormat, &thisSampleFormat); - if (formatResult != MA_SUCCESS || thisSampleFormat == ma_format_unknown) { - continue; /* The format is not supported by miniaudio. Skip. */ - } - - ma_format_from_AudioStreamBasicDescription(&bestDeviceFormatSoFar, &bestSampleFormatSoFar); - - /* Getting here means the format is supported by miniaudio which makes this format a candidate. */ - if (thisDeviceFormat.mSampleRate != desiredSampleRate) { - /* - The sample rate does not match, but this format could still be usable, although it's a very low priority. If the best format - so far has an equal sample rate we can just ignore this one. - */ - if (bestDeviceFormatSoFar.mSampleRate == desiredSampleRate) { - continue; /* The best sample rate so far has the same sample rate as what we requested which means it's still the best so far. Skip this format. */ - } else { - /* In this case, neither the best format so far nor this one have the same sample rate. Check the channel count next. */ - if (thisDeviceFormat.mChannelsPerFrame != desiredChannelCount) { - /* This format has a different sample rate _and_ a different channel count. */ - if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) { - continue; /* No change to the best format. */ - } else { - /* - Both this format and the best so far have different sample rates and different channel counts. Whichever has the - best format is the new best. - */ - if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) { - bestDeviceFormatSoFar = thisDeviceFormat; - continue; - } else { - continue; /* No change to the best format. */ - } - } - } else { - /* This format has a different sample rate but the desired channel count. */ - if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) { - /* Both this format and the best so far have the desired channel count. Whichever has the best format is the new best. */ - if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) { - bestDeviceFormatSoFar = thisDeviceFormat; - continue; - } else { - continue; /* No change to the best format for now. */ - } - } else { - /* This format has the desired channel count, but the best so far does not. We have a new best. */ - bestDeviceFormatSoFar = thisDeviceFormat; - continue; - } - } - } - } else { - /* - The sample rates match which makes this format a very high priority contender. If the best format so far has a different - sample rate it needs to be replaced with this one. - */ - if (bestDeviceFormatSoFar.mSampleRate != desiredSampleRate) { - bestDeviceFormatSoFar = thisDeviceFormat; - continue; - } else { - /* In this case both this format and the best format so far have the same sample rate. Check the channel count next. */ - if (thisDeviceFormat.mChannelsPerFrame == desiredChannelCount) { - /* - In this case this format has the same channel count as what the client is requesting. If the best format so far has - a different count, this one becomes the new best. - */ - if (bestDeviceFormatSoFar.mChannelsPerFrame != desiredChannelCount) { - bestDeviceFormatSoFar = thisDeviceFormat; - continue; - } else { - /* In this case both this format and the best so far have the ideal sample rate and channel count. Check the format. */ - if (thisSampleFormat == desiredFormat) { - bestDeviceFormatSoFar = thisDeviceFormat; - break; /* Found the exact match. */ - } else { - /* The formats are different. The new best format is the one with the highest priority format according to miniaudio. */ - if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) { - bestDeviceFormatSoFar = thisDeviceFormat; - continue; - } else { - continue; /* No change to the best format for now. */ - } - } - } - } else { - /* - In this case the channel count is different to what the client has requested. If the best so far has the same channel - count as the requested count then it remains the best. - */ - if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) { - continue; - } else { - /* - This is the case where both have the same sample rate (good) but different channel counts. Right now both have about - the same priority, but we need to compare the format now. - */ - if (thisSampleFormat == bestSampleFormatSoFar) { - if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) { - bestDeviceFormatSoFar = thisDeviceFormat; - continue; - } else { - continue; /* No change to the best format for now. */ - } - } - } - } - } - } - } - - *pFormat = bestDeviceFormatSoFar; - - ma_free(pDeviceFormatDescriptions, &pContext->allocationCallbacks); - return MA_SUCCESS; -} - -static ma_result ma_get_AudioUnit_channel_map(ma_context* pContext, AudioUnit audioUnit, ma_device_type deviceType, ma_channel* pChannelMap, size_t channelMapCap) -{ - AudioUnitScope deviceScope; - AudioUnitElement deviceBus; - UInt32 channelLayoutSize; - OSStatus status; - AudioChannelLayout* pChannelLayout; - ma_result result; - - MA_ASSERT(pContext != NULL); - - if (deviceType == ma_device_type_playback) { - deviceScope = kAudioUnitScope_Input; - deviceBus = MA_COREAUDIO_OUTPUT_BUS; - } else { - deviceScope = kAudioUnitScope_Output; - deviceBus = MA_COREAUDIO_INPUT_BUS; - } - - status = ((ma_AudioUnitGetPropertyInfo_proc)pContext->coreaudio.AudioUnitGetPropertyInfo)(audioUnit, kAudioUnitProperty_AudioChannelLayout, deviceScope, deviceBus, &channelLayoutSize, NULL); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - pChannelLayout = (AudioChannelLayout*)ma_malloc(channelLayoutSize, &pContext->allocationCallbacks); - if (pChannelLayout == NULL) { - return MA_OUT_OF_MEMORY; - } - - status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioUnitProperty_AudioChannelLayout, deviceScope, deviceBus, pChannelLayout, &channelLayoutSize); - if (status != noErr) { - ma_free(pChannelLayout, &pContext->allocationCallbacks); - return ma_result_from_OSStatus(status); - } - - result = ma_get_channel_map_from_AudioChannelLayout(pChannelLayout, pChannelMap, channelMapCap); - if (result != MA_SUCCESS) { - ma_free(pChannelLayout, &pContext->allocationCallbacks); - return result; - } - - ma_free(pChannelLayout, &pContext->allocationCallbacks); - return MA_SUCCESS; -} -#endif /* MA_APPLE_DESKTOP */ - - -#if !defined(MA_APPLE_DESKTOP) -static void ma_AVAudioSessionPortDescription_to_device_info(AVAudioSessionPortDescription* pPortDesc, ma_device_info* pInfo) -{ - MA_ZERO_OBJECT(pInfo); - ma_strncpy_s(pInfo->name, sizeof(pInfo->name), [pPortDesc.portName UTF8String], (size_t)-1); - ma_strncpy_s(pInfo->id.coreaudio, sizeof(pInfo->id.coreaudio), [pPortDesc.UID UTF8String], (size_t)-1); -} -#endif - -static ma_result ma_context_enumerate_devices__coreaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ -#if defined(MA_APPLE_DESKTOP) - UInt32 deviceCount; - AudioObjectID* pDeviceObjectIDs; - AudioObjectID defaultDeviceObjectIDPlayback; - AudioObjectID defaultDeviceObjectIDCapture; - ma_result result; - UInt32 iDevice; - - ma_find_default_AudioObjectID(pContext, ma_device_type_playback, &defaultDeviceObjectIDPlayback); /* OK if this fails. */ - ma_find_default_AudioObjectID(pContext, ma_device_type_capture, &defaultDeviceObjectIDCapture); /* OK if this fails. */ - - result = ma_get_device_object_ids__coreaudio(pContext, &deviceCount, &pDeviceObjectIDs); - if (result != MA_SUCCESS) { - return result; - } - - for (iDevice = 0; iDevice < deviceCount; ++iDevice) { - AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice]; - ma_device_info info; - - MA_ZERO_OBJECT(&info); - if (ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(info.id.coreaudio), info.id.coreaudio) != MA_SUCCESS) { - continue; - } - if (ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(info.name), info.name) != MA_SUCCESS) { - continue; - } - - if (ma_does_AudioObject_support_playback(pContext, deviceObjectID)) { - if (deviceObjectID == defaultDeviceObjectIDPlayback) { - info.isDefault = MA_TRUE; - } - - if (!callback(pContext, ma_device_type_playback, &info, pUserData)) { - break; - } - } - if (ma_does_AudioObject_support_capture(pContext, deviceObjectID)) { - if (deviceObjectID == defaultDeviceObjectIDCapture) { - info.isDefault = MA_TRUE; - } - - if (!callback(pContext, ma_device_type_capture, &info, pUserData)) { - break; - } - } - } - - ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks); -#else - ma_device_info info; - NSArray *pInputs = [[[AVAudioSession sharedInstance] currentRoute] inputs]; - NSArray *pOutputs = [[[AVAudioSession sharedInstance] currentRoute] outputs]; - - for (AVAudioSessionPortDescription* pPortDesc in pOutputs) { - ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, &info); - if (!callback(pContext, ma_device_type_playback, &info, pUserData)) { - return MA_SUCCESS; - } - } - - for (AVAudioSessionPortDescription* pPortDesc in pInputs) { - ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, &info); - if (!callback(pContext, ma_device_type_capture, &info, pUserData)) { - return MA_SUCCESS; - } - } -#endif - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__coreaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_result result; - - MA_ASSERT(pContext != NULL); - -#if defined(MA_APPLE_DESKTOP) - /* Desktop */ - { - AudioObjectID deviceObjectID; - AudioObjectID defaultDeviceObjectID; - UInt32 streamDescriptionCount; - AudioStreamRangedDescription* pStreamDescriptions; - UInt32 iStreamDescription; - UInt32 sampleRateRangeCount; - AudioValueRange* pSampleRateRanges; - - ma_find_default_AudioObjectID(pContext, deviceType, &defaultDeviceObjectID); /* OK if this fails. */ - - result = ma_find_AudioObjectID(pContext, deviceType, pDeviceID, &deviceObjectID); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(pDeviceInfo->id.coreaudio), pDeviceInfo->id.coreaudio); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(pDeviceInfo->name), pDeviceInfo->name); - if (result != MA_SUCCESS) { - return result; - } - - if (deviceObjectID == defaultDeviceObjectID) { - pDeviceInfo->isDefault = MA_TRUE; - } - - /* - There could be a large number of permutations here. Fortunately there is only a single channel count - being reported which reduces this quite a bit. For sample rates we're only reporting those that are - one of miniaudio's recognized "standard" rates. If there are still more formats than can fit into - our fixed sized array we'll just need to truncate them. This is unlikely and will probably only happen - if some driver performs software data conversion and therefore reports every possible format and - sample rate. - */ - pDeviceInfo->nativeDataFormatCount = 0; - - /* Formats. */ - { - ma_format uniqueFormats[ma_format_count]; - ma_uint32 uniqueFormatCount = 0; - ma_uint32 channels; - - /* Channels. */ - result = ma_get_AudioObject_channel_count(pContext, deviceObjectID, deviceType, &channels); - if (result != MA_SUCCESS) { - return result; - } - - /* Formats. */ - result = ma_get_AudioObject_stream_descriptions(pContext, deviceObjectID, deviceType, &streamDescriptionCount, &pStreamDescriptions); - if (result != MA_SUCCESS) { - return result; - } - - for (iStreamDescription = 0; iStreamDescription < streamDescriptionCount; ++iStreamDescription) { - ma_format format; - ma_bool32 hasFormatBeenHandled = MA_FALSE; - ma_uint32 iOutputFormat; - ma_uint32 iSampleRate; - - result = ma_format_from_AudioStreamBasicDescription(&pStreamDescriptions[iStreamDescription].mFormat, &format); - if (result != MA_SUCCESS) { - continue; - } - - MA_ASSERT(format != ma_format_unknown); - - /* Make sure the format isn't already in the output list. */ - for (iOutputFormat = 0; iOutputFormat < uniqueFormatCount; ++iOutputFormat) { - if (uniqueFormats[iOutputFormat] == format) { - hasFormatBeenHandled = MA_TRUE; - break; - } - } - - /* If we've already handled this format just skip it. */ - if (hasFormatBeenHandled) { - continue; - } - - uniqueFormats[uniqueFormatCount] = format; - uniqueFormatCount += 1; - - /* Sample Rates */ - result = ma_get_AudioObject_sample_rates(pContext, deviceObjectID, deviceType, &sampleRateRangeCount, &pSampleRateRanges); - if (result != MA_SUCCESS) { - return result; - } - - /* - Annoyingly Core Audio reports a sample rate range. We just get all the standard rates that are - between this range. - */ - for (iSampleRate = 0; iSampleRate < sampleRateRangeCount; ++iSampleRate) { - ma_uint32 iStandardSampleRate; - for (iStandardSampleRate = 0; iStandardSampleRate < ma_countof(g_maStandardSampleRatePriorities); iStandardSampleRate += 1) { - ma_uint32 standardSampleRate = g_maStandardSampleRatePriorities[iStandardSampleRate]; - if (standardSampleRate >= pSampleRateRanges[iSampleRate].mMinimum && standardSampleRate <= pSampleRateRanges[iSampleRate].mMaximum) { - /* We have a new data format. Add it to the list. */ - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = format; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels = channels; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = standardSampleRate; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = 0; - pDeviceInfo->nativeDataFormatCount += 1; - - if (pDeviceInfo->nativeDataFormatCount >= ma_countof(pDeviceInfo->nativeDataFormats)) { - break; /* No more room for any more formats. */ - } - } - } - } - - ma_free(pSampleRateRanges, &pContext->allocationCallbacks); - - if (pDeviceInfo->nativeDataFormatCount >= ma_countof(pDeviceInfo->nativeDataFormats)) { - break; /* No more room for any more formats. */ - } - } - - ma_free(pStreamDescriptions, &pContext->allocationCallbacks); - } - } -#else - /* Mobile */ - { - AudioComponentDescription desc; - AudioComponent component; - AudioUnit audioUnit; - OSStatus status; - AudioUnitScope formatScope; - AudioUnitElement formatElement; - AudioStreamBasicDescription bestFormat; - UInt32 propSize; - - /* We want to ensure we use a consistent device name to device enumeration. */ - if (pDeviceID != NULL && pDeviceID->coreaudio[0] != '\0') { - ma_bool32 found = MA_FALSE; - if (deviceType == ma_device_type_playback) { - NSArray *pOutputs = [[[AVAudioSession sharedInstance] currentRoute] outputs]; - for (AVAudioSessionPortDescription* pPortDesc in pOutputs) { - if (strcmp(pDeviceID->coreaudio, [pPortDesc.UID UTF8String]) == 0) { - ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, pDeviceInfo); - found = MA_TRUE; - break; - } - } - } else { - NSArray *pInputs = [[[AVAudioSession sharedInstance] currentRoute] inputs]; - for (AVAudioSessionPortDescription* pPortDesc in pInputs) { - if (strcmp(pDeviceID->coreaudio, [pPortDesc.UID UTF8String]) == 0) { - ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, pDeviceInfo); - found = MA_TRUE; - break; - } - } - } - - if (!found) { - return MA_DOES_NOT_EXIST; - } - } else { - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - } - - - /* - Retrieving device information is more annoying on mobile than desktop. For simplicity I'm locking this down to whatever format is - reported on a temporary I/O unit. The problem, however, is that this doesn't return a value for the sample rate which we need to - retrieve from the AVAudioSession shared instance. - */ - desc.componentType = kAudioUnitType_Output; - desc.componentSubType = kAudioUnitSubType_RemoteIO; - desc.componentManufacturer = kAudioUnitManufacturer_Apple; - desc.componentFlags = 0; - desc.componentFlagsMask = 0; - - component = ((ma_AudioComponentFindNext_proc)pContext->coreaudio.AudioComponentFindNext)(NULL, &desc); - if (component == NULL) { - return MA_FAILED_TO_INIT_BACKEND; - } - - status = ((ma_AudioComponentInstanceNew_proc)pContext->coreaudio.AudioComponentInstanceNew)(component, &audioUnit); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - formatScope = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output; - formatElement = (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS; - - propSize = sizeof(bestFormat); - status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, &propSize); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(audioUnit); - return ma_result_from_OSStatus(status); - } - - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(audioUnit); - audioUnit = NULL; - - /* Only a single format is being reported for iOS. */ - pDeviceInfo->nativeDataFormatCount = 1; - - result = ma_format_from_AudioStreamBasicDescription(&bestFormat, &pDeviceInfo->nativeDataFormats[0].format); - if (result != MA_SUCCESS) { - return result; - } - - pDeviceInfo->nativeDataFormats[0].channels = bestFormat.mChannelsPerFrame; - - /* - It looks like Apple are wanting to push the whole AVAudioSession thing. Thus, we need to use that to determine device settings. To do - this we just get the shared instance and inspect. - */ - @autoreleasepool { - AVAudioSession* pAudioSession = [AVAudioSession sharedInstance]; - MA_ASSERT(pAudioSession != NULL); - - pDeviceInfo->nativeDataFormats[0].sampleRate = (ma_uint32)pAudioSession.sampleRate; - } - } -#endif - - (void)pDeviceInfo; /* Unused. */ - return MA_SUCCESS; -} - -static AudioBufferList* ma_allocate_AudioBufferList__coreaudio(ma_uint32 sizeInFrames, ma_format format, ma_uint32 channels, ma_stream_layout layout, const ma_allocation_callbacks* pAllocationCallbacks) -{ - AudioBufferList* pBufferList; - UInt32 audioBufferSizeInBytes; - size_t allocationSize; - - MA_ASSERT(sizeInFrames > 0); - MA_ASSERT(format != ma_format_unknown); - MA_ASSERT(channels > 0); - - allocationSize = sizeof(AudioBufferList) - sizeof(AudioBuffer); /* Subtract sizeof(AudioBuffer) because that part is dynamically sized. */ - if (layout == ma_stream_layout_interleaved) { - /* Interleaved case. This is the simple case because we just have one buffer. */ - allocationSize += sizeof(AudioBuffer) * 1; - } else { - /* Non-interleaved case. This is the more complex case because there's more than one buffer. */ - allocationSize += sizeof(AudioBuffer) * channels; - } - - allocationSize += sizeInFrames * ma_get_bytes_per_frame(format, channels); - - pBufferList = (AudioBufferList*)ma_malloc(allocationSize, pAllocationCallbacks); - if (pBufferList == NULL) { - return NULL; - } - - audioBufferSizeInBytes = (UInt32)(sizeInFrames * ma_get_bytes_per_sample(format)); - - if (layout == ma_stream_layout_interleaved) { - pBufferList->mNumberBuffers = 1; - pBufferList->mBuffers[0].mNumberChannels = channels; - pBufferList->mBuffers[0].mDataByteSize = audioBufferSizeInBytes * channels; - pBufferList->mBuffers[0].mData = (ma_uint8*)pBufferList + sizeof(AudioBufferList); - } else { - ma_uint32 iBuffer; - pBufferList->mNumberBuffers = channels; - for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; ++iBuffer) { - pBufferList->mBuffers[iBuffer].mNumberChannels = 1; - pBufferList->mBuffers[iBuffer].mDataByteSize = audioBufferSizeInBytes; - pBufferList->mBuffers[iBuffer].mData = (ma_uint8*)pBufferList + ((sizeof(AudioBufferList) - sizeof(AudioBuffer)) + (sizeof(AudioBuffer) * channels)) + (audioBufferSizeInBytes * iBuffer); - } - } - - return pBufferList; -} - -static ma_result ma_device_realloc_AudioBufferList__coreaudio(ma_device* pDevice, ma_uint32 sizeInFrames, ma_format format, ma_uint32 channels, ma_stream_layout layout) -{ - MA_ASSERT(pDevice != NULL); - MA_ASSERT(format != ma_format_unknown); - MA_ASSERT(channels > 0); - - /* Only resize the buffer if necessary. */ - if (pDevice->coreaudio.audioBufferCapInFrames < sizeInFrames) { - AudioBufferList* pNewAudioBufferList; - - pNewAudioBufferList = ma_allocate_AudioBufferList__coreaudio(sizeInFrames, format, channels, layout, &pDevice->pContext->allocationCallbacks); - if (pNewAudioBufferList == NULL) { - return MA_OUT_OF_MEMORY; - } - - /* At this point we'll have a new AudioBufferList and we can free the old one. */ - ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks); - pDevice->coreaudio.pAudioBufferList = pNewAudioBufferList; - pDevice->coreaudio.audioBufferCapInFrames = sizeInFrames; - } - - /* Getting here means the capacity of the audio is fine. */ - return MA_SUCCESS; -} - - -static OSStatus ma_on_output__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pActionFlags, const AudioTimeStamp* pTimeStamp, UInt32 busNumber, UInt32 frameCount, AudioBufferList* pBufferList) -{ - ma_device* pDevice = (ma_device*)pUserData; - ma_stream_layout layout; - - MA_ASSERT(pDevice != NULL); - - /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "INFO: Output Callback: busNumber=%d, frameCount=%d, mNumberBuffers=%d\n", (int)busNumber, (int)frameCount, (int)pBufferList->mNumberBuffers);*/ - - /* We need to check whether or not we are outputting interleaved or non-interleaved samples. The way we do this is slightly different for each type. */ - layout = ma_stream_layout_interleaved; - if (pBufferList->mBuffers[0].mNumberChannels != pDevice->playback.internalChannels) { - layout = ma_stream_layout_deinterleaved; - } - - if (layout == ma_stream_layout_interleaved) { - /* For now we can assume everything is interleaved. */ - UInt32 iBuffer; - for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; ++iBuffer) { - if (pBufferList->mBuffers[iBuffer].mNumberChannels == pDevice->playback.internalChannels) { - ma_uint32 frameCountForThisBuffer = pBufferList->mBuffers[iBuffer].mDataByteSize / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - if (frameCountForThisBuffer > 0) { - ma_device_handle_backend_data_callback(pDevice, pBufferList->mBuffers[iBuffer].mData, NULL, frameCountForThisBuffer); - } - - /*a_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, " frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\n", (int)frameCount, (int)pBufferList->mBuffers[iBuffer].mNumberChannels, (int)pBufferList->mBuffers[iBuffer].mDataByteSize);*/ - } else { - /* - This case is where the number of channels in the output buffer do not match our internal channels. It could mean that it's - not interleaved, in which case we can't handle right now since miniaudio does not yet support non-interleaved streams. We just - output silence here. - */ - MA_ZERO_MEMORY(pBufferList->mBuffers[iBuffer].mData, pBufferList->mBuffers[iBuffer].mDataByteSize); - /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, " WARNING: Outputting silence. frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\n", (int)frameCount, (int)pBufferList->mBuffers[iBuffer].mNumberChannels, (int)pBufferList->mBuffers[iBuffer].mDataByteSize);*/ - } - } - } else { - /* This is the deinterleaved case. We need to update each buffer in groups of internalChannels. This assumes each buffer is the same size. */ - MA_ASSERT(pDevice->playback.internalChannels <= MA_MAX_CHANNELS); /* This should heve been validated at initialization time. */ - - /* - For safety we'll check that the internal channels is a multiple of the buffer count. If it's not it means something - very strange has happened and we're not going to support it. - */ - if ((pBufferList->mNumberBuffers % pDevice->playback.internalChannels) == 0) { - ma_uint8 tempBuffer[4096]; - UInt32 iBuffer; - - for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; iBuffer += pDevice->playback.internalChannels) { - ma_uint32 frameCountPerBuffer = pBufferList->mBuffers[iBuffer].mDataByteSize / ma_get_bytes_per_sample(pDevice->playback.internalFormat); - ma_uint32 framesRemaining = frameCountPerBuffer; - - while (framesRemaining > 0) { - void* ppDeinterleavedBuffers[MA_MAX_CHANNELS]; - ma_uint32 iChannel; - ma_uint32 framesToRead = sizeof(tempBuffer) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - if (framesToRead > framesRemaining) { - framesToRead = framesRemaining; - } - - ma_device_handle_backend_data_callback(pDevice, tempBuffer, NULL, framesToRead); - - for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) { - ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pBufferList->mBuffers[iBuffer+iChannel].mData, (frameCountPerBuffer - framesRemaining) * ma_get_bytes_per_sample(pDevice->playback.internalFormat)); - } - - ma_deinterleave_pcm_frames(pDevice->playback.internalFormat, pDevice->playback.internalChannels, framesToRead, tempBuffer, ppDeinterleavedBuffers); - - framesRemaining -= framesToRead; - } - } - } - } - - (void)pActionFlags; - (void)pTimeStamp; - (void)busNumber; - (void)frameCount; - - return noErr; -} - -static OSStatus ma_on_input__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pActionFlags, const AudioTimeStamp* pTimeStamp, UInt32 busNumber, UInt32 frameCount, AudioBufferList* pUnusedBufferList) -{ - ma_device* pDevice = (ma_device*)pUserData; - AudioBufferList* pRenderedBufferList; - ma_result result; - ma_stream_layout layout; - ma_uint32 iBuffer; - OSStatus status; - - MA_ASSERT(pDevice != NULL); - - pRenderedBufferList = (AudioBufferList*)pDevice->coreaudio.pAudioBufferList; - MA_ASSERT(pRenderedBufferList); - - /* We need to check whether or not we are outputting interleaved or non-interleaved samples. The way we do this is slightly different for each type. */ - layout = ma_stream_layout_interleaved; - if (pRenderedBufferList->mBuffers[0].mNumberChannels != pDevice->capture.internalChannels) { - layout = ma_stream_layout_deinterleaved; - } - - /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "INFO: Input Callback: busNumber=%d, frameCount=%d, mNumberBuffers=%d\n", (int)busNumber, (int)frameCount, (int)pRenderedBufferList->mNumberBuffers);*/ - - /* - There has been a situation reported where frame count passed into this function is greater than the capacity of - our capture buffer. There doesn't seem to be a reliable way to determine what the maximum frame count will be, - so we need to instead resort to dynamically reallocating our buffer to ensure it's large enough to capture the - number of frames requested by this callback. - */ - result = ma_device_realloc_AudioBufferList__coreaudio(pDevice, frameCount, pDevice->capture.internalFormat, pDevice->capture.internalChannels, layout); - if (result != MA_SUCCESS) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "Failed to allocate AudioBufferList for capture.\n"); - return noErr; - } - - pRenderedBufferList = (AudioBufferList*)pDevice->coreaudio.pAudioBufferList; - MA_ASSERT(pRenderedBufferList); - - /* - When you call AudioUnitRender(), Core Audio tries to be helpful by setting the mDataByteSize to the number of bytes - that were actually rendered. The problem with this is that the next call can fail with -50 due to the size no longer - being set to the capacity of the buffer, but instead the size in bytes of the previous render. This will cause a - problem when a future call to this callback specifies a larger number of frames. - - To work around this we need to explicitly set the size of each buffer to their respective size in bytes. - */ - for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; ++iBuffer) { - pRenderedBufferList->mBuffers[iBuffer].mDataByteSize = pDevice->coreaudio.audioBufferCapInFrames * ma_get_bytes_per_sample(pDevice->capture.internalFormat) * pRenderedBufferList->mBuffers[iBuffer].mNumberChannels; - } - - status = ((ma_AudioUnitRender_proc)pDevice->pContext->coreaudio.AudioUnitRender)((AudioUnit)pDevice->coreaudio.audioUnitCapture, pActionFlags, pTimeStamp, busNumber, frameCount, pRenderedBufferList); - if (status != noErr) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, " ERROR: AudioUnitRender() failed with %d.\n", (int)status); - return status; - } - - if (layout == ma_stream_layout_interleaved) { - for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; ++iBuffer) { - if (pRenderedBufferList->mBuffers[iBuffer].mNumberChannels == pDevice->capture.internalChannels) { - ma_device_handle_backend_data_callback(pDevice, NULL, pRenderedBufferList->mBuffers[iBuffer].mData, frameCount); - /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, " mDataByteSize=%d.\n", (int)pRenderedBufferList->mBuffers[iBuffer].mDataByteSize);*/ - } else { - /* - This case is where the number of channels in the output buffer do not match our internal channels. It could mean that it's - not interleaved, in which case we can't handle right now since miniaudio does not yet support non-interleaved streams. - */ - ma_uint8 silentBuffer[4096]; - ma_uint32 framesRemaining; - - MA_ZERO_MEMORY(silentBuffer, sizeof(silentBuffer)); - - framesRemaining = frameCount; - while (framesRemaining > 0) { - ma_uint32 framesToSend = sizeof(silentBuffer) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - if (framesToSend > framesRemaining) { - framesToSend = framesRemaining; - } - - ma_device_handle_backend_data_callback(pDevice, NULL, silentBuffer, framesToSend); - - framesRemaining -= framesToSend; - } - - /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, " WARNING: Outputting silence. frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\n", (int)frameCount, (int)pRenderedBufferList->mBuffers[iBuffer].mNumberChannels, (int)pRenderedBufferList->mBuffers[iBuffer].mDataByteSize);*/ - } - } - } else { - /* This is the deinterleaved case. We need to interleave the audio data before sending it to the client. This assumes each buffer is the same size. */ - MA_ASSERT(pDevice->capture.internalChannels <= MA_MAX_CHANNELS); /* This should have been validated at initialization time. */ - - /* - For safety we'll check that the internal channels is a multiple of the buffer count. If it's not it means something - very strange has happened and we're not going to support it. - */ - if ((pRenderedBufferList->mNumberBuffers % pDevice->capture.internalChannels) == 0) { - ma_uint8 tempBuffer[4096]; - for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; iBuffer += pDevice->capture.internalChannels) { - ma_uint32 framesRemaining = frameCount; - while (framesRemaining > 0) { - void* ppDeinterleavedBuffers[MA_MAX_CHANNELS]; - ma_uint32 iChannel; - ma_uint32 framesToSend = sizeof(tempBuffer) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - if (framesToSend > framesRemaining) { - framesToSend = framesRemaining; - } - - for (iChannel = 0; iChannel < pDevice->capture.internalChannels; ++iChannel) { - ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pRenderedBufferList->mBuffers[iBuffer+iChannel].mData, (frameCount - framesRemaining) * ma_get_bytes_per_sample(pDevice->capture.internalFormat)); - } - - ma_interleave_pcm_frames(pDevice->capture.internalFormat, pDevice->capture.internalChannels, framesToSend, (const void**)ppDeinterleavedBuffers, tempBuffer); - ma_device_handle_backend_data_callback(pDevice, NULL, tempBuffer, framesToSend); - - framesRemaining -= framesToSend; - } - } - } - } - - (void)pActionFlags; - (void)pTimeStamp; - (void)busNumber; - (void)frameCount; - (void)pUnusedBufferList; - - return noErr; -} - -static void on_start_stop__coreaudio(void* pUserData, AudioUnit audioUnit, AudioUnitPropertyID propertyID, AudioUnitScope scope, AudioUnitElement element) -{ - ma_device* pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - /* Don't do anything if it looks like we're just reinitializing due to a device switch. */ - if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isSwitchingPlaybackDevice) || - ((audioUnit == pDevice->coreaudio.audioUnitCapture) && pDevice->coreaudio.isSwitchingCaptureDevice)) { - return; - } - - /* - There's been a report of a deadlock here when triggered by ma_device_uninit(). It looks like - AudioUnitGetProprty (called below) and AudioComponentInstanceDispose (called in ma_device_uninit) - can try waiting on the same lock. I'm going to try working around this by not calling any Core - Audio APIs in the callback when the device has been stopped or uninitialized. - */ - if (ma_device_get_state(pDevice) == ma_device_state_uninitialized || ma_device_get_state(pDevice) == ma_device_state_stopping || ma_device_get_state(pDevice) == ma_device_state_stopped) { - ma_device__on_notification_stopped(pDevice); - } else { - UInt32 isRunning; - UInt32 isRunningSize = sizeof(isRunning); - OSStatus status = ((ma_AudioUnitGetProperty_proc)pDevice->pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioOutputUnitProperty_IsRunning, scope, element, &isRunning, &isRunningSize); - if (status != noErr) { - goto done; /* Don't really know what to do in this case... just ignore it, I suppose... */ - } - - if (!isRunning) { - /* - The stop event is a bit annoying in Core Audio because it will be called when we automatically switch the default device. Some scenarios to consider: - - 1) When the device is unplugged, this will be called _before_ the default device change notification. - 2) When the device is changed via the default device change notification, this will be called _after_ the switch. - - For case #1, we just check if there's a new default device available. If so, we just ignore the stop event. For case #2 we check a flag. - */ - if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isDefaultPlaybackDevice) || - ((audioUnit == pDevice->coreaudio.audioUnitCapture) && pDevice->coreaudio.isDefaultCaptureDevice)) { - /* - It looks like the device is switching through an external event, such as the user unplugging the device or changing the default device - via the operating system's sound settings. If we're re-initializing the device, we just terminate because we want the stopping of the - device to be seamless to the client (we don't want them receiving the stopped event and thinking that the device has stopped when it - hasn't!). - */ - if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isSwitchingPlaybackDevice) || - ((audioUnit == pDevice->coreaudio.audioUnitCapture) && pDevice->coreaudio.isSwitchingCaptureDevice)) { - goto done; - } - - /* - Getting here means the device is not reinitializing which means it may have been unplugged. From what I can see, it looks like Core Audio - will try switching to the new default device seamlessly. We need to somehow find a way to determine whether or not Core Audio will most - likely be successful in switching to the new device. - - TODO: Try to predict if Core Audio will switch devices. If not, the stopped callback needs to be posted. - */ - goto done; - } - - /* Getting here means we need to stop the device. */ - ma_device__on_notification_stopped(pDevice); - } - } - - (void)propertyID; /* Unused. */ - -done: - /* Always signal the stop event. It's possible for the "else" case to get hit which can happen during an interruption. */ - ma_event_signal(&pDevice->coreaudio.stopEvent); -} - -#if defined(MA_APPLE_DESKTOP) -static ma_spinlock g_DeviceTrackingInitLock_CoreAudio = 0; /* A spinlock for mutal exclusion of the init/uninit of the global tracking data. Initialization to 0 is what we need. */ -static ma_uint32 g_DeviceTrackingInitCounter_CoreAudio = 0; -static ma_mutex g_DeviceTrackingMutex_CoreAudio; -static ma_device** g_ppTrackedDevices_CoreAudio = NULL; -static ma_uint32 g_TrackedDeviceCap_CoreAudio = 0; -static ma_uint32 g_TrackedDeviceCount_CoreAudio = 0; - -static OSStatus ma_default_device_changed__coreaudio(AudioObjectID objectID, UInt32 addressCount, const AudioObjectPropertyAddress* pAddresses, void* pUserData) -{ - ma_device_type deviceType; - - /* Not sure if I really need to check this, but it makes me feel better. */ - if (addressCount == 0) { - return noErr; - } - - if (pAddresses[0].mSelector == kAudioHardwarePropertyDefaultOutputDevice) { - deviceType = ma_device_type_playback; - } else if (pAddresses[0].mSelector == kAudioHardwarePropertyDefaultInputDevice) { - deviceType = ma_device_type_capture; - } else { - return noErr; /* Should never hit this. */ - } - - ma_mutex_lock(&g_DeviceTrackingMutex_CoreAudio); - { - ma_uint32 iDevice; - for (iDevice = 0; iDevice < g_TrackedDeviceCount_CoreAudio; iDevice += 1) { - ma_result reinitResult; - ma_device* pDevice; - - pDevice = g_ppTrackedDevices_CoreAudio[iDevice]; - if (pDevice->type == deviceType || pDevice->type == ma_device_type_duplex) { - if (deviceType == ma_device_type_playback) { - pDevice->coreaudio.isSwitchingPlaybackDevice = MA_TRUE; - reinitResult = ma_device_reinit_internal__coreaudio(pDevice, deviceType, MA_TRUE); - pDevice->coreaudio.isSwitchingPlaybackDevice = MA_FALSE; - } else { - pDevice->coreaudio.isSwitchingCaptureDevice = MA_TRUE; - reinitResult = ma_device_reinit_internal__coreaudio(pDevice, deviceType, MA_TRUE); - pDevice->coreaudio.isSwitchingCaptureDevice = MA_FALSE; - } - - if (reinitResult == MA_SUCCESS) { - ma_device__post_init_setup(pDevice, deviceType); - - /* Restart the device if required. If this fails we need to stop the device entirely. */ - if (ma_device_get_state(pDevice) == ma_device_state_started) { - OSStatus status; - if (deviceType == ma_device_type_playback) { - status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitPlayback); - if (status != noErr) { - if (pDevice->type == ma_device_type_duplex) { - ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - } - ma_device__set_state(pDevice, ma_device_state_stopped); - } - } else if (deviceType == ma_device_type_capture) { - status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - if (status != noErr) { - if (pDevice->type == ma_device_type_duplex) { - ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback); - } - ma_device__set_state(pDevice, ma_device_state_stopped); - } - } - } - - ma_device__on_notification_rerouted(pDevice); - } - } - } - } - ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio); - - /* Unused parameters. */ - (void)objectID; - (void)pUserData; - - return noErr; -} - -static ma_result ma_context__init_device_tracking__coreaudio(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - - ma_spinlock_lock(&g_DeviceTrackingInitLock_CoreAudio); - { - /* Don't do anything if we've already initializd device tracking. */ - if (g_DeviceTrackingInitCounter_CoreAudio == 0) { - AudioObjectPropertyAddress propAddress; - propAddress.mScope = kAudioObjectPropertyScopeGlobal; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - ma_mutex_init(&g_DeviceTrackingMutex_CoreAudio); - - propAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice; - ((ma_AudioObjectAddPropertyListener_proc)pContext->coreaudio.AudioObjectAddPropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL); - - propAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; - ((ma_AudioObjectAddPropertyListener_proc)pContext->coreaudio.AudioObjectAddPropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL); - - } - g_DeviceTrackingInitCounter_CoreAudio += 1; - } - ma_spinlock_unlock(&g_DeviceTrackingInitLock_CoreAudio); - - return MA_SUCCESS; -} - -static ma_result ma_context__uninit_device_tracking__coreaudio(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - - ma_spinlock_lock(&g_DeviceTrackingInitLock_CoreAudio); - { - if (g_DeviceTrackingInitCounter_CoreAudio > 0) - g_DeviceTrackingInitCounter_CoreAudio -= 1; - - if (g_DeviceTrackingInitCounter_CoreAudio == 0) { - AudioObjectPropertyAddress propAddress; - propAddress.mScope = kAudioObjectPropertyScopeGlobal; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - propAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice; - ((ma_AudioObjectRemovePropertyListener_proc)pContext->coreaudio.AudioObjectRemovePropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL); - - propAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; - ((ma_AudioObjectRemovePropertyListener_proc)pContext->coreaudio.AudioObjectRemovePropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL); - - /* At this point there should be no tracked devices. If not there's an error somewhere. */ - if (g_ppTrackedDevices_CoreAudio != NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "You have uninitialized all contexts while an associated device is still active."); - ma_spinlock_unlock(&g_DeviceTrackingInitLock_CoreAudio); - return MA_INVALID_OPERATION; - } - - ma_mutex_uninit(&g_DeviceTrackingMutex_CoreAudio); - } - } - ma_spinlock_unlock(&g_DeviceTrackingInitLock_CoreAudio); - - return MA_SUCCESS; -} - -static ma_result ma_device__track__coreaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - ma_mutex_lock(&g_DeviceTrackingMutex_CoreAudio); - { - /* Allocate memory if required. */ - if (g_TrackedDeviceCap_CoreAudio <= g_TrackedDeviceCount_CoreAudio) { - ma_uint32 newCap; - ma_device** ppNewDevices; - - newCap = g_TrackedDeviceCap_CoreAudio * 2; - if (newCap == 0) { - newCap = 1; - } - - ppNewDevices = (ma_device**)ma_realloc(g_ppTrackedDevices_CoreAudio, sizeof(*g_ppTrackedDevices_CoreAudio)*newCap, &pDevice->pContext->allocationCallbacks); - if (ppNewDevices == NULL) { - ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio); - return MA_OUT_OF_MEMORY; - } - - g_ppTrackedDevices_CoreAudio = ppNewDevices; - g_TrackedDeviceCap_CoreAudio = newCap; - } - - g_ppTrackedDevices_CoreAudio[g_TrackedDeviceCount_CoreAudio] = pDevice; - g_TrackedDeviceCount_CoreAudio += 1; - } - ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio); - - return MA_SUCCESS; -} - -static ma_result ma_device__untrack__coreaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - ma_mutex_lock(&g_DeviceTrackingMutex_CoreAudio); - { - ma_uint32 iDevice; - for (iDevice = 0; iDevice < g_TrackedDeviceCount_CoreAudio; iDevice += 1) { - if (g_ppTrackedDevices_CoreAudio[iDevice] == pDevice) { - /* We've found the device. We now need to remove it from the list. */ - ma_uint32 jDevice; - for (jDevice = iDevice; jDevice < g_TrackedDeviceCount_CoreAudio-1; jDevice += 1) { - g_ppTrackedDevices_CoreAudio[jDevice] = g_ppTrackedDevices_CoreAudio[jDevice+1]; - } - - g_TrackedDeviceCount_CoreAudio -= 1; - - /* If there's nothing else in the list we need to free memory. */ - if (g_TrackedDeviceCount_CoreAudio == 0) { - ma_free(g_ppTrackedDevices_CoreAudio, &pDevice->pContext->allocationCallbacks); - g_ppTrackedDevices_CoreAudio = NULL; - g_TrackedDeviceCap_CoreAudio = 0; - } - - break; - } - } - } - ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio); - - return MA_SUCCESS; -} -#endif - -#if defined(MA_APPLE_MOBILE) -@interface ma_ios_notification_handler:NSObject { - ma_device* m_pDevice; -} -@end - -@implementation ma_ios_notification_handler --(id)init:(ma_device*)pDevice -{ - self = [super init]; - m_pDevice = pDevice; - - /* For route changes. */ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handle_route_change:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]]; - - /* For interruptions. */ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handle_interruption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]]; - - return self; -} - --(void)dealloc -{ - [self remove_handler]; - - #if defined(__has_feature) - #if !__has_feature(objc_arc) - [super dealloc]; - #endif - #endif -} - --(void)remove_handler -{ - [[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionRouteChangeNotification object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionInterruptionNotification object:nil]; -} - --(void)handle_interruption:(NSNotification*)pNotification -{ - NSInteger type = [[[pNotification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] integerValue]; - switch (type) - { - case AVAudioSessionInterruptionTypeBegan: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Interruption: AVAudioSessionInterruptionTypeBegan\n"); - - /* - Core Audio will have stopped the internal device automatically, but we need explicitly - stop it at a higher level to ensure miniaudio-specific state is updated for consistency. - */ - ma_device_stop(m_pDevice); - - /* - Fire the notification after the device has been stopped to ensure it's in the correct - state when the notification handler is invoked. - */ - ma_device__on_notification_interruption_began(m_pDevice); - } break; - - case AVAudioSessionInterruptionTypeEnded: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Interruption: AVAudioSessionInterruptionTypeEnded\n"); - ma_device__on_notification_interruption_ended(m_pDevice); - } break; - } -} - --(void)handle_route_change:(NSNotification*)pNotification -{ - AVAudioSession* pSession = [AVAudioSession sharedInstance]; - - NSInteger reason = [[[pNotification userInfo] objectForKey:AVAudioSessionRouteChangeReasonKey] integerValue]; - switch (reason) - { - case AVAudioSessionRouteChangeReasonOldDeviceUnavailable: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonOldDeviceUnavailable\n"); - } break; - - case AVAudioSessionRouteChangeReasonNewDeviceAvailable: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonNewDeviceAvailable\n"); - } break; - - case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory\n"); - } break; - - case AVAudioSessionRouteChangeReasonWakeFromSleep: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonWakeFromSleep\n"); - } break; - - case AVAudioSessionRouteChangeReasonOverride: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonOverride\n"); - } break; - - case AVAudioSessionRouteChangeReasonCategoryChange: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonCategoryChange\n"); - } break; - - case AVAudioSessionRouteChangeReasonUnknown: - default: - { - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, "[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonUnknown\n"); - } break; - } - - ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_DEBUG, "[Core Audio] Changing Route. inputNumberChannels=%d; outputNumberOfChannels=%d\n", (int)pSession.inputNumberOfChannels, (int)pSession.outputNumberOfChannels); - - /* Let the application know about the route change. */ - ma_device__on_notification_rerouted(m_pDevice); -} -@end -#endif - -static ma_result ma_device_uninit__coreaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_uninitialized); - -#if defined(MA_APPLE_DESKTOP) - /* - Make sure we're no longer tracking the device. It doesn't matter if we call this for a non-default device because it'll - just gracefully ignore it. - */ - ma_device__untrack__coreaudio(pDevice); -#endif -#if defined(MA_APPLE_MOBILE) - if (pDevice->coreaudio.pNotificationHandler != NULL) { - ma_ios_notification_handler* pNotificationHandler = (MA_BRIDGE_TRANSFER ma_ios_notification_handler*)pDevice->coreaudio.pNotificationHandler; - [pNotificationHandler remove_handler]; - } -#endif - - if (pDevice->coreaudio.audioUnitCapture != NULL) { - ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - } - if (pDevice->coreaudio.audioUnitPlayback != NULL) { - ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitPlayback); - } - - if (pDevice->coreaudio.pAudioBufferList) { - ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks); - } - - return MA_SUCCESS; -} - -typedef struct -{ - ma_bool32 allowNominalSampleRateChange; - - /* Input. */ - ma_format formatIn; - ma_uint32 channelsIn; - ma_uint32 sampleRateIn; - ma_channel channelMapIn[MA_MAX_CHANNELS]; - ma_uint32 periodSizeInFramesIn; - ma_uint32 periodSizeInMillisecondsIn; - ma_uint32 periodsIn; - ma_share_mode shareMode; - ma_performance_profile performanceProfile; - ma_bool32 registerStopEvent; - - /* Output. */ -#if defined(MA_APPLE_DESKTOP) - AudioObjectID deviceObjectID; -#endif - AudioComponent component; - AudioUnit audioUnit; - AudioBufferList* pAudioBufferList; /* Only used for input devices. */ - ma_format formatOut; - ma_uint32 channelsOut; - ma_uint32 sampleRateOut; - ma_channel channelMapOut[MA_MAX_CHANNELS]; - ma_uint32 periodSizeInFramesOut; - ma_uint32 periodsOut; - char deviceName[256]; -} ma_device_init_internal_data__coreaudio; - -static ma_result ma_device_init_internal__coreaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_init_internal_data__coreaudio* pData, void* pDevice_DoNotReference) /* <-- pDevice is typed as void* intentionally so as to avoid accidentally referencing it. */ -{ - ma_result result; - OSStatus status; - UInt32 enableIOFlag; - AudioStreamBasicDescription bestFormat; - UInt32 actualPeriodSizeInFrames; - AURenderCallbackStruct callbackInfo; -#if defined(MA_APPLE_DESKTOP) - AudioObjectID deviceObjectID; -#endif - - /* This API should only be used for a single device type: playback or capture. No full-duplex mode. */ - if (deviceType == ma_device_type_duplex) { - return MA_INVALID_ARGS; - } - - MA_ASSERT(pContext != NULL); - MA_ASSERT(deviceType == ma_device_type_playback || deviceType == ma_device_type_capture); - -#if defined(MA_APPLE_DESKTOP) - pData->deviceObjectID = 0; -#endif - pData->component = NULL; - pData->audioUnit = NULL; - pData->pAudioBufferList = NULL; - -#if defined(MA_APPLE_DESKTOP) - result = ma_find_AudioObjectID(pContext, deviceType, pDeviceID, &deviceObjectID); - if (result != MA_SUCCESS) { - return result; - } - - pData->deviceObjectID = deviceObjectID; -#endif - - /* Core audio doesn't really use the notion of a period so we can leave this unmodified, but not too over the top. */ - pData->periodsOut = pData->periodsIn; - if (pData->periodsOut == 0) { - pData->periodsOut = MA_DEFAULT_PERIODS; - } - if (pData->periodsOut > 16) { - pData->periodsOut = 16; - } - - - /* Audio unit. */ - status = ((ma_AudioComponentInstanceNew_proc)pContext->coreaudio.AudioComponentInstanceNew)((AudioComponent)pContext->coreaudio.component, (AudioUnit*)&pData->audioUnit); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - - - /* The input/output buses need to be explicitly enabled and disabled. We set the flag based on the output unit first, then we just swap it for input. */ - enableIOFlag = 1; - if (deviceType == ma_device_type_capture) { - enableIOFlag = 0; - } - - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, MA_COREAUDIO_OUTPUT_BUS, &enableIOFlag, sizeof(enableIOFlag)); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - - enableIOFlag = (enableIOFlag == 0) ? 1 : 0; - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, MA_COREAUDIO_INPUT_BUS, &enableIOFlag, sizeof(enableIOFlag)); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - - - /* Set the device to use with this audio unit. This is only used on desktop since we are using defaults on mobile. */ -#if defined(MA_APPLE_DESKTOP) - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &deviceObjectID, sizeof(deviceObjectID)); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(result); - } -#else - /* - For some reason it looks like Apple is only allowing selection of the input device. There does not appear to be any way to change - the default output route. I have no idea why this is like this, but for now we'll only be able to configure capture devices. - */ - if (pDeviceID != NULL) { - if (deviceType == ma_device_type_capture) { - ma_bool32 found = MA_FALSE; - NSArray *pInputs = [[[AVAudioSession sharedInstance] currentRoute] inputs]; - for (AVAudioSessionPortDescription* pPortDesc in pInputs) { - if (strcmp(pDeviceID->coreaudio, [pPortDesc.UID UTF8String]) == 0) { - [[AVAudioSession sharedInstance] setPreferredInput:pPortDesc error:nil]; - found = MA_TRUE; - break; - } - } - - if (found == MA_FALSE) { - return MA_DOES_NOT_EXIST; - } - } - } -#endif - - /* - Format. This is the hardest part of initialization because there's a few variables to take into account. - 1) The format must be supported by the device. - 2) The format must be supported miniaudio. - 3) There's a priority that miniaudio prefers. - - Ideally we would like to use a format that's as close to the hardware as possible so we can get as close to a passthrough as possible. The - most important property is the sample rate. miniaudio can do format conversion for any sample rate and channel count, but cannot do the same - for the sample data format. If the sample data format is not supported by miniaudio it must be ignored completely. - - On mobile platforms this is a bit different. We just force the use of whatever the audio unit's current format is set to. - */ - { - AudioStreamBasicDescription origFormat; - UInt32 origFormatSize = sizeof(origFormat); - AudioUnitScope formatScope = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output; - AudioUnitElement formatElement = (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS; - - if (deviceType == ma_device_type_playback) { - status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, MA_COREAUDIO_OUTPUT_BUS, &origFormat, &origFormatSize); - } else { - status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, MA_COREAUDIO_INPUT_BUS, &origFormat, &origFormatSize); - } - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - - #if defined(MA_APPLE_DESKTOP) - result = ma_find_best_format__coreaudio(pContext, deviceObjectID, deviceType, pData->formatIn, pData->channelsIn, pData->sampleRateIn, &origFormat, &bestFormat); - if (result != MA_SUCCESS) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return result; - } - - /* - Technical Note TN2091: Device input using the HAL Output Audio Unit - https://developer.apple.com/library/archive/technotes/tn2091/_index.html - - This documentation says the following: - - The internal AudioConverter can handle any *simple* conversion. Typically, this means that a client can specify ANY - variant of the PCM formats. Consequently, the device's sample rate should match the desired sample rate. If sample rate - conversion is needed, it can be accomplished by buffering the input and converting the data on a separate thread with - another AudioConverter. - - The important part here is the mention that it can handle *simple* conversions, which does *not* include sample rate. We - therefore want to ensure the sample rate stays consistent. This document is specifically for input, but I'm going to play it - safe and apply the same rule to output as well. - - I have tried going against the documentation by setting the sample rate anyway, but this just results in AudioUnitRender() - returning a result code of -10863. I have also tried changing the format directly on the input scope on the input bus, but - this just results in `ca_require: IsStreamFormatWritable(inScope, inElement) NotWritable` when trying to set the format. - - Something that does seem to work, however, has been setting the nominal sample rate on the deivce object. The problem with - this, however, is that it actually changes the sample rate at the operating system level and not just the application. This - could be intrusive to the user, however, so I don't think it's wise to make this the default. Instead I'm making this a - configuration option. When the `coreaudio.allowNominalSampleRateChange` config option is set to true, changing the sample - rate will be allowed. Otherwise it'll be fixed to the current sample rate. To check the system-defined sample rate, run - the Audio MIDI Setup program that comes installed on macOS and observe how the sample rate changes as the sample rate is - changed by miniaudio. - */ - if (pData->allowNominalSampleRateChange) { - AudioValueRange sampleRateRange; - AudioObjectPropertyAddress propAddress; - - sampleRateRange.mMinimum = bestFormat.mSampleRate; - sampleRateRange.mMaximum = bestFormat.mSampleRate; - - propAddress.mSelector = kAudioDevicePropertyNominalSampleRate; - propAddress.mScope = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput; - propAddress.mElement = kAudioObjectPropertyElementMaster; - - status = ((ma_AudioObjectSetPropertyData_proc)pContext->coreaudio.AudioObjectSetPropertyData)(deviceObjectID, &propAddress, 0, NULL, sizeof(sampleRateRange), &sampleRateRange); - if (status != noErr) { - bestFormat.mSampleRate = origFormat.mSampleRate; - } - } else { - bestFormat.mSampleRate = origFormat.mSampleRate; - } - - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, sizeof(bestFormat)); - if (status != noErr) { - /* We failed to set the format, so fall back to the current format of the audio unit. */ - bestFormat = origFormat; - } - #else - bestFormat = origFormat; - - /* - Sample rate is a little different here because for some reason kAudioUnitProperty_StreamFormat returns 0... Oh well. We need to instead try - setting the sample rate to what the user has requested and then just see the results of it. Need to use some Objective-C here for this since - it depends on Apple's AVAudioSession API. To do this we just get the shared AVAudioSession instance and then set it. Note that from what I - can tell, it looks like the sample rate is shared between playback and capture for everything. - */ - @autoreleasepool { - AVAudioSession* pAudioSession = [AVAudioSession sharedInstance]; - MA_ASSERT(pAudioSession != NULL); - - [pAudioSession setPreferredSampleRate:(double)pData->sampleRateIn error:nil]; - bestFormat.mSampleRate = pAudioSession.sampleRate; - - /* - I've had a report that the channel count returned by AudioUnitGetProperty above is inconsistent with - AVAudioSession outputNumberOfChannels. I'm going to try using the AVAudioSession values instead. - */ - if (deviceType == ma_device_type_playback) { - bestFormat.mChannelsPerFrame = (UInt32)pAudioSession.outputNumberOfChannels; - } - if (deviceType == ma_device_type_capture) { - bestFormat.mChannelsPerFrame = (UInt32)pAudioSession.inputNumberOfChannels; - } - } - - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, sizeof(bestFormat)); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - #endif - - result = ma_format_from_AudioStreamBasicDescription(&bestFormat, &pData->formatOut); - if (result != MA_SUCCESS) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return result; - } - - if (pData->formatOut == ma_format_unknown) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return MA_FORMAT_NOT_SUPPORTED; - } - - pData->channelsOut = bestFormat.mChannelsPerFrame; - pData->sampleRateOut = bestFormat.mSampleRate; - } - - /* Clamp the channel count for safety. */ - if (pData->channelsOut > MA_MAX_CHANNELS) { - pData->channelsOut = MA_MAX_CHANNELS; - } - - /* - Internal channel map. This is weird in my testing. If I use the AudioObject to get the - channel map, the channel descriptions are set to "Unknown" for some reason. To work around - this it looks like retrieving it from the AudioUnit will work. However, and this is where - it gets weird, it doesn't seem to work with capture devices, nor at all on iOS... Therefore - I'm going to fall back to a default assumption in these cases. - */ -#if defined(MA_APPLE_DESKTOP) - result = ma_get_AudioUnit_channel_map(pContext, pData->audioUnit, deviceType, pData->channelMapOut, pData->channelsOut); - if (result != MA_SUCCESS) { - #if 0 - /* Try falling back to the channel map from the AudioObject. */ - result = ma_get_AudioObject_channel_map(pContext, deviceObjectID, deviceType, pData->channelMapOut, pData->channelsOut); - if (result != MA_SUCCESS) { - return result; - } - #else - /* Fall back to default assumptions. */ - ma_channel_map_init_standard(ma_standard_channel_map_default, pData->channelMapOut, ma_countof(pData->channelMapOut), pData->channelsOut); - #endif - } -#else - /* TODO: Figure out how to get the channel map using AVAudioSession. */ - ma_channel_map_init_standard(ma_standard_channel_map_default, pData->channelMapOut, ma_countof(pData->channelMapOut), pData->channelsOut); -#endif - - - /* Buffer size. Not allowing this to be configurable on iOS. */ - if (pData->periodSizeInFramesIn == 0) { - if (pData->periodSizeInMillisecondsIn == 0) { - if (pData->performanceProfile == ma_performance_profile_low_latency) { - actualPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY, pData->sampleRateOut); - } else { - actualPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE, pData->sampleRateOut); - } - } else { - actualPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pData->periodSizeInMillisecondsIn, pData->sampleRateOut); - } - } else { - actualPeriodSizeInFrames = pData->periodSizeInFramesIn; - } - -#if defined(MA_APPLE_DESKTOP) - result = ma_set_AudioObject_buffer_size_in_frames(pContext, deviceObjectID, deviceType, &actualPeriodSizeInFrames); - if (result != MA_SUCCESS) { - return result; - } -#else - /* - On iOS, the size of the IO buffer needs to be specified in seconds and is a floating point - number. I don't trust any potential truncation errors due to converting from float to integer - so I'm going to explicitly set the actual period size to the next power of 2. - */ - @autoreleasepool { - AVAudioSession* pAudioSession = [AVAudioSession sharedInstance]; - MA_ASSERT(pAudioSession != NULL); - - [pAudioSession setPreferredIOBufferDuration:((float)actualPeriodSizeInFrames / pAudioSession.sampleRate) error:nil]; - actualPeriodSizeInFrames = ma_next_power_of_2((ma_uint32)(pAudioSession.IOBufferDuration * pAudioSession.sampleRate)); - } -#endif - - - /* - During testing I discovered that the buffer size can be too big. You'll get an error like this: - - kAudioUnitErr_TooManyFramesToProcess : inFramesToProcess=4096, mMaxFramesPerSlice=512 - - Note how inFramesToProcess is smaller than mMaxFramesPerSlice. To fix, we need to set kAudioUnitProperty_MaximumFramesPerSlice to that - of the size of our buffer, or do it the other way around and set our buffer size to the kAudioUnitProperty_MaximumFramesPerSlice. - */ - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &actualPeriodSizeInFrames, sizeof(actualPeriodSizeInFrames)); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - - pData->periodSizeInFramesOut = (ma_uint32)actualPeriodSizeInFrames; - - /* We need a buffer list if this is an input device. We render into this in the input callback. */ - if (deviceType == ma_device_type_capture) { - ma_bool32 isInterleaved = (bestFormat.mFormatFlags & kAudioFormatFlagIsNonInterleaved) == 0; - AudioBufferList* pBufferList; - - pBufferList = ma_allocate_AudioBufferList__coreaudio(pData->periodSizeInFramesOut, pData->formatOut, pData->channelsOut, (isInterleaved) ? ma_stream_layout_interleaved : ma_stream_layout_deinterleaved, &pContext->allocationCallbacks); - if (pBufferList == NULL) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return MA_OUT_OF_MEMORY; - } - - pData->pAudioBufferList = pBufferList; - } - - /* Callbacks. */ - callbackInfo.inputProcRefCon = pDevice_DoNotReference; - if (deviceType == ma_device_type_playback) { - callbackInfo.inputProc = ma_on_output__coreaudio; - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callbackInfo, sizeof(callbackInfo)); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - } else { - callbackInfo.inputProc = ma_on_input__coreaudio; - status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &callbackInfo, sizeof(callbackInfo)); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - } - - /* We need to listen for stop events. */ - if (pData->registerStopEvent) { - status = ((ma_AudioUnitAddPropertyListener_proc)pContext->coreaudio.AudioUnitAddPropertyListener)(pData->audioUnit, kAudioOutputUnitProperty_IsRunning, on_start_stop__coreaudio, pDevice_DoNotReference); - if (status != noErr) { - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - } - - /* Initialize the audio unit. */ - status = ((ma_AudioUnitInitialize_proc)pContext->coreaudio.AudioUnitInitialize)(pData->audioUnit); - if (status != noErr) { - ma_free(pData->pAudioBufferList, &pContext->allocationCallbacks); - pData->pAudioBufferList = NULL; - ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit); - return ma_result_from_OSStatus(status); - } - - /* Grab the name. */ -#if defined(MA_APPLE_DESKTOP) - ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(pData->deviceName), pData->deviceName); -#else - if (deviceType == ma_device_type_playback) { - ma_strcpy_s(pData->deviceName, sizeof(pData->deviceName), MA_DEFAULT_PLAYBACK_DEVICE_NAME); - } else { - ma_strcpy_s(pData->deviceName, sizeof(pData->deviceName), MA_DEFAULT_CAPTURE_DEVICE_NAME); - } -#endif - - return result; -} - -#if defined(MA_APPLE_DESKTOP) -static ma_result ma_device_reinit_internal__coreaudio(ma_device* pDevice, ma_device_type deviceType, ma_bool32 disposePreviousAudioUnit) -{ - ma_device_init_internal_data__coreaudio data; - ma_result result; - - /* This should only be called for playback or capture, not duplex. */ - if (deviceType == ma_device_type_duplex) { - return MA_INVALID_ARGS; - } - - data.allowNominalSampleRateChange = MA_FALSE; /* Don't change the nominal sample rate when switching devices. */ - - if (deviceType == ma_device_type_capture) { - data.formatIn = pDevice->capture.format; - data.channelsIn = pDevice->capture.channels; - data.sampleRateIn = pDevice->sampleRate; - MA_COPY_MEMORY(data.channelMapIn, pDevice->capture.channelMap, sizeof(pDevice->capture.channelMap)); - data.shareMode = pDevice->capture.shareMode; - data.performanceProfile = pDevice->coreaudio.originalPerformanceProfile; - data.registerStopEvent = MA_TRUE; - - if (disposePreviousAudioUnit) { - ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - } - if (pDevice->coreaudio.pAudioBufferList) { - ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks); - } - } else if (deviceType == ma_device_type_playback) { - data.formatIn = pDevice->playback.format; - data.channelsIn = pDevice->playback.channels; - data.sampleRateIn = pDevice->sampleRate; - MA_COPY_MEMORY(data.channelMapIn, pDevice->playback.channelMap, sizeof(pDevice->playback.channelMap)); - data.shareMode = pDevice->playback.shareMode; - data.performanceProfile = pDevice->coreaudio.originalPerformanceProfile; - data.registerStopEvent = (pDevice->type != ma_device_type_duplex); - - if (disposePreviousAudioUnit) { - ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback); - ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitPlayback); - } - } - data.periodSizeInFramesIn = pDevice->coreaudio.originalPeriodSizeInFrames; - data.periodSizeInMillisecondsIn = pDevice->coreaudio.originalPeriodSizeInMilliseconds; - data.periodsIn = pDevice->coreaudio.originalPeriods; - - /* Need at least 3 periods for duplex. */ - if (data.periodsIn < 3 && pDevice->type == ma_device_type_duplex) { - data.periodsIn = 3; - } - - result = ma_device_init_internal__coreaudio(pDevice->pContext, deviceType, NULL, &data, (void*)pDevice); - if (result != MA_SUCCESS) { - return result; - } - - if (deviceType == ma_device_type_capture) { - #if defined(MA_APPLE_DESKTOP) - pDevice->coreaudio.deviceObjectIDCapture = (ma_uint32)data.deviceObjectID; - ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDCapture, sizeof(pDevice->capture.id.coreaudio), pDevice->capture.id.coreaudio); - #endif - pDevice->coreaudio.audioUnitCapture = (ma_ptr)data.audioUnit; - pDevice->coreaudio.pAudioBufferList = (ma_ptr)data.pAudioBufferList; - pDevice->coreaudio.audioBufferCapInFrames = data.periodSizeInFramesOut; - - pDevice->capture.internalFormat = data.formatOut; - pDevice->capture.internalChannels = data.channelsOut; - pDevice->capture.internalSampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDevice->capture.internalPeriodSizeInFrames = data.periodSizeInFramesOut; - pDevice->capture.internalPeriods = data.periodsOut; - } else if (deviceType == ma_device_type_playback) { - #if defined(MA_APPLE_DESKTOP) - pDevice->coreaudio.deviceObjectIDPlayback = (ma_uint32)data.deviceObjectID; - ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDPlayback, sizeof(pDevice->playback.id.coreaudio), pDevice->playback.id.coreaudio); - #endif - pDevice->coreaudio.audioUnitPlayback = (ma_ptr)data.audioUnit; - - pDevice->playback.internalFormat = data.formatOut; - pDevice->playback.internalChannels = data.channelsOut; - pDevice->playback.internalSampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDevice->playback.internalPeriodSizeInFrames = data.periodSizeInFramesOut; - pDevice->playback.internalPeriods = data.periodsOut; - } - - return MA_SUCCESS; -} -#endif /* MA_APPLE_DESKTOP */ - -static ma_result ma_device_init__coreaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - ma_result result; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pConfig != NULL); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* No exclusive mode with the Core Audio backend for now. */ - if (((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode == ma_share_mode_exclusive) || - ((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive)) { - return MA_SHARE_MODE_NOT_SUPPORTED; - } - - /* Capture needs to be initialized first. */ - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_device_init_internal_data__coreaudio data; - data.allowNominalSampleRateChange = pConfig->coreaudio.allowNominalSampleRateChange; - data.formatIn = pDescriptorCapture->format; - data.channelsIn = pDescriptorCapture->channels; - data.sampleRateIn = pDescriptorCapture->sampleRate; - MA_COPY_MEMORY(data.channelMapIn, pDescriptorCapture->channelMap, sizeof(pDescriptorCapture->channelMap)); - data.periodSizeInFramesIn = pDescriptorCapture->periodSizeInFrames; - data.periodSizeInMillisecondsIn = pDescriptorCapture->periodSizeInMilliseconds; - data.periodsIn = pDescriptorCapture->periodCount; - data.shareMode = pDescriptorCapture->shareMode; - data.performanceProfile = pConfig->performanceProfile; - data.registerStopEvent = MA_TRUE; - - /* Need at least 3 periods for duplex. */ - if (data.periodsIn < 3 && pConfig->deviceType == ma_device_type_duplex) { - data.periodsIn = 3; - } - - result = ma_device_init_internal__coreaudio(pDevice->pContext, ma_device_type_capture, pDescriptorCapture->pDeviceID, &data, (void*)pDevice); - if (result != MA_SUCCESS) { - return result; - } - - pDevice->coreaudio.isDefaultCaptureDevice = (pConfig->capture.pDeviceID == NULL); - #if defined(MA_APPLE_DESKTOP) - pDevice->coreaudio.deviceObjectIDCapture = (ma_uint32)data.deviceObjectID; - #endif - pDevice->coreaudio.audioUnitCapture = (ma_ptr)data.audioUnit; - pDevice->coreaudio.pAudioBufferList = (ma_ptr)data.pAudioBufferList; - pDevice->coreaudio.audioBufferCapInFrames = data.periodSizeInFramesOut; - pDevice->coreaudio.originalPeriodSizeInFrames = pDescriptorCapture->periodSizeInFrames; - pDevice->coreaudio.originalPeriodSizeInMilliseconds = pDescriptorCapture->periodSizeInMilliseconds; - pDevice->coreaudio.originalPeriods = pDescriptorCapture->periodCount; - pDevice->coreaudio.originalPerformanceProfile = pConfig->performanceProfile; - - pDescriptorCapture->format = data.formatOut; - pDescriptorCapture->channels = data.channelsOut; - pDescriptorCapture->sampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDescriptorCapture->channelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDescriptorCapture->periodSizeInFrames = data.periodSizeInFramesOut; - pDescriptorCapture->periodCount = data.periodsOut; - - #if defined(MA_APPLE_DESKTOP) - ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDCapture, sizeof(pDevice->capture.id.coreaudio), pDevice->capture.id.coreaudio); - - /* - If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly - switch the device in the background. - */ - if (pConfig->capture.pDeviceID == NULL) { - ma_device__track__coreaudio(pDevice); - } - #endif - } - - /* Playback. */ - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_device_init_internal_data__coreaudio data; - data.allowNominalSampleRateChange = pConfig->coreaudio.allowNominalSampleRateChange; - data.formatIn = pDescriptorPlayback->format; - data.channelsIn = pDescriptorPlayback->channels; - data.sampleRateIn = pDescriptorPlayback->sampleRate; - MA_COPY_MEMORY(data.channelMapIn, pDescriptorPlayback->channelMap, sizeof(pDescriptorPlayback->channelMap)); - data.shareMode = pDescriptorPlayback->shareMode; - data.performanceProfile = pConfig->performanceProfile; - - /* In full-duplex mode we want the playback buffer to be the same size as the capture buffer. */ - if (pConfig->deviceType == ma_device_type_duplex) { - data.periodSizeInFramesIn = pDescriptorCapture->periodSizeInFrames; - data.periodsIn = pDescriptorCapture->periodCount; - data.registerStopEvent = MA_FALSE; - } else { - data.periodSizeInFramesIn = pDescriptorPlayback->periodSizeInFrames; - data.periodSizeInMillisecondsIn = pDescriptorPlayback->periodSizeInMilliseconds; - data.periodsIn = pDescriptorPlayback->periodCount; - data.registerStopEvent = MA_TRUE; - } - - result = ma_device_init_internal__coreaudio(pDevice->pContext, ma_device_type_playback, pDescriptorPlayback->pDeviceID, &data, (void*)pDevice); - if (result != MA_SUCCESS) { - if (pConfig->deviceType == ma_device_type_duplex) { - ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - if (pDevice->coreaudio.pAudioBufferList) { - ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks); - } - } - return result; - } - - pDevice->coreaudio.isDefaultPlaybackDevice = (pConfig->playback.pDeviceID == NULL); - #if defined(MA_APPLE_DESKTOP) - pDevice->coreaudio.deviceObjectIDPlayback = (ma_uint32)data.deviceObjectID; - #endif - pDevice->coreaudio.audioUnitPlayback = (ma_ptr)data.audioUnit; - pDevice->coreaudio.originalPeriodSizeInFrames = pDescriptorPlayback->periodSizeInFrames; - pDevice->coreaudio.originalPeriodSizeInMilliseconds = pDescriptorPlayback->periodSizeInMilliseconds; - pDevice->coreaudio.originalPeriods = pDescriptorPlayback->periodCount; - pDevice->coreaudio.originalPerformanceProfile = pConfig->performanceProfile; - - pDescriptorPlayback->format = data.formatOut; - pDescriptorPlayback->channels = data.channelsOut; - pDescriptorPlayback->sampleRate = data.sampleRateOut; - MA_COPY_MEMORY(pDescriptorPlayback->channelMap, data.channelMapOut, sizeof(data.channelMapOut)); - pDescriptorPlayback->periodSizeInFrames = data.periodSizeInFramesOut; - pDescriptorPlayback->periodCount = data.periodsOut; - - #if defined(MA_APPLE_DESKTOP) - ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDPlayback, sizeof(pDevice->playback.id.coreaudio), pDevice->playback.id.coreaudio); - - /* - If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly - switch the device in the background. - */ - if (pDescriptorPlayback->pDeviceID == NULL && (pConfig->deviceType != ma_device_type_duplex || pDescriptorCapture->pDeviceID != NULL)) { - ma_device__track__coreaudio(pDevice); - } - #endif - } - - - - /* - When stopping the device, a callback is called on another thread. We need to wait for this callback - before returning from ma_device_stop(). This event is used for this. - */ - ma_event_init(&pDevice->coreaudio.stopEvent); - - /* - We need to detect when a route has changed so we can update the data conversion pipeline accordingly. This is done - differently on non-Desktop Apple platforms. - */ -#if defined(MA_APPLE_MOBILE) - pDevice->coreaudio.pNotificationHandler = (MA_BRIDGE_RETAINED void*)[[ma_ios_notification_handler alloc] init:pDevice]; -#endif - - return MA_SUCCESS; -} - - -static ma_result ma_device_start__coreaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitPlayback); - if (status != noErr) { - if (pDevice->type == ma_device_type_duplex) { - ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - } - return ma_result_from_OSStatus(status); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__coreaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - /* It's not clear from the documentation whether or not AudioOutputUnitStop() actually drains the device or not. */ - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - OSStatus status = ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - OSStatus status = ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback); - if (status != noErr) { - return ma_result_from_OSStatus(status); - } - } - - /* We need to wait for the callback to finish before returning. */ - ma_event_wait(&pDevice->coreaudio.stopEvent); - return MA_SUCCESS; -} - - -static ma_result ma_context_uninit__coreaudio(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_coreaudio); - -#if defined(MA_APPLE_MOBILE) - if (!pContext->coreaudio.noAudioSessionDeactivate) { - if (![[AVAudioSession sharedInstance] setActive:false error:nil]) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "Failed to deactivate audio session."); - return MA_FAILED_TO_INIT_BACKEND; - } - } -#endif - -#if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE) - ma_dlclose(pContext, pContext->coreaudio.hAudioUnit); - ma_dlclose(pContext, pContext->coreaudio.hCoreAudio); - ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation); -#endif - -#if !defined(MA_APPLE_MOBILE) - ma_context__uninit_device_tracking__coreaudio(pContext); -#endif - - (void)pContext; - return MA_SUCCESS; -} - -#if defined(MA_APPLE_MOBILE) && defined(__IPHONE_12_0) -static AVAudioSessionCategory ma_to_AVAudioSessionCategory(ma_ios_session_category category) -{ - /* The "default" and "none" categories are treated different and should not be used as an input into this function. */ - MA_ASSERT(category != ma_ios_session_category_default); - MA_ASSERT(category != ma_ios_session_category_none); - - switch (category) { - case ma_ios_session_category_ambient: return AVAudioSessionCategoryAmbient; - case ma_ios_session_category_solo_ambient: return AVAudioSessionCategorySoloAmbient; - case ma_ios_session_category_playback: return AVAudioSessionCategoryPlayback; - case ma_ios_session_category_record: return AVAudioSessionCategoryRecord; - case ma_ios_session_category_play_and_record: return AVAudioSessionCategoryPlayAndRecord; - case ma_ios_session_category_multi_route: return AVAudioSessionCategoryMultiRoute; - case ma_ios_session_category_none: return AVAudioSessionCategoryAmbient; - case ma_ios_session_category_default: return AVAudioSessionCategoryAmbient; - default: return AVAudioSessionCategoryAmbient; - } -} -#endif - -static ma_result ma_context_init__coreaudio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ -#if !defined(MA_APPLE_MOBILE) - ma_result result; -#endif - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pContext != NULL); - -#if defined(MA_APPLE_MOBILE) - @autoreleasepool { - AVAudioSession* pAudioSession = [AVAudioSession sharedInstance]; - AVAudioSessionCategoryOptions options = pConfig->coreaudio.sessionCategoryOptions; - - MA_ASSERT(pAudioSession != NULL); - - if (pConfig->coreaudio.sessionCategory == ma_ios_session_category_default) { - /* - I'm going to use trial and error to determine our default session category. First we'll try PlayAndRecord. If that fails - we'll try Playback and if that fails we'll try record. If all of these fail we'll just not set the category. - */ - #if !defined(MA_APPLE_TV) && !defined(MA_APPLE_WATCH) - options |= AVAudioSessionCategoryOptionDefaultToSpeaker; - #endif - - if ([pAudioSession setCategory: AVAudioSessionCategoryPlayAndRecord withOptions:options error:nil]) { - /* Using PlayAndRecord */ - } else if ([pAudioSession setCategory: AVAudioSessionCategoryPlayback withOptions:options error:nil]) { - /* Using Playback */ - } else if ([pAudioSession setCategory: AVAudioSessionCategoryRecord withOptions:options error:nil]) { - /* Using Record */ - } else { - /* Leave as default? */ - } - } else { - if (pConfig->coreaudio.sessionCategory != ma_ios_session_category_none) { - #if defined(__IPHONE_12_0) - if (![pAudioSession setCategory: ma_to_AVAudioSessionCategory(pConfig->coreaudio.sessionCategory) withOptions:options error:nil]) { - return MA_INVALID_OPERATION; /* Failed to set session category. */ - } - #else - /* Ignore the session category on version 11 and older, but post a warning. */ - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "Session category only supported in iOS 12 and newer."); - #endif - } - } - - if (!pConfig->coreaudio.noAudioSessionActivate) { - if (![pAudioSession setActive:true error:nil]) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "Failed to activate audio session."); - return MA_FAILED_TO_INIT_BACKEND; - } - } - } -#endif - -#if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE) - pContext->coreaudio.hCoreFoundation = ma_dlopen(pContext, "CoreFoundation.framework/CoreFoundation"); - if (pContext->coreaudio.hCoreFoundation == NULL) { - return MA_API_NOT_FOUND; - } - - pContext->coreaudio.CFStringGetCString = ma_dlsym(pContext, pContext->coreaudio.hCoreFoundation, "CFStringGetCString"); - pContext->coreaudio.CFRelease = ma_dlsym(pContext, pContext->coreaudio.hCoreFoundation, "CFRelease"); - - - pContext->coreaudio.hCoreAudio = ma_dlopen(pContext, "CoreAudio.framework/CoreAudio"); - if (pContext->coreaudio.hCoreAudio == NULL) { - ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation); - return MA_API_NOT_FOUND; - } - - pContext->coreaudio.AudioObjectGetPropertyData = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, "AudioObjectGetPropertyData"); - pContext->coreaudio.AudioObjectGetPropertyDataSize = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, "AudioObjectGetPropertyDataSize"); - pContext->coreaudio.AudioObjectSetPropertyData = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, "AudioObjectSetPropertyData"); - pContext->coreaudio.AudioObjectAddPropertyListener = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, "AudioObjectAddPropertyListener"); - pContext->coreaudio.AudioObjectRemovePropertyListener = ma_dlsym(pContext, pContext->coreaudio.hCoreAudio, "AudioObjectRemovePropertyListener"); - - /* - It looks like Apple has moved some APIs from AudioUnit into AudioToolbox on more recent versions of macOS. They are still - defined in AudioUnit, but just in case they decide to remove them from there entirely I'm going to implement a fallback. - The way it'll work is that it'll first try AudioUnit, and if the required symbols are not present there we'll fall back to - AudioToolbox. - */ - pContext->coreaudio.hAudioUnit = ma_dlopen(pContext, "AudioUnit.framework/AudioUnit"); - if (pContext->coreaudio.hAudioUnit == NULL) { - ma_dlclose(pContext, pContext->coreaudio.hCoreAudio); - ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation); - return MA_API_NOT_FOUND; - } - - if (ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioComponentFindNext") == NULL) { - /* Couldn't find the required symbols in AudioUnit, so fall back to AudioToolbox. */ - ma_dlclose(pContext, pContext->coreaudio.hAudioUnit); - pContext->coreaudio.hAudioUnit = ma_dlopen(pContext, "AudioToolbox.framework/AudioToolbox"); - if (pContext->coreaudio.hAudioUnit == NULL) { - ma_dlclose(pContext, pContext->coreaudio.hCoreAudio); - ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation); - return MA_API_NOT_FOUND; - } - } - - pContext->coreaudio.AudioComponentFindNext = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioComponentFindNext"); - pContext->coreaudio.AudioComponentInstanceDispose = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioComponentInstanceDispose"); - pContext->coreaudio.AudioComponentInstanceNew = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioComponentInstanceNew"); - pContext->coreaudio.AudioOutputUnitStart = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioOutputUnitStart"); - pContext->coreaudio.AudioOutputUnitStop = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioOutputUnitStop"); - pContext->coreaudio.AudioUnitAddPropertyListener = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioUnitAddPropertyListener"); - pContext->coreaudio.AudioUnitGetPropertyInfo = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioUnitGetPropertyInfo"); - pContext->coreaudio.AudioUnitGetProperty = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioUnitGetProperty"); - pContext->coreaudio.AudioUnitSetProperty = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioUnitSetProperty"); - pContext->coreaudio.AudioUnitInitialize = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioUnitInitialize"); - pContext->coreaudio.AudioUnitRender = ma_dlsym(pContext, pContext->coreaudio.hAudioUnit, "AudioUnitRender"); -#else - pContext->coreaudio.CFStringGetCString = (ma_proc)CFStringGetCString; - pContext->coreaudio.CFRelease = (ma_proc)CFRelease; - - #if defined(MA_APPLE_DESKTOP) - pContext->coreaudio.AudioObjectGetPropertyData = (ma_proc)AudioObjectGetPropertyData; - pContext->coreaudio.AudioObjectGetPropertyDataSize = (ma_proc)AudioObjectGetPropertyDataSize; - pContext->coreaudio.AudioObjectSetPropertyData = (ma_proc)AudioObjectSetPropertyData; - pContext->coreaudio.AudioObjectAddPropertyListener = (ma_proc)AudioObjectAddPropertyListener; - pContext->coreaudio.AudioObjectRemovePropertyListener = (ma_proc)AudioObjectRemovePropertyListener; - #endif - - pContext->coreaudio.AudioComponentFindNext = (ma_proc)AudioComponentFindNext; - pContext->coreaudio.AudioComponentInstanceDispose = (ma_proc)AudioComponentInstanceDispose; - pContext->coreaudio.AudioComponentInstanceNew = (ma_proc)AudioComponentInstanceNew; - pContext->coreaudio.AudioOutputUnitStart = (ma_proc)AudioOutputUnitStart; - pContext->coreaudio.AudioOutputUnitStop = (ma_proc)AudioOutputUnitStop; - pContext->coreaudio.AudioUnitAddPropertyListener = (ma_proc)AudioUnitAddPropertyListener; - pContext->coreaudio.AudioUnitGetPropertyInfo = (ma_proc)AudioUnitGetPropertyInfo; - pContext->coreaudio.AudioUnitGetProperty = (ma_proc)AudioUnitGetProperty; - pContext->coreaudio.AudioUnitSetProperty = (ma_proc)AudioUnitSetProperty; - pContext->coreaudio.AudioUnitInitialize = (ma_proc)AudioUnitInitialize; - pContext->coreaudio.AudioUnitRender = (ma_proc)AudioUnitRender; -#endif - - /* Audio component. */ - { - AudioComponentDescription desc; - desc.componentType = kAudioUnitType_Output; - #if defined(MA_APPLE_DESKTOP) - desc.componentSubType = kAudioUnitSubType_HALOutput; - #else - desc.componentSubType = kAudioUnitSubType_RemoteIO; - #endif - desc.componentManufacturer = kAudioUnitManufacturer_Apple; - desc.componentFlags = 0; - desc.componentFlagsMask = 0; - - pContext->coreaudio.component = ((ma_AudioComponentFindNext_proc)pContext->coreaudio.AudioComponentFindNext)(NULL, &desc); - if (pContext->coreaudio.component == NULL) { - #if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE) - ma_dlclose(pContext, pContext->coreaudio.hAudioUnit); - ma_dlclose(pContext, pContext->coreaudio.hCoreAudio); - ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation); - #endif - return MA_FAILED_TO_INIT_BACKEND; - } - } - -#if !defined(MA_APPLE_MOBILE) - result = ma_context__init_device_tracking__coreaudio(pContext); - if (result != MA_SUCCESS) { - #if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE) - ma_dlclose(pContext, pContext->coreaudio.hAudioUnit); - ma_dlclose(pContext, pContext->coreaudio.hCoreAudio); - ma_dlclose(pContext, pContext->coreaudio.hCoreFoundation); - #endif - return result; - } -#endif - - pContext->coreaudio.noAudioSessionDeactivate = pConfig->coreaudio.noAudioSessionDeactivate; - - pCallbacks->onContextInit = ma_context_init__coreaudio; - pCallbacks->onContextUninit = ma_context_uninit__coreaudio; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__coreaudio; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__coreaudio; - pCallbacks->onDeviceInit = ma_device_init__coreaudio; - pCallbacks->onDeviceUninit = ma_device_uninit__coreaudio; - pCallbacks->onDeviceStart = ma_device_start__coreaudio; - pCallbacks->onDeviceStop = ma_device_stop__coreaudio; - pCallbacks->onDeviceRead = NULL; - pCallbacks->onDeviceWrite = NULL; - pCallbacks->onDeviceDataLoop = NULL; - - return MA_SUCCESS; -} -#endif /* Core Audio */ - - - -/****************************************************************************** - -sndio Backend - -******************************************************************************/ -#ifdef MA_HAS_SNDIO -#include - -/* -Only supporting OpenBSD. This did not work very well at all on FreeBSD when I tried it. Not sure if this is due -to miniaudio's implementation or if it's some kind of system configuration issue, but basically the default device -just doesn't emit any sound, or at times you'll hear tiny pieces. I will consider enabling this when there's -demand for it or if I can get it tested and debugged more thoroughly. -*/ -#if 0 -#if defined(__NetBSD__) || defined(__OpenBSD__) -#include -#endif -#if defined(__FreeBSD__) || defined(__DragonFly__) -#include -#endif -#endif - -#define MA_SIO_DEVANY "default" -#define MA_SIO_PLAY 1 -#define MA_SIO_REC 2 -#define MA_SIO_NENC 8 -#define MA_SIO_NCHAN 8 -#define MA_SIO_NRATE 16 -#define MA_SIO_NCONF 4 - -struct ma_sio_hdl; /* <-- Opaque */ - -struct ma_sio_par -{ - unsigned int bits; - unsigned int bps; - unsigned int sig; - unsigned int le; - unsigned int msb; - unsigned int rchan; - unsigned int pchan; - unsigned int rate; - unsigned int bufsz; - unsigned int xrun; - unsigned int round; - unsigned int appbufsz; - int __pad[3]; - unsigned int __magic; -}; - -struct ma_sio_enc -{ - unsigned int bits; - unsigned int bps; - unsigned int sig; - unsigned int le; - unsigned int msb; -}; - -struct ma_sio_conf -{ - unsigned int enc; - unsigned int rchan; - unsigned int pchan; - unsigned int rate; -}; - -struct ma_sio_cap -{ - struct ma_sio_enc enc[MA_SIO_NENC]; - unsigned int rchan[MA_SIO_NCHAN]; - unsigned int pchan[MA_SIO_NCHAN]; - unsigned int rate[MA_SIO_NRATE]; - int __pad[7]; - unsigned int nconf; - struct ma_sio_conf confs[MA_SIO_NCONF]; -}; - -typedef struct ma_sio_hdl* (* ma_sio_open_proc) (const char*, unsigned int, int); -typedef void (* ma_sio_close_proc) (struct ma_sio_hdl*); -typedef int (* ma_sio_setpar_proc) (struct ma_sio_hdl*, struct ma_sio_par*); -typedef int (* ma_sio_getpar_proc) (struct ma_sio_hdl*, struct ma_sio_par*); -typedef int (* ma_sio_getcap_proc) (struct ma_sio_hdl*, struct ma_sio_cap*); -typedef size_t (* ma_sio_write_proc) (struct ma_sio_hdl*, const void*, size_t); -typedef size_t (* ma_sio_read_proc) (struct ma_sio_hdl*, void*, size_t); -typedef int (* ma_sio_start_proc) (struct ma_sio_hdl*); -typedef int (* ma_sio_stop_proc) (struct ma_sio_hdl*); -typedef int (* ma_sio_initpar_proc)(struct ma_sio_par*); - -static ma_uint32 ma_get_standard_sample_rate_priority_index__sndio(ma_uint32 sampleRate) /* Lower = higher priority */ -{ - ma_uint32 i; - for (i = 0; i < ma_countof(g_maStandardSampleRatePriorities); ++i) { - if (g_maStandardSampleRatePriorities[i] == sampleRate) { - return i; - } - } - - return (ma_uint32)-1; -} - -static ma_format ma_format_from_sio_enc__sndio(unsigned int bits, unsigned int bps, unsigned int sig, unsigned int le, unsigned int msb) -{ - /* We only support native-endian right now. */ - if ((ma_is_little_endian() && le == 0) || (ma_is_big_endian() && le == 1)) { - return ma_format_unknown; - } - - if (bits == 8 && bps == 1 && sig == 0) { - return ma_format_u8; - } - if (bits == 16 && bps == 2 && sig == 1) { - return ma_format_s16; - } - if (bits == 24 && bps == 3 && sig == 1) { - return ma_format_s24; - } - if (bits == 24 && bps == 4 && sig == 1 && msb == 0) { - /*return ma_format_s24_32;*/ - } - if (bits == 32 && bps == 4 && sig == 1) { - return ma_format_s32; - } - - return ma_format_unknown; -} - -static ma_format ma_find_best_format_from_sio_cap__sndio(struct ma_sio_cap* caps) -{ - ma_format bestFormat; - unsigned int iConfig; - - MA_ASSERT(caps != NULL); - - bestFormat = ma_format_unknown; - for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) { - unsigned int iEncoding; - for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) { - unsigned int bits; - unsigned int bps; - unsigned int sig; - unsigned int le; - unsigned int msb; - ma_format format; - - if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) { - continue; - } - - bits = caps->enc[iEncoding].bits; - bps = caps->enc[iEncoding].bps; - sig = caps->enc[iEncoding].sig; - le = caps->enc[iEncoding].le; - msb = caps->enc[iEncoding].msb; - format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb); - if (format == ma_format_unknown) { - continue; /* Format not supported. */ - } - - if (bestFormat == ma_format_unknown) { - bestFormat = format; - } else { - if (ma_get_format_priority_index(bestFormat) > ma_get_format_priority_index(format)) { /* <-- Lower = better. */ - bestFormat = format; - } - } - } - } - - return bestFormat; -} - -static ma_uint32 ma_find_best_channels_from_sio_cap__sndio(struct ma_sio_cap* caps, ma_device_type deviceType, ma_format requiredFormat) -{ - ma_uint32 maxChannels; - unsigned int iConfig; - - MA_ASSERT(caps != NULL); - MA_ASSERT(requiredFormat != ma_format_unknown); - - /* Just pick whatever configuration has the most channels. */ - maxChannels = 0; - for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) { - /* The encoding should be of requiredFormat. */ - unsigned int iEncoding; - for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) { - unsigned int iChannel; - unsigned int bits; - unsigned int bps; - unsigned int sig; - unsigned int le; - unsigned int msb; - ma_format format; - - if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) { - continue; - } - - bits = caps->enc[iEncoding].bits; - bps = caps->enc[iEncoding].bps; - sig = caps->enc[iEncoding].sig; - le = caps->enc[iEncoding].le; - msb = caps->enc[iEncoding].msb; - format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb); - if (format != requiredFormat) { - continue; - } - - /* Getting here means the format is supported. Iterate over each channel count and grab the biggest one. */ - for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) { - unsigned int chan = 0; - unsigned int channels; - - if (deviceType == ma_device_type_playback) { - chan = caps->confs[iConfig].pchan; - } else { - chan = caps->confs[iConfig].rchan; - } - - if ((chan & (1UL << iChannel)) == 0) { - continue; - } - - if (deviceType == ma_device_type_playback) { - channels = caps->pchan[iChannel]; - } else { - channels = caps->rchan[iChannel]; - } - - if (maxChannels < channels) { - maxChannels = channels; - } - } - } - } - - return maxChannels; -} - -static ma_uint32 ma_find_best_sample_rate_from_sio_cap__sndio(struct ma_sio_cap* caps, ma_device_type deviceType, ma_format requiredFormat, ma_uint32 requiredChannels) -{ - ma_uint32 firstSampleRate; - ma_uint32 bestSampleRate; - unsigned int iConfig; - - MA_ASSERT(caps != NULL); - MA_ASSERT(requiredFormat != ma_format_unknown); - MA_ASSERT(requiredChannels > 0); - MA_ASSERT(requiredChannels <= MA_MAX_CHANNELS); - - firstSampleRate = 0; /* <-- If the device does not support a standard rate we'll fall back to the first one that's found. */ - bestSampleRate = 0; - - for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) { - /* The encoding should be of requiredFormat. */ - unsigned int iEncoding; - for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) { - unsigned int iChannel; - unsigned int bits; - unsigned int bps; - unsigned int sig; - unsigned int le; - unsigned int msb; - ma_format format; - - if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) { - continue; - } - - bits = caps->enc[iEncoding].bits; - bps = caps->enc[iEncoding].bps; - sig = caps->enc[iEncoding].sig; - le = caps->enc[iEncoding].le; - msb = caps->enc[iEncoding].msb; - format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb); - if (format != requiredFormat) { - continue; - } - - /* Getting here means the format is supported. Iterate over each channel count and grab the biggest one. */ - for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) { - unsigned int chan = 0; - unsigned int channels; - unsigned int iRate; - - if (deviceType == ma_device_type_playback) { - chan = caps->confs[iConfig].pchan; - } else { - chan = caps->confs[iConfig].rchan; - } - - if ((chan & (1UL << iChannel)) == 0) { - continue; - } - - if (deviceType == ma_device_type_playback) { - channels = caps->pchan[iChannel]; - } else { - channels = caps->rchan[iChannel]; - } - - if (channels != requiredChannels) { - continue; - } - - /* Getting here means we have found a compatible encoding/channel pair. */ - for (iRate = 0; iRate < MA_SIO_NRATE; iRate += 1) { - ma_uint32 rate = (ma_uint32)caps->rate[iRate]; - ma_uint32 ratePriority; - - if (firstSampleRate == 0) { - firstSampleRate = rate; - } - - /* Disregard this rate if it's not a standard one. */ - ratePriority = ma_get_standard_sample_rate_priority_index__sndio(rate); - if (ratePriority == (ma_uint32)-1) { - continue; - } - - if (ma_get_standard_sample_rate_priority_index__sndio(bestSampleRate) > ratePriority) { /* Lower = better. */ - bestSampleRate = rate; - } - } - } - } - } - - /* If a standard sample rate was not found just fall back to the first one that was iterated. */ - if (bestSampleRate == 0) { - bestSampleRate = firstSampleRate; - } - - return bestSampleRate; -} - - -static ma_result ma_context_enumerate_devices__sndio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_bool32 isTerminating = MA_FALSE; - struct ma_sio_hdl* handle; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* sndio doesn't seem to have a good device enumeration API, so I'm therefore only enumerating over default devices for now. */ - - /* Playback. */ - if (!isTerminating) { - handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(MA_SIO_DEVANY, MA_SIO_PLAY, 0); - if (handle != NULL) { - /* Supports playback. */ - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strcpy_s(deviceInfo.id.sndio, sizeof(deviceInfo.id.sndio), MA_SIO_DEVANY); - ma_strcpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME); - - isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - - ((ma_sio_close_proc)pContext->sndio.sio_close)(handle); - } - } - - /* Capture. */ - if (!isTerminating) { - handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(MA_SIO_DEVANY, MA_SIO_REC, 0); - if (handle != NULL) { - /* Supports capture. */ - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strcpy_s(deviceInfo.id.sndio, sizeof(deviceInfo.id.sndio), "default"); - ma_strcpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME); - - isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - - ((ma_sio_close_proc)pContext->sndio.sio_close)(handle); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__sndio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - char devid[256]; - struct ma_sio_hdl* handle; - struct ma_sio_cap caps; - unsigned int iConfig; - - MA_ASSERT(pContext != NULL); - - /* We need to open the device before we can get information about it. */ - if (pDeviceID == NULL) { - ma_strcpy_s(devid, sizeof(devid), MA_SIO_DEVANY); - ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (deviceType == ma_device_type_playback) ? MA_DEFAULT_PLAYBACK_DEVICE_NAME : MA_DEFAULT_CAPTURE_DEVICE_NAME); - } else { - ma_strcpy_s(devid, sizeof(devid), pDeviceID->sndio); - ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), devid); - } - - handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(devid, (deviceType == ma_device_type_playback) ? MA_SIO_PLAY : MA_SIO_REC, 0); - if (handle == NULL) { - return MA_NO_DEVICE; - } - - if (((ma_sio_getcap_proc)pContext->sndio.sio_getcap)(handle, &caps) == 0) { - return MA_ERROR; - } - - pDeviceInfo->nativeDataFormatCount = 0; - - for (iConfig = 0; iConfig < caps.nconf; iConfig += 1) { - /* - The main thing we care about is that the encoding is supported by miniaudio. If it is, we want to give - preference to some formats over others. - */ - unsigned int iEncoding; - unsigned int iChannel; - unsigned int iRate; - - for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) { - unsigned int bits; - unsigned int bps; - unsigned int sig; - unsigned int le; - unsigned int msb; - ma_format format; - - if ((caps.confs[iConfig].enc & (1UL << iEncoding)) == 0) { - continue; - } - - bits = caps.enc[iEncoding].bits; - bps = caps.enc[iEncoding].bps; - sig = caps.enc[iEncoding].sig; - le = caps.enc[iEncoding].le; - msb = caps.enc[iEncoding].msb; - format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb); - if (format == ma_format_unknown) { - continue; /* Format not supported. */ - } - - - /* Channels. */ - for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) { - unsigned int chan = 0; - unsigned int channels; - - if (deviceType == ma_device_type_playback) { - chan = caps.confs[iConfig].pchan; - } else { - chan = caps.confs[iConfig].rchan; - } - - if ((chan & (1UL << iChannel)) == 0) { - continue; - } - - if (deviceType == ma_device_type_playback) { - channels = caps.pchan[iChannel]; - } else { - channels = caps.rchan[iChannel]; - } - - - /* Sample Rates. */ - for (iRate = 0; iRate < MA_SIO_NRATE; iRate += 1) { - if ((caps.confs[iConfig].rate & (1UL << iRate)) != 0) { - ma_device_info_add_native_data_format(pDeviceInfo, format, channels, caps.rate[iRate], 0); - } - } - } - } - } - - ((ma_sio_close_proc)pContext->sndio.sio_close)(handle); - return MA_SUCCESS; -} - -static ma_result ma_device_uninit__sndio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)pDevice->sndio.handleCapture); - } - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_init_handle__sndio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType) -{ - const char* pDeviceName; - ma_ptr handle; - int openFlags = 0; - struct ma_sio_cap caps; - struct ma_sio_par par; - const ma_device_id* pDeviceID; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_format internalFormat; - ma_uint32 internalChannels; - ma_uint32 internalSampleRate; - ma_uint32 internalPeriodSizeInFrames; - ma_uint32 internalPeriods; - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(deviceType != ma_device_type_duplex); - MA_ASSERT(pDevice != NULL); - - if (deviceType == ma_device_type_capture) { - openFlags = MA_SIO_REC; - } else { - openFlags = MA_SIO_PLAY; - } - - pDeviceID = pDescriptor->pDeviceID; - format = pDescriptor->format; - channels = pDescriptor->channels; - sampleRate = pDescriptor->sampleRate; - - pDeviceName = MA_SIO_DEVANY; - if (pDeviceID != NULL) { - pDeviceName = pDeviceID->sndio; - } - - handle = (ma_ptr)((ma_sio_open_proc)pDevice->pContext->sndio.sio_open)(pDeviceName, openFlags, 0); - if (handle == NULL) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[sndio] Failed to open device."); - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - /* We need to retrieve the device caps to determine the most appropriate format to use. */ - if (((ma_sio_getcap_proc)pDevice->pContext->sndio.sio_getcap)((struct ma_sio_hdl*)handle, &caps) == 0) { - ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)handle); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[sndio] Failed to retrieve device caps."); - return MA_ERROR; - } - - /* - Note: sndio reports a huge range of available channels. This is inconvenient for us because there's no real - way, as far as I can tell, to get the _actual_ channel count of the device. I'm therefore restricting this - to the requested channels, regardless of whether or not the default channel count is requested. - - For hardware devices, I'm suspecting only a single channel count will be reported and we can safely use the - value returned by ma_find_best_channels_from_sio_cap__sndio(). - */ - if (deviceType == ma_device_type_capture) { - if (format == ma_format_unknown) { - format = ma_find_best_format_from_sio_cap__sndio(&caps); - } - - if (channels == 0) { - if (strlen(pDeviceName) > strlen("rsnd/") && strncmp(pDeviceName, "rsnd/", strlen("rsnd/")) == 0) { - channels = ma_find_best_channels_from_sio_cap__sndio(&caps, deviceType, format); - } else { - channels = MA_DEFAULT_CHANNELS; - } - } - } else { - if (format == ma_format_unknown) { - format = ma_find_best_format_from_sio_cap__sndio(&caps); - } - - if (channels == 0) { - if (strlen(pDeviceName) > strlen("rsnd/") && strncmp(pDeviceName, "rsnd/", strlen("rsnd/")) == 0) { - channels = ma_find_best_channels_from_sio_cap__sndio(&caps, deviceType, format); - } else { - channels = MA_DEFAULT_CHANNELS; - } - } - } - - if (sampleRate == 0) { - sampleRate = ma_find_best_sample_rate_from_sio_cap__sndio(&caps, pConfig->deviceType, format, channels); - } - - - ((ma_sio_initpar_proc)pDevice->pContext->sndio.sio_initpar)(&par); - par.msb = 0; - par.le = ma_is_little_endian(); - - switch (format) { - case ma_format_u8: - { - par.bits = 8; - par.bps = 1; - par.sig = 0; - } break; - - case ma_format_s24: - { - par.bits = 24; - par.bps = 3; - par.sig = 1; - } break; - - case ma_format_s32: - { - par.bits = 32; - par.bps = 4; - par.sig = 1; - } break; - - case ma_format_s16: - case ma_format_f32: - case ma_format_unknown: - default: - { - par.bits = 16; - par.bps = 2; - par.sig = 1; - } break; - } - - if (deviceType == ma_device_type_capture) { - par.rchan = channels; - } else { - par.pchan = channels; - } - - par.rate = sampleRate; - - internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, par.rate, pConfig->performanceProfile); - - par.round = internalPeriodSizeInFrames; - par.appbufsz = par.round * pDescriptor->periodCount; - - if (((ma_sio_setpar_proc)pDevice->pContext->sndio.sio_setpar)((struct ma_sio_hdl*)handle, &par) == 0) { - ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)handle); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[sndio] Failed to set buffer size."); - return MA_ERROR; - } - - if (((ma_sio_getpar_proc)pDevice->pContext->sndio.sio_getpar)((struct ma_sio_hdl*)handle, &par) == 0) { - ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)handle); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[sndio] Failed to retrieve buffer size."); - return MA_ERROR; - } - - internalFormat = ma_format_from_sio_enc__sndio(par.bits, par.bps, par.sig, par.le, par.msb); - internalChannels = (deviceType == ma_device_type_capture) ? par.rchan : par.pchan; - internalSampleRate = par.rate; - internalPeriods = par.appbufsz / par.round; - internalPeriodSizeInFrames = par.round; - - if (deviceType == ma_device_type_capture) { - pDevice->sndio.handleCapture = handle; - } else { - pDevice->sndio.handlePlayback = handle; - } - - pDescriptor->format = internalFormat; - pDescriptor->channels = internalChannels; - pDescriptor->sampleRate = internalSampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_sndio, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), internalChannels); - pDescriptor->periodSizeInFrames = internalPeriodSizeInFrames; - pDescriptor->periodCount = internalPeriods; - - return MA_SUCCESS; -} - -static ma_result ma_device_init__sndio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - MA_ASSERT(pDevice != NULL); - - MA_ZERO_OBJECT(&pDevice->sndio); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_handle__sndio(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_handle__sndio(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start__sndio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ((ma_sio_start_proc)pDevice->pContext->sndio.sio_start)((struct ma_sio_hdl*)pDevice->sndio.handleCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ((ma_sio_start_proc)pDevice->pContext->sndio.sio_start)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback); /* <-- Doesn't actually playback until data is written. */ - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__sndio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - /* - From the documentation: - - The sio_stop() function puts the audio subsystem in the same state as before sio_start() is called. It stops recording, drains the play buffer and then - stops playback. If samples to play are queued but playback hasn't started yet then playback is forced immediately; playback will actually stop once the - buffer is drained. In no case are samples in the play buffer discarded. - - Therefore, sio_stop() performs all of the necessary draining for us. - */ - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ((ma_sio_stop_proc)pDevice->pContext->sndio.sio_stop)((struct ma_sio_hdl*)pDevice->sndio.handleCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ((ma_sio_stop_proc)pDevice->pContext->sndio.sio_stop)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_write__sndio(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - int result; - - if (pFramesWritten != NULL) { - *pFramesWritten = 0; - } - - result = ((ma_sio_write_proc)pDevice->pContext->sndio.sio_write)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels)); - if (result == 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[sndio] Failed to send data from the client to the device."); - return MA_IO_ERROR; - } - - if (pFramesWritten != NULL) { - *pFramesWritten = frameCount; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_read__sndio(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - int result; - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - result = ((ma_sio_read_proc)pDevice->pContext->sndio.sio_read)((struct ma_sio_hdl*)pDevice->sndio.handleCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels)); - if (result == 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[sndio] Failed to read data from the device to be sent to the device."); - return MA_IO_ERROR; - } - - if (pFramesRead != NULL) { - *pFramesRead = frameCount; - } - - return MA_SUCCESS; -} - -static ma_result ma_context_uninit__sndio(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_sndio); - - (void)pContext; - return MA_SUCCESS; -} - -static ma_result ma_context_init__sndio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ -#ifndef MA_NO_RUNTIME_LINKING - const char* libsndioNames[] = { - "libsndio.so" - }; - size_t i; - - for (i = 0; i < ma_countof(libsndioNames); ++i) { - pContext->sndio.sndioSO = ma_dlopen(pContext, libsndioNames[i]); - if (pContext->sndio.sndioSO != NULL) { - break; - } - } - - if (pContext->sndio.sndioSO == NULL) { - return MA_NO_BACKEND; - } - - pContext->sndio.sio_open = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_open"); - pContext->sndio.sio_close = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_close"); - pContext->sndio.sio_setpar = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_setpar"); - pContext->sndio.sio_getpar = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_getpar"); - pContext->sndio.sio_getcap = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_getcap"); - pContext->sndio.sio_write = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_write"); - pContext->sndio.sio_read = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_read"); - pContext->sndio.sio_start = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_start"); - pContext->sndio.sio_stop = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_stop"); - pContext->sndio.sio_initpar = (ma_proc)ma_dlsym(pContext, pContext->sndio.sndioSO, "sio_initpar"); -#else - pContext->sndio.sio_open = sio_open; - pContext->sndio.sio_close = sio_close; - pContext->sndio.sio_setpar = sio_setpar; - pContext->sndio.sio_getpar = sio_getpar; - pContext->sndio.sio_getcap = sio_getcap; - pContext->sndio.sio_write = sio_write; - pContext->sndio.sio_read = sio_read; - pContext->sndio.sio_start = sio_start; - pContext->sndio.sio_stop = sio_stop; - pContext->sndio.sio_initpar = sio_initpar; -#endif - - pCallbacks->onContextInit = ma_context_init__sndio; - pCallbacks->onContextUninit = ma_context_uninit__sndio; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__sndio; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__sndio; - pCallbacks->onDeviceInit = ma_device_init__sndio; - pCallbacks->onDeviceUninit = ma_device_uninit__sndio; - pCallbacks->onDeviceStart = ma_device_start__sndio; - pCallbacks->onDeviceStop = ma_device_stop__sndio; - pCallbacks->onDeviceRead = ma_device_read__sndio; - pCallbacks->onDeviceWrite = ma_device_write__sndio; - pCallbacks->onDeviceDataLoop = NULL; - - (void)pConfig; - return MA_SUCCESS; -} -#endif /* sndio */ - - - -/****************************************************************************** - -audio(4) Backend - -******************************************************************************/ -#ifdef MA_HAS_AUDIO4 -#include -#include -#include -#include -#include -#include -#include - -#if defined(__OpenBSD__) - #include - #if defined(OpenBSD) && OpenBSD >= 201709 - #define MA_AUDIO4_USE_NEW_API - #endif -#endif - -static void ma_construct_device_id__audio4(char* id, size_t idSize, const char* base, int deviceIndex) -{ - size_t baseLen; - - MA_ASSERT(id != NULL); - MA_ASSERT(idSize > 0); - MA_ASSERT(deviceIndex >= 0); - - baseLen = strlen(base); - MA_ASSERT(idSize > baseLen); - - ma_strcpy_s(id, idSize, base); - ma_itoa_s(deviceIndex, id+baseLen, idSize-baseLen, 10); -} - -static ma_result ma_extract_device_index_from_id__audio4(const char* id, const char* base, int* pIndexOut) -{ - size_t idLen; - size_t baseLen; - const char* deviceIndexStr; - - MA_ASSERT(id != NULL); - MA_ASSERT(base != NULL); - MA_ASSERT(pIndexOut != NULL); - - idLen = strlen(id); - baseLen = strlen(base); - if (idLen <= baseLen) { - return MA_ERROR; /* Doesn't look like the id starts with the base. */ - } - - if (strncmp(id, base, baseLen) != 0) { - return MA_ERROR; /* ID does not begin with base. */ - } - - deviceIndexStr = id + baseLen; - if (deviceIndexStr[0] == '\0') { - return MA_ERROR; /* No index specified in the ID. */ - } - - if (pIndexOut) { - *pIndexOut = atoi(deviceIndexStr); - } - - return MA_SUCCESS; -} - - -#if !defined(MA_AUDIO4_USE_NEW_API) /* Old API */ -static ma_format ma_format_from_encoding__audio4(unsigned int encoding, unsigned int precision) -{ - if (precision == 8 && (encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR_LE || encoding == AUDIO_ENCODING_ULINEAR_BE)) { - return ma_format_u8; - } else { - if (ma_is_little_endian() && encoding == AUDIO_ENCODING_SLINEAR_LE) { - if (precision == 16) { - return ma_format_s16; - } else if (precision == 24) { - return ma_format_s24; - } else if (precision == 32) { - return ma_format_s32; - } - } else if (ma_is_big_endian() && encoding == AUDIO_ENCODING_SLINEAR_BE) { - if (precision == 16) { - return ma_format_s16; - } else if (precision == 24) { - return ma_format_s24; - } else if (precision == 32) { - return ma_format_s32; - } - } - } - - return ma_format_unknown; /* Encoding not supported. */ -} - -static void ma_encoding_from_format__audio4(ma_format format, unsigned int* pEncoding, unsigned int* pPrecision) -{ - MA_ASSERT(pEncoding != NULL); - MA_ASSERT(pPrecision != NULL); - - switch (format) - { - case ma_format_u8: - { - *pEncoding = AUDIO_ENCODING_ULINEAR; - *pPrecision = 8; - } break; - - case ma_format_s24: - { - *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE; - *pPrecision = 24; - } break; - - case ma_format_s32: - { - *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE; - *pPrecision = 32; - } break; - - case ma_format_s16: - case ma_format_f32: - case ma_format_unknown: - default: - { - *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE; - *pPrecision = 16; - } break; - } -} - -static ma_format ma_format_from_prinfo__audio4(struct audio_prinfo* prinfo) -{ - return ma_format_from_encoding__audio4(prinfo->encoding, prinfo->precision); -} - -static ma_format ma_best_format_from_fd__audio4(int fd, ma_format preferredFormat) -{ - audio_encoding_t encoding; - ma_uint32 iFormat; - int counter = 0; - - /* First check to see if the preferred format is supported. */ - if (preferredFormat != ma_format_unknown) { - counter = 0; - for (;;) { - MA_ZERO_OBJECT(&encoding); - encoding.index = counter; - if (ioctl(fd, AUDIO_GETENC, &encoding) < 0) { - break; - } - - if (preferredFormat == ma_format_from_encoding__audio4(encoding.encoding, encoding.precision)) { - return preferredFormat; /* Found the preferred format. */ - } - - /* Getting here means this encoding does not match our preferred format so we need to more on to the next encoding. */ - counter += 1; - } - } - - /* Getting here means our preferred format is not supported, so fall back to our standard priorities. */ - for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); iFormat += 1) { - ma_format format = g_maFormatPriorities[iFormat]; - - counter = 0; - for (;;) { - MA_ZERO_OBJECT(&encoding); - encoding.index = counter; - if (ioctl(fd, AUDIO_GETENC, &encoding) < 0) { - break; - } - - if (format == ma_format_from_encoding__audio4(encoding.encoding, encoding.precision)) { - return format; /* Found a workable format. */ - } - - /* Getting here means this encoding does not match our preferred format so we need to more on to the next encoding. */ - counter += 1; - } - } - - /* Getting here means not appropriate format was found. */ - return ma_format_unknown; -} -#else -static ma_format ma_format_from_swpar__audio4(struct audio_swpar* par) -{ - if (par->bits == 8 && par->bps == 1 && par->sig == 0) { - return ma_format_u8; - } - if (par->bits == 16 && par->bps == 2 && par->sig == 1 && par->le == ma_is_little_endian()) { - return ma_format_s16; - } - if (par->bits == 24 && par->bps == 3 && par->sig == 1 && par->le == ma_is_little_endian()) { - return ma_format_s24; - } - if (par->bits == 32 && par->bps == 4 && par->sig == 1 && par->le == ma_is_little_endian()) { - return ma_format_f32; - } - - /* Format not supported. */ - return ma_format_unknown; -} -#endif - -static ma_result ma_context_get_device_info_from_fd__audio4(ma_context* pContext, ma_device_type deviceType, int fd, ma_device_info* pDeviceInfo) -{ - audio_device_t fdDevice; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(fd >= 0); - MA_ASSERT(pDeviceInfo != NULL); - - (void)pContext; - (void)deviceType; - - if (ioctl(fd, AUDIO_GETDEV, &fdDevice) < 0) { - return MA_ERROR; /* Failed to retrieve device info. */ - } - - /* Name. */ - ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), fdDevice.name); - - #if !defined(MA_AUDIO4_USE_NEW_API) - { - audio_info_t fdInfo; - int counter = 0; - ma_uint32 channels; - ma_uint32 sampleRate; - - if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) { - return MA_ERROR; - } - - if (deviceType == ma_device_type_playback) { - channels = fdInfo.play.channels; - sampleRate = fdInfo.play.sample_rate; - } else { - channels = fdInfo.record.channels; - sampleRate = fdInfo.record.sample_rate; - } - - /* Supported formats. We get this by looking at the encodings. */ - pDeviceInfo->nativeDataFormatCount = 0; - for (;;) { - audio_encoding_t encoding; - ma_format format; - - MA_ZERO_OBJECT(&encoding); - encoding.index = counter; - if (ioctl(fd, AUDIO_GETENC, &encoding) < 0) { - break; - } - - format = ma_format_from_encoding__audio4(encoding.encoding, encoding.precision); - if (format != ma_format_unknown) { - ma_device_info_add_native_data_format(pDeviceInfo, format, channels, sampleRate, 0); - } - - counter += 1; - } - } - #else - { - struct audio_swpar fdPar; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - - if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) { - return MA_ERROR; - } - - format = ma_format_from_swpar__audio4(&fdPar); - if (format == ma_format_unknown) { - return MA_FORMAT_NOT_SUPPORTED; - } - - if (deviceType == ma_device_type_playback) { - channels = fdPar.pchan; - } else { - channels = fdPar.rchan; - } - - sampleRate = fdPar.rate; - - pDeviceInfo->nativeDataFormatCount = 0; - ma_device_info_add_native_data_format(pDeviceInfo, format, channels, sampleRate, 0); - } - #endif - - return MA_SUCCESS; -} - -static ma_result ma_context_enumerate_devices__audio4(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - const int maxDevices = 64; - char devpath[256]; - int iDevice; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* - Every device will be named "/dev/audioN", with a "/dev/audioctlN" equivalent. We use the "/dev/audioctlN" - version here since we can open it even when another process has control of the "/dev/audioN" device. - */ - for (iDevice = 0; iDevice < maxDevices; ++iDevice) { - struct stat st; - int fd; - ma_bool32 isTerminating = MA_FALSE; - - ma_strcpy_s(devpath, sizeof(devpath), "/dev/audioctl"); - ma_itoa_s(iDevice, devpath+strlen(devpath), sizeof(devpath)-strlen(devpath), 10); - - if (stat(devpath, &st) < 0) { - break; - } - - /* The device exists, but we need to check if it's usable as playback and/or capture. */ - - /* Playback. */ - if (!isTerminating) { - fd = open(devpath, O_RDONLY, 0); - if (fd >= 0) { - /* Supports playback. */ - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_construct_device_id__audio4(deviceInfo.id.audio4, sizeof(deviceInfo.id.audio4), "/dev/audio", iDevice); - if (ma_context_get_device_info_from_fd__audio4(pContext, ma_device_type_playback, fd, &deviceInfo) == MA_SUCCESS) { - isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - - close(fd); - } - } - - /* Capture. */ - if (!isTerminating) { - fd = open(devpath, O_WRONLY, 0); - if (fd >= 0) { - /* Supports capture. */ - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_construct_device_id__audio4(deviceInfo.id.audio4, sizeof(deviceInfo.id.audio4), "/dev/audio", iDevice); - if (ma_context_get_device_info_from_fd__audio4(pContext, ma_device_type_capture, fd, &deviceInfo) == MA_SUCCESS) { - isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - - close(fd); - } - } - - if (isTerminating) { - break; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__audio4(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - int fd = -1; - int deviceIndex = -1; - char ctlid[256]; - ma_result result; - - MA_ASSERT(pContext != NULL); - - /* - We need to open the "/dev/audioctlN" device to get the info. To do this we need to extract the number - from the device ID which will be in "/dev/audioN" format. - */ - if (pDeviceID == NULL) { - /* Default device. */ - ma_strcpy_s(ctlid, sizeof(ctlid), "/dev/audioctl"); - } else { - /* Specific device. We need to convert from "/dev/audioN" to "/dev/audioctlN". */ - result = ma_extract_device_index_from_id__audio4(pDeviceID->audio4, "/dev/audio", &deviceIndex); - if (result != MA_SUCCESS) { - return result; - } - - ma_construct_device_id__audio4(ctlid, sizeof(ctlid), "/dev/audioctl", deviceIndex); - } - - fd = open(ctlid, (deviceType == ma_device_type_playback) ? O_WRONLY : O_RDONLY, 0); - if (fd == -1) { - return MA_NO_DEVICE; - } - - if (deviceIndex == -1) { - ma_strcpy_s(pDeviceInfo->id.audio4, sizeof(pDeviceInfo->id.audio4), "/dev/audio"); - } else { - ma_construct_device_id__audio4(pDeviceInfo->id.audio4, sizeof(pDeviceInfo->id.audio4), "/dev/audio", deviceIndex); - } - - result = ma_context_get_device_info_from_fd__audio4(pContext, deviceType, fd, pDeviceInfo); - - close(fd); - return result; -} - -static ma_result ma_device_uninit__audio4(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - close(pDevice->audio4.fdCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - close(pDevice->audio4.fdPlayback); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_init_fd__audio4(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType) -{ - const char* pDefaultDeviceNames[] = { - "/dev/audio", - "/dev/audio0" - }; - int fd; - int fdFlags = 0; - ma_format internalFormat; - ma_uint32 internalChannels; - ma_uint32 internalSampleRate; - ma_uint32 internalPeriodSizeInFrames; - ma_uint32 internalPeriods; - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(deviceType != ma_device_type_duplex); - MA_ASSERT(pDevice != NULL); - - /* The first thing to do is open the file. */ - if (deviceType == ma_device_type_capture) { - fdFlags = O_RDONLY; - } else { - fdFlags = O_WRONLY; - } - /*fdFlags |= O_NONBLOCK;*/ - - if (pDescriptor->pDeviceID == NULL) { - /* Default device. */ - size_t iDevice; - for (iDevice = 0; iDevice < ma_countof(pDefaultDeviceNames); ++iDevice) { - fd = open(pDefaultDeviceNames[iDevice], fdFlags, 0); - if (fd != -1) { - break; - } - } - } else { - /* Specific device. */ - fd = open(pDescriptor->pDeviceID->audio4, fdFlags, 0); - } - - if (fd == -1) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to open device."); - return ma_result_from_errno(errno); - } - - #if !defined(MA_AUDIO4_USE_NEW_API) /* Old API */ - { - audio_info_t fdInfo; - - /* - The documentation is a little bit unclear to me as to how it handles formats. It says the - following: - - Regardless of formats supported by underlying driver, the audio driver accepts the - following formats. - - By then the next sentence says this: - - `encoding` and `precision` are one of the values obtained by AUDIO_GETENC. - - It sounds like a direct contradiction to me. I'm going to play this safe any only use the - best sample format returned by AUDIO_GETENC. If the requested format is supported we'll - use that, but otherwise we'll just use our standard format priorities to pick an - appropriate one. - */ - AUDIO_INITINFO(&fdInfo); - - /* We get the driver to do as much of the data conversion as possible. */ - if (deviceType == ma_device_type_capture) { - fdInfo.mode = AUMODE_RECORD; - ma_encoding_from_format__audio4(ma_best_format_from_fd__audio4(fd, pDescriptor->format), &fdInfo.record.encoding, &fdInfo.record.precision); - - if (pDescriptor->channels != 0) { - fdInfo.record.channels = ma_clamp(pDescriptor->channels, 1, 12); /* From the documentation: `channels` ranges from 1 to 12. */ - } - - if (pDescriptor->sampleRate != 0) { - fdInfo.record.sample_rate = ma_clamp(pDescriptor->sampleRate, 1000, 192000); /* From the documentation: `frequency` ranges from 1000Hz to 192000Hz. (They mean `sample_rate` instead of `frequency`.) */ - } - } else { - fdInfo.mode = AUMODE_PLAY; - ma_encoding_from_format__audio4(ma_best_format_from_fd__audio4(fd, pDescriptor->format), &fdInfo.play.encoding, &fdInfo.play.precision); - - if (pDescriptor->channels != 0) { - fdInfo.play.channels = ma_clamp(pDescriptor->channels, 1, 12); /* From the documentation: `channels` ranges from 1 to 12. */ - } - - if (pDescriptor->sampleRate != 0) { - fdInfo.play.sample_rate = ma_clamp(pDescriptor->sampleRate, 1000, 192000); /* From the documentation: `frequency` ranges from 1000Hz to 192000Hz. (They mean `sample_rate` instead of `frequency`.) */ - } - } - - if (ioctl(fd, AUDIO_SETINFO, &fdInfo) < 0) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to set device format. AUDIO_SETINFO failed."); - return ma_result_from_errno(errno); - } - - if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] AUDIO_GETINFO failed."); - return ma_result_from_errno(errno); - } - - if (deviceType == ma_device_type_capture) { - internalFormat = ma_format_from_prinfo__audio4(&fdInfo.record); - internalChannels = fdInfo.record.channels; - internalSampleRate = fdInfo.record.sample_rate; - } else { - internalFormat = ma_format_from_prinfo__audio4(&fdInfo.play); - internalChannels = fdInfo.play.channels; - internalSampleRate = fdInfo.play.sample_rate; - } - - if (internalFormat == ma_format_unknown) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] The device's internal device format is not supported by miniaudio. The device is unusable."); - return MA_FORMAT_NOT_SUPPORTED; - } - - /* Buffer. */ - { - ma_uint32 internalPeriodSizeInBytes; - - internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, internalSampleRate, pConfig->performanceProfile); - - internalPeriodSizeInBytes = internalPeriodSizeInFrames * ma_get_bytes_per_frame(internalFormat, internalChannels); - if (internalPeriodSizeInBytes < 16) { - internalPeriodSizeInBytes = 16; - } - - internalPeriods = pDescriptor->periodCount; - if (internalPeriods < 2) { - internalPeriods = 2; - } - - /* What miniaudio calls a period, audio4 calls a block. */ - AUDIO_INITINFO(&fdInfo); - fdInfo.hiwat = internalPeriods; - fdInfo.lowat = internalPeriods-1; - fdInfo.blocksize = internalPeriodSizeInBytes; - if (ioctl(fd, AUDIO_SETINFO, &fdInfo) < 0) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to set internal buffer size. AUDIO_SETINFO failed."); - return ma_result_from_errno(errno); - } - - internalPeriods = fdInfo.hiwat; - internalPeriodSizeInFrames = fdInfo.blocksize / ma_get_bytes_per_frame(internalFormat, internalChannels); - } - } - #else - { - struct audio_swpar fdPar; - - /* We need to retrieve the format of the device so we can know the channel count and sample rate. Then we can calculate the buffer size. */ - if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to retrieve initial device parameters."); - return ma_result_from_errno(errno); - } - - internalFormat = ma_format_from_swpar__audio4(&fdPar); - internalChannels = (deviceType == ma_device_type_capture) ? fdPar.rchan : fdPar.pchan; - internalSampleRate = fdPar.rate; - - if (internalFormat == ma_format_unknown) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] The device's internal device format is not supported by miniaudio. The device is unusable."); - return MA_FORMAT_NOT_SUPPORTED; - } - - /* Buffer. */ - { - ma_uint32 internalPeriodSizeInBytes; - - internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, internalSampleRate, pConfig->performanceProfile); - - /* What miniaudio calls a period, audio4 calls a block. */ - internalPeriodSizeInBytes = internalPeriodSizeInFrames * ma_get_bytes_per_frame(internalFormat, internalChannels); - if (internalPeriodSizeInBytes < 16) { - internalPeriodSizeInBytes = 16; - } - - fdPar.nblks = pDescriptor->periodCount; - fdPar.round = internalPeriodSizeInBytes; - - if (ioctl(fd, AUDIO_SETPAR, &fdPar) < 0) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to set device parameters."); - return ma_result_from_errno(errno); - } - - if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to retrieve actual device parameters."); - return ma_result_from_errno(errno); - } - } - - internalFormat = ma_format_from_swpar__audio4(&fdPar); - internalChannels = (deviceType == ma_device_type_capture) ? fdPar.rchan : fdPar.pchan; - internalSampleRate = fdPar.rate; - internalPeriods = fdPar.nblks; - internalPeriodSizeInFrames = fdPar.round / ma_get_bytes_per_frame(internalFormat, internalChannels); - } - #endif - - if (internalFormat == ma_format_unknown) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] The device's internal device format is not supported by miniaudio. The device is unusable."); - return MA_FORMAT_NOT_SUPPORTED; - } - - if (deviceType == ma_device_type_capture) { - pDevice->audio4.fdCapture = fd; - } else { - pDevice->audio4.fdPlayback = fd; - } - - pDescriptor->format = internalFormat; - pDescriptor->channels = internalChannels; - pDescriptor->sampleRate = internalSampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_sound4, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), internalChannels); - pDescriptor->periodSizeInFrames = internalPeriodSizeInFrames; - pDescriptor->periodCount = internalPeriods; - - return MA_SUCCESS; -} - -static ma_result ma_device_init__audio4(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - MA_ASSERT(pDevice != NULL); - - MA_ZERO_OBJECT(&pDevice->audio4); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - pDevice->audio4.fdCapture = -1; - pDevice->audio4.fdPlayback = -1; - - /* - The version of the operating system dictates whether or not the device is exclusive or shared. NetBSD - introduced in-kernel mixing which means it's shared. All other BSD flavours are exclusive as far as - I'm aware. - */ -#if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 800000000 - /* NetBSD 8.0+ */ - if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) || - ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode == ma_share_mode_exclusive)) { - return MA_SHARE_MODE_NOT_SUPPORTED; - } -#else - /* All other flavors. */ -#endif - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_fd__audio4(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_fd__audio4(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback); - if (result != MA_SUCCESS) { - if (pConfig->deviceType == ma_device_type_duplex) { - close(pDevice->audio4.fdCapture); - } - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start__audio4(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - if (pDevice->audio4.fdCapture == -1) { - return MA_INVALID_ARGS; - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - if (pDevice->audio4.fdPlayback == -1) { - return MA_INVALID_ARGS; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop_fd__audio4(ma_device* pDevice, int fd) -{ - if (fd == -1) { - return MA_INVALID_ARGS; - } - -#if !defined(MA_AUDIO4_USE_NEW_API) - if (ioctl(fd, AUDIO_FLUSH, 0) < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to stop device. AUDIO_FLUSH failed."); - return ma_result_from_errno(errno); - } -#else - if (ioctl(fd, AUDIO_STOP, 0) < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to stop device. AUDIO_STOP failed."); - return ma_result_from_errno(errno); - } -#endif - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__audio4(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_result result; - - result = ma_device_stop_fd__audio4(pDevice, pDevice->audio4.fdCapture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_result result; - - /* Drain the device first. If this fails we'll just need to flush without draining. Unfortunately draining isn't available on newer version of OpenBSD. */ - #if !defined(MA_AUDIO4_USE_NEW_API) - ioctl(pDevice->audio4.fdPlayback, AUDIO_DRAIN, 0); - #endif - - /* Here is where the device is stopped immediately. */ - result = ma_device_stop_fd__audio4(pDevice, pDevice->audio4.fdPlayback); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_write__audio4(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - int result; - - if (pFramesWritten != NULL) { - *pFramesWritten = 0; - } - - result = write(pDevice->audio4.fdPlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels)); - if (result < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to write data to the device."); - return ma_result_from_errno(errno); - } - - if (pFramesWritten != NULL) { - *pFramesWritten = (ma_uint32)result / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_read__audio4(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - int result; - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - result = read(pDevice->audio4.fdCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels)); - if (result < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[audio4] Failed to read data from the device."); - return ma_result_from_errno(errno); - } - - if (pFramesRead != NULL) { - *pFramesRead = (ma_uint32)result / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - } - - return MA_SUCCESS; -} - -static ma_result ma_context_uninit__audio4(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_audio4); - - (void)pContext; - return MA_SUCCESS; -} - -static ma_result ma_context_init__audio4(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - MA_ASSERT(pContext != NULL); - - (void)pConfig; - - pCallbacks->onContextInit = ma_context_init__audio4; - pCallbacks->onContextUninit = ma_context_uninit__audio4; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__audio4; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__audio4; - pCallbacks->onDeviceInit = ma_device_init__audio4; - pCallbacks->onDeviceUninit = ma_device_uninit__audio4; - pCallbacks->onDeviceStart = ma_device_start__audio4; - pCallbacks->onDeviceStop = ma_device_stop__audio4; - pCallbacks->onDeviceRead = ma_device_read__audio4; - pCallbacks->onDeviceWrite = ma_device_write__audio4; - pCallbacks->onDeviceDataLoop = NULL; - - return MA_SUCCESS; -} -#endif /* audio4 */ - - -/****************************************************************************** - -OSS Backend - -******************************************************************************/ -#ifdef MA_HAS_OSS -#include -#include -#include -#include - -#ifndef SNDCTL_DSP_HALT -#define SNDCTL_DSP_HALT SNDCTL_DSP_RESET -#endif - -#define MA_OSS_DEFAULT_DEVICE_NAME "/dev/dsp" - -static int ma_open_temp_device__oss() -{ - /* The OSS sample code uses "/dev/mixer" as the device for getting system properties so I'm going to do the same. */ - int fd = open("/dev/mixer", O_RDONLY, 0); - if (fd >= 0) { - return fd; - } - - return -1; -} - -static ma_result ma_context_open_device__oss(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, int* pfd) -{ - const char* deviceName; - int flags; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pfd != NULL); - (void)pContext; - - *pfd = -1; - - /* This function should only be called for playback or capture, not duplex. */ - if (deviceType == ma_device_type_duplex) { - return MA_INVALID_ARGS; - } - - deviceName = MA_OSS_DEFAULT_DEVICE_NAME; - if (pDeviceID != NULL) { - deviceName = pDeviceID->oss; - } - - flags = (deviceType == ma_device_type_playback) ? O_WRONLY : O_RDONLY; - if (shareMode == ma_share_mode_exclusive) { - flags |= O_EXCL; - } - - *pfd = open(deviceName, flags, 0); - if (*pfd == -1) { - return ma_result_from_errno(errno); - } - - return MA_SUCCESS; -} - -static ma_result ma_context_enumerate_devices__oss(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - int fd; - oss_sysinfo si; - int result; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - fd = ma_open_temp_device__oss(); - if (fd == -1) { - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[OSS] Failed to open a temporary device for retrieving system information used for device enumeration."); - return MA_NO_BACKEND; - } - - result = ioctl(fd, SNDCTL_SYSINFO, &si); - if (result != -1) { - int iAudioDevice; - for (iAudioDevice = 0; iAudioDevice < si.numaudios; ++iAudioDevice) { - oss_audioinfo ai; - ai.dev = iAudioDevice; - result = ioctl(fd, SNDCTL_AUDIOINFO, &ai); - if (result != -1) { - if (ai.devnode[0] != '\0') { /* <-- Can be blank, according to documentation. */ - ma_device_info deviceInfo; - ma_bool32 isTerminating = MA_FALSE; - - MA_ZERO_OBJECT(&deviceInfo); - - /* ID */ - ma_strncpy_s(deviceInfo.id.oss, sizeof(deviceInfo.id.oss), ai.devnode, (size_t)-1); - - /* - The human readable device name should be in the "ai.handle" variable, but it can - sometimes be empty in which case we just fall back to "ai.name" which is less user - friendly, but usually has a value. - */ - if (ai.handle[0] != '\0') { - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), ai.handle, (size_t)-1); - } else { - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), ai.name, (size_t)-1); - } - - /* The device can be both playback and capture. */ - if (!isTerminating && (ai.caps & PCM_CAP_OUTPUT) != 0) { - isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - if (!isTerminating && (ai.caps & PCM_CAP_INPUT) != 0) { - isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - - if (isTerminating) { - break; - } - } - } - } - } else { - close(fd); - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[OSS] Failed to retrieve system information for device enumeration."); - return MA_NO_BACKEND; - } - - close(fd); - return MA_SUCCESS; -} - -static void ma_context_add_native_data_format__oss(ma_context* pContext, oss_audioinfo* pAudioInfo, ma_format format, ma_device_info* pDeviceInfo) -{ - unsigned int minChannels; - unsigned int maxChannels; - unsigned int iRate; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pAudioInfo != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - /* If we support all channels we just report 0. */ - minChannels = ma_clamp(pAudioInfo->min_channels, MA_MIN_CHANNELS, MA_MAX_CHANNELS); - maxChannels = ma_clamp(pAudioInfo->max_channels, MA_MIN_CHANNELS, MA_MAX_CHANNELS); - - /* - OSS has this annoying thing where sample rates can be reported in two ways. We prefer explicitness, - which OSS has in the form of nrates/rates, however there are times where nrates can be 0, in which - case we'll need to use min_rate and max_rate and report only standard rates. - */ - if (pAudioInfo->nrates > 0) { - for (iRate = 0; iRate < pAudioInfo->nrates; iRate += 1) { - unsigned int rate = pAudioInfo->rates[iRate]; - - if (minChannels == MA_MIN_CHANNELS && maxChannels == MA_MAX_CHANNELS) { - ma_device_info_add_native_data_format(pDeviceInfo, format, 0, rate, 0); /* Set the channel count to 0 to indicate that all channel counts are supported. */ - } else { - unsigned int iChannel; - for (iChannel = minChannels; iChannel <= maxChannels; iChannel += 1) { - ma_device_info_add_native_data_format(pDeviceInfo, format, iChannel, rate, 0); - } - } - } - } else { - for (iRate = 0; iRate < ma_countof(g_maStandardSampleRatePriorities); iRate += 1) { - ma_uint32 standardRate = g_maStandardSampleRatePriorities[iRate]; - - if (standardRate >= (ma_uint32)pAudioInfo->min_rate && standardRate <= (ma_uint32)pAudioInfo->max_rate) { - if (minChannels == MA_MIN_CHANNELS && maxChannels == MA_MAX_CHANNELS) { - ma_device_info_add_native_data_format(pDeviceInfo, format, 0, standardRate, 0); /* Set the channel count to 0 to indicate that all channel counts are supported. */ - } else { - unsigned int iChannel; - for (iChannel = minChannels; iChannel <= maxChannels; iChannel += 1) { - ma_device_info_add_native_data_format(pDeviceInfo, format, iChannel, standardRate, 0); - } - } - } - } - } -} - -static ma_result ma_context_get_device_info__oss(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_bool32 foundDevice; - int fdTemp; - oss_sysinfo si; - int result; - - MA_ASSERT(pContext != NULL); - - /* Handle the default device a little differently. */ - if (pDeviceID == NULL) { - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - - return MA_SUCCESS; - } - - - /* If we get here it means we are _not_ using the default device. */ - foundDevice = MA_FALSE; - - fdTemp = ma_open_temp_device__oss(); - if (fdTemp == -1) { - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[OSS] Failed to open a temporary device for retrieving system information used for device enumeration."); - return MA_NO_BACKEND; - } - - result = ioctl(fdTemp, SNDCTL_SYSINFO, &si); - if (result != -1) { - int iAudioDevice; - for (iAudioDevice = 0; iAudioDevice < si.numaudios; ++iAudioDevice) { - oss_audioinfo ai; - ai.dev = iAudioDevice; - result = ioctl(fdTemp, SNDCTL_AUDIOINFO, &ai); - if (result != -1) { - if (ma_strcmp(ai.devnode, pDeviceID->oss) == 0) { - /* It has the same name, so now just confirm the type. */ - if ((deviceType == ma_device_type_playback && ((ai.caps & PCM_CAP_OUTPUT) != 0)) || - (deviceType == ma_device_type_capture && ((ai.caps & PCM_CAP_INPUT) != 0))) { - unsigned int formatMask; - - /* ID */ - ma_strncpy_s(pDeviceInfo->id.oss, sizeof(pDeviceInfo->id.oss), ai.devnode, (size_t)-1); - - /* - The human readable device name should be in the "ai.handle" variable, but it can - sometimes be empty in which case we just fall back to "ai.name" which is less user - friendly, but usually has a value. - */ - if (ai.handle[0] != '\0') { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), ai.handle, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), ai.name, (size_t)-1); - } - - - pDeviceInfo->nativeDataFormatCount = 0; - - if (deviceType == ma_device_type_playback) { - formatMask = ai.oformats; - } else { - formatMask = ai.iformats; - } - - if (((formatMask & AFMT_S16_LE) != 0 && ma_is_little_endian()) || (AFMT_S16_BE && ma_is_big_endian())) { - ma_context_add_native_data_format__oss(pContext, &ai, ma_format_s16, pDeviceInfo); - } - if (((formatMask & AFMT_S32_LE) != 0 && ma_is_little_endian()) || (AFMT_S32_BE && ma_is_big_endian())) { - ma_context_add_native_data_format__oss(pContext, &ai, ma_format_s32, pDeviceInfo); - } - if ((formatMask & AFMT_U8) != 0) { - ma_context_add_native_data_format__oss(pContext, &ai, ma_format_u8, pDeviceInfo); - } - - foundDevice = MA_TRUE; - break; - } - } - } - } - } else { - close(fdTemp); - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[OSS] Failed to retrieve system information for device enumeration."); - return MA_NO_BACKEND; - } - - - close(fdTemp); - - if (!foundDevice) { - return MA_NO_DEVICE; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_uninit__oss(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - close(pDevice->oss.fdCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - close(pDevice->oss.fdPlayback); - } - - return MA_SUCCESS; -} - -static int ma_format_to_oss(ma_format format) -{ - int ossFormat = AFMT_U8; - switch (format) { - case ma_format_s16: ossFormat = (ma_is_little_endian()) ? AFMT_S16_LE : AFMT_S16_BE; break; - case ma_format_s24: ossFormat = (ma_is_little_endian()) ? AFMT_S32_LE : AFMT_S32_BE; break; - case ma_format_s32: ossFormat = (ma_is_little_endian()) ? AFMT_S32_LE : AFMT_S32_BE; break; - case ma_format_f32: ossFormat = (ma_is_little_endian()) ? AFMT_S16_LE : AFMT_S16_BE; break; - case ma_format_u8: - default: ossFormat = AFMT_U8; break; - } - - return ossFormat; -} - -static ma_format ma_format_from_oss(int ossFormat) -{ - if (ossFormat == AFMT_U8) { - return ma_format_u8; - } else { - if (ma_is_little_endian()) { - switch (ossFormat) { - case AFMT_S16_LE: return ma_format_s16; - case AFMT_S32_LE: return ma_format_s32; - default: return ma_format_unknown; - } - } else { - switch (ossFormat) { - case AFMT_S16_BE: return ma_format_s16; - case AFMT_S32_BE: return ma_format_s32; - default: return ma_format_unknown; - } - } - } - - return ma_format_unknown; -} - -static ma_result ma_device_init_fd__oss(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType) -{ - ma_result result; - int ossResult; - int fd; - const ma_device_id* pDeviceID = NULL; - ma_share_mode shareMode; - int ossFormat; - int ossChannels; - int ossSampleRate; - int ossFragment; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(deviceType != ma_device_type_duplex); - - pDeviceID = pDescriptor->pDeviceID; - shareMode = pDescriptor->shareMode; - ossFormat = ma_format_to_oss((pDescriptor->format != ma_format_unknown) ? pDescriptor->format : ma_format_s16); /* Use s16 by default because OSS doesn't like floating point. */ - ossChannels = (int)(pDescriptor->channels > 0) ? pDescriptor->channels : MA_DEFAULT_CHANNELS; - ossSampleRate = (int)(pDescriptor->sampleRate > 0) ? pDescriptor->sampleRate : MA_DEFAULT_SAMPLE_RATE; - - result = ma_context_open_device__oss(pDevice->pContext, deviceType, pDeviceID, shareMode, &fd); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to open device."); - return result; - } - - /* - The OSS documantation is very clear about the order we should be initializing the device's properties: - 1) Format - 2) Channels - 3) Sample rate. - */ - - /* Format. */ - ossResult = ioctl(fd, SNDCTL_DSP_SETFMT, &ossFormat); - if (ossResult == -1) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to set format."); - return ma_result_from_errno(errno); - } - - /* Channels. */ - ossResult = ioctl(fd, SNDCTL_DSP_CHANNELS, &ossChannels); - if (ossResult == -1) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to set channel count."); - return ma_result_from_errno(errno); - } - - /* Sample Rate. */ - ossResult = ioctl(fd, SNDCTL_DSP_SPEED, &ossSampleRate); - if (ossResult == -1) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to set sample rate."); - return ma_result_from_errno(errno); - } - - /* - Buffer. - - The documentation says that the fragment settings should be set as soon as possible, but I'm not sure if - it should be done before or after format/channels/rate. - - OSS wants the fragment size in bytes and a power of 2. When setting, we specify the power, not the actual - value. - */ - { - ma_uint32 periodSizeInFrames; - ma_uint32 periodSizeInBytes; - ma_uint32 ossFragmentSizePower; - - periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, (ma_uint32)ossSampleRate, pConfig->performanceProfile); - - periodSizeInBytes = ma_round_to_power_of_2(periodSizeInFrames * ma_get_bytes_per_frame(ma_format_from_oss(ossFormat), ossChannels)); - if (periodSizeInBytes < 16) { - periodSizeInBytes = 16; - } - - ossFragmentSizePower = 4; - periodSizeInBytes >>= 4; - while (periodSizeInBytes >>= 1) { - ossFragmentSizePower += 1; - } - - ossFragment = (int)((pConfig->periods << 16) | ossFragmentSizePower); - ossResult = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &ossFragment); - if (ossResult == -1) { - close(fd); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to set fragment size and period count."); - return ma_result_from_errno(errno); - } - } - - /* Internal settings. */ - if (deviceType == ma_device_type_capture) { - pDevice->oss.fdCapture = fd; - } else { - pDevice->oss.fdPlayback = fd; - } - - pDescriptor->format = ma_format_from_oss(ossFormat); - pDescriptor->channels = ossChannels; - pDescriptor->sampleRate = ossSampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_sound4, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), pDescriptor->channels); - pDescriptor->periodCount = (ma_uint32)(ossFragment >> 16); - pDescriptor->periodSizeInFrames = (ma_uint32)(1 << (ossFragment & 0xFFFF)) / ma_get_bytes_per_frame(pDescriptor->format, pDescriptor->channels); - - if (pDescriptor->format == ma_format_unknown) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] The device's internal format is not supported by miniaudio."); - return MA_FORMAT_NOT_SUPPORTED; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_init__oss(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pConfig != NULL); - - MA_ZERO_OBJECT(&pDevice->oss); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_fd__oss(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to open device."); - return result; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_result result = ma_device_init_fd__oss(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback); - if (result != MA_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to open device."); - return result; - } - } - - return MA_SUCCESS; -} - -/* -Note on Starting and Stopping -============================= -In the past I was using SNDCTL_DSP_HALT to stop the device, however this results in issues when -trying to resume the device again. If we use SNDCTL_DSP_HALT, the next write() or read() will -fail. Instead what we need to do is just not write or read to and from the device when the -device is not running. - -As a result, both the start and stop functions for OSS are just empty stubs. The starting and -stopping logic is handled by ma_device_write__oss() and ma_device_read__oss(). These will check -the device state, and if the device is stopped they will simply not do any kind of processing. - -The downside to this technique is that I've noticed a fairly lengthy delay in stopping the -device, up to a second. This is on a virtual machine, and as such might just be due to the -virtual drivers, but I'm not fully sure. I am not sure how to work around this problem so for -the moment that's just how it's going to have to be. - -When starting the device, OSS will automatically start it when write() or read() is called. -*/ -static ma_result ma_device_start__oss(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - /* The device is automatically started with reading and writing. */ - (void)pDevice; - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__oss(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - /* See note above on why this is empty. */ - (void)pDevice; - - return MA_SUCCESS; -} - -static ma_result ma_device_write__oss(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten) -{ - int resultOSS; - ma_uint32 deviceState; - - if (pFramesWritten != NULL) { - *pFramesWritten = 0; - } - - /* Don't do any processing if the device is stopped. */ - deviceState = ma_device_get_state(pDevice); - if (deviceState != ma_device_state_started && deviceState != ma_device_state_starting) { - return MA_SUCCESS; - } - - resultOSS = write(pDevice->oss.fdPlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels)); - if (resultOSS < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to send data from the client to the device."); - return ma_result_from_errno(errno); - } - - if (pFramesWritten != NULL) { - *pFramesWritten = (ma_uint32)resultOSS / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_read__oss(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead) -{ - int resultOSS; - ma_uint32 deviceState; - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - /* Don't do any processing if the device is stopped. */ - deviceState = ma_device_get_state(pDevice); - if (deviceState != ma_device_state_started && deviceState != ma_device_state_starting) { - return MA_SUCCESS; - } - - resultOSS = read(pDevice->oss.fdCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels)); - if (resultOSS < 0) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OSS] Failed to read data from the device to be sent to the client."); - return ma_result_from_errno(errno); - } - - if (pFramesRead != NULL) { - *pFramesRead = (ma_uint32)resultOSS / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - } - - return MA_SUCCESS; -} - -static ma_result ma_context_uninit__oss(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_oss); - - (void)pContext; - return MA_SUCCESS; -} - -static ma_result ma_context_init__oss(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - int fd; - int ossVersion; - int result; - - MA_ASSERT(pContext != NULL); - - (void)pConfig; - - /* Try opening a temporary device first so we can get version information. This is closed at the end. */ - fd = ma_open_temp_device__oss(); - if (fd == -1) { - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[OSS] Failed to open temporary device for retrieving system properties."); /* Looks liks OSS isn't installed, or there are no available devices. */ - return MA_NO_BACKEND; - } - - /* Grab the OSS version. */ - ossVersion = 0; - result = ioctl(fd, OSS_GETVERSION, &ossVersion); - if (result == -1) { - close(fd); - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[OSS] Failed to retrieve OSS version."); - return MA_NO_BACKEND; - } - - /* The file handle to temp device is no longer needed. Close ASAP. */ - close(fd); - - pContext->oss.versionMajor = ((ossVersion & 0xFF0000) >> 16); - pContext->oss.versionMinor = ((ossVersion & 0x00FF00) >> 8); - - pCallbacks->onContextInit = ma_context_init__oss; - pCallbacks->onContextUninit = ma_context_uninit__oss; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__oss; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__oss; - pCallbacks->onDeviceInit = ma_device_init__oss; - pCallbacks->onDeviceUninit = ma_device_uninit__oss; - pCallbacks->onDeviceStart = ma_device_start__oss; - pCallbacks->onDeviceStop = ma_device_stop__oss; - pCallbacks->onDeviceRead = ma_device_read__oss; - pCallbacks->onDeviceWrite = ma_device_write__oss; - pCallbacks->onDeviceDataLoop = NULL; - - return MA_SUCCESS; -} -#endif /* OSS */ - - -/****************************************************************************** - -AAudio Backend - -******************************************************************************/ -#ifdef MA_HAS_AAUDIO - -/*#include */ - -typedef int32_t ma_aaudio_result_t; -typedef int32_t ma_aaudio_direction_t; -typedef int32_t ma_aaudio_sharing_mode_t; -typedef int32_t ma_aaudio_format_t; -typedef int32_t ma_aaudio_stream_state_t; -typedef int32_t ma_aaudio_performance_mode_t; -typedef int32_t ma_aaudio_usage_t; -typedef int32_t ma_aaudio_content_type_t; -typedef int32_t ma_aaudio_input_preset_t; -typedef int32_t ma_aaudio_data_callback_result_t; -typedef struct ma_AAudioStreamBuilder_t* ma_AAudioStreamBuilder; -typedef struct ma_AAudioStream_t* ma_AAudioStream; - -#define MA_AAUDIO_UNSPECIFIED 0 - -/* Result codes. miniaudio only cares about the success code. */ -#define MA_AAUDIO_OK 0 - -/* Directions. */ -#define MA_AAUDIO_DIRECTION_OUTPUT 0 -#define MA_AAUDIO_DIRECTION_INPUT 1 - -/* Sharing modes. */ -#define MA_AAUDIO_SHARING_MODE_EXCLUSIVE 0 -#define MA_AAUDIO_SHARING_MODE_SHARED 1 - -/* Formats. */ -#define MA_AAUDIO_FORMAT_PCM_I16 1 -#define MA_AAUDIO_FORMAT_PCM_FLOAT 2 - -/* Stream states. */ -#define MA_AAUDIO_STREAM_STATE_UNINITIALIZED 0 -#define MA_AAUDIO_STREAM_STATE_UNKNOWN 1 -#define MA_AAUDIO_STREAM_STATE_OPEN 2 -#define MA_AAUDIO_STREAM_STATE_STARTING 3 -#define MA_AAUDIO_STREAM_STATE_STARTED 4 -#define MA_AAUDIO_STREAM_STATE_PAUSING 5 -#define MA_AAUDIO_STREAM_STATE_PAUSED 6 -#define MA_AAUDIO_STREAM_STATE_FLUSHING 7 -#define MA_AAUDIO_STREAM_STATE_FLUSHED 8 -#define MA_AAUDIO_STREAM_STATE_STOPPING 9 -#define MA_AAUDIO_STREAM_STATE_STOPPED 10 -#define MA_AAUDIO_STREAM_STATE_CLOSING 11 -#define MA_AAUDIO_STREAM_STATE_CLOSED 12 -#define MA_AAUDIO_STREAM_STATE_DISCONNECTED 13 - -/* Performance modes. */ -#define MA_AAUDIO_PERFORMANCE_MODE_NONE 10 -#define MA_AAUDIO_PERFORMANCE_MODE_POWER_SAVING 11 -#define MA_AAUDIO_PERFORMANCE_MODE_LOW_LATENCY 12 - -/* Usage types. */ -#define MA_AAUDIO_USAGE_MEDIA 1 -#define MA_AAUDIO_USAGE_VOICE_COMMUNICATION 2 -#define MA_AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING 3 -#define MA_AAUDIO_USAGE_ALARM 4 -#define MA_AAUDIO_USAGE_NOTIFICATION 5 -#define MA_AAUDIO_USAGE_NOTIFICATION_RINGTONE 6 -#define MA_AAUDIO_USAGE_NOTIFICATION_EVENT 10 -#define MA_AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY 11 -#define MA_AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE 12 -#define MA_AAUDIO_USAGE_ASSISTANCE_SONIFICATION 13 -#define MA_AAUDIO_USAGE_GAME 14 -#define MA_AAUDIO_USAGE_ASSISTANT 16 -#define MA_AAUDIO_SYSTEM_USAGE_EMERGENCY 1000 -#define MA_AAUDIO_SYSTEM_USAGE_SAFETY 1001 -#define MA_AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS 1002 -#define MA_AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT 1003 - -/* Content types. */ -#define MA_AAUDIO_CONTENT_TYPE_SPEECH 1 -#define MA_AAUDIO_CONTENT_TYPE_MUSIC 2 -#define MA_AAUDIO_CONTENT_TYPE_MOVIE 3 -#define MA_AAUDIO_CONTENT_TYPE_SONIFICATION 4 - -/* Input presets. */ -#define MA_AAUDIO_INPUT_PRESET_GENERIC 1 -#define MA_AAUDIO_INPUT_PRESET_CAMCORDER 5 -#define MA_AAUDIO_INPUT_PRESET_VOICE_RECOGNITION 6 -#define MA_AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION 7 -#define MA_AAUDIO_INPUT_PRESET_UNPROCESSED 9 -#define MA_AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE 10 - -/* Callback results. */ -#define MA_AAUDIO_CALLBACK_RESULT_CONTINUE 0 -#define MA_AAUDIO_CALLBACK_RESULT_STOP 1 - - -typedef ma_aaudio_data_callback_result_t (* ma_AAudioStream_dataCallback) (ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t numFrames); -typedef void (* ma_AAudioStream_errorCallback)(ma_AAudioStream *pStream, void *pUserData, ma_aaudio_result_t error); - -typedef ma_aaudio_result_t (* MA_PFN_AAudio_createStreamBuilder) (ma_AAudioStreamBuilder** ppBuilder); -typedef ma_aaudio_result_t (* MA_PFN_AAudioStreamBuilder_delete) (ma_AAudioStreamBuilder* pBuilder); -typedef void (* MA_PFN_AAudioStreamBuilder_setDeviceId) (ma_AAudioStreamBuilder* pBuilder, int32_t deviceId); -typedef void (* MA_PFN_AAudioStreamBuilder_setDirection) (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_direction_t direction); -typedef void (* MA_PFN_AAudioStreamBuilder_setSharingMode) (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_sharing_mode_t sharingMode); -typedef void (* MA_PFN_AAudioStreamBuilder_setFormat) (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_format_t format); -typedef void (* MA_PFN_AAudioStreamBuilder_setChannelCount) (ma_AAudioStreamBuilder* pBuilder, int32_t channelCount); -typedef void (* MA_PFN_AAudioStreamBuilder_setSampleRate) (ma_AAudioStreamBuilder* pBuilder, int32_t sampleRate); -typedef void (* MA_PFN_AAudioStreamBuilder_setBufferCapacityInFrames)(ma_AAudioStreamBuilder* pBuilder, int32_t numFrames); -typedef void (* MA_PFN_AAudioStreamBuilder_setFramesPerDataCallback) (ma_AAudioStreamBuilder* pBuilder, int32_t numFrames); -typedef void (* MA_PFN_AAudioStreamBuilder_setDataCallback) (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream_dataCallback callback, void* pUserData); -typedef void (* MA_PFN_AAudioStreamBuilder_setErrorCallback) (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream_errorCallback callback, void* pUserData); -typedef void (* MA_PFN_AAudioStreamBuilder_setPerformanceMode) (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_performance_mode_t mode); -typedef void (* MA_PFN_AAudioStreamBuilder_setUsage) (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_usage_t contentType); -typedef void (* MA_PFN_AAudioStreamBuilder_setContentType) (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_content_type_t contentType); -typedef void (* MA_PFN_AAudioStreamBuilder_setInputPreset) (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_input_preset_t inputPreset); -typedef ma_aaudio_result_t (* MA_PFN_AAudioStreamBuilder_openStream) (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream** ppStream); -typedef ma_aaudio_result_t (* MA_PFN_AAudioStream_close) (ma_AAudioStream* pStream); -typedef ma_aaudio_stream_state_t (* MA_PFN_AAudioStream_getState) (ma_AAudioStream* pStream); -typedef ma_aaudio_result_t (* MA_PFN_AAudioStream_waitForStateChange) (ma_AAudioStream* pStream, ma_aaudio_stream_state_t inputState, ma_aaudio_stream_state_t* pNextState, int64_t timeoutInNanoseconds); -typedef ma_aaudio_format_t (* MA_PFN_AAudioStream_getFormat) (ma_AAudioStream* pStream); -typedef int32_t (* MA_PFN_AAudioStream_getChannelCount) (ma_AAudioStream* pStream); -typedef int32_t (* MA_PFN_AAudioStream_getSampleRate) (ma_AAudioStream* pStream); -typedef int32_t (* MA_PFN_AAudioStream_getBufferCapacityInFrames) (ma_AAudioStream* pStream); -typedef int32_t (* MA_PFN_AAudioStream_getFramesPerDataCallback) (ma_AAudioStream* pStream); -typedef int32_t (* MA_PFN_AAudioStream_getFramesPerBurst) (ma_AAudioStream* pStream); -typedef ma_aaudio_result_t (* MA_PFN_AAudioStream_requestStart) (ma_AAudioStream* pStream); -typedef ma_aaudio_result_t (* MA_PFN_AAudioStream_requestStop) (ma_AAudioStream* pStream); - -static ma_result ma_result_from_aaudio(ma_aaudio_result_t resultAA) -{ - switch (resultAA) - { - case MA_AAUDIO_OK: return MA_SUCCESS; - default: break; - } - - return MA_ERROR; -} - -static ma_aaudio_usage_t ma_to_usage__aaudio(ma_aaudio_usage usage) -{ - switch (usage) { - case ma_aaudio_usage_announcement: return MA_AAUDIO_USAGE_MEDIA; - case ma_aaudio_usage_emergency: return MA_AAUDIO_USAGE_VOICE_COMMUNICATION; - case ma_aaudio_usage_safety: return MA_AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING; - case ma_aaudio_usage_vehicle_status: return MA_AAUDIO_USAGE_ALARM; - case ma_aaudio_usage_alarm: return MA_AAUDIO_USAGE_NOTIFICATION; - case ma_aaudio_usage_assistance_accessibility: return MA_AAUDIO_USAGE_NOTIFICATION_RINGTONE; - case ma_aaudio_usage_assistance_navigation_guidance: return MA_AAUDIO_USAGE_NOTIFICATION_EVENT; - case ma_aaudio_usage_assistance_sonification: return MA_AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY; - case ma_aaudio_usage_assitant: return MA_AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE; - case ma_aaudio_usage_game: return MA_AAUDIO_USAGE_ASSISTANCE_SONIFICATION; - case ma_aaudio_usage_media: return MA_AAUDIO_USAGE_GAME; - case ma_aaudio_usage_notification: return MA_AAUDIO_USAGE_ASSISTANT; - case ma_aaudio_usage_notification_event: return MA_AAUDIO_SYSTEM_USAGE_EMERGENCY; - case ma_aaudio_usage_notification_ringtone: return MA_AAUDIO_SYSTEM_USAGE_SAFETY; - case ma_aaudio_usage_voice_communication: return MA_AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS; - case ma_aaudio_usage_voice_communication_signalling: return MA_AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT; - default: break; - } - - return MA_AAUDIO_USAGE_MEDIA; -} - -static ma_aaudio_content_type_t ma_to_content_type__aaudio(ma_aaudio_content_type contentType) -{ - switch (contentType) { - case ma_aaudio_content_type_movie: return MA_AAUDIO_CONTENT_TYPE_MOVIE; - case ma_aaudio_content_type_music: return MA_AAUDIO_CONTENT_TYPE_MUSIC; - case ma_aaudio_content_type_sonification: return MA_AAUDIO_CONTENT_TYPE_SONIFICATION; - case ma_aaudio_content_type_speech: return MA_AAUDIO_CONTENT_TYPE_SPEECH; - default: break; - } - - return MA_AAUDIO_CONTENT_TYPE_SPEECH; -} - -static ma_aaudio_input_preset_t ma_to_input_preset__aaudio(ma_aaudio_input_preset inputPreset) -{ - switch (inputPreset) { - case ma_aaudio_input_preset_generic: return MA_AAUDIO_INPUT_PRESET_GENERIC; - case ma_aaudio_input_preset_camcorder: return MA_AAUDIO_INPUT_PRESET_CAMCORDER; - case ma_aaudio_input_preset_unprocessed: return MA_AAUDIO_INPUT_PRESET_UNPROCESSED; - case ma_aaudio_input_preset_voice_recognition: return MA_AAUDIO_INPUT_PRESET_VOICE_RECOGNITION; - case ma_aaudio_input_preset_voice_communication: return MA_AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION; - case ma_aaudio_input_preset_voice_performance: return MA_AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE; - default: break; - } - - return MA_AAUDIO_INPUT_PRESET_GENERIC; -} - -static void ma_stream_error_callback__aaudio(ma_AAudioStream* pStream, void* pUserData, ma_aaudio_result_t error) -{ - ma_device* pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - (void)error; - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] ERROR CALLBACK: error=%d, AAudioStream_getState()=%d\n", error, ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream)); - - /* - From the documentation for AAudio, when a device is disconnected all we can do is stop it. However, we cannot stop it from the callback - we need - to do it from another thread. Therefore we are going to use an event thread for the AAudio backend to do this cleanly and safely. - */ - if (((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream) == MA_AAUDIO_STREAM_STATE_DISCONNECTED) { - /* We need to post a job to the job thread for processing. This will reroute the device by reinitializing the stream. */ - ma_result result; - ma_job job = ma_job_init(MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE); - job.data.device.aaudio.reroute.pDevice = pDevice; - - if (pStream == pDevice->aaudio.pStreamCapture) { - job.data.device.aaudio.reroute.deviceType = ma_device_type_capture; - } else { - job.data.device.aaudio.reroute.deviceType = ma_device_type_playback; - } - - result = ma_device_job_thread_post(&pDevice->pContext->aaudio.jobThread, &job); - if (result != MA_SUCCESS) { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[AAudio] Device Disconnected. Failed to post job for rerouting.\n"); - return; - } - } -} - -static ma_aaudio_data_callback_result_t ma_stream_data_callback_capture__aaudio(ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t frameCount) -{ - ma_device* pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - ma_device_handle_backend_data_callback(pDevice, NULL, pAudioData, frameCount); - - (void)pStream; - return MA_AAUDIO_CALLBACK_RESULT_CONTINUE; -} - -static ma_aaudio_data_callback_result_t ma_stream_data_callback_playback__aaudio(ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t frameCount) -{ - ma_device* pDevice = (ma_device*)pUserData; - MA_ASSERT(pDevice != NULL); - - ma_device_handle_backend_data_callback(pDevice, pAudioData, NULL, frameCount); - - (void)pStream; - return MA_AAUDIO_CALLBACK_RESULT_CONTINUE; -} - -static ma_result ma_create_and_configure_AAudioStreamBuilder__aaudio(ma_context* pContext, const ma_device_id* pDeviceID, ma_device_type deviceType, ma_share_mode shareMode, const ma_device_descriptor* pDescriptor, const ma_device_config* pConfig, ma_device* pDevice, ma_AAudioStreamBuilder** ppBuilder) -{ - ma_AAudioStreamBuilder* pBuilder; - ma_aaudio_result_t resultAA; - ma_uint32 bufferCapacityInFrames; - - /* Safety. */ - *ppBuilder = NULL; - - resultAA = ((MA_PFN_AAudio_createStreamBuilder)pContext->aaudio.AAudio_createStreamBuilder)(&pBuilder); - if (resultAA != MA_AAUDIO_OK) { - return ma_result_from_aaudio(resultAA); - } - - if (pDeviceID != NULL) { - ((MA_PFN_AAudioStreamBuilder_setDeviceId)pContext->aaudio.AAudioStreamBuilder_setDeviceId)(pBuilder, pDeviceID->aaudio); - } - - ((MA_PFN_AAudioStreamBuilder_setDirection)pContext->aaudio.AAudioStreamBuilder_setDirection)(pBuilder, (deviceType == ma_device_type_playback) ? MA_AAUDIO_DIRECTION_OUTPUT : MA_AAUDIO_DIRECTION_INPUT); - ((MA_PFN_AAudioStreamBuilder_setSharingMode)pContext->aaudio.AAudioStreamBuilder_setSharingMode)(pBuilder, (shareMode == ma_share_mode_shared) ? MA_AAUDIO_SHARING_MODE_SHARED : MA_AAUDIO_SHARING_MODE_EXCLUSIVE); - - - /* If we have a device descriptor make sure we configure the stream builder to take our requested parameters. */ - if (pDescriptor != NULL) { - MA_ASSERT(pConfig != NULL); /* We must have a device config if we also have a descriptor. The config is required for AAudio specific configuration options. */ - - if (pDescriptor->sampleRate != 0) { - ((MA_PFN_AAudioStreamBuilder_setSampleRate)pContext->aaudio.AAudioStreamBuilder_setSampleRate)(pBuilder, pDescriptor->sampleRate); - } - - if (deviceType == ma_device_type_capture) { - if (pDescriptor->channels != 0) { - ((MA_PFN_AAudioStreamBuilder_setChannelCount)pContext->aaudio.AAudioStreamBuilder_setChannelCount)(pBuilder, pDescriptor->channels); - } - if (pDescriptor->format != ma_format_unknown) { - ((MA_PFN_AAudioStreamBuilder_setFormat)pContext->aaudio.AAudioStreamBuilder_setFormat)(pBuilder, (pDescriptor->format == ma_format_s16) ? MA_AAUDIO_FORMAT_PCM_I16 : MA_AAUDIO_FORMAT_PCM_FLOAT); - } - } else { - if (pDescriptor->channels != 0) { - ((MA_PFN_AAudioStreamBuilder_setChannelCount)pContext->aaudio.AAudioStreamBuilder_setChannelCount)(pBuilder, pDescriptor->channels); - } - if (pDescriptor->format != ma_format_unknown) { - ((MA_PFN_AAudioStreamBuilder_setFormat)pContext->aaudio.AAudioStreamBuilder_setFormat)(pBuilder, (pDescriptor->format == ma_format_s16) ? MA_AAUDIO_FORMAT_PCM_I16 : MA_AAUDIO_FORMAT_PCM_FLOAT); - } - } - - /* - AAudio is annoying when it comes to it's buffer calculation stuff because it doesn't let you - retrieve the actual sample rate until after you've opened the stream. But you need to configure - the buffer capacity before you open the stream... :/ - - To solve, we're just going to assume MA_DEFAULT_SAMPLE_RATE (48000) and move on. - */ - bufferCapacityInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, pDescriptor->sampleRate, pConfig->performanceProfile) * pDescriptor->periodCount; - - ((MA_PFN_AAudioStreamBuilder_setBufferCapacityInFrames)pContext->aaudio.AAudioStreamBuilder_setBufferCapacityInFrames)(pBuilder, bufferCapacityInFrames); - ((MA_PFN_AAudioStreamBuilder_setFramesPerDataCallback)pContext->aaudio.AAudioStreamBuilder_setFramesPerDataCallback)(pBuilder, bufferCapacityInFrames / pDescriptor->periodCount); - - if (deviceType == ma_device_type_capture) { - if (pConfig->aaudio.inputPreset != ma_aaudio_input_preset_default && pContext->aaudio.AAudioStreamBuilder_setInputPreset != NULL) { - ((MA_PFN_AAudioStreamBuilder_setInputPreset)pContext->aaudio.AAudioStreamBuilder_setInputPreset)(pBuilder, ma_to_input_preset__aaudio(pConfig->aaudio.inputPreset)); - } - - ((MA_PFN_AAudioStreamBuilder_setDataCallback)pContext->aaudio.AAudioStreamBuilder_setDataCallback)(pBuilder, ma_stream_data_callback_capture__aaudio, (void*)pDevice); - } else { - if (pConfig->aaudio.usage != ma_aaudio_usage_default && pContext->aaudio.AAudioStreamBuilder_setUsage != NULL) { - ((MA_PFN_AAudioStreamBuilder_setUsage)pContext->aaudio.AAudioStreamBuilder_setUsage)(pBuilder, ma_to_usage__aaudio(pConfig->aaudio.usage)); - } - - if (pConfig->aaudio.contentType != ma_aaudio_content_type_default && pContext->aaudio.AAudioStreamBuilder_setContentType != NULL) { - ((MA_PFN_AAudioStreamBuilder_setContentType)pContext->aaudio.AAudioStreamBuilder_setContentType)(pBuilder, ma_to_content_type__aaudio(pConfig->aaudio.contentType)); - } - - ((MA_PFN_AAudioStreamBuilder_setDataCallback)pContext->aaudio.AAudioStreamBuilder_setDataCallback)(pBuilder, ma_stream_data_callback_playback__aaudio, (void*)pDevice); - } - - /* Not sure how this affects things, but since there's a mapping between miniaudio's performance profiles and AAudio's performance modes, let go ahead and set it. */ - ((MA_PFN_AAudioStreamBuilder_setPerformanceMode)pContext->aaudio.AAudioStreamBuilder_setPerformanceMode)(pBuilder, (pConfig->performanceProfile == ma_performance_profile_low_latency) ? MA_AAUDIO_PERFORMANCE_MODE_LOW_LATENCY : MA_AAUDIO_PERFORMANCE_MODE_NONE); - - /* We need to set an error callback to detect device changes. */ - if (pDevice != NULL) { /* <-- pDevice should never be null if pDescriptor is not null, which is always the case if we hit this branch. Check anyway for safety. */ - ((MA_PFN_AAudioStreamBuilder_setErrorCallback)pContext->aaudio.AAudioStreamBuilder_setErrorCallback)(pBuilder, ma_stream_error_callback__aaudio, (void*)pDevice); - } - } - - *ppBuilder = pBuilder; - - return MA_SUCCESS; -} - -static ma_result ma_open_stream_and_close_builder__aaudio(ma_context* pContext, ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream** ppStream) -{ - ma_result result; - - result = ma_result_from_aaudio(((MA_PFN_AAudioStreamBuilder_openStream)pContext->aaudio.AAudioStreamBuilder_openStream)(pBuilder, ppStream)); - ((MA_PFN_AAudioStreamBuilder_delete)pContext->aaudio.AAudioStreamBuilder_delete)(pBuilder); - - return result; -} - -static ma_result ma_open_stream_basic__aaudio(ma_context* pContext, const ma_device_id* pDeviceID, ma_device_type deviceType, ma_share_mode shareMode, ma_AAudioStream** ppStream) -{ - ma_result result; - ma_AAudioStreamBuilder* pBuilder; - - *ppStream = NULL; - - result = ma_create_and_configure_AAudioStreamBuilder__aaudio(pContext, pDeviceID, deviceType, shareMode, NULL, NULL, NULL, &pBuilder); - if (result != MA_SUCCESS) { - return result; - } - - return ma_open_stream_and_close_builder__aaudio(pContext, pBuilder, ppStream); -} - -static ma_result ma_open_stream__aaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_type deviceType, const ma_device_descriptor* pDescriptor, ma_AAudioStream** ppStream) -{ - ma_result result; - ma_AAudioStreamBuilder* pBuilder; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pDescriptor != NULL); - MA_ASSERT(deviceType != ma_device_type_duplex); /* This function should not be called for a full-duplex device type. */ - - *ppStream = NULL; - - result = ma_create_and_configure_AAudioStreamBuilder__aaudio(pDevice->pContext, pDescriptor->pDeviceID, deviceType, pDescriptor->shareMode, pDescriptor, pConfig, pDevice, &pBuilder); - if (result != MA_SUCCESS) { - return result; - } - - return ma_open_stream_and_close_builder__aaudio(pDevice->pContext, pBuilder, ppStream); -} - -static ma_result ma_close_stream__aaudio(ma_context* pContext, ma_AAudioStream* pStream) -{ - return ma_result_from_aaudio(((MA_PFN_AAudioStream_close)pContext->aaudio.AAudioStream_close)(pStream)); -} - -static ma_bool32 ma_has_default_device__aaudio(ma_context* pContext, ma_device_type deviceType) -{ - /* The only way to know this is to try creating a stream. */ - ma_AAudioStream* pStream; - ma_result result = ma_open_stream_basic__aaudio(pContext, NULL, deviceType, ma_share_mode_shared, &pStream); - if (result != MA_SUCCESS) { - return MA_FALSE; - } - - ma_close_stream__aaudio(pContext, pStream); - return MA_TRUE; -} - -static ma_result ma_wait_for_simple_state_transition__aaudio(ma_context* pContext, ma_AAudioStream* pStream, ma_aaudio_stream_state_t oldState, ma_aaudio_stream_state_t newState) -{ - ma_aaudio_stream_state_t actualNewState; - ma_aaudio_result_t resultAA = ((MA_PFN_AAudioStream_waitForStateChange)pContext->aaudio.AAudioStream_waitForStateChange)(pStream, oldState, &actualNewState, 5000000000); /* 5 second timeout. */ - if (resultAA != MA_AAUDIO_OK) { - return ma_result_from_aaudio(resultAA); - } - - if (newState != actualNewState) { - return MA_ERROR; /* Failed to transition into the expected state. */ - } - - return MA_SUCCESS; -} - - -static ma_result ma_context_enumerate_devices__aaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_bool32 cbResult = MA_TRUE; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* Unfortunately AAudio does not have an enumeration API. Therefore I'm only going to report default devices, but only if it can instantiate a stream. */ - - /* Playback. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.aaudio = MA_AAUDIO_UNSPECIFIED; - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - - if (ma_has_default_device__aaudio(pContext, ma_device_type_playback)) { - cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - } - - /* Capture. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.aaudio = MA_AAUDIO_UNSPECIFIED; - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - - if (ma_has_default_device__aaudio(pContext, ma_device_type_capture)) { - cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - } - - return MA_SUCCESS; -} - -static void ma_context_add_native_data_format_from_AAudioStream_ex__aaudio(ma_context* pContext, ma_AAudioStream* pStream, ma_format format, ma_uint32 flags, ma_device_info* pDeviceInfo) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pStream != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = format; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels = ((MA_PFN_AAudioStream_getChannelCount)pContext->aaudio.AAudioStream_getChannelCount)(pStream); - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = ((MA_PFN_AAudioStream_getSampleRate)pContext->aaudio.AAudioStream_getSampleRate)(pStream); - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = flags; - pDeviceInfo->nativeDataFormatCount += 1; -} - -static void ma_context_add_native_data_format_from_AAudioStream__aaudio(ma_context* pContext, ma_AAudioStream* pStream, ma_uint32 flags, ma_device_info* pDeviceInfo) -{ - /* AAudio supports s16 and f32. */ - ma_context_add_native_data_format_from_AAudioStream_ex__aaudio(pContext, pStream, ma_format_f32, flags, pDeviceInfo); - ma_context_add_native_data_format_from_AAudioStream_ex__aaudio(pContext, pStream, ma_format_s16, flags, pDeviceInfo); -} - -static ma_result ma_context_get_device_info__aaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_AAudioStream* pStream; - ma_result result; - - MA_ASSERT(pContext != NULL); - - /* ID */ - if (pDeviceID != NULL) { - pDeviceInfo->id.aaudio = pDeviceID->aaudio; - } else { - pDeviceInfo->id.aaudio = MA_AAUDIO_UNSPECIFIED; - } - - /* Name */ - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - - - pDeviceInfo->nativeDataFormatCount = 0; - - /* We'll need to open the device to get accurate sample rate and channel count information. */ - result = ma_open_stream_basic__aaudio(pContext, pDeviceID, deviceType, ma_share_mode_shared, &pStream); - if (result != MA_SUCCESS) { - return result; - } - - ma_context_add_native_data_format_from_AAudioStream__aaudio(pContext, pStream, 0, pDeviceInfo); - - ma_close_stream__aaudio(pContext, pStream); - pStream = NULL; - - return MA_SUCCESS; -} - - -static ma_result ma_device_uninit__aaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture); - pDevice->aaudio.pStreamCapture = NULL; - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback); - pDevice->aaudio.pStreamPlayback = NULL; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_init_by_type__aaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_type deviceType, ma_device_descriptor* pDescriptor, ma_AAudioStream** ppStream) -{ - ma_result result; - int32_t bufferCapacityInFrames; - int32_t framesPerDataCallback; - ma_AAudioStream* pStream; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDescriptor != NULL); - - *ppStream = NULL; /* Safety. */ - - /* First step is to open the stream. From there we'll be able to extract the internal configuration. */ - result = ma_open_stream__aaudio(pDevice, pConfig, deviceType, pDescriptor, &pStream); - if (result != MA_SUCCESS) { - return result; /* Failed to open the AAudio stream. */ - } - - /* Now extract the internal configuration. */ - pDescriptor->format = (((MA_PFN_AAudioStream_getFormat)pDevice->pContext->aaudio.AAudioStream_getFormat)(pStream) == MA_AAUDIO_FORMAT_PCM_I16) ? ma_format_s16 : ma_format_f32; - pDescriptor->channels = ((MA_PFN_AAudioStream_getChannelCount)pDevice->pContext->aaudio.AAudioStream_getChannelCount)(pStream); - pDescriptor->sampleRate = ((MA_PFN_AAudioStream_getSampleRate)pDevice->pContext->aaudio.AAudioStream_getSampleRate)(pStream); - - /* For the channel map we need to be sure we don't overflow any buffers. */ - if (pDescriptor->channels <= MA_MAX_CHANNELS) { - ma_channel_map_init_standard(ma_standard_channel_map_default, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), pDescriptor->channels); /* <-- Cannot find info on channel order, so assuming a default. */ - } else { - ma_channel_map_init_blank(pDescriptor->channelMap, MA_MAX_CHANNELS); /* Too many channels. Use a blank channel map. */ - } - - bufferCapacityInFrames = ((MA_PFN_AAudioStream_getBufferCapacityInFrames)pDevice->pContext->aaudio.AAudioStream_getBufferCapacityInFrames)(pStream); - framesPerDataCallback = ((MA_PFN_AAudioStream_getFramesPerDataCallback)pDevice->pContext->aaudio.AAudioStream_getFramesPerDataCallback)(pStream); - - if (framesPerDataCallback > 0) { - pDescriptor->periodSizeInFrames = framesPerDataCallback; - pDescriptor->periodCount = bufferCapacityInFrames / framesPerDataCallback; - } else { - pDescriptor->periodSizeInFrames = bufferCapacityInFrames; - pDescriptor->periodCount = 1; - } - - *ppStream = pStream; - - return MA_SUCCESS; -} - -static ma_result ma_device_init__aaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - ma_result result; - - MA_ASSERT(pDevice != NULL); - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - pDevice->aaudio.usage = pConfig->aaudio.usage; - pDevice->aaudio.contentType = pConfig->aaudio.contentType; - pDevice->aaudio.inputPreset = pConfig->aaudio.inputPreset; - pDevice->aaudio.noAutoStartAfterReroute = pConfig->aaudio.noAutoStartAfterReroute; - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - result = ma_device_init_by_type__aaudio(pDevice, pConfig, ma_device_type_capture, pDescriptorCapture, (ma_AAudioStream**)&pDevice->aaudio.pStreamCapture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - result = ma_device_init_by_type__aaudio(pDevice, pConfig, ma_device_type_playback, pDescriptorPlayback, (ma_AAudioStream**)&pDevice->aaudio.pStreamPlayback); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start_stream__aaudio(ma_device* pDevice, ma_AAudioStream* pStream) -{ - ma_aaudio_result_t resultAA; - ma_aaudio_stream_state_t currentState; - - MA_ASSERT(pDevice != NULL); - - resultAA = ((MA_PFN_AAudioStream_requestStart)pDevice->pContext->aaudio.AAudioStream_requestStart)(pStream); - if (resultAA != MA_AAUDIO_OK) { - return ma_result_from_aaudio(resultAA); - } - - /* Do we actually need to wait for the device to transition into it's started state? */ - - /* The device should be in either a starting or started state. If it's not set to started we need to wait for it to transition. It should go from starting to started. */ - currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream); - if (currentState != MA_AAUDIO_STREAM_STATE_STARTED) { - ma_result result; - - if (currentState != MA_AAUDIO_STREAM_STATE_STARTING) { - return MA_ERROR; /* Expecting the stream to be a starting or started state. */ - } - - result = ma_wait_for_simple_state_transition__aaudio(pDevice->pContext, pStream, currentState, MA_AAUDIO_STREAM_STATE_STARTED); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop_stream__aaudio(ma_device* pDevice, ma_AAudioStream* pStream) -{ - ma_aaudio_result_t resultAA; - ma_aaudio_stream_state_t currentState; - - MA_ASSERT(pDevice != NULL); - - /* - From the AAudio documentation: - - The stream will stop after all of the data currently buffered has been played. - - This maps with miniaudio's requirement that device's be drained which means we don't need to implement any draining logic. - */ - currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream); - if (currentState == MA_AAUDIO_STREAM_STATE_DISCONNECTED) { - return MA_SUCCESS; /* The device is disconnected. Don't try stopping it. */ - } - - resultAA = ((MA_PFN_AAudioStream_requestStop)pDevice->pContext->aaudio.AAudioStream_requestStop)(pStream); - if (resultAA != MA_AAUDIO_OK) { - return ma_result_from_aaudio(resultAA); - } - - /* The device should be in either a stopping or stopped state. If it's not set to started we need to wait for it to transition. It should go from stopping to stopped. */ - currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream); - if (currentState != MA_AAUDIO_STREAM_STATE_STOPPED) { - ma_result result; - - if (currentState != MA_AAUDIO_STREAM_STATE_STOPPING) { - return MA_ERROR; /* Expecting the stream to be a stopping or stopped state. */ - } - - result = ma_wait_for_simple_state_transition__aaudio(pDevice->pContext, pStream, currentState, MA_AAUDIO_STREAM_STATE_STOPPED); - if (result != MA_SUCCESS) { - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start__aaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_result result = ma_device_start_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_result result = ma_device_start_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback); - if (result != MA_SUCCESS) { - if (pDevice->type == ma_device_type_duplex) { - ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture); - } - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__aaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_result result = ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_result result = ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback); - if (result != MA_SUCCESS) { - return result; - } - } - - ma_device__on_notification_stopped(pDevice); - - return MA_SUCCESS; -} - -static ma_result ma_device_reinit__aaudio(ma_device* pDevice, ma_device_type deviceType) -{ - ma_result result; - - MA_ASSERT(pDevice != NULL); - - /* The first thing to do is close the streams. */ - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) { - ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture); - pDevice->aaudio.pStreamCapture = NULL; - } - - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback); - pDevice->aaudio.pStreamPlayback = NULL; - } - - /* Now we need to reinitialize each streams. The hardest part with this is just filling output the config and descriptors. */ - { - ma_device_config deviceConfig; - ma_device_descriptor descriptorPlayback; - ma_device_descriptor descriptorCapture; - - deviceConfig = ma_device_config_init(deviceType); - deviceConfig.playback.pDeviceID = NULL; /* Only doing rerouting with default devices. */ - deviceConfig.playback.shareMode = pDevice->playback.shareMode; - deviceConfig.playback.format = pDevice->playback.format; - deviceConfig.playback.channels = pDevice->playback.channels; - deviceConfig.capture.pDeviceID = NULL; /* Only doing rerouting with default devices. */ - deviceConfig.capture.shareMode = pDevice->capture.shareMode; - deviceConfig.capture.format = pDevice->capture.format; - deviceConfig.capture.channels = pDevice->capture.channels; - deviceConfig.sampleRate = pDevice->sampleRate; - deviceConfig.aaudio.usage = pDevice->aaudio.usage; - deviceConfig.aaudio.contentType = pDevice->aaudio.contentType; - deviceConfig.aaudio.inputPreset = pDevice->aaudio.inputPreset; - deviceConfig.aaudio.noAutoStartAfterReroute = pDevice->aaudio.noAutoStartAfterReroute; - deviceConfig.periods = 1; - - /* Try to get an accurate period size. */ - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - deviceConfig.periodSizeInFrames = pDevice->playback.internalPeriodSizeInFrames; - } else { - deviceConfig.periodSizeInFrames = pDevice->capture.internalPeriodSizeInFrames; - } - - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) { - descriptorCapture.pDeviceID = deviceConfig.capture.pDeviceID; - descriptorCapture.shareMode = deviceConfig.capture.shareMode; - descriptorCapture.format = deviceConfig.capture.format; - descriptorCapture.channels = deviceConfig.capture.channels; - descriptorCapture.sampleRate = deviceConfig.sampleRate; - descriptorCapture.periodSizeInFrames = deviceConfig.periodSizeInFrames; - descriptorCapture.periodCount = deviceConfig.periods; - } - - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - descriptorPlayback.pDeviceID = deviceConfig.playback.pDeviceID; - descriptorPlayback.shareMode = deviceConfig.playback.shareMode; - descriptorPlayback.format = deviceConfig.playback.format; - descriptorPlayback.channels = deviceConfig.playback.channels; - descriptorPlayback.sampleRate = deviceConfig.sampleRate; - descriptorPlayback.periodSizeInFrames = deviceConfig.periodSizeInFrames; - descriptorPlayback.periodCount = deviceConfig.periods; - } - - result = ma_device_init__aaudio(pDevice, &deviceConfig, &descriptorPlayback, &descriptorCapture); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_device_post_init(pDevice, deviceType, &descriptorPlayback, &descriptorCapture); - if (result != MA_SUCCESS) { - ma_device_uninit__aaudio(pDevice); - return result; - } - - /* We'll only ever do this in response to a reroute. */ - ma_device__on_notification_rerouted(pDevice); - - /* If the device is started, start the streams. Maybe make this configurable? */ - if (ma_device_get_state(pDevice) == ma_device_state_started) { - if (pDevice->aaudio.noAutoStartAfterReroute == MA_FALSE) { - ma_device_start__aaudio(pDevice); - } else { - ma_device_stop(pDevice); /* Do a full device stop so we set internal state correctly. */ - } - } - - return MA_SUCCESS; - } -} - -static ma_result ma_device_get_info__aaudio(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo) -{ - ma_AAudioStream* pStream = NULL; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(type != ma_device_type_duplex); - MA_ASSERT(pDeviceInfo != NULL); - - if (type == ma_device_type_playback) { - pStream = (ma_AAudioStream*)pDevice->aaudio.pStreamCapture; - pDeviceInfo->id.aaudio = pDevice->capture.id.aaudio; - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); /* Only supporting default devices. */ - } - if (type == ma_device_type_capture) { - pStream = (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback; - pDeviceInfo->id.aaudio = pDevice->playback.id.aaudio; - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); /* Only supporting default devices. */ - } - - /* Safety. Should never happen. */ - if (pStream == NULL) { - return MA_INVALID_OPERATION; - } - - pDeviceInfo->nativeDataFormatCount = 0; - ma_context_add_native_data_format_from_AAudioStream__aaudio(pDevice->pContext, pStream, 0, pDeviceInfo); - - return MA_SUCCESS; -} - - -static ma_result ma_context_uninit__aaudio(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_aaudio); - - ma_device_job_thread_uninit(&pContext->aaudio.jobThread, &pContext->allocationCallbacks); - - ma_dlclose(pContext, pContext->aaudio.hAAudio); - pContext->aaudio.hAAudio = NULL; - - return MA_SUCCESS; -} - -static ma_result ma_context_init__aaudio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - size_t i; - const char* libNames[] = { - "libaaudio.so" - }; - - for (i = 0; i < ma_countof(libNames); ++i) { - pContext->aaudio.hAAudio = ma_dlopen(pContext, libNames[i]); - if (pContext->aaudio.hAAudio != NULL) { - break; - } - } - - if (pContext->aaudio.hAAudio == NULL) { - return MA_FAILED_TO_INIT_BACKEND; - } - - pContext->aaudio.AAudio_createStreamBuilder = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudio_createStreamBuilder"); - pContext->aaudio.AAudioStreamBuilder_delete = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_delete"); - pContext->aaudio.AAudioStreamBuilder_setDeviceId = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setDeviceId"); - pContext->aaudio.AAudioStreamBuilder_setDirection = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setDirection"); - pContext->aaudio.AAudioStreamBuilder_setSharingMode = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setSharingMode"); - pContext->aaudio.AAudioStreamBuilder_setFormat = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setFormat"); - pContext->aaudio.AAudioStreamBuilder_setChannelCount = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setChannelCount"); - pContext->aaudio.AAudioStreamBuilder_setSampleRate = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setSampleRate"); - pContext->aaudio.AAudioStreamBuilder_setBufferCapacityInFrames = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setBufferCapacityInFrames"); - pContext->aaudio.AAudioStreamBuilder_setFramesPerDataCallback = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setFramesPerDataCallback"); - pContext->aaudio.AAudioStreamBuilder_setDataCallback = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setDataCallback"); - pContext->aaudio.AAudioStreamBuilder_setErrorCallback = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setErrorCallback"); - pContext->aaudio.AAudioStreamBuilder_setPerformanceMode = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setPerformanceMode"); - pContext->aaudio.AAudioStreamBuilder_setUsage = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setUsage"); - pContext->aaudio.AAudioStreamBuilder_setContentType = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setContentType"); - pContext->aaudio.AAudioStreamBuilder_setInputPreset = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_setInputPreset"); - pContext->aaudio.AAudioStreamBuilder_openStream = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStreamBuilder_openStream"); - pContext->aaudio.AAudioStream_close = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_close"); - pContext->aaudio.AAudioStream_getState = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_getState"); - pContext->aaudio.AAudioStream_waitForStateChange = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_waitForStateChange"); - pContext->aaudio.AAudioStream_getFormat = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_getFormat"); - pContext->aaudio.AAudioStream_getChannelCount = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_getChannelCount"); - pContext->aaudio.AAudioStream_getSampleRate = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_getSampleRate"); - pContext->aaudio.AAudioStream_getBufferCapacityInFrames = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_getBufferCapacityInFrames"); - pContext->aaudio.AAudioStream_getFramesPerDataCallback = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_getFramesPerDataCallback"); - pContext->aaudio.AAudioStream_getFramesPerBurst = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_getFramesPerBurst"); - pContext->aaudio.AAudioStream_requestStart = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_requestStart"); - pContext->aaudio.AAudioStream_requestStop = (ma_proc)ma_dlsym(pContext, pContext->aaudio.hAAudio, "AAudioStream_requestStop"); - - - pCallbacks->onContextInit = ma_context_init__aaudio; - pCallbacks->onContextUninit = ma_context_uninit__aaudio; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__aaudio; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__aaudio; - pCallbacks->onDeviceInit = ma_device_init__aaudio; - pCallbacks->onDeviceUninit = ma_device_uninit__aaudio; - pCallbacks->onDeviceStart = ma_device_start__aaudio; - pCallbacks->onDeviceStop = ma_device_stop__aaudio; - pCallbacks->onDeviceRead = NULL; /* Not used because AAudio is asynchronous. */ - pCallbacks->onDeviceWrite = NULL; /* Not used because AAudio is asynchronous. */ - pCallbacks->onDeviceDataLoop = NULL; /* Not used because AAudio is asynchronous. */ - pCallbacks->onDeviceGetInfo = ma_device_get_info__aaudio; - - - /* We need a job thread so we can deal with rerouting. */ - { - ma_result result; - ma_device_job_thread_config jobThreadConfig; - - jobThreadConfig = ma_device_job_thread_config_init(); - - result = ma_device_job_thread_init(&jobThreadConfig, &pContext->allocationCallbacks, &pContext->aaudio.jobThread); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->aaudio.hAAudio); - pContext->aaudio.hAAudio = NULL; - return result; - } - } - - - (void)pConfig; - return MA_SUCCESS; -} - -static ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob) -{ - ma_device* pDevice; - - MA_ASSERT(pJob != NULL); - - pDevice = (ma_device*)pJob->data.device.aaudio.reroute.pDevice; - MA_ASSERT(pDevice != NULL); - - /* Here is where we need to reroute the device. To do this we need to uninitialize the stream and reinitialize it. */ - return ma_device_reinit__aaudio(pDevice, (ma_device_type)pJob->data.device.aaudio.reroute.deviceType); -} -#else -/* Getting here means there is no AAudio backend so we need a no-op job implementation. */ -static ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob) -{ - return ma_job_process__noop(pJob); -} -#endif /* AAudio */ - - -/****************************************************************************** - -OpenSL|ES Backend - -******************************************************************************/ -#ifdef MA_HAS_OPENSL -#include -#ifdef MA_ANDROID -#include -#endif - -typedef SLresult (SLAPIENTRY * ma_slCreateEngine_proc)(SLObjectItf* pEngine, SLuint32 numOptions, SLEngineOption* pEngineOptions, SLuint32 numInterfaces, SLInterfaceID* pInterfaceIds, SLboolean* pInterfaceRequired); - -/* OpenSL|ES has one-per-application objects :( */ -static SLObjectItf g_maEngineObjectSL = NULL; -static SLEngineItf g_maEngineSL = NULL; -static ma_uint32 g_maOpenSLInitCounter = 0; -static ma_spinlock g_maOpenSLSpinlock = 0; /* For init/uninit. */ - -#define MA_OPENSL_OBJ(p) (*((SLObjectItf)(p))) -#define MA_OPENSL_OUTPUTMIX(p) (*((SLOutputMixItf)(p))) -#define MA_OPENSL_PLAY(p) (*((SLPlayItf)(p))) -#define MA_OPENSL_RECORD(p) (*((SLRecordItf)(p))) - -#ifdef MA_ANDROID -#define MA_OPENSL_BUFFERQUEUE(p) (*((SLAndroidSimpleBufferQueueItf)(p))) -#else -#define MA_OPENSL_BUFFERQUEUE(p) (*((SLBufferQueueItf)(p))) -#endif - -static ma_result ma_result_from_OpenSL(SLuint32 result) -{ - switch (result) - { - case SL_RESULT_SUCCESS: return MA_SUCCESS; - case SL_RESULT_PRECONDITIONS_VIOLATED: return MA_ERROR; - case SL_RESULT_PARAMETER_INVALID: return MA_INVALID_ARGS; - case SL_RESULT_MEMORY_FAILURE: return MA_OUT_OF_MEMORY; - case SL_RESULT_RESOURCE_ERROR: return MA_INVALID_DATA; - case SL_RESULT_RESOURCE_LOST: return MA_ERROR; - case SL_RESULT_IO_ERROR: return MA_IO_ERROR; - case SL_RESULT_BUFFER_INSUFFICIENT: return MA_NO_SPACE; - case SL_RESULT_CONTENT_CORRUPTED: return MA_INVALID_DATA; - case SL_RESULT_CONTENT_UNSUPPORTED: return MA_FORMAT_NOT_SUPPORTED; - case SL_RESULT_CONTENT_NOT_FOUND: return MA_ERROR; - case SL_RESULT_PERMISSION_DENIED: return MA_ACCESS_DENIED; - case SL_RESULT_FEATURE_UNSUPPORTED: return MA_NOT_IMPLEMENTED; - case SL_RESULT_INTERNAL_ERROR: return MA_ERROR; - case SL_RESULT_UNKNOWN_ERROR: return MA_ERROR; - case SL_RESULT_OPERATION_ABORTED: return MA_ERROR; - case SL_RESULT_CONTROL_LOST: return MA_ERROR; - default: return MA_ERROR; - } -} - -/* Converts an individual OpenSL-style channel identifier (SL_SPEAKER_FRONT_LEFT, etc.) to miniaudio. */ -static ma_uint8 ma_channel_id_to_ma__opensl(SLuint32 id) -{ - switch (id) - { - case SL_SPEAKER_FRONT_LEFT: return MA_CHANNEL_FRONT_LEFT; - case SL_SPEAKER_FRONT_RIGHT: return MA_CHANNEL_FRONT_RIGHT; - case SL_SPEAKER_FRONT_CENTER: return MA_CHANNEL_FRONT_CENTER; - case SL_SPEAKER_LOW_FREQUENCY: return MA_CHANNEL_LFE; - case SL_SPEAKER_BACK_LEFT: return MA_CHANNEL_BACK_LEFT; - case SL_SPEAKER_BACK_RIGHT: return MA_CHANNEL_BACK_RIGHT; - case SL_SPEAKER_FRONT_LEFT_OF_CENTER: return MA_CHANNEL_FRONT_LEFT_CENTER; - case SL_SPEAKER_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER; - case SL_SPEAKER_BACK_CENTER: return MA_CHANNEL_BACK_CENTER; - case SL_SPEAKER_SIDE_LEFT: return MA_CHANNEL_SIDE_LEFT; - case SL_SPEAKER_SIDE_RIGHT: return MA_CHANNEL_SIDE_RIGHT; - case SL_SPEAKER_TOP_CENTER: return MA_CHANNEL_TOP_CENTER; - case SL_SPEAKER_TOP_FRONT_LEFT: return MA_CHANNEL_TOP_FRONT_LEFT; - case SL_SPEAKER_TOP_FRONT_CENTER: return MA_CHANNEL_TOP_FRONT_CENTER; - case SL_SPEAKER_TOP_FRONT_RIGHT: return MA_CHANNEL_TOP_FRONT_RIGHT; - case SL_SPEAKER_TOP_BACK_LEFT: return MA_CHANNEL_TOP_BACK_LEFT; - case SL_SPEAKER_TOP_BACK_CENTER: return MA_CHANNEL_TOP_BACK_CENTER; - case SL_SPEAKER_TOP_BACK_RIGHT: return MA_CHANNEL_TOP_BACK_RIGHT; - default: return 0; - } -} - -/* Converts an individual miniaudio channel identifier (MA_CHANNEL_FRONT_LEFT, etc.) to OpenSL-style. */ -static SLuint32 ma_channel_id_to_opensl(ma_uint8 id) -{ - switch (id) - { - case MA_CHANNEL_MONO: return SL_SPEAKER_FRONT_CENTER; - case MA_CHANNEL_FRONT_LEFT: return SL_SPEAKER_FRONT_LEFT; - case MA_CHANNEL_FRONT_RIGHT: return SL_SPEAKER_FRONT_RIGHT; - case MA_CHANNEL_FRONT_CENTER: return SL_SPEAKER_FRONT_CENTER; - case MA_CHANNEL_LFE: return SL_SPEAKER_LOW_FREQUENCY; - case MA_CHANNEL_BACK_LEFT: return SL_SPEAKER_BACK_LEFT; - case MA_CHANNEL_BACK_RIGHT: return SL_SPEAKER_BACK_RIGHT; - case MA_CHANNEL_FRONT_LEFT_CENTER: return SL_SPEAKER_FRONT_LEFT_OF_CENTER; - case MA_CHANNEL_FRONT_RIGHT_CENTER: return SL_SPEAKER_FRONT_RIGHT_OF_CENTER; - case MA_CHANNEL_BACK_CENTER: return SL_SPEAKER_BACK_CENTER; - case MA_CHANNEL_SIDE_LEFT: return SL_SPEAKER_SIDE_LEFT; - case MA_CHANNEL_SIDE_RIGHT: return SL_SPEAKER_SIDE_RIGHT; - case MA_CHANNEL_TOP_CENTER: return SL_SPEAKER_TOP_CENTER; - case MA_CHANNEL_TOP_FRONT_LEFT: return SL_SPEAKER_TOP_FRONT_LEFT; - case MA_CHANNEL_TOP_FRONT_CENTER: return SL_SPEAKER_TOP_FRONT_CENTER; - case MA_CHANNEL_TOP_FRONT_RIGHT: return SL_SPEAKER_TOP_FRONT_RIGHT; - case MA_CHANNEL_TOP_BACK_LEFT: return SL_SPEAKER_TOP_BACK_LEFT; - case MA_CHANNEL_TOP_BACK_CENTER: return SL_SPEAKER_TOP_BACK_CENTER; - case MA_CHANNEL_TOP_BACK_RIGHT: return SL_SPEAKER_TOP_BACK_RIGHT; - default: return 0; - } -} - -/* Converts a channel mapping to an OpenSL-style channel mask. */ -static SLuint32 ma_channel_map_to_channel_mask__opensl(const ma_channel* pChannelMap, ma_uint32 channels) -{ - SLuint32 channelMask = 0; - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - channelMask |= ma_channel_id_to_opensl(pChannelMap[iChannel]); - } - - return channelMask; -} - -/* Converts an OpenSL-style channel mask to a miniaudio channel map. */ -static void ma_channel_mask_to_channel_map__opensl(SLuint32 channelMask, ma_uint32 channels, ma_channel* pChannelMap) -{ - if (channels == 1 && channelMask == 0) { - pChannelMap[0] = MA_CHANNEL_MONO; - } else if (channels == 2 && channelMask == 0) { - pChannelMap[0] = MA_CHANNEL_FRONT_LEFT; - pChannelMap[1] = MA_CHANNEL_FRONT_RIGHT; - } else { - if (channels == 1 && (channelMask & SL_SPEAKER_FRONT_CENTER) != 0) { - pChannelMap[0] = MA_CHANNEL_MONO; - } else { - /* Just iterate over each bit. */ - ma_uint32 iChannel = 0; - ma_uint32 iBit; - for (iBit = 0; iBit < 32 && iChannel < channels; ++iBit) { - SLuint32 bitValue = (channelMask & (1UL << iBit)); - if (bitValue != 0) { - /* The bit is set. */ - pChannelMap[iChannel] = ma_channel_id_to_ma__opensl(bitValue); - iChannel += 1; - } - } - } - } -} - -static SLuint32 ma_round_to_standard_sample_rate__opensl(SLuint32 samplesPerSec) -{ - if (samplesPerSec <= SL_SAMPLINGRATE_8) { - return SL_SAMPLINGRATE_8; - } - if (samplesPerSec <= SL_SAMPLINGRATE_11_025) { - return SL_SAMPLINGRATE_11_025; - } - if (samplesPerSec <= SL_SAMPLINGRATE_12) { - return SL_SAMPLINGRATE_12; - } - if (samplesPerSec <= SL_SAMPLINGRATE_16) { - return SL_SAMPLINGRATE_16; - } - if (samplesPerSec <= SL_SAMPLINGRATE_22_05) { - return SL_SAMPLINGRATE_22_05; - } - if (samplesPerSec <= SL_SAMPLINGRATE_24) { - return SL_SAMPLINGRATE_24; - } - if (samplesPerSec <= SL_SAMPLINGRATE_32) { - return SL_SAMPLINGRATE_32; - } - if (samplesPerSec <= SL_SAMPLINGRATE_44_1) { - return SL_SAMPLINGRATE_44_1; - } - if (samplesPerSec <= SL_SAMPLINGRATE_48) { - return SL_SAMPLINGRATE_48; - } - - /* Android doesn't support more than 48000. */ -#ifndef MA_ANDROID - if (samplesPerSec <= SL_SAMPLINGRATE_64) { - return SL_SAMPLINGRATE_64; - } - if (samplesPerSec <= SL_SAMPLINGRATE_88_2) { - return SL_SAMPLINGRATE_88_2; - } - if (samplesPerSec <= SL_SAMPLINGRATE_96) { - return SL_SAMPLINGRATE_96; - } - if (samplesPerSec <= SL_SAMPLINGRATE_192) { - return SL_SAMPLINGRATE_192; - } -#endif - - return SL_SAMPLINGRATE_16; -} - - -static SLint32 ma_to_stream_type__opensl(ma_opensl_stream_type streamType) -{ - switch (streamType) { - case ma_opensl_stream_type_voice: return SL_ANDROID_STREAM_VOICE; - case ma_opensl_stream_type_system: return SL_ANDROID_STREAM_SYSTEM; - case ma_opensl_stream_type_ring: return SL_ANDROID_STREAM_RING; - case ma_opensl_stream_type_media: return SL_ANDROID_STREAM_MEDIA; - case ma_opensl_stream_type_alarm: return SL_ANDROID_STREAM_ALARM; - case ma_opensl_stream_type_notification: return SL_ANDROID_STREAM_NOTIFICATION; - default: break; - } - - return SL_ANDROID_STREAM_VOICE; -} - -static SLint32 ma_to_recording_preset__opensl(ma_opensl_recording_preset recordingPreset) -{ - switch (recordingPreset) { - case ma_opensl_recording_preset_generic: return SL_ANDROID_RECORDING_PRESET_GENERIC; - case ma_opensl_recording_preset_camcorder: return SL_ANDROID_RECORDING_PRESET_CAMCORDER; - case ma_opensl_recording_preset_voice_recognition: return SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION; - case ma_opensl_recording_preset_voice_communication: return SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION; - case ma_opensl_recording_preset_voice_unprocessed: return SL_ANDROID_RECORDING_PRESET_UNPROCESSED; - default: break; - } - - return SL_ANDROID_RECORDING_PRESET_NONE; -} - - -static ma_result ma_context_enumerate_devices__opensl(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_bool32 cbResult; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to enumerate devices. */ - if (g_maOpenSLInitCounter == 0) { - return MA_INVALID_OPERATION; - } - - /* - TODO: Test Me. - - This is currently untested, so for now we are just returning default devices. - */ -#if 0 && !defined(MA_ANDROID) - ma_bool32 isTerminated = MA_FALSE; - - SLuint32 pDeviceIDs[128]; - SLint32 deviceCount = sizeof(pDeviceIDs) / sizeof(pDeviceIDs[0]); - - SLAudioIODeviceCapabilitiesItf deviceCaps; - SLresult resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, (SLInterfaceID)pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES, &deviceCaps); - if (resultSL != SL_RESULT_SUCCESS) { - /* The interface may not be supported so just report a default device. */ - goto return_default_device; - } - - /* Playback */ - if (!isTerminated) { - resultSL = (*deviceCaps)->GetAvailableAudioOutputs(deviceCaps, &deviceCount, pDeviceIDs); - if (resultSL != SL_RESULT_SUCCESS) { - return ma_result_from_OpenSL(resultSL); - } - - for (SLint32 iDevice = 0; iDevice < deviceCount; ++iDevice) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.opensl = pDeviceIDs[iDevice]; - - SLAudioOutputDescriptor desc; - resultSL = (*deviceCaps)->QueryAudioOutputCapabilities(deviceCaps, deviceInfo.id.opensl, &desc); - if (resultSL == SL_RESULT_SUCCESS) { - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), (const char*)desc.pDeviceName, (size_t)-1); - - ma_bool32 cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - if (cbResult == MA_FALSE) { - isTerminated = MA_TRUE; - break; - } - } - } - } - - /* Capture */ - if (!isTerminated) { - resultSL = (*deviceCaps)->GetAvailableAudioInputs(deviceCaps, &deviceCount, pDeviceIDs); - if (resultSL != SL_RESULT_SUCCESS) { - return ma_result_from_OpenSL(resultSL); - } - - for (SLint32 iDevice = 0; iDevice < deviceCount; ++iDevice) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.opensl = pDeviceIDs[iDevice]; - - SLAudioInputDescriptor desc; - resultSL = (*deviceCaps)->QueryAudioInputCapabilities(deviceCaps, deviceInfo.id.opensl, &desc); - if (resultSL == SL_RESULT_SUCCESS) { - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), (const char*)desc.deviceName, (size_t)-1); - - ma_bool32 cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - if (cbResult == MA_FALSE) { - isTerminated = MA_TRUE; - break; - } - } - } - } - - return MA_SUCCESS; -#else - goto return_default_device; -#endif - -return_default_device:; - cbResult = MA_TRUE; - - /* Playback. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.opensl = SL_DEFAULTDEVICEID_AUDIOOUTPUT; - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - - /* Capture. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - deviceInfo.id.opensl = SL_DEFAULTDEVICEID_AUDIOINPUT; - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - - return MA_SUCCESS; -} - -static void ma_context_add_data_format_ex__opensl(ma_context* pContext, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_device_info* pDeviceInfo) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format = format; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels = channels; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate; - pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags = 0; - pDeviceInfo->nativeDataFormatCount += 1; -} - -static void ma_context_add_data_format__opensl(ma_context* pContext, ma_format format, ma_device_info* pDeviceInfo) -{ - ma_uint32 minChannels = 1; - ma_uint32 maxChannels = 2; - ma_uint32 minSampleRate = (ma_uint32)ma_standard_sample_rate_8000; - ma_uint32 maxSampleRate = (ma_uint32)ma_standard_sample_rate_48000; - ma_uint32 iChannel; - ma_uint32 iSampleRate; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(pDeviceInfo != NULL); - - /* - Each sample format can support mono and stereo, and we'll support a small subset of standard - rates (up to 48000). A better solution would be to somehow find a native sample rate. - */ - for (iChannel = minChannels; iChannel < maxChannels; iChannel += 1) { - for (iSampleRate = 0; iSampleRate < ma_countof(g_maStandardSampleRatePriorities); iSampleRate += 1) { - ma_uint32 standardSampleRate = g_maStandardSampleRatePriorities[iSampleRate]; - if (standardSampleRate >= minSampleRate && standardSampleRate <= maxSampleRate) { - ma_context_add_data_format_ex__opensl(pContext, format, iChannel, standardSampleRate, pDeviceInfo); - } - } - } -} - -static ma_result ma_context_get_device_info__opensl(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - MA_ASSERT(pContext != NULL); - - MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to get device info. */ - if (g_maOpenSLInitCounter == 0) { - return MA_INVALID_OPERATION; - } - - /* - TODO: Test Me. - - This is currently untested, so for now we are just returning default devices. - */ -#if 0 && !defined(MA_ANDROID) - SLAudioIODeviceCapabilitiesItf deviceCaps; - SLresult resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, (SLInterfaceID)pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES, &deviceCaps); - if (resultSL != SL_RESULT_SUCCESS) { - /* The interface may not be supported so just report a default device. */ - goto return_default_device; - } - - if (deviceType == ma_device_type_playback) { - SLAudioOutputDescriptor desc; - resultSL = (*deviceCaps)->QueryAudioOutputCapabilities(deviceCaps, pDeviceID->opensl, &desc); - if (resultSL != SL_RESULT_SUCCESS) { - return ma_result_from_OpenSL(resultSL); - } - - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (const char*)desc.pDeviceName, (size_t)-1); - } else { - SLAudioInputDescriptor desc; - resultSL = (*deviceCaps)->QueryAudioInputCapabilities(deviceCaps, pDeviceID->opensl, &desc); - if (resultSL != SL_RESULT_SUCCESS) { - return ma_result_from_OpenSL(resultSL); - } - - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (const char*)desc.deviceName, (size_t)-1); - } - - goto return_detailed_info; -#else - goto return_default_device; -#endif - -return_default_device: - if (pDeviceID != NULL) { - if ((deviceType == ma_device_type_playback && pDeviceID->opensl != SL_DEFAULTDEVICEID_AUDIOOUTPUT) || - (deviceType == ma_device_type_capture && pDeviceID->opensl != SL_DEFAULTDEVICEID_AUDIOINPUT)) { - return MA_NO_DEVICE; /* Don't know the device. */ - } - } - - /* ID and Name / Description */ - if (deviceType == ma_device_type_playback) { - pDeviceInfo->id.opensl = SL_DEFAULTDEVICEID_AUDIOOUTPUT; - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - pDeviceInfo->id.opensl = SL_DEFAULTDEVICEID_AUDIOINPUT; - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - - pDeviceInfo->isDefault = MA_TRUE; - - goto return_detailed_info; - - -return_detailed_info: - - /* - For now we're just outputting a set of values that are supported by the API but not necessarily supported - by the device natively. Later on we should work on this so that it more closely reflects the device's - actual native format. - */ - pDeviceInfo->nativeDataFormatCount = 0; -#if defined(MA_ANDROID) && __ANDROID_API__ >= 21 - ma_context_add_data_format__opensl(pContext, ma_format_f32, pDeviceInfo); -#endif - ma_context_add_data_format__opensl(pContext, ma_format_s16, pDeviceInfo); - ma_context_add_data_format__opensl(pContext, ma_format_u8, pDeviceInfo); - - return MA_SUCCESS; -} - - -#ifdef MA_ANDROID -/*void ma_buffer_queue_callback_capture__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, SLuint32 eventFlags, const void* pBuffer, SLuint32 bufferSize, SLuint32 dataUsed, void* pContext)*/ -static void ma_buffer_queue_callback_capture__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, void* pUserData) -{ - ma_device* pDevice = (ma_device*)pUserData; - size_t periodSizeInBytes; - ma_uint8* pBuffer; - SLresult resultSL; - - MA_ASSERT(pDevice != NULL); - - (void)pBufferQueue; - - /* - For now, don't do anything unless the buffer was fully processed. From what I can tell, it looks like - OpenSL|ES 1.1 improves on buffer queues to the point that we could much more intelligently handle this, - but unfortunately it looks like Android is only supporting OpenSL|ES 1.0.1 for now :( - */ - - /* Don't do anything if the device is not started. */ - if (ma_device_get_state(pDevice) != ma_device_state_started) { - return; - } - - /* Don't do anything if the device is being drained. */ - if (pDevice->opensl.isDrainingCapture) { - return; - } - - periodSizeInBytes = pDevice->capture.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - pBuffer = pDevice->opensl.pBufferCapture + (pDevice->opensl.currentBufferIndexCapture * periodSizeInBytes); - - ma_device_handle_backend_data_callback(pDevice, NULL, pBuffer, pDevice->capture.internalPeriodSizeInFrames); - - resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, pBuffer, periodSizeInBytes); - if (resultSL != SL_RESULT_SUCCESS) { - return; - } - - pDevice->opensl.currentBufferIndexCapture = (pDevice->opensl.currentBufferIndexCapture + 1) % pDevice->capture.internalPeriods; -} - -static void ma_buffer_queue_callback_playback__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, void* pUserData) -{ - ma_device* pDevice = (ma_device*)pUserData; - size_t periodSizeInBytes; - ma_uint8* pBuffer; - SLresult resultSL; - - MA_ASSERT(pDevice != NULL); - - (void)pBufferQueue; - - /* Don't do anything if the device is not started. */ - if (ma_device_get_state(pDevice) != ma_device_state_started) { - return; - } - - /* Don't do anything if the device is being drained. */ - if (pDevice->opensl.isDrainingPlayback) { - return; - } - - periodSizeInBytes = pDevice->playback.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - pBuffer = pDevice->opensl.pBufferPlayback + (pDevice->opensl.currentBufferIndexPlayback * periodSizeInBytes); - - ma_device_handle_backend_data_callback(pDevice, pBuffer, NULL, pDevice->playback.internalPeriodSizeInFrames); - - resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, pBuffer, periodSizeInBytes); - if (resultSL != SL_RESULT_SUCCESS) { - return; - } - - pDevice->opensl.currentBufferIndexPlayback = (pDevice->opensl.currentBufferIndexPlayback + 1) % pDevice->playback.internalPeriods; -} -#endif - -static ma_result ma_device_uninit__opensl(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it before uninitializing the device. */ - if (g_maOpenSLInitCounter == 0) { - return MA_INVALID_OPERATION; - } - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - if (pDevice->opensl.pAudioRecorderObj) { - MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->Destroy((SLObjectItf)pDevice->opensl.pAudioRecorderObj); - } - - ma_free(pDevice->opensl.pBufferCapture, &pDevice->pContext->allocationCallbacks); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - if (pDevice->opensl.pAudioPlayerObj) { - MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->Destroy((SLObjectItf)pDevice->opensl.pAudioPlayerObj); - } - if (pDevice->opensl.pOutputMixObj) { - MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->Destroy((SLObjectItf)pDevice->opensl.pOutputMixObj); - } - - ma_free(pDevice->opensl.pBufferPlayback, &pDevice->pContext->allocationCallbacks); - } - - return MA_SUCCESS; -} - -#if defined(MA_ANDROID) && __ANDROID_API__ >= 21 -typedef SLAndroidDataFormat_PCM_EX ma_SLDataFormat_PCM; -#else -typedef SLDataFormat_PCM ma_SLDataFormat_PCM; -#endif - -static ma_result ma_SLDataFormat_PCM_init__opensl(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const ma_channel* channelMap, ma_SLDataFormat_PCM* pDataFormat) -{ - /* We need to convert our format/channels/rate so that they aren't set to default. */ - if (format == ma_format_unknown) { - format = MA_DEFAULT_FORMAT; - } - if (channels == 0) { - channels = MA_DEFAULT_CHANNELS; - } - if (sampleRate == 0) { - sampleRate = MA_DEFAULT_SAMPLE_RATE; - } - -#if defined(MA_ANDROID) && __ANDROID_API__ >= 21 - if (format == ma_format_f32) { - pDataFormat->formatType = SL_ANDROID_DATAFORMAT_PCM_EX; - pDataFormat->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; - } else { - pDataFormat->formatType = SL_DATAFORMAT_PCM; - } -#else - pDataFormat->formatType = SL_DATAFORMAT_PCM; -#endif - - pDataFormat->numChannels = channels; - ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec = ma_round_to_standard_sample_rate__opensl(sampleRate * 1000); /* In millihertz. Annoyingly, the sample rate variable is named differently between SLAndroidDataFormat_PCM_EX and SLDataFormat_PCM */ - pDataFormat->bitsPerSample = ma_get_bytes_per_sample(format) * 8; - pDataFormat->channelMask = ma_channel_map_to_channel_mask__opensl(channelMap, channels); - pDataFormat->endianness = (ma_is_little_endian()) ? SL_BYTEORDER_LITTLEENDIAN : SL_BYTEORDER_BIGENDIAN; - - /* - Android has a few restrictions on the format as documented here: https://developer.android.com/ndk/guides/audio/opensl-for-android.html - - Only mono and stereo is supported. - - Only u8 and s16 formats are supported. - - Maximum sample rate of 48000. - */ -#ifdef MA_ANDROID - if (pDataFormat->numChannels > 2) { - pDataFormat->numChannels = 2; - } -#if __ANDROID_API__ >= 21 - if (pDataFormat->formatType == SL_ANDROID_DATAFORMAT_PCM_EX) { - /* It's floating point. */ - MA_ASSERT(pDataFormat->representation == SL_ANDROID_PCM_REPRESENTATION_FLOAT); - if (pDataFormat->bitsPerSample > 32) { - pDataFormat->bitsPerSample = 32; - } - } else { - if (pDataFormat->bitsPerSample > 16) { - pDataFormat->bitsPerSample = 16; - } - } -#else - if (pDataFormat->bitsPerSample > 16) { - pDataFormat->bitsPerSample = 16; - } -#endif - if (((SLDataFormat_PCM*)pDataFormat)->samplesPerSec > SL_SAMPLINGRATE_48) { - ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec = SL_SAMPLINGRATE_48; - } -#endif - - pDataFormat->containerSize = pDataFormat->bitsPerSample; /* Always tightly packed for now. */ - - return MA_SUCCESS; -} - -static ma_result ma_deconstruct_SLDataFormat_PCM__opensl(ma_SLDataFormat_PCM* pDataFormat, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - ma_bool32 isFloatingPoint = MA_FALSE; -#if defined(MA_ANDROID) && __ANDROID_API__ >= 21 - if (pDataFormat->formatType == SL_ANDROID_DATAFORMAT_PCM_EX) { - MA_ASSERT(pDataFormat->representation == SL_ANDROID_PCM_REPRESENTATION_FLOAT); - isFloatingPoint = MA_TRUE; - } -#endif - if (isFloatingPoint) { - if (pDataFormat->bitsPerSample == 32) { - *pFormat = ma_format_f32; - } - } else { - if (pDataFormat->bitsPerSample == 8) { - *pFormat = ma_format_u8; - } else if (pDataFormat->bitsPerSample == 16) { - *pFormat = ma_format_s16; - } else if (pDataFormat->bitsPerSample == 24) { - *pFormat = ma_format_s24; - } else if (pDataFormat->bitsPerSample == 32) { - *pFormat = ma_format_s32; - } - } - - *pChannels = pDataFormat->numChannels; - *pSampleRate = ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec / 1000; - ma_channel_mask_to_channel_map__opensl(pDataFormat->channelMask, ma_min(pDataFormat->numChannels, channelMapCap), pChannelMap); - - return MA_SUCCESS; -} - -static ma_result ma_device_init__opensl(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ -#ifdef MA_ANDROID - SLDataLocator_AndroidSimpleBufferQueue queue; - SLresult resultSL; - size_t bufferSizeInBytes; - SLInterfaceID itfIDs[2]; - const SLboolean itfIDsRequired[] = { - SL_BOOLEAN_TRUE, /* SL_IID_ANDROIDSIMPLEBUFFERQUEUE */ - SL_BOOLEAN_FALSE /* SL_IID_ANDROIDCONFIGURATION */ - }; -#endif - - MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to initialize a new device. */ - if (g_maOpenSLInitCounter == 0) { - return MA_INVALID_OPERATION; - } - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* - For now, only supporting Android implementations of OpenSL|ES since that's the only one I've - been able to test with and I currently depend on Android-specific extensions (simple buffer - queues). - */ -#ifdef MA_ANDROID - itfIDs[0] = (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE; - itfIDs[1] = (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDCONFIGURATION; - - /* No exclusive mode with OpenSL|ES. */ - if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) || - ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode == ma_share_mode_exclusive)) { - return MA_SHARE_MODE_NOT_SUPPORTED; - } - - /* Now we can start initializing the device properly. */ - MA_ASSERT(pDevice != NULL); - MA_ZERO_OBJECT(&pDevice->opensl); - - queue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - ma_SLDataFormat_PCM pcm; - SLDataLocator_IODevice locatorDevice; - SLDataSource source; - SLDataSink sink; - SLAndroidConfigurationItf pRecorderConfig; - - ma_SLDataFormat_PCM_init__opensl(pDescriptorCapture->format, pDescriptorCapture->channels, pDescriptorCapture->sampleRate, pDescriptorCapture->channelMap, &pcm); - - locatorDevice.locatorType = SL_DATALOCATOR_IODEVICE; - locatorDevice.deviceType = SL_IODEVICE_AUDIOINPUT; - locatorDevice.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT; /* Must always use the default device with Android. */ - locatorDevice.device = NULL; - - source.pLocator = &locatorDevice; - source.pFormat = NULL; - - queue.numBuffers = pDescriptorCapture->periodCount; - - sink.pLocator = &queue; - sink.pFormat = (SLDataFormat_PCM*)&pcm; - - resultSL = (*g_maEngineSL)->CreateAudioRecorder(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioRecorderObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired); - if (resultSL == SL_RESULT_CONTENT_UNSUPPORTED || resultSL == SL_RESULT_PARAMETER_INVALID) { - /* Unsupported format. Fall back to something safer and try again. If this fails, just abort. */ - pcm.formatType = SL_DATAFORMAT_PCM; - pcm.numChannels = 1; - ((SLDataFormat_PCM*)&pcm)->samplesPerSec = SL_SAMPLINGRATE_16; /* The name of the sample rate variable is different between SLAndroidDataFormat_PCM_EX and SLDataFormat_PCM. */ - pcm.bitsPerSample = 16; - pcm.containerSize = pcm.bitsPerSample; /* Always tightly packed for now. */ - pcm.channelMask = 0; - resultSL = (*g_maEngineSL)->CreateAudioRecorder(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioRecorderObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired); - } - - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to create audio recorder."); - return ma_result_from_OpenSL(resultSL); - } - - - /* Set the recording preset before realizing the player. */ - if (pConfig->opensl.recordingPreset != ma_opensl_recording_preset_default) { - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDCONFIGURATION, &pRecorderConfig); - if (resultSL == SL_RESULT_SUCCESS) { - SLint32 recordingPreset = ma_to_recording_preset__opensl(pConfig->opensl.recordingPreset); - resultSL = (*pRecorderConfig)->SetConfiguration(pRecorderConfig, SL_ANDROID_KEY_RECORDING_PRESET, &recordingPreset, sizeof(SLint32)); - if (resultSL != SL_RESULT_SUCCESS) { - /* Failed to set the configuration. Just keep going. */ - } - } - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->Realize((SLObjectItf)pDevice->opensl.pAudioRecorderObj, SL_BOOLEAN_FALSE); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to realize audio recorder."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_RECORD, &pDevice->opensl.pAudioRecorder); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to retrieve SL_IID_RECORD interface."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &pDevice->opensl.pBufferQueueCapture); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to retrieve SL_IID_ANDROIDSIMPLEBUFFERQUEUE interface."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->RegisterCallback((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, ma_buffer_queue_callback_capture__opensl_android, pDevice); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to register buffer queue callback."); - return ma_result_from_OpenSL(resultSL); - } - - /* The internal format is determined by the "pcm" object. */ - ma_deconstruct_SLDataFormat_PCM__opensl(&pcm, &pDescriptorCapture->format, &pDescriptorCapture->channels, &pDescriptorCapture->sampleRate, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap)); - - /* Buffer. */ - pDescriptorCapture->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorCapture, pDescriptorCapture->sampleRate, pConfig->performanceProfile); - pDevice->opensl.currentBufferIndexCapture = 0; - - bufferSizeInBytes = pDescriptorCapture->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) * pDescriptorCapture->periodCount; - pDevice->opensl.pBufferCapture = (ma_uint8*)ma_calloc(bufferSizeInBytes, &pDevice->pContext->allocationCallbacks); - if (pDevice->opensl.pBufferCapture == NULL) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to allocate memory for data buffer."); - return MA_OUT_OF_MEMORY; - } - MA_ZERO_MEMORY(pDevice->opensl.pBufferCapture, bufferSizeInBytes); - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_SLDataFormat_PCM pcm; - SLDataSource source; - SLDataLocator_OutputMix outmixLocator; - SLDataSink sink; - SLAndroidConfigurationItf pPlayerConfig; - - ma_SLDataFormat_PCM_init__opensl(pDescriptorPlayback->format, pDescriptorPlayback->channels, pDescriptorPlayback->sampleRate, pDescriptorPlayback->channelMap, &pcm); - - resultSL = (*g_maEngineSL)->CreateOutputMix(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pOutputMixObj, 0, NULL, NULL); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to create output mix."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->Realize((SLObjectItf)pDevice->opensl.pOutputMixObj, SL_BOOLEAN_FALSE); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to realize output mix object."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->GetInterface((SLObjectItf)pDevice->opensl.pOutputMixObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_OUTPUTMIX, &pDevice->opensl.pOutputMix); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to retrieve SL_IID_OUTPUTMIX interface."); - return ma_result_from_OpenSL(resultSL); - } - - /* Set the output device. */ - if (pDescriptorPlayback->pDeviceID != NULL) { - SLuint32 deviceID_OpenSL = pDescriptorPlayback->pDeviceID->opensl; - MA_OPENSL_OUTPUTMIX(pDevice->opensl.pOutputMix)->ReRoute((SLOutputMixItf)pDevice->opensl.pOutputMix, 1, &deviceID_OpenSL); - } - - queue.numBuffers = pDescriptorPlayback->periodCount; - - source.pLocator = &queue; - source.pFormat = (SLDataFormat_PCM*)&pcm; - - outmixLocator.locatorType = SL_DATALOCATOR_OUTPUTMIX; - outmixLocator.outputMix = (SLObjectItf)pDevice->opensl.pOutputMixObj; - - sink.pLocator = &outmixLocator; - sink.pFormat = NULL; - - resultSL = (*g_maEngineSL)->CreateAudioPlayer(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioPlayerObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired); - if (resultSL == SL_RESULT_CONTENT_UNSUPPORTED || resultSL == SL_RESULT_PARAMETER_INVALID) { - /* Unsupported format. Fall back to something safer and try again. If this fails, just abort. */ - pcm.formatType = SL_DATAFORMAT_PCM; - pcm.numChannels = 2; - ((SLDataFormat_PCM*)&pcm)->samplesPerSec = SL_SAMPLINGRATE_16; - pcm.bitsPerSample = 16; - pcm.containerSize = pcm.bitsPerSample; /* Always tightly packed for now. */ - pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; - resultSL = (*g_maEngineSL)->CreateAudioPlayer(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioPlayerObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired); - } - - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to create audio player."); - return ma_result_from_OpenSL(resultSL); - } - - - /* Set the stream type before realizing the player. */ - if (pConfig->opensl.streamType != ma_opensl_stream_type_default) { - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDCONFIGURATION, &pPlayerConfig); - if (resultSL == SL_RESULT_SUCCESS) { - SLint32 streamType = ma_to_stream_type__opensl(pConfig->opensl.streamType); - resultSL = (*pPlayerConfig)->SetConfiguration(pPlayerConfig, SL_ANDROID_KEY_STREAM_TYPE, &streamType, sizeof(SLint32)); - if (resultSL != SL_RESULT_SUCCESS) { - /* Failed to set the configuration. Just keep going. */ - } - } - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->Realize((SLObjectItf)pDevice->opensl.pAudioPlayerObj, SL_BOOLEAN_FALSE); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to realize audio player."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_PLAY, &pDevice->opensl.pAudioPlayer); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to retrieve SL_IID_PLAY interface."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &pDevice->opensl.pBufferQueuePlayback); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to retrieve SL_IID_ANDROIDSIMPLEBUFFERQUEUE interface."); - return ma_result_from_OpenSL(resultSL); - } - - resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->RegisterCallback((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, ma_buffer_queue_callback_playback__opensl_android, pDevice); - if (resultSL != SL_RESULT_SUCCESS) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to register buffer queue callback."); - return ma_result_from_OpenSL(resultSL); - } - - /* The internal format is determined by the "pcm" object. */ - ma_deconstruct_SLDataFormat_PCM__opensl(&pcm, &pDescriptorPlayback->format, &pDescriptorPlayback->channels, &pDescriptorPlayback->sampleRate, pDescriptorPlayback->channelMap, ma_countof(pDescriptorPlayback->channelMap)); - - /* Buffer. */ - pDescriptorPlayback->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile); - pDevice->opensl.currentBufferIndexPlayback = 0; - - bufferSizeInBytes = pDescriptorPlayback->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels) * pDescriptorPlayback->periodCount; - pDevice->opensl.pBufferPlayback = (ma_uint8*)ma_calloc(bufferSizeInBytes, &pDevice->pContext->allocationCallbacks); - if (pDevice->opensl.pBufferPlayback == NULL) { - ma_device_uninit__opensl(pDevice); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to allocate memory for data buffer."); - return MA_OUT_OF_MEMORY; - } - MA_ZERO_MEMORY(pDevice->opensl.pBufferPlayback, bufferSizeInBytes); - } - - return MA_SUCCESS; -#else - return MA_NO_BACKEND; /* Non-Android implementations are not supported. */ -#endif -} - -static ma_result ma_device_start__opensl(ma_device* pDevice) -{ - SLresult resultSL; - size_t periodSizeInBytes; - ma_uint32 iPeriod; - - MA_ASSERT(pDevice != NULL); - - MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to start the device. */ - if (g_maOpenSLInitCounter == 0) { - return MA_INVALID_OPERATION; - } - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - resultSL = MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_RECORDING); - if (resultSL != SL_RESULT_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to start internal capture device."); - return ma_result_from_OpenSL(resultSL); - } - - periodSizeInBytes = pDevice->capture.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels); - for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) { - resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, pDevice->opensl.pBufferCapture + (periodSizeInBytes * iPeriod), periodSizeInBytes); - if (resultSL != SL_RESULT_SUCCESS) { - MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_STOPPED); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to enqueue buffer for capture device."); - return ma_result_from_OpenSL(resultSL); - } - } - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - resultSL = MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_PLAYING); - if (resultSL != SL_RESULT_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to start internal playback device."); - return ma_result_from_OpenSL(resultSL); - } - - /* In playback mode (no duplex) we need to load some initial buffers. In duplex mode we need to enqueu silent buffers. */ - if (pDevice->type == ma_device_type_duplex) { - MA_ZERO_MEMORY(pDevice->opensl.pBufferPlayback, pDevice->playback.internalPeriodSizeInFrames * pDevice->playback.internalPeriods * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels)); - } else { - ma_device__read_frames_from_client(pDevice, pDevice->playback.internalPeriodSizeInFrames * pDevice->playback.internalPeriods, pDevice->opensl.pBufferPlayback); - } - - periodSizeInBytes = pDevice->playback.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels); - for (iPeriod = 0; iPeriod < pDevice->playback.internalPeriods; ++iPeriod) { - resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, pDevice->opensl.pBufferPlayback + (periodSizeInBytes * iPeriod), periodSizeInBytes); - if (resultSL != SL_RESULT_SUCCESS) { - MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_STOPPED); - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to enqueue buffer for playback device."); - return ma_result_from_OpenSL(resultSL); - } - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_drain__opensl(ma_device* pDevice, ma_device_type deviceType) -{ - SLAndroidSimpleBufferQueueItf pBufferQueue; - - MA_ASSERT(deviceType == ma_device_type_capture || deviceType == ma_device_type_playback); - - if (pDevice->type == ma_device_type_capture) { - pBufferQueue = (SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture; - pDevice->opensl.isDrainingCapture = MA_TRUE; - } else { - pBufferQueue = (SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback; - pDevice->opensl.isDrainingPlayback = MA_TRUE; - } - - for (;;) { - SLAndroidSimpleBufferQueueState state; - - MA_OPENSL_BUFFERQUEUE(pBufferQueue)->GetState(pBufferQueue, &state); - if (state.count == 0) { - break; - } - - ma_sleep(10); - } - - if (pDevice->type == ma_device_type_capture) { - pDevice->opensl.isDrainingCapture = MA_FALSE; - } else { - pDevice->opensl.isDrainingPlayback = MA_FALSE; - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__opensl(ma_device* pDevice) -{ - SLresult resultSL; - - MA_ASSERT(pDevice != NULL); - - MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it before stopping/uninitializing the device. */ - if (g_maOpenSLInitCounter == 0) { - return MA_INVALID_OPERATION; - } - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_device_drain__opensl(pDevice, ma_device_type_capture); - - resultSL = MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_STOPPED); - if (resultSL != SL_RESULT_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to stop internal capture device."); - return ma_result_from_OpenSL(resultSL); - } - - MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Clear((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_device_drain__opensl(pDevice, ma_device_type_playback); - - resultSL = MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_STOPPED); - if (resultSL != SL_RESULT_SUCCESS) { - ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, "[OpenSL] Failed to stop internal playback device."); - return ma_result_from_OpenSL(resultSL); - } - - MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Clear((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback); - } - - /* Make sure the client is aware that the device has stopped. There may be an OpenSL|ES callback for this, but I haven't found it. */ - ma_device__on_notification_stopped(pDevice); - - return MA_SUCCESS; -} - - -static ma_result ma_context_uninit__opensl(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_opensl); - (void)pContext; - - /* Uninit global data. */ - ma_spinlock_lock(&g_maOpenSLSpinlock); - { - MA_ASSERT(g_maOpenSLInitCounter > 0); /* If you've triggered this, it means you have ma_context_init/uninit mismatch. Each successful call to ma_context_init() must be matched up with a call to ma_context_uninit(). */ - - g_maOpenSLInitCounter -= 1; - if (g_maOpenSLInitCounter == 0) { - (*g_maEngineObjectSL)->Destroy(g_maEngineObjectSL); - } - } - ma_spinlock_unlock(&g_maOpenSLSpinlock); - - return MA_SUCCESS; -} - -static ma_result ma_dlsym_SLInterfaceID__opensl(ma_context* pContext, const char* pName, ma_handle* pHandle) -{ - /* We need to return an error if the symbol cannot be found. This is important because there have been reports that some symbols do not exist. */ - ma_handle* p = (ma_handle*)ma_dlsym(pContext, pContext->opensl.libOpenSLES, pName); - if (p == NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, "[OpenSL] Cannot find symbol %s", pName); - return MA_NO_BACKEND; - } - - *pHandle = *p; - return MA_SUCCESS; -} - -static ma_result ma_context_init_engine_nolock__opensl(ma_context* pContext) -{ - g_maOpenSLInitCounter += 1; - if (g_maOpenSLInitCounter == 1) { - SLresult resultSL; - - resultSL = ((ma_slCreateEngine_proc)pContext->opensl.slCreateEngine)(&g_maEngineObjectSL, 0, NULL, 0, NULL, NULL); - if (resultSL != SL_RESULT_SUCCESS) { - g_maOpenSLInitCounter -= 1; - return ma_result_from_OpenSL(resultSL); - } - - (*g_maEngineObjectSL)->Realize(g_maEngineObjectSL, SL_BOOLEAN_FALSE); - - resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, (SLInterfaceID)pContext->opensl.SL_IID_ENGINE, &g_maEngineSL); - if (resultSL != SL_RESULT_SUCCESS) { - (*g_maEngineObjectSL)->Destroy(g_maEngineObjectSL); - g_maOpenSLInitCounter -= 1; - return ma_result_from_OpenSL(resultSL); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_context_init__opensl(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - ma_result result; - -#if !defined(MA_NO_RUNTIME_LINKING) - size_t i; - const char* libOpenSLESNames[] = { - "libOpenSLES.so" - }; -#endif - - MA_ASSERT(pContext != NULL); - - (void)pConfig; - -#if !defined(MA_NO_RUNTIME_LINKING) - /* - Dynamically link against libOpenSLES.so. I have now had multiple reports that SL_IID_ANDROIDSIMPLEBUFFERQUEUE cannot be found. One - report was happening at compile time and another at runtime. To try working around this, I'm going to link to libOpenSLES at runtime - and extract the symbols rather than reference them directly. This should, hopefully, fix these issues as the compiler won't see any - references to the symbols and will hopefully skip the checks. - */ - for (i = 0; i < ma_countof(libOpenSLESNames); i += 1) { - pContext->opensl.libOpenSLES = ma_dlopen(pContext, libOpenSLESNames[i]); - if (pContext->opensl.libOpenSLES != NULL) { - break; - } - } - - if (pContext->opensl.libOpenSLES == NULL) { - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, "[OpenSL] Could not find libOpenSLES.so"); - return MA_NO_BACKEND; - } - - result = ma_dlsym_SLInterfaceID__opensl(pContext, "SL_IID_ENGINE", &pContext->opensl.SL_IID_ENGINE); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - return result; - } - - result = ma_dlsym_SLInterfaceID__opensl(pContext, "SL_IID_AUDIOIODEVICECAPABILITIES", &pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - return result; - } - - result = ma_dlsym_SLInterfaceID__opensl(pContext, "SL_IID_ANDROIDSIMPLEBUFFERQUEUE", &pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - return result; - } - - result = ma_dlsym_SLInterfaceID__opensl(pContext, "SL_IID_RECORD", &pContext->opensl.SL_IID_RECORD); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - return result; - } - - result = ma_dlsym_SLInterfaceID__opensl(pContext, "SL_IID_PLAY", &pContext->opensl.SL_IID_PLAY); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - return result; - } - - result = ma_dlsym_SLInterfaceID__opensl(pContext, "SL_IID_OUTPUTMIX", &pContext->opensl.SL_IID_OUTPUTMIX); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - return result; - } - - result = ma_dlsym_SLInterfaceID__opensl(pContext, "SL_IID_ANDROIDCONFIGURATION", &pContext->opensl.SL_IID_ANDROIDCONFIGURATION); - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - return result; - } - - pContext->opensl.slCreateEngine = (ma_proc)ma_dlsym(pContext, pContext->opensl.libOpenSLES, "slCreateEngine"); - if (pContext->opensl.slCreateEngine == NULL) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, "[OpenSL] Cannot find symbol slCreateEngine."); - return MA_NO_BACKEND; - } -#else - pContext->opensl.SL_IID_ENGINE = (ma_handle)SL_IID_ENGINE; - pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES = (ma_handle)SL_IID_AUDIOIODEVICECAPABILITIES; - pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE = (ma_handle)SL_IID_ANDROIDSIMPLEBUFFERQUEUE; - pContext->opensl.SL_IID_RECORD = (ma_handle)SL_IID_RECORD; - pContext->opensl.SL_IID_PLAY = (ma_handle)SL_IID_PLAY; - pContext->opensl.SL_IID_OUTPUTMIX = (ma_handle)SL_IID_OUTPUTMIX; - pContext->opensl.SL_IID_ANDROIDCONFIGURATION = (ma_handle)SL_IID_ANDROIDCONFIGURATION; - pContext->opensl.slCreateEngine = (ma_proc)slCreateEngine; -#endif - - - /* Initialize global data first if applicable. */ - ma_spinlock_lock(&g_maOpenSLSpinlock); - { - result = ma_context_init_engine_nolock__opensl(pContext); - } - ma_spinlock_unlock(&g_maOpenSLSpinlock); - - if (result != MA_SUCCESS) { - ma_dlclose(pContext, pContext->opensl.libOpenSLES); - ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, "[OpenSL] Failed to initialize OpenSL engine."); - return result; - } - - pCallbacks->onContextInit = ma_context_init__opensl; - pCallbacks->onContextUninit = ma_context_uninit__opensl; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__opensl; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__opensl; - pCallbacks->onDeviceInit = ma_device_init__opensl; - pCallbacks->onDeviceUninit = ma_device_uninit__opensl; - pCallbacks->onDeviceStart = ma_device_start__opensl; - pCallbacks->onDeviceStop = ma_device_stop__opensl; - pCallbacks->onDeviceRead = NULL; /* Not needed because OpenSL|ES is asynchronous. */ - pCallbacks->onDeviceWrite = NULL; /* Not needed because OpenSL|ES is asynchronous. */ - pCallbacks->onDeviceDataLoop = NULL; /* Not needed because OpenSL|ES is asynchronous. */ - - return MA_SUCCESS; -} -#endif /* OpenSL|ES */ - - -/****************************************************************************** - -Web Audio Backend - -******************************************************************************/ -#ifdef MA_HAS_WEBAUDIO -#include - -static ma_bool32 ma_is_capture_supported__webaudio() -{ - return EM_ASM_INT({ - return (navigator.mediaDevices !== undefined && navigator.mediaDevices.getUserMedia !== undefined); - }, 0) != 0; /* Must pass in a dummy argument for C99 compatibility. */ -} - -#ifdef __cplusplus -extern "C" { -#endif -void EMSCRIPTEN_KEEPALIVE ma_device_process_pcm_frames_capture__webaudio(ma_device* pDevice, int frameCount, float* pFrames) -{ - ma_device_handle_backend_data_callback(pDevice, NULL, pFrames, (ma_uint32)frameCount); -} - -void EMSCRIPTEN_KEEPALIVE ma_device_process_pcm_frames_playback__webaudio(ma_device* pDevice, int frameCount, float* pFrames) -{ - ma_device_handle_backend_data_callback(pDevice, pFrames, NULL, (ma_uint32)frameCount); -} -#ifdef __cplusplus -} -#endif - -static ma_result ma_context_enumerate_devices__webaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_bool32 cbResult = MA_TRUE; - - MA_ASSERT(pContext != NULL); - MA_ASSERT(callback != NULL); - - /* Only supporting default devices for now. */ - - /* Playback. */ - if (cbResult) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - deviceInfo.isDefault = MA_TRUE; /* Only supporting default devices. */ - cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData); - } - - /* Capture. */ - if (cbResult) { - if (ma_is_capture_supported__webaudio()) { - ma_device_info deviceInfo; - MA_ZERO_OBJECT(&deviceInfo); - ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - deviceInfo.isDefault = MA_TRUE; /* Only supporting default devices. */ - cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_context_get_device_info__webaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - MA_ASSERT(pContext != NULL); - - if (deviceType == ma_device_type_capture && !ma_is_capture_supported__webaudio()) { - return MA_NO_DEVICE; - } - - MA_ZERO_MEMORY(pDeviceInfo->id.webaudio, sizeof(pDeviceInfo->id.webaudio)); - - /* Only supporting default devices for now. */ - (void)pDeviceID; - if (deviceType == ma_device_type_playback) { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } - - /* Only supporting default devices. */ - pDeviceInfo->isDefault = MA_TRUE; - - /* Web Audio can support any number of channels and sample rates. It only supports f32 formats, however. */ - pDeviceInfo->nativeDataFormats[0].flags = 0; - pDeviceInfo->nativeDataFormats[0].format = ma_format_unknown; - pDeviceInfo->nativeDataFormats[0].channels = 0; /* All channels are supported. */ - pDeviceInfo->nativeDataFormats[0].sampleRate = EM_ASM_INT({ - try { - var temp = new (window.AudioContext || window.webkitAudioContext)(); - var sampleRate = temp.sampleRate; - temp.close(); - return sampleRate; - } catch(e) { - return 0; - } - }, 0); /* Must pass in a dummy argument for C99 compatibility. */ - - if (pDeviceInfo->nativeDataFormats[0].sampleRate == 0) { - return MA_NO_DEVICE; - } - - pDeviceInfo->nativeDataFormatCount = 1; - - return MA_SUCCESS; -} - - -static void ma_device_uninit_by_index__webaudio(ma_device* pDevice, ma_device_type deviceType, int deviceIndex) -{ - MA_ASSERT(pDevice != NULL); - - EM_ASM({ - var device = miniaudio.get_device_by_index($0); - - /* Make sure all nodes are disconnected and marked for collection. */ - if (device.scriptNode !== undefined) { - device.scriptNode.onaudioprocess = function(e) {}; /* We want to reset the callback to ensure it doesn't get called after AudioContext.close() has returned. Shouldn't happen since we're disconnecting, but just to be safe... */ - device.scriptNode.disconnect(); - device.scriptNode = undefined; - } - if (device.streamNode !== undefined) { - device.streamNode.disconnect(); - device.streamNode = undefined; - } - - /* - Stop the device. I think there is a chance the callback could get fired after calling this, hence why we want - to clear the callback before closing. - */ - device.webaudio.close(); - device.webaudio = undefined; - - /* Can't forget to free the intermediary buffer. This is the buffer that's shared between JavaScript and C. */ - if (device.intermediaryBuffer !== undefined) { - Module._free(device.intermediaryBuffer); - device.intermediaryBuffer = undefined; - device.intermediaryBufferView = undefined; - device.intermediaryBufferSizeInBytes = undefined; - } - - /* Make sure the device is untracked so the slot can be reused later. */ - miniaudio.untrack_device_by_index($0); - }, deviceIndex, deviceType); -} - -static ma_result ma_device_uninit__webaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_capture, pDevice->webaudio.indexCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_playback, pDevice->webaudio.indexPlayback); - } - - return MA_SUCCESS; -} - -static ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__webaudio(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile) -{ - /* - There have been reports of the default buffer size being too small on some browsers. There have been reports of the default buffer - size being too small on some browsers. If we're using default buffer size, we'll make sure the period size is a big biffer than our - standard defaults. - */ - ma_uint32 periodSizeInFrames; - - if (pDescriptor->periodSizeInFrames == 0) { - if (pDescriptor->periodSizeInMilliseconds == 0) { - if (performanceProfile == ma_performance_profile_low_latency) { - periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(33, nativeSampleRate); /* 1 frame @ 30 FPS */ - } else { - periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(333, nativeSampleRate); - } - } else { - periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptor->periodSizeInMilliseconds, nativeSampleRate); - } - } else { - periodSizeInFrames = pDescriptor->periodSizeInFrames; - } - - /* The size of the buffer must be a power of 2 and between 256 and 16384. */ - if (periodSizeInFrames < 256) { - periodSizeInFrames = 256; - } else if (periodSizeInFrames > 16384) { - periodSizeInFrames = 16384; - } else { - periodSizeInFrames = ma_next_power_of_2(periodSizeInFrames); - } - - return periodSizeInFrames; -} - -static ma_result ma_device_init_by_type__webaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType) -{ - int deviceIndex; - ma_uint32 channels; - ma_uint32 sampleRate; - ma_uint32 periodSizeInFrames; - - MA_ASSERT(pDevice != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(deviceType != ma_device_type_duplex); - - if (deviceType == ma_device_type_capture && !ma_is_capture_supported__webaudio()) { - return MA_NO_DEVICE; - } - - /* We're going to calculate some stuff in C just to simplify the JS code. */ - channels = (pDescriptor->channels > 0) ? pDescriptor->channels : MA_DEFAULT_CHANNELS; - sampleRate = (pDescriptor->sampleRate > 0) ? pDescriptor->sampleRate : MA_DEFAULT_SAMPLE_RATE; - periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__webaudio(pDescriptor, sampleRate, pConfig->performanceProfile); - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, "periodSizeInFrames = %d\n", (int)periodSizeInFrames); - - /* We create the device on the JavaScript side and reference it using an index. We use this to make it possible to reference the device between JavaScript and C. */ - deviceIndex = EM_ASM_INT({ - var channels = $0; - var sampleRate = $1; - var bufferSize = $2; /* In PCM frames. */ - var isCapture = $3; - var pDevice = $4; - - if (typeof(window.miniaudio) === 'undefined') { - return -1; /* Context not initialized. */ - } - - var device = {}; - - /* The AudioContext must be created in a suspended state. */ - device.webaudio = new (window.AudioContext || window.webkitAudioContext)({sampleRate:sampleRate}); - device.webaudio.suspend(); - device.state = 1; /* ma_device_state_stopped */ - - /* - We need an intermediary buffer which we use for JavaScript and C interop. This buffer stores interleaved f32 PCM data. Because it's passed between - JavaScript and C it needs to be allocated and freed using Module._malloc() and Module._free(). - */ - device.intermediaryBufferSizeInBytes = channels * bufferSize * 4; - device.intermediaryBuffer = Module._malloc(device.intermediaryBufferSizeInBytes); - device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, device.intermediaryBuffer, device.intermediaryBufferSizeInBytes); - - /* - Both playback and capture devices use a ScriptProcessorNode for performing per-sample operations. - - ScriptProcessorNode is actually deprecated so this is likely to be temporary. The way this works for playback is very simple. You just set a callback - that's periodically fired, just like a normal audio callback function. But apparently this design is "flawed" and is now deprecated in favour of - something called AudioWorklets which _forces_ you to load a _separate_ .js file at run time... nice... Hopefully ScriptProcessorNode will continue to - work for years to come, but this may need to change to use AudioSourceBufferNode instead, which I think is what Emscripten uses for it's built-in SDL - implementation. I'll be avoiding that insane AudioWorklet API like the plague... - - For capture it is a bit unintuitive. We use the ScriptProccessorNode _only_ to get the raw PCM data. It is connected to an AudioContext just like the - playback case, however we just output silence to the AudioContext instead of passing any real data. It would make more sense to me to use the - MediaRecorder API, but unfortunately you need to specify a MIME time (Opus, Vorbis, etc.) for the binary blob that's returned to the client, but I've - been unable to figure out how to get this as raw PCM. The closest I can think is to use the MIME type for WAV files and just parse it, but I don't know - how well this would work. Although ScriptProccessorNode is deprecated, in practice it seems to have pretty good browser support so I'm leaving it like - this for now. If anyone knows how I could get raw PCM data using the MediaRecorder API please let me know! - */ - device.scriptNode = device.webaudio.createScriptProcessor(bufferSize, (isCapture) ? channels : 0, (isCapture) ? 0 : channels); - - if (isCapture) { - device.scriptNode.onaudioprocess = function(e) { - if (device.intermediaryBuffer === undefined) { - return; /* This means the device has been uninitialized. */ - } - - if (device.intermediaryBufferView.length == 0) { - /* Recreate intermediaryBufferView when losing reference to the underlying buffer, probably due to emscripten resizing heap. */ - device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, device.intermediaryBuffer, device.intermediaryBufferSizeInBytes); - } - - /* Make sure silence it output to the AudioContext destination. Not doing this will cause sound to come out of the speakers! */ - for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { - e.outputBuffer.getChannelData(iChannel).fill(0.0); - } - - /* There are some situations where we may want to send silence to the client. */ - var sendSilence = false; - if (device.streamNode === undefined) { - sendSilence = true; - } - - /* Sanity check. This will never happen, right? */ - if (e.inputBuffer.numberOfChannels != channels) { - console.log("Capture: Channel count mismatch. " + e.inputBufer.numberOfChannels + " != " + channels + ". Sending silence."); - sendSilence = true; - } - - /* This looped design guards against the situation where e.inputBuffer is a different size to the original buffer size. Should never happen in practice. */ - var totalFramesProcessed = 0; - while (totalFramesProcessed < e.inputBuffer.length) { - var framesRemaining = e.inputBuffer.length - totalFramesProcessed; - var framesToProcess = framesRemaining; - if (framesToProcess > (device.intermediaryBufferSizeInBytes/channels/4)) { - framesToProcess = (device.intermediaryBufferSizeInBytes/channels/4); - } - - /* We need to do the reverse of the playback case. We need to interleave the input data and copy it into the intermediary buffer. Then we send it to the client. */ - if (sendSilence) { - device.intermediaryBufferView.fill(0.0); - } else { - for (var iFrame = 0; iFrame < framesToProcess; ++iFrame) { - for (var iChannel = 0; iChannel < e.inputBuffer.numberOfChannels; ++iChannel) { - device.intermediaryBufferView[iFrame*channels + iChannel] = e.inputBuffer.getChannelData(iChannel)[totalFramesProcessed + iFrame]; - } - } - } - - /* Send data to the client from our intermediary buffer. */ - ccall("ma_device_process_pcm_frames_capture__webaudio", "undefined", ["number", "number", "number"], [pDevice, framesToProcess, device.intermediaryBuffer]); - - totalFramesProcessed += framesToProcess; - } - }; - - navigator.mediaDevices.getUserMedia({audio:true, video:false}) - .then(function(stream) { - device.streamNode = device.webaudio.createMediaStreamSource(stream); - device.streamNode.connect(device.scriptNode); - device.scriptNode.connect(device.webaudio.destination); - }) - .catch(function(error) { - /* I think this should output silence... */ - device.scriptNode.connect(device.webaudio.destination); - }); - } else { - device.scriptNode.onaudioprocess = function(e) { - if (device.intermediaryBuffer === undefined) { - return; /* This means the device has been uninitialized. */ - } - - if(device.intermediaryBufferView.length == 0) { - /* Recreate intermediaryBufferView when losing reference to the underlying buffer, probably due to emscripten resizing heap. */ - device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, device.intermediaryBuffer, device.intermediaryBufferSizeInBytes); - } - - var outputSilence = false; - - /* Sanity check. This will never happen, right? */ - if (e.outputBuffer.numberOfChannels != channels) { - console.log("Playback: Channel count mismatch. " + e.outputBufer.numberOfChannels + " != " + channels + ". Outputting silence."); - outputSilence = true; - return; - } - - /* This looped design guards against the situation where e.outputBuffer is a different size to the original buffer size. Should never happen in practice. */ - var totalFramesProcessed = 0; - while (totalFramesProcessed < e.outputBuffer.length) { - var framesRemaining = e.outputBuffer.length - totalFramesProcessed; - var framesToProcess = framesRemaining; - if (framesToProcess > (device.intermediaryBufferSizeInBytes/channels/4)) { - framesToProcess = (device.intermediaryBufferSizeInBytes/channels/4); - } - - /* Read data from the client into our intermediary buffer. */ - ccall("ma_device_process_pcm_frames_playback__webaudio", "undefined", ["number", "number", "number"], [pDevice, framesToProcess, device.intermediaryBuffer]); - - /* At this point we'll have data in our intermediary buffer which we now need to deinterleave and copy over to the output buffers. */ - if (outputSilence) { - for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { - e.outputBuffer.getChannelData(iChannel).fill(0.0); - } - } else { - for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { - var outputBuffer = e.outputBuffer.getChannelData(iChannel); - var intermediaryBuffer = device.intermediaryBufferView; - for (var iFrame = 0; iFrame < framesToProcess; ++iFrame) { - outputBuffer[totalFramesProcessed + iFrame] = intermediaryBuffer[iFrame*channels + iChannel]; - } - } - } - - totalFramesProcessed += framesToProcess; - } - }; - - device.scriptNode.connect(device.webaudio.destination); - } - - return miniaudio.track_device(device); - }, channels, sampleRate, periodSizeInFrames, deviceType == ma_device_type_capture, pDevice); - - if (deviceIndex < 0) { - return MA_FAILED_TO_OPEN_BACKEND_DEVICE; - } - - if (deviceType == ma_device_type_capture) { - pDevice->webaudio.indexCapture = deviceIndex; - } else { - pDevice->webaudio.indexPlayback = deviceIndex; - } - - pDescriptor->format = ma_format_f32; - pDescriptor->channels = channels; - ma_channel_map_init_standard(ma_standard_channel_map_webaudio, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), pDescriptor->channels); - pDescriptor->sampleRate = EM_ASM_INT({ return miniaudio.get_device_by_index($0).webaudio.sampleRate; }, deviceIndex); - pDescriptor->periodSizeInFrames = periodSizeInFrames; - pDescriptor->periodCount = 1; - - return MA_SUCCESS; -} - -static ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture) -{ - ma_result result; - - if (pConfig->deviceType == ma_device_type_loopback) { - return MA_DEVICE_TYPE_NOT_SUPPORTED; - } - - /* No exclusive mode with Web Audio. */ - if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) || - ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode == ma_share_mode_exclusive)) { - return MA_SHARE_MODE_NOT_SUPPORTED; - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - result = ma_device_init_by_type__webaudio(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture); - if (result != MA_SUCCESS) { - return result; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - result = ma_device_init_by_type__webaudio(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback); - if (result != MA_SUCCESS) { - if (pConfig->deviceType == ma_device_type_duplex) { - ma_device_uninit_by_index__webaudio(pDevice, ma_device_type_capture, pDevice->webaudio.indexCapture); - } - return result; - } - } - - return MA_SUCCESS; -} - -static ma_result ma_device_start__webaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - EM_ASM({ - var device = miniaudio.get_device_by_index($0); - device.webaudio.resume(); - device.state = 2; /* ma_device_state_started */ - }, pDevice->webaudio.indexCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - EM_ASM({ - var device = miniaudio.get_device_by_index($0); - device.webaudio.resume(); - device.state = 2; /* ma_device_state_started */ - }, pDevice->webaudio.indexPlayback); - } - - return MA_SUCCESS; -} - -static ma_result ma_device_stop__webaudio(ma_device* pDevice) -{ - MA_ASSERT(pDevice != NULL); - - /* - From the WebAudio API documentation for AudioContext.suspend(): - - Suspends the progression of AudioContext's currentTime, allows any current context processing blocks that are already processed to be played to the - destination, and then allows the system to release its claim on audio hardware. - - I read this to mean that "any current context processing blocks" are processed by suspend() - i.e. They they are drained. We therefore shouldn't need to - do any kind of explicit draining. - */ - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - EM_ASM({ - var device = miniaudio.get_device_by_index($0); - device.webaudio.suspend(); - device.state = 1; /* ma_device_state_stopped */ - }, pDevice->webaudio.indexCapture); - } - - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - EM_ASM({ - var device = miniaudio.get_device_by_index($0); - device.webaudio.suspend(); - device.state = 1; /* ma_device_state_stopped */ - }, pDevice->webaudio.indexPlayback); - } - - ma_device__on_notification_stopped(pDevice); - - return MA_SUCCESS; -} - -static ma_result ma_context_uninit__webaudio(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - MA_ASSERT(pContext->backend == ma_backend_webaudio); - - /* Nothing needs to be done here. */ - (void)pContext; - - return MA_SUCCESS; -} - -static ma_result ma_context_init__webaudio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks) -{ - int resultFromJS; - - MA_ASSERT(pContext != NULL); - - (void)pConfig; /* Unused. */ - - /* Here is where our global JavaScript object is initialized. */ - resultFromJS = EM_ASM_INT({ - if ((window.AudioContext || window.webkitAudioContext) === undefined) { - return 0; /* Web Audio not supported. */ - } - - if (typeof(window.miniaudio) === 'undefined') { - window.miniaudio = {}; - miniaudio.devices = []; /* Device cache for mapping devices to indexes for JavaScript/C interop. */ - - miniaudio.track_device = function(device) { - /* Try inserting into a free slot first. */ - for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) { - if (miniaudio.devices[iDevice] == null) { - miniaudio.devices[iDevice] = device; - return iDevice; - } - } - - /* Getting here means there is no empty slots in the array so we just push to the end. */ - miniaudio.devices.push(device); - return miniaudio.devices.length - 1; - }; - - miniaudio.untrack_device_by_index = function(deviceIndex) { - /* We just set the device's slot to null. The slot will get reused in the next call to ma_track_device. */ - miniaudio.devices[deviceIndex] = null; - - /* Trim the array if possible. */ - while (miniaudio.devices.length > 0) { - if (miniaudio.devices[miniaudio.devices.length-1] == null) { - miniaudio.devices.pop(); - } else { - break; - } - } - }; - - miniaudio.untrack_device = function(device) { - for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) { - if (miniaudio.devices[iDevice] == device) { - return miniaudio.untrack_device_by_index(iDevice); - } - } - }; - - miniaudio.get_device_by_index = function(deviceIndex) { - return miniaudio.devices[deviceIndex]; - }; - - miniaudio.unlock_event_types = (function(){ - return ['touchstart', 'touchend', 'click']; - })(); - - miniaudio.unlock = function() { - for(var i = 0; i < miniaudio.devices.length; ++i) { - var device = miniaudio.devices[i]; - if (device != null && device.webaudio != null && device.state === 2 /* ma_device_state_started */) { - device.webaudio.resume(); - } - } - miniaudio.unlock_event_types.map(function(event_type) { - document.removeEventListener(event_type, miniaudio.unlock, true); - }); - }; - - miniaudio.unlock_event_types.map(function(event_type) { - document.addEventListener(event_type, miniaudio.unlock, true); - }); - } - - return 1; - }, 0); /* Must pass in a dummy argument for C99 compatibility. */ - - if (resultFromJS != 1) { - return MA_FAILED_TO_INIT_BACKEND; - } - - pCallbacks->onContextInit = ma_context_init__webaudio; - pCallbacks->onContextUninit = ma_context_uninit__webaudio; - pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__webaudio; - pCallbacks->onContextGetDeviceInfo = ma_context_get_device_info__webaudio; - pCallbacks->onDeviceInit = ma_device_init__webaudio; - pCallbacks->onDeviceUninit = ma_device_uninit__webaudio; - pCallbacks->onDeviceStart = ma_device_start__webaudio; - pCallbacks->onDeviceStop = ma_device_stop__webaudio; - pCallbacks->onDeviceRead = NULL; /* Not needed because WebAudio is asynchronous. */ - pCallbacks->onDeviceWrite = NULL; /* Not needed because WebAudio is asynchronous. */ - pCallbacks->onDeviceDataLoop = NULL; /* Not needed because WebAudio is asynchronous. */ - - return MA_SUCCESS; -} -#endif /* Web Audio */ - - - -static ma_bool32 ma__is_channel_map_valid(const ma_channel* pChannelMap, ma_uint32 channels) -{ - /* A blank channel map should be allowed, in which case it should use an appropriate default which will depend on context. */ - if (pChannelMap != NULL && pChannelMap[0] != MA_CHANNEL_NONE) { - ma_uint32 iChannel; - - if (channels == 0 || channels > MA_MAX_CHANNELS) { - return MA_FALSE; /* Channel count out of range. */ - } - - /* A channel cannot be present in the channel map more than once. */ - for (iChannel = 0; iChannel < channels; ++iChannel) { - ma_uint32 jChannel; - for (jChannel = iChannel + 1; jChannel < channels; ++jChannel) { - if (pChannelMap[iChannel] == pChannelMap[jChannel]) { - return MA_FALSE; - } - } - } - } - - return MA_TRUE; -} - - -static ma_result ma_device__post_init_setup(ma_device* pDevice, ma_device_type deviceType) -{ - ma_result result; - - MA_ASSERT(pDevice != NULL); - - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) { - if (pDevice->capture.format == ma_format_unknown) { - pDevice->capture.format = pDevice->capture.internalFormat; - } - if (pDevice->capture.channels == 0) { - pDevice->capture.channels = pDevice->capture.internalChannels; - } - if (pDevice->capture.channelMap[0] == MA_CHANNEL_NONE) { - MA_ASSERT(pDevice->capture.channels <= MA_MAX_CHANNELS); - if (pDevice->capture.internalChannels == pDevice->capture.channels) { - ma_channel_map_copy(pDevice->capture.channelMap, pDevice->capture.internalChannelMap, pDevice->capture.channels); - } else { - if (pDevice->capture.channelMixMode == ma_channel_mix_mode_simple) { - ma_channel_map_init_blank(pDevice->capture.channelMap, pDevice->capture.channels); - } else { - ma_channel_map_init_standard(ma_standard_channel_map_default, pDevice->capture.channelMap, ma_countof(pDevice->capture.channelMap), pDevice->capture.channels); - } - } - } - } - - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - if (pDevice->playback.format == ma_format_unknown) { - pDevice->playback.format = pDevice->playback.internalFormat; - } - if (pDevice->playback.channels == 0) { - pDevice->playback.channels = pDevice->playback.internalChannels; - } - if (pDevice->playback.channelMap[0] == MA_CHANNEL_NONE) { - MA_ASSERT(pDevice->playback.channels <= MA_MAX_CHANNELS); - if (pDevice->playback.internalChannels == pDevice->playback.channels) { - ma_channel_map_copy(pDevice->playback.channelMap, pDevice->playback.internalChannelMap, pDevice->playback.channels); - } else { - if (pDevice->playback.channelMixMode == ma_channel_mix_mode_simple) { - ma_channel_map_init_blank(pDevice->playback.channelMap, pDevice->playback.channels); - } else { - ma_channel_map_init_standard(ma_standard_channel_map_default, pDevice->playback.channelMap, ma_countof(pDevice->playback.channelMap), pDevice->playback.channels); - } - } - } - } - - if (pDevice->sampleRate == 0) { - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) { - pDevice->sampleRate = pDevice->capture.internalSampleRate; - } else { - pDevice->sampleRate = pDevice->playback.internalSampleRate; - } - } - - /* Data converters. */ - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) { - /* Converting from internal device format to client format. */ - ma_data_converter_config converterConfig = ma_data_converter_config_init_default(); - converterConfig.formatIn = pDevice->capture.internalFormat; - converterConfig.channelsIn = pDevice->capture.internalChannels; - converterConfig.sampleRateIn = pDevice->capture.internalSampleRate; - converterConfig.pChannelMapIn = pDevice->capture.internalChannelMap; - converterConfig.formatOut = pDevice->capture.format; - converterConfig.channelsOut = pDevice->capture.channels; - converterConfig.sampleRateOut = pDevice->sampleRate; - converterConfig.pChannelMapOut = pDevice->capture.channelMap; - converterConfig.channelMixMode = pDevice->capture.channelMixMode; - converterConfig.allowDynamicSampleRate = MA_FALSE; - converterConfig.resampling.algorithm = pDevice->resampling.algorithm; - converterConfig.resampling.linear.lpfOrder = pDevice->resampling.linear.lpfOrder; - converterConfig.resampling.pBackendVTable = pDevice->resampling.pBackendVTable; - converterConfig.resampling.pBackendUserData = pDevice->resampling.pBackendUserData; - - /* Make sure the old converter is uninitialized first. */ - if (ma_device_get_state(pDevice) != ma_device_state_uninitialized) { - ma_data_converter_uninit(&pDevice->capture.converter, &pDevice->pContext->allocationCallbacks); - } - - result = ma_data_converter_init(&converterConfig, &pDevice->pContext->allocationCallbacks, &pDevice->capture.converter); - if (result != MA_SUCCESS) { - return result; - } - } - - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - /* Converting from client format to device format. */ - ma_data_converter_config converterConfig = ma_data_converter_config_init_default(); - converterConfig.formatIn = pDevice->playback.format; - converterConfig.channelsIn = pDevice->playback.channels; - converterConfig.sampleRateIn = pDevice->sampleRate; - converterConfig.pChannelMapIn = pDevice->playback.channelMap; - converterConfig.formatOut = pDevice->playback.internalFormat; - converterConfig.channelsOut = pDevice->playback.internalChannels; - converterConfig.sampleRateOut = pDevice->playback.internalSampleRate; - converterConfig.pChannelMapOut = pDevice->playback.internalChannelMap; - converterConfig.channelMixMode = pDevice->playback.channelMixMode; - converterConfig.allowDynamicSampleRate = MA_FALSE; - converterConfig.resampling.algorithm = pDevice->resampling.algorithm; - converterConfig.resampling.linear.lpfOrder = pDevice->resampling.linear.lpfOrder; - converterConfig.resampling.pBackendVTable = pDevice->resampling.pBackendVTable; - converterConfig.resampling.pBackendUserData = pDevice->resampling.pBackendUserData; - - /* Make sure the old converter is uninitialized first. */ - if (ma_device_get_state(pDevice) != ma_device_state_uninitialized) { - ma_data_converter_uninit(&pDevice->playback.converter, &pDevice->pContext->allocationCallbacks); - } - - result = ma_data_converter_init(&converterConfig, &pDevice->pContext->allocationCallbacks, &pDevice->playback.converter); - if (result != MA_SUCCESS) { - return result; - } - } - - - /* - In playback mode, if the data converter does not support retrieval of the required number of - input frames given a number of output frames, we need to fall back to a heap-allocated cache. - */ - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - ma_uint64 unused; - - pDevice->playback.inputCacheConsumed = 0; - pDevice->playback.inputCacheRemaining = 0; - - if (deviceType == ma_device_type_duplex || ma_data_converter_get_required_input_frame_count(&pDevice->playback.converter, 1, &unused) != MA_SUCCESS) { - /* We need a heap allocated cache. We want to size this based on the period size. */ - void* pNewInputCache; - ma_uint64 newInputCacheCap; - ma_uint64 newInputCacheSizeInBytes; - - newInputCacheCap = ma_calculate_frame_count_after_resampling(pDevice->playback.internalSampleRate, pDevice->sampleRate, pDevice->playback.internalPeriodSizeInFrames); - - newInputCacheSizeInBytes = newInputCacheCap * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); - if (newInputCacheSizeInBytes > MA_SIZE_MAX) { - ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks); - pDevice->playback.pInputCache = NULL; - pDevice->playback.inputCacheCap = 0; - return MA_OUT_OF_MEMORY; /* Allocation too big. Should never hit this, but makes the cast below safer for 32-bit builds. */ - } - - pNewInputCache = ma_realloc(pDevice->playback.pInputCache, (size_t)newInputCacheSizeInBytes, &pDevice->pContext->allocationCallbacks); - if (pNewInputCache == NULL) { - ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks); - pDevice->playback.pInputCache = NULL; - pDevice->playback.inputCacheCap = 0; - return MA_OUT_OF_MEMORY; - } - - pDevice->playback.pInputCache = pNewInputCache; - pDevice->playback.inputCacheCap = newInputCacheCap; - } else { - /* Heap allocation not required. Make sure we clear out the old cache just in case this function was called in response to a route change. */ - ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks); - pDevice->playback.pInputCache = NULL; - pDevice->playback.inputCacheCap = 0; - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceType, const ma_device_descriptor* pDescriptorPlayback, const ma_device_descriptor* pDescriptorCapture) -{ - ma_result result; - - if (pDevice == NULL) { - return MA_INVALID_ARGS; - } - - /* Capture. */ - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) { - if (ma_device_descriptor_is_valid(pDescriptorCapture) == MA_FALSE) { - return MA_INVALID_ARGS; - } - - pDevice->capture.internalFormat = pDescriptorCapture->format; - pDevice->capture.internalChannels = pDescriptorCapture->channels; - pDevice->capture.internalSampleRate = pDescriptorCapture->sampleRate; - MA_COPY_MEMORY(pDevice->capture.internalChannelMap, pDescriptorCapture->channelMap, sizeof(pDescriptorCapture->channelMap)); - pDevice->capture.internalPeriodSizeInFrames = pDescriptorCapture->periodSizeInFrames; - pDevice->capture.internalPeriods = pDescriptorCapture->periodCount; - - if (pDevice->capture.internalPeriodSizeInFrames == 0) { - pDevice->capture.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptorCapture->periodSizeInMilliseconds, pDescriptorCapture->sampleRate); - } - } - - /* Playback. */ - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - if (ma_device_descriptor_is_valid(pDescriptorPlayback) == MA_FALSE) { - return MA_INVALID_ARGS; - } - - pDevice->playback.internalFormat = pDescriptorPlayback->format; - pDevice->playback.internalChannels = pDescriptorPlayback->channels; - pDevice->playback.internalSampleRate = pDescriptorPlayback->sampleRate; - MA_COPY_MEMORY(pDevice->playback.internalChannelMap, pDescriptorPlayback->channelMap, sizeof(pDescriptorPlayback->channelMap)); - pDevice->playback.internalPeriodSizeInFrames = pDescriptorPlayback->periodSizeInFrames; - pDevice->playback.internalPeriods = pDescriptorPlayback->periodCount; - - if (pDevice->playback.internalPeriodSizeInFrames == 0) { - pDevice->playback.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptorPlayback->periodSizeInMilliseconds, pDescriptorPlayback->sampleRate); - } - } - - /* - The name of the device can be retrieved from device info. This may be temporary and replaced with a `ma_device_get_info(pDevice, deviceType)` instead. - For loopback devices, we need to retrieve the name of the playback device. - */ - { - ma_device_info deviceInfo; - - if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) { - result = ma_device_get_info(pDevice, (deviceType == ma_device_type_loopback) ? ma_device_type_playback : ma_device_type_capture, &deviceInfo); - if (result == MA_SUCCESS) { - ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), deviceInfo.name, (size_t)-1); - } else { - /* We failed to retrieve the device info. Fall back to a default name. */ - if (pDescriptorCapture->pDeviceID == NULL) { - ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), "Capture Device", (size_t)-1); - } - } - } - - if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) { - result = ma_device_get_info(pDevice, ma_device_type_playback, &deviceInfo); - if (result == MA_SUCCESS) { - ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), deviceInfo.name, (size_t)-1); - } else { - /* We failed to retrieve the device info. Fall back to a default name. */ - if (pDescriptorPlayback->pDeviceID == NULL) { - ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), "Playback Device", (size_t)-1); - } - } - } - } - - /* Update data conversion. */ - return ma_device__post_init_setup(pDevice, deviceType); /* TODO: Should probably rename ma_device__post_init_setup() to something better. */ -} - - -static ma_thread_result MA_THREADCALL ma_worker_thread(void* pData) -{ - ma_device* pDevice = (ma_device*)pData; - MA_ASSERT(pDevice != NULL); - -#ifdef MA_WIN32 - ma_CoInitializeEx(pDevice->pContext, NULL, MA_COINIT_VALUE); -#endif - - /* - When the device is being initialized it's initial state is set to ma_device_state_uninitialized. Before returning from - ma_device_init(), the state needs to be set to something valid. In miniaudio the device's default state immediately - after initialization is stopped, so therefore we need to mark the device as such. miniaudio will wait on the worker - thread to signal an event to know when the worker thread is ready for action. - */ - ma_device__set_state(pDevice, ma_device_state_stopped); - ma_event_signal(&pDevice->stopEvent); - - for (;;) { /* <-- This loop just keeps the thread alive. The main audio loop is inside. */ - ma_result startResult; - ma_result stopResult; /* <-- This will store the result from onDeviceStop(). If it returns an error, we don't fire the stopped notification callback. */ - - /* We wait on an event to know when something has requested that the device be started and the main loop entered. */ - ma_event_wait(&pDevice->wakeupEvent); - - /* Default result code. */ - pDevice->workResult = MA_SUCCESS; - - /* If the reason for the wake up is that we are terminating, just break from the loop. */ - if (ma_device_get_state(pDevice) == ma_device_state_uninitialized) { - break; - } - - /* - Getting to this point means the device is wanting to get started. The function that has requested that the device - be started will be waiting on an event (pDevice->startEvent) which means we need to make sure we signal the event - in both the success and error case. It's important that the state of the device is set _before_ signaling the event. - */ - MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_starting); - - /* If the device has a start callback, start it now. */ - if (pDevice->pContext->callbacks.onDeviceStart != NULL) { - startResult = pDevice->pContext->callbacks.onDeviceStart(pDevice); - } else { - startResult = MA_SUCCESS; - } - - /* - If starting was not successful we'll need to loop back to the start and wait for something - to happen (pDevice->wakeupEvent). - */ - if (startResult != MA_SUCCESS) { - pDevice->workResult = startResult; - ma_event_signal(&pDevice->startEvent); /* <-- Always signal the start event so ma_device_start() can return as it'll be waiting on it. */ - continue; - } - - /* Make sure the state is set appropriately. */ - ma_device__set_state(pDevice, ma_device_state_started); /* <-- Set this before signaling the event so that the state is always guaranteed to be good after ma_device_start() has returned. */ - ma_event_signal(&pDevice->startEvent); - - ma_device__on_notification_started(pDevice); - - if (pDevice->pContext->callbacks.onDeviceDataLoop != NULL) { - pDevice->pContext->callbacks.onDeviceDataLoop(pDevice); - } else { - /* The backend is not using a custom main loop implementation, so now fall back to the blocking read-write implementation. */ - ma_device_audio_thread__default_read_write(pDevice); - } - - /* Getting here means we have broken from the main loop which happens the application has requested that device be stopped. */ - if (pDevice->pContext->callbacks.onDeviceStop != NULL) { - stopResult = pDevice->pContext->callbacks.onDeviceStop(pDevice); - } else { - stopResult = MA_SUCCESS; /* No stop callback with the backend. Just assume successful. */ - } - - /* - After the device has stopped, make sure an event is posted. Don't post a stopped event if - stopping failed. This can happen on some backends when the underlying stream has been - stopped due to the device being physically unplugged or disabled via an OS setting. - */ - if (stopResult == MA_SUCCESS) { - ma_device__on_notification_stopped(pDevice); - } - - /* A function somewhere is waiting for the device to have stopped for real so we need to signal an event to allow it to continue. */ - ma_device__set_state(pDevice, ma_device_state_stopped); - ma_event_signal(&pDevice->stopEvent); - } - -#ifdef MA_WIN32 - ma_CoUninitialize(pDevice->pContext); -#endif - - return (ma_thread_result)0; -} - - -/* Helper for determining whether or not the given device is initialized. */ -static ma_bool32 ma_device__is_initialized(ma_device* pDevice) -{ - if (pDevice == NULL) { - return MA_FALSE; - } - - return ma_device_get_state(pDevice) != ma_device_state_uninitialized; -} - - -#ifdef MA_WIN32 -static ma_result ma_context_uninit_backend_apis__win32(ma_context* pContext) -{ - /* For some reason UWP complains when CoUninitialize() is called. I'm just not going to call it on UWP. */ -#ifdef MA_WIN32_DESKTOP - ma_CoUninitialize(pContext); - ma_dlclose(pContext, pContext->win32.hUser32DLL); - ma_dlclose(pContext, pContext->win32.hOle32DLL); - ma_dlclose(pContext, pContext->win32.hAdvapi32DLL); -#else - (void)pContext; -#endif - - return MA_SUCCESS; -} - -static ma_result ma_context_init_backend_apis__win32(ma_context* pContext) -{ -#ifdef MA_WIN32_DESKTOP - /* Ole32.dll */ - pContext->win32.hOle32DLL = ma_dlopen(pContext, "ole32.dll"); - if (pContext->win32.hOle32DLL == NULL) { - return MA_FAILED_TO_INIT_BACKEND; - } - - pContext->win32.CoInitializeEx = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoInitializeEx"); - pContext->win32.CoUninitialize = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoUninitialize"); - pContext->win32.CoCreateInstance = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoCreateInstance"); - pContext->win32.CoTaskMemFree = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "CoTaskMemFree"); - pContext->win32.PropVariantClear = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "PropVariantClear"); - pContext->win32.StringFromGUID2 = (ma_proc)ma_dlsym(pContext, pContext->win32.hOle32DLL, "StringFromGUID2"); - - - /* User32.dll */ - pContext->win32.hUser32DLL = ma_dlopen(pContext, "user32.dll"); - if (pContext->win32.hUser32DLL == NULL) { - return MA_FAILED_TO_INIT_BACKEND; - } - - pContext->win32.GetForegroundWindow = (ma_proc)ma_dlsym(pContext, pContext->win32.hUser32DLL, "GetForegroundWindow"); - pContext->win32.GetDesktopWindow = (ma_proc)ma_dlsym(pContext, pContext->win32.hUser32DLL, "GetDesktopWindow"); - - - /* Advapi32.dll */ - pContext->win32.hAdvapi32DLL = ma_dlopen(pContext, "advapi32.dll"); - if (pContext->win32.hAdvapi32DLL == NULL) { - return MA_FAILED_TO_INIT_BACKEND; - } - - pContext->win32.RegOpenKeyExA = (ma_proc)ma_dlsym(pContext, pContext->win32.hAdvapi32DLL, "RegOpenKeyExA"); - pContext->win32.RegCloseKey = (ma_proc)ma_dlsym(pContext, pContext->win32.hAdvapi32DLL, "RegCloseKey"); - pContext->win32.RegQueryValueExA = (ma_proc)ma_dlsym(pContext, pContext->win32.hAdvapi32DLL, "RegQueryValueExA"); -#endif - - ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE); - return MA_SUCCESS; -} -#else -static ma_result ma_context_uninit_backend_apis__nix(ma_context* pContext) -{ -#if defined(MA_USE_RUNTIME_LINKING_FOR_PTHREAD) && !defined(MA_NO_RUNTIME_LINKING) - ma_dlclose(pContext, pContext->posix.pthreadSO); -#else - (void)pContext; -#endif - - return MA_SUCCESS; -} - -static ma_result ma_context_init_backend_apis__nix(ma_context* pContext) -{ - /* pthread */ -#if defined(MA_USE_RUNTIME_LINKING_FOR_PTHREAD) && !defined(MA_NO_RUNTIME_LINKING) - const char* libpthreadFileNames[] = { - "libpthread.so", - "libpthread.so.0", - "libpthread.dylib" - }; - size_t i; - - for (i = 0; i < sizeof(libpthreadFileNames) / sizeof(libpthreadFileNames[0]); ++i) { - pContext->posix.pthreadSO = ma_dlopen(pContext, libpthreadFileNames[i]); - if (pContext->posix.pthreadSO != NULL) { - break; - } - } - - if (pContext->posix.pthreadSO == NULL) { - return MA_FAILED_TO_INIT_BACKEND; - } - - pContext->posix.pthread_create = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_create"); - pContext->posix.pthread_join = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_join"); - pContext->posix.pthread_mutex_init = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_mutex_init"); - pContext->posix.pthread_mutex_destroy = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_mutex_destroy"); - pContext->posix.pthread_mutex_lock = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_mutex_lock"); - pContext->posix.pthread_mutex_unlock = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_mutex_unlock"); - pContext->posix.pthread_cond_init = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_cond_init"); - pContext->posix.pthread_cond_destroy = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_cond_destroy"); - pContext->posix.pthread_cond_wait = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_cond_wait"); - pContext->posix.pthread_cond_signal = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_cond_signal"); - pContext->posix.pthread_attr_init = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_attr_init"); - pContext->posix.pthread_attr_destroy = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_attr_destroy"); - pContext->posix.pthread_attr_setschedpolicy = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_attr_setschedpolicy"); - pContext->posix.pthread_attr_getschedparam = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_attr_getschedparam"); - pContext->posix.pthread_attr_setschedparam = (ma_proc)ma_dlsym(pContext, pContext->posix.pthreadSO, "pthread_attr_setschedparam"); -#else - pContext->posix.pthread_create = (ma_proc)pthread_create; - pContext->posix.pthread_join = (ma_proc)pthread_join; - pContext->posix.pthread_mutex_init = (ma_proc)pthread_mutex_init; - pContext->posix.pthread_mutex_destroy = (ma_proc)pthread_mutex_destroy; - pContext->posix.pthread_mutex_lock = (ma_proc)pthread_mutex_lock; - pContext->posix.pthread_mutex_unlock = (ma_proc)pthread_mutex_unlock; - pContext->posix.pthread_cond_init = (ma_proc)pthread_cond_init; - pContext->posix.pthread_cond_destroy = (ma_proc)pthread_cond_destroy; - pContext->posix.pthread_cond_wait = (ma_proc)pthread_cond_wait; - pContext->posix.pthread_cond_signal = (ma_proc)pthread_cond_signal; - pContext->posix.pthread_attr_init = (ma_proc)pthread_attr_init; - pContext->posix.pthread_attr_destroy = (ma_proc)pthread_attr_destroy; -#if !defined(__EMSCRIPTEN__) - pContext->posix.pthread_attr_setschedpolicy = (ma_proc)pthread_attr_setschedpolicy; - pContext->posix.pthread_attr_getschedparam = (ma_proc)pthread_attr_getschedparam; - pContext->posix.pthread_attr_setschedparam = (ma_proc)pthread_attr_setschedparam; -#endif -#endif - - return MA_SUCCESS; -} -#endif - -static ma_result ma_context_init_backend_apis(ma_context* pContext) -{ - ma_result result; -#ifdef MA_WIN32 - result = ma_context_init_backend_apis__win32(pContext); -#else - result = ma_context_init_backend_apis__nix(pContext); -#endif - - return result; -} - -static ma_result ma_context_uninit_backend_apis(ma_context* pContext) -{ - ma_result result; -#ifdef MA_WIN32 - result = ma_context_uninit_backend_apis__win32(pContext); -#else - result = ma_context_uninit_backend_apis__nix(pContext); -#endif - - return result; -} - - -static ma_bool32 ma_context_is_backend_asynchronous(ma_context* pContext) -{ - MA_ASSERT(pContext != NULL); - - if (pContext->callbacks.onDeviceRead == NULL && pContext->callbacks.onDeviceWrite == NULL) { - if (pContext->callbacks.onDeviceDataLoop == NULL) { - return MA_TRUE; - } else { - return MA_FALSE; - } - } else { - return MA_FALSE; - } -} - - -/* The default capacity doesn't need to be too big. */ -#ifndef MA_DEFAULT_DEVICE_JOB_QUEUE_CAPACITY -#define MA_DEFAULT_DEVICE_JOB_QUEUE_CAPACITY 32 -#endif - -MA_API ma_device_job_thread_config ma_device_job_thread_config_init(void) -{ - ma_device_job_thread_config config; - - MA_ZERO_OBJECT(&config); - config.noThread = MA_FALSE; - config.jobQueueCapacity = MA_DEFAULT_DEVICE_JOB_QUEUE_CAPACITY; - config.jobQueueFlags = 0; - - return config; -} - - -static ma_thread_result MA_THREADCALL ma_device_job_thread_entry(void* pUserData) -{ - ma_device_job_thread* pJobThread = (ma_device_job_thread*)pUserData; - MA_ASSERT(pJobThread != NULL); - - for (;;) { - ma_result result; - ma_job job; - - result = ma_device_job_thread_next(pJobThread, &job); - if (result != MA_SUCCESS) { - break; - } - - if (job.toc.breakup.code == MA_JOB_TYPE_QUIT) { - break; - } - - ma_job_process(&job); - } - - return (ma_thread_result)0; -} - -MA_API ma_result ma_device_job_thread_init(const ma_device_job_thread_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_device_job_thread* pJobThread) -{ - ma_result result; - ma_job_queue_config jobQueueConfig; - - if (pJobThread == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pJobThread); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - - /* Initialize the job queue before the thread to ensure it's in a valid state. */ - jobQueueConfig = ma_job_queue_config_init(pConfig->jobQueueFlags, pConfig->jobQueueCapacity); - - result = ma_job_queue_init(&jobQueueConfig, pAllocationCallbacks, &pJobThread->jobQueue); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize job queue. */ - } - - - /* The thread needs to be initialized after the job queue to ensure the thread doesn't try to access it prematurely. */ - if (pConfig->noThread == MA_FALSE) { - result = ma_thread_create(&pJobThread->thread, ma_thread_priority_normal, 0, ma_device_job_thread_entry, pJobThread, pAllocationCallbacks); - if (result != MA_SUCCESS) { - ma_job_queue_uninit(&pJobThread->jobQueue, pAllocationCallbacks); - return result; /* Failed to create the job thread. */ - } - - pJobThread->_hasThread = MA_TRUE; - } else { - pJobThread->_hasThread = MA_FALSE; - } - - - return MA_SUCCESS; -} - -MA_API void ma_device_job_thread_uninit(ma_device_job_thread* pJobThread, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pJobThread == NULL) { - return; - } - - /* The first thing to do is post a quit message to the job queue. If we're using a thread we'll need to wait for it. */ - { - ma_job job = ma_job_init(MA_JOB_TYPE_QUIT); - ma_device_job_thread_post(pJobThread, &job); - } - - /* Wait for the thread to terminate naturally. */ - if (pJobThread->_hasThread) { - ma_thread_wait(&pJobThread->thread); - } - - /* At this point the thread should be terminated so we can safely uninitialize the job queue. */ - ma_job_queue_uninit(&pJobThread->jobQueue, pAllocationCallbacks); -} - -MA_API ma_result ma_device_job_thread_post(ma_device_job_thread* pJobThread, const ma_job* pJob) -{ - if (pJobThread == NULL || pJob == NULL) { - return MA_INVALID_ARGS; - } - - return ma_job_queue_post(&pJobThread->jobQueue, pJob); -} - -MA_API ma_result ma_device_job_thread_next(ma_device_job_thread* pJobThread, ma_job* pJob) -{ - if (pJob == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pJob); - - if (pJobThread == NULL) { - return MA_INVALID_ARGS; - } - - return ma_job_queue_next(&pJobThread->jobQueue, pJob); -} - - - -MA_API ma_context_config ma_context_config_init(void) -{ - ma_context_config config; - MA_ZERO_OBJECT(&config); - - return config; -} - -MA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pConfig, ma_context* pContext) -{ - ma_result result; - ma_context_config defaultConfig; - ma_backend defaultBackends[ma_backend_null+1]; - ma_uint32 iBackend; - ma_backend* pBackendsToIterate; - ma_uint32 backendsToIterateCount; - - if (pContext == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pContext); - - /* Always make sure the config is set first to ensure properties are available as soon as possible. */ - if (pConfig == NULL) { - defaultConfig = ma_context_config_init(); - pConfig = &defaultConfig; - } - - /* Allocation callbacks need to come first because they'll be passed around to other areas. */ - result = ma_allocation_callbacks_init_copy(&pContext->allocationCallbacks, &pConfig->allocationCallbacks); - if (result != MA_SUCCESS) { - return result; - } - - /* Get a lot set up first so we can start logging ASAP. */ - if (pConfig->pLog != NULL) { - pContext->pLog = pConfig->pLog; - } else { - result = ma_log_init(&pContext->allocationCallbacks, &pContext->log); - if (result == MA_SUCCESS) { - pContext->pLog = &pContext->log; - } else { - pContext->pLog = NULL; /* Logging is not available. */ - } - } - - pContext->threadPriority = pConfig->threadPriority; - pContext->threadStackSize = pConfig->threadStackSize; - pContext->pUserData = pConfig->pUserData; - - /* Backend APIs need to be initialized first. This is where external libraries will be loaded and linked. */ - result = ma_context_init_backend_apis(pContext); - if (result != MA_SUCCESS) { - return result; - } - - for (iBackend = 0; iBackend <= ma_backend_null; ++iBackend) { - defaultBackends[iBackend] = (ma_backend)iBackend; - } - - pBackendsToIterate = (ma_backend*)backends; - backendsToIterateCount = backendCount; - if (pBackendsToIterate == NULL) { - pBackendsToIterate = (ma_backend*)defaultBackends; - backendsToIterateCount = ma_countof(defaultBackends); - } - - MA_ASSERT(pBackendsToIterate != NULL); - - for (iBackend = 0; iBackend < backendsToIterateCount; iBackend += 1) { - ma_backend backend = pBackendsToIterate[iBackend]; - - /* Make sure all callbacks are reset so we don't accidentally drag in any from previously failed initialization attempts. */ - MA_ZERO_OBJECT(&pContext->callbacks); - - /* These backends are using the new callback system. */ - switch (backend) { - #ifdef MA_HAS_WASAPI - case ma_backend_wasapi: - { - pContext->callbacks.onContextInit = ma_context_init__wasapi; - } break; - #endif - #ifdef MA_HAS_DSOUND - case ma_backend_dsound: - { - pContext->callbacks.onContextInit = ma_context_init__dsound; - } break; - #endif - #ifdef MA_HAS_WINMM - case ma_backend_winmm: - { - pContext->callbacks.onContextInit = ma_context_init__winmm; - } break; - #endif - #ifdef MA_HAS_COREAUDIO - case ma_backend_coreaudio: - { - pContext->callbacks.onContextInit = ma_context_init__coreaudio; - } break; - #endif - #ifdef MA_HAS_SNDIO - case ma_backend_sndio: - { - pContext->callbacks.onContextInit = ma_context_init__sndio; - } break; - #endif - #ifdef MA_HAS_AUDIO4 - case ma_backend_audio4: - { - pContext->callbacks.onContextInit = ma_context_init__audio4; - } break; - #endif - #ifdef MA_HAS_OSS - case ma_backend_oss: - { - pContext->callbacks.onContextInit = ma_context_init__oss; - } break; - #endif - #ifdef MA_HAS_PULSEAUDIO - case ma_backend_pulseaudio: - { - pContext->callbacks.onContextInit = ma_context_init__pulse; - } break; - #endif - #ifdef MA_HAS_ALSA - case ma_backend_alsa: - { - pContext->callbacks.onContextInit = ma_context_init__alsa; - } break; - #endif - #ifdef MA_HAS_JACK - case ma_backend_jack: - { - pContext->callbacks.onContextInit = ma_context_init__jack; - } break; - #endif - #ifdef MA_HAS_AAUDIO - case ma_backend_aaudio: - { - pContext->callbacks.onContextInit = ma_context_init__aaudio; - } break; - #endif - #ifdef MA_HAS_OPENSL - case ma_backend_opensl: - { - pContext->callbacks.onContextInit = ma_context_init__opensl; - } break; - #endif - #ifdef MA_HAS_WEBAUDIO - case ma_backend_webaudio: - { - pContext->callbacks.onContextInit = ma_context_init__webaudio; - } break; - #endif - #ifdef MA_HAS_CUSTOM - case ma_backend_custom: - { - /* Slightly different logic for custom backends. Custom backends can optionally set all of their callbacks in the config. */ - pContext->callbacks = pConfig->custom; - } break; - #endif - #ifdef MA_HAS_NULL - case ma_backend_null: - { - pContext->callbacks.onContextInit = ma_context_init__null; - } break; - #endif - - default: break; - } - - if (pContext->callbacks.onContextInit != NULL) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Attempting to initialize %s backend...\n", ma_get_backend_name(backend)); - result = pContext->callbacks.onContextInit(pContext, pConfig, &pContext->callbacks); - } else { - result = MA_NO_BACKEND; - } - - /* If this iteration was successful, return. */ - if (result == MA_SUCCESS) { - result = ma_mutex_init(&pContext->deviceEnumLock); - if (result != MA_SUCCESS) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "Failed to initialize mutex for device enumeration. ma_context_get_devices() is not thread safe.\n"); - } - - result = ma_mutex_init(&pContext->deviceInfoLock); - if (result != MA_SUCCESS) { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "Failed to initialize mutex for device info retrieval. ma_context_get_device_info() is not thread safe.\n"); - } - - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "System Architecture:\n"); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " Endian: %s\n", ma_is_little_endian() ? "LE" : "BE"); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " SSE2: %s\n", ma_has_sse2() ? "YES" : "NO"); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " AVX2: %s\n", ma_has_avx2() ? "YES" : "NO"); - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, " NEON: %s\n", ma_has_neon() ? "YES" : "NO"); - - pContext->backend = backend; - return result; - } else { - ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, "Failed to initialize %s backend.\n", ma_get_backend_name(backend)); - } - } - - /* If we get here it means an error occurred. */ - MA_ZERO_OBJECT(pContext); /* Safety. */ - return MA_NO_BACKEND; -} - -MA_API ma_result ma_context_uninit(ma_context* pContext) -{ - if (pContext == NULL) { - return MA_INVALID_ARGS; - } - - if (pContext->callbacks.onContextUninit != NULL) { - pContext->callbacks.onContextUninit(pContext); - } - - ma_mutex_uninit(&pContext->deviceEnumLock); - ma_mutex_uninit(&pContext->deviceInfoLock); - ma_free(pContext->pDeviceInfos, &pContext->allocationCallbacks); - ma_context_uninit_backend_apis(pContext); - - if (pContext->pLog == &pContext->log) { - ma_log_uninit(&pContext->log); - } - - return MA_SUCCESS; -} - -MA_API size_t ma_context_sizeof() -{ - return sizeof(ma_context); -} - - -MA_API ma_log* ma_context_get_log(ma_context* pContext) -{ - if (pContext == NULL) { - return NULL; - } - - return pContext->pLog; -} - - -MA_API ma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData) -{ - ma_result result; - - if (pContext == NULL || callback == NULL) { - return MA_INVALID_ARGS; - } - - if (pContext->callbacks.onContextEnumerateDevices == NULL) { - return MA_INVALID_OPERATION; - } - - ma_mutex_lock(&pContext->deviceEnumLock); - { - result = pContext->callbacks.onContextEnumerateDevices(pContext, callback, pUserData); - } - ma_mutex_unlock(&pContext->deviceEnumLock); - - return result; -} - - -static ma_bool32 ma_context_get_devices__enum_callback(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData) -{ - /* - We need to insert the device info into our main internal buffer. Where it goes depends on the device type. If it's a capture device - it's just appended to the end. If it's a playback device it's inserted just before the first capture device. - */ - - /* - First make sure we have room. Since the number of devices we add to the list is usually relatively small I've decided to use a - simple fixed size increment for buffer expansion. - */ - const ma_uint32 bufferExpansionCount = 2; - const ma_uint32 totalDeviceInfoCount = pContext->playbackDeviceInfoCount + pContext->captureDeviceInfoCount; - - if (totalDeviceInfoCount >= pContext->deviceInfoCapacity) { - ma_uint32 newCapacity = pContext->deviceInfoCapacity + bufferExpansionCount; - ma_device_info* pNewInfos = (ma_device_info*)ma_realloc(pContext->pDeviceInfos, sizeof(*pContext->pDeviceInfos)*newCapacity, &pContext->allocationCallbacks); - if (pNewInfos == NULL) { - return MA_FALSE; /* Out of memory. */ - } - - pContext->pDeviceInfos = pNewInfos; - pContext->deviceInfoCapacity = newCapacity; - } - - if (deviceType == ma_device_type_playback) { - /* Playback. Insert just before the first capture device. */ - - /* The first thing to do is move all of the capture devices down a slot. */ - ma_uint32 iFirstCaptureDevice = pContext->playbackDeviceInfoCount; - size_t iCaptureDevice; - for (iCaptureDevice = totalDeviceInfoCount; iCaptureDevice > iFirstCaptureDevice; --iCaptureDevice) { - pContext->pDeviceInfos[iCaptureDevice] = pContext->pDeviceInfos[iCaptureDevice-1]; - } - - /* Now just insert where the first capture device was before moving it down a slot. */ - pContext->pDeviceInfos[iFirstCaptureDevice] = *pInfo; - pContext->playbackDeviceInfoCount += 1; - } else { - /* Capture. Insert at the end. */ - pContext->pDeviceInfos[totalDeviceInfoCount] = *pInfo; - pContext->captureDeviceInfoCount += 1; - } - - (void)pUserData; - return MA_TRUE; -} - -MA_API ma_result ma_context_get_devices(ma_context* pContext, ma_device_info** ppPlaybackDeviceInfos, ma_uint32* pPlaybackDeviceCount, ma_device_info** ppCaptureDeviceInfos, ma_uint32* pCaptureDeviceCount) -{ - ma_result result; - - /* Safety. */ - if (ppPlaybackDeviceInfos != NULL) *ppPlaybackDeviceInfos = NULL; - if (pPlaybackDeviceCount != NULL) *pPlaybackDeviceCount = 0; - if (ppCaptureDeviceInfos != NULL) *ppCaptureDeviceInfos = NULL; - if (pCaptureDeviceCount != NULL) *pCaptureDeviceCount = 0; - - if (pContext == NULL) { - return MA_INVALID_ARGS; - } - - if (pContext->callbacks.onContextEnumerateDevices == NULL) { - return MA_INVALID_OPERATION; - } - - /* Note that we don't use ma_context_enumerate_devices() here because we want to do locking at a higher level. */ - ma_mutex_lock(&pContext->deviceEnumLock); - { - /* Reset everything first. */ - pContext->playbackDeviceInfoCount = 0; - pContext->captureDeviceInfoCount = 0; - - /* Now enumerate over available devices. */ - result = pContext->callbacks.onContextEnumerateDevices(pContext, ma_context_get_devices__enum_callback, NULL); - if (result == MA_SUCCESS) { - /* Playback devices. */ - if (ppPlaybackDeviceInfos != NULL) { - *ppPlaybackDeviceInfos = pContext->pDeviceInfos; - } - if (pPlaybackDeviceCount != NULL) { - *pPlaybackDeviceCount = pContext->playbackDeviceInfoCount; - } - - /* Capture devices. */ - if (ppCaptureDeviceInfos != NULL) { - *ppCaptureDeviceInfos = pContext->pDeviceInfos + pContext->playbackDeviceInfoCount; /* Capture devices come after playback devices. */ - } - if (pCaptureDeviceCount != NULL) { - *pCaptureDeviceCount = pContext->captureDeviceInfoCount; - } - } - } - ma_mutex_unlock(&pContext->deviceEnumLock); - - return result; -} - -MA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo) -{ - ma_result result; - ma_device_info deviceInfo; - - /* NOTE: Do not clear pDeviceInfo on entry. The reason is the pDeviceID may actually point to pDeviceInfo->id which will break things. */ - if (pContext == NULL || pDeviceInfo == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(&deviceInfo); - - /* Help the backend out by copying over the device ID if we have one. */ - if (pDeviceID != NULL) { - MA_COPY_MEMORY(&deviceInfo.id, pDeviceID, sizeof(*pDeviceID)); - } - - if (pContext->callbacks.onContextGetDeviceInfo == NULL) { - return MA_INVALID_OPERATION; - } - - ma_mutex_lock(&pContext->deviceInfoLock); - { - result = pContext->callbacks.onContextGetDeviceInfo(pContext, deviceType, pDeviceID, &deviceInfo); - } - ma_mutex_unlock(&pContext->deviceInfoLock); - - *pDeviceInfo = deviceInfo; - return result; -} - -MA_API ma_bool32 ma_context_is_loopback_supported(ma_context* pContext) -{ - if (pContext == NULL) { - return MA_FALSE; - } - - return ma_is_loopback_supported(pContext->backend); -} - - -MA_API ma_device_config ma_device_config_init(ma_device_type deviceType) -{ - ma_device_config config; - MA_ZERO_OBJECT(&config); - config.deviceType = deviceType; - config.resampling = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); /* Format/channels/rate don't matter here. */ - - return config; -} - -MA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice) -{ - ma_result result; - ma_device_descriptor descriptorPlayback; - ma_device_descriptor descriptorCapture; - - /* The context can be null, in which case we self-manage it. */ - if (pContext == NULL) { - return ma_device_init_ex(NULL, 0, NULL, pConfig, pDevice); - } - - if (pDevice == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDevice); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Check that we have our callbacks defined. */ - if (pContext->callbacks.onDeviceInit == NULL) { - return MA_INVALID_OPERATION; - } - - /* Basic config validation. */ - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) { - if (pConfig->capture.channels > MA_MAX_CHANNELS) { - return MA_INVALID_ARGS; - } - - if (!ma__is_channel_map_valid(pConfig->capture.pChannelMap, pConfig->capture.channels)) { - return MA_INVALID_ARGS; - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) { - if (pConfig->playback.channels > MA_MAX_CHANNELS) { - return MA_INVALID_ARGS; - } - - if (!ma__is_channel_map_valid(pConfig->playback.pChannelMap, pConfig->playback.channels)) { - return MA_INVALID_ARGS; - } - } - - pDevice->pContext = pContext; - - /* Set the user data and log callback ASAP to ensure it is available for the entire initialization process. */ - pDevice->pUserData = pConfig->pUserData; - pDevice->onData = pConfig->dataCallback; - pDevice->onNotification = pConfig->notificationCallback; - pDevice->onStop = pConfig->stopCallback; - - if (pConfig->playback.pDeviceID != NULL) { - MA_COPY_MEMORY(&pDevice->playback.id, pConfig->playback.pDeviceID, sizeof(pDevice->playback.id)); - pDevice->playback.pID = &pDevice->playback.id; - } else { - pDevice->playback.pID = NULL; - } - - if (pConfig->capture.pDeviceID != NULL) { - MA_COPY_MEMORY(&pDevice->capture.id, pConfig->capture.pDeviceID, sizeof(pDevice->capture.id)); - pDevice->capture.pID = &pDevice->capture.id; - } else { - pDevice->capture.pID = NULL; - } - - pDevice->noPreSilencedOutputBuffer = pConfig->noPreSilencedOutputBuffer; - pDevice->noClip = pConfig->noClip; - pDevice->noDisableDenormals = pConfig->noDisableDenormals; - pDevice->noFixedSizedCallback = pConfig->noFixedSizedCallback; - pDevice->masterVolumeFactor = 1; - - pDevice->type = pConfig->deviceType; - pDevice->sampleRate = pConfig->sampleRate; - pDevice->resampling.algorithm = pConfig->resampling.algorithm; - pDevice->resampling.linear.lpfOrder = pConfig->resampling.linear.lpfOrder; - pDevice->resampling.pBackendVTable = pConfig->resampling.pBackendVTable; - pDevice->resampling.pBackendUserData = pConfig->resampling.pBackendUserData; - - pDevice->capture.shareMode = pConfig->capture.shareMode; - pDevice->capture.format = pConfig->capture.format; - pDevice->capture.channels = pConfig->capture.channels; - ma_channel_map_copy_or_default(pDevice->capture.channelMap, ma_countof(pDevice->capture.channelMap), pConfig->capture.pChannelMap, pConfig->capture.channels); - pDevice->capture.channelMixMode = pConfig->capture.channelMixMode; - - pDevice->playback.shareMode = pConfig->playback.shareMode; - pDevice->playback.format = pConfig->playback.format; - pDevice->playback.channels = pConfig->playback.channels; - ma_channel_map_copy_or_default(pDevice->playback.channelMap, ma_countof(pDevice->playback.channelMap), pConfig->playback.pChannelMap, pConfig->playback.channels); - pDevice->playback.channelMixMode = pConfig->playback.channelMixMode; - - - result = ma_mutex_init(&pDevice->startStopLock); - if (result != MA_SUCCESS) { - return result; - } - - /* - When the device is started, the worker thread is the one that does the actual startup of the backend device. We - use a semaphore to wait for the background thread to finish the work. The same applies for stopping the device. - - Each of these semaphores is released internally by the worker thread when the work is completed. The start - semaphore is also used to wake up the worker thread. - */ - result = ma_event_init(&pDevice->wakeupEvent); - if (result != MA_SUCCESS) { - ma_mutex_uninit(&pDevice->startStopLock); - return result; - } - - result = ma_event_init(&pDevice->startEvent); - if (result != MA_SUCCESS) { - ma_event_uninit(&pDevice->wakeupEvent); - ma_mutex_uninit(&pDevice->startStopLock); - return result; - } - - result = ma_event_init(&pDevice->stopEvent); - if (result != MA_SUCCESS) { - ma_event_uninit(&pDevice->startEvent); - ma_event_uninit(&pDevice->wakeupEvent); - ma_mutex_uninit(&pDevice->startStopLock); - return result; - } - - - MA_ZERO_OBJECT(&descriptorPlayback); - descriptorPlayback.pDeviceID = pConfig->playback.pDeviceID; - descriptorPlayback.shareMode = pConfig->playback.shareMode; - descriptorPlayback.format = pConfig->playback.format; - descriptorPlayback.channels = pConfig->playback.channels; - descriptorPlayback.sampleRate = pConfig->sampleRate; - ma_channel_map_copy_or_default(descriptorPlayback.channelMap, ma_countof(descriptorPlayback.channelMap), pConfig->playback.pChannelMap, pConfig->playback.channels); - descriptorPlayback.periodSizeInFrames = pConfig->periodSizeInFrames; - descriptorPlayback.periodSizeInMilliseconds = pConfig->periodSizeInMilliseconds; - descriptorPlayback.periodCount = pConfig->periods; - - if (descriptorPlayback.periodCount == 0) { - descriptorPlayback.periodCount = MA_DEFAULT_PERIODS; - } - - - MA_ZERO_OBJECT(&descriptorCapture); - descriptorCapture.pDeviceID = pConfig->capture.pDeviceID; - descriptorCapture.shareMode = pConfig->capture.shareMode; - descriptorCapture.format = pConfig->capture.format; - descriptorCapture.channels = pConfig->capture.channels; - descriptorCapture.sampleRate = pConfig->sampleRate; - ma_channel_map_copy_or_default(descriptorCapture.channelMap, ma_countof(descriptorCapture.channelMap), pConfig->capture.pChannelMap, pConfig->capture.channels); - descriptorCapture.periodSizeInFrames = pConfig->periodSizeInFrames; - descriptorCapture.periodSizeInMilliseconds = pConfig->periodSizeInMilliseconds; - descriptorCapture.periodCount = pConfig->periods; - - if (descriptorCapture.periodCount == 0) { - descriptorCapture.periodCount = MA_DEFAULT_PERIODS; - } - - - result = pContext->callbacks.onDeviceInit(pDevice, pConfig, &descriptorPlayback, &descriptorCapture); - if (result != MA_SUCCESS) { - ma_event_uninit(&pDevice->startEvent); - ma_event_uninit(&pDevice->wakeupEvent); - ma_mutex_uninit(&pDevice->startStopLock); - return result; - } - -#if 0 - /* - On output the descriptors will contain the *actual* data format of the device. We need this to know how to convert the data between - the requested format and the internal format. - */ - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) { - if (!ma_device_descriptor_is_valid(&descriptorCapture)) { - ma_device_uninit(pDevice); - return MA_INVALID_ARGS; - } - - pDevice->capture.internalFormat = descriptorCapture.format; - pDevice->capture.internalChannels = descriptorCapture.channels; - pDevice->capture.internalSampleRate = descriptorCapture.sampleRate; - ma_channel_map_copy(pDevice->capture.internalChannelMap, descriptorCapture.channelMap, descriptorCapture.channels); - pDevice->capture.internalPeriodSizeInFrames = descriptorCapture.periodSizeInFrames; - pDevice->capture.internalPeriods = descriptorCapture.periodCount; - - if (pDevice->capture.internalPeriodSizeInFrames == 0) { - pDevice->capture.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(descriptorCapture.periodSizeInMilliseconds, descriptorCapture.sampleRate); - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - if (!ma_device_descriptor_is_valid(&descriptorPlayback)) { - ma_device_uninit(pDevice); - return MA_INVALID_ARGS; - } - - pDevice->playback.internalFormat = descriptorPlayback.format; - pDevice->playback.internalChannels = descriptorPlayback.channels; - pDevice->playback.internalSampleRate = descriptorPlayback.sampleRate; - ma_channel_map_copy(pDevice->playback.internalChannelMap, descriptorPlayback.channelMap, descriptorPlayback.channels); - pDevice->playback.internalPeriodSizeInFrames = descriptorPlayback.periodSizeInFrames; - pDevice->playback.internalPeriods = descriptorPlayback.periodCount; - - if (pDevice->playback.internalPeriodSizeInFrames == 0) { - pDevice->playback.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(descriptorPlayback.periodSizeInMilliseconds, descriptorPlayback.sampleRate); - } - } - - - /* - The name of the device can be retrieved from device info. This may be temporary and replaced with a `ma_device_get_info(pDevice, deviceType)` instead. - For loopback devices, we need to retrieve the name of the playback device. - */ - { - ma_device_info deviceInfo; - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) { - result = ma_device_get_info(pDevice, (pConfig->deviceType == ma_device_type_loopback) ? ma_device_type_playback : ma_device_type_capture, &deviceInfo); - if (result == MA_SUCCESS) { - ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), deviceInfo.name, (size_t)-1); - } else { - /* We failed to retrieve the device info. Fall back to a default name. */ - if (descriptorCapture.pDeviceID == NULL) { - ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), "Capture Device", (size_t)-1); - } - } - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - result = ma_device_get_info(pDevice, ma_device_type_playback, &deviceInfo); - if (result == MA_SUCCESS) { - ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), deviceInfo.name, (size_t)-1); - } else { - /* We failed to retrieve the device info. Fall back to a default name. */ - if (descriptorPlayback.pDeviceID == NULL) { - ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1); - } else { - ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), "Playback Device", (size_t)-1); - } - } - } - } - - - ma_device__post_init_setup(pDevice, pConfig->deviceType); -#endif - - result = ma_device_post_init(pDevice, pConfig->deviceType, &descriptorPlayback, &descriptorCapture); - if (result != MA_SUCCESS) { - ma_device_uninit(pDevice); - return result; - } - - - - /* - If we're using fixed sized callbacks we'll need to make use of an intermediary buffer. Needs to - be done after post_init_setup() because we'll need access to the sample rate. - */ - if (pConfig->noFixedSizedCallback == MA_FALSE) { - /* We're using a fixed sized data callback so we'll need an intermediary buffer. */ - ma_uint32 intermediaryBufferCap = pConfig->periodSizeInFrames; - if (intermediaryBufferCap == 0) { - intermediaryBufferCap = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->periodSizeInMilliseconds, pDevice->sampleRate); - } - - if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) { - ma_uint32 intermediaryBufferSizeInBytes; - - pDevice->capture.intermediaryBufferLen = 0; - pDevice->capture.intermediaryBufferCap = intermediaryBufferCap; - if (pDevice->capture.intermediaryBufferCap == 0) { - pDevice->capture.intermediaryBufferCap = pDevice->capture.internalPeriodSizeInFrames; - } - - intermediaryBufferSizeInBytes = pDevice->capture.intermediaryBufferCap * ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels); - - pDevice->capture.pIntermediaryBuffer = ma_malloc((size_t)intermediaryBufferSizeInBytes, &pContext->allocationCallbacks); - if (pDevice->capture.pIntermediaryBuffer == NULL) { - ma_device_uninit(pDevice); - return MA_OUT_OF_MEMORY; - } - - /* Silence the buffer for safety. */ - ma_silence_pcm_frames(pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferCap, pDevice->capture.format, pDevice->capture.channels); - pDevice->capture.intermediaryBufferLen = pDevice->capture.intermediaryBufferCap; - } - - if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) { - ma_uint64 intermediaryBufferSizeInBytes; - - pDevice->playback.intermediaryBufferLen = 0; - if (pConfig->deviceType == ma_device_type_duplex) { - pDevice->playback.intermediaryBufferCap = pDevice->capture.intermediaryBufferCap; /* In duplex mode, make sure the intermediary buffer is always the same size as the capture side. */ - } else { - pDevice->playback.intermediaryBufferCap = intermediaryBufferCap; - if (pDevice->playback.intermediaryBufferCap == 0) { - pDevice->playback.intermediaryBufferCap = pDevice->playback.internalPeriodSizeInFrames; - } - } - - intermediaryBufferSizeInBytes = pDevice->playback.intermediaryBufferCap * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); - - pDevice->playback.pIntermediaryBuffer = ma_malloc((size_t)intermediaryBufferSizeInBytes, &pContext->allocationCallbacks); - if (pDevice->playback.pIntermediaryBuffer == NULL) { - ma_device_uninit(pDevice); - return MA_OUT_OF_MEMORY; - } - - /* Silence the buffer for safety. */ - ma_silence_pcm_frames(pDevice->playback.pIntermediaryBuffer, pDevice->playback.intermediaryBufferCap, pDevice->playback.format, pDevice->playback.channels); - pDevice->playback.intermediaryBufferLen = 0; - } - } else { - /* Not using a fixed sized data callback so no need for an intermediary buffer. */ - } - - - /* Some backends don't require the worker thread. */ - if (!ma_context_is_backend_asynchronous(pContext)) { - /* The worker thread. */ - result = ma_thread_create(&pDevice->thread, pContext->threadPriority, pContext->threadStackSize, ma_worker_thread, pDevice, &pContext->allocationCallbacks); - if (result != MA_SUCCESS) { - ma_device_uninit(pDevice); - return result; - } - - /* Wait for the worker thread to put the device into it's stopped state for real. */ - ma_event_wait(&pDevice->stopEvent); - MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_stopped); - } else { - /* - If the backend is asynchronous and the device is duplex, we'll need an intermediary ring buffer. Note that this needs to be done - after ma_device__post_init_setup(). - */ - if (ma_context_is_backend_asynchronous(pContext)) { - if (pConfig->deviceType == ma_device_type_duplex) { - result = ma_duplex_rb_init(pDevice->capture.format, pDevice->capture.channels, pDevice->sampleRate, pDevice->capture.internalSampleRate, pDevice->capture.internalPeriodSizeInFrames, &pDevice->pContext->allocationCallbacks, &pDevice->duplexRB); - if (result != MA_SUCCESS) { - ma_device_uninit(pDevice); - return result; - } - } - } - - ma_device__set_state(pDevice, ma_device_state_stopped); - } - - /* Log device information. */ - { - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, "[%s]\n", ma_get_backend_name(pDevice->pContext->backend)); - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) { - char name[MA_MAX_DEVICE_NAME_LENGTH + 1]; - ma_device_get_name(pDevice, ma_device_type_capture, name, sizeof(name), NULL); - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " %s (%s)\n", name, "Capture"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Format: %s -> %s\n", ma_get_format_name(pDevice->capture.internalFormat), ma_get_format_name(pDevice->capture.format)); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Channels: %d -> %d\n", pDevice->capture.internalChannels, pDevice->capture.channels); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Sample Rate: %d -> %d\n", pDevice->capture.internalSampleRate, pDevice->sampleRate); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Buffer Size: %d*%d (%d)\n", pDevice->capture.internalPeriodSizeInFrames, pDevice->capture.internalPeriods, (pDevice->capture.internalPeriodSizeInFrames * pDevice->capture.internalPeriods)); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Conversion:\n"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Pre Format Conversion: %s\n", pDevice->capture.converter.hasPreFormatConversion ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Post Format Conversion: %s\n", pDevice->capture.converter.hasPostFormatConversion ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Channel Routing: %s\n", pDevice->capture.converter.hasChannelConverter ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Resampling: %s\n", pDevice->capture.converter.hasResampler ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Passthrough: %s\n", pDevice->capture.converter.isPassthrough ? "YES" : "NO"); - } - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - char name[MA_MAX_DEVICE_NAME_LENGTH + 1]; - ma_device_get_name(pDevice, ma_device_type_playback, name, sizeof(name), NULL); - - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " %s (%s)\n", name, "Playback"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Format: %s -> %s\n", ma_get_format_name(pDevice->playback.format), ma_get_format_name(pDevice->playback.internalFormat)); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Channels: %d -> %d\n", pDevice->playback.channels, pDevice->playback.internalChannels); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Sample Rate: %d -> %d\n", pDevice->sampleRate, pDevice->playback.internalSampleRate); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Buffer Size: %d*%d (%d)\n", pDevice->playback.internalPeriodSizeInFrames, pDevice->playback.internalPeriods, (pDevice->playback.internalPeriodSizeInFrames * pDevice->playback.internalPeriods)); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Conversion:\n"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Pre Format Conversion: %s\n", pDevice->playback.converter.hasPreFormatConversion ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Post Format Conversion: %s\n", pDevice->playback.converter.hasPostFormatConversion ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Channel Routing: %s\n", pDevice->playback.converter.hasChannelConverter ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Resampling: %s\n", pDevice->playback.converter.hasResampler ? "YES" : "NO"); - ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, " Passthrough: %s\n", pDevice->playback.converter.isPassthrough ? "YES" : "NO"); - } - } - - MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_stopped); - return MA_SUCCESS; -} - -MA_API ma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pContextConfig, const ma_device_config* pConfig, ma_device* pDevice) -{ - ma_result result; - ma_context* pContext; - ma_backend defaultBackends[ma_backend_null+1]; - ma_uint32 iBackend; - ma_backend* pBackendsToIterate; - ma_uint32 backendsToIterateCount; - ma_allocation_callbacks allocationCallbacks; - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pContextConfig != NULL) { - result = ma_allocation_callbacks_init_copy(&allocationCallbacks, &pContextConfig->allocationCallbacks); - if (result != MA_SUCCESS) { - return result; - } - } else { - allocationCallbacks = ma_allocation_callbacks_init_default(); - } - - - pContext = (ma_context*)ma_malloc(sizeof(*pContext), &allocationCallbacks); - if (pContext == NULL) { - return MA_OUT_OF_MEMORY; - } - - for (iBackend = 0; iBackend <= ma_backend_null; ++iBackend) { - defaultBackends[iBackend] = (ma_backend)iBackend; - } - - pBackendsToIterate = (ma_backend*)backends; - backendsToIterateCount = backendCount; - if (pBackendsToIterate == NULL) { - pBackendsToIterate = (ma_backend*)defaultBackends; - backendsToIterateCount = ma_countof(defaultBackends); - } - - result = MA_NO_BACKEND; - - for (iBackend = 0; iBackend < backendsToIterateCount; ++iBackend) { - result = ma_context_init(&pBackendsToIterate[iBackend], 1, pContextConfig, pContext); - if (result == MA_SUCCESS) { - result = ma_device_init(pContext, pConfig, pDevice); - if (result == MA_SUCCESS) { - break; /* Success. */ - } else { - ma_context_uninit(pContext); /* Failure. */ - } - } - } - - if (result != MA_SUCCESS) { - ma_free(pContext, &allocationCallbacks); - return result; - } - - pDevice->isOwnerOfContext = MA_TRUE; - return result; -} - -MA_API void ma_device_uninit(ma_device* pDevice) -{ - if (!ma_device__is_initialized(pDevice)) { - return; - } - - /* Make sure the device is stopped first. The backends will probably handle this naturally, but I like to do it explicitly for my own sanity. */ - if (ma_device_is_started(pDevice)) { - ma_device_stop(pDevice); - } - - /* Putting the device into an uninitialized state will make the worker thread return. */ - ma_device__set_state(pDevice, ma_device_state_uninitialized); - - /* Wake up the worker thread and wait for it to properly terminate. */ - if (!ma_context_is_backend_asynchronous(pDevice->pContext)) { - ma_event_signal(&pDevice->wakeupEvent); - ma_thread_wait(&pDevice->thread); - } - - if (pDevice->pContext->callbacks.onDeviceUninit != NULL) { - pDevice->pContext->callbacks.onDeviceUninit(pDevice); - } - - - ma_event_uninit(&pDevice->stopEvent); - ma_event_uninit(&pDevice->startEvent); - ma_event_uninit(&pDevice->wakeupEvent); - ma_mutex_uninit(&pDevice->startStopLock); - - if (ma_context_is_backend_asynchronous(pDevice->pContext)) { - if (pDevice->type == ma_device_type_duplex) { - ma_duplex_rb_uninit(&pDevice->duplexRB); - } - } - - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) { - ma_data_converter_uninit(&pDevice->capture.converter, &pDevice->pContext->allocationCallbacks); - } - if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) { - ma_data_converter_uninit(&pDevice->playback.converter, &pDevice->pContext->allocationCallbacks); - } - - if (pDevice->playback.pInputCache != NULL) { - ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks); - } - - if (pDevice->capture.pIntermediaryBuffer != NULL) { - ma_free(pDevice->capture.pIntermediaryBuffer, &pDevice->pContext->allocationCallbacks); - } - if (pDevice->playback.pIntermediaryBuffer != NULL) { - ma_free(pDevice->playback.pIntermediaryBuffer, &pDevice->pContext->allocationCallbacks); - } - - if (pDevice->isOwnerOfContext) { - ma_allocation_callbacks allocationCallbacks = pDevice->pContext->allocationCallbacks; - - ma_context_uninit(pDevice->pContext); - ma_free(pDevice->pContext, &allocationCallbacks); - } - - MA_ZERO_OBJECT(pDevice); -} - -MA_API ma_context* ma_device_get_context(ma_device* pDevice) -{ - if (pDevice == NULL) { - return NULL; - } - - return pDevice->pContext; -} - -MA_API ma_log* ma_device_get_log(ma_device* pDevice) -{ - return ma_context_get_log(ma_device_get_context(pDevice)); -} - -MA_API ma_result ma_device_get_info(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo) -{ - if (pDeviceInfo == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDeviceInfo); - - if (pDevice == NULL) { - return MA_INVALID_ARGS; - } - - /* If the onDeviceGetInfo() callback is set, use that. Otherwise we'll fall back to ma_context_get_device_info(). */ - if (pDevice->pContext->callbacks.onDeviceGetInfo != NULL) { - return pDevice->pContext->callbacks.onDeviceGetInfo(pDevice, type, pDeviceInfo); - } - - /* Getting here means onDeviceGetInfo is not implemented so we need to fall back to an alternative. */ - if (type == ma_device_type_playback) { - return ma_context_get_device_info(pDevice->pContext, type, pDevice->playback.pID, pDeviceInfo); - } else { - return ma_context_get_device_info(pDevice->pContext, type, pDevice->capture.pID, pDeviceInfo); - } -} - -MA_API ma_result ma_device_get_name(ma_device* pDevice, ma_device_type type, char* pName, size_t nameCap, size_t* pLengthNotIncludingNullTerminator) -{ - ma_result result; - ma_device_info deviceInfo; - - if (pLengthNotIncludingNullTerminator != NULL) { - *pLengthNotIncludingNullTerminator = 0; - } - - if (pName != NULL && nameCap > 0) { - pName[0] = '\0'; - } - - result = ma_device_get_info(pDevice, type, &deviceInfo); - if (result != MA_SUCCESS) { - return result; - } - - if (pName != NULL) { - ma_strncpy_s(pName, nameCap, deviceInfo.name, (size_t)-1); - - /* - For safety, make sure the length is based on the truncated output string rather than the - source. Otherwise the caller might assume the output buffer contains more content than it - actually does. - */ - if (pLengthNotIncludingNullTerminator != NULL) { - *pLengthNotIncludingNullTerminator = strlen(pName); - } - } else { - /* Name not specified. Just report the length of the source string. */ - if (pLengthNotIncludingNullTerminator != NULL) { - *pLengthNotIncludingNullTerminator = strlen(deviceInfo.name); - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_device_start(ma_device* pDevice) -{ - ma_result result; - - if (pDevice == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_device_get_state(pDevice) == ma_device_state_uninitialized) { - return MA_INVALID_OPERATION; /* Not initialized. */ - } - - if (ma_device_get_state(pDevice) == ma_device_state_started) { - return MA_SUCCESS; /* Already started. */ - } - - ma_mutex_lock(&pDevice->startStopLock); - { - /* Starting and stopping are wrapped in a mutex which means we can assert that the device is in a stopped or paused state. */ - MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_stopped); - - ma_device__set_state(pDevice, ma_device_state_starting); - - /* Asynchronous backends need to be handled differently. */ - if (ma_context_is_backend_asynchronous(pDevice->pContext)) { - if (pDevice->pContext->callbacks.onDeviceStart != NULL) { - result = pDevice->pContext->callbacks.onDeviceStart(pDevice); - } else { - result = MA_INVALID_OPERATION; - } - - if (result == MA_SUCCESS) { - ma_device__set_state(pDevice, ma_device_state_started); - ma_device__on_notification_started(pDevice); - } - } else { - /* - Synchronous backends are started by signaling an event that's being waited on in the worker thread. We first wake up the - thread and then wait for the start event. - */ - ma_event_signal(&pDevice->wakeupEvent); - - /* - Wait for the worker thread to finish starting the device. Note that the worker thread will be the one who puts the device - into the started state. Don't call ma_device__set_state() here. - */ - ma_event_wait(&pDevice->startEvent); - result = pDevice->workResult; - } - - /* We changed the state from stopped to started, so if we failed, make sure we put the state back to stopped. */ - if (result != MA_SUCCESS) { - ma_device__set_state(pDevice, ma_device_state_stopped); - } - } - ma_mutex_unlock(&pDevice->startStopLock); - - return result; -} - -MA_API ma_result ma_device_stop(ma_device* pDevice) -{ - ma_result result; - - if (pDevice == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_device_get_state(pDevice) == ma_device_state_uninitialized) { - return MA_INVALID_OPERATION; /* Not initialized. */ - } - - if (ma_device_get_state(pDevice) == ma_device_state_stopped) { - return MA_SUCCESS; /* Already stopped. */ - } - - ma_mutex_lock(&pDevice->startStopLock); - { - /* Starting and stopping are wrapped in a mutex which means we can assert that the device is in a started or paused state. */ - MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_started); - - ma_device__set_state(pDevice, ma_device_state_stopping); - - /* Asynchronous backends need to be handled differently. */ - if (ma_context_is_backend_asynchronous(pDevice->pContext)) { - /* Asynchronous backends must have a stop operation. */ - if (pDevice->pContext->callbacks.onDeviceStop != NULL) { - result = pDevice->pContext->callbacks.onDeviceStop(pDevice); - } else { - result = MA_INVALID_OPERATION; - } - - ma_device__set_state(pDevice, ma_device_state_stopped); - } else { - /* - Synchronous backends. The stop callback is always called from the worker thread. Do not call the stop callback here. If - the backend is implementing it's own audio thread loop we'll need to wake it up if required. Note that we need to make - sure the state of the device is *not* playing right now, which it shouldn't be since we set it above. This is super - important though, so I'm asserting it here as well for extra safety in case we accidentally change something later. - */ - MA_ASSERT(ma_device_get_state(pDevice) != ma_device_state_started); - - if (pDevice->pContext->callbacks.onDeviceDataLoopWakeup != NULL) { - pDevice->pContext->callbacks.onDeviceDataLoopWakeup(pDevice); - } - - /* - We need to wait for the worker thread to become available for work before returning. Note that the worker thread will be - the one who puts the device into the stopped state. Don't call ma_device__set_state() here. - */ - ma_event_wait(&pDevice->stopEvent); - result = MA_SUCCESS; - } - } - ma_mutex_unlock(&pDevice->startStopLock); - - return result; -} - -MA_API ma_bool32 ma_device_is_started(const ma_device* pDevice) -{ - return ma_device_get_state(pDevice) == ma_device_state_started; -} - -MA_API ma_device_state ma_device_get_state(const ma_device* pDevice) -{ - if (pDevice == NULL) { - return ma_device_state_uninitialized; - } - - return (ma_device_state)c89atomic_load_i32((ma_int32*)&pDevice->state); /* Naughty cast to get rid of a const warning. */ -} - -MA_API ma_result ma_device_set_master_volume(ma_device* pDevice, float volume) -{ - if (pDevice == NULL) { - return MA_INVALID_ARGS; - } - - if (volume < 0.0f) { - return MA_INVALID_ARGS; - } - - c89atomic_exchange_f32(&pDevice->masterVolumeFactor, volume); - - return MA_SUCCESS; -} - -MA_API ma_result ma_device_get_master_volume(ma_device* pDevice, float* pVolume) -{ - if (pVolume == NULL) { - return MA_INVALID_ARGS; - } - - if (pDevice == NULL) { - *pVolume = 0; - return MA_INVALID_ARGS; - } - - *pVolume = c89atomic_load_f32(&pDevice->masterVolumeFactor); - - return MA_SUCCESS; -} - -MA_API ma_result ma_device_set_master_volume_db(ma_device* pDevice, float gainDB) -{ - if (gainDB > 0) { - return MA_INVALID_ARGS; - } - - return ma_device_set_master_volume(pDevice, ma_volume_db_to_linear(gainDB)); -} - -MA_API ma_result ma_device_get_master_volume_db(ma_device* pDevice, float* pGainDB) -{ - float factor; - ma_result result; - - if (pGainDB == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_device_get_master_volume(pDevice, &factor); - if (result != MA_SUCCESS) { - *pGainDB = 0; - return result; - } - - *pGainDB = ma_volume_linear_to_db(factor); - - return MA_SUCCESS; -} - - -MA_API ma_result ma_device_handle_backend_data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) -{ - if (pDevice == NULL) { - return MA_INVALID_ARGS; - } - - if (pOutput == NULL && pInput == NULL) { - return MA_INVALID_ARGS; - } - - if (pDevice->type == ma_device_type_duplex) { - if (pInput != NULL) { - ma_device__handle_duplex_callback_capture(pDevice, frameCount, pInput, &pDevice->duplexRB.rb); - } - - if (pOutput != NULL) { - ma_device__handle_duplex_callback_playback(pDevice, frameCount, pOutput, &pDevice->duplexRB.rb); - } - } else { - if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_loopback) { - if (pInput == NULL) { - return MA_INVALID_ARGS; - } - - ma_device__send_frames_to_client(pDevice, frameCount, pInput); - } - - if (pDevice->type == ma_device_type_playback) { - if (pOutput == NULL) { - return MA_INVALID_ARGS; - } - - ma_device__read_frames_from_client(pDevice, frameCount, pOutput); - } - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_descriptor(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile) -{ - if (pDescriptor == NULL) { - return 0; - } - - /* - We must have a non-0 native sample rate, but some backends don't allow retrieval of this at the - time when the size of the buffer needs to be determined. In this case we need to just take a best - guess and move on. We'll try using the sample rate in pDescriptor first. If that's not set we'll - just fall back to MA_DEFAULT_SAMPLE_RATE. - */ - if (nativeSampleRate == 0) { - nativeSampleRate = pDescriptor->sampleRate; - } - if (nativeSampleRate == 0) { - nativeSampleRate = MA_DEFAULT_SAMPLE_RATE; - } - - MA_ASSERT(nativeSampleRate != 0); - - if (pDescriptor->periodSizeInFrames == 0) { - if (pDescriptor->periodSizeInMilliseconds == 0) { - if (performanceProfile == ma_performance_profile_low_latency) { - return ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY, nativeSampleRate); - } else { - return ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE, nativeSampleRate); - } - } else { - return ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptor->periodSizeInMilliseconds, nativeSampleRate); - } - } else { - return pDescriptor->periodSizeInFrames; - } -} -#endif /* MA_NO_DEVICE_IO */ - - -MA_API ma_uint32 ma_calculate_buffer_size_in_milliseconds_from_frames(ma_uint32 bufferSizeInFrames, ma_uint32 sampleRate) -{ - /* Prevent a division by zero. */ - if (sampleRate == 0) { - return 0; - } - - return bufferSizeInFrames*1000 / sampleRate; -} - -MA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_milliseconds(ma_uint32 bufferSizeInMilliseconds, ma_uint32 sampleRate) -{ - /* Prevent a division by zero. */ - if (sampleRate == 0) { - return 0; - } - - return bufferSizeInMilliseconds*sampleRate / 1000; -} - -MA_API void ma_copy_pcm_frames(void* dst, const void* src, ma_uint64 frameCount, ma_format format, ma_uint32 channels) -{ - if (dst == src) { - return; /* No-op. */ - } - - ma_copy_memory_64(dst, src, frameCount * ma_get_bytes_per_frame(format, channels)); -} - -MA_API void ma_silence_pcm_frames(void* p, ma_uint64 frameCount, ma_format format, ma_uint32 channels) -{ - if (format == ma_format_u8) { - ma_uint64 sampleCount = frameCount * channels; - ma_uint64 iSample; - for (iSample = 0; iSample < sampleCount; iSample += 1) { - ((ma_uint8*)p)[iSample] = 128; - } - } else { - ma_zero_memory_64(p, frameCount * ma_get_bytes_per_frame(format, channels)); - } -} - -MA_API void* ma_offset_pcm_frames_ptr(void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels) -{ - return ma_offset_ptr(p, offsetInFrames * ma_get_bytes_per_frame(format, channels)); -} - -MA_API const void* ma_offset_pcm_frames_const_ptr(const void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels) -{ - return ma_offset_ptr(p, offsetInFrames * ma_get_bytes_per_frame(format, channels)); -} - - -MA_API void ma_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count) -{ - ma_uint64 iSample; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_u8(pSrc[iSample]); - } -} - -MA_API void ma_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count) -{ - ma_uint64 iSample; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_s16(pSrc[iSample]); - } -} - -MA_API void ma_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count) -{ - ma_uint64 iSample; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - for (iSample = 0; iSample < count; iSample += 1) { - ma_int64 s = ma_clip_s24(pSrc[iSample]); - pDst[iSample*3 + 0] = (ma_uint8)((s & 0x000000FF) >> 0); - pDst[iSample*3 + 1] = (ma_uint8)((s & 0x0000FF00) >> 8); - pDst[iSample*3 + 2] = (ma_uint8)((s & 0x00FF0000) >> 16); - } -} - -MA_API void ma_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count) -{ - ma_uint64 iSample; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_s32(pSrc[iSample]); - } -} - -MA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count) -{ - ma_uint64 iSample; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_f32(pSrc[iSample]); - } -} - -MA_API void ma_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels) -{ - ma_uint64 sampleCount; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - sampleCount = frameCount * channels; - - switch (format) { - case ma_format_u8: ma_clip_samples_u8( (ma_uint8*)pDst, (const ma_int16*)pSrc, sampleCount); break; - case ma_format_s16: ma_clip_samples_s16((ma_int16*)pDst, (const ma_int32*)pSrc, sampleCount); break; - case ma_format_s24: ma_clip_samples_s24((ma_uint8*)pDst, (const ma_int64*)pSrc, sampleCount); break; - case ma_format_s32: ma_clip_samples_s32((ma_int32*)pDst, (const ma_int64*)pSrc, sampleCount); break; - case ma_format_f32: ma_clip_samples_f32(( float*)pDst, (const float*)pSrc, sampleCount); break; - - /* Do nothing if we don't know the format. We're including these here to silence a compiler warning about enums not being handled by the switch. */ - case ma_format_unknown: - case ma_format_count: - break; - } -} - - -MA_API void ma_copy_and_apply_volume_factor_u8(ma_uint8* pSamplesOut, const ma_uint8* pSamplesIn, ma_uint64 sampleCount, float factor) -{ - ma_uint64 iSample; - - if (pSamplesOut == NULL || pSamplesIn == NULL) { - return; - } - - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamplesOut[iSample] = (ma_uint8)(pSamplesIn[iSample] * factor); - } -} - -MA_API void ma_copy_and_apply_volume_factor_s16(ma_int16* pSamplesOut, const ma_int16* pSamplesIn, ma_uint64 sampleCount, float factor) -{ - ma_uint64 iSample; - - if (pSamplesOut == NULL || pSamplesIn == NULL) { - return; - } - - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamplesOut[iSample] = (ma_int16)(pSamplesIn[iSample] * factor); - } -} - -MA_API void ma_copy_and_apply_volume_factor_s24(void* pSamplesOut, const void* pSamplesIn, ma_uint64 sampleCount, float factor) -{ - ma_uint64 iSample; - ma_uint8* pSamplesOut8; - ma_uint8* pSamplesIn8; - - if (pSamplesOut == NULL || pSamplesIn == NULL) { - return; - } - - pSamplesOut8 = (ma_uint8*)pSamplesOut; - pSamplesIn8 = (ma_uint8*)pSamplesIn; - - for (iSample = 0; iSample < sampleCount; iSample += 1) { - ma_int32 sampleS32; - - sampleS32 = (ma_int32)(((ma_uint32)(pSamplesIn8[iSample*3+0]) << 8) | ((ma_uint32)(pSamplesIn8[iSample*3+1]) << 16) | ((ma_uint32)(pSamplesIn8[iSample*3+2])) << 24); - sampleS32 = (ma_int32)(sampleS32 * factor); - - pSamplesOut8[iSample*3+0] = (ma_uint8)(((ma_uint32)sampleS32 & 0x0000FF00) >> 8); - pSamplesOut8[iSample*3+1] = (ma_uint8)(((ma_uint32)sampleS32 & 0x00FF0000) >> 16); - pSamplesOut8[iSample*3+2] = (ma_uint8)(((ma_uint32)sampleS32 & 0xFF000000) >> 24); - } -} - -MA_API void ma_copy_and_apply_volume_factor_s32(ma_int32* pSamplesOut, const ma_int32* pSamplesIn, ma_uint64 sampleCount, float factor) -{ - ma_uint64 iSample; - - if (pSamplesOut == NULL || pSamplesIn == NULL) { - return; - } - - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamplesOut[iSample] = (ma_int32)(pSamplesIn[iSample] * factor); - } -} - -MA_API void ma_copy_and_apply_volume_factor_f32(float* pSamplesOut, const float* pSamplesIn, ma_uint64 sampleCount, float factor) -{ - ma_uint64 iSample; - - if (pSamplesOut == NULL || pSamplesIn == NULL) { - return; - } - - if (factor == 1) { - if (pSamplesOut == pSamplesIn) { - /* In place. No-op. */ - } else { - /* Just a copy. */ - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamplesOut[iSample] = pSamplesIn[iSample]; - } - } - } else { - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamplesOut[iSample] = pSamplesIn[iSample] * factor; - } - } -} - -MA_API void ma_apply_volume_factor_u8(ma_uint8* pSamples, ma_uint64 sampleCount, float factor) -{ - ma_copy_and_apply_volume_factor_u8(pSamples, pSamples, sampleCount, factor); -} - -MA_API void ma_apply_volume_factor_s16(ma_int16* pSamples, ma_uint64 sampleCount, float factor) -{ - ma_copy_and_apply_volume_factor_s16(pSamples, pSamples, sampleCount, factor); -} - -MA_API void ma_apply_volume_factor_s24(void* pSamples, ma_uint64 sampleCount, float factor) -{ - ma_copy_and_apply_volume_factor_s24(pSamples, pSamples, sampleCount, factor); -} - -MA_API void ma_apply_volume_factor_s32(ma_int32* pSamples, ma_uint64 sampleCount, float factor) -{ - ma_copy_and_apply_volume_factor_s32(pSamples, pSamples, sampleCount, factor); -} - -MA_API void ma_apply_volume_factor_f32(float* pSamples, ma_uint64 sampleCount, float factor) -{ - ma_copy_and_apply_volume_factor_f32(pSamples, pSamples, sampleCount, factor); -} - -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_u8(ma_uint8* pFramesOut, const ma_uint8* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_u8(pFramesOut, pFramesIn, frameCount*channels, factor); -} - -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_s16(ma_int16* pFramesOut, const ma_int16* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_s16(pFramesOut, pFramesIn, frameCount*channels, factor); -} - -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_s24(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_s24(pFramesOut, pFramesIn, frameCount*channels, factor); -} - -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_s32(ma_int32* pFramesOut, const ma_int32* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_s32(pFramesOut, pFramesIn, frameCount*channels, factor); -} - -MA_API void ma_copy_and_apply_volume_factor_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_f32(pFramesOut, pFramesIn, frameCount*channels, factor); -} - -MA_API void ma_copy_and_apply_volume_factor_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor) -{ - switch (format) - { - case ma_format_u8: ma_copy_and_apply_volume_factor_pcm_frames_u8 ((ma_uint8*)pFramesOut, (const ma_uint8*)pFramesIn, frameCount, channels, factor); return; - case ma_format_s16: ma_copy_and_apply_volume_factor_pcm_frames_s16((ma_int16*)pFramesOut, (const ma_int16*)pFramesIn, frameCount, channels, factor); return; - case ma_format_s24: ma_copy_and_apply_volume_factor_pcm_frames_s24( pFramesOut, pFramesIn, frameCount, channels, factor); return; - case ma_format_s32: ma_copy_and_apply_volume_factor_pcm_frames_s32((ma_int32*)pFramesOut, (const ma_int32*)pFramesIn, frameCount, channels, factor); return; - case ma_format_f32: ma_copy_and_apply_volume_factor_pcm_frames_f32( (float*)pFramesOut, (const float*)pFramesIn, frameCount, channels, factor); return; - default: return; /* Do nothing. */ - } -} - -MA_API void ma_apply_volume_factor_pcm_frames_u8(ma_uint8* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_pcm_frames_u8(pFrames, pFrames, frameCount, channels, factor); -} - -MA_API void ma_apply_volume_factor_pcm_frames_s16(ma_int16* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_pcm_frames_s16(pFrames, pFrames, frameCount, channels, factor); -} - -MA_API void ma_apply_volume_factor_pcm_frames_s24(void* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_pcm_frames_s24(pFrames, pFrames, frameCount, channels, factor); -} - -MA_API void ma_apply_volume_factor_pcm_frames_s32(ma_int32* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_pcm_frames_s32(pFrames, pFrames, frameCount, channels, factor); -} - -MA_API void ma_apply_volume_factor_pcm_frames_f32(float* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_pcm_frames_f32(pFrames, pFrames, frameCount, channels, factor); -} - -MA_API void ma_apply_volume_factor_pcm_frames(void* pFramesOut, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor) -{ - ma_copy_and_apply_volume_factor_pcm_frames(pFramesOut, pFramesOut, frameCount, format, channels, factor); -} - - -MA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float* pChannelGains) -{ - ma_uint64 iFrame; - - if (channels == 2) { - /* TODO: Do an optimized implementation for stereo and mono. Can do a SIMD optimized implementation as well. */ - } - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOut[iFrame * channels + iChannel] = pFramesIn[iFrame * channels + iChannel] * pChannelGains[iChannel]; - } - } -} - - - -static MA_INLINE ma_int16 ma_apply_volume_unclipped_u8(ma_int16 x, ma_int16 volume) -{ - return (ma_int16)(((ma_int32)x * (ma_int32)volume) >> 8); -} - -static MA_INLINE ma_int32 ma_apply_volume_unclipped_s16(ma_int32 x, ma_int16 volume) -{ - return (ma_int32)((x * volume) >> 8); -} - -static MA_INLINE ma_int64 ma_apply_volume_unclipped_s24(ma_int64 x, ma_int16 volume) -{ - return (ma_int64)((x * volume) >> 8); -} - -static MA_INLINE ma_int64 ma_apply_volume_unclipped_s32(ma_int64 x, ma_int16 volume) -{ - return (ma_int64)((x * volume) >> 8); -} - -static MA_INLINE float ma_apply_volume_unclipped_f32(float x, float volume) -{ - return x * volume; -} - - -MA_API void ma_copy_and_apply_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume) -{ - ma_uint64 iSample; - ma_int16 volumeFixed; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - volumeFixed = ma_float_to_fixed_16(volume); - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_u8(ma_apply_volume_unclipped_u8(pSrc[iSample], volumeFixed)); - } -} - -MA_API void ma_copy_and_apply_volume_and_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count, float volume) -{ - ma_uint64 iSample; - ma_int16 volumeFixed; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - volumeFixed = ma_float_to_fixed_16(volume); - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_s16(ma_apply_volume_unclipped_s16(pSrc[iSample], volumeFixed)); - } -} - -MA_API void ma_copy_and_apply_volume_and_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count, float volume) -{ - ma_uint64 iSample; - ma_int16 volumeFixed; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - volumeFixed = ma_float_to_fixed_16(volume); - - for (iSample = 0; iSample < count; iSample += 1) { - ma_int64 s = ma_clip_s24(ma_apply_volume_unclipped_s24(pSrc[iSample], volumeFixed)); - pDst[iSample*3 + 0] = (ma_uint8)((s & 0x000000FF) >> 0); - pDst[iSample*3 + 1] = (ma_uint8)((s & 0x0000FF00) >> 8); - pDst[iSample*3 + 2] = (ma_uint8)((s & 0x00FF0000) >> 16); - } -} - -MA_API void ma_copy_and_apply_volume_and_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count, float volume) -{ - ma_uint64 iSample; - ma_int16 volumeFixed; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - volumeFixed = ma_float_to_fixed_16(volume); - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_s32(ma_apply_volume_unclipped_s32(pSrc[iSample], volumeFixed)); - } -} - -MA_API void ma_copy_and_apply_volume_and_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count, float volume) -{ - ma_uint64 iSample; - - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - /* For the f32 case we need to make sure this supports in-place processing where the input and output buffers are the same. */ - - for (iSample = 0; iSample < count; iSample += 1) { - pDst[iSample] = ma_clip_f32(ma_apply_volume_unclipped_f32(pSrc[iSample], volume)); - } -} - -MA_API void ma_copy_and_apply_volume_and_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float volume) -{ - MA_ASSERT(pDst != NULL); - MA_ASSERT(pSrc != NULL); - - if (volume == 1) { - ma_clip_pcm_frames(pDst, pSrc, frameCount, format, channels); /* Optimized case for volume = 1. */ - } else if (volume == 0) { - ma_silence_pcm_frames(pDst, frameCount, format, channels); /* Optimized case for volume = 0. */ - } else { - ma_uint64 sampleCount = frameCount * channels; - - switch (format) { - case ma_format_u8: ma_copy_and_apply_volume_and_clip_samples_u8( (ma_uint8*)pDst, (const ma_int16*)pSrc, sampleCount, volume); break; - case ma_format_s16: ma_copy_and_apply_volume_and_clip_samples_s16((ma_int16*)pDst, (const ma_int32*)pSrc, sampleCount, volume); break; - case ma_format_s24: ma_copy_and_apply_volume_and_clip_samples_s24((ma_uint8*)pDst, (const ma_int64*)pSrc, sampleCount, volume); break; - case ma_format_s32: ma_copy_and_apply_volume_and_clip_samples_s32((ma_int32*)pDst, (const ma_int64*)pSrc, sampleCount, volume); break; - case ma_format_f32: ma_copy_and_apply_volume_and_clip_samples_f32(( float*)pDst, (const float*)pSrc, sampleCount, volume); break; - - /* Do nothing if we don't know the format. We're including these here to silence a compiler warning about enums not being handled by the switch. */ - case ma_format_unknown: - case ma_format_count: - break; - } - } -} - - - -MA_API float ma_volume_linear_to_db(float factor) -{ - return 20*ma_log10f(factor); -} - -MA_API float ma_volume_db_to_linear(float gain) -{ - return ma_powf(10, gain/20.0f); -} - - - -/************************************************************************************************************************************************************** - -Format Conversion - -**************************************************************************************************************************************************************/ - -static MA_INLINE ma_int16 ma_pcm_sample_f32_to_s16(float x) -{ - return (ma_int16)(x * 32767.0f); -} - -static MA_INLINE ma_int16 ma_pcm_sample_u8_to_s16_no_scale(ma_uint8 x) -{ - return (ma_int16)((ma_int16)x - 128); -} - -static MA_INLINE ma_int64 ma_pcm_sample_s24_to_s32_no_scale(const ma_uint8* x) -{ - return (ma_int64)(((ma_uint64)x[0] << 40) | ((ma_uint64)x[1] << 48) | ((ma_uint64)x[2] << 56)) >> 40; /* Make sure the sign bits are maintained. */ -} - -static MA_INLINE void ma_pcm_sample_s32_to_s24_no_scale(ma_int64 x, ma_uint8* s24) -{ - s24[0] = (ma_uint8)((x & 0x000000FF) >> 0); - s24[1] = (ma_uint8)((x & 0x0000FF00) >> 8); - s24[2] = (ma_uint8)((x & 0x00FF0000) >> 16); -} - - -/* u8 */ -MA_API void ma_pcm_u8_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - (void)ditherMode; - ma_copy_memory_64(dst, src, count * sizeof(ma_uint8)); -} - - -static MA_INLINE void ma_pcm_u8_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_int16* dst_s16 = (ma_int16*)dst; - const ma_uint8* src_u8 = (const ma_uint8*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int16 x = src_u8[i]; - x = (ma_int16)(x - 128); - x = (ma_int16)(x << 8); - dst_s16[i] = x; - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_u8_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s16__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_u8_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_u8_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_u8_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_u8_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_u8_to_s16__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_u8_to_s16__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_u8_to_s16__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_u8_to_s16__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_u8_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint8* dst_s24 = (ma_uint8*)dst; - const ma_uint8* src_u8 = (const ma_uint8*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int16 x = src_u8[i]; - x = (ma_int16)(x - 128); - - dst_s24[i*3+0] = 0; - dst_s24[i*3+1] = 0; - dst_s24[i*3+2] = (ma_uint8)((ma_int8)x); - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_u8_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s24__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_u8_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_u8_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_u8_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_u8_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_u8_to_s24__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_u8_to_s24__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_u8_to_s24__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_u8_to_s24__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_u8_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_int32* dst_s32 = (ma_int32*)dst; - const ma_uint8* src_u8 = (const ma_uint8*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 x = src_u8[i]; - x = x - 128; - x = x << 24; - dst_s32[i] = x; - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_u8_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_u8_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_u8_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_u8_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_u8_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_u8_to_s32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_u8_to_s32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_u8_to_s32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_u8_to_s32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_u8_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - float* dst_f32 = (float*)dst; - const ma_uint8* src_u8 = (const ma_uint8*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - float x = (float)src_u8[i]; - x = x * 0.00784313725490196078f; /* 0..255 to 0..2 */ - x = x - 1; /* 0..2 to -1..1 */ - - dst_f32[i] = x; - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_u8_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_f32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_u8_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_u8_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_u8_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_u8_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_u8_to_f32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_u8_to_f32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_u8_to_f32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_u8_to_f32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -#ifdef MA_USE_REFERENCE_CONVERSION_APIS -static MA_INLINE void ma_pcm_interleave_u8__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_uint8* dst_u8 = (ma_uint8*)dst; - const ma_uint8** src_u8 = (const ma_uint8**)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_u8[iFrame*channels + iChannel] = src_u8[iChannel][iFrame]; - } - } -} -#else -static MA_INLINE void ma_pcm_interleave_u8__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_uint8* dst_u8 = (ma_uint8*)dst; - const ma_uint8** src_u8 = (const ma_uint8**)src; - - if (channels == 1) { - ma_copy_memory_64(dst, src[0], frameCount * sizeof(ma_uint8)); - } else if (channels == 2) { - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - dst_u8[iFrame*2 + 0] = src_u8[0][iFrame]; - dst_u8[iFrame*2 + 1] = src_u8[1][iFrame]; - } - } else { - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_u8[iFrame*channels + iChannel] = src_u8[iChannel][iFrame]; - } - } - } -} -#endif - -MA_API void ma_pcm_interleave_u8(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_interleave_u8__reference(dst, src, frameCount, channels); -#else - ma_pcm_interleave_u8__optimized(dst, src, frameCount, channels); -#endif -} - - -static MA_INLINE void ma_pcm_deinterleave_u8__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_uint8** dst_u8 = (ma_uint8**)dst; - const ma_uint8* src_u8 = (const ma_uint8*)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_u8[iChannel][iFrame] = src_u8[iFrame*channels + iChannel]; - } - } -} - -static MA_INLINE void ma_pcm_deinterleave_u8__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_deinterleave_u8__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_deinterleave_u8(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_deinterleave_u8__reference(dst, src, frameCount, channels); -#else - ma_pcm_deinterleave_u8__optimized(dst, src, frameCount, channels); -#endif -} - - -/* s16 */ -static MA_INLINE void ma_pcm_s16_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint8* dst_u8 = (ma_uint8*)dst; - const ma_int16* src_s16 = (const ma_int16*)src; - - if (ditherMode == ma_dither_mode_none) { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int16 x = src_s16[i]; - x = (ma_int16)(x >> 8); - x = (ma_int16)(x + 128); - dst_u8[i] = (ma_uint8)x; - } - } else { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int16 x = src_s16[i]; - - /* Dither. Don't overflow. */ - ma_int32 dither = ma_dither_s32(ditherMode, -0x80, 0x7F); - if ((x + dither) <= 0x7FFF) { - x = (ma_int16)(x + dither); - } else { - x = 0x7FFF; - } - - x = (ma_int16)(x >> 8); - x = (ma_int16)(x + 128); - dst_u8[i] = (ma_uint8)x; - } - } -} - -static MA_INLINE void ma_pcm_s16_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_u8__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s16_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s16_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s16_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s16_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s16_to_u8__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s16_to_u8__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s16_to_u8__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s16_to_u8__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode); - } -#endif -} - - -MA_API void ma_pcm_s16_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - (void)ditherMode; - ma_copy_memory_64(dst, src, count * sizeof(ma_int16)); -} - - -static MA_INLINE void ma_pcm_s16_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint8* dst_s24 = (ma_uint8*)dst; - const ma_int16* src_s16 = (const ma_int16*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - dst_s24[i*3+0] = 0; - dst_s24[i*3+1] = (ma_uint8)(src_s16[i] & 0xFF); - dst_s24[i*3+2] = (ma_uint8)(src_s16[i] >> 8); - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_s16_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s24__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s16_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s16_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s16_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s16_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s16_to_s24__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s16_to_s24__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s16_to_s24__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s16_to_s24__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_s16_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_int32* dst_s32 = (ma_int32*)dst; - const ma_int16* src_s16 = (const ma_int16*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - dst_s32[i] = src_s16[i] << 16; - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_s16_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s16_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s16_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s16_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s16_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s16_to_s32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s16_to_s32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s16_to_s32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s16_to_s32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_s16_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - float* dst_f32 = (float*)dst; - const ma_int16* src_s16 = (const ma_int16*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - float x = (float)src_s16[i]; - -#if 0 - /* The accurate way. */ - x = x + 32768.0f; /* -32768..32767 to 0..65535 */ - x = x * 0.00003051804379339284f; /* 0..65535 to 0..2 */ - x = x - 1; /* 0..2 to -1..1 */ -#else - /* The fast way. */ - x = x * 0.000030517578125f; /* -32768..32767 to -1..0.999969482421875 */ -#endif - - dst_f32[i] = x; - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_s16_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_f32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s16_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s16_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s16_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s16_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s16_to_f32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s16_to_f32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s16_to_f32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s16_to_f32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_interleave_s16__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_int16* dst_s16 = (ma_int16*)dst; - const ma_int16** src_s16 = (const ma_int16**)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_s16[iFrame*channels + iChannel] = src_s16[iChannel][iFrame]; - } - } -} - -static MA_INLINE void ma_pcm_interleave_s16__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_interleave_s16__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_interleave_s16(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_interleave_s16__reference(dst, src, frameCount, channels); -#else - ma_pcm_interleave_s16__optimized(dst, src, frameCount, channels); -#endif -} - - -static MA_INLINE void ma_pcm_deinterleave_s16__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_int16** dst_s16 = (ma_int16**)dst; - const ma_int16* src_s16 = (const ma_int16*)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_s16[iChannel][iFrame] = src_s16[iFrame*channels + iChannel]; - } - } -} - -static MA_INLINE void ma_pcm_deinterleave_s16__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_deinterleave_s16__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_deinterleave_s16(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_deinterleave_s16__reference(dst, src, frameCount, channels); -#else - ma_pcm_deinterleave_s16__optimized(dst, src, frameCount, channels); -#endif -} - - -/* s24 */ -static MA_INLINE void ma_pcm_s24_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint8* dst_u8 = (ma_uint8*)dst; - const ma_uint8* src_s24 = (const ma_uint8*)src; - - if (ditherMode == ma_dither_mode_none) { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - dst_u8[i] = (ma_uint8)((ma_int8)src_s24[i*3 + 2] + 128); - } - } else { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 x = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24); - - /* Dither. Don't overflow. */ - ma_int32 dither = ma_dither_s32(ditherMode, -0x800000, 0x7FFFFF); - if ((ma_int64)x + dither <= 0x7FFFFFFF) { - x = x + dither; - } else { - x = 0x7FFFFFFF; - } - - x = x >> 24; - x = x + 128; - dst_u8[i] = (ma_uint8)x; - } - } -} - -static MA_INLINE void ma_pcm_s24_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_u8__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s24_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s24_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s24_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s24_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s24_to_u8__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s24_to_u8__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s24_to_u8__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s24_to_u8__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_s24_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_int16* dst_s16 = (ma_int16*)dst; - const ma_uint8* src_s24 = (const ma_uint8*)src; - - if (ditherMode == ma_dither_mode_none) { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_uint16 dst_lo = ((ma_uint16)src_s24[i*3 + 1]); - ma_uint16 dst_hi = (ma_uint16)((ma_uint16)src_s24[i*3 + 2] << 8); - dst_s16[i] = (ma_int16)(dst_lo | dst_hi); - } - } else { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 x = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24); - - /* Dither. Don't overflow. */ - ma_int32 dither = ma_dither_s32(ditherMode, -0x8000, 0x7FFF); - if ((ma_int64)x + dither <= 0x7FFFFFFF) { - x = x + dither; - } else { - x = 0x7FFFFFFF; - } - - x = x >> 16; - dst_s16[i] = (ma_int16)x; - } - } -} - -static MA_INLINE void ma_pcm_s24_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s16__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s24_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s24_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s24_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s24_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s24_to_s16__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s24_to_s16__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s24_to_s16__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s24_to_s16__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode); - } -#endif -} - - -MA_API void ma_pcm_s24_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - (void)ditherMode; - - ma_copy_memory_64(dst, src, count * 3); -} - - -static MA_INLINE void ma_pcm_s24_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_int32* dst_s32 = (ma_int32*)dst; - const ma_uint8* src_s24 = (const ma_uint8*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - dst_s32[i] = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24); - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_s24_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s24_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s24_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s24_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s24_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s24_to_s32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s24_to_s32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s24_to_s32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s24_to_s32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_s24_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - float* dst_f32 = (float*)dst; - const ma_uint8* src_s24 = (const ma_uint8*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - float x = (float)(((ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24)) >> 8); - -#if 0 - /* The accurate way. */ - x = x + 8388608.0f; /* -8388608..8388607 to 0..16777215 */ - x = x * 0.00000011920929665621f; /* 0..16777215 to 0..2 */ - x = x - 1; /* 0..2 to -1..1 */ -#else - /* The fast way. */ - x = x * 0.00000011920928955078125f; /* -8388608..8388607 to -1..0.999969482421875 */ -#endif - - dst_f32[i] = x; - } - - (void)ditherMode; -} - -static MA_INLINE void ma_pcm_s24_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_f32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s24_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s24_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s24_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s24_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s24_to_f32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s24_to_f32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s24_to_f32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s24_to_f32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_interleave_s24__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_uint8* dst8 = (ma_uint8*)dst; - const ma_uint8** src8 = (const ma_uint8**)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst8[iFrame*3*channels + iChannel*3 + 0] = src8[iChannel][iFrame*3 + 0]; - dst8[iFrame*3*channels + iChannel*3 + 1] = src8[iChannel][iFrame*3 + 1]; - dst8[iFrame*3*channels + iChannel*3 + 2] = src8[iChannel][iFrame*3 + 2]; - } - } -} - -static MA_INLINE void ma_pcm_interleave_s24__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_interleave_s24__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_interleave_s24(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_interleave_s24__reference(dst, src, frameCount, channels); -#else - ma_pcm_interleave_s24__optimized(dst, src, frameCount, channels); -#endif -} - - -static MA_INLINE void ma_pcm_deinterleave_s24__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_uint8** dst8 = (ma_uint8**)dst; - const ma_uint8* src8 = (const ma_uint8*)src; - - ma_uint32 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst8[iChannel][iFrame*3 + 0] = src8[iFrame*3*channels + iChannel*3 + 0]; - dst8[iChannel][iFrame*3 + 1] = src8[iFrame*3*channels + iChannel*3 + 1]; - dst8[iChannel][iFrame*3 + 2] = src8[iFrame*3*channels + iChannel*3 + 2]; - } - } -} - -static MA_INLINE void ma_pcm_deinterleave_s24__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_deinterleave_s24__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_deinterleave_s24(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_deinterleave_s24__reference(dst, src, frameCount, channels); -#else - ma_pcm_deinterleave_s24__optimized(dst, src, frameCount, channels); -#endif -} - - - -/* s32 */ -static MA_INLINE void ma_pcm_s32_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint8* dst_u8 = (ma_uint8*)dst; - const ma_int32* src_s32 = (const ma_int32*)src; - - if (ditherMode == ma_dither_mode_none) { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 x = src_s32[i]; - x = x >> 24; - x = x + 128; - dst_u8[i] = (ma_uint8)x; - } - } else { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 x = src_s32[i]; - - /* Dither. Don't overflow. */ - ma_int32 dither = ma_dither_s32(ditherMode, -0x800000, 0x7FFFFF); - if ((ma_int64)x + dither <= 0x7FFFFFFF) { - x = x + dither; - } else { - x = 0x7FFFFFFF; - } - - x = x >> 24; - x = x + 128; - dst_u8[i] = (ma_uint8)x; - } - } -} - -static MA_INLINE void ma_pcm_s32_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_u8__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s32_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s32_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s32_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s32_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s32_to_u8__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s32_to_u8__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s32_to_u8__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s32_to_u8__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_s32_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_int16* dst_s16 = (ma_int16*)dst; - const ma_int32* src_s32 = (const ma_int32*)src; - - if (ditherMode == ma_dither_mode_none) { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 x = src_s32[i]; - x = x >> 16; - dst_s16[i] = (ma_int16)x; - } - } else { - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 x = src_s32[i]; - - /* Dither. Don't overflow. */ - ma_int32 dither = ma_dither_s32(ditherMode, -0x8000, 0x7FFF); - if ((ma_int64)x + dither <= 0x7FFFFFFF) { - x = x + dither; - } else { - x = 0x7FFFFFFF; - } - - x = x >> 16; - dst_s16[i] = (ma_int16)x; - } - } -} - -static MA_INLINE void ma_pcm_s32_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s16__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s32_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s32_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s32_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s32_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s32_to_s16__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s32_to_s16__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s32_to_s16__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s32_to_s16__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_s32_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint8* dst_s24 = (ma_uint8*)dst; - const ma_int32* src_s32 = (const ma_int32*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_uint32 x = (ma_uint32)src_s32[i]; - dst_s24[i*3+0] = (ma_uint8)((x & 0x0000FF00) >> 8); - dst_s24[i*3+1] = (ma_uint8)((x & 0x00FF0000) >> 16); - dst_s24[i*3+2] = (ma_uint8)((x & 0xFF000000) >> 24); - } - - (void)ditherMode; /* No dithering for s32 -> s24. */ -} - -static MA_INLINE void ma_pcm_s32_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s24__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s32_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s32_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s32_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s32_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s32_to_s24__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s32_to_s24__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s32_to_s24__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s32_to_s24__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode); - } -#endif -} - - -MA_API void ma_pcm_s32_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - (void)ditherMode; - - ma_copy_memory_64(dst, src, count * sizeof(ma_int32)); -} - - -static MA_INLINE void ma_pcm_s32_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - float* dst_f32 = (float*)dst; - const ma_int32* src_s32 = (const ma_int32*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - double x = src_s32[i]; - -#if 0 - x = x + 2147483648.0; - x = x * 0.0000000004656612873077392578125; - x = x - 1; -#else - x = x / 2147483648.0; -#endif - - dst_f32[i] = (float)x; - } - - (void)ditherMode; /* No dithering for s32 -> f32. */ -} - -static MA_INLINE void ma_pcm_s32_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_f32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_s32_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_s32_to_f32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_s32_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_s32_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_s32_to_f32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_s32_to_f32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_s32_to_f32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_s32_to_f32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_interleave_s32__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_int32* dst_s32 = (ma_int32*)dst; - const ma_int32** src_s32 = (const ma_int32**)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_s32[iFrame*channels + iChannel] = src_s32[iChannel][iFrame]; - } - } -} - -static MA_INLINE void ma_pcm_interleave_s32__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_interleave_s32__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_interleave_s32(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_interleave_s32__reference(dst, src, frameCount, channels); -#else - ma_pcm_interleave_s32__optimized(dst, src, frameCount, channels); -#endif -} - - -static MA_INLINE void ma_pcm_deinterleave_s32__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_int32** dst_s32 = (ma_int32**)dst; - const ma_int32* src_s32 = (const ma_int32*)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_s32[iChannel][iFrame] = src_s32[iFrame*channels + iChannel]; - } - } -} - -static MA_INLINE void ma_pcm_deinterleave_s32__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_deinterleave_s32__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_deinterleave_s32(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_deinterleave_s32__reference(dst, src, frameCount, channels); -#else - ma_pcm_deinterleave_s32__optimized(dst, src, frameCount, channels); -#endif -} - - -/* f32 */ -static MA_INLINE void ma_pcm_f32_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint64 i; - - ma_uint8* dst_u8 = (ma_uint8*)dst; - const float* src_f32 = (const float*)src; - - float ditherMin = 0; - float ditherMax = 0; - if (ditherMode != ma_dither_mode_none) { - ditherMin = 1.0f / -128; - ditherMax = 1.0f / 127; - } - - for (i = 0; i < count; i += 1) { - float x = src_f32[i]; - x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax); - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - x = x + 1; /* -1..1 to 0..2 */ - x = x * 127.5f; /* 0..2 to 0..255 */ - - dst_u8[i] = (ma_uint8)x; - } -} - -static MA_INLINE void ma_pcm_f32_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_u8__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_f32_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_f32_to_u8__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_f32_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_f32_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_f32_to_u8__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_f32_to_u8__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_f32_to_u8__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_f32_to_u8__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode); - } -#endif -} - -#ifdef MA_USE_REFERENCE_CONVERSION_APIS -static MA_INLINE void ma_pcm_f32_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint64 i; - - ma_int16* dst_s16 = (ma_int16*)dst; - const float* src_f32 = (const float*)src; - - float ditherMin = 0; - float ditherMax = 0; - if (ditherMode != ma_dither_mode_none) { - ditherMin = 1.0f / -32768; - ditherMax = 1.0f / 32767; - } - - for (i = 0; i < count; i += 1) { - float x = src_f32[i]; - x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax); - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - -#if 0 - /* The accurate way. */ - x = x + 1; /* -1..1 to 0..2 */ - x = x * 32767.5f; /* 0..2 to 0..65535 */ - x = x - 32768.0f; /* 0...65535 to -32768..32767 */ -#else - /* The fast way. */ - x = x * 32767.0f; /* -1..1 to -32767..32767 */ -#endif - - dst_s16[i] = (ma_int16)x; - } -} -#else -static MA_INLINE void ma_pcm_f32_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint64 i; - ma_uint64 i4; - ma_uint64 count4; - - ma_int16* dst_s16 = (ma_int16*)dst; - const float* src_f32 = (const float*)src; - - float ditherMin = 0; - float ditherMax = 0; - if (ditherMode != ma_dither_mode_none) { - ditherMin = 1.0f / -32768; - ditherMax = 1.0f / 32767; - } - - /* Unrolled. */ - i = 0; - count4 = count >> 2; - for (i4 = 0; i4 < count4; i4 += 1) { - float d0 = ma_dither_f32(ditherMode, ditherMin, ditherMax); - float d1 = ma_dither_f32(ditherMode, ditherMin, ditherMax); - float d2 = ma_dither_f32(ditherMode, ditherMin, ditherMax); - float d3 = ma_dither_f32(ditherMode, ditherMin, ditherMax); - - float x0 = src_f32[i+0]; - float x1 = src_f32[i+1]; - float x2 = src_f32[i+2]; - float x3 = src_f32[i+3]; - - x0 = x0 + d0; - x1 = x1 + d1; - x2 = x2 + d2; - x3 = x3 + d3; - - x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0)); - x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1)); - x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2)); - x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3)); - - x0 = x0 * 32767.0f; - x1 = x1 * 32767.0f; - x2 = x2 * 32767.0f; - x3 = x3 * 32767.0f; - - dst_s16[i+0] = (ma_int16)x0; - dst_s16[i+1] = (ma_int16)x1; - dst_s16[i+2] = (ma_int16)x2; - dst_s16[i+3] = (ma_int16)x3; - - i += 4; - } - - /* Leftover. */ - for (; i < count; i += 1) { - float x = src_f32[i]; - x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax); - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - x = x * 32767.0f; /* -1..1 to -32767..32767 */ - - dst_s16[i] = (ma_int16)x; - } -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_f32_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint64 i; - ma_uint64 i8; - ma_uint64 count8; - ma_int16* dst_s16; - const float* src_f32; - float ditherMin; - float ditherMax; - - /* Both the input and output buffers need to be aligned to 16 bytes. */ - if ((((ma_uintptr)dst & 15) != 0) || (((ma_uintptr)src & 15) != 0)) { - ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode); - return; - } - - dst_s16 = (ma_int16*)dst; - src_f32 = (const float*)src; - - ditherMin = 0; - ditherMax = 0; - if (ditherMode != ma_dither_mode_none) { - ditherMin = 1.0f / -32768; - ditherMax = 1.0f / 32767; - } - - i = 0; - - /* SSE2. SSE allows us to output 8 s16's at a time which means our loop is unrolled 8 times. */ - count8 = count >> 3; - for (i8 = 0; i8 < count8; i8 += 1) { - __m128 d0; - __m128 d1; - __m128 x0; - __m128 x1; - - if (ditherMode == ma_dither_mode_none) { - d0 = _mm_set1_ps(0); - d1 = _mm_set1_ps(0); - } else if (ditherMode == ma_dither_mode_rectangle) { - d0 = _mm_set_ps( - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax) - ); - d1 = _mm_set_ps( - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax) - ); - } else { - d0 = _mm_set_ps( - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax) - ); - d1 = _mm_set_ps( - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax) - ); - } - - x0 = *((__m128*)(src_f32 + i) + 0); - x1 = *((__m128*)(src_f32 + i) + 1); - - x0 = _mm_add_ps(x0, d0); - x1 = _mm_add_ps(x1, d1); - - x0 = _mm_mul_ps(x0, _mm_set1_ps(32767.0f)); - x1 = _mm_mul_ps(x1, _mm_set1_ps(32767.0f)); - - _mm_stream_si128(((__m128i*)(dst_s16 + i)), _mm_packs_epi32(_mm_cvttps_epi32(x0), _mm_cvttps_epi32(x1))); - - i += 8; - } - - - /* Leftover. */ - for (; i < count; i += 1) { - float x = src_f32[i]; - x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax); - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - x = x * 32767.0f; /* -1..1 to -32767..32767 */ - - dst_s16[i] = (ma_int16)x; - } -} -#endif /* SSE2 */ - -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_f32_to_s16__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint64 i; - ma_uint64 i16; - ma_uint64 count16; - ma_int16* dst_s16; - const float* src_f32; - float ditherMin; - float ditherMax; - - /* Both the input and output buffers need to be aligned to 32 bytes. */ - if ((((ma_uintptr)dst & 31) != 0) || (((ma_uintptr)src & 31) != 0)) { - ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode); - return; - } - - dst_s16 = (ma_int16*)dst; - src_f32 = (const float*)src; - - ditherMin = 0; - ditherMax = 0; - if (ditherMode != ma_dither_mode_none) { - ditherMin = 1.0f / -32768; - ditherMax = 1.0f / 32767; - } - - i = 0; - - /* AVX2. AVX2 allows us to output 16 s16's at a time which means our loop is unrolled 16 times. */ - count16 = count >> 4; - for (i16 = 0; i16 < count16; i16 += 1) { - __m256 d0; - __m256 d1; - __m256 x0; - __m256 x1; - __m256i i0; - __m256i i1; - __m256i p0; - __m256i p1; - __m256i r; - - if (ditherMode == ma_dither_mode_none) { - d0 = _mm256_set1_ps(0); - d1 = _mm256_set1_ps(0); - } else if (ditherMode == ma_dither_mode_rectangle) { - d0 = _mm256_set_ps( - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax) - ); - d1 = _mm256_set_ps( - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax), - ma_dither_f32_rectangle(ditherMin, ditherMax) - ); - } else { - d0 = _mm256_set_ps( - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax) - ); - d1 = _mm256_set_ps( - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax), - ma_dither_f32_triangle(ditherMin, ditherMax) - ); - } - - x0 = *((__m256*)(src_f32 + i) + 0); - x1 = *((__m256*)(src_f32 + i) + 1); - - x0 = _mm256_add_ps(x0, d0); - x1 = _mm256_add_ps(x1, d1); - - x0 = _mm256_mul_ps(x0, _mm256_set1_ps(32767.0f)); - x1 = _mm256_mul_ps(x1, _mm256_set1_ps(32767.0f)); - - /* Computing the final result is a little more complicated for AVX2 than SSE2. */ - i0 = _mm256_cvttps_epi32(x0); - i1 = _mm256_cvttps_epi32(x1); - p0 = _mm256_permute2x128_si256(i0, i1, 0 | 32); - p1 = _mm256_permute2x128_si256(i0, i1, 1 | 48); - r = _mm256_packs_epi32(p0, p1); - - _mm256_stream_si256(((__m256i*)(dst_s16 + i)), r); - - i += 16; - } - - - /* Leftover. */ - for (; i < count; i += 1) { - float x = src_f32[i]; - x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax); - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - x = x * 32767.0f; /* -1..1 to -32767..32767 */ - - dst_s16[i] = (ma_int16)x; - } -} -#endif /* AVX2 */ - -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_f32_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint64 i; - ma_uint64 i8; - ma_uint64 count8; - ma_int16* dst_s16; - const float* src_f32; - float ditherMin; - float ditherMax; - - if (!ma_has_neon()) { - return ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode); - } - - /* Both the input and output buffers need to be aligned to 16 bytes. */ - if ((((ma_uintptr)dst & 15) != 0) || (((ma_uintptr)src & 15) != 0)) { - ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode); - return; - } - - dst_s16 = (ma_int16*)dst; - src_f32 = (const float*)src; - - ditherMin = 0; - ditherMax = 0; - if (ditherMode != ma_dither_mode_none) { - ditherMin = 1.0f / -32768; - ditherMax = 1.0f / 32767; - } - - i = 0; - - /* NEON. NEON allows us to output 8 s16's at a time which means our loop is unrolled 8 times. */ - count8 = count >> 3; - for (i8 = 0; i8 < count8; i8 += 1) { - float32x4_t d0; - float32x4_t d1; - float32x4_t x0; - float32x4_t x1; - int32x4_t i0; - int32x4_t i1; - - if (ditherMode == ma_dither_mode_none) { - d0 = vmovq_n_f32(0); - d1 = vmovq_n_f32(0); - } else if (ditherMode == ma_dither_mode_rectangle) { - float d0v[4]; - d0v[0] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d0v[1] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d0v[2] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d0v[3] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d0 = vld1q_f32(d0v); - - float d1v[4]; - d1v[0] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d1v[1] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d1v[2] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d1v[3] = ma_dither_f32_rectangle(ditherMin, ditherMax); - d1 = vld1q_f32(d1v); - } else { - float d0v[4]; - d0v[0] = ma_dither_f32_triangle(ditherMin, ditherMax); - d0v[1] = ma_dither_f32_triangle(ditherMin, ditherMax); - d0v[2] = ma_dither_f32_triangle(ditherMin, ditherMax); - d0v[3] = ma_dither_f32_triangle(ditherMin, ditherMax); - d0 = vld1q_f32(d0v); - - float d1v[4]; - d1v[0] = ma_dither_f32_triangle(ditherMin, ditherMax); - d1v[1] = ma_dither_f32_triangle(ditherMin, ditherMax); - d1v[2] = ma_dither_f32_triangle(ditherMin, ditherMax); - d1v[3] = ma_dither_f32_triangle(ditherMin, ditherMax); - d1 = vld1q_f32(d1v); - } - - x0 = *((float32x4_t*)(src_f32 + i) + 0); - x1 = *((float32x4_t*)(src_f32 + i) + 1); - - x0 = vaddq_f32(x0, d0); - x1 = vaddq_f32(x1, d1); - - x0 = vmulq_n_f32(x0, 32767.0f); - x1 = vmulq_n_f32(x1, 32767.0f); - - i0 = vcvtq_s32_f32(x0); - i1 = vcvtq_s32_f32(x1); - *((int16x8_t*)(dst_s16 + i)) = vcombine_s16(vqmovn_s32(i0), vqmovn_s32(i1)); - - i += 8; - } - - - /* Leftover. */ - for (; i < count; i += 1) { - float x = src_f32[i]; - x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax); - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - x = x * 32767.0f; /* -1..1 to -32767..32767 */ - - dst_s16[i] = (ma_int16)x; - } -} -#endif /* Neon */ -#endif /* MA_USE_REFERENCE_CONVERSION_APIS */ - -MA_API void ma_pcm_f32_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_f32_to_s16__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_f32_to_s16__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_f32_to_s16__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_f32_to_s16__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_f32_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_uint8* dst_s24 = (ma_uint8*)dst; - const float* src_f32 = (const float*)src; - - ma_uint64 i; - for (i = 0; i < count; i += 1) { - ma_int32 r; - float x = src_f32[i]; - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - -#if 0 - /* The accurate way. */ - x = x + 1; /* -1..1 to 0..2 */ - x = x * 8388607.5f; /* 0..2 to 0..16777215 */ - x = x - 8388608.0f; /* 0..16777215 to -8388608..8388607 */ -#else - /* The fast way. */ - x = x * 8388607.0f; /* -1..1 to -8388607..8388607 */ -#endif - - r = (ma_int32)x; - dst_s24[(i*3)+0] = (ma_uint8)((r & 0x0000FF) >> 0); - dst_s24[(i*3)+1] = (ma_uint8)((r & 0x00FF00) >> 8); - dst_s24[(i*3)+2] = (ma_uint8)((r & 0xFF0000) >> 16); - } - - (void)ditherMode; /* No dithering for f32 -> s24. */ -} - -static MA_INLINE void ma_pcm_f32_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s24__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_f32_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_f32_to_s24__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_f32_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_f32_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_f32_to_s24__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_f32_to_s24__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_f32_to_s24__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_f32_to_s24__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode); - } -#endif -} - - -static MA_INLINE void ma_pcm_f32_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_int32* dst_s32 = (ma_int32*)dst; - const float* src_f32 = (const float*)src; - - ma_uint32 i; - for (i = 0; i < count; i += 1) { - double x = src_f32[i]; - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); /* clip */ - -#if 0 - /* The accurate way. */ - x = x + 1; /* -1..1 to 0..2 */ - x = x * 2147483647.5; /* 0..2 to 0..4294967295 */ - x = x - 2147483648.0; /* 0...4294967295 to -2147483648..2147483647 */ -#else - /* The fast way. */ - x = x * 2147483647.0; /* -1..1 to -2147483647..2147483647 */ -#endif - - dst_s32[i] = (ma_int32)x; - } - - (void)ditherMode; /* No dithering for f32 -> s32. */ -} - -static MA_INLINE void ma_pcm_f32_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s32__reference(dst, src, count, ditherMode); -} - -#if defined(MA_SUPPORT_SSE2) -static MA_INLINE void ma_pcm_f32_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_AVX2) -static MA_INLINE void ma_pcm_f32_to_s32__avx2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode); -} -#endif -#if defined(MA_SUPPORT_NEON) -static MA_INLINE void ma_pcm_f32_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode); -} -#endif - -MA_API void ma_pcm_f32_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_f32_to_s32__reference(dst, src, count, ditherMode); -#else - # if MA_PREFERRED_SIMD == MA_SIMD_AVX2 - if (ma_has_avx2()) { - ma_pcm_f32_to_s32__avx2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_SSE2 - if (ma_has_sse2()) { - ma_pcm_f32_to_s32__sse2(dst, src, count, ditherMode); - } else - #elif MA_PREFERRED_SIMD == MA_SIMD_NEON - if (ma_has_neon()) { - ma_pcm_f32_to_s32__neon(dst, src, count, ditherMode); - } else - #endif - { - ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode); - } -#endif -} - - -MA_API void ma_pcm_f32_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode) -{ - (void)ditherMode; - - ma_copy_memory_64(dst, src, count * sizeof(float)); -} - - -static void ma_pcm_interleave_f32__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - float* dst_f32 = (float*)dst; - const float** src_f32 = (const float**)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_f32[iFrame*channels + iChannel] = src_f32[iChannel][iFrame]; - } - } -} - -static void ma_pcm_interleave_f32__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_interleave_f32__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_interleave_f32(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_interleave_f32__reference(dst, src, frameCount, channels); -#else - ma_pcm_interleave_f32__optimized(dst, src, frameCount, channels); -#endif -} - - -static void ma_pcm_deinterleave_f32__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - float** dst_f32 = (float**)dst; - const float* src_f32 = (const float*)src; - - ma_uint64 iFrame; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; iChannel += 1) { - dst_f32[iChannel][iFrame] = src_f32[iFrame*channels + iChannel]; - } - } -} - -static void ma_pcm_deinterleave_f32__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ - ma_pcm_deinterleave_f32__reference(dst, src, frameCount, channels); -} - -MA_API void ma_pcm_deinterleave_f32(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels) -{ -#ifdef MA_USE_REFERENCE_CONVERSION_APIS - ma_pcm_deinterleave_f32__reference(dst, src, frameCount, channels); -#else - ma_pcm_deinterleave_f32__optimized(dst, src, frameCount, channels); -#endif -} - - -MA_API void ma_pcm_convert(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 sampleCount, ma_dither_mode ditherMode) -{ - if (formatOut == formatIn) { - ma_copy_memory_64(pOut, pIn, sampleCount * ma_get_bytes_per_sample(formatOut)); - return; - } - - switch (formatIn) - { - case ma_format_u8: - { - switch (formatOut) - { - case ma_format_s16: ma_pcm_u8_to_s16(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s24: ma_pcm_u8_to_s24(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s32: ma_pcm_u8_to_s32(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_f32: ma_pcm_u8_to_f32(pOut, pIn, sampleCount, ditherMode); return; - default: break; - } - } break; - - case ma_format_s16: - { - switch (formatOut) - { - case ma_format_u8: ma_pcm_s16_to_u8( pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s24: ma_pcm_s16_to_s24(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s32: ma_pcm_s16_to_s32(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_f32: ma_pcm_s16_to_f32(pOut, pIn, sampleCount, ditherMode); return; - default: break; - } - } break; - - case ma_format_s24: - { - switch (formatOut) - { - case ma_format_u8: ma_pcm_s24_to_u8( pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s16: ma_pcm_s24_to_s16(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s32: ma_pcm_s24_to_s32(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_f32: ma_pcm_s24_to_f32(pOut, pIn, sampleCount, ditherMode); return; - default: break; - } - } break; - - case ma_format_s32: - { - switch (formatOut) - { - case ma_format_u8: ma_pcm_s32_to_u8( pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s16: ma_pcm_s32_to_s16(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s24: ma_pcm_s32_to_s24(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_f32: ma_pcm_s32_to_f32(pOut, pIn, sampleCount, ditherMode); return; - default: break; - } - } break; - - case ma_format_f32: - { - switch (formatOut) - { - case ma_format_u8: ma_pcm_f32_to_u8( pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s16: ma_pcm_f32_to_s16(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s24: ma_pcm_f32_to_s24(pOut, pIn, sampleCount, ditherMode); return; - case ma_format_s32: ma_pcm_f32_to_s32(pOut, pIn, sampleCount, ditherMode); return; - default: break; - } - } break; - - default: break; - } -} - -MA_API void ma_convert_pcm_frames_format(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 frameCount, ma_uint32 channels, ma_dither_mode ditherMode) -{ - ma_pcm_convert(pOut, formatOut, pIn, formatIn, frameCount * channels, ditherMode); -} - -MA_API void ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void* pInterleavedPCMFrames, void** ppDeinterleavedPCMFrames) -{ - if (pInterleavedPCMFrames == NULL || ppDeinterleavedPCMFrames == NULL) { - return; /* Invalid args. */ - } - - /* For efficiency we do this per format. */ - switch (format) { - case ma_format_s16: - { - const ma_int16* pSrcS16 = (const ma_int16*)pInterleavedPCMFrames; - ma_uint64 iPCMFrame; - for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - ma_int16* pDstS16 = (ma_int16*)ppDeinterleavedPCMFrames[iChannel]; - pDstS16[iPCMFrame] = pSrcS16[iPCMFrame*channels+iChannel]; - } - } - } break; - - case ma_format_f32: - { - const float* pSrcF32 = (const float*)pInterleavedPCMFrames; - ma_uint64 iPCMFrame; - for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - float* pDstF32 = (float*)ppDeinterleavedPCMFrames[iChannel]; - pDstF32[iPCMFrame] = pSrcF32[iPCMFrame*channels+iChannel]; - } - } - } break; - - default: - { - ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format); - ma_uint64 iPCMFrame; - for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - void* pDst = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes); - const void* pSrc = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes); - memcpy(pDst, pSrc, sampleSizeInBytes); - } - } - } break; - } -} - -MA_API void ma_interleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void** ppDeinterleavedPCMFrames, void* pInterleavedPCMFrames) -{ - switch (format) - { - case ma_format_s16: - { - ma_int16* pDstS16 = (ma_int16*)pInterleavedPCMFrames; - ma_uint64 iPCMFrame; - for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - const ma_int16* pSrcS16 = (const ma_int16*)ppDeinterleavedPCMFrames[iChannel]; - pDstS16[iPCMFrame*channels+iChannel] = pSrcS16[iPCMFrame]; - } - } - } break; - - case ma_format_f32: - { - float* pDstF32 = (float*)pInterleavedPCMFrames; - ma_uint64 iPCMFrame; - for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - const float* pSrcF32 = (const float*)ppDeinterleavedPCMFrames[iChannel]; - pDstF32[iPCMFrame*channels+iChannel] = pSrcF32[iPCMFrame]; - } - } - } break; - - default: - { - ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format); - ma_uint64 iPCMFrame; - for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - void* pDst = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes); - const void* pSrc = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes); - memcpy(pDst, pSrc, sampleSizeInBytes); - } - } - } break; - } -} - - -/************************************************************************************************************************************************************** - -Biquad Filter - -**************************************************************************************************************************************************************/ -#ifndef MA_BIQUAD_FIXED_POINT_SHIFT -#define MA_BIQUAD_FIXED_POINT_SHIFT 14 -#endif - -static ma_int32 ma_biquad_float_to_fp(double x) -{ - return (ma_int32)(x * (1 << MA_BIQUAD_FIXED_POINT_SHIFT)); -} - -MA_API ma_biquad_config ma_biquad_config_init(ma_format format, ma_uint32 channels, double b0, double b1, double b2, double a0, double a1, double a2) -{ - ma_biquad_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.b0 = b0; - config.b1 = b1; - config.b2 = b2; - config.a0 = a0; - config.a1 = a1; - config.a2 = a2; - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t r1Offset; - size_t r2Offset; -} ma_biquad_heap_layout; - -static ma_result ma_biquad_get_heap_layout(const ma_biquad_config* pConfig, ma_biquad_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* R0 */ - pHeapLayout->r1Offset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels; - - /* R1 */ - pHeapLayout->r2Offset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels; - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_biquad_get_heap_size(const ma_biquad_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_biquad_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_biquad_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_biquad_init_preallocated(const ma_biquad_config* pConfig, void* pHeap, ma_biquad* pBQ) -{ - ma_result result; - ma_biquad_heap_layout heapLayout; - - if (pBQ == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pBQ); - - result = ma_biquad_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pBQ->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pBQ->pR1 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r1Offset); - pBQ->pR2 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r2Offset); - - return ma_biquad_reinit(pConfig, pBQ); -} - -MA_API ma_result ma_biquad_init(const ma_biquad_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad* pBQ) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_biquad_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_biquad_init_preallocated(pConfig, pHeap, pBQ); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pBQ->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_biquad_uninit(ma_biquad* pBQ, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pBQ == NULL) { - return; - } - - if (pBQ->_ownsHeap) { - ma_free(pBQ->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_biquad_reinit(const ma_biquad_config* pConfig, ma_biquad* pBQ) -{ - if (pBQ == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->a0 == 0) { - return MA_INVALID_ARGS; /* Division by zero. */ - } - - /* Only supporting f32 and s16. */ - if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) { - return MA_INVALID_ARGS; - } - - /* The format cannot be changed after initialization. */ - if (pBQ->format != ma_format_unknown && pBQ->format != pConfig->format) { - return MA_INVALID_OPERATION; - } - - /* The channel count cannot be changed after initialization. */ - if (pBQ->channels != 0 && pBQ->channels != pConfig->channels) { - return MA_INVALID_OPERATION; - } - - - pBQ->format = pConfig->format; - pBQ->channels = pConfig->channels; - - /* Normalize. */ - if (pConfig->format == ma_format_f32) { - pBQ->b0.f32 = (float)(pConfig->b0 / pConfig->a0); - pBQ->b1.f32 = (float)(pConfig->b1 / pConfig->a0); - pBQ->b2.f32 = (float)(pConfig->b2 / pConfig->a0); - pBQ->a1.f32 = (float)(pConfig->a1 / pConfig->a0); - pBQ->a2.f32 = (float)(pConfig->a2 / pConfig->a0); - } else { - pBQ->b0.s32 = ma_biquad_float_to_fp(pConfig->b0 / pConfig->a0); - pBQ->b1.s32 = ma_biquad_float_to_fp(pConfig->b1 / pConfig->a0); - pBQ->b2.s32 = ma_biquad_float_to_fp(pConfig->b2 / pConfig->a0); - pBQ->a1.s32 = ma_biquad_float_to_fp(pConfig->a1 / pConfig->a0); - pBQ->a2.s32 = ma_biquad_float_to_fp(pConfig->a2 / pConfig->a0); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_biquad_clear_cache(ma_biquad* pBQ) -{ - if (pBQ == NULL) { - return MA_INVALID_ARGS; - } - - if (pBQ->format == ma_format_f32) { - pBQ->pR1->f32 = 0; - pBQ->pR2->f32 = 0; - } else { - pBQ->pR1->s32 = 0; - pBQ->pR2->s32 = 0; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_biquad_process_pcm_frame_f32__direct_form_2_transposed(ma_biquad* pBQ, float* pY, const float* pX) -{ - ma_uint32 c; - const ma_uint32 channels = pBQ->channels; - const float b0 = pBQ->b0.f32; - const float b1 = pBQ->b1.f32; - const float b2 = pBQ->b2.f32; - const float a1 = pBQ->a1.f32; - const float a2 = pBQ->a2.f32; - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - float r1 = pBQ->pR1[c].f32; - float r2 = pBQ->pR2[c].f32; - float x = pX[c]; - float y; - - y = b0*x + r1; - r1 = b1*x - a1*y + r2; - r2 = b2*x - a2*y; - - pY[c] = y; - pBQ->pR1[c].f32 = r1; - pBQ->pR2[c].f32 = r2; - } -} - -static MA_INLINE void ma_biquad_process_pcm_frame_f32(ma_biquad* pBQ, float* pY, const float* pX) -{ - ma_biquad_process_pcm_frame_f32__direct_form_2_transposed(pBQ, pY, pX); -} - -static MA_INLINE void ma_biquad_process_pcm_frame_s16__direct_form_2_transposed(ma_biquad* pBQ, ma_int16* pY, const ma_int16* pX) -{ - ma_uint32 c; - const ma_uint32 channels = pBQ->channels; - const ma_int32 b0 = pBQ->b0.s32; - const ma_int32 b1 = pBQ->b1.s32; - const ma_int32 b2 = pBQ->b2.s32; - const ma_int32 a1 = pBQ->a1.s32; - const ma_int32 a2 = pBQ->a2.s32; - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - ma_int32 r1 = pBQ->pR1[c].s32; - ma_int32 r2 = pBQ->pR2[c].s32; - ma_int32 x = pX[c]; - ma_int32 y; - - y = (b0*x + r1) >> MA_BIQUAD_FIXED_POINT_SHIFT; - r1 = (b1*x - a1*y + r2); - r2 = (b2*x - a2*y); - - pY[c] = (ma_int16)ma_clamp(y, -32768, 32767); - pBQ->pR1[c].s32 = r1; - pBQ->pR2[c].s32 = r2; - } -} - -static MA_INLINE void ma_biquad_process_pcm_frame_s16(ma_biquad* pBQ, ma_int16* pY, const ma_int16* pX) -{ - ma_biquad_process_pcm_frame_s16__direct_form_2_transposed(pBQ, pY, pX); -} - -MA_API ma_result ma_biquad_process_pcm_frames(ma_biquad* pBQ, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_uint32 n; - - if (pBQ == NULL || pFramesOut == NULL || pFramesIn == NULL) { - return MA_INVALID_ARGS; - } - - /* Note that the logic below needs to support in-place filtering. That is, it must support the case where pFramesOut and pFramesIn are the same. */ - - if (pBQ->format == ma_format_f32) { - /* */ float* pY = ( float*)pFramesOut; - const float* pX = (const float*)pFramesIn; - - for (n = 0; n < frameCount; n += 1) { - ma_biquad_process_pcm_frame_f32__direct_form_2_transposed(pBQ, pY, pX); - pY += pBQ->channels; - pX += pBQ->channels; - } - } else if (pBQ->format == ma_format_s16) { - /* */ ma_int16* pY = ( ma_int16*)pFramesOut; - const ma_int16* pX = (const ma_int16*)pFramesIn; - - for (n = 0; n < frameCount; n += 1) { - ma_biquad_process_pcm_frame_s16__direct_form_2_transposed(pBQ, pY, pX); - pY += pBQ->channels; - pX += pBQ->channels; - } - } else { - MA_ASSERT(MA_FALSE); - return MA_INVALID_ARGS; /* Format not supported. Should never hit this because it's checked in ma_biquad_init() and ma_biquad_reinit(). */ - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_biquad_get_latency(const ma_biquad* pBQ) -{ - if (pBQ == NULL) { - return 0; - } - - return 2; -} - - -/************************************************************************************************************************************************************** - -Low-Pass Filter - -**************************************************************************************************************************************************************/ -MA_API ma_lpf1_config ma_lpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency) -{ - ma_lpf1_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - config.q = 0.5; - - return config; -} - -MA_API ma_lpf2_config ma_lpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q) -{ - ma_lpf2_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - config.q = q; - - /* Q cannot be 0 or else it'll result in a division by 0. In this case just default to 0.707107. */ - if (config.q == 0) { - config.q = 0.707107; - } - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t r1Offset; -} ma_lpf1_heap_layout; - -static ma_result ma_lpf1_get_heap_layout(const ma_lpf1_config* pConfig, ma_lpf1_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* R1 */ - pHeapLayout->r1Offset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels; - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_lpf1_get_heap_size(const ma_lpf1_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_lpf1_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_lpf1_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_lpf1_init_preallocated(const ma_lpf1_config* pConfig, void* pHeap, ma_lpf1* pLPF) -{ - ma_result result; - ma_lpf1_heap_layout heapLayout; - - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pLPF); - - result = ma_lpf1_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pLPF->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pLPF->pR1 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r1Offset); - - return ma_lpf1_reinit(pConfig, pLPF); -} - -MA_API ma_result ma_lpf1_init(const ma_lpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf1* pLPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_lpf1_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_lpf1_init_preallocated(pConfig, pHeap, pLPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pLPF->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_lpf1_uninit(ma_lpf1* pLPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pLPF == NULL) { - return; - } - - if (pLPF->_ownsHeap) { - ma_free(pLPF->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_lpf1_reinit(const ma_lpf1_config* pConfig, ma_lpf1* pLPF) -{ - double a; - - if (pLPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Only supporting f32 and s16. */ - if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) { - return MA_INVALID_ARGS; - } - - /* The format cannot be changed after initialization. */ - if (pLPF->format != ma_format_unknown && pLPF->format != pConfig->format) { - return MA_INVALID_OPERATION; - } - - /* The channel count cannot be changed after initialization. */ - if (pLPF->channels != 0 && pLPF->channels != pConfig->channels) { - return MA_INVALID_OPERATION; - } - - pLPF->format = pConfig->format; - pLPF->channels = pConfig->channels; - - a = ma_expd(-2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate); - if (pConfig->format == ma_format_f32) { - pLPF->a.f32 = (float)a; - } else { - pLPF->a.s32 = ma_biquad_float_to_fp(a); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_lpf1_clear_cache(ma_lpf1* pLPF) -{ - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - if (pLPF->format == ma_format_f32) { - pLPF->a.f32 = 0; - } else { - pLPF->a.s32 = 0; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_lpf1_process_pcm_frame_f32(ma_lpf1* pLPF, float* pY, const float* pX) -{ - ma_uint32 c; - const ma_uint32 channels = pLPF->channels; - const float a = pLPF->a.f32; - const float b = 1 - a; - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - float r1 = pLPF->pR1[c].f32; - float x = pX[c]; - float y; - - y = b*x + a*r1; - - pY[c] = y; - pLPF->pR1[c].f32 = y; - } -} - -static MA_INLINE void ma_lpf1_process_pcm_frame_s16(ma_lpf1* pLPF, ma_int16* pY, const ma_int16* pX) -{ - ma_uint32 c; - const ma_uint32 channels = pLPF->channels; - const ma_int32 a = pLPF->a.s32; - const ma_int32 b = ((1 << MA_BIQUAD_FIXED_POINT_SHIFT) - a); - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - ma_int32 r1 = pLPF->pR1[c].s32; - ma_int32 x = pX[c]; - ma_int32 y; - - y = (b*x + a*r1) >> MA_BIQUAD_FIXED_POINT_SHIFT; - - pY[c] = (ma_int16)y; - pLPF->pR1[c].s32 = (ma_int32)y; - } -} - -MA_API ma_result ma_lpf1_process_pcm_frames(ma_lpf1* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_uint32 n; - - if (pLPF == NULL || pFramesOut == NULL || pFramesIn == NULL) { - return MA_INVALID_ARGS; - } - - /* Note that the logic below needs to support in-place filtering. That is, it must support the case where pFramesOut and pFramesIn are the same. */ - - if (pLPF->format == ma_format_f32) { - /* */ float* pY = ( float*)pFramesOut; - const float* pX = (const float*)pFramesIn; - - for (n = 0; n < frameCount; n += 1) { - ma_lpf1_process_pcm_frame_f32(pLPF, pY, pX); - pY += pLPF->channels; - pX += pLPF->channels; - } - } else if (pLPF->format == ma_format_s16) { - /* */ ma_int16* pY = ( ma_int16*)pFramesOut; - const ma_int16* pX = (const ma_int16*)pFramesIn; - - for (n = 0; n < frameCount; n += 1) { - ma_lpf1_process_pcm_frame_s16(pLPF, pY, pX); - pY += pLPF->channels; - pX += pLPF->channels; - } - } else { - MA_ASSERT(MA_FALSE); - return MA_INVALID_ARGS; /* Format not supported. Should never hit this because it's checked in ma_biquad_init() and ma_biquad_reinit(). */ - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_lpf1_get_latency(const ma_lpf1* pLPF) -{ - if (pLPF == NULL) { - return 0; - } - - return 1; -} - - -static MA_INLINE ma_biquad_config ma_lpf2__get_biquad_config(const ma_lpf2_config* pConfig) -{ - ma_biquad_config bqConfig; - double q; - double w; - double s; - double c; - double a; - - MA_ASSERT(pConfig != NULL); - - q = pConfig->q; - w = 2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate; - s = ma_sind(w); - c = ma_cosd(w); - a = s / (2*q); - - bqConfig.b0 = (1 - c) / 2; - bqConfig.b1 = 1 - c; - bqConfig.b2 = (1 - c) / 2; - bqConfig.a0 = 1 + a; - bqConfig.a1 = -2 * c; - bqConfig.a2 = 1 - a; - - bqConfig.format = pConfig->format; - bqConfig.channels = pConfig->channels; - - return bqConfig; -} - -MA_API ma_result ma_lpf2_get_heap_size(const ma_lpf2_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_biquad_config bqConfig; - bqConfig = ma_lpf2__get_biquad_config(pConfig); - - return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes); -} - -MA_API ma_result ma_lpf2_init_preallocated(const ma_lpf2_config* pConfig, void* pHeap, ma_lpf2* pLPF) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pLPF); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_lpf2__get_biquad_config(pConfig); - result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pLPF->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_lpf2_init(const ma_lpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf2* pLPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_lpf2_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_lpf2_init_preallocated(pConfig, pHeap, pLPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pLPF->bq._ownsHeap = MA_TRUE; /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */ - return MA_SUCCESS; -} - -MA_API void ma_lpf2_uninit(ma_lpf2* pLPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pLPF == NULL) { - return; - } - - ma_biquad_uninit(&pLPF->bq, pAllocationCallbacks); /* <-- This will free the heap allocation. */ -} - -MA_API ma_result ma_lpf2_reinit(const ma_lpf2_config* pConfig, ma_lpf2* pLPF) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pLPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_lpf2__get_biquad_config(pConfig); - result = ma_biquad_reinit(&bqConfig, &pLPF->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_lpf2_clear_cache(ma_lpf2* pLPF) -{ - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - ma_biquad_clear_cache(&pLPF->bq); - - return MA_SUCCESS; -} - -static MA_INLINE void ma_lpf2_process_pcm_frame_s16(ma_lpf2* pLPF, ma_int16* pFrameOut, const ma_int16* pFrameIn) -{ - ma_biquad_process_pcm_frame_s16(&pLPF->bq, pFrameOut, pFrameIn); -} - -static MA_INLINE void ma_lpf2_process_pcm_frame_f32(ma_lpf2* pLPF, float* pFrameOut, const float* pFrameIn) -{ - ma_biquad_process_pcm_frame_f32(&pLPF->bq, pFrameOut, pFrameIn); -} - -MA_API ma_result ma_lpf2_process_pcm_frames(ma_lpf2* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - return ma_biquad_process_pcm_frames(&pLPF->bq, pFramesOut, pFramesIn, frameCount); -} - -MA_API ma_uint32 ma_lpf2_get_latency(const ma_lpf2* pLPF) -{ - if (pLPF == NULL) { - return 0; - } - - return ma_biquad_get_latency(&pLPF->bq); -} - - -MA_API ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order) -{ - ma_lpf_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - config.order = ma_min(order, MA_MAX_FILTER_ORDER); - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t lpf1Offset; - size_t lpf2Offset; /* Offset of the first second order filter. Subsequent filters will come straight after, and will each have the same heap size. */ -} ma_lpf_heap_layout; - -static void ma_lpf_calculate_sub_lpf_counts(ma_uint32 order, ma_uint32* pLPF1Count, ma_uint32* pLPF2Count) -{ - MA_ASSERT(pLPF1Count != NULL); - MA_ASSERT(pLPF2Count != NULL); - - *pLPF1Count = order % 2; - *pLPF2Count = order / 2; -} - -static ma_result ma_lpf_get_heap_layout(const ma_lpf_config* pConfig, ma_lpf_heap_layout* pHeapLayout) -{ - ma_result result; - ma_uint32 lpf1Count; - ma_uint32 lpf2Count; - ma_uint32 ilpf1; - ma_uint32 ilpf2; - - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - if (pConfig->order > MA_MAX_FILTER_ORDER) { - return MA_INVALID_ARGS; - } - - ma_lpf_calculate_sub_lpf_counts(pConfig->order, &lpf1Count, &lpf2Count); - - pHeapLayout->sizeInBytes = 0; - - /* LPF 1 */ - pHeapLayout->lpf1Offset = pHeapLayout->sizeInBytes; - for (ilpf1 = 0; ilpf1 < lpf1Count; ilpf1 += 1) { - size_t lpf1HeapSizeInBytes; - ma_lpf1_config lpf1Config = ma_lpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency); - - result = ma_lpf1_get_heap_size(&lpf1Config, &lpf1HeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += sizeof(ma_lpf1) + lpf1HeapSizeInBytes; - } - - /* LPF 2*/ - pHeapLayout->lpf2Offset = pHeapLayout->sizeInBytes; - for (ilpf2 = 0; ilpf2 < lpf2Count; ilpf2 += 1) { - size_t lpf2HeapSizeInBytes; - ma_lpf2_config lpf2Config = ma_lpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, 0.707107); /* <-- The "q" parameter does not matter for the purpose of calculating the heap size. */ - - result = ma_lpf2_get_heap_size(&lpf2Config, &lpf2HeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += sizeof(ma_lpf2) + lpf2HeapSizeInBytes; - } - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -static ma_result ma_lpf_reinit__internal(const ma_lpf_config* pConfig, void* pHeap, ma_lpf* pLPF, ma_bool32 isNew) -{ - ma_result result; - ma_uint32 lpf1Count; - ma_uint32 lpf2Count; - ma_uint32 ilpf1; - ma_uint32 ilpf2; - ma_lpf_heap_layout heapLayout; /* Only used if isNew is true. */ - - if (pLPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Only supporting f32 and s16. */ - if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) { - return MA_INVALID_ARGS; - } - - /* The format cannot be changed after initialization. */ - if (pLPF->format != ma_format_unknown && pLPF->format != pConfig->format) { - return MA_INVALID_OPERATION; - } - - /* The channel count cannot be changed after initialization. */ - if (pLPF->channels != 0 && pLPF->channels != pConfig->channels) { - return MA_INVALID_OPERATION; - } - - if (pConfig->order > MA_MAX_FILTER_ORDER) { - return MA_INVALID_ARGS; - } - - ma_lpf_calculate_sub_lpf_counts(pConfig->order, &lpf1Count, &lpf2Count); - - /* The filter order can't change between reinits. */ - if (!isNew) { - if (pLPF->lpf1Count != lpf1Count || pLPF->lpf2Count != lpf2Count) { - return MA_INVALID_OPERATION; - } - } - - if (isNew) { - result = ma_lpf_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pLPF->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pLPF->pLPF1 = (ma_lpf1*)ma_offset_ptr(pHeap, heapLayout.lpf1Offset); - pLPF->pLPF2 = (ma_lpf2*)ma_offset_ptr(pHeap, heapLayout.lpf2Offset); - } else { - MA_ZERO_OBJECT(&heapLayout); /* To silence a compiler warning. */ - } - - for (ilpf1 = 0; ilpf1 < lpf1Count; ilpf1 += 1) { - ma_lpf1_config lpf1Config = ma_lpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency); - - if (isNew) { - size_t lpf1HeapSizeInBytes; - - result = ma_lpf1_get_heap_size(&lpf1Config, &lpf1HeapSizeInBytes); - if (result == MA_SUCCESS) { - result = ma_lpf1_init_preallocated(&lpf1Config, ma_offset_ptr(pHeap, heapLayout.lpf1Offset + (sizeof(ma_lpf1) * lpf1Count) + (ilpf1 * lpf1HeapSizeInBytes)), &pLPF->pLPF1[ilpf1]); - } - } else { - result = ma_lpf1_reinit(&lpf1Config, &pLPF->pLPF1[ilpf1]); - } - - if (result != MA_SUCCESS) { - ma_uint32 jlpf1; - - for (jlpf1 = 0; jlpf1 < ilpf1; jlpf1 += 1) { - ma_lpf1_uninit(&pLPF->pLPF1[jlpf1], NULL); /* No need for allocation callbacks here since we used a preallocated heap allocation. */ - } - - return result; - } - } - - for (ilpf2 = 0; ilpf2 < lpf2Count; ilpf2 += 1) { - ma_lpf2_config lpf2Config; - double q; - double a; - - /* Tempting to use 0.707107, but won't result in a Butterworth filter if the order is > 2. */ - if (lpf1Count == 1) { - a = (1 + ilpf2*1) * (MA_PI_D/(pConfig->order*1)); /* Odd order. */ - } else { - a = (1 + ilpf2*2) * (MA_PI_D/(pConfig->order*2)); /* Even order. */ - } - q = 1 / (2*ma_cosd(a)); - - lpf2Config = ma_lpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, q); - - if (isNew) { - size_t lpf2HeapSizeInBytes; - - result = ma_lpf2_get_heap_size(&lpf2Config, &lpf2HeapSizeInBytes); - if (result == MA_SUCCESS) { - result = ma_lpf2_init_preallocated(&lpf2Config, ma_offset_ptr(pHeap, heapLayout.lpf2Offset + (sizeof(ma_lpf2) * lpf2Count) + (ilpf2 * lpf2HeapSizeInBytes)), &pLPF->pLPF2[ilpf2]); - } - } else { - result = ma_lpf2_reinit(&lpf2Config, &pLPF->pLPF2[ilpf2]); - } - - if (result != MA_SUCCESS) { - ma_uint32 jlpf1; - ma_uint32 jlpf2; - - for (jlpf1 = 0; jlpf1 < lpf1Count; jlpf1 += 1) { - ma_lpf1_uninit(&pLPF->pLPF1[jlpf1], NULL); /* No need for allocation callbacks here since we used a preallocated heap allocation. */ - } - - for (jlpf2 = 0; jlpf2 < ilpf2; jlpf2 += 1) { - ma_lpf2_uninit(&pLPF->pLPF2[jlpf2], NULL); /* No need for allocation callbacks here since we used a preallocated heap allocation. */ - } - - return result; - } - } - - pLPF->lpf1Count = lpf1Count; - pLPF->lpf2Count = lpf2Count; - pLPF->format = pConfig->format; - pLPF->channels = pConfig->channels; - pLPF->sampleRate = pConfig->sampleRate; - - return MA_SUCCESS; -} - -MA_API ma_result ma_lpf_get_heap_size(const ma_lpf_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_lpf_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_lpf_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return result; -} - -MA_API ma_result ma_lpf_init_preallocated(const ma_lpf_config* pConfig, void* pHeap, ma_lpf* pLPF) -{ - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pLPF); - - return ma_lpf_reinit__internal(pConfig, pHeap, pLPF, /*isNew*/MA_TRUE); -} - -MA_API ma_result ma_lpf_init(const ma_lpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf* pLPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_lpf_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_lpf_init_preallocated(pConfig, pHeap, pLPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pLPF->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_lpf_uninit(ma_lpf* pLPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_uint32 ilpf1; - ma_uint32 ilpf2; - - if (pLPF == NULL) { - return; - } - - for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) { - ma_lpf1_uninit(&pLPF->pLPF1[ilpf1], pAllocationCallbacks); - } - - for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) { - ma_lpf2_uninit(&pLPF->pLPF2[ilpf2], pAllocationCallbacks); - } - - if (pLPF->_ownsHeap) { - ma_free(pLPF->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_lpf_reinit(const ma_lpf_config* pConfig, ma_lpf* pLPF) -{ - return ma_lpf_reinit__internal(pConfig, NULL, pLPF, /*isNew*/MA_FALSE); -} - -MA_API ma_result ma_lpf_clear_cache(ma_lpf* pLPF) -{ - ma_uint32 ilpf1; - ma_uint32 ilpf2; - - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) { - ma_lpf1_clear_cache(&pLPF->pLPF1[ilpf1]); - } - - for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) { - ma_lpf2_clear_cache(&pLPF->pLPF2[ilpf2]); - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_lpf_process_pcm_frame_f32(ma_lpf* pLPF, float* pY, const void* pX) -{ - ma_uint32 ilpf1; - ma_uint32 ilpf2; - - MA_ASSERT(pLPF->format == ma_format_f32); - - MA_COPY_MEMORY(pY, pX, ma_get_bytes_per_frame(pLPF->format, pLPF->channels)); - - for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) { - ma_lpf1_process_pcm_frame_f32(&pLPF->pLPF1[ilpf1], pY, pY); - } - - for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) { - ma_lpf2_process_pcm_frame_f32(&pLPF->pLPF2[ilpf2], pY, pY); - } -} - -static MA_INLINE void ma_lpf_process_pcm_frame_s16(ma_lpf* pLPF, ma_int16* pY, const ma_int16* pX) -{ - ma_uint32 ilpf1; - ma_uint32 ilpf2; - - MA_ASSERT(pLPF->format == ma_format_s16); - - MA_COPY_MEMORY(pY, pX, ma_get_bytes_per_frame(pLPF->format, pLPF->channels)); - - for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) { - ma_lpf1_process_pcm_frame_s16(&pLPF->pLPF1[ilpf1], pY, pY); - } - - for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) { - ma_lpf2_process_pcm_frame_s16(&pLPF->pLPF2[ilpf2], pY, pY); - } -} - -MA_API ma_result ma_lpf_process_pcm_frames(ma_lpf* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_result result; - ma_uint32 ilpf1; - ma_uint32 ilpf2; - - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - /* Faster path for in-place. */ - if (pFramesOut == pFramesIn) { - for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) { - result = ma_lpf1_process_pcm_frames(&pLPF->pLPF1[ilpf1], pFramesOut, pFramesOut, frameCount); - if (result != MA_SUCCESS) { - return result; - } - } - - for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) { - result = ma_lpf2_process_pcm_frames(&pLPF->pLPF2[ilpf2], pFramesOut, pFramesOut, frameCount); - if (result != MA_SUCCESS) { - return result; - } - } - } - - /* Slightly slower path for copying. */ - if (pFramesOut != pFramesIn) { - ma_uint32 iFrame; - - /* */ if (pLPF->format == ma_format_f32) { - /* */ float* pFramesOutF32 = ( float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_lpf_process_pcm_frame_f32(pLPF, pFramesOutF32, pFramesInF32); - pFramesOutF32 += pLPF->channels; - pFramesInF32 += pLPF->channels; - } - } else if (pLPF->format == ma_format_s16) { - /* */ ma_int16* pFramesOutS16 = ( ma_int16*)pFramesOut; - const ma_int16* pFramesInS16 = (const ma_int16*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_lpf_process_pcm_frame_s16(pLPF, pFramesOutS16, pFramesInS16); - pFramesOutS16 += pLPF->channels; - pFramesInS16 += pLPF->channels; - } - } else { - MA_ASSERT(MA_FALSE); - return MA_INVALID_OPERATION; /* Should never hit this. */ - } - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_lpf_get_latency(const ma_lpf* pLPF) -{ - if (pLPF == NULL) { - return 0; - } - - return pLPF->lpf2Count*2 + pLPF->lpf1Count; -} - - -/************************************************************************************************************************************************************** - -High-Pass Filtering - -**************************************************************************************************************************************************************/ -MA_API ma_hpf1_config ma_hpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency) -{ - ma_hpf1_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - - return config; -} - -MA_API ma_hpf2_config ma_hpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q) -{ - ma_hpf2_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - config.q = q; - - /* Q cannot be 0 or else it'll result in a division by 0. In this case just default to 0.707107. */ - if (config.q == 0) { - config.q = 0.707107; - } - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t r1Offset; -} ma_hpf1_heap_layout; - -static ma_result ma_hpf1_get_heap_layout(const ma_hpf1_config* pConfig, ma_hpf1_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* R1 */ - pHeapLayout->r1Offset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels; - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_hpf1_get_heap_size(const ma_hpf1_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_hpf1_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_hpf1_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_hpf1_init_preallocated(const ma_hpf1_config* pConfig, void* pHeap, ma_hpf1* pLPF) -{ - ma_result result; - ma_hpf1_heap_layout heapLayout; - - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pLPF); - - result = ma_hpf1_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pLPF->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pLPF->pR1 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r1Offset); - - return ma_hpf1_reinit(pConfig, pLPF); -} - -MA_API ma_result ma_hpf1_init(const ma_hpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf1* pLPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_hpf1_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_hpf1_init_preallocated(pConfig, pHeap, pLPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pLPF->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_hpf1_uninit(ma_hpf1* pHPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pHPF == NULL) { - return; - } - - if (pHPF->_ownsHeap) { - ma_free(pHPF->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_hpf1_reinit(const ma_hpf1_config* pConfig, ma_hpf1* pHPF) -{ - double a; - - if (pHPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Only supporting f32 and s16. */ - if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) { - return MA_INVALID_ARGS; - } - - /* The format cannot be changed after initialization. */ - if (pHPF->format != ma_format_unknown && pHPF->format != pConfig->format) { - return MA_INVALID_OPERATION; - } - - /* The channel count cannot be changed after initialization. */ - if (pHPF->channels != 0 && pHPF->channels != pConfig->channels) { - return MA_INVALID_OPERATION; - } - - pHPF->format = pConfig->format; - pHPF->channels = pConfig->channels; - - a = ma_expd(-2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate); - if (pConfig->format == ma_format_f32) { - pHPF->a.f32 = (float)a; - } else { - pHPF->a.s32 = ma_biquad_float_to_fp(a); - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_hpf1_process_pcm_frame_f32(ma_hpf1* pHPF, float* pY, const float* pX) -{ - ma_uint32 c; - const ma_uint32 channels = pHPF->channels; - const float a = 1 - pHPF->a.f32; - const float b = 1 - a; - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - float r1 = pHPF->pR1[c].f32; - float x = pX[c]; - float y; - - y = b*x - a*r1; - - pY[c] = y; - pHPF->pR1[c].f32 = y; - } -} - -static MA_INLINE void ma_hpf1_process_pcm_frame_s16(ma_hpf1* pHPF, ma_int16* pY, const ma_int16* pX) -{ - ma_uint32 c; - const ma_uint32 channels = pHPF->channels; - const ma_int32 a = ((1 << MA_BIQUAD_FIXED_POINT_SHIFT) - pHPF->a.s32); - const ma_int32 b = ((1 << MA_BIQUAD_FIXED_POINT_SHIFT) - a); - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - ma_int32 r1 = pHPF->pR1[c].s32; - ma_int32 x = pX[c]; - ma_int32 y; - - y = (b*x - a*r1) >> MA_BIQUAD_FIXED_POINT_SHIFT; - - pY[c] = (ma_int16)y; - pHPF->pR1[c].s32 = (ma_int32)y; - } -} - -MA_API ma_result ma_hpf1_process_pcm_frames(ma_hpf1* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_uint32 n; - - if (pHPF == NULL || pFramesOut == NULL || pFramesIn == NULL) { - return MA_INVALID_ARGS; - } - - /* Note that the logic below needs to support in-place filtering. That is, it must support the case where pFramesOut and pFramesIn are the same. */ - - if (pHPF->format == ma_format_f32) { - /* */ float* pY = ( float*)pFramesOut; - const float* pX = (const float*)pFramesIn; - - for (n = 0; n < frameCount; n += 1) { - ma_hpf1_process_pcm_frame_f32(pHPF, pY, pX); - pY += pHPF->channels; - pX += pHPF->channels; - } - } else if (pHPF->format == ma_format_s16) { - /* */ ma_int16* pY = ( ma_int16*)pFramesOut; - const ma_int16* pX = (const ma_int16*)pFramesIn; - - for (n = 0; n < frameCount; n += 1) { - ma_hpf1_process_pcm_frame_s16(pHPF, pY, pX); - pY += pHPF->channels; - pX += pHPF->channels; - } - } else { - MA_ASSERT(MA_FALSE); - return MA_INVALID_ARGS; /* Format not supported. Should never hit this because it's checked in ma_biquad_init() and ma_biquad_reinit(). */ - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_hpf1_get_latency(const ma_hpf1* pHPF) -{ - if (pHPF == NULL) { - return 0; - } - - return 1; -} - - -static MA_INLINE ma_biquad_config ma_hpf2__get_biquad_config(const ma_hpf2_config* pConfig) -{ - ma_biquad_config bqConfig; - double q; - double w; - double s; - double c; - double a; - - MA_ASSERT(pConfig != NULL); - - q = pConfig->q; - w = 2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate; - s = ma_sind(w); - c = ma_cosd(w); - a = s / (2*q); - - bqConfig.b0 = (1 + c) / 2; - bqConfig.b1 = -(1 + c); - bqConfig.b2 = (1 + c) / 2; - bqConfig.a0 = 1 + a; - bqConfig.a1 = -2 * c; - bqConfig.a2 = 1 - a; - - bqConfig.format = pConfig->format; - bqConfig.channels = pConfig->channels; - - return bqConfig; -} - -MA_API ma_result ma_hpf2_get_heap_size(const ma_hpf2_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_biquad_config bqConfig; - bqConfig = ma_hpf2__get_biquad_config(pConfig); - - return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes); -} - -MA_API ma_result ma_hpf2_init_preallocated(const ma_hpf2_config* pConfig, void* pHeap, ma_hpf2* pHPF) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pHPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pHPF); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_hpf2__get_biquad_config(pConfig); - result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pHPF->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_hpf2_init(const ma_hpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf2* pHPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_hpf2_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_hpf2_init_preallocated(pConfig, pHeap, pHPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pHPF->bq._ownsHeap = MA_TRUE; /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */ - return MA_SUCCESS; -} - -MA_API void ma_hpf2_uninit(ma_hpf2* pHPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pHPF == NULL) { - return; - } - - ma_biquad_uninit(&pHPF->bq, pAllocationCallbacks); /* <-- This will free the heap allocation. */ -} - -MA_API ma_result ma_hpf2_reinit(const ma_hpf2_config* pConfig, ma_hpf2* pHPF) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pHPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_hpf2__get_biquad_config(pConfig); - result = ma_biquad_reinit(&bqConfig, &pHPF->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_hpf2_process_pcm_frame_s16(ma_hpf2* pHPF, ma_int16* pFrameOut, const ma_int16* pFrameIn) -{ - ma_biquad_process_pcm_frame_s16(&pHPF->bq, pFrameOut, pFrameIn); -} - -static MA_INLINE void ma_hpf2_process_pcm_frame_f32(ma_hpf2* pHPF, float* pFrameOut, const float* pFrameIn) -{ - ma_biquad_process_pcm_frame_f32(&pHPF->bq, pFrameOut, pFrameIn); -} - -MA_API ma_result ma_hpf2_process_pcm_frames(ma_hpf2* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pHPF == NULL) { - return MA_INVALID_ARGS; - } - - return ma_biquad_process_pcm_frames(&pHPF->bq, pFramesOut, pFramesIn, frameCount); -} - -MA_API ma_uint32 ma_hpf2_get_latency(const ma_hpf2* pHPF) -{ - if (pHPF == NULL) { - return 0; - } - - return ma_biquad_get_latency(&pHPF->bq); -} - - -MA_API ma_hpf_config ma_hpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order) -{ - ma_hpf_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - config.order = ma_min(order, MA_MAX_FILTER_ORDER); - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t hpf1Offset; - size_t hpf2Offset; /* Offset of the first second order filter. Subsequent filters will come straight after, and will each have the same heap size. */ -} ma_hpf_heap_layout; - -static void ma_hpf_calculate_sub_hpf_counts(ma_uint32 order, ma_uint32* pHPF1Count, ma_uint32* pHPF2Count) -{ - MA_ASSERT(pHPF1Count != NULL); - MA_ASSERT(pHPF2Count != NULL); - - *pHPF1Count = order % 2; - *pHPF2Count = order / 2; -} - -static ma_result ma_hpf_get_heap_layout(const ma_hpf_config* pConfig, ma_hpf_heap_layout* pHeapLayout) -{ - ma_result result; - ma_uint32 hpf1Count; - ma_uint32 hpf2Count; - ma_uint32 ihpf1; - ma_uint32 ihpf2; - - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - if (pConfig->order > MA_MAX_FILTER_ORDER) { - return MA_INVALID_ARGS; - } - - ma_hpf_calculate_sub_hpf_counts(pConfig->order, &hpf1Count, &hpf2Count); - - pHeapLayout->sizeInBytes = 0; - - /* HPF 1 */ - pHeapLayout->hpf1Offset = pHeapLayout->sizeInBytes; - for (ihpf1 = 0; ihpf1 < hpf1Count; ihpf1 += 1) { - size_t hpf1HeapSizeInBytes; - ma_hpf1_config hpf1Config = ma_hpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency); - - result = ma_hpf1_get_heap_size(&hpf1Config, &hpf1HeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += sizeof(ma_hpf1) + hpf1HeapSizeInBytes; - } - - /* HPF 2*/ - pHeapLayout->hpf2Offset = pHeapLayout->sizeInBytes; - for (ihpf2 = 0; ihpf2 < hpf2Count; ihpf2 += 1) { - size_t hpf2HeapSizeInBytes; - ma_hpf2_config hpf2Config = ma_hpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, 0.707107); /* <-- The "q" parameter does not matter for the purpose of calculating the heap size. */ - - result = ma_hpf2_get_heap_size(&hpf2Config, &hpf2HeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += sizeof(ma_hpf2) + hpf2HeapSizeInBytes; - } - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -static ma_result ma_hpf_reinit__internal(const ma_hpf_config* pConfig, void* pHeap, ma_hpf* pHPF, ma_bool32 isNew) -{ - ma_result result; - ma_uint32 hpf1Count; - ma_uint32 hpf2Count; - ma_uint32 ihpf1; - ma_uint32 ihpf2; - ma_hpf_heap_layout heapLayout; /* Only used if isNew is true. */ - - if (pHPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Only supporting f32 and s16. */ - if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) { - return MA_INVALID_ARGS; - } - - /* The format cannot be changed after initialization. */ - if (pHPF->format != ma_format_unknown && pHPF->format != pConfig->format) { - return MA_INVALID_OPERATION; - } - - /* The channel count cannot be changed after initialization. */ - if (pHPF->channels != 0 && pHPF->channels != pConfig->channels) { - return MA_INVALID_OPERATION; - } - - if (pConfig->order > MA_MAX_FILTER_ORDER) { - return MA_INVALID_ARGS; - } - - ma_hpf_calculate_sub_hpf_counts(pConfig->order, &hpf1Count, &hpf2Count); - - /* The filter order can't change between reinits. */ - if (!isNew) { - if (pHPF->hpf1Count != hpf1Count || pHPF->hpf2Count != hpf2Count) { - return MA_INVALID_OPERATION; - } - } - - if (isNew) { - result = ma_hpf_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pHPF->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pHPF->pHPF1 = (ma_hpf1*)ma_offset_ptr(pHeap, heapLayout.hpf1Offset); - pHPF->pHPF2 = (ma_hpf2*)ma_offset_ptr(pHeap, heapLayout.hpf2Offset); - } else { - MA_ZERO_OBJECT(&heapLayout); /* To silence a compiler warning. */ - } - - for (ihpf1 = 0; ihpf1 < hpf1Count; ihpf1 += 1) { - ma_hpf1_config hpf1Config = ma_hpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency); - - if (isNew) { - size_t hpf1HeapSizeInBytes; - - result = ma_hpf1_get_heap_size(&hpf1Config, &hpf1HeapSizeInBytes); - if (result == MA_SUCCESS) { - result = ma_hpf1_init_preallocated(&hpf1Config, ma_offset_ptr(pHeap, heapLayout.hpf1Offset + (sizeof(ma_hpf1) * hpf1Count) + (ihpf1 * hpf1HeapSizeInBytes)), &pHPF->pHPF1[ihpf1]); - } - } else { - result = ma_hpf1_reinit(&hpf1Config, &pHPF->pHPF1[ihpf1]); - } - - if (result != MA_SUCCESS) { - ma_uint32 jhpf1; - - for (jhpf1 = 0; jhpf1 < ihpf1; jhpf1 += 1) { - ma_hpf1_uninit(&pHPF->pHPF1[jhpf1], NULL); /* No need for allocation callbacks here since we used a preallocated heap allocation. */ - } - - return result; - } - } - - for (ihpf2 = 0; ihpf2 < hpf2Count; ihpf2 += 1) { - ma_hpf2_config hpf2Config; - double q; - double a; - - /* Tempting to use 0.707107, but won't result in a Butterworth filter if the order is > 2. */ - if (hpf1Count == 1) { - a = (1 + ihpf2*1) * (MA_PI_D/(pConfig->order*1)); /* Odd order. */ - } else { - a = (1 + ihpf2*2) * (MA_PI_D/(pConfig->order*2)); /* Even order. */ - } - q = 1 / (2*ma_cosd(a)); - - hpf2Config = ma_hpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, q); - - if (isNew) { - size_t hpf2HeapSizeInBytes; - - result = ma_hpf2_get_heap_size(&hpf2Config, &hpf2HeapSizeInBytes); - if (result == MA_SUCCESS) { - result = ma_hpf2_init_preallocated(&hpf2Config, ma_offset_ptr(pHeap, heapLayout.hpf2Offset + (sizeof(ma_hpf2) * hpf2Count) + (ihpf2 * hpf2HeapSizeInBytes)), &pHPF->pHPF2[ihpf2]); - } - } else { - result = ma_hpf2_reinit(&hpf2Config, &pHPF->pHPF2[ihpf2]); - } - - if (result != MA_SUCCESS) { - ma_uint32 jhpf1; - ma_uint32 jhpf2; - - for (jhpf1 = 0; jhpf1 < hpf1Count; jhpf1 += 1) { - ma_hpf1_uninit(&pHPF->pHPF1[jhpf1], NULL); /* No need for allocation callbacks here since we used a preallocated heap allocation. */ - } - - for (jhpf2 = 0; jhpf2 < ihpf2; jhpf2 += 1) { - ma_hpf2_uninit(&pHPF->pHPF2[jhpf2], NULL); /* No need for allocation callbacks here since we used a preallocated heap allocation. */ - } - - return result; - } - } - - pHPF->hpf1Count = hpf1Count; - pHPF->hpf2Count = hpf2Count; - pHPF->format = pConfig->format; - pHPF->channels = pConfig->channels; - pHPF->sampleRate = pConfig->sampleRate; - - return MA_SUCCESS; -} - -MA_API ma_result ma_hpf_get_heap_size(const ma_hpf_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_hpf_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_hpf_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return result; -} - -MA_API ma_result ma_hpf_init_preallocated(const ma_hpf_config* pConfig, void* pHeap, ma_hpf* pLPF) -{ - if (pLPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pLPF); - - return ma_hpf_reinit__internal(pConfig, pHeap, pLPF, /*isNew*/MA_TRUE); -} - -MA_API ma_result ma_hpf_init(const ma_hpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf* pHPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_hpf_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_hpf_init_preallocated(pConfig, pHeap, pHPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pHPF->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_hpf_uninit(ma_hpf* pHPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_uint32 ihpf1; - ma_uint32 ihpf2; - - if (pHPF == NULL) { - return; - } - - for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) { - ma_hpf1_uninit(&pHPF->pHPF1[ihpf1], pAllocationCallbacks); - } - - for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) { - ma_hpf2_uninit(&pHPF->pHPF2[ihpf2], pAllocationCallbacks); - } - - if (pHPF->_ownsHeap) { - ma_free(pHPF->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_hpf_reinit(const ma_hpf_config* pConfig, ma_hpf* pHPF) -{ - return ma_hpf_reinit__internal(pConfig, NULL, pHPF, /*isNew*/MA_FALSE); -} - -MA_API ma_result ma_hpf_process_pcm_frames(ma_hpf* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_result result; - ma_uint32 ihpf1; - ma_uint32 ihpf2; - - if (pHPF == NULL) { - return MA_INVALID_ARGS; - } - - /* Faster path for in-place. */ - if (pFramesOut == pFramesIn) { - for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) { - result = ma_hpf1_process_pcm_frames(&pHPF->pHPF1[ihpf1], pFramesOut, pFramesOut, frameCount); - if (result != MA_SUCCESS) { - return result; - } - } - - for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) { - result = ma_hpf2_process_pcm_frames(&pHPF->pHPF2[ihpf2], pFramesOut, pFramesOut, frameCount); - if (result != MA_SUCCESS) { - return result; - } - } - } - - /* Slightly slower path for copying. */ - if (pFramesOut != pFramesIn) { - ma_uint32 iFrame; - - /* */ if (pHPF->format == ma_format_f32) { - /* */ float* pFramesOutF32 = ( float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - MA_COPY_MEMORY(pFramesOutF32, pFramesInF32, ma_get_bytes_per_frame(pHPF->format, pHPF->channels)); - - for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) { - ma_hpf1_process_pcm_frame_f32(&pHPF->pHPF1[ihpf1], pFramesOutF32, pFramesOutF32); - } - - for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) { - ma_hpf2_process_pcm_frame_f32(&pHPF->pHPF2[ihpf2], pFramesOutF32, pFramesOutF32); - } - - pFramesOutF32 += pHPF->channels; - pFramesInF32 += pHPF->channels; - } - } else if (pHPF->format == ma_format_s16) { - /* */ ma_int16* pFramesOutS16 = ( ma_int16*)pFramesOut; - const ma_int16* pFramesInS16 = (const ma_int16*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - MA_COPY_MEMORY(pFramesOutS16, pFramesInS16, ma_get_bytes_per_frame(pHPF->format, pHPF->channels)); - - for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) { - ma_hpf1_process_pcm_frame_s16(&pHPF->pHPF1[ihpf1], pFramesOutS16, pFramesOutS16); - } - - for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) { - ma_hpf2_process_pcm_frame_s16(&pHPF->pHPF2[ihpf2], pFramesOutS16, pFramesOutS16); - } - - pFramesOutS16 += pHPF->channels; - pFramesInS16 += pHPF->channels; - } - } else { - MA_ASSERT(MA_FALSE); - return MA_INVALID_OPERATION; /* Should never hit this. */ - } - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_hpf_get_latency(const ma_hpf* pHPF) -{ - if (pHPF == NULL) { - return 0; - } - - return pHPF->hpf2Count*2 + pHPF->hpf1Count; -} - - -/************************************************************************************************************************************************************** - -Band-Pass Filtering - -**************************************************************************************************************************************************************/ -MA_API ma_bpf2_config ma_bpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q) -{ - ma_bpf2_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - config.q = q; - - /* Q cannot be 0 or else it'll result in a division by 0. In this case just default to 0.707107. */ - if (config.q == 0) { - config.q = 0.707107; - } - - return config; -} - - -static MA_INLINE ma_biquad_config ma_bpf2__get_biquad_config(const ma_bpf2_config* pConfig) -{ - ma_biquad_config bqConfig; - double q; - double w; - double s; - double c; - double a; - - MA_ASSERT(pConfig != NULL); - - q = pConfig->q; - w = 2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate; - s = ma_sind(w); - c = ma_cosd(w); - a = s / (2*q); - - bqConfig.b0 = q * a; - bqConfig.b1 = 0; - bqConfig.b2 = -q * a; - bqConfig.a0 = 1 + a; - bqConfig.a1 = -2 * c; - bqConfig.a2 = 1 - a; - - bqConfig.format = pConfig->format; - bqConfig.channels = pConfig->channels; - - return bqConfig; -} - -MA_API ma_result ma_bpf2_get_heap_size(const ma_bpf2_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_biquad_config bqConfig; - bqConfig = ma_bpf2__get_biquad_config(pConfig); - - return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes); -} - -MA_API ma_result ma_bpf2_init_preallocated(const ma_bpf2_config* pConfig, void* pHeap, ma_bpf2* pBPF) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pBPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pBPF); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_bpf2__get_biquad_config(pConfig); - result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pBPF->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_bpf2_init(const ma_bpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf2* pBPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_bpf2_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_bpf2_init_preallocated(pConfig, pHeap, pBPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pBPF->bq._ownsHeap = MA_TRUE; /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */ - return MA_SUCCESS; -} - -MA_API void ma_bpf2_uninit(ma_bpf2* pBPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pBPF == NULL) { - return; - } - - ma_biquad_uninit(&pBPF->bq, pAllocationCallbacks); /* <-- This will free the heap allocation. */ -} - -MA_API ma_result ma_bpf2_reinit(const ma_bpf2_config* pConfig, ma_bpf2* pBPF) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pBPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_bpf2__get_biquad_config(pConfig); - result = ma_biquad_reinit(&bqConfig, &pBPF->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_bpf2_process_pcm_frame_s16(ma_bpf2* pBPF, ma_int16* pFrameOut, const ma_int16* pFrameIn) -{ - ma_biquad_process_pcm_frame_s16(&pBPF->bq, pFrameOut, pFrameIn); -} - -static MA_INLINE void ma_bpf2_process_pcm_frame_f32(ma_bpf2* pBPF, float* pFrameOut, const float* pFrameIn) -{ - ma_biquad_process_pcm_frame_f32(&pBPF->bq, pFrameOut, pFrameIn); -} - -MA_API ma_result ma_bpf2_process_pcm_frames(ma_bpf2* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pBPF == NULL) { - return MA_INVALID_ARGS; - } - - return ma_biquad_process_pcm_frames(&pBPF->bq, pFramesOut, pFramesIn, frameCount); -} - -MA_API ma_uint32 ma_bpf2_get_latency(const ma_bpf2* pBPF) -{ - if (pBPF == NULL) { - return 0; - } - - return ma_biquad_get_latency(&pBPF->bq); -} - - -MA_API ma_bpf_config ma_bpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order) -{ - ma_bpf_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.cutoffFrequency = cutoffFrequency; - config.order = ma_min(order, MA_MAX_FILTER_ORDER); - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t bpf2Offset; -} ma_bpf_heap_layout; - -static ma_result ma_bpf_get_heap_layout(const ma_bpf_config* pConfig, ma_bpf_heap_layout* pHeapLayout) -{ - ma_result result; - ma_uint32 bpf2Count; - ma_uint32 ibpf2; - - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->order > MA_MAX_FILTER_ORDER) { - return MA_INVALID_ARGS; - } - - /* We must have an even number of order. */ - if ((pConfig->order & 0x1) != 0) { - return MA_INVALID_ARGS; - } - - bpf2Count = pConfig->channels / 2; - - pHeapLayout->sizeInBytes = 0; - - /* BPF 2 */ - pHeapLayout->bpf2Offset = pHeapLayout->sizeInBytes; - for (ibpf2 = 0; ibpf2 < bpf2Count; ibpf2 += 1) { - size_t bpf2HeapSizeInBytes; - ma_bpf2_config bpf2Config = ma_bpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, 0.707107); /* <-- The "q" parameter does not matter for the purpose of calculating the heap size. */ - - result = ma_bpf2_get_heap_size(&bpf2Config, &bpf2HeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += sizeof(ma_bpf2) + bpf2HeapSizeInBytes; - } - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -static ma_result ma_bpf_reinit__internal(const ma_bpf_config* pConfig, void* pHeap, ma_bpf* pBPF, ma_bool32 isNew) -{ - ma_result result; - ma_uint32 bpf2Count; - ma_uint32 ibpf2; - ma_bpf_heap_layout heapLayout; /* Only used if isNew is true. */ - - if (pBPF == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Only supporting f32 and s16. */ - if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) { - return MA_INVALID_ARGS; - } - - /* The format cannot be changed after initialization. */ - if (pBPF->format != ma_format_unknown && pBPF->format != pConfig->format) { - return MA_INVALID_OPERATION; - } - - /* The channel count cannot be changed after initialization. */ - if (pBPF->channels != 0 && pBPF->channels != pConfig->channels) { - return MA_INVALID_OPERATION; - } - - if (pConfig->order > MA_MAX_FILTER_ORDER) { - return MA_INVALID_ARGS; - } - - /* We must have an even number of order. */ - if ((pConfig->order & 0x1) != 0) { - return MA_INVALID_ARGS; - } - - bpf2Count = pConfig->order / 2; - - /* The filter order can't change between reinits. */ - if (!isNew) { - if (pBPF->bpf2Count != bpf2Count) { - return MA_INVALID_OPERATION; - } - } - - if (isNew) { - result = ma_bpf_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pBPF->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pBPF->pBPF2 = (ma_bpf2*)ma_offset_ptr(pHeap, heapLayout.bpf2Offset); - } else { - MA_ZERO_OBJECT(&heapLayout); - } - - for (ibpf2 = 0; ibpf2 < bpf2Count; ibpf2 += 1) { - ma_bpf2_config bpf2Config; - double q; - - /* TODO: Calculate Q to make this a proper Butterworth filter. */ - q = 0.707107; - - bpf2Config = ma_bpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, q); - - if (isNew) { - size_t bpf2HeapSizeInBytes; - - result = ma_bpf2_get_heap_size(&bpf2Config, &bpf2HeapSizeInBytes); - if (result == MA_SUCCESS) { - result = ma_bpf2_init_preallocated(&bpf2Config, ma_offset_ptr(pHeap, heapLayout.bpf2Offset + (sizeof(ma_bpf2) * bpf2Count) + (ibpf2 * bpf2HeapSizeInBytes)), &pBPF->pBPF2[ibpf2]); - } - } else { - result = ma_bpf2_reinit(&bpf2Config, &pBPF->pBPF2[ibpf2]); - } - - if (result != MA_SUCCESS) { - return result; - } - } - - pBPF->bpf2Count = bpf2Count; - pBPF->format = pConfig->format; - pBPF->channels = pConfig->channels; - - return MA_SUCCESS; -} - - -MA_API ma_result ma_bpf_get_heap_size(const ma_bpf_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_bpf_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_bpf_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_bpf_init_preallocated(const ma_bpf_config* pConfig, void* pHeap, ma_bpf* pBPF) -{ - if (pBPF == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pBPF); - - return ma_bpf_reinit__internal(pConfig, pHeap, pBPF, /*isNew*/MA_TRUE); -} - -MA_API ma_result ma_bpf_init(const ma_bpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf* pBPF) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_bpf_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_bpf_init_preallocated(pConfig, pHeap, pBPF); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pBPF->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_bpf_uninit(ma_bpf* pBPF, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_uint32 ibpf2; - - if (pBPF == NULL) { - return; - } - - for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) { - ma_bpf2_uninit(&pBPF->pBPF2[ibpf2], pAllocationCallbacks); - } - - if (pBPF->_ownsHeap) { - ma_free(pBPF->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_bpf_reinit(const ma_bpf_config* pConfig, ma_bpf* pBPF) -{ - return ma_bpf_reinit__internal(pConfig, NULL, pBPF, /*isNew*/MA_FALSE); -} - -MA_API ma_result ma_bpf_process_pcm_frames(ma_bpf* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_result result; - ma_uint32 ibpf2; - - if (pBPF == NULL) { - return MA_INVALID_ARGS; - } - - /* Faster path for in-place. */ - if (pFramesOut == pFramesIn) { - for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) { - result = ma_bpf2_process_pcm_frames(&pBPF->pBPF2[ibpf2], pFramesOut, pFramesOut, frameCount); - if (result != MA_SUCCESS) { - return result; - } - } - } - - /* Slightly slower path for copying. */ - if (pFramesOut != pFramesIn) { - ma_uint32 iFrame; - - /* */ if (pBPF->format == ma_format_f32) { - /* */ float* pFramesOutF32 = ( float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - MA_COPY_MEMORY(pFramesOutF32, pFramesInF32, ma_get_bytes_per_frame(pBPF->format, pBPF->channels)); - - for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) { - ma_bpf2_process_pcm_frame_f32(&pBPF->pBPF2[ibpf2], pFramesOutF32, pFramesOutF32); - } - - pFramesOutF32 += pBPF->channels; - pFramesInF32 += pBPF->channels; - } - } else if (pBPF->format == ma_format_s16) { - /* */ ma_int16* pFramesOutS16 = ( ma_int16*)pFramesOut; - const ma_int16* pFramesInS16 = (const ma_int16*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - MA_COPY_MEMORY(pFramesOutS16, pFramesInS16, ma_get_bytes_per_frame(pBPF->format, pBPF->channels)); - - for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) { - ma_bpf2_process_pcm_frame_s16(&pBPF->pBPF2[ibpf2], pFramesOutS16, pFramesOutS16); - } - - pFramesOutS16 += pBPF->channels; - pFramesInS16 += pBPF->channels; - } - } else { - MA_ASSERT(MA_FALSE); - return MA_INVALID_OPERATION; /* Should never hit this. */ - } - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_bpf_get_latency(const ma_bpf* pBPF) -{ - if (pBPF == NULL) { - return 0; - } - - return pBPF->bpf2Count*2; -} - - -/************************************************************************************************************************************************************** - -Notching Filter - -**************************************************************************************************************************************************************/ -MA_API ma_notch2_config ma_notch2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency) -{ - ma_notch2_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.q = q; - config.frequency = frequency; - - if (config.q == 0) { - config.q = 0.707107; - } - - return config; -} - - -static MA_INLINE ma_biquad_config ma_notch2__get_biquad_config(const ma_notch2_config* pConfig) -{ - ma_biquad_config bqConfig; - double q; - double w; - double s; - double c; - double a; - - MA_ASSERT(pConfig != NULL); - - q = pConfig->q; - w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate; - s = ma_sind(w); - c = ma_cosd(w); - a = s / (2*q); - - bqConfig.b0 = 1; - bqConfig.b1 = -2 * c; - bqConfig.b2 = 1; - bqConfig.a0 = 1 + a; - bqConfig.a1 = -2 * c; - bqConfig.a2 = 1 - a; - - bqConfig.format = pConfig->format; - bqConfig.channels = pConfig->channels; - - return bqConfig; -} - -MA_API ma_result ma_notch2_get_heap_size(const ma_notch2_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_biquad_config bqConfig; - bqConfig = ma_notch2__get_biquad_config(pConfig); - - return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes); -} - -MA_API ma_result ma_notch2_init_preallocated(const ma_notch2_config* pConfig, void* pHeap, ma_notch2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pFilter); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_notch2__get_biquad_config(pConfig); - result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_notch2_init(const ma_notch2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch2* pFilter) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_notch2_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_notch2_init_preallocated(pConfig, pHeap, pFilter); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pFilter->bq._ownsHeap = MA_TRUE; /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */ - return MA_SUCCESS; -} - -MA_API void ma_notch2_uninit(ma_notch2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pFilter == NULL) { - return; - } - - ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks); /* <-- This will free the heap allocation. */ -} - -MA_API ma_result ma_notch2_reinit(const ma_notch2_config* pConfig, ma_notch2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_notch2__get_biquad_config(pConfig); - result = ma_biquad_reinit(&bqConfig, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_notch2_process_pcm_frame_s16(ma_notch2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn) -{ - ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn); -} - -static MA_INLINE void ma_notch2_process_pcm_frame_f32(ma_notch2* pFilter, float* pFrameOut, const float* pFrameIn) -{ - ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn); -} - -MA_API ma_result ma_notch2_process_pcm_frames(ma_notch2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount); -} - -MA_API ma_uint32 ma_notch2_get_latency(const ma_notch2* pFilter) -{ - if (pFilter == NULL) { - return 0; - } - - return ma_biquad_get_latency(&pFilter->bq); -} - - - -/************************************************************************************************************************************************************** - -Peaking EQ Filter - -**************************************************************************************************************************************************************/ -MA_API ma_peak2_config ma_peak2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency) -{ - ma_peak2_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.gainDB = gainDB; - config.q = q; - config.frequency = frequency; - - if (config.q == 0) { - config.q = 0.707107; - } - - return config; -} - - -static MA_INLINE ma_biquad_config ma_peak2__get_biquad_config(const ma_peak2_config* pConfig) -{ - ma_biquad_config bqConfig; - double q; - double w; - double s; - double c; - double a; - double A; - - MA_ASSERT(pConfig != NULL); - - q = pConfig->q; - w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate; - s = ma_sind(w); - c = ma_cosd(w); - a = s / (2*q); - A = ma_powd(10, (pConfig->gainDB / 40)); - - bqConfig.b0 = 1 + (a * A); - bqConfig.b1 = -2 * c; - bqConfig.b2 = 1 - (a * A); - bqConfig.a0 = 1 + (a / A); - bqConfig.a1 = -2 * c; - bqConfig.a2 = 1 - (a / A); - - bqConfig.format = pConfig->format; - bqConfig.channels = pConfig->channels; - - return bqConfig; -} - -MA_API ma_result ma_peak2_get_heap_size(const ma_peak2_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_biquad_config bqConfig; - bqConfig = ma_peak2__get_biquad_config(pConfig); - - return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes); -} - -MA_API ma_result ma_peak2_init_preallocated(const ma_peak2_config* pConfig, void* pHeap, ma_peak2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pFilter); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_peak2__get_biquad_config(pConfig); - result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_peak2_init(const ma_peak2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak2* pFilter) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_peak2_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_peak2_init_preallocated(pConfig, pHeap, pFilter); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pFilter->bq._ownsHeap = MA_TRUE; /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */ - return MA_SUCCESS; -} - -MA_API void ma_peak2_uninit(ma_peak2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pFilter == NULL) { - return; - } - - ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks); /* <-- This will free the heap allocation. */ -} - -MA_API ma_result ma_peak2_reinit(const ma_peak2_config* pConfig, ma_peak2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_peak2__get_biquad_config(pConfig); - result = ma_biquad_reinit(&bqConfig, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_peak2_process_pcm_frame_s16(ma_peak2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn) -{ - ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn); -} - -static MA_INLINE void ma_peak2_process_pcm_frame_f32(ma_peak2* pFilter, float* pFrameOut, const float* pFrameIn) -{ - ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn); -} - -MA_API ma_result ma_peak2_process_pcm_frames(ma_peak2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount); -} - -MA_API ma_uint32 ma_peak2_get_latency(const ma_peak2* pFilter) -{ - if (pFilter == NULL) { - return 0; - } - - return ma_biquad_get_latency(&pFilter->bq); -} - - -/************************************************************************************************************************************************************** - -Low Shelf Filter - -**************************************************************************************************************************************************************/ -MA_API ma_loshelf2_config ma_loshelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency) -{ - ma_loshelf2_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.gainDB = gainDB; - config.shelfSlope = shelfSlope; - config.frequency = frequency; - - return config; -} - - -static MA_INLINE ma_biquad_config ma_loshelf2__get_biquad_config(const ma_loshelf2_config* pConfig) -{ - ma_biquad_config bqConfig; - double w; - double s; - double c; - double A; - double S; - double a; - double sqrtA; - - MA_ASSERT(pConfig != NULL); - - w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate; - s = ma_sind(w); - c = ma_cosd(w); - A = ma_powd(10, (pConfig->gainDB / 40)); - S = pConfig->shelfSlope; - a = s/2 * ma_sqrtd((A + 1/A) * (1/S - 1) + 2); - sqrtA = 2*ma_sqrtd(A)*a; - - bqConfig.b0 = A * ((A + 1) - (A - 1)*c + sqrtA); - bqConfig.b1 = 2 * A * ((A - 1) - (A + 1)*c); - bqConfig.b2 = A * ((A + 1) - (A - 1)*c - sqrtA); - bqConfig.a0 = (A + 1) + (A - 1)*c + sqrtA; - bqConfig.a1 = -2 * ((A - 1) + (A + 1)*c); - bqConfig.a2 = (A + 1) + (A - 1)*c - sqrtA; - - bqConfig.format = pConfig->format; - bqConfig.channels = pConfig->channels; - - return bqConfig; -} - -MA_API ma_result ma_loshelf2_get_heap_size(const ma_loshelf2_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_biquad_config bqConfig; - bqConfig = ma_loshelf2__get_biquad_config(pConfig); - - return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes); -} - -MA_API ma_result ma_loshelf2_init_preallocated(const ma_loshelf2_config* pConfig, void* pHeap, ma_loshelf2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pFilter); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_loshelf2__get_biquad_config(pConfig); - result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_loshelf2_init(const ma_loshelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf2* pFilter) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_loshelf2_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_loshelf2_init_preallocated(pConfig, pHeap, pFilter); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pFilter->bq._ownsHeap = MA_TRUE; /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */ - return MA_SUCCESS; -} - -MA_API void ma_loshelf2_uninit(ma_loshelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pFilter == NULL) { - return; - } - - ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks); /* <-- This will free the heap allocation. */ -} - -MA_API ma_result ma_loshelf2_reinit(const ma_loshelf2_config* pConfig, ma_loshelf2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_loshelf2__get_biquad_config(pConfig); - result = ma_biquad_reinit(&bqConfig, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_loshelf2_process_pcm_frame_s16(ma_loshelf2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn) -{ - ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn); -} - -static MA_INLINE void ma_loshelf2_process_pcm_frame_f32(ma_loshelf2* pFilter, float* pFrameOut, const float* pFrameIn) -{ - ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn); -} - -MA_API ma_result ma_loshelf2_process_pcm_frames(ma_loshelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount); -} - -MA_API ma_uint32 ma_loshelf2_get_latency(const ma_loshelf2* pFilter) -{ - if (pFilter == NULL) { - return 0; - } - - return ma_biquad_get_latency(&pFilter->bq); -} - - -/************************************************************************************************************************************************************** - -High Shelf Filter - -**************************************************************************************************************************************************************/ -MA_API ma_hishelf2_config ma_hishelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency) -{ - ma_hishelf2_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.gainDB = gainDB; - config.shelfSlope = shelfSlope; - config.frequency = frequency; - - return config; -} - - -static MA_INLINE ma_biquad_config ma_hishelf2__get_biquad_config(const ma_hishelf2_config* pConfig) -{ - ma_biquad_config bqConfig; - double w; - double s; - double c; - double A; - double S; - double a; - double sqrtA; - - MA_ASSERT(pConfig != NULL); - - w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate; - s = ma_sind(w); - c = ma_cosd(w); - A = ma_powd(10, (pConfig->gainDB / 40)); - S = pConfig->shelfSlope; - a = s/2 * ma_sqrtd((A + 1/A) * (1/S - 1) + 2); - sqrtA = 2*ma_sqrtd(A)*a; - - bqConfig.b0 = A * ((A + 1) + (A - 1)*c + sqrtA); - bqConfig.b1 = -2 * A * ((A - 1) + (A + 1)*c); - bqConfig.b2 = A * ((A + 1) + (A - 1)*c - sqrtA); - bqConfig.a0 = (A + 1) - (A - 1)*c + sqrtA; - bqConfig.a1 = 2 * ((A - 1) - (A + 1)*c); - bqConfig.a2 = (A + 1) - (A - 1)*c - sqrtA; - - bqConfig.format = pConfig->format; - bqConfig.channels = pConfig->channels; - - return bqConfig; -} - -MA_API ma_result ma_hishelf2_get_heap_size(const ma_hishelf2_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_biquad_config bqConfig; - bqConfig = ma_hishelf2__get_biquad_config(pConfig); - - return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes); -} - -MA_API ma_result ma_hishelf2_init_preallocated(const ma_hishelf2_config* pConfig, void* pHeap, ma_hishelf2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pFilter); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_hishelf2__get_biquad_config(pConfig); - result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_hishelf2_init(const ma_hishelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf2* pFilter) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_hishelf2_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_hishelf2_init_preallocated(pConfig, pHeap, pFilter); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pFilter->bq._ownsHeap = MA_TRUE; /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */ - return MA_SUCCESS; -} - -MA_API void ma_hishelf2_uninit(ma_hishelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pFilter == NULL) { - return; - } - - ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks); /* <-- This will free the heap allocation. */ -} - -MA_API ma_result ma_hishelf2_reinit(const ma_hishelf2_config* pConfig, ma_hishelf2* pFilter) -{ - ma_result result; - ma_biquad_config bqConfig; - - if (pFilter == NULL || pConfig == NULL) { - return MA_INVALID_ARGS; - } - - bqConfig = ma_hishelf2__get_biquad_config(pConfig); - result = ma_biquad_reinit(&bqConfig, &pFilter->bq); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -static MA_INLINE void ma_hishelf2_process_pcm_frame_s16(ma_hishelf2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn) -{ - ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn); -} - -static MA_INLINE void ma_hishelf2_process_pcm_frame_f32(ma_hishelf2* pFilter, float* pFrameOut, const float* pFrameIn) -{ - ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn); -} - -MA_API ma_result ma_hishelf2_process_pcm_frames(ma_hishelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pFilter == NULL) { - return MA_INVALID_ARGS; - } - - return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount); -} - -MA_API ma_uint32 ma_hishelf2_get_latency(const ma_hishelf2* pFilter) -{ - if (pFilter == NULL) { - return 0; - } - - return ma_biquad_get_latency(&pFilter->bq); -} - - - -/* -Delay -*/ -MA_API ma_delay_config ma_delay_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay) -{ - ma_delay_config config; - - MA_ZERO_OBJECT(&config); - config.channels = channels; - config.sampleRate = sampleRate; - config.delayInFrames = delayInFrames; - config.delayStart = (decay == 0) ? MA_TRUE : MA_FALSE; /* Delay the start if it looks like we're not configuring an echo. */ - config.wet = 1; - config.dry = 1; - config.decay = decay; - - return config; -} - - -MA_API ma_result ma_delay_init(const ma_delay_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay* pDelay) -{ - if (pDelay == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDelay); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->decay < 0 || pConfig->decay > 1) { - return MA_INVALID_ARGS; - } - - pDelay->config = *pConfig; - pDelay->bufferSizeInFrames = pConfig->delayInFrames; - pDelay->cursor = 0; - - pDelay->pBuffer = (float*)ma_malloc((size_t)(pDelay->bufferSizeInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->channels)), pAllocationCallbacks); - if (pDelay->pBuffer == NULL) { - return MA_OUT_OF_MEMORY; - } - - ma_silence_pcm_frames(pDelay->pBuffer, pDelay->bufferSizeInFrames, ma_format_f32, pConfig->channels); - - return MA_SUCCESS; -} - -MA_API void ma_delay_uninit(ma_delay* pDelay, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pDelay == NULL) { - return; - } - - ma_free(pDelay->pBuffer, pAllocationCallbacks); -} - -MA_API ma_result ma_delay_process_pcm_frames(ma_delay* pDelay, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount) -{ - ma_uint32 iFrame; - ma_uint32 iChannel; - float* pFramesOutF32 = (float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - if (pDelay == NULL || pFramesOut == NULL || pFramesIn == NULL) { - return MA_INVALID_ARGS; - } - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < pDelay->config.channels; iChannel += 1) { - ma_uint32 iBuffer = (pDelay->cursor * pDelay->config.channels) + iChannel; - - if (pDelay->config.delayStart) { - /* Delayed start. */ - - /* Read */ - pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer] * pDelay->config.wet; - - /* Feedback */ - pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + (pFramesInF32[iChannel] * pDelay->config.dry); - } else { - /* Immediate start */ - - /* Feedback */ - pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + (pFramesInF32[iChannel] * pDelay->config.dry); - - /* Read */ - pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer] * pDelay->config.wet; - } - } - - pDelay->cursor = (pDelay->cursor + 1) % pDelay->bufferSizeInFrames; - - pFramesOutF32 += pDelay->config.channels; - pFramesInF32 += pDelay->config.channels; - } - - return MA_SUCCESS; -} - -MA_API void ma_delay_set_wet(ma_delay* pDelay, float value) -{ - if (pDelay == NULL) { - return; - } - - pDelay->config.wet = value; -} - -MA_API float ma_delay_get_wet(const ma_delay* pDelay) -{ - if (pDelay == NULL) { - return 0; - } - - return pDelay->config.wet; -} - -MA_API void ma_delay_set_dry(ma_delay* pDelay, float value) -{ - if (pDelay == NULL) { - return; - } - - pDelay->config.dry = value; -} - -MA_API float ma_delay_get_dry(const ma_delay* pDelay) -{ - if (pDelay == NULL) { - return 0; - } - - return pDelay->config.dry; -} - -MA_API void ma_delay_set_decay(ma_delay* pDelay, float value) -{ - if (pDelay == NULL) { - return; - } - - pDelay->config.decay = value; -} - -MA_API float ma_delay_get_decay(const ma_delay* pDelay) -{ - if (pDelay == NULL) { - return 0; - } - - return pDelay->config.decay; -} - - -MA_API ma_gainer_config ma_gainer_config_init(ma_uint32 channels, ma_uint32 smoothTimeInFrames) -{ - ma_gainer_config config; - - MA_ZERO_OBJECT(&config); - config.channels = channels; - config.smoothTimeInFrames = smoothTimeInFrames; - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t oldGainsOffset; - size_t newGainsOffset; -} ma_gainer_heap_layout; - -static ma_result ma_gainer_get_heap_layout(const ma_gainer_config* pConfig, ma_gainer_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* Old gains. */ - pHeapLayout->oldGainsOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels; - - /* New gains. */ - pHeapLayout->newGainsOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels; - - /* Alignment. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - - -MA_API ma_result ma_gainer_get_heap_size(const ma_gainer_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_gainer_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_gainer_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - - -MA_API ma_result ma_gainer_init_preallocated(const ma_gainer_config* pConfig, void* pHeap, ma_gainer* pGainer) -{ - ma_result result; - ma_gainer_heap_layout heapLayout; - ma_uint32 iChannel; - - if (pGainer == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pGainer); - - if (pConfig == NULL || pHeap == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_gainer_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pGainer->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pGainer->pOldGains = (float*)ma_offset_ptr(pHeap, heapLayout.oldGainsOffset); - pGainer->pNewGains = (float*)ma_offset_ptr(pHeap, heapLayout.newGainsOffset); - - pGainer->config = *pConfig; - pGainer->t = (ma_uint32)-1; /* No interpolation by default. */ - - for (iChannel = 0; iChannel < pConfig->channels; iChannel += 1) { - pGainer->pOldGains[iChannel] = 1; - pGainer->pNewGains[iChannel] = 1; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_gainer_init(const ma_gainer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_gainer* pGainer) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_gainer_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the size of the heap allocation. */ - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_gainer_init_preallocated(pConfig, pHeap, pGainer); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pGainer->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_gainer_uninit(ma_gainer* pGainer, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pGainer == NULL) { - return; - } - - if (pGainer->_ownsHeap) { - ma_free(pGainer->_pHeap, pAllocationCallbacks); - } -} - -static float ma_gainer_calculate_current_gain(const ma_gainer* pGainer, ma_uint32 channel) -{ - float a = (float)pGainer->t / pGainer->config.smoothTimeInFrames; - return ma_mix_f32_fast(pGainer->pOldGains[channel], pGainer->pNewGains[channel], a); -} - -MA_API ma_result ma_gainer_process_pcm_frames(ma_gainer* pGainer, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint32 iChannel; - float* pFramesOutF32 = (float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - if (pGainer == NULL) { - return MA_INVALID_ARGS; - } - - if (pGainer->t >= pGainer->config.smoothTimeInFrames) { - /* Fast path. No gain calculation required. */ - ma_copy_and_apply_volume_factor_per_channel_f32(pFramesOutF32, pFramesInF32, frameCount, pGainer->config.channels, pGainer->pNewGains); - - /* Now that some frames have been processed we need to make sure future changes to the gain are interpolated. */ - if (pGainer->t == (ma_uint32)-1) { - pGainer->t = pGainer->config.smoothTimeInFrames; - } - } else { - /* Slow path. Need to interpolate the gain for each channel individually. */ - - /* We can allow the input and output buffers to be null in which case we'll just update the internal timer. */ - if (pFramesOut != NULL && pFramesIn != NULL) { - float a = (float)pGainer->t / pGainer->config.smoothTimeInFrames; - float d = 1.0f / pGainer->config.smoothTimeInFrames; - ma_uint32 channelCount = pGainer->config.channels; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channelCount; iChannel += 1) { - pFramesOutF32[iChannel] = pFramesInF32[iChannel] * ma_mix_f32_fast(pGainer->pOldGains[iChannel], pGainer->pNewGains[iChannel], a); - } - - pFramesOutF32 += channelCount; - pFramesInF32 += channelCount; - - a += d; - if (a > 1) { - a = 1; - } - } - } - - pGainer->t = (ma_uint32)ma_min(pGainer->t + frameCount, pGainer->config.smoothTimeInFrames); - - #if 0 /* Reference implementation. */ - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - /* We can allow the input and output buffers to be null in which case we'll just update the internal timer. */ - if (pFramesOut != NULL && pFramesIn != NULL) { - for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) { - pFramesOutF32[iFrame*pGainer->config.channels + iChannel] = pFramesInF32[iFrame*pGainer->config.channels + iChannel] * ma_gainer_calculate_current_gain(pGainer, iChannel); - } - } - - /* Move interpolation time forward, but don't go beyond our smoothing time. */ - pGainer->t = ma_min(pGainer->t + 1, pGainer->config.smoothTimeInFrames); - } - #endif - } - - return MA_SUCCESS; -} - -static void ma_gainer_set_gain_by_index(ma_gainer* pGainer, float newGain, ma_uint32 iChannel) -{ - pGainer->pOldGains[iChannel] = ma_gainer_calculate_current_gain(pGainer, iChannel); - pGainer->pNewGains[iChannel] = newGain; -} - -static void ma_gainer_reset_smoothing_time(ma_gainer* pGainer) -{ - if (pGainer->t == (ma_uint32)-1) { - pGainer->t = pGainer->config.smoothTimeInFrames; /* No smoothing required for initial gains setting. */ - } else { - pGainer->t = 0; - } -} - -MA_API ma_result ma_gainer_set_gain(ma_gainer* pGainer, float newGain) -{ - ma_uint32 iChannel; - - if (pGainer == NULL) { - return MA_INVALID_ARGS; - } - - for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) { - ma_gainer_set_gain_by_index(pGainer, newGain, iChannel); - } - - /* The smoothing time needs to be reset to ensure we always interpolate by the configured smoothing time, but only if it's not the first setting. */ - ma_gainer_reset_smoothing_time(pGainer); - - return MA_SUCCESS; -} - -MA_API ma_result ma_gainer_set_gains(ma_gainer* pGainer, float* pNewGains) -{ - ma_uint32 iChannel; - - if (pGainer == NULL || pNewGains == NULL) { - return MA_INVALID_ARGS; - } - - for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) { - ma_gainer_set_gain_by_index(pGainer, pNewGains[iChannel], iChannel); - } - - /* The smoothing time needs to be reset to ensure we always interpolate by the configured smoothing time, but only if it's not the first setting. */ - ma_gainer_reset_smoothing_time(pGainer); - - return MA_SUCCESS; -} - - -MA_API ma_panner_config ma_panner_config_init(ma_format format, ma_uint32 channels) -{ - ma_panner_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.mode = ma_pan_mode_balance; /* Set to balancing mode by default because it's consistent with other audio engines and most likely what the caller is expecting. */ - config.pan = 0; - - return config; -} - - -MA_API ma_result ma_panner_init(const ma_panner_config* pConfig, ma_panner* pPanner) -{ - if (pPanner == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pPanner); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - pPanner->format = pConfig->format; - pPanner->channels = pConfig->channels; - pPanner->mode = pConfig->mode; - pPanner->pan = pConfig->pan; - - return MA_SUCCESS; -} - -static void ma_stereo_balance_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, float pan) -{ - ma_uint64 iFrame; - - if (pan > 0) { - float factor = 1.0f - pan; - if (pFramesOut == pFramesIn) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - pFramesOut[iFrame*2 + 0] = pFramesIn[iFrame*2 + 0] * factor; - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - pFramesOut[iFrame*2 + 0] = pFramesIn[iFrame*2 + 0] * factor; - pFramesOut[iFrame*2 + 1] = pFramesIn[iFrame*2 + 1]; - } - } - } else { - float factor = 1.0f + pan; - if (pFramesOut == pFramesIn) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - pFramesOut[iFrame*2 + 1] = pFramesIn[iFrame*2 + 1] * factor; - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - pFramesOut[iFrame*2 + 0] = pFramesIn[iFrame*2 + 0]; - pFramesOut[iFrame*2 + 1] = pFramesIn[iFrame*2 + 1] * factor; - } - } - } -} - -static void ma_stereo_balance_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, float pan) -{ - if (pan == 0) { - /* Fast path. No panning required. */ - if (pFramesOut == pFramesIn) { - /* No-op */ - } else { - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2); - } - - return; - } - - switch (format) { - case ma_format_f32: ma_stereo_balance_pcm_frames_f32((float*)pFramesOut, (float*)pFramesIn, frameCount, pan); break; - - /* Unknown format. Just copy. */ - default: - { - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2); - } break; - } -} - - -static void ma_stereo_pan_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, float pan) -{ - ma_uint64 iFrame; - - if (pan > 0) { - float factorL0 = 1.0f - pan; - float factorL1 = 0.0f + pan; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float sample0 = (pFramesIn[iFrame*2 + 0] * factorL0); - float sample1 = (pFramesIn[iFrame*2 + 0] * factorL1) + pFramesIn[iFrame*2 + 1]; - - pFramesOut[iFrame*2 + 0] = sample0; - pFramesOut[iFrame*2 + 1] = sample1; - } - } else { - float factorR0 = 0.0f - pan; - float factorR1 = 1.0f + pan; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float sample0 = pFramesIn[iFrame*2 + 0] + (pFramesIn[iFrame*2 + 1] * factorR0); - float sample1 = (pFramesIn[iFrame*2 + 1] * factorR1); - - pFramesOut[iFrame*2 + 0] = sample0; - pFramesOut[iFrame*2 + 1] = sample1; - } - } -} - -static void ma_stereo_pan_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, float pan) -{ - if (pan == 0) { - /* Fast path. No panning required. */ - if (pFramesOut == pFramesIn) { - /* No-op */ - } else { - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2); - } - - return; - } - - switch (format) { - case ma_format_f32: ma_stereo_pan_pcm_frames_f32((float*)pFramesOut, (float*)pFramesIn, frameCount, pan); break; - - /* Unknown format. Just copy. */ - default: - { - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2); - } break; - } -} - -MA_API ma_result ma_panner_process_pcm_frames(ma_panner* pPanner, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pPanner == NULL || pFramesOut == NULL || pFramesIn == NULL) { - return MA_INVALID_ARGS; - } - - if (pPanner->channels == 2) { - /* Stereo case. For now assume channel 0 is left and channel right is 1, but should probably add support for a channel map. */ - if (pPanner->mode == ma_pan_mode_balance) { - ma_stereo_balance_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->pan); - } else { - ma_stereo_pan_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->pan); - } - } else { - if (pPanner->channels == 1) { - /* Panning has no effect on mono streams. */ - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->channels); - } else { - /* For now we're not going to support non-stereo set ups. Not sure how I want to handle this case just yet. */ - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->channels); - } - } - - return MA_SUCCESS; -} - -MA_API void ma_panner_set_mode(ma_panner* pPanner, ma_pan_mode mode) -{ - if (pPanner == NULL) { - return; - } - - pPanner->mode = mode; -} - -MA_API ma_pan_mode ma_panner_get_mode(const ma_panner* pPanner) -{ - if (pPanner == NULL) { - return ma_pan_mode_balance; - } - - return pPanner->mode; -} - -MA_API void ma_panner_set_pan(ma_panner* pPanner, float pan) -{ - if (pPanner == NULL) { - return; - } - - pPanner->pan = ma_clamp(pan, -1.0f, 1.0f); -} - -MA_API float ma_panner_get_pan(const ma_panner* pPanner) -{ - if (pPanner == NULL) { - return 0; - } - - return pPanner->pan; -} - - - - -MA_API ma_fader_config ma_fader_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate) -{ - ma_fader_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - - return config; -} - - -MA_API ma_result ma_fader_init(const ma_fader_config* pConfig, ma_fader* pFader) -{ - if (pFader == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pFader); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Only f32 is supported for now. */ - if (pConfig->format != ma_format_f32) { - return MA_INVALID_ARGS; - } - - pFader->config = *pConfig; - pFader->volumeBeg = 1; - pFader->volumeEnd = 1; - pFader->lengthInFrames = 0; - pFader->cursorInFrames = 0; - - return MA_SUCCESS; -} - -MA_API ma_result ma_fader_process_pcm_frames(ma_fader* pFader, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pFader == NULL) { - return MA_INVALID_ARGS; - } - - /* - For now we need to clamp frameCount so that the cursor never overflows 32-bits. This is required for - the conversion to a float which we use for the linear interpolation. This might be changed later. - */ - if (frameCount + pFader->cursorInFrames > UINT_MAX) { - frameCount = UINT_MAX - pFader->cursorInFrames; - } - - /* Optimized path if volumeBeg and volumeEnd are equal. */ - if (pFader->volumeBeg == pFader->volumeEnd) { - if (pFader->volumeBeg == 1) { - /* Straight copy. */ - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, pFader->config.format, pFader->config.channels); - } else { - /* Copy with volume. */ - ma_copy_and_apply_volume_and_clip_pcm_frames(pFramesOut, pFramesIn, frameCount, pFader->config.format, pFader->config.channels, pFader->volumeEnd); - } - } else { - /* Slower path. Volumes are different, so may need to do an interpolation. */ - if (pFader->cursorInFrames >= pFader->lengthInFrames) { - /* Fast path. We've gone past the end of the fade period so just apply the end volume to all samples. */ - ma_copy_and_apply_volume_and_clip_pcm_frames(pFramesOut, pFramesIn, frameCount, pFader->config.format, pFader->config.channels, pFader->volumeEnd); - } else { - /* Slow path. This is where we do the actual fading. */ - ma_uint64 iFrame; - ma_uint32 iChannel; - - /* For now we only support f32. Support for other formats will be added later. */ - if (pFader->config.format == ma_format_f32) { - const float* pFramesInF32 = (const float*)pFramesIn; - /* */ float* pFramesOutF32 = ( float*)pFramesOut; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float a = (ma_uint32)ma_min(pFader->cursorInFrames + iFrame, pFader->lengthInFrames) / (float)((ma_uint32)pFader->lengthInFrames); /* Safe cast due to the frameCount clamp at the top of this function. */ - float volume = ma_mix_f32_fast(pFader->volumeBeg, pFader->volumeEnd, a); - - for (iChannel = 0; iChannel < pFader->config.channels; iChannel += 1) { - pFramesOutF32[iFrame*pFader->config.channels + iChannel] = pFramesInF32[iFrame*pFader->config.channels + iChannel] * volume; - } - } - } else { - return MA_NOT_IMPLEMENTED; - } - } - } - - pFader->cursorInFrames += frameCount; - - return MA_SUCCESS; -} - -MA_API void ma_fader_get_data_format(const ma_fader* pFader, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate) -{ - if (pFader == NULL) { - return; - } - - if (pFormat != NULL) { - *pFormat = pFader->config.format; - } - - if (pChannels != NULL) { - *pChannels = pFader->config.channels; - } - - if (pSampleRate != NULL) { - *pSampleRate = pFader->config.sampleRate; - } -} - -MA_API void ma_fader_set_fade(ma_fader* pFader, float volumeBeg, float volumeEnd, ma_uint64 lengthInFrames) -{ - if (pFader == NULL) { - return; - } - - /* If the volume is negative, use current volume. */ - if (volumeBeg < 0) { - volumeBeg = ma_fader_get_current_volume(pFader); - } - - /* - The length needs to be clamped to 32-bits due to how we convert it to a float for linear - interpolation reasons. I might change this requirement later, but for now it's not important. - */ - if (lengthInFrames > UINT_MAX) { - lengthInFrames = UINT_MAX; - } - - pFader->volumeBeg = volumeBeg; - pFader->volumeEnd = volumeEnd; - pFader->lengthInFrames = lengthInFrames; - pFader->cursorInFrames = 0; /* Reset cursor. */ -} - -MA_API float ma_fader_get_current_volume(ma_fader* pFader) -{ - if (pFader == NULL) { - return 0.0f; - } - - /* The current volume depends on the position of the cursor. */ - if (pFader->cursorInFrames == 0) { - return pFader->volumeBeg; - } else if (pFader->cursorInFrames >= pFader->lengthInFrames) { - return pFader->volumeEnd; - } else { - /* The cursor is somewhere inside the fading period. We can figure this out with a simple linear interpoluation between volumeBeg and volumeEnd based on our cursor position. */ - return ma_mix_f32_fast(pFader->volumeBeg, pFader->volumeEnd, (ma_uint32)pFader->cursorInFrames / (float)((ma_uint32)pFader->lengthInFrames)); /* Safe cast to uint32 because we clamp it in ma_fader_process_pcm_frames(). */ - } -} - - - - - -MA_API ma_vec3f ma_vec3f_init_3f(float x, float y, float z) -{ - ma_vec3f v; - - v.x = x; - v.y = y; - v.z = z; - - return v; -} - -MA_API ma_vec3f ma_vec3f_sub(ma_vec3f a, ma_vec3f b) -{ - return ma_vec3f_init_3f( - a.x - b.x, - a.y - b.y, - a.z - b.z - ); -} - -MA_API ma_vec3f ma_vec3f_neg(ma_vec3f a) -{ - return ma_vec3f_init_3f( - -a.x, - -a.y, - -a.z - ); -} - -MA_API float ma_vec3f_dot(ma_vec3f a, ma_vec3f b) -{ - return a.x*b.x + a.y*b.y + a.z*b.z; -} - -MA_API float ma_vec3f_len2(ma_vec3f v) -{ - return ma_vec3f_dot(v, v); -} - -MA_API float ma_vec3f_len(ma_vec3f v) -{ - return (float)ma_sqrtd(ma_vec3f_len2(v)); -} - -MA_API float ma_vec3f_dist(ma_vec3f a, ma_vec3f b) -{ - return ma_vec3f_len(ma_vec3f_sub(a, b)); -} - -MA_API ma_vec3f ma_vec3f_normalize(ma_vec3f v) -{ - float f; - float l = ma_vec3f_len(v); - if (l == 0) { - return ma_vec3f_init_3f(0, 0, 0); - } - - f = 1 / l; - v.x *= f; - v.y *= f; - v.z *= f; - - return v; -} - -MA_API ma_vec3f ma_vec3f_cross(ma_vec3f a, ma_vec3f b) -{ - return ma_vec3f_init_3f( - a.y*b.z - a.z*b.y, - a.z*b.x - a.x*b.z, - a.x*b.y - a.y*b.x - ); -} - - - -static void ma_channel_map_apply_f32(float* pFramesOut, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, const float* pFramesIn, const ma_channel* pChannelMapIn, ma_uint32 channelsIn, ma_uint64 frameCount, ma_channel_mix_mode mode, ma_mono_expansion_mode monoExpansionMode); -static ma_bool32 ma_is_spatial_channel_position(ma_channel channelPosition); - - -#ifndef MA_DEFAULT_SPEED_OF_SOUND -#define MA_DEFAULT_SPEED_OF_SOUND 343.3f -#endif - -/* -These vectors represent the direction that speakers are facing from the center point. They're used -for panning in the spatializer. Must be normalized. -*/ -static ma_vec3f g_maChannelDirections[MA_CHANNEL_POSITION_COUNT] = { - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_NONE */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_MONO */ - {-0.7071f, 0.0f, -0.7071f }, /* MA_CHANNEL_FRONT_LEFT */ - {+0.7071f, 0.0f, -0.7071f }, /* MA_CHANNEL_FRONT_RIGHT */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_FRONT_CENTER */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_LFE */ - {-0.7071f, 0.0f, +0.7071f }, /* MA_CHANNEL_BACK_LEFT */ - {+0.7071f, 0.0f, +0.7071f }, /* MA_CHANNEL_BACK_RIGHT */ - {-0.3162f, 0.0f, -0.9487f }, /* MA_CHANNEL_FRONT_LEFT_CENTER */ - {+0.3162f, 0.0f, -0.9487f }, /* MA_CHANNEL_FRONT_RIGHT_CENTER */ - { 0.0f, 0.0f, +1.0f }, /* MA_CHANNEL_BACK_CENTER */ - {-1.0f, 0.0f, 0.0f }, /* MA_CHANNEL_SIDE_LEFT */ - {+1.0f, 0.0f, 0.0f }, /* MA_CHANNEL_SIDE_RIGHT */ - { 0.0f, +1.0f, 0.0f }, /* MA_CHANNEL_TOP_CENTER */ - {-0.5774f, +0.5774f, -0.5774f }, /* MA_CHANNEL_TOP_FRONT_LEFT */ - { 0.0f, +0.7071f, -0.7071f }, /* MA_CHANNEL_TOP_FRONT_CENTER */ - {+0.5774f, +0.5774f, -0.5774f }, /* MA_CHANNEL_TOP_FRONT_RIGHT */ - {-0.5774f, +0.5774f, +0.5774f }, /* MA_CHANNEL_TOP_BACK_LEFT */ - { 0.0f, +0.7071f, +0.7071f }, /* MA_CHANNEL_TOP_BACK_CENTER */ - {+0.5774f, +0.5774f, +0.5774f }, /* MA_CHANNEL_TOP_BACK_RIGHT */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_0 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_1 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_2 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_3 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_4 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_5 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_6 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_7 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_8 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_9 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_10 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_11 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_12 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_13 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_14 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_15 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_16 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_17 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_18 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_19 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_20 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_21 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_22 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_23 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_24 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_25 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_26 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_27 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_28 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_29 */ - { 0.0f, 0.0f, -1.0f }, /* MA_CHANNEL_AUX_30 */ - { 0.0f, 0.0f, -1.0f } /* MA_CHANNEL_AUX_31 */ -}; - -static ma_vec3f ma_get_channel_direction(ma_channel channel) -{ - if (channel >= MA_CHANNEL_POSITION_COUNT) { - return ma_vec3f_init_3f(0, 0, -1); - } else { - return g_maChannelDirections[channel]; - } -} - - - -static float ma_attenuation_inverse(float distance, float minDistance, float maxDistance, float rolloff) -{ - if (minDistance >= maxDistance) { - return 1; /* To avoid division by zero. Do not attenuate. */ - } - - return minDistance / (minDistance + rolloff * (ma_clamp(distance, minDistance, maxDistance) - minDistance)); -} - -static float ma_attenuation_linear(float distance, float minDistance, float maxDistance, float rolloff) -{ - if (minDistance >= maxDistance) { - return 1; /* To avoid division by zero. Do not attenuate. */ - } - - return 1 - rolloff * (ma_clamp(distance, minDistance, maxDistance) - minDistance) / (maxDistance - minDistance); -} - -static float ma_attenuation_exponential(float distance, float minDistance, float maxDistance, float rolloff) -{ - if (minDistance >= maxDistance) { - return 1; /* To avoid division by zero. Do not attenuate. */ - } - - return (float)ma_powd(ma_clamp(distance, minDistance, maxDistance) / minDistance, -rolloff); -} - - -/* -Dopper Effect calculation taken from the OpenAL spec, with two main differences: - - 1) The source to listener vector will have already been calcualted at an earlier step so we can - just use that directly. We need only the position of the source relative to the origin. - - 2) We don't scale by a frequency because we actually just want the ratio which we'll plug straight - into the resampler directly. -*/ -static float ma_doppler_pitch(ma_vec3f relativePosition, ma_vec3f sourceVelocity, ma_vec3f listenVelocity, float speedOfSound, float dopplerFactor) -{ - float len; - float vls; - float vss; - - len = ma_vec3f_len(relativePosition); - - /* - There's a case where the position of the source will be right on top of the listener in which - case the length will be 0 and we'll end up with a division by zero. We can just return a ratio - of 1.0 in this case. This is not considered in the OpenAL spec, but is necessary. - */ - if (len == 0) { - return 1.0; - } - - vls = ma_vec3f_dot(relativePosition, listenVelocity) / len; - vss = ma_vec3f_dot(relativePosition, sourceVelocity) / len; - - vls = ma_min(vls, speedOfSound / dopplerFactor); - vss = ma_min(vss, speedOfSound / dopplerFactor); - - return (speedOfSound - dopplerFactor*vls) / (speedOfSound - dopplerFactor*vss); -} - - -static void ma_get_default_channel_map_for_spatializer(ma_channel* pChannelMap, size_t channelMapCap, ma_uint32 channelCount) -{ - /* - Special case for stereo. Want to default the left and right speakers to side left and side - right so that they're facing directly down the X axis rather than slightly forward. Not - doing this will result in sounds being quieter when behind the listener. This might - actually be good for some scenerios, but I don't think it's an appropriate default because - it can be a bit unexpected. - */ - if (channelCount == 2) { - pChannelMap[0] = MA_CHANNEL_SIDE_LEFT; - pChannelMap[1] = MA_CHANNEL_SIDE_RIGHT; - } else { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channelCount); - } -} - - -MA_API ma_spatializer_listener_config ma_spatializer_listener_config_init(ma_uint32 channelsOut) -{ - ma_spatializer_listener_config config; - - MA_ZERO_OBJECT(&config); - config.channelsOut = channelsOut; - config.pChannelMapOut = NULL; - config.handedness = ma_handedness_right; - config.worldUp = ma_vec3f_init_3f(0, 1, 0); - config.coneInnerAngleInRadians = 6.283185f; /* 360 degrees. */ - config.coneOuterAngleInRadians = 6.283185f; /* 360 degrees. */ - config.coneOuterGain = 0; - config.speedOfSound = 343.3f; /* Same as OpenAL. Used for doppler effect. */ - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t channelMapOutOffset; -} ma_spatializer_listener_heap_layout; - -static ma_result ma_spatializer_listener_get_heap_layout(const ma_spatializer_listener_config* pConfig, ma_spatializer_listener_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channelsOut == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* Channel map. We always need this, even for passthroughs. */ - pHeapLayout->channelMapOutOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(sizeof(*pConfig->pChannelMapOut) * pConfig->channelsOut); - - return MA_SUCCESS; -} - - -MA_API ma_result ma_spatializer_listener_get_heap_size(const ma_spatializer_listener_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_spatializer_listener_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_spatializer_listener_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_spatializer_listener_init_preallocated(const ma_spatializer_listener_config* pConfig, void* pHeap, ma_spatializer_listener* pListener) -{ - ma_result result; - ma_spatializer_listener_heap_layout heapLayout; - - if (pListener == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pListener); - - result = ma_spatializer_listener_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pListener->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pListener->config = *pConfig; - pListener->position = ma_vec3f_init_3f(0, 0, 0); - pListener->direction = ma_vec3f_init_3f(0, 0, -1); - pListener->velocity = ma_vec3f_init_3f(0, 0, 0); - pListener->isEnabled = MA_TRUE; - - /* Swap the forward direction if we're left handed (it was initialized based on right handed). */ - if (pListener->config.handedness == ma_handedness_left) { - pListener->direction = ma_vec3f_neg(pListener->direction); - } - - - /* We must always have a valid channel map. */ - pListener->config.pChannelMapOut = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapOutOffset); - - /* Use a slightly different default channel map for stereo. */ - if (pConfig->pChannelMapOut == NULL) { - ma_get_default_channel_map_for_spatializer(pListener->config.pChannelMapOut, pConfig->channelsOut, pConfig->channelsOut); - } else { - ma_channel_map_copy_or_default(pListener->config.pChannelMapOut, pConfig->channelsOut, pConfig->pChannelMapOut, pConfig->channelsOut); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_spatializer_listener_init(const ma_spatializer_listener_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer_listener* pListener) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_spatializer_listener_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_spatializer_listener_init_preallocated(pConfig, pHeap, pListener); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pListener->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_spatializer_listener_uninit(ma_spatializer_listener* pListener, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pListener == NULL) { - return; - } - - if (pListener->_ownsHeap) { - ma_free(pListener->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_channel* ma_spatializer_listener_get_channel_map(ma_spatializer_listener* pListener) -{ - if (pListener == NULL) { - return NULL; - } - - return pListener->config.pChannelMapOut; -} - -MA_API void ma_spatializer_listener_set_cone(ma_spatializer_listener* pListener, float innerAngleInRadians, float outerAngleInRadians, float outerGain) -{ - if (pListener == NULL) { - return; - } - - pListener->config.coneInnerAngleInRadians = innerAngleInRadians; - pListener->config.coneOuterAngleInRadians = outerAngleInRadians; - pListener->config.coneOuterGain = outerGain; -} - -MA_API void ma_spatializer_listener_get_cone(const ma_spatializer_listener* pListener, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain) -{ - if (pListener == NULL) { - return; - } - - if (pInnerAngleInRadians != NULL) { - *pInnerAngleInRadians = pListener->config.coneInnerAngleInRadians; - } - - if (pOuterAngleInRadians != NULL) { - *pOuterAngleInRadians = pListener->config.coneOuterAngleInRadians; - } - - if (pOuterGain != NULL) { - *pOuterGain = pListener->config.coneOuterGain; - } -} - -MA_API void ma_spatializer_listener_set_position(ma_spatializer_listener* pListener, float x, float y, float z) -{ - if (pListener == NULL) { - return; - } - - pListener->position = ma_vec3f_init_3f(x, y, z); -} - -MA_API ma_vec3f ma_spatializer_listener_get_position(const ma_spatializer_listener* pListener) -{ - if (pListener == NULL) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return pListener->position; -} - -MA_API void ma_spatializer_listener_set_direction(ma_spatializer_listener* pListener, float x, float y, float z) -{ - if (pListener == NULL) { - return; - } - - pListener->direction = ma_vec3f_init_3f(x, y, z); -} - -MA_API ma_vec3f ma_spatializer_listener_get_direction(const ma_spatializer_listener* pListener) -{ - if (pListener == NULL) { - return ma_vec3f_init_3f(0, 0, -1); - } - - return pListener->direction; -} - -MA_API void ma_spatializer_listener_set_velocity(ma_spatializer_listener* pListener, float x, float y, float z) -{ - if (pListener == NULL) { - return; - } - - pListener->velocity = ma_vec3f_init_3f(x, y, z); -} - -MA_API ma_vec3f ma_spatializer_listener_get_velocity(const ma_spatializer_listener* pListener) -{ - if (pListener == NULL) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return pListener->velocity; -} - -MA_API void ma_spatializer_listener_set_speed_of_sound(ma_spatializer_listener* pListener, float speedOfSound) -{ - if (pListener == NULL) { - return; - } - - pListener->config.speedOfSound = speedOfSound; -} - -MA_API float ma_spatializer_listener_get_speed_of_sound(const ma_spatializer_listener* pListener) -{ - if (pListener == NULL) { - return 0; - } - - return pListener->config.speedOfSound; -} - -MA_API void ma_spatializer_listener_set_world_up(ma_spatializer_listener* pListener, float x, float y, float z) -{ - if (pListener == NULL) { - return; - } - - pListener->config.worldUp = ma_vec3f_init_3f(x, y, z); -} - -MA_API ma_vec3f ma_spatializer_listener_get_world_up(const ma_spatializer_listener* pListener) -{ - if (pListener == NULL) { - return ma_vec3f_init_3f(0, 1, 0); - } - - return pListener->config.worldUp; -} - -MA_API void ma_spatializer_listener_set_enabled(ma_spatializer_listener* pListener, ma_bool32 isEnabled) -{ - if (pListener == NULL) { - return; - } - - pListener->isEnabled = isEnabled; -} - -MA_API ma_bool32 ma_spatializer_listener_is_enabled(const ma_spatializer_listener* pListener) -{ - if (pListener == NULL) { - return MA_FALSE; - } - - return pListener->isEnabled; -} - - - - -MA_API ma_spatializer_config ma_spatializer_config_init(ma_uint32 channelsIn, ma_uint32 channelsOut) -{ - ma_spatializer_config config; - - MA_ZERO_OBJECT(&config); - config.channelsIn = channelsIn; - config.channelsOut = channelsOut; - config.pChannelMapIn = NULL; - config.attenuationModel = ma_attenuation_model_inverse; - config.positioning = ma_positioning_absolute; - config.handedness = ma_handedness_right; - config.minGain = 0; - config.maxGain = 1; - config.minDistance = 1; - config.maxDistance = MA_FLT_MAX; - config.rolloff = 1; - config.coneInnerAngleInRadians = 6.283185f; /* 360 degrees. */ - config.coneOuterAngleInRadians = 6.283185f; /* 360 degress. */ - config.coneOuterGain = 0.0f; - config.dopplerFactor = 1; - config.directionalAttenuationFactor = 1; - config.gainSmoothTimeInFrames = 360; /* 7.5ms @ 48K. */ - - return config; -} - - -static ma_gainer_config ma_spatializer_gainer_config_init(const ma_spatializer_config* pConfig) -{ - MA_ASSERT(pConfig != NULL); - return ma_gainer_config_init(pConfig->channelsOut, pConfig->gainSmoothTimeInFrames); -} - -static ma_result ma_spatializer_validate_config(const ma_spatializer_config* pConfig) -{ - MA_ASSERT(pConfig != NULL); - - if (pConfig->channelsIn == 0 || pConfig->channelsOut == 0) { - return MA_INVALID_ARGS; - } - - return MA_SUCCESS; -} - -typedef struct -{ - size_t sizeInBytes; - size_t channelMapInOffset; - size_t newChannelGainsOffset; - size_t gainerOffset; -} ma_spatializer_heap_layout; - -static ma_result ma_spatializer_get_heap_layout(const ma_spatializer_config* pConfig, ma_spatializer_heap_layout* pHeapLayout) -{ - ma_result result; - - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_spatializer_validate_config(pConfig); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes = 0; - - /* Channel map. */ - pHeapLayout->channelMapInOffset = MA_SIZE_MAX; /* <-- MA_SIZE_MAX indicates no allocation necessary. */ - if (pConfig->pChannelMapIn != NULL) { - pHeapLayout->channelMapInOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(sizeof(*pConfig->pChannelMapIn) * pConfig->channelsIn); - } - - /* New channel gains for output. */ - pHeapLayout->newChannelGainsOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(sizeof(float) * pConfig->channelsOut); - - /* Gainer. */ - { - size_t gainerHeapSizeInBytes; - ma_gainer_config gainerConfig; - - gainerConfig = ma_spatializer_gainer_config_init(pConfig); - - result = ma_gainer_get_heap_size(&gainerConfig, &gainerHeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->gainerOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(gainerHeapSizeInBytes); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_spatializer_get_heap_size(const ma_spatializer_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_spatializer_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; /* Safety. */ - - result = ma_spatializer_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - - -MA_API ma_result ma_spatializer_init_preallocated(const ma_spatializer_config* pConfig, void* pHeap, ma_spatializer* pSpatializer) -{ - ma_result result; - ma_spatializer_heap_layout heapLayout; - ma_gainer_config gainerConfig; - - if (pSpatializer == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pSpatializer); - - if (pConfig == NULL || pHeap == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_spatializer_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pSpatializer->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pSpatializer->channelsIn = pConfig->channelsIn; - pSpatializer->channelsOut = pConfig->channelsOut; - pSpatializer->attenuationModel = pConfig->attenuationModel; - pSpatializer->positioning = pConfig->positioning; - pSpatializer->handedness = pConfig->handedness; - pSpatializer->minGain = pConfig->minGain; - pSpatializer->maxGain = pConfig->maxGain; - pSpatializer->minDistance = pConfig->minDistance; - pSpatializer->maxDistance = pConfig->maxDistance; - pSpatializer->rolloff = pConfig->rolloff; - pSpatializer->coneInnerAngleInRadians = pConfig->coneInnerAngleInRadians; - pSpatializer->coneOuterAngleInRadians = pConfig->coneOuterAngleInRadians; - pSpatializer->coneOuterGain = pConfig->coneOuterGain; - pSpatializer->dopplerFactor = pConfig->dopplerFactor; - pSpatializer->directionalAttenuationFactor = pConfig->directionalAttenuationFactor; - pSpatializer->gainSmoothTimeInFrames = pConfig->gainSmoothTimeInFrames; - pSpatializer->position = ma_vec3f_init_3f(0, 0, 0); - pSpatializer->direction = ma_vec3f_init_3f(0, 0, -1); - pSpatializer->velocity = ma_vec3f_init_3f(0, 0, 0); - pSpatializer->dopplerPitch = 1; - - /* Swap the forward direction if we're left handed (it was initialized based on right handed). */ - if (pSpatializer->handedness == ma_handedness_left) { - pSpatializer->direction = ma_vec3f_neg(pSpatializer->direction); - } - - /* Channel map. This will be on the heap. */ - if (pConfig->pChannelMapIn != NULL) { - pSpatializer->pChannelMapIn = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapInOffset); - ma_channel_map_copy_or_default(pSpatializer->pChannelMapIn, pSpatializer->channelsIn, pConfig->pChannelMapIn, pSpatializer->channelsIn); - } - - /* New channel gains for output channels. */ - pSpatializer->pNewChannelGainsOut = (float*)ma_offset_ptr(pHeap, heapLayout.newChannelGainsOffset); - - /* Gainer. */ - gainerConfig = ma_spatializer_gainer_config_init(pConfig); - - result = ma_gainer_init_preallocated(&gainerConfig, ma_offset_ptr(pHeap, heapLayout.gainerOffset), &pSpatializer->gainer); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the gainer. */ - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_spatializer_init(const ma_spatializer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer* pSpatializer) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - /* We'll need a heap allocation to retrieve the size. */ - result = ma_spatializer_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_spatializer_init_preallocated(pConfig, pHeap, pSpatializer); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pSpatializer->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_spatializer_uninit(ma_spatializer* pSpatializer, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pSpatializer == NULL) { - return; - } - - ma_gainer_uninit(&pSpatializer->gainer, pAllocationCallbacks); - - if (pSpatializer->_ownsHeap) { - ma_free(pSpatializer->_pHeap, pAllocationCallbacks); - } -} - -static float ma_calculate_angular_gain(ma_vec3f dirA, ma_vec3f dirB, float coneInnerAngleInRadians, float coneOuterAngleInRadians, float coneOuterGain) -{ - /* - Angular attenuation. - - Unlike distance gain, the math for this is not specified by the OpenAL spec so we'll just go ahead and figure - this out for ourselves at the expense of possibly being inconsistent with other implementations. - - To do cone attenuation, I'm just using the same math that we'd use to implement a basic spotlight in OpenGL. We - just need to get the direction from the source to the listener and then do a dot product against that and the - direction of the spotlight. Then we just compare that dot product against the cosine of the inner and outer - angles. If the dot product is greater than the the outer angle, we just use coneOuterGain. If it's less than - the inner angle, we just use a gain of 1. Otherwise we linearly interpolate between 1 and coneOuterGain. - */ - if (coneInnerAngleInRadians < 6.283185f) { - float angularGain = 1; - float cutoffInner = (float)ma_cosd(coneInnerAngleInRadians*0.5f); - float cutoffOuter = (float)ma_cosd(coneOuterAngleInRadians*0.5f); - float d; - - d = ma_vec3f_dot(dirA, dirB); - - if (d > cutoffInner) { - /* It's inside the inner angle. */ - angularGain = 1; - } else { - /* It's outside the inner angle. */ - if (d > cutoffOuter) { - /* It's between the inner and outer angle. We need to linearly interpolate between 1 and coneOuterGain. */ - angularGain = ma_mix_f32(coneOuterGain, 1, (d - cutoffOuter) / (cutoffInner - cutoffOuter)); - } else { - /* It's outside the outer angle. */ - angularGain = coneOuterGain; - } - } - - /*printf("d = %f; cutoffInner = %f; cutoffOuter = %f; angularGain = %f\n", d, cutoffInner, cutoffOuter, angularGain);*/ - return angularGain; - } else { - /* Inner angle is 360 degrees so no need to do any attenuation. */ - return 1; - } -} - -MA_API ma_result ma_spatializer_process_pcm_frames(ma_spatializer* pSpatializer, ma_spatializer_listener* pListener, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_channel* pChannelMapIn = pSpatializer->pChannelMapIn; - ma_channel* pChannelMapOut = pListener->config.pChannelMapOut; - - if (pSpatializer == NULL) { - return MA_INVALID_ARGS; - } - - /* If we're not spatializing we need to run an optimized path. */ - if (c89atomic_load_i32(&pSpatializer->attenuationModel) == ma_attenuation_model_none) { - if (ma_spatializer_listener_is_enabled(pListener)) { - /* No attenuation is required, but we'll need to do some channel conversion. */ - if (pSpatializer->channelsIn == pSpatializer->channelsOut) { - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, ma_format_f32, pSpatializer->channelsIn); - } else { - ma_channel_map_apply_f32((float*)pFramesOut, pChannelMapOut, pSpatializer->channelsOut, (const float*)pFramesIn, pChannelMapIn, pSpatializer->channelsIn, frameCount, ma_channel_mix_mode_rectangular, ma_mono_expansion_mode_default); /* Safe casts to float* because f32 is the only supported format. */ - } - } else { - /* The listener is disabled. Output silence. */ - ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, pSpatializer->channelsOut); - } - - /* - We're not doing attenuation so don't bother with doppler for now. I'm not sure if this is - the correct thinking so might need to review this later. - */ - pSpatializer->dopplerPitch = 1; - } else { - /* - Let's first determine which listener the sound is closest to. Need to keep in mind that we - might not have a world or any listeners, in which case we just spatializer based on the - listener being positioned at the origin (0, 0, 0). - */ - ma_vec3f relativePosNormalized; - ma_vec3f relativePos; /* The position relative to the listener. */ - ma_vec3f relativeDir; /* The direction of the sound, relative to the listener. */ - ma_vec3f listenerVel; /* The volocity of the listener. For doppler pitch calculation. */ - float speedOfSound; - float distance = 0; - float gain = 1; - ma_uint32 iChannel; - const ma_uint32 channelsOut = pSpatializer->channelsOut; - const ma_uint32 channelsIn = pSpatializer->channelsIn; - float minDistance = ma_spatializer_get_min_distance(pSpatializer); - float maxDistance = ma_spatializer_get_max_distance(pSpatializer); - float rolloff = ma_spatializer_get_rolloff(pSpatializer); - float dopplerFactor = ma_spatializer_get_doppler_factor(pSpatializer); - - /* - We'll need the listener velocity for doppler pitch calculations. The speed of sound is - defined by the listener, so we'll grab that here too. - */ - if (pListener != NULL) { - listenerVel = pListener->velocity; - speedOfSound = pListener->config.speedOfSound; - } else { - listenerVel = ma_vec3f_init_3f(0, 0, 0); - speedOfSound = MA_DEFAULT_SPEED_OF_SOUND; - } - - if (pListener == NULL || ma_spatializer_get_positioning(pSpatializer) == ma_positioning_relative) { - /* There's no listener or we're using relative positioning. */ - relativePos = pSpatializer->position; - relativeDir = pSpatializer->direction; - } else { - /* - We've found a listener and we're using absolute positioning. We need to transform the - sound's position and direction so that it's relative to listener. Later on we'll use - this for determining the factors to apply to each channel to apply the panning effect. - */ - ma_spatializer_get_relative_position_and_direction(pSpatializer, pListener, &relativePos, &relativeDir); - } - - distance = ma_vec3f_len(relativePos); - - /* We've gathered the data, so now we can apply some spatialization. */ - switch (ma_spatializer_get_attenuation_model(pSpatializer)) { - case ma_attenuation_model_inverse: - { - gain = ma_attenuation_inverse(distance, minDistance, maxDistance, rolloff); - } break; - case ma_attenuation_model_linear: - { - gain = ma_attenuation_linear(distance, minDistance, maxDistance, rolloff); - } break; - case ma_attenuation_model_exponential: - { - gain = ma_attenuation_exponential(distance, minDistance, maxDistance, rolloff); - } break; - case ma_attenuation_model_none: - default: - { - gain = 1; - } break; - } - - /* Normalize the position. */ - if (distance > 0.001f) { - float distanceInv = 1/distance; - relativePosNormalized = relativePos; - relativePosNormalized.x *= distanceInv; - relativePosNormalized.y *= distanceInv; - relativePosNormalized.z *= distanceInv; - } else { - distance = 0; - relativePosNormalized = ma_vec3f_init_3f(0, 0, 0); - } - - /* - Angular attenuation. - - Unlike distance gain, the math for this is not specified by the OpenAL spec so we'll just go ahead and figure - this out for ourselves at the expense of possibly being inconsistent with other implementations. - - To do cone attenuation, I'm just using the same math that we'd use to implement a basic spotlight in OpenGL. We - just need to get the direction from the source to the listener and then do a dot product against that and the - direction of the spotlight. Then we just compare that dot product against the cosine of the inner and outer - angles. If the dot product is greater than the the outer angle, we just use coneOuterGain. If it's less than - the inner angle, we just use a gain of 1. Otherwise we linearly interpolate between 1 and coneOuterGain. - */ - if (distance > 0) { - /* Source anglular gain. */ - float spatializerConeInnerAngle; - float spatializerConeOuterAngle; - float spatializerConeOuterGain; - ma_spatializer_get_cone(pSpatializer, &spatializerConeInnerAngle, &spatializerConeOuterAngle, &spatializerConeOuterGain); - - gain *= ma_calculate_angular_gain(relativeDir, ma_vec3f_neg(relativePosNormalized), spatializerConeInnerAngle, spatializerConeOuterAngle, spatializerConeOuterGain); - - /* - We're supporting angular gain on the listener as well for those who want to reduce the volume of sounds that - are positioned behind the listener. On default settings, this will have no effect. - */ - if (pListener != NULL && pListener->config.coneInnerAngleInRadians < 6.283185f) { - ma_vec3f listenerDirection; - float listenerInnerAngle; - float listenerOuterAngle; - float listenerOuterGain; - - if (pListener->config.handedness == ma_handedness_right) { - listenerDirection = ma_vec3f_init_3f(0, 0, -1); - } else { - listenerDirection = ma_vec3f_init_3f(0, 0, +1); - } - - listenerInnerAngle = pListener->config.coneInnerAngleInRadians; - listenerOuterAngle = pListener->config.coneOuterAngleInRadians; - listenerOuterGain = pListener->config.coneOuterGain; - - gain *= ma_calculate_angular_gain(listenerDirection, relativePosNormalized, listenerInnerAngle, listenerOuterAngle, listenerOuterGain); - } - } else { - /* The sound is right on top of the listener. Don't do any angular attenuation. */ - } - - - /* Clamp the gain. */ - gain = ma_clamp(gain, ma_spatializer_get_min_gain(pSpatializer), ma_spatializer_get_max_gain(pSpatializer)); - - /* - Panning. This is where we'll apply the gain and convert to the output channel count. We have an optimized path for - when we're converting to a mono stream. In that case we don't really need to do any panning - we just apply the - gain to the final output. - */ - /*printf("distance=%f; gain=%f\n", distance, gain);*/ - - /* We must have a valid channel map here to ensure we spatialize properly. */ - MA_ASSERT(pChannelMapOut != NULL); - - /* - We're not converting to mono so we'll want to apply some panning. This is where the feeling of something being - to the left, right, infront or behind the listener is calculated. I'm just using a basic model here. Note that - the code below is not based on any specific algorithm. I'm just implementing this off the top of my head and - seeing how it goes. There might be better ways to do this. - - To determine the direction of the sound relative to a speaker I'm using dot products. Each speaker is given a - direction. For example, the left channel in a stereo system will be -1 on the X axis and the right channel will - be +1 on the X axis. A dot product is performed against the direction vector of the channel and the normalized - position of the sound. - */ - for (iChannel = 0; iChannel < channelsOut; iChannel += 1) { - pSpatializer->pNewChannelGainsOut[iChannel] = gain; - } - - /* - Convert to our output channel count. If the listener is disabled we just output silence here. We cannot ignore - the whole section of code here because we need to update some internal spatialization state. - */ - if (ma_spatializer_listener_is_enabled(pListener)) { - ma_channel_map_apply_f32((float*)pFramesOut, pChannelMapOut, channelsOut, (const float*)pFramesIn, pChannelMapIn, channelsIn, frameCount, ma_channel_mix_mode_rectangular, ma_mono_expansion_mode_default); - } else { - ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, pSpatializer->channelsOut); - } - - /* - Calculate our per-channel gains. We do this based on the normalized relative position of the sound and it's - relation to the direction of the channel. - */ - if (distance > 0) { - ma_vec3f unitPos = relativePos; - float distanceInv = 1/distance; - unitPos.x *= distanceInv; - unitPos.y *= distanceInv; - unitPos.z *= distanceInv; - - for (iChannel = 0; iChannel < channelsOut; iChannel += 1) { - ma_channel channelOut; - float d; - float dMin; - - channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannel); - if (ma_is_spatial_channel_position(channelOut)) { - d = ma_mix_f32_fast(1, ma_vec3f_dot(unitPos, ma_get_channel_direction(channelOut)), ma_spatializer_get_directional_attenuation_factor(pSpatializer)); - } else { - d = 1; /* It's not a spatial channel so there's no real notion of direction. */ - } - - /* - In my testing, if the panning effect is too aggressive it makes spatialization feel uncomfortable. - The "dMin" variable below is used to control the aggressiveness of the panning effect. When set to - 0, panning will be most extreme and any sounds that are positioned on the opposite side of the - speaker will be completely silent from that speaker. Not only does this feel uncomfortable, it - doesn't even remotely represent the real world at all because sounds that come from your right side - are still clearly audible from your left side. Setting "dMin" to 1 will result in no panning at - all, which is also not ideal. By setting it to something greater than 0, the spatialization effect - becomes much less dramatic and a lot more bearable. - - Summary: 0 = more extreme panning; 1 = no panning. - */ - dMin = 0.2f; /* TODO: Consider making this configurable. */ - - /* - At this point, "d" will be positive if the sound is on the same side as the channel and negative if - it's on the opposite side. It will be in the range of -1..1. There's two ways I can think of to - calculate a panning value. The first is to simply convert it to 0..1, however this has a problem - which I'm not entirely happy with. Considering a stereo system, when a sound is positioned right - in front of the listener it'll result in each speaker getting a gain of 0.5. I don't know if I like - the idea of having a scaling factor of 0.5 being applied to a sound when it's sitting right in front - of the listener. I would intuitively expect that to be played at full volume, or close to it. - - The second idea I think of is to only apply a reduction in gain when the sound is on the opposite - side of the speaker. That is, reduce the gain only when the dot product is negative. The problem - with this is that there will not be any attenuation as the sound sweeps around the 180 degrees - where the dot product is positive. The idea with this option is that you leave the gain at 1 when - the sound is being played on the same side as the speaker and then you just reduce the volume when - the sound is on the other side. - - The summarize, I think the first option should give a better sense of spatialization, but the second - option is better for preserving the sound's power. - - UPDATE: In my testing, I find the first option to sound better. You can feel the sense of space a - bit better, but you can also hear the reduction in volume when it's right in front. - */ - #if 1 - { - /* - Scale the dot product from -1..1 to 0..1. Will result in a sound directly in front losing power - by being played at 0.5 gain. - */ - d = (d + 1) * 0.5f; /* -1..1 to 0..1 */ - d = ma_max(d, dMin); - pSpatializer->pNewChannelGainsOut[iChannel] *= d; - } - #else - { - /* - Only reduce the volume of the sound if it's on the opposite side. This path keeps the volume more - consistent, but comes at the expense of a worse sense of space and positioning. - */ - if (d < 0) { - d += 1; /* Move into the positive range. */ - d = ma_max(d, dMin); - channelGainsOut[iChannel] *= d; - } - } - #endif - } - } else { - /* Assume the sound is right on top of us. Don't do any panning. */ - } - - /* Now we need to apply the volume to each channel. This needs to run through the gainer to ensure we get a smooth volume transition. */ - ma_gainer_set_gains(&pSpatializer->gainer, pSpatializer->pNewChannelGainsOut); - ma_gainer_process_pcm_frames(&pSpatializer->gainer, pFramesOut, pFramesOut, frameCount); - - /* - Before leaving we'll want to update our doppler pitch so that the caller can apply some - pitch shifting if they desire. Note that we need to negate the relative position here - because the doppler calculation needs to be source-to-listener, but ours is listener-to- - source. - */ - if (dopplerFactor > 0) { - pSpatializer->dopplerPitch = ma_doppler_pitch(ma_vec3f_sub(pListener->position, pSpatializer->position), pSpatializer->velocity, listenerVel, speedOfSound, dopplerFactor); - } else { - pSpatializer->dopplerPitch = 1; - } - } - - return MA_SUCCESS; -} - -MA_API ma_uint32 ma_spatializer_get_input_channels(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 0; - } - - return pSpatializer->channelsIn; -} - -MA_API ma_uint32 ma_spatializer_get_output_channels(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 0; - } - - return pSpatializer->channelsOut; -} - -MA_API void ma_spatializer_set_attenuation_model(ma_spatializer* pSpatializer, ma_attenuation_model attenuationModel) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_i32(&pSpatializer->attenuationModel, attenuationModel); -} - -MA_API ma_attenuation_model ma_spatializer_get_attenuation_model(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return ma_attenuation_model_none; - } - - return (ma_attenuation_model)c89atomic_load_i32(&pSpatializer->attenuationModel); -} - -MA_API void ma_spatializer_set_positioning(ma_spatializer* pSpatializer, ma_positioning positioning) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_i32(&pSpatializer->positioning, positioning); -} - -MA_API ma_positioning ma_spatializer_get_positioning(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return ma_positioning_absolute; - } - - return (ma_positioning)c89atomic_load_i32(&pSpatializer->positioning); -} - -MA_API void ma_spatializer_set_rolloff(ma_spatializer* pSpatializer, float rolloff) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->rolloff, rolloff); -} - -MA_API float ma_spatializer_get_rolloff(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 0; - } - - return c89atomic_load_f32(&pSpatializer->rolloff); -} - -MA_API void ma_spatializer_set_min_gain(ma_spatializer* pSpatializer, float minGain) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->minGain, minGain); -} - -MA_API float ma_spatializer_get_min_gain(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 0; - } - - return c89atomic_load_f32(&pSpatializer->minGain); -} - -MA_API void ma_spatializer_set_max_gain(ma_spatializer* pSpatializer, float maxGain) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->maxGain, maxGain); -} - -MA_API float ma_spatializer_get_max_gain(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 0; - } - - return c89atomic_load_f32(&pSpatializer->maxGain); -} - -MA_API void ma_spatializer_set_min_distance(ma_spatializer* pSpatializer, float minDistance) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->minDistance, minDistance); -} - -MA_API float ma_spatializer_get_min_distance(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 0; - } - - return c89atomic_load_f32(&pSpatializer->minDistance); -} - -MA_API void ma_spatializer_set_max_distance(ma_spatializer* pSpatializer, float maxDistance) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->maxDistance, maxDistance); -} - -MA_API float ma_spatializer_get_max_distance(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 0; - } - - return c89atomic_load_f32(&pSpatializer->maxDistance); -} - -MA_API void ma_spatializer_set_cone(ma_spatializer* pSpatializer, float innerAngleInRadians, float outerAngleInRadians, float outerGain) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->coneInnerAngleInRadians, innerAngleInRadians); - c89atomic_exchange_f32(&pSpatializer->coneOuterAngleInRadians, outerAngleInRadians); - c89atomic_exchange_f32(&pSpatializer->coneOuterGain, outerGain); -} - -MA_API void ma_spatializer_get_cone(const ma_spatializer* pSpatializer, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain) -{ - if (pSpatializer == NULL) { - return; - } - - if (pInnerAngleInRadians != NULL) { - *pInnerAngleInRadians = c89atomic_load_f32(&pSpatializer->coneInnerAngleInRadians); - } - - if (pOuterAngleInRadians != NULL) { - *pOuterAngleInRadians = c89atomic_load_f32(&pSpatializer->coneOuterAngleInRadians); - } - - if (pOuterGain != NULL) { - *pOuterGain = c89atomic_load_f32(&pSpatializer->coneOuterGain); - } -} - -MA_API void ma_spatializer_set_doppler_factor(ma_spatializer* pSpatializer, float dopplerFactor) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->dopplerFactor, dopplerFactor); -} - -MA_API float ma_spatializer_get_doppler_factor(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 1; - } - - return c89atomic_load_f32(&pSpatializer->dopplerFactor); -} - -MA_API void ma_spatializer_set_directional_attenuation_factor(ma_spatializer* pSpatializer, float directionalAttenuationFactor) -{ - if (pSpatializer == NULL) { - return; - } - - c89atomic_exchange_f32(&pSpatializer->directionalAttenuationFactor, directionalAttenuationFactor); -} - -MA_API float ma_spatializer_get_directional_attenuation_factor(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return 1; - } - - return c89atomic_load_f32(&pSpatializer->directionalAttenuationFactor); -} - -MA_API void ma_spatializer_set_position(ma_spatializer* pSpatializer, float x, float y, float z) -{ - if (pSpatializer == NULL) { - return; - } - - pSpatializer->position = ma_vec3f_init_3f(x, y, z); -} - -MA_API ma_vec3f ma_spatializer_get_position(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return pSpatializer->position; -} - -MA_API void ma_spatializer_set_direction(ma_spatializer* pSpatializer, float x, float y, float z) -{ - if (pSpatializer == NULL) { - return; - } - - pSpatializer->direction = ma_vec3f_init_3f(x, y, z); -} - -MA_API ma_vec3f ma_spatializer_get_direction(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return ma_vec3f_init_3f(0, 0, -1); - } - - return pSpatializer->direction; -} - -MA_API void ma_spatializer_set_velocity(ma_spatializer* pSpatializer, float x, float y, float z) -{ - if (pSpatializer == NULL) { - return; - } - - pSpatializer->velocity = ma_vec3f_init_3f(x, y, z); -} - -MA_API ma_vec3f ma_spatializer_get_velocity(const ma_spatializer* pSpatializer) -{ - if (pSpatializer == NULL) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return pSpatializer->velocity; -} - -MA_API void ma_spatializer_get_relative_position_and_direction(const ma_spatializer* pSpatializer, const ma_spatializer_listener* pListener, ma_vec3f* pRelativePos, ma_vec3f* pRelativeDir) -{ - if (pRelativePos != NULL) { - pRelativePos->x = 0; - pRelativePos->y = 0; - pRelativePos->z = 0; - } - - if (pRelativeDir != NULL) { - pRelativeDir->x = 0; - pRelativeDir->y = 0; - pRelativeDir->z = -1; - } - - if (pSpatializer == NULL) { - return; - } - - if (pListener == NULL || ma_spatializer_get_positioning(pSpatializer) == ma_positioning_relative) { - /* There's no listener or we're using relative positioning. */ - if (pRelativePos != NULL) { - *pRelativePos = pSpatializer->position; - } - if (pRelativeDir != NULL) { - *pRelativeDir = pSpatializer->direction; - } - } else { - ma_vec3f v; - ma_vec3f axisX; - ma_vec3f axisY; - ma_vec3f axisZ; - float m[4][4]; - - /* - We need to calcualte the right vector from our forward and up vectors. This is done with - a cross product. - */ - axisZ = ma_vec3f_normalize(pListener->direction); /* Normalization required here because we can't trust the caller. */ - axisX = ma_vec3f_normalize(ma_vec3f_cross(axisZ, pListener->config.worldUp)); /* Normalization required here because the world up vector may not be perpendicular with the forward vector. */ - - /* - The calculation of axisX above can result in a zero-length vector if the listener is - looking straight up on the Y axis. We'll need to fall back to a +X in this case so that - the calculations below don't fall apart. This is where a quaternion based listener and - sound orientation would come in handy. - */ - if (ma_vec3f_len2(axisX) == 0) { - axisX = ma_vec3f_init_3f(1, 0, 0); - } - - axisY = ma_vec3f_cross(axisX, axisZ); /* No normalization is required here because axisX and axisZ are unit length and perpendicular. */ - - /* - We need to swap the X axis if we're left handed because otherwise the cross product above - will have resulted in it pointing in the wrong direction (right handed was assumed in the - cross products above). - */ - if (pListener->config.handedness == ma_handedness_left) { - axisX = ma_vec3f_neg(axisX); - } - - /* Lookat. */ - m[0][0] = axisX.x; m[1][0] = axisX.y; m[2][0] = axisX.z; m[3][0] = -ma_vec3f_dot(axisX, pListener->position); - m[0][1] = axisY.x; m[1][1] = axisY.y; m[2][1] = axisY.z; m[3][1] = -ma_vec3f_dot(axisY, pListener->position); - m[0][2] = -axisZ.x; m[1][2] = -axisZ.y; m[2][2] = -axisZ.z; m[3][2] = -ma_vec3f_dot(ma_vec3f_neg(axisZ), pListener->position); - m[0][3] = 0; m[1][3] = 0; m[2][3] = 0; m[3][3] = 1; - - /* - Multiply the lookat matrix by the spatializer position to transform it to listener - space. This allows calculations to work based on the sound being relative to the - origin which makes things simpler. - */ - if (pRelativePos != NULL) { - v = pSpatializer->position; - pRelativePos->x = m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * 1; - pRelativePos->y = m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * 1; - pRelativePos->z = m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * 1; - } - - /* - The direction of the sound needs to also be transformed so that it's relative to the - rotation of the listener. - */ - if (pRelativeDir != NULL) { - v = pSpatializer->direction; - pRelativeDir->x = m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z; - pRelativeDir->y = m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z; - pRelativeDir->z = m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z; - } - } -} - - - - -/************************************************************************************************************************************************************** - -Resampling - -**************************************************************************************************************************************************************/ -MA_API ma_linear_resampler_config ma_linear_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut) -{ - ma_linear_resampler_config config; - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRateIn = sampleRateIn; - config.sampleRateOut = sampleRateOut; - config.lpfOrder = ma_min(MA_DEFAULT_RESAMPLER_LPF_ORDER, MA_MAX_FILTER_ORDER); - config.lpfNyquistFactor = 1; - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t x0Offset; - size_t x1Offset; - size_t lpfOffset; -} ma_linear_resampler_heap_layout; - - -static void ma_linear_resampler_adjust_timer_for_new_rate(ma_linear_resampler* pResampler, ma_uint32 oldSampleRateOut, ma_uint32 newSampleRateOut) -{ - /* - So what's happening here? Basically we need to adjust the fractional component of the time advance based on the new rate. The old time advance will - be based on the old sample rate, but we are needing to adjust it to that it's based on the new sample rate. - */ - ma_uint32 oldRateTimeWhole = pResampler->inTimeFrac / oldSampleRateOut; /* <-- This should almost never be anything other than 0, but leaving it here to make this more general and robust just in case. */ - ma_uint32 oldRateTimeFract = pResampler->inTimeFrac % oldSampleRateOut; - - pResampler->inTimeFrac = - (oldRateTimeWhole * newSampleRateOut) + - ((oldRateTimeFract * newSampleRateOut) / oldSampleRateOut); - - /* Make sure the fractional part is less than the output sample rate. */ - pResampler->inTimeInt += pResampler->inTimeFrac / pResampler->config.sampleRateOut; - pResampler->inTimeFrac = pResampler->inTimeFrac % pResampler->config.sampleRateOut; -} - -static ma_result ma_linear_resampler_set_rate_internal(ma_linear_resampler* pResampler, void* pHeap, ma_linear_resampler_heap_layout* pHeapLayout, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_bool32 isResamplerAlreadyInitialized) -{ - ma_result result; - ma_uint32 gcf; - ma_uint32 lpfSampleRate; - double lpfCutoffFrequency; - ma_lpf_config lpfConfig; - ma_uint32 oldSampleRateOut; /* Required for adjusting time advance down the bottom. */ - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (sampleRateIn == 0 || sampleRateOut == 0) { - return MA_INVALID_ARGS; - } - - oldSampleRateOut = pResampler->config.sampleRateOut; - - pResampler->config.sampleRateIn = sampleRateIn; - pResampler->config.sampleRateOut = sampleRateOut; - - /* Simplify the sample rate. */ - gcf = ma_gcf_u32(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut); - pResampler->config.sampleRateIn /= gcf; - pResampler->config.sampleRateOut /= gcf; - - /* Always initialize the low-pass filter, even when the order is 0. */ - if (pResampler->config.lpfOrder > MA_MAX_FILTER_ORDER) { - return MA_INVALID_ARGS; - } - - lpfSampleRate = (ma_uint32)(ma_max(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut)); - lpfCutoffFrequency = ( double)(ma_min(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut) * 0.5 * pResampler->config.lpfNyquistFactor); - - lpfConfig = ma_lpf_config_init(pResampler->config.format, pResampler->config.channels, lpfSampleRate, lpfCutoffFrequency, pResampler->config.lpfOrder); - - /* - If the resampler is alreay initialized we don't want to do a fresh initialization of the low-pass filter because it will result in the cached frames - getting cleared. Instead we re-initialize the filter which will maintain any cached frames. - */ - if (isResamplerAlreadyInitialized) { - result = ma_lpf_reinit(&lpfConfig, &pResampler->lpf); - } else { - result = ma_lpf_init_preallocated(&lpfConfig, ma_offset_ptr(pHeap, pHeapLayout->lpfOffset), &pResampler->lpf); - } - - if (result != MA_SUCCESS) { - return result; - } - - - pResampler->inAdvanceInt = pResampler->config.sampleRateIn / pResampler->config.sampleRateOut; - pResampler->inAdvanceFrac = pResampler->config.sampleRateIn % pResampler->config.sampleRateOut; - - /* Our timer was based on the old rate. We need to adjust it so that it's based on the new rate. */ - ma_linear_resampler_adjust_timer_for_new_rate(pResampler, oldSampleRateOut, pResampler->config.sampleRateOut); - - return MA_SUCCESS; -} - -static ma_result ma_linear_resampler_get_heap_layout(const ma_linear_resampler_config* pConfig, ma_linear_resampler_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* x0 */ - pHeapLayout->x0Offset = pHeapLayout->sizeInBytes; - if (pConfig->format == ma_format_f32) { - pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels; - } else { - pHeapLayout->sizeInBytes += sizeof(ma_int16) * pConfig->channels; - } - - /* x1 */ - pHeapLayout->x1Offset = pHeapLayout->sizeInBytes; - if (pConfig->format == ma_format_f32) { - pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels; - } else { - pHeapLayout->sizeInBytes += sizeof(ma_int16) * pConfig->channels; - } - - /* LPF */ - pHeapLayout->lpfOffset = pHeapLayout->sizeInBytes; - { - ma_result result; - size_t lpfHeapSizeInBytes; - ma_lpf_config lpfConfig = ma_lpf_config_init(pConfig->format, pConfig->channels, 1, 1, pConfig->lpfOrder); /* Sample rate and cutoff frequency do not matter. */ - - result = ma_lpf_get_heap_size(&lpfConfig, &lpfHeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += lpfHeapSizeInBytes; - } - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_linear_resampler_get_heap_size(const ma_linear_resampler_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_linear_resampler_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_linear_resampler_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_linear_resampler_init_preallocated(const ma_linear_resampler_config* pConfig, void* pHeap, ma_linear_resampler* pResampler) -{ - ma_result result; - ma_linear_resampler_heap_layout heapLayout; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pResampler); - - result = ma_linear_resampler_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pResampler->config = *pConfig; - - pResampler->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - if (pConfig->format == ma_format_f32) { - pResampler->x0.f32 = (float*)ma_offset_ptr(pHeap, heapLayout.x0Offset); - pResampler->x1.f32 = (float*)ma_offset_ptr(pHeap, heapLayout.x1Offset); - } else { - pResampler->x0.s16 = (ma_int16*)ma_offset_ptr(pHeap, heapLayout.x0Offset); - pResampler->x1.s16 = (ma_int16*)ma_offset_ptr(pHeap, heapLayout.x1Offset); - } - - /* Setting the rate will set up the filter and time advances for us. */ - result = ma_linear_resampler_set_rate_internal(pResampler, pHeap, &heapLayout, pConfig->sampleRateIn, pConfig->sampleRateOut, /* isResamplerAlreadyInitialized = */ MA_FALSE); - if (result != MA_SUCCESS) { - return result; - } - - pResampler->inTimeInt = 1; /* Set this to one to force an input sample to always be loaded for the first output frame. */ - pResampler->inTimeFrac = 0; - - return MA_SUCCESS; -} - -MA_API ma_result ma_linear_resampler_init(const ma_linear_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_linear_resampler* pResampler) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_linear_resampler_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_linear_resampler_init_preallocated(pConfig, pHeap, pResampler); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pResampler->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_linear_resampler_uninit(ma_linear_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pResampler == NULL) { - return; - } - - ma_lpf_uninit(&pResampler->lpf, pAllocationCallbacks); - - if (pResampler->_ownsHeap) { - ma_free(pResampler->_pHeap, pAllocationCallbacks); - } -} - -static MA_INLINE ma_int16 ma_linear_resampler_mix_s16(ma_int16 x, ma_int16 y, ma_int32 a, const ma_int32 shift) -{ - ma_int32 b; - ma_int32 c; - ma_int32 r; - - MA_ASSERT(a <= (1<> shift); -} - -static void ma_linear_resampler_interpolate_frame_s16(ma_linear_resampler* pResampler, ma_int16* MA_RESTRICT pFrameOut) -{ - ma_uint32 c; - ma_uint32 a; - const ma_uint32 channels = pResampler->config.channels; - const ma_uint32 shift = 12; - - MA_ASSERT(pResampler != NULL); - MA_ASSERT(pFrameOut != NULL); - - a = (pResampler->inTimeFrac << shift) / pResampler->config.sampleRateOut; - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - ma_int16 s = ma_linear_resampler_mix_s16(pResampler->x0.s16[c], pResampler->x1.s16[c], a, shift); - pFrameOut[c] = s; - } -} - - -static void ma_linear_resampler_interpolate_frame_f32(ma_linear_resampler* pResampler, float* MA_RESTRICT pFrameOut) -{ - ma_uint32 c; - float a; - const ma_uint32 channels = pResampler->config.channels; - - MA_ASSERT(pResampler != NULL); - MA_ASSERT(pFrameOut != NULL); - - a = (float)pResampler->inTimeFrac / pResampler->config.sampleRateOut; - - MA_ASSUME(channels > 0); - for (c = 0; c < channels; c += 1) { - float s = ma_mix_f32_fast(pResampler->x0.f32[c], pResampler->x1.f32[c], a); - pFrameOut[c] = s; - } -} - -static ma_result ma_linear_resampler_process_pcm_frames_s16_downsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - const ma_int16* pFramesInS16; - /* */ ma_int16* pFramesOutS16; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 framesProcessedIn; - ma_uint64 framesProcessedOut; - - MA_ASSERT(pResampler != NULL); - MA_ASSERT(pFrameCountIn != NULL); - MA_ASSERT(pFrameCountOut != NULL); - - pFramesInS16 = (const ma_int16*)pFramesIn; - pFramesOutS16 = ( ma_int16*)pFramesOut; - frameCountIn = *pFrameCountIn; - frameCountOut = *pFrameCountOut; - framesProcessedIn = 0; - framesProcessedOut = 0; - - while (framesProcessedOut < frameCountOut) { - /* Before interpolating we need to load the buffers. When doing this we need to ensure we run every input sample through the filter. */ - while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) { - ma_uint32 iChannel; - - if (pFramesInS16 != NULL) { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel]; - pResampler->x1.s16[iChannel] = pFramesInS16[iChannel]; - } - pFramesInS16 += pResampler->config.channels; - } else { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel]; - pResampler->x1.s16[iChannel] = 0; - } - } - - /* Filter. */ - ma_lpf_process_pcm_frame_s16(&pResampler->lpf, pResampler->x1.s16, pResampler->x1.s16); - - framesProcessedIn += 1; - pResampler->inTimeInt -= 1; - } - - if (pResampler->inTimeInt > 0) { - break; /* Ran out of input data. */ - } - - /* Getting here means the frames have been loaded and filtered and we can generate the next output frame. */ - if (pFramesOutS16 != NULL) { - MA_ASSERT(pResampler->inTimeInt == 0); - ma_linear_resampler_interpolate_frame_s16(pResampler, pFramesOutS16); - - pFramesOutS16 += pResampler->config.channels; - } - - framesProcessedOut += 1; - - /* Advance time forward. */ - pResampler->inTimeInt += pResampler->inAdvanceInt; - pResampler->inTimeFrac += pResampler->inAdvanceFrac; - if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) { - pResampler->inTimeFrac -= pResampler->config.sampleRateOut; - pResampler->inTimeInt += 1; - } - } - - *pFrameCountIn = framesProcessedIn; - *pFrameCountOut = framesProcessedOut; - - return MA_SUCCESS; -} - -static ma_result ma_linear_resampler_process_pcm_frames_s16_upsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - const ma_int16* pFramesInS16; - /* */ ma_int16* pFramesOutS16; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 framesProcessedIn; - ma_uint64 framesProcessedOut; - - MA_ASSERT(pResampler != NULL); - MA_ASSERT(pFrameCountIn != NULL); - MA_ASSERT(pFrameCountOut != NULL); - - pFramesInS16 = (const ma_int16*)pFramesIn; - pFramesOutS16 = ( ma_int16*)pFramesOut; - frameCountIn = *pFrameCountIn; - frameCountOut = *pFrameCountOut; - framesProcessedIn = 0; - framesProcessedOut = 0; - - while (framesProcessedOut < frameCountOut) { - /* Before interpolating we need to load the buffers. */ - while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) { - ma_uint32 iChannel; - - if (pFramesInS16 != NULL) { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel]; - pResampler->x1.s16[iChannel] = pFramesInS16[iChannel]; - } - pFramesInS16 += pResampler->config.channels; - } else { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel]; - pResampler->x1.s16[iChannel] = 0; - } - } - - framesProcessedIn += 1; - pResampler->inTimeInt -= 1; - } - - if (pResampler->inTimeInt > 0) { - break; /* Ran out of input data. */ - } - - /* Getting here means the frames have been loaded and we can generate the next output frame. */ - if (pFramesOutS16 != NULL) { - MA_ASSERT(pResampler->inTimeInt == 0); - ma_linear_resampler_interpolate_frame_s16(pResampler, pFramesOutS16); - - /* Filter. */ - ma_lpf_process_pcm_frame_s16(&pResampler->lpf, pFramesOutS16, pFramesOutS16); - - pFramesOutS16 += pResampler->config.channels; - } - - framesProcessedOut += 1; - - /* Advance time forward. */ - pResampler->inTimeInt += pResampler->inAdvanceInt; - pResampler->inTimeFrac += pResampler->inAdvanceFrac; - if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) { - pResampler->inTimeFrac -= pResampler->config.sampleRateOut; - pResampler->inTimeInt += 1; - } - } - - *pFrameCountIn = framesProcessedIn; - *pFrameCountOut = framesProcessedOut; - - return MA_SUCCESS; -} - -static ma_result ma_linear_resampler_process_pcm_frames_s16(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - MA_ASSERT(pResampler != NULL); - - if (pResampler->config.sampleRateIn > pResampler->config.sampleRateOut) { - return ma_linear_resampler_process_pcm_frames_s16_downsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } else { - return ma_linear_resampler_process_pcm_frames_s16_upsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } -} - - -static ma_result ma_linear_resampler_process_pcm_frames_f32_downsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - const float* pFramesInF32; - /* */ float* pFramesOutF32; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 framesProcessedIn; - ma_uint64 framesProcessedOut; - - MA_ASSERT(pResampler != NULL); - MA_ASSERT(pFrameCountIn != NULL); - MA_ASSERT(pFrameCountOut != NULL); - - pFramesInF32 = (const float*)pFramesIn; - pFramesOutF32 = ( float*)pFramesOut; - frameCountIn = *pFrameCountIn; - frameCountOut = *pFrameCountOut; - framesProcessedIn = 0; - framesProcessedOut = 0; - - while (framesProcessedOut < frameCountOut) { - /* Before interpolating we need to load the buffers. When doing this we need to ensure we run every input sample through the filter. */ - while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) { - ma_uint32 iChannel; - - if (pFramesInF32 != NULL) { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel]; - pResampler->x1.f32[iChannel] = pFramesInF32[iChannel]; - } - pFramesInF32 += pResampler->config.channels; - } else { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel]; - pResampler->x1.f32[iChannel] = 0; - } - } - - /* Filter. */ - ma_lpf_process_pcm_frame_f32(&pResampler->lpf, pResampler->x1.f32, pResampler->x1.f32); - - framesProcessedIn += 1; - pResampler->inTimeInt -= 1; - } - - if (pResampler->inTimeInt > 0) { - break; /* Ran out of input data. */ - } - - /* Getting here means the frames have been loaded and filtered and we can generate the next output frame. */ - if (pFramesOutF32 != NULL) { - MA_ASSERT(pResampler->inTimeInt == 0); - ma_linear_resampler_interpolate_frame_f32(pResampler, pFramesOutF32); - - pFramesOutF32 += pResampler->config.channels; - } - - framesProcessedOut += 1; - - /* Advance time forward. */ - pResampler->inTimeInt += pResampler->inAdvanceInt; - pResampler->inTimeFrac += pResampler->inAdvanceFrac; - if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) { - pResampler->inTimeFrac -= pResampler->config.sampleRateOut; - pResampler->inTimeInt += 1; - } - } - - *pFrameCountIn = framesProcessedIn; - *pFrameCountOut = framesProcessedOut; - - return MA_SUCCESS; -} - -static ma_result ma_linear_resampler_process_pcm_frames_f32_upsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - const float* pFramesInF32; - /* */ float* pFramesOutF32; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 framesProcessedIn; - ma_uint64 framesProcessedOut; - - MA_ASSERT(pResampler != NULL); - MA_ASSERT(pFrameCountIn != NULL); - MA_ASSERT(pFrameCountOut != NULL); - - pFramesInF32 = (const float*)pFramesIn; - pFramesOutF32 = ( float*)pFramesOut; - frameCountIn = *pFrameCountIn; - frameCountOut = *pFrameCountOut; - framesProcessedIn = 0; - framesProcessedOut = 0; - - while (framesProcessedOut < frameCountOut) { - /* Before interpolating we need to load the buffers. */ - while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) { - ma_uint32 iChannel; - - if (pFramesInF32 != NULL) { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel]; - pResampler->x1.f32[iChannel] = pFramesInF32[iChannel]; - } - pFramesInF32 += pResampler->config.channels; - } else { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel]; - pResampler->x1.f32[iChannel] = 0; - } - } - - framesProcessedIn += 1; - pResampler->inTimeInt -= 1; - } - - if (pResampler->inTimeInt > 0) { - break; /* Ran out of input data. */ - } - - /* Getting here means the frames have been loaded and we can generate the next output frame. */ - if (pFramesOutF32 != NULL) { - MA_ASSERT(pResampler->inTimeInt == 0); - ma_linear_resampler_interpolate_frame_f32(pResampler, pFramesOutF32); - - /* Filter. */ - ma_lpf_process_pcm_frame_f32(&pResampler->lpf, pFramesOutF32, pFramesOutF32); - - pFramesOutF32 += pResampler->config.channels; - } - - framesProcessedOut += 1; - - /* Advance time forward. */ - pResampler->inTimeInt += pResampler->inAdvanceInt; - pResampler->inTimeFrac += pResampler->inAdvanceFrac; - if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) { - pResampler->inTimeFrac -= pResampler->config.sampleRateOut; - pResampler->inTimeInt += 1; - } - } - - *pFrameCountIn = framesProcessedIn; - *pFrameCountOut = framesProcessedOut; - - return MA_SUCCESS; -} - -static ma_result ma_linear_resampler_process_pcm_frames_f32(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - MA_ASSERT(pResampler != NULL); - - if (pResampler->config.sampleRateIn > pResampler->config.sampleRateOut) { - return ma_linear_resampler_process_pcm_frames_f32_downsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } else { - return ma_linear_resampler_process_pcm_frames_f32_upsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } -} - - -MA_API ma_result ma_linear_resampler_process_pcm_frames(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - /* */ if (pResampler->config.format == ma_format_s16) { - return ma_linear_resampler_process_pcm_frames_s16(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } else if (pResampler->config.format == ma_format_f32) { - return ma_linear_resampler_process_pcm_frames_f32(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } else { - /* Should never get here. Getting here means the format is not supported and you didn't check the return value of ma_linear_resampler_init(). */ - MA_ASSERT(MA_FALSE); - return MA_INVALID_ARGS; - } -} - - -MA_API ma_result ma_linear_resampler_set_rate(ma_linear_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut) -{ - return ma_linear_resampler_set_rate_internal(pResampler, NULL, NULL, sampleRateIn, sampleRateOut, /* isResamplerAlreadyInitialized = */ MA_TRUE); -} - -MA_API ma_result ma_linear_resampler_set_rate_ratio(ma_linear_resampler* pResampler, float ratioInOut) -{ - ma_uint32 n; - ma_uint32 d; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (ratioInOut <= 0) { - return MA_INVALID_ARGS; - } - - d = 1000; - n = (ma_uint32)(ratioInOut * d); - - if (n == 0) { - return MA_INVALID_ARGS; /* Ratio too small. */ - } - - MA_ASSERT(n != 0); - - return ma_linear_resampler_set_rate(pResampler, n, d); -} - -MA_API ma_uint64 ma_linear_resampler_get_input_latency(const ma_linear_resampler* pResampler) -{ - if (pResampler == NULL) { - return 0; - } - - return 1 + ma_lpf_get_latency(&pResampler->lpf); -} - -MA_API ma_uint64 ma_linear_resampler_get_output_latency(const ma_linear_resampler* pResampler) -{ - if (pResampler == NULL) { - return 0; - } - - return ma_linear_resampler_get_input_latency(pResampler) * pResampler->config.sampleRateOut / pResampler->config.sampleRateIn; -} - -MA_API ma_result ma_linear_resampler_get_required_input_frame_count(const ma_linear_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount) -{ - ma_uint64 inputFrameCount; - - if (pInputFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - *pInputFrameCount = 0; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (outputFrameCount == 0) { - return MA_SUCCESS; - } - - /* Any whole input frames are consumed before the first output frame is generated. */ - inputFrameCount = pResampler->inTimeInt; - outputFrameCount -= 1; - - /* The rest of the output frames can be calculated in constant time. */ - inputFrameCount += outputFrameCount * pResampler->inAdvanceInt; - inputFrameCount += (pResampler->inTimeFrac + (outputFrameCount * pResampler->inAdvanceFrac)) / pResampler->config.sampleRateOut; - - *pInputFrameCount = inputFrameCount; - - return MA_SUCCESS; -} - -MA_API ma_result ma_linear_resampler_get_expected_output_frame_count(const ma_linear_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount) -{ - ma_uint64 outputFrameCount; - ma_uint64 preliminaryInputFrameCountFromFrac; - ma_uint64 preliminaryInputFrameCount; - - if (pOutputFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - *pOutputFrameCount = 0; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - /* - The first step is to get a preliminary output frame count. This will either be exactly equal to what we need, or less by 1. We need to - determine how many input frames will be consumed by this value. If it's greater than our original input frame count it means we won't - be able to generate an extra frame because we will have run out of input data. Otherwise we will have enough input for the generation - of an extra output frame. This add-by-one logic is necessary due to how the data loading logic works when processing frames. - */ - outputFrameCount = (inputFrameCount * pResampler->config.sampleRateOut) / pResampler->config.sampleRateIn; - - /* - We need to determine how many *whole* input frames will have been processed to generate our preliminary output frame count. This is - used in the logic below to determine whether or not we need to add an extra output frame. - */ - preliminaryInputFrameCountFromFrac = (pResampler->inTimeFrac + outputFrameCount*pResampler->inAdvanceFrac) / pResampler->config.sampleRateOut; - preliminaryInputFrameCount = (pResampler->inTimeInt + outputFrameCount*pResampler->inAdvanceInt ) + preliminaryInputFrameCountFromFrac; - - /* - If the total number of *whole* input frames that would be required to generate our preliminary output frame count is greather than - the amount of whole input frames we have available as input we need to *not* add an extra output frame as there won't be enough data - to actually process. Otherwise we need to add the extra output frame. - */ - if (preliminaryInputFrameCount <= inputFrameCount) { - outputFrameCount += 1; - } - - *pOutputFrameCount = outputFrameCount; - - return MA_SUCCESS; -} - -MA_API ma_result ma_linear_resampler_reset(ma_linear_resampler* pResampler) -{ - ma_uint32 iChannel; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - /* Timers need to be cleared back to zero. */ - pResampler->inTimeInt = 1; /* Set this to one to force an input sample to always be loaded for the first output frame. */ - pResampler->inTimeFrac = 0; - - /* Cached samples need to be cleared. */ - if (pResampler->config.format == ma_format_f32) { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.f32[iChannel] = 0; - pResampler->x1.f32[iChannel] = 0; - } - } else { - for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) { - pResampler->x0.s16[iChannel] = 0; - pResampler->x1.s16[iChannel] = 0; - } - } - - /* The low pass filter needs to have it's cache reset. */ - ma_lpf_clear_cache(&pResampler->lpf); - - return MA_SUCCESS; -} - - - -/* Linear resampler backend vtable. */ -static ma_linear_resampler_config ma_resampling_backend_get_config__linear(const ma_resampler_config* pConfig) -{ - ma_linear_resampler_config linearConfig; - - linearConfig = ma_linear_resampler_config_init(pConfig->format, pConfig->channels, pConfig->sampleRateIn, pConfig->sampleRateOut); - linearConfig.lpfOrder = pConfig->linear.lpfOrder; - - return linearConfig; -} - -static ma_result ma_resampling_backend_get_heap_size__linear(void* pUserData, const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_linear_resampler_config linearConfig; - - (void)pUserData; - - linearConfig = ma_resampling_backend_get_config__linear(pConfig); - - return ma_linear_resampler_get_heap_size(&linearConfig, pHeapSizeInBytes); -} - -static ma_result ma_resampling_backend_init__linear(void* pUserData, const ma_resampler_config* pConfig, void* pHeap, ma_resampling_backend** ppBackend) -{ - ma_resampler* pResampler = (ma_resampler*)pUserData; - ma_result result; - ma_linear_resampler_config linearConfig; - - (void)pUserData; - - linearConfig = ma_resampling_backend_get_config__linear(pConfig); - - result = ma_linear_resampler_init_preallocated(&linearConfig, pHeap, &pResampler->state.linear); - if (result != MA_SUCCESS) { - return result; - } - - *ppBackend = &pResampler->state.linear; - - return MA_SUCCESS; -} - -static void ma_resampling_backend_uninit__linear(void* pUserData, ma_resampling_backend* pBackend, const ma_allocation_callbacks* pAllocationCallbacks) -{ - (void)pUserData; - - ma_linear_resampler_uninit((ma_linear_resampler*)pBackend, pAllocationCallbacks); -} - -static ma_result ma_resampling_backend_process__linear(void* pUserData, ma_resampling_backend* pBackend, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - (void)pUserData; - - return ma_linear_resampler_process_pcm_frames((ma_linear_resampler*)pBackend, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); -} - -static ma_result ma_resampling_backend_set_rate__linear(void* pUserData, ma_resampling_backend* pBackend, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut) -{ - (void)pUserData; - - return ma_linear_resampler_set_rate((ma_linear_resampler*)pBackend, sampleRateIn, sampleRateOut); -} - -static ma_uint64 ma_resampling_backend_get_input_latency__linear(void* pUserData, const ma_resampling_backend* pBackend) -{ - (void)pUserData; - - return ma_linear_resampler_get_input_latency((const ma_linear_resampler*)pBackend); -} - -static ma_uint64 ma_resampling_backend_get_output_latency__linear(void* pUserData, const ma_resampling_backend* pBackend) -{ - (void)pUserData; - - return ma_linear_resampler_get_output_latency((const ma_linear_resampler*)pBackend); -} - -static ma_result ma_resampling_backend_get_required_input_frame_count__linear(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount) -{ - (void)pUserData; - - return ma_linear_resampler_get_required_input_frame_count((const ma_linear_resampler*)pBackend, outputFrameCount, pInputFrameCount); -} - -static ma_result ma_resampling_backend_get_expected_output_frame_count__linear(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount) -{ - (void)pUserData; - - return ma_linear_resampler_get_expected_output_frame_count((const ma_linear_resampler*)pBackend, inputFrameCount, pOutputFrameCount); -} - -static ma_result ma_resampling_backend_reset__linear(void* pUserData, ma_resampling_backend* pBackend) -{ - (void)pUserData; - - return ma_linear_resampler_reset((ma_linear_resampler*)pBackend); -} - -static ma_resampling_backend_vtable g_ma_linear_resampler_vtable = -{ - ma_resampling_backend_get_heap_size__linear, - ma_resampling_backend_init__linear, - ma_resampling_backend_uninit__linear, - ma_resampling_backend_process__linear, - ma_resampling_backend_set_rate__linear, - ma_resampling_backend_get_input_latency__linear, - ma_resampling_backend_get_output_latency__linear, - ma_resampling_backend_get_required_input_frame_count__linear, - ma_resampling_backend_get_expected_output_frame_count__linear, - ma_resampling_backend_reset__linear -}; - - - -MA_API ma_resampler_config ma_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_resample_algorithm algorithm) -{ - ma_resampler_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRateIn = sampleRateIn; - config.sampleRateOut = sampleRateOut; - config.algorithm = algorithm; - - /* Linear. */ - config.linear.lpfOrder = ma_min(MA_DEFAULT_RESAMPLER_LPF_ORDER, MA_MAX_FILTER_ORDER); - - return config; -} - -static ma_result ma_resampler_get_vtable(const ma_resampler_config* pConfig, ma_resampler* pResampler, ma_resampling_backend_vtable** ppVTable, void** ppUserData) -{ - MA_ASSERT(pConfig != NULL); - MA_ASSERT(ppVTable != NULL); - MA_ASSERT(ppUserData != NULL); - - /* Safety. */ - *ppVTable = NULL; - *ppUserData = NULL; - - switch (pConfig->algorithm) - { - case ma_resample_algorithm_linear: - { - *ppVTable = &g_ma_linear_resampler_vtable; - *ppUserData = pResampler; - } break; - - case ma_resample_algorithm_custom: - { - *ppVTable = pConfig->pBackendVTable; - *ppUserData = pConfig->pBackendUserData; - } break; - - default: return MA_INVALID_ARGS; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_resampler_get_heap_size(const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_resampling_backend_vtable* pVTable; - void* pVTableUserData; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_resampler_get_vtable(pConfig, NULL, &pVTable, &pVTableUserData); - if (result != MA_SUCCESS) { - return result; - } - - if (pVTable == NULL || pVTable->onGetHeapSize == NULL) { - return MA_NOT_IMPLEMENTED; - } - - result = pVTable->onGetHeapSize(pVTableUserData, pConfig, pHeapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_resampler_init_preallocated(const ma_resampler_config* pConfig, void* pHeap, ma_resampler* pResampler) -{ - ma_result result; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pResampler); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - pResampler->_pHeap = pHeap; - pResampler->format = pConfig->format; - pResampler->channels = pConfig->channels; - pResampler->sampleRateIn = pConfig->sampleRateIn; - pResampler->sampleRateOut = pConfig->sampleRateOut; - - result = ma_resampler_get_vtable(pConfig, pResampler, &pResampler->pBackendVTable, &pResampler->pBackendUserData); - if (result != MA_SUCCESS) { - return result; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onInit == NULL) { - return MA_NOT_IMPLEMENTED; /* onInit not implemented. */ - } - - result = pResampler->pBackendVTable->onInit(pResampler->pBackendUserData, pConfig, pHeap, &pResampler->pBackend); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_resampler_init(const ma_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_resampler* pResampler) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_resampler_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_resampler_init_preallocated(pConfig, pHeap, pResampler); - if (result != MA_SUCCESS) { - return result; - } - - pResampler->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_resampler_uninit(ma_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pResampler == NULL) { - return; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onUninit == NULL) { - return; - } - - pResampler->pBackendVTable->onUninit(pResampler->pBackendUserData, pResampler->pBackend, pAllocationCallbacks); - - if (pResampler->_ownsHeap) { - ma_free(pResampler->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_resampler_process_pcm_frames(ma_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (pFrameCountOut == NULL && pFrameCountIn == NULL) { - return MA_INVALID_ARGS; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onProcess == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pResampler->pBackendVTable->onProcess(pResampler->pBackendUserData, pResampler->pBackend, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); -} - -MA_API ma_result ma_resampler_set_rate(ma_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut) -{ - ma_result result; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (sampleRateIn == 0 || sampleRateOut == 0) { - return MA_INVALID_ARGS; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onSetRate == NULL) { - return MA_NOT_IMPLEMENTED; - } - - result = pResampler->pBackendVTable->onSetRate(pResampler->pBackendUserData, pResampler->pBackend, sampleRateIn, sampleRateOut); - if (result != MA_SUCCESS) { - return result; - } - - pResampler->sampleRateIn = sampleRateIn; - pResampler->sampleRateOut = sampleRateOut; - - return MA_SUCCESS; -} - -MA_API ma_result ma_resampler_set_rate_ratio(ma_resampler* pResampler, float ratio) -{ - ma_uint32 n; - ma_uint32 d; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (ratio <= 0) { - return MA_INVALID_ARGS; - } - - d = 1000; - n = (ma_uint32)(ratio * d); - - if (n == 0) { - return MA_INVALID_ARGS; /* Ratio too small. */ - } - - MA_ASSERT(n != 0); - - return ma_resampler_set_rate(pResampler, n, d); -} - -MA_API ma_uint64 ma_resampler_get_input_latency(const ma_resampler* pResampler) -{ - if (pResampler == NULL) { - return 0; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetInputLatency == NULL) { - return 0; - } - - return pResampler->pBackendVTable->onGetInputLatency(pResampler->pBackendUserData, pResampler->pBackend); -} - -MA_API ma_uint64 ma_resampler_get_output_latency(const ma_resampler* pResampler) -{ - if (pResampler == NULL) { - return 0; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetOutputLatency == NULL) { - return 0; - } - - return pResampler->pBackendVTable->onGetOutputLatency(pResampler->pBackendUserData, pResampler->pBackend); -} - -MA_API ma_result ma_resampler_get_required_input_frame_count(const ma_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount) -{ - if (pInputFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - *pInputFrameCount = 0; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetRequiredInputFrameCount == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pResampler->pBackendVTable->onGetRequiredInputFrameCount(pResampler->pBackendUserData, pResampler->pBackend, outputFrameCount, pInputFrameCount); -} - -MA_API ma_result ma_resampler_get_expected_output_frame_count(const ma_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount) -{ - if (pOutputFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - *pOutputFrameCount = 0; - - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetExpectedOutputFrameCount == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pResampler->pBackendVTable->onGetExpectedOutputFrameCount(pResampler->pBackendUserData, pResampler->pBackend, inputFrameCount, pOutputFrameCount); -} - -MA_API ma_result ma_resampler_reset(ma_resampler* pResampler) -{ - if (pResampler == NULL) { - return MA_INVALID_ARGS; - } - - if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onReset == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pResampler->pBackendVTable->onReset(pResampler->pBackendUserData, pResampler->pBackend); -} - -/************************************************************************************************************************************************************** - -Channel Conversion - -**************************************************************************************************************************************************************/ -#ifndef MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT -#define MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT 12 -#endif - -#define MA_PLANE_LEFT 0 -#define MA_PLANE_RIGHT 1 -#define MA_PLANE_FRONT 2 -#define MA_PLANE_BACK 3 -#define MA_PLANE_BOTTOM 4 -#define MA_PLANE_TOP 5 - -static float g_maChannelPlaneRatios[MA_CHANNEL_POSITION_COUNT][6] = { - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_NONE */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_MONO */ - { 0.5f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_FRONT_LEFT */ - { 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_FRONT_RIGHT */ - { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_FRONT_CENTER */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_LFE */ - { 0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f}, /* MA_CHANNEL_BACK_LEFT */ - { 0.0f, 0.5f, 0.0f, 0.5f, 0.0f, 0.0f}, /* MA_CHANNEL_BACK_RIGHT */ - { 0.25f, 0.0f, 0.75f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_FRONT_LEFT_CENTER */ - { 0.0f, 0.25f, 0.75f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_FRONT_RIGHT_CENTER */ - { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f}, /* MA_CHANNEL_BACK_CENTER */ - { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_SIDE_LEFT */ - { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_SIDE_RIGHT */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, /* MA_CHANNEL_TOP_CENTER */ - { 0.33f, 0.0f, 0.33f, 0.0f, 0.0f, 0.34f}, /* MA_CHANNEL_TOP_FRONT_LEFT */ - { 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.5f}, /* MA_CHANNEL_TOP_FRONT_CENTER */ - { 0.0f, 0.33f, 0.33f, 0.0f, 0.0f, 0.34f}, /* MA_CHANNEL_TOP_FRONT_RIGHT */ - { 0.33f, 0.0f, 0.0f, 0.33f, 0.0f, 0.34f}, /* MA_CHANNEL_TOP_BACK_LEFT */ - { 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.5f}, /* MA_CHANNEL_TOP_BACK_CENTER */ - { 0.0f, 0.33f, 0.0f, 0.33f, 0.0f, 0.34f}, /* MA_CHANNEL_TOP_BACK_RIGHT */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_0 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_1 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_2 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_3 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_4 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_5 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_6 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_7 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_8 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_9 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_10 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_11 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_12 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_13 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_14 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_15 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_16 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_17 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_18 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_19 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_20 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_21 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_22 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_23 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_24 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_25 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_26 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_27 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_28 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_29 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_30 */ - { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, /* MA_CHANNEL_AUX_31 */ -}; - -static float ma_calculate_channel_position_rectangular_weight(ma_channel channelPositionA, ma_channel channelPositionB) -{ - /* - Imagine the following simplified example: You have a single input speaker which is the front/left speaker which you want to convert to - the following output configuration: - - - front/left - - side/left - - back/left - - The front/left output is easy - it the same speaker position so it receives the full contribution of the front/left input. The amount - of contribution to apply to the side/left and back/left speakers, however, is a bit more complicated. - - Imagine the front/left speaker as emitting audio from two planes - the front plane and the left plane. You can think of the front/left - speaker emitting half of it's total volume from the front, and the other half from the left. Since part of it's volume is being emitted - from the left side, and the side/left and back/left channels also emit audio from the left plane, one would expect that they would - receive some amount of contribution from front/left speaker. The amount of contribution depends on how many planes are shared between - the two speakers. Note that in the examples below I've added a top/front/left speaker as an example just to show how the math works - across 3 spatial dimensions. - - The first thing to do is figure out how each speaker's volume is spread over each of plane: - - front/left: 2 planes (front and left) = 1/2 = half it's total volume on each plane - - side/left: 1 plane (left only) = 1/1 = entire volume from left plane - - back/left: 2 planes (back and left) = 1/2 = half it's total volume on each plane - - top/front/left: 3 planes (top, front and left) = 1/3 = one third it's total volume on each plane - - The amount of volume each channel contributes to each of it's planes is what controls how much it is willing to given and take to other - channels on the same plane. The volume that is willing to the given by one channel is multiplied by the volume that is willing to be - taken by the other to produce the final contribution. - */ - - /* Contribution = Sum(Volume to Give * Volume to Take) */ - float contribution = - g_maChannelPlaneRatios[channelPositionA][0] * g_maChannelPlaneRatios[channelPositionB][0] + - g_maChannelPlaneRatios[channelPositionA][1] * g_maChannelPlaneRatios[channelPositionB][1] + - g_maChannelPlaneRatios[channelPositionA][2] * g_maChannelPlaneRatios[channelPositionB][2] + - g_maChannelPlaneRatios[channelPositionA][3] * g_maChannelPlaneRatios[channelPositionB][3] + - g_maChannelPlaneRatios[channelPositionA][4] * g_maChannelPlaneRatios[channelPositionB][4] + - g_maChannelPlaneRatios[channelPositionA][5] * g_maChannelPlaneRatios[channelPositionB][5]; - - return contribution; -} - -MA_API ma_channel_converter_config ma_channel_converter_config_init(ma_format format, ma_uint32 channelsIn, const ma_channel* pChannelMapIn, ma_uint32 channelsOut, const ma_channel* pChannelMapOut, ma_channel_mix_mode mixingMode) -{ - ma_channel_converter_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channelsIn = channelsIn; - config.channelsOut = channelsOut; - config.pChannelMapIn = pChannelMapIn; - config.pChannelMapOut = pChannelMapOut; - config.mixingMode = mixingMode; - - return config; -} - -static ma_int32 ma_channel_converter_float_to_fixed(float x) -{ - return (ma_int32)(x * (1<= MA_CHANNEL_AUX_0 && channelPosition <= MA_CHANNEL_AUX_31) { - return MA_FALSE; - } - - for (i = 0; i < 6; ++i) { /* Each side of a cube. */ - if (g_maChannelPlaneRatios[channelPosition][i] != 0) { - return MA_TRUE; - } - } - - return MA_FALSE; -} - - -static ma_bool32 ma_channel_map_is_passthrough(const ma_channel* pChannelMapIn, ma_uint32 channelsIn, const ma_channel* pChannelMapOut, ma_uint32 channelsOut) -{ - if (channelsOut == channelsIn) { - return ma_channel_map_is_equal(pChannelMapOut, pChannelMapIn, channelsOut); - } else { - return MA_FALSE; /* Channel counts differ, so cannot be a passthrough. */ - } -} - -static ma_channel_conversion_path ma_channel_map_get_conversion_path(const ma_channel* pChannelMapIn, ma_uint32 channelsIn, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, ma_channel_mix_mode mode) -{ - if (ma_channel_map_is_passthrough(pChannelMapIn, channelsIn, pChannelMapOut, channelsOut)) { - return ma_channel_conversion_path_passthrough; - } - - if (channelsOut == 1 && (pChannelMapOut == NULL || pChannelMapOut[0] == MA_CHANNEL_MONO)) { - return ma_channel_conversion_path_mono_out; - } - - if (channelsIn == 1 && (pChannelMapIn == NULL || pChannelMapIn[0] == MA_CHANNEL_MONO)) { - return ma_channel_conversion_path_mono_in; - } - - if (mode == ma_channel_mix_mode_custom_weights) { - return ma_channel_conversion_path_weights; - } - - /* - We can use a simple shuffle if both channel maps have the same channel count and all channel - positions are present in both. - */ - if (channelsIn == channelsOut) { - ma_uint32 iChannelIn; - ma_bool32 areAllChannelPositionsPresent = MA_TRUE; - for (iChannelIn = 0; iChannelIn < channelsIn; ++iChannelIn) { - ma_bool32 isInputChannelPositionInOutput = MA_FALSE; - if (ma_channel_map_contains_channel_position(channelsOut, pChannelMapOut, ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn))) { - isInputChannelPositionInOutput = MA_TRUE; - break; - } - - if (!isInputChannelPositionInOutput) { - areAllChannelPositionsPresent = MA_FALSE; - break; - } - } - - if (areAllChannelPositionsPresent) { - return ma_channel_conversion_path_shuffle; - } - } - - /* Getting here means we'll need to use weights. */ - return ma_channel_conversion_path_weights; -} - - -static ma_result ma_channel_map_build_shuffle_table(const ma_channel* pChannelMapIn, ma_uint32 channelCountIn, const ma_channel* pChannelMapOut, ma_uint32 channelCountOut, ma_uint8* pShuffleTable) -{ - ma_uint32 iChannelIn; - ma_uint32 iChannelOut; - - if (pShuffleTable == NULL || channelCountIn == 0 || channelCountOut == 0) { - return MA_INVALID_ARGS; - } - - /* - When building the shuffle table we just do a 1:1 mapping based on the first occurance of a channel. If the - input channel has more than one occurance of a channel position, the second one will be ignored. - */ - for (iChannelOut = 0; iChannelOut < channelCountOut; iChannelOut += 1) { - ma_channel channelOut; - - /* Default to MA_CHANNEL_INDEX_NULL so that if a mapping is not found it'll be set appropriately. */ - pShuffleTable[iChannelOut] = MA_CHANNEL_INDEX_NULL; - - channelOut = ma_channel_map_get_channel(pChannelMapOut, channelCountOut, iChannelOut); - for (iChannelIn = 0; iChannelIn < channelCountIn; iChannelIn += 1) { - ma_channel channelIn; - - channelIn = ma_channel_map_get_channel(pChannelMapIn, channelCountIn, iChannelIn); - if (channelOut == channelIn) { - pShuffleTable[iChannelOut] = (ma_uint8)iChannelIn; - break; - } - - /* - Getting here means the channels don't exactly match, but we are going to support some - relaxed matching for practicality. If, for example, there are two stereo channel maps, - but one uses front left/right and the other uses side left/right, it makes logical - sense to just map these. The way we'll do it is we'll check if there is a logical - corresponding mapping, and if so, apply it, but we will *not* break from the loop, - thereby giving the loop a chance to find an exact match later which will take priority. - */ - switch (channelOut) - { - /* Left channels. */ - case MA_CHANNEL_FRONT_LEFT: - case MA_CHANNEL_SIDE_LEFT: - { - switch (channelIn) { - case MA_CHANNEL_FRONT_LEFT: - case MA_CHANNEL_SIDE_LEFT: - { - pShuffleTable[iChannelOut] = (ma_uint8)iChannelIn; - } break; - } - } break; - - /* Right channels. */ - case MA_CHANNEL_FRONT_RIGHT: - case MA_CHANNEL_SIDE_RIGHT: - { - switch (channelIn) { - case MA_CHANNEL_FRONT_RIGHT: - case MA_CHANNEL_SIDE_RIGHT: - { - pShuffleTable[iChannelOut] = (ma_uint8)iChannelIn; - } break; - } - } break; - - default: break; - } - } - } - - return MA_SUCCESS; -} - - -static void ma_channel_map_apply_shuffle_table_u8(ma_uint8* pFramesOut, ma_uint32 channelsOut, const ma_uint8* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable) -{ - ma_uint64 iFrame; - ma_uint32 iChannelOut; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_uint8 iChannelIn = pShuffleTable[iChannelOut]; - if (iChannelIn < channelsIn) { /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */ - pFramesOut[iChannelOut] = pFramesIn[iChannelIn]; - } else { - pFramesOut[iChannelOut] = 0; - } - } - - pFramesOut += channelsOut; - pFramesIn += channelsIn; - } -} - -static void ma_channel_map_apply_shuffle_table_s16(ma_int16* pFramesOut, ma_uint32 channelsOut, const ma_int16* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable) -{ - ma_uint64 iFrame; - ma_uint32 iChannelOut; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_uint8 iChannelIn = pShuffleTable[iChannelOut]; - if (iChannelIn < channelsIn) { /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */ - pFramesOut[iChannelOut] = pFramesIn[iChannelIn]; - } else { - pFramesOut[iChannelOut] = 0; - } - } - - pFramesOut += channelsOut; - pFramesIn += channelsIn; - } -} - -static void ma_channel_map_apply_shuffle_table_s24(ma_uint8* pFramesOut, ma_uint32 channelsOut, const ma_uint8* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable) -{ - ma_uint64 iFrame; - ma_uint32 iChannelOut; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_uint8 iChannelIn = pShuffleTable[iChannelOut]; - if (iChannelIn < channelsIn) { /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */ - pFramesOut[iChannelOut*3 + 0] = pFramesIn[iChannelIn*3 + 0]; - pFramesOut[iChannelOut*3 + 1] = pFramesIn[iChannelIn*3 + 1]; - pFramesOut[iChannelOut*3 + 2] = pFramesIn[iChannelIn*3 + 2]; - } else { - pFramesOut[iChannelOut*3 + 0] = 0; - } pFramesOut[iChannelOut*3 + 1] = 0; - } pFramesOut[iChannelOut*3 + 2] = 0; - - pFramesOut += channelsOut*3; - pFramesIn += channelsIn*3; - } -} - -static void ma_channel_map_apply_shuffle_table_s32(ma_int32* pFramesOut, ma_uint32 channelsOut, const ma_int32* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable) -{ - ma_uint64 iFrame; - ma_uint32 iChannelOut; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_uint8 iChannelIn = pShuffleTable[iChannelOut]; - if (iChannelIn < channelsIn) { /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */ - pFramesOut[iChannelOut] = pFramesIn[iChannelIn]; - } else { - pFramesOut[iChannelOut] = 0; - } - } - - pFramesOut += channelsOut; - pFramesIn += channelsIn; - } -} - -static void ma_channel_map_apply_shuffle_table_f32(float* pFramesOut, ma_uint32 channelsOut, const float* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable) -{ - ma_uint64 iFrame; - ma_uint32 iChannelOut; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_uint8 iChannelIn = pShuffleTable[iChannelOut]; - if (iChannelIn < channelsIn) { /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */ - pFramesOut[iChannelOut] = pFramesIn[iChannelIn]; - } else { - pFramesOut[iChannelOut] = 0; - } - } - - pFramesOut += channelsOut; - pFramesIn += channelsIn; - } -} - -static ma_result ma_channel_map_apply_shuffle_table(void* pFramesOut, ma_uint32 channelsOut, const void* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable, ma_format format) -{ - if (pFramesOut == NULL || pFramesIn == NULL || channelsOut == 0 || pShuffleTable == NULL) { - return MA_INVALID_ARGS; - } - - switch (format) - { - case ma_format_u8: - { - ma_channel_map_apply_shuffle_table_u8((ma_uint8*)pFramesOut, channelsOut, (const ma_uint8*)pFramesIn, channelsIn, frameCount, pShuffleTable); - } break; - - case ma_format_s16: - { - ma_channel_map_apply_shuffle_table_s16((ma_int16*)pFramesOut, channelsOut, (const ma_int16*)pFramesIn, channelsIn, frameCount, pShuffleTable); - } break; - - case ma_format_s24: - { - ma_channel_map_apply_shuffle_table_s24((ma_uint8*)pFramesOut, channelsOut, (const ma_uint8*)pFramesIn, channelsIn, frameCount, pShuffleTable); - } break; - - case ma_format_s32: - { - ma_channel_map_apply_shuffle_table_s32((ma_int32*)pFramesOut, channelsOut, (const ma_int32*)pFramesIn, channelsIn, frameCount, pShuffleTable); - } break; - - case ma_format_f32: - { - ma_channel_map_apply_shuffle_table_f32((float*)pFramesOut, channelsOut, (const float*)pFramesIn, channelsIn, frameCount, pShuffleTable); - } break; - - default: return MA_INVALID_ARGS; /* Unknown format. */ - } - - return MA_SUCCESS; -} - -static ma_result ma_channel_map_apply_mono_out_f32(float* pFramesOut, const float* pFramesIn, const ma_channel* pChannelMapIn, ma_uint32 channelsIn, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint32 iChannelIn; - ma_uint32 accumulationCount; - - if (pFramesOut == NULL || pFramesIn == NULL || channelsIn == 0) { - return MA_INVALID_ARGS; - } - - /* In this case the output stream needs to be the average of all channels, ignoring NONE. */ - - /* A quick pre-processing step to get the accumulation counter since we're ignoring NONE channels. */ - accumulationCount = 0; - for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) { - if (ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn) != MA_CHANNEL_NONE) { - accumulationCount += 1; - } - } - - if (accumulationCount > 0) { /* <-- Prevent a division by zero. */ - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float accumulation = 0; - - for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) { - ma_channel channelIn = ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn); - if (channelIn != MA_CHANNEL_NONE) { - accumulation += pFramesIn[iChannelIn]; - } - } - - pFramesOut[0] = accumulation / accumulationCount; - pFramesOut += 1; - pFramesIn += channelsIn; - } - } else { - ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, 1); - } - - return MA_SUCCESS; -} - -static ma_result ma_channel_map_apply_mono_in_f32(float* pFramesOut, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, const float* pFramesIn, ma_uint64 frameCount, ma_mono_expansion_mode monoExpansionMode) -{ - ma_uint64 iFrame; - ma_uint32 iChannelOut; - - if (pFramesOut == NULL || channelsOut == 0 || pFramesIn == NULL) { - return MA_INVALID_ARGS; - } - - /* Note that the MA_CHANNEL_NONE channel must be ignored in all cases. */ - switch (monoExpansionMode) - { - case ma_mono_expansion_mode_average: - { - float weight; - ma_uint32 validChannelCount = 0; - - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - if (channelOut != MA_CHANNEL_NONE) { - validChannelCount += 1; - } - } - - weight = 1.0f / validChannelCount; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - if (channelOut != MA_CHANNEL_NONE) { - pFramesOut[iChannelOut] = pFramesIn[0] * weight; - } - } - - pFramesOut += channelsOut; - pFramesIn += 1; - } - } break; - - case ma_mono_expansion_mode_stereo_only: - { - if (channelsOut >= 2) { - ma_uint32 iChannelLeft = (ma_uint32)-1; - ma_uint32 iChannelRight = (ma_uint32)-1; - - /* - We first need to find our stereo channels. We prefer front-left and front-right, but - if they're not available, we'll also try side-left and side-right. If neither are - available we'll fall through to the default case below. - */ - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - if (channelOut == MA_CHANNEL_SIDE_LEFT) { - iChannelLeft = iChannelOut; - } - if (channelOut == MA_CHANNEL_SIDE_RIGHT) { - iChannelRight = iChannelOut; - } - } - - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - if (channelOut == MA_CHANNEL_FRONT_LEFT) { - iChannelLeft = iChannelOut; - } - if (channelOut == MA_CHANNEL_FRONT_RIGHT) { - iChannelRight = iChannelOut; - } - } - - - if (iChannelLeft != (ma_uint32)-1 && iChannelRight != (ma_uint32)-1) { - /* We found our stereo channels so we can duplicate the signal across those channels. */ - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - if (channelOut != MA_CHANNEL_NONE) { - if (iChannelOut == iChannelLeft || iChannelOut == iChannelRight) { - pFramesOut[iChannelOut] = pFramesIn[0]; - } else { - pFramesOut[iChannelOut] = 0.0f; - } - } - } - - pFramesOut += channelsOut; - pFramesIn += 1; - } - - break; /* Get out of the switch. */ - } else { - /* Fallthrough. Does not have left and right channels. */ - goto default_handler; - } - } else { - /* Fallthrough. Does not have stereo channels. */ - goto default_handler; - } - }; /* Fallthrough. See comments above. */ - - case ma_mono_expansion_mode_duplicate: - default: - { - default_handler: - { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - if (channelOut != MA_CHANNEL_NONE) { - pFramesOut[iChannelOut] = pFramesIn[0]; - } - } - - pFramesOut += channelsOut; - pFramesIn += 1; - } - } - } break; - } - - return MA_SUCCESS; -} - -static void ma_channel_map_apply_f32(float* pFramesOut, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, const float* pFramesIn, const ma_channel* pChannelMapIn, ma_uint32 channelsIn, ma_uint64 frameCount, ma_channel_mix_mode mode, ma_mono_expansion_mode monoExpansionMode) -{ - ma_channel_conversion_path conversionPath = ma_channel_map_get_conversion_path(pChannelMapIn, channelsIn, pChannelMapOut, channelsOut, mode); - - /* Optimized Path: Passthrough */ - if (conversionPath == ma_channel_conversion_path_passthrough) { - ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, ma_format_f32, channelsOut); - return; - } - - /* Special Path: Mono Output. */ - if (conversionPath == ma_channel_conversion_path_mono_out) { - ma_channel_map_apply_mono_out_f32(pFramesOut, pFramesIn, pChannelMapIn, channelsIn, frameCount); - return; - } - - /* Special Path: Mono Input. */ - if (conversionPath == ma_channel_conversion_path_mono_in) { - ma_channel_map_apply_mono_in_f32(pFramesOut, pChannelMapOut, channelsOut, pFramesIn, frameCount, monoExpansionMode); - return; - } - - /* Getting here means we aren't running on an optimized conversion path. */ - if (channelsOut <= MA_MAX_CHANNELS) { - ma_result result; - - if (mode == ma_channel_mix_mode_simple) { - ma_channel shuffleTable[MA_MAX_CHANNELS]; - - result = ma_channel_map_build_shuffle_table(pChannelMapIn, channelsIn, pChannelMapOut, channelsOut, shuffleTable); - if (result != MA_SUCCESS) { - return; - } - - result = ma_channel_map_apply_shuffle_table(pFramesOut, channelsOut, pFramesIn, channelsIn, frameCount, shuffleTable, ma_format_f32); - if (result != MA_SUCCESS) { - return; - } - } else { - ma_uint32 iFrame; - ma_uint32 iChannelOut; - ma_uint32 iChannelIn; - float weights[32][32]; /* Do not use MA_MAX_CHANNELS here! */ - - /* - If we have a small enough number of channels, pre-compute the weights. Otherwise we'll just need to - fall back to a slower path because otherwise we'll run out of stack space. - */ - if (channelsIn <= ma_countof(weights) && channelsOut <= ma_countof(weights)) { - /* Pre-compute weights. */ - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) { - ma_channel channelIn = ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn); - weights[iChannelOut][iChannelIn] = ma_calculate_channel_position_rectangular_weight(channelOut, channelIn); - } - } - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - float accumulation = 0; - - for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) { - accumulation += pFramesIn[iChannelIn] * weights[iChannelOut][iChannelIn]; - } - - pFramesOut[iChannelOut] = accumulation; - } - - pFramesOut += channelsOut; - pFramesIn += channelsIn; - } - } else { - /* Cannot pre-compute weights because not enough room in stack-allocated buffer. */ - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { - float accumulation = 0; - ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); - - for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) { - ma_channel channelIn = ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn); - accumulation += pFramesIn[iChannelIn] * ma_calculate_channel_position_rectangular_weight(channelOut, channelIn); - } - - pFramesOut[iChannelOut] = accumulation; - } - - pFramesOut += channelsOut; - pFramesIn += channelsIn; - } - } - } - } else { - /* Fall back to silence. If you hit this, what are you doing with so many channels?! */ - ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, channelsOut); - } -} - - -typedef struct -{ - size_t sizeInBytes; - size_t channelMapInOffset; - size_t channelMapOutOffset; - size_t shuffleTableOffset; - size_t weightsOffset; -} ma_channel_converter_heap_layout; - -static ma_channel_conversion_path ma_channel_converter_config_get_conversion_path(const ma_channel_converter_config* pConfig) -{ - return ma_channel_map_get_conversion_path(pConfig->pChannelMapIn, pConfig->channelsIn, pConfig->pChannelMapOut, pConfig->channelsOut, pConfig->mixingMode); -} - -static ma_result ma_channel_converter_get_heap_layout(const ma_channel_converter_config* pConfig, ma_channel_converter_heap_layout* pHeapLayout) -{ - ma_channel_conversion_path conversionPath; - - MA_ASSERT(pHeapLayout != NULL); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channelsIn == 0 || pConfig->channelsOut == 0) { - return MA_INVALID_ARGS; - } - - if (!ma_channel_map_is_valid(pConfig->pChannelMapIn, pConfig->channelsIn)) { - return MA_INVALID_ARGS; - } - - if (!ma_channel_map_is_valid(pConfig->pChannelMapOut, pConfig->channelsOut)) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* Input channel map. Only need to allocate this if we have an input channel map (otherwise default channel map is assumed). */ - pHeapLayout->channelMapInOffset = pHeapLayout->sizeInBytes; - if (pConfig->pChannelMapIn != NULL) { - pHeapLayout->sizeInBytes += sizeof(ma_channel) * pConfig->channelsIn; - } - - /* Output channel map. Only need to allocate this if we have an output channel map (otherwise default channel map is assumed). */ - pHeapLayout->channelMapOutOffset = pHeapLayout->sizeInBytes; - if (pConfig->pChannelMapOut != NULL) { - pHeapLayout->sizeInBytes += sizeof(ma_channel) * pConfig->channelsOut; - } - - /* Alignment for the next section. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - /* Whether or not we use weights of a shuffle table depends on the channel map themselves and the algorithm we've chosen. */ - conversionPath = ma_channel_converter_config_get_conversion_path(pConfig); - - /* Shuffle table */ - pHeapLayout->shuffleTableOffset = pHeapLayout->sizeInBytes; - if (conversionPath == ma_channel_conversion_path_shuffle) { - pHeapLayout->sizeInBytes += sizeof(ma_uint8) * pConfig->channelsOut; - } - - /* Weights */ - pHeapLayout->weightsOffset = pHeapLayout->sizeInBytes; - if (conversionPath == ma_channel_conversion_path_weights) { - pHeapLayout->sizeInBytes += sizeof(float*) * pConfig->channelsIn; - pHeapLayout->sizeInBytes += sizeof(float ) * pConfig->channelsIn * pConfig->channelsOut; - } - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_channel_converter_get_heap_size(const ma_channel_converter_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_channel_converter_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_channel_converter_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_channel_converter_init_preallocated(const ma_channel_converter_config* pConfig, void* pHeap, ma_channel_converter* pConverter) -{ - ma_result result; - ma_channel_converter_heap_layout heapLayout; - - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pConverter); - - result = ma_channel_converter_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pConverter->_pHeap = pHeap; - MA_ZERO_MEMORY(pConverter->_pHeap, heapLayout.sizeInBytes); - - pConverter->format = pConfig->format; - pConverter->channelsIn = pConfig->channelsIn; - pConverter->channelsOut = pConfig->channelsOut; - pConverter->mixingMode = pConfig->mixingMode; - - if (pConfig->pChannelMapIn != NULL) { - pConverter->pChannelMapIn = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapInOffset); - ma_channel_map_copy_or_default(pConverter->pChannelMapIn, pConfig->channelsIn, pConfig->pChannelMapIn, pConfig->channelsIn); - } else { - pConverter->pChannelMapIn = NULL; /* Use default channel map. */ - } - - if (pConfig->pChannelMapOut != NULL) { - pConverter->pChannelMapOut = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapOutOffset); - ma_channel_map_copy_or_default(pConverter->pChannelMapOut, pConfig->channelsOut, pConfig->pChannelMapOut, pConfig->channelsOut); - } else { - pConverter->pChannelMapOut = NULL; /* Use default channel map. */ - } - - pConverter->conversionPath = ma_channel_converter_config_get_conversion_path(pConfig); - - if (pConverter->conversionPath == ma_channel_conversion_path_shuffle) { - pConverter->pShuffleTable = (ma_uint8*)ma_offset_ptr(pHeap, heapLayout.shuffleTableOffset); - ma_channel_map_build_shuffle_table(pConverter->pChannelMapIn, pConverter->channelsIn, pConverter->pChannelMapOut, pConverter->channelsOut, pConverter->pShuffleTable); - } - - if (pConverter->conversionPath == ma_channel_conversion_path_weights) { - ma_uint32 iChannelIn; - ma_uint32 iChannelOut; - - if (pConverter->format == ma_format_f32) { - pConverter->weights.f32 = (float** )ma_offset_ptr(pHeap, heapLayout.weightsOffset); - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) { - pConverter->weights.f32[iChannelIn] = (float*)ma_offset_ptr(pHeap, heapLayout.weightsOffset + ((sizeof(float*) * pConverter->channelsIn) + (sizeof(float) * pConverter->channelsOut * iChannelIn))); - } - } else { - pConverter->weights.s16 = (ma_int32**)ma_offset_ptr(pHeap, heapLayout.weightsOffset); - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) { - pConverter->weights.s16[iChannelIn] = (ma_int32*)ma_offset_ptr(pHeap, heapLayout.weightsOffset + ((sizeof(ma_int32*) * pConverter->channelsIn) + (sizeof(ma_int32) * pConverter->channelsOut * iChannelIn))); - } - } - - /* Silence our weights by default. */ - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; iChannelOut += 1) { - if (pConverter->format == ma_format_f32) { - pConverter->weights.f32[iChannelIn][iChannelOut] = 0.0f; - } else { - pConverter->weights.s16[iChannelIn][iChannelOut] = 0; - } - } - } - - /* - We now need to fill out our weights table. This is determined by the mixing mode. - */ - switch (pConverter->mixingMode) - { - case ma_channel_mix_mode_custom_weights: - { - if (pConfig->ppWeights == NULL) { - return MA_INVALID_ARGS; /* Config specified a custom weights mixing mode, but no custom weights have been specified. */ - } - - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; iChannelOut += 1) { - float weight = pConfig->ppWeights[iChannelIn][iChannelOut]; - - if (pConverter->format == ma_format_f32) { - pConverter->weights.f32[iChannelIn][iChannelOut] = weight; - } else { - pConverter->weights.s16[iChannelIn][iChannelOut] = ma_channel_converter_float_to_fixed(weight); - } - } - } - } break; - - case ma_channel_mix_mode_simple: - { - /* In simple mode, excess channels need to be silenced or dropped. */ - ma_uint32 iChannel; - for (iChannel = 0; iChannel < ma_min(pConverter->channelsIn, pConverter->channelsOut); iChannel += 1) { - if (pConverter->format == ma_format_f32) { - if (pConverter->weights.f32[iChannel][iChannel] == 0) { - pConverter->weights.f32[iChannel][iChannel] = 1; - } - } else { - if (pConverter->weights.s16[iChannel][iChannel] == 0) { - pConverter->weights.s16[iChannel][iChannel] = ma_channel_converter_float_to_fixed(1); - } - } - } - } break; - - case ma_channel_mix_mode_rectangular: - default: - { - /* Unmapped input channels. */ - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) { - ma_channel channelPosIn = pConverter->pChannelMapIn[iChannelIn]; - - if (ma_is_spatial_channel_position(channelPosIn)) { - if (!ma_channel_map_contains_channel_position(pConverter->channelsOut, pConverter->pChannelMapOut, channelPosIn)) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) { - ma_channel channelPosOut = pConverter->pChannelMapOut[iChannelOut]; - - if (ma_is_spatial_channel_position(channelPosOut)) { - float weight = 0; - if (pConverter->mixingMode == ma_channel_mix_mode_rectangular) { - weight = ma_calculate_channel_position_rectangular_weight(channelPosIn, channelPosOut); - } - - /* Only apply the weight if we haven't already got some contribution from the respective channels. */ - if (pConverter->format == ma_format_f32) { - if (pConverter->weights.f32[iChannelIn][iChannelOut] == 0) { - pConverter->weights.f32[iChannelIn][iChannelOut] = weight; - } - } else { - if (pConverter->weights.s16[iChannelIn][iChannelOut] == 0) { - pConverter->weights.s16[iChannelIn][iChannelOut] = ma_channel_converter_float_to_fixed(weight); - } - } - } - } - } - } - } - - /* Unmapped output channels. */ - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) { - ma_channel channelPosOut = pConverter->pChannelMapOut[iChannelOut]; - - if (ma_is_spatial_channel_position(channelPosOut)) { - if (!ma_channel_map_contains_channel_position(pConverter->channelsIn, pConverter->pChannelMapIn, channelPosOut)) { - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) { - ma_channel channelPosIn = pConverter->pChannelMapIn[iChannelIn]; - - if (ma_is_spatial_channel_position(channelPosIn)) { - float weight = 0; - if (pConverter->mixingMode == ma_channel_mix_mode_rectangular) { - weight = ma_calculate_channel_position_rectangular_weight(channelPosIn, channelPosOut); - } - - /* Only apply the weight if we haven't already got some contribution from the respective channels. */ - if (pConverter->format == ma_format_f32) { - if (pConverter->weights.f32[iChannelIn][iChannelOut] == 0) { - pConverter->weights.f32[iChannelIn][iChannelOut] = weight; - } - } else { - if (pConverter->weights.s16[iChannelIn][iChannelOut] == 0) { - pConverter->weights.s16[iChannelIn][iChannelOut] = ma_channel_converter_float_to_fixed(weight); - } - } - } - } - } - } - } - } break; - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_channel_converter_init(const ma_channel_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_channel_converter* pConverter) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_channel_converter_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_channel_converter_init_preallocated(pConfig, pHeap, pConverter); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pConverter->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_channel_converter_uninit(ma_channel_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pConverter == NULL) { - return; - } - - if (pConverter->_ownsHeap) { - ma_free(pConverter->_pHeap, pAllocationCallbacks); - } -} - -static ma_result ma_channel_converter_process_pcm_frames__passthrough(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - MA_ASSERT(pConverter != NULL); - MA_ASSERT(pFramesOut != NULL); - MA_ASSERT(pFramesIn != NULL); - - ma_copy_memory_64(pFramesOut, pFramesIn, frameCount * ma_get_bytes_per_frame(pConverter->format, pConverter->channelsOut)); - return MA_SUCCESS; -} - -static ma_result ma_channel_converter_process_pcm_frames__shuffle(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - MA_ASSERT(pConverter != NULL); - MA_ASSERT(pFramesOut != NULL); - MA_ASSERT(pFramesIn != NULL); - MA_ASSERT(pConverter->channelsIn == pConverter->channelsOut); - - return ma_channel_map_apply_shuffle_table(pFramesOut, pConverter->channelsOut, pFramesIn, pConverter->channelsIn, frameCount, pConverter->pShuffleTable, pConverter->format); -} - -static ma_result ma_channel_converter_process_pcm_frames__mono_in(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - - MA_ASSERT(pConverter != NULL); - MA_ASSERT(pFramesOut != NULL); - MA_ASSERT(pFramesIn != NULL); - MA_ASSERT(pConverter->channelsIn == 1); - - switch (pConverter->format) - { - case ma_format_u8: - { - /* */ ma_uint8* pFramesOutU8 = ( ma_uint8*)pFramesOut; - const ma_uint8* pFramesInU8 = (const ma_uint8*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) { - pFramesOutU8[iFrame*pConverter->channelsOut + iChannel] = pFramesInU8[iFrame]; - } - } - } break; - - case ma_format_s16: - { - /* */ ma_int16* pFramesOutS16 = ( ma_int16*)pFramesOut; - const ma_int16* pFramesInS16 = (const ma_int16*)pFramesIn; - - if (pConverter->channelsOut == 2) { - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - pFramesOutS16[iFrame*2 + 0] = pFramesInS16[iFrame]; - pFramesOutS16[iFrame*2 + 1] = pFramesInS16[iFrame]; - } - } else { - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) { - pFramesOutS16[iFrame*pConverter->channelsOut + iChannel] = pFramesInS16[iFrame]; - } - } - } - } break; - - case ma_format_s24: - { - /* */ ma_uint8* pFramesOutS24 = ( ma_uint8*)pFramesOut; - const ma_uint8* pFramesInS24 = (const ma_uint8*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) { - ma_uint64 iSampleOut = iFrame*pConverter->channelsOut + iChannel; - ma_uint64 iSampleIn = iFrame; - pFramesOutS24[iSampleOut*3 + 0] = pFramesInS24[iSampleIn*3 + 0]; - pFramesOutS24[iSampleOut*3 + 1] = pFramesInS24[iSampleIn*3 + 1]; - pFramesOutS24[iSampleOut*3 + 2] = pFramesInS24[iSampleIn*3 + 2]; - } - } - } break; - - case ma_format_s32: - { - /* */ ma_int32* pFramesOutS32 = ( ma_int32*)pFramesOut; - const ma_int32* pFramesInS32 = (const ma_int32*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) { - pFramesOutS32[iFrame*pConverter->channelsOut + iChannel] = pFramesInS32[iFrame]; - } - } - } break; - - case ma_format_f32: - { - /* */ float* pFramesOutF32 = ( float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - if (pConverter->channelsOut == 2) { - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - pFramesOutF32[iFrame*2 + 0] = pFramesInF32[iFrame]; - pFramesOutF32[iFrame*2 + 1] = pFramesInF32[iFrame]; - } - } else { - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) { - pFramesOutF32[iFrame*pConverter->channelsOut + iChannel] = pFramesInF32[iFrame]; - } - } - } - } break; - - default: return MA_INVALID_OPERATION; /* Unknown format. */ - } - - return MA_SUCCESS; -} - -static ma_result ma_channel_converter_process_pcm_frames__mono_out(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint32 iChannel; - - MA_ASSERT(pConverter != NULL); - MA_ASSERT(pFramesOut != NULL); - MA_ASSERT(pFramesIn != NULL); - MA_ASSERT(pConverter->channelsOut == 1); - - switch (pConverter->format) - { - case ma_format_u8: - { - /* */ ma_uint8* pFramesOutU8 = ( ma_uint8*)pFramesOut; - const ma_uint8* pFramesInU8 = (const ma_uint8*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_int32 t = 0; - for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) { - t += ma_pcm_sample_u8_to_s16_no_scale(pFramesInU8[iFrame*pConverter->channelsIn + iChannel]); - } - - pFramesOutU8[iFrame] = ma_clip_u8(t / pConverter->channelsOut); - } - } break; - - case ma_format_s16: - { - /* */ ma_int16* pFramesOutS16 = ( ma_int16*)pFramesOut; - const ma_int16* pFramesInS16 = (const ma_int16*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_int32 t = 0; - for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) { - t += pFramesInS16[iFrame*pConverter->channelsIn + iChannel]; - } - - pFramesOutS16[iFrame] = (ma_int16)(t / pConverter->channelsIn); - } - } break; - - case ma_format_s24: - { - /* */ ma_uint8* pFramesOutS24 = ( ma_uint8*)pFramesOut; - const ma_uint8* pFramesInS24 = (const ma_uint8*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_int64 t = 0; - for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) { - t += ma_pcm_sample_s24_to_s32_no_scale(&pFramesInS24[(iFrame*pConverter->channelsIn + iChannel)*3]); - } - - ma_pcm_sample_s32_to_s24_no_scale(t / pConverter->channelsIn, &pFramesOutS24[iFrame*3]); - } - } break; - - case ma_format_s32: - { - /* */ ma_int32* pFramesOutS32 = ( ma_int32*)pFramesOut; - const ma_int32* pFramesInS32 = (const ma_int32*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - ma_int64 t = 0; - for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) { - t += pFramesInS32[iFrame*pConverter->channelsIn + iChannel]; - } - - pFramesOutS32[iFrame] = (ma_int32)(t / pConverter->channelsIn); - } - } break; - - case ma_format_f32: - { - /* */ float* pFramesOutF32 = ( float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; ++iFrame) { - float t = 0; - for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) { - t += pFramesInF32[iFrame*pConverter->channelsIn + iChannel]; - } - - pFramesOutF32[iFrame] = t / pConverter->channelsIn; - } - } break; - - default: return MA_INVALID_OPERATION; /* Unknown format. */ - } - - return MA_SUCCESS; -} - -static ma_result ma_channel_converter_process_pcm_frames__weights(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - ma_uint32 iFrame; - ma_uint32 iChannelIn; - ma_uint32 iChannelOut; - - MA_ASSERT(pConverter != NULL); - MA_ASSERT(pFramesOut != NULL); - MA_ASSERT(pFramesIn != NULL); - - /* This is the more complicated case. Each of the output channels is accumulated with 0 or more input channels. */ - - /* Clear. */ - ma_zero_memory_64(pFramesOut, frameCount * ma_get_bytes_per_frame(pConverter->format, pConverter->channelsOut)); - - /* Accumulate. */ - switch (pConverter->format) - { - case ma_format_u8: - { - /* */ ma_uint8* pFramesOutU8 = ( ma_uint8*)pFramesOut; - const ma_uint8* pFramesInU8 = (const ma_uint8*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) { - ma_int16 u8_O = ma_pcm_sample_u8_to_s16_no_scale(pFramesOutU8[iFrame*pConverter->channelsOut + iChannelOut]); - ma_int16 u8_I = ma_pcm_sample_u8_to_s16_no_scale(pFramesInU8 [iFrame*pConverter->channelsIn + iChannelIn ]); - ma_int32 s = (ma_int32)ma_clamp(u8_O + ((u8_I * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT), -128, 127); - pFramesOutU8[iFrame*pConverter->channelsOut + iChannelOut] = ma_clip_u8((ma_int16)s); - } - } - } - } break; - - case ma_format_s16: - { - /* */ ma_int16* pFramesOutS16 = ( ma_int16*)pFramesOut; - const ma_int16* pFramesInS16 = (const ma_int16*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) { - ma_int32 s = pFramesOutS16[iFrame*pConverter->channelsOut + iChannelOut]; - s += (pFramesInS16[iFrame*pConverter->channelsIn + iChannelIn] * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT; - - pFramesOutS16[iFrame*pConverter->channelsOut + iChannelOut] = (ma_int16)ma_clamp(s, -32768, 32767); - } - } - } - } break; - - case ma_format_s24: - { - /* */ ma_uint8* pFramesOutS24 = ( ma_uint8*)pFramesOut; - const ma_uint8* pFramesInS24 = (const ma_uint8*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) { - ma_int64 s24_O = ma_pcm_sample_s24_to_s32_no_scale(&pFramesOutS24[(iFrame*pConverter->channelsOut + iChannelOut)*3]); - ma_int64 s24_I = ma_pcm_sample_s24_to_s32_no_scale(&pFramesInS24 [(iFrame*pConverter->channelsIn + iChannelIn )*3]); - ma_int64 s24 = (ma_int32)ma_clamp(s24_O + ((s24_I * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT), -8388608, 8388607); - ma_pcm_sample_s32_to_s24_no_scale(s24, &pFramesOutS24[(iFrame*pConverter->channelsOut + iChannelOut)*3]); - } - } - } - } break; - - case ma_format_s32: - { - /* */ ma_int32* pFramesOutS32 = ( ma_int32*)pFramesOut; - const ma_int32* pFramesInS32 = (const ma_int32*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) { - ma_int64 s = pFramesOutS32[iFrame*pConverter->channelsOut + iChannelOut]; - s += ((ma_int64)pFramesInS32[iFrame*pConverter->channelsIn + iChannelIn] * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT; - - pFramesOutS32[iFrame*pConverter->channelsOut + iChannelOut] = ma_clip_s32(s); - } - } - } - } break; - - case ma_format_f32: - { - /* */ float* pFramesOutF32 = ( float*)pFramesOut; - const float* pFramesInF32 = (const float*)pFramesIn; - - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) { - for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) { - pFramesOutF32[iFrame*pConverter->channelsOut + iChannelOut] += pFramesInF32[iFrame*pConverter->channelsIn + iChannelIn] * pConverter->weights.f32[iChannelIn][iChannelOut]; - } - } - } - } break; - - default: return MA_INVALID_OPERATION; /* Unknown format. */ - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_channel_converter_process_pcm_frames(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount) -{ - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - if (pFramesOut == NULL) { - return MA_INVALID_ARGS; - } - - if (pFramesIn == NULL) { - ma_zero_memory_64(pFramesOut, frameCount * ma_get_bytes_per_frame(pConverter->format, pConverter->channelsOut)); - return MA_SUCCESS; - } - - switch (pConverter->conversionPath) - { - case ma_channel_conversion_path_passthrough: return ma_channel_converter_process_pcm_frames__passthrough(pConverter, pFramesOut, pFramesIn, frameCount); - case ma_channel_conversion_path_mono_out: return ma_channel_converter_process_pcm_frames__mono_out(pConverter, pFramesOut, pFramesIn, frameCount); - case ma_channel_conversion_path_mono_in: return ma_channel_converter_process_pcm_frames__mono_in(pConverter, pFramesOut, pFramesIn, frameCount); - case ma_channel_conversion_path_shuffle: return ma_channel_converter_process_pcm_frames__shuffle(pConverter, pFramesOut, pFramesIn, frameCount); - case ma_channel_conversion_path_weights: - default: - { - return ma_channel_converter_process_pcm_frames__weights(pConverter, pFramesOut, pFramesIn, frameCount); - } - } -} - -MA_API ma_result ma_channel_converter_get_input_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap) -{ - if (pConverter == NULL || pChannelMap == NULL) { - return MA_INVALID_ARGS; - } - - ma_channel_map_copy_or_default(pChannelMap, channelMapCap, pConverter->pChannelMapIn, pConverter->channelsIn); - - return MA_SUCCESS; -} - -MA_API ma_result ma_channel_converter_get_output_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap) -{ - if (pConverter == NULL || pChannelMap == NULL) { - return MA_INVALID_ARGS; - } - - ma_channel_map_copy_or_default(pChannelMap, channelMapCap, pConverter->pChannelMapOut, pConverter->channelsOut); - - return MA_SUCCESS; -} - - -/************************************************************************************************************************************************************** - -Data Conversion - -**************************************************************************************************************************************************************/ -MA_API ma_data_converter_config ma_data_converter_config_init_default() -{ - ma_data_converter_config config; - MA_ZERO_OBJECT(&config); - - config.ditherMode = ma_dither_mode_none; - config.resampling.algorithm = ma_resample_algorithm_linear; - config.allowDynamicSampleRate = MA_FALSE; /* Disable dynamic sample rates by default because dynamic rate adjustments should be quite rare and it allows an optimization for cases when the in and out sample rates are the same. */ - - /* Linear resampling defaults. */ - config.resampling.linear.lpfOrder = 1; - - return config; -} - -MA_API ma_data_converter_config ma_data_converter_config_init(ma_format formatIn, ma_format formatOut, ma_uint32 channelsIn, ma_uint32 channelsOut, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut) -{ - ma_data_converter_config config = ma_data_converter_config_init_default(); - config.formatIn = formatIn; - config.formatOut = formatOut; - config.channelsIn = channelsIn; - config.channelsOut = channelsOut; - config.sampleRateIn = sampleRateIn; - config.sampleRateOut = sampleRateOut; - - return config; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t channelConverterOffset; - size_t resamplerOffset; -} ma_data_converter_heap_layout; - -static ma_bool32 ma_data_converter_config_is_resampler_required(const ma_data_converter_config* pConfig) -{ - MA_ASSERT(pConfig != NULL); - - return pConfig->allowDynamicSampleRate || pConfig->sampleRateIn != pConfig->sampleRateOut; -} - -static ma_format ma_data_converter_config_get_mid_format(const ma_data_converter_config* pConfig) -{ - MA_ASSERT(pConfig != NULL); - - /* - We want to avoid as much data conversion as possible. The channel converter and linear - resampler both support s16 and f32 natively. We need to decide on the format to use for this - stage. We call this the mid format because it's used in the middle stage of the conversion - pipeline. If the output format is either s16 or f32 we use that one. If that is not the case it - will do the same thing for the input format. If it's neither we just use f32. If we are using a - custom resampling backend, we can only guarantee that f32 will be supported so we'll be forced - to use that if resampling is required. - */ - if (ma_data_converter_config_is_resampler_required(pConfig) && pConfig->resampling.algorithm != ma_resample_algorithm_linear) { - return ma_format_f32; /* <-- Force f32 since that is the only one we can guarantee will be supported by the resampler. */ - } else { - /* */ if (pConfig->formatOut == ma_format_s16 || pConfig->formatOut == ma_format_f32) { - return pConfig->formatOut; - } else if (pConfig->formatIn == ma_format_s16 || pConfig->formatIn == ma_format_f32) { - return pConfig->formatIn; - } else { - return ma_format_f32; - } - } -} - -static ma_channel_converter_config ma_channel_converter_config_init_from_data_converter_config(const ma_data_converter_config* pConfig) -{ - ma_channel_converter_config channelConverterConfig; - - MA_ASSERT(pConfig != NULL); - - channelConverterConfig = ma_channel_converter_config_init(ma_data_converter_config_get_mid_format(pConfig), pConfig->channelsIn, pConfig->pChannelMapIn, pConfig->channelsOut, pConfig->pChannelMapOut, pConfig->channelMixMode); - channelConverterConfig.ppWeights = pConfig->ppChannelWeights; - - return channelConverterConfig; -} - -static ma_resampler_config ma_resampler_config_init_from_data_converter_config(const ma_data_converter_config* pConfig) -{ - ma_resampler_config resamplerConfig; - ma_uint32 resamplerChannels; - - MA_ASSERT(pConfig != NULL); - - /* The resampler is the most expensive part of the conversion process, so we need to do it at the stage where the channel count is at it's lowest. */ - if (pConfig->channelsIn < pConfig->channelsOut) { - resamplerChannels = pConfig->channelsIn; - } else { - resamplerChannels = pConfig->channelsOut; - } - - resamplerConfig = ma_resampler_config_init(ma_data_converter_config_get_mid_format(pConfig), resamplerChannels, pConfig->sampleRateIn, pConfig->sampleRateOut, pConfig->resampling.algorithm); - resamplerConfig.linear = pConfig->resampling.linear; - resamplerConfig.pBackendVTable = pConfig->resampling.pBackendVTable; - resamplerConfig.pBackendUserData = pConfig->resampling.pBackendUserData; - - return resamplerConfig; -} - -static ma_result ma_data_converter_get_heap_layout(const ma_data_converter_config* pConfig, ma_data_converter_heap_layout* pHeapLayout) -{ - ma_result result; - - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channelsIn == 0 || pConfig->channelsOut == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* Channel converter. */ - pHeapLayout->channelConverterOffset = pHeapLayout->sizeInBytes; - { - size_t heapSizeInBytes; - ma_channel_converter_config channelConverterConfig = ma_channel_converter_config_init_from_data_converter_config(pConfig); - - result = ma_channel_converter_get_heap_size(&channelConverterConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += heapSizeInBytes; - } - - /* Resampler. */ - pHeapLayout->resamplerOffset = pHeapLayout->sizeInBytes; - if (ma_data_converter_config_is_resampler_required(pConfig)) { - size_t heapSizeInBytes; - ma_resampler_config resamplerConfig = ma_resampler_config_init_from_data_converter_config(pConfig); - - result = ma_resampler_get_heap_size(&resamplerConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes += heapSizeInBytes; - } - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_converter_get_heap_size(const ma_data_converter_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_data_converter_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_data_converter_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_converter_init_preallocated(const ma_data_converter_config* pConfig, void* pHeap, ma_data_converter* pConverter) -{ - ma_result result; - ma_data_converter_heap_layout heapLayout; - ma_format midFormat; - ma_bool32 isResamplingRequired; - - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pConverter); - - result = ma_data_converter_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pConverter->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pConverter->formatIn = pConfig->formatIn; - pConverter->formatOut = pConfig->formatOut; - pConverter->channelsIn = pConfig->channelsIn; - pConverter->channelsOut = pConfig->channelsOut; - pConverter->sampleRateIn = pConfig->sampleRateIn; - pConverter->sampleRateOut = pConfig->sampleRateOut; - pConverter->ditherMode = pConfig->ditherMode; - - /* - Determine if resampling is required. We need to do this so we can determine an appropriate - mid format to use. If resampling is required, the mid format must be ma_format_f32 since - that is the only one that is guaranteed to supported by custom resampling backends. - */ - isResamplingRequired = ma_data_converter_config_is_resampler_required(pConfig); - midFormat = ma_data_converter_config_get_mid_format(pConfig); - - - /* Channel converter. We always initialize this, but we check if it configures itself as a passthrough to determine whether or not it's needed. */ - { - ma_channel_converter_config channelConverterConfig = ma_channel_converter_config_init_from_data_converter_config(pConfig); - - result = ma_channel_converter_init_preallocated(&channelConverterConfig, ma_offset_ptr(pHeap, heapLayout.channelConverterOffset), &pConverter->channelConverter); - if (result != MA_SUCCESS) { - return result; - } - - /* If the channel converter is not a passthrough we need to enable it. Otherwise we can skip it. */ - if (pConverter->channelConverter.conversionPath != ma_channel_conversion_path_passthrough) { - pConverter->hasChannelConverter = MA_TRUE; - } - } - - - /* Resampler. */ - if (isResamplingRequired) { - ma_resampler_config resamplerConfig = ma_resampler_config_init_from_data_converter_config(pConfig); - - result = ma_resampler_init_preallocated(&resamplerConfig, ma_offset_ptr(pHeap, heapLayout.resamplerOffset), &pConverter->resampler); - if (result != MA_SUCCESS) { - return result; - } - - pConverter->hasResampler = MA_TRUE; - } - - - /* We can simplify pre- and post-format conversion if we have neither channel conversion nor resampling. */ - if (pConverter->hasChannelConverter == MA_FALSE && pConverter->hasResampler == MA_FALSE) { - /* We have neither channel conversion nor resampling so we'll only need one of pre- or post-format conversion, or none if the input and output formats are the same. */ - if (pConverter->formatIn == pConverter->formatOut) { - /* The formats are the same so we can just pass through. */ - pConverter->hasPreFormatConversion = MA_FALSE; - pConverter->hasPostFormatConversion = MA_FALSE; - } else { - /* The formats are different so we need to do either pre- or post-format conversion. It doesn't matter which. */ - pConverter->hasPreFormatConversion = MA_FALSE; - pConverter->hasPostFormatConversion = MA_TRUE; - } - } else { - /* We have a channel converter and/or resampler so we'll need channel conversion based on the mid format. */ - if (pConverter->formatIn != midFormat) { - pConverter->hasPreFormatConversion = MA_TRUE; - } - if (pConverter->formatOut != midFormat) { - pConverter->hasPostFormatConversion = MA_TRUE; - } - } - - /* We can enable passthrough optimizations if applicable. Note that we'll only be able to do this if the sample rate is static. */ - if (pConverter->hasPreFormatConversion == MA_FALSE && - pConverter->hasPostFormatConversion == MA_FALSE && - pConverter->hasChannelConverter == MA_FALSE && - pConverter->hasResampler == MA_FALSE) { - pConverter->isPassthrough = MA_TRUE; - } - - - /* We now need to determine our execution path. */ - if (pConverter->isPassthrough) { - pConverter->executionPath = ma_data_converter_execution_path_passthrough; - } else { - if (pConverter->channelsIn < pConverter->channelsOut) { - /* Do resampling first, if necessary. */ - MA_ASSERT(pConverter->hasChannelConverter == MA_TRUE); - - if (pConverter->hasResampler) { - pConverter->executionPath = ma_data_converter_execution_path_resample_first; - } else { - pConverter->executionPath = ma_data_converter_execution_path_channels_only; - } - } else { - /* Do channel conversion first, if necessary. */ - if (pConverter->hasChannelConverter) { - if (pConverter->hasResampler) { - pConverter->executionPath = ma_data_converter_execution_path_channels_first; - } else { - pConverter->executionPath = ma_data_converter_execution_path_channels_only; - } - } else { - /* Channel routing not required. */ - if (pConverter->hasResampler) { - pConverter->executionPath = ma_data_converter_execution_path_resample_only; - } else { - pConverter->executionPath = ma_data_converter_execution_path_format_only; - } - } - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_converter_init(const ma_data_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_converter* pConverter) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_data_converter_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_data_converter_init_preallocated(pConfig, pHeap, pConverter); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pConverter->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_data_converter_uninit(ma_data_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pConverter == NULL) { - return; - } - - if (pConverter->hasResampler) { - ma_resampler_uninit(&pConverter->resampler, pAllocationCallbacks); - } - - ma_channel_converter_uninit(&pConverter->channelConverter, pAllocationCallbacks); - - if (pConverter->_ownsHeap) { - ma_free(pConverter->_pHeap, pAllocationCallbacks); - } -} - -static ma_result ma_data_converter_process_pcm_frames__passthrough(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 frameCount; - - MA_ASSERT(pConverter != NULL); - - frameCountIn = 0; - if (pFrameCountIn != NULL) { - frameCountIn = *pFrameCountIn; - } - - frameCountOut = 0; - if (pFrameCountOut != NULL) { - frameCountOut = *pFrameCountOut; - } - - frameCount = ma_min(frameCountIn, frameCountOut); - - if (pFramesOut != NULL) { - if (pFramesIn != NULL) { - ma_copy_memory_64(pFramesOut, pFramesIn, frameCount * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut)); - } else { - ma_zero_memory_64(pFramesOut, frameCount * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut)); - } - } - - if (pFrameCountIn != NULL) { - *pFrameCountIn = frameCount; - } - if (pFrameCountOut != NULL) { - *pFrameCountOut = frameCount; - } - - return MA_SUCCESS; -} - -static ma_result ma_data_converter_process_pcm_frames__format_only(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 frameCount; - - MA_ASSERT(pConverter != NULL); - - frameCountIn = 0; - if (pFrameCountIn != NULL) { - frameCountIn = *pFrameCountIn; - } - - frameCountOut = 0; - if (pFrameCountOut != NULL) { - frameCountOut = *pFrameCountOut; - } - - frameCount = ma_min(frameCountIn, frameCountOut); - - if (pFramesOut != NULL) { - if (pFramesIn != NULL) { - ma_convert_pcm_frames_format(pFramesOut, pConverter->formatOut, pFramesIn, pConverter->formatIn, frameCount, pConverter->channelsIn, pConverter->ditherMode); - } else { - ma_zero_memory_64(pFramesOut, frameCount * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut)); - } - } - - if (pFrameCountIn != NULL) { - *pFrameCountIn = frameCount; - } - if (pFrameCountOut != NULL) { - *pFrameCountOut = frameCount; - } - - return MA_SUCCESS; -} - - -static ma_result ma_data_converter_process_pcm_frames__resample_with_format_conversion(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - ma_result result = MA_SUCCESS; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 framesProcessedIn; - ma_uint64 framesProcessedOut; - - MA_ASSERT(pConverter != NULL); - - frameCountIn = 0; - if (pFrameCountIn != NULL) { - frameCountIn = *pFrameCountIn; - } - - frameCountOut = 0; - if (pFrameCountOut != NULL) { - frameCountOut = *pFrameCountOut; - } - - framesProcessedIn = 0; - framesProcessedOut = 0; - - while (framesProcessedOut < frameCountOut) { - ma_uint8 pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - const ma_uint32 tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels); - const void* pFramesInThisIteration; - /* */ void* pFramesOutThisIteration; - ma_uint64 frameCountInThisIteration; - ma_uint64 frameCountOutThisIteration; - - if (pFramesIn != NULL) { - pFramesInThisIteration = ma_offset_ptr(pFramesIn, framesProcessedIn * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn)); - } else { - pFramesInThisIteration = NULL; - } - - if (pFramesOut != NULL) { - pFramesOutThisIteration = ma_offset_ptr(pFramesOut, framesProcessedOut * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut)); - } else { - pFramesOutThisIteration = NULL; - } - - /* Do a pre format conversion if necessary. */ - if (pConverter->hasPreFormatConversion) { - ma_uint8 pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - const ma_uint32 tempBufferInCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels); - - frameCountInThisIteration = (frameCountIn - framesProcessedIn); - if (frameCountInThisIteration > tempBufferInCap) { - frameCountInThisIteration = tempBufferInCap; - } - - if (pConverter->hasPostFormatConversion) { - if (frameCountInThisIteration > tempBufferOutCap) { - frameCountInThisIteration = tempBufferOutCap; - } - } - - if (pFramesInThisIteration != NULL) { - ma_convert_pcm_frames_format(pTempBufferIn, pConverter->resampler.format, pFramesInThisIteration, pConverter->formatIn, frameCountInThisIteration, pConverter->channelsIn, pConverter->ditherMode); - } else { - MA_ZERO_MEMORY(pTempBufferIn, sizeof(pTempBufferIn)); - } - - frameCountOutThisIteration = (frameCountOut - framesProcessedOut); - - if (pConverter->hasPostFormatConversion) { - /* Both input and output conversion required. Output to the temp buffer. */ - if (frameCountOutThisIteration > tempBufferOutCap) { - frameCountOutThisIteration = tempBufferOutCap; - } - - result = ma_resampler_process_pcm_frames(&pConverter->resampler, pTempBufferIn, &frameCountInThisIteration, pTempBufferOut, &frameCountOutThisIteration); - } else { - /* Only pre-format required. Output straight to the output buffer. */ - result = ma_resampler_process_pcm_frames(&pConverter->resampler, pTempBufferIn, &frameCountInThisIteration, pFramesOutThisIteration, &frameCountOutThisIteration); - } - - if (result != MA_SUCCESS) { - break; - } - } else { - /* No pre-format required. Just read straight from the input buffer. */ - MA_ASSERT(pConverter->hasPostFormatConversion == MA_TRUE); - - frameCountInThisIteration = (frameCountIn - framesProcessedIn); - frameCountOutThisIteration = (frameCountOut - framesProcessedOut); - if (frameCountOutThisIteration > tempBufferOutCap) { - frameCountOutThisIteration = tempBufferOutCap; - } - - result = ma_resampler_process_pcm_frames(&pConverter->resampler, pFramesInThisIteration, &frameCountInThisIteration, pTempBufferOut, &frameCountOutThisIteration); - if (result != MA_SUCCESS) { - break; - } - } - - /* If we are doing a post format conversion we need to do that now. */ - if (pConverter->hasPostFormatConversion) { - if (pFramesOutThisIteration != NULL) { - ma_convert_pcm_frames_format(pFramesOutThisIteration, pConverter->formatOut, pTempBufferOut, pConverter->resampler.format, frameCountOutThisIteration, pConverter->resampler.channels, pConverter->ditherMode); - } - } - - framesProcessedIn += frameCountInThisIteration; - framesProcessedOut += frameCountOutThisIteration; - - MA_ASSERT(framesProcessedIn <= frameCountIn); - MA_ASSERT(framesProcessedOut <= frameCountOut); - - if (frameCountOutThisIteration == 0) { - break; /* Consumed all of our input data. */ - } - } - - if (pFrameCountIn != NULL) { - *pFrameCountIn = framesProcessedIn; - } - if (pFrameCountOut != NULL) { - *pFrameCountOut = framesProcessedOut; - } - - return result; -} - -static ma_result ma_data_converter_process_pcm_frames__resample_only(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - MA_ASSERT(pConverter != NULL); - - if (pConverter->hasPreFormatConversion == MA_FALSE && pConverter->hasPostFormatConversion == MA_FALSE) { - /* Neither pre- nor post-format required. This is simple case where only resampling is required. */ - return ma_resampler_process_pcm_frames(&pConverter->resampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } else { - /* Format conversion required. */ - return ma_data_converter_process_pcm_frames__resample_with_format_conversion(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - } -} - -static ma_result ma_data_converter_process_pcm_frames__channels_only(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - ma_result result; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 frameCount; - - MA_ASSERT(pConverter != NULL); - - frameCountIn = 0; - if (pFrameCountIn != NULL) { - frameCountIn = *pFrameCountIn; - } - - frameCountOut = 0; - if (pFrameCountOut != NULL) { - frameCountOut = *pFrameCountOut; - } - - frameCount = ma_min(frameCountIn, frameCountOut); - - if (pConverter->hasPreFormatConversion == MA_FALSE && pConverter->hasPostFormatConversion == MA_FALSE) { - /* No format conversion required. */ - result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pFramesOut, pFramesIn, frameCount); - if (result != MA_SUCCESS) { - return result; - } - } else { - /* Format conversion required. */ - ma_uint64 framesProcessed = 0; - - while (framesProcessed < frameCount) { - ma_uint8 pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - const ma_uint32 tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsOut); - const void* pFramesInThisIteration; - /* */ void* pFramesOutThisIteration; - ma_uint64 frameCountThisIteration; - - if (pFramesIn != NULL) { - pFramesInThisIteration = ma_offset_ptr(pFramesIn, framesProcessed * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn)); - } else { - pFramesInThisIteration = NULL; - } - - if (pFramesOut != NULL) { - pFramesOutThisIteration = ma_offset_ptr(pFramesOut, framesProcessed * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut)); - } else { - pFramesOutThisIteration = NULL; - } - - /* Do a pre format conversion if necessary. */ - if (pConverter->hasPreFormatConversion) { - ma_uint8 pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - const ma_uint32 tempBufferInCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsIn); - - frameCountThisIteration = (frameCount - framesProcessed); - if (frameCountThisIteration > tempBufferInCap) { - frameCountThisIteration = tempBufferInCap; - } - - if (pConverter->hasPostFormatConversion) { - if (frameCountThisIteration > tempBufferOutCap) { - frameCountThisIteration = tempBufferOutCap; - } - } - - if (pFramesInThisIteration != NULL) { - ma_convert_pcm_frames_format(pTempBufferIn, pConverter->channelConverter.format, pFramesInThisIteration, pConverter->formatIn, frameCountThisIteration, pConverter->channelsIn, pConverter->ditherMode); - } else { - MA_ZERO_MEMORY(pTempBufferIn, sizeof(pTempBufferIn)); - } - - if (pConverter->hasPostFormatConversion) { - /* Both input and output conversion required. Output to the temp buffer. */ - result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pTempBufferOut, pTempBufferIn, frameCountThisIteration); - } else { - /* Only pre-format required. Output straight to the output buffer. */ - result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pFramesOutThisIteration, pTempBufferIn, frameCountThisIteration); - } - - if (result != MA_SUCCESS) { - break; - } - } else { - /* No pre-format required. Just read straight from the input buffer. */ - MA_ASSERT(pConverter->hasPostFormatConversion == MA_TRUE); - - frameCountThisIteration = (frameCount - framesProcessed); - if (frameCountThisIteration > tempBufferOutCap) { - frameCountThisIteration = tempBufferOutCap; - } - - result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pTempBufferOut, pFramesInThisIteration, frameCountThisIteration); - if (result != MA_SUCCESS) { - break; - } - } - - /* If we are doing a post format conversion we need to do that now. */ - if (pConverter->hasPostFormatConversion) { - if (pFramesOutThisIteration != NULL) { - ma_convert_pcm_frames_format(pFramesOutThisIteration, pConverter->formatOut, pTempBufferOut, pConverter->channelConverter.format, frameCountThisIteration, pConverter->channelConverter.channelsOut, pConverter->ditherMode); - } - } - - framesProcessed += frameCountThisIteration; - } - } - - if (pFrameCountIn != NULL) { - *pFrameCountIn = frameCount; - } - if (pFrameCountOut != NULL) { - *pFrameCountOut = frameCount; - } - - return MA_SUCCESS; -} - -static ma_result ma_data_converter_process_pcm_frames__resample_first(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - ma_result result; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 framesProcessedIn; - ma_uint64 framesProcessedOut; - ma_uint8 pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In resampler format. */ - ma_uint64 tempBufferInCap; - ma_uint8 pTempBufferMid[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In resampler format, channel converter input format. */ - ma_uint64 tempBufferMidCap; - ma_uint8 pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In channel converter output format. */ - ma_uint64 tempBufferOutCap; - - MA_ASSERT(pConverter != NULL); - MA_ASSERT(pConverter->resampler.format == pConverter->channelConverter.format); - MA_ASSERT(pConverter->resampler.channels == pConverter->channelConverter.channelsIn); - MA_ASSERT(pConverter->resampler.channels < pConverter->channelConverter.channelsOut); - - frameCountIn = 0; - if (pFrameCountIn != NULL) { - frameCountIn = *pFrameCountIn; - } - - frameCountOut = 0; - if (pFrameCountOut != NULL) { - frameCountOut = *pFrameCountOut; - } - - framesProcessedIn = 0; - framesProcessedOut = 0; - - tempBufferInCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels); - tempBufferMidCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels); - tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsOut); - - while (framesProcessedOut < frameCountOut) { - ma_uint64 frameCountInThisIteration; - ma_uint64 frameCountOutThisIteration; - const void* pRunningFramesIn = NULL; - void* pRunningFramesOut = NULL; - const void* pResampleBufferIn; - void* pChannelsBufferOut; - - if (pFramesIn != NULL) { - pRunningFramesIn = ma_offset_ptr(pFramesIn, framesProcessedIn * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn)); - } - if (pFramesOut != NULL) { - pRunningFramesOut = ma_offset_ptr(pFramesOut, framesProcessedOut * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut)); - } - - /* Run input data through the resampler and output it to the temporary buffer. */ - frameCountInThisIteration = (frameCountIn - framesProcessedIn); - - if (pConverter->hasPreFormatConversion) { - if (frameCountInThisIteration > tempBufferInCap) { - frameCountInThisIteration = tempBufferInCap; - } - } - - frameCountOutThisIteration = (frameCountOut - framesProcessedOut); - if (frameCountOutThisIteration > tempBufferMidCap) { - frameCountOutThisIteration = tempBufferMidCap; - } - - /* We can't read more frames than can fit in the output buffer. */ - if (pConverter->hasPostFormatConversion) { - if (frameCountOutThisIteration > tempBufferOutCap) { - frameCountOutThisIteration = tempBufferOutCap; - } - } - - /* We need to ensure we don't try to process too many input frames that we run out of room in the output buffer. If this happens we'll end up glitching. */ - - /* - We need to try to predict how many input frames will be required for the resampler. If the - resampler can tell us, we'll use that. Otherwise we'll need to make a best guess. The further - off we are from this, the more wasted format conversions we'll end up doing. - */ - #if 1 - { - ma_uint64 requiredInputFrameCount; - - result = ma_resampler_get_required_input_frame_count(&pConverter->resampler, frameCountOutThisIteration, &requiredInputFrameCount); - if (result != MA_SUCCESS) { - /* Fall back to a best guess. */ - requiredInputFrameCount = (frameCountOutThisIteration * pConverter->resampler.sampleRateIn) / pConverter->resampler.sampleRateOut; - } - - if (frameCountInThisIteration > requiredInputFrameCount) { - frameCountInThisIteration = requiredInputFrameCount; - } - } - #endif - - if (pConverter->hasPreFormatConversion) { - if (pFramesIn != NULL) { - ma_convert_pcm_frames_format(pTempBufferIn, pConverter->resampler.format, pRunningFramesIn, pConverter->formatIn, frameCountInThisIteration, pConverter->channelsIn, pConverter->ditherMode); - pResampleBufferIn = pTempBufferIn; - } else { - pResampleBufferIn = NULL; - } - } else { - pResampleBufferIn = pRunningFramesIn; - } - - result = ma_resampler_process_pcm_frames(&pConverter->resampler, pResampleBufferIn, &frameCountInThisIteration, pTempBufferMid, &frameCountOutThisIteration); - if (result != MA_SUCCESS) { - return result; - } - - - /* - The input data has been resampled so now we need to run it through the channel converter. The input data is always contained in pTempBufferMid. We only need to do - this part if we have an output buffer. - */ - if (pFramesOut != NULL) { - if (pConverter->hasPostFormatConversion) { - pChannelsBufferOut = pTempBufferOut; - } else { - pChannelsBufferOut = pRunningFramesOut; - } - - result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pChannelsBufferOut, pTempBufferMid, frameCountOutThisIteration); - if (result != MA_SUCCESS) { - return result; - } - - /* Finally we do post format conversion. */ - if (pConverter->hasPostFormatConversion) { - ma_convert_pcm_frames_format(pRunningFramesOut, pConverter->formatOut, pChannelsBufferOut, pConverter->channelConverter.format, frameCountOutThisIteration, pConverter->channelConverter.channelsOut, pConverter->ditherMode); - } - } - - - framesProcessedIn += frameCountInThisIteration; - framesProcessedOut += frameCountOutThisIteration; - - MA_ASSERT(framesProcessedIn <= frameCountIn); - MA_ASSERT(framesProcessedOut <= frameCountOut); - - if (frameCountOutThisIteration == 0) { - break; /* Consumed all of our input data. */ - } - } - - if (pFrameCountIn != NULL) { - *pFrameCountIn = framesProcessedIn; - } - if (pFrameCountOut != NULL) { - *pFrameCountOut = framesProcessedOut; - } - - return MA_SUCCESS; -} - -static ma_result ma_data_converter_process_pcm_frames__channels_first(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - ma_result result; - ma_uint64 frameCountIn; - ma_uint64 frameCountOut; - ma_uint64 framesProcessedIn; - ma_uint64 framesProcessedOut; - ma_uint8 pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In resampler format. */ - ma_uint64 tempBufferInCap; - ma_uint8 pTempBufferMid[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In resampler format, channel converter input format. */ - ma_uint64 tempBufferMidCap; - ma_uint8 pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In channel converter output format. */ - ma_uint64 tempBufferOutCap; - - MA_ASSERT(pConverter != NULL); - MA_ASSERT(pConverter->resampler.format == pConverter->channelConverter.format); - MA_ASSERT(pConverter->resampler.channels == pConverter->channelConverter.channelsOut); - MA_ASSERT(pConverter->resampler.channels <= pConverter->channelConverter.channelsIn); - - frameCountIn = 0; - if (pFrameCountIn != NULL) { - frameCountIn = *pFrameCountIn; - } - - frameCountOut = 0; - if (pFrameCountOut != NULL) { - frameCountOut = *pFrameCountOut; - } - - framesProcessedIn = 0; - framesProcessedOut = 0; - - tempBufferInCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsIn); - tempBufferMidCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsOut); - tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels); - - while (framesProcessedOut < frameCountOut) { - ma_uint64 frameCountInThisIteration; - ma_uint64 frameCountOutThisIteration; - const void* pRunningFramesIn = NULL; - void* pRunningFramesOut = NULL; - const void* pChannelsBufferIn; - void* pResampleBufferOut; - - if (pFramesIn != NULL) { - pRunningFramesIn = ma_offset_ptr(pFramesIn, framesProcessedIn * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn)); - } - if (pFramesOut != NULL) { - pRunningFramesOut = ma_offset_ptr(pFramesOut, framesProcessedOut * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut)); - } - - /* - Before doing any processing we need to determine how many frames we should try processing - this iteration, for both input and output. The resampler requires us to perform format and - channel conversion before passing any data into it. If we get our input count wrong, we'll - end up peforming redundant pre-processing. This isn't the end of the world, but it does - result in some inefficiencies proportionate to how far our estimates are off. - - If the resampler has a means to calculate exactly how much we'll need, we'll use that. - Otherwise we'll make a best guess. In order to do this, we'll need to calculate the output - frame count first. - */ - frameCountOutThisIteration = (frameCountOut - framesProcessedOut); - if (frameCountOutThisIteration > tempBufferMidCap) { - frameCountOutThisIteration = tempBufferMidCap; - } - - if (pConverter->hasPostFormatConversion) { - if (frameCountOutThisIteration > tempBufferOutCap) { - frameCountOutThisIteration = tempBufferOutCap; - } - } - - /* Now that we have the output frame count we can determine the input frame count. */ - frameCountInThisIteration = (frameCountIn - framesProcessedIn); - if (pConverter->hasPreFormatConversion) { - if (frameCountInThisIteration > tempBufferInCap) { - frameCountInThisIteration = tempBufferInCap; - } - } - - if (frameCountInThisIteration > tempBufferMidCap) { - frameCountInThisIteration = tempBufferMidCap; - } - - #if 1 - { - ma_uint64 requiredInputFrameCount; - - result = ma_resampler_get_required_input_frame_count(&pConverter->resampler, frameCountOutThisIteration, &requiredInputFrameCount); - if (result != MA_SUCCESS) { - /* Fall back to a best guess. */ - requiredInputFrameCount = (frameCountOutThisIteration * pConverter->resampler.sampleRateIn) / pConverter->resampler.sampleRateOut; - } - - if (frameCountInThisIteration > requiredInputFrameCount) { - frameCountInThisIteration = requiredInputFrameCount; - } - } - #endif - - - /* Pre format conversion. */ - if (pConverter->hasPreFormatConversion) { - if (pRunningFramesIn != NULL) { - ma_convert_pcm_frames_format(pTempBufferIn, pConverter->channelConverter.format, pRunningFramesIn, pConverter->formatIn, frameCountInThisIteration, pConverter->channelsIn, pConverter->ditherMode); - pChannelsBufferIn = pTempBufferIn; - } else { - pChannelsBufferIn = NULL; - } - } else { - pChannelsBufferIn = pRunningFramesIn; - } - - - /* Channel conversion. */ - result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pTempBufferMid, pChannelsBufferIn, frameCountInThisIteration); - if (result != MA_SUCCESS) { - return result; - } - - - /* Resampling. */ - if (pConverter->hasPostFormatConversion) { - pResampleBufferOut = pTempBufferOut; - } else { - pResampleBufferOut = pRunningFramesOut; - } - - result = ma_resampler_process_pcm_frames(&pConverter->resampler, pTempBufferMid, &frameCountInThisIteration, pResampleBufferOut, &frameCountOutThisIteration); - if (result != MA_SUCCESS) { - return result; - } - - - /* Post format conversion. */ - if (pConverter->hasPostFormatConversion) { - if (pRunningFramesOut != NULL) { - ma_convert_pcm_frames_format(pRunningFramesOut, pConverter->formatOut, pResampleBufferOut, pConverter->resampler.format, frameCountOutThisIteration, pConverter->channelsOut, pConverter->ditherMode); - } - } - - - framesProcessedIn += frameCountInThisIteration; - framesProcessedOut += frameCountOutThisIteration; - - MA_ASSERT(framesProcessedIn <= frameCountIn); - MA_ASSERT(framesProcessedOut <= frameCountOut); - - if (frameCountOutThisIteration == 0) { - break; /* Consumed all of our input data. */ - } - } - - if (pFrameCountIn != NULL) { - *pFrameCountIn = framesProcessedIn; - } - if (pFrameCountOut != NULL) { - *pFrameCountOut = framesProcessedOut; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_converter_process_pcm_frames(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut) -{ - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - switch (pConverter->executionPath) - { - case ma_data_converter_execution_path_passthrough: return ma_data_converter_process_pcm_frames__passthrough(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - case ma_data_converter_execution_path_format_only: return ma_data_converter_process_pcm_frames__format_only(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - case ma_data_converter_execution_path_channels_only: return ma_data_converter_process_pcm_frames__channels_only(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - case ma_data_converter_execution_path_resample_only: return ma_data_converter_process_pcm_frames__resample_only(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - case ma_data_converter_execution_path_resample_first: return ma_data_converter_process_pcm_frames__resample_first(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - case ma_data_converter_execution_path_channels_first: return ma_data_converter_process_pcm_frames__channels_first(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut); - default: return MA_INVALID_OPERATION; /* Should never hit this. */ - } -} - -MA_API ma_result ma_data_converter_set_rate(ma_data_converter* pConverter, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut) -{ - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - if (pConverter->hasResampler == MA_FALSE) { - return MA_INVALID_OPERATION; /* Dynamic resampling not enabled. */ - } - - return ma_resampler_set_rate(&pConverter->resampler, sampleRateIn, sampleRateOut); -} - -MA_API ma_result ma_data_converter_set_rate_ratio(ma_data_converter* pConverter, float ratioInOut) -{ - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - if (pConverter->hasResampler == MA_FALSE) { - return MA_INVALID_OPERATION; /* Dynamic resampling not enabled. */ - } - - return ma_resampler_set_rate_ratio(&pConverter->resampler, ratioInOut); -} - -MA_API ma_uint64 ma_data_converter_get_input_latency(const ma_data_converter* pConverter) -{ - if (pConverter == NULL) { - return 0; - } - - if (pConverter->hasResampler) { - return ma_resampler_get_input_latency(&pConverter->resampler); - } - - return 0; /* No latency without a resampler. */ -} - -MA_API ma_uint64 ma_data_converter_get_output_latency(const ma_data_converter* pConverter) -{ - if (pConverter == NULL) { - return 0; - } - - if (pConverter->hasResampler) { - return ma_resampler_get_output_latency(&pConverter->resampler); - } - - return 0; /* No latency without a resampler. */ -} - -MA_API ma_result ma_data_converter_get_required_input_frame_count(const ma_data_converter* pConverter, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount) -{ - if (pInputFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - *pInputFrameCount = 0; - - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - if (pConverter->hasResampler) { - return ma_resampler_get_required_input_frame_count(&pConverter->resampler, outputFrameCount, pInputFrameCount); - } else { - *pInputFrameCount = outputFrameCount; /* 1:1 */ - return MA_SUCCESS; - } -} - -MA_API ma_result ma_data_converter_get_expected_output_frame_count(const ma_data_converter* pConverter, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount) -{ - if (pOutputFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - *pOutputFrameCount = 0; - - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - if (pConverter->hasResampler) { - return ma_resampler_get_expected_output_frame_count(&pConverter->resampler, inputFrameCount, pOutputFrameCount); - } else { - *pOutputFrameCount = inputFrameCount; /* 1:1 */ - return MA_SUCCESS; - } -} - -MA_API ma_result ma_data_converter_get_input_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap) -{ - if (pConverter == NULL || pChannelMap == NULL) { - return MA_INVALID_ARGS; - } - - if (pConverter->hasChannelConverter) { - ma_channel_converter_get_output_channel_map(&pConverter->channelConverter, pChannelMap, channelMapCap); - } else { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pConverter->channelsOut); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_converter_get_output_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap) -{ - if (pConverter == NULL || pChannelMap == NULL) { - return MA_INVALID_ARGS; - } - - if (pConverter->hasChannelConverter) { - ma_channel_converter_get_input_channel_map(&pConverter->channelConverter, pChannelMap, channelMapCap); - } else { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pConverter->channelsIn); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_converter_reset(ma_data_converter* pConverter) -{ - if (pConverter == NULL) { - return MA_INVALID_ARGS; - } - - /* There's nothing to do if we're not resampling. */ - if (pConverter->hasResampler == MA_FALSE) { - return MA_SUCCESS; - } - - return ma_resampler_reset(&pConverter->resampler); -} - - - -/************************************************************************************************************************************************************** - -Channel Maps - -**************************************************************************************************************************************************************/ -static ma_channel ma_channel_map_init_standard_channel(ma_standard_channel_map standardChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex); - -MA_API ma_channel ma_channel_map_get_channel(const ma_channel* pChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex) -{ - if (pChannelMap == NULL) { - return ma_channel_map_init_standard_channel(ma_standard_channel_map_default, channelCount, channelIndex); - } else { - if (channelIndex >= channelCount) { - return MA_CHANNEL_NONE; - } - - return pChannelMap[channelIndex]; - } -} - -MA_API void ma_channel_map_init_blank(ma_channel* pChannelMap, ma_uint32 channels) -{ - if (pChannelMap == NULL) { - return; - } - - MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channels); -} - - -static ma_channel ma_channel_map_init_standard_channel_microsoft(ma_uint32 channelCount, ma_uint32 channelIndex) -{ - if (channelCount == 0 || channelIndex >= channelCount) { - return MA_CHANNEL_NONE; - } - - /* This is the Microsoft channel map. Based off the speaker configurations mentioned here: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ksmedia/ns-ksmedia-ksaudio_channel_config */ - switch (channelCount) - { - case 0: return MA_CHANNEL_NONE; - - case 1: - { - return MA_CHANNEL_MONO; - } break; - - case 2: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 3: /* No defined, but best guess. */ - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 4: - { - switch (channelIndex) { - #ifndef MA_USE_QUAD_MICROSOFT_CHANNEL_MAP - /* Surround. Using the Surround profile has the advantage of the 3rd channel (MA_CHANNEL_FRONT_CENTER) mapping nicely with higher channel counts. */ - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_BACK_CENTER; - #else - /* Quad. */ - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - #endif - } - } break; - - case 5: /* Not defined, but best guess. */ - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_BACK_LEFT; - case 4: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 6: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_LFE; - case 4: return MA_CHANNEL_SIDE_LEFT; - case 5: return MA_CHANNEL_SIDE_RIGHT; - } - } break; - - case 7: /* Not defined, but best guess. */ - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_LFE; - case 4: return MA_CHANNEL_BACK_CENTER; - case 5: return MA_CHANNEL_SIDE_LEFT; - case 6: return MA_CHANNEL_SIDE_RIGHT; - } - } break; - - case 8: - default: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_LFE; - case 4: return MA_CHANNEL_BACK_LEFT; - case 5: return MA_CHANNEL_BACK_RIGHT; - case 6: return MA_CHANNEL_SIDE_LEFT; - case 7: return MA_CHANNEL_SIDE_RIGHT; - } - } break; - } - - if (channelCount > 8) { - if (channelIndex < 32) { /* We have 32 AUX channels. */ - return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8)); - } - } - - /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */ - return MA_CHANNEL_NONE; -} - -static ma_channel ma_channel_map_init_standard_channel_alsa(ma_uint32 channelCount, ma_uint32 channelIndex) -{ - switch (channelCount) - { - case 0: return MA_CHANNEL_NONE; - - case 1: - { - return MA_CHANNEL_MONO; - } break; - - case 2: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 3: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 4: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 5: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - case 4: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 6: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - case 4: return MA_CHANNEL_FRONT_CENTER; - case 5: return MA_CHANNEL_LFE; - } - } break; - - case 7: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - case 4: return MA_CHANNEL_FRONT_CENTER; - case 5: return MA_CHANNEL_LFE; - case 6: return MA_CHANNEL_BACK_CENTER; - } - } break; - - case 8: - default: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - case 4: return MA_CHANNEL_FRONT_CENTER; - case 5: return MA_CHANNEL_LFE; - case 6: return MA_CHANNEL_SIDE_LEFT; - case 7: return MA_CHANNEL_SIDE_RIGHT; - } - } break; - } - - if (channelCount > 8) { - if (channelIndex < 32) { /* We have 32 AUX channels. */ - return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8)); - } - } - - /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */ - return MA_CHANNEL_NONE; -} - -static ma_channel ma_channel_map_init_standard_channel_rfc3551(ma_uint32 channelCount, ma_uint32 channelIndex) -{ - switch (channelCount) - { - case 0: return MA_CHANNEL_NONE; - - case 1: - { - return MA_CHANNEL_MONO; - } break; - - case 2: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 3: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 4: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_BACK_CENTER; - } - } break; - - case 5: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_BACK_LEFT; - case 4: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 6: - default: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_SIDE_LEFT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_FRONT_RIGHT; - case 4: return MA_CHANNEL_SIDE_RIGHT; - case 5: return MA_CHANNEL_BACK_CENTER; - } - } break; - } - - if (channelCount > 6) { - if (channelIndex < 32) { /* We have 32 AUX channels. */ - return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 6)); - } - } - - /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */ - return MA_CHANNEL_NONE; -} - -static ma_channel ma_channel_map_init_standard_channel_flac(ma_uint32 channelCount, ma_uint32 channelIndex) -{ - switch (channelCount) - { - case 0: return MA_CHANNEL_NONE; - - case 1: - { - return MA_CHANNEL_MONO; - } break; - - case 2: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 3: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 4: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 5: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_BACK_LEFT; - case 4: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 6: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_LFE; - case 4: return MA_CHANNEL_BACK_LEFT; - case 5: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 7: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_LFE; - case 4: return MA_CHANNEL_BACK_CENTER; - case 5: return MA_CHANNEL_SIDE_LEFT; - case 6: return MA_CHANNEL_SIDE_RIGHT; - } - } break; - - case 8: - default: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_LFE; - case 4: return MA_CHANNEL_BACK_LEFT; - case 5: return MA_CHANNEL_BACK_RIGHT; - case 6: return MA_CHANNEL_SIDE_LEFT; - case 7: return MA_CHANNEL_SIDE_RIGHT; - } - } break; - } - - if (channelCount > 8) { - if (channelIndex < 32) { /* We have 32 AUX channels. */ - return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8)); - } - } - - /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */ - return MA_CHANNEL_NONE; -} - -static ma_channel ma_channel_map_init_standard_channel_vorbis(ma_uint32 channelCount, ma_uint32 channelIndex) -{ - switch (channelCount) - { - case 0: return MA_CHANNEL_NONE; - - case 1: - { - return MA_CHANNEL_MONO; - } break; - - case 2: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 3: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 4: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 5: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_BACK_LEFT; - case 4: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 6: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_BACK_LEFT; - case 4: return MA_CHANNEL_BACK_RIGHT; - case 5: return MA_CHANNEL_LFE; - } - } break; - - case 7: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_SIDE_LEFT; - case 4: return MA_CHANNEL_SIDE_RIGHT; - case 5: return MA_CHANNEL_BACK_CENTER; - case 6: return MA_CHANNEL_LFE; - } - } break; - - case 8: - default: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_SIDE_LEFT; - case 4: return MA_CHANNEL_SIDE_RIGHT; - case 5: return MA_CHANNEL_BACK_LEFT; - case 6: return MA_CHANNEL_BACK_RIGHT; - case 7: return MA_CHANNEL_LFE; - } - } break; - } - - if (channelCount > 8) { - if (channelIndex < 32) { /* We have 32 AUX channels. */ - return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8)); - } - } - - /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */ - return MA_CHANNEL_NONE; -} - -static ma_channel ma_channel_map_init_standard_channel_sound4(ma_uint32 channelCount, ma_uint32 channelIndex) -{ - switch (channelCount) - { - case 0: return MA_CHANNEL_NONE; - - case 1: - { - return MA_CHANNEL_MONO; - } break; - - case 2: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 3: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 4: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 5: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - case 3: return MA_CHANNEL_BACK_LEFT; - case 4: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 6: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_BACK_LEFT; - case 4: return MA_CHANNEL_BACK_RIGHT; - case 5: return MA_CHANNEL_LFE; - } - } break; - - case 7: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_SIDE_LEFT; - case 4: return MA_CHANNEL_SIDE_RIGHT; - case 5: return MA_CHANNEL_BACK_CENTER; - case 6: return MA_CHANNEL_LFE; - } - } break; - - case 8: - default: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_CENTER; - case 2: return MA_CHANNEL_FRONT_RIGHT; - case 3: return MA_CHANNEL_SIDE_LEFT; - case 4: return MA_CHANNEL_SIDE_RIGHT; - case 5: return MA_CHANNEL_BACK_LEFT; - case 6: return MA_CHANNEL_BACK_RIGHT; - case 7: return MA_CHANNEL_LFE; - } - } break; - } - - if (channelCount > 8) { - if (channelIndex < 32) { /* We have 32 AUX channels. */ - return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8)); - } - } - - /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */ - return MA_CHANNEL_NONE; -} - -static ma_channel ma_channel_map_init_standard_channel_sndio(ma_uint32 channelCount, ma_uint32 channelIndex) -{ - switch (channelCount) - { - case 0: return MA_CHANNEL_NONE; - - case 1: - { - return MA_CHANNEL_MONO; - } break; - - case 2: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - } - } break; - - case 3: /* No defined, but best guess. */ - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 4: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - } - } break; - - case 5: /* Not defined, but best guess. */ - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - case 4: return MA_CHANNEL_FRONT_CENTER; - } - } break; - - case 6: - default: - { - switch (channelIndex) { - case 0: return MA_CHANNEL_FRONT_LEFT; - case 1: return MA_CHANNEL_FRONT_RIGHT; - case 2: return MA_CHANNEL_BACK_LEFT; - case 3: return MA_CHANNEL_BACK_RIGHT; - case 4: return MA_CHANNEL_FRONT_CENTER; - case 5: return MA_CHANNEL_LFE; - } - } break; - } - - if (channelCount > 6) { - if (channelIndex < 32) { /* We have 32 AUX channels. */ - return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 6)); - } - } - - /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */ - return MA_CHANNEL_NONE; -} - - -static ma_channel ma_channel_map_init_standard_channel(ma_standard_channel_map standardChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex) -{ - if (channelCount == 0 || channelIndex >= channelCount) { - return MA_CHANNEL_NONE; - } - - switch (standardChannelMap) - { - case ma_standard_channel_map_alsa: - { - return ma_channel_map_init_standard_channel_alsa(channelCount, channelIndex); - } break; - - case ma_standard_channel_map_rfc3551: - { - return ma_channel_map_init_standard_channel_rfc3551(channelCount, channelIndex); - } break; - - case ma_standard_channel_map_flac: - { - return ma_channel_map_init_standard_channel_flac(channelCount, channelIndex); - } break; - - case ma_standard_channel_map_vorbis: - { - return ma_channel_map_init_standard_channel_vorbis(channelCount, channelIndex); - } break; - - case ma_standard_channel_map_sound4: - { - return ma_channel_map_init_standard_channel_sound4(channelCount, channelIndex); - } break; - - case ma_standard_channel_map_sndio: - { - return ma_channel_map_init_standard_channel_sndio(channelCount, channelIndex); - } break; - - case ma_standard_channel_map_microsoft: /* Also default. */ - /*case ma_standard_channel_map_default;*/ - default: - { - return ma_channel_map_init_standard_channel_microsoft(channelCount, channelIndex); - } break; - } -} - -MA_API void ma_channel_map_init_standard(ma_standard_channel_map standardChannelMap, ma_channel* pChannelMap, size_t channelMapCap, ma_uint32 channels) -{ - ma_uint32 iChannel; - - if (pChannelMap == NULL || channelMapCap == 0 || channels == 0) { - return; - } - - for (iChannel = 0; iChannel < channels; iChannel += 1) { - if (channelMapCap == 0) { - break; /* Ran out of room. */ - } - - pChannelMap[0] = ma_channel_map_init_standard_channel(standardChannelMap, channels, iChannel); - pChannelMap += 1; - channelMapCap -= 1; - } -} - -MA_API void ma_channel_map_copy(ma_channel* pOut, const ma_channel* pIn, ma_uint32 channels) -{ - if (pOut != NULL && pIn != NULL && channels > 0) { - MA_COPY_MEMORY(pOut, pIn, sizeof(*pOut) * channels); - } -} - -MA_API void ma_channel_map_copy_or_default(ma_channel* pOut, size_t channelMapCapOut, const ma_channel* pIn, ma_uint32 channels) -{ - if (pOut == NULL || channels == 0) { - return; - } - - if (pIn != NULL) { - ma_channel_map_copy(pOut, pIn, channels); - } else { - ma_channel_map_init_standard(ma_standard_channel_map_default, pOut, channelMapCapOut, channels); - } -} - -MA_API ma_bool32 ma_channel_map_is_valid(const ma_channel* pChannelMap, ma_uint32 channels) -{ - /* A channel count of 0 is invalid. */ - if (channels == 0) { - return MA_FALSE; - } - - /* It does not make sense to have a mono channel when there is more than 1 channel. */ - if (channels > 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < channels; ++iChannel) { - if (ma_channel_map_get_channel(pChannelMap, channels, iChannel) == MA_CHANNEL_MONO) { - return MA_FALSE; - } - } - } - - return MA_TRUE; -} - -MA_API ma_bool32 ma_channel_map_is_equal(const ma_channel* pChannelMapA, const ma_channel* pChannelMapB, ma_uint32 channels) -{ - ma_uint32 iChannel; - - if (pChannelMapA == pChannelMapB) { - return MA_TRUE; - } - - for (iChannel = 0; iChannel < channels; ++iChannel) { - if (ma_channel_map_get_channel(pChannelMapA, channels, iChannel) != ma_channel_map_get_channel(pChannelMapB, channels, iChannel)) { - return MA_FALSE; - } - } - - return MA_TRUE; -} - -MA_API ma_bool32 ma_channel_map_is_blank(const ma_channel* pChannelMap, ma_uint32 channels) -{ - ma_uint32 iChannel; - - /* A null channel map is equivalent to the default channel map. */ - if (pChannelMap == NULL) { - return MA_FALSE; - } - - for (iChannel = 0; iChannel < channels; ++iChannel) { - if (pChannelMap[iChannel] != MA_CHANNEL_NONE) { - return MA_FALSE; - } - } - - return MA_TRUE; -} - -MA_API ma_bool32 ma_channel_map_contains_channel_position(ma_uint32 channels, const ma_channel* pChannelMap, ma_channel channelPosition) -{ - ma_uint32 iChannel; - - for (iChannel = 0; iChannel < channels; ++iChannel) { - if (ma_channel_map_get_channel(pChannelMap, channels, iChannel) == channelPosition) { - return MA_TRUE; - } - } - - return MA_FALSE; -} - - - -/************************************************************************************************************************************************************** - -Conversion Helpers - -**************************************************************************************************************************************************************/ -MA_API ma_uint64 ma_convert_frames(void* pOut, ma_uint64 frameCountOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, const void* pIn, ma_uint64 frameCountIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn) -{ - ma_data_converter_config config; - - config = ma_data_converter_config_init(formatIn, formatOut, channelsIn, channelsOut, sampleRateIn, sampleRateOut); - config.resampling.linear.lpfOrder = ma_min(MA_DEFAULT_RESAMPLER_LPF_ORDER, MA_MAX_FILTER_ORDER); - - return ma_convert_frames_ex(pOut, frameCountOut, pIn, frameCountIn, &config); -} - -MA_API ma_uint64 ma_convert_frames_ex(void* pOut, ma_uint64 frameCountOut, const void* pIn, ma_uint64 frameCountIn, const ma_data_converter_config* pConfig) -{ - ma_result result; - ma_data_converter converter; - - if (frameCountIn == 0 || pConfig == NULL) { - return 0; - } - - result = ma_data_converter_init(pConfig, NULL, &converter); - if (result != MA_SUCCESS) { - return 0; /* Failed to initialize the data converter. */ - } - - if (pOut == NULL) { - result = ma_data_converter_get_expected_output_frame_count(&converter, frameCountIn, &frameCountOut); - if (result != MA_SUCCESS) { - if (result == MA_NOT_IMPLEMENTED) { - /* No way to calculate the number of frames, so we'll need to brute force it and loop. */ - frameCountOut = 0; - - while (frameCountIn > 0) { - ma_uint64 framesProcessedIn = frameCountIn; - ma_uint64 framesProcessedOut = 0xFFFFFFFF; - - result = ma_data_converter_process_pcm_frames(&converter, pIn, &framesProcessedIn, NULL, &framesProcessedOut); - if (result != MA_SUCCESS) { - break; - } - - frameCountIn -= framesProcessedIn; - } - } - } - } else { - result = ma_data_converter_process_pcm_frames(&converter, pIn, &frameCountIn, pOut, &frameCountOut); - if (result != MA_SUCCESS) { - frameCountOut = 0; - } - } - - ma_data_converter_uninit(&converter, NULL); - return frameCountOut; -} - - -/************************************************************************************************************************************************************** - -Ring Buffer - -**************************************************************************************************************************************************************/ -static MA_INLINE ma_uint32 ma_rb__extract_offset_in_bytes(ma_uint32 encodedOffset) -{ - return encodedOffset & 0x7FFFFFFF; -} - -static MA_INLINE ma_uint32 ma_rb__extract_offset_loop_flag(ma_uint32 encodedOffset) -{ - return encodedOffset & 0x80000000; -} - -static MA_INLINE void* ma_rb__get_read_ptr(ma_rb* pRB) -{ - MA_ASSERT(pRB != NULL); - return ma_offset_ptr(pRB->pBuffer, ma_rb__extract_offset_in_bytes(c89atomic_load_32(&pRB->encodedReadOffset))); -} - -static MA_INLINE void* ma_rb__get_write_ptr(ma_rb* pRB) -{ - MA_ASSERT(pRB != NULL); - return ma_offset_ptr(pRB->pBuffer, ma_rb__extract_offset_in_bytes(c89atomic_load_32(&pRB->encodedWriteOffset))); -} - -static MA_INLINE ma_uint32 ma_rb__construct_offset(ma_uint32 offsetInBytes, ma_uint32 offsetLoopFlag) -{ - return offsetLoopFlag | offsetInBytes; -} - -static MA_INLINE void ma_rb__deconstruct_offset(ma_uint32 encodedOffset, ma_uint32* pOffsetInBytes, ma_uint32* pOffsetLoopFlag) -{ - MA_ASSERT(pOffsetInBytes != NULL); - MA_ASSERT(pOffsetLoopFlag != NULL); - - *pOffsetInBytes = ma_rb__extract_offset_in_bytes(encodedOffset); - *pOffsetLoopFlag = ma_rb__extract_offset_loop_flag(encodedOffset); -} - - -MA_API ma_result ma_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB) -{ - ma_result result; - const ma_uint32 maxSubBufferSize = 0x7FFFFFFF - (MA_SIMD_ALIGNMENT-1); - - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - if (subbufferSizeInBytes == 0 || subbufferCount == 0) { - return MA_INVALID_ARGS; - } - - if (subbufferSizeInBytes > maxSubBufferSize) { - return MA_INVALID_ARGS; /* Maximum buffer size is ~2GB. The most significant bit is a flag for use internally. */ - } - - - MA_ZERO_OBJECT(pRB); - - result = ma_allocation_callbacks_init_copy(&pRB->allocationCallbacks, pAllocationCallbacks); - if (result != MA_SUCCESS) { - return result; - } - - pRB->subbufferSizeInBytes = (ma_uint32)subbufferSizeInBytes; - pRB->subbufferCount = (ma_uint32)subbufferCount; - - if (pOptionalPreallocatedBuffer != NULL) { - pRB->subbufferStrideInBytes = (ma_uint32)subbufferStrideInBytes; - pRB->pBuffer = pOptionalPreallocatedBuffer; - } else { - size_t bufferSizeInBytes; - - /* - Here is where we allocate our own buffer. We always want to align this to MA_SIMD_ALIGNMENT for future SIMD optimization opportunity. To do this - we need to make sure the stride is a multiple of MA_SIMD_ALIGNMENT. - */ - pRB->subbufferStrideInBytes = (pRB->subbufferSizeInBytes + (MA_SIMD_ALIGNMENT-1)) & ~MA_SIMD_ALIGNMENT; - - bufferSizeInBytes = (size_t)pRB->subbufferCount*pRB->subbufferStrideInBytes; - pRB->pBuffer = ma_aligned_malloc(bufferSizeInBytes, MA_SIMD_ALIGNMENT, &pRB->allocationCallbacks); - if (pRB->pBuffer == NULL) { - return MA_OUT_OF_MEMORY; - } - - MA_ZERO_MEMORY(pRB->pBuffer, bufferSizeInBytes); - pRB->ownsBuffer = MA_TRUE; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_rb_init(size_t bufferSizeInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB) -{ - return ma_rb_init_ex(bufferSizeInBytes, 1, 0, pOptionalPreallocatedBuffer, pAllocationCallbacks, pRB); -} - -MA_API void ma_rb_uninit(ma_rb* pRB) -{ - if (pRB == NULL) { - return; - } - - if (pRB->ownsBuffer) { - ma_aligned_free(pRB->pBuffer, &pRB->allocationCallbacks); - } -} - -MA_API void ma_rb_reset(ma_rb* pRB) -{ - if (pRB == NULL) { - return; - } - - c89atomic_exchange_32(&pRB->encodedReadOffset, 0); - c89atomic_exchange_32(&pRB->encodedWriteOffset, 0); -} - -MA_API ma_result ma_rb_acquire_read(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut) -{ - ma_uint32 writeOffset; - ma_uint32 writeOffsetInBytes; - ma_uint32 writeOffsetLoopFlag; - ma_uint32 readOffset; - ma_uint32 readOffsetInBytes; - ma_uint32 readOffsetLoopFlag; - size_t bytesAvailable; - size_t bytesRequested; - - if (pRB == NULL || pSizeInBytes == NULL || ppBufferOut == NULL) { - return MA_INVALID_ARGS; - } - - /* The returned buffer should never move ahead of the write pointer. */ - writeOffset = c89atomic_load_32(&pRB->encodedWriteOffset); - ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); - - readOffset = c89atomic_load_32(&pRB->encodedReadOffset); - ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); - - /* - The number of bytes available depends on whether or not the read and write pointers are on the same loop iteration. If so, we - can only read up to the write pointer. If not, we can only read up to the end of the buffer. - */ - if (readOffsetLoopFlag == writeOffsetLoopFlag) { - bytesAvailable = writeOffsetInBytes - readOffsetInBytes; - } else { - bytesAvailable = pRB->subbufferSizeInBytes - readOffsetInBytes; - } - - bytesRequested = *pSizeInBytes; - if (bytesRequested > bytesAvailable) { - bytesRequested = bytesAvailable; - } - - *pSizeInBytes = bytesRequested; - (*ppBufferOut) = ma_rb__get_read_ptr(pRB); - - return MA_SUCCESS; -} - -MA_API ma_result ma_rb_commit_read(ma_rb* pRB, size_t sizeInBytes) -{ - ma_uint32 readOffset; - ma_uint32 readOffsetInBytes; - ma_uint32 readOffsetLoopFlag; - ma_uint32 newReadOffsetInBytes; - ma_uint32 newReadOffsetLoopFlag; - - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - readOffset = c89atomic_load_32(&pRB->encodedReadOffset); - ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); - - /* Check that sizeInBytes is correct. It should never go beyond the end of the buffer. */ - newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + sizeInBytes); - if (newReadOffsetInBytes > pRB->subbufferSizeInBytes) { - return MA_INVALID_ARGS; /* <-- sizeInBytes will cause the read offset to overflow. */ - } - - /* Move the read pointer back to the start if necessary. */ - newReadOffsetLoopFlag = readOffsetLoopFlag; - if (newReadOffsetInBytes == pRB->subbufferSizeInBytes) { - newReadOffsetInBytes = 0; - newReadOffsetLoopFlag ^= 0x80000000; - } - - c89atomic_exchange_32(&pRB->encodedReadOffset, ma_rb__construct_offset(newReadOffsetLoopFlag, newReadOffsetInBytes)); - - if (ma_rb_pointer_distance(pRB) == 0) { - return MA_AT_END; - } else { - return MA_SUCCESS; - } -} - -MA_API ma_result ma_rb_acquire_write(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut) -{ - ma_uint32 readOffset; - ma_uint32 readOffsetInBytes; - ma_uint32 readOffsetLoopFlag; - ma_uint32 writeOffset; - ma_uint32 writeOffsetInBytes; - ma_uint32 writeOffsetLoopFlag; - size_t bytesAvailable; - size_t bytesRequested; - - if (pRB == NULL || pSizeInBytes == NULL || ppBufferOut == NULL) { - return MA_INVALID_ARGS; - } - - /* The returned buffer should never overtake the read buffer. */ - readOffset = c89atomic_load_32(&pRB->encodedReadOffset); - ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); - - writeOffset = c89atomic_load_32(&pRB->encodedWriteOffset); - ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); - - /* - In the case of writing, if the write pointer and the read pointer are on the same loop iteration we can only - write up to the end of the buffer. Otherwise we can only write up to the read pointer. The write pointer should - never overtake the read pointer. - */ - if (writeOffsetLoopFlag == readOffsetLoopFlag) { - bytesAvailable = pRB->subbufferSizeInBytes - writeOffsetInBytes; - } else { - bytesAvailable = readOffsetInBytes - writeOffsetInBytes; - } - - bytesRequested = *pSizeInBytes; - if (bytesRequested > bytesAvailable) { - bytesRequested = bytesAvailable; - } - - *pSizeInBytes = bytesRequested; - *ppBufferOut = ma_rb__get_write_ptr(pRB); - - /* Clear the buffer if desired. */ - if (pRB->clearOnWriteAcquire) { - MA_ZERO_MEMORY(*ppBufferOut, *pSizeInBytes); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_rb_commit_write(ma_rb* pRB, size_t sizeInBytes) -{ - ma_uint32 writeOffset; - ma_uint32 writeOffsetInBytes; - ma_uint32 writeOffsetLoopFlag; - ma_uint32 newWriteOffsetInBytes; - ma_uint32 newWriteOffsetLoopFlag; - - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - writeOffset = c89atomic_load_32(&pRB->encodedWriteOffset); - ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); - - /* Check that sizeInBytes is correct. It should never go beyond the end of the buffer. */ - newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + sizeInBytes); - if (newWriteOffsetInBytes > pRB->subbufferSizeInBytes) { - return MA_INVALID_ARGS; /* <-- sizeInBytes will cause the read offset to overflow. */ - } - - /* Move the read pointer back to the start if necessary. */ - newWriteOffsetLoopFlag = writeOffsetLoopFlag; - if (newWriteOffsetInBytes == pRB->subbufferSizeInBytes) { - newWriteOffsetInBytes = 0; - newWriteOffsetLoopFlag ^= 0x80000000; - } - - c89atomic_exchange_32(&pRB->encodedWriteOffset, ma_rb__construct_offset(newWriteOffsetLoopFlag, newWriteOffsetInBytes)); - - if (ma_rb_pointer_distance(pRB) == 0) { - return MA_AT_END; - } else { - return MA_SUCCESS; - } -} - -MA_API ma_result ma_rb_seek_read(ma_rb* pRB, size_t offsetInBytes) -{ - ma_uint32 readOffset; - ma_uint32 readOffsetInBytes; - ma_uint32 readOffsetLoopFlag; - ma_uint32 writeOffset; - ma_uint32 writeOffsetInBytes; - ma_uint32 writeOffsetLoopFlag; - ma_uint32 newReadOffsetInBytes; - ma_uint32 newReadOffsetLoopFlag; - - if (pRB == NULL || offsetInBytes > pRB->subbufferSizeInBytes) { - return MA_INVALID_ARGS; - } - - readOffset = c89atomic_load_32(&pRB->encodedReadOffset); - ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); - - writeOffset = c89atomic_load_32(&pRB->encodedWriteOffset); - ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); - - newReadOffsetLoopFlag = readOffsetLoopFlag; - - /* We cannot go past the write buffer. */ - if (readOffsetLoopFlag == writeOffsetLoopFlag) { - if ((readOffsetInBytes + offsetInBytes) > writeOffsetInBytes) { - newReadOffsetInBytes = writeOffsetInBytes; - } else { - newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes); - } - } else { - /* May end up looping. */ - if ((readOffsetInBytes + offsetInBytes) >= pRB->subbufferSizeInBytes) { - newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes) - pRB->subbufferSizeInBytes; - newReadOffsetLoopFlag ^= 0x80000000; /* <-- Looped. */ - } else { - newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes); - } - } - - c89atomic_exchange_32(&pRB->encodedReadOffset, ma_rb__construct_offset(newReadOffsetInBytes, newReadOffsetLoopFlag)); - return MA_SUCCESS; -} - -MA_API ma_result ma_rb_seek_write(ma_rb* pRB, size_t offsetInBytes) -{ - ma_uint32 readOffset; - ma_uint32 readOffsetInBytes; - ma_uint32 readOffsetLoopFlag; - ma_uint32 writeOffset; - ma_uint32 writeOffsetInBytes; - ma_uint32 writeOffsetLoopFlag; - ma_uint32 newWriteOffsetInBytes; - ma_uint32 newWriteOffsetLoopFlag; - - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - readOffset = c89atomic_load_32(&pRB->encodedReadOffset); - ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); - - writeOffset = c89atomic_load_32(&pRB->encodedWriteOffset); - ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); - - newWriteOffsetLoopFlag = writeOffsetLoopFlag; - - /* We cannot go past the write buffer. */ - if (readOffsetLoopFlag == writeOffsetLoopFlag) { - /* May end up looping. */ - if ((writeOffsetInBytes + offsetInBytes) >= pRB->subbufferSizeInBytes) { - newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes) - pRB->subbufferSizeInBytes; - newWriteOffsetLoopFlag ^= 0x80000000; /* <-- Looped. */ - } else { - newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes); - } - } else { - if ((writeOffsetInBytes + offsetInBytes) > readOffsetInBytes) { - newWriteOffsetInBytes = readOffsetInBytes; - } else { - newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes); - } - } - - c89atomic_exchange_32(&pRB->encodedWriteOffset, ma_rb__construct_offset(newWriteOffsetInBytes, newWriteOffsetLoopFlag)); - return MA_SUCCESS; -} - -MA_API ma_int32 ma_rb_pointer_distance(ma_rb* pRB) -{ - ma_uint32 readOffset; - ma_uint32 readOffsetInBytes; - ma_uint32 readOffsetLoopFlag; - ma_uint32 writeOffset; - ma_uint32 writeOffsetInBytes; - ma_uint32 writeOffsetLoopFlag; - - if (pRB == NULL) { - return 0; - } - - readOffset = c89atomic_load_32(&pRB->encodedReadOffset); - ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag); - - writeOffset = c89atomic_load_32(&pRB->encodedWriteOffset); - ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag); - - if (readOffsetLoopFlag == writeOffsetLoopFlag) { - return writeOffsetInBytes - readOffsetInBytes; - } else { - return writeOffsetInBytes + (pRB->subbufferSizeInBytes - readOffsetInBytes); - } -} - -MA_API ma_uint32 ma_rb_available_read(ma_rb* pRB) -{ - ma_int32 dist; - - if (pRB == NULL) { - return 0; - } - - dist = ma_rb_pointer_distance(pRB); - if (dist < 0) { - return 0; - } - - return dist; -} - -MA_API ma_uint32 ma_rb_available_write(ma_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - return (ma_uint32)(ma_rb_get_subbuffer_size(pRB) - ma_rb_pointer_distance(pRB)); -} - -MA_API size_t ma_rb_get_subbuffer_size(ma_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - return pRB->subbufferSizeInBytes; -} - -MA_API size_t ma_rb_get_subbuffer_stride(ma_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - if (pRB->subbufferStrideInBytes == 0) { - return (size_t)pRB->subbufferSizeInBytes; - } - - return (size_t)pRB->subbufferStrideInBytes; -} - -MA_API size_t ma_rb_get_subbuffer_offset(ma_rb* pRB, size_t subbufferIndex) -{ - if (pRB == NULL) { - return 0; - } - - return subbufferIndex * ma_rb_get_subbuffer_stride(pRB); -} - -MA_API void* ma_rb_get_subbuffer_ptr(ma_rb* pRB, size_t subbufferIndex, void* pBuffer) -{ - if (pRB == NULL) { - return NULL; - } - - return ma_offset_ptr(pBuffer, ma_rb_get_subbuffer_offset(pRB, subbufferIndex)); -} - - - -static MA_INLINE ma_uint32 ma_pcm_rb_get_bpf(ma_pcm_rb* pRB) -{ - MA_ASSERT(pRB != NULL); - - return ma_get_bytes_per_frame(pRB->format, pRB->channels); -} - -MA_API ma_result ma_pcm_rb_init_ex(ma_format format, ma_uint32 channels, ma_uint32 subbufferSizeInFrames, ma_uint32 subbufferCount, ma_uint32 subbufferStrideInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB) -{ - ma_uint32 bpf; - ma_result result; - - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pRB); - - bpf = ma_get_bytes_per_frame(format, channels); - if (bpf == 0) { - return MA_INVALID_ARGS; - } - - result = ma_rb_init_ex(subbufferSizeInFrames*bpf, subbufferCount, subbufferStrideInFrames*bpf, pOptionalPreallocatedBuffer, pAllocationCallbacks, &pRB->rb); - if (result != MA_SUCCESS) { - return result; - } - - pRB->format = format; - pRB->channels = channels; - - return MA_SUCCESS; -} - -MA_API ma_result ma_pcm_rb_init(ma_format format, ma_uint32 channels, ma_uint32 bufferSizeInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB) -{ - return ma_pcm_rb_init_ex(format, channels, bufferSizeInFrames, 1, 0, pOptionalPreallocatedBuffer, pAllocationCallbacks, pRB); -} - -MA_API void ma_pcm_rb_uninit(ma_pcm_rb* pRB) -{ - if (pRB == NULL) { - return; - } - - ma_rb_uninit(&pRB->rb); -} - -MA_API void ma_pcm_rb_reset(ma_pcm_rb* pRB) -{ - if (pRB == NULL) { - return; - } - - ma_rb_reset(&pRB->rb); -} - -MA_API ma_result ma_pcm_rb_acquire_read(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut) -{ - size_t sizeInBytes; - ma_result result; - - if (pRB == NULL || pSizeInFrames == NULL) { - return MA_INVALID_ARGS; - } - - sizeInBytes = *pSizeInFrames * ma_pcm_rb_get_bpf(pRB); - - result = ma_rb_acquire_read(&pRB->rb, &sizeInBytes, ppBufferOut); - if (result != MA_SUCCESS) { - return result; - } - - *pSizeInFrames = (ma_uint32)(sizeInBytes / (size_t)ma_pcm_rb_get_bpf(pRB)); - return MA_SUCCESS; -} - -MA_API ma_result ma_pcm_rb_commit_read(ma_pcm_rb* pRB, ma_uint32 sizeInFrames) -{ - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - return ma_rb_commit_read(&pRB->rb, sizeInFrames * ma_pcm_rb_get_bpf(pRB)); -} - -MA_API ma_result ma_pcm_rb_acquire_write(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut) -{ - size_t sizeInBytes; - ma_result result; - - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - sizeInBytes = *pSizeInFrames * ma_pcm_rb_get_bpf(pRB); - - result = ma_rb_acquire_write(&pRB->rb, &sizeInBytes, ppBufferOut); - if (result != MA_SUCCESS) { - return result; - } - - *pSizeInFrames = (ma_uint32)(sizeInBytes / ma_pcm_rb_get_bpf(pRB)); - return MA_SUCCESS; -} - -MA_API ma_result ma_pcm_rb_commit_write(ma_pcm_rb* pRB, ma_uint32 sizeInFrames) -{ - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - return ma_rb_commit_write(&pRB->rb, sizeInFrames * ma_pcm_rb_get_bpf(pRB)); -} - -MA_API ma_result ma_pcm_rb_seek_read(ma_pcm_rb* pRB, ma_uint32 offsetInFrames) -{ - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - return ma_rb_seek_read(&pRB->rb, offsetInFrames * ma_pcm_rb_get_bpf(pRB)); -} - -MA_API ma_result ma_pcm_rb_seek_write(ma_pcm_rb* pRB, ma_uint32 offsetInFrames) -{ - if (pRB == NULL) { - return MA_INVALID_ARGS; - } - - return ma_rb_seek_write(&pRB->rb, offsetInFrames * ma_pcm_rb_get_bpf(pRB)); -} - -MA_API ma_int32 ma_pcm_rb_pointer_distance(ma_pcm_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - return ma_rb_pointer_distance(&pRB->rb) / ma_pcm_rb_get_bpf(pRB); -} - -MA_API ma_uint32 ma_pcm_rb_available_read(ma_pcm_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - return ma_rb_available_read(&pRB->rb) / ma_pcm_rb_get_bpf(pRB); -} - -MA_API ma_uint32 ma_pcm_rb_available_write(ma_pcm_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - return ma_rb_available_write(&pRB->rb) / ma_pcm_rb_get_bpf(pRB); -} - -MA_API ma_uint32 ma_pcm_rb_get_subbuffer_size(ma_pcm_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - return (ma_uint32)(ma_rb_get_subbuffer_size(&pRB->rb) / ma_pcm_rb_get_bpf(pRB)); -} - -MA_API ma_uint32 ma_pcm_rb_get_subbuffer_stride(ma_pcm_rb* pRB) -{ - if (pRB == NULL) { - return 0; - } - - return (ma_uint32)(ma_rb_get_subbuffer_stride(&pRB->rb) / ma_pcm_rb_get_bpf(pRB)); -} - -MA_API ma_uint32 ma_pcm_rb_get_subbuffer_offset(ma_pcm_rb* pRB, ma_uint32 subbufferIndex) -{ - if (pRB == NULL) { - return 0; - } - - return (ma_uint32)(ma_rb_get_subbuffer_offset(&pRB->rb, subbufferIndex) / ma_pcm_rb_get_bpf(pRB)); -} - -MA_API void* ma_pcm_rb_get_subbuffer_ptr(ma_pcm_rb* pRB, ma_uint32 subbufferIndex, void* pBuffer) -{ - if (pRB == NULL) { - return NULL; - } - - return ma_rb_get_subbuffer_ptr(&pRB->rb, subbufferIndex, pBuffer); -} - - - -MA_API ma_result ma_duplex_rb_init(ma_format captureFormat, ma_uint32 captureChannels, ma_uint32 sampleRate, ma_uint32 captureInternalSampleRate, ma_uint32 captureInternalPeriodSizeInFrames, const ma_allocation_callbacks* pAllocationCallbacks, ma_duplex_rb* pRB) -{ - ma_result result; - ma_uint32 sizeInFrames; - - sizeInFrames = (ma_uint32)ma_calculate_frame_count_after_resampling(sampleRate, captureInternalSampleRate, captureInternalPeriodSizeInFrames * 5); - if (sizeInFrames == 0) { - return MA_INVALID_ARGS; - } - - result = ma_pcm_rb_init(captureFormat, captureChannels, sizeInFrames, NULL, pAllocationCallbacks, &pRB->rb); - if (result != MA_SUCCESS) { - return result; - } - - /* Seek forward a bit so we have a bit of a buffer in case of desyncs. */ - ma_pcm_rb_seek_write((ma_pcm_rb*)pRB, captureInternalPeriodSizeInFrames * 2); - - return MA_SUCCESS; -} - -MA_API ma_result ma_duplex_rb_uninit(ma_duplex_rb* pRB) -{ - ma_pcm_rb_uninit((ma_pcm_rb*)pRB); - return MA_SUCCESS; -} - - - -/************************************************************************************************************************************************************** - -Miscellaneous Helpers - -**************************************************************************************************************************************************************/ -MA_API const char* ma_result_description(ma_result result) -{ - switch (result) - { - case MA_SUCCESS: return "No error"; - case MA_ERROR: return "Unknown error"; - case MA_INVALID_ARGS: return "Invalid argument"; - case MA_INVALID_OPERATION: return "Invalid operation"; - case MA_OUT_OF_MEMORY: return "Out of memory"; - case MA_OUT_OF_RANGE: return "Out of range"; - case MA_ACCESS_DENIED: return "Permission denied"; - case MA_DOES_NOT_EXIST: return "Resource does not exist"; - case MA_ALREADY_EXISTS: return "Resource already exists"; - case MA_TOO_MANY_OPEN_FILES: return "Too many open files"; - case MA_INVALID_FILE: return "Invalid file"; - case MA_TOO_BIG: return "Too large"; - case MA_PATH_TOO_LONG: return "Path too long"; - case MA_NAME_TOO_LONG: return "Name too long"; - case MA_NOT_DIRECTORY: return "Not a directory"; - case MA_IS_DIRECTORY: return "Is a directory"; - case MA_DIRECTORY_NOT_EMPTY: return "Directory not empty"; - case MA_AT_END: return "At end"; - case MA_NO_SPACE: return "No space available"; - case MA_BUSY: return "Device or resource busy"; - case MA_IO_ERROR: return "Input/output error"; - case MA_INTERRUPT: return "Interrupted"; - case MA_UNAVAILABLE: return "Resource unavailable"; - case MA_ALREADY_IN_USE: return "Resource already in use"; - case MA_BAD_ADDRESS: return "Bad address"; - case MA_BAD_SEEK: return "Illegal seek"; - case MA_BAD_PIPE: return "Broken pipe"; - case MA_DEADLOCK: return "Deadlock"; - case MA_TOO_MANY_LINKS: return "Too many links"; - case MA_NOT_IMPLEMENTED: return "Not implemented"; - case MA_NO_MESSAGE: return "No message of desired type"; - case MA_BAD_MESSAGE: return "Invalid message"; - case MA_NO_DATA_AVAILABLE: return "No data available"; - case MA_INVALID_DATA: return "Invalid data"; - case MA_TIMEOUT: return "Timeout"; - case MA_NO_NETWORK: return "Network unavailable"; - case MA_NOT_UNIQUE: return "Not unique"; - case MA_NOT_SOCKET: return "Socket operation on non-socket"; - case MA_NO_ADDRESS: return "Destination address required"; - case MA_BAD_PROTOCOL: return "Protocol wrong type for socket"; - case MA_PROTOCOL_UNAVAILABLE: return "Protocol not available"; - case MA_PROTOCOL_NOT_SUPPORTED: return "Protocol not supported"; - case MA_PROTOCOL_FAMILY_NOT_SUPPORTED: return "Protocol family not supported"; - case MA_ADDRESS_FAMILY_NOT_SUPPORTED: return "Address family not supported"; - case MA_SOCKET_NOT_SUPPORTED: return "Socket type not supported"; - case MA_CONNECTION_RESET: return "Connection reset"; - case MA_ALREADY_CONNECTED: return "Already connected"; - case MA_NOT_CONNECTED: return "Not connected"; - case MA_CONNECTION_REFUSED: return "Connection refused"; - case MA_NO_HOST: return "No host"; - case MA_IN_PROGRESS: return "Operation in progress"; - case MA_CANCELLED: return "Operation cancelled"; - case MA_MEMORY_ALREADY_MAPPED: return "Memory already mapped"; - - case MA_FORMAT_NOT_SUPPORTED: return "Format not supported"; - case MA_DEVICE_TYPE_NOT_SUPPORTED: return "Device type not supported"; - case MA_SHARE_MODE_NOT_SUPPORTED: return "Share mode not supported"; - case MA_NO_BACKEND: return "No backend"; - case MA_NO_DEVICE: return "No device"; - case MA_API_NOT_FOUND: return "API not found"; - case MA_INVALID_DEVICE_CONFIG: return "Invalid device config"; - - case MA_DEVICE_NOT_INITIALIZED: return "Device not initialized"; - case MA_DEVICE_NOT_STARTED: return "Device not started"; - - case MA_FAILED_TO_INIT_BACKEND: return "Failed to initialize backend"; - case MA_FAILED_TO_OPEN_BACKEND_DEVICE: return "Failed to open backend device"; - case MA_FAILED_TO_START_BACKEND_DEVICE: return "Failed to start backend device"; - case MA_FAILED_TO_STOP_BACKEND_DEVICE: return "Failed to stop backend device"; - - default: return "Unknown error"; - } -} - -MA_API void* ma_malloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - if (pAllocationCallbacks->onMalloc != NULL) { - return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData); - } else { - return NULL; /* Do not fall back to the default implementation. */ - } - } else { - return ma__malloc_default(sz, NULL); - } -} - -MA_API void* ma_calloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks) -{ - void* p = ma_malloc(sz, pAllocationCallbacks); - if (p != NULL) { - MA_ZERO_MEMORY(p, sz); - } - - return p; -} - -MA_API void* ma_realloc(void* p, size_t sz, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - if (pAllocationCallbacks->onRealloc != NULL) { - return pAllocationCallbacks->onRealloc(p, sz, pAllocationCallbacks->pUserData); - } else { - return NULL; /* Do not fall back to the default implementation. */ - } - } else { - return ma__realloc_default(p, sz, NULL); - } -} - -MA_API void ma_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (p == NULL) { - return; - } - - if (pAllocationCallbacks != NULL) { - if (pAllocationCallbacks->onFree != NULL) { - pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); - } else { - return; /* Do no fall back to the default implementation. */ - } - } else { - ma__free_default(p, NULL); - } -} - -MA_API void* ma_aligned_malloc(size_t sz, size_t alignment, const ma_allocation_callbacks* pAllocationCallbacks) -{ - size_t extraBytes; - void* pUnaligned; - void* pAligned; - - if (alignment == 0) { - return 0; - } - - extraBytes = alignment-1 + sizeof(void*); - - pUnaligned = ma_malloc(sz + extraBytes, pAllocationCallbacks); - if (pUnaligned == NULL) { - return NULL; - } - - pAligned = (void*)(((ma_uintptr)pUnaligned + extraBytes) & ~((ma_uintptr)(alignment-1))); - ((void**)pAligned)[-1] = pUnaligned; - - return pAligned; -} - -MA_API void ma_aligned_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_free(((void**)p)[-1], pAllocationCallbacks); -} - -MA_API const char* ma_get_format_name(ma_format format) -{ - switch (format) - { - case ma_format_unknown: return "Unknown"; - case ma_format_u8: return "8-bit Unsigned Integer"; - case ma_format_s16: return "16-bit Signed Integer"; - case ma_format_s24: return "24-bit Signed Integer (Tightly Packed)"; - case ma_format_s32: return "32-bit Signed Integer"; - case ma_format_f32: return "32-bit IEEE Floating Point"; - default: return "Invalid"; - } -} - -MA_API void ma_blend_f32(float* pOut, float* pInA, float* pInB, float factor, ma_uint32 channels) -{ - ma_uint32 i; - for (i = 0; i < channels; ++i) { - pOut[i] = ma_mix_f32(pInA[i], pInB[i], factor); - } -} - - -MA_API ma_uint32 ma_get_bytes_per_sample(ma_format format) -{ - ma_uint32 sizes[] = { - 0, /* unknown */ - 1, /* u8 */ - 2, /* s16 */ - 3, /* s24 */ - 4, /* s32 */ - 4, /* f32 */ - }; - return sizes[format]; -} - - - -MA_API ma_data_source_config ma_data_source_config_init(void) -{ - ma_data_source_config config; - - MA_ZERO_OBJECT(&config); - - return config; -} - - -MA_API ma_result ma_data_source_init(const ma_data_source_config* pConfig, ma_data_source* pDataSource) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDataSourceBase); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - pDataSourceBase->vtable = pConfig->vtable; - pDataSourceBase->rangeBegInFrames = 0; - pDataSourceBase->rangeEndInFrames = ~((ma_uint64)0); - pDataSourceBase->loopBegInFrames = 0; - pDataSourceBase->loopEndInFrames = ~((ma_uint64)0); - pDataSourceBase->pCurrent = pDataSource; /* Always read from ourself by default. */ - pDataSourceBase->pNext = NULL; - pDataSourceBase->onGetNext = NULL; - - return MA_SUCCESS; -} - -MA_API void ma_data_source_uninit(ma_data_source* pDataSource) -{ - if (pDataSource == NULL) { - return; - } - - /* - This is placeholder in case we need this later. Data sources need to call this in their - uninitialization routine to ensure things work later on if something is added here. - */ -} - -static ma_result ma_data_source_resolve_current(ma_data_source* pDataSource, ma_data_source** ppCurrentDataSource) -{ - ma_data_source_base* pCurrentDataSource = (ma_data_source_base*)pDataSource; - - MA_ASSERT(pDataSource != NULL); - MA_ASSERT(ppCurrentDataSource != NULL); - - if (pCurrentDataSource->pCurrent == NULL) { - /* - The current data source is NULL. If we're using this in the context of a chain we need to return NULL - here so that we don't end up looping. Otherwise we just return the data source itself. - */ - if (pCurrentDataSource->pNext != NULL || pCurrentDataSource->onGetNext != NULL) { - pCurrentDataSource = NULL; - } else { - pCurrentDataSource = (ma_data_source_base*)pDataSource; /* Not being used in a chain. Make sure we just always read from the data source itself at all times. */ - } - } else { - pCurrentDataSource = (ma_data_source_base*)pCurrentDataSource->pCurrent; - } - - *ppCurrentDataSource = pCurrentDataSource; - - return MA_SUCCESS; -} - -static ma_result ma_data_source_read_pcm_frames_within_range(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - ma_result result; - ma_uint64 framesRead = 0; - ma_bool32 loop = ma_data_source_is_looping(pDataSource); - - if (pDataSourceBase == NULL) { - return MA_AT_END; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if ((pDataSourceBase->vtable->flags & MA_DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT) != 0 || (pDataSourceBase->rangeEndInFrames == ~((ma_uint64)0) && (pDataSourceBase->loopEndInFrames == ~((ma_uint64)0) || loop == MA_FALSE))) { - /* Either the data source is self-managing the range, or no range is set - just read like normal. The data source itself will tell us when the end is reached. */ - result = pDataSourceBase->vtable->onRead(pDataSourceBase, pFramesOut, frameCount, &framesRead); - } else { - /* Need to clamp to within the range. */ - ma_uint64 cursor; - - result = ma_data_source_get_cursor_in_pcm_frames(pDataSourceBase, &cursor); - if (result != MA_SUCCESS) { - /* Failed to retrieve the cursor. Cannot read within a range or loop points. Just read like normal - this may happen for things like noise data sources where it doesn't really matter. */ - result = pDataSourceBase->vtable->onRead(pDataSourceBase, pFramesOut, frameCount, &framesRead); - } else { - ma_uint64 rangeEnd; - - /* We have the cursor. We need to make sure we don't read beyond our range. */ - rangeEnd = pDataSourceBase->rangeEndInFrames; - - /* If looping, make sure we're within range. */ - if (loop) { - if (pDataSourceBase->loopEndInFrames != ~((ma_uint64)0)) { - rangeEnd = ma_min(rangeEnd, pDataSourceBase->rangeBegInFrames + pDataSourceBase->loopEndInFrames); - } - } - - if (frameCount > (rangeEnd - cursor) && rangeEnd != ~((ma_uint64)0)) { - frameCount = (rangeEnd - cursor); - } - - /* - If the cursor is sitting on the end of the range the frame count will be set to 0 which can - result in MA_INVALID_ARGS. In this case, we don't want to try reading, but instead return - MA_AT_END so the higher level function can know about it. - */ - if (frameCount > 0) { - result = pDataSourceBase->vtable->onRead(pDataSourceBase, pFramesOut, frameCount, &framesRead); - } else { - result = MA_AT_END; /* The cursor is sitting on the end of the range which means we're at the end. */ - } - } - } - - if (pFramesRead != NULL) { - *pFramesRead = framesRead; - } - - /* We need to make sure MA_AT_END is returned if we hit the end of the range. */ - if (result == MA_SUCCESS && framesRead == 0) { - result = MA_AT_END; - } - - return result; -} - -MA_API ma_result ma_data_source_read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - ma_data_source_base* pCurrentDataSource; - void* pRunningFramesOut = pFramesOut; - ma_uint64 totalFramesProcessed = 0; - ma_format format; - ma_uint32 channels; - ma_uint32 emptyLoopCounter = 0; /* Keeps track of how many times 0 frames have been read. For infinite loop detection of sounds with no audio data. */ - ma_bool32 loop; - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pDataSourceBase == NULL) { - return MA_INVALID_ARGS; - } - - loop = ma_data_source_is_looping(pDataSource); - - /* - We need to know the data format so we can advance the output buffer as we read frames. If this - fails, chaining will not work and we'll just read as much as we can from the current source. - */ - if (ma_data_source_get_data_format(pDataSource, &format, &channels, NULL, NULL, 0) != MA_SUCCESS) { - result = ma_data_source_resolve_current(pDataSource, (ma_data_source**)&pCurrentDataSource); - if (result != MA_SUCCESS) { - return result; - } - - return ma_data_source_read_pcm_frames_within_range(pCurrentDataSource, pFramesOut, frameCount, pFramesRead); - } - - /* - Looping is a bit of a special case. When the `loop` argument is true, chaining will not work and - only the current data source will be read from. - */ - - /* Keep reading until we've read as many frames as possible. */ - while (totalFramesProcessed < frameCount) { - ma_uint64 framesProcessed; - ma_uint64 framesRemaining = frameCount - totalFramesProcessed; - - /* We need to resolve the data source that we'll actually be reading from. */ - result = ma_data_source_resolve_current(pDataSource, (ma_data_source**)&pCurrentDataSource); - if (result != MA_SUCCESS) { - break; - } - - if (pCurrentDataSource == NULL) { - break; - } - - result = ma_data_source_read_pcm_frames_within_range(pCurrentDataSource, pRunningFramesOut, framesRemaining, &framesProcessed); - totalFramesProcessed += framesProcessed; - - /* - If we encounted an error from the read callback, make sure it's propagated to the caller. The caller may need to know whether or not MA_BUSY is returned which is - not necessarily considered an error. - */ - if (result != MA_SUCCESS && result != MA_AT_END) { - break; - } - - /* - We can determine if we've reached the end by checking if ma_data_source_read_pcm_frames_within_range() returned - MA_AT_END. To loop back to the start, all we need to do is seek back to the first frame. - */ - if (result == MA_AT_END) { - /* - The result needs to be reset back to MA_SUCCESS (from MA_AT_END) so that we don't - accidentally return MA_AT_END when data has been read in prior loop iterations. at the - end of this function, the result will be checked for MA_SUCCESS, and if the total - number of frames processed is 0, will be explicitly set to MA_AT_END. - */ - result = MA_SUCCESS; - - /* - We reached the end. If we're looping, we just loop back to the start of the current - data source. If we're not looping we need to check if we have another in the chain, and - if so, switch to it. - */ - if (loop) { - if (framesProcessed == 0) { - emptyLoopCounter += 1; - if (emptyLoopCounter > 1) { - break; /* Infinite loop detected. Get out. */ - } - } else { - emptyLoopCounter = 0; - } - - result = ma_data_source_seek_to_pcm_frame(pCurrentDataSource, pCurrentDataSource->loopBegInFrames); - if (result != MA_SUCCESS) { - break; /* Failed to loop. Abort. */ - } - - /* Don't return MA_AT_END for looping sounds. */ - result = MA_SUCCESS; - } else { - if (pCurrentDataSource->pNext != NULL) { - pDataSourceBase->pCurrent = pCurrentDataSource->pNext; - } else if (pCurrentDataSource->onGetNext != NULL) { - pDataSourceBase->pCurrent = pCurrentDataSource->onGetNext(pCurrentDataSource); - if (pDataSourceBase->pCurrent == NULL) { - break; /* Our callback did not return a next data source. We're done. */ - } - } else { - /* Reached the end of the chain. We're done. */ - break; - } - - /* The next data source needs to be rewound to ensure data is read in looping scenarios. */ - result = ma_data_source_seek_to_pcm_frame(pDataSourceBase->pCurrent, 0); - if (result != MA_SUCCESS) { - break; - } - } - } - - if (pRunningFramesOut != NULL) { - pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesProcessed * ma_get_bytes_per_frame(format, channels)); - } - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesProcessed; - } - - MA_ASSERT(!(result == MA_AT_END && totalFramesProcessed > 0)); /* We should never be returning MA_AT_END if we read some data. */ - - if (result == MA_SUCCESS && totalFramesProcessed == 0) { - result = MA_AT_END; - } - - return result; -} - -MA_API ma_result ma_data_source_seek_pcm_frames(ma_data_source* pDataSource, ma_uint64 frameCount, ma_uint64* pFramesSeeked) -{ - return ma_data_source_read_pcm_frames(pDataSource, NULL, frameCount, pFramesSeeked); -} - -MA_API ma_result ma_data_source_seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pDataSourceBase == NULL) { - return MA_SUCCESS; - } - - if (pDataSourceBase->vtable->onSeek == NULL) { - return MA_NOT_IMPLEMENTED; - } - - if (frameIndex > pDataSourceBase->rangeEndInFrames) { - return MA_INVALID_OPERATION; /* Trying to seek to far forward. */ - } - - return pDataSourceBase->vtable->onSeek(pDataSource, pDataSourceBase->rangeBegInFrames + frameIndex); -} - -MA_API ma_result ma_data_source_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - ma_result result; - ma_format format; - ma_uint32 channels; - ma_uint32 sampleRate; - - /* Initialize to defaults for safety just in case the data source does not implement this callback. */ - if (pFormat != NULL) { - *pFormat = ma_format_unknown; - } - if (pChannels != NULL) { - *pChannels = 0; - } - if (pSampleRate != NULL) { - *pSampleRate = 0; - } - if (pChannelMap != NULL) { - MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap); - } - - if (pDataSourceBase == NULL) { - return MA_INVALID_ARGS; - } - - if (pDataSourceBase->vtable->onGetDataFormat == NULL) { - return MA_NOT_IMPLEMENTED; - } - - result = pDataSourceBase->vtable->onGetDataFormat(pDataSource, &format, &channels, &sampleRate, pChannelMap, channelMapCap); - if (result != MA_SUCCESS) { - return result; - } - - if (pFormat != NULL) { - *pFormat = format; - } - if (pChannels != NULL) { - *pChannels = channels; - } - if (pSampleRate != NULL) { - *pSampleRate = sampleRate; - } - - /* Channel map was passed in directly to the callback. This is safe due to the channelMapCap parameter. */ - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_source_get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - ma_result result; - ma_uint64 cursor; - - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - if (pDataSourceBase == NULL) { - return MA_SUCCESS; - } - - if (pDataSourceBase->vtable->onGetCursor == NULL) { - return MA_NOT_IMPLEMENTED; - } - - result = pDataSourceBase->vtable->onGetCursor(pDataSourceBase, &cursor); - if (result != MA_SUCCESS) { - return result; - } - - /* The cursor needs to be made relative to the start of the range. */ - if (cursor < pDataSourceBase->rangeBegInFrames) { /* Safety check so we don't return some huge number. */ - *pCursor = 0; - } else { - *pCursor = cursor - pDataSourceBase->rangeBegInFrames; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_source_get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; - - if (pDataSourceBase == NULL) { - return MA_INVALID_ARGS; - } - - /* - If we have a range defined we'll use that to determine the length. This is one of rare times - where we'll actually trust the caller. If they've set the range, I think it's mostly safe to - assume they've set it based on some higher level knowledge of the structure of the sound bank. - */ - if (pDataSourceBase->rangeEndInFrames != ~((ma_uint64)0)) { - *pLength = pDataSourceBase->rangeEndInFrames - pDataSourceBase->rangeBegInFrames; - return MA_SUCCESS; - } - - /* - Getting here means a range is not defined so we'll need to get the data source itself to tell - us the length. - */ - if (pDataSourceBase->vtable->onGetLength == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDataSourceBase->vtable->onGetLength(pDataSource, pLength); -} - -MA_API ma_result ma_data_source_get_cursor_in_seconds(ma_data_source* pDataSource, float* pCursor) -{ - ma_result result; - ma_uint64 cursorInPCMFrames; - ma_uint32 sampleRate; - - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - result = ma_data_source_get_cursor_in_pcm_frames(pDataSource, &cursorInPCMFrames); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_data_source_get_data_format(pDataSource, NULL, NULL, &sampleRate, NULL, 0); - if (result != MA_SUCCESS) { - return result; - } - - *pCursor = cursorInPCMFrames / (float)sampleRate; - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_source_get_length_in_seconds(ma_data_source* pDataSource, float* pLength) -{ - ma_result result; - ma_uint64 lengthInPCMFrames; - ma_uint32 sampleRate; - - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; - - result = ma_data_source_get_length_in_pcm_frames(pDataSource, &lengthInPCMFrames); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_data_source_get_data_format(pDataSource, NULL, NULL, &sampleRate, NULL, 0); - if (result != MA_SUCCESS) { - return result; - } - - *pLength = lengthInPCMFrames / (float)sampleRate; - - return MA_SUCCESS; -} - -MA_API ma_result ma_data_source_set_looping(ma_data_source* pDataSource, ma_bool32 isLooping) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - c89atomic_exchange_32(&pDataSourceBase->isLooping, isLooping); - - /* If there's no callback for this just treat it as a successful no-op. */ - if (pDataSourceBase->vtable->onSetLooping == NULL) { - return MA_SUCCESS; - } - - return pDataSourceBase->vtable->onSetLooping(pDataSource, isLooping); -} - -MA_API ma_bool32 ma_data_source_is_looping(const ma_data_source* pDataSource) -{ - const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return MA_FALSE; - } - - return c89atomic_load_32(&pDataSourceBase->isLooping); -} - -MA_API ma_result ma_data_source_set_range_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 rangeBegInFrames, ma_uint64 rangeEndInFrames) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - ma_result result; - ma_uint64 cursor; - ma_uint64 loopBegAbsolute; - ma_uint64 loopEndAbsolute; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if (rangeEndInFrames < rangeBegInFrames) { - return MA_INVALID_ARGS; /* The end of the range must come after the beginning. */ - } - - /* - The loop points need to be updated. We'll be storing the loop points relative to the range. We'll update - these so that they maintain their absolute positioning. The loop points will then be clamped to the range. - */ - loopBegAbsolute = pDataSourceBase->loopBegInFrames + pDataSourceBase->rangeBegInFrames; - loopEndAbsolute = pDataSourceBase->loopEndInFrames + ((pDataSourceBase->loopEndInFrames != ~((ma_uint64)0)) ? pDataSourceBase->rangeBegInFrames : 0); - - pDataSourceBase->rangeBegInFrames = rangeBegInFrames; - pDataSourceBase->rangeEndInFrames = rangeEndInFrames; - - /* Make the loop points relative again, and make sure they're clamped to within the range. */ - if (loopBegAbsolute > pDataSourceBase->rangeBegInFrames) { - pDataSourceBase->loopBegInFrames = loopBegAbsolute - pDataSourceBase->rangeBegInFrames; - } else { - pDataSourceBase->loopBegInFrames = 0; - } - - if (pDataSourceBase->loopBegInFrames > pDataSourceBase->rangeEndInFrames) { - pDataSourceBase->loopBegInFrames = pDataSourceBase->rangeEndInFrames; - } - - /* Only need to update the loop end point if it's not -1. */ - if (loopEndAbsolute != ~((ma_uint64)0)) { - if (loopEndAbsolute > pDataSourceBase->rangeBegInFrames) { - pDataSourceBase->loopEndInFrames = loopEndAbsolute - pDataSourceBase->rangeBegInFrames; - } else { - pDataSourceBase->loopEndInFrames = 0; - } - - if (pDataSourceBase->loopEndInFrames > pDataSourceBase->rangeEndInFrames && pDataSourceBase->loopEndInFrames) { - pDataSourceBase->loopEndInFrames = pDataSourceBase->rangeEndInFrames; - } - } - - - /* If the new range is past the current cursor position we need to seek to it. */ - result = ma_data_source_get_cursor_in_pcm_frames(pDataSource, &cursor); - if (result == MA_SUCCESS) { - /* Seek to within range. Note that our seek positions here are relative to the new range. */ - if (cursor < rangeBegInFrames) { - ma_data_source_seek_to_pcm_frame(pDataSource, 0); - } else if (cursor > rangeEndInFrames) { - ma_data_source_seek_to_pcm_frame(pDataSource, rangeEndInFrames - rangeBegInFrames); - } - } else { - /* We failed to get the cursor position. Probably means the data source has no notion of a cursor such a noise data source. Just pretend the seeking worked. */ - } - - return MA_SUCCESS; -} - -MA_API void ma_data_source_get_range_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pRangeBegInFrames, ma_uint64* pRangeEndInFrames) -{ - const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return; - } - - if (pRangeBegInFrames != NULL) { - *pRangeBegInFrames = pDataSourceBase->rangeBegInFrames; - } - - if (pRangeEndInFrames != NULL) { - *pRangeEndInFrames = pDataSourceBase->rangeEndInFrames; - } -} - -MA_API ma_result ma_data_source_set_loop_point_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 loopBegInFrames, ma_uint64 loopEndInFrames) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if (loopEndInFrames < loopBegInFrames) { - return MA_INVALID_ARGS; /* The end of the loop point must come after the beginning. */ - } - - if (loopEndInFrames > pDataSourceBase->rangeEndInFrames && loopEndInFrames != ~((ma_uint64)0)) { - return MA_INVALID_ARGS; /* The end of the loop point must not go beyond the range. */ - } - - pDataSourceBase->loopBegInFrames = loopBegInFrames; - pDataSourceBase->loopEndInFrames = loopEndInFrames; - - /* The end cannot exceed the range. */ - if (pDataSourceBase->loopEndInFrames > (pDataSourceBase->rangeEndInFrames - pDataSourceBase->rangeBegInFrames) && pDataSourceBase->loopEndInFrames != ~((ma_uint64)0)) { - pDataSourceBase->loopEndInFrames = (pDataSourceBase->rangeEndInFrames - pDataSourceBase->rangeBegInFrames); - } - - return MA_SUCCESS; -} - -MA_API void ma_data_source_get_loop_point_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pLoopBegInFrames, ma_uint64* pLoopEndInFrames) -{ - const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return; - } - - if (pLoopBegInFrames != NULL) { - *pLoopBegInFrames = pDataSourceBase->loopBegInFrames; - } - - if (pLoopEndInFrames != NULL) { - *pLoopEndInFrames = pDataSourceBase->loopEndInFrames; - } -} - -MA_API ma_result ma_data_source_set_current(ma_data_source* pDataSource, ma_data_source* pCurrentDataSource) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - pDataSourceBase->pCurrent = pCurrentDataSource; - - return MA_SUCCESS; -} - -MA_API ma_data_source* ma_data_source_get_current(const ma_data_source* pDataSource) -{ - const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return NULL; - } - - return pDataSourceBase->pCurrent; -} - -MA_API ma_result ma_data_source_set_next(ma_data_source* pDataSource, ma_data_source* pNextDataSource) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - pDataSourceBase->pNext = pNextDataSource; - - return MA_SUCCESS; -} - -MA_API ma_data_source* ma_data_source_get_next(const ma_data_source* pDataSource) -{ - const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return NULL; - } - - return pDataSourceBase->pNext; -} - -MA_API ma_result ma_data_source_set_next_callback(ma_data_source* pDataSource, ma_data_source_get_next_proc onGetNext) -{ - ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - pDataSourceBase->onGetNext = onGetNext; - - return MA_SUCCESS; -} - -MA_API ma_data_source_get_next_proc ma_data_source_get_next_callback(const ma_data_source* pDataSource) -{ - const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource; - - if (pDataSource == NULL) { - return NULL; - } - - return pDataSourceBase->onGetNext; -} - - -static ma_result ma_audio_buffer_ref__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource; - ma_uint64 framesRead = ma_audio_buffer_ref_read_pcm_frames(pAudioBufferRef, pFramesOut, frameCount, MA_FALSE); - - if (pFramesRead != NULL) { - *pFramesRead = framesRead; - } - - if (framesRead < frameCount || framesRead == 0) { - return MA_AT_END; - } - - return MA_SUCCESS; -} - -static ma_result ma_audio_buffer_ref__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_audio_buffer_ref_seek_to_pcm_frame((ma_audio_buffer_ref*)pDataSource, frameIndex); -} - -static ma_result ma_audio_buffer_ref__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource; - - *pFormat = pAudioBufferRef->format; - *pChannels = pAudioBufferRef->channels; - *pSampleRate = pAudioBufferRef->sampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pAudioBufferRef->channels); - - return MA_SUCCESS; -} - -static ma_result ma_audio_buffer_ref__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource; - - *pCursor = pAudioBufferRef->cursor; - - return MA_SUCCESS; -} - -static ma_result ma_audio_buffer_ref__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength) -{ - ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource; - - *pLength = pAudioBufferRef->sizeInFrames; - - return MA_SUCCESS; -} - -static ma_data_source_vtable g_ma_audio_buffer_ref_data_source_vtable = -{ - ma_audio_buffer_ref__data_source_on_read, - ma_audio_buffer_ref__data_source_on_seek, - ma_audio_buffer_ref__data_source_on_get_data_format, - ma_audio_buffer_ref__data_source_on_get_cursor, - ma_audio_buffer_ref__data_source_on_get_length, - NULL, /* onSetLooping */ - 0 -}; - -MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pAudioBufferRef); - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_audio_buffer_ref_data_source_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pAudioBufferRef->ds); - if (result != MA_SUCCESS) { - return result; - } - - pAudioBufferRef->format = format; - pAudioBufferRef->channels = channels; - pAudioBufferRef->sampleRate = 0; /* TODO: Version 0.12. Set this to sampleRate. */ - pAudioBufferRef->cursor = 0; - pAudioBufferRef->sizeInFrames = sizeInFrames; - pAudioBufferRef->pData = pData; - - return MA_SUCCESS; -} - -MA_API void ma_audio_buffer_ref_uninit(ma_audio_buffer_ref* pAudioBufferRef) -{ - if (pAudioBufferRef == NULL) { - return; - } - - ma_data_source_uninit(&pAudioBufferRef->ds); -} - -MA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferRef, const void* pData, ma_uint64 sizeInFrames) -{ - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; - } - - pAudioBufferRef->cursor = 0; - pAudioBufferRef->sizeInFrames = sizeInFrames; - pAudioBufferRef->pData = pData; - - return MA_SUCCESS; -} - -MA_API ma_uint64 ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop) -{ - ma_uint64 totalFramesRead = 0; - - if (pAudioBufferRef == NULL) { - return 0; - } - - if (frameCount == 0) { - return 0; - } - - while (totalFramesRead < frameCount) { - ma_uint64 framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor; - ma_uint64 framesRemaining = frameCount - totalFramesRead; - ma_uint64 framesToRead; - - framesToRead = framesRemaining; - if (framesToRead > framesAvailable) { - framesToRead = framesAvailable; - } - - if (pFramesOut != NULL) { - ma_copy_pcm_frames(ma_offset_ptr(pFramesOut, totalFramesRead * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), framesToRead, pAudioBufferRef->format, pAudioBufferRef->channels); - } - - totalFramesRead += framesToRead; - - pAudioBufferRef->cursor += framesToRead; - if (pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames) { - if (loop) { - pAudioBufferRef->cursor = 0; - } else { - break; /* We've reached the end and we're not looping. Done. */ - } - } - - MA_ASSERT(pAudioBufferRef->cursor < pAudioBufferRef->sizeInFrames); - } - - return totalFramesRead; -} - -MA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex) -{ - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; - } - - if (frameIndex > pAudioBufferRef->sizeInFrames) { - return MA_INVALID_ARGS; - } - - pAudioBufferRef->cursor = (size_t)frameIndex; - - return MA_SUCCESS; -} - -MA_API ma_result ma_audio_buffer_ref_map(ma_audio_buffer_ref* pAudioBufferRef, void** ppFramesOut, ma_uint64* pFrameCount) -{ - ma_uint64 framesAvailable; - ma_uint64 frameCount = 0; - - if (ppFramesOut != NULL) { - *ppFramesOut = NULL; /* Safety. */ - } - - if (pFrameCount != NULL) { - frameCount = *pFrameCount; - *pFrameCount = 0; /* Safety. */ - } - - if (pAudioBufferRef == NULL || ppFramesOut == NULL || pFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor; - if (frameCount > framesAvailable) { - frameCount = framesAvailable; - } - - *ppFramesOut = ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)); - *pFrameCount = frameCount; - - return MA_SUCCESS; -} - -MA_API ma_result ma_audio_buffer_ref_unmap(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameCount) -{ - ma_uint64 framesAvailable; - - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; - } - - framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor; - if (frameCount > framesAvailable) { - return MA_INVALID_ARGS; /* The frame count was too big. This should never happen in an unmapping. Need to make sure the caller is aware of this. */ - } - - pAudioBufferRef->cursor += frameCount; - - if (pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames) { - return MA_AT_END; /* Successful. Need to tell the caller that the end has been reached so that it can loop if desired. */ - } else { - return MA_SUCCESS; - } -} - -MA_API ma_bool32 ma_audio_buffer_ref_at_end(const ma_audio_buffer_ref* pAudioBufferRef) -{ - if (pAudioBufferRef == NULL) { - return MA_FALSE; - } - - return pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames; -} - -MA_API ma_result ma_audio_buffer_ref_get_cursor_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = pAudioBufferRef->cursor; - - return MA_SUCCESS; -} - -MA_API ma_result ma_audio_buffer_ref_get_length_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pLength) -{ - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; - - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = pAudioBufferRef->sizeInFrames; - - return MA_SUCCESS; -} - -MA_API ma_result ma_audio_buffer_ref_get_available_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pAvailableFrames) -{ - if (pAvailableFrames == NULL) { - return MA_INVALID_ARGS; - } - - *pAvailableFrames = 0; - - if (pAudioBufferRef == NULL) { - return MA_INVALID_ARGS; - } - - if (pAudioBufferRef->sizeInFrames <= pAudioBufferRef->cursor) { - *pAvailableFrames = 0; - } else { - *pAvailableFrames = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor; - } - - return MA_SUCCESS; -} - - - - -MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_audio_buffer_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = 0; /* TODO: Version 0.12. Set this to sampleRate. */ - config.sizeInFrames = sizeInFrames; - config.pData = pData; - ma_allocation_callbacks_init_copy(&config.allocationCallbacks, pAllocationCallbacks); - - return config; -} - -static ma_result ma_audio_buffer_init_ex(const ma_audio_buffer_config* pConfig, ma_bool32 doCopy, ma_audio_buffer* pAudioBuffer) -{ - ma_result result; - - if (pAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_MEMORY(pAudioBuffer, sizeof(*pAudioBuffer) - sizeof(pAudioBuffer->_pExtraData)); /* Safety. Don't overwrite the extra data. */ - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->sizeInFrames == 0) { - return MA_INVALID_ARGS; /* Not allowing buffer sizes of 0 frames. */ - } - - result = ma_audio_buffer_ref_init(pConfig->format, pConfig->channels, NULL, 0, &pAudioBuffer->ref); - if (result != MA_SUCCESS) { - return result; - } - - /* TODO: Version 0.12. Set this in ma_audio_buffer_ref_init() instead of here. */ - pAudioBuffer->ref.sampleRate = pConfig->sampleRate; - - ma_allocation_callbacks_init_copy(&pAudioBuffer->allocationCallbacks, &pConfig->allocationCallbacks); - - if (doCopy) { - ma_uint64 allocationSizeInBytes; - void* pData; - - allocationSizeInBytes = pConfig->sizeInFrames * ma_get_bytes_per_frame(pConfig->format, pConfig->channels); - if (allocationSizeInBytes > MA_SIZE_MAX) { - return MA_OUT_OF_MEMORY; /* Too big. */ - } - - pData = ma_malloc((size_t)allocationSizeInBytes, &pAudioBuffer->allocationCallbacks); /* Safe cast to size_t. */ - if (pData == NULL) { - return MA_OUT_OF_MEMORY; - } - - if (pConfig->pData != NULL) { - ma_copy_pcm_frames(pData, pConfig->pData, pConfig->sizeInFrames, pConfig->format, pConfig->channels); - } else { - ma_silence_pcm_frames(pData, pConfig->sizeInFrames, pConfig->format, pConfig->channels); - } - - ma_audio_buffer_ref_set_data(&pAudioBuffer->ref, pData, pConfig->sizeInFrames); - pAudioBuffer->ownsData = MA_TRUE; - } else { - ma_audio_buffer_ref_set_data(&pAudioBuffer->ref, pConfig->pData, pConfig->sizeInFrames); - pAudioBuffer->ownsData = MA_FALSE; - } - - return MA_SUCCESS; -} - -static void ma_audio_buffer_uninit_ex(ma_audio_buffer* pAudioBuffer, ma_bool32 doFree) -{ - if (pAudioBuffer == NULL) { - return; - } - - if (pAudioBuffer->ownsData && pAudioBuffer->ref.pData != &pAudioBuffer->_pExtraData[0]) { - ma_free((void*)pAudioBuffer->ref.pData, &pAudioBuffer->allocationCallbacks); /* Naugty const cast, but OK in this case since we've guarded it with the ownsData check. */ - } - - if (doFree) { - ma_free(pAudioBuffer, &pAudioBuffer->allocationCallbacks); - } - - ma_audio_buffer_ref_uninit(&pAudioBuffer->ref); -} - -MA_API ma_result ma_audio_buffer_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer) -{ - return ma_audio_buffer_init_ex(pConfig, MA_FALSE, pAudioBuffer); -} - -MA_API ma_result ma_audio_buffer_init_copy(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer) -{ - return ma_audio_buffer_init_ex(pConfig, MA_TRUE, pAudioBuffer); -} - -MA_API ma_result ma_audio_buffer_alloc_and_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer** ppAudioBuffer) -{ - ma_result result; - ma_audio_buffer* pAudioBuffer; - ma_audio_buffer_config innerConfig; /* We'll be making some changes to the config, so need to make a copy. */ - ma_uint64 allocationSizeInBytes; - - if (ppAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - *ppAudioBuffer = NULL; /* Safety. */ - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - innerConfig = *pConfig; - ma_allocation_callbacks_init_copy(&innerConfig.allocationCallbacks, &pConfig->allocationCallbacks); - - allocationSizeInBytes = sizeof(*pAudioBuffer) - sizeof(pAudioBuffer->_pExtraData) + (pConfig->sizeInFrames * ma_get_bytes_per_frame(pConfig->format, pConfig->channels)); - if (allocationSizeInBytes > MA_SIZE_MAX) { - return MA_OUT_OF_MEMORY; /* Too big. */ - } - - pAudioBuffer = (ma_audio_buffer*)ma_malloc((size_t)allocationSizeInBytes, &innerConfig.allocationCallbacks); /* Safe cast to size_t. */ - if (pAudioBuffer == NULL) { - return MA_OUT_OF_MEMORY; - } - - if (pConfig->pData != NULL) { - ma_copy_pcm_frames(&pAudioBuffer->_pExtraData[0], pConfig->pData, pConfig->sizeInFrames, pConfig->format, pConfig->channels); - } else { - ma_silence_pcm_frames(&pAudioBuffer->_pExtraData[0], pConfig->sizeInFrames, pConfig->format, pConfig->channels); - } - - innerConfig.pData = &pAudioBuffer->_pExtraData[0]; - - result = ma_audio_buffer_init_ex(&innerConfig, MA_FALSE, pAudioBuffer); - if (result != MA_SUCCESS) { - ma_free(pAudioBuffer, &innerConfig.allocationCallbacks); - return result; - } - - *ppAudioBuffer = pAudioBuffer; - - return MA_SUCCESS; -} - -MA_API void ma_audio_buffer_uninit(ma_audio_buffer* pAudioBuffer) -{ - ma_audio_buffer_uninit_ex(pAudioBuffer, MA_FALSE); -} - -MA_API void ma_audio_buffer_uninit_and_free(ma_audio_buffer* pAudioBuffer) -{ - ma_audio_buffer_uninit_ex(pAudioBuffer, MA_TRUE); -} - -MA_API ma_uint64 ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop) -{ - if (pAudioBuffer == NULL) { - return 0; - } - - return ma_audio_buffer_ref_read_pcm_frames(&pAudioBuffer->ref, pFramesOut, frameCount, loop); -} - -MA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer, ma_uint64 frameIndex) -{ - if (pAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - return ma_audio_buffer_ref_seek_to_pcm_frame(&pAudioBuffer->ref, frameIndex); -} - -MA_API ma_result ma_audio_buffer_map(ma_audio_buffer* pAudioBuffer, void** ppFramesOut, ma_uint64* pFrameCount) -{ - if (ppFramesOut != NULL) { - *ppFramesOut = NULL; /* Safety. */ - } - - if (pAudioBuffer == NULL) { - if (pFrameCount != NULL) { - *pFrameCount = 0; - } - - return MA_INVALID_ARGS; - } - - return ma_audio_buffer_ref_map(&pAudioBuffer->ref, ppFramesOut, pFrameCount); -} - -MA_API ma_result ma_audio_buffer_unmap(ma_audio_buffer* pAudioBuffer, ma_uint64 frameCount) -{ - if (pAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - return ma_audio_buffer_ref_unmap(&pAudioBuffer->ref, frameCount); -} - -MA_API ma_bool32 ma_audio_buffer_at_end(const ma_audio_buffer* pAudioBuffer) -{ - if (pAudioBuffer == NULL) { - return MA_FALSE; - } - - return ma_audio_buffer_ref_at_end(&pAudioBuffer->ref); -} - -MA_API ma_result ma_audio_buffer_get_cursor_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pCursor) -{ - if (pAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - return ma_audio_buffer_ref_get_cursor_in_pcm_frames(&pAudioBuffer->ref, pCursor); -} - -MA_API ma_result ma_audio_buffer_get_length_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pLength) -{ - if (pAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - return ma_audio_buffer_ref_get_length_in_pcm_frames(&pAudioBuffer->ref, pLength); -} - -MA_API ma_result ma_audio_buffer_get_available_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pAvailableFrames) -{ - if (pAvailableFrames == NULL) { - return MA_INVALID_ARGS; - } - - *pAvailableFrames = 0; - - if (pAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - return ma_audio_buffer_ref_get_available_frames(&pAudioBuffer->ref, pAvailableFrames); -} - - - - - -MA_API ma_result ma_paged_audio_buffer_data_init(ma_format format, ma_uint32 channels, ma_paged_audio_buffer_data* pData) -{ - if (pData == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pData); - - pData->format = format; - pData->channels = channels; - pData->pTail = &pData->head; - - return MA_SUCCESS; -} - -MA_API void ma_paged_audio_buffer_data_uninit(ma_paged_audio_buffer_data* pData, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_paged_audio_buffer_page* pPage; - - if (pData == NULL) { - return; - } - - /* All pages need to be freed. */ - pPage = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&pData->head.pNext); - while (pPage != NULL) { - ma_paged_audio_buffer_page* pNext = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&pPage->pNext); - - ma_free(pPage, pAllocationCallbacks); - pPage = pNext; - } -} - -MA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_head(ma_paged_audio_buffer_data* pData) -{ - if (pData == NULL) { - return NULL; - } - - return &pData->head; -} - -MA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_tail(ma_paged_audio_buffer_data* pData) -{ - if (pData == NULL) { - return NULL; - } - - return pData->pTail; -} - -MA_API ma_result ma_paged_audio_buffer_data_get_length_in_pcm_frames(ma_paged_audio_buffer_data* pData, ma_uint64* pLength) -{ - ma_paged_audio_buffer_page* pPage; - - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; - - if (pData == NULL) { - return MA_INVALID_ARGS; - } - - /* Calculate the length from the linked list. */ - for (pPage = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&pData->head.pNext); pPage != NULL; pPage = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&pPage->pNext)) { - *pLength += pPage->sizeInFrames; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_paged_audio_buffer_data_allocate_page(ma_paged_audio_buffer_data* pData, ma_uint64 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks, ma_paged_audio_buffer_page** ppPage) -{ - ma_paged_audio_buffer_page* pPage; - ma_uint64 allocationSize; - - if (ppPage == NULL) { - return MA_INVALID_ARGS; - } - - *ppPage = NULL; - - if (pData == NULL) { - return MA_INVALID_ARGS; - } - - allocationSize = sizeof(*pPage) + (pageSizeInFrames * ma_get_bytes_per_frame(pData->format, pData->channels)); - if (allocationSize > MA_SIZE_MAX) { - return MA_OUT_OF_MEMORY; /* Too big. */ - } - - pPage = (ma_paged_audio_buffer_page*)ma_malloc((size_t)allocationSize, pAllocationCallbacks); /* Safe cast to size_t. */ - if (pPage == NULL) { - return MA_OUT_OF_MEMORY; - } - - pPage->pNext = NULL; - pPage->sizeInFrames = pageSizeInFrames; - - if (pInitialData != NULL) { - ma_copy_pcm_frames(pPage->pAudioData, pInitialData, pageSizeInFrames, pData->format, pData->channels); - } - - *ppPage = pPage; - - return MA_SUCCESS; -} - -MA_API ma_result ma_paged_audio_buffer_data_free_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pData == NULL || pPage == NULL) { - return MA_INVALID_ARGS; - } - - /* It's assumed the page is not attached to the list. */ - ma_free(pPage, pAllocationCallbacks); - - return MA_SUCCESS; -} - -MA_API ma_result ma_paged_audio_buffer_data_append_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage) -{ - if (pData == NULL || pPage == NULL) { - return MA_INVALID_ARGS; - } - - /* This function assumes the page has been filled with audio data by this point. As soon as we append, the page will be available for reading. */ - - /* First thing to do is update the tail. */ - for (;;) { - ma_paged_audio_buffer_page* pOldTail = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&pData->pTail); - ma_paged_audio_buffer_page* pNewTail = pPage; - - if (c89atomic_compare_exchange_weak_ptr((volatile void**)&pData->pTail, (void**)&pOldTail, pNewTail)) { - /* Here is where we append the page to the list. After this, the page is attached to the list and ready to be read from. */ - c89atomic_exchange_ptr(&pOldTail->pNext, pPage); - break; /* Done. */ - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_paged_audio_buffer_data_allocate_and_append_page(ma_paged_audio_buffer_data* pData, ma_uint32 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_result result; - ma_paged_audio_buffer_page* pPage; - - result = ma_paged_audio_buffer_data_allocate_page(pData, pageSizeInFrames, pInitialData, pAllocationCallbacks, &pPage); - if (result != MA_SUCCESS) { - return result; - } - - return ma_paged_audio_buffer_data_append_page(pData, pPage); /* <-- Should never fail. */ -} - - -MA_API ma_paged_audio_buffer_config ma_paged_audio_buffer_config_init(ma_paged_audio_buffer_data* pData) -{ - ma_paged_audio_buffer_config config; - - MA_ZERO_OBJECT(&config); - config.pData = pData; - - return config; -} - - -static ma_result ma_paged_audio_buffer__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_paged_audio_buffer_read_pcm_frames((ma_paged_audio_buffer*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_paged_audio_buffer__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_paged_audio_buffer_seek_to_pcm_frame((ma_paged_audio_buffer*)pDataSource, frameIndex); -} - -static ma_result ma_paged_audio_buffer__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - ma_paged_audio_buffer* pPagedAudioBuffer = (ma_paged_audio_buffer*)pDataSource; - - *pFormat = pPagedAudioBuffer->pData->format; - *pChannels = pPagedAudioBuffer->pData->channels; - *pSampleRate = 0; /* There is no notion of a sample rate with audio buffers. */ - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pPagedAudioBuffer->pData->channels); - - return MA_SUCCESS; -} - -static ma_result ma_paged_audio_buffer__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_paged_audio_buffer_get_cursor_in_pcm_frames((ma_paged_audio_buffer*)pDataSource, pCursor); -} - -static ma_result ma_paged_audio_buffer__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_paged_audio_buffer_get_length_in_pcm_frames((ma_paged_audio_buffer*)pDataSource, pLength); -} - -static ma_data_source_vtable g_ma_paged_audio_buffer_data_source_vtable = -{ - ma_paged_audio_buffer__data_source_on_read, - ma_paged_audio_buffer__data_source_on_seek, - ma_paged_audio_buffer__data_source_on_get_data_format, - ma_paged_audio_buffer__data_source_on_get_cursor, - ma_paged_audio_buffer__data_source_on_get_length, - NULL, /* onSetLooping */ - 0 -}; - -MA_API ma_result ma_paged_audio_buffer_init(const ma_paged_audio_buffer_config* pConfig, ma_paged_audio_buffer* pPagedAudioBuffer) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - if (pPagedAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pPagedAudioBuffer); - - /* A config is required for the format and channel count. */ - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->pData == NULL) { - return MA_INVALID_ARGS; /* No underlying data specified. */ - } - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_paged_audio_buffer_data_source_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pPagedAudioBuffer->ds); - if (result != MA_SUCCESS) { - return result; - } - - pPagedAudioBuffer->pData = pConfig->pData; - pPagedAudioBuffer->pCurrent = ma_paged_audio_buffer_data_get_head(pConfig->pData); - pPagedAudioBuffer->relativeCursor = 0; - pPagedAudioBuffer->absoluteCursor = 0; - - return MA_SUCCESS; -} - -MA_API void ma_paged_audio_buffer_uninit(ma_paged_audio_buffer* pPagedAudioBuffer) -{ - if (pPagedAudioBuffer == NULL) { - return; - } - - /* Nothing to do. The data needs to be deleted separately. */ -} - -MA_API ma_result ma_paged_audio_buffer_read_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_uint64 totalFramesRead = 0; - ma_format format; - ma_uint32 channels; - - if (pPagedAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - format = pPagedAudioBuffer->pData->format; - channels = pPagedAudioBuffer->pData->channels; - - while (totalFramesRead < frameCount) { - /* Read from the current page. The buffer should never be in a state where this is NULL. */ - ma_uint64 framesRemainingInCurrentPage; - ma_uint64 framesRemainingToRead = frameCount - totalFramesRead; - ma_uint64 framesToReadThisIteration; - - MA_ASSERT(pPagedAudioBuffer->pCurrent != NULL); - - framesRemainingInCurrentPage = pPagedAudioBuffer->pCurrent->sizeInFrames - pPagedAudioBuffer->relativeCursor; - - framesToReadThisIteration = ma_min(framesRemainingInCurrentPage, framesRemainingToRead); - ma_copy_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), ma_offset_pcm_frames_ptr(pPagedAudioBuffer->pCurrent->pAudioData, pPagedAudioBuffer->relativeCursor, format, channels), framesToReadThisIteration, format, channels); - totalFramesRead += framesToReadThisIteration; - - pPagedAudioBuffer->absoluteCursor += framesToReadThisIteration; - pPagedAudioBuffer->relativeCursor += framesToReadThisIteration; - - /* Move to the next page if necessary. If there's no more pages, we need to return MA_AT_END. */ - MA_ASSERT(pPagedAudioBuffer->relativeCursor <= pPagedAudioBuffer->pCurrent->sizeInFrames); - - if (pPagedAudioBuffer->relativeCursor == pPagedAudioBuffer->pCurrent->sizeInFrames) { - /* We reached the end of the page. Need to move to the next. If there's no more pages, we're done. */ - ma_paged_audio_buffer_page* pNext = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&pPagedAudioBuffer->pCurrent->pNext); - if (pNext == NULL) { - result = MA_AT_END; - break; /* We've reached the end. */ - } else { - pPagedAudioBuffer->pCurrent = pNext; - pPagedAudioBuffer->relativeCursor = 0; - } - } - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesRead; - } - - return result; -} - -MA_API ma_result ma_paged_audio_buffer_seek_to_pcm_frame(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64 frameIndex) -{ - if (pPagedAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - if (frameIndex == pPagedAudioBuffer->absoluteCursor) { - return MA_SUCCESS; /* Nothing to do. */ - } - - if (frameIndex < pPagedAudioBuffer->absoluteCursor) { - /* Moving backwards. Need to move the cursor back to the start, and then move forward. */ - pPagedAudioBuffer->pCurrent = ma_paged_audio_buffer_data_get_head(pPagedAudioBuffer->pData); - pPagedAudioBuffer->absoluteCursor = 0; - pPagedAudioBuffer->relativeCursor = 0; - - /* Fall through to the forward seeking section below. */ - } - - if (frameIndex > pPagedAudioBuffer->absoluteCursor) { - /* Moving forward. */ - ma_paged_audio_buffer_page* pPage; - ma_uint64 runningCursor = 0; - - for (pPage = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&ma_paged_audio_buffer_data_get_head(pPagedAudioBuffer->pData)->pNext); pPage != NULL; pPage = (ma_paged_audio_buffer_page*)c89atomic_load_ptr(&pPage->pNext)) { - ma_uint64 pageRangeBeg = runningCursor; - ma_uint64 pageRangeEnd = pageRangeBeg + pPage->sizeInFrames; - - if (frameIndex >= pageRangeBeg) { - if (frameIndex < pageRangeEnd || (frameIndex == pageRangeEnd && pPage == (ma_paged_audio_buffer_page*)c89atomic_load_ptr(ma_paged_audio_buffer_data_get_tail(pPagedAudioBuffer->pData)))) { /* A small edge case - allow seeking to the very end of the buffer. */ - /* We found the page. */ - pPagedAudioBuffer->pCurrent = pPage; - pPagedAudioBuffer->absoluteCursor = frameIndex; - pPagedAudioBuffer->relativeCursor = frameIndex - pageRangeBeg; - return MA_SUCCESS; - } - } - - runningCursor = pageRangeEnd; - } - - /* Getting here means we tried seeking too far forward. Don't change any state. */ - return MA_BAD_SEEK; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_paged_audio_buffer_get_cursor_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; /* Safety. */ - - if (pPagedAudioBuffer == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = pPagedAudioBuffer->absoluteCursor; - - return MA_SUCCESS; -} - -MA_API ma_result ma_paged_audio_buffer_get_length_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pLength) -{ - return ma_paged_audio_buffer_data_get_length_in_pcm_frames(pPagedAudioBuffer->pData, pLength); -} - - - -/************************************************************************************************************************************************************** - -VFS - -**************************************************************************************************************************************************************/ -MA_API ma_result ma_vfs_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - - if (pFile == NULL) { - return MA_INVALID_ARGS; - } - - *pFile = NULL; - - if (pVFS == NULL || pFilePath == NULL || openMode == 0) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onOpen == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pCallbacks->onOpen(pVFS, pFilePath, openMode, pFile); -} - -MA_API ma_result ma_vfs_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - - if (pFile == NULL) { - return MA_INVALID_ARGS; - } - - *pFile = NULL; - - if (pVFS == NULL || pFilePath == NULL || openMode == 0) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onOpenW == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pCallbacks->onOpenW(pVFS, pFilePath, openMode, pFile); -} - -MA_API ma_result ma_vfs_close(ma_vfs* pVFS, ma_vfs_file file) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - - if (pVFS == NULL || file == NULL) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onClose == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pCallbacks->onClose(pVFS, file); -} - -MA_API ma_result ma_vfs_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - ma_result result; - size_t bytesRead; - - if (pBytesRead != NULL) { - *pBytesRead = 0; - } - - if (pVFS == NULL || file == NULL || pDst == NULL) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onRead == NULL) { - return MA_NOT_IMPLEMENTED; - } - - result = pCallbacks->onRead(pVFS, file, pDst, sizeInBytes, &bytesRead); - - if (pBytesRead != NULL) { - *pBytesRead = bytesRead; - } - - if (result == MA_SUCCESS && bytesRead == 0 && sizeInBytes > 0) { - result = MA_AT_END; - } - - return result; -} - -MA_API ma_result ma_vfs_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - - if (pBytesWritten != NULL) { - *pBytesWritten = 0; - } - - if (pVFS == NULL || file == NULL || pSrc == NULL) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onWrite == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pCallbacks->onWrite(pVFS, file, pSrc, sizeInBytes, pBytesWritten); -} - -MA_API ma_result ma_vfs_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - - if (pVFS == NULL || file == NULL) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onSeek == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pCallbacks->onSeek(pVFS, file, offset, origin); -} - -MA_API ma_result ma_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - if (pVFS == NULL || file == NULL) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onTell == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pCallbacks->onTell(pVFS, file, pCursor); -} - -MA_API ma_result ma_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) -{ - ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS; - - if (pInfo == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pInfo); - - if (pVFS == NULL || file == NULL) { - return MA_INVALID_ARGS; - } - - if (pCallbacks->onInfo == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pCallbacks->onInfo(pVFS, file, pInfo); -} - - -static ma_result ma_vfs_open_and_read_file_ex(ma_vfs* pVFS, const char* pFilePath, const wchar_t* pFilePathW, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_result result; - ma_vfs_file file; - ma_file_info info; - void* pData; - size_t bytesRead; - - if (ppData != NULL) { - *ppData = NULL; - } - if (pSize != NULL) { - *pSize = 0; - } - - if (ppData == NULL) { - return MA_INVALID_ARGS; - } - - if (pFilePath != NULL) { - result = ma_vfs_open(pVFS, pFilePath, MA_OPEN_MODE_READ, &file); - } else { - result = ma_vfs_open_w(pVFS, pFilePathW, MA_OPEN_MODE_READ, &file); - } - if (result != MA_SUCCESS) { - return result; - } - - result = ma_vfs_info(pVFS, file, &info); - if (result != MA_SUCCESS) { - ma_vfs_close(pVFS, file); - return result; - } - - if (info.sizeInBytes > MA_SIZE_MAX) { - ma_vfs_close(pVFS, file); - return MA_TOO_BIG; - } - - pData = ma_malloc((size_t)info.sizeInBytes, pAllocationCallbacks); /* Safe cast. */ - if (pData == NULL) { - ma_vfs_close(pVFS, file); - return result; - } - - result = ma_vfs_read(pVFS, file, pData, (size_t)info.sizeInBytes, &bytesRead); /* Safe cast. */ - ma_vfs_close(pVFS, file); - - if (result != MA_SUCCESS) { - ma_free(pData, pAllocationCallbacks); - return result; - } - - if (pSize != NULL) { - *pSize = bytesRead; - } - - MA_ASSERT(ppData != NULL); - *ppData = pData; - - return MA_SUCCESS; -} - -MA_API ma_result ma_vfs_open_and_read_file(ma_vfs* pVFS, const char* pFilePath, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks) -{ - return ma_vfs_open_and_read_file_ex(pVFS, pFilePath, NULL, ppData, pSize, pAllocationCallbacks); -} - -MA_API ma_result ma_vfs_open_and_read_file_w(ma_vfs* pVFS, const wchar_t* pFilePath, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks) -{ - return ma_vfs_open_and_read_file_ex(pVFS, NULL, pFilePath, ppData, pSize, pAllocationCallbacks); -} - - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) -static void ma_default_vfs__get_open_settings_win32(ma_uint32 openMode, DWORD* pDesiredAccess, DWORD* pShareMode, DWORD* pCreationDisposition) -{ - *pDesiredAccess = 0; - if ((openMode & MA_OPEN_MODE_READ) != 0) { - *pDesiredAccess |= GENERIC_READ; - } - if ((openMode & MA_OPEN_MODE_WRITE) != 0) { - *pDesiredAccess |= GENERIC_WRITE; - } - - *pShareMode = 0; - if ((openMode & MA_OPEN_MODE_READ) != 0) { - *pShareMode |= FILE_SHARE_READ; - } - - if ((openMode & MA_OPEN_MODE_WRITE) != 0) { - *pCreationDisposition = CREATE_ALWAYS; /* Opening in write mode. Truncate. */ - } else { - *pCreationDisposition = OPEN_EXISTING; /* Opening in read mode. File must exist. */ - } -} - -static ma_result ma_default_vfs_open__win32(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - HANDLE hFile; - DWORD dwDesiredAccess; - DWORD dwShareMode; - DWORD dwCreationDisposition; - - (void)pVFS; - - ma_default_vfs__get_open_settings_win32(openMode, &dwDesiredAccess, &dwShareMode, &dwCreationDisposition); - - hFile = CreateFileA(pFilePath, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { - return ma_result_from_GetLastError(GetLastError()); - } - - *pFile = hFile; - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_open_w__win32(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - HANDLE hFile; - DWORD dwDesiredAccess; - DWORD dwShareMode; - DWORD dwCreationDisposition; - - (void)pVFS; - - ma_default_vfs__get_open_settings_win32(openMode, &dwDesiredAccess, &dwShareMode, &dwCreationDisposition); - - hFile = CreateFileW(pFilePath, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == INVALID_HANDLE_VALUE) { - return ma_result_from_GetLastError(GetLastError()); - } - - *pFile = hFile; - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_close__win32(ma_vfs* pVFS, ma_vfs_file file) -{ - (void)pVFS; - - if (CloseHandle((HANDLE)file) == 0) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} - - -static ma_result ma_default_vfs_read__win32(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead) -{ - ma_result result = MA_SUCCESS; - size_t totalBytesRead; - - (void)pVFS; - - totalBytesRead = 0; - while (totalBytesRead < sizeInBytes) { - size_t bytesRemaining; - DWORD bytesToRead; - DWORD bytesRead; - BOOL readResult; - - bytesRemaining = sizeInBytes - totalBytesRead; - if (bytesRemaining >= 0xFFFFFFFF) { - bytesToRead = 0xFFFFFFFF; - } else { - bytesToRead = (DWORD)bytesRemaining; - } - - readResult = ReadFile((HANDLE)file, ma_offset_ptr(pDst, totalBytesRead), bytesToRead, &bytesRead, NULL); - if (readResult == 1 && bytesRead == 0) { - result = MA_AT_END; - break; /* EOF */ - } - - totalBytesRead += bytesRead; - - if (bytesRead < bytesToRead) { - break; /* EOF */ - } - - if (readResult == 0) { - result = ma_result_from_GetLastError(GetLastError()); - break; - } - } - - if (pBytesRead != NULL) { - *pBytesRead = totalBytesRead; - } - - return result; -} - -static ma_result ma_default_vfs_write__win32(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten) -{ - ma_result result = MA_SUCCESS; - size_t totalBytesWritten; - - (void)pVFS; - - totalBytesWritten = 0; - while (totalBytesWritten < sizeInBytes) { - size_t bytesRemaining; - DWORD bytesToWrite; - DWORD bytesWritten; - BOOL writeResult; - - bytesRemaining = sizeInBytes - totalBytesWritten; - if (bytesRemaining >= 0xFFFFFFFF) { - bytesToWrite = 0xFFFFFFFF; - } else { - bytesToWrite = (DWORD)bytesRemaining; - } - - writeResult = WriteFile((HANDLE)file, ma_offset_ptr(pSrc, totalBytesWritten), bytesToWrite, &bytesWritten, NULL); - totalBytesWritten += bytesWritten; - - if (writeResult == 0) { - result = ma_result_from_GetLastError(GetLastError()); - break; - } - } - - if (pBytesWritten != NULL) { - *pBytesWritten = totalBytesWritten; - } - - return result; -} - - -static ma_result ma_default_vfs_seek__win32(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin) -{ - LARGE_INTEGER liDistanceToMove; - DWORD dwMoveMethod; - BOOL result; - - (void)pVFS; - - liDistanceToMove.QuadPart = offset; - - /* */ if (origin == ma_seek_origin_current) { - dwMoveMethod = FILE_CURRENT; - } else if (origin == ma_seek_origin_end) { - dwMoveMethod = FILE_END; - } else { - dwMoveMethod = FILE_BEGIN; - } - -#if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(__DMC__) - /* No SetFilePointerEx() so restrict to 31 bits. */ - if (origin > 0x7FFFFFFF) { - return MA_OUT_OF_RANGE; - } - - result = SetFilePointer((HANDLE)file, (LONG)liDistanceToMove.QuadPart, NULL, dwMoveMethod); -#else - result = SetFilePointerEx((HANDLE)file, liDistanceToMove, NULL, dwMoveMethod); -#endif - if (result == 0) { - return ma_result_from_GetLastError(GetLastError()); - } - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor) -{ - LARGE_INTEGER liZero; - LARGE_INTEGER liTell; - BOOL result; -#if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(__DMC__) - LONG tell; -#endif - - (void)pVFS; - - liZero.QuadPart = 0; - -#if (defined(_MSC_VER) && _MSC_VER <= 1200) || defined(__DMC__) - result = SetFilePointer((HANDLE)file, (LONG)liZero.QuadPart, &tell, FILE_CURRENT); - liTell.QuadPart = tell; -#else - result = SetFilePointerEx((HANDLE)file, liZero, &liTell, FILE_CURRENT); -#endif - if (result == 0) { - return ma_result_from_GetLastError(GetLastError()); - } - - if (pCursor != NULL) { - *pCursor = liTell.QuadPart; - } - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_info__win32(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) -{ - BY_HANDLE_FILE_INFORMATION fi; - BOOL result; - - (void)pVFS; - - result = GetFileInformationByHandle((HANDLE)file, &fi); - if (result == 0) { - return ma_result_from_GetLastError(GetLastError()); - } - - pInfo->sizeInBytes = ((ma_uint64)fi.nFileSizeHigh << 32) | ((ma_uint64)fi.nFileSizeLow); - - return MA_SUCCESS; -} -#else -static ma_result ma_default_vfs_open__stdio(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - ma_result result; - FILE* pFileStd; - const char* pOpenModeStr; - - MA_ASSERT(pFilePath != NULL); - MA_ASSERT(openMode != 0); - MA_ASSERT(pFile != NULL); - - (void)pVFS; - - if ((openMode & MA_OPEN_MODE_READ) != 0) { - if ((openMode & MA_OPEN_MODE_WRITE) != 0) { - pOpenModeStr = "r+"; - } else { - pOpenModeStr = "rb"; - } - } else { - pOpenModeStr = "wb"; - } - - result = ma_fopen(&pFileStd, pFilePath, pOpenModeStr); - if (result != MA_SUCCESS) { - return result; - } - - *pFile = pFileStd; - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_open_w__stdio(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - ma_result result; - FILE* pFileStd; - const wchar_t* pOpenModeStr; - - MA_ASSERT(pFilePath != NULL); - MA_ASSERT(openMode != 0); - MA_ASSERT(pFile != NULL); - - (void)pVFS; - - if ((openMode & MA_OPEN_MODE_READ) != 0) { - if ((openMode & MA_OPEN_MODE_WRITE) != 0) { - pOpenModeStr = L"r+"; - } else { - pOpenModeStr = L"rb"; - } - } else { - pOpenModeStr = L"wb"; - } - - result = ma_wfopen(&pFileStd, pFilePath, pOpenModeStr, (pVFS != NULL) ? &((ma_default_vfs*)pVFS)->allocationCallbacks : NULL); - if (result != MA_SUCCESS) { - return result; - } - - *pFile = pFileStd; - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_close__stdio(ma_vfs* pVFS, ma_vfs_file file) -{ - MA_ASSERT(file != NULL); - - (void)pVFS; - - fclose((FILE*)file); - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_read__stdio(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead) -{ - size_t result; - - MA_ASSERT(file != NULL); - MA_ASSERT(pDst != NULL); - - (void)pVFS; - - result = fread(pDst, 1, sizeInBytes, (FILE*)file); - - if (pBytesRead != NULL) { - *pBytesRead = result; - } - - if (result != sizeInBytes) { - if (result == 0 && feof((FILE*)file)) { - return MA_AT_END; - } else { - return ma_result_from_errno(ferror((FILE*)file)); - } - } - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_write__stdio(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten) -{ - size_t result; - - MA_ASSERT(file != NULL); - MA_ASSERT(pSrc != NULL); - - (void)pVFS; - - result = fwrite(pSrc, 1, sizeInBytes, (FILE*)file); - - if (pBytesWritten != NULL) { - *pBytesWritten = result; - } - - if (result != sizeInBytes) { - return ma_result_from_errno(ferror((FILE*)file)); - } - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_seek__stdio(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin) -{ - int result; - int whence; - - MA_ASSERT(file != NULL); - - (void)pVFS; - - if (origin == ma_seek_origin_start) { - whence = SEEK_SET; - } else if (origin == ma_seek_origin_end) { - whence = SEEK_END; - } else { - whence = SEEK_CUR; - } - -#if defined(_WIN32) - #if defined(_MSC_VER) && _MSC_VER > 1200 - result = _fseeki64((FILE*)file, offset, whence); - #else - /* No _fseeki64() so restrict to 31 bits. */ - if (origin > 0x7FFFFFFF) { - return MA_OUT_OF_RANGE; - } - - result = fseek((FILE*)file, (int)offset, whence); - #endif -#else - result = fseek((FILE*)file, (long int)offset, whence); -#endif - if (result != 0) { - return MA_ERROR; - } - - return MA_SUCCESS; -} - -static ma_result ma_default_vfs_tell__stdio(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor) -{ - ma_int64 result; - - MA_ASSERT(file != NULL); - MA_ASSERT(pCursor != NULL); - - (void)pVFS; - -#if defined(_WIN32) - #if defined(_MSC_VER) && _MSC_VER > 1200 - result = _ftelli64((FILE*)file); - #else - result = ftell((FILE*)file); - #endif -#else - result = ftell((FILE*)file); -#endif - - *pCursor = result; - - return MA_SUCCESS; -} - -#if !defined(_MSC_VER) && !((defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 1) || defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE)) && !defined(MA_BSD) -int fileno(FILE *stream); -#endif - -static ma_result ma_default_vfs_info__stdio(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) -{ - int fd; - struct stat info; - - MA_ASSERT(file != NULL); - MA_ASSERT(pInfo != NULL); - - (void)pVFS; - -#if defined(_MSC_VER) - fd = _fileno((FILE*)file); -#else - fd = fileno((FILE*)file); -#endif - - if (fstat(fd, &info) != 0) { - return ma_result_from_errno(errno); - } - - pInfo->sizeInBytes = info.st_size; - - return MA_SUCCESS; -} -#endif - - -static ma_result ma_default_vfs_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - if (pFile == NULL) { - return MA_INVALID_ARGS; - } - - *pFile = NULL; - - if (pFilePath == NULL || openMode == 0) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_open__win32(pVFS, pFilePath, openMode, pFile); -#else - return ma_default_vfs_open__stdio(pVFS, pFilePath, openMode, pFile); -#endif -} - -static ma_result ma_default_vfs_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - if (pFile == NULL) { - return MA_INVALID_ARGS; - } - - *pFile = NULL; - - if (pFilePath == NULL || openMode == 0) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_open_w__win32(pVFS, pFilePath, openMode, pFile); -#else - return ma_default_vfs_open_w__stdio(pVFS, pFilePath, openMode, pFile); -#endif -} - -static ma_result ma_default_vfs_close(ma_vfs* pVFS, ma_vfs_file file) -{ - if (file == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_close__win32(pVFS, file); -#else - return ma_default_vfs_close__stdio(pVFS, file); -#endif -} - -static ma_result ma_default_vfs_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead) -{ - if (pBytesRead != NULL) { - *pBytesRead = 0; - } - - if (file == NULL || pDst == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_read__win32(pVFS, file, pDst, sizeInBytes, pBytesRead); -#else - return ma_default_vfs_read__stdio(pVFS, file, pDst, sizeInBytes, pBytesRead); -#endif -} - -static ma_result ma_default_vfs_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten) -{ - if (pBytesWritten != NULL) { - *pBytesWritten = 0; - } - - if (file == NULL || pSrc == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_write__win32(pVFS, file, pSrc, sizeInBytes, pBytesWritten); -#else - return ma_default_vfs_write__stdio(pVFS, file, pSrc, sizeInBytes, pBytesWritten); -#endif -} - -static ma_result ma_default_vfs_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin) -{ - if (file == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_seek__win32(pVFS, file, offset, origin); -#else - return ma_default_vfs_seek__stdio(pVFS, file, offset, origin); -#endif -} - -static ma_result ma_default_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - if (file == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_tell__win32(pVFS, file, pCursor); -#else - return ma_default_vfs_tell__stdio(pVFS, file, pCursor); -#endif -} - -static ma_result ma_default_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) -{ - if (pInfo == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pInfo); - - if (file == NULL) { - return MA_INVALID_ARGS; - } - -#if defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) - return ma_default_vfs_info__win32(pVFS, file, pInfo); -#else - return ma_default_vfs_info__stdio(pVFS, file, pInfo); -#endif -} - - -MA_API ma_result ma_default_vfs_init(ma_default_vfs* pVFS, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pVFS == NULL) { - return MA_INVALID_ARGS; - } - - pVFS->cb.onOpen = ma_default_vfs_open; - pVFS->cb.onOpenW = ma_default_vfs_open_w; - pVFS->cb.onClose = ma_default_vfs_close; - pVFS->cb.onRead = ma_default_vfs_read; - pVFS->cb.onWrite = ma_default_vfs_write; - pVFS->cb.onSeek = ma_default_vfs_seek; - pVFS->cb.onTell = ma_default_vfs_tell; - pVFS->cb.onInfo = ma_default_vfs_info; - ma_allocation_callbacks_init_copy(&pVFS->allocationCallbacks, pAllocationCallbacks); - - return MA_SUCCESS; -} - - -MA_API ma_result ma_vfs_or_default_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - if (pVFS != NULL) { - return ma_vfs_open(pVFS, pFilePath, openMode, pFile); - } else { - return ma_default_vfs_open(pVFS, pFilePath, openMode, pFile); - } -} - -MA_API ma_result ma_vfs_or_default_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile) -{ - if (pVFS != NULL) { - return ma_vfs_open_w(pVFS, pFilePath, openMode, pFile); - } else { - return ma_default_vfs_open_w(pVFS, pFilePath, openMode, pFile); - } -} - -MA_API ma_result ma_vfs_or_default_close(ma_vfs* pVFS, ma_vfs_file file) -{ - if (pVFS != NULL) { - return ma_vfs_close(pVFS, file); - } else { - return ma_default_vfs_close(pVFS, file); - } -} - -MA_API ma_result ma_vfs_or_default_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead) -{ - if (pVFS != NULL) { - return ma_vfs_read(pVFS, file, pDst, sizeInBytes, pBytesRead); - } else { - return ma_default_vfs_read(pVFS, file, pDst, sizeInBytes, pBytesRead); - } -} - -MA_API ma_result ma_vfs_or_default_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten) -{ - if (pVFS != NULL) { - return ma_vfs_write(pVFS, file, pSrc, sizeInBytes, pBytesWritten); - } else { - return ma_default_vfs_write(pVFS, file, pSrc, sizeInBytes, pBytesWritten); - } -} - -MA_API ma_result ma_vfs_or_default_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin) -{ - if (pVFS != NULL) { - return ma_vfs_seek(pVFS, file, offset, origin); - } else { - return ma_default_vfs_seek(pVFS, file, offset, origin); - } -} - -MA_API ma_result ma_vfs_or_default_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor) -{ - if (pVFS != NULL) { - return ma_vfs_tell(pVFS, file, pCursor); - } else { - return ma_default_vfs_tell(pVFS, file, pCursor); - } -} - -MA_API ma_result ma_vfs_or_default_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo) -{ - if (pVFS != NULL) { - return ma_vfs_info(pVFS, file, pInfo); - } else { - return ma_default_vfs_info(pVFS, file, pInfo); - } -} - - - -/************************************************************************************************************************************************************** - -Decoding and Encoding Headers. These are auto-generated from a tool. - -**************************************************************************************************************************************************************/ -#if !defined(MA_NO_WAV) && (!defined(MA_NO_DECODING) || !defined(MA_NO_ENCODING)) -/* dr_wav_h begin */ -#ifndef dr_wav_h -#define dr_wav_h -#ifdef __cplusplus -extern "C" { -#endif -#define DRWAV_STRINGIFY(x) #x -#define DRWAV_XSTRINGIFY(x) DRWAV_STRINGIFY(x) -#define DRWAV_VERSION_MAJOR 0 -#define DRWAV_VERSION_MINOR 13 -#define DRWAV_VERSION_REVISION 6 -#define DRWAV_VERSION_STRING DRWAV_XSTRINGIFY(DRWAV_VERSION_MAJOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_MINOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_REVISION) -#include -typedef signed char drwav_int8; -typedef unsigned char drwav_uint8; -typedef signed short drwav_int16; -typedef unsigned short drwav_uint16; -typedef signed int drwav_int32; -typedef unsigned int drwav_uint32; -#if defined(_MSC_VER) && !defined(__clang__) - typedef signed __int64 drwav_int64; - typedef unsigned __int64 drwav_uint64; -#else - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wlong-long" - #if defined(__clang__) - #pragma GCC diagnostic ignored "-Wc++11-long-long" - #endif - #endif - typedef signed long long drwav_int64; - typedef unsigned long long drwav_uint64; - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic pop - #endif -#endif -#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__) - typedef drwav_uint64 drwav_uintptr; -#else - typedef drwav_uint32 drwav_uintptr; -#endif -typedef drwav_uint8 drwav_bool8; -typedef drwav_uint32 drwav_bool32; -#define DRWAV_TRUE 1 -#define DRWAV_FALSE 0 -#if !defined(DRWAV_API) - #if defined(DRWAV_DLL) - #if defined(_WIN32) - #define DRWAV_DLL_IMPORT __declspec(dllimport) - #define DRWAV_DLL_EXPORT __declspec(dllexport) - #define DRWAV_DLL_PRIVATE static - #else - #if defined(__GNUC__) && __GNUC__ >= 4 - #define DRWAV_DLL_IMPORT __attribute__((visibility("default"))) - #define DRWAV_DLL_EXPORT __attribute__((visibility("default"))) - #define DRWAV_DLL_PRIVATE __attribute__((visibility("hidden"))) - #else - #define DRWAV_DLL_IMPORT - #define DRWAV_DLL_EXPORT - #define DRWAV_DLL_PRIVATE static - #endif - #endif - #if defined(DR_WAV_IMPLEMENTATION) || defined(DRWAV_IMPLEMENTATION) - #define DRWAV_API DRWAV_DLL_EXPORT - #else - #define DRWAV_API DRWAV_DLL_IMPORT - #endif - #define DRWAV_PRIVATE DRWAV_DLL_PRIVATE - #else - #define DRWAV_API extern - #define DRWAV_PRIVATE static - #endif -#endif -typedef drwav_int32 drwav_result; -#define DRWAV_SUCCESS 0 -#define DRWAV_ERROR -1 -#define DRWAV_INVALID_ARGS -2 -#define DRWAV_INVALID_OPERATION -3 -#define DRWAV_OUT_OF_MEMORY -4 -#define DRWAV_OUT_OF_RANGE -5 -#define DRWAV_ACCESS_DENIED -6 -#define DRWAV_DOES_NOT_EXIST -7 -#define DRWAV_ALREADY_EXISTS -8 -#define DRWAV_TOO_MANY_OPEN_FILES -9 -#define DRWAV_INVALID_FILE -10 -#define DRWAV_TOO_BIG -11 -#define DRWAV_PATH_TOO_LONG -12 -#define DRWAV_NAME_TOO_LONG -13 -#define DRWAV_NOT_DIRECTORY -14 -#define DRWAV_IS_DIRECTORY -15 -#define DRWAV_DIRECTORY_NOT_EMPTY -16 -#define DRWAV_END_OF_FILE -17 -#define DRWAV_NO_SPACE -18 -#define DRWAV_BUSY -19 -#define DRWAV_IO_ERROR -20 -#define DRWAV_INTERRUPT -21 -#define DRWAV_UNAVAILABLE -22 -#define DRWAV_ALREADY_IN_USE -23 -#define DRWAV_BAD_ADDRESS -24 -#define DRWAV_BAD_SEEK -25 -#define DRWAV_BAD_PIPE -26 -#define DRWAV_DEADLOCK -27 -#define DRWAV_TOO_MANY_LINKS -28 -#define DRWAV_NOT_IMPLEMENTED -29 -#define DRWAV_NO_MESSAGE -30 -#define DRWAV_BAD_MESSAGE -31 -#define DRWAV_NO_DATA_AVAILABLE -32 -#define DRWAV_INVALID_DATA -33 -#define DRWAV_TIMEOUT -34 -#define DRWAV_NO_NETWORK -35 -#define DRWAV_NOT_UNIQUE -36 -#define DRWAV_NOT_SOCKET -37 -#define DRWAV_NO_ADDRESS -38 -#define DRWAV_BAD_PROTOCOL -39 -#define DRWAV_PROTOCOL_UNAVAILABLE -40 -#define DRWAV_PROTOCOL_NOT_SUPPORTED -41 -#define DRWAV_PROTOCOL_FAMILY_NOT_SUPPORTED -42 -#define DRWAV_ADDRESS_FAMILY_NOT_SUPPORTED -43 -#define DRWAV_SOCKET_NOT_SUPPORTED -44 -#define DRWAV_CONNECTION_RESET -45 -#define DRWAV_ALREADY_CONNECTED -46 -#define DRWAV_NOT_CONNECTED -47 -#define DRWAV_CONNECTION_REFUSED -48 -#define DRWAV_NO_HOST -49 -#define DRWAV_IN_PROGRESS -50 -#define DRWAV_CANCELLED -51 -#define DRWAV_MEMORY_ALREADY_MAPPED -52 -#define DRWAV_AT_END -53 -#define DR_WAVE_FORMAT_PCM 0x1 -#define DR_WAVE_FORMAT_ADPCM 0x2 -#define DR_WAVE_FORMAT_IEEE_FLOAT 0x3 -#define DR_WAVE_FORMAT_ALAW 0x6 -#define DR_WAVE_FORMAT_MULAW 0x7 -#define DR_WAVE_FORMAT_DVI_ADPCM 0x11 -#define DR_WAVE_FORMAT_EXTENSIBLE 0xFFFE -#define DRWAV_SEQUENTIAL 0x00000001 -DRWAV_API void drwav_version(drwav_uint32* pMajor, drwav_uint32* pMinor, drwav_uint32* pRevision); -DRWAV_API const char* drwav_version_string(void); -typedef enum -{ - drwav_seek_origin_start, - drwav_seek_origin_current -} drwav_seek_origin; -typedef enum -{ - drwav_container_riff, - drwav_container_w64, - drwav_container_rf64 -} drwav_container; -typedef struct -{ - union - { - drwav_uint8 fourcc[4]; - drwav_uint8 guid[16]; - } id; - drwav_uint64 sizeInBytes; - unsigned int paddingSize; -} drwav_chunk_header; -typedef struct -{ - drwav_uint16 formatTag; - drwav_uint16 channels; - drwav_uint32 sampleRate; - drwav_uint32 avgBytesPerSec; - drwav_uint16 blockAlign; - drwav_uint16 bitsPerSample; - drwav_uint16 extendedSize; - drwav_uint16 validBitsPerSample; - drwav_uint32 channelMask; - drwav_uint8 subFormat[16]; -} drwav_fmt; -DRWAV_API drwav_uint16 drwav_fmt_get_format(const drwav_fmt* pFMT); -typedef size_t (* drwav_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); -typedef size_t (* drwav_write_proc)(void* pUserData, const void* pData, size_t bytesToWrite); -typedef drwav_bool32 (* drwav_seek_proc)(void* pUserData, int offset, drwav_seek_origin origin); -typedef drwav_uint64 (* drwav_chunk_proc)(void* pChunkUserData, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pReadSeekUserData, const drwav_chunk_header* pChunkHeader, drwav_container container, const drwav_fmt* pFMT); -typedef struct -{ - void* pUserData; - void* (* onMalloc)(size_t sz, void* pUserData); - void* (* onRealloc)(void* p, size_t sz, void* pUserData); - void (* onFree)(void* p, void* pUserData); -} drwav_allocation_callbacks; -typedef struct -{ - const drwav_uint8* data; - size_t dataSize; - size_t currentReadPos; -} drwav__memory_stream; -typedef struct -{ - void** ppData; - size_t* pDataSize; - size_t dataSize; - size_t dataCapacity; - size_t currentWritePos; -} drwav__memory_stream_write; -typedef struct -{ - drwav_container container; - drwav_uint32 format; - drwav_uint32 channels; - drwav_uint32 sampleRate; - drwav_uint32 bitsPerSample; -} drwav_data_format; -typedef enum -{ - drwav_metadata_type_none = 0, - drwav_metadata_type_unknown = 1 << 0, - drwav_metadata_type_smpl = 1 << 1, - drwav_metadata_type_inst = 1 << 2, - drwav_metadata_type_cue = 1 << 3, - drwav_metadata_type_acid = 1 << 4, - drwav_metadata_type_bext = 1 << 5, - drwav_metadata_type_list_label = 1 << 6, - drwav_metadata_type_list_note = 1 << 7, - drwav_metadata_type_list_labelled_cue_region = 1 << 8, - drwav_metadata_type_list_info_software = 1 << 9, - drwav_metadata_type_list_info_copyright = 1 << 10, - drwav_metadata_type_list_info_title = 1 << 11, - drwav_metadata_type_list_info_artist = 1 << 12, - drwav_metadata_type_list_info_comment = 1 << 13, - drwav_metadata_type_list_info_date = 1 << 14, - drwav_metadata_type_list_info_genre = 1 << 15, - drwav_metadata_type_list_info_album = 1 << 16, - drwav_metadata_type_list_info_tracknumber = 1 << 17, - drwav_metadata_type_list_all_info_strings = drwav_metadata_type_list_info_software - | drwav_metadata_type_list_info_copyright - | drwav_metadata_type_list_info_title - | drwav_metadata_type_list_info_artist - | drwav_metadata_type_list_info_comment - | drwav_metadata_type_list_info_date - | drwav_metadata_type_list_info_genre - | drwav_metadata_type_list_info_album - | drwav_metadata_type_list_info_tracknumber, - drwav_metadata_type_list_all_adtl = drwav_metadata_type_list_label - | drwav_metadata_type_list_note - | drwav_metadata_type_list_labelled_cue_region, - drwav_metadata_type_all = -2, - drwav_metadata_type_all_including_unknown = -1 -} drwav_metadata_type; -typedef enum -{ - drwav_smpl_loop_type_forward = 0, - drwav_smpl_loop_type_pingpong = 1, - drwav_smpl_loop_type_backward = 2 -} drwav_smpl_loop_type; -typedef struct -{ - drwav_uint32 cuePointId; - drwav_uint32 type; - drwav_uint32 firstSampleByteOffset; - drwav_uint32 lastSampleByteOffset; - drwav_uint32 sampleFraction; - drwav_uint32 playCount; -} drwav_smpl_loop; -typedef struct -{ - drwav_uint32 manufacturerId; - drwav_uint32 productId; - drwav_uint32 samplePeriodNanoseconds; - drwav_uint32 midiUnityNote; - drwav_uint32 midiPitchFraction; - drwav_uint32 smpteFormat; - drwav_uint32 smpteOffset; - drwav_uint32 sampleLoopCount; - drwav_uint32 samplerSpecificDataSizeInBytes; - drwav_smpl_loop* pLoops; - drwav_uint8* pSamplerSpecificData; -} drwav_smpl; -typedef struct -{ - drwav_int8 midiUnityNote; - drwav_int8 fineTuneCents; - drwav_int8 gainDecibels; - drwav_int8 lowNote; - drwav_int8 highNote; - drwav_int8 lowVelocity; - drwav_int8 highVelocity; -} drwav_inst; -typedef struct -{ - drwav_uint32 id; - drwav_uint32 playOrderPosition; - drwav_uint8 dataChunkId[4]; - drwav_uint32 chunkStart; - drwav_uint32 blockStart; - drwav_uint32 sampleByteOffset; -} drwav_cue_point; -typedef struct -{ - drwav_uint32 cuePointCount; - drwav_cue_point *pCuePoints; -} drwav_cue; -typedef enum -{ - drwav_acid_flag_one_shot = 1, - drwav_acid_flag_root_note_set = 2, - drwav_acid_flag_stretch = 4, - drwav_acid_flag_disk_based = 8, - drwav_acid_flag_acidizer = 16 -} drwav_acid_flag; -typedef struct -{ - drwav_uint32 flags; - drwav_uint16 midiUnityNote; - drwav_uint16 reserved1; - float reserved2; - drwav_uint32 numBeats; - drwav_uint16 meterDenominator; - drwav_uint16 meterNumerator; - float tempo; -} drwav_acid; -typedef struct -{ - drwav_uint32 cuePointId; - drwav_uint32 stringLength; - char* pString; -} drwav_list_label_or_note; -typedef struct -{ - char* pDescription; - char* pOriginatorName; - char* pOriginatorReference; - char pOriginationDate[10]; - char pOriginationTime[8]; - drwav_uint64 timeReference; - drwav_uint16 version; - char* pCodingHistory; - drwav_uint32 codingHistorySize; - drwav_uint8* pUMID; - drwav_uint16 loudnessValue; - drwav_uint16 loudnessRange; - drwav_uint16 maxTruePeakLevel; - drwav_uint16 maxMomentaryLoudness; - drwav_uint16 maxShortTermLoudness; -} drwav_bext; -typedef struct -{ - drwav_uint32 stringLength; - char* pString; -} drwav_list_info_text; -typedef struct -{ - drwav_uint32 cuePointId; - drwav_uint32 sampleLength; - drwav_uint8 purposeId[4]; - drwav_uint16 country; - drwav_uint16 language; - drwav_uint16 dialect; - drwav_uint16 codePage; - drwav_uint32 stringLength; - char* pString; -} drwav_list_labelled_cue_region; -typedef enum -{ - drwav_metadata_location_invalid, - drwav_metadata_location_top_level, - drwav_metadata_location_inside_info_list, - drwav_metadata_location_inside_adtl_list -} drwav_metadata_location; -typedef struct -{ - drwav_uint8 id[4]; - drwav_metadata_location chunkLocation; - drwav_uint32 dataSizeInBytes; - drwav_uint8* pData; -} drwav_unknown_metadata; -typedef struct -{ - drwav_metadata_type type; - union - { - drwav_cue cue; - drwav_smpl smpl; - drwav_acid acid; - drwav_inst inst; - drwav_bext bext; - drwav_list_label_or_note labelOrNote; - drwav_list_labelled_cue_region labelledCueRegion; - drwav_list_info_text infoText; - drwav_unknown_metadata unknown; - } data; -} drwav_metadata; -typedef struct -{ - drwav_read_proc onRead; - drwav_write_proc onWrite; - drwav_seek_proc onSeek; - void* pUserData; - drwav_allocation_callbacks allocationCallbacks; - drwav_container container; - drwav_fmt fmt; - drwav_uint32 sampleRate; - drwav_uint16 channels; - drwav_uint16 bitsPerSample; - drwav_uint16 translatedFormatTag; - drwav_uint64 totalPCMFrameCount; - drwav_uint64 dataChunkDataSize; - drwav_uint64 dataChunkDataPos; - drwav_uint64 bytesRemaining; - drwav_uint64 readCursorInPCMFrames; - drwav_uint64 dataChunkDataSizeTargetWrite; - drwav_bool32 isSequentialWrite; - drwav_metadata_type allowedMetadataTypes; - drwav_metadata* pMetadata; - drwav_uint32 metadataCount; - drwav__memory_stream memoryStream; - drwav__memory_stream_write memoryStreamWrite; - struct - { - drwav_uint32 bytesRemainingInBlock; - drwav_uint16 predictor[2]; - drwav_int32 delta[2]; - drwav_int32 cachedFrames[4]; - drwav_uint32 cachedFrameCount; - drwav_int32 prevFrames[2][2]; - } msadpcm; - struct - { - drwav_uint32 bytesRemainingInBlock; - drwav_int32 predictor[2]; - drwav_int32 stepIndex[2]; - drwav_int32 cachedFrames[16]; - drwav_uint32 cachedFrameCount; - } ima; -} drwav; -DRWAV_API drwav_bool32 drwav_init(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_ex(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, drwav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_with_metadata(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_write(drwav* pWav, const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_write_sequential(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_write_proc onWrite, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_write_sequential_pcm_frames(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, drwav_write_proc onWrite, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_write_with_metadata(drwav* pWav, const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks, drwav_metadata* pMetadata, drwav_uint32 metadataCount); -DRWAV_API drwav_uint64 drwav_target_write_size_bytes(const drwav_data_format* pFormat, drwav_uint64 totalFrameCount, drwav_metadata* pMetadata, drwav_uint32 metadataCount); -DRWAV_API drwav_metadata* drwav_take_ownership_of_metadata(drwav* pWav); -DRWAV_API drwav_result drwav_uninit(drwav* pWav); -DRWAV_API size_t drwav_read_raw(drwav* pWav, size_t bytesToRead, void* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_le(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_be(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut); -DRWAV_API drwav_bool32 drwav_seek_to_pcm_frame(drwav* pWav, drwav_uint64 targetFrameIndex); -DRWAV_API drwav_result drwav_get_cursor_in_pcm_frames(drwav* pWav, drwav_uint64* pCursor); -DRWAV_API drwav_result drwav_get_length_in_pcm_frames(drwav* pWav, drwav_uint64* pLength); -DRWAV_API size_t drwav_write_raw(drwav* pWav, size_t bytesToWrite, const void* pData); -DRWAV_API drwav_uint64 drwav_write_pcm_frames(drwav* pWav, drwav_uint64 framesToWrite, const void* pData); -DRWAV_API drwav_uint64 drwav_write_pcm_frames_le(drwav* pWav, drwav_uint64 framesToWrite, const void* pData); -DRWAV_API drwav_uint64 drwav_write_pcm_frames_be(drwav* pWav, drwav_uint64 framesToWrite, const void* pData); -#ifndef DR_WAV_NO_CONVERSION_API -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16le(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16be(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut); -DRWAV_API void drwav_u8_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_s24_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_s32_to_s16(drwav_int16* pOut, const drwav_int32* pIn, size_t sampleCount); -DRWAV_API void drwav_f32_to_s16(drwav_int16* pOut, const float* pIn, size_t sampleCount); -DRWAV_API void drwav_f64_to_s16(drwav_int16* pOut, const double* pIn, size_t sampleCount); -DRWAV_API void drwav_alaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_mulaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32le(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32be(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut); -DRWAV_API void drwav_u8_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_s16_to_f32(float* pOut, const drwav_int16* pIn, size_t sampleCount); -DRWAV_API void drwav_s24_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_s32_to_f32(float* pOut, const drwav_int32* pIn, size_t sampleCount); -DRWAV_API void drwav_f64_to_f32(float* pOut, const double* pIn, size_t sampleCount); -DRWAV_API void drwav_alaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_mulaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32le(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut); -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32be(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut); -DRWAV_API void drwav_u8_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_s16_to_s32(drwav_int32* pOut, const drwav_int16* pIn, size_t sampleCount); -DRWAV_API void drwav_s24_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_f32_to_s32(drwav_int32* pOut, const float* pIn, size_t sampleCount); -DRWAV_API void drwav_f64_to_s32(drwav_int32* pOut, const double* pIn, size_t sampleCount); -DRWAV_API void drwav_alaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); -DRWAV_API void drwav_mulaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); -#endif -#ifndef DR_WAV_NO_STDIO -DRWAV_API drwav_bool32 drwav_init_file(drwav* pWav, const char* filename, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_ex(drwav* pWav, const char* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_w(drwav* pWav, const wchar_t* filename, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_ex_w(drwav* pWav, const wchar_t* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_with_metadata(drwav* pWav, const char* filename, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_with_metadata_w(drwav* pWav, const wchar_t* filename, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_write(drwav* pWav, const char* filename, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_write_sequential(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_write_w(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_write_sequential_w(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames_w(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks* pAllocationCallbacks); -#endif -DRWAV_API drwav_bool32 drwav_init_memory(drwav* pWav, const void* data, size_t dataSize, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_memory_ex(drwav* pWav, const void* data, size_t dataSize, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_memory_with_metadata(drwav* pWav, const void* data, size_t dataSize, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_memory_write(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_memory_write_sequential(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_bool32 drwav_init_memory_write_sequential_pcm_frames(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks* pAllocationCallbacks); -#ifndef DR_WAV_NO_CONVERSION_API -DRWAV_API drwav_int16* drwav_open_and_read_pcm_frames_s16(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API float* drwav_open_and_read_pcm_frames_f32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_int32* drwav_open_and_read_pcm_frames_s32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -#ifndef DR_WAV_NO_STDIO -DRWAV_API drwav_int16* drwav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API float* drwav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_int16* drwav_open_file_and_read_pcm_frames_s16_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API float* drwav_open_file_and_read_pcm_frames_f32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -#endif -DRWAV_API drwav_int16* drwav_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API float* drwav_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_int32* drwav_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks); -#endif -DRWAV_API void drwav_free(void* p, const drwav_allocation_callbacks* pAllocationCallbacks); -DRWAV_API drwav_uint16 drwav_bytes_to_u16(const drwav_uint8* data); -DRWAV_API drwav_int16 drwav_bytes_to_s16(const drwav_uint8* data); -DRWAV_API drwav_uint32 drwav_bytes_to_u32(const drwav_uint8* data); -DRWAV_API drwav_int32 drwav_bytes_to_s32(const drwav_uint8* data); -DRWAV_API drwav_uint64 drwav_bytes_to_u64(const drwav_uint8* data); -DRWAV_API drwav_int64 drwav_bytes_to_s64(const drwav_uint8* data); -DRWAV_API float drwav_bytes_to_f32(const drwav_uint8* data); -DRWAV_API drwav_bool32 drwav_guid_equal(const drwav_uint8 a[16], const drwav_uint8 b[16]); -DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8* a, const char* b); -#ifdef __cplusplus -} -#endif -#endif -/* dr_wav_h end */ -#endif /* MA_NO_WAV */ - -#if !defined(MA_NO_FLAC) && !defined(MA_NO_DECODING) -/* dr_flac_h begin */ -#ifndef dr_flac_h -#define dr_flac_h -#ifdef __cplusplus -extern "C" { -#endif -#define DRFLAC_STRINGIFY(x) #x -#define DRFLAC_XSTRINGIFY(x) DRFLAC_STRINGIFY(x) -#define DRFLAC_VERSION_MAJOR 0 -#define DRFLAC_VERSION_MINOR 12 -#define DRFLAC_VERSION_REVISION 38 -#define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION) -#include -typedef signed char drflac_int8; -typedef unsigned char drflac_uint8; -typedef signed short drflac_int16; -typedef unsigned short drflac_uint16; -typedef signed int drflac_int32; -typedef unsigned int drflac_uint32; -#if defined(_MSC_VER) && !defined(__clang__) - typedef signed __int64 drflac_int64; - typedef unsigned __int64 drflac_uint64; -#else - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wlong-long" - #if defined(__clang__) - #pragma GCC diagnostic ignored "-Wc++11-long-long" - #endif - #endif - typedef signed long long drflac_int64; - typedef unsigned long long drflac_uint64; - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic pop - #endif -#endif -#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__) - typedef drflac_uint64 drflac_uintptr; -#else - typedef drflac_uint32 drflac_uintptr; -#endif -typedef drflac_uint8 drflac_bool8; -typedef drflac_uint32 drflac_bool32; -#define DRFLAC_TRUE 1 -#define DRFLAC_FALSE 0 -#if !defined(DRFLAC_API) - #if defined(DRFLAC_DLL) - #if defined(_WIN32) - #define DRFLAC_DLL_IMPORT __declspec(dllimport) - #define DRFLAC_DLL_EXPORT __declspec(dllexport) - #define DRFLAC_DLL_PRIVATE static - #else - #if defined(__GNUC__) && __GNUC__ >= 4 - #define DRFLAC_DLL_IMPORT __attribute__((visibility("default"))) - #define DRFLAC_DLL_EXPORT __attribute__((visibility("default"))) - #define DRFLAC_DLL_PRIVATE __attribute__((visibility("hidden"))) - #else - #define DRFLAC_DLL_IMPORT - #define DRFLAC_DLL_EXPORT - #define DRFLAC_DLL_PRIVATE static - #endif - #endif - #if defined(DR_FLAC_IMPLEMENTATION) || defined(DRFLAC_IMPLEMENTATION) - #define DRFLAC_API DRFLAC_DLL_EXPORT - #else - #define DRFLAC_API DRFLAC_DLL_IMPORT - #endif - #define DRFLAC_PRIVATE DRFLAC_DLL_PRIVATE - #else - #define DRFLAC_API extern - #define DRFLAC_PRIVATE static - #endif -#endif -#if defined(_MSC_VER) && _MSC_VER >= 1700 - #define DRFLAC_DEPRECATED __declspec(deprecated) -#elif (defined(__GNUC__) && __GNUC__ >= 4) - #define DRFLAC_DEPRECATED __attribute__((deprecated)) -#elif defined(__has_feature) - #if __has_feature(attribute_deprecated) - #define DRFLAC_DEPRECATED __attribute__((deprecated)) - #else - #define DRFLAC_DEPRECATED - #endif -#else - #define DRFLAC_DEPRECATED -#endif -DRFLAC_API void drflac_version(drflac_uint32* pMajor, drflac_uint32* pMinor, drflac_uint32* pRevision); -DRFLAC_API const char* drflac_version_string(void); -#ifndef DR_FLAC_BUFFER_SIZE -#define DR_FLAC_BUFFER_SIZE 4096 -#endif -#if defined(_WIN64) || defined(_LP64) || defined(__LP64__) -#define DRFLAC_64BIT -#endif -#ifdef DRFLAC_64BIT -typedef drflac_uint64 drflac_cache_t; -#else -typedef drflac_uint32 drflac_cache_t; -#endif -#define DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO 0 -#define DRFLAC_METADATA_BLOCK_TYPE_PADDING 1 -#define DRFLAC_METADATA_BLOCK_TYPE_APPLICATION 2 -#define DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE 3 -#define DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT 4 -#define DRFLAC_METADATA_BLOCK_TYPE_CUESHEET 5 -#define DRFLAC_METADATA_BLOCK_TYPE_PICTURE 6 -#define DRFLAC_METADATA_BLOCK_TYPE_INVALID 127 -#define DRFLAC_PICTURE_TYPE_OTHER 0 -#define DRFLAC_PICTURE_TYPE_FILE_ICON 1 -#define DRFLAC_PICTURE_TYPE_OTHER_FILE_ICON 2 -#define DRFLAC_PICTURE_TYPE_COVER_FRONT 3 -#define DRFLAC_PICTURE_TYPE_COVER_BACK 4 -#define DRFLAC_PICTURE_TYPE_LEAFLET_PAGE 5 -#define DRFLAC_PICTURE_TYPE_MEDIA 6 -#define DRFLAC_PICTURE_TYPE_LEAD_ARTIST 7 -#define DRFLAC_PICTURE_TYPE_ARTIST 8 -#define DRFLAC_PICTURE_TYPE_CONDUCTOR 9 -#define DRFLAC_PICTURE_TYPE_BAND 10 -#define DRFLAC_PICTURE_TYPE_COMPOSER 11 -#define DRFLAC_PICTURE_TYPE_LYRICIST 12 -#define DRFLAC_PICTURE_TYPE_RECORDING_LOCATION 13 -#define DRFLAC_PICTURE_TYPE_DURING_RECORDING 14 -#define DRFLAC_PICTURE_TYPE_DURING_PERFORMANCE 15 -#define DRFLAC_PICTURE_TYPE_SCREEN_CAPTURE 16 -#define DRFLAC_PICTURE_TYPE_BRIGHT_COLORED_FISH 17 -#define DRFLAC_PICTURE_TYPE_ILLUSTRATION 18 -#define DRFLAC_PICTURE_TYPE_BAND_LOGOTYPE 19 -#define DRFLAC_PICTURE_TYPE_PUBLISHER_LOGOTYPE 20 -typedef enum -{ - drflac_container_native, - drflac_container_ogg, - drflac_container_unknown -} drflac_container; -typedef enum -{ - drflac_seek_origin_start, - drflac_seek_origin_current -} drflac_seek_origin; -#pragma pack(2) -typedef struct -{ - drflac_uint64 firstPCMFrame; - drflac_uint64 flacFrameOffset; - drflac_uint16 pcmFrameCount; -} drflac_seekpoint; -#pragma pack() -typedef struct -{ - drflac_uint16 minBlockSizeInPCMFrames; - drflac_uint16 maxBlockSizeInPCMFrames; - drflac_uint32 minFrameSizeInPCMFrames; - drflac_uint32 maxFrameSizeInPCMFrames; - drflac_uint32 sampleRate; - drflac_uint8 channels; - drflac_uint8 bitsPerSample; - drflac_uint64 totalPCMFrameCount; - drflac_uint8 md5[16]; -} drflac_streaminfo; -typedef struct -{ - drflac_uint32 type; - const void* pRawData; - drflac_uint32 rawDataSize; - union - { - drflac_streaminfo streaminfo; - struct - { - int unused; - } padding; - struct - { - drflac_uint32 id; - const void* pData; - drflac_uint32 dataSize; - } application; - struct - { - drflac_uint32 seekpointCount; - const drflac_seekpoint* pSeekpoints; - } seektable; - struct - { - drflac_uint32 vendorLength; - const char* vendor; - drflac_uint32 commentCount; - const void* pComments; - } vorbis_comment; - struct - { - char catalog[128]; - drflac_uint64 leadInSampleCount; - drflac_bool32 isCD; - drflac_uint8 trackCount; - const void* pTrackData; - } cuesheet; - struct - { - drflac_uint32 type; - drflac_uint32 mimeLength; - const char* mime; - drflac_uint32 descriptionLength; - const char* description; - drflac_uint32 width; - drflac_uint32 height; - drflac_uint32 colorDepth; - drflac_uint32 indexColorCount; - drflac_uint32 pictureDataSize; - const drflac_uint8* pPictureData; - } picture; - } data; -} drflac_metadata; -typedef size_t (* drflac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); -typedef drflac_bool32 (* drflac_seek_proc)(void* pUserData, int offset, drflac_seek_origin origin); -typedef void (* drflac_meta_proc)(void* pUserData, drflac_metadata* pMetadata); -typedef struct -{ - void* pUserData; - void* (* onMalloc)(size_t sz, void* pUserData); - void* (* onRealloc)(void* p, size_t sz, void* pUserData); - void (* onFree)(void* p, void* pUserData); -} drflac_allocation_callbacks; -typedef struct -{ - const drflac_uint8* data; - size_t dataSize; - size_t currentReadPos; -} drflac__memory_stream; -typedef struct -{ - drflac_read_proc onRead; - drflac_seek_proc onSeek; - void* pUserData; - size_t unalignedByteCount; - drflac_cache_t unalignedCache; - drflac_uint32 nextL2Line; - drflac_uint32 consumedBits; - drflac_cache_t cacheL2[DR_FLAC_BUFFER_SIZE/sizeof(drflac_cache_t)]; - drflac_cache_t cache; - drflac_uint16 crc16; - drflac_cache_t crc16Cache; - drflac_uint32 crc16CacheIgnoredBytes; -} drflac_bs; -typedef struct -{ - drflac_uint8 subframeType; - drflac_uint8 wastedBitsPerSample; - drflac_uint8 lpcOrder; - drflac_int32* pSamplesS32; -} drflac_subframe; -typedef struct -{ - drflac_uint64 pcmFrameNumber; - drflac_uint32 flacFrameNumber; - drflac_uint32 sampleRate; - drflac_uint16 blockSizeInPCMFrames; - drflac_uint8 channelAssignment; - drflac_uint8 bitsPerSample; - drflac_uint8 crc8; -} drflac_frame_header; -typedef struct -{ - drflac_frame_header header; - drflac_uint32 pcmFramesRemaining; - drflac_subframe subframes[8]; -} drflac_frame; -typedef struct -{ - drflac_meta_proc onMeta; - void* pUserDataMD; - drflac_allocation_callbacks allocationCallbacks; - drflac_uint32 sampleRate; - drflac_uint8 channels; - drflac_uint8 bitsPerSample; - drflac_uint16 maxBlockSizeInPCMFrames; - drflac_uint64 totalPCMFrameCount; - drflac_container container; - drflac_uint32 seekpointCount; - drflac_frame currentFLACFrame; - drflac_uint64 currentPCMFrame; - drflac_uint64 firstFLACFramePosInBytes; - drflac__memory_stream memoryStream; - drflac_int32* pDecodedSamples; - drflac_seekpoint* pSeekpoints; - void* _oggbs; - drflac_bool32 _noSeekTableSeek : 1; - drflac_bool32 _noBinarySearchSeek : 1; - drflac_bool32 _noBruteForceSeek : 1; - drflac_bs bs; - drflac_uint8 pExtraData[1]; -} drflac; -DRFLAC_API drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API void drflac_close(drflac* pFlac); -DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 framesToRead, drflac_int32* pBufferOut); -DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 framesToRead, drflac_int16* pBufferOut); -DRFLAC_API drflac_uint64 drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut); -DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex); -#ifndef DR_FLAC_NO_STDIO -DRFLAC_API drflac* drflac_open_file(const char* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_file_w(const wchar_t* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_file_with_metadata(const char* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_file_with_metadata_w(const wchar_t* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -#endif -DRFLAC_API drflac* drflac_open_memory(const void* pData, size_t dataSize, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac* drflac_open_memory_with_metadata(const void* pData, size_t dataSize, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac_int32* drflac_open_and_read_pcm_frames_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -#ifndef DR_FLAC_NO_STDIO -DRFLAC_API drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -#endif -DRFLAC_API drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API drflac_int16* drflac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API float* drflac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); -DRFLAC_API void drflac_free(void* p, const drflac_allocation_callbacks* pAllocationCallbacks); -typedef struct -{ - drflac_uint32 countRemaining; - const char* pRunningData; -} drflac_vorbis_comment_iterator; -DRFLAC_API void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, drflac_uint32 commentCount, const void* pComments); -DRFLAC_API const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, drflac_uint32* pCommentLengthOut); -typedef struct -{ - drflac_uint32 countRemaining; - const char* pRunningData; -} drflac_cuesheet_track_iterator; -#pragma pack(4) -typedef struct -{ - drflac_uint64 offset; - drflac_uint8 index; - drflac_uint8 reserved[3]; -} drflac_cuesheet_track_index; -#pragma pack() -typedef struct -{ - drflac_uint64 offset; - drflac_uint8 trackNumber; - char ISRC[12]; - drflac_bool8 isAudio; - drflac_bool8 preEmphasis; - drflac_uint8 indexCount; - const drflac_cuesheet_track_index* pIndexPoints; -} drflac_cuesheet_track; -DRFLAC_API void drflac_init_cuesheet_track_iterator(drflac_cuesheet_track_iterator* pIter, drflac_uint32 trackCount, const void* pTrackData); -DRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, drflac_cuesheet_track* pCuesheetTrack); -#ifdef __cplusplus -} -#endif -#endif -/* dr_flac_h end */ -#endif /* MA_NO_FLAC */ - -#if !defined(MA_NO_MP3) && !defined(MA_NO_DECODING) -/* dr_mp3_h begin */ -#ifndef dr_mp3_h -#define dr_mp3_h -#ifdef __cplusplus -extern "C" { -#endif -#define DRMP3_STRINGIFY(x) #x -#define DRMP3_XSTRINGIFY(x) DRMP3_STRINGIFY(x) -#define DRMP3_VERSION_MAJOR 0 -#define DRMP3_VERSION_MINOR 6 -#define DRMP3_VERSION_REVISION 33 -#define DRMP3_VERSION_STRING DRMP3_XSTRINGIFY(DRMP3_VERSION_MAJOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_MINOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_REVISION) -#include -typedef signed char drmp3_int8; -typedef unsigned char drmp3_uint8; -typedef signed short drmp3_int16; -typedef unsigned short drmp3_uint16; -typedef signed int drmp3_int32; -typedef unsigned int drmp3_uint32; -#if defined(_MSC_VER) && !defined(__clang__) - typedef signed __int64 drmp3_int64; - typedef unsigned __int64 drmp3_uint64; -#else - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wlong-long" - #if defined(__clang__) - #pragma GCC diagnostic ignored "-Wc++11-long-long" - #endif - #endif - typedef signed long long drmp3_int64; - typedef unsigned long long drmp3_uint64; - #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic pop - #endif -#endif -#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__) - typedef drmp3_uint64 drmp3_uintptr; -#else - typedef drmp3_uint32 drmp3_uintptr; -#endif -typedef drmp3_uint8 drmp3_bool8; -typedef drmp3_uint32 drmp3_bool32; -#define DRMP3_TRUE 1 -#define DRMP3_FALSE 0 -#if !defined(DRMP3_API) - #if defined(DRMP3_DLL) - #if defined(_WIN32) - #define DRMP3_DLL_IMPORT __declspec(dllimport) - #define DRMP3_DLL_EXPORT __declspec(dllexport) - #define DRMP3_DLL_PRIVATE static - #else - #if defined(__GNUC__) && __GNUC__ >= 4 - #define DRMP3_DLL_IMPORT __attribute__((visibility("default"))) - #define DRMP3_DLL_EXPORT __attribute__((visibility("default"))) - #define DRMP3_DLL_PRIVATE __attribute__((visibility("hidden"))) - #else - #define DRMP3_DLL_IMPORT - #define DRMP3_DLL_EXPORT - #define DRMP3_DLL_PRIVATE static - #endif - #endif - #if defined(DR_MP3_IMPLEMENTATION) || defined(DRMP3_IMPLEMENTATION) - #define DRMP3_API DRMP3_DLL_EXPORT - #else - #define DRMP3_API DRMP3_DLL_IMPORT - #endif - #define DRMP3_PRIVATE DRMP3_DLL_PRIVATE - #else - #define DRMP3_API extern - #define DRMP3_PRIVATE static - #endif -#endif -typedef drmp3_int32 drmp3_result; -#define DRMP3_SUCCESS 0 -#define DRMP3_ERROR -1 -#define DRMP3_INVALID_ARGS -2 -#define DRMP3_INVALID_OPERATION -3 -#define DRMP3_OUT_OF_MEMORY -4 -#define DRMP3_OUT_OF_RANGE -5 -#define DRMP3_ACCESS_DENIED -6 -#define DRMP3_DOES_NOT_EXIST -7 -#define DRMP3_ALREADY_EXISTS -8 -#define DRMP3_TOO_MANY_OPEN_FILES -9 -#define DRMP3_INVALID_FILE -10 -#define DRMP3_TOO_BIG -11 -#define DRMP3_PATH_TOO_LONG -12 -#define DRMP3_NAME_TOO_LONG -13 -#define DRMP3_NOT_DIRECTORY -14 -#define DRMP3_IS_DIRECTORY -15 -#define DRMP3_DIRECTORY_NOT_EMPTY -16 -#define DRMP3_END_OF_FILE -17 -#define DRMP3_NO_SPACE -18 -#define DRMP3_BUSY -19 -#define DRMP3_IO_ERROR -20 -#define DRMP3_INTERRUPT -21 -#define DRMP3_UNAVAILABLE -22 -#define DRMP3_ALREADY_IN_USE -23 -#define DRMP3_BAD_ADDRESS -24 -#define DRMP3_BAD_SEEK -25 -#define DRMP3_BAD_PIPE -26 -#define DRMP3_DEADLOCK -27 -#define DRMP3_TOO_MANY_LINKS -28 -#define DRMP3_NOT_IMPLEMENTED -29 -#define DRMP3_NO_MESSAGE -30 -#define DRMP3_BAD_MESSAGE -31 -#define DRMP3_NO_DATA_AVAILABLE -32 -#define DRMP3_INVALID_DATA -33 -#define DRMP3_TIMEOUT -34 -#define DRMP3_NO_NETWORK -35 -#define DRMP3_NOT_UNIQUE -36 -#define DRMP3_NOT_SOCKET -37 -#define DRMP3_NO_ADDRESS -38 -#define DRMP3_BAD_PROTOCOL -39 -#define DRMP3_PROTOCOL_UNAVAILABLE -40 -#define DRMP3_PROTOCOL_NOT_SUPPORTED -41 -#define DRMP3_PROTOCOL_FAMILY_NOT_SUPPORTED -42 -#define DRMP3_ADDRESS_FAMILY_NOT_SUPPORTED -43 -#define DRMP3_SOCKET_NOT_SUPPORTED -44 -#define DRMP3_CONNECTION_RESET -45 -#define DRMP3_ALREADY_CONNECTED -46 -#define DRMP3_NOT_CONNECTED -47 -#define DRMP3_CONNECTION_REFUSED -48 -#define DRMP3_NO_HOST -49 -#define DRMP3_IN_PROGRESS -50 -#define DRMP3_CANCELLED -51 -#define DRMP3_MEMORY_ALREADY_MAPPED -52 -#define DRMP3_AT_END -53 -#define DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152 -#define DRMP3_MAX_SAMPLES_PER_FRAME (DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2) -#ifdef _MSC_VER - #define DRMP3_INLINE __forceinline -#elif defined(__GNUC__) - #if defined(__STRICT_ANSI__) - #define DRMP3_GNUC_INLINE_HINT __inline__ - #else - #define DRMP3_GNUC_INLINE_HINT inline - #endif - #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__) - #define DRMP3_INLINE DRMP3_GNUC_INLINE_HINT __attribute__((always_inline)) - #else - #define DRMP3_INLINE DRMP3_GNUC_INLINE_HINT - #endif -#elif defined(__WATCOMC__) - #define DRMP3_INLINE __inline -#else - #define DRMP3_INLINE -#endif -DRMP3_API void drmp3_version(drmp3_uint32* pMajor, drmp3_uint32* pMinor, drmp3_uint32* pRevision); -DRMP3_API const char* drmp3_version_string(void); -typedef struct -{ - int frame_bytes, channels, hz, layer, bitrate_kbps; -} drmp3dec_frame_info; -typedef struct -{ - float mdct_overlap[2][9*32], qmf_state[15*2*32]; - int reserv, free_format_bytes; - drmp3_uint8 header[4], reserv_buf[511]; -} drmp3dec; -DRMP3_API void drmp3dec_init(drmp3dec *dec); -DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info); -DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num_samples); -typedef enum -{ - drmp3_seek_origin_start, - drmp3_seek_origin_current -} drmp3_seek_origin; -typedef struct -{ - drmp3_uint64 seekPosInBytes; - drmp3_uint64 pcmFrameIndex; - drmp3_uint16 mp3FramesToDiscard; - drmp3_uint16 pcmFramesToDiscard; -} drmp3_seek_point; -typedef size_t (* drmp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); -typedef drmp3_bool32 (* drmp3_seek_proc)(void* pUserData, int offset, drmp3_seek_origin origin); -typedef struct -{ - void* pUserData; - void* (* onMalloc)(size_t sz, void* pUserData); - void* (* onRealloc)(void* p, size_t sz, void* pUserData); - void (* onFree)(void* p, void* pUserData); -} drmp3_allocation_callbacks; -typedef struct -{ - drmp3_uint32 channels; - drmp3_uint32 sampleRate; -} drmp3_config; -typedef struct -{ - drmp3dec decoder; - drmp3dec_frame_info frameInfo; - drmp3_uint32 channels; - drmp3_uint32 sampleRate; - drmp3_read_proc onRead; - drmp3_seek_proc onSeek; - void* pUserData; - drmp3_allocation_callbacks allocationCallbacks; - drmp3_uint32 mp3FrameChannels; - drmp3_uint32 mp3FrameSampleRate; - drmp3_uint32 pcmFramesConsumedInMP3Frame; - drmp3_uint32 pcmFramesRemainingInMP3Frame; - drmp3_uint8 pcmFrames[sizeof(float)*DRMP3_MAX_SAMPLES_PER_FRAME]; - drmp3_uint64 currentPCMFrame; - drmp3_uint64 streamCursor; - drmp3_seek_point* pSeekPoints; - drmp3_uint32 seekPointCount; - size_t dataSize; - size_t dataCapacity; - size_t dataConsumed; - drmp3_uint8* pData; - drmp3_bool32 atEnd : 1; - struct - { - const drmp3_uint8* pData; - size_t dataSize; - size_t currentReadPos; - } memory; -} drmp3; -DRMP3_API drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks); -DRMP3_API drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_allocation_callbacks* pAllocationCallbacks); -#ifndef DR_MP3_NO_STDIO -DRMP3_API drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks); -DRMP3_API drmp3_bool32 drmp3_init_file_w(drmp3* pMP3, const wchar_t* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks); -#endif -DRMP3_API void drmp3_uninit(drmp3* pMP3); -DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut); -DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut); -DRMP3_API drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex); -DRMP3_API drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3); -DRMP3_API drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3); -DRMP3_API drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount); -DRMP3_API drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints); -DRMP3_API drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints); -DRMP3_API float* drmp3_open_and_read_pcm_frames_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks); -DRMP3_API drmp3_int16* drmp3_open_and_read_pcm_frames_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks); -DRMP3_API float* drmp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks); -DRMP3_API drmp3_int16* drmp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks); -#ifndef DR_MP3_NO_STDIO -DRMP3_API float* drmp3_open_file_and_read_pcm_frames_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks); -DRMP3_API drmp3_int16* drmp3_open_file_and_read_pcm_frames_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks); -#endif -DRMP3_API void* drmp3_malloc(size_t sz, const drmp3_allocation_callbacks* pAllocationCallbacks); -DRMP3_API void drmp3_free(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks); -#ifdef __cplusplus -} -#endif -#endif -/* dr_mp3_h end */ -#endif /* MA_NO_MP3 */ - - -/************************************************************************************************************************************************************** - -Decoding - -**************************************************************************************************************************************************************/ -#ifndef MA_NO_DECODING - -static ma_result ma_decoder_read_bytes(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead) -{ - MA_ASSERT(pDecoder != NULL); - - return pDecoder->onRead(pDecoder, pBufferOut, bytesToRead, pBytesRead); -} - -static ma_result ma_decoder_seek_bytes(ma_decoder* pDecoder, ma_int64 byteOffset, ma_seek_origin origin) -{ - MA_ASSERT(pDecoder != NULL); - - return pDecoder->onSeek(pDecoder, byteOffset, origin); -} - -static ma_result ma_decoder_tell_bytes(ma_decoder* pDecoder, ma_int64* pCursor) -{ - MA_ASSERT(pDecoder != NULL); - - if (pDecoder->onTell == NULL) { - return MA_NOT_IMPLEMENTED; - } - - return pDecoder->onTell(pDecoder, pCursor); -} - - -MA_API ma_decoding_backend_config ma_decoding_backend_config_init(ma_format preferredFormat, ma_uint32 seekPointCount) -{ - ma_decoding_backend_config config; - - MA_ZERO_OBJECT(&config); - config.preferredFormat = preferredFormat; - config.seekPointCount = seekPointCount; - - return config; -} - - -MA_API ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate) -{ - ma_decoder_config config; - MA_ZERO_OBJECT(&config); - config.format = outputFormat; - config.channels = outputChannels; - config.sampleRate = outputSampleRate; - config.resampling = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); /* Format/channels/rate doesn't matter here. */ - config.encodingFormat = ma_encoding_format_unknown; - - /* Note that we are intentionally leaving the channel map empty here which will cause the default channel map to be used. */ - - return config; -} - -MA_API ma_decoder_config ma_decoder_config_init_default() -{ - return ma_decoder_config_init(ma_format_unknown, 0, 0); -} - -MA_API ma_decoder_config ma_decoder_config_init_copy(const ma_decoder_config* pConfig) -{ - ma_decoder_config config; - if (pConfig != NULL) { - config = *pConfig; - } else { - MA_ZERO_OBJECT(&config); - } - - return config; -} - -static ma_result ma_decoder__init_data_converter(ma_decoder* pDecoder, const ma_decoder_config* pConfig) -{ - ma_result result; - ma_data_converter_config converterConfig; - ma_format internalFormat; - ma_uint32 internalChannels; - ma_uint32 internalSampleRate; - ma_channel internalChannelMap[MA_MAX_CHANNELS]; - - MA_ASSERT(pDecoder != NULL); - MA_ASSERT(pConfig != NULL); - - result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, &internalSampleRate, internalChannelMap, ma_countof(internalChannelMap)); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the internal data format. */ - } - - - /* Make sure we're not asking for too many channels. */ - if (pConfig->channels > MA_MAX_CHANNELS) { - return MA_INVALID_ARGS; - } - - /* The internal channels should have already been validated at a higher level, but we'll do it again explicitly here for safety. */ - if (internalChannels > MA_MAX_CHANNELS) { - return MA_INVALID_ARGS; - } - - - /* Output format. */ - if (pConfig->format == ma_format_unknown) { - pDecoder->outputFormat = internalFormat; - } else { - pDecoder->outputFormat = pConfig->format; - } - - if (pConfig->channels == 0) { - pDecoder->outputChannels = internalChannels; - } else { - pDecoder->outputChannels = pConfig->channels; - } - - if (pConfig->sampleRate == 0) { - pDecoder->outputSampleRate = internalSampleRate; - } else { - pDecoder->outputSampleRate = pConfig->sampleRate; - } - - converterConfig = ma_data_converter_config_init( - internalFormat, pDecoder->outputFormat, - internalChannels, pDecoder->outputChannels, - internalSampleRate, pDecoder->outputSampleRate - ); - converterConfig.pChannelMapIn = internalChannelMap; - converterConfig.pChannelMapOut = pConfig->pChannelMap; - converterConfig.channelMixMode = pConfig->channelMixMode; - converterConfig.ditherMode = pConfig->ditherMode; - converterConfig.allowDynamicSampleRate = MA_FALSE; /* Never allow dynamic sample rate conversion. Setting this to true will disable passthrough optimizations. */ - converterConfig.resampling = pConfig->resampling; - - result = ma_data_converter_init(&converterConfig, &pDecoder->allocationCallbacks, &pDecoder->converter); - if (result != MA_SUCCESS) { - return result; - } - - /* - Now that we have the decoder we need to determine whether or not we need a heap-allocated cache. We'll - need this if the data converter does not support calculation of the required input frame count. To - determine support for this we'll just run a test. - */ - { - ma_uint64 unused; - - result = ma_data_converter_get_required_input_frame_count(&pDecoder->converter, 1, &unused); - if (result != MA_SUCCESS) { - /* - We were unable to calculate the required input frame count which means we'll need to use - a heap-allocated cache. - */ - ma_uint64 inputCacheCapSizeInBytes; - - pDecoder->inputCacheCap = MA_DATA_CONVERTER_STACK_BUFFER_SIZE / ma_get_bytes_per_frame(internalFormat, internalChannels); - - /* Not strictly necessary, but keeping here for safety in case we change the default value of pDecoder->inputCacheCap. */ - inputCacheCapSizeInBytes = pDecoder->inputCacheCap * ma_get_bytes_per_frame(internalFormat, internalChannels); - if (inputCacheCapSizeInBytes > MA_SIZE_MAX) { - ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - pDecoder->pInputCache = ma_malloc((size_t)inputCacheCapSizeInBytes, &pDecoder->allocationCallbacks); /* Safe cast to size_t. */ - if (pDecoder->pInputCache == NULL) { - ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - } - } - - return MA_SUCCESS; -} - - - -static ma_result ma_decoder_internal_on_read__custom(void* pUserData, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead) -{ - ma_decoder* pDecoder = (ma_decoder*)pUserData; - MA_ASSERT(pDecoder != NULL); - - return ma_decoder_read_bytes(pDecoder, pBufferOut, bytesToRead, pBytesRead); -} - -static ma_result ma_decoder_internal_on_seek__custom(void* pUserData, ma_int64 offset, ma_seek_origin origin) -{ - ma_decoder* pDecoder = (ma_decoder*)pUserData; - MA_ASSERT(pDecoder != NULL); - - return ma_decoder_seek_bytes(pDecoder, offset, origin); -} - -static ma_result ma_decoder_internal_on_tell__custom(void* pUserData, ma_int64* pCursor) -{ - ma_decoder* pDecoder = (ma_decoder*)pUserData; - MA_ASSERT(pDecoder != NULL); - - return ma_decoder_tell_bytes(pDecoder, pCursor); -} - - -static ma_result ma_decoder_init_from_vtable(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - ma_decoding_backend_config backendConfig; - ma_data_source* pBackend; - - MA_ASSERT(pVTable != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); - - if (pVTable->onInit == NULL) { - return MA_NOT_IMPLEMENTED; - } - - backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount); - - result = pVTable->onInit(pVTableUserData, ma_decoder_internal_on_read__custom, ma_decoder_internal_on_seek__custom, ma_decoder_internal_on_tell__custom, pDecoder, &backendConfig, &pDecoder->allocationCallbacks, &pBackend); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the backend from this vtable. */ - } - - /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */ - pDecoder->pBackend = pBackend; - pDecoder->pBackendVTable = pVTable; - pDecoder->pBackendUserData = pConfig->pCustomBackendUserData; - - return MA_SUCCESS; -} - - - -static ma_result ma_decoder_init_custom__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result = MA_NO_BACKEND; - size_t ivtable; - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); - - if (pConfig->ppCustomBackendVTables == NULL) { - return MA_NO_BACKEND; - } - - /* The order each backend is listed is what defines the priority. */ - for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) { - const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable]; - if (pVTable != NULL && pVTable->onInit != NULL) { - result = ma_decoder_init_from_vtable(pVTable, pConfig->pCustomBackendUserData, pConfig, pDecoder); - if (result == MA_SUCCESS) { - return MA_SUCCESS; - } else { - /* Initialization failed. Move on to the next one, but seek back to the start first so the next vtable starts from the first byte of the file. */ - result = ma_decoder_seek_bytes(pDecoder, 0, ma_seek_origin_start); - if (result != MA_SUCCESS) { - return result; /* Failed to seek back to the start. */ - } - } - } else { - /* No vtable. */ - } - } - - /* Getting here means we couldn't find a backend. */ - return MA_NO_BACKEND; -} - - -/* WAV */ -#ifdef dr_wav_h -#define MA_HAS_WAV - -typedef struct -{ - ma_data_source_base ds; - ma_read_proc onRead; - ma_seek_proc onSeek; - ma_tell_proc onTell; - void* pReadSeekTellUserData; - ma_format format; /* Can be f32, s16 or s32. */ -#if !defined(MA_NO_WAV) - drwav dr; -#endif -} ma_wav; - -MA_API ma_result ma_wav_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav); -MA_API ma_result ma_wav_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav); -MA_API ma_result ma_wav_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav); -MA_API ma_result ma_wav_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav); -MA_API void ma_wav_uninit(ma_wav* pWav, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_wav_read_pcm_frames(ma_wav* pWav, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_wav_seek_to_pcm_frame(ma_wav* pWav, ma_uint64 frameIndex); -MA_API ma_result ma_wav_get_data_format(ma_wav* pWav, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_wav_get_cursor_in_pcm_frames(ma_wav* pWav, ma_uint64* pCursor); -MA_API ma_result ma_wav_get_length_in_pcm_frames(ma_wav* pWav, ma_uint64* pLength); - - -static ma_result ma_wav_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_wav_read_pcm_frames((ma_wav*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_wav_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_wav_seek_to_pcm_frame((ma_wav*)pDataSource, frameIndex); -} - -static ma_result ma_wav_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - return ma_wav_get_data_format((ma_wav*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -static ma_result ma_wav_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_wav_get_cursor_in_pcm_frames((ma_wav*)pDataSource, pCursor); -} - -static ma_result ma_wav_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_wav_get_length_in_pcm_frames((ma_wav*)pDataSource, pLength); -} - -static ma_data_source_vtable g_ma_wav_ds_vtable = -{ - ma_wav_ds_read, - ma_wav_ds_seek, - ma_wav_ds_get_data_format, - ma_wav_ds_get_cursor, - ma_wav_ds_get_length, - NULL, /* onSetLooping */ - 0 -}; - - -#if !defined(MA_NO_WAV) -static drwav_allocation_callbacks drwav_allocation_callbacks_from_miniaudio(const ma_allocation_callbacks* pAllocationCallbacks) -{ - drwav_allocation_callbacks callbacks; - - if (pAllocationCallbacks != NULL) { - callbacks.onMalloc = pAllocationCallbacks->onMalloc; - callbacks.onRealloc = pAllocationCallbacks->onRealloc; - callbacks.onFree = pAllocationCallbacks->onFree; - callbacks.pUserData = pAllocationCallbacks->pUserData; - } else { - callbacks.onMalloc = ma__malloc_default; - callbacks.onRealloc = ma__realloc_default; - callbacks.onFree = ma__free_default; - callbacks.pUserData = NULL; - } - - return callbacks; -} - -static size_t ma_wav_dr_callback__read(void* pUserData, void* pBufferOut, size_t bytesToRead) -{ - ma_wav* pWav = (ma_wav*)pUserData; - ma_result result; - size_t bytesRead; - - MA_ASSERT(pWav != NULL); - - result = pWav->onRead(pWav->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead); - (void)result; - - return bytesRead; -} - -static drwav_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, drwav_seek_origin origin) -{ - ma_wav* pWav = (ma_wav*)pUserData; - ma_result result; - ma_seek_origin maSeekOrigin; - - MA_ASSERT(pWav != NULL); - - maSeekOrigin = ma_seek_origin_start; - if (origin == drwav_seek_origin_current) { - maSeekOrigin = ma_seek_origin_current; - } - - result = pWav->onSeek(pWav->pReadSeekTellUserData, offset, maSeekOrigin); - if (result != MA_SUCCESS) { - return MA_FALSE; - } - - return MA_TRUE; -} -#endif - -static ma_result ma_wav_init_internal(const ma_decoding_backend_config* pConfig, ma_wav* pWav) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - if (pWav == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pWav); - pWav->format = ma_format_unknown; /* Use closest match to source file by default. */ - - if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16 || pConfig->preferredFormat == ma_format_s32)) { - pWav->format = pConfig->preferredFormat; - } else { - /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */ - } - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_wav_ds_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pWav->ds); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the base data source. */ - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_wav_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav) -{ - ma_result result; - - result = ma_wav_init_internal(pConfig, pWav); - if (result != MA_SUCCESS) { - return result; - } - - if (onRead == NULL || onSeek == NULL) { - return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */ - } - - pWav->onRead = onRead; - pWav->onSeek = onSeek; - pWav->onTell = onTell; - pWav->pReadSeekTellUserData = pReadSeekTellUserData; - - #if !defined(MA_NO_WAV) - { - drwav_allocation_callbacks wavAllocationCallbacks = drwav_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drwav_bool32 wavResult; - - wavResult = drwav_init(&pWav->dr, ma_wav_dr_callback__read, ma_wav_dr_callback__seek, pWav, &wavAllocationCallbacks); - if (wavResult != MA_TRUE) { - return MA_INVALID_FILE; - } - - /* - If an explicit format was not specified, try picking the closest match based on the internal - format. The format needs to be supported by miniaudio. - */ - if (pWav->format == ma_format_unknown) { - switch (pWav->dr.translatedFormatTag) - { - case DR_WAVE_FORMAT_PCM: - { - if (pWav->dr.bitsPerSample == 8) { - pWav->format = ma_format_u8; - } else if (pWav->dr.bitsPerSample == 16) { - pWav->format = ma_format_s16; - } else if (pWav->dr.bitsPerSample == 24) { - pWav->format = ma_format_s24; - } else if (pWav->dr.bitsPerSample == 32) { - pWav->format = ma_format_s32; - } - } break; - - case DR_WAVE_FORMAT_IEEE_FLOAT: - { - if (pWav->dr.bitsPerSample == 32) { - pWav->format = ma_format_f32; - } - } break; - - default: break; - } - - /* Fall back to f32 if we couldn't find anything. */ - if (pWav->format == ma_format_unknown) { - pWav->format = ma_format_f32; - } - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. */ - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_wav_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav) -{ - ma_result result; - - result = ma_wav_init_internal(pConfig, pWav); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_WAV) - { - drwav_allocation_callbacks wavAllocationCallbacks = drwav_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drwav_bool32 wavResult; - - wavResult = drwav_init_file(&pWav->dr, pFilePath, &wavAllocationCallbacks); - if (wavResult != MA_TRUE) { - return MA_INVALID_FILE; - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. */ - (void)pFilePath; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_wav_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav) -{ - ma_result result; - - result = ma_wav_init_internal(pConfig, pWav); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_WAV) - { - drwav_allocation_callbacks wavAllocationCallbacks = drwav_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drwav_bool32 wavResult; - - wavResult = drwav_init_file_w(&pWav->dr, pFilePath, &wavAllocationCallbacks); - if (wavResult != MA_TRUE) { - return MA_INVALID_FILE; - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. */ - (void)pFilePath; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_wav_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav) -{ - ma_result result; - - result = ma_wav_init_internal(pConfig, pWav); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_WAV) - { - drwav_allocation_callbacks wavAllocationCallbacks = drwav_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drwav_bool32 wavResult; - - wavResult = drwav_init_memory(&pWav->dr, pData, dataSize, &wavAllocationCallbacks); - if (wavResult != MA_TRUE) { - return MA_INVALID_FILE; - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. */ - (void)pData; - (void)dataSize; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API void ma_wav_uninit(ma_wav* pWav, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pWav == NULL) { - return; - } - - (void)pAllocationCallbacks; - - #if !defined(MA_NO_WAV) - { - drwav_uninit(&pWav->dr); - } - #else - { - /* wav is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - } - #endif - - ma_data_source_uninit(&pWav->ds); -} - -MA_API ma_result ma_wav_read_pcm_frames(ma_wav* pWav, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pWav == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_WAV) - { - /* We always use floating point format. */ - ma_result result = MA_SUCCESS; /* Must be initialized to MA_SUCCESS. */ - ma_uint64 totalFramesRead = 0; - ma_format format; - - ma_wav_get_data_format(pWav, &format, NULL, NULL, NULL, 0); - - switch (format) - { - case ma_format_f32: - { - totalFramesRead = drwav_read_pcm_frames_f32(&pWav->dr, frameCount, (float*)pFramesOut); - } break; - - case ma_format_s16: - { - totalFramesRead = drwav_read_pcm_frames_s16(&pWav->dr, frameCount, (drwav_int16*)pFramesOut); - } break; - - case ma_format_s32: - { - totalFramesRead = drwav_read_pcm_frames_s32(&pWav->dr, frameCount, (drwav_int32*)pFramesOut); - } break; - - /* Fallback to a raw read. */ - case ma_format_unknown: return MA_INVALID_OPERATION; /* <-- this should never be hit because initialization would just fall back to a supported format. */ - default: - { - totalFramesRead = drwav_read_pcm_frames(&pWav->dr, frameCount, pFramesOut); - } break; - } - - /* In the future we'll update dr_wav to return MA_AT_END for us. */ - if (totalFramesRead == 0) { - result = MA_AT_END; - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesRead; - } - - if (result == MA_SUCCESS && totalFramesRead == 0) { - result = MA_AT_END; - } - - return result; - } - #else - { - /* wav is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)pFramesOut; - (void)frameCount; - (void)pFramesRead; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_wav_seek_to_pcm_frame(ma_wav* pWav, ma_uint64 frameIndex) -{ - if (pWav == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_WAV) - { - drwav_bool32 wavResult; - - wavResult = drwav_seek_to_pcm_frame(&pWav->dr, frameIndex); - if (wavResult != DRWAV_TRUE) { - return MA_ERROR; - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)frameIndex; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_wav_get_data_format(ma_wav* pWav, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - /* Defaults for safety. */ - if (pFormat != NULL) { - *pFormat = ma_format_unknown; - } - if (pChannels != NULL) { - *pChannels = 0; - } - if (pSampleRate != NULL) { - *pSampleRate = 0; - } - if (pChannelMap != NULL) { - MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap); - } - - if (pWav == NULL) { - return MA_INVALID_OPERATION; - } - - if (pFormat != NULL) { - *pFormat = pWav->format; - } - - #if !defined(MA_NO_WAV) - { - if (pChannels != NULL) { - *pChannels = pWav->dr.channels; - } - - if (pSampleRate != NULL) { - *pSampleRate = pWav->dr.sampleRate; - } - - if (pChannelMap != NULL) { - ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pChannelMap, channelMapCap, pWav->dr.channels); - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_wav_get_cursor_in_pcm_frames(ma_wav* pWav, ma_uint64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; /* Safety. */ - - if (pWav == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_WAV) - { - drwav_result wavResult = drwav_get_cursor_in_pcm_frames(&pWav->dr, pCursor); - if (wavResult != DRWAV_SUCCESS) { - return (ma_result)wavResult; /* dr_wav result codes map to miniaudio's. */ - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_wav_get_length_in_pcm_frames(ma_wav* pWav, ma_uint64* pLength) -{ - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; /* Safety. */ - - if (pWav == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_WAV) - { - drwav_result wavResult = drwav_get_length_in_pcm_frames(&pWav->dr, pLength); - if (wavResult != DRWAV_SUCCESS) { - return (ma_result)wavResult; /* dr_wav result codes map to miniaudio's. */ - } - - return MA_SUCCESS; - } - #else - { - /* wav is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - - -static ma_result ma_decoding_backend_init__wav(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_wav* pWav; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks); - if (pWav == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_wav_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pWav); - if (result != MA_SUCCESS) { - ma_free(pWav, pAllocationCallbacks); - return result; - } - - *ppBackend = pWav; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_file__wav(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_wav* pWav; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks); - if (pWav == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_wav_init_file(pFilePath, pConfig, pAllocationCallbacks, pWav); - if (result != MA_SUCCESS) { - ma_free(pWav, pAllocationCallbacks); - return result; - } - - *ppBackend = pWav; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_file_w__wav(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_wav* pWav; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks); - if (pWav == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_wav_init_file_w(pFilePath, pConfig, pAllocationCallbacks, pWav); - if (result != MA_SUCCESS) { - ma_free(pWav, pAllocationCallbacks); - return result; - } - - *ppBackend = pWav; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_memory__wav(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_wav* pWav; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks); - if (pWav == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_wav_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pWav); - if (result != MA_SUCCESS) { - ma_free(pWav, pAllocationCallbacks); - return result; - } - - *ppBackend = pWav; - - return MA_SUCCESS; -} - -static void ma_decoding_backend_uninit__wav(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_wav* pWav = (ma_wav*)pBackend; - - (void)pUserData; - - ma_wav_uninit(pWav, pAllocationCallbacks); - ma_free(pWav, pAllocationCallbacks); -} - -static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_wav = -{ - ma_decoding_backend_init__wav, - ma_decoding_backend_init_file__wav, - ma_decoding_backend_init_file_w__wav, - ma_decoding_backend_init_memory__wav, - ma_decoding_backend_uninit__wav -}; - -static ma_result ma_decoder_init_wav__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - return ma_decoder_init_from_vtable(&g_ma_decoding_backend_vtable_wav, NULL, pConfig, pDecoder); -} -#endif /* dr_wav_h */ - -/* FLAC */ -#ifdef dr_flac_h -#define MA_HAS_FLAC - -typedef struct -{ - ma_data_source_base ds; - ma_read_proc onRead; - ma_seek_proc onSeek; - ma_tell_proc onTell; - void* pReadSeekTellUserData; - ma_format format; /* Can be f32, s16 or s32. */ -#if !defined(MA_NO_FLAC) - drflac* dr; -#endif -} ma_flac; - -MA_API ma_result ma_flac_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac); -MA_API ma_result ma_flac_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac); -MA_API ma_result ma_flac_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac); -MA_API ma_result ma_flac_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac); -MA_API void ma_flac_uninit(ma_flac* pFlac, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_flac_read_pcm_frames(ma_flac* pFlac, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_flac_seek_to_pcm_frame(ma_flac* pFlac, ma_uint64 frameIndex); -MA_API ma_result ma_flac_get_data_format(ma_flac* pFlac, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_flac_get_cursor_in_pcm_frames(ma_flac* pFlac, ma_uint64* pCursor); -MA_API ma_result ma_flac_get_length_in_pcm_frames(ma_flac* pFlac, ma_uint64* pLength); - - -static ma_result ma_flac_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_flac_read_pcm_frames((ma_flac*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_flac_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_flac_seek_to_pcm_frame((ma_flac*)pDataSource, frameIndex); -} - -static ma_result ma_flac_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - return ma_flac_get_data_format((ma_flac*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -static ma_result ma_flac_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_flac_get_cursor_in_pcm_frames((ma_flac*)pDataSource, pCursor); -} - -static ma_result ma_flac_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_flac_get_length_in_pcm_frames((ma_flac*)pDataSource, pLength); -} - -static ma_data_source_vtable g_ma_flac_ds_vtable = -{ - ma_flac_ds_read, - ma_flac_ds_seek, - ma_flac_ds_get_data_format, - ma_flac_ds_get_cursor, - ma_flac_ds_get_length, - NULL, /* onSetLooping */ - 0 -}; - - -#if !defined(MA_NO_FLAC) -static drflac_allocation_callbacks drflac_allocation_callbacks_from_miniaudio(const ma_allocation_callbacks* pAllocationCallbacks) -{ - drflac_allocation_callbacks callbacks; - - if (pAllocationCallbacks != NULL) { - callbacks.onMalloc = pAllocationCallbacks->onMalloc; - callbacks.onRealloc = pAllocationCallbacks->onRealloc; - callbacks.onFree = pAllocationCallbacks->onFree; - callbacks.pUserData = pAllocationCallbacks->pUserData; - } else { - callbacks.onMalloc = ma__malloc_default; - callbacks.onRealloc = ma__realloc_default; - callbacks.onFree = ma__free_default; - callbacks.pUserData = NULL; - } - - return callbacks; -} - -static size_t ma_flac_dr_callback__read(void* pUserData, void* pBufferOut, size_t bytesToRead) -{ - ma_flac* pFlac = (ma_flac*)pUserData; - ma_result result; - size_t bytesRead; - - MA_ASSERT(pFlac != NULL); - - result = pFlac->onRead(pFlac->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead); - (void)result; - - return bytesRead; -} - -static drflac_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, drflac_seek_origin origin) -{ - ma_flac* pFlac = (ma_flac*)pUserData; - ma_result result; - ma_seek_origin maSeekOrigin; - - MA_ASSERT(pFlac != NULL); - - maSeekOrigin = ma_seek_origin_start; - if (origin == drflac_seek_origin_current) { - maSeekOrigin = ma_seek_origin_current; - } - - result = pFlac->onSeek(pFlac->pReadSeekTellUserData, offset, maSeekOrigin); - if (result != MA_SUCCESS) { - return MA_FALSE; - } - - return MA_TRUE; -} -#endif - -static ma_result ma_flac_init_internal(const ma_decoding_backend_config* pConfig, ma_flac* pFlac) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - if (pFlac == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pFlac); - pFlac->format = ma_format_f32; /* f32 by default. */ - - if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16 || pConfig->preferredFormat == ma_format_s32)) { - pFlac->format = pConfig->preferredFormat; - } else { - /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */ - } - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_flac_ds_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pFlac->ds); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the base data source. */ - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_flac_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac) -{ - ma_result result; - - result = ma_flac_init_internal(pConfig, pFlac); - if (result != MA_SUCCESS) { - return result; - } - - if (onRead == NULL || onSeek == NULL) { - return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */ - } - - pFlac->onRead = onRead; - pFlac->onSeek = onSeek; - pFlac->onTell = onTell; - pFlac->pReadSeekTellUserData = pReadSeekTellUserData; - - #if !defined(MA_NO_FLAC) - { - drflac_allocation_callbacks flacAllocationCallbacks = drflac_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - - pFlac->dr = drflac_open(ma_flac_dr_callback__read, ma_flac_dr_callback__seek, pFlac, &flacAllocationCallbacks); - if (pFlac->dr == NULL) { - return MA_INVALID_FILE; - } - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. */ - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_flac_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac) -{ - ma_result result; - - result = ma_flac_init_internal(pConfig, pFlac); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_FLAC) - { - drflac_allocation_callbacks flacAllocationCallbacks = drflac_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - - pFlac->dr = drflac_open_file(pFilePath, &flacAllocationCallbacks); - if (pFlac->dr == NULL) { - return MA_INVALID_FILE; - } - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. */ - (void)pFilePath; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_flac_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac) -{ - ma_result result; - - result = ma_flac_init_internal(pConfig, pFlac); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_FLAC) - { - drflac_allocation_callbacks flacAllocationCallbacks = drflac_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - - pFlac->dr = drflac_open_file_w(pFilePath, &flacAllocationCallbacks); - if (pFlac->dr == NULL) { - return MA_INVALID_FILE; - } - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. */ - (void)pFilePath; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_flac_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac) -{ - ma_result result; - - result = ma_flac_init_internal(pConfig, pFlac); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_FLAC) - { - drflac_allocation_callbacks flacAllocationCallbacks = drflac_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - - pFlac->dr = drflac_open_memory(pData, dataSize, &flacAllocationCallbacks); - if (pFlac->dr == NULL) { - return MA_INVALID_FILE; - } - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. */ - (void)pData; - (void)dataSize; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API void ma_flac_uninit(ma_flac* pFlac, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pFlac == NULL) { - return; - } - - (void)pAllocationCallbacks; - - #if !defined(MA_NO_FLAC) - { - drflac_close(pFlac->dr); - } - #else - { - /* flac is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - } - #endif - - ma_data_source_uninit(&pFlac->ds); -} - -MA_API ma_result ma_flac_read_pcm_frames(ma_flac* pFlac, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pFlac == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_FLAC) - { - /* We always use floating point format. */ - ma_result result = MA_SUCCESS; /* Must be initialized to MA_SUCCESS. */ - ma_uint64 totalFramesRead = 0; - ma_format format; - - ma_flac_get_data_format(pFlac, &format, NULL, NULL, NULL, 0); - - switch (format) - { - case ma_format_f32: - { - totalFramesRead = drflac_read_pcm_frames_f32(pFlac->dr, frameCount, (float*)pFramesOut); - } break; - - case ma_format_s16: - { - totalFramesRead = drflac_read_pcm_frames_s16(pFlac->dr, frameCount, (drflac_int16*)pFramesOut); - } break; - - case ma_format_s32: - { - totalFramesRead = drflac_read_pcm_frames_s32(pFlac->dr, frameCount, (drflac_int32*)pFramesOut); - } break; - - case ma_format_u8: - case ma_format_s24: - case ma_format_unknown: - default: - { - return MA_INVALID_OPERATION; - }; - } - - /* In the future we'll update dr_flac to return MA_AT_END for us. */ - if (totalFramesRead == 0) { - result = MA_AT_END; - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesRead; - } - - if (result == MA_SUCCESS && totalFramesRead == 0) { - result = MA_AT_END; - } - - return result; - } - #else - { - /* flac is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)pFramesOut; - (void)frameCount; - (void)pFramesRead; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_flac_seek_to_pcm_frame(ma_flac* pFlac, ma_uint64 frameIndex) -{ - if (pFlac == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_FLAC) - { - drflac_bool32 flacResult; - - flacResult = drflac_seek_to_pcm_frame(pFlac->dr, frameIndex); - if (flacResult != DRFLAC_TRUE) { - return MA_ERROR; - } - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)frameIndex; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_flac_get_data_format(ma_flac* pFlac, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - /* Defaults for safety. */ - if (pFormat != NULL) { - *pFormat = ma_format_unknown; - } - if (pChannels != NULL) { - *pChannels = 0; - } - if (pSampleRate != NULL) { - *pSampleRate = 0; - } - if (pChannelMap != NULL) { - MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap); - } - - if (pFlac == NULL) { - return MA_INVALID_OPERATION; - } - - if (pFormat != NULL) { - *pFormat = pFlac->format; - } - - #if !defined(MA_NO_FLAC) - { - if (pChannels != NULL) { - *pChannels = pFlac->dr->channels; - } - - if (pSampleRate != NULL) { - *pSampleRate = pFlac->dr->sampleRate; - } - - if (pChannelMap != NULL) { - ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pChannelMap, channelMapCap, pFlac->dr->channels); - } - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_flac_get_cursor_in_pcm_frames(ma_flac* pFlac, ma_uint64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; /* Safety. */ - - if (pFlac == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_FLAC) - { - *pCursor = pFlac->dr->currentPCMFrame; - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_flac_get_length_in_pcm_frames(ma_flac* pFlac, ma_uint64* pLength) -{ - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; /* Safety. */ - - if (pFlac == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_FLAC) - { - *pLength = pFlac->dr->totalPCMFrameCount; - - return MA_SUCCESS; - } - #else - { - /* flac is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - - -static ma_result ma_decoding_backend_init__flac(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_flac* pFlac; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks); - if (pFlac == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_flac_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pFlac); - if (result != MA_SUCCESS) { - ma_free(pFlac, pAllocationCallbacks); - return result; - } - - *ppBackend = pFlac; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_file__flac(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_flac* pFlac; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks); - if (pFlac == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_flac_init_file(pFilePath, pConfig, pAllocationCallbacks, pFlac); - if (result != MA_SUCCESS) { - ma_free(pFlac, pAllocationCallbacks); - return result; - } - - *ppBackend = pFlac; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_file_w__flac(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_flac* pFlac; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks); - if (pFlac == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_flac_init_file_w(pFilePath, pConfig, pAllocationCallbacks, pFlac); - if (result != MA_SUCCESS) { - ma_free(pFlac, pAllocationCallbacks); - return result; - } - - *ppBackend = pFlac; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_memory__flac(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_flac* pFlac; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks); - if (pFlac == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_flac_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pFlac); - if (result != MA_SUCCESS) { - ma_free(pFlac, pAllocationCallbacks); - return result; - } - - *ppBackend = pFlac; - - return MA_SUCCESS; -} - -static void ma_decoding_backend_uninit__flac(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_flac* pFlac = (ma_flac*)pBackend; - - (void)pUserData; - - ma_flac_uninit(pFlac, pAllocationCallbacks); - ma_free(pFlac, pAllocationCallbacks); -} - -static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_flac = -{ - ma_decoding_backend_init__flac, - ma_decoding_backend_init_file__flac, - ma_decoding_backend_init_file_w__flac, - ma_decoding_backend_init_memory__flac, - ma_decoding_backend_uninit__flac -}; - -static ma_result ma_decoder_init_flac__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - return ma_decoder_init_from_vtable(&g_ma_decoding_backend_vtable_flac, NULL, pConfig, pDecoder); -} -#endif /* dr_flac_h */ - -/* MP3 */ -#ifdef dr_mp3_h -#define MA_HAS_MP3 - -typedef struct -{ - ma_data_source_base ds; - ma_read_proc onRead; - ma_seek_proc onSeek; - ma_tell_proc onTell; - void* pReadSeekTellUserData; - ma_format format; /* Can be f32 or s16. */ -#if !defined(MA_NO_MP3) - drmp3 dr; - drmp3_uint32 seekPointCount; - drmp3_seek_point* pSeekPoints; /* Only used if seek table generation is used. */ -#endif -} ma_mp3; - -MA_API ma_result ma_mp3_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3); -MA_API ma_result ma_mp3_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3); -MA_API ma_result ma_mp3_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3); -MA_API ma_result ma_mp3_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3); -MA_API void ma_mp3_uninit(ma_mp3* pMP3, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_mp3_read_pcm_frames(ma_mp3* pMP3, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_mp3_seek_to_pcm_frame(ma_mp3* pMP3, ma_uint64 frameIndex); -MA_API ma_result ma_mp3_get_data_format(ma_mp3* pMP3, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_mp3_get_cursor_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pCursor); -MA_API ma_result ma_mp3_get_length_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pLength); - - -static ma_result ma_mp3_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_mp3_read_pcm_frames((ma_mp3*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_mp3_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_mp3_seek_to_pcm_frame((ma_mp3*)pDataSource, frameIndex); -} - -static ma_result ma_mp3_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - return ma_mp3_get_data_format((ma_mp3*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -static ma_result ma_mp3_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_mp3_get_cursor_in_pcm_frames((ma_mp3*)pDataSource, pCursor); -} - -static ma_result ma_mp3_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_mp3_get_length_in_pcm_frames((ma_mp3*)pDataSource, pLength); -} - -static ma_data_source_vtable g_ma_mp3_ds_vtable = -{ - ma_mp3_ds_read, - ma_mp3_ds_seek, - ma_mp3_ds_get_data_format, - ma_mp3_ds_get_cursor, - ma_mp3_ds_get_length, - NULL, /* onSetLooping */ - 0 -}; - - -#if !defined(MA_NO_MP3) -static drmp3_allocation_callbacks drmp3_allocation_callbacks_from_miniaudio(const ma_allocation_callbacks* pAllocationCallbacks) -{ - drmp3_allocation_callbacks callbacks; - - if (pAllocationCallbacks != NULL) { - callbacks.onMalloc = pAllocationCallbacks->onMalloc; - callbacks.onRealloc = pAllocationCallbacks->onRealloc; - callbacks.onFree = pAllocationCallbacks->onFree; - callbacks.pUserData = pAllocationCallbacks->pUserData; - } else { - callbacks.onMalloc = ma__malloc_default; - callbacks.onRealloc = ma__realloc_default; - callbacks.onFree = ma__free_default; - callbacks.pUserData = NULL; - } - - return callbacks; -} - -static size_t ma_mp3_dr_callback__read(void* pUserData, void* pBufferOut, size_t bytesToRead) -{ - ma_mp3* pMP3 = (ma_mp3*)pUserData; - ma_result result; - size_t bytesRead; - - MA_ASSERT(pMP3 != NULL); - - result = pMP3->onRead(pMP3->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead); - (void)result; - - return bytesRead; -} - -static drmp3_bool32 ma_mp3_dr_callback__seek(void* pUserData, int offset, drmp3_seek_origin origin) -{ - ma_mp3* pMP3 = (ma_mp3*)pUserData; - ma_result result; - ma_seek_origin maSeekOrigin; - - MA_ASSERT(pMP3 != NULL); - - maSeekOrigin = ma_seek_origin_start; - if (origin == drmp3_seek_origin_current) { - maSeekOrigin = ma_seek_origin_current; - } - - result = pMP3->onSeek(pMP3->pReadSeekTellUserData, offset, maSeekOrigin); - if (result != MA_SUCCESS) { - return MA_FALSE; - } - - return MA_TRUE; -} -#endif - -static ma_result ma_mp3_init_internal(const ma_decoding_backend_config* pConfig, ma_mp3* pMP3) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - if (pMP3 == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pMP3); - pMP3->format = ma_format_f32; /* f32 by default. */ - - if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16)) { - pMP3->format = pConfig->preferredFormat; - } else { - /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */ - } - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_mp3_ds_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pMP3->ds); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the base data source. */ - } - - return MA_SUCCESS; -} - -static ma_result ma_mp3_generate_seek_table(ma_mp3* pMP3, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks) -{ - drmp3_bool32 mp3Result; - drmp3_uint32 seekPointCount = 0; - drmp3_seek_point* pSeekPoints = NULL; - - MA_ASSERT(pMP3 != NULL); - MA_ASSERT(pConfig != NULL); - - seekPointCount = pConfig->seekPointCount; - if (seekPointCount > 0) { - pSeekPoints = (drmp3_seek_point*)ma_malloc(sizeof(*pMP3->pSeekPoints) * seekPointCount, pAllocationCallbacks); - if (pSeekPoints == NULL) { - return MA_OUT_OF_MEMORY; - } - } - - mp3Result = drmp3_calculate_seek_points(&pMP3->dr, &seekPointCount, pSeekPoints); - if (mp3Result != MA_TRUE) { - return MA_ERROR; - } - - mp3Result = drmp3_bind_seek_table(&pMP3->dr, seekPointCount, pSeekPoints); - if (mp3Result != MA_TRUE) { - ma_free(pSeekPoints, pAllocationCallbacks); - return MA_ERROR; - } - - pMP3->seekPointCount = seekPointCount; - pMP3->pSeekPoints = pSeekPoints; - - return MA_SUCCESS; -} - -MA_API ma_result ma_mp3_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3) -{ - ma_result result; - - result = ma_mp3_init_internal(pConfig, pMP3); - if (result != MA_SUCCESS) { - return result; - } - - if (onRead == NULL || onSeek == NULL) { - return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */ - } - - pMP3->onRead = onRead; - pMP3->onSeek = onSeek; - pMP3->onTell = onTell; - pMP3->pReadSeekTellUserData = pReadSeekTellUserData; - - #if !defined(MA_NO_MP3) - { - drmp3_allocation_callbacks mp3AllocationCallbacks = drmp3_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drmp3_bool32 mp3Result; - - mp3Result = drmp3_init(&pMP3->dr, ma_mp3_dr_callback__read, ma_mp3_dr_callback__seek, pMP3, &mp3AllocationCallbacks); - if (mp3Result != MA_TRUE) { - return MA_INVALID_FILE; - } - - ma_mp3_generate_seek_table(pMP3, pConfig, pAllocationCallbacks); - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. */ - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_mp3_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3) -{ - ma_result result; - - result = ma_mp3_init_internal(pConfig, pMP3); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_MP3) - { - drmp3_allocation_callbacks mp3AllocationCallbacks = drmp3_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drmp3_bool32 mp3Result; - - mp3Result = drmp3_init_file(&pMP3->dr, pFilePath, &mp3AllocationCallbacks); - if (mp3Result != MA_TRUE) { - return MA_INVALID_FILE; - } - - ma_mp3_generate_seek_table(pMP3, pConfig, pAllocationCallbacks); - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. */ - (void)pFilePath; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_mp3_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3) -{ - ma_result result; - - result = ma_mp3_init_internal(pConfig, pMP3); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_MP3) - { - drmp3_allocation_callbacks mp3AllocationCallbacks = drmp3_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drmp3_bool32 mp3Result; - - mp3Result = drmp3_init_file_w(&pMP3->dr, pFilePath, &mp3AllocationCallbacks); - if (mp3Result != MA_TRUE) { - return MA_INVALID_FILE; - } - - ma_mp3_generate_seek_table(pMP3, pConfig, pAllocationCallbacks); - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. */ - (void)pFilePath; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_mp3_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3) -{ - ma_result result; - - result = ma_mp3_init_internal(pConfig, pMP3); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_MP3) - { - drmp3_allocation_callbacks mp3AllocationCallbacks = drmp3_allocation_callbacks_from_miniaudio(pAllocationCallbacks); - drmp3_bool32 mp3Result; - - mp3Result = drmp3_init_memory(&pMP3->dr, pData, dataSize, &mp3AllocationCallbacks); - if (mp3Result != MA_TRUE) { - return MA_INVALID_FILE; - } - - ma_mp3_generate_seek_table(pMP3, pConfig, pAllocationCallbacks); - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. */ - (void)pData; - (void)dataSize; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API void ma_mp3_uninit(ma_mp3* pMP3, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pMP3 == NULL) { - return; - } - - #if !defined(MA_NO_MP3) - { - drmp3_uninit(&pMP3->dr); - } - #else - { - /* mp3 is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - } - #endif - - /* Seek points need to be freed after the MP3 decoder has been uninitialized to ensure they're no longer being referenced. */ - ma_free(pMP3->pSeekPoints, pAllocationCallbacks); - - ma_data_source_uninit(&pMP3->ds); -} - -MA_API ma_result ma_mp3_read_pcm_frames(ma_mp3* pMP3, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pMP3 == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_MP3) - { - /* We always use floating point format. */ - ma_result result = MA_SUCCESS; /* Must be initialized to MA_SUCCESS. */ - ma_uint64 totalFramesRead = 0; - ma_format format; - - ma_mp3_get_data_format(pMP3, &format, NULL, NULL, NULL, 0); - - switch (format) - { - case ma_format_f32: - { - totalFramesRead = drmp3_read_pcm_frames_f32(&pMP3->dr, frameCount, (float*)pFramesOut); - } break; - - case ma_format_s16: - { - totalFramesRead = drmp3_read_pcm_frames_s16(&pMP3->dr, frameCount, (drmp3_int16*)pFramesOut); - } break; - - case ma_format_u8: - case ma_format_s24: - case ma_format_s32: - case ma_format_unknown: - default: - { - return MA_INVALID_OPERATION; - }; - } - - /* In the future we'll update dr_mp3 to return MA_AT_END for us. */ - if (totalFramesRead == 0) { - result = MA_AT_END; - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesRead; - } - - return result; - } - #else - { - /* mp3 is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)pFramesOut; - (void)frameCount; - (void)pFramesRead; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_mp3_seek_to_pcm_frame(ma_mp3* pMP3, ma_uint64 frameIndex) -{ - if (pMP3 == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_MP3) - { - drmp3_bool32 mp3Result; - - mp3Result = drmp3_seek_to_pcm_frame(&pMP3->dr, frameIndex); - if (mp3Result != DRMP3_TRUE) { - return MA_ERROR; - } - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)frameIndex; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_mp3_get_data_format(ma_mp3* pMP3, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - /* Defaults for safety. */ - if (pFormat != NULL) { - *pFormat = ma_format_unknown; - } - if (pChannels != NULL) { - *pChannels = 0; - } - if (pSampleRate != NULL) { - *pSampleRate = 0; - } - if (pChannelMap != NULL) { - MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap); - } - - if (pMP3 == NULL) { - return MA_INVALID_OPERATION; - } - - if (pFormat != NULL) { - *pFormat = pMP3->format; - } - - #if !defined(MA_NO_MP3) - { - if (pChannels != NULL) { - *pChannels = pMP3->dr.channels; - } - - if (pSampleRate != NULL) { - *pSampleRate = pMP3->dr.sampleRate; - } - - if (pChannelMap != NULL) { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pMP3->dr.channels); - } - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_mp3_get_cursor_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; /* Safety. */ - - if (pMP3 == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_MP3) - { - *pCursor = pMP3->dr.currentPCMFrame; - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_mp3_get_length_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pLength) -{ - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; /* Safety. */ - - if (pMP3 == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_MP3) - { - *pLength = drmp3_get_pcm_frame_count(&pMP3->dr); - - return MA_SUCCESS; - } - #else - { - /* mp3 is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - - -static ma_result ma_decoding_backend_init__mp3(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_mp3* pMP3; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks); - if (pMP3 == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_mp3_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pMP3); - if (result != MA_SUCCESS) { - ma_free(pMP3, pAllocationCallbacks); - return result; - } - - *ppBackend = pMP3; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_file__mp3(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_mp3* pMP3; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks); - if (pMP3 == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_mp3_init_file(pFilePath, pConfig, pAllocationCallbacks, pMP3); - if (result != MA_SUCCESS) { - ma_free(pMP3, pAllocationCallbacks); - return result; - } - - *ppBackend = pMP3; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_file_w__mp3(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_mp3* pMP3; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks); - if (pMP3 == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_mp3_init_file_w(pFilePath, pConfig, pAllocationCallbacks, pMP3); - if (result != MA_SUCCESS) { - ma_free(pMP3, pAllocationCallbacks); - return result; - } - - *ppBackend = pMP3; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_memory__mp3(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_mp3* pMP3; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks); - if (pMP3 == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_mp3_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pMP3); - if (result != MA_SUCCESS) { - ma_free(pMP3, pAllocationCallbacks); - return result; - } - - *ppBackend = pMP3; - - return MA_SUCCESS; -} - -static void ma_decoding_backend_uninit__mp3(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_mp3* pMP3 = (ma_mp3*)pBackend; - - (void)pUserData; - - ma_mp3_uninit(pMP3, pAllocationCallbacks); - ma_free(pMP3, pAllocationCallbacks); -} - -static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_mp3 = -{ - ma_decoding_backend_init__mp3, - ma_decoding_backend_init_file__mp3, - ma_decoding_backend_init_file_w__mp3, - ma_decoding_backend_init_memory__mp3, - ma_decoding_backend_uninit__mp3 -}; - -static ma_result ma_decoder_init_mp3__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - return ma_decoder_init_from_vtable(&g_ma_decoding_backend_vtable_mp3, NULL, pConfig, pDecoder); -} -#endif /* dr_mp3_h */ - -/* Vorbis */ -#ifdef STB_VORBIS_INCLUDE_STB_VORBIS_H -#define MA_HAS_VORBIS - -/* The size in bytes of each chunk of data to read from the Vorbis stream. */ -#define MA_VORBIS_DATA_CHUNK_SIZE 4096 - -typedef struct -{ - ma_data_source_base ds; - ma_read_proc onRead; - ma_seek_proc onSeek; - ma_tell_proc onTell; - void* pReadSeekTellUserData; - ma_allocation_callbacks allocationCallbacks; /* Store the allocation callbacks within the structure because we may need to dynamically expand a buffer in ma_stbvorbis_read_pcm_frames() when using push mode. */ - ma_format format; /* Only f32 is allowed with stb_vorbis. */ - ma_uint32 channels; - ma_uint32 sampleRate; - ma_uint64 cursor; -#if !defined(MA_NO_VORBIS) - stb_vorbis* stb; - ma_bool32 usingPushMode; - struct - { - ma_uint8* pData; - size_t dataSize; - size_t dataCapacity; - ma_uint32 framesConsumed; /* The number of frames consumed in ppPacketData. */ - ma_uint32 framesRemaining; /* The number of frames remaining in ppPacketData. */ - float** ppPacketData; - } push; -#endif -} ma_stbvorbis; - -MA_API ma_result ma_stbvorbis_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis); -MA_API ma_result ma_stbvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis); -MA_API ma_result ma_stbvorbis_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis); -MA_API void ma_stbvorbis_uninit(ma_stbvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks); -MA_API ma_result ma_stbvorbis_read_pcm_frames(ma_stbvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); -MA_API ma_result ma_stbvorbis_seek_to_pcm_frame(ma_stbvorbis* pVorbis, ma_uint64 frameIndex); -MA_API ma_result ma_stbvorbis_get_data_format(ma_stbvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap); -MA_API ma_result ma_stbvorbis_get_cursor_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pCursor); -MA_API ma_result ma_stbvorbis_get_length_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pLength); - - -static ma_result ma_stbvorbis_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_stbvorbis_read_pcm_frames((ma_stbvorbis*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_stbvorbis_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_stbvorbis_seek_to_pcm_frame((ma_stbvorbis*)pDataSource, frameIndex); -} - -static ma_result ma_stbvorbis_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - return ma_stbvorbis_get_data_format((ma_stbvorbis*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -static ma_result ma_stbvorbis_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_stbvorbis_get_cursor_in_pcm_frames((ma_stbvorbis*)pDataSource, pCursor); -} - -static ma_result ma_stbvorbis_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_stbvorbis_get_length_in_pcm_frames((ma_stbvorbis*)pDataSource, pLength); -} - -static ma_data_source_vtable g_ma_stbvorbis_ds_vtable = -{ - ma_stbvorbis_ds_read, - ma_stbvorbis_ds_seek, - ma_stbvorbis_ds_get_data_format, - ma_stbvorbis_ds_get_cursor, - ma_stbvorbis_ds_get_length, - NULL, /* onSetLooping */ - 0 -}; - - -static ma_result ma_stbvorbis_init_internal(const ma_decoding_backend_config* pConfig, ma_stbvorbis* pVorbis) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - (void)pConfig; - - if (pVorbis == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pVorbis); - pVorbis->format = ma_format_f32; /* Only supporting f32. */ - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_stbvorbis_ds_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pVorbis->ds); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the base data source. */ - } - - return MA_SUCCESS; -} - -#if !defined(MA_NO_VORBIS) -static ma_result ma_stbvorbis_post_init(ma_stbvorbis* pVorbis) -{ - stb_vorbis_info info; - - MA_ASSERT(pVorbis != NULL); - - info = stb_vorbis_get_info(pVorbis->stb); - - pVorbis->channels = info.channels; - pVorbis->sampleRate = info.sample_rate; - - return MA_SUCCESS; -} -#endif - -MA_API ma_result ma_stbvorbis_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis) -{ - ma_result result; - - result = ma_stbvorbis_init_internal(pConfig, pVorbis); - if (result != MA_SUCCESS) { - return result; - } - - if (onRead == NULL || onSeek == NULL) { - return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */ - } - - pVorbis->onRead = onRead; - pVorbis->onSeek = onSeek; - pVorbis->onTell = onTell; - pVorbis->pReadSeekTellUserData = pReadSeekTellUserData; - ma_allocation_callbacks_init_copy(&pVorbis->allocationCallbacks, pAllocationCallbacks); - - #if !defined(MA_NO_VORBIS) - { - /* - stb_vorbis lacks a callback based API for it's pulling API which means we're stuck with the - pushing API. In order for us to be able to successfully initialize the decoder we need to - supply it with enough data. We need to keep loading data until we have enough. - */ - stb_vorbis* stb; - size_t dataSize = 0; - size_t dataCapacity = 0; - ma_uint8* pData = NULL; /* <-- Must be initialized to NULL. */ - - for (;;) { - int vorbisError; - int consumedDataSize; /* <-- Fill by stb_vorbis_open_pushdata(). */ - size_t bytesRead; - ma_uint8* pNewData; - - /* Allocate memory for the new chunk. */ - dataCapacity += MA_VORBIS_DATA_CHUNK_SIZE; - pNewData = (ma_uint8*)ma_realloc(pData, dataCapacity, pAllocationCallbacks); - if (pNewData == NULL) { - ma_free(pData, pAllocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - pData = pNewData; - - /* Read in the next chunk. */ - result = pVorbis->onRead(pVorbis->pReadSeekTellUserData, ma_offset_ptr(pData, dataSize), (dataCapacity - dataSize), &bytesRead); - dataSize += bytesRead; - - if (result != MA_SUCCESS) { - ma_free(pData, pAllocationCallbacks); - return result; - } - - /* We have a maximum of 31 bits with stb_vorbis. */ - if (dataSize > INT_MAX) { - ma_free(pData, pAllocationCallbacks); - return MA_TOO_BIG; - } - - stb = stb_vorbis_open_pushdata(pData, (int)dataSize, &consumedDataSize, &vorbisError, NULL); - if (stb != NULL) { - /* - Successfully opened the Vorbis decoder. We might have some leftover unprocessed - data so we'll need to move that down to the front. - */ - dataSize -= (size_t)consumedDataSize; /* Consume the data. */ - MA_MOVE_MEMORY(pData, ma_offset_ptr(pData, consumedDataSize), dataSize); - break; - } else { - /* Failed to open the decoder. */ - if (vorbisError == VORBIS_need_more_data) { - continue; - } else { - ma_free(pData, pAllocationCallbacks); - return MA_ERROR; /* Failed to open the stb_vorbis decoder. */ - } - } - } - - MA_ASSERT(stb != NULL); - pVorbis->stb = stb; - pVorbis->push.pData = pData; - pVorbis->push.dataSize = dataSize; - pVorbis->push.dataCapacity = dataCapacity; - - pVorbis->usingPushMode = MA_TRUE; - - result = ma_stbvorbis_post_init(pVorbis); - if (result != MA_SUCCESS) { - stb_vorbis_close(pVorbis->stb); - ma_free(pData, pAllocationCallbacks); - return result; - } - - return MA_SUCCESS; - } - #else - { - /* vorbis is disabled. */ - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_stbvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis) -{ - ma_result result; - - result = ma_stbvorbis_init_internal(pConfig, pVorbis); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_VORBIS) - { - (void)pAllocationCallbacks; /* Don't know how to make use of this with stb_vorbis. */ - - /* We can use stb_vorbis' pull mode for file based streams. */ - pVorbis->stb = stb_vorbis_open_filename(pFilePath, NULL, NULL); - if (pVorbis->stb == NULL) { - return MA_INVALID_FILE; - } - - pVorbis->usingPushMode = MA_FALSE; - - result = ma_stbvorbis_post_init(pVorbis); - if (result != MA_SUCCESS) { - stb_vorbis_close(pVorbis->stb); - return result; - } - - return MA_SUCCESS; - } - #else - { - /* vorbis is disabled. */ - (void)pFilePath; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_stbvorbis_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis) -{ - ma_result result; - - result = ma_stbvorbis_init_internal(pConfig, pVorbis); - if (result != MA_SUCCESS) { - return result; - } - - #if !defined(MA_NO_VORBIS) - { - (void)pAllocationCallbacks; - - /* stb_vorbis uses an int as it's size specifier, restricting it to 32-bit even on 64-bit systems. *sigh*. */ - if (dataSize > INT_MAX) { - return MA_TOO_BIG; - } - - pVorbis->stb = stb_vorbis_open_memory((const unsigned char*)pData, (int)dataSize, NULL, NULL); - if (pVorbis->stb == NULL) { - return MA_INVALID_FILE; - } - - pVorbis->usingPushMode = MA_FALSE; - - result = ma_stbvorbis_post_init(pVorbis); - if (result != MA_SUCCESS) { - stb_vorbis_close(pVorbis->stb); - return result; - } - - return MA_SUCCESS; - } - #else - { - /* vorbis is disabled. */ - (void)pData; - (void)dataSize; - (void)pAllocationCallbacks; - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API void ma_stbvorbis_uninit(ma_stbvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pVorbis == NULL) { - return; - } - - #if !defined(MA_NO_VORBIS) - { - stb_vorbis_close(pVorbis->stb); - - /* We'll have to clear some memory if we're using push mode. */ - if (pVorbis->usingPushMode) { - ma_free(pVorbis->push.pData, pAllocationCallbacks); - } - } - #else - { - /* vorbis is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - } - #endif - - ma_data_source_uninit(&pVorbis->ds); -} - -MA_API ma_result ma_stbvorbis_read_pcm_frames(ma_stbvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pVorbis == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_VORBIS) - { - /* We always use floating point format. */ - ma_result result = MA_SUCCESS; /* Must be initialized to MA_SUCCESS. */ - ma_uint64 totalFramesRead = 0; - ma_format format; - ma_uint32 channels; - - ma_stbvorbis_get_data_format(pVorbis, &format, &channels, NULL, NULL, 0); - - if (format == ma_format_f32) { - /* We read differently depending on whether or not we're using push mode. */ - if (pVorbis->usingPushMode) { - /* Push mode. This is the complex case. */ - float* pFramesOutF32 = (float*)pFramesOut; - - while (totalFramesRead < frameCount) { - /* The first thing to do is read from any already-cached frames. */ - ma_uint32 framesToReadFromCache = (ma_uint32)ma_min(pVorbis->push.framesRemaining, (frameCount - totalFramesRead)); /* Safe cast because pVorbis->framesRemaining is 32-bit. */ - - /* The output pointer can be null in which case we just treate it as a seek. */ - if (pFramesOut != NULL) { - ma_uint64 iFrame; - for (iFrame = 0; iFrame < framesToReadFromCache; iFrame += 1) { - ma_uint32 iChannel; - for (iChannel = 0; iChannel < pVorbis->channels; iChannel += 1) { - pFramesOutF32[iChannel] = pVorbis->push.ppPacketData[iChannel][pVorbis->push.framesConsumed + iFrame]; - } - - pFramesOutF32 += pVorbis->channels; - } - } - - /* Update pointers and counters. */ - pVorbis->push.framesConsumed += framesToReadFromCache; - pVorbis->push.framesRemaining -= framesToReadFromCache; - totalFramesRead += framesToReadFromCache; - - /* Don't bother reading any more frames right now if we've just finished loading. */ - if (totalFramesRead == frameCount) { - break; - } - - MA_ASSERT(pVorbis->push.framesRemaining == 0); - - /* Getting here means we've run out of cached frames. We'll need to load some more. */ - for (;;) { - int samplesRead = 0; - int consumedDataSize; - - /* We need to case dataSize to an int, so make sure we can do it safely. */ - if (pVorbis->push.dataSize > INT_MAX) { - break; /* Too big. */ - } - - consumedDataSize = stb_vorbis_decode_frame_pushdata(pVorbis->stb, pVorbis->push.pData, (int)pVorbis->push.dataSize, NULL, &pVorbis->push.ppPacketData, &samplesRead); - if (consumedDataSize != 0) { - /* Successfully decoded a Vorbis frame. Consume the data. */ - pVorbis->push.dataSize -= (size_t)consumedDataSize; - MA_MOVE_MEMORY(pVorbis->push.pData, ma_offset_ptr(pVorbis->push.pData, consumedDataSize), pVorbis->push.dataSize); - - pVorbis->push.framesConsumed = 0; - pVorbis->push.framesRemaining = samplesRead; - - break; - } else { - /* Not enough data. Read more. */ - size_t bytesRead; - - /* Expand the data buffer if necessary. */ - if (pVorbis->push.dataCapacity == pVorbis->push.dataSize) { - size_t newCap = pVorbis->push.dataCapacity + MA_VORBIS_DATA_CHUNK_SIZE; - ma_uint8* pNewData; - - pNewData = (ma_uint8*)ma_realloc(pVorbis->push.pData, newCap, &pVorbis->allocationCallbacks); - if (pNewData == NULL) { - result = MA_OUT_OF_MEMORY; - break; - } - - pVorbis->push.pData = pNewData; - pVorbis->push.dataCapacity = newCap; - } - - /* We should have enough room to load some data. */ - result = pVorbis->onRead(pVorbis->pReadSeekTellUserData, ma_offset_ptr(pVorbis->push.pData, pVorbis->push.dataSize), (pVorbis->push.dataCapacity - pVorbis->push.dataSize), &bytesRead); - pVorbis->push.dataSize += bytesRead; - - if (result != MA_SUCCESS) { - break; /* Failed to read any data. Get out. */ - } - } - } - - /* If we don't have a success code at this point it means we've encounted an error or the end of the file has been reached (probably the latter). */ - if (result != MA_SUCCESS) { - break; - } - } - } else { - /* Pull mode. This is the simple case, but we still need to run in a loop because stb_vorbis loves using 32-bit instead of 64-bit. */ - while (totalFramesRead < frameCount) { - ma_uint64 framesRemaining = (frameCount - totalFramesRead); - int framesRead; - - if (framesRemaining > INT_MAX) { - framesRemaining = INT_MAX; - } - - framesRead = stb_vorbis_get_samples_float_interleaved(pVorbis->stb, channels, (float*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), (int)framesRemaining * channels); /* Safe cast. */ - totalFramesRead += framesRead; - - if (framesRead < (int)framesRemaining) { - break; /* Nothing left to read. Get out. */ - } - } - } - } else { - result = MA_INVALID_ARGS; - } - - pVorbis->cursor += totalFramesRead; - - if (totalFramesRead == 0) { - result = MA_AT_END; - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesRead; - } - - if (result == MA_SUCCESS && totalFramesRead == 0) { - result = MA_AT_END; - } - - return result; - } - #else - { - /* vorbis is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)pFramesOut; - (void)frameCount; - (void)pFramesRead; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_stbvorbis_seek_to_pcm_frame(ma_stbvorbis* pVorbis, ma_uint64 frameIndex) -{ - if (pVorbis == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_VORBIS) - { - /* Different seeking methods depending on whether or not we're using push mode. */ - if (pVorbis->usingPushMode) { - /* Push mode. This is the complex case. */ - ma_result result; - float buffer[4096]; - - /* - This is terribly inefficient because stb_vorbis does not have a good seeking solution with it's push API. Currently this just performs - a full decode right from the start of the stream. Later on I'll need to write a layer that goes through all of the Ogg pages until we - find the one containing the sample we need. Then we know exactly where to seek for stb_vorbis. - - TODO: Use seeking logic documented for stb_vorbis_flush_pushdata(). - */ - - /* Seek to the start of the file to begin with. */ - result = pVorbis->onSeek(pVorbis->pReadSeekTellUserData, 0, ma_seek_origin_start); - if (result != MA_SUCCESS) { - return result; - } - - stb_vorbis_flush_pushdata(pVorbis->stb); - pVorbis->push.framesRemaining = 0; - pVorbis->push.dataSize = 0; - - /* Move the cursor back to the start. We'll increment this in the loop below. */ - pVorbis->cursor = 0; - - while (pVorbis->cursor < frameIndex) { - ma_uint64 framesRead; - ma_uint64 framesToRead = ma_countof(buffer)/pVorbis->channels; - if (framesToRead > (frameIndex - pVorbis->cursor)) { - framesToRead = (frameIndex - pVorbis->cursor); - } - - result = ma_stbvorbis_read_pcm_frames(pVorbis, buffer, framesToRead, &framesRead); - pVorbis->cursor += framesRead; - - if (result != MA_SUCCESS) { - return result; - } - } - } else { - /* Pull mode. This is the simple case. */ - int vorbisResult; - - if (frameIndex > UINT_MAX) { - return MA_INVALID_ARGS; /* Trying to seek beyond the 32-bit maximum of stb_vorbis. */ - } - - vorbisResult = stb_vorbis_seek(pVorbis->stb, (unsigned int)frameIndex); /* Safe cast. */ - if (vorbisResult == 0) { - return MA_ERROR; /* See failed. */ - } - - pVorbis->cursor = frameIndex; - } - - return MA_SUCCESS; - } - #else - { - /* vorbis is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - - (void)frameIndex; - - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_stbvorbis_get_data_format(ma_stbvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - /* Defaults for safety. */ - if (pFormat != NULL) { - *pFormat = ma_format_unknown; - } - if (pChannels != NULL) { - *pChannels = 0; - } - if (pSampleRate != NULL) { - *pSampleRate = 0; - } - if (pChannelMap != NULL) { - MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap); - } - - if (pVorbis == NULL) { - return MA_INVALID_OPERATION; - } - - if (pFormat != NULL) { - *pFormat = pVorbis->format; - } - - #if !defined(MA_NO_VORBIS) - { - if (pChannels != NULL) { - *pChannels = pVorbis->channels; - } - - if (pSampleRate != NULL) { - *pSampleRate = pVorbis->sampleRate; - } - - if (pChannelMap != NULL) { - ma_channel_map_init_standard(ma_standard_channel_map_vorbis, pChannelMap, channelMapCap, pVorbis->channels); - } - - return MA_SUCCESS; - } - #else - { - /* vorbis is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_stbvorbis_get_cursor_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; /* Safety. */ - - if (pVorbis == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_VORBIS) - { - *pCursor = pVorbis->cursor; - - return MA_SUCCESS; - } - #else - { - /* vorbis is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - -MA_API ma_result ma_stbvorbis_get_length_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pLength) -{ - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; /* Safety. */ - - if (pVorbis == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_VORBIS) - { - if (pVorbis->usingPushMode) { - *pLength = 0; /* I don't know of a good way to determine this reliably with stb_vorbis and push mode. */ - } else { - *pLength = stb_vorbis_stream_length_in_samples(pVorbis->stb); - } - - return MA_SUCCESS; - } - #else - { - /* vorbis is disabled. Should never hit this since initialization would have failed. */ - MA_ASSERT(MA_FALSE); - return MA_NOT_IMPLEMENTED; - } - #endif -} - - -static ma_result ma_decoding_backend_init__stbvorbis(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_stbvorbis* pVorbis; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pVorbis = (ma_stbvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks); - if (pVorbis == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_stbvorbis_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pVorbis); - if (result != MA_SUCCESS) { - ma_free(pVorbis, pAllocationCallbacks); - return result; - } - - *ppBackend = pVorbis; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_file__stbvorbis(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_stbvorbis* pVorbis; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pVorbis = (ma_stbvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks); - if (pVorbis == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_stbvorbis_init_file(pFilePath, pConfig, pAllocationCallbacks, pVorbis); - if (result != MA_SUCCESS) { - ma_free(pVorbis, pAllocationCallbacks); - return result; - } - - *ppBackend = pVorbis; - - return MA_SUCCESS; -} - -static ma_result ma_decoding_backend_init_memory__stbvorbis(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend) -{ - ma_result result; - ma_stbvorbis* pVorbis; - - (void)pUserData; /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */ - - /* For now we're just allocating the decoder backend on the heap. */ - pVorbis = (ma_stbvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks); - if (pVorbis == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_stbvorbis_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pVorbis); - if (result != MA_SUCCESS) { - ma_free(pVorbis, pAllocationCallbacks); - return result; - } - - *ppBackend = pVorbis; - - return MA_SUCCESS; -} - -static void ma_decoding_backend_uninit__stbvorbis(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_stbvorbis* pVorbis = (ma_stbvorbis*)pBackend; - - (void)pUserData; - - ma_stbvorbis_uninit(pVorbis, pAllocationCallbacks); - ma_free(pVorbis, pAllocationCallbacks); -} - -static ma_decoding_backend_vtable g_ma_decoding_backend_vtable_stbvorbis = -{ - ma_decoding_backend_init__stbvorbis, - ma_decoding_backend_init_file__stbvorbis, - NULL, /* onInitFileW() */ - ma_decoding_backend_init_memory__stbvorbis, - ma_decoding_backend_uninit__stbvorbis -}; - -static ma_result ma_decoder_init_vorbis__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - return ma_decoder_init_from_vtable(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pConfig, pDecoder); -} -#endif /* STB_VORBIS_INCLUDE_STB_VORBIS_H */ - - - -static ma_result ma_decoder__init_allocation_callbacks(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - MA_ASSERT(pDecoder != NULL); - - if (pConfig != NULL) { - return ma_allocation_callbacks_init_copy(&pDecoder->allocationCallbacks, &pConfig->allocationCallbacks); - } else { - pDecoder->allocationCallbacks = ma_allocation_callbacks_init_default(); - return MA_SUCCESS; - } -} - -static ma_result ma_decoder__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_decoder_read_pcm_frames((ma_decoder*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_decoder__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_decoder_seek_to_pcm_frame((ma_decoder*)pDataSource, frameIndex); -} - -static ma_result ma_decoder__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - return ma_decoder_get_data_format((ma_decoder*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -static ma_result ma_decoder__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_decoder_get_cursor_in_pcm_frames((ma_decoder*)pDataSource, pCursor); -} - -static ma_result ma_decoder__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_decoder_get_length_in_pcm_frames((ma_decoder*)pDataSource, pLength); -} - -static ma_data_source_vtable g_ma_decoder_data_source_vtable = -{ - ma_decoder__data_source_on_read, - ma_decoder__data_source_on_seek, - ma_decoder__data_source_on_get_data_format, - ma_decoder__data_source_on_get_cursor, - ma_decoder__data_source_on_get_length, - NULL, /* onSetLooping */ - 0 -}; - -static ma_result ma_decoder__preinit(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, ma_decoder_tell_proc onTell, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - MA_ASSERT(pConfig != NULL); - - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDecoder); - - if (onRead == NULL || onSeek == NULL) { - return MA_INVALID_ARGS; - } - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_decoder_data_source_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pDecoder->ds); - if (result != MA_SUCCESS) { - return result; - } - - pDecoder->onRead = onRead; - pDecoder->onSeek = onSeek; - pDecoder->onTell = onTell; - pDecoder->pUserData = pUserData; - - result = ma_decoder__init_allocation_callbacks(pConfig, pDecoder); - if (result != MA_SUCCESS) { - ma_data_source_uninit(&pDecoder->ds); - return result; - } - - return MA_SUCCESS; -} - -static ma_result ma_decoder__postinit(const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - - result = ma_decoder__init_data_converter(pDecoder, pConfig); - - /* If we failed post initialization we need to uninitialize the decoder before returning to prevent a memory leak. */ - if (result != MA_SUCCESS) { - ma_decoder_uninit(pDecoder); - return result; - } - - return result; -} - - -static ma_result ma_decoder_init__internal(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result = MA_NO_BACKEND; - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDecoder != NULL); - - /* Silence some warnings in the case that we don't have any decoder backends enabled. */ - (void)onRead; - (void)onSeek; - (void)pUserData; - - - /* If we've specified a specific encoding type, try that first. */ - if (pConfig->encodingFormat != ma_encoding_format_unknown) { - #ifdef MA_HAS_WAV - if (pConfig->encodingFormat == ma_encoding_format_wav) { - result = ma_decoder_init_wav__internal(pConfig, pDecoder); - } - #endif - #ifdef MA_HAS_FLAC - if (pConfig->encodingFormat == ma_encoding_format_flac) { - result = ma_decoder_init_flac__internal(pConfig, pDecoder); - } - #endif - #ifdef MA_HAS_MP3 - if (pConfig->encodingFormat == ma_encoding_format_mp3) { - result = ma_decoder_init_mp3__internal(pConfig, pDecoder); - } - #endif - #ifdef MA_HAS_VORBIS - if (pConfig->encodingFormat == ma_encoding_format_vorbis) { - result = ma_decoder_init_vorbis__internal(pConfig, pDecoder); - } - #endif - - /* If we weren't able to initialize the decoder, seek back to the start to give the next attempts a clean start. */ - if (result != MA_SUCCESS) { - onSeek(pDecoder, 0, ma_seek_origin_start); - } - } - - if (result != MA_SUCCESS) { - /* Getting here means we couldn't load a specific decoding backend based on the encoding format. */ - - /* - We use trial and error to open a decoder. We prioritize custom decoders so that if they - implement the same encoding format they take priority over the built-in decoders. - */ - if (result != MA_SUCCESS) { - result = ma_decoder_init_custom__internal(pConfig, pDecoder); - if (result != MA_SUCCESS) { - onSeek(pDecoder, 0, ma_seek_origin_start); - } - } - - /* - If we get to this point and we still haven't found a decoder, and the caller has requested a - specific encoding format, there's no hope for it. Abort. - */ - if (pConfig->encodingFormat != ma_encoding_format_unknown) { - return MA_NO_BACKEND; - } - - #ifdef MA_HAS_WAV - if (result != MA_SUCCESS) { - result = ma_decoder_init_wav__internal(pConfig, pDecoder); - if (result != MA_SUCCESS) { - onSeek(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - #ifdef MA_HAS_FLAC - if (result != MA_SUCCESS) { - result = ma_decoder_init_flac__internal(pConfig, pDecoder); - if (result != MA_SUCCESS) { - onSeek(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - #ifdef MA_HAS_MP3 - if (result != MA_SUCCESS) { - result = ma_decoder_init_mp3__internal(pConfig, pDecoder); - if (result != MA_SUCCESS) { - onSeek(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - #ifdef MA_HAS_VORBIS - if (result != MA_SUCCESS) { - result = ma_decoder_init_vorbis__internal(pConfig, pDecoder); - if (result != MA_SUCCESS) { - onSeek(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - } - - if (result != MA_SUCCESS) { - return result; - } - - return ma_decoder__postinit(pConfig, pDecoder); -} - -MA_API ma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_decoder_config config; - ma_result result; - - config = ma_decoder_config_init_copy(pConfig); - - result = ma_decoder__preinit(onRead, onSeek, NULL, pUserData, &config, pDecoder); - if (result != MA_SUCCESS) { - return result; - } - - return ma_decoder_init__internal(onRead, onSeek, pUserData, &config, pDecoder); -} - - -static ma_result ma_decoder__on_read_memory(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead) -{ - size_t bytesRemaining; - - MA_ASSERT(pDecoder->data.memory.dataSize >= pDecoder->data.memory.currentReadPos); - - if (pBytesRead != NULL) { - *pBytesRead = 0; - } - - bytesRemaining = pDecoder->data.memory.dataSize - pDecoder->data.memory.currentReadPos; - if (bytesToRead > bytesRemaining) { - bytesToRead = bytesRemaining; - } - - if (bytesRemaining == 0) { - return MA_AT_END; - } - - if (bytesToRead > 0) { - MA_COPY_MEMORY(pBufferOut, pDecoder->data.memory.pData + pDecoder->data.memory.currentReadPos, bytesToRead); - pDecoder->data.memory.currentReadPos += bytesToRead; - } - - if (pBytesRead != NULL) { - *pBytesRead = bytesToRead; - } - - return MA_SUCCESS; -} - -static ma_result ma_decoder__on_seek_memory(ma_decoder* pDecoder, ma_int64 byteOffset, ma_seek_origin origin) -{ - if (byteOffset > 0 && (ma_uint64)byteOffset > MA_SIZE_MAX) { - return MA_BAD_SEEK; - } - - if (origin == ma_seek_origin_current) { - if (byteOffset > 0) { - if (pDecoder->data.memory.currentReadPos + byteOffset > pDecoder->data.memory.dataSize) { - byteOffset = (ma_int64)(pDecoder->data.memory.dataSize - pDecoder->data.memory.currentReadPos); /* Trying to seek too far forward. */ - } - - pDecoder->data.memory.currentReadPos += (size_t)byteOffset; - } else { - if (pDecoder->data.memory.currentReadPos < (size_t)-byteOffset) { - byteOffset = -(ma_int64)pDecoder->data.memory.currentReadPos; /* Trying to seek too far backwards. */ - } - - pDecoder->data.memory.currentReadPos -= (size_t)-byteOffset; - } - } else { - if (origin == ma_seek_origin_end) { - if (byteOffset < 0) { - byteOffset = -byteOffset; - } - - if (byteOffset > (ma_int64)pDecoder->data.memory.dataSize) { - pDecoder->data.memory.currentReadPos = 0; /* Trying to seek too far back. */ - } else { - pDecoder->data.memory.currentReadPos = pDecoder->data.memory.dataSize - (size_t)byteOffset; - } - } else { - if ((size_t)byteOffset <= pDecoder->data.memory.dataSize) { - pDecoder->data.memory.currentReadPos = (size_t)byteOffset; - } else { - pDecoder->data.memory.currentReadPos = pDecoder->data.memory.dataSize; /* Trying to seek too far forward. */ - } - } - } - - return MA_SUCCESS; -} - -static ma_result ma_decoder__on_tell_memory(ma_decoder* pDecoder, ma_int64* pCursor) -{ - MA_ASSERT(pDecoder != NULL); - MA_ASSERT(pCursor != NULL); - - *pCursor = (ma_int64)pDecoder->data.memory.currentReadPos; - - return MA_SUCCESS; -} - -static ma_result ma_decoder__preinit_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result = ma_decoder__preinit(ma_decoder__on_read_memory, ma_decoder__on_seek_memory, ma_decoder__on_tell_memory, NULL, pConfig, pDecoder); - if (result != MA_SUCCESS) { - return result; - } - - if (pData == NULL || dataSize == 0) { - return MA_INVALID_ARGS; - } - - pDecoder->data.memory.pData = (const ma_uint8*)pData; - pDecoder->data.memory.dataSize = dataSize; - pDecoder->data.memory.currentReadPos = 0; - - (void)pConfig; - return MA_SUCCESS; -} - -MA_API ma_result ma_decoder_init_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_decoder_config config; - ma_result result; - - config = ma_decoder_config_init_copy(pConfig); /* Make sure the config is not NULL. */ - - result = ma_decoder__preinit_memory(pData, dataSize, &config, pDecoder); - if (result != MA_SUCCESS) { - return result; - } - - return ma_decoder_init__internal(ma_decoder__on_read_memory, ma_decoder__on_seek_memory, NULL, &config, pDecoder); -} - - -#if defined(MA_HAS_WAV) || \ - defined(MA_HAS_MP3) || \ - defined(MA_HAS_FLAC) || \ - defined(MA_HAS_VORBIS) || \ - defined(MA_HAS_OPUS) -#define MA_HAS_PATH_API -#endif - -#if defined(MA_HAS_PATH_API) -static const char* ma_path_file_name(const char* path) -{ - const char* fileName; - - if (path == NULL) { - return NULL; - } - - fileName = path; - - /* We just loop through the path until we find the last slash. */ - while (path[0] != '\0') { - if (path[0] == '/' || path[0] == '\\') { - fileName = path; - } - - path += 1; - } - - /* At this point the file name is sitting on a slash, so just move forward. */ - while (fileName[0] != '\0' && (fileName[0] == '/' || fileName[0] == '\\')) { - fileName += 1; - } - - return fileName; -} - -static const wchar_t* ma_path_file_name_w(const wchar_t* path) -{ - const wchar_t* fileName; - - if (path == NULL) { - return NULL; - } - - fileName = path; - - /* We just loop through the path until we find the last slash. */ - while (path[0] != '\0') { - if (path[0] == '/' || path[0] == '\\') { - fileName = path; - } - - path += 1; - } - - /* At this point the file name is sitting on a slash, so just move forward. */ - while (fileName[0] != '\0' && (fileName[0] == '/' || fileName[0] == '\\')) { - fileName += 1; - } - - return fileName; -} - - -static const char* ma_path_extension(const char* path) -{ - const char* extension; - const char* lastOccurance; - - if (path == NULL) { - path = ""; - } - - extension = ma_path_file_name(path); - lastOccurance = NULL; - - /* Just find the last '.' and return. */ - while (extension[0] != '\0') { - if (extension[0] == '.') { - extension += 1; - lastOccurance = extension; - } - - extension += 1; - } - - return (lastOccurance != NULL) ? lastOccurance : extension; -} - -static const wchar_t* ma_path_extension_w(const wchar_t* path) -{ - const wchar_t* extension; - const wchar_t* lastOccurance; - - if (path == NULL) { - path = L""; - } - - extension = ma_path_file_name_w(path); - lastOccurance = NULL; - - /* Just find the last '.' and return. */ - while (extension[0] != '\0') { - if (extension[0] == '.') { - extension += 1; - lastOccurance = extension; - } - - extension += 1; - } - - return (lastOccurance != NULL) ? lastOccurance : extension; -} - - -static ma_bool32 ma_path_extension_equal(const char* path, const char* extension) -{ - const char* ext1; - const char* ext2; - - if (path == NULL || extension == NULL) { - return MA_FALSE; - } - - ext1 = extension; - ext2 = ma_path_extension(path); - -#if defined(_MSC_VER) || defined(__DMC__) - return _stricmp(ext1, ext2) == 0; -#else - return strcasecmp(ext1, ext2) == 0; -#endif -} - -static ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* extension) -{ - const wchar_t* ext1; - const wchar_t* ext2; - - if (path == NULL || extension == NULL) { - return MA_FALSE; - } - - ext1 = extension; - ext2 = ma_path_extension_w(path); - -#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__) - return _wcsicmp(ext1, ext2) == 0; -#else - /* - I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This - isn't the most efficient way to do it, but it should work OK. - */ - { - char ext1MB[4096]; - char ext2MB[4096]; - const wchar_t* pext1 = ext1; - const wchar_t* pext2 = ext2; - mbstate_t mbs1; - mbstate_t mbs2; - - MA_ZERO_OBJECT(&mbs1); - MA_ZERO_OBJECT(&mbs2); - - if (wcsrtombs(ext1MB, &pext1, sizeof(ext1MB), &mbs1) == (size_t)-1) { - return MA_FALSE; - } - if (wcsrtombs(ext2MB, &pext2, sizeof(ext2MB), &mbs2) == (size_t)-1) { - return MA_FALSE; - } - - return strcasecmp(ext1MB, ext2MB) == 0; - } -#endif -} -#endif /* MA_HAS_PATH_API */ - - - -static ma_result ma_decoder__on_read_vfs(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead) -{ - MA_ASSERT(pDecoder != NULL); - MA_ASSERT(pBufferOut != NULL); - - return ma_vfs_or_default_read(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file, pBufferOut, bytesToRead, pBytesRead); -} - -static ma_result ma_decoder__on_seek_vfs(ma_decoder* pDecoder, ma_int64 offset, ma_seek_origin origin) -{ - MA_ASSERT(pDecoder != NULL); - - return ma_vfs_or_default_seek(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file, offset, origin); -} - -static ma_result ma_decoder__on_tell_vfs(ma_decoder* pDecoder, ma_int64* pCursor) -{ - MA_ASSERT(pDecoder != NULL); - - return ma_vfs_or_default_tell(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file, pCursor); -} - -static ma_result ma_decoder__preinit_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - ma_vfs_file file; - - result = ma_decoder__preinit(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, ma_decoder__on_tell_vfs, NULL, pConfig, pDecoder); - if (result != MA_SUCCESS) { - return result; - } - - if (pFilePath == NULL || pFilePath[0] == '\0') { - return MA_INVALID_ARGS; - } - - result = ma_vfs_or_default_open(pVFS, pFilePath, MA_OPEN_MODE_READ, &file); - if (result != MA_SUCCESS) { - return result; - } - - pDecoder->data.vfs.pVFS = pVFS; - pDecoder->data.vfs.file = file; - - return MA_SUCCESS; -} - -MA_API ma_result ma_decoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - ma_decoder_config config; - - config = ma_decoder_config_init_copy(pConfig); - result = ma_decoder__preinit_vfs(pVFS, pFilePath, &config, pDecoder); - if (result != MA_SUCCESS) { - return result; - } - - result = MA_NO_BACKEND; - - if (config.encodingFormat != ma_encoding_format_unknown) { - #ifdef MA_HAS_WAV - if (config.encodingFormat == ma_encoding_format_wav) { - result = ma_decoder_init_wav__internal(&config, pDecoder); - } - #endif - #ifdef MA_HAS_FLAC - if (config.encodingFormat == ma_encoding_format_flac) { - result = ma_decoder_init_flac__internal(&config, pDecoder); - } - #endif - #ifdef MA_HAS_MP3 - if (config.encodingFormat == ma_encoding_format_mp3) { - result = ma_decoder_init_mp3__internal(&config, pDecoder); - } - #endif - #ifdef MA_HAS_VORBIS - if (config.encodingFormat == ma_encoding_format_vorbis) { - result = ma_decoder_init_vorbis__internal(&config, pDecoder); - } - #endif - - /* Make sure we seek back to the start if we didn't initialize a decoder successfully so the next attempts have a fresh start. */ - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - - if (result != MA_SUCCESS) { - /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */ - - /* - We use trial and error to open a decoder. We prioritize custom decoders so that if they - implement the same encoding format they take priority over the built-in decoders. - */ - if (result != MA_SUCCESS) { - result = ma_decoder_init_custom__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - - /* - If we get to this point and we still haven't found a decoder, and the caller has requested a - specific encoding format, there's no hope for it. Abort. - */ - if (config.encodingFormat != ma_encoding_format_unknown) { - return MA_NO_BACKEND; - } - - #ifdef MA_HAS_WAV - if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "wav")) { - result = ma_decoder_init_wav__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - #ifdef MA_HAS_FLAC - if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "flac")) { - result = ma_decoder_init_flac__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - #ifdef MA_HAS_MP3 - if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, "mp3")) { - result = ma_decoder_init_mp3__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - } - - /* If we still haven't got a result just use trial and error. Otherwise we can finish up. */ - if (result != MA_SUCCESS) { - result = ma_decoder_init__internal(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, NULL, &config, pDecoder); - } else { - result = ma_decoder__postinit(&config, pDecoder); - } - - if (result != MA_SUCCESS) { - if (pDecoder->data.vfs.file != NULL) { /* <-- Will be reset to NULL if ma_decoder_uninit() is called in one of the steps above which allows us to avoid a double close of the file. */ - ma_vfs_or_default_close(pVFS, pDecoder->data.vfs.file); - } - - return result; - } - - return MA_SUCCESS; -} - - -static ma_result ma_decoder__preinit_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - ma_vfs_file file; - - result = ma_decoder__preinit(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, ma_decoder__on_tell_vfs, NULL, pConfig, pDecoder); - if (result != MA_SUCCESS) { - return result; - } - - if (pFilePath == NULL || pFilePath[0] == '\0') { - return MA_INVALID_ARGS; - } - - result = ma_vfs_or_default_open_w(pVFS, pFilePath, MA_OPEN_MODE_READ, &file); - if (result != MA_SUCCESS) { - return result; - } - - pDecoder->data.vfs.pVFS = pVFS; - pDecoder->data.vfs.file = file; - - return MA_SUCCESS; -} - -MA_API ma_result ma_decoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - ma_result result; - ma_decoder_config config; - - config = ma_decoder_config_init_copy(pConfig); - result = ma_decoder__preinit_vfs_w(pVFS, pFilePath, &config, pDecoder); - if (result != MA_SUCCESS) { - return result; - } - - result = MA_NO_BACKEND; - - if (config.encodingFormat != ma_encoding_format_unknown) { - #ifdef MA_HAS_WAV - if (config.encodingFormat == ma_encoding_format_wav) { - result = ma_decoder_init_wav__internal(&config, pDecoder); - } - #endif - #ifdef MA_HAS_FLAC - if (config.encodingFormat == ma_encoding_format_flac) { - result = ma_decoder_init_flac__internal(&config, pDecoder); - } - #endif - #ifdef MA_HAS_MP3 - if (config.encodingFormat == ma_encoding_format_mp3) { - result = ma_decoder_init_mp3__internal(&config, pDecoder); - } - #endif - #ifdef MA_HAS_VORBIS - if (config.encodingFormat == ma_encoding_format_vorbis) { - result = ma_decoder_init_vorbis__internal(&config, pDecoder); - } - #endif - - /* Make sure we seek back to the start if we didn't initialize a decoder successfully so the next attempts have a fresh start. */ - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - - if (result != MA_SUCCESS) { - /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */ - - /* - We use trial and error to open a decoder. We prioritize custom decoders so that if they - implement the same encoding format they take priority over the built-in decoders. - */ - if (result != MA_SUCCESS) { - result = ma_decoder_init_custom__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - - /* - If we get to this point and we still haven't found a decoder, and the caller has requested a - specific encoding format, there's no hope for it. Abort. - */ - if (config.encodingFormat != ma_encoding_format_unknown) { - return MA_NO_BACKEND; - } - - #ifdef MA_HAS_WAV - if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"wav")) { - result = ma_decoder_init_wav__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - #ifdef MA_HAS_FLAC - if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"flac")) { - result = ma_decoder_init_flac__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - #ifdef MA_HAS_MP3 - if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L"mp3")) { - result = ma_decoder_init_mp3__internal(&config, pDecoder); - if (result != MA_SUCCESS) { - ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start); - } - } - #endif - } - - /* If we still haven't got a result just use trial and error. Otherwise we can finish up. */ - if (result != MA_SUCCESS) { - result = ma_decoder_init__internal(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, NULL, &config, pDecoder); - } else { - result = ma_decoder__postinit(&config, pDecoder); - } - - if (result != MA_SUCCESS) { - ma_vfs_or_default_close(pVFS, pDecoder->data.vfs.file); - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - return ma_decoder_init_vfs(NULL, pFilePath, pConfig, pDecoder); -} - -MA_API ma_result ma_decoder_init_file_w(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder) -{ - return ma_decoder_init_vfs_w(NULL, pFilePath, pConfig, pDecoder); -} - -MA_API ma_result ma_decoder_uninit(ma_decoder* pDecoder) -{ - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - if (pDecoder->pBackend != NULL) { - if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) { - pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, pDecoder->pBackend, &pDecoder->allocationCallbacks); - } - } - - if (pDecoder->onRead == ma_decoder__on_read_vfs) { - ma_vfs_or_default_close(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file); - pDecoder->data.vfs.file = NULL; - } - - ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks); - ma_data_source_uninit(&pDecoder->ds); - - if (pDecoder->pInputCache != NULL) { - ma_free(pDecoder->pInputCache, &pDecoder->allocationCallbacks); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_uint64 totalFramesReadOut; - void* pRunningFramesOut; - - if (pFramesRead != NULL) { - *pFramesRead = 0; /* Safety. */ - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - if (pDecoder->pBackend == NULL) { - return MA_INVALID_OPERATION; - } - - /* Fast path. */ - if (pDecoder->converter.isPassthrough) { - result = ma_data_source_read_pcm_frames(pDecoder->pBackend, pFramesOut, frameCount, &totalFramesReadOut); - } else { - /* - Getting here means we need to do data conversion. If we're seeking forward and are _not_ doing resampling we can run this in a fast path. If we're doing resampling we - need to run through each sample because we need to ensure it's internal cache is updated. - */ - if (pFramesOut == NULL && pDecoder->converter.hasResampler == MA_FALSE) { - result = ma_data_source_read_pcm_frames(pDecoder->pBackend, NULL, frameCount, &totalFramesReadOut); - } else { - /* Slow path. Need to run everything through the data converter. */ - ma_format internalFormat; - ma_uint32 internalChannels; - - totalFramesReadOut = 0; - pRunningFramesOut = pFramesOut; - - result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, NULL, NULL, 0); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the internal format and channel count. */ - } - - /* - We run a different path depending on whether or not we are using a heap-allocated - intermediary buffer or not. If the data converter does not support the calculation of - the required number of input frames, we'll use the heap-allocated path. Otherwise we'll - use the stack-allocated path. - */ - if (pDecoder->pInputCache != NULL) { - /* We don't have a way of determining the required number of input frames, so need to persistently store input data in a cache. */ - while (totalFramesReadOut < frameCount) { - ma_uint64 framesToReadThisIterationIn; - ma_uint64 framesToReadThisIterationOut; - - /* If there's any data available in the cache, that needs to get processed first. */ - if (pDecoder->inputCacheRemaining > 0) { - framesToReadThisIterationOut = (frameCount - totalFramesReadOut); - framesToReadThisIterationIn = framesToReadThisIterationOut; - if (framesToReadThisIterationIn > pDecoder->inputCacheRemaining) { - framesToReadThisIterationIn = pDecoder->inputCacheRemaining; - } - - result = ma_data_converter_process_pcm_frames(&pDecoder->converter, ma_offset_pcm_frames_ptr(pDecoder->pInputCache, pDecoder->inputCacheConsumed, internalFormat, internalChannels), &framesToReadThisIterationIn, pRunningFramesOut, &framesToReadThisIterationOut); - if (result != MA_SUCCESS) { - break; - } - - pDecoder->inputCacheConsumed += framesToReadThisIterationIn; - pDecoder->inputCacheRemaining -= framesToReadThisIterationIn; - - totalFramesReadOut += framesToReadThisIterationOut; - - if (pRunningFramesOut != NULL) { - pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesToReadThisIterationOut * ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels)); - } - - if (framesToReadThisIterationIn == 0 && framesToReadThisIterationOut == 0) { - break; /* We're done. */ - } - } - - /* Getting here means there's no data in the cache and we need to fill it up from the data source. */ - if (pDecoder->inputCacheRemaining == 0) { - pDecoder->inputCacheConsumed = 0; - - result = ma_data_source_read_pcm_frames(pDecoder->pBackend, pDecoder->pInputCache, pDecoder->inputCacheCap, &pDecoder->inputCacheRemaining); - if (result != MA_SUCCESS) { - break; - } - } - } - } else { - /* We have a way of determining the required number of input frames so just use the stack. */ - while (totalFramesReadOut < frameCount) { - ma_uint8 pIntermediaryBuffer[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* In internal format. */ - ma_uint64 intermediaryBufferCap = sizeof(pIntermediaryBuffer) / ma_get_bytes_per_frame(internalFormat, internalChannels); - ma_uint64 framesToReadThisIterationIn; - ma_uint64 framesReadThisIterationIn; - ma_uint64 framesToReadThisIterationOut; - ma_uint64 framesReadThisIterationOut; - ma_uint64 requiredInputFrameCount; - - framesToReadThisIterationOut = (frameCount - totalFramesReadOut); - framesToReadThisIterationIn = framesToReadThisIterationOut; - if (framesToReadThisIterationIn > intermediaryBufferCap) { - framesToReadThisIterationIn = intermediaryBufferCap; - } - - ma_data_converter_get_required_input_frame_count(&pDecoder->converter, framesToReadThisIterationOut, &requiredInputFrameCount); - if (framesToReadThisIterationIn > requiredInputFrameCount) { - framesToReadThisIterationIn = requiredInputFrameCount; - } - - if (requiredInputFrameCount > 0) { - result = ma_data_source_read_pcm_frames(pDecoder->pBackend, pIntermediaryBuffer, framesToReadThisIterationIn, &framesReadThisIterationIn); - } else { - framesReadThisIterationIn = 0; - } - - /* - At this point we have our decoded data in input format and now we need to convert to output format. Note that even if we didn't read any - input frames, we still want to try processing frames because there may some output frames generated from cached input data. - */ - framesReadThisIterationOut = framesToReadThisIterationOut; - result = ma_data_converter_process_pcm_frames(&pDecoder->converter, pIntermediaryBuffer, &framesReadThisIterationIn, pRunningFramesOut, &framesReadThisIterationOut); - if (result != MA_SUCCESS) { - break; - } - - totalFramesReadOut += framesReadThisIterationOut; - - if (pRunningFramesOut != NULL) { - pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesReadThisIterationOut * ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels)); - } - - if (framesReadThisIterationIn == 0 && framesReadThisIterationOut == 0) { - break; /* We're done. */ - } - } - } - } - } - - pDecoder->readPointerInPCMFrames += totalFramesReadOut; - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesReadOut; - } - - if (result == MA_SUCCESS && totalFramesReadOut == 0) { - result = MA_AT_END; - } - - return result; -} - -MA_API ma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex) -{ - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - if (pDecoder->pBackend != NULL) { - ma_result result; - ma_uint64 internalFrameIndex; - ma_uint32 internalSampleRate; - ma_uint64 currentFrameIndex; - - result = ma_data_source_get_data_format(pDecoder->pBackend, NULL, NULL, &internalSampleRate, NULL, 0); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the internal sample rate. */ - } - - if (internalSampleRate == pDecoder->outputSampleRate) { - internalFrameIndex = frameIndex; - } else { - internalFrameIndex = ma_calculate_frame_count_after_resampling(internalSampleRate, pDecoder->outputSampleRate, frameIndex); - } - - /* Only seek if we're requesting a different frame to what we're currently sitting on. */ - ma_data_source_get_cursor_in_pcm_frames(pDecoder->pBackend, ¤tFrameIndex); - if (currentFrameIndex != internalFrameIndex) { - result = ma_data_source_seek_to_pcm_frame(pDecoder->pBackend, internalFrameIndex); - if (result == MA_SUCCESS) { - pDecoder->readPointerInPCMFrames = frameIndex; - } - - /* Reset the data converter so that any cached data in the resampler is cleared. */ - ma_data_converter_reset(&pDecoder->converter); - } - - return result; - } - - /* Should never get here, but if we do it means onSeekToPCMFrame was not set by the backend. */ - return MA_INVALID_ARGS; -} - -MA_API ma_result ma_decoder_get_data_format(ma_decoder* pDecoder, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - if (pFormat != NULL) { - *pFormat = pDecoder->outputFormat; - } - - if (pChannels != NULL) { - *pChannels = pDecoder->outputChannels; - } - - if (pSampleRate != NULL) { - *pSampleRate = pDecoder->outputSampleRate; - } - - if (pChannelMap != NULL) { - ma_data_converter_get_output_channel_map(&pDecoder->converter, pChannelMap, channelMapCap); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_decoder_get_cursor_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pCursor) -{ - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = pDecoder->readPointerInPCMFrames; - - return MA_SUCCESS; -} - -MA_API ma_result ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pLength) -{ - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; - - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - if (pDecoder->pBackend != NULL) { - ma_result result; - ma_uint64 internalLengthInPCMFrames; - ma_uint32 internalSampleRate; - - result = ma_data_source_get_length_in_pcm_frames(pDecoder->pBackend, &internalLengthInPCMFrames); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the internal length. */ - } - - result = ma_data_source_get_data_format(pDecoder->pBackend, NULL, NULL, &internalSampleRate, NULL, 0); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the internal sample rate. */ - } - - if (internalSampleRate == pDecoder->outputSampleRate) { - *pLength = internalLengthInPCMFrames; - } else { - *pLength = ma_calculate_frame_count_after_resampling(pDecoder->outputSampleRate, internalSampleRate, internalLengthInPCMFrames); - } - - return MA_SUCCESS; - } else { - return MA_NO_BACKEND; - } -} - -MA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64* pAvailableFrames) -{ - ma_result result; - ma_uint64 totalFrameCount; - - if (pAvailableFrames == NULL) { - return MA_INVALID_ARGS; - } - - *pAvailableFrames = 0; - - if (pDecoder == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_decoder_get_length_in_pcm_frames(pDecoder, &totalFrameCount); - if (result != MA_SUCCESS) { - return result; - } - - if (totalFrameCount <= pDecoder->readPointerInPCMFrames) { - *pAvailableFrames = 0; - } else { - *pAvailableFrames = totalFrameCount - pDecoder->readPointerInPCMFrames; - } - - return MA_SUCCESS; -} - - -static ma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_decoder_config* pConfigOut, ma_uint64* pFrameCountOut, void** ppPCMFramesOut) -{ - ma_result result; - ma_uint64 totalFrameCount; - ma_uint64 bpf; - ma_uint64 dataCapInFrames; - void* pPCMFramesOut; - - MA_ASSERT(pDecoder != NULL); - - totalFrameCount = 0; - bpf = ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels); - - /* The frame count is unknown until we try reading. Thus, we just run in a loop. */ - dataCapInFrames = 0; - pPCMFramesOut = NULL; - for (;;) { - ma_uint64 frameCountToTryReading; - ma_uint64 framesJustRead; - - /* Make room if there's not enough. */ - if (totalFrameCount == dataCapInFrames) { - void* pNewPCMFramesOut; - ma_uint64 newDataCapInFrames = dataCapInFrames*2; - if (newDataCapInFrames == 0) { - newDataCapInFrames = 4096; - } - - if ((newDataCapInFrames * bpf) > MA_SIZE_MAX) { - ma_free(pPCMFramesOut, &pDecoder->allocationCallbacks); - return MA_TOO_BIG; - } - - pNewPCMFramesOut = (void*)ma_realloc(pPCMFramesOut, (size_t)(newDataCapInFrames * bpf), &pDecoder->allocationCallbacks); - if (pNewPCMFramesOut == NULL) { - ma_free(pPCMFramesOut, &pDecoder->allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - dataCapInFrames = newDataCapInFrames; - pPCMFramesOut = pNewPCMFramesOut; - } - - frameCountToTryReading = dataCapInFrames - totalFrameCount; - MA_ASSERT(frameCountToTryReading > 0); - - result = ma_decoder_read_pcm_frames(pDecoder, (ma_uint8*)pPCMFramesOut + (totalFrameCount * bpf), frameCountToTryReading, &framesJustRead); - totalFrameCount += framesJustRead; - - if (result != MA_SUCCESS) { - break; - } - - if (framesJustRead < frameCountToTryReading) { - break; - } - } - - - if (pConfigOut != NULL) { - pConfigOut->format = pDecoder->outputFormat; - pConfigOut->channels = pDecoder->outputChannels; - pConfigOut->sampleRate = pDecoder->outputSampleRate; - } - - if (ppPCMFramesOut != NULL) { - *ppPCMFramesOut = pPCMFramesOut; - } else { - ma_free(pPCMFramesOut, &pDecoder->allocationCallbacks); - } - - if (pFrameCountOut != NULL) { - *pFrameCountOut = totalFrameCount; - } - - ma_decoder_uninit(pDecoder); - return MA_SUCCESS; -} - -MA_API ma_result ma_decode_from_vfs(ma_vfs* pVFS, const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut) -{ - ma_result result; - ma_decoder_config config; - ma_decoder decoder; - - if (pFrameCountOut != NULL) { - *pFrameCountOut = 0; - } - if (ppPCMFramesOut != NULL) { - *ppPCMFramesOut = NULL; - } - - config = ma_decoder_config_init_copy(pConfig); - - result = ma_decoder_init_vfs(pVFS, pFilePath, &config, &decoder); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_decoder__full_decode_and_uninit(&decoder, pConfig, pFrameCountOut, ppPCMFramesOut); - - return result; -} - -MA_API ma_result ma_decode_file(const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut) -{ - return ma_decode_from_vfs(NULL, pFilePath, pConfig, pFrameCountOut, ppPCMFramesOut); -} - -MA_API ma_result ma_decode_memory(const void* pData, size_t dataSize, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut) -{ - ma_decoder_config config; - ma_decoder decoder; - ma_result result; - - if (pFrameCountOut != NULL) { - *pFrameCountOut = 0; - } - if (ppPCMFramesOut != NULL) { - *ppPCMFramesOut = NULL; - } - - if (pData == NULL || dataSize == 0) { - return MA_INVALID_ARGS; - } - - config = ma_decoder_config_init_copy(pConfig); - - result = ma_decoder_init_memory(pData, dataSize, &config, &decoder); - if (result != MA_SUCCESS) { - return result; - } - - return ma_decoder__full_decode_and_uninit(&decoder, pConfig, pFrameCountOut, ppPCMFramesOut); -} -#endif /* MA_NO_DECODING */ - - -#ifndef MA_NO_ENCODING - -#if defined(MA_HAS_WAV) -static size_t ma_encoder__internal_on_write_wav(void* pUserData, const void* pData, size_t bytesToWrite) -{ - ma_encoder* pEncoder = (ma_encoder*)pUserData; - size_t bytesWritten = 0; - - MA_ASSERT(pEncoder != NULL); - - pEncoder->onWrite(pEncoder, pData, bytesToWrite, &bytesWritten); - return bytesWritten; -} - -static drwav_bool32 ma_encoder__internal_on_seek_wav(void* pUserData, int offset, drwav_seek_origin origin) -{ - ma_encoder* pEncoder = (ma_encoder*)pUserData; - ma_result result; - - MA_ASSERT(pEncoder != NULL); - - result = pEncoder->onSeek(pEncoder, offset, (origin == drwav_seek_origin_start) ? ma_seek_origin_start : ma_seek_origin_current); - if (result != MA_SUCCESS) { - return DRWAV_FALSE; - } else { - return DRWAV_TRUE; - } -} - -static ma_result ma_encoder__on_init_wav(ma_encoder* pEncoder) -{ - drwav_data_format wavFormat; - drwav_allocation_callbacks allocationCallbacks; - drwav* pWav; - - MA_ASSERT(pEncoder != NULL); - - pWav = (drwav*)ma_malloc(sizeof(*pWav), &pEncoder->config.allocationCallbacks); - if (pWav == NULL) { - return MA_OUT_OF_MEMORY; - } - - wavFormat.container = drwav_container_riff; - wavFormat.channels = pEncoder->config.channels; - wavFormat.sampleRate = pEncoder->config.sampleRate; - wavFormat.bitsPerSample = ma_get_bytes_per_sample(pEncoder->config.format) * 8; - if (pEncoder->config.format == ma_format_f32) { - wavFormat.format = DR_WAVE_FORMAT_IEEE_FLOAT; - } else { - wavFormat.format = DR_WAVE_FORMAT_PCM; - } - - allocationCallbacks.pUserData = pEncoder->config.allocationCallbacks.pUserData; - allocationCallbacks.onMalloc = pEncoder->config.allocationCallbacks.onMalloc; - allocationCallbacks.onRealloc = pEncoder->config.allocationCallbacks.onRealloc; - allocationCallbacks.onFree = pEncoder->config.allocationCallbacks.onFree; - - if (!drwav_init_write(pWav, &wavFormat, ma_encoder__internal_on_write_wav, ma_encoder__internal_on_seek_wav, pEncoder, &allocationCallbacks)) { - return MA_ERROR; - } - - pEncoder->pInternalEncoder = pWav; - - return MA_SUCCESS; -} - -static void ma_encoder__on_uninit_wav(ma_encoder* pEncoder) -{ - drwav* pWav; - - MA_ASSERT(pEncoder != NULL); - - pWav = (drwav*)pEncoder->pInternalEncoder; - MA_ASSERT(pWav != NULL); - - drwav_uninit(pWav); - ma_free(pWav, &pEncoder->config.allocationCallbacks); -} - -static ma_result ma_encoder__on_write_pcm_frames_wav(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten) -{ - drwav* pWav; - ma_uint64 framesWritten; - - MA_ASSERT(pEncoder != NULL); - - pWav = (drwav*)pEncoder->pInternalEncoder; - MA_ASSERT(pWav != NULL); - - framesWritten = drwav_write_pcm_frames(pWav, frameCount, pFramesIn); - - if (pFramesWritten != NULL) { - *pFramesWritten = framesWritten; - } - - return MA_SUCCESS; -} -#endif - -MA_API ma_encoder_config ma_encoder_config_init(ma_encoding_format encodingFormat, ma_format format, ma_uint32 channels, ma_uint32 sampleRate) -{ - ma_encoder_config config; - - MA_ZERO_OBJECT(&config); - config.encodingFormat = encodingFormat; - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - - return config; -} - -MA_API ma_result ma_encoder_preinit(const ma_encoder_config* pConfig, ma_encoder* pEncoder) -{ - ma_result result; - - if (pEncoder == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pEncoder); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->format == ma_format_unknown || pConfig->channels == 0 || pConfig->sampleRate == 0) { - return MA_INVALID_ARGS; - } - - pEncoder->config = *pConfig; - - result = ma_allocation_callbacks_init_copy(&pEncoder->config.allocationCallbacks, &pConfig->allocationCallbacks); - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_encoder_init__internal(ma_encoder_write_proc onWrite, ma_encoder_seek_proc onSeek, void* pUserData, ma_encoder* pEncoder) -{ - ma_result result = MA_SUCCESS; - - /* This assumes ma_encoder_preinit() has been called prior. */ - MA_ASSERT(pEncoder != NULL); - - if (onWrite == NULL || onSeek == NULL) { - return MA_INVALID_ARGS; - } - - pEncoder->onWrite = onWrite; - pEncoder->onSeek = onSeek; - pEncoder->pUserData = pUserData; - - switch (pEncoder->config.encodingFormat) - { - case ma_encoding_format_wav: - { - #if defined(MA_HAS_WAV) - pEncoder->onInit = ma_encoder__on_init_wav; - pEncoder->onUninit = ma_encoder__on_uninit_wav; - pEncoder->onWritePCMFrames = ma_encoder__on_write_pcm_frames_wav; - #else - result = MA_NO_BACKEND; - #endif - } break; - - default: - { - result = MA_INVALID_ARGS; - } break; - } - - /* Getting here means we should have our backend callbacks set up. */ - if (result == MA_SUCCESS) { - result = pEncoder->onInit(pEncoder); - } - - return result; -} - -static ma_result ma_encoder__on_write_vfs(ma_encoder* pEncoder, const void* pBufferIn, size_t bytesToWrite, size_t* pBytesWritten) -{ - return ma_vfs_or_default_write(pEncoder->data.vfs.pVFS, pEncoder->data.vfs.file, pBufferIn, bytesToWrite, pBytesWritten); -} - -static ma_result ma_encoder__on_seek_vfs(ma_encoder* pEncoder, ma_int64 offset, ma_seek_origin origin) -{ - return ma_vfs_or_default_seek(pEncoder->data.vfs.pVFS, pEncoder->data.vfs.file, offset, origin); -} - -MA_API ma_result ma_encoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder) -{ - ma_result result; - ma_vfs_file file; - - result = ma_encoder_preinit(pConfig, pEncoder); - if (result != MA_SUCCESS) { - return result; - } - - /* Now open the file. If this fails we don't need to uninitialize the encoder. */ - result = ma_vfs_or_default_open(pVFS, pFilePath, MA_OPEN_MODE_WRITE, &file); - if (result != MA_SUCCESS) { - return result; - } - - pEncoder->data.vfs.pVFS = pVFS; - pEncoder->data.vfs.file = file; - - result = ma_encoder_init__internal(ma_encoder__on_write_vfs, ma_encoder__on_seek_vfs, NULL, pEncoder); - if (result != MA_SUCCESS) { - ma_vfs_or_default_close(pVFS, file); - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_encoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder) -{ - ma_result result; - ma_vfs_file file; - - result = ma_encoder_preinit(pConfig, pEncoder); - if (result != MA_SUCCESS) { - return result; - } - - /* Now open the file. If this fails we don't need to uninitialize the encoder. */ - result = ma_vfs_or_default_open_w(pVFS, pFilePath, MA_OPEN_MODE_WRITE, &file); - if (result != MA_SUCCESS) { - return result; - } - - pEncoder->data.vfs.pVFS = pVFS; - pEncoder->data.vfs.file = file; - - result = ma_encoder_init__internal(ma_encoder__on_write_vfs, ma_encoder__on_seek_vfs, NULL, pEncoder); - if (result != MA_SUCCESS) { - ma_vfs_or_default_close(pVFS, file); - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_encoder_init_file(const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder) -{ - return ma_encoder_init_vfs(NULL, pFilePath, pConfig, pEncoder); -} - -MA_API ma_result ma_encoder_init_file_w(const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder) -{ - return ma_encoder_init_vfs_w(NULL, pFilePath, pConfig, pEncoder); -} - -MA_API ma_result ma_encoder_init(ma_encoder_write_proc onWrite, ma_encoder_seek_proc onSeek, void* pUserData, const ma_encoder_config* pConfig, ma_encoder* pEncoder) -{ - ma_result result; - - result = ma_encoder_preinit(pConfig, pEncoder); - if (result != MA_SUCCESS) { - return result; - } - - return ma_encoder_init__internal(onWrite, onSeek, pUserData, pEncoder); -} - - -MA_API void ma_encoder_uninit(ma_encoder* pEncoder) -{ - if (pEncoder == NULL) { - return; - } - - if (pEncoder->onUninit) { - pEncoder->onUninit(pEncoder); - } - - /* If we have a file handle, close it. */ - if (pEncoder->onWrite == ma_encoder__on_write_vfs) { - ma_vfs_or_default_close(pEncoder->data.vfs.pVFS, pEncoder->data.vfs.file); - pEncoder->data.vfs.file = NULL; - } -} - - -MA_API ma_result ma_encoder_write_pcm_frames(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten) -{ - if (pFramesWritten != NULL) { - *pFramesWritten = 0; - } - - if (pEncoder == NULL || pFramesIn == NULL) { - return MA_INVALID_ARGS; - } - - return pEncoder->onWritePCMFrames(pEncoder, pFramesIn, frameCount, pFramesWritten); -} -#endif /* MA_NO_ENCODING */ - - - -/************************************************************************************************************************************************************** - -Generation - -**************************************************************************************************************************************************************/ -#ifndef MA_NO_GENERATION -MA_API ma_waveform_config ma_waveform_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_waveform_type type, double amplitude, double frequency) -{ - ma_waveform_config config; - - MA_ZERO_OBJECT(&config); - config.format = format; - config.channels = channels; - config.sampleRate = sampleRate; - config.type = type; - config.amplitude = amplitude; - config.frequency = frequency; - - return config; -} - -static ma_result ma_waveform__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_waveform_read_pcm_frames((ma_waveform*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_waveform__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_waveform_seek_to_pcm_frame((ma_waveform*)pDataSource, frameIndex); -} - -static ma_result ma_waveform__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - ma_waveform* pWaveform = (ma_waveform*)pDataSource; - - *pFormat = pWaveform->config.format; - *pChannels = pWaveform->config.channels; - *pSampleRate = pWaveform->config.sampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pWaveform->config.channels); - - return MA_SUCCESS; -} - -static ma_result ma_waveform__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - ma_waveform* pWaveform = (ma_waveform*)pDataSource; - - *pCursor = (ma_uint64)(pWaveform->time / pWaveform->advance); - - return MA_SUCCESS; -} - -static double ma_waveform__calculate_advance(ma_uint32 sampleRate, double frequency) -{ - return (1.0 / (sampleRate / frequency)); -} - -static void ma_waveform__update_advance(ma_waveform* pWaveform) -{ - pWaveform->advance = ma_waveform__calculate_advance(pWaveform->config.sampleRate, pWaveform->config.frequency); -} - -static ma_data_source_vtable g_ma_waveform_data_source_vtable = -{ - ma_waveform__data_source_on_read, - ma_waveform__data_source_on_seek, - ma_waveform__data_source_on_get_data_format, - ma_waveform__data_source_on_get_cursor, - NULL, /* onGetLength. There's no notion of a length in waveforms. */ - NULL, /* onSetLooping */ - 0 -}; - -MA_API ma_result ma_waveform_init(const ma_waveform_config* pConfig, ma_waveform* pWaveform) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - - if (pWaveform == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pWaveform); - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_waveform_data_source_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pWaveform->ds); - if (result != MA_SUCCESS) { - return result; - } - - pWaveform->config = *pConfig; - pWaveform->advance = ma_waveform__calculate_advance(pWaveform->config.sampleRate, pWaveform->config.frequency); - pWaveform->time = 0; - - return MA_SUCCESS; -} - -MA_API void ma_waveform_uninit(ma_waveform* pWaveform) -{ - if (pWaveform == NULL) { - return; - } - - ma_data_source_uninit(&pWaveform->ds); -} - -MA_API ma_result ma_waveform_set_amplitude(ma_waveform* pWaveform, double amplitude) -{ - if (pWaveform == NULL) { - return MA_INVALID_ARGS; - } - - pWaveform->config.amplitude = amplitude; - return MA_SUCCESS; -} - -MA_API ma_result ma_waveform_set_frequency(ma_waveform* pWaveform, double frequency) -{ - if (pWaveform == NULL) { - return MA_INVALID_ARGS; - } - - pWaveform->config.frequency = frequency; - ma_waveform__update_advance(pWaveform); - - return MA_SUCCESS; -} - -MA_API ma_result ma_waveform_set_type(ma_waveform* pWaveform, ma_waveform_type type) -{ - if (pWaveform == NULL) { - return MA_INVALID_ARGS; - } - - pWaveform->config.type = type; - return MA_SUCCESS; -} - -MA_API ma_result ma_waveform_set_sample_rate(ma_waveform* pWaveform, ma_uint32 sampleRate) -{ - if (pWaveform == NULL) { - return MA_INVALID_ARGS; - } - - pWaveform->config.sampleRate = sampleRate; - ma_waveform__update_advance(pWaveform); - - return MA_SUCCESS; -} - -static float ma_waveform_sine_f32(double time, double amplitude) -{ - return (float)(ma_sind(MA_TAU_D * time) * amplitude); -} - -static ma_int16 ma_waveform_sine_s16(double time, double amplitude) -{ - return ma_pcm_sample_f32_to_s16(ma_waveform_sine_f32(time, amplitude)); -} - -static float ma_waveform_square_f32(double time, double amplitude) -{ - double f = time - (ma_int64)time; - double r; - - if (f < 0.5) { - r = amplitude; - } else { - r = -amplitude; - } - - return (float)r; -} - -static ma_int16 ma_waveform_square_s16(double time, double amplitude) -{ - return ma_pcm_sample_f32_to_s16(ma_waveform_square_f32(time, amplitude)); -} - -static float ma_waveform_triangle_f32(double time, double amplitude) -{ - double f = time - (ma_int64)time; - double r; - - r = 2 * ma_abs(2 * (f - 0.5)) - 1; - - return (float)(r * amplitude); -} - -static ma_int16 ma_waveform_triangle_s16(double time, double amplitude) -{ - return ma_pcm_sample_f32_to_s16(ma_waveform_triangle_f32(time, amplitude)); -} - -static float ma_waveform_sawtooth_f32(double time, double amplitude) -{ - double f = time - (ma_int64)time; - double r; - - r = 2 * (f - 0.5); - - return (float)(r * amplitude); -} - -static ma_int16 ma_waveform_sawtooth_s16(double time, double amplitude) -{ - return ma_pcm_sample_f32_to_s16(ma_waveform_sawtooth_f32(time, amplitude)); -} - -static void ma_waveform_read_pcm_frames__sine(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint64 iChannel; - ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format); - ma_uint32 bpf = bps * pWaveform->config.channels; - - MA_ASSERT(pWaveform != NULL); - MA_ASSERT(pFramesOut != NULL); - - if (pWaveform->config.format == ma_format_f32) { - float* pFramesOutF32 = (float*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_sine_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else if (pWaveform->config.format == ma_format_s16) { - ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_int16 s = ma_waveform_sine_s16(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_sine_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } -} - -static void ma_waveform_read_pcm_frames__square(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint64 iChannel; - ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format); - ma_uint32 bpf = bps * pWaveform->config.channels; - - MA_ASSERT(pWaveform != NULL); - MA_ASSERT(pFramesOut != NULL); - - if (pWaveform->config.format == ma_format_f32) { - float* pFramesOutF32 = (float*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_square_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else if (pWaveform->config.format == ma_format_s16) { - ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_int16 s = ma_waveform_square_s16(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_square_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } -} - -static void ma_waveform_read_pcm_frames__triangle(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint64 iChannel; - ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format); - ma_uint32 bpf = bps * pWaveform->config.channels; - - MA_ASSERT(pWaveform != NULL); - MA_ASSERT(pFramesOut != NULL); - - if (pWaveform->config.format == ma_format_f32) { - float* pFramesOutF32 = (float*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_triangle_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else if (pWaveform->config.format == ma_format_s16) { - ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_int16 s = ma_waveform_triangle_s16(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_triangle_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } -} - -static void ma_waveform_read_pcm_frames__sawtooth(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint64 iChannel; - ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format); - ma_uint32 bpf = bps * pWaveform->config.channels; - - MA_ASSERT(pWaveform != NULL); - MA_ASSERT(pFramesOut != NULL); - - if (pWaveform->config.format == ma_format_f32) { - float* pFramesOutF32 = (float*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_sawtooth_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else if (pWaveform->config.format == ma_format_s16) { - ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_int16 s = ma_waveform_sawtooth_s16(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_waveform_sawtooth_f32(pWaveform->time, pWaveform->config.amplitude); - pWaveform->time += pWaveform->advance; - - for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) { - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } -} - -MA_API ma_result ma_waveform_read_pcm_frames(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pWaveform == NULL) { - return MA_INVALID_ARGS; - } - - if (pFramesOut != NULL) { - switch (pWaveform->config.type) - { - case ma_waveform_type_sine: - { - ma_waveform_read_pcm_frames__sine(pWaveform, pFramesOut, frameCount); - } break; - - case ma_waveform_type_square: - { - ma_waveform_read_pcm_frames__square(pWaveform, pFramesOut, frameCount); - } break; - - case ma_waveform_type_triangle: - { - ma_waveform_read_pcm_frames__triangle(pWaveform, pFramesOut, frameCount); - } break; - - case ma_waveform_type_sawtooth: - { - ma_waveform_read_pcm_frames__sawtooth(pWaveform, pFramesOut, frameCount); - } break; - - default: return MA_INVALID_OPERATION; /* Unknown waveform type. */ - } - } else { - pWaveform->time += pWaveform->advance * (ma_int64)frameCount; /* Cast to int64 required for VC6. Won't affect anything in practice. */ - } - - if (pFramesRead != NULL) { - *pFramesRead = frameCount; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_waveform_seek_to_pcm_frame(ma_waveform* pWaveform, ma_uint64 frameIndex) -{ - if (pWaveform == NULL) { - return MA_INVALID_ARGS; - } - - pWaveform->time = pWaveform->advance * (ma_int64)frameIndex; /* Casting for VC6. Won't be an issue in practice. */ - - return MA_SUCCESS; -} - - -MA_API ma_noise_config ma_noise_config_init(ma_format format, ma_uint32 channels, ma_noise_type type, ma_int32 seed, double amplitude) -{ - ma_noise_config config; - MA_ZERO_OBJECT(&config); - - config.format = format; - config.channels = channels; - config.type = type; - config.seed = seed; - config.amplitude = amplitude; - - if (config.seed == 0) { - config.seed = MA_DEFAULT_LCG_SEED; - } - - return config; -} - - -static ma_result ma_noise__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_noise_read_pcm_frames((ma_noise*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_noise__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - /* No-op. Just pretend to be successful. */ - (void)pDataSource; - (void)frameIndex; - return MA_SUCCESS; -} - -static ma_result ma_noise__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - ma_noise* pNoise = (ma_noise*)pDataSource; - - *pFormat = pNoise->config.format; - *pChannels = pNoise->config.channels; - *pSampleRate = 0; /* There is no notion of sample rate with noise generation. */ - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pNoise->config.channels); - - return MA_SUCCESS; -} - -static ma_data_source_vtable g_ma_noise_data_source_vtable = -{ - ma_noise__data_source_on_read, - ma_noise__data_source_on_seek, /* No-op for noise. */ - ma_noise__data_source_on_get_data_format, - NULL, /* onGetCursor. No notion of a cursor for noise. */ - NULL, /* onGetLength. No notion of a length for noise. */ - NULL, /* onSetLooping */ - 0 -}; - - -#ifndef MA_PINK_NOISE_BIN_SIZE -#define MA_PINK_NOISE_BIN_SIZE 16 -#endif - -typedef struct -{ - size_t sizeInBytes; - struct - { - size_t binOffset; - size_t accumulationOffset; - size_t counterOffset; - } pink; - struct - { - size_t accumulationOffset; - } brownian; -} ma_noise_heap_layout; - -static ma_result ma_noise_get_heap_layout(const ma_noise_config* pConfig, ma_noise_heap_layout* pHeapLayout) -{ - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->channels == 0) { - return MA_INVALID_ARGS; - } - - pHeapLayout->sizeInBytes = 0; - - /* Pink. */ - if (pConfig->type == ma_noise_type_pink) { - /* bin */ - pHeapLayout->pink.binOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(double*) * pConfig->channels; - pHeapLayout->sizeInBytes += sizeof(double ) * pConfig->channels * MA_PINK_NOISE_BIN_SIZE; - - /* accumulation */ - pHeapLayout->pink.accumulationOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(double) * pConfig->channels; - - /* counter */ - pHeapLayout->pink.counterOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(ma_uint32) * pConfig->channels; - } - - /* Brownian. */ - if (pConfig->type == ma_noise_type_brownian) { - /* accumulation */ - pHeapLayout->brownian.accumulationOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += sizeof(double) * pConfig->channels; - } - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_noise_get_heap_size(const ma_noise_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_noise_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_noise_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_noise_init_preallocated(const ma_noise_config* pConfig, void* pHeap, ma_noise* pNoise) -{ - ma_result result; - ma_noise_heap_layout heapLayout; - ma_data_source_config dataSourceConfig; - ma_uint32 iChannel; - - if (pNoise == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNoise); - - result = ma_noise_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pNoise->_pHeap = pHeap; - MA_ZERO_MEMORY(pNoise->_pHeap, heapLayout.sizeInBytes); - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_noise_data_source_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pNoise->ds); - if (result != MA_SUCCESS) { - return result; - } - - pNoise->config = *pConfig; - ma_lcg_seed(&pNoise->lcg, pConfig->seed); - - if (pNoise->config.type == ma_noise_type_pink) { - pNoise->state.pink.bin = (double** )ma_offset_ptr(pHeap, heapLayout.pink.binOffset); - pNoise->state.pink.accumulation = (double* )ma_offset_ptr(pHeap, heapLayout.pink.accumulationOffset); - pNoise->state.pink.counter = (ma_uint32*)ma_offset_ptr(pHeap, heapLayout.pink.counterOffset); - - for (iChannel = 0; iChannel < pConfig->channels; iChannel += 1) { - pNoise->state.pink.bin[iChannel] = (double*)ma_offset_ptr(pHeap, heapLayout.pink.binOffset + (sizeof(double*) * pConfig->channels) + (sizeof(double) * MA_PINK_NOISE_BIN_SIZE * iChannel)); - pNoise->state.pink.accumulation[iChannel] = 0; - pNoise->state.pink.counter[iChannel] = 1; - } - } - - if (pNoise->config.type == ma_noise_type_brownian) { - pNoise->state.brownian.accumulation = (double*)ma_offset_ptr(pHeap, heapLayout.brownian.accumulationOffset); - - for (iChannel = 0; iChannel < pConfig->channels; iChannel += 1) { - pNoise->state.brownian.accumulation[iChannel] = 0; - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_noise_init(const ma_noise_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_noise* pNoise) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_noise_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_noise_init_preallocated(pConfig, pHeap, pNoise); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pNoise->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_noise_uninit(ma_noise* pNoise, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pNoise == NULL) { - return; - } - - ma_data_source_uninit(&pNoise->ds); - - if (pNoise->_ownsHeap) { - ma_free(pNoise->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_result ma_noise_set_amplitude(ma_noise* pNoise, double amplitude) -{ - if (pNoise == NULL) { - return MA_INVALID_ARGS; - } - - pNoise->config.amplitude = amplitude; - return MA_SUCCESS; -} - -MA_API ma_result ma_noise_set_seed(ma_noise* pNoise, ma_int32 seed) -{ - if (pNoise == NULL) { - return MA_INVALID_ARGS; - } - - pNoise->lcg.state = seed; - return MA_SUCCESS; -} - - -MA_API ma_result ma_noise_set_type(ma_noise* pNoise, ma_noise_type type) -{ - if (pNoise == NULL) { - return MA_INVALID_ARGS; - } - - pNoise->config.type = type; - return MA_SUCCESS; -} - -static MA_INLINE float ma_noise_f32_white(ma_noise* pNoise) -{ - return (float)(ma_lcg_rand_f64(&pNoise->lcg) * pNoise->config.amplitude); -} - -static MA_INLINE ma_int16 ma_noise_s16_white(ma_noise* pNoise) -{ - return ma_pcm_sample_f32_to_s16(ma_noise_f32_white(pNoise)); -} - -static MA_INLINE ma_uint64 ma_noise_read_pcm_frames__white(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint32 iChannel; - const ma_uint32 channels = pNoise->config.channels; - MA_ASSUME(channels > 0); - - if (pNoise->config.format == ma_format_f32) { - float* pFramesOutF32 = (float*)pFramesOut; - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_noise_f32_white(pNoise); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutF32[iFrame*channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutF32[iFrame*channels + iChannel] = ma_noise_f32_white(pNoise); - } - } - } - } else if (pNoise->config.format == ma_format_s16) { - ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut; - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_int16 s = ma_noise_s16_white(pNoise); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutS16[iFrame*channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutS16[iFrame*channels + iChannel] = ma_noise_s16_white(pNoise); - } - } - } - } else { - const ma_uint32 bps = ma_get_bytes_per_sample(pNoise->config.format); - const ma_uint32 bpf = bps * channels; - - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_noise_f32_white(pNoise); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - float s = ma_noise_f32_white(pNoise); - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } - } - - return frameCount; -} - - -static MA_INLINE unsigned int ma_tzcnt32(unsigned int x) -{ - unsigned int n; - - /* Special case for odd numbers since they should happen about half the time. */ - if (x & 0x1) { - return 0; - } - - if (x == 0) { - return sizeof(x) << 3; - } - - n = 1; - if ((x & 0x0000FFFF) == 0) { x >>= 16; n += 16; } - if ((x & 0x000000FF) == 0) { x >>= 8; n += 8; } - if ((x & 0x0000000F) == 0) { x >>= 4; n += 4; } - if ((x & 0x00000003) == 0) { x >>= 2; n += 2; } - n -= x & 0x00000001; - - return n; -} - -/* -Pink noise generation based on Tonic (public domain) with modifications. https://github.com/TonicAudio/Tonic/blob/master/src/Tonic/Noise.h - -This is basically _the_ reference for pink noise from what I've found: http://www.firstpr.com.au/dsp/pink-noise/ -*/ -static MA_INLINE float ma_noise_f32_pink(ma_noise* pNoise, ma_uint32 iChannel) -{ - double result; - double binPrev; - double binNext; - unsigned int ibin; - - ibin = ma_tzcnt32(pNoise->state.pink.counter[iChannel]) & (MA_PINK_NOISE_BIN_SIZE - 1); - - binPrev = pNoise->state.pink.bin[iChannel][ibin]; - binNext = ma_lcg_rand_f64(&pNoise->lcg); - pNoise->state.pink.bin[iChannel][ibin] = binNext; - - pNoise->state.pink.accumulation[iChannel] += (binNext - binPrev); - pNoise->state.pink.counter[iChannel] += 1; - - result = (ma_lcg_rand_f64(&pNoise->lcg) + pNoise->state.pink.accumulation[iChannel]); - result /= 10; - - return (float)(result * pNoise->config.amplitude); -} - -static MA_INLINE ma_int16 ma_noise_s16_pink(ma_noise* pNoise, ma_uint32 iChannel) -{ - return ma_pcm_sample_f32_to_s16(ma_noise_f32_pink(pNoise, iChannel)); -} - -static MA_INLINE ma_uint64 ma_noise_read_pcm_frames__pink(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint32 iChannel; - const ma_uint32 channels = pNoise->config.channels; - MA_ASSUME(channels > 0); - - if (pNoise->config.format == ma_format_f32) { - float* pFramesOutF32 = (float*)pFramesOut; - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_noise_f32_pink(pNoise, 0); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutF32[iFrame*channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutF32[iFrame*channels + iChannel] = ma_noise_f32_pink(pNoise, iChannel); - } - } - } - } else if (pNoise->config.format == ma_format_s16) { - ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut; - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_int16 s = ma_noise_s16_pink(pNoise, 0); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutS16[iFrame*channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutS16[iFrame*channels + iChannel] = ma_noise_s16_pink(pNoise, iChannel); - } - } - } - } else { - const ma_uint32 bps = ma_get_bytes_per_sample(pNoise->config.format); - const ma_uint32 bpf = bps * channels; - - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_noise_f32_pink(pNoise, 0); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - float s = ma_noise_f32_pink(pNoise, iChannel); - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } - } - - return frameCount; -} - - -static MA_INLINE float ma_noise_f32_brownian(ma_noise* pNoise, ma_uint32 iChannel) -{ - double result; - - result = (ma_lcg_rand_f64(&pNoise->lcg) + pNoise->state.brownian.accumulation[iChannel]); - result /= 1.005; /* Don't escape the -1..1 range on average. */ - - pNoise->state.brownian.accumulation[iChannel] = result; - result /= 20; - - return (float)(result * pNoise->config.amplitude); -} - -static MA_INLINE ma_int16 ma_noise_s16_brownian(ma_noise* pNoise, ma_uint32 iChannel) -{ - return ma_pcm_sample_f32_to_s16(ma_noise_f32_brownian(pNoise, iChannel)); -} - -static MA_INLINE ma_uint64 ma_noise_read_pcm_frames__brownian(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount) -{ - ma_uint64 iFrame; - ma_uint32 iChannel; - const ma_uint32 channels = pNoise->config.channels; - MA_ASSUME(channels > 0); - - if (pNoise->config.format == ma_format_f32) { - float* pFramesOutF32 = (float*)pFramesOut; - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_noise_f32_brownian(pNoise, 0); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutF32[iFrame*channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutF32[iFrame*channels + iChannel] = ma_noise_f32_brownian(pNoise, iChannel); - } - } - } - } else if (pNoise->config.format == ma_format_s16) { - ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut; - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - ma_int16 s = ma_noise_s16_brownian(pNoise, 0); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutS16[iFrame*channels + iChannel] = s; - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - pFramesOutS16[iFrame*channels + iChannel] = ma_noise_s16_brownian(pNoise, iChannel); - } - } - } - } else { - const ma_uint32 bps = ma_get_bytes_per_sample(pNoise->config.format); - const ma_uint32 bpf = bps * channels; - - if (pNoise->config.duplicateChannels) { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - float s = ma_noise_f32_brownian(pNoise, 0); - for (iChannel = 0; iChannel < channels; iChannel += 1) { - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } else { - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - for (iChannel = 0; iChannel < channels; iChannel += 1) { - float s = ma_noise_f32_brownian(pNoise, iChannel); - ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none); - } - } - } - } - - return frameCount; -} - -MA_API ma_result ma_noise_read_pcm_frames(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_uint64 framesRead = 0; - - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - if (pNoise == NULL) { - return MA_INVALID_ARGS; - } - - /* The output buffer is allowed to be NULL. Since we aren't tracking cursors or anything we can just do nothing and pretend to be successful. */ - if (pFramesOut == NULL) { - framesRead = frameCount; - } else { - switch (pNoise->config.type) { - case ma_noise_type_white: framesRead = ma_noise_read_pcm_frames__white (pNoise, pFramesOut, frameCount); break; - case ma_noise_type_pink: framesRead = ma_noise_read_pcm_frames__pink (pNoise, pFramesOut, frameCount); break; - case ma_noise_type_brownian: framesRead = ma_noise_read_pcm_frames__brownian(pNoise, pFramesOut, frameCount); break; - default: return MA_INVALID_OPERATION; /* Unknown noise type. */ - } - } - - if (pFramesRead != NULL) { - *pFramesRead = framesRead; - } - - return MA_SUCCESS; -} -#endif /* MA_NO_GENERATION */ - - - -#ifndef MA_NO_RESOURCE_MANAGER -#ifndef MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS -#define MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS 1000 -#endif - -#ifndef MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY -#define MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY 1024 -#endif - -MA_API ma_resource_manager_pipeline_notifications ma_resource_manager_pipeline_notifications_init(void) -{ - ma_resource_manager_pipeline_notifications notifications; - - MA_ZERO_OBJECT(¬ifications); - - return notifications; -} - -static void ma_resource_manager_pipeline_notifications_signal_all_notifications(const ma_resource_manager_pipeline_notifications* pPipelineNotifications) -{ - if (pPipelineNotifications == NULL) { - return; - } - - if (pPipelineNotifications->init.pNotification) { ma_async_notification_signal(pPipelineNotifications->init.pNotification); } - if (pPipelineNotifications->done.pNotification) { ma_async_notification_signal(pPipelineNotifications->done.pNotification); } -} - -static void ma_resource_manager_pipeline_notifications_acquire_all_fences(const ma_resource_manager_pipeline_notifications* pPipelineNotifications) -{ - if (pPipelineNotifications == NULL) { - return; - } - - if (pPipelineNotifications->init.pFence != NULL) { ma_fence_acquire(pPipelineNotifications->init.pFence); } - if (pPipelineNotifications->done.pFence != NULL) { ma_fence_acquire(pPipelineNotifications->done.pFence); } -} - -static void ma_resource_manager_pipeline_notifications_release_all_fences(const ma_resource_manager_pipeline_notifications* pPipelineNotifications) -{ - if (pPipelineNotifications == NULL) { - return; - } - - if (pPipelineNotifications->init.pFence != NULL) { ma_fence_release(pPipelineNotifications->init.pFence); } - if (pPipelineNotifications->done.pFence != NULL) { ma_fence_release(pPipelineNotifications->done.pFence); } -} - - - -#ifndef MA_DEFAULT_HASH_SEED -#define MA_DEFAULT_HASH_SEED 42 -#endif - -/* MurmurHash3. Based on code from https://github.com/PeterScott/murmur3/blob/master/murmur3.c (public domain). */ -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #if __GNUC__ >= 7 - #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" - #endif -#endif - -static MA_INLINE ma_uint32 ma_rotl32(ma_uint32 x, ma_int8 r) -{ - return (x << r) | (x >> (32 - r)); -} - -static MA_INLINE ma_uint32 ma_hash_getblock(const ma_uint32* blocks, int i) -{ - if (ma_is_little_endian()) { - return blocks[i]; - } else { - return ma_swap_endian_uint32(blocks[i]); - } -} - -static MA_INLINE ma_uint32 ma_hash_fmix32(ma_uint32 h) -{ - h ^= h >> 16; - h *= 0x85ebca6b; - h ^= h >> 13; - h *= 0xc2b2ae35; - h ^= h >> 16; - - return h; -} - -static ma_uint32 ma_hash_32(const void* key, int len, ma_uint32 seed) -{ - const ma_uint8* data = (const ma_uint8*)key; - const ma_uint32* blocks; - const ma_uint8* tail; - const int nblocks = len / 4; - ma_uint32 h1 = seed; - ma_uint32 c1 = 0xcc9e2d51; - ma_uint32 c2 = 0x1b873593; - ma_uint32 k1; - int i; - - blocks = (const ma_uint32 *)(data + nblocks*4); - - for(i = -nblocks; i; i++) { - k1 = ma_hash_getblock(blocks,i); - - k1 *= c1; - k1 = ma_rotl32(k1, 15); - k1 *= c2; - - h1 ^= k1; - h1 = ma_rotl32(h1, 13); - h1 = h1*5 + 0xe6546b64; - } - - - tail = (const ma_uint8*)(data + nblocks*4); - - k1 = 0; - switch(len & 3) { - case 3: k1 ^= tail[2] << 16; - case 2: k1 ^= tail[1] << 8; - case 1: k1 ^= tail[0]; - k1 *= c1; k1 = ma_rotl32(k1, 15); k1 *= c2; h1 ^= k1; - }; - - - h1 ^= len; - h1 = ma_hash_fmix32(h1); - - return h1; -} - -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push -#endif -/* End MurmurHash3 */ - -static ma_uint32 ma_hash_string_32(const char* str) -{ - return ma_hash_32(str, (int)strlen(str), MA_DEFAULT_HASH_SEED); -} - -static ma_uint32 ma_hash_string_w_32(const wchar_t* str) -{ - return ma_hash_32(str, (int)wcslen(str) * sizeof(*str), MA_DEFAULT_HASH_SEED); -} - - - - -/* -Basic BST Functions -*/ -static ma_result ma_resource_manager_data_buffer_node_search(ma_resource_manager* pResourceManager, ma_uint32 hashedName32, ma_resource_manager_data_buffer_node** ppDataBufferNode) -{ - ma_resource_manager_data_buffer_node* pCurrentNode; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(ppDataBufferNode != NULL); - - pCurrentNode = pResourceManager->pRootDataBufferNode; - while (pCurrentNode != NULL) { - if (hashedName32 == pCurrentNode->hashedName32) { - break; /* Found. */ - } else if (hashedName32 < pCurrentNode->hashedName32) { - pCurrentNode = pCurrentNode->pChildLo; - } else { - pCurrentNode = pCurrentNode->pChildHi; - } - } - - *ppDataBufferNode = pCurrentNode; - - if (pCurrentNode == NULL) { - return MA_DOES_NOT_EXIST; - } else { - return MA_SUCCESS; - } -} - -static ma_result ma_resource_manager_data_buffer_node_insert_point(ma_resource_manager* pResourceManager, ma_uint32 hashedName32, ma_resource_manager_data_buffer_node** ppInsertPoint) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager_data_buffer_node* pCurrentNode; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(ppInsertPoint != NULL); - - *ppInsertPoint = NULL; - - if (pResourceManager->pRootDataBufferNode == NULL) { - return MA_SUCCESS; /* No items. */ - } - - /* We need to find the node that will become the parent of the new node. If a node is found that already has the same hashed name we need to return MA_ALREADY_EXISTS. */ - pCurrentNode = pResourceManager->pRootDataBufferNode; - while (pCurrentNode != NULL) { - if (hashedName32 == pCurrentNode->hashedName32) { - result = MA_ALREADY_EXISTS; - break; - } else { - if (hashedName32 < pCurrentNode->hashedName32) { - if (pCurrentNode->pChildLo == NULL) { - result = MA_SUCCESS; - break; - } else { - pCurrentNode = pCurrentNode->pChildLo; - } - } else { - if (pCurrentNode->pChildHi == NULL) { - result = MA_SUCCESS; - break; - } else { - pCurrentNode = pCurrentNode->pChildHi; - } - } - } - } - - *ppInsertPoint = pCurrentNode; - return result; -} - -static ma_result ma_resource_manager_data_buffer_node_insert_at(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_resource_manager_data_buffer_node* pInsertPoint) -{ - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - - /* The key must have been set before calling this function. */ - MA_ASSERT(pDataBufferNode->hashedName32 != 0); - - if (pInsertPoint == NULL) { - /* It's the first node. */ - pResourceManager->pRootDataBufferNode = pDataBufferNode; - } else { - /* It's not the first node. It needs to be inserted. */ - if (pDataBufferNode->hashedName32 < pInsertPoint->hashedName32) { - MA_ASSERT(pInsertPoint->pChildLo == NULL); - pInsertPoint->pChildLo = pDataBufferNode; - } else { - MA_ASSERT(pInsertPoint->pChildHi == NULL); - pInsertPoint->pChildHi = pDataBufferNode; - } - } - - pDataBufferNode->pParent = pInsertPoint; - - return MA_SUCCESS; -} - -#if 0 /* Unused for now. */ -static ma_result ma_resource_manager_data_buffer_node_insert(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - ma_result result; - ma_resource_manager_data_buffer_node* pInsertPoint; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - - result = ma_resource_manager_data_buffer_node_insert_point(pResourceManager, pDataBufferNode->hashedName32, &pInsertPoint); - if (result != MA_SUCCESS) { - return MA_INVALID_ARGS; - } - - return ma_resource_manager_data_buffer_node_insert_at(pResourceManager, pDataBufferNode, pInsertPoint); -} -#endif - -static MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_min(ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - ma_resource_manager_data_buffer_node* pCurrentNode; - - MA_ASSERT(pDataBufferNode != NULL); - - pCurrentNode = pDataBufferNode; - while (pCurrentNode->pChildLo != NULL) { - pCurrentNode = pCurrentNode->pChildLo; - } - - return pCurrentNode; -} - -static MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_max(ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - ma_resource_manager_data_buffer_node* pCurrentNode; - - MA_ASSERT(pDataBufferNode != NULL); - - pCurrentNode = pDataBufferNode; - while (pCurrentNode->pChildHi != NULL) { - pCurrentNode = pCurrentNode->pChildHi; - } - - return pCurrentNode; -} - -static MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_inorder_successor(ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - MA_ASSERT(pDataBufferNode != NULL); - MA_ASSERT(pDataBufferNode->pChildHi != NULL); - - return ma_resource_manager_data_buffer_node_find_min(pDataBufferNode->pChildHi); -} - -static MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_inorder_predecessor(ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - MA_ASSERT(pDataBufferNode != NULL); - MA_ASSERT(pDataBufferNode->pChildLo != NULL); - - return ma_resource_manager_data_buffer_node_find_max(pDataBufferNode->pChildLo); -} - -static ma_result ma_resource_manager_data_buffer_node_remove(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - - if (pDataBufferNode->pChildLo == NULL) { - if (pDataBufferNode->pChildHi == NULL) { - /* Simple case - deleting a buffer with no children. */ - if (pDataBufferNode->pParent == NULL) { - MA_ASSERT(pResourceManager->pRootDataBufferNode == pDataBufferNode); /* There is only a single buffer in the tree which should be equal to the root node. */ - pResourceManager->pRootDataBufferNode = NULL; - } else { - if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) { - pDataBufferNode->pParent->pChildLo = NULL; - } else { - pDataBufferNode->pParent->pChildHi = NULL; - } - } - } else { - /* Node has one child - pChildHi != NULL. */ - pDataBufferNode->pChildHi->pParent = pDataBufferNode->pParent; - - if (pDataBufferNode->pParent == NULL) { - MA_ASSERT(pResourceManager->pRootDataBufferNode == pDataBufferNode); - pResourceManager->pRootDataBufferNode = pDataBufferNode->pChildHi; - } else { - if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) { - pDataBufferNode->pParent->pChildLo = pDataBufferNode->pChildHi; - } else { - pDataBufferNode->pParent->pChildHi = pDataBufferNode->pChildHi; - } - } - } - } else { - if (pDataBufferNode->pChildHi == NULL) { - /* Node has one child - pChildLo != NULL. */ - pDataBufferNode->pChildLo->pParent = pDataBufferNode->pParent; - - if (pDataBufferNode->pParent == NULL) { - MA_ASSERT(pResourceManager->pRootDataBufferNode == pDataBufferNode); - pResourceManager->pRootDataBufferNode = pDataBufferNode->pChildLo; - } else { - if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) { - pDataBufferNode->pParent->pChildLo = pDataBufferNode->pChildLo; - } else { - pDataBufferNode->pParent->pChildHi = pDataBufferNode->pChildLo; - } - } - } else { - /* Complex case - deleting a node with two children. */ - ma_resource_manager_data_buffer_node* pReplacementDataBufferNode; - - /* For now we are just going to use the in-order successor as the replacement, but we may want to try to keep this balanced by switching between the two. */ - pReplacementDataBufferNode = ma_resource_manager_data_buffer_node_find_inorder_successor(pDataBufferNode); - MA_ASSERT(pReplacementDataBufferNode != NULL); - - /* - Now that we have our replacement node we can make the change. The simple way to do this would be to just exchange the values, and then remove the replacement - node, however we track specific nodes via pointers which means we can't just swap out the values. We need to instead just change the pointers around. The - replacement node should have at most 1 child. Therefore, we can detach it in terms of our simpler cases above. What we're essentially doing is detaching the - replacement node and reinserting it into the same position as the deleted node. - */ - MA_ASSERT(pReplacementDataBufferNode->pParent != NULL); /* The replacement node should never be the root which means it should always have a parent. */ - MA_ASSERT(pReplacementDataBufferNode->pChildLo == NULL); /* Because we used in-order successor. This would be pChildHi == NULL if we used in-order predecessor. */ - - if (pReplacementDataBufferNode->pChildHi == NULL) { - if (pReplacementDataBufferNode->pParent->pChildLo == pReplacementDataBufferNode) { - pReplacementDataBufferNode->pParent->pChildLo = NULL; - } else { - pReplacementDataBufferNode->pParent->pChildHi = NULL; - } - } else { - pReplacementDataBufferNode->pChildHi->pParent = pReplacementDataBufferNode->pParent; - if (pReplacementDataBufferNode->pParent->pChildLo == pReplacementDataBufferNode) { - pReplacementDataBufferNode->pParent->pChildLo = pReplacementDataBufferNode->pChildHi; - } else { - pReplacementDataBufferNode->pParent->pChildHi = pReplacementDataBufferNode->pChildHi; - } - } - - - /* The replacement node has essentially been detached from the binary tree, so now we need to replace the old data buffer with it. The first thing to update is the parent */ - if (pDataBufferNode->pParent != NULL) { - if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) { - pDataBufferNode->pParent->pChildLo = pReplacementDataBufferNode; - } else { - pDataBufferNode->pParent->pChildHi = pReplacementDataBufferNode; - } - } - - /* Now need to update the replacement node's pointers. */ - pReplacementDataBufferNode->pParent = pDataBufferNode->pParent; - pReplacementDataBufferNode->pChildLo = pDataBufferNode->pChildLo; - pReplacementDataBufferNode->pChildHi = pDataBufferNode->pChildHi; - - /* Now the children of the replacement node need to have their parent pointers updated. */ - if (pReplacementDataBufferNode->pChildLo != NULL) { - pReplacementDataBufferNode->pChildLo->pParent = pReplacementDataBufferNode; - } - if (pReplacementDataBufferNode->pChildHi != NULL) { - pReplacementDataBufferNode->pChildHi->pParent = pReplacementDataBufferNode; - } - - /* Now the root node needs to be updated. */ - if (pResourceManager->pRootDataBufferNode == pDataBufferNode) { - pResourceManager->pRootDataBufferNode = pReplacementDataBufferNode; - } - } - } - - return MA_SUCCESS; -} - -#if 0 /* Unused for now. */ -static ma_result ma_resource_manager_data_buffer_node_remove_by_key(ma_resource_manager* pResourceManager, ma_uint32 hashedName32) -{ - ma_result result; - ma_resource_manager_data_buffer_node* pDataBufferNode; - - result = ma_resource_manager_data_buffer_search(pResourceManager, hashedName32, &pDataBufferNode); - if (result != MA_SUCCESS) { - return result; /* Could not find the data buffer. */ - } - - return ma_resource_manager_data_buffer_remove(pResourceManager, pDataBufferNode); -} -#endif - -static ma_resource_manager_data_supply_type ma_resource_manager_data_buffer_node_get_data_supply_type(ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - return (ma_resource_manager_data_supply_type)c89atomic_load_i32(&pDataBufferNode->data.type); -} - -static void ma_resource_manager_data_buffer_node_set_data_supply_type(ma_resource_manager_data_buffer_node* pDataBufferNode, ma_resource_manager_data_supply_type supplyType) -{ - c89atomic_exchange_i32(&pDataBufferNode->data.type, supplyType); -} - -static ma_result ma_resource_manager_data_buffer_node_increment_ref(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_uint32* pNewRefCount) -{ - ma_uint32 refCount; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - - (void)pResourceManager; - - refCount = c89atomic_fetch_add_32(&pDataBufferNode->refCount, 1) + 1; - - if (pNewRefCount != NULL) { - *pNewRefCount = refCount; - } - - return MA_SUCCESS; -} - -static ma_result ma_resource_manager_data_buffer_node_decrement_ref(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_uint32* pNewRefCount) -{ - ma_uint32 refCount; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - - (void)pResourceManager; - - refCount = c89atomic_fetch_sub_32(&pDataBufferNode->refCount, 1) - 1; - - if (pNewRefCount != NULL) { - *pNewRefCount = refCount; - } - - return MA_SUCCESS; -} - -static void ma_resource_manager_data_buffer_node_free(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - - if (pDataBufferNode->isDataOwnedByResourceManager) { - if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode) == ma_resource_manager_data_supply_type_encoded) { - ma_free((void*)pDataBufferNode->data.backend.encoded.pData, &pResourceManager->config.allocationCallbacks); - pDataBufferNode->data.backend.encoded.pData = NULL; - pDataBufferNode->data.backend.encoded.sizeInBytes = 0; - } else if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode) == ma_resource_manager_data_supply_type_decoded) { - ma_free((void*)pDataBufferNode->data.backend.decoded.pData, &pResourceManager->config.allocationCallbacks); - pDataBufferNode->data.backend.decoded.pData = NULL; - pDataBufferNode->data.backend.decoded.totalFrameCount = 0; - } else if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode) == ma_resource_manager_data_supply_type_decoded_paged) { - ma_paged_audio_buffer_data_uninit(&pDataBufferNode->data.backend.decodedPaged.data, &pResourceManager->config.allocationCallbacks); - } else { - /* Should never hit this if the node was successfully initialized. */ - MA_ASSERT(pDataBufferNode->result != MA_SUCCESS); - } - } - - /* The data buffer itself needs to be freed. */ - ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks); -} - -static ma_result ma_resource_manager_data_buffer_node_result(const ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - MA_ASSERT(pDataBufferNode != NULL); - - return (ma_result)c89atomic_load_i32((ma_result*)&pDataBufferNode->result); /* Need a naughty const-cast here. */ -} - - -static ma_bool32 ma_resource_manager_is_threading_enabled(const ma_resource_manager* pResourceManager) -{ - MA_ASSERT(pResourceManager != NULL); - - return (pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NO_THREADING) == 0; -} - - -typedef struct -{ - union - { - ma_async_notification_event e; - ma_async_notification_poll p; - } backend; /* Must be the first member. */ - ma_resource_manager* pResourceManager; -} ma_resource_manager_inline_notification; - -static ma_result ma_resource_manager_inline_notification_init(ma_resource_manager* pResourceManager, ma_resource_manager_inline_notification* pNotification) -{ - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pNotification != NULL); - - pNotification->pResourceManager = pResourceManager; - - if (ma_resource_manager_is_threading_enabled(pResourceManager)) { - return ma_async_notification_event_init(&pNotification->backend.e); - } else { - return ma_async_notification_poll_init(&pNotification->backend.p); - } -} - -static void ma_resource_manager_inline_notification_uninit(ma_resource_manager_inline_notification* pNotification) -{ - MA_ASSERT(pNotification != NULL); - - if (ma_resource_manager_is_threading_enabled(pNotification->pResourceManager)) { - ma_async_notification_event_uninit(&pNotification->backend.e); - } else { - /* No need to uninitialize a polling notification. */ - } -} - -static void ma_resource_manager_inline_notification_wait(ma_resource_manager_inline_notification* pNotification) -{ - MA_ASSERT(pNotification != NULL); - - if (ma_resource_manager_is_threading_enabled(pNotification->pResourceManager)) { - ma_async_notification_event_wait(&pNotification->backend.e); - } else { - while (ma_async_notification_poll_is_signalled(&pNotification->backend.p) == MA_FALSE) { - ma_result result = ma_resource_manager_process_next_job(pNotification->pResourceManager); - if (result == MA_NO_DATA_AVAILABLE || result == MA_CANCELLED) { - break; - } - } - } -} - -static void ma_resource_manager_inline_notification_wait_and_uninit(ma_resource_manager_inline_notification* pNotification) -{ - ma_resource_manager_inline_notification_wait(pNotification); - ma_resource_manager_inline_notification_uninit(pNotification); -} - - -static void ma_resource_manager_data_buffer_bst_lock(ma_resource_manager* pResourceManager) -{ - MA_ASSERT(pResourceManager != NULL); - - if (ma_resource_manager_is_threading_enabled(pResourceManager)) { - #ifndef MA_NO_THREADING - { - ma_mutex_lock(&pResourceManager->dataBufferBSTLock); - } - #else - { - MA_ASSERT(MA_FALSE); /* Should never hit this. */ - } - #endif - } else { - /* Threading not enabled. Do nothing. */ - } -} - -static void ma_resource_manager_data_buffer_bst_unlock(ma_resource_manager* pResourceManager) -{ - MA_ASSERT(pResourceManager != NULL); - - if (ma_resource_manager_is_threading_enabled(pResourceManager)) { - #ifndef MA_NO_THREADING - { - ma_mutex_unlock(&pResourceManager->dataBufferBSTLock); - } - #else - { - MA_ASSERT(MA_FALSE); /* Should never hit this. */ - } - #endif - } else { - /* Threading not enabled. Do nothing. */ - } -} - -#ifndef MA_NO_THREADING -static ma_thread_result MA_THREADCALL ma_resource_manager_job_thread(void* pUserData) -{ - ma_resource_manager* pResourceManager = (ma_resource_manager*)pUserData; - MA_ASSERT(pResourceManager != NULL); - - for (;;) { - ma_result result; - ma_job job; - - result = ma_resource_manager_next_job(pResourceManager, &job); - if (result != MA_SUCCESS) { - break; - } - - /* Terminate if we got a quit message. */ - if (job.toc.breakup.code == MA_JOB_TYPE_QUIT) { - break; - } - - ma_job_process(&job); - } - - return (ma_thread_result)0; -} -#endif - -MA_API ma_resource_manager_config ma_resource_manager_config_init(void) -{ - ma_resource_manager_config config; - - MA_ZERO_OBJECT(&config); - config.decodedFormat = ma_format_unknown; - config.decodedChannels = 0; - config.decodedSampleRate = 0; - config.jobThreadCount = 1; /* A single miniaudio-managed job thread by default. */ - config.jobQueueCapacity = MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY; - - /* Flags. */ - config.flags = 0; - #ifdef MA_NO_THREADING - { - /* Threading is disabled at compile time so disable threading at runtime as well by default. */ - config.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING; - config.jobThreadCount = 0; - } - #endif - - return config; -} - - -MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pConfig, ma_resource_manager* pResourceManager) -{ - ma_result result; - ma_job_queue_config jobQueueConfig; - - if (pResourceManager == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pResourceManager); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - #ifndef MA_NO_THREADING - { - if (pConfig->jobThreadCount > ma_countof(pResourceManager->jobThreads)) { - return MA_INVALID_ARGS; /* Requesting too many job threads. */ - } - } - #endif - - pResourceManager->config = *pConfig; - ma_allocation_callbacks_init_copy(&pResourceManager->config.allocationCallbacks, &pConfig->allocationCallbacks); - - /* Get the log set up early so we can start using it as soon as possible. */ - if (pResourceManager->config.pLog == NULL) { - result = ma_log_init(&pResourceManager->config.allocationCallbacks, &pResourceManager->log); - if (result == MA_SUCCESS) { - pResourceManager->config.pLog = &pResourceManager->log; - } else { - pResourceManager->config.pLog = NULL; /* Logging is unavailable. */ - } - } - - if (pResourceManager->config.pVFS == NULL) { - result = ma_default_vfs_init(&pResourceManager->defaultVFS, &pResourceManager->config.allocationCallbacks); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the default file system. */ - } - - pResourceManager->config.pVFS = &pResourceManager->defaultVFS; - } - - /* If threading has been disabled at compile time, enfore it at run time as well. */ - #ifdef MA_NO_THREADING - { - pResourceManager->config.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING; - } - #endif - - /* We need to force MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING if MA_RESOURCE_MANAGER_FLAG_NO_THREADING is set. */ - if ((pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NO_THREADING) != 0) { - pResourceManager->config.flags |= MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING; - - /* We cannot allow job threads when MA_RESOURCE_MANAGER_FLAG_NO_THREADING has been set. This is an invalid use case. */ - if (pResourceManager->config.jobThreadCount > 0) { - return MA_INVALID_ARGS; - } - } - - /* Job queue. */ - jobQueueConfig.capacity = pResourceManager->config.jobQueueCapacity; - jobQueueConfig.flags = 0; - if ((pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING) != 0) { - if (pResourceManager->config.jobThreadCount > 0) { - return MA_INVALID_ARGS; /* Non-blocking mode is only valid for self-managed job threads. */ - } - - jobQueueConfig.flags |= MA_JOB_QUEUE_FLAG_NON_BLOCKING; - } - - result = ma_job_queue_init(&jobQueueConfig, &pResourceManager->config.allocationCallbacks, &pResourceManager->jobQueue); - if (result != MA_SUCCESS) { - return result; - } - - - /* Custom decoding backends. */ - if (pConfig->ppCustomDecodingBackendVTables != NULL && pConfig->customDecodingBackendCount > 0) { - size_t sizeInBytes = sizeof(*pResourceManager->config.ppCustomDecodingBackendVTables) * pConfig->customDecodingBackendCount; - - pResourceManager->config.ppCustomDecodingBackendVTables = (ma_decoding_backend_vtable**)ma_malloc(sizeInBytes, &pResourceManager->config.allocationCallbacks); - if (pResourceManager->config.ppCustomDecodingBackendVTables == NULL) { - ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - MA_COPY_MEMORY(pResourceManager->config.ppCustomDecodingBackendVTables, pConfig->ppCustomDecodingBackendVTables, sizeInBytes); - - pResourceManager->config.customDecodingBackendCount = pConfig->customDecodingBackendCount; - pResourceManager->config.pCustomDecodingBackendUserData = pConfig->pCustomDecodingBackendUserData; - } - - - - /* Here is where we initialize our threading stuff. We don't do this if we don't support threading. */ - if (ma_resource_manager_is_threading_enabled(pResourceManager)) { - #ifndef MA_NO_THREADING - { - ma_uint32 iJobThread; - - /* Data buffer lock. */ - result = ma_mutex_init(&pResourceManager->dataBufferBSTLock); - if (result != MA_SUCCESS) { - ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks); - return result; - } - - /* Create the job threads last to ensure the threads has access to valid data. */ - for (iJobThread = 0; iJobThread < pResourceManager->config.jobThreadCount; iJobThread += 1) { - result = ma_thread_create(&pResourceManager->jobThreads[iJobThread], ma_thread_priority_normal, 0, ma_resource_manager_job_thread, pResourceManager, &pResourceManager->config.allocationCallbacks); - if (result != MA_SUCCESS) { - ma_mutex_uninit(&pResourceManager->dataBufferBSTLock); - ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks); - return result; - } - } - } - #else - { - /* Threading is disabled at compile time. We should never get here because validation checks should have already been performed. */ - MA_ASSERT(MA_FALSE); - } - #endif - } - - return MA_SUCCESS; -} - - -static void ma_resource_manager_delete_all_data_buffer_nodes(ma_resource_manager* pResourceManager) -{ - MA_ASSERT(pResourceManager); - - /* If everything was done properly, there shouldn't be any active data buffers. */ - while (pResourceManager->pRootDataBufferNode != NULL) { - ma_resource_manager_data_buffer_node* pDataBufferNode = pResourceManager->pRootDataBufferNode; - ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode); - - /* The data buffer has been removed from the BST, so now we need to free it's data. */ - ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode); - } -} - -MA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager) -{ - if (pResourceManager == NULL) { - return; - } - - /* - Job threads need to be killed first. To do this we need to post a quit message to the message queue and then wait for the thread. The quit message will never be removed from the - queue which means it will never not be returned after being encounted for the first time which means all threads will eventually receive it. - */ - ma_resource_manager_post_job_quit(pResourceManager); - - /* Wait for every job to finish before continuing to ensure nothing is sill trying to access any of our objects below. */ - if (ma_resource_manager_is_threading_enabled(pResourceManager)) { - #ifndef MA_NO_THREADING - { - ma_uint32 iJobThread; - - for (iJobThread = 0; iJobThread < pResourceManager->config.jobThreadCount; iJobThread += 1) { - ma_thread_wait(&pResourceManager->jobThreads[iJobThread]); - } - } - #else - { - MA_ASSERT(MA_FALSE); /* Should never hit this. */ - } - #endif - } - - /* At this point the thread should have returned and no other thread should be accessing our data. We can now delete all data buffers. */ - ma_resource_manager_delete_all_data_buffer_nodes(pResourceManager); - - /* The job queue is no longer needed. */ - ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks); - - /* We're no longer doing anything with data buffers so the lock can now be uninitialized. */ - if (ma_resource_manager_is_threading_enabled(pResourceManager)) { - #ifndef MA_NO_THREADING - { - ma_mutex_uninit(&pResourceManager->dataBufferBSTLock); - } - #else - { - MA_ASSERT(MA_FALSE); /* Should never hit this. */ - } - #endif - } - - ma_free(pResourceManager->config.ppCustomDecodingBackendVTables, &pResourceManager->config.allocationCallbacks); - - if (pResourceManager->config.pLog == &pResourceManager->log) { - ma_log_uninit(&pResourceManager->log); - } -} - -MA_API ma_log* ma_resource_manager_get_log(ma_resource_manager* pResourceManager) -{ - if (pResourceManager == NULL) { - return NULL; - } - - return pResourceManager->config.pLog; -} - - - -MA_API ma_resource_manager_data_source_config ma_resource_manager_data_source_config_init(void) -{ - ma_resource_manager_data_source_config config; - - MA_ZERO_OBJECT(&config); - config.rangeEndInPCMFrames = ~((ma_uint64)0); - config.loopPointEndInPCMFrames = ~((ma_uint64)0); - - return config; -} - - -static ma_decoder_config ma_resource_manager__init_decoder_config(ma_resource_manager* pResourceManager) -{ - ma_decoder_config config; - - config = ma_decoder_config_init(pResourceManager->config.decodedFormat, pResourceManager->config.decodedChannels, pResourceManager->config.decodedSampleRate); - config.allocationCallbacks = pResourceManager->config.allocationCallbacks; - config.ppCustomBackendVTables = pResourceManager->config.ppCustomDecodingBackendVTables; - config.customBackendCount = pResourceManager->config.customDecodingBackendCount; - config.pCustomBackendUserData = pResourceManager->config.pCustomDecodingBackendUserData; - - return config; -} - -static ma_result ma_resource_manager__init_decoder(ma_resource_manager* pResourceManager, const char* pFilePath, const wchar_t* pFilePathW, ma_decoder* pDecoder) -{ - ma_result result; - ma_decoder_config config; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pFilePath != NULL || pFilePathW != NULL); - MA_ASSERT(pDecoder != NULL); - - config = ma_resource_manager__init_decoder_config(pResourceManager); - - if (pFilePath != NULL) { - result = ma_decoder_init_vfs(pResourceManager->config.pVFS, pFilePath, &config, pDecoder); - if (result != MA_SUCCESS) { - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, "Failed to load file \"%s\". %s.\n", pFilePath, ma_result_description(result)); - return result; - } - } else { - result = ma_decoder_init_vfs_w(pResourceManager->config.pVFS, pFilePathW, &config, pDecoder); - if (result != MA_SUCCESS) { - #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(_MSC_VER) - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, "Failed to load file \"%ls\". %s.\n", pFilePathW, ma_result_description(result)); - #endif - return result; - } - } - - return MA_SUCCESS; -} - -static ma_data_source* ma_resource_manager_data_buffer_get_connector(ma_resource_manager_data_buffer* pDataBuffer) -{ - switch (pDataBuffer->pNode->data.type) - { - case ma_resource_manager_data_supply_type_encoded: return &pDataBuffer->connector.decoder; - case ma_resource_manager_data_supply_type_decoded: return &pDataBuffer->connector.buffer; - case ma_resource_manager_data_supply_type_decoded_paged: return &pDataBuffer->connector.pagedBuffer; - - case ma_resource_manager_data_supply_type_unknown: - default: - { - ma_log_postf(ma_resource_manager_get_log(pDataBuffer->pResourceManager), MA_LOG_LEVEL_ERROR, "Failed to retrieve data buffer connector. Unknown data supply type.\n"); - return NULL; - }; - }; -} - -static ma_result ma_resource_manager_data_buffer_init_connector(ma_resource_manager_data_buffer* pDataBuffer, const ma_resource_manager_data_source_config* pConfig, ma_async_notification* pInitNotification, ma_fence* pInitFence) -{ - ma_result result; - - MA_ASSERT(pDataBuffer != NULL); - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pDataBuffer->isConnectorInitialized == MA_FALSE); - - /* The underlying data buffer must be initialized before we'll be able to know how to initialize the backend. */ - result = ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode); - if (result != MA_SUCCESS && result != MA_BUSY) { - return result; /* The data buffer is in an erroneous state. */ - } - - /* - We need to initialize either a ma_decoder or an ma_audio_buffer depending on whether or not the backing data is encoded or decoded. These act as the - "instance" to the data and are used to form the connection between underlying data buffer and the data source. If the data buffer is decoded, we can use - an ma_audio_buffer. This enables us to use memory mapping when mixing which saves us a bit of data movement overhead. - */ - switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode)) - { - case ma_resource_manager_data_supply_type_encoded: /* Connector is a decoder. */ - { - ma_decoder_config config; - config = ma_resource_manager__init_decoder_config(pDataBuffer->pResourceManager); - result = ma_decoder_init_memory(pDataBuffer->pNode->data.backend.encoded.pData, pDataBuffer->pNode->data.backend.encoded.sizeInBytes, &config, &pDataBuffer->connector.decoder); - } break; - - case ma_resource_manager_data_supply_type_decoded: /* Connector is an audio buffer. */ - { - ma_audio_buffer_config config; - config = ma_audio_buffer_config_init(pDataBuffer->pNode->data.backend.decoded.format, pDataBuffer->pNode->data.backend.decoded.channels, pDataBuffer->pNode->data.backend.decoded.totalFrameCount, pDataBuffer->pNode->data.backend.decoded.pData, NULL); - result = ma_audio_buffer_init(&config, &pDataBuffer->connector.buffer); - } break; - - case ma_resource_manager_data_supply_type_decoded_paged: /* Connector is a paged audio buffer. */ - { - ma_paged_audio_buffer_config config; - config = ma_paged_audio_buffer_config_init(&pDataBuffer->pNode->data.backend.decodedPaged.data); - result = ma_paged_audio_buffer_init(&config, &pDataBuffer->connector.pagedBuffer); - } break; - - case ma_resource_manager_data_supply_type_unknown: - default: - { - /* Unknown data supply type. Should never happen. Need to post an error here. */ - return MA_INVALID_ARGS; - }; - } - - /* - Initialization of the connector is when we can fire the init notification. This will give the application access to - the format/channels/rate of the data source. - */ - if (result == MA_SUCCESS) { - /* - Make sure the looping state is set before returning in order to handle the case where the - loop state was set on the data buffer before the connector was initialized. - */ - ma_data_source_set_range_in_pcm_frames(pDataBuffer, pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames); - ma_data_source_set_loop_point_in_pcm_frames(pDataBuffer, pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); - ma_data_source_set_looping(pDataBuffer, pConfig->isLooping); - - pDataBuffer->isConnectorInitialized = MA_TRUE; - - if (pInitNotification != NULL) { - ma_async_notification_signal(pInitNotification); - } - - if (pInitFence != NULL) { - ma_fence_release(pInitFence); - } - } - - /* At this point the backend should be initialized. We do *not* want to set pDataSource->result here - that needs to be done at a higher level to ensure it's done as the last step. */ - return result; -} - -static ma_result ma_resource_manager_data_buffer_uninit_connector(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer* pDataBuffer) -{ - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBuffer != NULL); - - switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode)) - { - case ma_resource_manager_data_supply_type_encoded: /* Connector is a decoder. */ - { - ma_decoder_uninit(&pDataBuffer->connector.decoder); - } break; - - case ma_resource_manager_data_supply_type_decoded: /* Connector is an audio buffer. */ - { - ma_audio_buffer_uninit(&pDataBuffer->connector.buffer); - } break; - - case ma_resource_manager_data_supply_type_decoded_paged: /* Connector is a paged audio buffer. */ - { - ma_paged_audio_buffer_uninit(&pDataBuffer->connector.pagedBuffer); - } break; - - case ma_resource_manager_data_supply_type_unknown: - default: - { - /* Unknown data supply type. Should never happen. Need to post an error here. */ - return MA_INVALID_ARGS; - }; - } - - return MA_SUCCESS; -} - -static ma_uint32 ma_resource_manager_data_buffer_node_next_execution_order(ma_resource_manager_data_buffer_node* pDataBufferNode) -{ - MA_ASSERT(pDataBufferNode != NULL); - return c89atomic_fetch_add_32(&pDataBufferNode->executionCounter, 1); -} - -static ma_result ma_resource_manager_data_buffer_node_init_supply_encoded(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, const char* pFilePath, const wchar_t* pFilePathW) -{ - ma_result result; - size_t dataSizeInBytes; - void* pData; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - MA_ASSERT(pFilePath != NULL || pFilePathW != NULL); - - result = ma_vfs_open_and_read_file_ex(pResourceManager->config.pVFS, pFilePath, pFilePathW, &pData, &dataSizeInBytes, &pResourceManager->config.allocationCallbacks); - if (result != MA_SUCCESS) { - if (pFilePath != NULL) { - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, "Failed to load file \"%s\". %s.\n", pFilePath, ma_result_description(result)); - } else { - #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(_MSC_VER) - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, "Failed to load file \"%ls\". %s.\n", pFilePathW, ma_result_description(result)); - #endif - } - - return result; - } - - pDataBufferNode->data.backend.encoded.pData = pData; - pDataBufferNode->data.backend.encoded.sizeInBytes = dataSizeInBytes; - ma_resource_manager_data_buffer_node_set_data_supply_type(pDataBufferNode, ma_resource_manager_data_supply_type_encoded); /* <-- Must be set last. */ - - return MA_SUCCESS; -} - -static ma_result ma_resource_manager_data_buffer_node_init_supply_decoded(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, const char* pFilePath, const wchar_t* pFilePathW, ma_uint32 flags, ma_decoder** ppDecoder) -{ - ma_result result = MA_SUCCESS; - ma_decoder* pDecoder; - ma_uint64 totalFrameCount; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - MA_ASSERT(ppDecoder != NULL); - MA_ASSERT(pFilePath != NULL || pFilePathW != NULL); - - *ppDecoder = NULL; /* For safety. */ - - pDecoder = (ma_decoder*)ma_malloc(sizeof(*pDecoder), &pResourceManager->config.allocationCallbacks); - if (pDecoder == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_resource_manager__init_decoder(pResourceManager, pFilePath, pFilePathW, pDecoder); - if (result != MA_SUCCESS) { - ma_free(pDecoder, &pResourceManager->config.allocationCallbacks); - return result; - } - - /* - At this point we have the decoder and we now need to initialize the data supply. This will - be either a decoded buffer, or a decoded paged buffer. A regular buffer is just one big heap - allocated buffer, whereas a paged buffer is a linked list of paged-sized buffers. The latter - is used when the length of a sound is unknown until a full decode has been performed. - */ - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH) == 0) { - result = ma_decoder_get_length_in_pcm_frames(pDecoder, &totalFrameCount); - if (result != MA_SUCCESS) { - return result; - } - } else { - totalFrameCount = 0; - } - - if (totalFrameCount > 0) { - /* It's a known length. The data supply is a regular decoded buffer. */ - ma_uint64 dataSizeInBytes; - void* pData; - - dataSizeInBytes = totalFrameCount * ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels); - if (dataSizeInBytes > MA_SIZE_MAX) { - ma_decoder_uninit(pDecoder); - ma_free(pDecoder, &pResourceManager->config.allocationCallbacks); - return MA_TOO_BIG; - } - - pData = ma_malloc((size_t)dataSizeInBytes, &pResourceManager->config.allocationCallbacks); - if (pData == NULL) { - ma_decoder_uninit(pDecoder); - ma_free(pDecoder, &pResourceManager->config.allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - /* The buffer needs to be initialized to silence in case the caller reads from it. */ - ma_silence_pcm_frames(pData, totalFrameCount, pDecoder->outputFormat, pDecoder->outputChannels); - - /* Data has been allocated and the data supply can now be initialized. */ - pDataBufferNode->data.backend.decoded.pData = pData; - pDataBufferNode->data.backend.decoded.totalFrameCount = totalFrameCount; - pDataBufferNode->data.backend.decoded.format = pDecoder->outputFormat; - pDataBufferNode->data.backend.decoded.channels = pDecoder->outputChannels; - pDataBufferNode->data.backend.decoded.sampleRate = pDecoder->outputSampleRate; - pDataBufferNode->data.backend.decoded.decodedFrameCount = 0; - ma_resource_manager_data_buffer_node_set_data_supply_type(pDataBufferNode, ma_resource_manager_data_supply_type_decoded); /* <-- Must be set last. */ - } else { - /* - It's an unknown length. The data supply is a paged decoded buffer. Setting this up is - actually easier than the non-paged decoded buffer because we just need to initialize - a ma_paged_audio_buffer object. - */ - result = ma_paged_audio_buffer_data_init(pDecoder->outputFormat, pDecoder->outputChannels, &pDataBufferNode->data.backend.decodedPaged.data); - if (result != MA_SUCCESS) { - ma_decoder_uninit(pDecoder); - ma_free(pDecoder, &pResourceManager->config.allocationCallbacks); - return result; - } - - pDataBufferNode->data.backend.decodedPaged.sampleRate = pDecoder->outputSampleRate; - pDataBufferNode->data.backend.decodedPaged.decodedFrameCount = 0; - ma_resource_manager_data_buffer_node_set_data_supply_type(pDataBufferNode, ma_resource_manager_data_supply_type_decoded_paged); /* <-- Must be set last. */ - } - - *ppDecoder = pDecoder; - - return MA_SUCCESS; -} - -static ma_result ma_resource_manager_data_buffer_node_decode_next_page(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_decoder* pDecoder) -{ - ma_result result = MA_SUCCESS; - ma_uint64 pageSizeInFrames; - ma_uint64 framesToTryReading; - ma_uint64 framesRead; - - MA_ASSERT(pResourceManager != NULL); - MA_ASSERT(pDataBufferNode != NULL); - MA_ASSERT(pDecoder != NULL); - - /* We need to know the size of a page in frames to know how many frames to decode. */ - pageSizeInFrames = MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS * (pDecoder->outputSampleRate/1000); - framesToTryReading = pageSizeInFrames; - - /* - Here is where we do the decoding of the next page. We'll run a slightly different path depending - on whether or not we're using a flat or paged buffer because the allocation of the page differs - between the two. For a flat buffer it's an offset to an already-allocated buffer. For a paged - buffer, we need to allocate a new page and attach it to the linked list. - */ - switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode)) - { - case ma_resource_manager_data_supply_type_decoded: - { - /* The destination buffer is an offset to the existing buffer. Don't read more than we originally retrieved when we first initialized the decoder. */ - void* pDst; - ma_uint64 framesRemaining = pDataBufferNode->data.backend.decoded.totalFrameCount - pDataBufferNode->data.backend.decoded.decodedFrameCount; - if (framesToTryReading > framesRemaining) { - framesToTryReading = framesRemaining; - } - - if (framesToTryReading > 0) { - pDst = ma_offset_ptr( - pDataBufferNode->data.backend.decoded.pData, - pDataBufferNode->data.backend.decoded.decodedFrameCount * ma_get_bytes_per_frame(pDataBufferNode->data.backend.decoded.format, pDataBufferNode->data.backend.decoded.channels) - ); - MA_ASSERT(pDst != NULL); - - result = ma_decoder_read_pcm_frames(pDecoder, pDst, framesToTryReading, &framesRead); - if (framesRead > 0) { - pDataBufferNode->data.backend.decoded.decodedFrameCount += framesRead; - } - } else { - framesRead = 0; - } - } break; - - case ma_resource_manager_data_supply_type_decoded_paged: - { - /* The destination buffer is a freshly allocated page. */ - ma_paged_audio_buffer_page* pPage; - - result = ma_paged_audio_buffer_data_allocate_page(&pDataBufferNode->data.backend.decodedPaged.data, framesToTryReading, NULL, &pResourceManager->config.allocationCallbacks, &pPage); - if (result != MA_SUCCESS) { - return result; - } - - result = ma_decoder_read_pcm_frames(pDecoder, pPage->pAudioData, framesToTryReading, &framesRead); - if (framesRead > 0) { - pPage->sizeInFrames = framesRead; - - result = ma_paged_audio_buffer_data_append_page(&pDataBufferNode->data.backend.decodedPaged.data, pPage); - if (result == MA_SUCCESS) { - pDataBufferNode->data.backend.decodedPaged.decodedFrameCount += framesRead; - } else { - /* Failed to append the page. Just abort and set the status to MA_AT_END. */ - ma_paged_audio_buffer_data_free_page(&pDataBufferNode->data.backend.decodedPaged.data, pPage, &pResourceManager->config.allocationCallbacks); - result = MA_AT_END; - } - } else { - /* No frames were read. Free the page and just set the status to MA_AT_END. */ - ma_paged_audio_buffer_data_free_page(&pDataBufferNode->data.backend.decodedPaged.data, pPage, &pResourceManager->config.allocationCallbacks); - result = MA_AT_END; - } - } break; - - case ma_resource_manager_data_supply_type_encoded: - case ma_resource_manager_data_supply_type_unknown: - default: - { - /* Unexpected data supply type. */ - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, "Unexpected data supply type (%d) when decoding page.", ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode)); - return MA_ERROR; - }; - } - - if (result == MA_SUCCESS && framesRead == 0) { - result = MA_AT_END; - } - - return result; -} - -static ma_result ma_resource_manager_data_buffer_node_acquire_critical_section(ma_resource_manager* pResourceManager, const char* pFilePath, const wchar_t* pFilePathW, ma_uint32 hashedName32, ma_uint32 flags, const ma_resource_manager_data_supply* pExistingData, ma_fence* pInitFence, ma_fence* pDoneFence, ma_resource_manager_inline_notification* pInitNotification, ma_resource_manager_data_buffer_node** ppDataBufferNode) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager_data_buffer_node* pDataBufferNode = NULL; - ma_resource_manager_data_buffer_node* pInsertPoint; - - if (ppDataBufferNode != NULL) { - *ppDataBufferNode = NULL; - } - - result = ma_resource_manager_data_buffer_node_insert_point(pResourceManager, hashedName32, &pInsertPoint); - if (result == MA_ALREADY_EXISTS) { - /* The node already exists. We just need to increment the reference count. */ - pDataBufferNode = pInsertPoint; - - result = ma_resource_manager_data_buffer_node_increment_ref(pResourceManager, pDataBufferNode, NULL); - if (result != MA_SUCCESS) { - return result; /* Should never happen. Failed to increment the reference count. */ - } - - result = MA_ALREADY_EXISTS; - goto done; - } else { - /* - The node does not already exist. We need to post a LOAD_DATA_BUFFER_NODE job here. This - needs to be done inside the critical section to ensure an uninitialization of the node - does not occur before initialization on another thread. - */ - pDataBufferNode = (ma_resource_manager_data_buffer_node*)ma_malloc(sizeof(*pDataBufferNode), &pResourceManager->config.allocationCallbacks); - if (pDataBufferNode == NULL) { - return MA_OUT_OF_MEMORY; - } - - MA_ZERO_OBJECT(pDataBufferNode); - pDataBufferNode->hashedName32 = hashedName32; - pDataBufferNode->refCount = 1; /* Always set to 1 by default (this is our first reference). */ - - if (pExistingData == NULL) { - pDataBufferNode->data.type = ma_resource_manager_data_supply_type_unknown; /* <-- We won't know this until we start decoding. */ - pDataBufferNode->result = MA_BUSY; /* Must be set to MA_BUSY before we leave the critical section, so might as well do it now. */ - pDataBufferNode->isDataOwnedByResourceManager = MA_TRUE; - } else { - pDataBufferNode->data = *pExistingData; - pDataBufferNode->result = MA_SUCCESS; /* Not loading asynchronously, so just set the status */ - pDataBufferNode->isDataOwnedByResourceManager = MA_FALSE; - } - - result = ma_resource_manager_data_buffer_node_insert_at(pResourceManager, pDataBufferNode, pInsertPoint); - if (result != MA_SUCCESS) { - ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks); - return result; /* Should never happen. Failed to insert the data buffer into the BST. */ - } - - /* - Here is where we'll post the job, but only if we're loading asynchronously. If we're - loading synchronously we'll defer loading to a later stage, outside of the critical - section. - */ - if (pDataBufferNode->isDataOwnedByResourceManager && (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) != 0) { - /* Loading asynchronously. Post the job. */ - ma_job job; - char* pFilePathCopy = NULL; - wchar_t* pFilePathWCopy = NULL; - - /* We need a copy of the file path. We should probably make this more efficient, but for now we'll do a transient memory allocation. */ - if (pFilePath != NULL) { - pFilePathCopy = ma_copy_string(pFilePath, &pResourceManager->config.allocationCallbacks); - } else { - pFilePathWCopy = ma_copy_string_w(pFilePathW, &pResourceManager->config.allocationCallbacks); - } - - if (pFilePathCopy == NULL && pFilePathWCopy == NULL) { - ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode); - ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks); - return MA_OUT_OF_MEMORY; - } - - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - ma_resource_manager_inline_notification_init(pResourceManager, pInitNotification); - } - - /* Acquire init and done fences before posting the job. These will be unacquired by the job thread. */ - if (pInitFence != NULL) { ma_fence_acquire(pInitFence); } - if (pDoneFence != NULL) { ma_fence_acquire(pDoneFence); } - - /* We now have everything we need to post the job to the job thread. */ - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE); - job.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode); - job.data.resourceManager.loadDataBufferNode.pResourceManager = pResourceManager; - job.data.resourceManager.loadDataBufferNode.pDataBufferNode = pDataBufferNode; - job.data.resourceManager.loadDataBufferNode.pFilePath = pFilePathCopy; - job.data.resourceManager.loadDataBufferNode.pFilePathW = pFilePathWCopy; - job.data.resourceManager.loadDataBufferNode.flags = flags; - job.data.resourceManager.loadDataBufferNode.pInitNotification = ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) ? pInitNotification : NULL; - job.data.resourceManager.loadDataBufferNode.pDoneNotification = NULL; - job.data.resourceManager.loadDataBufferNode.pInitFence = pInitFence; - job.data.resourceManager.loadDataBufferNode.pDoneFence = pDoneFence; - - result = ma_resource_manager_post_job(pResourceManager, &job); - if (result != MA_SUCCESS) { - /* Failed to post job. Probably ran out of memory. */ - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, "Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE job. %s.\n", ma_result_description(result)); - - /* - Fences were acquired before posting the job, but since the job was not able to - be posted, we need to make sure we release them so nothing gets stuck waiting. - */ - if (pInitFence != NULL) { ma_fence_release(pInitFence); } - if (pDoneFence != NULL) { ma_fence_release(pDoneFence); } - - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - ma_resource_manager_inline_notification_init(pResourceManager, pInitNotification); - } - - ma_free(pFilePathCopy, &pResourceManager->config.allocationCallbacks); - ma_free(pFilePathWCopy, &pResourceManager->config.allocationCallbacks); - - ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode); - ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks); - - return result; - } - } - } - -done: - if (ppDataBufferNode != NULL) { - *ppDataBufferNode = pDataBufferNode; - } - - return result; -} - -static ma_result ma_resource_manager_data_buffer_node_acquire(ma_resource_manager* pResourceManager, const char* pFilePath, const wchar_t* pFilePathW, ma_uint32 hashedName32, ma_uint32 flags, const ma_resource_manager_data_supply* pExistingData, ma_fence* pInitFence, ma_fence* pDoneFence, ma_resource_manager_data_buffer_node** ppDataBufferNode) -{ - ma_result result = MA_SUCCESS; - ma_bool32 nodeAlreadyExists = MA_FALSE; - ma_resource_manager_data_buffer_node* pDataBufferNode = NULL; - ma_resource_manager_inline_notification initNotification; /* Used when the WAIT_INIT flag is set. */ - - if (ppDataBufferNode != NULL) { - *ppDataBufferNode = NULL; /* Safety. */ - } - - if (pResourceManager == NULL || (pFilePath == NULL && pFilePathW == NULL && hashedName32 == 0)) { - return MA_INVALID_ARGS; - } - - /* If we're specifying existing data, it must be valid. */ - if (pExistingData != NULL && pExistingData->type == ma_resource_manager_data_supply_type_unknown) { - return MA_INVALID_ARGS; - } - - /* If we don't support threading, remove the ASYNC flag to make the rest of this a bit simpler. */ - if (ma_resource_manager_is_threading_enabled(pResourceManager) == MA_FALSE) { - flags &= ~MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC; - } - - if (hashedName32 == 0) { - if (pFilePath != NULL) { - hashedName32 = ma_hash_string_32(pFilePath); - } else { - hashedName32 = ma_hash_string_w_32(pFilePathW); - } - } - - /* - Here is where we either increment the node's reference count or allocate a new one and add it - to the BST. When allocating a new node, we need to make sure the LOAD_DATA_BUFFER_NODE job is - posted inside the critical section just in case the caller immediately uninitializes the node - as this will ensure the FREE_DATA_BUFFER_NODE job is given an execution order such that the - node is not uninitialized before initialization. - */ - ma_resource_manager_data_buffer_bst_lock(pResourceManager); - { - result = ma_resource_manager_data_buffer_node_acquire_critical_section(pResourceManager, pFilePath, pFilePathW, hashedName32, flags, pExistingData, pInitFence, pDoneFence, &initNotification, &pDataBufferNode); - } - ma_resource_manager_data_buffer_bst_unlock(pResourceManager); - - if (result == MA_ALREADY_EXISTS) { - nodeAlreadyExists = MA_TRUE; - result = MA_SUCCESS; - } else { - if (result != MA_SUCCESS) { - return result; - } - } - - /* - If we're loading synchronously, we'll need to load everything now. When loading asynchronously, - a job will have been posted inside the BST critical section so that an uninitialization can be - allocated an appropriate execution order thereby preventing it from being uninitialized before - the node is initialized by the decoding thread(s). - */ - if (nodeAlreadyExists == MA_FALSE) { /* Don't need to try loading anything if the node already exists. */ - if (pFilePath == NULL && pFilePathW == NULL) { - /* - If this path is hit, it means a buffer is being copied (i.e. initialized from only the - hashed name), but that node has been freed in the meantime, probably from some other - thread. This is an invalid operation. - */ - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, "Cloning data buffer node failed because the source node was released. The source node must remain valid until the cloning has completed.\n"); - result = MA_INVALID_OPERATION; - goto done; - } - - if (pDataBufferNode->isDataOwnedByResourceManager) { - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) == 0) { - /* Loading synchronously. Load the sound in it's entirety here. */ - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE) == 0) { - /* No decoding. This is the simple case - just store the file contents in memory. */ - result = ma_resource_manager_data_buffer_node_init_supply_encoded(pResourceManager, pDataBufferNode, pFilePath, pFilePathW); - if (result != MA_SUCCESS) { - goto done; - } - } else { - /* Decoding. We do this the same way as we do when loading asynchronously. */ - ma_decoder* pDecoder; - result = ma_resource_manager_data_buffer_node_init_supply_decoded(pResourceManager, pDataBufferNode, pFilePath, pFilePathW, flags, &pDecoder); - if (result != MA_SUCCESS) { - goto done; - } - - /* We have the decoder, now decode page by page just like we do when loading asynchronously. */ - for (;;) { - /* Decode next page. */ - result = ma_resource_manager_data_buffer_node_decode_next_page(pResourceManager, pDataBufferNode, pDecoder); - if (result != MA_SUCCESS) { - break; /* Will return MA_AT_END when the last page has been decoded. */ - } - } - - /* Reaching the end needs to be considered successful. */ - if (result == MA_AT_END) { - result = MA_SUCCESS; - } - - /* - At this point the data buffer is either fully decoded or some error occurred. Either - way, the decoder is no longer necessary. - */ - ma_decoder_uninit(pDecoder); - ma_free(pDecoder, &pResourceManager->config.allocationCallbacks); - } - - /* Getting here means we were successful. Make sure the status of the node is updated accordingly. */ - c89atomic_exchange_i32(&pDataBufferNode->result, result); - } else { - /* Loading asynchronously. We may need to wait for initialization. */ - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - ma_resource_manager_inline_notification_wait(&initNotification); - } - } - } else { - /* The data is not managed by the resource manager so there's nothing else to do. */ - MA_ASSERT(pExistingData != NULL); - } - } - -done: - /* If we failed to initialize the data buffer we need to free it. */ - if (result != MA_SUCCESS) { - if (nodeAlreadyExists == MA_FALSE) { - ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode); - ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks); - } - } - - /* - The init notification needs to be uninitialized. This will be used if the node does not already - exist, and we've specified ASYNC | WAIT_INIT. - */ - if (nodeAlreadyExists == MA_FALSE && pDataBufferNode->isDataOwnedByResourceManager && (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) != 0) { - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - ma_resource_manager_inline_notification_uninit(&initNotification); - } - } - - if (ppDataBufferNode != NULL) { - *ppDataBufferNode = pDataBufferNode; - } - - return result; -} - -static ma_result ma_resource_manager_data_buffer_node_unacquire(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, const char* pName, const wchar_t* pNameW) -{ - ma_result result = MA_SUCCESS; - ma_uint32 refCount = 0xFFFFFFFF; /* The new reference count of the node after decrementing. Initialize to non-0 to be safe we don't fall into the freeing path. */ - ma_uint32 hashedName32 = 0; - - if (pResourceManager == NULL) { - return MA_INVALID_ARGS; - } - - if (pDataBufferNode == NULL) { - if (pName == NULL && pNameW == NULL) { - return MA_INVALID_ARGS; - } - - if (pName != NULL) { - hashedName32 = ma_hash_string_32(pName); - } else { - hashedName32 = ma_hash_string_w_32(pNameW); - } - } - - /* - The first thing to do is decrement the reference counter of the node. Then, if the reference - count is zero, we need to free the node. If the node is still in the process of loading, we'll - need to post a job to the job queue to free the node. Otherwise we'll just do it here. - */ - ma_resource_manager_data_buffer_bst_lock(pResourceManager); - { - /* Might need to find the node. Must be done inside the critical section. */ - if (pDataBufferNode == NULL) { - result = ma_resource_manager_data_buffer_node_search(pResourceManager, hashedName32, &pDataBufferNode); - if (result != MA_SUCCESS) { - goto stage2; /* Couldn't find the node. */ - } - } - - result = ma_resource_manager_data_buffer_node_decrement_ref(pResourceManager, pDataBufferNode, &refCount); - if (result != MA_SUCCESS) { - goto stage2; /* Should never happen. */ - } - - if (refCount == 0) { - result = ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode); - if (result != MA_SUCCESS) { - goto stage2; /* An error occurred when trying to remove the data buffer. This should never happen. */ - } - } - } - ma_resource_manager_data_buffer_bst_unlock(pResourceManager); - -stage2: - if (result != MA_SUCCESS) { - return result; - } - - /* - Here is where we need to free the node. We don't want to do this inside the critical section - above because we want to keep that as small as possible for multi-threaded efficiency. - */ - if (refCount == 0) { - if (ma_resource_manager_data_buffer_node_result(pDataBufferNode) == MA_BUSY) { - /* The sound is still loading. We need to delay the freeing of the node to a safe time. */ - ma_job job; - - /* We need to mark the node as unavailable for the sake of the resource manager worker threads. */ - c89atomic_exchange_i32(&pDataBufferNode->result, MA_UNAVAILABLE); - - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE); - job.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode); - job.data.resourceManager.freeDataBufferNode.pResourceManager = pResourceManager; - job.data.resourceManager.freeDataBufferNode.pDataBufferNode = pDataBufferNode; - - result = ma_resource_manager_post_job(pResourceManager, &job); - if (result != MA_SUCCESS) { - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, "Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE job. %s.\n", ma_result_description(result)); - return result; - } - - /* If we don't support threading, process the job queue here. */ - if (ma_resource_manager_is_threading_enabled(pResourceManager) == MA_FALSE) { - while (ma_resource_manager_data_buffer_node_result(pDataBufferNode) == MA_BUSY) { - result = ma_resource_manager_process_next_job(pResourceManager); - if (result == MA_NO_DATA_AVAILABLE || result == MA_CANCELLED) { - result = MA_SUCCESS; - break; - } - } - } else { - /* Threading is enabled. The job queue will deal with the rest of the cleanup from here. */ - } - } else { - /* The sound isn't loading so we can just free the node here. */ - ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode); - } - } - - return result; -} - - - -static ma_uint32 ma_resource_manager_data_buffer_next_execution_order(ma_resource_manager_data_buffer* pDataBuffer) -{ - MA_ASSERT(pDataBuffer != NULL); - return c89atomic_fetch_add_32(&pDataBuffer->executionCounter, 1); -} - -static ma_result ma_resource_manager_data_buffer_cb__read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_resource_manager_data_buffer_read_pcm_frames((ma_resource_manager_data_buffer*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_resource_manager_data_buffer_cb__seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_resource_manager_data_buffer_seek_to_pcm_frame((ma_resource_manager_data_buffer*)pDataSource, frameIndex); -} - -static ma_result ma_resource_manager_data_buffer_cb__get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - return ma_resource_manager_data_buffer_get_data_format((ma_resource_manager_data_buffer*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -static ma_result ma_resource_manager_data_buffer_cb__get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_resource_manager_data_buffer_get_cursor_in_pcm_frames((ma_resource_manager_data_buffer*)pDataSource, pCursor); -} - -static ma_result ma_resource_manager_data_buffer_cb__get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_resource_manager_data_buffer_get_length_in_pcm_frames((ma_resource_manager_data_buffer*)pDataSource, pLength); -} - -static ma_result ma_resource_manager_data_buffer_cb__set_looping(ma_data_source* pDataSource, ma_bool32 isLooping) -{ - ma_resource_manager_data_buffer* pDataBuffer = (ma_resource_manager_data_buffer*)pDataSource; - MA_ASSERT(pDataBuffer != NULL); - - c89atomic_exchange_32(&pDataBuffer->isLooping, isLooping); - - /* The looping state needs to be set on the connector as well or else looping won't work when we read audio data. */ - ma_data_source_set_looping(ma_resource_manager_data_buffer_get_connector(pDataBuffer), isLooping); - - return MA_SUCCESS; -} - -static ma_data_source_vtable g_ma_resource_manager_data_buffer_vtable = -{ - ma_resource_manager_data_buffer_cb__read_pcm_frames, - ma_resource_manager_data_buffer_cb__seek_to_pcm_frame, - ma_resource_manager_data_buffer_cb__get_data_format, - ma_resource_manager_data_buffer_cb__get_cursor_in_pcm_frames, - ma_resource_manager_data_buffer_cb__get_length_in_pcm_frames, - ma_resource_manager_data_buffer_cb__set_looping, - 0 -}; - -static ma_result ma_resource_manager_data_buffer_init_ex_internal(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_uint32 hashedName32, ma_resource_manager_data_buffer* pDataBuffer) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager_data_buffer_node* pDataBufferNode; - ma_data_source_config dataSourceConfig; - ma_bool32 async; - ma_uint32 flags; - ma_resource_manager_pipeline_notifications notifications; - - if (pDataBuffer == NULL) { - if (pConfig != NULL && pConfig->pNotifications != NULL) { - ma_resource_manager_pipeline_notifications_signal_all_notifications(pConfig->pNotifications); - } - - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDataBuffer); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->pNotifications != NULL) { - notifications = *pConfig->pNotifications; /* From here on out we should be referencing `notifications` instead of `pNotifications`. Set this to NULL to catch errors at testing time. */ - } else { - MA_ZERO_OBJECT(¬ifications); - } - - /* For safety, always remove the ASYNC flag if threading is disabled on the resource manager. */ - flags = pConfig->flags; - if (ma_resource_manager_is_threading_enabled(pResourceManager) == MA_FALSE) { - flags &= ~MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC; - } - - async = (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) != 0; - - /* - Fences need to be acquired before doing anything. These must be aquired and released outside of - the node to ensure there's no holes where ma_fence_wait() could prematurely return before the - data buffer has completed initialization. - - When loading asynchronously, the node acquisition routine below will acquire the fences on this - thread and then release them on the async thread when the operation is complete. - - These fences are always released at the "done" tag at the end of this function. They'll be - acquired a second if loading asynchronously. This double acquisition system is just done to - simplify code maintanence. - */ - ma_resource_manager_pipeline_notifications_acquire_all_fences(¬ifications); - { - /* We first need to acquire a node. If ASYNC is not set, this will not return until the entire sound has been loaded. */ - result = ma_resource_manager_data_buffer_node_acquire(pResourceManager, pConfig->pFilePath, pConfig->pFilePathW, hashedName32, flags, NULL, notifications.init.pFence, notifications.done.pFence, &pDataBufferNode); - if (result != MA_SUCCESS) { - ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); - goto done; - } - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_resource_manager_data_buffer_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pDataBuffer->ds); - if (result != MA_SUCCESS) { - ma_resource_manager_data_buffer_node_unacquire(pResourceManager, pDataBufferNode, NULL, NULL); - ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); - goto done; - } - - pDataBuffer->pResourceManager = pResourceManager; - pDataBuffer->pNode = pDataBufferNode; - pDataBuffer->flags = flags; - pDataBuffer->result = MA_BUSY; /* Always default to MA_BUSY for safety. It'll be overwritten when loading completes or an error occurs. */ - - /* If we're loading asynchronously we need to post a job to the job queue to initialize the connector. */ - if (async == MA_FALSE || ma_resource_manager_data_buffer_node_result(pDataBufferNode) == MA_SUCCESS) { - /* Loading synchronously or the data has already been fully loaded. We can just initialize the connector from here without a job. */ - result = ma_resource_manager_data_buffer_init_connector(pDataBuffer, pConfig, NULL, NULL); - c89atomic_exchange_i32(&pDataBuffer->result, result); - - ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); - goto done; - } else { - /* The node's data supply isn't initialized yet. The caller has requested that we load asynchronously so we need to post a job to do this. */ - ma_job job; - ma_resource_manager_inline_notification initNotification; /* Used when the WAIT_INIT flag is set. */ - - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - ma_resource_manager_inline_notification_init(pResourceManager, &initNotification); - } - - /* - The status of the data buffer needs to be set to MA_BUSY before posting the job so that the - worker thread is aware of it's busy state. If the LOAD_DATA_BUFFER job sees a status other - than MA_BUSY, it'll assume an error and fall through to an early exit. - */ - c89atomic_exchange_i32(&pDataBuffer->result, MA_BUSY); - - /* Acquire fences a second time. These will be released by the async thread. */ - ma_resource_manager_pipeline_notifications_acquire_all_fences(¬ifications); - - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER); - job.order = ma_resource_manager_data_buffer_next_execution_order(pDataBuffer); - job.data.resourceManager.loadDataBuffer.pDataBuffer = pDataBuffer; - job.data.resourceManager.loadDataBuffer.pInitNotification = ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) ? &initNotification : notifications.init.pNotification; - job.data.resourceManager.loadDataBuffer.pDoneNotification = notifications.done.pNotification; - job.data.resourceManager.loadDataBuffer.pInitFence = notifications.init.pFence; - job.data.resourceManager.loadDataBuffer.pDoneFence = notifications.done.pFence; - job.data.resourceManager.loadDataBuffer.rangeBegInPCMFrames = pConfig->rangeBegInPCMFrames; - job.data.resourceManager.loadDataBuffer.rangeEndInPCMFrames = pConfig->rangeEndInPCMFrames; - job.data.resourceManager.loadDataBuffer.loopPointBegInPCMFrames = pConfig->loopPointBegInPCMFrames; - job.data.resourceManager.loadDataBuffer.loopPointEndInPCMFrames = pConfig->loopPointEndInPCMFrames; - job.data.resourceManager.loadDataBuffer.isLooping = pConfig->isLooping; - - result = ma_resource_manager_post_job(pResourceManager, &job); - if (result != MA_SUCCESS) { - /* We failed to post the job. Most likely there isn't enough room in the queue's buffer. */ - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, "Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER job. %s.\n", ma_result_description(result)); - c89atomic_exchange_i32(&pDataBuffer->result, result); - - /* Release the fences after the result has been set on the data buffer. */ - ma_resource_manager_pipeline_notifications_release_all_fences(¬ifications); - } else { - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - ma_resource_manager_inline_notification_wait(&initNotification); - - if (notifications.init.pNotification != NULL) { - ma_async_notification_signal(notifications.init.pNotification); - } - - /* NOTE: Do not release the init fence here. It will have been done by the job. */ - - /* Make sure we return an error if initialization failed on the async thread. */ - result = ma_resource_manager_data_buffer_result(pDataBuffer); - if (result == MA_BUSY) { - result = MA_SUCCESS; - } - } - } - - if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - ma_resource_manager_inline_notification_uninit(&initNotification); - } - } - - if (result != MA_SUCCESS) { - ma_resource_manager_data_buffer_node_unacquire(pResourceManager, pDataBufferNode, NULL, NULL); - goto done; - } - } -done: - if (result == MA_SUCCESS) { - if (pConfig->initialSeekPointInPCMFrames > 0) { - ma_resource_manager_data_buffer_seek_to_pcm_frame(pDataBuffer, pConfig->initialSeekPointInPCMFrames); - } - } - - ma_resource_manager_pipeline_notifications_release_all_fences(¬ifications); - - return result; -} - -MA_API ma_result ma_resource_manager_data_buffer_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_buffer* pDataBuffer) -{ - return ma_resource_manager_data_buffer_init_ex_internal(pResourceManager, pConfig, 0, pDataBuffer); -} - -MA_API ma_result ma_resource_manager_data_buffer_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer) -{ - ma_resource_manager_data_source_config config; - - config = ma_resource_manager_data_source_config_init(); - config.pFilePath = pFilePath; - config.flags = flags; - config.pNotifications = pNotifications; - - return ma_resource_manager_data_buffer_init_ex(pResourceManager, &config, pDataBuffer); -} - -MA_API ma_result ma_resource_manager_data_buffer_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer) -{ - ma_resource_manager_data_source_config config; - - config = ma_resource_manager_data_source_config_init(); - config.pFilePathW = pFilePath; - config.flags = flags; - config.pNotifications = pNotifications; - - return ma_resource_manager_data_buffer_init_ex(pResourceManager, &config, pDataBuffer); -} - -MA_API ma_result ma_resource_manager_data_buffer_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pExistingDataBuffer, ma_resource_manager_data_buffer* pDataBuffer) -{ - ma_resource_manager_data_source_config config; - - if (pExistingDataBuffer == NULL) { - return MA_INVALID_ARGS; - } - - MA_ASSERT(pExistingDataBuffer->pNode != NULL); /* <-- If you've triggered this, you've passed in an invalid existing data buffer. */ - - config = ma_resource_manager_data_source_config_init(); - config.flags = pExistingDataBuffer->flags; - - return ma_resource_manager_data_buffer_init_ex_internal(pResourceManager, &config, pExistingDataBuffer->pNode->hashedName32, pDataBuffer); -} - -static ma_result ma_resource_manager_data_buffer_uninit_internal(ma_resource_manager_data_buffer* pDataBuffer) -{ - MA_ASSERT(pDataBuffer != NULL); - - /* The connector should be uninitialized first. */ - ma_resource_manager_data_buffer_uninit_connector(pDataBuffer->pResourceManager, pDataBuffer); - - /* With the connector uninitialized we can unacquire the node. */ - ma_resource_manager_data_buffer_node_unacquire(pDataBuffer->pResourceManager, pDataBuffer->pNode, NULL, NULL); - - /* The base data source needs to be uninitialized as well. */ - ma_data_source_uninit(&pDataBuffer->ds); - - return MA_SUCCESS; -} - -MA_API ma_result ma_resource_manager_data_buffer_uninit(ma_resource_manager_data_buffer* pDataBuffer) -{ - ma_result result; - - if (pDataBuffer == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_resource_manager_data_buffer_result(pDataBuffer) == MA_SUCCESS) { - /* The data buffer can be deleted synchronously. */ - return ma_resource_manager_data_buffer_uninit_internal(pDataBuffer); - } else { - /* - The data buffer needs to be deleted asynchronously because it's still loading. With the status set to MA_UNAVAILABLE, no more pages will - be loaded and the uninitialization should happen fairly quickly. Since the caller owns the data buffer, we need to wait for this event - to get processed before returning. - */ - ma_resource_manager_inline_notification notification; - ma_job job; - - /* - We need to mark the node as unavailable so we don't try reading from it anymore, but also to - let the loading thread know that it needs to abort it's loading procedure. - */ - c89atomic_exchange_i32(&pDataBuffer->result, MA_UNAVAILABLE); - - result = ma_resource_manager_inline_notification_init(pDataBuffer->pResourceManager, ¬ification); - if (result != MA_SUCCESS) { - return result; /* Failed to create the notification. This should rarely, if ever, happen. */ - } - - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER); - job.order = ma_resource_manager_data_buffer_next_execution_order(pDataBuffer); - job.data.resourceManager.freeDataBuffer.pDataBuffer = pDataBuffer; - job.data.resourceManager.freeDataBuffer.pDoneNotification = ¬ification; - job.data.resourceManager.freeDataBuffer.pDoneFence = NULL; - - result = ma_resource_manager_post_job(pDataBuffer->pResourceManager, &job); - if (result != MA_SUCCESS) { - ma_resource_manager_inline_notification_uninit(¬ification); - return result; - } - - ma_resource_manager_inline_notification_wait_and_uninit(¬ification); - } - - return result; -} - -MA_API ma_result ma_resource_manager_data_buffer_read_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_uint64 framesRead = 0; - ma_bool32 isDecodedBufferBusy = MA_FALSE; - - /* Safety. */ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - /* - We cannot be using the data buffer after it's been uninitialized. If you trigger this assert it means you're trying to read from the data buffer after - it's been uninitialized or is in the process of uninitializing. - */ - MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); - - /* If the node is not initialized we need to abort with a busy code. */ - if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_unknown) { - return MA_BUSY; /* Still loading. */ - } - - if (pDataBuffer->seekToCursorOnNextRead) { - pDataBuffer->seekToCursorOnNextRead = MA_FALSE; - - result = ma_data_source_seek_to_pcm_frame(ma_resource_manager_data_buffer_get_connector(pDataBuffer), pDataBuffer->seekTargetInPCMFrames); - if (result != MA_SUCCESS) { - return result; - } - } - - /* - For decoded buffers (not paged) we need to check beforehand how many frames we have available. We cannot - exceed this amount. We'll read as much as we can, and then return MA_BUSY. - */ - if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_decoded) { - ma_uint64 availableFrames; - - isDecodedBufferBusy = (ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) == MA_BUSY); - - if (ma_resource_manager_data_buffer_get_available_frames(pDataBuffer, &availableFrames) == MA_SUCCESS) { - /* Don't try reading more than the available frame count. */ - if (frameCount > availableFrames) { - frameCount = availableFrames; - - /* - If there's no frames available we want to set the status to MA_AT_END. The logic below - will check if the node is busy, and if so, change it to MA_BUSY. The reason we do this - is because we don't want to call `ma_data_source_read_pcm_frames()` if the frame count - is 0 because that'll result in a situation where it's possible MA_AT_END won't get - returned. - */ - if (frameCount == 0) { - result = MA_AT_END; - } - } else { - isDecodedBufferBusy = MA_FALSE; /* We have enough frames available in the buffer to avoid a MA_BUSY status. */ - } - } - } - - /* Don't attempt to read anything if we've got no frames available. */ - if (frameCount > 0) { - result = ma_data_source_read_pcm_frames(ma_resource_manager_data_buffer_get_connector(pDataBuffer), pFramesOut, frameCount, &framesRead); - } - - /* - If we returned MA_AT_END, but the node is still loading, we don't want to return that code or else the caller will interpret the sound - as at the end and terminate decoding. - */ - if (result == MA_AT_END) { - if (ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) == MA_BUSY) { - result = MA_BUSY; - } - } - - if (isDecodedBufferBusy) { - result = MA_BUSY; - } - - if (pFramesRead != NULL) { - *pFramesRead = framesRead; - } - - if (result == MA_SUCCESS && framesRead == 0) { - result = MA_AT_END; - } - - return result; -} - -MA_API ma_result ma_resource_manager_data_buffer_seek_to_pcm_frame(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64 frameIndex) -{ - ma_result result; - - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); - - /* If we haven't yet got a connector we need to abort. */ - if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_unknown) { - pDataBuffer->seekTargetInPCMFrames = frameIndex; - pDataBuffer->seekToCursorOnNextRead = MA_TRUE; - return MA_BUSY; /* Still loading. */ - } - - result = ma_data_source_seek_to_pcm_frame(ma_resource_manager_data_buffer_get_connector(pDataBuffer), frameIndex); - if (result != MA_SUCCESS) { - return result; - } - - pDataBuffer->seekTargetInPCMFrames = ~(ma_uint64)0; /* <-- For identification purposes. */ - pDataBuffer->seekToCursorOnNextRead = MA_FALSE; - - return MA_SUCCESS; -} - -MA_API ma_result ma_resource_manager_data_buffer_get_data_format(ma_resource_manager_data_buffer* pDataBuffer, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); - - switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode)) - { - case ma_resource_manager_data_supply_type_encoded: - { - return ma_data_source_get_data_format(&pDataBuffer->connector.decoder, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); - }; - - case ma_resource_manager_data_supply_type_decoded: - { - *pFormat = pDataBuffer->pNode->data.backend.decoded.format; - *pChannels = pDataBuffer->pNode->data.backend.decoded.channels; - *pSampleRate = pDataBuffer->pNode->data.backend.decoded.sampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pDataBuffer->pNode->data.backend.decoded.channels); - return MA_SUCCESS; - }; - - case ma_resource_manager_data_supply_type_decoded_paged: - { - *pFormat = pDataBuffer->pNode->data.backend.decodedPaged.data.format; - *pChannels = pDataBuffer->pNode->data.backend.decodedPaged.data.channels; - *pSampleRate = pDataBuffer->pNode->data.backend.decodedPaged.sampleRate; - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pDataBuffer->pNode->data.backend.decoded.channels); - return MA_SUCCESS; - }; - - case ma_resource_manager_data_supply_type_unknown: - { - return MA_BUSY; /* Still loading. */ - }; - - default: - { - /* Unknown supply type. Should never hit this. */ - return MA_INVALID_ARGS; - } - } -} - -MA_API ma_result ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pCursor) -{ - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); - - if (pDataBuffer == NULL || pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode)) - { - case ma_resource_manager_data_supply_type_encoded: - { - return ma_decoder_get_cursor_in_pcm_frames(&pDataBuffer->connector.decoder, pCursor); - }; - - case ma_resource_manager_data_supply_type_decoded: - { - return ma_audio_buffer_get_cursor_in_pcm_frames(&pDataBuffer->connector.buffer, pCursor); - }; - - case ma_resource_manager_data_supply_type_decoded_paged: - { - return ma_paged_audio_buffer_get_cursor_in_pcm_frames(&pDataBuffer->connector.pagedBuffer, pCursor); - }; - - case ma_resource_manager_data_supply_type_unknown: - { - return MA_BUSY; - }; - - default: - { - return MA_INVALID_ARGS; - } - } -} - -MA_API ma_result ma_resource_manager_data_buffer_get_length_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pLength) -{ - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE); - - if (pDataBuffer == NULL || pLength == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_unknown) { - return MA_BUSY; /* Still loading. */ - } - - return ma_data_source_get_length_in_pcm_frames(ma_resource_manager_data_buffer_get_connector(pDataBuffer), pLength); -} - -MA_API ma_result ma_resource_manager_data_buffer_result(const ma_resource_manager_data_buffer* pDataBuffer) -{ - if (pDataBuffer == NULL) { - return MA_INVALID_ARGS; - } - - return (ma_result)c89atomic_load_i32((ma_result*)&pDataBuffer->result); /* Need a naughty const-cast here. */ -} - -MA_API ma_result ma_resource_manager_data_buffer_set_looping(ma_resource_manager_data_buffer* pDataBuffer, ma_bool32 isLooping) -{ - return ma_data_source_set_looping(pDataBuffer, isLooping); -} - -MA_API ma_bool32 ma_resource_manager_data_buffer_is_looping(const ma_resource_manager_data_buffer* pDataBuffer) -{ - return ma_data_source_is_looping(pDataBuffer); -} - -MA_API ma_result ma_resource_manager_data_buffer_get_available_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pAvailableFrames) -{ - if (pAvailableFrames == NULL) { - return MA_INVALID_ARGS; - } - - *pAvailableFrames = 0; - - if (pDataBuffer == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_unknown) { - if (ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) == MA_BUSY) { - return MA_BUSY; - } else { - return MA_INVALID_OPERATION; /* No connector. */ - } - } - - switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode)) - { - case ma_resource_manager_data_supply_type_encoded: - { - return ma_decoder_get_available_frames(&pDataBuffer->connector.decoder, pAvailableFrames); - }; - - case ma_resource_manager_data_supply_type_decoded: - { - return ma_audio_buffer_get_available_frames(&pDataBuffer->connector.buffer, pAvailableFrames); - }; - - case ma_resource_manager_data_supply_type_decoded_paged: - { - ma_uint64 cursor; - ma_paged_audio_buffer_get_cursor_in_pcm_frames(&pDataBuffer->connector.pagedBuffer, &cursor); - - if (pDataBuffer->pNode->data.backend.decodedPaged.decodedFrameCount > cursor) { - *pAvailableFrames = pDataBuffer->pNode->data.backend.decodedPaged.decodedFrameCount - cursor; - } else { - *pAvailableFrames = 0; - } - - return MA_SUCCESS; - }; - - case ma_resource_manager_data_supply_type_unknown: - default: - { - /* Unknown supply type. Should never hit this. */ - return MA_INVALID_ARGS; - } - } -} - -MA_API ma_result ma_resource_manager_register_file(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags) -{ - return ma_resource_manager_data_buffer_node_acquire(pResourceManager, pFilePath, NULL, 0, flags, NULL, NULL, NULL, NULL); -} - -MA_API ma_result ma_resource_manager_register_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags) -{ - return ma_resource_manager_data_buffer_node_acquire(pResourceManager, NULL, pFilePath, 0, flags, NULL, NULL, NULL, NULL); -} - - -static ma_result ma_resource_manager_register_data(ma_resource_manager* pResourceManager, const char* pName, const wchar_t* pNameW, ma_resource_manager_data_supply* pExistingData) -{ - return ma_resource_manager_data_buffer_node_acquire(pResourceManager, pName, pNameW, 0, 0, pExistingData, NULL, NULL, NULL); -} - -static ma_result ma_resource_manager_register_decoded_data_internal(ma_resource_manager* pResourceManager, const char* pName, const wchar_t* pNameW, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate) -{ - ma_resource_manager_data_supply data; - data.type = ma_resource_manager_data_supply_type_decoded; - data.backend.decoded.pData = pData; - data.backend.decoded.totalFrameCount = frameCount; - data.backend.decoded.format = format; - data.backend.decoded.channels = channels; - data.backend.decoded.sampleRate = sampleRate; - - return ma_resource_manager_register_data(pResourceManager, pName, pNameW, &data); -} - -MA_API ma_result ma_resource_manager_register_decoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate) -{ - return ma_resource_manager_register_decoded_data_internal(pResourceManager, pName, NULL, pData, frameCount, format, channels, sampleRate); -} - -MA_API ma_result ma_resource_manager_register_decoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate) -{ - return ma_resource_manager_register_decoded_data_internal(pResourceManager, NULL, pName, pData, frameCount, format, channels, sampleRate); -} - - -static ma_result ma_resource_manager_register_encoded_data_internal(ma_resource_manager* pResourceManager, const char* pName, const wchar_t* pNameW, const void* pData, size_t sizeInBytes) -{ - ma_resource_manager_data_supply data; - data.type = ma_resource_manager_data_supply_type_encoded; - data.backend.encoded.pData = pData; - data.backend.encoded.sizeInBytes = sizeInBytes; - - return ma_resource_manager_register_data(pResourceManager, pName, pNameW, &data); -} - -MA_API ma_result ma_resource_manager_register_encoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, size_t sizeInBytes) -{ - return ma_resource_manager_register_encoded_data_internal(pResourceManager, pName, NULL, pData, sizeInBytes); -} - -MA_API ma_result ma_resource_manager_register_encoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, size_t sizeInBytes) -{ - return ma_resource_manager_register_encoded_data_internal(pResourceManager, NULL, pName, pData, sizeInBytes); -} - - -MA_API ma_result ma_resource_manager_unregister_file(ma_resource_manager* pResourceManager, const char* pFilePath) -{ - return ma_resource_manager_unregister_data(pResourceManager, pFilePath); -} - -MA_API ma_result ma_resource_manager_unregister_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath) -{ - return ma_resource_manager_unregister_data_w(pResourceManager, pFilePath); -} - -MA_API ma_result ma_resource_manager_unregister_data(ma_resource_manager* pResourceManager, const char* pName) -{ - return ma_resource_manager_data_buffer_node_unacquire(pResourceManager, NULL, pName, NULL); -} - -MA_API ma_result ma_resource_manager_unregister_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName) -{ - return ma_resource_manager_data_buffer_node_unacquire(pResourceManager, NULL, NULL, pName); -} - - -static ma_uint32 ma_resource_manager_data_stream_next_execution_order(ma_resource_manager_data_stream* pDataStream) -{ - MA_ASSERT(pDataStream != NULL); - return c89atomic_fetch_add_32(&pDataStream->executionCounter, 1); -} - -static ma_bool32 ma_resource_manager_data_stream_is_decoder_at_end(const ma_resource_manager_data_stream* pDataStream) -{ - MA_ASSERT(pDataStream != NULL); - return c89atomic_load_32((ma_bool32*)&pDataStream->isDecoderAtEnd); -} - -static ma_uint32 ma_resource_manager_data_stream_seek_counter(const ma_resource_manager_data_stream* pDataStream) -{ - MA_ASSERT(pDataStream != NULL); - return c89atomic_load_32((ma_uint32*)&pDataStream->seekCounter); -} - - -static ma_result ma_resource_manager_data_stream_cb__read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_resource_manager_data_stream_read_pcm_frames((ma_resource_manager_data_stream*)pDataSource, pFramesOut, frameCount, pFramesRead); -} - -static ma_result ma_resource_manager_data_stream_cb__seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex) -{ - return ma_resource_manager_data_stream_seek_to_pcm_frame((ma_resource_manager_data_stream*)pDataSource, frameIndex); -} - -static ma_result ma_resource_manager_data_stream_cb__get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - return ma_resource_manager_data_stream_get_data_format((ma_resource_manager_data_stream*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -static ma_result ma_resource_manager_data_stream_cb__get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor) -{ - return ma_resource_manager_data_stream_get_cursor_in_pcm_frames((ma_resource_manager_data_stream*)pDataSource, pCursor); -} - -static ma_result ma_resource_manager_data_stream_cb__get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength) -{ - return ma_resource_manager_data_stream_get_length_in_pcm_frames((ma_resource_manager_data_stream*)pDataSource, pLength); -} - -static ma_result ma_resource_manager_data_stream_cb__set_looping(ma_data_source* pDataSource, ma_bool32 isLooping) -{ - ma_resource_manager_data_stream* pDataStream = (ma_resource_manager_data_stream*)pDataSource; - MA_ASSERT(pDataStream != NULL); - - c89atomic_exchange_32(&pDataStream->isLooping, isLooping); - - return MA_SUCCESS; -} - -static ma_data_source_vtable g_ma_resource_manager_data_stream_vtable = -{ - ma_resource_manager_data_stream_cb__read_pcm_frames, - ma_resource_manager_data_stream_cb__seek_to_pcm_frame, - ma_resource_manager_data_stream_cb__get_data_format, - ma_resource_manager_data_stream_cb__get_cursor_in_pcm_frames, - ma_resource_manager_data_stream_cb__get_length_in_pcm_frames, - ma_resource_manager_data_stream_cb__set_looping, - MA_DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT -}; - -static void ma_resource_manager_data_stream_set_absolute_cursor(ma_resource_manager_data_stream* pDataStream, ma_uint64 absoluteCursor) -{ - /* Loop if possible. */ - if (absoluteCursor > pDataStream->totalLengthInPCMFrames && pDataStream->totalLengthInPCMFrames > 0) { - absoluteCursor = absoluteCursor % pDataStream->totalLengthInPCMFrames; - } - - c89atomic_exchange_64(&pDataStream->absoluteCursor, absoluteCursor); -} - -MA_API ma_result ma_resource_manager_data_stream_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_stream* pDataStream) -{ - ma_result result; - ma_data_source_config dataSourceConfig; - char* pFilePathCopy = NULL; - wchar_t* pFilePathWCopy = NULL; - ma_job job; - ma_bool32 waitBeforeReturning = MA_FALSE; - ma_resource_manager_inline_notification waitNotification; - ma_resource_manager_pipeline_notifications notifications; - - if (pDataStream == NULL) { - if (pConfig != NULL && pConfig->pNotifications != NULL) { - ma_resource_manager_pipeline_notifications_signal_all_notifications(pConfig->pNotifications); - } - - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDataStream); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->pNotifications != NULL) { - notifications = *pConfig->pNotifications; /* From here on out, `notifications` should be used instead of `pNotifications`. Setting this to NULL to catch any errors at testing time. */ - } else { - MA_ZERO_OBJECT(¬ifications); - } - - dataSourceConfig = ma_data_source_config_init(); - dataSourceConfig.vtable = &g_ma_resource_manager_data_stream_vtable; - - result = ma_data_source_init(&dataSourceConfig, &pDataStream->ds); - if (result != MA_SUCCESS) { - ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); - return result; - } - - pDataStream->pResourceManager = pResourceManager; - pDataStream->flags = pConfig->flags; - pDataStream->result = MA_BUSY; - - ma_data_source_set_range_in_pcm_frames(pDataStream, pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames); - ma_data_source_set_loop_point_in_pcm_frames(pDataStream, pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); - ma_data_source_set_looping(pDataStream, pConfig->isLooping); - - if (pResourceManager == NULL || (pConfig->pFilePath == NULL && pConfig->pFilePathW == NULL)) { - ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); - return MA_INVALID_ARGS; - } - - /* We want all access to the VFS and the internal decoder to happen on the job thread just to keep things easier to manage for the VFS. */ - - /* We need a copy of the file path. We should probably make this more efficient, but for now we'll do a transient memory allocation. */ - if (pConfig->pFilePath != NULL) { - pFilePathCopy = ma_copy_string(pConfig->pFilePath, &pResourceManager->config.allocationCallbacks); - } else { - pFilePathWCopy = ma_copy_string_w(pConfig->pFilePathW, &pResourceManager->config.allocationCallbacks); - } - - if (pFilePathCopy == NULL && pFilePathWCopy == NULL) { - ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); - return MA_OUT_OF_MEMORY; - } - - /* - We need to check for the presence of MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC. If it's not set, we need to wait before returning. Otherwise we - can return immediately. Likewise, we'll also check for MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT and do the same. - */ - if ((pConfig->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) == 0 || (pConfig->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) { - waitBeforeReturning = MA_TRUE; - ma_resource_manager_inline_notification_init(pResourceManager, &waitNotification); - } - - ma_resource_manager_pipeline_notifications_acquire_all_fences(¬ifications); - - /* Set the absolute cursor to our initial seek position so retrieval of the cursor returns a good value. */ - ma_resource_manager_data_stream_set_absolute_cursor(pDataStream, pConfig->initialSeekPointInPCMFrames); - - /* We now have everything we need to post the job. This is the last thing we need to do from here. The rest will be done by the job thread. */ - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM); - job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream); - job.data.resourceManager.loadDataStream.pDataStream = pDataStream; - job.data.resourceManager.loadDataStream.pFilePath = pFilePathCopy; - job.data.resourceManager.loadDataStream.pFilePathW = pFilePathWCopy; - job.data.resourceManager.loadDataStream.initialSeekPoint = pConfig->initialSeekPointInPCMFrames; - job.data.resourceManager.loadDataStream.pInitNotification = (waitBeforeReturning == MA_TRUE) ? &waitNotification : notifications.init.pNotification; - job.data.resourceManager.loadDataStream.pInitFence = notifications.init.pFence; - result = ma_resource_manager_post_job(pResourceManager, &job); - if (result != MA_SUCCESS) { - ma_resource_manager_pipeline_notifications_signal_all_notifications(¬ifications); - ma_resource_manager_pipeline_notifications_release_all_fences(¬ifications); - - if (waitBeforeReturning) { - ma_resource_manager_inline_notification_uninit(&waitNotification); - } - - ma_free(pFilePathCopy, &pResourceManager->config.allocationCallbacks); - ma_free(pFilePathWCopy, &pResourceManager->config.allocationCallbacks); - return result; - } - - /* Wait if needed. */ - if (waitBeforeReturning) { - ma_resource_manager_inline_notification_wait_and_uninit(&waitNotification); - - if (notifications.init.pNotification != NULL) { - ma_async_notification_signal(notifications.init.pNotification); - } - - /* NOTE: Do not release pInitFence here. That will be done by the job. */ - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_resource_manager_data_stream_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream) -{ - ma_resource_manager_data_source_config config; - - config = ma_resource_manager_data_source_config_init(); - config.pFilePath = pFilePath; - config.flags = flags; - config.pNotifications = pNotifications; - - return ma_resource_manager_data_stream_init_ex(pResourceManager, &config, pDataStream); -} - -MA_API ma_result ma_resource_manager_data_stream_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream) -{ - ma_resource_manager_data_source_config config; - - config = ma_resource_manager_data_source_config_init(); - config.pFilePathW = pFilePath; - config.flags = flags; - config.pNotifications = pNotifications; - - return ma_resource_manager_data_stream_init_ex(pResourceManager, &config, pDataStream); -} - -MA_API ma_result ma_resource_manager_data_stream_uninit(ma_resource_manager_data_stream* pDataStream) -{ - ma_resource_manager_inline_notification freeEvent; - ma_job job; - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - /* The first thing to do is set the result to unavailable. This will prevent future page decoding. */ - c89atomic_exchange_i32(&pDataStream->result, MA_UNAVAILABLE); - - /* - We need to post a job to ensure we're not in the middle or decoding or anything. Because the object is owned by the caller, we'll need - to wait for it to complete before returning which means we need an event. - */ - ma_resource_manager_inline_notification_init(pDataStream->pResourceManager, &freeEvent); - - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM); - job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream); - job.data.resourceManager.freeDataStream.pDataStream = pDataStream; - job.data.resourceManager.freeDataStream.pDoneNotification = &freeEvent; - job.data.resourceManager.freeDataStream.pDoneFence = NULL; - ma_resource_manager_post_job(pDataStream->pResourceManager, &job); - - /* We need to wait for the job to finish processing before we return. */ - ma_resource_manager_inline_notification_wait_and_uninit(&freeEvent); - - return MA_SUCCESS; -} - - -static ma_uint32 ma_resource_manager_data_stream_get_page_size_in_frames(ma_resource_manager_data_stream* pDataStream) -{ - MA_ASSERT(pDataStream != NULL); - MA_ASSERT(pDataStream->isDecoderInitialized == MA_TRUE); - - return MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS * (pDataStream->decoder.outputSampleRate/1000); -} - -static void* ma_resource_manager_data_stream_get_page_data_pointer(ma_resource_manager_data_stream* pDataStream, ma_uint32 pageIndex, ma_uint32 relativeCursor) -{ - MA_ASSERT(pDataStream != NULL); - MA_ASSERT(pDataStream->isDecoderInitialized == MA_TRUE); - MA_ASSERT(pageIndex == 0 || pageIndex == 1); - - return ma_offset_ptr(pDataStream->pPageData, ((ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream) * pageIndex) + relativeCursor) * ma_get_bytes_per_frame(pDataStream->decoder.outputFormat, pDataStream->decoder.outputChannels)); -} - -static void ma_resource_manager_data_stream_fill_page(ma_resource_manager_data_stream* pDataStream, ma_uint32 pageIndex) -{ - ma_result result = MA_SUCCESS; - ma_uint64 pageSizeInFrames; - ma_uint64 totalFramesReadForThisPage = 0; - void* pPageData = ma_resource_manager_data_stream_get_page_data_pointer(pDataStream, pageIndex, 0); - - pageSizeInFrames = ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream); - - /* The decoder needs to inherit the stream's looping and range state. */ - { - ma_uint64 rangeBeg; - ma_uint64 rangeEnd; - ma_uint64 loopPointBeg; - ma_uint64 loopPointEnd; - - ma_data_source_set_looping(&pDataStream->decoder, ma_resource_manager_data_stream_is_looping(pDataStream)); - - ma_data_source_get_range_in_pcm_frames(pDataStream, &rangeBeg, &rangeEnd); - ma_data_source_set_range_in_pcm_frames(&pDataStream->decoder, rangeBeg, rangeEnd); - - ma_data_source_get_loop_point_in_pcm_frames(pDataStream, &loopPointBeg, &loopPointEnd); - ma_data_source_set_loop_point_in_pcm_frames(&pDataStream->decoder, loopPointBeg, loopPointEnd); - } - - /* Just read straight from the decoder. It will deal with ranges and looping for us. */ - result = ma_data_source_read_pcm_frames(&pDataStream->decoder, pPageData, pageSizeInFrames, &totalFramesReadForThisPage); - if (result == MA_AT_END || totalFramesReadForThisPage < pageSizeInFrames) { - c89atomic_exchange_32(&pDataStream->isDecoderAtEnd, MA_TRUE); - } - - c89atomic_exchange_32(&pDataStream->pageFrameCount[pageIndex], (ma_uint32)totalFramesReadForThisPage); - c89atomic_exchange_32(&pDataStream->isPageValid[pageIndex], MA_TRUE); -} - -static void ma_resource_manager_data_stream_fill_pages(ma_resource_manager_data_stream* pDataStream) -{ - ma_uint32 iPage; - - MA_ASSERT(pDataStream != NULL); - - for (iPage = 0; iPage < 2; iPage += 1) { - ma_resource_manager_data_stream_fill_page(pDataStream, iPage); - } -} - - -static ma_result ma_resource_manager_data_stream_map(ma_resource_manager_data_stream* pDataStream, void** ppFramesOut, ma_uint64* pFrameCount) -{ - ma_uint64 framesAvailable; - ma_uint64 frameCount = 0; - - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE); - - if (pFrameCount != NULL) { - frameCount = *pFrameCount; - *pFrameCount = 0; - } - if (ppFramesOut != NULL) { - *ppFramesOut = NULL; - } - - if (pDataStream == NULL || ppFramesOut == NULL || pFrameCount == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) { - return MA_INVALID_OPERATION; - } - - /* Don't attempt to read while we're in the middle of seeking. Tell the caller that we're busy. */ - if (ma_resource_manager_data_stream_seek_counter(pDataStream) > 0) { - return MA_BUSY; - } - - /* If the page we're on is invalid it means we've caught up to the job thread. */ - if (c89atomic_load_32(&pDataStream->isPageValid[pDataStream->currentPageIndex]) == MA_FALSE) { - framesAvailable = 0; - } else { - /* - The page we're on is valid so we must have some frames available. We need to make sure that we don't overflow into the next page, even if it's valid. The reason is - that the unmap process will only post an update for one page at a time. Keeping mapping tied to page boundaries makes this simpler. - */ - ma_uint32 currentPageFrameCount = c89atomic_load_32(&pDataStream->pageFrameCount[pDataStream->currentPageIndex]); - MA_ASSERT(currentPageFrameCount >= pDataStream->relativeCursor); - - framesAvailable = currentPageFrameCount - pDataStream->relativeCursor; - } - - /* If there's no frames available and the result is set to MA_AT_END we need to return MA_AT_END. */ - if (framesAvailable == 0) { - if (ma_resource_manager_data_stream_is_decoder_at_end(pDataStream)) { - return MA_AT_END; - } else { - return MA_BUSY; /* There are no frames available, but we're not marked as EOF so we might have caught up to the job thread. Need to return MA_BUSY and wait for more data. */ - } - } - - MA_ASSERT(framesAvailable > 0); - - if (frameCount > framesAvailable) { - frameCount = framesAvailable; - } - - *ppFramesOut = ma_resource_manager_data_stream_get_page_data_pointer(pDataStream, pDataStream->currentPageIndex, pDataStream->relativeCursor); - *pFrameCount = frameCount; - - return MA_SUCCESS; -} - -static ma_result ma_resource_manager_data_stream_unmap(ma_resource_manager_data_stream* pDataStream, ma_uint64 frameCount) -{ - ma_uint32 newRelativeCursor; - ma_uint32 pageSizeInFrames; - ma_job job; - - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE); - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) { - return MA_INVALID_OPERATION; - } - - /* The frame count should always fit inside a 32-bit integer. */ - if (frameCount > 0xFFFFFFFF) { - return MA_INVALID_ARGS; - } - - pageSizeInFrames = ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream); - - /* The absolute cursor needs to be updated for ma_resource_manager_data_stream_get_cursor_in_pcm_frames(). */ - ma_resource_manager_data_stream_set_absolute_cursor(pDataStream, c89atomic_load_64(&pDataStream->absoluteCursor) + frameCount); - - /* Here is where we need to check if we need to load a new page, and if so, post a job to load it. */ - newRelativeCursor = pDataStream->relativeCursor + (ma_uint32)frameCount; - - /* If the new cursor has flowed over to the next page we need to mark the old one as invalid and post an event for it. */ - if (newRelativeCursor >= pageSizeInFrames) { - newRelativeCursor -= pageSizeInFrames; - - /* Here is where we post the job start decoding. */ - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM); - job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream); - job.data.resourceManager.pageDataStream.pDataStream = pDataStream; - job.data.resourceManager.pageDataStream.pageIndex = pDataStream->currentPageIndex; - - /* The page needs to be marked as invalid so that the public API doesn't try reading from it. */ - c89atomic_exchange_32(&pDataStream->isPageValid[pDataStream->currentPageIndex], MA_FALSE); - - /* Before posting the job we need to make sure we set some state. */ - pDataStream->relativeCursor = newRelativeCursor; - pDataStream->currentPageIndex = (pDataStream->currentPageIndex + 1) & 0x01; - return ma_resource_manager_post_job(pDataStream->pResourceManager, &job); - } else { - /* We haven't moved into a new page so we can just move the cursor forward. */ - pDataStream->relativeCursor = newRelativeCursor; - return MA_SUCCESS; - } -} - - -MA_API ma_result ma_resource_manager_data_stream_read_pcm_frames(ma_resource_manager_data_stream* pDataStream, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_uint64 totalFramesProcessed; - ma_format format; - ma_uint32 channels; - - /* Safety. */ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (frameCount == 0) { - return MA_INVALID_ARGS; - } - - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE); - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) { - return MA_INVALID_OPERATION; - } - - /* Don't attempt to read while we're in the middle of seeking. Tell the caller that we're busy. */ - if (ma_resource_manager_data_stream_seek_counter(pDataStream) > 0) { - return MA_BUSY; - } - - ma_resource_manager_data_stream_get_data_format(pDataStream, &format, &channels, NULL, NULL, 0); - - /* Reading is implemented in terms of map/unmap. We need to run this in a loop because mapping is clamped against page boundaries. */ - totalFramesProcessed = 0; - while (totalFramesProcessed < frameCount) { - void* pMappedFrames; - ma_uint64 mappedFrameCount; - - mappedFrameCount = frameCount - totalFramesProcessed; - result = ma_resource_manager_data_stream_map(pDataStream, &pMappedFrames, &mappedFrameCount); - if (result != MA_SUCCESS) { - break; - } - - /* Copy the mapped data to the output buffer if we have one. It's allowed for pFramesOut to be NULL in which case a relative forward seek is performed. */ - if (pFramesOut != NULL) { - ma_copy_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesProcessed, format, channels), pMappedFrames, mappedFrameCount, format, channels); - } - - totalFramesProcessed += mappedFrameCount; - - result = ma_resource_manager_data_stream_unmap(pDataStream, mappedFrameCount); - if (result != MA_SUCCESS) { - break; /* This is really bad - will only get an error here if we failed to post a job to the queue for loading the next page. */ - } - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesProcessed; - } - - if (result == MA_SUCCESS && totalFramesProcessed == 0) { - result = MA_AT_END; - } - - return result; -} - -MA_API ma_result ma_resource_manager_data_stream_seek_to_pcm_frame(ma_resource_manager_data_stream* pDataStream, ma_uint64 frameIndex) -{ - ma_job job; - ma_result streamResult; - - streamResult = ma_resource_manager_data_stream_result(pDataStream); - - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(streamResult != MA_UNAVAILABLE); - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - if (streamResult != MA_SUCCESS && streamResult != MA_BUSY) { - return MA_INVALID_OPERATION; - } - - /* If we're not already seeking and we're sitting on the same frame, just make this a no-op. */ - if (c89atomic_load_32(&pDataStream->seekCounter) == 0) { - if (c89atomic_load_64(&pDataStream->absoluteCursor) == frameIndex) { - return MA_SUCCESS; - } - } - - - /* Increment the seek counter first to indicate to read_paged_pcm_frames() and map_paged_pcm_frames() that we are in the middle of a seek and MA_BUSY should be returned. */ - c89atomic_fetch_add_32(&pDataStream->seekCounter, 1); - - /* Update the absolute cursor so that ma_resource_manager_data_stream_get_cursor_in_pcm_frames() returns the new position. */ - ma_resource_manager_data_stream_set_absolute_cursor(pDataStream, frameIndex); - - /* - We need to clear our currently loaded pages so that the stream starts playback from the new seek point as soon as possible. These are for the purpose of the public - API and will be ignored by the seek job. The seek job will operate on the assumption that both pages have been marked as invalid and the cursor is at the start of - the first page. - */ - pDataStream->relativeCursor = 0; - pDataStream->currentPageIndex = 0; - c89atomic_exchange_32(&pDataStream->isPageValid[0], MA_FALSE); - c89atomic_exchange_32(&pDataStream->isPageValid[1], MA_FALSE); - - /* Make sure the data stream is not marked as at the end or else if we seek in response to hitting the end, we won't be able to read any more data. */ - c89atomic_exchange_32(&pDataStream->isDecoderAtEnd, MA_FALSE); - - /* - The public API is not allowed to touch the internal decoder so we need to use a job to perform the seek. When seeking, the job thread will assume both pages - are invalid and any content contained within them will be discarded and replaced with newly decoded data. - */ - job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM); - job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream); - job.data.resourceManager.seekDataStream.pDataStream = pDataStream; - job.data.resourceManager.seekDataStream.frameIndex = frameIndex; - return ma_resource_manager_post_job(pDataStream->pResourceManager, &job); -} - -MA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_manager_data_stream* pDataStream, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE); - - if (pFormat != NULL) { - *pFormat = ma_format_unknown; - } - - if (pChannels != NULL) { - *pChannels = 0; - } - - if (pSampleRate != NULL) { - *pSampleRate = 0; - } - - if (pChannelMap != NULL) { - MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap); - } - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) { - return MA_INVALID_OPERATION; - } - - /* - We're being a little bit naughty here and accessing the internal decoder from the public API. The output data format is constant, and we've defined this function - such that the application is responsible for ensuring it's not called while uninitializing so it should be safe. - */ - return ma_data_source_get_data_format(&pDataStream->decoder, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); -} - -MA_API ma_result ma_resource_manager_data_stream_get_cursor_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pCursor) -{ - ma_result result; - - if (pCursor == NULL) { - return MA_INVALID_ARGS; - } - - *pCursor = 0; - - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE); - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - /* - If the stream is in an erroneous state we need to return an invalid operation. We can allow - this to be called when the data stream is in a busy state because the caller may have asked - for an initial seek position and it's convenient to return that as the cursor position. - */ - result = ma_resource_manager_data_stream_result(pDataStream); - if (result != MA_SUCCESS && result != MA_BUSY) { - return MA_INVALID_OPERATION; - } - - *pCursor = c89atomic_load_64(&pDataStream->absoluteCursor); - - return MA_SUCCESS; -} - -MA_API ma_result ma_resource_manager_data_stream_get_length_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pLength) -{ - ma_result streamResult; - - if (pLength == NULL) { - return MA_INVALID_ARGS; - } - - *pLength = 0; - - streamResult = ma_resource_manager_data_stream_result(pDataStream); - - /* We cannot be using the data source after it's been uninitialized. */ - MA_ASSERT(streamResult != MA_UNAVAILABLE); - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - if (streamResult != MA_SUCCESS) { - return streamResult; - } - - /* - We most definitely do not want to be calling ma_decoder_get_length_in_pcm_frames() directly. Instead we want to use a cached value that we - calculated when we initialized it on the job thread. - */ - *pLength = pDataStream->totalLengthInPCMFrames; - if (*pLength == 0) { - return MA_NOT_IMPLEMENTED; /* Some decoders may not have a known length. */ - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_resource_manager_data_stream_result(const ma_resource_manager_data_stream* pDataStream) -{ - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - return (ma_result)c89atomic_load_i32(&pDataStream->result); -} - -MA_API ma_result ma_resource_manager_data_stream_set_looping(ma_resource_manager_data_stream* pDataStream, ma_bool32 isLooping) -{ - return ma_data_source_set_looping(pDataStream, isLooping); -} - -MA_API ma_bool32 ma_resource_manager_data_stream_is_looping(const ma_resource_manager_data_stream* pDataStream) -{ - if (pDataStream == NULL) { - return MA_FALSE; - } - - return c89atomic_load_32((ma_bool32*)&pDataStream->isLooping); /* Naughty const-cast. Value won't change from here in practice (maybe from another thread). */ -} - -MA_API ma_result ma_resource_manager_data_stream_get_available_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pAvailableFrames) -{ - ma_uint32 pageIndex0; - ma_uint32 pageIndex1; - ma_uint32 relativeCursor; - ma_uint64 availableFrames; - - if (pAvailableFrames == NULL) { - return MA_INVALID_ARGS; - } - - *pAvailableFrames = 0; - - if (pDataStream == NULL) { - return MA_INVALID_ARGS; - } - - pageIndex0 = pDataStream->currentPageIndex; - pageIndex1 = (pDataStream->currentPageIndex + 1) & 0x01; - relativeCursor = pDataStream->relativeCursor; - - availableFrames = 0; - if (c89atomic_load_32(&pDataStream->isPageValid[pageIndex0])) { - availableFrames += c89atomic_load_32(&pDataStream->pageFrameCount[pageIndex0]) - relativeCursor; - if (c89atomic_load_32(&pDataStream->isPageValid[pageIndex1])) { - availableFrames += c89atomic_load_32(&pDataStream->pageFrameCount[pageIndex1]); - } - } - - *pAvailableFrames = availableFrames; - return MA_SUCCESS; -} - - -static ma_result ma_resource_manager_data_source_preinit(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_source* pDataSource) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDataSource); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pResourceManager == NULL) { - return MA_INVALID_ARGS; - } - - pDataSource->flags = pConfig->flags; - - return MA_SUCCESS; -} - -MA_API ma_result ma_resource_manager_data_source_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_source* pDataSource) -{ - ma_result result; - - result = ma_resource_manager_data_source_preinit(pResourceManager, pConfig, pDataSource); - if (result != MA_SUCCESS) { - return result; - } - - /* The data source itself is just a data stream or a data buffer. */ - if ((pConfig->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_init_ex(pResourceManager, pConfig, &pDataSource->backend.stream); - } else { - return ma_resource_manager_data_buffer_init_ex(pResourceManager, pConfig, &pDataSource->backend.buffer); - } -} - -MA_API ma_result ma_resource_manager_data_source_init(ma_resource_manager* pResourceManager, const char* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource) -{ - ma_resource_manager_data_source_config config; - - config = ma_resource_manager_data_source_config_init(); - config.pFilePath = pName; - config.flags = flags; - config.pNotifications = pNotifications; - - return ma_resource_manager_data_source_init_ex(pResourceManager, &config, pDataSource); -} - -MA_API ma_result ma_resource_manager_data_source_init_w(ma_resource_manager* pResourceManager, const wchar_t* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource) -{ - ma_resource_manager_data_source_config config; - - config = ma_resource_manager_data_source_config_init(); - config.pFilePathW = pName; - config.flags = flags; - config.pNotifications = pNotifications; - - return ma_resource_manager_data_source_init_ex(pResourceManager, &config, pDataSource); -} - -MA_API ma_result ma_resource_manager_data_source_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source* pExistingDataSource, ma_resource_manager_data_source* pDataSource) -{ - ma_result result; - ma_resource_manager_data_source_config config; - - if (pExistingDataSource == NULL) { - return MA_INVALID_ARGS; - } - - config = ma_resource_manager_data_source_config_init(); - config.flags = pExistingDataSource->flags; - - result = ma_resource_manager_data_source_preinit(pResourceManager, &config, pDataSource); - if (result != MA_SUCCESS) { - return result; - } - - /* Copying can only be done from data buffers. Streams cannot be copied. */ - if ((pExistingDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return MA_INVALID_OPERATION; - } - - return ma_resource_manager_data_buffer_init_copy(pResourceManager, &pExistingDataSource->backend.buffer, &pDataSource->backend.buffer); -} - -MA_API ma_result ma_resource_manager_data_source_uninit(ma_resource_manager_data_source* pDataSource) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - /* All we need to is uninitialize the underlying data buffer or data stream. */ - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_uninit(&pDataSource->backend.stream); - } else { - return ma_resource_manager_data_buffer_uninit(&pDataSource->backend.buffer); - } -} - -MA_API ma_result ma_resource_manager_data_source_read_pcm_frames(ma_resource_manager_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - /* Safety. */ - if (pFramesRead != NULL) { - *pFramesRead = 0; - } - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_read_pcm_frames(&pDataSource->backend.stream, pFramesOut, frameCount, pFramesRead); - } else { - return ma_resource_manager_data_buffer_read_pcm_frames(&pDataSource->backend.buffer, pFramesOut, frameCount, pFramesRead); - } -} - -MA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_manager_data_source* pDataSource, ma_uint64 frameIndex) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_seek_to_pcm_frame(&pDataSource->backend.stream, frameIndex); - } else { - return ma_resource_manager_data_buffer_seek_to_pcm_frame(&pDataSource->backend.buffer, frameIndex); - } -} - -MA_API ma_result ma_resource_manager_data_source_map(ma_resource_manager_data_source* pDataSource, void** ppFramesOut, ma_uint64* pFrameCount) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_map(&pDataSource->backend.stream, ppFramesOut, pFrameCount); - } else { - return MA_NOT_IMPLEMENTED; /* Mapping not supported with data buffers. */ - } -} - -MA_API ma_result ma_resource_manager_data_source_unmap(ma_resource_manager_data_source* pDataSource, ma_uint64 frameCount) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_unmap(&pDataSource->backend.stream, frameCount); - } else { - return MA_NOT_IMPLEMENTED; /* Mapping not supported with data buffers. */ - } -} - -MA_API ma_result ma_resource_manager_data_source_get_data_format(ma_resource_manager_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_get_data_format(&pDataSource->backend.stream, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); - } else { - return ma_resource_manager_data_buffer_get_data_format(&pDataSource->backend.buffer, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); - } -} - -MA_API ma_result ma_resource_manager_data_source_get_cursor_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pCursor) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_get_cursor_in_pcm_frames(&pDataSource->backend.stream, pCursor); - } else { - return ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(&pDataSource->backend.buffer, pCursor); - } -} - -MA_API ma_result ma_resource_manager_data_source_get_length_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pLength) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_get_length_in_pcm_frames(&pDataSource->backend.stream, pLength); - } else { - return ma_resource_manager_data_buffer_get_length_in_pcm_frames(&pDataSource->backend.buffer, pLength); - } -} - -MA_API ma_result ma_resource_manager_data_source_result(const ma_resource_manager_data_source* pDataSource) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_result(&pDataSource->backend.stream); - } else { - return ma_resource_manager_data_buffer_result(&pDataSource->backend.buffer); - } -} - -MA_API ma_result ma_resource_manager_data_source_set_looping(ma_resource_manager_data_source* pDataSource, ma_bool32 isLooping) -{ - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_set_looping(&pDataSource->backend.stream, isLooping); - } else { - return ma_resource_manager_data_buffer_set_looping(&pDataSource->backend.buffer, isLooping); - } -} - -MA_API ma_bool32 ma_resource_manager_data_source_is_looping(const ma_resource_manager_data_source* pDataSource) -{ - if (pDataSource == NULL) { - return MA_FALSE; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_is_looping(&pDataSource->backend.stream); - } else { - return ma_resource_manager_data_buffer_is_looping(&pDataSource->backend.buffer); - } -} - -MA_API ma_result ma_resource_manager_data_source_get_available_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pAvailableFrames) -{ - if (pAvailableFrames == NULL) { - return MA_INVALID_ARGS; - } - - *pAvailableFrames = 0; - - if (pDataSource == NULL) { - return MA_INVALID_ARGS; - } - - if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) { - return ma_resource_manager_data_stream_get_available_frames(&pDataSource->backend.stream, pAvailableFrames); - } else { - return ma_resource_manager_data_buffer_get_available_frames(&pDataSource->backend.buffer, pAvailableFrames); - } -} - - -MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob) -{ - if (pResourceManager == NULL) { - return MA_INVALID_ARGS; - } - - return ma_job_queue_post(&pResourceManager->jobQueue, pJob); -} - -MA_API ma_result ma_resource_manager_post_job_quit(ma_resource_manager* pResourceManager) -{ - ma_job job = ma_job_init(MA_JOB_TYPE_QUIT); - return ma_resource_manager_post_job(pResourceManager, &job); -} - -MA_API ma_result ma_resource_manager_next_job(ma_resource_manager* pResourceManager, ma_job* pJob) -{ - if (pResourceManager == NULL) { - return MA_INVALID_ARGS; - } - - return ma_job_queue_next(&pResourceManager->jobQueue, pJob); -} - - -static ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager* pResourceManager; - ma_resource_manager_data_buffer_node* pDataBufferNode; - - MA_ASSERT(pJob != NULL); - - pResourceManager = (ma_resource_manager*)pJob->data.resourceManager.loadDataBufferNode.pResourceManager; - MA_ASSERT(pResourceManager != NULL); - - pDataBufferNode = (ma_resource_manager_data_buffer_node*)pJob->data.resourceManager.loadDataBufferNode.pDataBufferNode; - MA_ASSERT(pDataBufferNode != NULL); - MA_ASSERT(pDataBufferNode->isDataOwnedByResourceManager == MA_TRUE); /* The data should always be owned by the resource manager. */ - - /* The data buffer is not getting deleted, but we may be getting executed out of order. If so, we need to push the job back onto the queue and return. */ - if (pJob->order != c89atomic_load_32(&pDataBufferNode->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Attempting to execute out of order. Probably interleaved with a MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER job. */ - } - - /* First thing we need to do is check whether or not the data buffer is getting deleted. If so we just abort. */ - if (ma_resource_manager_data_buffer_node_result(pDataBufferNode) != MA_BUSY) { - result = ma_resource_manager_data_buffer_node_result(pDataBufferNode); /* The data buffer may be getting deleted before it's even been loaded. */ - goto done; - } - - /* - We're ready to start loading. Essentially what we're doing here is initializing the data supply - of the node. Once this is complete, data buffers can have their connectors initialized which - will allow then to have audio data read from them. - - Note that when the data supply type has been moved away from "unknown", that is when other threads - will determine that the node is available for data delivery and the data buffer connectors can be - initialized. Therefore, it's important that it is set after the data supply has been initialized. - */ - if ((pJob->data.resourceManager.loadDataBufferNode.flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE) != 0) { - /* - Decoding. This is the complex case because we're not going to be doing the entire decoding - process here. Instead it's going to be split of multiple jobs and loaded in pages. The - reason for this is to evenly distribute decoding time across multiple sounds, rather than - having one huge sound hog all the available processing resources. - - The first thing we do is initialize a decoder. This is allocated on the heap and is passed - around to the paging jobs. When the last paging job has completed it's processing, it'll - free the decoder for us. - - This job does not do any actual decoding. It instead just posts a PAGE_DATA_BUFFER_NODE job - which is where the actual decoding work will be done. However, once this job is complete, - the node will be in a state where data buffer connectors can be initialized. - */ - ma_decoder* pDecoder; /* <-- Free'd on the last page decode. */ - ma_job pageDataBufferNodeJob; - - /* Allocate the decoder by initializing a decoded data supply. */ - result = ma_resource_manager_data_buffer_node_init_supply_decoded(pResourceManager, pDataBufferNode, pJob->data.resourceManager.loadDataBufferNode.pFilePath, pJob->data.resourceManager.loadDataBufferNode.pFilePathW, pJob->data.resourceManager.loadDataBufferNode.flags, &pDecoder); - - /* - Don't ever propagate an MA_BUSY result code or else the resource manager will think the - node is just busy decoding rather than in an error state. This should never happen, but - including this logic for safety just in case. - */ - if (result == MA_BUSY) { - result = MA_ERROR; - } - - if (result != MA_SUCCESS) { - if (pJob->data.resourceManager.loadDataBufferNode.pFilePath != NULL) { - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, "Failed to initialize data supply for \"%s\". %s.\n", pJob->data.resourceManager.loadDataBufferNode.pFilePath, ma_result_description(result)); - } else { - #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(_MSC_VER) - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, "Failed to initialize data supply for \"%ls\", %s.\n", pJob->data.resourceManager.loadDataBufferNode.pFilePathW, ma_result_description(result)); - #endif - } - - goto done; - } - - /* - At this point the node's data supply is initialized and other threads can start initializing - their data buffer connectors. However, no data will actually be available until we start to - actually decode it. To do this, we need to post a paging job which is where the decoding - work is done. - - Note that if an error occurred at an earlier point, this section will have been skipped. - */ - pageDataBufferNodeJob = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE); - pageDataBufferNodeJob.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode); - pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pResourceManager = pResourceManager; - pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDataBufferNode = pDataBufferNode; - pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDecoder = pDecoder; - pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDoneNotification = pJob->data.resourceManager.loadDataBufferNode.pDoneNotification; - pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDoneFence = pJob->data.resourceManager.loadDataBufferNode.pDoneFence; - - /* The job has been set up so it can now be posted. */ - result = ma_resource_manager_post_job(pResourceManager, &pageDataBufferNodeJob); - - /* - When we get here, we want to make sure the result code is set to MA_BUSY. The reason for - this is that the result will be copied over to the node's internal result variable. In - this case, since the decoding is still in-progress, we need to make sure the result code - is set to MA_BUSY. - */ - if (result != MA_SUCCESS) { - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, "Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE job. %s\n", ma_result_description(result)); - ma_decoder_uninit(pDecoder); - ma_free(pDecoder, &pResourceManager->config.allocationCallbacks); - } else { - result = MA_BUSY; - } - } else { - /* No decoding. This is the simple case. We need only read the file content into memory and we're done. */ - result = ma_resource_manager_data_buffer_node_init_supply_encoded(pResourceManager, pDataBufferNode, pJob->data.resourceManager.loadDataBufferNode.pFilePath, pJob->data.resourceManager.loadDataBufferNode.pFilePathW); - } - - -done: - /* File paths are no longer needed. */ - ma_free(pJob->data.resourceManager.loadDataBufferNode.pFilePath, &pResourceManager->config.allocationCallbacks); - ma_free(pJob->data.resourceManager.loadDataBufferNode.pFilePathW, &pResourceManager->config.allocationCallbacks); - - /* - We need to set the result to at the very end to ensure no other threads try reading the data before we've fully initialized the object. Other threads - are going to be inspecting this variable to determine whether or not they're ready to read data. We can only change the result if it's set to MA_BUSY - because otherwise we may be changing away from an error code which would be bad. An example is if the application creates a data buffer, but then - immediately deletes it before we've got to this point. In this case, pDataBuffer->result will be MA_UNAVAILABLE, and setting it to MA_SUCCESS or any - other error code would cause the buffer to look like it's in a state that it's not. - */ - c89atomic_compare_and_swap_i32(&pDataBufferNode->result, MA_BUSY, result); - - /* At this point initialization is complete and we can signal the notification if any. */ - if (pJob->data.resourceManager.loadDataBufferNode.pInitNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.loadDataBufferNode.pInitNotification); - } - if (pJob->data.resourceManager.loadDataBufferNode.pInitFence != NULL) { - ma_fence_release(pJob->data.resourceManager.loadDataBufferNode.pInitFence); - } - - /* If we have a success result it means we've fully loaded the buffer. This will happen in the non-decoding case. */ - if (result != MA_BUSY) { - if (pJob->data.resourceManager.loadDataBufferNode.pDoneNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.loadDataBufferNode.pDoneNotification); - } - if (pJob->data.resourceManager.loadDataBufferNode.pDoneFence != NULL) { - ma_fence_release(pJob->data.resourceManager.loadDataBufferNode.pDoneFence); - } - } - - /* Increment the node's execution pointer so that the next jobs can be processed. This is how we keep decoding of pages in-order. */ - c89atomic_fetch_add_32(&pDataBufferNode->executionPointer, 1); - return result; -} - -static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob) -{ - ma_resource_manager* pResourceManager; - ma_resource_manager_data_buffer_node* pDataBufferNode; - - MA_ASSERT(pJob != NULL); - - pResourceManager = (ma_resource_manager*)pJob->data.resourceManager.freeDataBufferNode.pResourceManager; - MA_ASSERT(pResourceManager != NULL); - - pDataBufferNode = (ma_resource_manager_data_buffer_node*)pJob->data.resourceManager.freeDataBufferNode.pDataBufferNode; - MA_ASSERT(pDataBufferNode != NULL); - - if (pJob->order != c89atomic_load_32(&pDataBufferNode->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ - } - - ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode); - - /* The event needs to be signalled last. */ - if (pJob->data.resourceManager.freeDataBufferNode.pDoneNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.freeDataBufferNode.pDoneNotification); - } - - if (pJob->data.resourceManager.freeDataBufferNode.pDoneFence != NULL) { - ma_fence_release(pJob->data.resourceManager.freeDataBufferNode.pDoneFence); - } - - c89atomic_fetch_add_32(&pDataBufferNode->executionPointer, 1); - return MA_SUCCESS; -} - -static ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager* pResourceManager; - ma_resource_manager_data_buffer_node* pDataBufferNode; - - MA_ASSERT(pJob != NULL); - - pResourceManager = (ma_resource_manager*)pJob->data.resourceManager.pageDataBufferNode.pResourceManager; - MA_ASSERT(pResourceManager != NULL); - - pDataBufferNode = (ma_resource_manager_data_buffer_node*)pJob->data.resourceManager.pageDataBufferNode.pDataBufferNode; - MA_ASSERT(pDataBufferNode != NULL); - - if (pJob->order != c89atomic_load_32(&pDataBufferNode->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ - } - - /* Don't do any more decoding if the data buffer has started the uninitialization process. */ - result = ma_resource_manager_data_buffer_node_result(pDataBufferNode); - if (result != MA_BUSY) { - goto done; - } - - /* We're ready to decode the next page. */ - result = ma_resource_manager_data_buffer_node_decode_next_page(pResourceManager, pDataBufferNode, (ma_decoder*)pJob->data.resourceManager.pageDataBufferNode.pDecoder); - - /* - If we have a success code by this point, we want to post another job. We're going to set the - result back to MA_BUSY to make it clear that there's still more to load. - */ - if (result == MA_SUCCESS) { - ma_job newJob; - newJob = *pJob; /* Everything is the same as the input job, except the execution order. */ - newJob.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode); /* We need a fresh execution order. */ - - result = ma_resource_manager_post_job(pResourceManager, &newJob); - - /* Since the sound isn't yet fully decoded we want the status to be set to busy. */ - if (result == MA_SUCCESS) { - result = MA_BUSY; - } - } - -done: - /* If there's still more to decode the result will be set to MA_BUSY. Otherwise we can free the decoder. */ - if (result != MA_BUSY) { - ma_decoder_uninit((ma_decoder*)pJob->data.resourceManager.pageDataBufferNode.pDecoder); - ma_free(pJob->data.resourceManager.pageDataBufferNode.pDecoder, &pResourceManager->config.allocationCallbacks); - } - - /* If we reached the end we need to treat it as successful. */ - if (result == MA_AT_END) { - result = MA_SUCCESS; - } - - /* Make sure we set the result of node in case some error occurred. */ - c89atomic_compare_and_swap_i32(&pDataBufferNode->result, MA_BUSY, result); - - /* Signal the notification after setting the result in case the notification callback wants to inspect the result code. */ - if (result != MA_BUSY) { - if (pJob->data.resourceManager.pageDataBufferNode.pDoneNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.pageDataBufferNode.pDoneNotification); - } - - if (pJob->data.resourceManager.pageDataBufferNode.pDoneFence != NULL) { - ma_fence_release(pJob->data.resourceManager.pageDataBufferNode.pDoneFence); - } - } - - c89atomic_fetch_add_32(&pDataBufferNode->executionPointer, 1); - return result; -} - - -static ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager* pResourceManager; - ma_resource_manager_data_buffer* pDataBuffer; - ma_resource_manager_data_supply_type dataSupplyType = ma_resource_manager_data_supply_type_unknown; - ma_bool32 isConnectorInitialized = MA_FALSE; - - /* - All we're doing here is checking if the node has finished loading. If not, we just re-post the job - and keep waiting. Otherwise we increment the execution counter and set the buffer's result code. - */ - MA_ASSERT(pJob != NULL); - - pDataBuffer = (ma_resource_manager_data_buffer*)pJob->data.resourceManager.loadDataBuffer.pDataBuffer; - MA_ASSERT(pDataBuffer != NULL); - - pResourceManager = pDataBuffer->pResourceManager; - - if (pJob->order != c89atomic_load_32(&pDataBuffer->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Attempting to execute out of order. Probably interleaved with a MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER job. */ - } - - /* - First thing we need to do is check whether or not the data buffer is getting deleted. If so we - just abort, but making sure we increment the execution pointer. - */ - result = ma_resource_manager_data_buffer_result(pDataBuffer); - if (result != MA_BUSY) { - goto done; /* <-- This will ensure the exucution pointer is incremented. */ - } else { - result = MA_SUCCESS; /* <-- Make sure this is reset. */ - } - - /* Try initializing the connector if we haven't already. */ - isConnectorInitialized = pDataBuffer->isConnectorInitialized; - if (isConnectorInitialized == MA_FALSE) { - dataSupplyType = ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode); - - if (dataSupplyType != ma_resource_manager_data_supply_type_unknown) { - /* We can now initialize the connector. If this fails, we need to abort. It's very rare for this to fail. */ - ma_resource_manager_data_source_config dataSourceConfig; /* For setting initial looping state and range. */ - dataSourceConfig = ma_resource_manager_data_source_config_init(); - dataSourceConfig.rangeBegInPCMFrames = pJob->data.resourceManager.loadDataBuffer.rangeBegInPCMFrames; - dataSourceConfig.rangeEndInPCMFrames = pJob->data.resourceManager.loadDataBuffer.rangeEndInPCMFrames; - dataSourceConfig.loopPointBegInPCMFrames = pJob->data.resourceManager.loadDataBuffer.loopPointBegInPCMFrames; - dataSourceConfig.loopPointEndInPCMFrames = pJob->data.resourceManager.loadDataBuffer.loopPointEndInPCMFrames; - dataSourceConfig.isLooping = pJob->data.resourceManager.loadDataBuffer.isLooping; - - result = ma_resource_manager_data_buffer_init_connector(pDataBuffer, &dataSourceConfig, pJob->data.resourceManager.loadDataBuffer.pInitNotification, pJob->data.resourceManager.loadDataBuffer.pInitFence); - if (result != MA_SUCCESS) { - ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, "Failed to initialize connector for data buffer. %s.\n", ma_result_description(result)); - goto done; - } - } else { - /* Don't have a known data supply type. Most likely the data buffer node is still loading, but it could be that an error occurred. */ - } - } else { - /* The connector is already initialized. Nothing to do here. */ - } - - /* - If the data node is still loading, we need to repost the job and *not* increment the execution - pointer (i.e. we need to not fall through to the "done" label). - - There is a hole between here and the where the data connector is initialized where the data - buffer node may have finished initializing. We need to check for this by checking the result of - the data buffer node and whether or not we had an unknown data supply type at the time of - trying to initialize the data connector. - */ - result = ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode); - if (result == MA_BUSY || (result == MA_SUCCESS && isConnectorInitialized == MA_FALSE && dataSupplyType == ma_resource_manager_data_supply_type_unknown)) { - return ma_resource_manager_post_job(pResourceManager, pJob); - } - -done: - /* Only move away from a busy code so that we don't trash any existing error codes. */ - c89atomic_compare_and_swap_i32(&pDataBuffer->result, MA_BUSY, result); - - /* Only signal the other threads after the result has been set just for cleanliness sake. */ - if (pJob->data.resourceManager.loadDataBuffer.pDoneNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.loadDataBuffer.pDoneNotification); - } - if (pJob->data.resourceManager.loadDataBuffer.pDoneFence != NULL) { - ma_fence_release(pJob->data.resourceManager.loadDataBuffer.pDoneFence); - } - - /* - If at this point the data buffer has not had it's connector initialized, it means the - notification event was never signalled which means we need to signal it here. - */ - if (pDataBuffer->isConnectorInitialized == MA_FALSE && result != MA_SUCCESS) { - if (pJob->data.resourceManager.loadDataBuffer.pInitNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.loadDataBuffer.pInitNotification); - } - if (pJob->data.resourceManager.loadDataBuffer.pInitFence != NULL) { - ma_fence_release(pJob->data.resourceManager.loadDataBuffer.pInitFence); - } - } - - c89atomic_fetch_add_32(&pDataBuffer->executionPointer, 1); - return result; -} - -static ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob) -{ - ma_resource_manager* pResourceManager; - ma_resource_manager_data_buffer* pDataBuffer; - - MA_ASSERT(pJob != NULL); - - pDataBuffer = (ma_resource_manager_data_buffer*)pJob->data.resourceManager.freeDataBuffer.pDataBuffer; - MA_ASSERT(pDataBuffer != NULL); - - pResourceManager = pDataBuffer->pResourceManager; - - if (pJob->order != c89atomic_load_32(&pDataBuffer->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ - } - - ma_resource_manager_data_buffer_uninit_internal(pDataBuffer); - - /* The event needs to be signalled last. */ - if (pJob->data.resourceManager.freeDataBuffer.pDoneNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.freeDataBuffer.pDoneNotification); - } - - if (pJob->data.resourceManager.freeDataBuffer.pDoneFence != NULL) { - ma_fence_release(pJob->data.resourceManager.freeDataBuffer.pDoneFence); - } - - c89atomic_fetch_add_32(&pDataBuffer->executionPointer, 1); - return MA_SUCCESS; -} - -static ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob) -{ - ma_result result = MA_SUCCESS; - ma_decoder_config decoderConfig; - ma_uint32 pageBufferSizeInBytes; - ma_resource_manager* pResourceManager; - ma_resource_manager_data_stream* pDataStream; - - MA_ASSERT(pJob != NULL); - - pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.loadDataStream.pDataStream; - MA_ASSERT(pDataStream != NULL); - - pResourceManager = pDataStream->pResourceManager; - - if (pJob->order != c89atomic_load_32(&pDataStream->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ - } - - if (ma_resource_manager_data_stream_result(pDataStream) != MA_BUSY) { - result = MA_INVALID_OPERATION; /* Most likely the data stream is being uninitialized. */ - goto done; - } - - /* We need to initialize the decoder first so we can determine the size of the pages. */ - decoderConfig = ma_resource_manager__init_decoder_config(pResourceManager); - - if (pJob->data.resourceManager.loadDataStream.pFilePath != NULL) { - result = ma_decoder_init_vfs(pResourceManager->config.pVFS, pJob->data.resourceManager.loadDataStream.pFilePath, &decoderConfig, &pDataStream->decoder); - } else { - result = ma_decoder_init_vfs_w(pResourceManager->config.pVFS, pJob->data.resourceManager.loadDataStream.pFilePathW, &decoderConfig, &pDataStream->decoder); - } - if (result != MA_SUCCESS) { - goto done; - } - - /* Retrieve the total length of the file before marking the decoder are loaded. */ - if ((pDataStream->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH) == 0) { - result = ma_decoder_get_length_in_pcm_frames(&pDataStream->decoder, &pDataStream->totalLengthInPCMFrames); - if (result != MA_SUCCESS) { - goto done; /* Failed to retrieve the length. */ - } - } else { - pDataStream->totalLengthInPCMFrames = 0; - } - - /* - Only mark the decoder as initialized when the length of the decoder has been retrieved because that can possibly require a scan over the whole file - and we don't want to have another thread trying to access the decoder while it's scanning. - */ - pDataStream->isDecoderInitialized = MA_TRUE; - - /* We have the decoder so we can now initialize our page buffer. */ - pageBufferSizeInBytes = ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream) * 2 * ma_get_bytes_per_frame(pDataStream->decoder.outputFormat, pDataStream->decoder.outputChannels); - - pDataStream->pPageData = ma_malloc(pageBufferSizeInBytes, &pResourceManager->config.allocationCallbacks); - if (pDataStream->pPageData == NULL) { - ma_decoder_uninit(&pDataStream->decoder); - result = MA_OUT_OF_MEMORY; - goto done; - } - - /* Seek to our initial seek point before filling the initial pages. */ - ma_decoder_seek_to_pcm_frame(&pDataStream->decoder, pJob->data.resourceManager.loadDataStream.initialSeekPoint); - - /* We have our decoder and our page buffer, so now we need to fill our pages. */ - ma_resource_manager_data_stream_fill_pages(pDataStream); - - /* And now we're done. We want to make sure the result is MA_SUCCESS. */ - result = MA_SUCCESS; - -done: - ma_free(pJob->data.resourceManager.loadDataStream.pFilePath, &pResourceManager->config.allocationCallbacks); - ma_free(pJob->data.resourceManager.loadDataStream.pFilePathW, &pResourceManager->config.allocationCallbacks); - - /* We can only change the status away from MA_BUSY. If it's set to anything else it means an error has occurred somewhere or the uninitialization process has started (most likely). */ - c89atomic_compare_and_swap_i32(&pDataStream->result, MA_BUSY, result); - - /* Only signal the other threads after the result has been set just for cleanliness sake. */ - if (pJob->data.resourceManager.loadDataStream.pInitNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.loadDataStream.pInitNotification); - } - if (pJob->data.resourceManager.loadDataStream.pInitFence != NULL) { - ma_fence_release(pJob->data.resourceManager.loadDataStream.pInitFence); - } - - c89atomic_fetch_add_32(&pDataStream->executionPointer, 1); - return result; -} - -static ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob) -{ - ma_resource_manager* pResourceManager; - ma_resource_manager_data_stream* pDataStream; - - MA_ASSERT(pJob != NULL); - - pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.freeDataStream.pDataStream; - MA_ASSERT(pDataStream != NULL); - - pResourceManager = pDataStream->pResourceManager; - - if (pJob->order != c89atomic_load_32(&pDataStream->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ - } - - /* If our status is not MA_UNAVAILABLE we have a bug somewhere. */ - MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) == MA_UNAVAILABLE); - - if (pDataStream->isDecoderInitialized) { - ma_decoder_uninit(&pDataStream->decoder); - } - - if (pDataStream->pPageData != NULL) { - ma_free(pDataStream->pPageData, &pResourceManager->config.allocationCallbacks); - pDataStream->pPageData = NULL; /* Just in case... */ - } - - ma_data_source_uninit(&pDataStream->ds); - - /* The event needs to be signalled last. */ - if (pJob->data.resourceManager.freeDataStream.pDoneNotification != NULL) { - ma_async_notification_signal(pJob->data.resourceManager.freeDataStream.pDoneNotification); - } - if (pJob->data.resourceManager.freeDataStream.pDoneFence != NULL) { - ma_fence_release(pJob->data.resourceManager.freeDataStream.pDoneFence); - } - - /*c89atomic_fetch_add_32(&pDataStream->executionPointer, 1);*/ - return MA_SUCCESS; -} - -static ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager* pResourceManager; - ma_resource_manager_data_stream* pDataStream; - - MA_ASSERT(pJob != NULL); - - pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.pageDataStream.pDataStream; - MA_ASSERT(pDataStream != NULL); - - pResourceManager = pDataStream->pResourceManager; - - if (pJob->order != c89atomic_load_32(&pDataStream->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ - } - - /* For streams, the status should be MA_SUCCESS. */ - if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) { - result = MA_INVALID_OPERATION; - goto done; - } - - ma_resource_manager_data_stream_fill_page(pDataStream, pJob->data.resourceManager.pageDataStream.pageIndex); - -done: - c89atomic_fetch_add_32(&pDataStream->executionPointer, 1); - return result; -} - -static ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob) -{ - ma_result result = MA_SUCCESS; - ma_resource_manager* pResourceManager; - ma_resource_manager_data_stream* pDataStream; - - MA_ASSERT(pJob != NULL); - - pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.seekDataStream.pDataStream; - MA_ASSERT(pDataStream != NULL); - - pResourceManager = pDataStream->pResourceManager; - - if (pJob->order != c89atomic_load_32(&pDataStream->executionPointer)) { - return ma_resource_manager_post_job(pResourceManager, pJob); /* Out of order. */ - } - - /* For streams the status should be MA_SUCCESS for this to do anything. */ - if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS || pDataStream->isDecoderInitialized == MA_FALSE) { - result = MA_INVALID_OPERATION; - goto done; - } - - /* - With seeking we just assume both pages are invalid and the relative frame cursor at position 0. This is basically exactly the same as loading, except - instead of initializing the decoder, we seek to a frame. - */ - ma_decoder_seek_to_pcm_frame(&pDataStream->decoder, pJob->data.resourceManager.seekDataStream.frameIndex); - - /* After seeking we'll need to reload the pages. */ - ma_resource_manager_data_stream_fill_pages(pDataStream); - - /* We need to let the public API know that we're done seeking. */ - c89atomic_fetch_sub_32(&pDataStream->seekCounter, 1); - -done: - c89atomic_fetch_add_32(&pDataStream->executionPointer, 1); - return result; -} - -MA_API ma_result ma_resource_manager_process_job(ma_resource_manager* pResourceManager, ma_job* pJob) -{ - if (pResourceManager == NULL || pJob == NULL) { - return MA_INVALID_ARGS; - } - - return ma_job_process(pJob); -} - -MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager) -{ - ma_result result; - ma_job job; - - if (pResourceManager == NULL) { - return MA_INVALID_ARGS; - } - - /* This will return MA_CANCELLED if the next job is a quit job. */ - result = ma_resource_manager_next_job(pResourceManager, &job); - if (result != MA_SUCCESS) { - return result; - } - - return ma_job_process(&job); -} -#else -/* We'll get here if the resource manager is being excluded from the build. We need to define the job processing callbacks as no-ops. */ -static ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob) { return ma_job_process__noop(pJob); } -static ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob) { return ma_job_process__noop(pJob); } -#endif /* MA_NO_RESOURCE_MANAGER */ - - -#ifndef MA_NO_NODE_GRAPH -/* 10ms @ 48K = 480. Must never exceed 65535. */ -#ifndef MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS -#define MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS 480 -#endif - - -static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusIndex, float* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead, ma_uint64 globalTime); - -MA_API void ma_debug_fill_pcm_frames_with_sine_wave(float* pFramesOut, ma_uint32 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate) -{ - #ifndef MA_NO_GENERATION - { - ma_waveform_config waveformConfig; - ma_waveform waveform; - - waveformConfig = ma_waveform_config_init(format, channels, sampleRate, ma_waveform_type_sine, 1.0, 400); - ma_waveform_init(&waveformConfig, &waveform); - ma_waveform_read_pcm_frames(&waveform, pFramesOut, frameCount, NULL); - } - #else - { - (void)pFramesOut; - (void)frameCount; - (void)format; - (void)channels; - (void)sampleRate; - #if defined(MA_DEBUG_OUTPUT) - { - #if _MSC_VER - #pragma message ("ma_debug_fill_pcm_frames_with_sine_wave() will do nothing because MA_NO_GENERATION is enabled.") - #endif - } - #endif - } - #endif -} - - - -static ma_result ma_mix_pcm_frames_f32(float* pDst, const float* pSrc, ma_uint64 frameCount, ma_uint32 channels, float volume) -{ - ma_uint64 iSample; - ma_uint64 sampleCount; - - if (pDst == NULL || pSrc == NULL || channels == 0) { - return MA_INVALID_ARGS; - } - - if (volume == 0) { - return MA_SUCCESS; /* No changes if the volume is 0. */ - } - - sampleCount = frameCount * channels; - - if (volume == 1) { - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pDst[iSample] += pSrc[iSample]; - } - } else { - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pDst[iSample] += ma_apply_volume_unclipped_f32(pSrc[iSample], volume); - } - } - - return MA_SUCCESS; -} - - -MA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels) -{ - ma_node_graph_config config; - - MA_ZERO_OBJECT(&config); - config.channels = channels; - config.nodeCacheCapInFrames = MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS; - - return config; -} - - -static void ma_node_graph_set_is_reading(ma_node_graph* pNodeGraph, ma_bool32 isReading) -{ - MA_ASSERT(pNodeGraph != NULL); - c89atomic_exchange_32(&pNodeGraph->isReading, isReading); -} - -#if 0 -static ma_bool32 ma_node_graph_is_reading(ma_node_graph* pNodeGraph) -{ - MA_ASSERT(pNodeGraph != NULL); - return c89atomic_load_32(&pNodeGraph->isReading); -} -#endif - - -static void ma_node_graph_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_node_graph* pNodeGraph = (ma_node_graph*)pNode; - ma_uint64 framesRead; - - ma_node_graph_read_pcm_frames(pNodeGraph, ppFramesOut[0], *pFrameCountOut, &framesRead); - - *pFrameCountOut = (ma_uint32)framesRead; /* Safe cast. */ - - (void)ppFramesIn; - (void)pFrameCountIn; -} - -static ma_node_vtable g_node_graph_node_vtable = -{ - ma_node_graph_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 0, /* 0 input buses. */ - 1, /* 1 output bus. */ - 0 /* Flags. */ -}; - -static void ma_node_graph_endpoint_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - MA_ASSERT(pNode != NULL); - MA_ASSERT(ma_node_get_input_bus_count(pNode) == 1); - MA_ASSERT(ma_node_get_output_bus_count(pNode) == 1); - - /* Input channel count needs to be the same as the output channel count. */ - MA_ASSERT(ma_node_get_input_channels(pNode, 0) == ma_node_get_output_channels(pNode, 0)); - - /* We don't need to do anything here because it's a passthrough. */ - (void)pNode; - (void)ppFramesIn; - (void)pFrameCountIn; - (void)ppFramesOut; - (void)pFrameCountOut; - -#if 0 - /* The data has already been mixed. We just need to move it to the output buffer. */ - if (ppFramesIn != NULL) { - ma_copy_pcm_frames(ppFramesOut[0], ppFramesIn[0], *pFrameCountOut, ma_format_f32, ma_node_get_output_channels(pNode, 0)); - } -#endif -} - -static ma_node_vtable g_node_graph_endpoint_vtable = -{ - ma_node_graph_endpoint_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* 1 input bus. */ - 1, /* 1 output bus. */ - MA_NODE_FLAG_PASSTHROUGH /* Flags. The endpoint is a passthrough. */ -}; - -MA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node_graph* pNodeGraph) -{ - ma_result result; - ma_node_config baseConfig; - ma_node_config endpointConfig; - - if (pNodeGraph == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNodeGraph); - pNodeGraph->nodeCacheCapInFrames = pConfig->nodeCacheCapInFrames; - if (pNodeGraph->nodeCacheCapInFrames == 0) { - pNodeGraph->nodeCacheCapInFrames = MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS; - } - - - /* Base node so we can use the node graph as a node into another graph. */ - baseConfig = ma_node_config_init(); - baseConfig.vtable = &g_node_graph_node_vtable; - baseConfig.pOutputChannels = &pConfig->channels; - - result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pNodeGraph->base); - if (result != MA_SUCCESS) { - return result; - } - - - /* Endpoint. */ - endpointConfig = ma_node_config_init(); - endpointConfig.vtable = &g_node_graph_endpoint_vtable; - endpointConfig.pInputChannels = &pConfig->channels; - endpointConfig.pOutputChannels = &pConfig->channels; - - result = ma_node_init(pNodeGraph, &endpointConfig, pAllocationCallbacks, &pNodeGraph->endpoint); - if (result != MA_SUCCESS) { - ma_node_uninit(&pNodeGraph->base, pAllocationCallbacks); - return result; - } - - return MA_SUCCESS; -} - -MA_API void ma_node_graph_uninit(ma_node_graph* pNodeGraph, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pNodeGraph == NULL) { - return; - } - - ma_node_uninit(&pNodeGraph->endpoint, pAllocationCallbacks); -} - -MA_API ma_node* ma_node_graph_get_endpoint(ma_node_graph* pNodeGraph) -{ - if (pNodeGraph == NULL) { - return NULL; - } - - return &pNodeGraph->endpoint; -} - -MA_API ma_result ma_node_graph_read_pcm_frames(ma_node_graph* pNodeGraph, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - ma_result result = MA_SUCCESS; - ma_uint64 totalFramesRead; - ma_uint32 channels; - - if (pFramesRead != NULL) { - *pFramesRead = 0; /* Safety. */ - } - - if (pNodeGraph == NULL) { - return MA_INVALID_ARGS; - } - - channels = ma_node_get_output_channels(&pNodeGraph->endpoint, 0); - - - /* We'll be nice and try to do a full read of all frameCount frames. */ - totalFramesRead = 0; - while (totalFramesRead < frameCount) { - ma_uint32 framesJustRead; - ma_uint64 framesToRead = frameCount - totalFramesRead; - - if (framesToRead > 0xFFFFFFFF) { - framesToRead = 0xFFFFFFFF; - } - - ma_node_graph_set_is_reading(pNodeGraph, MA_TRUE); - { - result = ma_node_read_pcm_frames(&pNodeGraph->endpoint, 0, (float*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, ma_format_f32, channels), (ma_uint32)framesToRead, &framesJustRead, ma_node_get_time(&pNodeGraph->endpoint)); - } - ma_node_graph_set_is_reading(pNodeGraph, MA_FALSE); - - totalFramesRead += framesJustRead; - - if (result != MA_SUCCESS) { - break; - } - - /* Abort if we weren't able to read any frames or else we risk getting stuck in a loop. */ - if (framesJustRead == 0) { - break; - } - } - - /* Let's go ahead and silence any leftover frames just for some added safety to ensure the caller doesn't try emitting garbage out of the speakers. */ - if (totalFramesRead < frameCount) { - ma_silence_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, ma_format_f32, channels), (frameCount - totalFramesRead), ma_format_f32, channels); - } - - if (pFramesRead != NULL) { - *pFramesRead = totalFramesRead; - } - - return result; -} - -MA_API ma_uint32 ma_node_graph_get_channels(const ma_node_graph* pNodeGraph) -{ - if (pNodeGraph == NULL) { - return 0; - } - - return ma_node_get_output_channels(&pNodeGraph->endpoint, 0); -} - -MA_API ma_uint64 ma_node_graph_get_time(const ma_node_graph* pNodeGraph) -{ - if (pNodeGraph == NULL) { - return 0; - } - - return ma_node_get_time(&pNodeGraph->endpoint); /* Global time is just the local time of the endpoint. */ -} - -MA_API ma_result ma_node_graph_set_time(ma_node_graph* pNodeGraph, ma_uint64 globalTime) -{ - if (pNodeGraph == NULL) { - return MA_INVALID_ARGS; - } - - return ma_node_set_time(&pNodeGraph->endpoint, globalTime); /* Global time is just the local time of the endpoint. */ -} - - -#define MA_NODE_OUTPUT_BUS_FLAG_HAS_READ 0x01 /* Whether or not this bus ready to read more data. Only used on nodes with multiple output buses. */ - -static ma_result ma_node_output_bus_init(ma_node* pNode, ma_uint32 outputBusIndex, ma_uint32 channels, ma_node_output_bus* pOutputBus) -{ - MA_ASSERT(pOutputBus != NULL); - MA_ASSERT(outputBusIndex < MA_MAX_NODE_BUS_COUNT); - MA_ASSERT(outputBusIndex < ma_node_get_output_bus_count(pNode)); - MA_ASSERT(channels < 256); - - MA_ZERO_OBJECT(pOutputBus); - - if (channels == 0) { - return MA_INVALID_ARGS; - } - - pOutputBus->pNode = pNode; - pOutputBus->outputBusIndex = (ma_uint8)outputBusIndex; - pOutputBus->channels = (ma_uint8)channels; - pOutputBus->flags = MA_NODE_OUTPUT_BUS_FLAG_HAS_READ; /* <-- Important that this flag is set by default. */ - pOutputBus->volume = 1; - - return MA_SUCCESS; -} - -static void ma_node_output_bus_lock(ma_node_output_bus* pOutputBus) -{ - ma_spinlock_lock(&pOutputBus->lock); -} - -static void ma_node_output_bus_unlock(ma_node_output_bus* pOutputBus) -{ - ma_spinlock_unlock(&pOutputBus->lock); -} - - -static ma_uint32 ma_node_output_bus_get_channels(const ma_node_output_bus* pOutputBus) -{ - return pOutputBus->channels; -} - - -static void ma_node_output_bus_set_has_read(ma_node_output_bus* pOutputBus, ma_bool32 hasRead) -{ - if (hasRead) { - c89atomic_fetch_or_32(&pOutputBus->flags, MA_NODE_OUTPUT_BUS_FLAG_HAS_READ); - } else { - c89atomic_fetch_and_32(&pOutputBus->flags, (ma_uint32)~MA_NODE_OUTPUT_BUS_FLAG_HAS_READ); - } -} - -static ma_bool32 ma_node_output_bus_has_read(ma_node_output_bus* pOutputBus) -{ - return (c89atomic_load_32(&pOutputBus->flags) & MA_NODE_OUTPUT_BUS_FLAG_HAS_READ) != 0; -} - - -static void ma_node_output_bus_set_is_attached(ma_node_output_bus* pOutputBus, ma_bool32 isAttached) -{ - c89atomic_exchange_32(&pOutputBus->isAttached, isAttached); -} - -static ma_bool32 ma_node_output_bus_is_attached(ma_node_output_bus* pOutputBus) -{ - return c89atomic_load_32(&pOutputBus->isAttached); -} - - -static ma_result ma_node_output_bus_set_volume(ma_node_output_bus* pOutputBus, float volume) -{ - MA_ASSERT(pOutputBus != NULL); - - if (volume < 0.0f) { - volume = 0.0f; - } - - c89atomic_exchange_f32(&pOutputBus->volume, volume); - - return MA_SUCCESS; -} - -static float ma_node_output_bus_get_volume(const ma_node_output_bus* pOutputBus) -{ - return c89atomic_load_f32((float*)&pOutputBus->volume); -} - - -static ma_result ma_node_input_bus_init(ma_uint32 channels, ma_node_input_bus* pInputBus) -{ - MA_ASSERT(pInputBus != NULL); - MA_ASSERT(channels < 256); - - MA_ZERO_OBJECT(pInputBus); - - if (channels == 0) { - return MA_INVALID_ARGS; - } - - pInputBus->channels = (ma_uint8)channels; - - return MA_SUCCESS; -} - -static void ma_node_input_bus_lock(ma_node_input_bus* pInputBus) -{ - ma_spinlock_lock(&pInputBus->lock); -} - -static void ma_node_input_bus_unlock(ma_node_input_bus* pInputBus) -{ - ma_spinlock_unlock(&pInputBus->lock); -} - - -static void ma_node_input_bus_next_begin(ma_node_input_bus* pInputBus) -{ - c89atomic_fetch_add_32(&pInputBus->nextCounter, 1); -} - -static void ma_node_input_bus_next_end(ma_node_input_bus* pInputBus) -{ - c89atomic_fetch_sub_32(&pInputBus->nextCounter, 1); -} - -static ma_uint32 ma_node_input_bus_get_next_counter(ma_node_input_bus* pInputBus) -{ - return c89atomic_load_32(&pInputBus->nextCounter); -} - - -static ma_uint32 ma_node_input_bus_get_channels(const ma_node_input_bus* pInputBus) -{ - return pInputBus->channels; -} - - -static void ma_node_input_bus_detach__no_output_bus_lock(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus) -{ - MA_ASSERT(pInputBus != NULL); - MA_ASSERT(pOutputBus != NULL); - - /* - Mark the output bus as detached first. This will prevent future iterations on the audio thread - from iterating this output bus. - */ - ma_node_output_bus_set_is_attached(pOutputBus, MA_FALSE); - - /* - We cannot use the output bus lock here since it'll be getting used at a higher level, but we do - still need to use the input bus lock since we'll be updating pointers on two different output - buses. The same rules apply here as the attaching case. Although we're using a lock here, we're - *not* using a lock when iterating over the list in the audio thread. We therefore need to craft - this in a way such that the iteration on the audio thread doesn't break. - - The the first thing to do is swap out the "next" pointer of the previous output bus with the - new "next" output bus. This is the operation that matters for iteration on the audio thread. - After that, the previous pointer on the new "next" pointer needs to be updated, after which - point the linked list will be in a good state. - */ - ma_node_input_bus_lock(pInputBus); - { - ma_node_output_bus* pOldPrev = (ma_node_output_bus*)c89atomic_load_ptr(&pOutputBus->pPrev); - ma_node_output_bus* pOldNext = (ma_node_output_bus*)c89atomic_load_ptr(&pOutputBus->pNext); - - if (pOldPrev != NULL) { - c89atomic_exchange_ptr(&pOldPrev->pNext, pOldNext); /* <-- This is where the output bus is detached from the list. */ - } - if (pOldNext != NULL) { - c89atomic_exchange_ptr(&pOldNext->pPrev, pOldPrev); /* <-- This is required for detachment. */ - } - } - ma_node_input_bus_unlock(pInputBus); - - /* At this point the output bus is detached and the linked list is completely unaware of it. Reset some data for safety. */ - c89atomic_exchange_ptr(&pOutputBus->pNext, NULL); /* Using atomic exchanges here, mainly for the benefit of analysis tools which don't always recognize spinlocks. */ - c89atomic_exchange_ptr(&pOutputBus->pPrev, NULL); /* As above. */ - pOutputBus->pInputNode = NULL; - pOutputBus->inputNodeInputBusIndex = 0; - - - /* - For thread-safety reasons, we don't want to be returning from this straight away. We need to - wait for the audio thread to finish with the output bus. There's two things we need to wait - for. The first is the part that selects the next output bus in the list, and the other is the - part that reads from the output bus. Basically all we're doing is waiting for the input bus - to stop referencing the output bus. - - We're doing this part last because we want the section above to run while the audio thread - is finishing up with the output bus, just for efficiency reasons. We marked the output bus as - detached right at the top of this function which is going to prevent the audio thread from - iterating the output bus again. - */ - - /* Part 1: Wait for the current iteration to complete. */ - while (ma_node_input_bus_get_next_counter(pInputBus) > 0) { - ma_yield(); - } - - /* Part 2: Wait for any reads to complete. */ - while (c89atomic_load_32(&pOutputBus->refCount) > 0) { - ma_yield(); - } - - /* - At this point we're done detaching and we can be guaranteed that the audio thread is not going - to attempt to reference this output bus again (until attached again). - */ -} - -#if 0 /* Not used at the moment, but leaving here in case I need it later. */ -static void ma_node_input_bus_detach(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus) -{ - MA_ASSERT(pInputBus != NULL); - MA_ASSERT(pOutputBus != NULL); - - ma_node_output_bus_lock(pOutputBus); - { - ma_node_input_bus_detach__no_output_bus_lock(pInputBus, pOutputBus); - } - ma_node_output_bus_unlock(pOutputBus); -} -#endif - -static void ma_node_input_bus_attach(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus, ma_node* pNewInputNode, ma_uint32 inputNodeInputBusIndex) -{ - MA_ASSERT(pInputBus != NULL); - MA_ASSERT(pOutputBus != NULL); - - ma_node_output_bus_lock(pOutputBus); - { - ma_node_output_bus* pOldInputNode = (ma_node_output_bus*)c89atomic_load_ptr(&pOutputBus->pInputNode); - - /* Detach from any existing attachment first if necessary. */ - if (pOldInputNode != NULL) { - ma_node_input_bus_detach__no_output_bus_lock(pInputBus, pOutputBus); - } - - /* - At this point we can be sure the output bus is not attached to anything. The linked list in the - old input bus has been updated so that pOutputBus will not get iterated again. - */ - pOutputBus->pInputNode = pNewInputNode; /* No need for an atomic assignment here because modification of this variable always happens within a lock. */ - pOutputBus->inputNodeInputBusIndex = (ma_uint8)inputNodeInputBusIndex; /* As above. */ - - /* - Now we need to attach the output bus to the linked list. This involves updating two pointers on - two different output buses so I'm going to go ahead and keep this simple and just use a lock. - There are ways to do this without a lock, but it's just too hard to maintain for it's value. - - Although we're locking here, it's important to remember that we're *not* locking when iterating - and reading audio data since that'll be running on the audio thread. As a result we need to be - careful how we craft this so that we don't break iteration. What we're going to do is always - attach the new item so that it becomes the first item in the list. That way, as we're iterating - we won't break any links in the list and iteration will continue safely. The detaching case will - also be crafted in a way as to not break list iteration. It's important to remember to use - atomic exchanges here since no locking is happening on the audio thread during iteration. - */ - ma_node_input_bus_lock(pInputBus); - { - ma_node_output_bus* pNewPrev = &pInputBus->head; - ma_node_output_bus* pNewNext = (ma_node_output_bus*)c89atomic_load_ptr(&pInputBus->head.pNext); - - /* Update the local output bus. */ - c89atomic_exchange_ptr(&pOutputBus->pPrev, pNewPrev); - c89atomic_exchange_ptr(&pOutputBus->pNext, pNewNext); - - /* Update the other output buses to point back to the local output bus. */ - c89atomic_exchange_ptr(&pInputBus->head.pNext, pOutputBus); /* <-- This is where the output bus is actually attached to the input bus. */ - - /* Do the previous pointer last. This is only used for detachment. */ - if (pNewNext != NULL) { - c89atomic_exchange_ptr(&pNewNext->pPrev, pOutputBus); - } - } - ma_node_input_bus_unlock(pInputBus); - - /* - Mark the node as attached last. This is used to controlling whether or the output bus will be - iterated on the audio thread. Mainly required for detachment purposes. - */ - ma_node_output_bus_set_is_attached(pOutputBus, MA_TRUE); - } - ma_node_output_bus_unlock(pOutputBus); -} - -static ma_node_output_bus* ma_node_input_bus_next(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus) -{ - ma_node_output_bus* pNext; - - MA_ASSERT(pInputBus != NULL); - - if (pOutputBus == NULL) { - return NULL; - } - - ma_node_input_bus_next_begin(pInputBus); - { - pNext = pOutputBus; - for (;;) { - pNext = (ma_node_output_bus*)c89atomic_load_ptr(&pNext->pNext); - if (pNext == NULL) { - break; /* Reached the end. */ - } - - if (ma_node_output_bus_is_attached(pNext) == MA_FALSE) { - continue; /* The node is not attached. Keep checking. */ - } - - /* The next node has been selected. */ - break; - } - - /* We need to increment the reference count of the selected node. */ - if (pNext != NULL) { - c89atomic_fetch_add_32(&pNext->refCount, 1); - } - - /* The previous node is no longer being referenced. */ - c89atomic_fetch_sub_32(&pOutputBus->refCount, 1); - } - ma_node_input_bus_next_end(pInputBus); - - return pNext; -} - -static ma_node_output_bus* ma_node_input_bus_first(ma_node_input_bus* pInputBus) -{ - return ma_node_input_bus_next(pInputBus, &pInputBus->head); -} - - - -static ma_result ma_node_input_bus_read_pcm_frames(ma_node* pInputNode, ma_node_input_bus* pInputBus, float* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead, ma_uint64 globalTime) -{ - ma_result result = MA_SUCCESS; - ma_node_output_bus* pOutputBus; - ma_node_output_bus* pFirst; - ma_uint32 inputChannels; - ma_bool32 doesOutputBufferHaveContent = MA_FALSE; - - /* - This will be called from the audio thread which means we can't be doing any locking. Basically, - this function will not perfom any locking, whereas attaching and detaching will, but crafted in - such a way that we don't need to perform any locking here. The important thing to remember is - to always iterate in a forward direction. - - In order to process any data we need to first read from all input buses. That's where this - function comes in. This iterates over each of the attachments and accumulates/mixes them. We - also convert the channels to the nodes output channel count before mixing. We want to do this - channel conversion so that the caller of this function can invoke the processing callback - without having to do it themselves. - - When we iterate over each of the attachments on the input bus, we need to read as much data as - we can from each of them so that we don't end up with holes between each of the attachments. To - do this, we need to read from each attachment in a loop and read as many frames as we can, up - to `frameCount`. - */ - MA_ASSERT(pInputNode != NULL); - MA_ASSERT(pFramesRead != NULL); /* pFramesRead is critical and must always be specified. On input it's undefined and on output it'll be set to the number of frames actually read. */ - - *pFramesRead = 0; /* Safety. */ - - inputChannels = ma_node_input_bus_get_channels(pInputBus); - - /* - We need to be careful with how we call ma_node_input_bus_first() and ma_node_input_bus_next(). They - are both critical to our lock-free thread-safety system. We can only call ma_node_input_bus_first() - once per iteration, however we have an optimization to checks whether or not it's the first item in - the list. We therefore need to store a pointer to the first item rather than repeatedly calling - ma_node_input_bus_first(). It's safe to keep hold of this pointer, so long as we don't dereference it - after calling ma_node_input_bus_next(), which we won't be. - */ - pFirst = ma_node_input_bus_first(pInputBus); - if (pFirst == NULL) { - return MA_SUCCESS; /* No attachments. Read nothing. */ - } - - for (pOutputBus = pFirst; pOutputBus != NULL; pOutputBus = ma_node_input_bus_next(pInputBus, pOutputBus)) { - ma_uint32 framesProcessed = 0; - ma_bool32 isSilentOutput = MA_FALSE; - - MA_ASSERT(pOutputBus->pNode != NULL); - - isSilentOutput = (((ma_node_base*)pOutputBus->pNode)->vtable->flags & MA_NODE_FLAG_SILENT_OUTPUT) != 0; - - if (pFramesOut != NULL) { - /* Read. */ - float temp[MA_DATA_CONVERTER_STACK_BUFFER_SIZE / sizeof(float)]; - ma_uint32 tempCapInFrames = ma_countof(temp) / inputChannels; - - while (framesProcessed < frameCount) { - float* pRunningFramesOut; - ma_uint32 framesToRead; - ma_uint32 framesJustRead; - - framesToRead = frameCount - framesProcessed; - if (framesToRead > tempCapInFrames) { - framesToRead = tempCapInFrames; - } - - pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(pFramesOut, framesProcessed, inputChannels); - - if (doesOutputBufferHaveContent == MA_FALSE) { - /* Fast path. First attachment. We just read straight into the output buffer (no mixing required). */ - result = ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, pRunningFramesOut, framesToRead, &framesJustRead, globalTime + framesProcessed); - } else { - /* Slow path. Not the first attachment. Mixing required. */ - result = ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, temp, framesToRead, &framesJustRead, globalTime + framesProcessed); - if (result == MA_SUCCESS || result == MA_AT_END) { - if (isSilentOutput == MA_FALSE) { /* Don't mix if the node outputs silence. */ - ma_mix_pcm_frames_f32(pRunningFramesOut, temp, framesJustRead, inputChannels, /*volume*/1); - } - } - } - - framesProcessed += framesJustRead; - - /* If we reached the end or otherwise failed to read any data we need to finish up with this output node. */ - if (result != MA_SUCCESS) { - break; - } - - /* If we didn't read anything, abort so we don't get stuck in a loop. */ - if (framesJustRead == 0) { - break; - } - } - - /* If it's the first attachment we didn't do any mixing. Any leftover samples need to be silenced. */ - if (pOutputBus == pFirst && framesProcessed < frameCount) { - ma_silence_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, framesProcessed, ma_format_f32, inputChannels), (frameCount - framesProcessed), ma_format_f32, inputChannels); - } - - if (isSilentOutput == MA_FALSE) { - doesOutputBufferHaveContent = MA_TRUE; - } - } else { - /* Seek. */ - ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, NULL, frameCount, &framesProcessed, globalTime); - } - } - - /* If we didn't output anything, output silence. */ - if (doesOutputBufferHaveContent == MA_FALSE && pFramesOut != NULL) { - ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, inputChannels); - } - - /* In this path we always "process" the entire amount. */ - *pFramesRead = frameCount; - - return result; -} - - -MA_API ma_node_config ma_node_config_init(void) -{ - ma_node_config config; - - MA_ZERO_OBJECT(&config); - config.initialState = ma_node_state_started; /* Nodes are started by default. */ - config.inputBusCount = MA_NODE_BUS_COUNT_UNKNOWN; - config.outputBusCount = MA_NODE_BUS_COUNT_UNKNOWN; - - return config; -} - - - -static ma_result ma_node_detach_full(ma_node* pNode); - -static float* ma_node_get_cached_input_ptr(ma_node* pNode, ma_uint32 inputBusIndex) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_uint32 iInputBus; - float* pBasePtr; - - MA_ASSERT(pNodeBase != NULL); - - /* Input data is stored at the front of the buffer. */ - pBasePtr = pNodeBase->pCachedData; - for (iInputBus = 0; iInputBus < inputBusIndex; iInputBus += 1) { - pBasePtr += pNodeBase->cachedDataCapInFramesPerBus * ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iInputBus]); - } - - return pBasePtr; -} - -static float* ma_node_get_cached_output_ptr(ma_node* pNode, ma_uint32 outputBusIndex) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_uint32 iInputBus; - ma_uint32 iOutputBus; - float* pBasePtr; - - MA_ASSERT(pNodeBase != NULL); - - /* Cached output data starts after the input data. */ - pBasePtr = pNodeBase->pCachedData; - for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNodeBase); iInputBus += 1) { - pBasePtr += pNodeBase->cachedDataCapInFramesPerBus * ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iInputBus]); - } - - for (iOutputBus = 0; iOutputBus < outputBusIndex; iOutputBus += 1) { - pBasePtr += pNodeBase->cachedDataCapInFramesPerBus * ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[iOutputBus]); - } - - return pBasePtr; -} - - -typedef struct -{ - size_t sizeInBytes; - size_t inputBusOffset; - size_t outputBusOffset; - size_t cachedDataOffset; - ma_uint32 inputBusCount; /* So it doesn't have to be calculated twice. */ - ma_uint32 outputBusCount; /* So it doesn't have to be calculated twice. */ -} ma_node_heap_layout; - -static ma_result ma_node_translate_bus_counts(const ma_node_config* pConfig, ma_uint32* pInputBusCount, ma_uint32* pOutputBusCount) -{ - ma_uint32 inputBusCount; - ma_uint32 outputBusCount; - - MA_ASSERT(pConfig != NULL); - MA_ASSERT(pInputBusCount != NULL); - MA_ASSERT(pOutputBusCount != NULL); - - /* Bus counts are determined by the vtable, unless they're set to `MA_NODE_BUS_COUNT_UNKNWON`, in which case they're taken from the config. */ - if (pConfig->vtable->inputBusCount == MA_NODE_BUS_COUNT_UNKNOWN) { - inputBusCount = pConfig->inputBusCount; - } else { - inputBusCount = pConfig->vtable->inputBusCount; - - if (pConfig->inputBusCount != MA_NODE_BUS_COUNT_UNKNOWN && pConfig->inputBusCount != pConfig->vtable->inputBusCount) { - return MA_INVALID_ARGS; /* Invalid configuration. You must not specify a conflicting bus count between the node's config and the vtable. */ - } - } - - if (pConfig->vtable->outputBusCount == MA_NODE_BUS_COUNT_UNKNOWN) { - outputBusCount = pConfig->outputBusCount; - } else { - outputBusCount = pConfig->vtable->outputBusCount; - - if (pConfig->outputBusCount != MA_NODE_BUS_COUNT_UNKNOWN && pConfig->outputBusCount != pConfig->vtable->outputBusCount) { - return MA_INVALID_ARGS; /* Invalid configuration. You must not specify a conflicting bus count between the node's config and the vtable. */ - } - } - - /* Bus counts must be within limits. */ - if (inputBusCount > MA_MAX_NODE_BUS_COUNT || outputBusCount > MA_MAX_NODE_BUS_COUNT) { - return MA_INVALID_ARGS; - } - - - /* We must have channel counts for each bus. */ - if ((inputBusCount > 0 && pConfig->pInputChannels == NULL) || (outputBusCount > 0 && pConfig->pOutputChannels == NULL)) { - return MA_INVALID_ARGS; /* You must specify channel counts for each input and output bus. */ - } - - - /* Some special rules for passthrough nodes. */ - if ((pConfig->vtable->flags & MA_NODE_FLAG_PASSTHROUGH) != 0) { - if (pConfig->vtable->inputBusCount != 1 || pConfig->vtable->outputBusCount != 1) { - return MA_INVALID_ARGS; /* Passthrough nodes must have exactly 1 input bus and 1 output bus. */ - } - - if (pConfig->pInputChannels[0] != pConfig->pOutputChannels[0]) { - return MA_INVALID_ARGS; /* Passthrough nodes must have the same number of channels between input and output nodes. */ - } - } - - - *pInputBusCount = inputBusCount; - *pOutputBusCount = outputBusCount; - - return MA_SUCCESS; -} - -static ma_result ma_node_get_heap_layout(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, ma_node_heap_layout* pHeapLayout) -{ - ma_result result; - ma_uint32 inputBusCount; - ma_uint32 outputBusCount; - - MA_ASSERT(pHeapLayout != NULL); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL || pConfig->vtable == NULL || pConfig->vtable->onProcess == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_node_translate_bus_counts(pConfig, &inputBusCount, &outputBusCount); - if (result != MA_SUCCESS) { - return result; - } - - pHeapLayout->sizeInBytes = 0; - - /* Input buses. */ - if (inputBusCount > MA_MAX_NODE_LOCAL_BUS_COUNT) { - pHeapLayout->inputBusOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(sizeof(ma_node_input_bus) * inputBusCount); - } else { - pHeapLayout->inputBusOffset = MA_SIZE_MAX; /* MA_SIZE_MAX indicates that no heap allocation is required for the input bus. */ - } - - /* Output buses. */ - if (outputBusCount > MA_MAX_NODE_LOCAL_BUS_COUNT) { - pHeapLayout->outputBusOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(sizeof(ma_node_output_bus) * outputBusCount); - } else { - pHeapLayout->outputBusOffset = MA_SIZE_MAX; - } - - /* - Cached audio data. - - We need to allocate memory for a caching both input and output data. We have an optimization - where no caching is necessary for specific conditions: - - - The node has 0 inputs and 1 output. - - When a node meets the above conditions, no cache is allocated. - - The size choice for this buffer is a little bit finicky. We don't want to be too wasteful by - allocating too much, but at the same time we want it be large enough so that enough frames can - be processed for each call to ma_node_read_pcm_frames() so that it keeps things efficient. For - now I'm going with 10ms @ 48K which is 480 frames per bus. This is configurable at compile - time. It might also be worth investigating whether or not this can be configured at run time. - */ - if (inputBusCount == 0 && outputBusCount == 1) { - /* Fast path. No cache needed. */ - pHeapLayout->cachedDataOffset = MA_SIZE_MAX; - } else { - /* Slow path. Cache needed. */ - size_t cachedDataSizeInBytes = 0; - ma_uint32 iBus; - - for (iBus = 0; iBus < inputBusCount; iBus += 1) { - cachedDataSizeInBytes += pNodeGraph->nodeCacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pInputChannels[iBus]); - } - - for (iBus = 0; iBus < outputBusCount; iBus += 1) { - cachedDataSizeInBytes += pNodeGraph->nodeCacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pOutputChannels[iBus]); - } - - pHeapLayout->cachedDataOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(cachedDataSizeInBytes); - } - - - /* - Not technically part of the heap, but we can output the input and output bus counts so we can - avoid a redundant call to ma_node_translate_bus_counts(). - */ - pHeapLayout->inputBusCount = inputBusCount; - pHeapLayout->outputBusCount = outputBusCount; - - /* Make sure allocation size is aligned. */ - pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes); - - return MA_SUCCESS; -} - -MA_API ma_result ma_node_get_heap_size(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_node_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_node_get_heap_layout(pNodeGraph, pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_node_init_preallocated(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, void* pHeap, ma_node* pNode) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_result result; - ma_node_heap_layout heapLayout; - ma_uint32 iInputBus; - ma_uint32 iOutputBus; - - if (pNodeBase == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNodeBase); - - result = ma_node_get_heap_layout(pNodeGraph, pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - pNodeBase->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pNodeBase->pNodeGraph = pNodeGraph; - pNodeBase->vtable = pConfig->vtable; - pNodeBase->state = pConfig->initialState; - pNodeBase->stateTimes[ma_node_state_started] = 0; - pNodeBase->stateTimes[ma_node_state_stopped] = (ma_uint64)(ma_int64)-1; /* Weird casting for VC6 compatibility. */ - pNodeBase->inputBusCount = heapLayout.inputBusCount; - pNodeBase->outputBusCount = heapLayout.outputBusCount; - - if (heapLayout.inputBusOffset != MA_SIZE_MAX) { - pNodeBase->pInputBuses = (ma_node_input_bus*)ma_offset_ptr(pHeap, heapLayout.inputBusOffset); - } else { - pNodeBase->pInputBuses = pNodeBase->_inputBuses; - } - - if (heapLayout.outputBusOffset != MA_SIZE_MAX) { - pNodeBase->pOutputBuses = (ma_node_output_bus*)ma_offset_ptr(pHeap, heapLayout.inputBusOffset); - } else { - pNodeBase->pOutputBuses = pNodeBase->_outputBuses; - } - - if (heapLayout.cachedDataOffset != MA_SIZE_MAX) { - pNodeBase->pCachedData = (float*)ma_offset_ptr(pHeap, heapLayout.cachedDataOffset); - pNodeBase->cachedDataCapInFramesPerBus = pNodeGraph->nodeCacheCapInFrames; - } else { - pNodeBase->pCachedData = NULL; - } - - - - /* We need to run an initialization step for each input and output bus. */ - for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNodeBase); iInputBus += 1) { - result = ma_node_input_bus_init(pConfig->pInputChannels[iInputBus], &pNodeBase->pInputBuses[iInputBus]); - if (result != MA_SUCCESS) { - return result; - } - } - - for (iOutputBus = 0; iOutputBus < ma_node_get_output_bus_count(pNodeBase); iOutputBus += 1) { - result = ma_node_output_bus_init(pNodeBase, iOutputBus, pConfig->pOutputChannels[iOutputBus], &pNodeBase->pOutputBuses[iOutputBus]); - if (result != MA_SUCCESS) { - return result; - } - } - - - /* The cached data needs to be initialized to silence (or a sine wave tone if we're debugging). */ - if (pNodeBase->pCachedData != NULL) { - ma_uint32 iBus; - - #if 1 /* Toggle this between 0 and 1 to turn debugging on or off. 1 = fill with a sine wave for debugging; 0 = fill with silence. */ - /* For safety we'll go ahead and default the buffer to silence. */ - for (iBus = 0; iBus < ma_node_get_input_bus_count(pNodeBase); iBus += 1) { - ma_silence_pcm_frames(ma_node_get_cached_input_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iBus])); - } - for (iBus = 0; iBus < ma_node_get_output_bus_count(pNodeBase); iBus += 1) { - ma_silence_pcm_frames(ma_node_get_cached_output_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[iBus])); - } - #else - /* For debugging. Default to a sine wave. */ - for (iBus = 0; iBus < ma_node_get_input_bus_count(pNodeBase); iBus += 1) { - ma_debug_fill_pcm_frames_with_sine_wave(ma_node_get_cached_input_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iBus]), 48000); - } - for (iBus = 0; iBus < ma_node_get_output_bus_count(pNodeBase); iBus += 1) { - ma_debug_fill_pcm_frames_with_sine_wave(ma_node_get_cached_output_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[iBus]), 48000); - } - #endif - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_node_init(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node* pNode) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_node_get_heap_size(pNodeGraph, pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_node_init_preallocated(pNodeGraph, pConfig, pHeap, pNode); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - ((ma_node_base*)pNode)->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_node_uninit(ma_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - - if (pNodeBase == NULL) { - return; - } - - /* - The first thing we need to do is fully detach the node. This will detach all inputs and - outputs. We need to do this first because it will sever the connection with the node graph and - allow us to complete uninitialization without needing to worry about thread-safety with the - audio thread. The detachment process will wait for any local processing of the node to finish. - */ - ma_node_detach_full(pNode); - - /* - At this point the node should be completely unreferenced by the node graph and we can finish up - the uninitialization process without needing to worry about thread-safety. - */ - if (pNodeBase->_ownsHeap) { - ma_free(pNodeBase->_pHeap, pAllocationCallbacks); - } -} - -MA_API ma_node_graph* ma_node_get_node_graph(const ma_node* pNode) -{ - if (pNode == NULL) { - return NULL; - } - - return ((const ma_node_base*)pNode)->pNodeGraph; -} - -MA_API ma_uint32 ma_node_get_input_bus_count(const ma_node* pNode) -{ - if (pNode == NULL) { - return 0; - } - - return ((ma_node_base*)pNode)->inputBusCount; -} - -MA_API ma_uint32 ma_node_get_output_bus_count(const ma_node* pNode) -{ - if (pNode == NULL) { - return 0; - } - - return ((ma_node_base*)pNode)->outputBusCount; -} - - -MA_API ma_uint32 ma_node_get_input_channels(const ma_node* pNode, ma_uint32 inputBusIndex) -{ - const ma_node_base* pNodeBase = (const ma_node_base*)pNode; - - if (pNode == NULL) { - return 0; - } - - if (inputBusIndex >= ma_node_get_input_bus_count(pNode)) { - return 0; /* Invalid bus index. */ - } - - return ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[inputBusIndex]); -} - -MA_API ma_uint32 ma_node_get_output_channels(const ma_node* pNode, ma_uint32 outputBusIndex) -{ - const ma_node_base* pNodeBase = (const ma_node_base*)pNode; - - if (pNode == NULL) { - return 0; - } - - if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) { - return 0; /* Invalid bus index. */ - } - - return ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[outputBusIndex]); -} - - -static ma_result ma_node_detach_full(ma_node* pNode) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_uint32 iInputBus; - - if (pNodeBase == NULL) { - return MA_INVALID_ARGS; - } - - /* - Make sure the node is completely detached first. This will not return until the output bus is - guaranteed to no longer be referenced by the audio thread. - */ - ma_node_detach_all_output_buses(pNode); - - /* - At this point all output buses will have been detached from the graph and we can be guaranteed - that none of it's input nodes will be getting processed by the graph. We can detach these - without needing to worry about the audio thread touching them. - */ - for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNode); iInputBus += 1) { - ma_node_input_bus* pInputBus; - ma_node_output_bus* pOutputBus; - - pInputBus = &pNodeBase->pInputBuses[iInputBus]; - - /* - This is important. We cannot be using ma_node_input_bus_first() or ma_node_input_bus_next(). Those - functions are specifically for the audio thread. We'll instead just manually iterate using standard - linked list logic. We don't need to worry about the audio thread referencing these because the step - above severed the connection to the graph. - */ - for (pOutputBus = (ma_node_output_bus*)c89atomic_load_ptr(&pInputBus->head.pNext); pOutputBus != NULL; pOutputBus = (ma_node_output_bus*)c89atomic_load_ptr(&pOutputBus->pNext)) { - ma_node_detach_output_bus(pOutputBus->pNode, pOutputBus->outputBusIndex); /* This won't do any waiting in practice and should be efficient. */ - } - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_node_detach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex) -{ - ma_result result = MA_SUCCESS; - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_node_base* pInputNodeBase; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) { - return MA_INVALID_ARGS; /* Invalid output bus index. */ - } - - /* We need to lock the output bus because we need to inspect the input node and grab it's input bus. */ - ma_node_output_bus_lock(&pNodeBase->pOutputBuses[outputBusIndex]); - { - pInputNodeBase = (ma_node_base*)pNodeBase->pOutputBuses[outputBusIndex].pInputNode; - if (pInputNodeBase != NULL) { - ma_node_input_bus_detach__no_output_bus_lock(&pInputNodeBase->pInputBuses[pNodeBase->pOutputBuses[outputBusIndex].inputNodeInputBusIndex], &pNodeBase->pOutputBuses[outputBusIndex]); - } - } - ma_node_output_bus_unlock(&pNodeBase->pOutputBuses[outputBusIndex]); - - return result; -} - -MA_API ma_result ma_node_detach_all_output_buses(ma_node* pNode) -{ - ma_uint32 iOutputBus; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - for (iOutputBus = 0; iOutputBus < ma_node_get_output_bus_count(pNode); iOutputBus += 1) { - ma_node_detach_output_bus(pNode, iOutputBus); - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_node_attach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex, ma_node* pOtherNode, ma_uint32 otherNodeInputBusIndex) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_node_base* pOtherNodeBase = (ma_node_base*)pOtherNode; - - if (pNodeBase == NULL || pOtherNodeBase == NULL) { - return MA_INVALID_ARGS; - } - - if (pNodeBase == pOtherNodeBase) { - return MA_INVALID_OPERATION; /* Cannot attach a node to itself. */ - } - - if (outputBusIndex >= ma_node_get_output_bus_count(pNode) || otherNodeInputBusIndex >= ma_node_get_input_bus_count(pOtherNode)) { - return MA_INVALID_OPERATION; /* Invalid bus index. */ - } - - /* The output channel count of the output node must be the same as the input channel count of the input node. */ - if (ma_node_get_output_channels(pNode, outputBusIndex) != ma_node_get_input_channels(pOtherNode, otherNodeInputBusIndex)) { - return MA_INVALID_OPERATION; /* Channel count is incompatible. */ - } - - /* This will deal with detaching if the output bus is already attached to something. */ - ma_node_input_bus_attach(&pOtherNodeBase->pInputBuses[otherNodeInputBusIndex], &pNodeBase->pOutputBuses[outputBusIndex], pOtherNode, otherNodeInputBusIndex); - - return MA_SUCCESS; -} - -MA_API ma_result ma_node_set_output_bus_volume(ma_node* pNode, ma_uint32 outputBusIndex, float volume) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - - if (pNodeBase == NULL) { - return MA_INVALID_ARGS; - } - - if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) { - return MA_INVALID_ARGS; /* Invalid bus index. */ - } - - return ma_node_output_bus_set_volume(&pNodeBase->pOutputBuses[outputBusIndex], volume); -} - -MA_API float ma_node_get_output_bus_volume(const ma_node* pNode, ma_uint32 outputBusIndex) -{ - const ma_node_base* pNodeBase = (const ma_node_base*)pNode; - - if (pNodeBase == NULL) { - return 0; - } - - if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) { - return 0; /* Invalid bus index. */ - } - - return ma_node_output_bus_get_volume(&pNodeBase->pOutputBuses[outputBusIndex]); -} - -MA_API ma_result ma_node_set_state(ma_node* pNode, ma_node_state state) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - - if (pNodeBase == NULL) { - return MA_INVALID_ARGS; - } - - c89atomic_exchange_i32(&pNodeBase->state, state); - - return MA_SUCCESS; -} - -MA_API ma_node_state ma_node_get_state(const ma_node* pNode) -{ - const ma_node_base* pNodeBase = (const ma_node_base*)pNode; - - if (pNodeBase == NULL) { - return ma_node_state_stopped; - } - - return (ma_node_state)c89atomic_load_i32(&pNodeBase->state); -} - -MA_API ma_result ma_node_set_state_time(ma_node* pNode, ma_node_state state, ma_uint64 globalTime) -{ - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - /* Validation check for safety since we'll be using this as an index into stateTimes[]. */ - if (state != ma_node_state_started && state != ma_node_state_stopped) { - return MA_INVALID_ARGS; - } - - c89atomic_exchange_64(&((ma_node_base*)pNode)->stateTimes[state], globalTime); - - return MA_SUCCESS; -} - -MA_API ma_uint64 ma_node_get_state_time(const ma_node* pNode, ma_node_state state) -{ - if (pNode == NULL) { - return 0; - } - - /* Validation check for safety since we'll be using this as an index into stateTimes[]. */ - if (state != ma_node_state_started && state != ma_node_state_stopped) { - return 0; - } - - return c89atomic_load_64(&((ma_node_base*)pNode)->stateTimes[state]); -} - -MA_API ma_node_state ma_node_get_state_by_time(const ma_node* pNode, ma_uint64 globalTime) -{ - if (pNode == NULL) { - return ma_node_state_stopped; - } - - return ma_node_get_state_by_time_range(pNode, globalTime, globalTime); -} - -MA_API ma_node_state ma_node_get_state_by_time_range(const ma_node* pNode, ma_uint64 globalTimeBeg, ma_uint64 globalTimeEnd) -{ - ma_node_state state; - - if (pNode == NULL) { - return ma_node_state_stopped; - } - - state = ma_node_get_state(pNode); - - /* An explicitly stopped node is always stopped. */ - if (state == ma_node_state_stopped) { - return ma_node_state_stopped; - } - - /* - Getting here means the node is marked as started, but it may still not be truly started due to - it's start time not having been reached yet. Also, the stop time may have also been reached in - which case it'll be considered stopped. - */ - if (ma_node_get_state_time(pNode, ma_node_state_started) > globalTimeBeg) { - return ma_node_state_stopped; /* Start time has not yet been reached. */ - } - - if (ma_node_get_state_time(pNode, ma_node_state_stopped) <= globalTimeEnd) { - return ma_node_state_stopped; /* Stop time has been reached. */ - } - - /* Getting here means the node is marked as started and is within it's start/stop times. */ - return ma_node_state_started; -} - -MA_API ma_uint64 ma_node_get_time(const ma_node* pNode) -{ - if (pNode == NULL) { - return 0; - } - - return c89atomic_load_64(&((ma_node_base*)pNode)->localTime); -} - -MA_API ma_result ma_node_set_time(ma_node* pNode, ma_uint64 localTime) -{ - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - c89atomic_exchange_64(&((ma_node_base*)pNode)->localTime, localTime); - - return MA_SUCCESS; -} - - - -static void ma_node_process_pcm_frames_internal(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - - MA_ASSERT(pNode != NULL); - - if (pNodeBase->vtable->onProcess) { - pNodeBase->vtable->onProcess(pNode, ppFramesIn, pFrameCountIn, ppFramesOut, pFrameCountOut); - } -} - -static ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusIndex, float* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead, ma_uint64 globalTime) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_result result = MA_SUCCESS; - ma_uint32 iInputBus; - ma_uint32 iOutputBus; - ma_uint32 inputBusCount; - ma_uint32 outputBusCount; - ma_uint32 totalFramesRead = 0; - float* ppFramesIn[MA_MAX_NODE_BUS_COUNT]; - float* ppFramesOut[MA_MAX_NODE_BUS_COUNT]; - ma_uint64 globalTimeBeg; - ma_uint64 globalTimeEnd; - ma_uint64 startTime; - ma_uint64 stopTime; - ma_uint32 timeOffsetBeg; - ma_uint32 timeOffsetEnd; - ma_uint32 frameCountIn; - ma_uint32 frameCountOut; - - /* - pFramesRead is mandatory. It must be used to determine how many frames were read. It's normal and - expected that the number of frames read may be different to that requested. Therefore, the caller - must look at this value to correctly determine how many frames were read. - */ - MA_ASSERT(pFramesRead != NULL); /* <-- If you've triggered this assert, you're using this function wrong. You *must* use this variable and inspect it after the call returns. */ - if (pFramesRead == NULL) { - return MA_INVALID_ARGS; - } - - *pFramesRead = 0; /* Safety. */ - - if (pNodeBase == NULL) { - return MA_INVALID_ARGS; - } - - if (outputBusIndex >= ma_node_get_output_bus_count(pNodeBase)) { - return MA_INVALID_ARGS; /* Invalid output bus index. */ - } - - /* Don't do anything if we're in a stopped state. */ - if (ma_node_get_state_by_time_range(pNode, globalTime, globalTime + frameCount) != ma_node_state_started) { - return MA_SUCCESS; /* We're in a stopped state. This is not an error - we just need to not read anything. */ - } - - - globalTimeBeg = globalTime; - globalTimeEnd = globalTime + frameCount; - startTime = ma_node_get_state_time(pNode, ma_node_state_started); - stopTime = ma_node_get_state_time(pNode, ma_node_state_stopped); - - /* - At this point we know that we are inside our start/stop times. However, we may need to adjust - our frame count and output pointer to accomodate since we could be straddling the time period - that this function is getting called for. - - It's possible (and likely) that the start time does not line up with the output buffer. We - therefore need to offset it by a number of frames to accomodate. The same thing applies for - the stop time. - */ - timeOffsetBeg = (globalTimeBeg < startTime) ? (ma_uint32)(globalTimeEnd - startTime) : 0; - timeOffsetEnd = (globalTimeEnd > stopTime) ? (ma_uint32)(globalTimeEnd - stopTime) : 0; - - /* Trim based on the start offset. We need to silence the start of the buffer. */ - if (timeOffsetBeg > 0) { - ma_silence_pcm_frames(pFramesOut, timeOffsetBeg, ma_format_f32, ma_node_get_output_channels(pNode, outputBusIndex)); - pFramesOut += timeOffsetBeg * ma_node_get_output_channels(pNode, outputBusIndex); - frameCount -= timeOffsetBeg; - } - - /* Trim based on the end offset. We don't need to silence the tail section because we'll just have a reduced value written to pFramesRead. */ - if (timeOffsetEnd > 0) { - frameCount -= timeOffsetEnd; - } - - - /* We run on different paths depending on the bus counts. */ - inputBusCount = ma_node_get_input_bus_count(pNode); - outputBusCount = ma_node_get_output_bus_count(pNode); - - /* - Run a simplified path when there are no inputs and one output. In this case there's nothing to - actually read and we can go straight to output. This is a very common scenario because the vast - majority of data source nodes will use this setup so this optimization I think is worthwhile. - */ - if (inputBusCount == 0 && outputBusCount == 1) { - /* Fast path. No need to read from input and no need for any caching. */ - frameCountIn = 0; - frameCountOut = frameCount; /* Just read as much as we can. The callback will return what was actually read. */ - - ppFramesOut[0] = pFramesOut; - ma_node_process_pcm_frames_internal(pNode, NULL, &frameCountIn, ppFramesOut, &frameCountOut); - totalFramesRead = frameCountOut; - } else { - /* Slow path. Need to read input data. */ - if ((pNodeBase->vtable->flags & MA_NODE_FLAG_PASSTHROUGH) != 0) { - /* - Fast path. We're running a passthrough. We need to read directly into the output buffer, but - still fire the callback so that event handling and trigger nodes can do their thing. Since - it's a passthrough there's no need for any kind of caching logic. - */ - MA_ASSERT(outputBusCount == inputBusCount); - MA_ASSERT(outputBusCount == 1); - MA_ASSERT(outputBusIndex == 0); - - /* We just read directly from input bus to output buffer, and then afterwards fire the callback. */ - ppFramesOut[0] = pFramesOut; - ppFramesIn[0] = ppFramesOut[0]; - - result = ma_node_input_bus_read_pcm_frames(pNodeBase, &pNodeBase->pInputBuses[0], ppFramesIn[0], frameCount, &totalFramesRead, globalTime); - if (result == MA_SUCCESS) { - /* Even though it's a passthrough, we still need to fire the callback. */ - frameCountIn = totalFramesRead; - frameCountOut = totalFramesRead; - - if (totalFramesRead > 0) { - ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut); /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Excplicit cast to silence the warning. */ - } - - /* - A passthrough should never have modified the input and output frame counts. If you're - triggering these assers you need to fix your processing callback. - */ - MA_ASSERT(frameCountIn == totalFramesRead); - MA_ASSERT(frameCountOut == totalFramesRead); - } - } else { - /* Slow path. Need to do caching. */ - ma_uint32 framesToProcessIn; - ma_uint32 framesToProcessOut; - ma_bool32 consumeNullInput = MA_FALSE; - - /* - We use frameCount as a basis for the number of frames to read since that's what's being - requested, however we still need to clamp it to whatever can fit in the cache. - - This will also be used as the basis for determining how many input frames to read. This is - not ideal because it can result in too many input frames being read which introduces latency. - To solve this, nodes can implement an optional callback called onGetRequiredInputFrameCount - which is used as hint to miniaudio as to how many input frames it needs to read at a time. This - callback is completely optional, and if it's not set, miniaudio will assume `frameCount`. - - This function will be called multiple times for each period of time, once for each output node. - We cannot read from each input node each time this function is called. Instead we need to check - whether or not this is first output bus to be read from for this time period, and if so, read - from our input data. - - To determine whether or not we're ready to read data, we check a flag. There will be one flag - for each output. When the flag is set, it means data has been read previously and that we're - ready to advance time forward for our input nodes by reading fresh data. - */ - framesToProcessOut = frameCount; - if (framesToProcessOut > pNodeBase->cachedDataCapInFramesPerBus) { - framesToProcessOut = pNodeBase->cachedDataCapInFramesPerBus; - } - - framesToProcessIn = frameCount; - if (pNodeBase->vtable->onGetRequiredInputFrameCount) { - pNodeBase->vtable->onGetRequiredInputFrameCount(pNode, framesToProcessOut, &framesToProcessIn); /* <-- It does not matter if this fails. */ - } - if (framesToProcessIn > pNodeBase->cachedDataCapInFramesPerBus) { - framesToProcessIn = pNodeBase->cachedDataCapInFramesPerBus; - } - - - MA_ASSERT(framesToProcessIn <= 0xFFFF); - MA_ASSERT(framesToProcessOut <= 0xFFFF); - - if (ma_node_output_bus_has_read(&pNodeBase->pOutputBuses[outputBusIndex])) { - /* Getting here means we need to do another round of processing. */ - pNodeBase->cachedFrameCountOut = 0; - - for (;;) { - frameCountOut = 0; - - /* - We need to prepare our output frame pointers for processing. In the same iteration we need - to mark every output bus as unread so that future calls to this function for different buses - for the current time period don't pull in data when they should instead be reading from cache. - */ - for (iOutputBus = 0; iOutputBus < outputBusCount; iOutputBus += 1) { - ma_node_output_bus_set_has_read(&pNodeBase->pOutputBuses[iOutputBus], MA_FALSE); /* <-- This is what tells the next calls to this function for other output buses for this time period to read from cache instead of pulling in more data. */ - ppFramesOut[iOutputBus] = ma_node_get_cached_output_ptr(pNode, iOutputBus); - } - - /* We only need to read from input buses if there isn't already some data in the cache. */ - if (pNodeBase->cachedFrameCountIn == 0) { - ma_uint32 maxFramesReadIn = 0; - - /* Here is where we pull in data from the input buses. This is what will trigger an advance in time. */ - for (iInputBus = 0; iInputBus < inputBusCount; iInputBus += 1) { - ma_uint32 framesRead; - - /* The first thing to do is get the offset within our bulk allocation to store this input data. */ - ppFramesIn[iInputBus] = ma_node_get_cached_input_ptr(pNode, iInputBus); - - /* Once we've determined our destination pointer we can read. Note that we must inspect the number of frames read and fill any leftovers with silence for safety. */ - result = ma_node_input_bus_read_pcm_frames(pNodeBase, &pNodeBase->pInputBuses[iInputBus], ppFramesIn[iInputBus], framesToProcessIn, &framesRead, globalTime); - if (result != MA_SUCCESS) { - /* It doesn't really matter if we fail because we'll just fill with silence. */ - framesRead = 0; /* Just for safety, but I don't think it's really needed. */ - } - - /* TODO: Minor optimization opportunity here. If no frames were read and the buffer is already filled with silence, no need to re-silence it. */ - /* Any leftover frames need to silenced for safety. */ - if (framesRead < framesToProcessIn) { - ma_silence_pcm_frames(ppFramesIn[iInputBus] + (framesRead * ma_node_get_input_channels(pNodeBase, iInputBus)), (framesToProcessIn - framesRead), ma_format_f32, ma_node_get_input_channels(pNodeBase, iInputBus)); - } - - maxFramesReadIn = ma_max(maxFramesReadIn, framesRead); - } - - /* This was a fresh load of input data so reset our consumption counter. */ - pNodeBase->consumedFrameCountIn = 0; - - /* - We don't want to keep processing if there's nothing to process, so set the number of cached - input frames to the maximum number we read from each attachment (the lesser will be padded - with silence). If we didn't read anything, this will be set to 0 and the entire buffer will - have been assigned to silence. This being equal to 0 is an important property for us because - it allows us to detect when NULL can be passed into the processing callback for the input - buffer for the purpose of continuous processing. - */ - pNodeBase->cachedFrameCountIn = (ma_uint16)maxFramesReadIn; - } else { - /* We don't need to read anything, but we do need to prepare our input frame pointers. */ - for (iInputBus = 0; iInputBus < inputBusCount; iInputBus += 1) { - ppFramesIn[iInputBus] = ma_node_get_cached_input_ptr(pNode, iInputBus) + (pNodeBase->consumedFrameCountIn * ma_node_get_input_channels(pNodeBase, iInputBus)); - } - } - - /* - At this point we have our input data so now we need to do some processing. Sneaky little - optimization here - we can set the pointer to the output buffer for this output bus so - that the final copy into the output buffer is done directly by onProcess(). - */ - if (pFramesOut != NULL) { - ppFramesOut[outputBusIndex] = ma_offset_pcm_frames_ptr_f32(pFramesOut, pNodeBase->cachedFrameCountOut, ma_node_get_output_channels(pNode, outputBusIndex)); - } - - - /* Give the processing function the entire capacity of the output buffer. */ - frameCountOut = (framesToProcessOut - pNodeBase->cachedFrameCountOut); - - /* - We need to treat nodes with continuous processing a little differently. For these ones, - we always want to fire the callback with the requested number of frames, regardless of - pNodeBase->cachedFrameCountIn, which could be 0. Also, we want to check if we can pass - in NULL for the input buffer to the callback. - */ - if ((pNodeBase->vtable->flags & MA_NODE_FLAG_CONTINUOUS_PROCESSING) != 0) { - /* We're using continuous processing. Make sure we specify the whole frame count at all times. */ - frameCountIn = framesToProcessIn; /* Give the processing function as much input data as we've got in the buffer, including any silenced padding from short reads. */ - - if ((pNodeBase->vtable->flags & MA_NODE_FLAG_ALLOW_NULL_INPUT) != 0 && pNodeBase->consumedFrameCountIn == 0 && pNodeBase->cachedFrameCountIn == 0) { - consumeNullInput = MA_TRUE; - } else { - consumeNullInput = MA_FALSE; - } - - /* - Since we're using continuous processing we're always passing in a full frame count - regardless of how much input data was read. If this is greater than what we read as - input, we'll end up with an underflow. We instead need to make sure our cached frame - count is set to the number of frames we'll be passing to the data callback. Not - doing this will result in an underflow when we "consume" the cached data later on. - - Note that this check needs to be done after the "consumeNullInput" check above because - we use the property of cachedFrameCountIn being 0 to determine whether or not we - should be passing in a null pointer to the processing callback for when the node is - configured with MA_NODE_FLAG_ALLOW_NULL_INPUT. - */ - if (pNodeBase->cachedFrameCountIn < (ma_uint16)frameCountIn) { - pNodeBase->cachedFrameCountIn = (ma_uint16)frameCountIn; - } - } else { - frameCountIn = pNodeBase->cachedFrameCountIn; /* Give the processing function as much valid input data as we've got. */ - consumeNullInput = MA_FALSE; - } - - /* - Process data slightly differently depending on whether or not we're consuming NULL - input (checked just above). - */ - if (consumeNullInput) { - ma_node_process_pcm_frames_internal(pNode, NULL, &frameCountIn, ppFramesOut, &frameCountOut); - } else { - /* - We want to skip processing if there's no input data, but we can only do that safely if - we know that there is no chance of any output frames being produced. If continuous - processing is being used, this won't be a problem because the input frame count will - always be non-0. However, if continuous processing is *not* enabled and input and output - data is processed at different rates, we still need to process that last input frame - because there could be a few excess output frames needing to be produced from cached - data. The `MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES` flag is used as the indicator for - determining whether or not we need to process the node even when there are no input - frames available right now. - */ - if (frameCountIn > 0 || (pNodeBase->vtable->flags & MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES) != 0) { - ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut); /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Excplicit cast to silence the warning. */ - } else { - frameCountOut = 0; /* No data was processed. */ - } - } - - /* - Thanks to our sneaky optimization above we don't need to do any data copying directly into - the output buffer - the onProcess() callback just did that for us. We do, however, need to - apply the number of input and output frames that were processed. Note that due to continuous - processing above, we need to do explicit checks here. If we just consumed a NULL input - buffer it means that no actual input data was processed from the internal buffers and we - don't want to be modifying any counters. - */ - if (consumeNullInput == MA_FALSE) { - pNodeBase->consumedFrameCountIn += (ma_uint16)frameCountIn; - pNodeBase->cachedFrameCountIn -= (ma_uint16)frameCountIn; - } - - /* The cached output frame count is always equal to what we just read. */ - pNodeBase->cachedFrameCountOut += (ma_uint16)frameCountOut; - - /* If we couldn't process any data, we're done. The loop needs to be terminated here or else we'll get stuck in a loop. */ - if (pNodeBase->cachedFrameCountOut == framesToProcessOut || (frameCountOut == 0 && frameCountIn == 0)) { - break; - } - } - } else { - /* - We're not needing to read anything from the input buffer so just read directly from our - already-processed data. - */ - if (pFramesOut != NULL) { - ma_copy_pcm_frames(pFramesOut, ma_node_get_cached_output_ptr(pNodeBase, outputBusIndex), pNodeBase->cachedFrameCountOut, ma_format_f32, ma_node_get_output_channels(pNodeBase, outputBusIndex)); - } - } - - /* The number of frames read is always equal to the number of cached output frames. */ - totalFramesRead = pNodeBase->cachedFrameCountOut; - - /* Now that we've read the data, make sure our read flag is set. */ - ma_node_output_bus_set_has_read(&pNodeBase->pOutputBuses[outputBusIndex], MA_TRUE); - } - } - - /* Apply volume, if necessary. */ - ma_apply_volume_factor_f32(pFramesOut, totalFramesRead * ma_node_get_output_channels(pNodeBase, outputBusIndex), ma_node_output_bus_get_volume(&pNodeBase->pOutputBuses[outputBusIndex])); - - /* Advance our local time forward. */ - c89atomic_fetch_add_64(&pNodeBase->localTime, (ma_uint64)totalFramesRead); - - *pFramesRead = totalFramesRead + timeOffsetBeg; /* Must include the silenced section at the start of the buffer. */ - return result; -} - - - - -/* Data source node. */ -MA_API ma_data_source_node_config ma_data_source_node_config_init(ma_data_source* pDataSource) -{ - ma_data_source_node_config config; - - MA_ZERO_OBJECT(&config); - config.nodeConfig = ma_node_config_init(); - config.pDataSource = pDataSource; - - return config; -} - - -static void ma_data_source_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_data_source_node* pDataSourceNode = (ma_data_source_node*)pNode; - ma_format format; - ma_uint32 channels; - ma_uint32 frameCount; - ma_uint64 framesRead = 0; - - MA_ASSERT(pDataSourceNode != NULL); - MA_ASSERT(pDataSourceNode->pDataSource != NULL); - MA_ASSERT(ma_node_get_input_bus_count(pDataSourceNode) == 0); - MA_ASSERT(ma_node_get_output_bus_count(pDataSourceNode) == 1); - - /* We don't want to read from ppFramesIn at all. Instead we read from the data source. */ - (void)ppFramesIn; - (void)pFrameCountIn; - - frameCount = *pFrameCountOut; - - /* miniaudio should never be calling this with a frame count of zero. */ - MA_ASSERT(frameCount > 0); - - if (ma_data_source_get_data_format(pDataSourceNode->pDataSource, &format, &channels, NULL, NULL, 0) == MA_SUCCESS) { /* <-- Don't care about sample rate here. */ - /* The node graph system requires samples be in floating point format. This is checked in ma_data_source_node_init(). */ - MA_ASSERT(format == ma_format_f32); - (void)format; /* Just to silence some static analysis tools. */ - - ma_data_source_read_pcm_frames(pDataSourceNode->pDataSource, ppFramesOut[0], frameCount, &framesRead); - } - - *pFrameCountOut = (ma_uint32)framesRead; -} - -static ma_node_vtable g_ma_data_source_node_vtable = -{ - ma_data_source_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 0, /* 0 input buses. */ - 1, /* 1 output bus. */ - 0 -}; - -MA_API ma_result ma_data_source_node_init(ma_node_graph* pNodeGraph, const ma_data_source_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source_node* pDataSourceNode) -{ - ma_result result; - ma_format format; /* For validating the format, which must be ma_format_f32. */ - ma_uint32 channels; /* For specifying the channel count of the output bus. */ - ma_node_config baseConfig; - - if (pDataSourceNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDataSourceNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - result = ma_data_source_get_data_format(pConfig->pDataSource, &format, &channels, NULL, NULL, 0); /* Don't care about sample rate. This will check pDataSource for NULL. */ - if (result != MA_SUCCESS) { - return result; - } - - MA_ASSERT(format == ma_format_f32); /* <-- If you've triggered this it means your data source is not outputting floating-point samples. You must configure your data source to use ma_format_f32. */ - if (format != ma_format_f32) { - return MA_INVALID_ARGS; /* Invalid format. */ - } - - /* The channel count is defined by the data source. If the caller has manually changed the channels we just ignore it. */ - baseConfig = pConfig->nodeConfig; - baseConfig.vtable = &g_ma_data_source_node_vtable; /* Explicitly set the vtable here to prevent callers from setting it incorrectly. */ - - /* - The channel count is defined by the data source. It is invalid for the caller to manually set - the channel counts in the config. `ma_data_source_node_config_init()` will have defaulted the - channel count pointer to NULL which is how it must remain. If you trigger any of these asserts - it means you're explicitly setting the channel count. Instead, configure the output channel - count of your data source to be the necessary channel count. - */ - if (baseConfig.pOutputChannels != NULL) { - return MA_INVALID_ARGS; - } - - baseConfig.pOutputChannels = &channels; - - result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pDataSourceNode->base); - if (result != MA_SUCCESS) { - return result; - } - - pDataSourceNode->pDataSource = pConfig->pDataSource; - - return MA_SUCCESS; -} - -MA_API void ma_data_source_node_uninit(ma_data_source_node* pDataSourceNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_node_uninit(&pDataSourceNode->base, pAllocationCallbacks); -} - -MA_API ma_result ma_data_source_node_set_looping(ma_data_source_node* pDataSourceNode, ma_bool32 isLooping) -{ - if (pDataSourceNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_data_source_set_looping(pDataSourceNode->pDataSource, isLooping); -} - -MA_API ma_bool32 ma_data_source_node_is_looping(ma_data_source_node* pDataSourceNode) -{ - if (pDataSourceNode == NULL) { - return MA_FALSE; - } - - return ma_data_source_is_looping(pDataSourceNode->pDataSource); -} - - - -/* Splitter Node. */ -MA_API ma_splitter_node_config ma_splitter_node_config_init(ma_uint32 channels) -{ - ma_splitter_node_config config; - - MA_ZERO_OBJECT(&config); - config.nodeConfig = ma_node_config_init(); - config.channels = channels; - - return config; -} - - -static void ma_splitter_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_node_base* pNodeBase = (ma_node_base*)pNode; - ma_uint32 iOutputBus; - ma_uint32 channels; - - MA_ASSERT(pNodeBase != NULL); - MA_ASSERT(ma_node_get_input_bus_count(pNodeBase) == 1); - MA_ASSERT(ma_node_get_output_bus_count(pNodeBase) >= 2); - - /* We don't need to consider the input frame count - it'll be the same as the output frame count and we process everything. */ - (void)pFrameCountIn; - - /* NOTE: This assumes the same number of channels for all inputs and outputs. This was checked in ma_splitter_node_init(). */ - channels = ma_node_get_input_channels(pNodeBase, 0); - - /* Splitting is just copying the first input bus and copying it over to each output bus. */ - for (iOutputBus = 0; iOutputBus < ma_node_get_output_bus_count(pNodeBase); iOutputBus += 1) { - ma_copy_pcm_frames(ppFramesOut[iOutputBus], ppFramesIn[0], *pFrameCountOut, ma_format_f32, channels); - } -} - -static ma_node_vtable g_ma_splitter_node_vtable = -{ - ma_splitter_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* 1 input bus. */ - 2, /* 2 output buses. */ - 0 -}; - -MA_API ma_result ma_splitter_node_init(ma_node_graph* pNodeGraph, const ma_splitter_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_splitter_node* pSplitterNode) -{ - ma_result result; - ma_node_config baseConfig; - ma_uint32 pInputChannels[1]; - ma_uint32 pOutputChannels[2]; - - if (pSplitterNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pSplitterNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* Splitters require the same number of channels between inputs and outputs. */ - pInputChannels[0] = pConfig->channels; - pOutputChannels[0] = pConfig->channels; - pOutputChannels[1] = pConfig->channels; - - baseConfig = pConfig->nodeConfig; - baseConfig.vtable = &g_ma_splitter_node_vtable; - baseConfig.pInputChannels = pInputChannels; - baseConfig.pOutputChannels = pOutputChannels; - - result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pSplitterNode->base); - if (result != MA_SUCCESS) { - return result; /* Failed to initialize the base node. */ - } - - return MA_SUCCESS; -} - -MA_API void ma_splitter_node_uninit(ma_splitter_node* pSplitterNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_node_uninit(pSplitterNode, pAllocationCallbacks); -} - - -/* -Biquad Node -*/ -MA_API ma_biquad_node_config ma_biquad_node_config_init(ma_uint32 channels, float b0, float b1, float b2, float a0, float a1, float a2) -{ - ma_biquad_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.biquad = ma_biquad_config_init(ma_format_f32, channels, b0, b1, b2, a0, a1, a2); - - return config; -} - -static void ma_biquad_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_biquad_node* pLPFNode = (ma_biquad_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_biquad_process_pcm_frames(&pLPFNode->biquad, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_biquad_node_vtable = -{ - ma_biquad_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_biquad_node_init(ma_node_graph* pNodeGraph, const ma_biquad_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->biquad.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_biquad_init(&pConfig->biquad, pAllocationCallbacks, &pNode->biquad); - if (result != MA_SUCCESS) { - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_biquad_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->biquad.channels; - baseNodeConfig.pOutputChannels = &pConfig->biquad.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_biquad_node_reinit(const ma_biquad_config* pConfig, ma_biquad_node* pNode) -{ - ma_biquad_node* pLPFNode = (ma_biquad_node*)pNode; - - MA_ASSERT(pNode != NULL); - - return ma_biquad_reinit(pConfig, &pLPFNode->biquad); -} - -MA_API void ma_biquad_node_uninit(ma_biquad_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_biquad_node* pLPFNode = (ma_biquad_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_biquad_uninit(&pLPFNode->biquad, pAllocationCallbacks); -} - - - -/* -Low Pass Filter Node -*/ -MA_API ma_lpf_node_config ma_lpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order) -{ - ma_lpf_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.lpf = ma_lpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order); - - return config; -} - -static void ma_lpf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_lpf_node* pLPFNode = (ma_lpf_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_lpf_process_pcm_frames(&pLPFNode->lpf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_lpf_node_vtable = -{ - ma_lpf_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_lpf_node_init(ma_node_graph* pNodeGraph, const ma_lpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->lpf.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_lpf_init(&pConfig->lpf, pAllocationCallbacks, &pNode->lpf); - if (result != MA_SUCCESS) { - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_lpf_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->lpf.channels; - baseNodeConfig.pOutputChannels = &pConfig->lpf.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_lpf_node_reinit(const ma_lpf_config* pConfig, ma_lpf_node* pNode) -{ - ma_lpf_node* pLPFNode = (ma_lpf_node*)pNode; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_lpf_reinit(pConfig, &pLPFNode->lpf); -} - -MA_API void ma_lpf_node_uninit(ma_lpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_lpf_node* pLPFNode = (ma_lpf_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_lpf_uninit(&pLPFNode->lpf, pAllocationCallbacks); -} - - - -/* -High Pass Filter Node -*/ -MA_API ma_hpf_node_config ma_hpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order) -{ - ma_hpf_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.hpf = ma_hpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order); - - return config; -} - -static void ma_hpf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_hpf_node* pHPFNode = (ma_hpf_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_hpf_process_pcm_frames(&pHPFNode->hpf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_hpf_node_vtable = -{ - ma_hpf_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_hpf_node_init(ma_node_graph* pNodeGraph, const ma_hpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->hpf.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_hpf_init(&pConfig->hpf, pAllocationCallbacks, &pNode->hpf); - if (result != MA_SUCCESS) { - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_hpf_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->hpf.channels; - baseNodeConfig.pOutputChannels = &pConfig->hpf.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_hpf_node_reinit(const ma_hpf_config* pConfig, ma_hpf_node* pNode) -{ - ma_hpf_node* pHPFNode = (ma_hpf_node*)pNode; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_hpf_reinit(pConfig, &pHPFNode->hpf); -} - -MA_API void ma_hpf_node_uninit(ma_hpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_hpf_node* pHPFNode = (ma_hpf_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_hpf_uninit(&pHPFNode->hpf, pAllocationCallbacks); -} - - - - -/* -Band Pass Filter Node -*/ -MA_API ma_bpf_node_config ma_bpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order) -{ - ma_bpf_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.bpf = ma_bpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order); - - return config; -} - -static void ma_bpf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_bpf_node* pBPFNode = (ma_bpf_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_bpf_process_pcm_frames(&pBPFNode->bpf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_bpf_node_vtable = -{ - ma_bpf_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_bpf_node_init(ma_node_graph* pNodeGraph, const ma_bpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->bpf.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_bpf_init(&pConfig->bpf, pAllocationCallbacks, &pNode->bpf); - if (result != MA_SUCCESS) { - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_bpf_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->bpf.channels; - baseNodeConfig.pOutputChannels = &pConfig->bpf.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_bpf_node_reinit(const ma_bpf_config* pConfig, ma_bpf_node* pNode) -{ - ma_bpf_node* pBPFNode = (ma_bpf_node*)pNode; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_bpf_reinit(pConfig, &pBPFNode->bpf); -} - -MA_API void ma_bpf_node_uninit(ma_bpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_bpf_node* pBPFNode = (ma_bpf_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_bpf_uninit(&pBPFNode->bpf, pAllocationCallbacks); -} - - - -/* -Notching Filter Node -*/ -MA_API ma_notch_node_config ma_notch_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency) -{ - ma_notch_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.notch = ma_notch2_config_init(ma_format_f32, channels, sampleRate, q, frequency); - - return config; -} - -static void ma_notch_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_notch_node* pBPFNode = (ma_notch_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_notch2_process_pcm_frames(&pBPFNode->notch, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_notch_node_vtable = -{ - ma_notch_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_notch_node_init(ma_node_graph* pNodeGraph, const ma_notch_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->notch.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_notch2_init(&pConfig->notch, pAllocationCallbacks, &pNode->notch); - if (result != MA_SUCCESS) { - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_notch_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->notch.channels; - baseNodeConfig.pOutputChannels = &pConfig->notch.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_notch_node_reinit(const ma_notch_config* pConfig, ma_notch_node* pNode) -{ - ma_notch_node* pNotchNode = (ma_notch_node*)pNode; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_notch2_reinit(pConfig, &pNotchNode->notch); -} - -MA_API void ma_notch_node_uninit(ma_notch_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_notch_node* pNotchNode = (ma_notch_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_notch2_uninit(&pNotchNode->notch, pAllocationCallbacks); -} - - - -/* -Peaking Filter Node -*/ -MA_API ma_peak_node_config ma_peak_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency) -{ - ma_peak_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.peak = ma_peak2_config_init(ma_format_f32, channels, sampleRate, gainDB, q, frequency); - - return config; -} - -static void ma_peak_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_peak_node* pBPFNode = (ma_peak_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_peak2_process_pcm_frames(&pBPFNode->peak, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_peak_node_vtable = -{ - ma_peak_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_peak_node_init(ma_node_graph* pNodeGraph, const ma_peak_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->peak.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_peak2_init(&pConfig->peak, pAllocationCallbacks, &pNode->peak); - if (result != MA_SUCCESS) { - ma_node_uninit(pNode, pAllocationCallbacks); - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_peak_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->peak.channels; - baseNodeConfig.pOutputChannels = &pConfig->peak.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_peak_node_reinit(const ma_peak_config* pConfig, ma_peak_node* pNode) -{ - ma_peak_node* pPeakNode = (ma_peak_node*)pNode; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_peak2_reinit(pConfig, &pPeakNode->peak); -} - -MA_API void ma_peak_node_uninit(ma_peak_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_peak_node* pPeakNode = (ma_peak_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_peak2_uninit(&pPeakNode->peak, pAllocationCallbacks); -} - - - -/* -Low Shelf Filter Node -*/ -MA_API ma_loshelf_node_config ma_loshelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency) -{ - ma_loshelf_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.loshelf = ma_loshelf2_config_init(ma_format_f32, channels, sampleRate, gainDB, q, frequency); - - return config; -} - -static void ma_loshelf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_loshelf_node* pBPFNode = (ma_loshelf_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_loshelf2_process_pcm_frames(&pBPFNode->loshelf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_loshelf_node_vtable = -{ - ma_loshelf_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_loshelf_node_init(ma_node_graph* pNodeGraph, const ma_loshelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->loshelf.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_loshelf2_init(&pConfig->loshelf, pAllocationCallbacks, &pNode->loshelf); - if (result != MA_SUCCESS) { - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_loshelf_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->loshelf.channels; - baseNodeConfig.pOutputChannels = &pConfig->loshelf.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_loshelf_node_reinit(const ma_loshelf_config* pConfig, ma_loshelf_node* pNode) -{ - ma_loshelf_node* pLoshelfNode = (ma_loshelf_node*)pNode; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_loshelf2_reinit(pConfig, &pLoshelfNode->loshelf); -} - -MA_API void ma_loshelf_node_uninit(ma_loshelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_loshelf_node* pLoshelfNode = (ma_loshelf_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_loshelf2_uninit(&pLoshelfNode->loshelf, pAllocationCallbacks); -} - - - -/* -High Shelf Filter Node -*/ -MA_API ma_hishelf_node_config ma_hishelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency) -{ - ma_hishelf_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.hishelf = ma_hishelf2_config_init(ma_format_f32, channels, sampleRate, gainDB, q, frequency); - - return config; -} - -static void ma_hishelf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_hishelf_node* pBPFNode = (ma_hishelf_node*)pNode; - - MA_ASSERT(pNode != NULL); - (void)pFrameCountIn; - - ma_hishelf2_process_pcm_frames(&pBPFNode->hishelf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_hishelf_node_vtable = -{ - ma_hishelf_node_process_pcm_frames, - NULL, /* onGetRequiredInputFrameCount */ - 1, /* One input. */ - 1, /* One output. */ - 0 /* Default flags. */ -}; - -MA_API ma_result ma_hishelf_node_init(ma_node_graph* pNodeGraph, const ma_hishelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf_node* pNode) -{ - ma_result result; - ma_node_config baseNodeConfig; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pNode); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->hishelf.format != ma_format_f32) { - return MA_INVALID_ARGS; /* The format must be f32. */ - } - - result = ma_hishelf2_init(&pConfig->hishelf, pAllocationCallbacks, &pNode->hishelf); - if (result != MA_SUCCESS) { - return result; - } - - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_hishelf_node_vtable; - baseNodeConfig.pInputChannels = &pConfig->hishelf.channels; - baseNodeConfig.pOutputChannels = &pConfig->hishelf.channels; - - result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode); - if (result != MA_SUCCESS) { - return result; - } - - return result; -} - -MA_API ma_result ma_hishelf_node_reinit(const ma_hishelf_config* pConfig, ma_hishelf_node* pNode) -{ - ma_hishelf_node* pHishelfNode = (ma_hishelf_node*)pNode; - - if (pNode == NULL) { - return MA_INVALID_ARGS; - } - - return ma_hishelf2_reinit(pConfig, &pHishelfNode->hishelf); -} - -MA_API void ma_hishelf_node_uninit(ma_hishelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - ma_hishelf_node* pHishelfNode = (ma_hishelf_node*)pNode; - - if (pNode == NULL) { - return; - } - - ma_node_uninit(pNode, pAllocationCallbacks); - ma_hishelf2_uninit(&pHishelfNode->hishelf, pAllocationCallbacks); -} - - - - -MA_API ma_delay_node_config ma_delay_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay) -{ - ma_delay_node_config config; - - config.nodeConfig = ma_node_config_init(); - config.delay = ma_delay_config_init(channels, sampleRate, delayInFrames, decay); - - return config; -} - - -static void ma_delay_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_delay_node* pDelayNode = (ma_delay_node*)pNode; - - (void)pFrameCountIn; - - ma_delay_process_pcm_frames(&pDelayNode->delay, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut); -} - -static ma_node_vtable g_ma_delay_node_vtable = -{ - ma_delay_node_process_pcm_frames, - NULL, - 1, /* 1 input channels. */ - 1, /* 1 output channel. */ - MA_NODE_FLAG_CONTINUOUS_PROCESSING /* Delay requires continuous processing to ensure the tail get's processed. */ -}; - -MA_API ma_result ma_delay_node_init(ma_node_graph* pNodeGraph, const ma_delay_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay_node* pDelayNode) -{ - ma_result result; - ma_node_config baseConfig; - - if (pDelayNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pDelayNode); - - result = ma_delay_init(&pConfig->delay, pAllocationCallbacks, &pDelayNode->delay); - if (result != MA_SUCCESS) { - return result; - } - - baseConfig = pConfig->nodeConfig; - baseConfig.vtable = &g_ma_delay_node_vtable; - baseConfig.pInputChannels = &pConfig->delay.channels; - baseConfig.pOutputChannels = &pConfig->delay.channels; - - result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pDelayNode->baseNode); - if (result != MA_SUCCESS) { - ma_delay_uninit(&pDelayNode->delay, pAllocationCallbacks); - return result; - } - - return result; -} - -MA_API void ma_delay_node_uninit(ma_delay_node* pDelayNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - if (pDelayNode == NULL) { - return; - } - - /* The base node is always uninitialized first. */ - ma_node_uninit(pDelayNode, pAllocationCallbacks); - ma_delay_uninit(&pDelayNode->delay, pAllocationCallbacks); -} - -MA_API void ma_delay_node_set_wet(ma_delay_node* pDelayNode, float value) -{ - if (pDelayNode == NULL) { - return; - } - - ma_delay_set_wet(&pDelayNode->delay, value); -} - -MA_API float ma_delay_node_get_wet(const ma_delay_node* pDelayNode) -{ - if (pDelayNode == NULL) { - return 0; - } - - return ma_delay_get_wet(&pDelayNode->delay); -} - -MA_API void ma_delay_node_set_dry(ma_delay_node* pDelayNode, float value) -{ - if (pDelayNode == NULL) { - return; - } - - ma_delay_set_dry(&pDelayNode->delay, value); -} - -MA_API float ma_delay_node_get_dry(const ma_delay_node* pDelayNode) -{ - if (pDelayNode == NULL) { - return 0; - } - - return ma_delay_get_dry(&pDelayNode->delay); -} - -MA_API void ma_delay_node_set_decay(ma_delay_node* pDelayNode, float value) -{ - if (pDelayNode == NULL) { - return; - } - - ma_delay_set_decay(&pDelayNode->delay, value); -} - -MA_API float ma_delay_node_get_decay(const ma_delay_node* pDelayNode) -{ - if (pDelayNode == NULL) { - return 0; - } - - return ma_delay_get_decay(&pDelayNode->delay); -} -#endif /* MA_NO_NODE_GRAPH */ - - -#if !defined(MA_NO_ENGINE) && !defined(MA_NO_NODE_GRAPH) -/************************************************************************************************************************************************************** - -Engine - -**************************************************************************************************************************************************************/ -#define MA_SEEK_TARGET_NONE (~(ma_uint64)0) - -MA_API ma_engine_node_config ma_engine_node_config_init(ma_engine* pEngine, ma_engine_node_type type, ma_uint32 flags) -{ - ma_engine_node_config config; - - MA_ZERO_OBJECT(&config); - config.pEngine = pEngine; - config.type = type; - config.isPitchDisabled = (flags & MA_SOUND_FLAG_NO_PITCH) != 0; - config.isSpatializationDisabled = (flags & MA_SOUND_FLAG_NO_SPATIALIZATION) != 0; - - return config; -} - - -static void ma_engine_node_update_pitch_if_required(ma_engine_node* pEngineNode) -{ - ma_bool32 isUpdateRequired = MA_FALSE; - float newPitch; - - MA_ASSERT(pEngineNode != NULL); - - newPitch = c89atomic_load_explicit_f32(&pEngineNode->pitch, c89atomic_memory_order_acquire); - - if (pEngineNode->oldPitch != newPitch) { - pEngineNode->oldPitch = newPitch; - isUpdateRequired = MA_TRUE; - } - - if (pEngineNode->oldDopplerPitch != pEngineNode->spatializer.dopplerPitch) { - pEngineNode->oldDopplerPitch = pEngineNode->spatializer.dopplerPitch; - isUpdateRequired = MA_TRUE; - } - - if (isUpdateRequired) { - float basePitch = (float)pEngineNode->sampleRate / ma_engine_get_sample_rate(pEngineNode->pEngine); - ma_linear_resampler_set_rate_ratio(&pEngineNode->resampler, basePitch * pEngineNode->oldPitch * pEngineNode->oldDopplerPitch); - } -} - -static ma_bool32 ma_engine_node_is_pitching_enabled(const ma_engine_node* pEngineNode) -{ - MA_ASSERT(pEngineNode != NULL); - - /* Don't try to be clever by skiping resampling in the pitch=1 case or else you'll glitch when moving away from 1. */ - return !c89atomic_load_explicit_32(&pEngineNode->isPitchDisabled, c89atomic_memory_order_acquire); -} - -static ma_bool32 ma_engine_node_is_spatialization_enabled(const ma_engine_node* pEngineNode) -{ - MA_ASSERT(pEngineNode != NULL); - - return !c89atomic_load_explicit_32(&pEngineNode->isSpatializationDisabled, c89atomic_memory_order_acquire); -} - -static ma_uint64 ma_engine_node_get_required_input_frame_count(const ma_engine_node* pEngineNode, ma_uint64 outputFrameCount) -{ - ma_uint64 inputFrameCount = 0; - - if (ma_engine_node_is_pitching_enabled(pEngineNode)) { - ma_result result = ma_linear_resampler_get_required_input_frame_count(&pEngineNode->resampler, outputFrameCount, &inputFrameCount); - if (result != MA_SUCCESS) { - inputFrameCount = 0; - } - } else { - inputFrameCount = outputFrameCount; /* No resampling, so 1:1. */ - } - - return inputFrameCount; -} - -static void ma_engine_node_process_pcm_frames__general(ma_engine_node* pEngineNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - ma_uint32 frameCountIn; - ma_uint32 frameCountOut; - ma_uint32 totalFramesProcessedIn; - ma_uint32 totalFramesProcessedOut; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - ma_bool32 isPitchingEnabled; - ma_bool32 isFadingEnabled; - ma_bool32 isSpatializationEnabled; - ma_bool32 isPanningEnabled; - - frameCountIn = *pFrameCountIn; - frameCountOut = *pFrameCountOut; - - channelsIn = ma_spatializer_get_input_channels(&pEngineNode->spatializer); - channelsOut = ma_spatializer_get_output_channels(&pEngineNode->spatializer); - - totalFramesProcessedIn = 0; - totalFramesProcessedOut = 0; - - isPitchingEnabled = ma_engine_node_is_pitching_enabled(pEngineNode); - isFadingEnabled = pEngineNode->fader.volumeBeg != 1 || pEngineNode->fader.volumeEnd != 1; - isSpatializationEnabled = ma_engine_node_is_spatialization_enabled(pEngineNode); - isPanningEnabled = pEngineNode->panner.pan != 0 && channelsOut != 1; - - /* Keep going while we've still got data available for processing. */ - while (totalFramesProcessedOut < frameCountOut) { - /* - We need to process in a specific order. We always do resampling first because it's likely - we're going to be increasing the channel count after spatialization. Also, I want to do - fading based on the output sample rate. - - We'll first read into a buffer from the resampler. Then we'll do all processing that - operates on the on the input channel count. We'll then get the spatializer to output to - the output buffer and then do all effects from that point directly in the output buffer - in-place. - - Note that we're always running the resampler. If we try to be clever and skip resampling - when the pitch is 1, we'll get a glitch when we move away from 1, back to 1, and then - away from 1 again. We'll want to implement any pitch=1 optimizations in the resampler - itself. - - There's a small optimization here that we'll utilize since it might be a fairly common - case. When the input and output channel counts are the same, we'll read straight into the - output buffer from the resampler and do everything in-place. - */ - const float* pRunningFramesIn; - float* pRunningFramesOut; - float* pWorkingBuffer; /* This is the buffer that we'll be processing frames in. This is in input channels. */ - float temp[MA_DATA_CONVERTER_STACK_BUFFER_SIZE / sizeof(float)]; - ma_uint32 tempCapInFrames = ma_countof(temp) / channelsIn; - ma_uint32 framesAvailableIn; - ma_uint32 framesAvailableOut; - ma_uint32 framesJustProcessedIn; - ma_uint32 framesJustProcessedOut; - ma_bool32 isWorkingBufferValid = MA_FALSE; - - framesAvailableIn = frameCountIn - totalFramesProcessedIn; - framesAvailableOut = frameCountOut - totalFramesProcessedOut; - - pRunningFramesIn = ma_offset_pcm_frames_const_ptr_f32(ppFramesIn[0], totalFramesProcessedIn, channelsIn); - pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(ppFramesOut[0], totalFramesProcessedOut, channelsOut); - - if (channelsIn == channelsOut) { - /* Fast path. Channel counts are the same. No need for an intermediary input buffer. */ - pWorkingBuffer = pRunningFramesOut; - } else { - /* Slow path. Channel counts are different. Need to use an intermediary input buffer. */ - pWorkingBuffer = temp; - if (framesAvailableOut > tempCapInFrames) { - framesAvailableOut = tempCapInFrames; - } - } - - /* First is resampler. */ - if (isPitchingEnabled) { - ma_uint64 resampleFrameCountIn = framesAvailableIn; - ma_uint64 resampleFrameCountOut = framesAvailableOut; - - ma_linear_resampler_process_pcm_frames(&pEngineNode->resampler, pRunningFramesIn, &resampleFrameCountIn, pWorkingBuffer, &resampleFrameCountOut); - isWorkingBufferValid = MA_TRUE; - - framesJustProcessedIn = (ma_uint32)resampleFrameCountIn; - framesJustProcessedOut = (ma_uint32)resampleFrameCountOut; - } else { - framesJustProcessedIn = ma_min(framesAvailableIn, framesAvailableOut); - framesJustProcessedOut = framesJustProcessedIn; /* When no resampling is being performed, the number of output frames is the same as input frames. */ - } - - /* Fading. */ - if (isFadingEnabled) { - if (isWorkingBufferValid) { - ma_fader_process_pcm_frames(&pEngineNode->fader, pWorkingBuffer, pWorkingBuffer, framesJustProcessedOut); /* In-place processing. */ - } else { - ma_fader_process_pcm_frames(&pEngineNode->fader, pWorkingBuffer, pRunningFramesIn, framesJustProcessedOut); - isWorkingBufferValid = MA_TRUE; - } - } - - /* - If at this point we still haven't actually done anything with the working buffer we need - to just read straight from the input buffer. - */ - if (isWorkingBufferValid == MA_FALSE) { - pWorkingBuffer = (float*)pRunningFramesIn; /* Naughty const cast, but it's safe at this point because we won't ever be writing to it from this point out. */ - } - - /* Spatialization. */ - if (isSpatializationEnabled) { - ma_uint32 iListener; - - /* - When determining the listener to use, we first check to see if the sound is pinned to a - specific listener. If so, we use that. Otherwise we just use the closest listener. - */ - if (pEngineNode->pinnedListenerIndex != MA_LISTENER_INDEX_CLOSEST && pEngineNode->pinnedListenerIndex < ma_engine_get_listener_count(pEngineNode->pEngine)) { - iListener = pEngineNode->pinnedListenerIndex; - } else { - iListener = ma_engine_find_closest_listener(pEngineNode->pEngine, pEngineNode->spatializer.position.x, pEngineNode->spatializer.position.y, pEngineNode->spatializer.position.z); - } - - ma_spatializer_process_pcm_frames(&pEngineNode->spatializer, &pEngineNode->pEngine->listeners[iListener], pRunningFramesOut, pWorkingBuffer, framesJustProcessedOut); - } else { - /* No spatialization, but we still need to do channel conversion. */ - if (channelsIn == channelsOut) { - /* No channel conversion required. Just copy straight to the output buffer. */ - ma_copy_pcm_frames(pRunningFramesOut, pWorkingBuffer, framesJustProcessedOut, ma_format_f32, channelsOut); - } else { - /* Channel conversion required. TODO: Add support for channel maps here. */ - ma_channel_map_apply_f32(pRunningFramesOut, NULL, channelsOut, pWorkingBuffer, NULL, channelsIn, framesJustProcessedOut, ma_channel_mix_mode_simple, pEngineNode->pEngine->monoExpansionMode); - } - } - - /* At this point we can guarantee that the output buffer contains valid data. We can process everything in place now. */ - - /* Panning. */ - if (isPanningEnabled) { - ma_panner_process_pcm_frames(&pEngineNode->panner, pRunningFramesOut, pRunningFramesOut, framesJustProcessedOut); /* In-place processing. */ - } - - /* We're done for this chunk. */ - totalFramesProcessedIn += framesJustProcessedIn; - totalFramesProcessedOut += framesJustProcessedOut; - - /* If we didn't process any output frames this iteration it means we've either run out of input data, or run out of room in the output buffer. */ - if (framesJustProcessedOut == 0) { - break; - } - } - - /* At this point we're done processing. */ - *pFrameCountIn = totalFramesProcessedIn; - *pFrameCountOut = totalFramesProcessedOut; -} - -static void ma_engine_node_process_pcm_frames__sound(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - /* For sounds, we need to first read from the data source. Then we need to apply the engine effects (pan, pitch, fades, etc.). */ - ma_result result = MA_SUCCESS; - ma_sound* pSound = (ma_sound*)pNode; - ma_uint32 frameCount = *pFrameCountOut; - ma_uint32 totalFramesRead = 0; - ma_format dataSourceFormat; - ma_uint32 dataSourceChannels; - ma_uint8 temp[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; - ma_uint32 tempCapInFrames; - ma_uint64 seekTarget; - - /* This is a data source node which means no input buses. */ - (void)ppFramesIn; - (void)pFrameCountIn; - - /* If we're marked at the end we need to stop the sound and do nothing. */ - if (ma_sound_at_end(pSound)) { - ma_sound_stop(pSound); - *pFrameCountOut = 0; - return; - } - - /* If we're seeking, do so now before reading. */ - seekTarget = c89atomic_load_64(&pSound->seekTarget); - if (seekTarget != MA_SEEK_TARGET_NONE) { - ma_data_source_seek_to_pcm_frame(pSound->pDataSource, seekTarget); - - /* Any time-dependant effects need to have their times updated. */ - ma_node_set_time(pSound, seekTarget); - - c89atomic_exchange_64(&pSound->seekTarget, MA_SEEK_TARGET_NONE); - } - - /* - We want to update the pitch once. For sounds, this can be either at the start or at the end. If - we don't force this to only ever be updating once, we could end up in a situation where - retrieving the required input frame count ends up being different to what we actually retrieve. - What could happen is that the required input frame count is calculated, the pitch is update, - and then this processing function is called resulting in a different number of input frames - being processed. Do not call this in ma_engine_node_process_pcm_frames__general() or else - you'll hit the aforementioned bug. - */ - ma_engine_node_update_pitch_if_required(&pSound->engineNode); - - /* - For the convenience of the caller, we're doing to allow data sources to use non-floating-point formats and channel counts that differ - from the main engine. - */ - result = ma_data_source_get_data_format(pSound->pDataSource, &dataSourceFormat, &dataSourceChannels, NULL, NULL, 0); - if (result == MA_SUCCESS) { - tempCapInFrames = sizeof(temp) / ma_get_bytes_per_frame(dataSourceFormat, dataSourceChannels); - - /* Keep reading until we've read as much as was requested or we reach the end of the data source. */ - while (totalFramesRead < frameCount) { - ma_uint32 framesRemaining = frameCount - totalFramesRead; - ma_uint32 framesToRead; - ma_uint64 framesJustRead; - ma_uint32 frameCountIn; - ma_uint32 frameCountOut; - const float* pRunningFramesIn; - float* pRunningFramesOut; - - /* - The first thing we need to do is read into the temporary buffer. We can calculate exactly - how many input frames we'll need after resampling. - */ - framesToRead = (ma_uint32)ma_engine_node_get_required_input_frame_count(&pSound->engineNode, framesRemaining); - if (framesToRead > tempCapInFrames) { - framesToRead = tempCapInFrames; - } - - result = ma_data_source_read_pcm_frames(pSound->pDataSource, temp, framesToRead, &framesJustRead); - - /* If we reached the end of the sound we'll want to mark it as at the end and stop it. This should never be returned for looping sounds. */ - if (result == MA_AT_END) { - c89atomic_exchange_32(&pSound->atEnd, MA_TRUE); /* This will be set to false in ma_sound_start(). */ - } - - pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(ppFramesOut[0], totalFramesRead, ma_engine_get_channels(ma_sound_get_engine(pSound))); - - frameCountIn = (ma_uint32)framesJustRead; - frameCountOut = framesRemaining; - - /* Convert if necessary. */ - if (dataSourceFormat == ma_format_f32) { - /* Fast path. No data conversion necessary. */ - pRunningFramesIn = (float*)temp; - ma_engine_node_process_pcm_frames__general(&pSound->engineNode, &pRunningFramesIn, &frameCountIn, &pRunningFramesOut, &frameCountOut); - } else { - /* Slow path. Need to do sample format conversion to f32. If we give the f32 buffer the same count as the first temp buffer, we're guaranteed it'll be large enough. */ - float tempf32[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* Do not do `MA_DATA_CONVERTER_STACK_BUFFER_SIZE/sizeof(float)` here like we've done in other places. */ - ma_convert_pcm_frames_format(tempf32, ma_format_f32, temp, dataSourceFormat, framesJustRead, dataSourceChannels, ma_dither_mode_none); - - /* Now that we have our samples in f32 format we can process like normal. */ - pRunningFramesIn = tempf32; - ma_engine_node_process_pcm_frames__general(&pSound->engineNode, &pRunningFramesIn, &frameCountIn, &pRunningFramesOut, &frameCountOut); - } - - /* We should have processed all of our input frames since we calculated the required number of input frames at the top. */ - MA_ASSERT(frameCountIn == framesJustRead); - totalFramesRead += (ma_uint32)frameCountOut; /* Safe cast. */ - - if (result != MA_SUCCESS || ma_sound_at_end(pSound)) { - break; /* Might have reached the end. */ - } - } - } - - *pFrameCountOut = totalFramesRead; -} - -static void ma_engine_node_process_pcm_frames__group(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut) -{ - /* - Make sure the pitch is updated before trying to read anything. It's important that this is done - only once and not in ma_engine_node_process_pcm_frames__general(). The reason for this is that - ma_engine_node_process_pcm_frames__general() will call ma_engine_node_get_required_input_frame_count(), - and if another thread modifies the pitch just after that call it can result in a glitch due to - the input rate changing. - */ - ma_engine_node_update_pitch_if_required((ma_engine_node*)pNode); - - /* For groups, the input data has already been read and we just need to apply the effect. */ - ma_engine_node_process_pcm_frames__general((ma_engine_node*)pNode, ppFramesIn, pFrameCountIn, ppFramesOut, pFrameCountOut); -} - -static ma_result ma_engine_node_get_required_input_frame_count__group(ma_node* pNode, ma_uint32 outputFrameCount, ma_uint32* pInputFrameCount) -{ - ma_uint64 inputFrameCount; - - MA_ASSERT(pInputFrameCount != NULL); - - /* Our pitch will affect this calculation. We need to update it. */ - ma_engine_node_update_pitch_if_required((ma_engine_node*)pNode); - - inputFrameCount = ma_engine_node_get_required_input_frame_count((ma_engine_node*)pNode, outputFrameCount); - if (inputFrameCount > 0xFFFFFFFF) { - inputFrameCount = 0xFFFFFFFF; /* Will never happen because miniaudio will only ever process in relatively small chunks. */ - } - - *pInputFrameCount = (ma_uint32)inputFrameCount; - - return MA_SUCCESS; -} - - -static ma_node_vtable g_ma_engine_node_vtable__sound = -{ - ma_engine_node_process_pcm_frames__sound, - NULL, /* onGetRequiredInputFrameCount */ - 0, /* Sounds are data source nodes which means they have zero inputs (their input is drawn from the data source itself). */ - 1, /* Sounds have one output bus. */ - 0 /* Default flags. */ -}; - -static ma_node_vtable g_ma_engine_node_vtable__group = -{ - ma_engine_node_process_pcm_frames__group, - ma_engine_node_get_required_input_frame_count__group, - 1, /* Groups have one input bus. */ - 1, /* Groups have one output bus. */ - MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES /* The engine node does resampling so should let miniaudio know about it. */ -}; - - - -static ma_node_config ma_engine_node_base_node_config_init(const ma_engine_node_config* pConfig) -{ - ma_node_config baseNodeConfig; - - if (pConfig->type == ma_engine_node_type_sound) { - /* Sound. */ - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_engine_node_vtable__sound; - baseNodeConfig.initialState = ma_node_state_stopped; /* Sounds are stopped by default. */ - } else { - /* Group. */ - baseNodeConfig = ma_node_config_init(); - baseNodeConfig.vtable = &g_ma_engine_node_vtable__group; - baseNodeConfig.initialState = ma_node_state_started; /* Groups are started by default. */ - } - - return baseNodeConfig; -} - -static ma_spatializer_config ma_engine_node_spatializer_config_init(const ma_node_config* pBaseNodeConfig) -{ - return ma_spatializer_config_init(pBaseNodeConfig->pInputChannels[0], pBaseNodeConfig->pOutputChannels[0]); -} - -typedef struct -{ - size_t sizeInBytes; - size_t baseNodeOffset; - size_t resamplerOffset; - size_t spatializerOffset; -} ma_engine_node_heap_layout; - -static ma_result ma_engine_node_get_heap_layout(const ma_engine_node_config* pConfig, ma_engine_node_heap_layout* pHeapLayout) -{ - ma_result result; - size_t tempHeapSize; - ma_node_config baseNodeConfig; - ma_linear_resampler_config resamplerConfig; - ma_spatializer_config spatializerConfig; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - - MA_ASSERT(pHeapLayout); - - MA_ZERO_OBJECT(pHeapLayout); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - if (pConfig->pEngine == NULL) { - return MA_INVALID_ARGS; /* An engine must be specified. */ - } - - pHeapLayout->sizeInBytes = 0; - - channelsIn = (pConfig->channelsIn != 0) ? pConfig->channelsIn : ma_engine_get_channels(pConfig->pEngine); - channelsOut = (pConfig->channelsOut != 0) ? pConfig->channelsOut : ma_engine_get_channels(pConfig->pEngine); - - - /* Base node. */ - baseNodeConfig = ma_engine_node_base_node_config_init(pConfig); - baseNodeConfig.pInputChannels = &channelsIn; - baseNodeConfig.pOutputChannels = &channelsOut; - - result = ma_node_get_heap_size(ma_engine_get_node_graph(pConfig->pEngine), &baseNodeConfig, &tempHeapSize); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the size of the heap for the base node. */ - } - - pHeapLayout->baseNodeOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(tempHeapSize); - - - /* Resmapler. */ - resamplerConfig = ma_linear_resampler_config_init(ma_format_f32, channelsIn, 1, 1); /* Input and output sample rates don't affect the calculation of the heap size. */ - resamplerConfig.lpfOrder = 0; - - result = ma_linear_resampler_get_heap_size(&resamplerConfig, &tempHeapSize); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the size of the heap for the resampler. */ - } - - pHeapLayout->resamplerOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(tempHeapSize); - - - /* Spatializer. */ - spatializerConfig = ma_engine_node_spatializer_config_init(&baseNodeConfig); - - result = ma_spatializer_get_heap_size(&spatializerConfig, &tempHeapSize); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the size of the heap for the spatializer. */ - } - - pHeapLayout->spatializerOffset = pHeapLayout->sizeInBytes; - pHeapLayout->sizeInBytes += ma_align_64(tempHeapSize); - - - return MA_SUCCESS; -} - -MA_API ma_result ma_engine_node_get_heap_size(const ma_engine_node_config* pConfig, size_t* pHeapSizeInBytes) -{ - ma_result result; - ma_engine_node_heap_layout heapLayout; - - if (pHeapSizeInBytes == NULL) { - return MA_INVALID_ARGS; - } - - *pHeapSizeInBytes = 0; - - result = ma_engine_node_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - *pHeapSizeInBytes = heapLayout.sizeInBytes; - - return MA_SUCCESS; -} - -MA_API ma_result ma_engine_node_init_preallocated(const ma_engine_node_config* pConfig, void* pHeap, ma_engine_node* pEngineNode) -{ - ma_result result; - ma_engine_node_heap_layout heapLayout; - ma_node_config baseNodeConfig; - ma_linear_resampler_config resamplerConfig; - ma_fader_config faderConfig; - ma_spatializer_config spatializerConfig; - ma_panner_config pannerConfig; - ma_uint32 channelsIn; - ma_uint32 channelsOut; - - if (pEngineNode == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pEngineNode); - - result = ma_engine_node_get_heap_layout(pConfig, &heapLayout); - if (result != MA_SUCCESS) { - return result; - } - - if (pConfig->pinnedListenerIndex != MA_LISTENER_INDEX_CLOSEST && pConfig->pinnedListenerIndex >= ma_engine_get_listener_count(pConfig->pEngine)) { - return MA_INVALID_ARGS; /* Invalid listener. */ - } - - pEngineNode->_pHeap = pHeap; - MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes); - - pEngineNode->pEngine = pConfig->pEngine; - pEngineNode->sampleRate = (pConfig->sampleRate > 0) ? pConfig->sampleRate : ma_engine_get_sample_rate(pEngineNode->pEngine); - pEngineNode->pitch = 1; - pEngineNode->oldPitch = 1; - pEngineNode->oldDopplerPitch = 1; - pEngineNode->isPitchDisabled = pConfig->isPitchDisabled; - pEngineNode->isSpatializationDisabled = pConfig->isSpatializationDisabled; - pEngineNode->pinnedListenerIndex = pConfig->pinnedListenerIndex; - - - channelsIn = (pConfig->channelsIn != 0) ? pConfig->channelsIn : ma_engine_get_channels(pConfig->pEngine); - channelsOut = (pConfig->channelsOut != 0) ? pConfig->channelsOut : ma_engine_get_channels(pConfig->pEngine); - - - /* Base node. */ - baseNodeConfig = ma_engine_node_base_node_config_init(pConfig); - baseNodeConfig.pInputChannels = &channelsIn; - baseNodeConfig.pOutputChannels = &channelsOut; - - result = ma_node_init_preallocated(&pConfig->pEngine->nodeGraph, &baseNodeConfig, ma_offset_ptr(pHeap, heapLayout.baseNodeOffset), &pEngineNode->baseNode); - if (result != MA_SUCCESS) { - goto error0; - } - - - /* - We can now initialize the effects we need in order to implement the engine node. There's a - defined order of operations here, mainly centered around when we convert our channels from the - data source's native channel count to the engine's channel count. As a rule, we want to do as - much computation as possible before spatialization because there's a chance that will increase - the channel count, thereby increasing the amount of work needing to be done to process. - */ - - /* We'll always do resampling first. */ - resamplerConfig = ma_linear_resampler_config_init(ma_format_f32, baseNodeConfig.pInputChannels[0], pEngineNode->sampleRate, ma_engine_get_sample_rate(pEngineNode->pEngine)); - resamplerConfig.lpfOrder = 0; /* <-- Need to disable low-pass filtering for pitch shifting for now because there's cases where the biquads are becoming unstable. Need to figure out a better fix for this. */ - - result = ma_linear_resampler_init_preallocated(&resamplerConfig, ma_offset_ptr(pHeap, heapLayout.resamplerOffset), &pEngineNode->resampler); - if (result != MA_SUCCESS) { - goto error1; - } - - - /* After resampling will come the fader. */ - faderConfig = ma_fader_config_init(ma_format_f32, baseNodeConfig.pInputChannels[0], ma_engine_get_sample_rate(pEngineNode->pEngine)); - - result = ma_fader_init(&faderConfig, &pEngineNode->fader); - if (result != MA_SUCCESS) { - goto error2; - } - - - /* - Spatialization comes next. We spatialize based ont he node's output channel count. It's up the caller to - ensure channels counts link up correctly in the node graph. - */ - spatializerConfig = ma_engine_node_spatializer_config_init(&baseNodeConfig); - spatializerConfig.gainSmoothTimeInFrames = pEngineNode->pEngine->gainSmoothTimeInFrames; - - result = ma_spatializer_init_preallocated(&spatializerConfig, ma_offset_ptr(pHeap, heapLayout.spatializerOffset), &pEngineNode->spatializer); - if (result != MA_SUCCESS) { - goto error2; - } - - - /* - After spatialization comes panning. We need to do this after spatialization because otherwise we wouldn't - be able to pan mono sounds. - */ - pannerConfig = ma_panner_config_init(ma_format_f32, baseNodeConfig.pOutputChannels[0]); - - result = ma_panner_init(&pannerConfig, &pEngineNode->panner); - if (result != MA_SUCCESS) { - goto error3; - } - - return MA_SUCCESS; - - /* No need for allocation callbacks here because we use a preallocated heap. */ -error3: ma_spatializer_uninit(&pEngineNode->spatializer, NULL); -error2: ma_linear_resampler_uninit(&pEngineNode->resampler, NULL); -error1: ma_node_uninit(&pEngineNode->baseNode, NULL); -error0: return result; -} - -MA_API ma_result ma_engine_node_init(const ma_engine_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_engine_node* pEngineNode) -{ - ma_result result; - size_t heapSizeInBytes; - void* pHeap; - - result = ma_engine_node_get_heap_size(pConfig, &heapSizeInBytes); - if (result != MA_SUCCESS) { - return result; - } - - if (heapSizeInBytes > 0) { - pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks); - if (pHeap == NULL) { - return MA_OUT_OF_MEMORY; - } - } else { - pHeap = NULL; - } - - result = ma_engine_node_init_preallocated(pConfig, pHeap, pEngineNode); - if (result != MA_SUCCESS) { - ma_free(pHeap, pAllocationCallbacks); - return result; - } - - pEngineNode->_ownsHeap = MA_TRUE; - return MA_SUCCESS; -} - -MA_API void ma_engine_node_uninit(ma_engine_node* pEngineNode, const ma_allocation_callbacks* pAllocationCallbacks) -{ - /* - The base node always needs to be uninitialized first to ensure it's detached from the graph completely before we - destroy anything that might be in the middle of being used by the processing function. - */ - ma_node_uninit(&pEngineNode->baseNode, pAllocationCallbacks); - - /* Now that the node has been uninitialized we can safely uninitialize the rest. */ - ma_spatializer_uninit(&pEngineNode->spatializer, pAllocationCallbacks); - ma_linear_resampler_uninit(&pEngineNode->resampler, pAllocationCallbacks); - - /* Free the heap last. */ - if (pEngineNode->_ownsHeap) { - ma_free(pEngineNode->_pHeap, pAllocationCallbacks); - } -} - - -MA_API ma_sound_config ma_sound_config_init(void) -{ - ma_sound_config config; - - MA_ZERO_OBJECT(&config); - config.rangeEndInPCMFrames = ~((ma_uint64)0); - config.loopPointEndInPCMFrames = ~((ma_uint64)0); - - return config; -} - -MA_API ma_sound_group_config ma_sound_group_config_init(void) -{ - ma_sound_group_config config; - - MA_ZERO_OBJECT(&config); - - return config; -} - - -MA_API ma_engine_config ma_engine_config_init(void) -{ - ma_engine_config config; - - MA_ZERO_OBJECT(&config); - config.listenerCount = 1; /* Always want at least one listener. */ - config.monoExpansionMode = ma_mono_expansion_mode_default; - - return config; -} - - -#if !defined(MA_NO_DEVICE_IO) -static void ma_engine_data_callback_internal(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount) -{ - ma_engine* pEngine = (ma_engine*)pDevice->pUserData; - - (void)pFramesIn; - - /* - Experiment: Try processing a resource manager job if we're on the Emscripten build. - - This serves two purposes: - - 1) It ensures jobs are actually processed at some point since we cannot guarantee that the - caller is doing the right thing and calling ma_resource_manager_process_next_job(); and - - 2) It's an attempt at working around an issue where processing jobs on the Emscripten main - loop doesn't work as well as it should. When trying to load sounds without the `DECODE` - flag or with the `ASYNC` flag, the sound data is just not able to be loaded in time - before the callback is processed. I think it's got something to do with the single- - threaded nature of Web, but I'm not entirely sure. - */ - #if !defined(MA_NO_RESOURCE_MANAGER) && defined(MA_EMSCRIPTEN) - { - if (pEngine->pResourceManager != NULL) { - if ((pEngine->pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NO_THREADING) != 0) { - ma_resource_manager_process_next_job(pEngine->pResourceManager); - } - } - } - #endif - - ma_engine_read_pcm_frames(pEngine, pFramesOut, frameCount, NULL); -} -#endif - -MA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEngine) -{ - ma_result result; - ma_node_graph_config nodeGraphConfig; - ma_engine_config engineConfig; - ma_spatializer_listener_config listenerConfig; - ma_uint32 iListener; - - if (pEngine == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pEngine); - - /* The config is allowed to be NULL in which case we use defaults for everything. */ - if (pConfig != NULL) { - engineConfig = *pConfig; - } else { - engineConfig = ma_engine_config_init(); - } - - pEngine->monoExpansionMode = engineConfig.monoExpansionMode; - ma_allocation_callbacks_init_copy(&pEngine->allocationCallbacks, &engineConfig.allocationCallbacks); - - #if !defined(MA_NO_RESOURCE_MANAGER) - { - pEngine->pResourceManager = engineConfig.pResourceManager; - } - #endif - - #if !defined(MA_NO_DEVICE_IO) - { - pEngine->pDevice = engineConfig.pDevice; - - /* If we don't have a device, we need one. */ - if (pEngine->pDevice == NULL && engineConfig.noDevice == MA_FALSE) { - ma_device_config deviceConfig; - - pEngine->pDevice = (ma_device*)ma_malloc(sizeof(*pEngine->pDevice), &pEngine->allocationCallbacks); - if (pEngine->pDevice == NULL) { - return MA_OUT_OF_MEMORY; - } - - deviceConfig = ma_device_config_init(ma_device_type_playback); - deviceConfig.playback.pDeviceID = engineConfig.pPlaybackDeviceID; - deviceConfig.playback.format = ma_format_f32; - deviceConfig.playback.channels = engineConfig.channels; - deviceConfig.sampleRate = engineConfig.sampleRate; - deviceConfig.dataCallback = ma_engine_data_callback_internal; - deviceConfig.pUserData = pEngine; - deviceConfig.periodSizeInFrames = engineConfig.periodSizeInFrames; - deviceConfig.periodSizeInMilliseconds = engineConfig.periodSizeInMilliseconds; - deviceConfig.noPreSilencedOutputBuffer = MA_TRUE; /* We'll always be outputting to every frame in the callback so there's no need for a pre-silenced buffer. */ - deviceConfig.noClip = MA_TRUE; /* The engine will do clipping itself. */ - - if (engineConfig.pContext == NULL) { - ma_context_config contextConfig = ma_context_config_init(); - contextConfig.allocationCallbacks = pEngine->allocationCallbacks; - contextConfig.pLog = engineConfig.pLog; - - /* If the engine config does not specify a log, use the resource manager's if we have one. */ - #ifndef MA_NO_RESOURCE_MANAGER - { - if (contextConfig.pLog == NULL && engineConfig.pResourceManager != NULL) { - contextConfig.pLog = ma_resource_manager_get_log(engineConfig.pResourceManager); - } - } - #endif - - result = ma_device_init_ex(NULL, 0, &contextConfig, &deviceConfig, pEngine->pDevice); - } else { - result = ma_device_init(engineConfig.pContext, &deviceConfig, pEngine->pDevice); - } - - if (result != MA_SUCCESS) { - ma_free(pEngine->pDevice, &pEngine->allocationCallbacks); - pEngine->pDevice = NULL; - return result; - } - - pEngine->ownsDevice = MA_TRUE; - } - - /* Update the channel count and sample rate of the engine config so we can reference it below. */ - if (pEngine->pDevice != NULL) { - engineConfig.channels = pEngine->pDevice->playback.channels; - engineConfig.sampleRate = pEngine->pDevice->sampleRate; - } - } - #endif - - if (engineConfig.channels == 0 || engineConfig.sampleRate == 0) { - return MA_INVALID_ARGS; - } - - pEngine->sampleRate = engineConfig.sampleRate; - - /* The engine always uses either the log that was passed into the config, or the context's log is available. */ - if (engineConfig.pLog != NULL) { - pEngine->pLog = engineConfig.pLog; - } else { - #if !defined(MA_NO_DEVICE_IO) - { - pEngine->pLog = ma_device_get_log(pEngine->pDevice); - } - #else - { - pEngine->pLog = NULL; - } - #endif - } - - - /* The engine is a node graph. This needs to be initialized after we have the device so we can can determine the channel count. */ - nodeGraphConfig = ma_node_graph_config_init(engineConfig.channels); - nodeGraphConfig.nodeCacheCapInFrames = (engineConfig.periodSizeInFrames > 0xFFFF) ? 0xFFFF : (ma_uint16)engineConfig.periodSizeInFrames; - - result = ma_node_graph_init(&nodeGraphConfig, &pEngine->allocationCallbacks, &pEngine->nodeGraph); - if (result != MA_SUCCESS) { - goto on_error_1; - } - - - /* We need at least one listener. */ - if (engineConfig.listenerCount == 0) { - engineConfig.listenerCount = 1; - } - - if (engineConfig.listenerCount > MA_ENGINE_MAX_LISTENERS) { - result = MA_INVALID_ARGS; /* Too many listeners. */ - goto on_error_1; - } - - for (iListener = 0; iListener < engineConfig.listenerCount; iListener += 1) { - listenerConfig = ma_spatializer_listener_config_init(ma_node_graph_get_channels(&pEngine->nodeGraph)); - - /* - If we're using a device, use the device's channel map for the listener. Otherwise just use - miniaudio's default channel map. - */ - #if !defined(MA_NO_DEVICE_IO) - { - if (pEngine->pDevice != NULL) { - /* - Temporarily disabled. There is a subtle bug here where front-left and front-right - will be used by the device's channel map, but this is not what we want to use for - spatialization. Instead we want to use side-left and side-right. I need to figure - out a better solution for this. For now, disabling the user of device channel maps. - */ - /*listenerConfig.pChannelMapOut = pEngine->pDevice->playback.channelMap;*/ - } - } - #endif - - result = ma_spatializer_listener_init(&listenerConfig, &pEngine->allocationCallbacks, &pEngine->listeners[iListener]); /* TODO: Change this to a pre-allocated heap. */ - if (result != MA_SUCCESS) { - goto on_error_2; - } - - pEngine->listenerCount += 1; - } - - - /* Gain smoothing for spatialized sounds. */ - pEngine->gainSmoothTimeInFrames = engineConfig.gainSmoothTimeInFrames; - if (pEngine->gainSmoothTimeInFrames == 0) { - ma_uint32 gainSmoothTimeInMilliseconds = engineConfig.gainSmoothTimeInMilliseconds; - if (gainSmoothTimeInMilliseconds == 0) { - gainSmoothTimeInMilliseconds = 8; - } - - pEngine->gainSmoothTimeInFrames = (gainSmoothTimeInMilliseconds * ma_engine_get_sample_rate(pEngine)) / 1000; /* 8ms by default. */ - } - - - /* We need a resource manager. */ - #ifndef MA_NO_RESOURCE_MANAGER - { - if (pEngine->pResourceManager == NULL) { - ma_resource_manager_config resourceManagerConfig; - - pEngine->pResourceManager = (ma_resource_manager*)ma_malloc(sizeof(*pEngine->pResourceManager), &pEngine->allocationCallbacks); - if (pEngine->pResourceManager == NULL) { - result = MA_OUT_OF_MEMORY; - goto on_error_2; - } - - resourceManagerConfig = ma_resource_manager_config_init(); - resourceManagerConfig.pLog = pEngine->pLog; /* Always use the engine's log for internally-managed resource managers. */ - resourceManagerConfig.decodedFormat = ma_format_f32; - resourceManagerConfig.decodedChannels = 0; /* Leave the decoded channel count as 0 so we can get good spatialization. */ - resourceManagerConfig.decodedSampleRate = ma_engine_get_sample_rate(pEngine); - ma_allocation_callbacks_init_copy(&resourceManagerConfig.allocationCallbacks, &pEngine->allocationCallbacks); - resourceManagerConfig.pVFS = engineConfig.pResourceManagerVFS; - - /* The Emscripten build cannot use threads. */ - #if defined(MA_EMSCRIPTEN) - { - resourceManagerConfig.jobThreadCount = 0; - resourceManagerConfig.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING; - } - #endif - - result = ma_resource_manager_init(&resourceManagerConfig, pEngine->pResourceManager); - if (result != MA_SUCCESS) { - goto on_error_3; - } - - pEngine->ownsResourceManager = MA_TRUE; - } - } - #endif - - /* Setup some stuff for inlined sounds. That is sounds played with ma_engine_play_sound(). */ - pEngine->inlinedSoundLock = 0; - pEngine->pInlinedSoundHead = NULL; - - /* Start the engine if required. This should always be the last step. */ - #if !defined(MA_NO_DEVICE_IO) - { - if (engineConfig.noAutoStart == MA_FALSE && pEngine->pDevice != NULL) { - result = ma_engine_start(pEngine); - if (result != MA_SUCCESS) { - goto on_error_4; /* Failed to start the engine. */ - } - } - } - #endif - - return MA_SUCCESS; - -#if !defined(MA_NO_DEVICE_IO) -on_error_4: -#endif -#if !defined(MA_NO_RESOURCE_MANAGER) -on_error_3: - if (pEngine->ownsResourceManager) { - ma_free(pEngine->pResourceManager, &pEngine->allocationCallbacks); - } -#endif /* MA_NO_RESOURCE_MANAGER */ -on_error_2: - for (iListener = 0; iListener < pEngine->listenerCount; iListener += 1) { - ma_spatializer_listener_uninit(&pEngine->listeners[iListener], &pEngine->allocationCallbacks); - } - - ma_node_graph_uninit(&pEngine->nodeGraph, &pEngine->allocationCallbacks); -on_error_1: - #if !defined(MA_NO_DEVICE_IO) - { - if (pEngine->ownsDevice) { - ma_device_uninit(pEngine->pDevice); - ma_free(pEngine->pDevice, &pEngine->allocationCallbacks); - } - } - #endif - - return result; -} - -MA_API void ma_engine_uninit(ma_engine* pEngine) -{ - ma_uint32 iListener; - - if (pEngine == NULL) { - return; - } - - /* The device must be uninitialized before the node graph to ensure the audio thread doesn't try accessing it. */ - #if !defined(MA_NO_DEVICE_IO) - { - if (pEngine->ownsDevice) { - ma_device_uninit(pEngine->pDevice); - ma_free(pEngine->pDevice, &pEngine->allocationCallbacks); - } else { - if (pEngine->pDevice != NULL) { - ma_device_stop(pEngine->pDevice); - } - } - } - #endif - - /* - All inlined sounds need to be deleted. I'm going to use a lock here just to future proof in case - I want to do some kind of garbage collection later on. - */ - ma_spinlock_lock(&pEngine->inlinedSoundLock); - { - for (;;) { - ma_sound_inlined* pSoundToDelete = pEngine->pInlinedSoundHead; - if (pSoundToDelete == NULL) { - break; /* Done. */ - } - - pEngine->pInlinedSoundHead = pSoundToDelete->pNext; - - ma_sound_uninit(&pSoundToDelete->sound); - ma_free(pSoundToDelete, &pEngine->allocationCallbacks); - } - } - ma_spinlock_unlock(&pEngine->inlinedSoundLock); - - for (iListener = 0; iListener < pEngine->listenerCount; iListener += 1) { - ma_spatializer_listener_uninit(&pEngine->listeners[iListener], &pEngine->allocationCallbacks); - } - - /* Make sure the node graph is uninitialized after the audio thread has been shutdown to prevent accessing of the node graph after being uninitialized. */ - ma_node_graph_uninit(&pEngine->nodeGraph, &pEngine->allocationCallbacks); - - /* Uninitialize the resource manager last to ensure we don't have a thread still trying to access it. */ -#ifndef MA_NO_RESOURCE_MANAGER - if (pEngine->ownsResourceManager) { - ma_resource_manager_uninit(pEngine->pResourceManager); - ma_free(pEngine->pResourceManager, &pEngine->allocationCallbacks); - } -#endif -} - -MA_API ma_result ma_engine_read_pcm_frames(ma_engine* pEngine, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) -{ - return ma_node_graph_read_pcm_frames(&pEngine->nodeGraph, pFramesOut, frameCount, pFramesRead); -} - -MA_API ma_node_graph* ma_engine_get_node_graph(ma_engine* pEngine) -{ - if (pEngine == NULL) { - return NULL; - } - - return &pEngine->nodeGraph; -} - -#if !defined(MA_NO_RESOURCE_MANAGER) -MA_API ma_resource_manager* ma_engine_get_resource_manager(ma_engine* pEngine) -{ - if (pEngine == NULL) { - return NULL; - } - - #if !defined(MA_NO_RESOURCE_MANAGER) - { - return pEngine->pResourceManager; - } - #else - { - return NULL; - } - #endif -} -#endif - -MA_API ma_device* ma_engine_get_device(ma_engine* pEngine) -{ - if (pEngine == NULL) { - return NULL; - } - - #if !defined(MA_NO_DEVICE_IO) - { - return pEngine->pDevice; - } - #else - { - return NULL; - } - #endif -} - -MA_API ma_log* ma_engine_get_log(ma_engine* pEngine) -{ - if (pEngine == NULL) { - return NULL; - } - - if (pEngine->pLog != NULL) { - return pEngine->pLog; - } else { - #if !defined(MA_NO_DEVICE_IO) - { - return ma_device_get_log(ma_engine_get_device(pEngine)); - } - #else - { - return NULL; - } - #endif - } -} - -MA_API ma_node* ma_engine_get_endpoint(ma_engine* pEngine) -{ - return ma_node_graph_get_endpoint(&pEngine->nodeGraph); -} - -MA_API ma_uint64 ma_engine_get_time(const ma_engine* pEngine) -{ - return ma_node_graph_get_time(&pEngine->nodeGraph); -} - -MA_API ma_result ma_engine_set_time(ma_engine* pEngine, ma_uint64 globalTime) -{ - return ma_node_graph_set_time(&pEngine->nodeGraph, globalTime); -} - -MA_API ma_uint32 ma_engine_get_channels(const ma_engine* pEngine) -{ - return ma_node_graph_get_channels(&pEngine->nodeGraph); -} - -MA_API ma_uint32 ma_engine_get_sample_rate(const ma_engine* pEngine) -{ - if (pEngine == NULL) { - return 0; - } - - return pEngine->sampleRate; -} - - -MA_API ma_result ma_engine_start(ma_engine* pEngine) -{ - ma_result result; - - if (pEngine == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_DEVICE_IO) - { - if (pEngine->pDevice != NULL) { - result = ma_device_start(pEngine->pDevice); - } else { - result = MA_INVALID_OPERATION; /* The engine is running without a device which means there's no real notion of "starting" the engine. */ - } - } - #else - { - result = MA_INVALID_OPERATION; /* Device IO is disabled, so there's no real notion of "starting" the engine. */ - } - #endif - - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_engine_stop(ma_engine* pEngine) -{ - ma_result result; - - if (pEngine == NULL) { - return MA_INVALID_ARGS; - } - - #if !defined(MA_NO_DEVICE_IO) - { - if (pEngine->pDevice != NULL) { - result = ma_device_stop(pEngine->pDevice); - } else { - result = MA_INVALID_OPERATION; /* The engine is running without a device which means there's no real notion of "stopping" the engine. */ - } - } - #else - { - result = MA_INVALID_OPERATION; /* Device IO is disabled, so there's no real notion of "stopping" the engine. */ - } - #endif - - if (result != MA_SUCCESS) { - return result; - } - - return MA_SUCCESS; -} - -MA_API ma_result ma_engine_set_volume(ma_engine* pEngine, float volume) -{ - if (pEngine == NULL) { - return MA_INVALID_ARGS; - } - - return ma_node_set_output_bus_volume(ma_node_graph_get_endpoint(&pEngine->nodeGraph), 0, volume); -} - -MA_API ma_result ma_engine_set_gain_db(ma_engine* pEngine, float gainDB) -{ - if (pEngine == NULL) { - return MA_INVALID_ARGS; - } - - return ma_node_set_output_bus_volume(ma_node_graph_get_endpoint(&pEngine->nodeGraph), 0, ma_volume_db_to_linear(gainDB)); -} - - -MA_API ma_uint32 ma_engine_get_listener_count(const ma_engine* pEngine) -{ - if (pEngine == NULL) { - return 0; - } - - return pEngine->listenerCount; -} - -MA_API ma_uint32 ma_engine_find_closest_listener(const ma_engine* pEngine, float absolutePosX, float absolutePosY, float absolutePosZ) -{ - ma_uint32 iListener; - ma_uint32 iListenerClosest; - float closestLen2 = MA_FLT_MAX; - - if (pEngine == NULL || pEngine->listenerCount == 1) { - return 0; - } - - iListenerClosest = 0; - for (iListener = 0; iListener < pEngine->listenerCount; iListener += 1) { - if (ma_engine_listener_is_enabled(pEngine, iListener)) { - float len2 = ma_vec3f_len2(ma_vec3f_sub(pEngine->listeners[iListener].position, ma_vec3f_init_3f(absolutePosX, absolutePosY, absolutePosZ))); - if (closestLen2 > len2) { - closestLen2 = len2; - iListenerClosest = iListener; - } - } - } - - MA_ASSERT(iListenerClosest < 255); - return iListenerClosest; -} - -MA_API void ma_engine_listener_set_position(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return; - } - - ma_spatializer_listener_set_position(&pEngine->listeners[listenerIndex], x, y, z); -} - -MA_API ma_vec3f ma_engine_listener_get_position(const ma_engine* pEngine, ma_uint32 listenerIndex) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return ma_spatializer_listener_get_position(&pEngine->listeners[listenerIndex]); -} - -MA_API void ma_engine_listener_set_direction(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return; - } - - ma_spatializer_listener_set_direction(&pEngine->listeners[listenerIndex], x, y, z); -} - -MA_API ma_vec3f ma_engine_listener_get_direction(const ma_engine* pEngine, ma_uint32 listenerIndex) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return ma_vec3f_init_3f(0, 0, -1); - } - - return ma_spatializer_listener_get_direction(&pEngine->listeners[listenerIndex]); -} - -MA_API void ma_engine_listener_set_velocity(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return; - } - - ma_spatializer_listener_set_velocity(&pEngine->listeners[listenerIndex], x, y, z); -} - -MA_API ma_vec3f ma_engine_listener_get_velocity(const ma_engine* pEngine, ma_uint32 listenerIndex) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return ma_spatializer_listener_get_velocity(&pEngine->listeners[listenerIndex]); -} - -MA_API void ma_engine_listener_set_cone(ma_engine* pEngine, ma_uint32 listenerIndex, float innerAngleInRadians, float outerAngleInRadians, float outerGain) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return; - } - - ma_spatializer_listener_set_cone(&pEngine->listeners[listenerIndex], innerAngleInRadians, outerAngleInRadians, outerGain); -} - -MA_API void ma_engine_listener_get_cone(const ma_engine* pEngine, ma_uint32 listenerIndex, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain) -{ - if (pInnerAngleInRadians != NULL) { - *pInnerAngleInRadians = 0; - } - - if (pOuterAngleInRadians != NULL) { - *pOuterAngleInRadians = 0; - } - - if (pOuterGain != NULL) { - *pOuterGain = 0; - } - - ma_spatializer_listener_get_cone(&pEngine->listeners[listenerIndex], pInnerAngleInRadians, pOuterAngleInRadians, pOuterGain); -} - -MA_API void ma_engine_listener_set_world_up(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return; - } - - ma_spatializer_listener_set_world_up(&pEngine->listeners[listenerIndex], x, y, z); -} - -MA_API ma_vec3f ma_engine_listener_get_world_up(const ma_engine* pEngine, ma_uint32 listenerIndex) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return ma_vec3f_init_3f(0, 1, 0); - } - - return ma_spatializer_listener_get_world_up(&pEngine->listeners[listenerIndex]); -} - -MA_API void ma_engine_listener_set_enabled(ma_engine* pEngine, ma_uint32 listenerIndex, ma_bool32 isEnabled) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return; - } - - ma_spatializer_listener_set_enabled(&pEngine->listeners[listenerIndex], isEnabled); -} - -MA_API ma_bool32 ma_engine_listener_is_enabled(const ma_engine* pEngine, ma_uint32 listenerIndex) -{ - if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) { - return MA_FALSE; - } - - return ma_spatializer_listener_is_enabled(&pEngine->listeners[listenerIndex]); -} - - -#ifndef MA_NO_RESOURCE_MANAGER -MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePath, ma_node* pNode, ma_uint32 nodeInputBusIndex) -{ - ma_result result = MA_SUCCESS; - ma_sound_inlined* pSound = NULL; - ma_sound_inlined* pNextSound = NULL; - - if (pEngine == NULL || pFilePath == NULL) { - return MA_INVALID_ARGS; - } - - /* Attach to the endpoint node if nothing is specicied. */ - if (pNode == NULL) { - pNode = ma_node_graph_get_endpoint(&pEngine->nodeGraph); - nodeInputBusIndex = 0; - } - - /* - We want to check if we can recycle an already-allocated inlined sound. Since this is just a - helper I'm not *too* concerned about performance here and I'm happy to use a lock to keep - the implementation simple. Maybe this can be optimized later if there's enough demand, but - if this function is being used it probably means the caller doesn't really care too much. - - What we do is check the atEnd flag. When this is true, we can recycle the sound. Otherwise - we just keep iterating. If we reach the end without finding a sound to recycle we just - allocate a new one. This doesn't scale well for a massive number of sounds being played - simultaneously as we don't ever actually free the sound objects. Some kind of garbage - collection routine might be valuable for this which I'll think about. - */ - ma_spinlock_lock(&pEngine->inlinedSoundLock); - { - ma_uint32 soundFlags = 0; - - for (pNextSound = pEngine->pInlinedSoundHead; pNextSound != NULL; pNextSound = pNextSound->pNext) { - if (ma_sound_at_end(&pNextSound->sound)) { - /* - The sound is at the end which means it's available for recycling. All we need to do - is uninitialize it and reinitialize it. All we're doing is recycling memory. - */ - pSound = pNextSound; - c89atomic_fetch_sub_32(&pEngine->inlinedSoundCount, 1); - break; - } - } - - if (pSound != NULL) { - /* - We actually want to detach the sound from the list here. The reason is because we want the sound - to be in a consistent state at the non-recycled case to simplify the logic below. - */ - if (pEngine->pInlinedSoundHead == pSound) { - pEngine->pInlinedSoundHead = pSound->pNext; - } - - if (pSound->pPrev != NULL) { - pSound->pPrev->pNext = pSound->pNext; - } - if (pSound->pNext != NULL) { - pSound->pNext->pPrev = pSound->pPrev; - } - - /* Now the previous sound needs to be uninitialized. */ - ma_sound_uninit(&pNextSound->sound); - } else { - /* No sound available for recycling. Allocate one now. */ - pSound = (ma_sound_inlined*)ma_malloc(sizeof(*pSound), &pEngine->allocationCallbacks); - } - - if (pSound != NULL) { /* Safety check for the allocation above. */ - /* - At this point we should have memory allocated for the inlined sound. We just need - to initialize it like a normal sound now. - */ - soundFlags |= MA_SOUND_FLAG_ASYNC; /* For inlined sounds we don't want to be sitting around waiting for stuff to load so force an async load. */ - soundFlags |= MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT; /* We want specific control over where the sound is attached in the graph. We'll attach it manually just before playing the sound. */ - soundFlags |= MA_SOUND_FLAG_NO_PITCH; /* Pitching isn't usable with inlined sounds, so disable it to save on speed. */ - soundFlags |= MA_SOUND_FLAG_NO_SPATIALIZATION; /* Not currently doing spatialization with inlined sounds, but this might actually change later. For now disable spatialization. Will be removed if we ever add support for spatialization here. */ - - result = ma_sound_init_from_file(pEngine, pFilePath, soundFlags, NULL, NULL, &pSound->sound); - if (result == MA_SUCCESS) { - /* Now attach the sound to the graph. */ - result = ma_node_attach_output_bus(pSound, 0, pNode, nodeInputBusIndex); - if (result == MA_SUCCESS) { - /* At this point the sound should be loaded and we can go ahead and add it to the list. The new item becomes the new head. */ - pSound->pNext = pEngine->pInlinedSoundHead; - pSound->pPrev = NULL; - - pEngine->pInlinedSoundHead = pSound; /* <-- This is what attaches the sound to the list. */ - if (pSound->pNext != NULL) { - pSound->pNext->pPrev = pSound; - } - } else { - ma_free(pSound, &pEngine->allocationCallbacks); - } - } else { - ma_free(pSound, &pEngine->allocationCallbacks); - } - } else { - result = MA_OUT_OF_MEMORY; - } - } - ma_spinlock_unlock(&pEngine->inlinedSoundLock); - - if (result != MA_SUCCESS) { - return result; - } - - /* Finally we can start playing the sound. */ - result = ma_sound_start(&pSound->sound); - if (result != MA_SUCCESS) { - /* Failed to start the sound. We need to mark it for recycling and return an error. */ - c89atomic_exchange_32(&pSound->sound.atEnd, MA_TRUE); - return result; - } - - c89atomic_fetch_add_32(&pEngine->inlinedSoundCount, 1); - return result; -} - -MA_API ma_result ma_engine_play_sound(ma_engine* pEngine, const char* pFilePath, ma_sound_group* pGroup) -{ - return ma_engine_play_sound_ex(pEngine, pFilePath, pGroup, 0); -} -#endif - - -static ma_result ma_sound_preinit(ma_engine* pEngine, ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pSound); - pSound->seekTarget = MA_SEEK_TARGET_NONE; - - if (pEngine == NULL) { - return MA_INVALID_ARGS; - } - - return MA_SUCCESS; -} - -static ma_result ma_sound_init_from_data_source_internal(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound) -{ - ma_result result; - ma_engine_node_config engineNodeConfig; - ma_engine_node_type type; /* Will be set to ma_engine_node_type_group if no data source is specified. */ - - /* Do not clear pSound to zero here - that's done at a higher level with ma_sound_preinit(). */ - MA_ASSERT(pEngine != NULL); - MA_ASSERT(pSound != NULL); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - pSound->pDataSource = pConfig->pDataSource; - - if (pConfig->pDataSource != NULL) { - type = ma_engine_node_type_sound; - } else { - type = ma_engine_node_type_group; - } - - /* - Sounds are engine nodes. Before we can initialize this we need to determine the channel count. - If we can't do this we need to abort. It's up to the caller to ensure they're using a data - source that provides this information upfront. - */ - engineNodeConfig = ma_engine_node_config_init(pEngine, type, pConfig->flags); - engineNodeConfig.channelsIn = pConfig->channelsIn; - engineNodeConfig.channelsOut = pConfig->channelsOut; - - /* If we're loading from a data source the input channel count needs to be the data source's native channel count. */ - if (pConfig->pDataSource != NULL) { - result = ma_data_source_get_data_format(pConfig->pDataSource, NULL, &engineNodeConfig.channelsIn, &engineNodeConfig.sampleRate, NULL, 0); - if (result != MA_SUCCESS) { - return result; /* Failed to retrieve the channel count. */ - } - - if (engineNodeConfig.channelsIn == 0) { - return MA_INVALID_OPERATION; /* Invalid channel count. */ - } - - if (engineNodeConfig.channelsOut == MA_SOUND_SOURCE_CHANNEL_COUNT) { - engineNodeConfig.channelsOut = engineNodeConfig.channelsIn; - } - } - - - /* Getting here means we should have a valid channel count and we can initialize the engine node. */ - result = ma_engine_node_init(&engineNodeConfig, &pEngine->allocationCallbacks, &pSound->engineNode); - if (result != MA_SUCCESS) { - return result; - } - - /* If no attachment is specified, attach the sound straight to the endpoint. */ - if (pConfig->pInitialAttachment == NULL) { - /* No group. Attach straight to the endpoint by default, unless the caller has requested that do not. */ - if ((pConfig->flags & MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT) == 0) { - result = ma_node_attach_output_bus(pSound, 0, ma_node_graph_get_endpoint(&pEngine->nodeGraph), 0); - } - } else { - /* An attachment is specified. Attach to it by default. The sound has only a single output bus, and the config will specify which input bus to attach to. */ - result = ma_node_attach_output_bus(pSound, 0, pConfig->pInitialAttachment, pConfig->initialAttachmentInputBusIndex); - } - - if (result != MA_SUCCESS) { - ma_engine_node_uninit(&pSound->engineNode, &pEngine->allocationCallbacks); - return result; - } - - - /* Apply initial range and looping state to the data source if applicable. */ - if (pConfig->rangeBegInPCMFrames != 0 || pConfig->rangeEndInPCMFrames != ~((ma_uint64)0)) { - ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames); - } - - if (pConfig->loopPointBegInPCMFrames != 0 || pConfig->loopPointEndInPCMFrames != ~((ma_uint64)0)) { - ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames); - } - - ma_sound_set_looping(pSound, pConfig->isLooping); - - return MA_SUCCESS; -} - -#ifndef MA_NO_RESOURCE_MANAGER -MA_API ma_result ma_sound_init_from_file_internal(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound) -{ - ma_result result = MA_SUCCESS; - ma_uint32 flags; - ma_sound_config config; - ma_resource_manager_pipeline_notifications notifications; - - /* - The engine requires knowledge of the channel count of the underlying data source before it can - initialize the sound. Therefore, we need to make the resource manager wait until initialization - of the underlying data source to be initialized so we can get access to the channel count. To - do this, the MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT is forced. - - Because we're initializing the data source before the sound, there's a chance the notification - will get triggered before this function returns. This is OK, so long as the caller is aware of - it and can avoid accessing the sound from within the notification. - */ - flags = pConfig->flags | MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT; - - pSound->pResourceManagerDataSource = (ma_resource_manager_data_source*)ma_malloc(sizeof(*pSound->pResourceManagerDataSource), &pEngine->allocationCallbacks); - if (pSound->pResourceManagerDataSource == NULL) { - return MA_OUT_OF_MEMORY; - } - - notifications = ma_resource_manager_pipeline_notifications_init(); - notifications.done.pFence = pConfig->pDoneFence; - - /* - We must wrap everything around the fence if one was specified. This ensures ma_fence_wait() does - not return prematurely before the sound has finished initializing. - */ - if (notifications.done.pFence) { ma_fence_acquire(notifications.done.pFence); } - { - ma_resource_manager_data_source_config resourceManagerDataSourceConfig = ma_resource_manager_data_source_config_init(); - resourceManagerDataSourceConfig.pFilePath = pConfig->pFilePath; - resourceManagerDataSourceConfig.pFilePathW = pConfig->pFilePathW; - resourceManagerDataSourceConfig.flags = flags; - resourceManagerDataSourceConfig.pNotifications = ¬ifications; - resourceManagerDataSourceConfig.initialSeekPointInPCMFrames = pConfig->initialSeekPointInPCMFrames; - resourceManagerDataSourceConfig.rangeBegInPCMFrames = pConfig->rangeBegInPCMFrames; - resourceManagerDataSourceConfig.rangeEndInPCMFrames = pConfig->rangeEndInPCMFrames; - resourceManagerDataSourceConfig.loopPointBegInPCMFrames = pConfig->loopPointBegInPCMFrames; - resourceManagerDataSourceConfig.loopPointEndInPCMFrames = pConfig->loopPointEndInPCMFrames; - resourceManagerDataSourceConfig.isLooping = pConfig->isLooping; - - result = ma_resource_manager_data_source_init_ex(pEngine->pResourceManager, &resourceManagerDataSourceConfig, pSound->pResourceManagerDataSource); - if (result != MA_SUCCESS) { - goto done; - } - - pSound->ownsDataSource = MA_TRUE; /* <-- Important. Not setting this will result in the resource manager data source never getting uninitialized. */ - - /* We need to use a slightly customized version of the config so we'll need to make a copy. */ - config = *pConfig; - config.pFilePath = NULL; - config.pFilePathW = NULL; - config.pDataSource = pSound->pResourceManagerDataSource; - - result = ma_sound_init_from_data_source_internal(pEngine, &config, pSound); - if (result != MA_SUCCESS) { - ma_resource_manager_data_source_uninit(pSound->pResourceManagerDataSource); - ma_free(pSound->pResourceManagerDataSource, &pEngine->allocationCallbacks); - MA_ZERO_OBJECT(pSound); - goto done; - } - } -done: - if (notifications.done.pFence) { ma_fence_release(notifications.done.pFence); } - return result; -} - -MA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound) -{ - ma_sound_config config = ma_sound_config_init(); - config.pFilePath = pFilePath; - config.flags = flags; - config.pInitialAttachment = pGroup; - config.pDoneFence = pDoneFence; - return ma_sound_init_ex(pEngine, &config, pSound); -} - -MA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound) -{ - ma_sound_config config = ma_sound_config_init(); - config.pFilePathW = pFilePath; - config.flags = flags; - config.pInitialAttachment = pGroup; - config.pDoneFence = pDoneFence; - return ma_sound_init_ex(pEngine, &config, pSound); -} - -MA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound) -{ - ma_result result; - ma_sound_config config; - - result = ma_sound_preinit(pEngine, pSound); - if (result != MA_SUCCESS) { - return result; - } - - if (pExistingSound == NULL) { - return MA_INVALID_ARGS; - } - - /* Cloning only works for data buffers (not streams) that are loaded from the resource manager. */ - if (pExistingSound->pResourceManagerDataSource == NULL) { - return MA_INVALID_OPERATION; - } - - /* - We need to make a clone of the data source. If the data source is not a data buffer (i.e. a stream) - the this will fail. - */ - pSound->pResourceManagerDataSource = (ma_resource_manager_data_source*)ma_malloc(sizeof(*pSound->pResourceManagerDataSource), &pEngine->allocationCallbacks); - if (pSound->pResourceManagerDataSource == NULL) { - return MA_OUT_OF_MEMORY; - } - - result = ma_resource_manager_data_source_init_copy(pEngine->pResourceManager, pExistingSound->pResourceManagerDataSource, pSound->pResourceManagerDataSource); - if (result != MA_SUCCESS) { - ma_free(pSound->pResourceManagerDataSource, &pEngine->allocationCallbacks); - return result; - } - - config = ma_sound_config_init(); - config.pDataSource = pSound->pResourceManagerDataSource; - config.flags = flags; - config.pInitialAttachment = pGroup; - - result = ma_sound_init_from_data_source_internal(pEngine, &config, pSound); - if (result != MA_SUCCESS) { - ma_resource_manager_data_source_uninit(pSound->pResourceManagerDataSource); - ma_free(pSound->pResourceManagerDataSource, &pEngine->allocationCallbacks); - MA_ZERO_OBJECT(pSound); - return result; - } - - return MA_SUCCESS; -} -#endif - -MA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound) -{ - ma_sound_config config = ma_sound_config_init(); - config.pDataSource = pDataSource; - config.flags = flags; - config.pInitialAttachment = pGroup; - return ma_sound_init_ex(pEngine, &config, pSound); -} - -MA_API ma_result ma_sound_init_ex(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound) -{ - ma_result result; - - result = ma_sound_preinit(pEngine, pSound); - if (result != MA_SUCCESS) { - return result; - } - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* We need to load the sound differently depending on whether or not we're loading from a file. */ -#ifndef MA_NO_RESOURCE_MANAGER - if (pConfig->pFilePath != NULL || pConfig->pFilePathW != NULL) { - return ma_sound_init_from_file_internal(pEngine, pConfig, pSound); - } else -#endif - { - /* - Getting here means we're not loading from a file. We may be loading from an already-initialized - data source, or none at all. If we aren't specifying any data source, we'll be initializing the - the equivalent to a group. ma_data_source_init_from_data_source_internal() will deal with this - for us, so no special treatment required here. - */ - return ma_sound_init_from_data_source_internal(pEngine, pConfig, pSound); - } -} - -MA_API void ma_sound_uninit(ma_sound* pSound) -{ - if (pSound == NULL) { - return; - } - - /* - Always uninitialize the node first. This ensures it's detached from the graph and does not return until it has done - so which makes thread safety beyond this point trivial. - */ - ma_engine_node_uninit(&pSound->engineNode, &pSound->engineNode.pEngine->allocationCallbacks); - - /* Once the sound is detached from the group we can guarantee that it won't be referenced by the mixer thread which means it's safe for us to destroy the data source. */ -#ifndef MA_NO_RESOURCE_MANAGER - if (pSound->ownsDataSource) { - ma_resource_manager_data_source_uninit(pSound->pResourceManagerDataSource); - ma_free(pSound->pResourceManagerDataSource, &pSound->engineNode.pEngine->allocationCallbacks); - pSound->pDataSource = NULL; - } -#else - MA_ASSERT(pSound->ownsDataSource == MA_FALSE); -#endif -} - -MA_API ma_engine* ma_sound_get_engine(const ma_sound* pSound) -{ - if (pSound == NULL) { - return NULL; - } - - return pSound->engineNode.pEngine; -} - -MA_API ma_data_source* ma_sound_get_data_source(const ma_sound* pSound) -{ - if (pSound == NULL) { - return NULL; - } - - return pSound->pDataSource; -} - -MA_API ma_result ma_sound_start(ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* If the sound is already playing, do nothing. */ - if (ma_sound_is_playing(pSound)) { - return MA_SUCCESS; - } - - /* If the sound is at the end it means we want to start from the start again. */ - if (ma_sound_at_end(pSound)) { - ma_result result = ma_data_source_seek_to_pcm_frame(pSound->pDataSource, 0); - if (result != MA_SUCCESS && result != MA_NOT_IMPLEMENTED) { - return result; /* Failed to seek back to the start. */ - } - - /* Make sure we clear the end indicator. */ - c89atomic_exchange_32(&pSound->atEnd, MA_FALSE); - } - - /* Make sure the sound is started. If there's a start delay, the sound won't actually start until the start time is reached. */ - ma_node_set_state(pSound, ma_node_state_started); - - return MA_SUCCESS; -} - -MA_API ma_result ma_sound_stop(ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* This will stop the sound immediately. Use ma_sound_set_stop_time() to stop the sound at a specific time. */ - ma_node_set_state(pSound, ma_node_state_stopped); - - return MA_SUCCESS; -} - -MA_API void ma_sound_set_volume(ma_sound* pSound, float volume) -{ - if (pSound == NULL) { - return; - } - - /* The volume is controlled via the output bus. */ - ma_node_set_output_bus_volume(pSound, 0, volume); -} - -MA_API float ma_sound_get_volume(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_node_get_output_bus_volume(pSound, 0); -} - -MA_API void ma_sound_set_pan(ma_sound* pSound, float pan) -{ - if (pSound == NULL) { - return; - } - - ma_panner_set_pan(&pSound->engineNode.panner, pan); -} - -MA_API float ma_sound_get_pan(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_panner_get_pan(&pSound->engineNode.panner); -} - -MA_API void ma_sound_set_pan_mode(ma_sound* pSound, ma_pan_mode panMode) -{ - if (pSound == NULL) { - return; - } - - ma_panner_set_mode(&pSound->engineNode.panner, panMode); -} - -MA_API ma_pan_mode ma_sound_get_pan_mode(const ma_sound* pSound) -{ - if (pSound == NULL) { - return ma_pan_mode_balance; - } - - return ma_panner_get_mode(&pSound->engineNode.panner); -} - -MA_API void ma_sound_set_pitch(ma_sound* pSound, float pitch) -{ - if (pSound == NULL) { - return; - } - - if (pitch <= 0) { - return; - } - - c89atomic_exchange_explicit_f32(&pSound->engineNode.pitch, pitch, c89atomic_memory_order_release); -} - -MA_API float ma_sound_get_pitch(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return c89atomic_load_f32(&pSound->engineNode.pitch); /* Naughty const-cast for this. */ -} - -MA_API void ma_sound_set_spatialization_enabled(ma_sound* pSound, ma_bool32 enabled) -{ - if (pSound == NULL) { - return; - } - - c89atomic_exchange_explicit_32(&pSound->engineNode.isSpatializationDisabled, !enabled, c89atomic_memory_order_release); -} - -MA_API ma_bool32 ma_sound_is_spatialization_enabled(const ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_FALSE; - } - - return ma_engine_node_is_spatialization_enabled(&pSound->engineNode); -} - -MA_API void ma_sound_set_pinned_listener_index(ma_sound* pSound, ma_uint32 listenerIndex) -{ - if (pSound == NULL || listenerIndex >= ma_engine_get_listener_count(ma_sound_get_engine(pSound))) { - return; - } - - c89atomic_exchange_explicit_32(&pSound->engineNode.pinnedListenerIndex, listenerIndex, c89atomic_memory_order_release); -} - -MA_API ma_uint32 ma_sound_get_pinned_listener_index(const ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_LISTENER_INDEX_CLOSEST; - } - - return c89atomic_load_explicit_32(&pSound->engineNode.pinnedListenerIndex, c89atomic_memory_order_acquire); -} - -MA_API ma_uint32 ma_sound_get_listener_index(const ma_sound* pSound) -{ - ma_uint32 listenerIndex; - - if (pSound == NULL) { - return 0; - } - - listenerIndex = ma_sound_get_pinned_listener_index(pSound); - if (listenerIndex == MA_LISTENER_INDEX_CLOSEST) { - ma_vec3f position = ma_sound_get_position(pSound); - return ma_engine_find_closest_listener(ma_sound_get_engine(pSound), position.x, position.y, position.z); - } - - return listenerIndex; -} - -MA_API ma_vec3f ma_sound_get_direction_to_listener(const ma_sound* pSound) -{ - ma_vec3f relativePos; - ma_engine* pEngine; - - if (pSound == NULL) { - return ma_vec3f_init_3f(0, 0, -1); - } - - pEngine = ma_sound_get_engine(pSound); - if (pEngine == NULL) { - return ma_vec3f_init_3f(0, 0, -1); - } - - ma_spatializer_get_relative_position_and_direction(&pSound->engineNode.spatializer, &pEngine->listeners[ma_sound_get_listener_index(pSound)], &relativePos, NULL); - - return ma_vec3f_normalize(ma_vec3f_neg(relativePos)); -} - -MA_API void ma_sound_set_position(ma_sound* pSound, float x, float y, float z) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_position(&pSound->engineNode.spatializer, x, y, z); -} - -MA_API ma_vec3f ma_sound_get_position(const ma_sound* pSound) -{ - if (pSound == NULL) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return ma_spatializer_get_position(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_direction(ma_sound* pSound, float x, float y, float z) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_direction(&pSound->engineNode.spatializer, x, y, z); -} - -MA_API ma_vec3f ma_sound_get_direction(const ma_sound* pSound) -{ - if (pSound == NULL) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return ma_spatializer_get_direction(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_velocity(ma_sound* pSound, float x, float y, float z) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_velocity(&pSound->engineNode.spatializer, x, y, z); -} - -MA_API ma_vec3f ma_sound_get_velocity(const ma_sound* pSound) -{ - if (pSound == NULL) { - return ma_vec3f_init_3f(0, 0, 0); - } - - return ma_spatializer_get_velocity(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_attenuation_model(ma_sound* pSound, ma_attenuation_model attenuationModel) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_attenuation_model(&pSound->engineNode.spatializer, attenuationModel); -} - -MA_API ma_attenuation_model ma_sound_get_attenuation_model(const ma_sound* pSound) -{ - if (pSound == NULL) { - return ma_attenuation_model_none; - } - - return ma_spatializer_get_attenuation_model(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_positioning(ma_sound* pSound, ma_positioning positioning) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_positioning(&pSound->engineNode.spatializer, positioning); -} - -MA_API ma_positioning ma_sound_get_positioning(const ma_sound* pSound) -{ - if (pSound == NULL) { - return ma_positioning_absolute; - } - - return ma_spatializer_get_positioning(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_rolloff(ma_sound* pSound, float rolloff) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_rolloff(&pSound->engineNode.spatializer, rolloff); -} - -MA_API float ma_sound_get_rolloff(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_spatializer_get_rolloff(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_min_gain(ma_sound* pSound, float minGain) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_min_gain(&pSound->engineNode.spatializer, minGain); -} - -MA_API float ma_sound_get_min_gain(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_spatializer_get_min_gain(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_max_gain(ma_sound* pSound, float maxGain) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_max_gain(&pSound->engineNode.spatializer, maxGain); -} - -MA_API float ma_sound_get_max_gain(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_spatializer_get_max_gain(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_min_distance(ma_sound* pSound, float minDistance) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_min_distance(&pSound->engineNode.spatializer, minDistance); -} - -MA_API float ma_sound_get_min_distance(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_spatializer_get_min_distance(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_max_distance(ma_sound* pSound, float maxDistance) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_max_distance(&pSound->engineNode.spatializer, maxDistance); -} - -MA_API float ma_sound_get_max_distance(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_spatializer_get_max_distance(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_cone(ma_sound* pSound, float innerAngleInRadians, float outerAngleInRadians, float outerGain) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_cone(&pSound->engineNode.spatializer, innerAngleInRadians, outerAngleInRadians, outerGain); -} - -MA_API void ma_sound_get_cone(const ma_sound* pSound, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain) -{ - if (pInnerAngleInRadians != NULL) { - *pInnerAngleInRadians = 0; - } - - if (pOuterAngleInRadians != NULL) { - *pOuterAngleInRadians = 0; - } - - if (pOuterGain != NULL) { - *pOuterGain = 0; - } - - ma_spatializer_get_cone(&pSound->engineNode.spatializer, pInnerAngleInRadians, pOuterAngleInRadians, pOuterGain); -} - -MA_API void ma_sound_set_doppler_factor(ma_sound* pSound, float dopplerFactor) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_doppler_factor(&pSound->engineNode.spatializer, dopplerFactor); -} - -MA_API float ma_sound_get_doppler_factor(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_spatializer_get_doppler_factor(&pSound->engineNode.spatializer); -} - -MA_API void ma_sound_set_directional_attenuation_factor(ma_sound* pSound, float directionalAttenuationFactor) -{ - if (pSound == NULL) { - return; - } - - ma_spatializer_set_directional_attenuation_factor(&pSound->engineNode.spatializer, directionalAttenuationFactor); -} - -MA_API float ma_sound_get_directional_attenuation_factor(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 1; - } - - return ma_spatializer_get_directional_attenuation_factor(&pSound->engineNode.spatializer); -} - - -MA_API void ma_sound_set_fade_in_pcm_frames(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames) -{ - if (pSound == NULL) { - return; - } - - ma_fader_set_fade(&pSound->engineNode.fader, volumeBeg, volumeEnd, fadeLengthInFrames); -} - -MA_API void ma_sound_set_fade_in_milliseconds(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds) -{ - if (pSound == NULL) { - return; - } - - ma_sound_set_fade_in_pcm_frames(pSound, volumeBeg, volumeEnd, (fadeLengthInMilliseconds * pSound->engineNode.fader.config.sampleRate) / 1000); -} - -MA_API float ma_sound_get_current_fade_volume(ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - return ma_fader_get_current_volume(&pSound->engineNode.fader); -} - -MA_API void ma_sound_set_start_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames) -{ - if (pSound == NULL) { - return; - } - - ma_node_set_state_time(pSound, ma_node_state_started, absoluteGlobalTimeInFrames); -} - -MA_API void ma_sound_set_start_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds) -{ - if (pSound == NULL) { - return; - } - - ma_sound_set_start_time_in_pcm_frames(pSound, absoluteGlobalTimeInMilliseconds * ma_engine_get_sample_rate(ma_sound_get_engine(pSound)) / 1000); -} - -MA_API void ma_sound_set_stop_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames) -{ - if (pSound == NULL) { - return; - } - - ma_node_set_state_time(pSound, ma_node_state_stopped, absoluteGlobalTimeInFrames); -} - -MA_API void ma_sound_set_stop_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds) -{ - if (pSound == NULL) { - return; - } - - ma_sound_set_stop_time_in_pcm_frames(pSound, absoluteGlobalTimeInMilliseconds * ma_engine_get_sample_rate(ma_sound_get_engine(pSound)) / 1000); -} - -MA_API ma_bool32 ma_sound_is_playing(const ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_FALSE; - } - - return ma_node_get_state_by_time(pSound, ma_engine_get_time(ma_sound_get_engine(pSound))) == ma_node_state_started; -} - -MA_API ma_uint64 ma_sound_get_time_in_pcm_frames(const ma_sound* pSound) -{ - if (pSound == NULL) { - return 0; - } - - return ma_node_get_time(pSound); -} - -MA_API void ma_sound_set_looping(ma_sound* pSound, ma_bool32 isLooping) -{ - if (pSound == NULL) { - return; - } - - /* Looping is only a valid concept if the sound is backed by a data source. */ - if (pSound->pDataSource == NULL) { - return; - } - - /* The looping state needs to be applied to the data source in order for any looping to actually happen. */ - ma_data_source_set_looping(pSound->pDataSource, isLooping); -} - -MA_API ma_bool32 ma_sound_is_looping(const ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_FALSE; - } - - /* There is no notion of looping for sounds that are not backed by a data source. */ - if (pSound->pDataSource == NULL) { - return MA_FALSE; - } - - return ma_data_source_is_looping(pSound->pDataSource); -} - -MA_API ma_bool32 ma_sound_at_end(const ma_sound* pSound) -{ - if (pSound == NULL) { - return MA_FALSE; - } - - /* There is no notion of an end of a sound if it's not backed by a data source. */ - if (pSound->pDataSource == NULL) { - return MA_FALSE; - } - - return c89atomic_load_32(&pSound->atEnd); -} - -MA_API ma_result ma_sound_seek_to_pcm_frame(ma_sound* pSound, ma_uint64 frameIndex) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* Seeking is only valid for sounds that are backed by a data source. */ - if (pSound->pDataSource == NULL) { - return MA_INVALID_OPERATION; - } - - /* We can't be seeking while reading at the same time. We just set the seek target and get the mixing thread to do the actual seek. */ - c89atomic_exchange_64(&pSound->seekTarget, frameIndex); - - return MA_SUCCESS; -} - -MA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* The data format is retrieved directly from the data source if the sound is backed by one. Otherwise we pull it from the node. */ - if (pSound->pDataSource == NULL) { - ma_uint32 channels; - - if (pFormat != NULL) { - *pFormat = ma_format_f32; - } - - channels = ma_node_get_input_channels(&pSound->engineNode, 0); - if (pChannels != NULL) { - *pChannels = channels; - } - - if (pSampleRate != NULL) { - *pSampleRate = pSound->engineNode.resampler.config.sampleRateIn; - } - - if (pChannelMap != NULL) { - ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channels); - } - - return MA_SUCCESS; - } else { - return ma_data_source_get_data_format(pSound->pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap); - } -} - -MA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* pCursor) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* The notion of a cursor is only valid for sounds that are backed by a data source. */ - if (pSound->pDataSource == NULL) { - return MA_INVALID_OPERATION; - } - - return ma_data_source_get_cursor_in_pcm_frames(pSound->pDataSource, pCursor); -} - -MA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* pLength) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* The notion of a sound length is only valid for sounds that are backed by a data source. */ - if (pSound->pDataSource == NULL) { - return MA_INVALID_OPERATION; - } - - return ma_data_source_get_length_in_pcm_frames(pSound->pDataSource, pLength); -} - -MA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* The notion of a cursor is only valid for sounds that are backed by a data source. */ - if (pSound->pDataSource == NULL) { - return MA_INVALID_OPERATION; - } - - return ma_data_source_get_cursor_in_seconds(pSound->pDataSource, pCursor); -} - -MA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength) -{ - if (pSound == NULL) { - return MA_INVALID_ARGS; - } - - /* The notion of a sound length is only valid for sounds that are backed by a data source. */ - if (pSound->pDataSource == NULL) { - return MA_INVALID_OPERATION; - } - - return ma_data_source_get_length_in_seconds(pSound->pDataSource, pLength); -} - - -MA_API ma_result ma_sound_group_init(ma_engine* pEngine, ma_uint32 flags, ma_sound_group* pParentGroup, ma_sound_group* pGroup) -{ - ma_sound_group_config config = ma_sound_group_config_init(); - config.flags = flags; - config.pInitialAttachment = pParentGroup; - return ma_sound_group_init_ex(pEngine, &config, pGroup); -} - -MA_API ma_result ma_sound_group_init_ex(ma_engine* pEngine, const ma_sound_group_config* pConfig, ma_sound_group* pGroup) -{ - ma_sound_config soundConfig; - - if (pGroup == NULL) { - return MA_INVALID_ARGS; - } - - MA_ZERO_OBJECT(pGroup); - - if (pConfig == NULL) { - return MA_INVALID_ARGS; - } - - /* A sound group is just a sound without a data source. */ - soundConfig = *pConfig; - soundConfig.pFilePath = NULL; - soundConfig.pFilePathW = NULL; - soundConfig.pDataSource = NULL; - - /* - Groups need to have spatialization disabled by default because I think it'll be pretty rare - that programs will want to spatialize groups (but not unheard of). Certainly it feels like - disabling this by default feels like the right option. Spatialization can be enabled with a - call to ma_sound_group_set_spatialization_enabled(). - */ - soundConfig.flags |= MA_SOUND_FLAG_NO_SPATIALIZATION; - - return ma_sound_init_ex(pEngine, &soundConfig, pGroup); -} - -MA_API void ma_sound_group_uninit(ma_sound_group* pGroup) -{ - ma_sound_uninit(pGroup); -} - -MA_API ma_engine* ma_sound_group_get_engine(const ma_sound_group* pGroup) -{ - return ma_sound_get_engine(pGroup); -} - -MA_API ma_result ma_sound_group_start(ma_sound_group* pGroup) -{ - return ma_sound_start(pGroup); -} - -MA_API ma_result ma_sound_group_stop(ma_sound_group* pGroup) -{ - return ma_sound_stop(pGroup); -} - -MA_API void ma_sound_group_set_volume(ma_sound_group* pGroup, float volume) -{ - ma_sound_set_volume(pGroup, volume); -} - -MA_API float ma_sound_group_get_volume(const ma_sound_group* pGroup) -{ - return ma_sound_get_volume(pGroup); -} - -MA_API void ma_sound_group_set_pan(ma_sound_group* pGroup, float pan) -{ - ma_sound_set_pan(pGroup, pan); -} - -MA_API float ma_sound_group_get_pan(const ma_sound_group* pGroup) -{ - return ma_sound_get_pan(pGroup); -} - -MA_API void ma_sound_group_set_pan_mode(ma_sound_group* pGroup, ma_pan_mode panMode) -{ - ma_sound_set_pan_mode(pGroup, panMode); -} - -MA_API ma_pan_mode ma_sound_group_get_pan_mode(const ma_sound_group* pGroup) -{ - return ma_sound_get_pan_mode(pGroup); -} - -MA_API void ma_sound_group_set_pitch(ma_sound_group* pGroup, float pitch) -{ - ma_sound_set_pitch(pGroup, pitch); -} - -MA_API float ma_sound_group_get_pitch(const ma_sound_group* pGroup) -{ - return ma_sound_get_pitch(pGroup); -} - -MA_API void ma_sound_group_set_spatialization_enabled(ma_sound_group* pGroup, ma_bool32 enabled) -{ - ma_sound_set_spatialization_enabled(pGroup, enabled); -} - -MA_API ma_bool32 ma_sound_group_is_spatialization_enabled(const ma_sound_group* pGroup) -{ - return ma_sound_is_spatialization_enabled(pGroup); -} - -MA_API void ma_sound_group_set_pinned_listener_index(ma_sound_group* pGroup, ma_uint32 listenerIndex) -{ - ma_sound_set_pinned_listener_index(pGroup, listenerIndex); -} - -MA_API ma_uint32 ma_sound_group_get_pinned_listener_index(const ma_sound_group* pGroup) -{ - return ma_sound_get_pinned_listener_index(pGroup); -} - -MA_API ma_uint32 ma_sound_group_get_listener_index(const ma_sound_group* pGroup) -{ - return ma_sound_get_listener_index(pGroup); -} - -MA_API ma_vec3f ma_sound_group_get_direction_to_listener(const ma_sound_group* pGroup) -{ - return ma_sound_get_direction_to_listener(pGroup); -} - -MA_API void ma_sound_group_set_position(ma_sound_group* pGroup, float x, float y, float z) -{ - ma_sound_set_position(pGroup, x, y, z); -} - -MA_API ma_vec3f ma_sound_group_get_position(const ma_sound_group* pGroup) -{ - return ma_sound_get_position(pGroup); -} - -MA_API void ma_sound_group_set_direction(ma_sound_group* pGroup, float x, float y, float z) -{ - ma_sound_set_direction(pGroup, x, y, z); -} - -MA_API ma_vec3f ma_sound_group_get_direction(const ma_sound_group* pGroup) -{ - return ma_sound_get_direction(pGroup); -} - -MA_API void ma_sound_group_set_velocity(ma_sound_group* pGroup, float x, float y, float z) -{ - ma_sound_set_velocity(pGroup, x, y, z); -} - -MA_API ma_vec3f ma_sound_group_get_velocity(const ma_sound_group* pGroup) -{ - return ma_sound_get_velocity(pGroup); -} - -MA_API void ma_sound_group_set_attenuation_model(ma_sound_group* pGroup, ma_attenuation_model attenuationModel) -{ - ma_sound_set_attenuation_model(pGroup, attenuationModel); -} - -MA_API ma_attenuation_model ma_sound_group_get_attenuation_model(const ma_sound_group* pGroup) -{ - return ma_sound_get_attenuation_model(pGroup); -} - -MA_API void ma_sound_group_set_positioning(ma_sound_group* pGroup, ma_positioning positioning) -{ - ma_sound_set_positioning(pGroup, positioning); -} - -MA_API ma_positioning ma_sound_group_get_positioning(const ma_sound_group* pGroup) -{ - return ma_sound_get_positioning(pGroup); -} - -MA_API void ma_sound_group_set_rolloff(ma_sound_group* pGroup, float rolloff) -{ - ma_sound_set_rolloff(pGroup, rolloff); -} - -MA_API float ma_sound_group_get_rolloff(const ma_sound_group* pGroup) -{ - return ma_sound_get_rolloff(pGroup); -} - -MA_API void ma_sound_group_set_min_gain(ma_sound_group* pGroup, float minGain) -{ - ma_sound_set_min_gain(pGroup, minGain); -} - -MA_API float ma_sound_group_get_min_gain(const ma_sound_group* pGroup) -{ - return ma_sound_get_min_gain(pGroup); -} - -MA_API void ma_sound_group_set_max_gain(ma_sound_group* pGroup, float maxGain) -{ - ma_sound_set_max_gain(pGroup, maxGain); -} - -MA_API float ma_sound_group_get_max_gain(const ma_sound_group* pGroup) -{ - return ma_sound_get_max_gain(pGroup); -} - -MA_API void ma_sound_group_set_min_distance(ma_sound_group* pGroup, float minDistance) -{ - ma_sound_set_min_distance(pGroup, minDistance); -} - -MA_API float ma_sound_group_get_min_distance(const ma_sound_group* pGroup) -{ - return ma_sound_get_min_distance(pGroup); -} - -MA_API void ma_sound_group_set_max_distance(ma_sound_group* pGroup, float maxDistance) -{ - ma_sound_set_max_distance(pGroup, maxDistance); -} - -MA_API float ma_sound_group_get_max_distance(const ma_sound_group* pGroup) -{ - return ma_sound_get_max_distance(pGroup); -} - -MA_API void ma_sound_group_set_cone(ma_sound_group* pGroup, float innerAngleInRadians, float outerAngleInRadians, float outerGain) -{ - ma_sound_set_cone(pGroup, innerAngleInRadians, outerAngleInRadians, outerGain); -} - -MA_API void ma_sound_group_get_cone(const ma_sound_group* pGroup, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain) -{ - ma_sound_get_cone(pGroup, pInnerAngleInRadians, pOuterAngleInRadians, pOuterGain); -} - -MA_API void ma_sound_group_set_doppler_factor(ma_sound_group* pGroup, float dopplerFactor) -{ - ma_sound_set_doppler_factor(pGroup, dopplerFactor); -} - -MA_API float ma_sound_group_get_doppler_factor(const ma_sound_group* pGroup) -{ - return ma_sound_get_doppler_factor(pGroup); -} - -MA_API void ma_sound_group_set_directional_attenuation_factor(ma_sound_group* pGroup, float directionalAttenuationFactor) -{ - ma_sound_set_directional_attenuation_factor(pGroup, directionalAttenuationFactor); -} - -MA_API float ma_sound_group_get_directional_attenuation_factor(const ma_sound_group* pGroup) -{ - return ma_sound_get_directional_attenuation_factor(pGroup); -} - -MA_API void ma_sound_group_set_fade_in_pcm_frames(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames) -{ - ma_sound_set_fade_in_pcm_frames(pGroup, volumeBeg, volumeEnd, fadeLengthInFrames); -} - -MA_API void ma_sound_group_set_fade_in_milliseconds(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds) -{ - ma_sound_set_fade_in_milliseconds(pGroup, volumeBeg, volumeEnd, fadeLengthInMilliseconds); -} - -MA_API float ma_sound_group_get_current_fade_volume(ma_sound_group* pGroup) -{ - return ma_sound_get_current_fade_volume(pGroup); -} - -MA_API void ma_sound_group_set_start_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames) -{ - ma_sound_set_start_time_in_pcm_frames(pGroup, absoluteGlobalTimeInFrames); -} - -MA_API void ma_sound_group_set_start_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds) -{ - ma_sound_set_start_time_in_milliseconds(pGroup, absoluteGlobalTimeInMilliseconds); -} - -MA_API void ma_sound_group_set_stop_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames) -{ - ma_sound_set_stop_time_in_pcm_frames(pGroup, absoluteGlobalTimeInFrames); -} - -MA_API void ma_sound_group_set_stop_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds) -{ - ma_sound_set_stop_time_in_milliseconds(pGroup, absoluteGlobalTimeInMilliseconds); -} - -MA_API ma_bool32 ma_sound_group_is_playing(const ma_sound_group* pGroup) -{ - return ma_sound_is_playing(pGroup); -} - -MA_API ma_uint64 ma_sound_group_get_time_in_pcm_frames(const ma_sound_group* pGroup) -{ - return ma_sound_get_time_in_pcm_frames(pGroup); -} -#endif /* MA_NO_ENGINE */ - - - -/************************************************************************************************************************************************************** -*************************************************************************************************************************************************************** - -Auto Generated -============== -All code below is auto-generated from a tool. This mostly consists of decoding backend implementations such as dr_wav, dr_flac, etc. If you find a bug in the -code below please report the bug to the respective repository for the relevant project (probably dr_libs). - -*************************************************************************************************************************************************************** -**************************************************************************************************************************************************************/ -#if !defined(MA_NO_WAV) && (!defined(MA_NO_DECODING) || !defined(MA_NO_ENCODING)) -#if !defined(DR_WAV_IMPLEMENTATION) && !defined(DRWAV_IMPLEMENTATION) /* For backwards compatibility. Will be removed in version 0.11 for cleanliness. */ -/* dr_wav_c begin */ -#ifndef dr_wav_c -#define dr_wav_c -#include -#include -#include -#ifndef DR_WAV_NO_STDIO -#include -#include -#endif -#ifndef DRWAV_ASSERT -#include -#define DRWAV_ASSERT(expression) assert(expression) -#endif -#ifndef DRWAV_MALLOC -#define DRWAV_MALLOC(sz) malloc((sz)) -#endif -#ifndef DRWAV_REALLOC -#define DRWAV_REALLOC(p, sz) realloc((p), (sz)) -#endif -#ifndef DRWAV_FREE -#define DRWAV_FREE(p) free((p)) -#endif -#ifndef DRWAV_COPY_MEMORY -#define DRWAV_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) -#endif -#ifndef DRWAV_ZERO_MEMORY -#define DRWAV_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) -#endif -#ifndef DRWAV_ZERO_OBJECT -#define DRWAV_ZERO_OBJECT(p) DRWAV_ZERO_MEMORY((p), sizeof(*p)) -#endif -#define drwav_countof(x) (sizeof(x) / sizeof(x[0])) -#define drwav_align(x, a) ((((x) + (a) - 1) / (a)) * (a)) -#define drwav_min(a, b) (((a) < (b)) ? (a) : (b)) -#define drwav_max(a, b) (((a) > (b)) ? (a) : (b)) -#define drwav_clamp(x, lo, hi) (drwav_max((lo), drwav_min((hi), (x)))) -#define drwav_offset_ptr(p, offset) (((drwav_uint8*)(p)) + (offset)) -#define DRWAV_MAX_SIMD_VECTOR_SIZE 64 -#if defined(__x86_64__) || defined(_M_X64) - #define DRWAV_X64 -#elif defined(__i386) || defined(_M_IX86) - #define DRWAV_X86 -#elif defined(__arm__) || defined(_M_ARM) - #define DRWAV_ARM -#endif -#ifdef _MSC_VER - #define DRWAV_INLINE __forceinline -#elif defined(__GNUC__) - #if defined(__STRICT_ANSI__) - #define DRWAV_GNUC_INLINE_HINT __inline__ - #else - #define DRWAV_GNUC_INLINE_HINT inline - #endif - #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__) - #define DRWAV_INLINE DRWAV_GNUC_INLINE_HINT __attribute__((always_inline)) - #else - #define DRWAV_INLINE DRWAV_GNUC_INLINE_HINT - #endif -#elif defined(__WATCOMC__) - #define DRWAV_INLINE __inline -#else - #define DRWAV_INLINE -#endif -#if defined(SIZE_MAX) - #define DRWAV_SIZE_MAX SIZE_MAX -#else - #if defined(_WIN64) || defined(_LP64) || defined(__LP64__) - #define DRWAV_SIZE_MAX ((drwav_uint64)0xFFFFFFFFFFFFFFFF) - #else - #define DRWAV_SIZE_MAX 0xFFFFFFFF - #endif -#endif -#if defined(_MSC_VER) && _MSC_VER >= 1400 - #define DRWAV_HAS_BYTESWAP16_INTRINSIC - #define DRWAV_HAS_BYTESWAP32_INTRINSIC - #define DRWAV_HAS_BYTESWAP64_INTRINSIC -#elif defined(__clang__) - #if defined(__has_builtin) - #if __has_builtin(__builtin_bswap16) - #define DRWAV_HAS_BYTESWAP16_INTRINSIC - #endif - #if __has_builtin(__builtin_bswap32) - #define DRWAV_HAS_BYTESWAP32_INTRINSIC - #endif - #if __has_builtin(__builtin_bswap64) - #define DRWAV_HAS_BYTESWAP64_INTRINSIC - #endif - #endif -#elif defined(__GNUC__) - #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define DRWAV_HAS_BYTESWAP32_INTRINSIC - #define DRWAV_HAS_BYTESWAP64_INTRINSIC - #endif - #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) - #define DRWAV_HAS_BYTESWAP16_INTRINSIC - #endif -#endif -DRWAV_API void drwav_version(drwav_uint32* pMajor, drwav_uint32* pMinor, drwav_uint32* pRevision) -{ - if (pMajor) { - *pMajor = DRWAV_VERSION_MAJOR; - } - if (pMinor) { - *pMinor = DRWAV_VERSION_MINOR; - } - if (pRevision) { - *pRevision = DRWAV_VERSION_REVISION; - } -} -DRWAV_API const char* drwav_version_string(void) -{ - return DRWAV_VERSION_STRING; -} -#ifndef DRWAV_MAX_SAMPLE_RATE -#define DRWAV_MAX_SAMPLE_RATE 384000 -#endif -#ifndef DRWAV_MAX_CHANNELS -#define DRWAV_MAX_CHANNELS 256 -#endif -#ifndef DRWAV_MAX_BITS_PER_SAMPLE -#define DRWAV_MAX_BITS_PER_SAMPLE 64 -#endif -static const drwav_uint8 drwavGUID_W64_RIFF[16] = {0x72,0x69,0x66,0x66, 0x2E,0x91, 0xCF,0x11, 0xA5,0xD6, 0x28,0xDB,0x04,0xC1,0x00,0x00}; -static const drwav_uint8 drwavGUID_W64_WAVE[16] = {0x77,0x61,0x76,0x65, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; -static const drwav_uint8 drwavGUID_W64_FMT [16] = {0x66,0x6D,0x74,0x20, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; -static const drwav_uint8 drwavGUID_W64_FACT[16] = {0x66,0x61,0x63,0x74, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; -static const drwav_uint8 drwavGUID_W64_DATA[16] = {0x64,0x61,0x74,0x61, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; -static DRWAV_INLINE int drwav__is_little_endian(void) -{ -#if defined(DRWAV_X86) || defined(DRWAV_X64) - return DRWAV_TRUE; -#elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN - return DRWAV_TRUE; -#else - int n = 1; - return (*(char*)&n) == 1; -#endif -} -static DRWAV_INLINE void drwav_bytes_to_guid(const drwav_uint8* data, drwav_uint8* guid) -{ - int i; - for (i = 0; i < 16; ++i) { - guid[i] = data[i]; - } -} -static DRWAV_INLINE drwav_uint16 drwav__bswap16(drwav_uint16 n) -{ -#ifdef DRWAV_HAS_BYTESWAP16_INTRINSIC - #if defined(_MSC_VER) - return _byteswap_ushort(n); - #elif defined(__GNUC__) || defined(__clang__) - return __builtin_bswap16(n); - #else - #error "This compiler does not support the byte swap intrinsic." - #endif -#else - return ((n & 0xFF00) >> 8) | - ((n & 0x00FF) << 8); -#endif -} -static DRWAV_INLINE drwav_uint32 drwav__bswap32(drwav_uint32 n) -{ -#ifdef DRWAV_HAS_BYTESWAP32_INTRINSIC - #if defined(_MSC_VER) - return _byteswap_ulong(n); - #elif defined(__GNUC__) || defined(__clang__) - #if defined(DRWAV_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(DRWAV_64BIT) - drwav_uint32 r; - __asm__ __volatile__ ( - #if defined(DRWAV_64BIT) - "rev %w[out], %w[in]" : [out]"=r"(r) : [in]"r"(n) - #else - "rev %[out], %[in]" : [out]"=r"(r) : [in]"r"(n) - #endif - ); - return r; - #else - return __builtin_bswap32(n); - #endif - #else - #error "This compiler does not support the byte swap intrinsic." - #endif -#else - return ((n & 0xFF000000) >> 24) | - ((n & 0x00FF0000) >> 8) | - ((n & 0x0000FF00) << 8) | - ((n & 0x000000FF) << 24); -#endif -} -static DRWAV_INLINE drwav_uint64 drwav__bswap64(drwav_uint64 n) -{ -#ifdef DRWAV_HAS_BYTESWAP64_INTRINSIC - #if defined(_MSC_VER) - return _byteswap_uint64(n); - #elif defined(__GNUC__) || defined(__clang__) - return __builtin_bswap64(n); - #else - #error "This compiler does not support the byte swap intrinsic." - #endif -#else - return ((n & ((drwav_uint64)0xFF000000 << 32)) >> 56) | - ((n & ((drwav_uint64)0x00FF0000 << 32)) >> 40) | - ((n & ((drwav_uint64)0x0000FF00 << 32)) >> 24) | - ((n & ((drwav_uint64)0x000000FF << 32)) >> 8) | - ((n & ((drwav_uint64)0xFF000000 )) << 8) | - ((n & ((drwav_uint64)0x00FF0000 )) << 24) | - ((n & ((drwav_uint64)0x0000FF00 )) << 40) | - ((n & ((drwav_uint64)0x000000FF )) << 56); -#endif -} -static DRWAV_INLINE drwav_int16 drwav__bswap_s16(drwav_int16 n) -{ - return (drwav_int16)drwav__bswap16((drwav_uint16)n); -} -static DRWAV_INLINE void drwav__bswap_samples_s16(drwav_int16* pSamples, drwav_uint64 sampleCount) -{ - drwav_uint64 iSample; - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamples[iSample] = drwav__bswap_s16(pSamples[iSample]); - } -} -static DRWAV_INLINE void drwav__bswap_s24(drwav_uint8* p) -{ - drwav_uint8 t; - t = p[0]; - p[0] = p[2]; - p[2] = t; -} -static DRWAV_INLINE void drwav__bswap_samples_s24(drwav_uint8* pSamples, drwav_uint64 sampleCount) -{ - drwav_uint64 iSample; - for (iSample = 0; iSample < sampleCount; iSample += 1) { - drwav_uint8* pSample = pSamples + (iSample*3); - drwav__bswap_s24(pSample); - } -} -static DRWAV_INLINE drwav_int32 drwav__bswap_s32(drwav_int32 n) -{ - return (drwav_int32)drwav__bswap32((drwav_uint32)n); -} -static DRWAV_INLINE void drwav__bswap_samples_s32(drwav_int32* pSamples, drwav_uint64 sampleCount) -{ - drwav_uint64 iSample; - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamples[iSample] = drwav__bswap_s32(pSamples[iSample]); - } -} -static DRWAV_INLINE float drwav__bswap_f32(float n) -{ - union { - drwav_uint32 i; - float f; - } x; - x.f = n; - x.i = drwav__bswap32(x.i); - return x.f; -} -static DRWAV_INLINE void drwav__bswap_samples_f32(float* pSamples, drwav_uint64 sampleCount) -{ - drwav_uint64 iSample; - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamples[iSample] = drwav__bswap_f32(pSamples[iSample]); - } -} -static DRWAV_INLINE double drwav__bswap_f64(double n) -{ - union { - drwav_uint64 i; - double f; - } x; - x.f = n; - x.i = drwav__bswap64(x.i); - return x.f; -} -static DRWAV_INLINE void drwav__bswap_samples_f64(double* pSamples, drwav_uint64 sampleCount) -{ - drwav_uint64 iSample; - for (iSample = 0; iSample < sampleCount; iSample += 1) { - pSamples[iSample] = drwav__bswap_f64(pSamples[iSample]); - } -} -static DRWAV_INLINE void drwav__bswap_samples_pcm(void* pSamples, drwav_uint64 sampleCount, drwav_uint32 bytesPerSample) -{ - switch (bytesPerSample) - { - case 1: - { - } break; - case 2: - { - drwav__bswap_samples_s16((drwav_int16*)pSamples, sampleCount); - } break; - case 3: - { - drwav__bswap_samples_s24((drwav_uint8*)pSamples, sampleCount); - } break; - case 4: - { - drwav__bswap_samples_s32((drwav_int32*)pSamples, sampleCount); - } break; - default: - { - DRWAV_ASSERT(DRWAV_FALSE); - } break; - } -} -static DRWAV_INLINE void drwav__bswap_samples_ieee(void* pSamples, drwav_uint64 sampleCount, drwav_uint32 bytesPerSample) -{ - switch (bytesPerSample) - { - #if 0 - case 2: - { - drwav__bswap_samples_f16((drwav_float16*)pSamples, sampleCount); - } break; - #endif - case 4: - { - drwav__bswap_samples_f32((float*)pSamples, sampleCount); - } break; - case 8: - { - drwav__bswap_samples_f64((double*)pSamples, sampleCount); - } break; - default: - { - DRWAV_ASSERT(DRWAV_FALSE); - } break; - } -} -static DRWAV_INLINE void drwav__bswap_samples(void* pSamples, drwav_uint64 sampleCount, drwav_uint32 bytesPerSample, drwav_uint16 format) -{ - switch (format) - { - case DR_WAVE_FORMAT_PCM: - { - drwav__bswap_samples_pcm(pSamples, sampleCount, bytesPerSample); - } break; - case DR_WAVE_FORMAT_IEEE_FLOAT: - { - drwav__bswap_samples_ieee(pSamples, sampleCount, bytesPerSample); - } break; - case DR_WAVE_FORMAT_ALAW: - case DR_WAVE_FORMAT_MULAW: - { - drwav__bswap_samples_s16((drwav_int16*)pSamples, sampleCount); - } break; - case DR_WAVE_FORMAT_ADPCM: - case DR_WAVE_FORMAT_DVI_ADPCM: - default: - { - DRWAV_ASSERT(DRWAV_FALSE); - } break; - } -} -DRWAV_PRIVATE void* drwav__malloc_default(size_t sz, void* pUserData) -{ - (void)pUserData; - return DRWAV_MALLOC(sz); -} -DRWAV_PRIVATE void* drwav__realloc_default(void* p, size_t sz, void* pUserData) -{ - (void)pUserData; - return DRWAV_REALLOC(p, sz); -} -DRWAV_PRIVATE void drwav__free_default(void* p, void* pUserData) -{ - (void)pUserData; - DRWAV_FREE(p); -} -DRWAV_PRIVATE void* drwav__malloc_from_callbacks(size_t sz, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks == NULL) { - return NULL; - } - if (pAllocationCallbacks->onMalloc != NULL) { - return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData); - } - if (pAllocationCallbacks->onRealloc != NULL) { - return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData); - } - return NULL; -} -DRWAV_PRIVATE void* drwav__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks == NULL) { - return NULL; - } - if (pAllocationCallbacks->onRealloc != NULL) { - return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData); - } - if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) { - void* p2; - p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData); - if (p2 == NULL) { - return NULL; - } - if (p != NULL) { - DRWAV_COPY_MEMORY(p2, p, szOld); - pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); - } - return p2; - } - return NULL; -} -DRWAV_PRIVATE void drwav__free_from_callbacks(void* p, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (p == NULL || pAllocationCallbacks == NULL) { - return; - } - if (pAllocationCallbacks->onFree != NULL) { - pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); - } -} -DRWAV_PRIVATE drwav_allocation_callbacks drwav_copy_allocation_callbacks_or_defaults(const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - return *pAllocationCallbacks; - } else { - drwav_allocation_callbacks allocationCallbacks; - allocationCallbacks.pUserData = NULL; - allocationCallbacks.onMalloc = drwav__malloc_default; - allocationCallbacks.onRealloc = drwav__realloc_default; - allocationCallbacks.onFree = drwav__free_default; - return allocationCallbacks; - } -} -static DRWAV_INLINE drwav_bool32 drwav__is_compressed_format_tag(drwav_uint16 formatTag) -{ - return - formatTag == DR_WAVE_FORMAT_ADPCM || - formatTag == DR_WAVE_FORMAT_DVI_ADPCM; -} -DRWAV_PRIVATE unsigned int drwav__chunk_padding_size_riff(drwav_uint64 chunkSize) -{ - return (unsigned int)(chunkSize % 2); -} -DRWAV_PRIVATE unsigned int drwav__chunk_padding_size_w64(drwav_uint64 chunkSize) -{ - return (unsigned int)(chunkSize % 8); -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__msadpcm(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut); -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__ima(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut); -DRWAV_PRIVATE drwav_bool32 drwav_init_write__internal(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount); -DRWAV_PRIVATE drwav_result drwav__read_chunk_header(drwav_read_proc onRead, void* pUserData, drwav_container container, drwav_uint64* pRunningBytesReadOut, drwav_chunk_header* pHeaderOut) -{ - if (container == drwav_container_riff || container == drwav_container_rf64) { - drwav_uint8 sizeInBytes[4]; - if (onRead(pUserData, pHeaderOut->id.fourcc, 4) != 4) { - return DRWAV_AT_END; - } - if (onRead(pUserData, sizeInBytes, 4) != 4) { - return DRWAV_INVALID_FILE; - } - pHeaderOut->sizeInBytes = drwav_bytes_to_u32(sizeInBytes); - pHeaderOut->paddingSize = drwav__chunk_padding_size_riff(pHeaderOut->sizeInBytes); - *pRunningBytesReadOut += 8; - } else { - drwav_uint8 sizeInBytes[8]; - if (onRead(pUserData, pHeaderOut->id.guid, 16) != 16) { - return DRWAV_AT_END; - } - if (onRead(pUserData, sizeInBytes, 8) != 8) { - return DRWAV_INVALID_FILE; - } - pHeaderOut->sizeInBytes = drwav_bytes_to_u64(sizeInBytes) - 24; - pHeaderOut->paddingSize = drwav__chunk_padding_size_w64(pHeaderOut->sizeInBytes); - *pRunningBytesReadOut += 24; - } - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE drwav_bool32 drwav__seek_forward(drwav_seek_proc onSeek, drwav_uint64 offset, void* pUserData) -{ - drwav_uint64 bytesRemainingToSeek = offset; - while (bytesRemainingToSeek > 0) { - if (bytesRemainingToSeek > 0x7FFFFFFF) { - if (!onSeek(pUserData, 0x7FFFFFFF, drwav_seek_origin_current)) { - return DRWAV_FALSE; - } - bytesRemainingToSeek -= 0x7FFFFFFF; - } else { - if (!onSeek(pUserData, (int)bytesRemainingToSeek, drwav_seek_origin_current)) { - return DRWAV_FALSE; - } - bytesRemainingToSeek = 0; - } - } - return DRWAV_TRUE; -} -DRWAV_PRIVATE drwav_bool32 drwav__seek_from_start(drwav_seek_proc onSeek, drwav_uint64 offset, void* pUserData) -{ - if (offset <= 0x7FFFFFFF) { - return onSeek(pUserData, (int)offset, drwav_seek_origin_start); - } - if (!onSeek(pUserData, 0x7FFFFFFF, drwav_seek_origin_start)) { - return DRWAV_FALSE; - } - offset -= 0x7FFFFFFF; - for (;;) { - if (offset <= 0x7FFFFFFF) { - return onSeek(pUserData, (int)offset, drwav_seek_origin_current); - } - if (!onSeek(pUserData, 0x7FFFFFFF, drwav_seek_origin_current)) { - return DRWAV_FALSE; - } - offset -= 0x7FFFFFFF; - } -} -DRWAV_PRIVATE drwav_bool32 drwav__read_fmt(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, drwav_container container, drwav_uint64* pRunningBytesReadOut, drwav_fmt* fmtOut) -{ - drwav_chunk_header header; - drwav_uint8 fmt[16]; - if (drwav__read_chunk_header(onRead, pUserData, container, pRunningBytesReadOut, &header) != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - while (((container == drwav_container_riff || container == drwav_container_rf64) && !drwav_fourcc_equal(header.id.fourcc, "fmt ")) || (container == drwav_container_w64 && !drwav_guid_equal(header.id.guid, drwavGUID_W64_FMT))) { - if (!drwav__seek_forward(onSeek, header.sizeInBytes + header.paddingSize, pUserData)) { - return DRWAV_FALSE; - } - *pRunningBytesReadOut += header.sizeInBytes + header.paddingSize; - if (drwav__read_chunk_header(onRead, pUserData, container, pRunningBytesReadOut, &header) != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - } - if (container == drwav_container_riff || container == drwav_container_rf64) { - if (!drwav_fourcc_equal(header.id.fourcc, "fmt ")) { - return DRWAV_FALSE; - } - } else { - if (!drwav_guid_equal(header.id.guid, drwavGUID_W64_FMT)) { - return DRWAV_FALSE; - } - } - if (onRead(pUserData, fmt, sizeof(fmt)) != sizeof(fmt)) { - return DRWAV_FALSE; - } - *pRunningBytesReadOut += sizeof(fmt); - fmtOut->formatTag = drwav_bytes_to_u16(fmt + 0); - fmtOut->channels = drwav_bytes_to_u16(fmt + 2); - fmtOut->sampleRate = drwav_bytes_to_u32(fmt + 4); - fmtOut->avgBytesPerSec = drwav_bytes_to_u32(fmt + 8); - fmtOut->blockAlign = drwav_bytes_to_u16(fmt + 12); - fmtOut->bitsPerSample = drwav_bytes_to_u16(fmt + 14); - fmtOut->extendedSize = 0; - fmtOut->validBitsPerSample = 0; - fmtOut->channelMask = 0; - DRWAV_ZERO_MEMORY(fmtOut->subFormat, sizeof(fmtOut->subFormat)); - if (header.sizeInBytes > 16) { - drwav_uint8 fmt_cbSize[2]; - int bytesReadSoFar = 0; - if (onRead(pUserData, fmt_cbSize, sizeof(fmt_cbSize)) != sizeof(fmt_cbSize)) { - return DRWAV_FALSE; - } - *pRunningBytesReadOut += sizeof(fmt_cbSize); - bytesReadSoFar = 18; - fmtOut->extendedSize = drwav_bytes_to_u16(fmt_cbSize); - if (fmtOut->extendedSize > 0) { - if (fmtOut->formatTag == DR_WAVE_FORMAT_EXTENSIBLE) { - if (fmtOut->extendedSize != 22) { - return DRWAV_FALSE; - } - } - if (fmtOut->formatTag == DR_WAVE_FORMAT_EXTENSIBLE) { - drwav_uint8 fmtext[22]; - if (onRead(pUserData, fmtext, fmtOut->extendedSize) != fmtOut->extendedSize) { - return DRWAV_FALSE; - } - fmtOut->validBitsPerSample = drwav_bytes_to_u16(fmtext + 0); - fmtOut->channelMask = drwav_bytes_to_u32(fmtext + 2); - drwav_bytes_to_guid(fmtext + 6, fmtOut->subFormat); - } else { - if (!onSeek(pUserData, fmtOut->extendedSize, drwav_seek_origin_current)) { - return DRWAV_FALSE; - } - } - *pRunningBytesReadOut += fmtOut->extendedSize; - bytesReadSoFar += fmtOut->extendedSize; - } - if (!onSeek(pUserData, (int)(header.sizeInBytes - bytesReadSoFar), drwav_seek_origin_current)) { - return DRWAV_FALSE; - } - *pRunningBytesReadOut += (header.sizeInBytes - bytesReadSoFar); - } - if (header.paddingSize > 0) { - if (!onSeek(pUserData, header.paddingSize, drwav_seek_origin_current)) { - return DRWAV_FALSE; - } - *pRunningBytesReadOut += header.paddingSize; - } - return DRWAV_TRUE; -} -DRWAV_PRIVATE size_t drwav__on_read(drwav_read_proc onRead, void* pUserData, void* pBufferOut, size_t bytesToRead, drwav_uint64* pCursor) -{ - size_t bytesRead; - DRWAV_ASSERT(onRead != NULL); - DRWAV_ASSERT(pCursor != NULL); - bytesRead = onRead(pUserData, pBufferOut, bytesToRead); - *pCursor += bytesRead; - return bytesRead; -} -#if 0 -DRWAV_PRIVATE drwav_bool32 drwav__on_seek(drwav_seek_proc onSeek, void* pUserData, int offset, drwav_seek_origin origin, drwav_uint64* pCursor) -{ - DRWAV_ASSERT(onSeek != NULL); - DRWAV_ASSERT(pCursor != NULL); - if (!onSeek(pUserData, offset, origin)) { - return DRWAV_FALSE; - } - if (origin == drwav_seek_origin_start) { - *pCursor = offset; - } else { - *pCursor += offset; - } - return DRWAV_TRUE; -} -#endif -#define DRWAV_SMPL_BYTES 36 -#define DRWAV_SMPL_LOOP_BYTES 24 -#define DRWAV_INST_BYTES 7 -#define DRWAV_ACID_BYTES 24 -#define DRWAV_CUE_BYTES 4 -#define DRWAV_BEXT_BYTES 602 -#define DRWAV_BEXT_DESCRIPTION_BYTES 256 -#define DRWAV_BEXT_ORIGINATOR_NAME_BYTES 32 -#define DRWAV_BEXT_ORIGINATOR_REF_BYTES 32 -#define DRWAV_BEXT_RESERVED_BYTES 180 -#define DRWAV_BEXT_UMID_BYTES 64 -#define DRWAV_CUE_POINT_BYTES 24 -#define DRWAV_LIST_LABEL_OR_NOTE_BYTES 4 -#define DRWAV_LIST_LABELLED_TEXT_BYTES 20 -#define DRWAV_METADATA_ALIGNMENT 8 -typedef enum -{ - drwav__metadata_parser_stage_count, - drwav__metadata_parser_stage_read -} drwav__metadata_parser_stage; -typedef struct -{ - drwav_read_proc onRead; - drwav_seek_proc onSeek; - void *pReadSeekUserData; - drwav__metadata_parser_stage stage; - drwav_metadata *pMetadata; - drwav_uint32 metadataCount; - drwav_uint8 *pData; - drwav_uint8 *pDataCursor; - drwav_uint64 metadataCursor; - drwav_uint64 extraCapacity; -} drwav__metadata_parser; -DRWAV_PRIVATE size_t drwav__metadata_memory_capacity(drwav__metadata_parser* pParser) -{ - drwav_uint64 cap = sizeof(drwav_metadata) * (drwav_uint64)pParser->metadataCount + pParser->extraCapacity; - if (cap > DRWAV_SIZE_MAX) { - return 0; - } - return (size_t)cap; -} -DRWAV_PRIVATE drwav_uint8* drwav__metadata_get_memory(drwav__metadata_parser* pParser, size_t size, size_t align) -{ - drwav_uint8* pResult; - if (align) { - drwav_uintptr modulo = (drwav_uintptr)pParser->pDataCursor % align; - if (modulo != 0) { - pParser->pDataCursor += align - modulo; - } - } - pResult = pParser->pDataCursor; - DRWAV_ASSERT((pResult + size) <= (pParser->pData + drwav__metadata_memory_capacity(pParser))); - pParser->pDataCursor += size; - return pResult; -} -DRWAV_PRIVATE void drwav__metadata_request_extra_memory_for_stage_2(drwav__metadata_parser* pParser, size_t bytes, size_t align) -{ - size_t extra = bytes + (align ? (align - 1) : 0); - pParser->extraCapacity += extra; -} -DRWAV_PRIVATE drwav_result drwav__metadata_alloc(drwav__metadata_parser* pParser, drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pParser->extraCapacity != 0 || pParser->metadataCount != 0) { - pAllocationCallbacks->onFree(pParser->pData, pAllocationCallbacks->pUserData); - pParser->pData = (drwav_uint8*)pAllocationCallbacks->onMalloc(drwav__metadata_memory_capacity(pParser), pAllocationCallbacks->pUserData); - pParser->pDataCursor = pParser->pData; - if (pParser->pData == NULL) { - return DRWAV_OUT_OF_MEMORY; - } - pParser->pMetadata = (drwav_metadata*)drwav__metadata_get_memory(pParser, sizeof(drwav_metadata) * pParser->metadataCount, 1); - pParser->metadataCursor = 0; - } - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE size_t drwav__metadata_parser_read(drwav__metadata_parser* pParser, void* pBufferOut, size_t bytesToRead, drwav_uint64* pCursor) -{ - if (pCursor != NULL) { - return drwav__on_read(pParser->onRead, pParser->pReadSeekUserData, pBufferOut, bytesToRead, pCursor); - } else { - return pParser->onRead(pParser->pReadSeekUserData, pBufferOut, bytesToRead); - } -} -DRWAV_PRIVATE drwav_uint64 drwav__read_smpl_to_metadata_obj(drwav__metadata_parser* pParser, const drwav_chunk_header* pChunkHeader, drwav_metadata* pMetadata) -{ - drwav_uint8 smplHeaderData[DRWAV_SMPL_BYTES]; - drwav_uint64 totalBytesRead = 0; - size_t bytesJustRead = drwav__metadata_parser_read(pParser, smplHeaderData, sizeof(smplHeaderData), &totalBytesRead); - DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read); - DRWAV_ASSERT(pChunkHeader != NULL); - if (bytesJustRead == sizeof(smplHeaderData)) { - drwav_uint32 iSampleLoop; - pMetadata->type = drwav_metadata_type_smpl; - pMetadata->data.smpl.manufacturerId = drwav_bytes_to_u32(smplHeaderData + 0); - pMetadata->data.smpl.productId = drwav_bytes_to_u32(smplHeaderData + 4); - pMetadata->data.smpl.samplePeriodNanoseconds = drwav_bytes_to_u32(smplHeaderData + 8); - pMetadata->data.smpl.midiUnityNote = drwav_bytes_to_u32(smplHeaderData + 12); - pMetadata->data.smpl.midiPitchFraction = drwav_bytes_to_u32(smplHeaderData + 16); - pMetadata->data.smpl.smpteFormat = drwav_bytes_to_u32(smplHeaderData + 20); - pMetadata->data.smpl.smpteOffset = drwav_bytes_to_u32(smplHeaderData + 24); - pMetadata->data.smpl.sampleLoopCount = drwav_bytes_to_u32(smplHeaderData + 28); - pMetadata->data.smpl.samplerSpecificDataSizeInBytes = drwav_bytes_to_u32(smplHeaderData + 32); - if (pMetadata->data.smpl.sampleLoopCount == (pChunkHeader->sizeInBytes - DRWAV_SMPL_BYTES) / DRWAV_SMPL_LOOP_BYTES) { - pMetadata->data.smpl.pLoops = (drwav_smpl_loop*)drwav__metadata_get_memory(pParser, sizeof(drwav_smpl_loop) * pMetadata->data.smpl.sampleLoopCount, DRWAV_METADATA_ALIGNMENT); - for (iSampleLoop = 0; iSampleLoop < pMetadata->data.smpl.sampleLoopCount; ++iSampleLoop) { - drwav_uint8 smplLoopData[DRWAV_SMPL_LOOP_BYTES]; - bytesJustRead = drwav__metadata_parser_read(pParser, smplLoopData, sizeof(smplLoopData), &totalBytesRead); - if (bytesJustRead == sizeof(smplLoopData)) { - pMetadata->data.smpl.pLoops[iSampleLoop].cuePointId = drwav_bytes_to_u32(smplLoopData + 0); - pMetadata->data.smpl.pLoops[iSampleLoop].type = drwav_bytes_to_u32(smplLoopData + 4); - pMetadata->data.smpl.pLoops[iSampleLoop].firstSampleByteOffset = drwav_bytes_to_u32(smplLoopData + 8); - pMetadata->data.smpl.pLoops[iSampleLoop].lastSampleByteOffset = drwav_bytes_to_u32(smplLoopData + 12); - pMetadata->data.smpl.pLoops[iSampleLoop].sampleFraction = drwav_bytes_to_u32(smplLoopData + 16); - pMetadata->data.smpl.pLoops[iSampleLoop].playCount = drwav_bytes_to_u32(smplLoopData + 20); - } else { - break; - } - } - if (pMetadata->data.smpl.samplerSpecificDataSizeInBytes > 0) { - pMetadata->data.smpl.pSamplerSpecificData = drwav__metadata_get_memory(pParser, pMetadata->data.smpl.samplerSpecificDataSizeInBytes, 1); - DRWAV_ASSERT(pMetadata->data.smpl.pSamplerSpecificData != NULL); - drwav__metadata_parser_read(pParser, pMetadata->data.smpl.pSamplerSpecificData, pMetadata->data.smpl.samplerSpecificDataSizeInBytes, &totalBytesRead); - } - } - } - return totalBytesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav__read_cue_to_metadata_obj(drwav__metadata_parser* pParser, const drwav_chunk_header* pChunkHeader, drwav_metadata* pMetadata) -{ - drwav_uint8 cueHeaderSectionData[DRWAV_CUE_BYTES]; - drwav_uint64 totalBytesRead = 0; - size_t bytesJustRead = drwav__metadata_parser_read(pParser, cueHeaderSectionData, sizeof(cueHeaderSectionData), &totalBytesRead); - DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read); - if (bytesJustRead == sizeof(cueHeaderSectionData)) { - pMetadata->type = drwav_metadata_type_cue; - pMetadata->data.cue.cuePointCount = drwav_bytes_to_u32(cueHeaderSectionData); - if (pMetadata->data.cue.cuePointCount == (pChunkHeader->sizeInBytes - DRWAV_CUE_BYTES) / DRWAV_CUE_POINT_BYTES) { - pMetadata->data.cue.pCuePoints = (drwav_cue_point*)drwav__metadata_get_memory(pParser, sizeof(drwav_cue_point) * pMetadata->data.cue.cuePointCount, DRWAV_METADATA_ALIGNMENT); - DRWAV_ASSERT(pMetadata->data.cue.pCuePoints != NULL); - if (pMetadata->data.cue.cuePointCount > 0) { - drwav_uint32 iCuePoint; - for (iCuePoint = 0; iCuePoint < pMetadata->data.cue.cuePointCount; ++iCuePoint) { - drwav_uint8 cuePointData[DRWAV_CUE_POINT_BYTES]; - bytesJustRead = drwav__metadata_parser_read(pParser, cuePointData, sizeof(cuePointData), &totalBytesRead); - if (bytesJustRead == sizeof(cuePointData)) { - pMetadata->data.cue.pCuePoints[iCuePoint].id = drwav_bytes_to_u32(cuePointData + 0); - pMetadata->data.cue.pCuePoints[iCuePoint].playOrderPosition = drwav_bytes_to_u32(cuePointData + 4); - pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[0] = cuePointData[8]; - pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[1] = cuePointData[9]; - pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[2] = cuePointData[10]; - pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[3] = cuePointData[11]; - pMetadata->data.cue.pCuePoints[iCuePoint].chunkStart = drwav_bytes_to_u32(cuePointData + 12); - pMetadata->data.cue.pCuePoints[iCuePoint].blockStart = drwav_bytes_to_u32(cuePointData + 16); - pMetadata->data.cue.pCuePoints[iCuePoint].sampleByteOffset = drwav_bytes_to_u32(cuePointData + 20); - } else { - break; - } - } - } - } - } - return totalBytesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav__read_inst_to_metadata_obj(drwav__metadata_parser* pParser, drwav_metadata* pMetadata) -{ - drwav_uint8 instData[DRWAV_INST_BYTES]; - drwav_uint64 bytesRead = drwav__metadata_parser_read(pParser, instData, sizeof(instData), NULL); - DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read); - if (bytesRead == sizeof(instData)) { - pMetadata->type = drwav_metadata_type_inst; - pMetadata->data.inst.midiUnityNote = (drwav_int8)instData[0]; - pMetadata->data.inst.fineTuneCents = (drwav_int8)instData[1]; - pMetadata->data.inst.gainDecibels = (drwav_int8)instData[2]; - pMetadata->data.inst.lowNote = (drwav_int8)instData[3]; - pMetadata->data.inst.highNote = (drwav_int8)instData[4]; - pMetadata->data.inst.lowVelocity = (drwav_int8)instData[5]; - pMetadata->data.inst.highVelocity = (drwav_int8)instData[6]; - } - return bytesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav__read_acid_to_metadata_obj(drwav__metadata_parser* pParser, drwav_metadata* pMetadata) -{ - drwav_uint8 acidData[DRWAV_ACID_BYTES]; - drwav_uint64 bytesRead = drwav__metadata_parser_read(pParser, acidData, sizeof(acidData), NULL); - DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read); - if (bytesRead == sizeof(acidData)) { - pMetadata->type = drwav_metadata_type_acid; - pMetadata->data.acid.flags = drwav_bytes_to_u32(acidData + 0); - pMetadata->data.acid.midiUnityNote = drwav_bytes_to_u16(acidData + 4); - pMetadata->data.acid.reserved1 = drwav_bytes_to_u16(acidData + 6); - pMetadata->data.acid.reserved2 = drwav_bytes_to_f32(acidData + 8); - pMetadata->data.acid.numBeats = drwav_bytes_to_u32(acidData + 12); - pMetadata->data.acid.meterDenominator = drwav_bytes_to_u16(acidData + 16); - pMetadata->data.acid.meterNumerator = drwav_bytes_to_u16(acidData + 18); - pMetadata->data.acid.tempo = drwav_bytes_to_f32(acidData + 20); - } - return bytesRead; -} -DRWAV_PRIVATE size_t drwav__strlen(const char* str) -{ - size_t result = 0; - while (*str++) { - result += 1; - } - return result; -} -DRWAV_PRIVATE size_t drwav__strlen_clamped(const char* str, size_t maxToRead) -{ - size_t result = 0; - while (*str++ && result < maxToRead) { - result += 1; - } - return result; -} -DRWAV_PRIVATE char* drwav__metadata_copy_string(drwav__metadata_parser* pParser, const char* str, size_t maxToRead) -{ - size_t len = drwav__strlen_clamped(str, maxToRead); - if (len) { - char* result = (char*)drwav__metadata_get_memory(pParser, len + 1, 1); - DRWAV_ASSERT(result != NULL); - DRWAV_COPY_MEMORY(result, str, len); - result[len] = '\0'; - return result; - } else { - return NULL; - } -} -typedef struct -{ - const void* pBuffer; - size_t sizeInBytes; - size_t cursor; -} drwav_buffer_reader; -DRWAV_PRIVATE drwav_result drwav_buffer_reader_init(const void* pBuffer, size_t sizeInBytes, drwav_buffer_reader* pReader) -{ - DRWAV_ASSERT(pBuffer != NULL); - DRWAV_ASSERT(pReader != NULL); - DRWAV_ZERO_OBJECT(pReader); - pReader->pBuffer = pBuffer; - pReader->sizeInBytes = sizeInBytes; - pReader->cursor = 0; - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE const void* drwav_buffer_reader_ptr(const drwav_buffer_reader* pReader) -{ - DRWAV_ASSERT(pReader != NULL); - return drwav_offset_ptr(pReader->pBuffer, pReader->cursor); -} -DRWAV_PRIVATE drwav_result drwav_buffer_reader_seek(drwav_buffer_reader* pReader, size_t bytesToSeek) -{ - DRWAV_ASSERT(pReader != NULL); - if (pReader->cursor + bytesToSeek > pReader->sizeInBytes) { - return DRWAV_BAD_SEEK; - } - pReader->cursor += bytesToSeek; - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE drwav_result drwav_buffer_reader_read(drwav_buffer_reader* pReader, void* pDst, size_t bytesToRead, size_t* pBytesRead) -{ - drwav_result result = DRWAV_SUCCESS; - size_t bytesRemaining; - DRWAV_ASSERT(pReader != NULL); - if (pBytesRead != NULL) { - *pBytesRead = 0; - } - bytesRemaining = (pReader->sizeInBytes - pReader->cursor); - if (bytesToRead > bytesRemaining) { - bytesToRead = bytesRemaining; - } - if (pDst == NULL) { - result = drwav_buffer_reader_seek(pReader, bytesToRead); - } else { - DRWAV_COPY_MEMORY(pDst, drwav_buffer_reader_ptr(pReader), bytesToRead); - pReader->cursor += bytesToRead; - } - DRWAV_ASSERT(pReader->cursor <= pReader->sizeInBytes); - if (result == DRWAV_SUCCESS) { - if (pBytesRead != NULL) { - *pBytesRead = bytesToRead; - } - } - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE drwav_result drwav_buffer_reader_read_u16(drwav_buffer_reader* pReader, drwav_uint16* pDst) -{ - drwav_result result; - size_t bytesRead; - drwav_uint8 data[2]; - DRWAV_ASSERT(pReader != NULL); - DRWAV_ASSERT(pDst != NULL); - *pDst = 0; - result = drwav_buffer_reader_read(pReader, data, sizeof(*pDst), &bytesRead); - if (result != DRWAV_SUCCESS || bytesRead != sizeof(*pDst)) { - return result; - } - *pDst = drwav_bytes_to_u16(data); - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE drwav_result drwav_buffer_reader_read_u32(drwav_buffer_reader* pReader, drwav_uint32* pDst) -{ - drwav_result result; - size_t bytesRead; - drwav_uint8 data[4]; - DRWAV_ASSERT(pReader != NULL); - DRWAV_ASSERT(pDst != NULL); - *pDst = 0; - result = drwav_buffer_reader_read(pReader, data, sizeof(*pDst), &bytesRead); - if (result != DRWAV_SUCCESS || bytesRead != sizeof(*pDst)) { - return result; - } - *pDst = drwav_bytes_to_u32(data); - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE drwav_uint64 drwav__read_bext_to_metadata_obj(drwav__metadata_parser* pParser, drwav_metadata* pMetadata, drwav_uint64 chunkSize) -{ - drwav_uint8 bextData[DRWAV_BEXT_BYTES]; - size_t bytesRead = drwav__metadata_parser_read(pParser, bextData, sizeof(bextData), NULL); - DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read); - if (bytesRead == sizeof(bextData)) { - drwav_buffer_reader reader; - drwav_uint32 timeReferenceLow; - drwav_uint32 timeReferenceHigh; - size_t extraBytes; - pMetadata->type = drwav_metadata_type_bext; - if (drwav_buffer_reader_init(bextData, bytesRead, &reader) == DRWAV_SUCCESS) { - pMetadata->data.bext.pDescription = drwav__metadata_copy_string(pParser, (const char*)drwav_buffer_reader_ptr(&reader), DRWAV_BEXT_DESCRIPTION_BYTES); - drwav_buffer_reader_seek(&reader, DRWAV_BEXT_DESCRIPTION_BYTES); - pMetadata->data.bext.pOriginatorName = drwav__metadata_copy_string(pParser, (const char*)drwav_buffer_reader_ptr(&reader), DRWAV_BEXT_ORIGINATOR_NAME_BYTES); - drwav_buffer_reader_seek(&reader, DRWAV_BEXT_ORIGINATOR_NAME_BYTES); - pMetadata->data.bext.pOriginatorReference = drwav__metadata_copy_string(pParser, (const char*)drwav_buffer_reader_ptr(&reader), DRWAV_BEXT_ORIGINATOR_REF_BYTES); - drwav_buffer_reader_seek(&reader, DRWAV_BEXT_ORIGINATOR_REF_BYTES); - drwav_buffer_reader_read(&reader, pMetadata->data.bext.pOriginationDate, sizeof(pMetadata->data.bext.pOriginationDate), NULL); - drwav_buffer_reader_read(&reader, pMetadata->data.bext.pOriginationTime, sizeof(pMetadata->data.bext.pOriginationTime), NULL); - drwav_buffer_reader_read_u32(&reader, &timeReferenceLow); - drwav_buffer_reader_read_u32(&reader, &timeReferenceHigh); - pMetadata->data.bext.timeReference = ((drwav_uint64)timeReferenceHigh << 32) + timeReferenceLow; - drwav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.version); - pMetadata->data.bext.pUMID = drwav__metadata_get_memory(pParser, DRWAV_BEXT_UMID_BYTES, 1); - drwav_buffer_reader_read(&reader, pMetadata->data.bext.pUMID, DRWAV_BEXT_UMID_BYTES, NULL); - drwav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.loudnessValue); - drwav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.loudnessRange); - drwav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.maxTruePeakLevel); - drwav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.maxMomentaryLoudness); - drwav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.maxShortTermLoudness); - DRWAV_ASSERT((drwav_offset_ptr(drwav_buffer_reader_ptr(&reader), DRWAV_BEXT_RESERVED_BYTES)) == (bextData + DRWAV_BEXT_BYTES)); - extraBytes = (size_t)(chunkSize - DRWAV_BEXT_BYTES); - if (extraBytes > 0) { - pMetadata->data.bext.pCodingHistory = (char*)drwav__metadata_get_memory(pParser, extraBytes + 1, 1); - DRWAV_ASSERT(pMetadata->data.bext.pCodingHistory != NULL); - bytesRead += drwav__metadata_parser_read(pParser, pMetadata->data.bext.pCodingHistory, extraBytes, NULL); - pMetadata->data.bext.codingHistorySize = (drwav_uint32)drwav__strlen(pMetadata->data.bext.pCodingHistory); - } else { - pMetadata->data.bext.pCodingHistory = NULL; - pMetadata->data.bext.codingHistorySize = 0; - } - } - } - return bytesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav__read_list_label_or_note_to_metadata_obj(drwav__metadata_parser* pParser, drwav_metadata* pMetadata, drwav_uint64 chunkSize, drwav_metadata_type type) -{ - drwav_uint8 cueIDBuffer[DRWAV_LIST_LABEL_OR_NOTE_BYTES]; - drwav_uint64 totalBytesRead = 0; - size_t bytesJustRead = drwav__metadata_parser_read(pParser, cueIDBuffer, sizeof(cueIDBuffer), &totalBytesRead); - DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read); - if (bytesJustRead == sizeof(cueIDBuffer)) { - drwav_uint32 sizeIncludingNullTerminator; - pMetadata->type = type; - pMetadata->data.labelOrNote.cuePointId = drwav_bytes_to_u32(cueIDBuffer); - sizeIncludingNullTerminator = (drwav_uint32)chunkSize - DRWAV_LIST_LABEL_OR_NOTE_BYTES; - if (sizeIncludingNullTerminator > 0) { - pMetadata->data.labelOrNote.stringLength = sizeIncludingNullTerminator - 1; - pMetadata->data.labelOrNote.pString = (char*)drwav__metadata_get_memory(pParser, sizeIncludingNullTerminator, 1); - DRWAV_ASSERT(pMetadata->data.labelOrNote.pString != NULL); - drwav__metadata_parser_read(pParser, pMetadata->data.labelOrNote.pString, sizeIncludingNullTerminator, &totalBytesRead); - } else { - pMetadata->data.labelOrNote.stringLength = 0; - pMetadata->data.labelOrNote.pString = NULL; - } - } - return totalBytesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav__read_list_labelled_cue_region_to_metadata_obj(drwav__metadata_parser* pParser, drwav_metadata* pMetadata, drwav_uint64 chunkSize) -{ - drwav_uint8 buffer[DRWAV_LIST_LABELLED_TEXT_BYTES]; - drwav_uint64 totalBytesRead = 0; - size_t bytesJustRead = drwav__metadata_parser_read(pParser, buffer, sizeof(buffer), &totalBytesRead); - DRWAV_ASSERT(pParser->stage == drwav__metadata_parser_stage_read); - if (bytesJustRead == sizeof(buffer)) { - drwav_uint32 sizeIncludingNullTerminator; - pMetadata->type = drwav_metadata_type_list_labelled_cue_region; - pMetadata->data.labelledCueRegion.cuePointId = drwav_bytes_to_u32(buffer + 0); - pMetadata->data.labelledCueRegion.sampleLength = drwav_bytes_to_u32(buffer + 4); - pMetadata->data.labelledCueRegion.purposeId[0] = buffer[8]; - pMetadata->data.labelledCueRegion.purposeId[1] = buffer[9]; - pMetadata->data.labelledCueRegion.purposeId[2] = buffer[10]; - pMetadata->data.labelledCueRegion.purposeId[3] = buffer[11]; - pMetadata->data.labelledCueRegion.country = drwav_bytes_to_u16(buffer + 12); - pMetadata->data.labelledCueRegion.language = drwav_bytes_to_u16(buffer + 14); - pMetadata->data.labelledCueRegion.dialect = drwav_bytes_to_u16(buffer + 16); - pMetadata->data.labelledCueRegion.codePage = drwav_bytes_to_u16(buffer + 18); - sizeIncludingNullTerminator = (drwav_uint32)chunkSize - DRWAV_LIST_LABELLED_TEXT_BYTES; - if (sizeIncludingNullTerminator > 0) { - pMetadata->data.labelledCueRegion.stringLength = sizeIncludingNullTerminator - 1; - pMetadata->data.labelledCueRegion.pString = (char*)drwav__metadata_get_memory(pParser, sizeIncludingNullTerminator, 1); - DRWAV_ASSERT(pMetadata->data.labelledCueRegion.pString != NULL); - drwav__metadata_parser_read(pParser, pMetadata->data.labelledCueRegion.pString, sizeIncludingNullTerminator, &totalBytesRead); - } else { - pMetadata->data.labelledCueRegion.stringLength = 0; - pMetadata->data.labelledCueRegion.pString = NULL; - } - } - return totalBytesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav__metadata_process_info_text_chunk(drwav__metadata_parser* pParser, drwav_uint64 chunkSize, drwav_metadata_type type) -{ - drwav_uint64 bytesRead = 0; - drwav_uint32 stringSizeWithNullTerminator = (drwav_uint32)chunkSize; - if (pParser->stage == drwav__metadata_parser_stage_count) { - pParser->metadataCount += 1; - drwav__metadata_request_extra_memory_for_stage_2(pParser, stringSizeWithNullTerminator, 1); - } else { - drwav_metadata* pMetadata = &pParser->pMetadata[pParser->metadataCursor]; - pMetadata->type = type; - if (stringSizeWithNullTerminator > 0) { - pMetadata->data.infoText.stringLength = stringSizeWithNullTerminator - 1; - pMetadata->data.infoText.pString = (char*)drwav__metadata_get_memory(pParser, stringSizeWithNullTerminator, 1); - DRWAV_ASSERT(pMetadata->data.infoText.pString != NULL); - bytesRead = drwav__metadata_parser_read(pParser, pMetadata->data.infoText.pString, (size_t)stringSizeWithNullTerminator, NULL); - if (bytesRead == chunkSize) { - pParser->metadataCursor += 1; - } else { - } - } else { - pMetadata->data.infoText.stringLength = 0; - pMetadata->data.infoText.pString = NULL; - pParser->metadataCursor += 1; - } - } - return bytesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav__metadata_process_unknown_chunk(drwav__metadata_parser* pParser, const drwav_uint8* pChunkId, drwav_uint64 chunkSize, drwav_metadata_location location) -{ - drwav_uint64 bytesRead = 0; - if (location == drwav_metadata_location_invalid) { - return 0; - } - if (drwav_fourcc_equal(pChunkId, "data") || drwav_fourcc_equal(pChunkId, "fmt") || drwav_fourcc_equal(pChunkId, "fact")) { - return 0; - } - if (pParser->stage == drwav__metadata_parser_stage_count) { - pParser->metadataCount += 1; - drwav__metadata_request_extra_memory_for_stage_2(pParser, (size_t)chunkSize, 1); - } else { - drwav_metadata* pMetadata = &pParser->pMetadata[pParser->metadataCursor]; - pMetadata->type = drwav_metadata_type_unknown; - pMetadata->data.unknown.chunkLocation = location; - pMetadata->data.unknown.id[0] = pChunkId[0]; - pMetadata->data.unknown.id[1] = pChunkId[1]; - pMetadata->data.unknown.id[2] = pChunkId[2]; - pMetadata->data.unknown.id[3] = pChunkId[3]; - pMetadata->data.unknown.dataSizeInBytes = (drwav_uint32)chunkSize; - pMetadata->data.unknown.pData = (drwav_uint8 *)drwav__metadata_get_memory(pParser, (size_t)chunkSize, 1); - DRWAV_ASSERT(pMetadata->data.unknown.pData != NULL); - bytesRead = drwav__metadata_parser_read(pParser, pMetadata->data.unknown.pData, pMetadata->data.unknown.dataSizeInBytes, NULL); - if (bytesRead == pMetadata->data.unknown.dataSizeInBytes) { - pParser->metadataCursor += 1; - } else { - } - } - return bytesRead; -} -DRWAV_PRIVATE drwav_bool32 drwav__chunk_matches(drwav_metadata_type allowedMetadataTypes, const drwav_uint8* pChunkID, drwav_metadata_type type, const char* pID) -{ - return (allowedMetadataTypes & type) && drwav_fourcc_equal(pChunkID, pID); -} -DRWAV_PRIVATE drwav_uint64 drwav__metadata_process_chunk(drwav__metadata_parser* pParser, const drwav_chunk_header* pChunkHeader, drwav_metadata_type allowedMetadataTypes) -{ - const drwav_uint8 *pChunkID = pChunkHeader->id.fourcc; - drwav_uint64 bytesRead = 0; - if (drwav__chunk_matches(allowedMetadataTypes, pChunkID, drwav_metadata_type_smpl, "smpl")) { - if (pChunkHeader->sizeInBytes >= DRWAV_SMPL_BYTES) { - if (pParser->stage == drwav__metadata_parser_stage_count) { - drwav_uint8 buffer[4]; - size_t bytesJustRead; - if (!pParser->onSeek(pParser->pReadSeekUserData, 28, drwav_seek_origin_current)) { - return bytesRead; - } - bytesRead += 28; - bytesJustRead = drwav__metadata_parser_read(pParser, buffer, sizeof(buffer), &bytesRead); - if (bytesJustRead == sizeof(buffer)) { - drwav_uint32 loopCount = drwav_bytes_to_u32(buffer); - drwav_uint64 calculatedLoopCount; - calculatedLoopCount = (pChunkHeader->sizeInBytes - DRWAV_SMPL_BYTES) / DRWAV_SMPL_LOOP_BYTES; - if (calculatedLoopCount == loopCount) { - bytesJustRead = drwav__metadata_parser_read(pParser, buffer, sizeof(buffer), &bytesRead); - if (bytesJustRead == sizeof(buffer)) { - drwav_uint32 samplerSpecificDataSizeInBytes = drwav_bytes_to_u32(buffer); - pParser->metadataCount += 1; - drwav__metadata_request_extra_memory_for_stage_2(pParser, sizeof(drwav_smpl_loop) * loopCount, DRWAV_METADATA_ALIGNMENT); - drwav__metadata_request_extra_memory_for_stage_2(pParser, samplerSpecificDataSizeInBytes, 1); - } - } else { - } - } - } else { - bytesRead = drwav__read_smpl_to_metadata_obj(pParser, pChunkHeader, &pParser->pMetadata[pParser->metadataCursor]); - if (bytesRead == pChunkHeader->sizeInBytes) { - pParser->metadataCursor += 1; - } else { - } - } - } else { - } - } else if (drwav__chunk_matches(allowedMetadataTypes, pChunkID, drwav_metadata_type_inst, "inst")) { - if (pChunkHeader->sizeInBytes == DRWAV_INST_BYTES) { - if (pParser->stage == drwav__metadata_parser_stage_count) { - pParser->metadataCount += 1; - } else { - bytesRead = drwav__read_inst_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]); - if (bytesRead == pChunkHeader->sizeInBytes) { - pParser->metadataCursor += 1; - } else { - } - } - } else { - } - } else if (drwav__chunk_matches(allowedMetadataTypes, pChunkID, drwav_metadata_type_acid, "acid")) { - if (pChunkHeader->sizeInBytes == DRWAV_ACID_BYTES) { - if (pParser->stage == drwav__metadata_parser_stage_count) { - pParser->metadataCount += 1; - } else { - bytesRead = drwav__read_acid_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]); - if (bytesRead == pChunkHeader->sizeInBytes) { - pParser->metadataCursor += 1; - } else { - } - } - } else { - } - } else if (drwav__chunk_matches(allowedMetadataTypes, pChunkID, drwav_metadata_type_cue, "cue ")) { - if (pChunkHeader->sizeInBytes >= DRWAV_CUE_BYTES) { - if (pParser->stage == drwav__metadata_parser_stage_count) { - size_t cueCount; - pParser->metadataCount += 1; - cueCount = (size_t)(pChunkHeader->sizeInBytes - DRWAV_CUE_BYTES) / DRWAV_CUE_POINT_BYTES; - drwav__metadata_request_extra_memory_for_stage_2(pParser, sizeof(drwav_cue_point) * cueCount, DRWAV_METADATA_ALIGNMENT); - } else { - bytesRead = drwav__read_cue_to_metadata_obj(pParser, pChunkHeader, &pParser->pMetadata[pParser->metadataCursor]); - if (bytesRead == pChunkHeader->sizeInBytes) { - pParser->metadataCursor += 1; - } else { - } - } - } else { - } - } else if (drwav__chunk_matches(allowedMetadataTypes, pChunkID, drwav_metadata_type_bext, "bext")) { - if (pChunkHeader->sizeInBytes >= DRWAV_BEXT_BYTES) { - if (pParser->stage == drwav__metadata_parser_stage_count) { - char buffer[DRWAV_BEXT_DESCRIPTION_BYTES + 1]; - size_t allocSizeNeeded = DRWAV_BEXT_UMID_BYTES; - size_t bytesJustRead; - buffer[DRWAV_BEXT_DESCRIPTION_BYTES] = '\0'; - bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_DESCRIPTION_BYTES, &bytesRead); - if (bytesJustRead != DRWAV_BEXT_DESCRIPTION_BYTES) { - return bytesRead; - } - allocSizeNeeded += drwav__strlen(buffer) + 1; - buffer[DRWAV_BEXT_ORIGINATOR_NAME_BYTES] = '\0'; - bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_ORIGINATOR_NAME_BYTES, &bytesRead); - if (bytesJustRead != DRWAV_BEXT_ORIGINATOR_NAME_BYTES) { - return bytesRead; - } - allocSizeNeeded += drwav__strlen(buffer) + 1; - buffer[DRWAV_BEXT_ORIGINATOR_REF_BYTES] = '\0'; - bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_ORIGINATOR_REF_BYTES, &bytesRead); - if (bytesJustRead != DRWAV_BEXT_ORIGINATOR_REF_BYTES) { - return bytesRead; - } - allocSizeNeeded += drwav__strlen(buffer) + 1; - allocSizeNeeded += (size_t)pChunkHeader->sizeInBytes - DRWAV_BEXT_BYTES; - drwav__metadata_request_extra_memory_for_stage_2(pParser, allocSizeNeeded, 1); - pParser->metadataCount += 1; - } else { - bytesRead = drwav__read_bext_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], pChunkHeader->sizeInBytes); - if (bytesRead == pChunkHeader->sizeInBytes) { - pParser->metadataCursor += 1; - } else { - } - } - } else { - } - } else if (drwav_fourcc_equal(pChunkID, "LIST") || drwav_fourcc_equal(pChunkID, "list")) { - drwav_metadata_location listType = drwav_metadata_location_invalid; - while (bytesRead < pChunkHeader->sizeInBytes) { - drwav_uint8 subchunkId[4]; - drwav_uint8 subchunkSizeBuffer[4]; - drwav_uint64 subchunkDataSize; - drwav_uint64 subchunkBytesRead = 0; - drwav_uint64 bytesJustRead = drwav__metadata_parser_read(pParser, subchunkId, sizeof(subchunkId), &bytesRead); - if (bytesJustRead != sizeof(subchunkId)) { - break; - } - if (drwav_fourcc_equal(subchunkId, "adtl")) { - listType = drwav_metadata_location_inside_adtl_list; - continue; - } else if (drwav_fourcc_equal(subchunkId, "INFO")) { - listType = drwav_metadata_location_inside_info_list; - continue; - } - bytesJustRead = drwav__metadata_parser_read(pParser, subchunkSizeBuffer, sizeof(subchunkSizeBuffer), &bytesRead); - if (bytesJustRead != sizeof(subchunkSizeBuffer)) { - break; - } - subchunkDataSize = drwav_bytes_to_u32(subchunkSizeBuffer); - if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_label, "labl") || drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_note, "note")) { - if (subchunkDataSize >= DRWAV_LIST_LABEL_OR_NOTE_BYTES) { - drwav_uint64 stringSizeWithNullTerm = subchunkDataSize - DRWAV_LIST_LABEL_OR_NOTE_BYTES; - if (pParser->stage == drwav__metadata_parser_stage_count) { - pParser->metadataCount += 1; - drwav__metadata_request_extra_memory_for_stage_2(pParser, (size_t)stringSizeWithNullTerm, 1); - } else { - subchunkBytesRead = drwav__read_list_label_or_note_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], subchunkDataSize, drwav_fourcc_equal(subchunkId, "labl") ? drwav_metadata_type_list_label : drwav_metadata_type_list_note); - if (subchunkBytesRead == subchunkDataSize) { - pParser->metadataCursor += 1; - } else { - } - } - } else { - } - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_labelled_cue_region, "ltxt")) { - if (subchunkDataSize >= DRWAV_LIST_LABELLED_TEXT_BYTES) { - drwav_uint64 stringSizeWithNullTerminator = subchunkDataSize - DRWAV_LIST_LABELLED_TEXT_BYTES; - if (pParser->stage == drwav__metadata_parser_stage_count) { - pParser->metadataCount += 1; - drwav__metadata_request_extra_memory_for_stage_2(pParser, (size_t)stringSizeWithNullTerminator, 1); - } else { - subchunkBytesRead = drwav__read_list_labelled_cue_region_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], subchunkDataSize); - if (subchunkBytesRead == subchunkDataSize) { - pParser->metadataCursor += 1; - } else { - } - } - } else { - } - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_software, "ISFT")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_software); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_copyright, "ICOP")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_copyright); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_title, "INAM")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_title); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_artist, "IART")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_artist); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_comment, "ICMT")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_comment); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_date, "ICRD")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_date); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_genre, "IGNR")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_genre); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_album, "IPRD")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_album); - } else if (drwav__chunk_matches(allowedMetadataTypes, subchunkId, drwav_metadata_type_list_info_tracknumber, "ITRK")) { - subchunkBytesRead = drwav__metadata_process_info_text_chunk(pParser, subchunkDataSize, drwav_metadata_type_list_info_tracknumber); - } else if ((allowedMetadataTypes & drwav_metadata_type_unknown) != 0) { - subchunkBytesRead = drwav__metadata_process_unknown_chunk(pParser, subchunkId, subchunkDataSize, listType); - } - bytesRead += subchunkBytesRead; - DRWAV_ASSERT(subchunkBytesRead <= subchunkDataSize); - if (subchunkBytesRead < subchunkDataSize) { - drwav_uint64 bytesToSeek = subchunkDataSize - subchunkBytesRead; - if (!pParser->onSeek(pParser->pReadSeekUserData, (int)bytesToSeek, drwav_seek_origin_current)) { - break; - } - bytesRead += bytesToSeek; - } - if ((subchunkDataSize % 2) == 1) { - if (!pParser->onSeek(pParser->pReadSeekUserData, 1, drwav_seek_origin_current)) { - break; - } - bytesRead += 1; - } - } - } else if ((allowedMetadataTypes & drwav_metadata_type_unknown) != 0) { - bytesRead = drwav__metadata_process_unknown_chunk(pParser, pChunkID, pChunkHeader->sizeInBytes, drwav_metadata_location_top_level); - } - return bytesRead; -} -DRWAV_PRIVATE drwav_uint32 drwav_get_bytes_per_pcm_frame(drwav* pWav) -{ - drwav_uint32 bytesPerFrame; - if ((pWav->bitsPerSample & 0x7) == 0) { - bytesPerFrame = (pWav->bitsPerSample * pWav->fmt.channels) >> 3; - } else { - bytesPerFrame = pWav->fmt.blockAlign; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ALAW || pWav->translatedFormatTag == DR_WAVE_FORMAT_MULAW) { - if (bytesPerFrame != pWav->fmt.channels) { - return 0; - } - } - return bytesPerFrame; -} -DRWAV_API drwav_uint16 drwav_fmt_get_format(const drwav_fmt* pFMT) -{ - if (pFMT == NULL) { - return 0; - } - if (pFMT->formatTag != DR_WAVE_FORMAT_EXTENSIBLE) { - return pFMT->formatTag; - } else { - return drwav_bytes_to_u16(pFMT->subFormat); - } -} -DRWAV_PRIVATE drwav_bool32 drwav_preinit(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pReadSeekUserData, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pWav == NULL || onRead == NULL || onSeek == NULL) { - return DRWAV_FALSE; - } - DRWAV_ZERO_MEMORY(pWav, sizeof(*pWav)); - pWav->onRead = onRead; - pWav->onSeek = onSeek; - pWav->pUserData = pReadSeekUserData; - pWav->allocationCallbacks = drwav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks); - if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) { - return DRWAV_FALSE; - } - return DRWAV_TRUE; -} -DRWAV_PRIVATE drwav_bool32 drwav_init__internal(drwav* pWav, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags) -{ - drwav_uint64 cursor; - drwav_bool32 sequential; - drwav_uint8 riff[4]; - drwav_fmt fmt; - unsigned short translatedFormatTag; - drwav_bool32 foundDataChunk; - drwav_uint64 dataChunkSize = 0; - drwav_uint64 sampleCountFromFactChunk = 0; - drwav_uint64 chunkSize; - drwav__metadata_parser metadataParser; - cursor = 0; - sequential = (flags & DRWAV_SEQUENTIAL) != 0; - if (drwav__on_read(pWav->onRead, pWav->pUserData, riff, sizeof(riff), &cursor) != sizeof(riff)) { - return DRWAV_FALSE; - } - if (drwav_fourcc_equal(riff, "RIFF")) { - pWav->container = drwav_container_riff; - } else if (drwav_fourcc_equal(riff, "riff")) { - int i; - drwav_uint8 riff2[12]; - pWav->container = drwav_container_w64; - if (drwav__on_read(pWav->onRead, pWav->pUserData, riff2, sizeof(riff2), &cursor) != sizeof(riff2)) { - return DRWAV_FALSE; - } - for (i = 0; i < 12; ++i) { - if (riff2[i] != drwavGUID_W64_RIFF[i+4]) { - return DRWAV_FALSE; - } - } - } else if (drwav_fourcc_equal(riff, "RF64")) { - pWav->container = drwav_container_rf64; - } else { - return DRWAV_FALSE; - } - if (pWav->container == drwav_container_riff || pWav->container == drwav_container_rf64) { - drwav_uint8 chunkSizeBytes[4]; - drwav_uint8 wave[4]; - if (drwav__on_read(pWav->onRead, pWav->pUserData, chunkSizeBytes, sizeof(chunkSizeBytes), &cursor) != sizeof(chunkSizeBytes)) { - return DRWAV_FALSE; - } - if (pWav->container == drwav_container_riff) { - if (drwav_bytes_to_u32(chunkSizeBytes) < 36) { - return DRWAV_FALSE; - } - } else { - if (drwav_bytes_to_u32(chunkSizeBytes) != 0xFFFFFFFF) { - return DRWAV_FALSE; - } - } - if (drwav__on_read(pWav->onRead, pWav->pUserData, wave, sizeof(wave), &cursor) != sizeof(wave)) { - return DRWAV_FALSE; - } - if (!drwav_fourcc_equal(wave, "WAVE")) { - return DRWAV_FALSE; - } - } else { - drwav_uint8 chunkSizeBytes[8]; - drwav_uint8 wave[16]; - if (drwav__on_read(pWav->onRead, pWav->pUserData, chunkSizeBytes, sizeof(chunkSizeBytes), &cursor) != sizeof(chunkSizeBytes)) { - return DRWAV_FALSE; - } - if (drwav_bytes_to_u64(chunkSizeBytes) < 80) { - return DRWAV_FALSE; - } - if (drwav__on_read(pWav->onRead, pWav->pUserData, wave, sizeof(wave), &cursor) != sizeof(wave)) { - return DRWAV_FALSE; - } - if (!drwav_guid_equal(wave, drwavGUID_W64_WAVE)) { - return DRWAV_FALSE; - } - } - if (pWav->container == drwav_container_rf64) { - drwav_uint8 sizeBytes[8]; - drwav_uint64 bytesRemainingInChunk; - drwav_chunk_header header; - drwav_result result = drwav__read_chunk_header(pWav->onRead, pWav->pUserData, pWav->container, &cursor, &header); - if (result != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - if (!drwav_fourcc_equal(header.id.fourcc, "ds64")) { - return DRWAV_FALSE; - } - bytesRemainingInChunk = header.sizeInBytes + header.paddingSize; - if (!drwav__seek_forward(pWav->onSeek, 8, pWav->pUserData)) { - return DRWAV_FALSE; - } - bytesRemainingInChunk -= 8; - cursor += 8; - if (drwav__on_read(pWav->onRead, pWav->pUserData, sizeBytes, sizeof(sizeBytes), &cursor) != sizeof(sizeBytes)) { - return DRWAV_FALSE; - } - bytesRemainingInChunk -= 8; - dataChunkSize = drwav_bytes_to_u64(sizeBytes); - if (drwav__on_read(pWav->onRead, pWav->pUserData, sizeBytes, sizeof(sizeBytes), &cursor) != sizeof(sizeBytes)) { - return DRWAV_FALSE; - } - bytesRemainingInChunk -= 8; - sampleCountFromFactChunk = drwav_bytes_to_u64(sizeBytes); - if (!drwav__seek_forward(pWav->onSeek, bytesRemainingInChunk, pWav->pUserData)) { - return DRWAV_FALSE; - } - cursor += bytesRemainingInChunk; - } - if (!drwav__read_fmt(pWav->onRead, pWav->onSeek, pWav->pUserData, pWav->container, &cursor, &fmt)) { - return DRWAV_FALSE; - } - if ((fmt.sampleRate == 0 || fmt.sampleRate > DRWAV_MAX_SAMPLE_RATE) || - (fmt.channels == 0 || fmt.channels > DRWAV_MAX_CHANNELS) || - (fmt.bitsPerSample == 0 || fmt.bitsPerSample > DRWAV_MAX_BITS_PER_SAMPLE) || - fmt.blockAlign == 0) { - return DRWAV_FALSE; - } - translatedFormatTag = fmt.formatTag; - if (translatedFormatTag == DR_WAVE_FORMAT_EXTENSIBLE) { - translatedFormatTag = drwav_bytes_to_u16(fmt.subFormat + 0); - } - DRWAV_ZERO_MEMORY(&metadataParser, sizeof(metadataParser)); - if (!sequential && pWav->allowedMetadataTypes != drwav_metadata_type_none && (pWav->container == drwav_container_riff || pWav->container == drwav_container_rf64)) { - drwav_uint64 cursorForMetadata = cursor; - metadataParser.onRead = pWav->onRead; - metadataParser.onSeek = pWav->onSeek; - metadataParser.pReadSeekUserData = pWav->pUserData; - metadataParser.stage = drwav__metadata_parser_stage_count; - for (;;) { - drwav_result result; - drwav_uint64 bytesRead; - drwav_uint64 remainingBytes; - drwav_chunk_header header; - result = drwav__read_chunk_header(pWav->onRead, pWav->pUserData, pWav->container, &cursorForMetadata, &header); - if (result != DRWAV_SUCCESS) { - break; - } - bytesRead = drwav__metadata_process_chunk(&metadataParser, &header, pWav->allowedMetadataTypes); - DRWAV_ASSERT(bytesRead <= header.sizeInBytes); - remainingBytes = header.sizeInBytes - bytesRead + header.paddingSize; - if (!drwav__seek_forward(pWav->onSeek, remainingBytes, pWav->pUserData)) { - break; - } - cursorForMetadata += remainingBytes; - } - if (!drwav__seek_from_start(pWav->onSeek, cursor, pWav->pUserData)) { - return DRWAV_FALSE; - } - drwav__metadata_alloc(&metadataParser, &pWav->allocationCallbacks); - metadataParser.stage = drwav__metadata_parser_stage_read; - } - foundDataChunk = DRWAV_FALSE; - for (;;) { - drwav_chunk_header header; - drwav_result result = drwav__read_chunk_header(pWav->onRead, pWav->pUserData, pWav->container, &cursor, &header); - if (result != DRWAV_SUCCESS) { - if (!foundDataChunk) { - return DRWAV_FALSE; - } else { - break; - } - } - if (!sequential && onChunk != NULL) { - drwav_uint64 callbackBytesRead = onChunk(pChunkUserData, pWav->onRead, pWav->onSeek, pWav->pUserData, &header, pWav->container, &fmt); - if (callbackBytesRead > 0) { - if (!drwav__seek_from_start(pWav->onSeek, cursor, pWav->pUserData)) { - return DRWAV_FALSE; - } - } - } - if (!sequential && pWav->allowedMetadataTypes != drwav_metadata_type_none && (pWav->container == drwav_container_riff || pWav->container == drwav_container_rf64)) { - drwav_uint64 bytesRead = drwav__metadata_process_chunk(&metadataParser, &header, pWav->allowedMetadataTypes); - if (bytesRead > 0) { - if (!drwav__seek_from_start(pWav->onSeek, cursor, pWav->pUserData)) { - return DRWAV_FALSE; - } - } - } - if (!foundDataChunk) { - pWav->dataChunkDataPos = cursor; - } - chunkSize = header.sizeInBytes; - if (pWav->container == drwav_container_riff || pWav->container == drwav_container_rf64) { - if (drwav_fourcc_equal(header.id.fourcc, "data")) { - foundDataChunk = DRWAV_TRUE; - if (pWav->container != drwav_container_rf64) { - dataChunkSize = chunkSize; - } - } - } else { - if (drwav_guid_equal(header.id.guid, drwavGUID_W64_DATA)) { - foundDataChunk = DRWAV_TRUE; - dataChunkSize = chunkSize; - } - } - if (foundDataChunk && sequential) { - break; - } - if (pWav->container == drwav_container_riff) { - if (drwav_fourcc_equal(header.id.fourcc, "fact")) { - drwav_uint32 sampleCount; - if (drwav__on_read(pWav->onRead, pWav->pUserData, &sampleCount, 4, &cursor) != 4) { - return DRWAV_FALSE; - } - chunkSize -= 4; - if (!foundDataChunk) { - pWav->dataChunkDataPos = cursor; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { - sampleCountFromFactChunk = sampleCount; - } else { - sampleCountFromFactChunk = 0; - } - } - } else if (pWav->container == drwav_container_w64) { - if (drwav_guid_equal(header.id.guid, drwavGUID_W64_FACT)) { - if (drwav__on_read(pWav->onRead, pWav->pUserData, &sampleCountFromFactChunk, 8, &cursor) != 8) { - return DRWAV_FALSE; - } - chunkSize -= 8; - if (!foundDataChunk) { - pWav->dataChunkDataPos = cursor; - } - } - } else if (pWav->container == drwav_container_rf64) { - } - chunkSize += header.paddingSize; - if (!drwav__seek_forward(pWav->onSeek, chunkSize, pWav->pUserData)) { - break; - } - cursor += chunkSize; - if (!foundDataChunk) { - pWav->dataChunkDataPos = cursor; - } - } - pWav->pMetadata = metadataParser.pMetadata; - pWav->metadataCount = metadataParser.metadataCount; - if (!foundDataChunk) { - return DRWAV_FALSE; - } - if (!sequential) { - if (!drwav__seek_from_start(pWav->onSeek, pWav->dataChunkDataPos, pWav->pUserData)) { - return DRWAV_FALSE; - } - cursor = pWav->dataChunkDataPos; - } - pWav->fmt = fmt; - pWav->sampleRate = fmt.sampleRate; - pWav->channels = fmt.channels; - pWav->bitsPerSample = fmt.bitsPerSample; - pWav->bytesRemaining = dataChunkSize; - pWav->translatedFormatTag = translatedFormatTag; - pWav->dataChunkDataSize = dataChunkSize; - if (sampleCountFromFactChunk != 0) { - pWav->totalPCMFrameCount = sampleCountFromFactChunk; - } else { - drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return DRWAV_FALSE; - } - pWav->totalPCMFrameCount = dataChunkSize / bytesPerFrame; - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { - drwav_uint64 totalBlockHeaderSizeInBytes; - drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; - if ((blockCount * fmt.blockAlign) < dataChunkSize) { - blockCount += 1; - } - totalBlockHeaderSizeInBytes = blockCount * (6*fmt.channels); - pWav->totalPCMFrameCount = ((dataChunkSize - totalBlockHeaderSizeInBytes) * 2) / fmt.channels; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - drwav_uint64 totalBlockHeaderSizeInBytes; - drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; - if ((blockCount * fmt.blockAlign) < dataChunkSize) { - blockCount += 1; - } - totalBlockHeaderSizeInBytes = blockCount * (4*fmt.channels); - pWav->totalPCMFrameCount = ((dataChunkSize - totalBlockHeaderSizeInBytes) * 2) / fmt.channels; - pWav->totalPCMFrameCount += blockCount; - } - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM || pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - if (pWav->channels > 2) { - return DRWAV_FALSE; - } - } - if (drwav_get_bytes_per_pcm_frame(pWav) == 0) { - return DRWAV_FALSE; - } -#ifdef DR_WAV_LIBSNDFILE_COMPAT - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { - drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; - pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (6*pWav->channels))) * 2)) / fmt.channels; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; - pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (4*pWav->channels))) * 2) + (blockCount * pWav->channels)) / fmt.channels; - } -#endif - return DRWAV_TRUE; -} -DRWAV_API drwav_bool32 drwav_init(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_ex(pWav, onRead, onSeek, NULL, pUserData, NULL, 0, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_ex(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, drwav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (!drwav_preinit(pWav, onRead, onSeek, pReadSeekUserData, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - return drwav_init__internal(pWav, onChunk, pChunkUserData, flags); -} -DRWAV_API drwav_bool32 drwav_init_with_metadata(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (!drwav_preinit(pWav, onRead, onSeek, pUserData, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - pWav->allowedMetadataTypes = drwav_metadata_type_all_including_unknown; - return drwav_init__internal(pWav, NULL, NULL, flags); -} -DRWAV_API drwav_metadata* drwav_take_ownership_of_metadata(drwav* pWav) -{ - drwav_metadata *result = pWav->pMetadata; - pWav->pMetadata = NULL; - pWav->metadataCount = 0; - return result; -} -DRWAV_PRIVATE size_t drwav__write(drwav* pWav, const void* pData, size_t dataSize) -{ - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->onWrite != NULL); - return pWav->onWrite(pWav->pUserData, pData, dataSize); -} -DRWAV_PRIVATE size_t drwav__write_byte(drwav* pWav, drwav_uint8 byte) -{ - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->onWrite != NULL); - return pWav->onWrite(pWav->pUserData, &byte, 1); -} -DRWAV_PRIVATE size_t drwav__write_u16ne_to_le(drwav* pWav, drwav_uint16 value) -{ - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->onWrite != NULL); - if (!drwav__is_little_endian()) { - value = drwav__bswap16(value); - } - return drwav__write(pWav, &value, 2); -} -DRWAV_PRIVATE size_t drwav__write_u32ne_to_le(drwav* pWav, drwav_uint32 value) -{ - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->onWrite != NULL); - if (!drwav__is_little_endian()) { - value = drwav__bswap32(value); - } - return drwav__write(pWav, &value, 4); -} -DRWAV_PRIVATE size_t drwav__write_u64ne_to_le(drwav* pWav, drwav_uint64 value) -{ - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->onWrite != NULL); - if (!drwav__is_little_endian()) { - value = drwav__bswap64(value); - } - return drwav__write(pWav, &value, 8); -} -DRWAV_PRIVATE size_t drwav__write_f32ne_to_le(drwav* pWav, float value) -{ - union { - drwav_uint32 u32; - float f32; - } u; - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->onWrite != NULL); - u.f32 = value; - if (!drwav__is_little_endian()) { - u.u32 = drwav__bswap32(u.u32); - } - return drwav__write(pWav, &u.u32, 4); -} -DRWAV_PRIVATE size_t drwav__write_or_count(drwav* pWav, const void* pData, size_t dataSize) -{ - if (pWav == NULL) { - return dataSize; - } - return drwav__write(pWav, pData, dataSize); -} -DRWAV_PRIVATE size_t drwav__write_or_count_byte(drwav* pWav, drwav_uint8 byte) -{ - if (pWav == NULL) { - return 1; - } - return drwav__write_byte(pWav, byte); -} -DRWAV_PRIVATE size_t drwav__write_or_count_u16ne_to_le(drwav* pWav, drwav_uint16 value) -{ - if (pWav == NULL) { - return 2; - } - return drwav__write_u16ne_to_le(pWav, value); -} -DRWAV_PRIVATE size_t drwav__write_or_count_u32ne_to_le(drwav* pWav, drwav_uint32 value) -{ - if (pWav == NULL) { - return 4; - } - return drwav__write_u32ne_to_le(pWav, value); -} -#if 0 -DRWAV_PRIVATE size_t drwav__write_or_count_u64ne_to_le(drwav* pWav, drwav_uint64 value) -{ - if (pWav == NULL) { - return 8; - } - return drwav__write_u64ne_to_le(pWav, value); -} -#endif -DRWAV_PRIVATE size_t drwav__write_or_count_f32ne_to_le(drwav* pWav, float value) -{ - if (pWav == NULL) { - return 4; - } - return drwav__write_f32ne_to_le(pWav, value); -} -DRWAV_PRIVATE size_t drwav__write_or_count_string_to_fixed_size_buf(drwav* pWav, char* str, size_t bufFixedSize) -{ - size_t len; - if (pWav == NULL) { - return bufFixedSize; - } - len = drwav__strlen_clamped(str, bufFixedSize); - drwav__write_or_count(pWav, str, len); - if (len < bufFixedSize) { - size_t i; - for (i = 0; i < bufFixedSize - len; ++i) { - drwav__write_byte(pWav, 0); - } - } - return bufFixedSize; -} -DRWAV_PRIVATE size_t drwav__write_or_count_metadata(drwav* pWav, drwav_metadata* pMetadatas, drwav_uint32 metadataCount) -{ - size_t bytesWritten = 0; - drwav_bool32 hasListAdtl = DRWAV_FALSE; - drwav_bool32 hasListInfo = DRWAV_FALSE; - drwav_uint32 iMetadata; - if (pMetadatas == NULL || metadataCount == 0) { - return 0; - } - for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) { - drwav_metadata* pMetadata = &pMetadatas[iMetadata]; - drwav_uint32 chunkSize = 0; - if ((pMetadata->type & drwav_metadata_type_list_all_info_strings) || (pMetadata->type == drwav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == drwav_metadata_location_inside_info_list)) { - hasListInfo = DRWAV_TRUE; - } - if ((pMetadata->type & drwav_metadata_type_list_all_adtl) || (pMetadata->type == drwav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == drwav_metadata_location_inside_adtl_list)) { - hasListAdtl = DRWAV_TRUE; - } - switch (pMetadata->type) { - case drwav_metadata_type_smpl: - { - drwav_uint32 iLoop; - chunkSize = DRWAV_SMPL_BYTES + DRWAV_SMPL_LOOP_BYTES * pMetadata->data.smpl.sampleLoopCount + pMetadata->data.smpl.samplerSpecificDataSizeInBytes; - bytesWritten += drwav__write_or_count(pWav, "smpl", 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.manufacturerId); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.productId); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.samplePeriodNanoseconds); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.midiUnityNote); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.midiPitchFraction); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.smpteFormat); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.smpteOffset); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.sampleLoopCount); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.samplerSpecificDataSizeInBytes); - for (iLoop = 0; iLoop < pMetadata->data.smpl.sampleLoopCount; ++iLoop) { - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].cuePointId); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].type); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].firstSampleByteOffset); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].lastSampleByteOffset); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].sampleFraction); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].playCount); - } - if (pMetadata->data.smpl.samplerSpecificDataSizeInBytes > 0) { - bytesWritten += drwav__write(pWav, pMetadata->data.smpl.pSamplerSpecificData, pMetadata->data.smpl.samplerSpecificDataSizeInBytes); - } - } break; - case drwav_metadata_type_inst: - { - chunkSize = DRWAV_INST_BYTES; - bytesWritten += drwav__write_or_count(pWav, "inst", 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count(pWav, &pMetadata->data.inst.midiUnityNote, 1); - bytesWritten += drwav__write_or_count(pWav, &pMetadata->data.inst.fineTuneCents, 1); - bytesWritten += drwav__write_or_count(pWav, &pMetadata->data.inst.gainDecibels, 1); - bytesWritten += drwav__write_or_count(pWav, &pMetadata->data.inst.lowNote, 1); - bytesWritten += drwav__write_or_count(pWav, &pMetadata->data.inst.highNote, 1); - bytesWritten += drwav__write_or_count(pWav, &pMetadata->data.inst.lowVelocity, 1); - bytesWritten += drwav__write_or_count(pWav, &pMetadata->data.inst.highVelocity, 1); - } break; - case drwav_metadata_type_cue: - { - drwav_uint32 iCuePoint; - chunkSize = DRWAV_CUE_BYTES + DRWAV_CUE_POINT_BYTES * pMetadata->data.cue.cuePointCount; - bytesWritten += drwav__write_or_count(pWav, "cue ", 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.cuePointCount); - for (iCuePoint = 0; iCuePoint < pMetadata->data.cue.cuePointCount; ++iCuePoint) { - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].id); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].playOrderPosition); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId, 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].chunkStart); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].blockStart); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].sampleByteOffset); - } - } break; - case drwav_metadata_type_acid: - { - chunkSize = DRWAV_ACID_BYTES; - bytesWritten += drwav__write_or_count(pWav, "acid", 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.acid.flags); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.midiUnityNote); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.reserved1); - bytesWritten += drwav__write_or_count_f32ne_to_le(pWav, pMetadata->data.acid.reserved2); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.acid.numBeats); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.meterDenominator); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.meterNumerator); - bytesWritten += drwav__write_or_count_f32ne_to_le(pWav, pMetadata->data.acid.tempo); - } break; - case drwav_metadata_type_bext: - { - char reservedBuf[DRWAV_BEXT_RESERVED_BYTES]; - drwav_uint32 timeReferenceLow; - drwav_uint32 timeReferenceHigh; - chunkSize = DRWAV_BEXT_BYTES + pMetadata->data.bext.codingHistorySize; - bytesWritten += drwav__write_or_count(pWav, "bext", 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->data.bext.pDescription, DRWAV_BEXT_DESCRIPTION_BYTES); - bytesWritten += drwav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->data.bext.pOriginatorName, DRWAV_BEXT_ORIGINATOR_NAME_BYTES); - bytesWritten += drwav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->data.bext.pOriginatorReference, DRWAV_BEXT_ORIGINATOR_REF_BYTES); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.bext.pOriginationDate, sizeof(pMetadata->data.bext.pOriginationDate)); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.bext.pOriginationTime, sizeof(pMetadata->data.bext.pOriginationTime)); - timeReferenceLow = (drwav_uint32)(pMetadata->data.bext.timeReference & 0xFFFFFFFF); - timeReferenceHigh = (drwav_uint32)(pMetadata->data.bext.timeReference >> 32); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, timeReferenceLow); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, timeReferenceHigh); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.version); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.bext.pUMID, DRWAV_BEXT_UMID_BYTES); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.loudnessValue); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.loudnessRange); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxTruePeakLevel); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxMomentaryLoudness); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxShortTermLoudness); - DRWAV_ZERO_MEMORY(reservedBuf, sizeof(reservedBuf)); - bytesWritten += drwav__write_or_count(pWav, reservedBuf, sizeof(reservedBuf)); - if (pMetadata->data.bext.codingHistorySize > 0) { - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.bext.pCodingHistory, pMetadata->data.bext.codingHistorySize); - } - } break; - case drwav_metadata_type_unknown: - { - if (pMetadata->data.unknown.chunkLocation == drwav_metadata_location_top_level) { - chunkSize = pMetadata->data.unknown.dataSizeInBytes; - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.unknown.id, 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.unknown.pData, pMetadata->data.unknown.dataSizeInBytes); - } - } break; - default: break; - } - if ((chunkSize % 2) != 0) { - bytesWritten += drwav__write_or_count_byte(pWav, 0); - } - } - if (hasListInfo) { - drwav_uint32 chunkSize = 4; - for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) { - drwav_metadata* pMetadata = &pMetadatas[iMetadata]; - if ((pMetadata->type & drwav_metadata_type_list_all_info_strings)) { - chunkSize += 8; - chunkSize += pMetadata->data.infoText.stringLength + 1; - } else if (pMetadata->type == drwav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == drwav_metadata_location_inside_info_list) { - chunkSize += 8; - chunkSize += pMetadata->data.unknown.dataSizeInBytes; - } - if ((chunkSize % 2) != 0) { - chunkSize += 1; - } - } - bytesWritten += drwav__write_or_count(pWav, "LIST", 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count(pWav, "INFO", 4); - for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) { - drwav_metadata* pMetadata = &pMetadatas[iMetadata]; - drwav_uint32 subchunkSize = 0; - if (pMetadata->type & drwav_metadata_type_list_all_info_strings) { - const char* pID = NULL; - switch (pMetadata->type) { - case drwav_metadata_type_list_info_software: pID = "ISFT"; break; - case drwav_metadata_type_list_info_copyright: pID = "ICOP"; break; - case drwav_metadata_type_list_info_title: pID = "INAM"; break; - case drwav_metadata_type_list_info_artist: pID = "IART"; break; - case drwav_metadata_type_list_info_comment: pID = "ICMT"; break; - case drwav_metadata_type_list_info_date: pID = "ICRD"; break; - case drwav_metadata_type_list_info_genre: pID = "IGNR"; break; - case drwav_metadata_type_list_info_album: pID = "IPRD"; break; - case drwav_metadata_type_list_info_tracknumber: pID = "ITRK"; break; - default: break; - } - DRWAV_ASSERT(pID != NULL); - if (pMetadata->data.infoText.stringLength) { - subchunkSize = pMetadata->data.infoText.stringLength + 1; - bytesWritten += drwav__write_or_count(pWav, pID, 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.infoText.pString, pMetadata->data.infoText.stringLength); - bytesWritten += drwav__write_or_count_byte(pWav, '\0'); - } - } else if (pMetadata->type == drwav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == drwav_metadata_location_inside_info_list) { - if (pMetadata->data.unknown.dataSizeInBytes) { - subchunkSize = pMetadata->data.unknown.dataSizeInBytes; - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.unknown.id, 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.unknown.dataSizeInBytes); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.unknown.pData, subchunkSize); - } - } - if ((subchunkSize % 2) != 0) { - bytesWritten += drwav__write_or_count_byte(pWav, 0); - } - } - } - if (hasListAdtl) { - drwav_uint32 chunkSize = 4; - for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) { - drwav_metadata* pMetadata = &pMetadatas[iMetadata]; - switch (pMetadata->type) - { - case drwav_metadata_type_list_label: - case drwav_metadata_type_list_note: - { - chunkSize += 8; - chunkSize += DRWAV_LIST_LABEL_OR_NOTE_BYTES; - if (pMetadata->data.labelOrNote.stringLength > 0) { - chunkSize += pMetadata->data.labelOrNote.stringLength + 1; - } - } break; - case drwav_metadata_type_list_labelled_cue_region: - { - chunkSize += 8; - chunkSize += DRWAV_LIST_LABELLED_TEXT_BYTES; - if (pMetadata->data.labelledCueRegion.stringLength > 0) { - chunkSize += pMetadata->data.labelledCueRegion.stringLength + 1; - } - } break; - case drwav_metadata_type_unknown: - { - if (pMetadata->data.unknown.chunkLocation == drwav_metadata_location_inside_adtl_list) { - chunkSize += 8; - chunkSize += pMetadata->data.unknown.dataSizeInBytes; - } - } break; - default: break; - } - if ((chunkSize % 2) != 0) { - chunkSize += 1; - } - } - bytesWritten += drwav__write_or_count(pWav, "LIST", 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, chunkSize); - bytesWritten += drwav__write_or_count(pWav, "adtl", 4); - for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) { - drwav_metadata* pMetadata = &pMetadatas[iMetadata]; - drwav_uint32 subchunkSize = 0; - switch (pMetadata->type) - { - case drwav_metadata_type_list_label: - case drwav_metadata_type_list_note: - { - if (pMetadata->data.labelOrNote.stringLength > 0) { - const char *pID = NULL; - if (pMetadata->type == drwav_metadata_type_list_label) { - pID = "labl"; - } - else if (pMetadata->type == drwav_metadata_type_list_note) { - pID = "note"; - } - DRWAV_ASSERT(pID != NULL); - DRWAV_ASSERT(pMetadata->data.labelOrNote.pString != NULL); - subchunkSize = DRWAV_LIST_LABEL_OR_NOTE_BYTES; - bytesWritten += drwav__write_or_count(pWav, pID, 4); - subchunkSize += pMetadata->data.labelOrNote.stringLength + 1; - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.labelOrNote.cuePointId); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.labelOrNote.pString, pMetadata->data.labelOrNote.stringLength); - bytesWritten += drwav__write_or_count_byte(pWav, '\0'); - } - } break; - case drwav_metadata_type_list_labelled_cue_region: - { - subchunkSize = DRWAV_LIST_LABELLED_TEXT_BYTES; - bytesWritten += drwav__write_or_count(pWav, "ltxt", 4); - if (pMetadata->data.labelledCueRegion.stringLength > 0) { - subchunkSize += pMetadata->data.labelledCueRegion.stringLength + 1; - } - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.labelledCueRegion.cuePointId); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, pMetadata->data.labelledCueRegion.sampleLength); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.labelledCueRegion.purposeId, 4); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.country); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.language); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.dialect); - bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.codePage); - if (pMetadata->data.labelledCueRegion.stringLength > 0) { - DRWAV_ASSERT(pMetadata->data.labelledCueRegion.pString != NULL); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.labelledCueRegion.pString, pMetadata->data.labelledCueRegion.stringLength); - bytesWritten += drwav__write_or_count_byte(pWav, '\0'); - } - } break; - case drwav_metadata_type_unknown: - { - if (pMetadata->data.unknown.chunkLocation == drwav_metadata_location_inside_adtl_list) { - subchunkSize = pMetadata->data.unknown.dataSizeInBytes; - DRWAV_ASSERT(pMetadata->data.unknown.pData != NULL); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.unknown.id, 4); - bytesWritten += drwav__write_or_count_u32ne_to_le(pWav, subchunkSize); - bytesWritten += drwav__write_or_count(pWav, pMetadata->data.unknown.pData, subchunkSize); - } - } break; - default: break; - } - if ((subchunkSize % 2) != 0) { - bytesWritten += drwav__write_or_count_byte(pWav, 0); - } - } - } - DRWAV_ASSERT((bytesWritten % 2) == 0); - return bytesWritten; -} -DRWAV_PRIVATE drwav_uint32 drwav__riff_chunk_size_riff(drwav_uint64 dataChunkSize, drwav_metadata* pMetadata, drwav_uint32 metadataCount) -{ - drwav_uint64 chunkSize = 4 + 24 + (drwav_uint64)drwav__write_or_count_metadata(NULL, pMetadata, metadataCount) + 8 + dataChunkSize + drwav__chunk_padding_size_riff(dataChunkSize); - if (chunkSize > 0xFFFFFFFFUL) { - chunkSize = 0xFFFFFFFFUL; - } - return (drwav_uint32)chunkSize; -} -DRWAV_PRIVATE drwav_uint32 drwav__data_chunk_size_riff(drwav_uint64 dataChunkSize) -{ - if (dataChunkSize <= 0xFFFFFFFFUL) { - return (drwav_uint32)dataChunkSize; - } else { - return 0xFFFFFFFFUL; - } -} -DRWAV_PRIVATE drwav_uint64 drwav__riff_chunk_size_w64(drwav_uint64 dataChunkSize) -{ - drwav_uint64 dataSubchunkPaddingSize = drwav__chunk_padding_size_w64(dataChunkSize); - return 80 + 24 + dataChunkSize + dataSubchunkPaddingSize; -} -DRWAV_PRIVATE drwav_uint64 drwav__data_chunk_size_w64(drwav_uint64 dataChunkSize) -{ - return 24 + dataChunkSize; -} -DRWAV_PRIVATE drwav_uint64 drwav__riff_chunk_size_rf64(drwav_uint64 dataChunkSize, drwav_metadata *metadata, drwav_uint32 numMetadata) -{ - drwav_uint64 chunkSize = 4 + 36 + 24 + (drwav_uint64)drwav__write_or_count_metadata(NULL, metadata, numMetadata) + 8 + dataChunkSize + drwav__chunk_padding_size_riff(dataChunkSize); - if (chunkSize > 0xFFFFFFFFUL) { - chunkSize = 0xFFFFFFFFUL; - } - return chunkSize; -} -DRWAV_PRIVATE drwav_uint64 drwav__data_chunk_size_rf64(drwav_uint64 dataChunkSize) -{ - return dataChunkSize; -} -DRWAV_PRIVATE drwav_bool32 drwav_preinit_write(drwav* pWav, const drwav_data_format* pFormat, drwav_bool32 isSequential, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pWav == NULL || onWrite == NULL) { - return DRWAV_FALSE; - } - if (!isSequential && onSeek == NULL) { - return DRWAV_FALSE; - } - if (pFormat->format == DR_WAVE_FORMAT_EXTENSIBLE) { - return DRWAV_FALSE; - } - if (pFormat->format == DR_WAVE_FORMAT_ADPCM || pFormat->format == DR_WAVE_FORMAT_DVI_ADPCM) { - return DRWAV_FALSE; - } - DRWAV_ZERO_MEMORY(pWav, sizeof(*pWav)); - pWav->onWrite = onWrite; - pWav->onSeek = onSeek; - pWav->pUserData = pUserData; - pWav->allocationCallbacks = drwav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks); - if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) { - return DRWAV_FALSE; - } - pWav->fmt.formatTag = (drwav_uint16)pFormat->format; - pWav->fmt.channels = (drwav_uint16)pFormat->channels; - pWav->fmt.sampleRate = pFormat->sampleRate; - pWav->fmt.avgBytesPerSec = (drwav_uint32)((pFormat->bitsPerSample * pFormat->sampleRate * pFormat->channels) / 8); - pWav->fmt.blockAlign = (drwav_uint16)((pFormat->channels * pFormat->bitsPerSample) / 8); - pWav->fmt.bitsPerSample = (drwav_uint16)pFormat->bitsPerSample; - pWav->fmt.extendedSize = 0; - pWav->isSequentialWrite = isSequential; - return DRWAV_TRUE; -} -DRWAV_PRIVATE drwav_bool32 drwav_init_write__internal(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount) -{ - size_t runningPos = 0; - drwav_uint64 initialDataChunkSize = 0; - drwav_uint64 chunkSizeFMT; - if (pWav->isSequentialWrite) { - initialDataChunkSize = (totalSampleCount * pWav->fmt.bitsPerSample) / 8; - if (pFormat->container == drwav_container_riff) { - if (initialDataChunkSize > (0xFFFFFFFFUL - 36)) { - return DRWAV_FALSE; - } - } - } - pWav->dataChunkDataSizeTargetWrite = initialDataChunkSize; - if (pFormat->container == drwav_container_riff) { - drwav_uint32 chunkSizeRIFF = 28 + (drwav_uint32)initialDataChunkSize; - runningPos += drwav__write(pWav, "RIFF", 4); - runningPos += drwav__write_u32ne_to_le(pWav, chunkSizeRIFF); - runningPos += drwav__write(pWav, "WAVE", 4); - } else if (pFormat->container == drwav_container_w64) { - drwav_uint64 chunkSizeRIFF = 80 + 24 + initialDataChunkSize; - runningPos += drwav__write(pWav, drwavGUID_W64_RIFF, 16); - runningPos += drwav__write_u64ne_to_le(pWav, chunkSizeRIFF); - runningPos += drwav__write(pWav, drwavGUID_W64_WAVE, 16); - } else if (pFormat->container == drwav_container_rf64) { - runningPos += drwav__write(pWav, "RF64", 4); - runningPos += drwav__write_u32ne_to_le(pWav, 0xFFFFFFFF); - runningPos += drwav__write(pWav, "WAVE", 4); - } - if (pFormat->container == drwav_container_rf64) { - drwav_uint32 initialds64ChunkSize = 28; - drwav_uint64 initialRiffChunkSize = 8 + initialds64ChunkSize + initialDataChunkSize; - runningPos += drwav__write(pWav, "ds64", 4); - runningPos += drwav__write_u32ne_to_le(pWav, initialds64ChunkSize); - runningPos += drwav__write_u64ne_to_le(pWav, initialRiffChunkSize); - runningPos += drwav__write_u64ne_to_le(pWav, initialDataChunkSize); - runningPos += drwav__write_u64ne_to_le(pWav, totalSampleCount); - runningPos += drwav__write_u32ne_to_le(pWav, 0); - } - if (pFormat->container == drwav_container_riff || pFormat->container == drwav_container_rf64) { - chunkSizeFMT = 16; - runningPos += drwav__write(pWav, "fmt ", 4); - runningPos += drwav__write_u32ne_to_le(pWav, (drwav_uint32)chunkSizeFMT); - } else if (pFormat->container == drwav_container_w64) { - chunkSizeFMT = 40; - runningPos += drwav__write(pWav, drwavGUID_W64_FMT, 16); - runningPos += drwav__write_u64ne_to_le(pWav, chunkSizeFMT); - } - runningPos += drwav__write_u16ne_to_le(pWav, pWav->fmt.formatTag); - runningPos += drwav__write_u16ne_to_le(pWav, pWav->fmt.channels); - runningPos += drwav__write_u32ne_to_le(pWav, pWav->fmt.sampleRate); - runningPos += drwav__write_u32ne_to_le(pWav, pWav->fmt.avgBytesPerSec); - runningPos += drwav__write_u16ne_to_le(pWav, pWav->fmt.blockAlign); - runningPos += drwav__write_u16ne_to_le(pWav, pWav->fmt.bitsPerSample); - if (!pWav->isSequentialWrite && pWav->pMetadata != NULL && pWav->metadataCount > 0 && (pFormat->container == drwav_container_riff || pFormat->container == drwav_container_rf64)) { - runningPos += drwav__write_or_count_metadata(pWav, pWav->pMetadata, pWav->metadataCount); - } - pWav->dataChunkDataPos = runningPos; - if (pFormat->container == drwav_container_riff) { - drwav_uint32 chunkSizeDATA = (drwav_uint32)initialDataChunkSize; - runningPos += drwav__write(pWav, "data", 4); - runningPos += drwav__write_u32ne_to_le(pWav, chunkSizeDATA); - } else if (pFormat->container == drwav_container_w64) { - drwav_uint64 chunkSizeDATA = 24 + initialDataChunkSize; - runningPos += drwav__write(pWav, drwavGUID_W64_DATA, 16); - runningPos += drwav__write_u64ne_to_le(pWav, chunkSizeDATA); - } else if (pFormat->container == drwav_container_rf64) { - runningPos += drwav__write(pWav, "data", 4); - runningPos += drwav__write_u32ne_to_le(pWav, 0xFFFFFFFF); - } - pWav->container = pFormat->container; - pWav->channels = (drwav_uint16)pFormat->channels; - pWav->sampleRate = pFormat->sampleRate; - pWav->bitsPerSample = (drwav_uint16)pFormat->bitsPerSample; - pWav->translatedFormatTag = (drwav_uint16)pFormat->format; - pWav->dataChunkDataPos = runningPos; - return DRWAV_TRUE; -} -DRWAV_API drwav_bool32 drwav_init_write(drwav* pWav, const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (!drwav_preinit_write(pWav, pFormat, DRWAV_FALSE, onWrite, onSeek, pUserData, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - return drwav_init_write__internal(pWav, pFormat, 0); -} -DRWAV_API drwav_bool32 drwav_init_write_sequential(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_write_proc onWrite, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (!drwav_preinit_write(pWav, pFormat, DRWAV_TRUE, onWrite, NULL, pUserData, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - return drwav_init_write__internal(pWav, pFormat, totalSampleCount); -} -DRWAV_API drwav_bool32 drwav_init_write_sequential_pcm_frames(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, drwav_write_proc onWrite, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pFormat == NULL) { - return DRWAV_FALSE; - } - return drwav_init_write_sequential(pWav, pFormat, totalPCMFrameCount*pFormat->channels, onWrite, pUserData, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_write_with_metadata(drwav* pWav, const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData, const drwav_allocation_callbacks* pAllocationCallbacks, drwav_metadata* pMetadata, drwav_uint32 metadataCount) -{ - if (!drwav_preinit_write(pWav, pFormat, DRWAV_FALSE, onWrite, onSeek, pUserData, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - pWav->pMetadata = pMetadata; - pWav->metadataCount = metadataCount; - return drwav_init_write__internal(pWav, pFormat, 0); -} -DRWAV_API drwav_uint64 drwav_target_write_size_bytes(const drwav_data_format* pFormat, drwav_uint64 totalFrameCount, drwav_metadata* pMetadata, drwav_uint32 metadataCount) -{ - drwav_uint64 targetDataSizeBytes = (drwav_uint64)((drwav_int64)totalFrameCount * pFormat->channels * pFormat->bitsPerSample/8.0); - drwav_uint64 riffChunkSizeBytes; - drwav_uint64 fileSizeBytes = 0; - if (pFormat->container == drwav_container_riff) { - riffChunkSizeBytes = drwav__riff_chunk_size_riff(targetDataSizeBytes, pMetadata, metadataCount); - fileSizeBytes = (8 + riffChunkSizeBytes); - } else if (pFormat->container == drwav_container_w64) { - riffChunkSizeBytes = drwav__riff_chunk_size_w64(targetDataSizeBytes); - fileSizeBytes = riffChunkSizeBytes; - } else if (pFormat->container == drwav_container_rf64) { - riffChunkSizeBytes = drwav__riff_chunk_size_rf64(targetDataSizeBytes, pMetadata, metadataCount); - fileSizeBytes = (8 + riffChunkSizeBytes); - } - return fileSizeBytes; -} -#ifndef DR_WAV_NO_STDIO -#include -DRWAV_PRIVATE drwav_result drwav_result_from_errno(int e) -{ - switch (e) - { - case 0: return DRWAV_SUCCESS; - #ifdef EPERM - case EPERM: return DRWAV_INVALID_OPERATION; - #endif - #ifdef ENOENT - case ENOENT: return DRWAV_DOES_NOT_EXIST; - #endif - #ifdef ESRCH - case ESRCH: return DRWAV_DOES_NOT_EXIST; - #endif - #ifdef EINTR - case EINTR: return DRWAV_INTERRUPT; - #endif - #ifdef EIO - case EIO: return DRWAV_IO_ERROR; - #endif - #ifdef ENXIO - case ENXIO: return DRWAV_DOES_NOT_EXIST; - #endif - #ifdef E2BIG - case E2BIG: return DRWAV_INVALID_ARGS; - #endif - #ifdef ENOEXEC - case ENOEXEC: return DRWAV_INVALID_FILE; - #endif - #ifdef EBADF - case EBADF: return DRWAV_INVALID_FILE; - #endif - #ifdef ECHILD - case ECHILD: return DRWAV_ERROR; - #endif - #ifdef EAGAIN - case EAGAIN: return DRWAV_UNAVAILABLE; - #endif - #ifdef ENOMEM - case ENOMEM: return DRWAV_OUT_OF_MEMORY; - #endif - #ifdef EACCES - case EACCES: return DRWAV_ACCESS_DENIED; - #endif - #ifdef EFAULT - case EFAULT: return DRWAV_BAD_ADDRESS; - #endif - #ifdef ENOTBLK - case ENOTBLK: return DRWAV_ERROR; - #endif - #ifdef EBUSY - case EBUSY: return DRWAV_BUSY; - #endif - #ifdef EEXIST - case EEXIST: return DRWAV_ALREADY_EXISTS; - #endif - #ifdef EXDEV - case EXDEV: return DRWAV_ERROR; - #endif - #ifdef ENODEV - case ENODEV: return DRWAV_DOES_NOT_EXIST; - #endif - #ifdef ENOTDIR - case ENOTDIR: return DRWAV_NOT_DIRECTORY; - #endif - #ifdef EISDIR - case EISDIR: return DRWAV_IS_DIRECTORY; - #endif - #ifdef EINVAL - case EINVAL: return DRWAV_INVALID_ARGS; - #endif - #ifdef ENFILE - case ENFILE: return DRWAV_TOO_MANY_OPEN_FILES; - #endif - #ifdef EMFILE - case EMFILE: return DRWAV_TOO_MANY_OPEN_FILES; - #endif - #ifdef ENOTTY - case ENOTTY: return DRWAV_INVALID_OPERATION; - #endif - #ifdef ETXTBSY - case ETXTBSY: return DRWAV_BUSY; - #endif - #ifdef EFBIG - case EFBIG: return DRWAV_TOO_BIG; - #endif - #ifdef ENOSPC - case ENOSPC: return DRWAV_NO_SPACE; - #endif - #ifdef ESPIPE - case ESPIPE: return DRWAV_BAD_SEEK; - #endif - #ifdef EROFS - case EROFS: return DRWAV_ACCESS_DENIED; - #endif - #ifdef EMLINK - case EMLINK: return DRWAV_TOO_MANY_LINKS; - #endif - #ifdef EPIPE - case EPIPE: return DRWAV_BAD_PIPE; - #endif - #ifdef EDOM - case EDOM: return DRWAV_OUT_OF_RANGE; - #endif - #ifdef ERANGE - case ERANGE: return DRWAV_OUT_OF_RANGE; - #endif - #ifdef EDEADLK - case EDEADLK: return DRWAV_DEADLOCK; - #endif - #ifdef ENAMETOOLONG - case ENAMETOOLONG: return DRWAV_PATH_TOO_LONG; - #endif - #ifdef ENOLCK - case ENOLCK: return DRWAV_ERROR; - #endif - #ifdef ENOSYS - case ENOSYS: return DRWAV_NOT_IMPLEMENTED; - #endif - #ifdef ENOTEMPTY - case ENOTEMPTY: return DRWAV_DIRECTORY_NOT_EMPTY; - #endif - #ifdef ELOOP - case ELOOP: return DRWAV_TOO_MANY_LINKS; - #endif - #ifdef ENOMSG - case ENOMSG: return DRWAV_NO_MESSAGE; - #endif - #ifdef EIDRM - case EIDRM: return DRWAV_ERROR; - #endif - #ifdef ECHRNG - case ECHRNG: return DRWAV_ERROR; - #endif - #ifdef EL2NSYNC - case EL2NSYNC: return DRWAV_ERROR; - #endif - #ifdef EL3HLT - case EL3HLT: return DRWAV_ERROR; - #endif - #ifdef EL3RST - case EL3RST: return DRWAV_ERROR; - #endif - #ifdef ELNRNG - case ELNRNG: return DRWAV_OUT_OF_RANGE; - #endif - #ifdef EUNATCH - case EUNATCH: return DRWAV_ERROR; - #endif - #ifdef ENOCSI - case ENOCSI: return DRWAV_ERROR; - #endif - #ifdef EL2HLT - case EL2HLT: return DRWAV_ERROR; - #endif - #ifdef EBADE - case EBADE: return DRWAV_ERROR; - #endif - #ifdef EBADR - case EBADR: return DRWAV_ERROR; - #endif - #ifdef EXFULL - case EXFULL: return DRWAV_ERROR; - #endif - #ifdef ENOANO - case ENOANO: return DRWAV_ERROR; - #endif - #ifdef EBADRQC - case EBADRQC: return DRWAV_ERROR; - #endif - #ifdef EBADSLT - case EBADSLT: return DRWAV_ERROR; - #endif - #ifdef EBFONT - case EBFONT: return DRWAV_INVALID_FILE; - #endif - #ifdef ENOSTR - case ENOSTR: return DRWAV_ERROR; - #endif - #ifdef ENODATA - case ENODATA: return DRWAV_NO_DATA_AVAILABLE; - #endif - #ifdef ETIME - case ETIME: return DRWAV_TIMEOUT; - #endif - #ifdef ENOSR - case ENOSR: return DRWAV_NO_DATA_AVAILABLE; - #endif - #ifdef ENONET - case ENONET: return DRWAV_NO_NETWORK; - #endif - #ifdef ENOPKG - case ENOPKG: return DRWAV_ERROR; - #endif - #ifdef EREMOTE - case EREMOTE: return DRWAV_ERROR; - #endif - #ifdef ENOLINK - case ENOLINK: return DRWAV_ERROR; - #endif - #ifdef EADV - case EADV: return DRWAV_ERROR; - #endif - #ifdef ESRMNT - case ESRMNT: return DRWAV_ERROR; - #endif - #ifdef ECOMM - case ECOMM: return DRWAV_ERROR; - #endif - #ifdef EPROTO - case EPROTO: return DRWAV_ERROR; - #endif - #ifdef EMULTIHOP - case EMULTIHOP: return DRWAV_ERROR; - #endif - #ifdef EDOTDOT - case EDOTDOT: return DRWAV_ERROR; - #endif - #ifdef EBADMSG - case EBADMSG: return DRWAV_BAD_MESSAGE; - #endif - #ifdef EOVERFLOW - case EOVERFLOW: return DRWAV_TOO_BIG; - #endif - #ifdef ENOTUNIQ - case ENOTUNIQ: return DRWAV_NOT_UNIQUE; - #endif - #ifdef EBADFD - case EBADFD: return DRWAV_ERROR; - #endif - #ifdef EREMCHG - case EREMCHG: return DRWAV_ERROR; - #endif - #ifdef ELIBACC - case ELIBACC: return DRWAV_ACCESS_DENIED; - #endif - #ifdef ELIBBAD - case ELIBBAD: return DRWAV_INVALID_FILE; - #endif - #ifdef ELIBSCN - case ELIBSCN: return DRWAV_INVALID_FILE; - #endif - #ifdef ELIBMAX - case ELIBMAX: return DRWAV_ERROR; - #endif - #ifdef ELIBEXEC - case ELIBEXEC: return DRWAV_ERROR; - #endif - #ifdef EILSEQ - case EILSEQ: return DRWAV_INVALID_DATA; - #endif - #ifdef ERESTART - case ERESTART: return DRWAV_ERROR; - #endif - #ifdef ESTRPIPE - case ESTRPIPE: return DRWAV_ERROR; - #endif - #ifdef EUSERS - case EUSERS: return DRWAV_ERROR; - #endif - #ifdef ENOTSOCK - case ENOTSOCK: return DRWAV_NOT_SOCKET; - #endif - #ifdef EDESTADDRREQ - case EDESTADDRREQ: return DRWAV_NO_ADDRESS; - #endif - #ifdef EMSGSIZE - case EMSGSIZE: return DRWAV_TOO_BIG; - #endif - #ifdef EPROTOTYPE - case EPROTOTYPE: return DRWAV_BAD_PROTOCOL; - #endif - #ifdef ENOPROTOOPT - case ENOPROTOOPT: return DRWAV_PROTOCOL_UNAVAILABLE; - #endif - #ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return DRWAV_PROTOCOL_NOT_SUPPORTED; - #endif - #ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return DRWAV_SOCKET_NOT_SUPPORTED; - #endif - #ifdef EOPNOTSUPP - case EOPNOTSUPP: return DRWAV_INVALID_OPERATION; - #endif - #ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return DRWAV_PROTOCOL_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return DRWAV_ADDRESS_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EADDRINUSE - case EADDRINUSE: return DRWAV_ALREADY_IN_USE; - #endif - #ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return DRWAV_ERROR; - #endif - #ifdef ENETDOWN - case ENETDOWN: return DRWAV_NO_NETWORK; - #endif - #ifdef ENETUNREACH - case ENETUNREACH: return DRWAV_NO_NETWORK; - #endif - #ifdef ENETRESET - case ENETRESET: return DRWAV_NO_NETWORK; - #endif - #ifdef ECONNABORTED - case ECONNABORTED: return DRWAV_NO_NETWORK; - #endif - #ifdef ECONNRESET - case ECONNRESET: return DRWAV_CONNECTION_RESET; - #endif - #ifdef ENOBUFS - case ENOBUFS: return DRWAV_NO_SPACE; - #endif - #ifdef EISCONN - case EISCONN: return DRWAV_ALREADY_CONNECTED; - #endif - #ifdef ENOTCONN - case ENOTCONN: return DRWAV_NOT_CONNECTED; - #endif - #ifdef ESHUTDOWN - case ESHUTDOWN: return DRWAV_ERROR; - #endif - #ifdef ETOOMANYREFS - case ETOOMANYREFS: return DRWAV_ERROR; - #endif - #ifdef ETIMEDOUT - case ETIMEDOUT: return DRWAV_TIMEOUT; - #endif - #ifdef ECONNREFUSED - case ECONNREFUSED: return DRWAV_CONNECTION_REFUSED; - #endif - #ifdef EHOSTDOWN - case EHOSTDOWN: return DRWAV_NO_HOST; - #endif - #ifdef EHOSTUNREACH - case EHOSTUNREACH: return DRWAV_NO_HOST; - #endif - #ifdef EALREADY - case EALREADY: return DRWAV_IN_PROGRESS; - #endif - #ifdef EINPROGRESS - case EINPROGRESS: return DRWAV_IN_PROGRESS; - #endif - #ifdef ESTALE - case ESTALE: return DRWAV_INVALID_FILE; - #endif - #ifdef EUCLEAN - case EUCLEAN: return DRWAV_ERROR; - #endif - #ifdef ENOTNAM - case ENOTNAM: return DRWAV_ERROR; - #endif - #ifdef ENAVAIL - case ENAVAIL: return DRWAV_ERROR; - #endif - #ifdef EISNAM - case EISNAM: return DRWAV_ERROR; - #endif - #ifdef EREMOTEIO - case EREMOTEIO: return DRWAV_IO_ERROR; - #endif - #ifdef EDQUOT - case EDQUOT: return DRWAV_NO_SPACE; - #endif - #ifdef ENOMEDIUM - case ENOMEDIUM: return DRWAV_DOES_NOT_EXIST; - #endif - #ifdef EMEDIUMTYPE - case EMEDIUMTYPE: return DRWAV_ERROR; - #endif - #ifdef ECANCELED - case ECANCELED: return DRWAV_CANCELLED; - #endif - #ifdef ENOKEY - case ENOKEY: return DRWAV_ERROR; - #endif - #ifdef EKEYEXPIRED - case EKEYEXPIRED: return DRWAV_ERROR; - #endif - #ifdef EKEYREVOKED - case EKEYREVOKED: return DRWAV_ERROR; - #endif - #ifdef EKEYREJECTED - case EKEYREJECTED: return DRWAV_ERROR; - #endif - #ifdef EOWNERDEAD - case EOWNERDEAD: return DRWAV_ERROR; - #endif - #ifdef ENOTRECOVERABLE - case ENOTRECOVERABLE: return DRWAV_ERROR; - #endif - #ifdef ERFKILL - case ERFKILL: return DRWAV_ERROR; - #endif - #ifdef EHWPOISON - case EHWPOISON: return DRWAV_ERROR; - #endif - default: return DRWAV_ERROR; - } -} -DRWAV_PRIVATE drwav_result drwav_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode) -{ -#if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err; -#endif - if (ppFile != NULL) { - *ppFile = NULL; - } - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRWAV_INVALID_ARGS; - } -#if defined(_MSC_VER) && _MSC_VER >= 1400 - err = fopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drwav_result_from_errno(err); - } -#else -#if defined(_WIN32) || defined(__APPLE__) - *ppFile = fopen(pFilePath, pOpenMode); -#else - #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE) - *ppFile = fopen64(pFilePath, pOpenMode); - #else - *ppFile = fopen(pFilePath, pOpenMode); - #endif -#endif - if (*ppFile == NULL) { - drwav_result result = drwav_result_from_errno(errno); - if (result == DRWAV_SUCCESS) { - result = DRWAV_ERROR; - } - return result; - } -#endif - return DRWAV_SUCCESS; -} -#if defined(_WIN32) - #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) - #define DRWAV_HAS_WFOPEN - #endif -#endif -DRWAV_PRIVATE drwav_result drwav_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (ppFile != NULL) { - *ppFile = NULL; - } - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRWAV_INVALID_ARGS; - } -#if defined(DRWAV_HAS_WFOPEN) - { - #if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drwav_result_from_errno(err); - } - #else - *ppFile = _wfopen(pFilePath, pOpenMode); - if (*ppFile == NULL) { - return drwav_result_from_errno(errno); - } - #endif - (void)pAllocationCallbacks; - } -#else - { - mbstate_t mbs; - size_t lenMB; - const wchar_t* pFilePathTemp = pFilePath; - char* pFilePathMB = NULL; - char pOpenModeMB[32] = {0}; - DRWAV_ZERO_OBJECT(&mbs); - lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs); - if (lenMB == (size_t)-1) { - return drwav_result_from_errno(errno); - } - pFilePathMB = (char*)drwav__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks); - if (pFilePathMB == NULL) { - return DRWAV_OUT_OF_MEMORY; - } - pFilePathTemp = pFilePath; - DRWAV_ZERO_OBJECT(&mbs); - wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs); - { - size_t i = 0; - for (;;) { - if (pOpenMode[i] == 0) { - pOpenModeMB[i] = '\0'; - break; - } - pOpenModeMB[i] = (char)pOpenMode[i]; - i += 1; - } - } - *ppFile = fopen(pFilePathMB, pOpenModeMB); - drwav__free_from_callbacks(pFilePathMB, pAllocationCallbacks); - } - if (*ppFile == NULL) { - return DRWAV_ERROR; - } -#endif - return DRWAV_SUCCESS; -} -DRWAV_PRIVATE size_t drwav__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead) -{ - return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData); -} -DRWAV_PRIVATE size_t drwav__on_write_stdio(void* pUserData, const void* pData, size_t bytesToWrite) -{ - return fwrite(pData, 1, bytesToWrite, (FILE*)pUserData); -} -DRWAV_PRIVATE drwav_bool32 drwav__on_seek_stdio(void* pUserData, int offset, drwav_seek_origin origin) -{ - return fseek((FILE*)pUserData, offset, (origin == drwav_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; -} -DRWAV_API drwav_bool32 drwav_init_file(drwav* pWav, const char* filename, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_file_ex(pWav, filename, NULL, NULL, 0, pAllocationCallbacks); -} -DRWAV_PRIVATE drwav_bool32 drwav_init_file__internal_FILE(drwav* pWav, FILE* pFile, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags, drwav_metadata_type allowedMetadataTypes, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav_bool32 result; - result = drwav_preinit(pWav, drwav__on_read_stdio, drwav__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (result != DRWAV_TRUE) { - fclose(pFile); - return result; - } - pWav->allowedMetadataTypes = allowedMetadataTypes; - result = drwav_init__internal(pWav, onChunk, pChunkUserData, flags); - if (result != DRWAV_TRUE) { - fclose(pFile); - return result; - } - return DRWAV_TRUE; -} -DRWAV_API drwav_bool32 drwav_init_file_ex(drwav* pWav, const char* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - FILE* pFile; - if (drwav_fopen(&pFile, filename, "rb") != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - return drwav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags, drwav_metadata_type_none, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_w(drwav* pWav, const wchar_t* filename, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_file_ex_w(pWav, filename, NULL, NULL, 0, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_ex_w(drwav* pWav, const wchar_t* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - FILE* pFile; - if (drwav_wfopen(&pFile, filename, L"rb", pAllocationCallbacks) != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - return drwav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags, drwav_metadata_type_none, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_with_metadata(drwav* pWav, const char* filename, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - FILE* pFile; - if (drwav_fopen(&pFile, filename, "rb") != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - return drwav_init_file__internal_FILE(pWav, pFile, NULL, NULL, flags, drwav_metadata_type_all_including_unknown, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_with_metadata_w(drwav* pWav, const wchar_t* filename, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - FILE* pFile; - if (drwav_wfopen(&pFile, filename, L"rb", pAllocationCallbacks) != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - return drwav_init_file__internal_FILE(pWav, pFile, NULL, NULL, flags, drwav_metadata_type_all_including_unknown, pAllocationCallbacks); -} -DRWAV_PRIVATE drwav_bool32 drwav_init_file_write__internal_FILE(drwav* pWav, FILE* pFile, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav_bool32 result; - result = drwav_preinit_write(pWav, pFormat, isSequential, drwav__on_write_stdio, drwav__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (result != DRWAV_TRUE) { - fclose(pFile); - return result; - } - result = drwav_init_write__internal(pWav, pFormat, totalSampleCount); - if (result != DRWAV_TRUE) { - fclose(pFile); - return result; - } - return DRWAV_TRUE; -} -DRWAV_PRIVATE drwav_bool32 drwav_init_file_write__internal(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - FILE* pFile; - if (drwav_fopen(&pFile, filename, "wb") != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - return drwav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks); -} -DRWAV_PRIVATE drwav_bool32 drwav_init_file_write_w__internal(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - FILE* pFile; - if (drwav_wfopen(&pFile, filename, L"wb", pAllocationCallbacks) != DRWAV_SUCCESS) { - return DRWAV_FALSE; - } - return drwav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_write(drwav* pWav, const char* filename, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_file_write__internal(pWav, filename, pFormat, 0, DRWAV_FALSE, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_write_sequential(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_file_write__internal(pWav, filename, pFormat, totalSampleCount, DRWAV_TRUE, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pFormat == NULL) { - return DRWAV_FALSE; - } - return drwav_init_file_write_sequential(pWav, filename, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_write_w(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_file_write_w__internal(pWav, filename, pFormat, 0, DRWAV_FALSE, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_write_sequential_w(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_file_write_w__internal(pWav, filename, pFormat, totalSampleCount, DRWAV_TRUE, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames_w(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pFormat == NULL) { - return DRWAV_FALSE; - } - return drwav_init_file_write_sequential_w(pWav, filename, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks); -} -#endif -DRWAV_PRIVATE size_t drwav__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead) -{ - drwav* pWav = (drwav*)pUserData; - size_t bytesRemaining; - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->memoryStream.dataSize >= pWav->memoryStream.currentReadPos); - bytesRemaining = pWav->memoryStream.dataSize - pWav->memoryStream.currentReadPos; - if (bytesToRead > bytesRemaining) { - bytesToRead = bytesRemaining; - } - if (bytesToRead > 0) { - DRWAV_COPY_MEMORY(pBufferOut, pWav->memoryStream.data + pWav->memoryStream.currentReadPos, bytesToRead); - pWav->memoryStream.currentReadPos += bytesToRead; - } - return bytesToRead; -} -DRWAV_PRIVATE drwav_bool32 drwav__on_seek_memory(void* pUserData, int offset, drwav_seek_origin origin) -{ - drwav* pWav = (drwav*)pUserData; - DRWAV_ASSERT(pWav != NULL); - if (origin == drwav_seek_origin_current) { - if (offset > 0) { - if (pWav->memoryStream.currentReadPos + offset > pWav->memoryStream.dataSize) { - return DRWAV_FALSE; - } - } else { - if (pWav->memoryStream.currentReadPos < (size_t)-offset) { - return DRWAV_FALSE; - } - } - pWav->memoryStream.currentReadPos += offset; - } else { - if ((drwav_uint32)offset <= pWav->memoryStream.dataSize) { - pWav->memoryStream.currentReadPos = offset; - } else { - return DRWAV_FALSE; - } - } - return DRWAV_TRUE; -} -DRWAV_PRIVATE size_t drwav__on_write_memory(void* pUserData, const void* pDataIn, size_t bytesToWrite) -{ - drwav* pWav = (drwav*)pUserData; - size_t bytesRemaining; - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(pWav->memoryStreamWrite.dataCapacity >= pWav->memoryStreamWrite.currentWritePos); - bytesRemaining = pWav->memoryStreamWrite.dataCapacity - pWav->memoryStreamWrite.currentWritePos; - if (bytesRemaining < bytesToWrite) { - void* pNewData; - size_t newDataCapacity = (pWav->memoryStreamWrite.dataCapacity == 0) ? 256 : pWav->memoryStreamWrite.dataCapacity * 2; - if ((newDataCapacity - pWav->memoryStreamWrite.currentWritePos) < bytesToWrite) { - newDataCapacity = pWav->memoryStreamWrite.currentWritePos + bytesToWrite; - } - pNewData = drwav__realloc_from_callbacks(*pWav->memoryStreamWrite.ppData, newDataCapacity, pWav->memoryStreamWrite.dataCapacity, &pWav->allocationCallbacks); - if (pNewData == NULL) { - return 0; - } - *pWav->memoryStreamWrite.ppData = pNewData; - pWav->memoryStreamWrite.dataCapacity = newDataCapacity; - } - DRWAV_COPY_MEMORY(((drwav_uint8*)(*pWav->memoryStreamWrite.ppData)) + pWav->memoryStreamWrite.currentWritePos, pDataIn, bytesToWrite); - pWav->memoryStreamWrite.currentWritePos += bytesToWrite; - if (pWav->memoryStreamWrite.dataSize < pWav->memoryStreamWrite.currentWritePos) { - pWav->memoryStreamWrite.dataSize = pWav->memoryStreamWrite.currentWritePos; - } - *pWav->memoryStreamWrite.pDataSize = pWav->memoryStreamWrite.dataSize; - return bytesToWrite; -} -DRWAV_PRIVATE drwav_bool32 drwav__on_seek_memory_write(void* pUserData, int offset, drwav_seek_origin origin) -{ - drwav* pWav = (drwav*)pUserData; - DRWAV_ASSERT(pWav != NULL); - if (origin == drwav_seek_origin_current) { - if (offset > 0) { - if (pWav->memoryStreamWrite.currentWritePos + offset > pWav->memoryStreamWrite.dataSize) { - offset = (int)(pWav->memoryStreamWrite.dataSize - pWav->memoryStreamWrite.currentWritePos); - } - } else { - if (pWav->memoryStreamWrite.currentWritePos < (size_t)-offset) { - offset = -(int)pWav->memoryStreamWrite.currentWritePos; - } - } - pWav->memoryStreamWrite.currentWritePos += offset; - } else { - if ((drwav_uint32)offset <= pWav->memoryStreamWrite.dataSize) { - pWav->memoryStreamWrite.currentWritePos = offset; - } else { - pWav->memoryStreamWrite.currentWritePos = pWav->memoryStreamWrite.dataSize; - } - } - return DRWAV_TRUE; -} -DRWAV_API drwav_bool32 drwav_init_memory(drwav* pWav, const void* data, size_t dataSize, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_memory_ex(pWav, data, dataSize, NULL, NULL, 0, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_memory_ex(drwav* pWav, const void* data, size_t dataSize, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (data == NULL || dataSize == 0) { - return DRWAV_FALSE; - } - if (!drwav_preinit(pWav, drwav__on_read_memory, drwav__on_seek_memory, pWav, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - pWav->memoryStream.data = (const drwav_uint8*)data; - pWav->memoryStream.dataSize = dataSize; - pWav->memoryStream.currentReadPos = 0; - return drwav_init__internal(pWav, onChunk, pChunkUserData, flags); -} -DRWAV_API drwav_bool32 drwav_init_memory_with_metadata(drwav* pWav, const void* data, size_t dataSize, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (data == NULL || dataSize == 0) { - return DRWAV_FALSE; - } - if (!drwav_preinit(pWav, drwav__on_read_memory, drwav__on_seek_memory, pWav, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - pWav->memoryStream.data = (const drwav_uint8*)data; - pWav->memoryStream.dataSize = dataSize; - pWav->memoryStream.currentReadPos = 0; - pWav->allowedMetadataTypes = drwav_metadata_type_all_including_unknown; - return drwav_init__internal(pWav, NULL, NULL, flags); -} -DRWAV_PRIVATE drwav_bool32 drwav_init_memory_write__internal(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (ppData == NULL || pDataSize == NULL) { - return DRWAV_FALSE; - } - *ppData = NULL; - *pDataSize = 0; - if (!drwav_preinit_write(pWav, pFormat, isSequential, drwav__on_write_memory, drwav__on_seek_memory_write, pWav, pAllocationCallbacks)) { - return DRWAV_FALSE; - } - pWav->memoryStreamWrite.ppData = ppData; - pWav->memoryStreamWrite.pDataSize = pDataSize; - pWav->memoryStreamWrite.dataSize = 0; - pWav->memoryStreamWrite.dataCapacity = 0; - pWav->memoryStreamWrite.currentWritePos = 0; - return drwav_init_write__internal(pWav, pFormat, totalSampleCount); -} -DRWAV_API drwav_bool32 drwav_init_memory_write(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, 0, DRWAV_FALSE, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_memory_write_sequential(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - return drwav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, totalSampleCount, DRWAV_TRUE, pAllocationCallbacks); -} -DRWAV_API drwav_bool32 drwav_init_memory_write_sequential_pcm_frames(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalPCMFrameCount, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pFormat == NULL) { - return DRWAV_FALSE; - } - return drwav_init_memory_write_sequential(pWav, ppData, pDataSize, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks); -} -DRWAV_API drwav_result drwav_uninit(drwav* pWav) -{ - drwav_result result = DRWAV_SUCCESS; - if (pWav == NULL) { - return DRWAV_INVALID_ARGS; - } - if (pWav->onWrite != NULL) { - drwav_uint32 paddingSize = 0; - if (pWav->container == drwav_container_riff || pWav->container == drwav_container_rf64) { - paddingSize = drwav__chunk_padding_size_riff(pWav->dataChunkDataSize); - } else { - paddingSize = drwav__chunk_padding_size_w64(pWav->dataChunkDataSize); - } - if (paddingSize > 0) { - drwav_uint64 paddingData = 0; - drwav__write(pWav, &paddingData, paddingSize); - } - if (pWav->onSeek && !pWav->isSequentialWrite) { - if (pWav->container == drwav_container_riff) { - if (pWav->onSeek(pWav->pUserData, 4, drwav_seek_origin_start)) { - drwav_uint32 riffChunkSize = drwav__riff_chunk_size_riff(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount); - drwav__write_u32ne_to_le(pWav, riffChunkSize); - } - if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 4, drwav_seek_origin_start)) { - drwav_uint32 dataChunkSize = drwav__data_chunk_size_riff(pWav->dataChunkDataSize); - drwav__write_u32ne_to_le(pWav, dataChunkSize); - } - } else if (pWav->container == drwav_container_w64) { - if (pWav->onSeek(pWav->pUserData, 16, drwav_seek_origin_start)) { - drwav_uint64 riffChunkSize = drwav__riff_chunk_size_w64(pWav->dataChunkDataSize); - drwav__write_u64ne_to_le(pWav, riffChunkSize); - } - if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 8, drwav_seek_origin_start)) { - drwav_uint64 dataChunkSize = drwav__data_chunk_size_w64(pWav->dataChunkDataSize); - drwav__write_u64ne_to_le(pWav, dataChunkSize); - } - } else if (pWav->container == drwav_container_rf64) { - int ds64BodyPos = 12 + 8; - if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 0, drwav_seek_origin_start)) { - drwav_uint64 riffChunkSize = drwav__riff_chunk_size_rf64(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount); - drwav__write_u64ne_to_le(pWav, riffChunkSize); - } - if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 8, drwav_seek_origin_start)) { - drwav_uint64 dataChunkSize = drwav__data_chunk_size_rf64(pWav->dataChunkDataSize); - drwav__write_u64ne_to_le(pWav, dataChunkSize); - } - } - } - if (pWav->isSequentialWrite) { - if (pWav->dataChunkDataSize != pWav->dataChunkDataSizeTargetWrite) { - result = DRWAV_INVALID_FILE; - } - } - } else { - if (pWav->pMetadata != NULL) { - pWav->allocationCallbacks.onFree(pWav->pMetadata, pWav->allocationCallbacks.pUserData); - } - } -#ifndef DR_WAV_NO_STDIO - if (pWav->onRead == drwav__on_read_stdio || pWav->onWrite == drwav__on_write_stdio) { - fclose((FILE*)pWav->pUserData); - } -#endif - return result; -} -DRWAV_API size_t drwav_read_raw(drwav* pWav, size_t bytesToRead, void* pBufferOut) -{ - size_t bytesRead; - drwav_uint32 bytesPerFrame; - if (pWav == NULL || bytesToRead == 0) { - return 0; - } - if (bytesToRead > pWav->bytesRemaining) { - bytesToRead = (size_t)pWav->bytesRemaining; - } - if (bytesToRead == 0) { - return 0; - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - if (pBufferOut != NULL) { - bytesRead = pWav->onRead(pWav->pUserData, pBufferOut, bytesToRead); - } else { - bytesRead = 0; - while (bytesRead < bytesToRead) { - size_t bytesToSeek = (bytesToRead - bytesRead); - if (bytesToSeek > 0x7FFFFFFF) { - bytesToSeek = 0x7FFFFFFF; - } - if (pWav->onSeek(pWav->pUserData, (int)bytesToSeek, drwav_seek_origin_current) == DRWAV_FALSE) { - break; - } - bytesRead += bytesToSeek; - } - while (bytesRead < bytesToRead) { - drwav_uint8 buffer[4096]; - size_t bytesSeeked; - size_t bytesToSeek = (bytesToRead - bytesRead); - if (bytesToSeek > sizeof(buffer)) { - bytesToSeek = sizeof(buffer); - } - bytesSeeked = pWav->onRead(pWav->pUserData, buffer, bytesToSeek); - bytesRead += bytesSeeked; - if (bytesSeeked < bytesToSeek) { - break; - } - } - } - pWav->readCursorInPCMFrames += bytesRead / bytesPerFrame; - pWav->bytesRemaining -= bytesRead; - return bytesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_le(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut) -{ - drwav_uint32 bytesPerFrame; - drwav_uint64 bytesToRead; - if (pWav == NULL || framesToRead == 0) { - return 0; - } - if (drwav__is_compressed_format_tag(pWav->translatedFormatTag)) { - return 0; - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesToRead = framesToRead * bytesPerFrame; - if (bytesToRead > DRWAV_SIZE_MAX) { - bytesToRead = (DRWAV_SIZE_MAX / bytesPerFrame) * bytesPerFrame; - } - if (bytesToRead == 0) { - return 0; - } - return drwav_read_raw(pWav, (size_t)bytesToRead, pBufferOut) / bytesPerFrame; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_be(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut) -{ - drwav_uint64 framesRead = drwav_read_pcm_frames_le(pWav, framesToRead, pBufferOut); - if (pBufferOut != NULL) { - drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - drwav__bswap_samples(pBufferOut, framesRead*pWav->channels, bytesPerFrame/pWav->channels, pWav->translatedFormatTag); - } - return framesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut) -{ - if (drwav__is_little_endian()) { - return drwav_read_pcm_frames_le(pWav, framesToRead, pBufferOut); - } else { - return drwav_read_pcm_frames_be(pWav, framesToRead, pBufferOut); - } -} -DRWAV_PRIVATE drwav_bool32 drwav_seek_to_first_pcm_frame(drwav* pWav) -{ - if (pWav->onWrite != NULL) { - return DRWAV_FALSE; - } - if (!pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos, drwav_seek_origin_start)) { - return DRWAV_FALSE; - } - if (drwav__is_compressed_format_tag(pWav->translatedFormatTag)) { - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { - DRWAV_ZERO_OBJECT(&pWav->msadpcm); - } else if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - DRWAV_ZERO_OBJECT(&pWav->ima); - } else { - DRWAV_ASSERT(DRWAV_FALSE); - } - } - pWav->readCursorInPCMFrames = 0; - pWav->bytesRemaining = pWav->dataChunkDataSize; - return DRWAV_TRUE; -} -DRWAV_API drwav_bool32 drwav_seek_to_pcm_frame(drwav* pWav, drwav_uint64 targetFrameIndex) -{ - if (pWav == NULL || pWav->onSeek == NULL) { - return DRWAV_FALSE; - } - if (pWav->onWrite != NULL) { - return DRWAV_FALSE; - } - if (pWav->totalPCMFrameCount == 0) { - return DRWAV_TRUE; - } - if (targetFrameIndex > pWav->totalPCMFrameCount) { - targetFrameIndex = pWav->totalPCMFrameCount; - } - if (drwav__is_compressed_format_tag(pWav->translatedFormatTag)) { - if (targetFrameIndex < pWav->readCursorInPCMFrames) { - if (!drwav_seek_to_first_pcm_frame(pWav)) { - return DRWAV_FALSE; - } - } - if (targetFrameIndex > pWav->readCursorInPCMFrames) { - drwav_uint64 offsetInFrames = targetFrameIndex - pWav->readCursorInPCMFrames; - drwav_int16 devnull[2048]; - while (offsetInFrames > 0) { - drwav_uint64 framesRead = 0; - drwav_uint64 framesToRead = offsetInFrames; - if (framesToRead > drwav_countof(devnull)/pWav->channels) { - framesToRead = drwav_countof(devnull)/pWav->channels; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { - framesRead = drwav_read_pcm_frames_s16__msadpcm(pWav, framesToRead, devnull); - } else if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - framesRead = drwav_read_pcm_frames_s16__ima(pWav, framesToRead, devnull); - } else { - DRWAV_ASSERT(DRWAV_FALSE); - } - if (framesRead != framesToRead) { - return DRWAV_FALSE; - } - offsetInFrames -= framesRead; - } - } - } else { - drwav_uint64 totalSizeInBytes; - drwav_uint64 currentBytePos; - drwav_uint64 targetBytePos; - drwav_uint64 offset; - drwav_uint32 bytesPerFrame; - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return DRWAV_FALSE; - } - totalSizeInBytes = pWav->totalPCMFrameCount * bytesPerFrame; - DRWAV_ASSERT(totalSizeInBytes >= pWav->bytesRemaining); - currentBytePos = totalSizeInBytes - pWav->bytesRemaining; - targetBytePos = targetFrameIndex * bytesPerFrame; - if (currentBytePos < targetBytePos) { - offset = (targetBytePos - currentBytePos); - } else { - if (!drwav_seek_to_first_pcm_frame(pWav)) { - return DRWAV_FALSE; - } - offset = targetBytePos; - } - while (offset > 0) { - int offset32 = ((offset > INT_MAX) ? INT_MAX : (int)offset); - if (!pWav->onSeek(pWav->pUserData, offset32, drwav_seek_origin_current)) { - return DRWAV_FALSE; - } - pWav->readCursorInPCMFrames += offset32 / bytesPerFrame; - pWav->bytesRemaining -= offset32; - offset -= offset32; - } - } - return DRWAV_TRUE; -} -DRWAV_API drwav_result drwav_get_cursor_in_pcm_frames(drwav* pWav, drwav_uint64* pCursor) -{ - if (pCursor == NULL) { - return DRWAV_INVALID_ARGS; - } - *pCursor = 0; - if (pWav == NULL) { - return DRWAV_INVALID_ARGS; - } - *pCursor = pWav->readCursorInPCMFrames; - return DRWAV_SUCCESS; -} -DRWAV_API drwav_result drwav_get_length_in_pcm_frames(drwav* pWav, drwav_uint64* pLength) -{ - if (pLength == NULL) { - return DRWAV_INVALID_ARGS; - } - *pLength = 0; - if (pWav == NULL) { - return DRWAV_INVALID_ARGS; - } - *pLength = pWav->totalPCMFrameCount; - return DRWAV_SUCCESS; -} -DRWAV_API size_t drwav_write_raw(drwav* pWav, size_t bytesToWrite, const void* pData) -{ - size_t bytesWritten; - if (pWav == NULL || bytesToWrite == 0 || pData == NULL) { - return 0; - } - bytesWritten = pWav->onWrite(pWav->pUserData, pData, bytesToWrite); - pWav->dataChunkDataSize += bytesWritten; - return bytesWritten; -} -DRWAV_API drwav_uint64 drwav_write_pcm_frames_le(drwav* pWav, drwav_uint64 framesToWrite, const void* pData) -{ - drwav_uint64 bytesToWrite; - drwav_uint64 bytesWritten; - const drwav_uint8* pRunningData; - if (pWav == NULL || framesToWrite == 0 || pData == NULL) { - return 0; - } - bytesToWrite = ((framesToWrite * pWav->channels * pWav->bitsPerSample) / 8); - if (bytesToWrite > DRWAV_SIZE_MAX) { - return 0; - } - bytesWritten = 0; - pRunningData = (const drwav_uint8*)pData; - while (bytesToWrite > 0) { - size_t bytesJustWritten; - drwav_uint64 bytesToWriteThisIteration; - bytesToWriteThisIteration = bytesToWrite; - DRWAV_ASSERT(bytesToWriteThisIteration <= DRWAV_SIZE_MAX); - bytesJustWritten = drwav_write_raw(pWav, (size_t)bytesToWriteThisIteration, pRunningData); - if (bytesJustWritten == 0) { - break; - } - bytesToWrite -= bytesJustWritten; - bytesWritten += bytesJustWritten; - pRunningData += bytesJustWritten; - } - return (bytesWritten * 8) / pWav->bitsPerSample / pWav->channels; -} -DRWAV_API drwav_uint64 drwav_write_pcm_frames_be(drwav* pWav, drwav_uint64 framesToWrite, const void* pData) -{ - drwav_uint64 bytesToWrite; - drwav_uint64 bytesWritten; - drwav_uint32 bytesPerSample; - const drwav_uint8* pRunningData; - if (pWav == NULL || framesToWrite == 0 || pData == NULL) { - return 0; - } - bytesToWrite = ((framesToWrite * pWav->channels * pWav->bitsPerSample) / 8); - if (bytesToWrite > DRWAV_SIZE_MAX) { - return 0; - } - bytesWritten = 0; - pRunningData = (const drwav_uint8*)pData; - bytesPerSample = drwav_get_bytes_per_pcm_frame(pWav) / pWav->channels; - if (bytesPerSample == 0) { - return 0; - } - while (bytesToWrite > 0) { - drwav_uint8 temp[4096]; - drwav_uint32 sampleCount; - size_t bytesJustWritten; - drwav_uint64 bytesToWriteThisIteration; - bytesToWriteThisIteration = bytesToWrite; - DRWAV_ASSERT(bytesToWriteThisIteration <= DRWAV_SIZE_MAX); - sampleCount = sizeof(temp)/bytesPerSample; - if (bytesToWriteThisIteration > ((drwav_uint64)sampleCount)*bytesPerSample) { - bytesToWriteThisIteration = ((drwav_uint64)sampleCount)*bytesPerSample; - } - DRWAV_COPY_MEMORY(temp, pRunningData, (size_t)bytesToWriteThisIteration); - drwav__bswap_samples(temp, sampleCount, bytesPerSample, pWav->translatedFormatTag); - bytesJustWritten = drwav_write_raw(pWav, (size_t)bytesToWriteThisIteration, temp); - if (bytesJustWritten == 0) { - break; - } - bytesToWrite -= bytesJustWritten; - bytesWritten += bytesJustWritten; - pRunningData += bytesJustWritten; - } - return (bytesWritten * 8) / pWav->bitsPerSample / pWav->channels; -} -DRWAV_API drwav_uint64 drwav_write_pcm_frames(drwav* pWav, drwav_uint64 framesToWrite, const void* pData) -{ - if (drwav__is_little_endian()) { - return drwav_write_pcm_frames_le(pWav, framesToWrite, pData); - } else { - return drwav_write_pcm_frames_be(pWav, framesToWrite, pData); - } -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__msadpcm(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 totalFramesRead = 0; - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(framesToRead > 0); - while (pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) { - DRWAV_ASSERT(framesToRead > 0); - if (pWav->msadpcm.cachedFrameCount == 0 && pWav->msadpcm.bytesRemainingInBlock == 0) { - if (pWav->channels == 1) { - drwav_uint8 header[7]; - if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { - return totalFramesRead; - } - pWav->msadpcm.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); - pWav->msadpcm.predictor[0] = header[0]; - pWav->msadpcm.delta[0] = drwav_bytes_to_s16(header + 1); - pWav->msadpcm.prevFrames[0][1] = (drwav_int32)drwav_bytes_to_s16(header + 3); - pWav->msadpcm.prevFrames[0][0] = (drwav_int32)drwav_bytes_to_s16(header + 5); - pWav->msadpcm.cachedFrames[2] = pWav->msadpcm.prevFrames[0][0]; - pWav->msadpcm.cachedFrames[3] = pWav->msadpcm.prevFrames[0][1]; - pWav->msadpcm.cachedFrameCount = 2; - } else { - drwav_uint8 header[14]; - if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { - return totalFramesRead; - } - pWav->msadpcm.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); - pWav->msadpcm.predictor[0] = header[0]; - pWav->msadpcm.predictor[1] = header[1]; - pWav->msadpcm.delta[0] = drwav_bytes_to_s16(header + 2); - pWav->msadpcm.delta[1] = drwav_bytes_to_s16(header + 4); - pWav->msadpcm.prevFrames[0][1] = (drwav_int32)drwav_bytes_to_s16(header + 6); - pWav->msadpcm.prevFrames[1][1] = (drwav_int32)drwav_bytes_to_s16(header + 8); - pWav->msadpcm.prevFrames[0][0] = (drwav_int32)drwav_bytes_to_s16(header + 10); - pWav->msadpcm.prevFrames[1][0] = (drwav_int32)drwav_bytes_to_s16(header + 12); - pWav->msadpcm.cachedFrames[0] = pWav->msadpcm.prevFrames[0][0]; - pWav->msadpcm.cachedFrames[1] = pWav->msadpcm.prevFrames[1][0]; - pWav->msadpcm.cachedFrames[2] = pWav->msadpcm.prevFrames[0][1]; - pWav->msadpcm.cachedFrames[3] = pWav->msadpcm.prevFrames[1][1]; - pWav->msadpcm.cachedFrameCount = 2; - } - } - while (framesToRead > 0 && pWav->msadpcm.cachedFrameCount > 0 && pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) { - if (pBufferOut != NULL) { - drwav_uint32 iSample = 0; - for (iSample = 0; iSample < pWav->channels; iSample += 1) { - pBufferOut[iSample] = (drwav_int16)pWav->msadpcm.cachedFrames[(drwav_countof(pWav->msadpcm.cachedFrames) - (pWav->msadpcm.cachedFrameCount*pWav->channels)) + iSample]; - } - pBufferOut += pWav->channels; - } - framesToRead -= 1; - totalFramesRead += 1; - pWav->readCursorInPCMFrames += 1; - pWav->msadpcm.cachedFrameCount -= 1; - } - if (framesToRead == 0) { - break; - } - if (pWav->msadpcm.cachedFrameCount == 0) { - if (pWav->msadpcm.bytesRemainingInBlock == 0) { - continue; - } else { - static drwav_int32 adaptationTable[] = { - 230, 230, 230, 230, 307, 409, 512, 614, - 768, 614, 512, 409, 307, 230, 230, 230 - }; - static drwav_int32 coeff1Table[] = { 256, 512, 0, 192, 240, 460, 392 }; - static drwav_int32 coeff2Table[] = { 0, -256, 0, 64, 0, -208, -232 }; - drwav_uint8 nibbles; - drwav_int32 nibble0; - drwav_int32 nibble1; - if (pWav->onRead(pWav->pUserData, &nibbles, 1) != 1) { - return totalFramesRead; - } - pWav->msadpcm.bytesRemainingInBlock -= 1; - nibble0 = ((nibbles & 0xF0) >> 4); if ((nibbles & 0x80)) { nibble0 |= 0xFFFFFFF0UL; } - nibble1 = ((nibbles & 0x0F) >> 0); if ((nibbles & 0x08)) { nibble1 |= 0xFFFFFFF0UL; } - if (pWav->channels == 1) { - drwav_int32 newSample0; - drwav_int32 newSample1; - newSample0 = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; - newSample0 += nibble0 * pWav->msadpcm.delta[0]; - newSample0 = drwav_clamp(newSample0, -32768, 32767); - pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0xF0) >> 4)] * pWav->msadpcm.delta[0]) >> 8; - if (pWav->msadpcm.delta[0] < 16) { - pWav->msadpcm.delta[0] = 16; - } - pWav->msadpcm.prevFrames[0][0] = pWav->msadpcm.prevFrames[0][1]; - pWav->msadpcm.prevFrames[0][1] = newSample0; - newSample1 = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; - newSample1 += nibble1 * pWav->msadpcm.delta[0]; - newSample1 = drwav_clamp(newSample1, -32768, 32767); - pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0x0F) >> 0)] * pWav->msadpcm.delta[0]) >> 8; - if (pWav->msadpcm.delta[0] < 16) { - pWav->msadpcm.delta[0] = 16; - } - pWav->msadpcm.prevFrames[0][0] = pWav->msadpcm.prevFrames[0][1]; - pWav->msadpcm.prevFrames[0][1] = newSample1; - pWav->msadpcm.cachedFrames[2] = newSample0; - pWav->msadpcm.cachedFrames[3] = newSample1; - pWav->msadpcm.cachedFrameCount = 2; - } else { - drwav_int32 newSample0; - drwav_int32 newSample1; - newSample0 = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; - newSample0 += nibble0 * pWav->msadpcm.delta[0]; - newSample0 = drwav_clamp(newSample0, -32768, 32767); - pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0xF0) >> 4)] * pWav->msadpcm.delta[0]) >> 8; - if (pWav->msadpcm.delta[0] < 16) { - pWav->msadpcm.delta[0] = 16; - } - pWav->msadpcm.prevFrames[0][0] = pWav->msadpcm.prevFrames[0][1]; - pWav->msadpcm.prevFrames[0][1] = newSample0; - newSample1 = ((pWav->msadpcm.prevFrames[1][1] * coeff1Table[pWav->msadpcm.predictor[1]]) + (pWav->msadpcm.prevFrames[1][0] * coeff2Table[pWav->msadpcm.predictor[1]])) >> 8; - newSample1 += nibble1 * pWav->msadpcm.delta[1]; - newSample1 = drwav_clamp(newSample1, -32768, 32767); - pWav->msadpcm.delta[1] = (adaptationTable[((nibbles & 0x0F) >> 0)] * pWav->msadpcm.delta[1]) >> 8; - if (pWav->msadpcm.delta[1] < 16) { - pWav->msadpcm.delta[1] = 16; - } - pWav->msadpcm.prevFrames[1][0] = pWav->msadpcm.prevFrames[1][1]; - pWav->msadpcm.prevFrames[1][1] = newSample1; - pWav->msadpcm.cachedFrames[2] = newSample0; - pWav->msadpcm.cachedFrames[3] = newSample1; - pWav->msadpcm.cachedFrameCount = 1; - } - } - } - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__ima(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 totalFramesRead = 0; - drwav_uint32 iChannel; - static drwav_int32 indexTable[16] = { - -1, -1, -1, -1, 2, 4, 6, 8, - -1, -1, -1, -1, 2, 4, 6, 8 - }; - static drwav_int32 stepTable[89] = { - 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, - 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, - 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, - 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, - 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, - 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, - 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, - 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, - 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 - }; - DRWAV_ASSERT(pWav != NULL); - DRWAV_ASSERT(framesToRead > 0); - while (pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) { - DRWAV_ASSERT(framesToRead > 0); - if (pWav->ima.cachedFrameCount == 0 && pWav->ima.bytesRemainingInBlock == 0) { - if (pWav->channels == 1) { - drwav_uint8 header[4]; - if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { - return totalFramesRead; - } - pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); - if (header[2] >= drwav_countof(stepTable)) { - pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, drwav_seek_origin_current); - pWav->ima.bytesRemainingInBlock = 0; - return totalFramesRead; - } - pWav->ima.predictor[0] = drwav_bytes_to_s16(header + 0); - pWav->ima.stepIndex[0] = drwav_clamp(header[2], 0, (drwav_int32)drwav_countof(stepTable)-1); - pWav->ima.cachedFrames[drwav_countof(pWav->ima.cachedFrames) - 1] = pWav->ima.predictor[0]; - pWav->ima.cachedFrameCount = 1; - } else { - drwav_uint8 header[8]; - if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { - return totalFramesRead; - } - pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); - if (header[2] >= drwav_countof(stepTable) || header[6] >= drwav_countof(stepTable)) { - pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, drwav_seek_origin_current); - pWav->ima.bytesRemainingInBlock = 0; - return totalFramesRead; - } - pWav->ima.predictor[0] = drwav_bytes_to_s16(header + 0); - pWav->ima.stepIndex[0] = drwav_clamp(header[2], 0, (drwav_int32)drwav_countof(stepTable)-1); - pWav->ima.predictor[1] = drwav_bytes_to_s16(header + 4); - pWav->ima.stepIndex[1] = drwav_clamp(header[6], 0, (drwav_int32)drwav_countof(stepTable)-1); - pWav->ima.cachedFrames[drwav_countof(pWav->ima.cachedFrames) - 2] = pWav->ima.predictor[0]; - pWav->ima.cachedFrames[drwav_countof(pWav->ima.cachedFrames) - 1] = pWav->ima.predictor[1]; - pWav->ima.cachedFrameCount = 1; - } - } - while (framesToRead > 0 && pWav->ima.cachedFrameCount > 0 && pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) { - if (pBufferOut != NULL) { - drwav_uint32 iSample; - for (iSample = 0; iSample < pWav->channels; iSample += 1) { - pBufferOut[iSample] = (drwav_int16)pWav->ima.cachedFrames[(drwav_countof(pWav->ima.cachedFrames) - (pWav->ima.cachedFrameCount*pWav->channels)) + iSample]; - } - pBufferOut += pWav->channels; - } - framesToRead -= 1; - totalFramesRead += 1; - pWav->readCursorInPCMFrames += 1; - pWav->ima.cachedFrameCount -= 1; - } - if (framesToRead == 0) { - break; - } - if (pWav->ima.cachedFrameCount == 0) { - if (pWav->ima.bytesRemainingInBlock == 0) { - continue; - } else { - pWav->ima.cachedFrameCount = 8; - for (iChannel = 0; iChannel < pWav->channels; ++iChannel) { - drwav_uint32 iByte; - drwav_uint8 nibbles[4]; - if (pWav->onRead(pWav->pUserData, &nibbles, 4) != 4) { - pWav->ima.cachedFrameCount = 0; - return totalFramesRead; - } - pWav->ima.bytesRemainingInBlock -= 4; - for (iByte = 0; iByte < 4; ++iByte) { - drwav_uint8 nibble0 = ((nibbles[iByte] & 0x0F) >> 0); - drwav_uint8 nibble1 = ((nibbles[iByte] & 0xF0) >> 4); - drwav_int32 step = stepTable[pWav->ima.stepIndex[iChannel]]; - drwav_int32 predictor = pWav->ima.predictor[iChannel]; - drwav_int32 diff = step >> 3; - if (nibble0 & 1) diff += step >> 2; - if (nibble0 & 2) diff += step >> 1; - if (nibble0 & 4) diff += step; - if (nibble0 & 8) diff = -diff; - predictor = drwav_clamp(predictor + diff, -32768, 32767); - pWav->ima.predictor[iChannel] = predictor; - pWav->ima.stepIndex[iChannel] = drwav_clamp(pWav->ima.stepIndex[iChannel] + indexTable[nibble0], 0, (drwav_int32)drwav_countof(stepTable)-1); - pWav->ima.cachedFrames[(drwav_countof(pWav->ima.cachedFrames) - (pWav->ima.cachedFrameCount*pWav->channels)) + (iByte*2+0)*pWav->channels + iChannel] = predictor; - step = stepTable[pWav->ima.stepIndex[iChannel]]; - predictor = pWav->ima.predictor[iChannel]; - diff = step >> 3; - if (nibble1 & 1) diff += step >> 2; - if (nibble1 & 2) diff += step >> 1; - if (nibble1 & 4) diff += step; - if (nibble1 & 8) diff = -diff; - predictor = drwav_clamp(predictor + diff, -32768, 32767); - pWav->ima.predictor[iChannel] = predictor; - pWav->ima.stepIndex[iChannel] = drwav_clamp(pWav->ima.stepIndex[iChannel] + indexTable[nibble1], 0, (drwav_int32)drwav_countof(stepTable)-1); - pWav->ima.cachedFrames[(drwav_countof(pWav->ima.cachedFrames) - (pWav->ima.cachedFrameCount*pWav->channels)) + (iByte*2+1)*pWav->channels + iChannel] = predictor; - } - } - } - } - } - return totalFramesRead; -} -#ifndef DR_WAV_NO_CONVERSION_API -static unsigned short g_drwavAlawTable[256] = { - 0xEA80, 0xEB80, 0xE880, 0xE980, 0xEE80, 0xEF80, 0xEC80, 0xED80, 0xE280, 0xE380, 0xE080, 0xE180, 0xE680, 0xE780, 0xE480, 0xE580, - 0xF540, 0xF5C0, 0xF440, 0xF4C0, 0xF740, 0xF7C0, 0xF640, 0xF6C0, 0xF140, 0xF1C0, 0xF040, 0xF0C0, 0xF340, 0xF3C0, 0xF240, 0xF2C0, - 0xAA00, 0xAE00, 0xA200, 0xA600, 0xBA00, 0xBE00, 0xB200, 0xB600, 0x8A00, 0x8E00, 0x8200, 0x8600, 0x9A00, 0x9E00, 0x9200, 0x9600, - 0xD500, 0xD700, 0xD100, 0xD300, 0xDD00, 0xDF00, 0xD900, 0xDB00, 0xC500, 0xC700, 0xC100, 0xC300, 0xCD00, 0xCF00, 0xC900, 0xCB00, - 0xFEA8, 0xFEB8, 0xFE88, 0xFE98, 0xFEE8, 0xFEF8, 0xFEC8, 0xFED8, 0xFE28, 0xFE38, 0xFE08, 0xFE18, 0xFE68, 0xFE78, 0xFE48, 0xFE58, - 0xFFA8, 0xFFB8, 0xFF88, 0xFF98, 0xFFE8, 0xFFF8, 0xFFC8, 0xFFD8, 0xFF28, 0xFF38, 0xFF08, 0xFF18, 0xFF68, 0xFF78, 0xFF48, 0xFF58, - 0xFAA0, 0xFAE0, 0xFA20, 0xFA60, 0xFBA0, 0xFBE0, 0xFB20, 0xFB60, 0xF8A0, 0xF8E0, 0xF820, 0xF860, 0xF9A0, 0xF9E0, 0xF920, 0xF960, - 0xFD50, 0xFD70, 0xFD10, 0xFD30, 0xFDD0, 0xFDF0, 0xFD90, 0xFDB0, 0xFC50, 0xFC70, 0xFC10, 0xFC30, 0xFCD0, 0xFCF0, 0xFC90, 0xFCB0, - 0x1580, 0x1480, 0x1780, 0x1680, 0x1180, 0x1080, 0x1380, 0x1280, 0x1D80, 0x1C80, 0x1F80, 0x1E80, 0x1980, 0x1880, 0x1B80, 0x1A80, - 0x0AC0, 0x0A40, 0x0BC0, 0x0B40, 0x08C0, 0x0840, 0x09C0, 0x0940, 0x0EC0, 0x0E40, 0x0FC0, 0x0F40, 0x0CC0, 0x0C40, 0x0DC0, 0x0D40, - 0x5600, 0x5200, 0x5E00, 0x5A00, 0x4600, 0x4200, 0x4E00, 0x4A00, 0x7600, 0x7200, 0x7E00, 0x7A00, 0x6600, 0x6200, 0x6E00, 0x6A00, - 0x2B00, 0x2900, 0x2F00, 0x2D00, 0x2300, 0x2100, 0x2700, 0x2500, 0x3B00, 0x3900, 0x3F00, 0x3D00, 0x3300, 0x3100, 0x3700, 0x3500, - 0x0158, 0x0148, 0x0178, 0x0168, 0x0118, 0x0108, 0x0138, 0x0128, 0x01D8, 0x01C8, 0x01F8, 0x01E8, 0x0198, 0x0188, 0x01B8, 0x01A8, - 0x0058, 0x0048, 0x0078, 0x0068, 0x0018, 0x0008, 0x0038, 0x0028, 0x00D8, 0x00C8, 0x00F8, 0x00E8, 0x0098, 0x0088, 0x00B8, 0x00A8, - 0x0560, 0x0520, 0x05E0, 0x05A0, 0x0460, 0x0420, 0x04E0, 0x04A0, 0x0760, 0x0720, 0x07E0, 0x07A0, 0x0660, 0x0620, 0x06E0, 0x06A0, - 0x02B0, 0x0290, 0x02F0, 0x02D0, 0x0230, 0x0210, 0x0270, 0x0250, 0x03B0, 0x0390, 0x03F0, 0x03D0, 0x0330, 0x0310, 0x0370, 0x0350 -}; -static unsigned short g_drwavMulawTable[256] = { - 0x8284, 0x8684, 0x8A84, 0x8E84, 0x9284, 0x9684, 0x9A84, 0x9E84, 0xA284, 0xA684, 0xAA84, 0xAE84, 0xB284, 0xB684, 0xBA84, 0xBE84, - 0xC184, 0xC384, 0xC584, 0xC784, 0xC984, 0xCB84, 0xCD84, 0xCF84, 0xD184, 0xD384, 0xD584, 0xD784, 0xD984, 0xDB84, 0xDD84, 0xDF84, - 0xE104, 0xE204, 0xE304, 0xE404, 0xE504, 0xE604, 0xE704, 0xE804, 0xE904, 0xEA04, 0xEB04, 0xEC04, 0xED04, 0xEE04, 0xEF04, 0xF004, - 0xF0C4, 0xF144, 0xF1C4, 0xF244, 0xF2C4, 0xF344, 0xF3C4, 0xF444, 0xF4C4, 0xF544, 0xF5C4, 0xF644, 0xF6C4, 0xF744, 0xF7C4, 0xF844, - 0xF8A4, 0xF8E4, 0xF924, 0xF964, 0xF9A4, 0xF9E4, 0xFA24, 0xFA64, 0xFAA4, 0xFAE4, 0xFB24, 0xFB64, 0xFBA4, 0xFBE4, 0xFC24, 0xFC64, - 0xFC94, 0xFCB4, 0xFCD4, 0xFCF4, 0xFD14, 0xFD34, 0xFD54, 0xFD74, 0xFD94, 0xFDB4, 0xFDD4, 0xFDF4, 0xFE14, 0xFE34, 0xFE54, 0xFE74, - 0xFE8C, 0xFE9C, 0xFEAC, 0xFEBC, 0xFECC, 0xFEDC, 0xFEEC, 0xFEFC, 0xFF0C, 0xFF1C, 0xFF2C, 0xFF3C, 0xFF4C, 0xFF5C, 0xFF6C, 0xFF7C, - 0xFF88, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0, 0xFFF8, 0x0000, - 0x7D7C, 0x797C, 0x757C, 0x717C, 0x6D7C, 0x697C, 0x657C, 0x617C, 0x5D7C, 0x597C, 0x557C, 0x517C, 0x4D7C, 0x497C, 0x457C, 0x417C, - 0x3E7C, 0x3C7C, 0x3A7C, 0x387C, 0x367C, 0x347C, 0x327C, 0x307C, 0x2E7C, 0x2C7C, 0x2A7C, 0x287C, 0x267C, 0x247C, 0x227C, 0x207C, - 0x1EFC, 0x1DFC, 0x1CFC, 0x1BFC, 0x1AFC, 0x19FC, 0x18FC, 0x17FC, 0x16FC, 0x15FC, 0x14FC, 0x13FC, 0x12FC, 0x11FC, 0x10FC, 0x0FFC, - 0x0F3C, 0x0EBC, 0x0E3C, 0x0DBC, 0x0D3C, 0x0CBC, 0x0C3C, 0x0BBC, 0x0B3C, 0x0ABC, 0x0A3C, 0x09BC, 0x093C, 0x08BC, 0x083C, 0x07BC, - 0x075C, 0x071C, 0x06DC, 0x069C, 0x065C, 0x061C, 0x05DC, 0x059C, 0x055C, 0x051C, 0x04DC, 0x049C, 0x045C, 0x041C, 0x03DC, 0x039C, - 0x036C, 0x034C, 0x032C, 0x030C, 0x02EC, 0x02CC, 0x02AC, 0x028C, 0x026C, 0x024C, 0x022C, 0x020C, 0x01EC, 0x01CC, 0x01AC, 0x018C, - 0x0174, 0x0164, 0x0154, 0x0144, 0x0134, 0x0124, 0x0114, 0x0104, 0x00F4, 0x00E4, 0x00D4, 0x00C4, 0x00B4, 0x00A4, 0x0094, 0x0084, - 0x0078, 0x0070, 0x0068, 0x0060, 0x0058, 0x0050, 0x0048, 0x0040, 0x0038, 0x0030, 0x0028, 0x0020, 0x0018, 0x0010, 0x0008, 0x0000 -}; -static DRWAV_INLINE drwav_int16 drwav__alaw_to_s16(drwav_uint8 sampleIn) -{ - return (short)g_drwavAlawTable[sampleIn]; -} -static DRWAV_INLINE drwav_int16 drwav__mulaw_to_s16(drwav_uint8 sampleIn) -{ - return (short)g_drwavMulawTable[sampleIn]; -} -DRWAV_PRIVATE void drwav__pcm_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample) -{ - size_t i; - if (bytesPerSample == 1) { - drwav_u8_to_s16(pOut, pIn, totalSampleCount); - return; - } - if (bytesPerSample == 2) { - for (i = 0; i < totalSampleCount; ++i) { - *pOut++ = ((const drwav_int16*)pIn)[i]; - } - return; - } - if (bytesPerSample == 3) { - drwav_s24_to_s16(pOut, pIn, totalSampleCount); - return; - } - if (bytesPerSample == 4) { - drwav_s32_to_s16(pOut, (const drwav_int32*)pIn, totalSampleCount); - return; - } - if (bytesPerSample > 8) { - DRWAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut)); - return; - } - for (i = 0; i < totalSampleCount; ++i) { - drwav_uint64 sample = 0; - unsigned int shift = (8 - bytesPerSample) * 8; - unsigned int j; - for (j = 0; j < bytesPerSample; j += 1) { - DRWAV_ASSERT(j < 8); - sample |= (drwav_uint64)(pIn[j]) << shift; - shift += 8; - } - pIn += j; - *pOut++ = (drwav_int16)((drwav_int64)sample >> 48); - } -} -DRWAV_PRIVATE void drwav__ieee_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample) -{ - if (bytesPerSample == 4) { - drwav_f32_to_s16(pOut, (const float*)pIn, totalSampleCount); - return; - } else if (bytesPerSample == 8) { - drwav_f64_to_s16(pOut, (const double*)pIn, totalSampleCount); - return; - } else { - DRWAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut)); - return; - } -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__pcm(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - if ((pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM && pWav->bitsPerSample == 16) || pBufferOut == NULL) { - return drwav_read_pcm_frames(pWav, framesToRead, pBufferOut); - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav__pcm_to_s16(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__ieee(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - if (pBufferOut == NULL) { - return drwav_read_pcm_frames(pWav, framesToRead, NULL); - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav__ieee_to_s16(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__alaw(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - if (pBufferOut == NULL) { - return drwav_read_pcm_frames(pWav, framesToRead, NULL); - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav_alaw_to_s16(pBufferOut, sampleData, (size_t)samplesRead); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s16__mulaw(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - if (pBufferOut == NULL) { - return drwav_read_pcm_frames(pWav, framesToRead, NULL); - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav_mulaw_to_s16(pBufferOut, sampleData, (size_t)samplesRead); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - if (pWav == NULL || framesToRead == 0) { - return 0; - } - if (pBufferOut == NULL) { - return drwav_read_pcm_frames(pWav, framesToRead, NULL); - } - if (framesToRead * pWav->channels * sizeof(drwav_int16) > DRWAV_SIZE_MAX) { - framesToRead = DRWAV_SIZE_MAX / sizeof(drwav_int16) / pWav->channels; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM) { - return drwav_read_pcm_frames_s16__pcm(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT) { - return drwav_read_pcm_frames_s16__ieee(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ALAW) { - return drwav_read_pcm_frames_s16__alaw(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_MULAW) { - return drwav_read_pcm_frames_s16__mulaw(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { - return drwav_read_pcm_frames_s16__msadpcm(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - return drwav_read_pcm_frames_s16__ima(pWav, framesToRead, pBufferOut); - } - return 0; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16le(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 framesRead = drwav_read_pcm_frames_s16(pWav, framesToRead, pBufferOut); - if (pBufferOut != NULL && drwav__is_little_endian() == DRWAV_FALSE) { - drwav__bswap_samples_s16(pBufferOut, framesRead*pWav->channels); - } - return framesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s16be(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) -{ - drwav_uint64 framesRead = drwav_read_pcm_frames_s16(pWav, framesToRead, pBufferOut); - if (pBufferOut != NULL && drwav__is_little_endian() == DRWAV_TRUE) { - drwav__bswap_samples_s16(pBufferOut, framesRead*pWav->channels); - } - return framesRead; -} -DRWAV_API void drwav_u8_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - int r; - size_t i; - for (i = 0; i < sampleCount; ++i) { - int x = pIn[i]; - r = x << 8; - r = r - 32768; - pOut[i] = (short)r; - } -} -DRWAV_API void drwav_s24_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - int r; - size_t i; - for (i = 0; i < sampleCount; ++i) { - int x = ((int)(((unsigned int)(((const drwav_uint8*)pIn)[i*3+0]) << 8) | ((unsigned int)(((const drwav_uint8*)pIn)[i*3+1]) << 16) | ((unsigned int)(((const drwav_uint8*)pIn)[i*3+2])) << 24)) >> 8; - r = x >> 8; - pOut[i] = (short)r; - } -} -DRWAV_API void drwav_s32_to_s16(drwav_int16* pOut, const drwav_int32* pIn, size_t sampleCount) -{ - int r; - size_t i; - for (i = 0; i < sampleCount; ++i) { - int x = pIn[i]; - r = x >> 16; - pOut[i] = (short)r; - } -} -DRWAV_API void drwav_f32_to_s16(drwav_int16* pOut, const float* pIn, size_t sampleCount) -{ - int r; - size_t i; - for (i = 0; i < sampleCount; ++i) { - float x = pIn[i]; - float c; - c = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); - c = c + 1; - r = (int)(c * 32767.5f); - r = r - 32768; - pOut[i] = (short)r; - } -} -DRWAV_API void drwav_f64_to_s16(drwav_int16* pOut, const double* pIn, size_t sampleCount) -{ - int r; - size_t i; - for (i = 0; i < sampleCount; ++i) { - double x = pIn[i]; - double c; - c = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); - c = c + 1; - r = (int)(c * 32767.5); - r = r - 32768; - pOut[i] = (short)r; - } -} -DRWAV_API void drwav_alaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - for (i = 0; i < sampleCount; ++i) { - pOut[i] = drwav__alaw_to_s16(pIn[i]); - } -} -DRWAV_API void drwav_mulaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - for (i = 0; i < sampleCount; ++i) { - pOut[i] = drwav__mulaw_to_s16(pIn[i]); - } -} -DRWAV_PRIVATE void drwav__pcm_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount, unsigned int bytesPerSample) -{ - unsigned int i; - if (bytesPerSample == 1) { - drwav_u8_to_f32(pOut, pIn, sampleCount); - return; - } - if (bytesPerSample == 2) { - drwav_s16_to_f32(pOut, (const drwav_int16*)pIn, sampleCount); - return; - } - if (bytesPerSample == 3) { - drwav_s24_to_f32(pOut, pIn, sampleCount); - return; - } - if (bytesPerSample == 4) { - drwav_s32_to_f32(pOut, (const drwav_int32*)pIn, sampleCount); - return; - } - if (bytesPerSample > 8) { - DRWAV_ZERO_MEMORY(pOut, sampleCount * sizeof(*pOut)); - return; - } - for (i = 0; i < sampleCount; ++i) { - drwav_uint64 sample = 0; - unsigned int shift = (8 - bytesPerSample) * 8; - unsigned int j; - for (j = 0; j < bytesPerSample; j += 1) { - DRWAV_ASSERT(j < 8); - sample |= (drwav_uint64)(pIn[j]) << shift; - shift += 8; - } - pIn += j; - *pOut++ = (float)((drwav_int64)sample / 9223372036854775807.0); - } -} -DRWAV_PRIVATE void drwav__ieee_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount, unsigned int bytesPerSample) -{ - if (bytesPerSample == 4) { - unsigned int i; - for (i = 0; i < sampleCount; ++i) { - *pOut++ = ((const float*)pIn)[i]; - } - return; - } else if (bytesPerSample == 8) { - drwav_f64_to_f32(pOut, (const double*)pIn, sampleCount); - return; - } else { - DRWAV_ZERO_MEMORY(pOut, sampleCount * sizeof(*pOut)); - return; - } -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_f32__pcm(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav__pcm_to_f32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_f32__msadpcm_ima(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_int16 samples16[2048]; - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, drwav_countof(samples16)/pWav->channels); - drwav_uint64 framesRead = drwav_read_pcm_frames_s16(pWav, framesToReadThisIteration, samples16); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - drwav_s16_to_f32(pBufferOut, samples16, (size_t)(framesRead*pWav->channels)); - pBufferOut += framesRead*pWav->channels; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_f32__ieee(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT && pWav->bitsPerSample == 32) { - return drwav_read_pcm_frames(pWav, framesToRead, pBufferOut); - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav__ieee_to_f32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_f32__alaw(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav_alaw_to_f32(pBufferOut, sampleData, (size_t)samplesRead); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_f32__mulaw(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav_mulaw_to_f32(pBufferOut, sampleData, (size_t)samplesRead); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - if (pWav == NULL || framesToRead == 0) { - return 0; - } - if (pBufferOut == NULL) { - return drwav_read_pcm_frames(pWav, framesToRead, NULL); - } - if (framesToRead * pWav->channels * sizeof(float) > DRWAV_SIZE_MAX) { - framesToRead = DRWAV_SIZE_MAX / sizeof(float) / pWav->channels; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM) { - return drwav_read_pcm_frames_f32__pcm(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM || pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - return drwav_read_pcm_frames_f32__msadpcm_ima(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT) { - return drwav_read_pcm_frames_f32__ieee(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ALAW) { - return drwav_read_pcm_frames_f32__alaw(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_MULAW) { - return drwav_read_pcm_frames_f32__mulaw(pWav, framesToRead, pBufferOut); - } - return 0; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32le(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - drwav_uint64 framesRead = drwav_read_pcm_frames_f32(pWav, framesToRead, pBufferOut); - if (pBufferOut != NULL && drwav__is_little_endian() == DRWAV_FALSE) { - drwav__bswap_samples_f32(pBufferOut, framesRead*pWav->channels); - } - return framesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_f32be(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) -{ - drwav_uint64 framesRead = drwav_read_pcm_frames_f32(pWav, framesToRead, pBufferOut); - if (pBufferOut != NULL && drwav__is_little_endian() == DRWAV_TRUE) { - drwav__bswap_samples_f32(pBufferOut, framesRead*pWav->channels); - } - return framesRead; -} -DRWAV_API void drwav_u8_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } -#ifdef DR_WAV_LIBSNDFILE_COMPAT - for (i = 0; i < sampleCount; ++i) { - *pOut++ = (pIn[i] / 256.0f) * 2 - 1; - } -#else - for (i = 0; i < sampleCount; ++i) { - float x = pIn[i]; - x = x * 0.00784313725490196078f; - x = x - 1; - *pOut++ = x; - } -#endif -} -DRWAV_API void drwav_s16_to_f32(float* pOut, const drwav_int16* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = pIn[i] * 0.000030517578125f; - } -} -DRWAV_API void drwav_s24_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - double x; - drwav_uint32 a = ((drwav_uint32)(pIn[i*3+0]) << 8); - drwav_uint32 b = ((drwav_uint32)(pIn[i*3+1]) << 16); - drwav_uint32 c = ((drwav_uint32)(pIn[i*3+2]) << 24); - x = (double)((drwav_int32)(a | b | c) >> 8); - *pOut++ = (float)(x * 0.00000011920928955078125); - } -} -DRWAV_API void drwav_s32_to_f32(float* pOut, const drwav_int32* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = (float)(pIn[i] / 2147483648.0); - } -} -DRWAV_API void drwav_f64_to_f32(float* pOut, const double* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = (float)pIn[i]; - } -} -DRWAV_API void drwav_alaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = drwav__alaw_to_s16(pIn[i]) / 32768.0f; - } -} -DRWAV_API void drwav_mulaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = drwav__mulaw_to_s16(pIn[i]) / 32768.0f; - } -} -DRWAV_PRIVATE void drwav__pcm_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample) -{ - unsigned int i; - if (bytesPerSample == 1) { - drwav_u8_to_s32(pOut, pIn, totalSampleCount); - return; - } - if (bytesPerSample == 2) { - drwav_s16_to_s32(pOut, (const drwav_int16*)pIn, totalSampleCount); - return; - } - if (bytesPerSample == 3) { - drwav_s24_to_s32(pOut, pIn, totalSampleCount); - return; - } - if (bytesPerSample == 4) { - for (i = 0; i < totalSampleCount; ++i) { - *pOut++ = ((const drwav_int32*)pIn)[i]; - } - return; - } - if (bytesPerSample > 8) { - DRWAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut)); - return; - } - for (i = 0; i < totalSampleCount; ++i) { - drwav_uint64 sample = 0; - unsigned int shift = (8 - bytesPerSample) * 8; - unsigned int j; - for (j = 0; j < bytesPerSample; j += 1) { - DRWAV_ASSERT(j < 8); - sample |= (drwav_uint64)(pIn[j]) << shift; - shift += 8; - } - pIn += j; - *pOut++ = (drwav_int32)((drwav_int64)sample >> 32); - } -} -DRWAV_PRIVATE void drwav__ieee_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample) -{ - if (bytesPerSample == 4) { - drwav_f32_to_s32(pOut, (const float*)pIn, totalSampleCount); - return; - } else if (bytesPerSample == 8) { - drwav_f64_to_s32(pOut, (const double*)pIn, totalSampleCount); - return; - } else { - DRWAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut)); - return; - } -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s32__pcm(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM && pWav->bitsPerSample == 32) { - return drwav_read_pcm_frames(pWav, framesToRead, pBufferOut); - } - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav__pcm_to_s32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s32__msadpcm_ima(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - drwav_uint64 totalFramesRead = 0; - drwav_int16 samples16[2048]; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, drwav_countof(samples16)/pWav->channels); - drwav_uint64 framesRead = drwav_read_pcm_frames_s16(pWav, framesToReadThisIteration, samples16); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - drwav_s16_to_s32(pBufferOut, samples16, (size_t)(framesRead*pWav->channels)); - pBufferOut += framesRead*pWav->channels; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s32__ieee(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav__ieee_to_s32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s32__alaw(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav_alaw_to_s32(pBufferOut, sampleData, (size_t)samplesRead); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_PRIVATE drwav_uint64 drwav_read_pcm_frames_s32__mulaw(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - drwav_uint64 totalFramesRead; - drwav_uint8 sampleData[4096] = {0}; - drwav_uint32 bytesPerFrame; - drwav_uint32 bytesPerSample; - drwav_uint64 samplesRead; - bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); - if (bytesPerFrame == 0) { - return 0; - } - bytesPerSample = bytesPerFrame / pWav->channels; - if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) { - return 0; - } - totalFramesRead = 0; - while (framesToRead > 0) { - drwav_uint64 framesToReadThisIteration = drwav_min(framesToRead, sizeof(sampleData)/bytesPerFrame); - drwav_uint64 framesRead = drwav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData); - if (framesRead == 0) { - break; - } - DRWAV_ASSERT(framesRead <= framesToReadThisIteration); - samplesRead = framesRead * pWav->channels; - if ((samplesRead * bytesPerSample) > sizeof(sampleData)) { - DRWAV_ASSERT(DRWAV_FALSE); - break; - } - drwav_mulaw_to_s32(pBufferOut, sampleData, (size_t)samplesRead); - pBufferOut += samplesRead; - framesToRead -= framesRead; - totalFramesRead += framesRead; - } - return totalFramesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - if (pWav == NULL || framesToRead == 0) { - return 0; - } - if (pBufferOut == NULL) { - return drwav_read_pcm_frames(pWav, framesToRead, NULL); - } - if (framesToRead * pWav->channels * sizeof(drwav_int32) > DRWAV_SIZE_MAX) { - framesToRead = DRWAV_SIZE_MAX / sizeof(drwav_int32) / pWav->channels; - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM) { - return drwav_read_pcm_frames_s32__pcm(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM || pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { - return drwav_read_pcm_frames_s32__msadpcm_ima(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT) { - return drwav_read_pcm_frames_s32__ieee(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ALAW) { - return drwav_read_pcm_frames_s32__alaw(pWav, framesToRead, pBufferOut); - } - if (pWav->translatedFormatTag == DR_WAVE_FORMAT_MULAW) { - return drwav_read_pcm_frames_s32__mulaw(pWav, framesToRead, pBufferOut); - } - return 0; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32le(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - drwav_uint64 framesRead = drwav_read_pcm_frames_s32(pWav, framesToRead, pBufferOut); - if (pBufferOut != NULL && drwav__is_little_endian() == DRWAV_FALSE) { - drwav__bswap_samples_s32(pBufferOut, framesRead*pWav->channels); - } - return framesRead; -} -DRWAV_API drwav_uint64 drwav_read_pcm_frames_s32be(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) -{ - drwav_uint64 framesRead = drwav_read_pcm_frames_s32(pWav, framesToRead, pBufferOut); - if (pBufferOut != NULL && drwav__is_little_endian() == DRWAV_TRUE) { - drwav__bswap_samples_s32(pBufferOut, framesRead*pWav->channels); - } - return framesRead; -} -DRWAV_API void drwav_u8_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = ((int)pIn[i] - 128) << 24; - } -} -DRWAV_API void drwav_s16_to_s32(drwav_int32* pOut, const drwav_int16* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = pIn[i] << 16; - } -} -DRWAV_API void drwav_s24_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - unsigned int s0 = pIn[i*3 + 0]; - unsigned int s1 = pIn[i*3 + 1]; - unsigned int s2 = pIn[i*3 + 2]; - drwav_int32 sample32 = (drwav_int32)((s0 << 8) | (s1 << 16) | (s2 << 24)); - *pOut++ = sample32; - } -} -DRWAV_API void drwav_f32_to_s32(drwav_int32* pOut, const float* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = (drwav_int32)(2147483648.0 * pIn[i]); - } -} -DRWAV_API void drwav_f64_to_s32(drwav_int32* pOut, const double* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = (drwav_int32)(2147483648.0 * pIn[i]); - } -} -DRWAV_API void drwav_alaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i = 0; i < sampleCount; ++i) { - *pOut++ = ((drwav_int32)drwav__alaw_to_s16(pIn[i])) << 16; - } -} -DRWAV_API void drwav_mulaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) -{ - size_t i; - if (pOut == NULL || pIn == NULL) { - return; - } - for (i= 0; i < sampleCount; ++i) { - *pOut++ = ((drwav_int32)drwav__mulaw_to_s16(pIn[i])) << 16; - } -} -DRWAV_PRIVATE drwav_int16* drwav__read_pcm_frames_and_close_s16(drwav* pWav, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount) -{ - drwav_uint64 sampleDataSize; - drwav_int16* pSampleData; - drwav_uint64 framesRead; - DRWAV_ASSERT(pWav != NULL); - sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(drwav_int16); - if (sampleDataSize > DRWAV_SIZE_MAX) { - drwav_uninit(pWav); - return NULL; - } - pSampleData = (drwav_int16*)drwav__malloc_from_callbacks((size_t)sampleDataSize, &pWav->allocationCallbacks); - if (pSampleData == NULL) { - drwav_uninit(pWav); - return NULL; - } - framesRead = drwav_read_pcm_frames_s16(pWav, (size_t)pWav->totalPCMFrameCount, pSampleData); - if (framesRead != pWav->totalPCMFrameCount) { - drwav__free_from_callbacks(pSampleData, &pWav->allocationCallbacks); - drwav_uninit(pWav); - return NULL; - } - drwav_uninit(pWav); - if (sampleRate) { - *sampleRate = pWav->sampleRate; - } - if (channels) { - *channels = pWav->channels; - } - if (totalFrameCount) { - *totalFrameCount = pWav->totalPCMFrameCount; - } - return pSampleData; -} -DRWAV_PRIVATE float* drwav__read_pcm_frames_and_close_f32(drwav* pWav, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount) -{ - drwav_uint64 sampleDataSize; - float* pSampleData; - drwav_uint64 framesRead; - DRWAV_ASSERT(pWav != NULL); - sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(float); - if (sampleDataSize > DRWAV_SIZE_MAX) { - drwav_uninit(pWav); - return NULL; - } - pSampleData = (float*)drwav__malloc_from_callbacks((size_t)sampleDataSize, &pWav->allocationCallbacks); - if (pSampleData == NULL) { - drwav_uninit(pWav); - return NULL; - } - framesRead = drwav_read_pcm_frames_f32(pWav, (size_t)pWav->totalPCMFrameCount, pSampleData); - if (framesRead != pWav->totalPCMFrameCount) { - drwav__free_from_callbacks(pSampleData, &pWav->allocationCallbacks); - drwav_uninit(pWav); - return NULL; - } - drwav_uninit(pWav); - if (sampleRate) { - *sampleRate = pWav->sampleRate; - } - if (channels) { - *channels = pWav->channels; - } - if (totalFrameCount) { - *totalFrameCount = pWav->totalPCMFrameCount; - } - return pSampleData; -} -DRWAV_PRIVATE drwav_int32* drwav__read_pcm_frames_and_close_s32(drwav* pWav, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount) -{ - drwav_uint64 sampleDataSize; - drwav_int32* pSampleData; - drwav_uint64 framesRead; - DRWAV_ASSERT(pWav != NULL); - sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(drwav_int32); - if (sampleDataSize > DRWAV_SIZE_MAX) { - drwav_uninit(pWav); - return NULL; - } - pSampleData = (drwav_int32*)drwav__malloc_from_callbacks((size_t)sampleDataSize, &pWav->allocationCallbacks); - if (pSampleData == NULL) { - drwav_uninit(pWav); - return NULL; - } - framesRead = drwav_read_pcm_frames_s32(pWav, (size_t)pWav->totalPCMFrameCount, pSampleData); - if (framesRead != pWav->totalPCMFrameCount) { - drwav__free_from_callbacks(pSampleData, &pWav->allocationCallbacks); - drwav_uninit(pWav); - return NULL; - } - drwav_uninit(pWav); - if (sampleRate) { - *sampleRate = pWav->sampleRate; - } - if (channels) { - *channels = pWav->channels; - } - if (totalFrameCount) { - *totalFrameCount = pWav->totalPCMFrameCount; - } - return pSampleData; -} -DRWAV_API drwav_int16* drwav_open_and_read_pcm_frames_s16(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API float* drwav_open_and_read_pcm_frames_f32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API drwav_int32* drwav_open_and_read_pcm_frames_s32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -#ifndef DR_WAV_NO_STDIO -DRWAV_API drwav_int16* drwav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_file(&wav, filename, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API float* drwav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_file(&wav, filename, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_file(&wav, filename, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API drwav_int16* drwav_open_file_and_read_pcm_frames_s16_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (channelsOut) { - *channelsOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_file_w(&wav, filename, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API float* drwav_open_file_and_read_pcm_frames_f32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (channelsOut) { - *channelsOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_file_w(&wav, filename, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (channelsOut) { - *channelsOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_file_w(&wav, filename, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -#endif -DRWAV_API drwav_int16* drwav_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_memory(&wav, data, dataSize, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API float* drwav_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_memory(&wav, data, dataSize, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -DRWAV_API drwav_int32* drwav_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - drwav wav; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalFrameCountOut) { - *totalFrameCountOut = 0; - } - if (!drwav_init_memory(&wav, data, dataSize, pAllocationCallbacks)) { - return NULL; - } - return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); -} -#endif -DRWAV_API void drwav_free(void* p, const drwav_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - drwav__free_from_callbacks(p, pAllocationCallbacks); - } else { - drwav__free_default(p, NULL); - } -} -DRWAV_API drwav_uint16 drwav_bytes_to_u16(const drwav_uint8* data) -{ - return ((drwav_uint16)data[0] << 0) | ((drwav_uint16)data[1] << 8); -} -DRWAV_API drwav_int16 drwav_bytes_to_s16(const drwav_uint8* data) -{ - return (drwav_int16)drwav_bytes_to_u16(data); -} -DRWAV_API drwav_uint32 drwav_bytes_to_u32(const drwav_uint8* data) -{ - return ((drwav_uint32)data[0] << 0) | ((drwav_uint32)data[1] << 8) | ((drwav_uint32)data[2] << 16) | ((drwav_uint32)data[3] << 24); -} -DRWAV_API float drwav_bytes_to_f32(const drwav_uint8* data) -{ - union { - drwav_uint32 u32; - float f32; - } value; - value.u32 = drwav_bytes_to_u32(data); - return value.f32; -} -DRWAV_API drwav_int32 drwav_bytes_to_s32(const drwav_uint8* data) -{ - return (drwav_int32)drwav_bytes_to_u32(data); -} -DRWAV_API drwav_uint64 drwav_bytes_to_u64(const drwav_uint8* data) -{ - return - ((drwav_uint64)data[0] << 0) | ((drwav_uint64)data[1] << 8) | ((drwav_uint64)data[2] << 16) | ((drwav_uint64)data[3] << 24) | - ((drwav_uint64)data[4] << 32) | ((drwav_uint64)data[5] << 40) | ((drwav_uint64)data[6] << 48) | ((drwav_uint64)data[7] << 56); -} -DRWAV_API drwav_int64 drwav_bytes_to_s64(const drwav_uint8* data) -{ - return (drwav_int64)drwav_bytes_to_u64(data); -} -DRWAV_API drwav_bool32 drwav_guid_equal(const drwav_uint8 a[16], const drwav_uint8 b[16]) -{ - int i; - for (i = 0; i < 16; i += 1) { - if (a[i] != b[i]) { - return DRWAV_FALSE; - } - } - return DRWAV_TRUE; -} -DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8* a, const char* b) -{ - return - a[0] == b[0] && - a[1] == b[1] && - a[2] == b[2] && - a[3] == b[3]; -} -#endif -/* dr_wav_c end */ -#endif /* DRWAV_IMPLEMENTATION */ -#endif /* MA_NO_WAV */ - -#if !defined(MA_NO_FLAC) && !defined(MA_NO_DECODING) -#if !defined(DR_FLAC_IMPLEMENTATION) && !defined(DRFLAC_IMPLEMENTATION) /* For backwards compatibility. Will be removed in version 0.11 for cleanliness. */ -/* dr_flac_c begin */ -#ifndef dr_flac_c -#define dr_flac_c -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic push - #if __GNUC__ >= 7 - #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" - #endif -#endif -#ifdef __linux__ - #ifndef _BSD_SOURCE - #define _BSD_SOURCE - #endif - #ifndef _DEFAULT_SOURCE - #define _DEFAULT_SOURCE - #endif - #ifndef __USE_BSD - #define __USE_BSD - #endif - #include -#endif -#include -#include -#ifdef _MSC_VER - #define DRFLAC_INLINE __forceinline -#elif defined(__GNUC__) - #if defined(__STRICT_ANSI__) - #define DRFLAC_GNUC_INLINE_HINT __inline__ - #else - #define DRFLAC_GNUC_INLINE_HINT inline - #endif - #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__) - #define DRFLAC_INLINE DRFLAC_GNUC_INLINE_HINT __attribute__((always_inline)) - #else - #define DRFLAC_INLINE DRFLAC_GNUC_INLINE_HINT - #endif -#elif defined(__WATCOMC__) - #define DRFLAC_INLINE __inline -#else - #define DRFLAC_INLINE -#endif -#if defined(__x86_64__) || defined(_M_X64) - #define DRFLAC_X64 -#elif defined(__i386) || defined(_M_IX86) - #define DRFLAC_X86 -#elif defined(__arm__) || defined(_M_ARM) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) - #define DRFLAC_ARM -#endif -#if !defined(DR_FLAC_NO_SIMD) - #if defined(DRFLAC_X64) || defined(DRFLAC_X86) - #if defined(_MSC_VER) && !defined(__clang__) - #if _MSC_VER >= 1400 && !defined(DRFLAC_NO_SSE2) - #define DRFLAC_SUPPORT_SSE2 - #endif - #if _MSC_VER >= 1600 && !defined(DRFLAC_NO_SSE41) - #define DRFLAC_SUPPORT_SSE41 - #endif - #elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) - #if defined(__SSE2__) && !defined(DRFLAC_NO_SSE2) - #define DRFLAC_SUPPORT_SSE2 - #endif - #if defined(__SSE4_1__) && !defined(DRFLAC_NO_SSE41) - #define DRFLAC_SUPPORT_SSE41 - #endif - #endif - #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include) - #if !defined(DRFLAC_SUPPORT_SSE2) && !defined(DRFLAC_NO_SSE2) && __has_include() - #define DRFLAC_SUPPORT_SSE2 - #endif - #if !defined(DRFLAC_SUPPORT_SSE41) && !defined(DRFLAC_NO_SSE41) && __has_include() - #define DRFLAC_SUPPORT_SSE41 - #endif - #endif - #if defined(DRFLAC_SUPPORT_SSE41) - #include - #elif defined(DRFLAC_SUPPORT_SSE2) - #include - #endif - #endif - #if defined(DRFLAC_ARM) - #if !defined(DRFLAC_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)) - #define DRFLAC_SUPPORT_NEON - #include - #endif - #endif -#endif -#if !defined(DR_FLAC_NO_SIMD) && (defined(DRFLAC_X86) || defined(DRFLAC_X64)) - #if defined(_MSC_VER) && !defined(__clang__) - #if _MSC_VER >= 1400 - #include - static void drflac__cpuid(int info[4], int fid) - { - __cpuid(info, fid); - } - #else - #define DRFLAC_NO_CPUID - #endif - #else - #if defined(__GNUC__) || defined(__clang__) - static void drflac__cpuid(int info[4], int fid) - { - #if defined(DRFLAC_X86) && defined(__PIC__) - __asm__ __volatile__ ( - "xchg{l} {%%}ebx, %k1;" - "cpuid;" - "xchg{l} {%%}ebx, %k1;" - : "=a"(info[0]), "=&r"(info[1]), "=c"(info[2]), "=d"(info[3]) : "a"(fid), "c"(0) - ); - #else - __asm__ __volatile__ ( - "cpuid" : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3]) : "a"(fid), "c"(0) - ); - #endif - } - #else - #define DRFLAC_NO_CPUID - #endif - #endif -#else - #define DRFLAC_NO_CPUID -#endif -static DRFLAC_INLINE drflac_bool32 drflac_has_sse2(void) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - #if (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(DRFLAC_NO_SSE2) - #if defined(DRFLAC_X64) - return DRFLAC_TRUE; - #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__) - return DRFLAC_TRUE; - #else - #if defined(DRFLAC_NO_CPUID) - return DRFLAC_FALSE; - #else - int info[4]; - drflac__cpuid(info, 1); - return (info[3] & (1 << 26)) != 0; - #endif - #endif - #else - return DRFLAC_FALSE; - #endif -#else - return DRFLAC_FALSE; -#endif -} -static DRFLAC_INLINE drflac_bool32 drflac_has_sse41(void) -{ -#if defined(DRFLAC_SUPPORT_SSE41) - #if (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(DRFLAC_NO_SSE41) - #if defined(DRFLAC_X64) - return DRFLAC_TRUE; - #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE4_1__) - return DRFLAC_TRUE; - #else - #if defined(DRFLAC_NO_CPUID) - return DRFLAC_FALSE; - #else - int info[4]; - drflac__cpuid(info, 1); - return (info[2] & (1 << 19)) != 0; - #endif - #endif - #else - return DRFLAC_FALSE; - #endif -#else - return DRFLAC_FALSE; -#endif -} -#if defined(_MSC_VER) && _MSC_VER >= 1500 && (defined(DRFLAC_X86) || defined(DRFLAC_X64)) && !defined(__clang__) - #define DRFLAC_HAS_LZCNT_INTRINSIC -#elif (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) - #define DRFLAC_HAS_LZCNT_INTRINSIC -#elif defined(__clang__) - #if defined(__has_builtin) - #if __has_builtin(__builtin_clzll) || __has_builtin(__builtin_clzl) - #define DRFLAC_HAS_LZCNT_INTRINSIC - #endif - #endif -#endif -#if defined(_MSC_VER) && _MSC_VER >= 1400 && !defined(__clang__) - #define DRFLAC_HAS_BYTESWAP16_INTRINSIC - #define DRFLAC_HAS_BYTESWAP32_INTRINSIC - #define DRFLAC_HAS_BYTESWAP64_INTRINSIC -#elif defined(__clang__) - #if defined(__has_builtin) - #if __has_builtin(__builtin_bswap16) - #define DRFLAC_HAS_BYTESWAP16_INTRINSIC - #endif - #if __has_builtin(__builtin_bswap32) - #define DRFLAC_HAS_BYTESWAP32_INTRINSIC - #endif - #if __has_builtin(__builtin_bswap64) - #define DRFLAC_HAS_BYTESWAP64_INTRINSIC - #endif - #endif -#elif defined(__GNUC__) - #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define DRFLAC_HAS_BYTESWAP32_INTRINSIC - #define DRFLAC_HAS_BYTESWAP64_INTRINSIC - #endif - #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) - #define DRFLAC_HAS_BYTESWAP16_INTRINSIC - #endif -#elif defined(__WATCOMC__) && defined(__386__) - #define DRFLAC_HAS_BYTESWAP16_INTRINSIC - #define DRFLAC_HAS_BYTESWAP32_INTRINSIC - #define DRFLAC_HAS_BYTESWAP64_INTRINSIC - extern __inline drflac_uint16 _watcom_bswap16(drflac_uint16); - extern __inline drflac_uint32 _watcom_bswap32(drflac_uint32); - extern __inline drflac_uint64 _watcom_bswap64(drflac_uint64); -#pragma aux _watcom_bswap16 = \ - "xchg al, ah" \ - parm [ax] \ - modify [ax]; -#pragma aux _watcom_bswap32 = \ - "bswap eax" \ - parm [eax] \ - modify [eax]; -#pragma aux _watcom_bswap64 = \ - "bswap eax" \ - "bswap edx" \ - "xchg eax,edx" \ - parm [eax edx] \ - modify [eax edx]; -#endif -#ifndef DRFLAC_ASSERT -#include -#define DRFLAC_ASSERT(expression) assert(expression) -#endif -#ifndef DRFLAC_MALLOC -#define DRFLAC_MALLOC(sz) malloc((sz)) -#endif -#ifndef DRFLAC_REALLOC -#define DRFLAC_REALLOC(p, sz) realloc((p), (sz)) -#endif -#ifndef DRFLAC_FREE -#define DRFLAC_FREE(p) free((p)) -#endif -#ifndef DRFLAC_COPY_MEMORY -#define DRFLAC_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) -#endif -#ifndef DRFLAC_ZERO_MEMORY -#define DRFLAC_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) -#endif -#ifndef DRFLAC_ZERO_OBJECT -#define DRFLAC_ZERO_OBJECT(p) DRFLAC_ZERO_MEMORY((p), sizeof(*(p))) -#endif -#define DRFLAC_MAX_SIMD_VECTOR_SIZE 64 -typedef drflac_int32 drflac_result; -#define DRFLAC_SUCCESS 0 -#define DRFLAC_ERROR -1 -#define DRFLAC_INVALID_ARGS -2 -#define DRFLAC_INVALID_OPERATION -3 -#define DRFLAC_OUT_OF_MEMORY -4 -#define DRFLAC_OUT_OF_RANGE -5 -#define DRFLAC_ACCESS_DENIED -6 -#define DRFLAC_DOES_NOT_EXIST -7 -#define DRFLAC_ALREADY_EXISTS -8 -#define DRFLAC_TOO_MANY_OPEN_FILES -9 -#define DRFLAC_INVALID_FILE -10 -#define DRFLAC_TOO_BIG -11 -#define DRFLAC_PATH_TOO_LONG -12 -#define DRFLAC_NAME_TOO_LONG -13 -#define DRFLAC_NOT_DIRECTORY -14 -#define DRFLAC_IS_DIRECTORY -15 -#define DRFLAC_DIRECTORY_NOT_EMPTY -16 -#define DRFLAC_END_OF_FILE -17 -#define DRFLAC_NO_SPACE -18 -#define DRFLAC_BUSY -19 -#define DRFLAC_IO_ERROR -20 -#define DRFLAC_INTERRUPT -21 -#define DRFLAC_UNAVAILABLE -22 -#define DRFLAC_ALREADY_IN_USE -23 -#define DRFLAC_BAD_ADDRESS -24 -#define DRFLAC_BAD_SEEK -25 -#define DRFLAC_BAD_PIPE -26 -#define DRFLAC_DEADLOCK -27 -#define DRFLAC_TOO_MANY_LINKS -28 -#define DRFLAC_NOT_IMPLEMENTED -29 -#define DRFLAC_NO_MESSAGE -30 -#define DRFLAC_BAD_MESSAGE -31 -#define DRFLAC_NO_DATA_AVAILABLE -32 -#define DRFLAC_INVALID_DATA -33 -#define DRFLAC_TIMEOUT -34 -#define DRFLAC_NO_NETWORK -35 -#define DRFLAC_NOT_UNIQUE -36 -#define DRFLAC_NOT_SOCKET -37 -#define DRFLAC_NO_ADDRESS -38 -#define DRFLAC_BAD_PROTOCOL -39 -#define DRFLAC_PROTOCOL_UNAVAILABLE -40 -#define DRFLAC_PROTOCOL_NOT_SUPPORTED -41 -#define DRFLAC_PROTOCOL_FAMILY_NOT_SUPPORTED -42 -#define DRFLAC_ADDRESS_FAMILY_NOT_SUPPORTED -43 -#define DRFLAC_SOCKET_NOT_SUPPORTED -44 -#define DRFLAC_CONNECTION_RESET -45 -#define DRFLAC_ALREADY_CONNECTED -46 -#define DRFLAC_NOT_CONNECTED -47 -#define DRFLAC_CONNECTION_REFUSED -48 -#define DRFLAC_NO_HOST -49 -#define DRFLAC_IN_PROGRESS -50 -#define DRFLAC_CANCELLED -51 -#define DRFLAC_MEMORY_ALREADY_MAPPED -52 -#define DRFLAC_AT_END -53 -#define DRFLAC_CRC_MISMATCH -128 -#define DRFLAC_SUBFRAME_CONSTANT 0 -#define DRFLAC_SUBFRAME_VERBATIM 1 -#define DRFLAC_SUBFRAME_FIXED 8 -#define DRFLAC_SUBFRAME_LPC 32 -#define DRFLAC_SUBFRAME_RESERVED 255 -#define DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE 0 -#define DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 1 -#define DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT 0 -#define DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE 8 -#define DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE 9 -#define DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE 10 -#define drflac_align(x, a) ((((x) + (a) - 1) / (a)) * (a)) -DRFLAC_API void drflac_version(drflac_uint32* pMajor, drflac_uint32* pMinor, drflac_uint32* pRevision) -{ - if (pMajor) { - *pMajor = DRFLAC_VERSION_MAJOR; - } - if (pMinor) { - *pMinor = DRFLAC_VERSION_MINOR; - } - if (pRevision) { - *pRevision = DRFLAC_VERSION_REVISION; - } -} -DRFLAC_API const char* drflac_version_string(void) -{ - return DRFLAC_VERSION_STRING; -} -#if defined(__has_feature) - #if __has_feature(thread_sanitizer) - #define DRFLAC_NO_THREAD_SANITIZE __attribute__((no_sanitize("thread"))) - #else - #define DRFLAC_NO_THREAD_SANITIZE - #endif -#else - #define DRFLAC_NO_THREAD_SANITIZE -#endif -#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) -static drflac_bool32 drflac__gIsLZCNTSupported = DRFLAC_FALSE; -#endif -#ifndef DRFLAC_NO_CPUID -static drflac_bool32 drflac__gIsSSE2Supported = DRFLAC_FALSE; -static drflac_bool32 drflac__gIsSSE41Supported = DRFLAC_FALSE; -DRFLAC_NO_THREAD_SANITIZE static void drflac__init_cpu_caps(void) -{ - static drflac_bool32 isCPUCapsInitialized = DRFLAC_FALSE; - if (!isCPUCapsInitialized) { -#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) - int info[4] = {0}; - drflac__cpuid(info, 0x80000001); - drflac__gIsLZCNTSupported = (info[2] & (1 << 5)) != 0; -#endif - drflac__gIsSSE2Supported = drflac_has_sse2(); - drflac__gIsSSE41Supported = drflac_has_sse41(); - isCPUCapsInitialized = DRFLAC_TRUE; - } -} -#else -static drflac_bool32 drflac__gIsNEONSupported = DRFLAC_FALSE; -static DRFLAC_INLINE drflac_bool32 drflac__has_neon(void) -{ -#if defined(DRFLAC_SUPPORT_NEON) - #if defined(DRFLAC_ARM) && !defined(DRFLAC_NO_NEON) - #if (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)) - return DRFLAC_TRUE; - #else - return DRFLAC_FALSE; - #endif - #else - return DRFLAC_FALSE; - #endif -#else - return DRFLAC_FALSE; -#endif -} -DRFLAC_NO_THREAD_SANITIZE static void drflac__init_cpu_caps(void) -{ - drflac__gIsNEONSupported = drflac__has_neon(); -#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) && defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) - drflac__gIsLZCNTSupported = DRFLAC_TRUE; -#endif -} -#endif -static DRFLAC_INLINE drflac_bool32 drflac__is_little_endian(void) -{ -#if defined(DRFLAC_X86) || defined(DRFLAC_X64) - return DRFLAC_TRUE; -#elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN - return DRFLAC_TRUE; -#else - int n = 1; - return (*(char*)&n) == 1; -#endif -} -static DRFLAC_INLINE drflac_uint16 drflac__swap_endian_uint16(drflac_uint16 n) -{ -#ifdef DRFLAC_HAS_BYTESWAP16_INTRINSIC - #if defined(_MSC_VER) && !defined(__clang__) - return _byteswap_ushort(n); - #elif defined(__GNUC__) || defined(__clang__) - return __builtin_bswap16(n); - #elif defined(__WATCOMC__) && defined(__386__) - return _watcom_bswap16(n); - #else - #error "This compiler does not support the byte swap intrinsic." - #endif -#else - return ((n & 0xFF00) >> 8) | - ((n & 0x00FF) << 8); -#endif -} -static DRFLAC_INLINE drflac_uint32 drflac__swap_endian_uint32(drflac_uint32 n) -{ -#ifdef DRFLAC_HAS_BYTESWAP32_INTRINSIC - #if defined(_MSC_VER) && !defined(__clang__) - return _byteswap_ulong(n); - #elif defined(__GNUC__) || defined(__clang__) - #if defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(DRFLAC_64BIT) - drflac_uint32 r; - __asm__ __volatile__ ( - #if defined(DRFLAC_64BIT) - "rev %w[out], %w[in]" : [out]"=r"(r) : [in]"r"(n) - #else - "rev %[out], %[in]" : [out]"=r"(r) : [in]"r"(n) - #endif - ); - return r; - #else - return __builtin_bswap32(n); - #endif - #elif defined(__WATCOMC__) && defined(__386__) - return _watcom_bswap32(n); - #else - #error "This compiler does not support the byte swap intrinsic." - #endif -#else - return ((n & 0xFF000000) >> 24) | - ((n & 0x00FF0000) >> 8) | - ((n & 0x0000FF00) << 8) | - ((n & 0x000000FF) << 24); -#endif -} -static DRFLAC_INLINE drflac_uint64 drflac__swap_endian_uint64(drflac_uint64 n) -{ -#ifdef DRFLAC_HAS_BYTESWAP64_INTRINSIC - #if defined(_MSC_VER) && !defined(__clang__) - return _byteswap_uint64(n); - #elif defined(__GNUC__) || defined(__clang__) - return __builtin_bswap64(n); - #elif defined(__WATCOMC__) && defined(__386__) - return _watcom_bswap64(n); - #else - #error "This compiler does not support the byte swap intrinsic." - #endif -#else - return ((n & ((drflac_uint64)0xFF000000 << 32)) >> 56) | - ((n & ((drflac_uint64)0x00FF0000 << 32)) >> 40) | - ((n & ((drflac_uint64)0x0000FF00 << 32)) >> 24) | - ((n & ((drflac_uint64)0x000000FF << 32)) >> 8) | - ((n & ((drflac_uint64)0xFF000000 )) << 8) | - ((n & ((drflac_uint64)0x00FF0000 )) << 24) | - ((n & ((drflac_uint64)0x0000FF00 )) << 40) | - ((n & ((drflac_uint64)0x000000FF )) << 56); -#endif -} -static DRFLAC_INLINE drflac_uint16 drflac__be2host_16(drflac_uint16 n) -{ - if (drflac__is_little_endian()) { - return drflac__swap_endian_uint16(n); - } - return n; -} -static DRFLAC_INLINE drflac_uint32 drflac__be2host_32(drflac_uint32 n) -{ - if (drflac__is_little_endian()) { - return drflac__swap_endian_uint32(n); - } - return n; -} -static DRFLAC_INLINE drflac_uint32 drflac__be2host_32_ptr_unaligned(const void* pData) -{ - const drflac_uint8* pNum = (drflac_uint8*)pData; - return *(pNum) << 24 | *(pNum+1) << 16 | *(pNum+2) << 8 | *(pNum+3); -} -static DRFLAC_INLINE drflac_uint64 drflac__be2host_64(drflac_uint64 n) -{ - if (drflac__is_little_endian()) { - return drflac__swap_endian_uint64(n); - } - return n; -} -static DRFLAC_INLINE drflac_uint32 drflac__le2host_32(drflac_uint32 n) -{ - if (!drflac__is_little_endian()) { - return drflac__swap_endian_uint32(n); - } - return n; -} -static DRFLAC_INLINE drflac_uint32 drflac__le2host_32_ptr_unaligned(const void* pData) -{ - const drflac_uint8* pNum = (drflac_uint8*)pData; - return *pNum | *(pNum+1) << 8 | *(pNum+2) << 16 | *(pNum+3) << 24; -} -static DRFLAC_INLINE drflac_uint32 drflac__unsynchsafe_32(drflac_uint32 n) -{ - drflac_uint32 result = 0; - result |= (n & 0x7F000000) >> 3; - result |= (n & 0x007F0000) >> 2; - result |= (n & 0x00007F00) >> 1; - result |= (n & 0x0000007F) >> 0; - return result; -} -static drflac_uint8 drflac__crc8_table[] = { - 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, - 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, - 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, - 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, - 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, - 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, - 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, - 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, - 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, - 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, - 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, - 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, - 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, - 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, - 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, - 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 -}; -static drflac_uint16 drflac__crc16_table[] = { - 0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011, - 0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022, - 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072, - 0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041, - 0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2, - 0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1, - 0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1, - 0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082, - 0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192, - 0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1, - 0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1, - 0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2, - 0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151, - 0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162, - 0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132, - 0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101, - 0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312, - 0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321, - 0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371, - 0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342, - 0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1, - 0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2, - 0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2, - 0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381, - 0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291, - 0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2, - 0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2, - 0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1, - 0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252, - 0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261, - 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231, - 0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202 -}; -static DRFLAC_INLINE drflac_uint8 drflac_crc8_byte(drflac_uint8 crc, drflac_uint8 data) -{ - return drflac__crc8_table[crc ^ data]; -} -static DRFLAC_INLINE drflac_uint8 drflac_crc8(drflac_uint8 crc, drflac_uint32 data, drflac_uint32 count) -{ -#ifdef DR_FLAC_NO_CRC - (void)crc; - (void)data; - (void)count; - return 0; -#else -#if 0 - drflac_uint8 p = 0x07; - for (int i = count-1; i >= 0; --i) { - drflac_uint8 bit = (data & (1 << i)) >> i; - if (crc & 0x80) { - crc = ((crc << 1) | bit) ^ p; - } else { - crc = ((crc << 1) | bit); - } - } - return crc; -#else - drflac_uint32 wholeBytes; - drflac_uint32 leftoverBits; - drflac_uint64 leftoverDataMask; - static drflac_uint64 leftoverDataMaskTable[8] = { - 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F - }; - DRFLAC_ASSERT(count <= 32); - wholeBytes = count >> 3; - leftoverBits = count - (wholeBytes*8); - leftoverDataMask = leftoverDataMaskTable[leftoverBits]; - switch (wholeBytes) { - case 4: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits))); - case 3: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits))); - case 2: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits))); - case 1: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits))); - case 0: if (leftoverBits > 0) crc = (drflac_uint8)((crc << leftoverBits) ^ drflac__crc8_table[(crc >> (8 - leftoverBits)) ^ (data & leftoverDataMask)]); - } - return crc; -#endif -#endif -} -static DRFLAC_INLINE drflac_uint16 drflac_crc16_byte(drflac_uint16 crc, drflac_uint8 data) -{ - return (crc << 8) ^ drflac__crc16_table[(drflac_uint8)(crc >> 8) ^ data]; -} -static DRFLAC_INLINE drflac_uint16 drflac_crc16_cache(drflac_uint16 crc, drflac_cache_t data) -{ -#ifdef DRFLAC_64BIT - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 56) & 0xFF)); - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 48) & 0xFF)); - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 40) & 0xFF)); - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 32) & 0xFF)); -#endif - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 24) & 0xFF)); - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 16) & 0xFF)); - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 8) & 0xFF)); - crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 0) & 0xFF)); - return crc; -} -static DRFLAC_INLINE drflac_uint16 drflac_crc16_bytes(drflac_uint16 crc, drflac_cache_t data, drflac_uint32 byteCount) -{ - switch (byteCount) - { -#ifdef DRFLAC_64BIT - case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 56) & 0xFF)); - case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 48) & 0xFF)); - case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 40) & 0xFF)); - case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 32) & 0xFF)); -#endif - case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 24) & 0xFF)); - case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 16) & 0xFF)); - case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 8) & 0xFF)); - case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 0) & 0xFF)); - } - return crc; -} -#if 0 -static DRFLAC_INLINE drflac_uint16 drflac_crc16__32bit(drflac_uint16 crc, drflac_uint32 data, drflac_uint32 count) -{ -#ifdef DR_FLAC_NO_CRC - (void)crc; - (void)data; - (void)count; - return 0; -#else -#if 0 - drflac_uint16 p = 0x8005; - for (int i = count-1; i >= 0; --i) { - drflac_uint16 bit = (data & (1ULL << i)) >> i; - if (r & 0x8000) { - r = ((r << 1) | bit) ^ p; - } else { - r = ((r << 1) | bit); - } - } - return crc; -#else - drflac_uint32 wholeBytes; - drflac_uint32 leftoverBits; - drflac_uint64 leftoverDataMask; - static drflac_uint64 leftoverDataMaskTable[8] = { - 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F - }; - DRFLAC_ASSERT(count <= 64); - wholeBytes = count >> 3; - leftoverBits = count & 7; - leftoverDataMask = leftoverDataMaskTable[leftoverBits]; - switch (wholeBytes) { - default: - case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits))); - case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits))); - case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits))); - case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits))); - case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)]; - } - return crc; -#endif -#endif -} -static DRFLAC_INLINE drflac_uint16 drflac_crc16__64bit(drflac_uint16 crc, drflac_uint64 data, drflac_uint32 count) -{ -#ifdef DR_FLAC_NO_CRC - (void)crc; - (void)data; - (void)count; - return 0; -#else - drflac_uint32 wholeBytes; - drflac_uint32 leftoverBits; - drflac_uint64 leftoverDataMask; - static drflac_uint64 leftoverDataMaskTable[8] = { - 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F - }; - DRFLAC_ASSERT(count <= 64); - wholeBytes = count >> 3; - leftoverBits = count & 7; - leftoverDataMask = leftoverDataMaskTable[leftoverBits]; - switch (wholeBytes) { - default: - case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 << 32) << leftoverBits)) >> (56 + leftoverBits))); - case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 << 32) << leftoverBits)) >> (48 + leftoverBits))); - case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 << 32) << leftoverBits)) >> (40 + leftoverBits))); - case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF << 32) << leftoverBits)) >> (32 + leftoverBits))); - case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0xFF000000 ) << leftoverBits)) >> (24 + leftoverBits))); - case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x00FF0000 ) << leftoverBits)) >> (16 + leftoverBits))); - case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x0000FF00 ) << leftoverBits)) >> ( 8 + leftoverBits))); - case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (((drflac_uint64)0x000000FF ) << leftoverBits)) >> ( 0 + leftoverBits))); - case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)]; - } - return crc; -#endif -} -static DRFLAC_INLINE drflac_uint16 drflac_crc16(drflac_uint16 crc, drflac_cache_t data, drflac_uint32 count) -{ -#ifdef DRFLAC_64BIT - return drflac_crc16__64bit(crc, data, count); -#else - return drflac_crc16__32bit(crc, data, count); -#endif -} -#endif -#ifdef DRFLAC_64BIT -#define drflac__be2host__cache_line drflac__be2host_64 -#else -#define drflac__be2host__cache_line drflac__be2host_32 -#endif -#define DRFLAC_CACHE_L1_SIZE_BYTES(bs) (sizeof((bs)->cache)) -#define DRFLAC_CACHE_L1_SIZE_BITS(bs) (sizeof((bs)->cache)*8) -#define DRFLAC_CACHE_L1_BITS_REMAINING(bs) (DRFLAC_CACHE_L1_SIZE_BITS(bs) - (bs)->consumedBits) -#define DRFLAC_CACHE_L1_SELECTION_MASK(_bitCount) (~((~(drflac_cache_t)0) >> (_bitCount))) -#define DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, _bitCount) (DRFLAC_CACHE_L1_SIZE_BITS(bs) - (_bitCount)) -#define DRFLAC_CACHE_L1_SELECT(bs, _bitCount) (((bs)->cache) & DRFLAC_CACHE_L1_SELECTION_MASK(_bitCount)) -#define DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, _bitCount) (DRFLAC_CACHE_L1_SELECT((bs), (_bitCount)) >> DRFLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount))) -#define DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, _bitCount)(DRFLAC_CACHE_L1_SELECT((bs), (_bitCount)) >> (DRFLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount)) & (DRFLAC_CACHE_L1_SIZE_BITS(bs)-1))) -#define DRFLAC_CACHE_L2_SIZE_BYTES(bs) (sizeof((bs)->cacheL2)) -#define DRFLAC_CACHE_L2_LINE_COUNT(bs) (DRFLAC_CACHE_L2_SIZE_BYTES(bs) / sizeof((bs)->cacheL2[0])) -#define DRFLAC_CACHE_L2_LINES_REMAINING(bs) (DRFLAC_CACHE_L2_LINE_COUNT(bs) - (bs)->nextL2Line) -#ifndef DR_FLAC_NO_CRC -static DRFLAC_INLINE void drflac__reset_crc16(drflac_bs* bs) -{ - bs->crc16 = 0; - bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3; -} -static DRFLAC_INLINE void drflac__update_crc16(drflac_bs* bs) -{ - if (bs->crc16CacheIgnoredBytes == 0) { - bs->crc16 = drflac_crc16_cache(bs->crc16, bs->crc16Cache); - } else { - bs->crc16 = drflac_crc16_bytes(bs->crc16, bs->crc16Cache, DRFLAC_CACHE_L1_SIZE_BYTES(bs) - bs->crc16CacheIgnoredBytes); - bs->crc16CacheIgnoredBytes = 0; - } -} -static DRFLAC_INLINE drflac_uint16 drflac__flush_crc16(drflac_bs* bs) -{ - DRFLAC_ASSERT((DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7) == 0); - if (DRFLAC_CACHE_L1_BITS_REMAINING(bs) == 0) { - drflac__update_crc16(bs); - } else { - bs->crc16 = drflac_crc16_bytes(bs->crc16, bs->crc16Cache >> DRFLAC_CACHE_L1_BITS_REMAINING(bs), (bs->consumedBits >> 3) - bs->crc16CacheIgnoredBytes); - bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3; - } - return bs->crc16; -} -#endif -static DRFLAC_INLINE drflac_bool32 drflac__reload_l1_cache_from_l2(drflac_bs* bs) -{ - size_t bytesRead; - size_t alignedL1LineCount; - if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { - bs->cache = bs->cacheL2[bs->nextL2Line++]; - return DRFLAC_TRUE; - } - if (bs->unalignedByteCount > 0) { - return DRFLAC_FALSE; - } - bytesRead = bs->onRead(bs->pUserData, bs->cacheL2, DRFLAC_CACHE_L2_SIZE_BYTES(bs)); - bs->nextL2Line = 0; - if (bytesRead == DRFLAC_CACHE_L2_SIZE_BYTES(bs)) { - bs->cache = bs->cacheL2[bs->nextL2Line++]; - return DRFLAC_TRUE; - } - alignedL1LineCount = bytesRead / DRFLAC_CACHE_L1_SIZE_BYTES(bs); - bs->unalignedByteCount = bytesRead - (alignedL1LineCount * DRFLAC_CACHE_L1_SIZE_BYTES(bs)); - if (bs->unalignedByteCount > 0) { - bs->unalignedCache = bs->cacheL2[alignedL1LineCount]; - } - if (alignedL1LineCount > 0) { - size_t offset = DRFLAC_CACHE_L2_LINE_COUNT(bs) - alignedL1LineCount; - size_t i; - for (i = alignedL1LineCount; i > 0; --i) { - bs->cacheL2[i-1 + offset] = bs->cacheL2[i-1]; - } - bs->nextL2Line = (drflac_uint32)offset; - bs->cache = bs->cacheL2[bs->nextL2Line++]; - return DRFLAC_TRUE; - } else { - bs->nextL2Line = DRFLAC_CACHE_L2_LINE_COUNT(bs); - return DRFLAC_FALSE; - } -} -static drflac_bool32 drflac__reload_cache(drflac_bs* bs) -{ - size_t bytesRead; -#ifndef DR_FLAC_NO_CRC - drflac__update_crc16(bs); -#endif - if (drflac__reload_l1_cache_from_l2(bs)) { - bs->cache = drflac__be2host__cache_line(bs->cache); - bs->consumedBits = 0; -#ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs->cache; -#endif - return DRFLAC_TRUE; - } - bytesRead = bs->unalignedByteCount; - if (bytesRead == 0) { - bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); - return DRFLAC_FALSE; - } - DRFLAC_ASSERT(bytesRead < DRFLAC_CACHE_L1_SIZE_BYTES(bs)); - bs->consumedBits = (drflac_uint32)(DRFLAC_CACHE_L1_SIZE_BYTES(bs) - bytesRead) * 8; - bs->cache = drflac__be2host__cache_line(bs->unalignedCache); - bs->cache &= DRFLAC_CACHE_L1_SELECTION_MASK(DRFLAC_CACHE_L1_BITS_REMAINING(bs)); - bs->unalignedByteCount = 0; -#ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs->cache >> bs->consumedBits; - bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3; -#endif - return DRFLAC_TRUE; -} -static void drflac__reset_cache(drflac_bs* bs) -{ - bs->nextL2Line = DRFLAC_CACHE_L2_LINE_COUNT(bs); - bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); - bs->cache = 0; - bs->unalignedByteCount = 0; - bs->unalignedCache = 0; -#ifndef DR_FLAC_NO_CRC - bs->crc16Cache = 0; - bs->crc16CacheIgnoredBytes = 0; -#endif -} -static DRFLAC_INLINE drflac_bool32 drflac__read_uint32(drflac_bs* bs, unsigned int bitCount, drflac_uint32* pResultOut) -{ - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pResultOut != NULL); - DRFLAC_ASSERT(bitCount > 0); - DRFLAC_ASSERT(bitCount <= 32); - if (bs->consumedBits == DRFLAC_CACHE_L1_SIZE_BITS(bs)) { - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - } - if (bitCount <= DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { -#ifdef DRFLAC_64BIT - *pResultOut = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount); - bs->consumedBits += bitCount; - bs->cache <<= bitCount; -#else - if (bitCount < DRFLAC_CACHE_L1_SIZE_BITS(bs)) { - *pResultOut = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount); - bs->consumedBits += bitCount; - bs->cache <<= bitCount; - } else { - *pResultOut = (drflac_uint32)bs->cache; - bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); - bs->cache = 0; - } -#endif - return DRFLAC_TRUE; - } else { - drflac_uint32 bitCountHi = DRFLAC_CACHE_L1_BITS_REMAINING(bs); - drflac_uint32 bitCountLo = bitCount - bitCountHi; - drflac_uint32 resultHi; - DRFLAC_ASSERT(bitCountHi > 0); - DRFLAC_ASSERT(bitCountHi < 32); - resultHi = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountHi); - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - if (bitCountLo > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - return DRFLAC_FALSE; - } - *pResultOut = (resultHi << bitCountLo) | (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountLo); - bs->consumedBits += bitCountLo; - bs->cache <<= bitCountLo; - return DRFLAC_TRUE; - } -} -static drflac_bool32 drflac__read_int32(drflac_bs* bs, unsigned int bitCount, drflac_int32* pResult) -{ - drflac_uint32 result; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pResult != NULL); - DRFLAC_ASSERT(bitCount > 0); - DRFLAC_ASSERT(bitCount <= 32); - if (!drflac__read_uint32(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - if (bitCount < 32) { - drflac_uint32 signbit; - signbit = ((result >> (bitCount-1)) & 0x01); - result |= (~signbit + 1) << bitCount; - } - *pResult = (drflac_int32)result; - return DRFLAC_TRUE; -} -#ifdef DRFLAC_64BIT -static drflac_bool32 drflac__read_uint64(drflac_bs* bs, unsigned int bitCount, drflac_uint64* pResultOut) -{ - drflac_uint32 resultHi; - drflac_uint32 resultLo; - DRFLAC_ASSERT(bitCount <= 64); - DRFLAC_ASSERT(bitCount > 32); - if (!drflac__read_uint32(bs, bitCount - 32, &resultHi)) { - return DRFLAC_FALSE; - } - if (!drflac__read_uint32(bs, 32, &resultLo)) { - return DRFLAC_FALSE; - } - *pResultOut = (((drflac_uint64)resultHi) << 32) | ((drflac_uint64)resultLo); - return DRFLAC_TRUE; -} -#endif -#if 0 -static drflac_bool32 drflac__read_int64(drflac_bs* bs, unsigned int bitCount, drflac_int64* pResultOut) -{ - drflac_uint64 result; - drflac_uint64 signbit; - DRFLAC_ASSERT(bitCount <= 64); - if (!drflac__read_uint64(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - signbit = ((result >> (bitCount-1)) & 0x01); - result |= (~signbit + 1) << bitCount; - *pResultOut = (drflac_int64)result; - return DRFLAC_TRUE; -} -#endif -static drflac_bool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, drflac_uint16* pResult) -{ - drflac_uint32 result; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pResult != NULL); - DRFLAC_ASSERT(bitCount > 0); - DRFLAC_ASSERT(bitCount <= 16); - if (!drflac__read_uint32(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - *pResult = (drflac_uint16)result; - return DRFLAC_TRUE; -} -#if 0 -static drflac_bool32 drflac__read_int16(drflac_bs* bs, unsigned int bitCount, drflac_int16* pResult) -{ - drflac_int32 result; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pResult != NULL); - DRFLAC_ASSERT(bitCount > 0); - DRFLAC_ASSERT(bitCount <= 16); - if (!drflac__read_int32(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - *pResult = (drflac_int16)result; - return DRFLAC_TRUE; -} -#endif -static drflac_bool32 drflac__read_uint8(drflac_bs* bs, unsigned int bitCount, drflac_uint8* pResult) -{ - drflac_uint32 result; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pResult != NULL); - DRFLAC_ASSERT(bitCount > 0); - DRFLAC_ASSERT(bitCount <= 8); - if (!drflac__read_uint32(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - *pResult = (drflac_uint8)result; - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__read_int8(drflac_bs* bs, unsigned int bitCount, drflac_int8* pResult) -{ - drflac_int32 result; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pResult != NULL); - DRFLAC_ASSERT(bitCount > 0); - DRFLAC_ASSERT(bitCount <= 8); - if (!drflac__read_int32(bs, bitCount, &result)) { - return DRFLAC_FALSE; - } - *pResult = (drflac_int8)result; - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__seek_bits(drflac_bs* bs, size_t bitsToSeek) -{ - if (bitsToSeek <= DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - bs->consumedBits += (drflac_uint32)bitsToSeek; - bs->cache <<= bitsToSeek; - return DRFLAC_TRUE; - } else { - bitsToSeek -= DRFLAC_CACHE_L1_BITS_REMAINING(bs); - bs->consumedBits += DRFLAC_CACHE_L1_BITS_REMAINING(bs); - bs->cache = 0; -#ifdef DRFLAC_64BIT - while (bitsToSeek >= DRFLAC_CACHE_L1_SIZE_BITS(bs)) { - drflac_uint64 bin; - if (!drflac__read_uint64(bs, DRFLAC_CACHE_L1_SIZE_BITS(bs), &bin)) { - return DRFLAC_FALSE; - } - bitsToSeek -= DRFLAC_CACHE_L1_SIZE_BITS(bs); - } -#else - while (bitsToSeek >= DRFLAC_CACHE_L1_SIZE_BITS(bs)) { - drflac_uint32 bin; - if (!drflac__read_uint32(bs, DRFLAC_CACHE_L1_SIZE_BITS(bs), &bin)) { - return DRFLAC_FALSE; - } - bitsToSeek -= DRFLAC_CACHE_L1_SIZE_BITS(bs); - } -#endif - while (bitsToSeek >= 8) { - drflac_uint8 bin; - if (!drflac__read_uint8(bs, 8, &bin)) { - return DRFLAC_FALSE; - } - bitsToSeek -= 8; - } - if (bitsToSeek > 0) { - drflac_uint8 bin; - if (!drflac__read_uint8(bs, (drflac_uint32)bitsToSeek, &bin)) { - return DRFLAC_FALSE; - } - bitsToSeek = 0; - } - DRFLAC_ASSERT(bitsToSeek == 0); - return DRFLAC_TRUE; - } -} -static drflac_bool32 drflac__find_and_seek_to_next_sync_code(drflac_bs* bs) -{ - DRFLAC_ASSERT(bs != NULL); - if (!drflac__seek_bits(bs, DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) { - return DRFLAC_FALSE; - } - for (;;) { - drflac_uint8 hi; -#ifndef DR_FLAC_NO_CRC - drflac__reset_crc16(bs); -#endif - if (!drflac__read_uint8(bs, 8, &hi)) { - return DRFLAC_FALSE; - } - if (hi == 0xFF) { - drflac_uint8 lo; - if (!drflac__read_uint8(bs, 6, &lo)) { - return DRFLAC_FALSE; - } - if (lo == 0x3E) { - return DRFLAC_TRUE; - } else { - if (!drflac__seek_bits(bs, DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) { - return DRFLAC_FALSE; - } - } - } - } -} -#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) -#define DRFLAC_IMPLEMENT_CLZ_LZCNT -#endif -#if defined(_MSC_VER) && _MSC_VER >= 1400 && (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(__clang__) -#define DRFLAC_IMPLEMENT_CLZ_MSVC -#endif -#if defined(__WATCOMC__) && defined(__386__) -#define DRFLAC_IMPLEMENT_CLZ_WATCOM -#endif -static DRFLAC_INLINE drflac_uint32 drflac__clz_software(drflac_cache_t x) -{ - drflac_uint32 n; - static drflac_uint32 clz_table_4[] = { - 0, - 4, - 3, 3, - 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (x == 0) { - return sizeof(x)*8; - } - n = clz_table_4[x >> (sizeof(x)*8 - 4)]; - if (n == 0) { -#ifdef DRFLAC_64BIT - if ((x & ((drflac_uint64)0xFFFFFFFF << 32)) == 0) { n = 32; x <<= 32; } - if ((x & ((drflac_uint64)0xFFFF0000 << 32)) == 0) { n += 16; x <<= 16; } - if ((x & ((drflac_uint64)0xFF000000 << 32)) == 0) { n += 8; x <<= 8; } - if ((x & ((drflac_uint64)0xF0000000 << 32)) == 0) { n += 4; x <<= 4; } -#else - if ((x & 0xFFFF0000) == 0) { n = 16; x <<= 16; } - if ((x & 0xFF000000) == 0) { n += 8; x <<= 8; } - if ((x & 0xF0000000) == 0) { n += 4; x <<= 4; } -#endif - n += clz_table_4[x >> (sizeof(x)*8 - 4)]; - } - return n - 1; -} -#ifdef DRFLAC_IMPLEMENT_CLZ_LZCNT -static DRFLAC_INLINE drflac_bool32 drflac__is_lzcnt_supported(void) -{ -#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) && defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) - return DRFLAC_TRUE; -#else - #ifdef DRFLAC_HAS_LZCNT_INTRINSIC - return drflac__gIsLZCNTSupported; - #else - return DRFLAC_FALSE; - #endif -#endif -} -static DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x) -{ -#if defined(_MSC_VER) - #ifdef DRFLAC_64BIT - return (drflac_uint32)__lzcnt64(x); - #else - return (drflac_uint32)__lzcnt(x); - #endif -#else - #if defined(__GNUC__) || defined(__clang__) - #if defined(DRFLAC_X64) - { - drflac_uint64 r; - __asm__ __volatile__ ( - "lzcnt{ %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" - ); - return (drflac_uint32)r; - } - #elif defined(DRFLAC_X86) - { - drflac_uint32 r; - __asm__ __volatile__ ( - "lzcnt{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" - ); - return r; - } - #elif defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(DRFLAC_64BIT) - { - unsigned int r; - __asm__ __volatile__ ( - #if defined(DRFLAC_64BIT) - "clz %w[out], %w[in]" : [out]"=r"(r) : [in]"r"(x) - #else - "clz %[out], %[in]" : [out]"=r"(r) : [in]"r"(x) - #endif - ); - return r; - } - #else - if (x == 0) { - return sizeof(x)*8; - } - #ifdef DRFLAC_64BIT - return (drflac_uint32)__builtin_clzll((drflac_uint64)x); - #else - return (drflac_uint32)__builtin_clzl((drflac_uint32)x); - #endif - #endif - #else - #error "This compiler does not support the lzcnt intrinsic." - #endif -#endif -} -#endif -#ifdef DRFLAC_IMPLEMENT_CLZ_MSVC -#include -static DRFLAC_INLINE drflac_uint32 drflac__clz_msvc(drflac_cache_t x) -{ - drflac_uint32 n; - if (x == 0) { - return sizeof(x)*8; - } -#ifdef DRFLAC_64BIT - _BitScanReverse64((unsigned long*)&n, x); -#else - _BitScanReverse((unsigned long*)&n, x); -#endif - return sizeof(x)*8 - n - 1; -} -#endif -#ifdef DRFLAC_IMPLEMENT_CLZ_WATCOM -static __inline drflac_uint32 drflac__clz_watcom (drflac_uint32); -#pragma aux drflac__clz_watcom = \ - "bsr eax, eax" \ - "xor eax, 31" \ - parm [eax] nomemory \ - value [eax] \ - modify exact [eax] nomemory; -#endif -static DRFLAC_INLINE drflac_uint32 drflac__clz(drflac_cache_t x) -{ -#ifdef DRFLAC_IMPLEMENT_CLZ_LZCNT - if (drflac__is_lzcnt_supported()) { - return drflac__clz_lzcnt(x); - } else -#endif - { -#ifdef DRFLAC_IMPLEMENT_CLZ_MSVC - return drflac__clz_msvc(x); -#elif defined(DRFLAC_IMPLEMENT_CLZ_WATCOM) - return (x == 0) ? sizeof(x)*8 : drflac__clz_watcom(x); -#else - return drflac__clz_software(x); -#endif - } -} -static DRFLAC_INLINE drflac_bool32 drflac__seek_past_next_set_bit(drflac_bs* bs, unsigned int* pOffsetOut) -{ - drflac_uint32 zeroCounter = 0; - drflac_uint32 setBitOffsetPlus1; - while (bs->cache == 0) { - zeroCounter += (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs); - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - } - if (bs->cache == 1) { - *pOffsetOut = zeroCounter + (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs) - 1; - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - return DRFLAC_TRUE; - } - setBitOffsetPlus1 = drflac__clz(bs->cache); - setBitOffsetPlus1 += 1; - if (setBitOffsetPlus1 > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - return DRFLAC_FALSE; - } - bs->consumedBits += setBitOffsetPlus1; - bs->cache <<= setBitOffsetPlus1; - *pOffsetOut = zeroCounter + setBitOffsetPlus1 - 1; - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__seek_to_byte(drflac_bs* bs, drflac_uint64 offsetFromStart) -{ - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(offsetFromStart > 0); - if (offsetFromStart > 0x7FFFFFFF) { - drflac_uint64 bytesRemaining = offsetFromStart; - if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, drflac_seek_origin_start)) { - return DRFLAC_FALSE; - } - bytesRemaining -= 0x7FFFFFFF; - while (bytesRemaining > 0x7FFFFFFF) { - if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - bytesRemaining -= 0x7FFFFFFF; - } - if (bytesRemaining > 0) { - if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - } - } else { - if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, drflac_seek_origin_start)) { - return DRFLAC_FALSE; - } - } - drflac__reset_cache(bs); - return DRFLAC_TRUE; -} -static drflac_result drflac__read_utf8_coded_number(drflac_bs* bs, drflac_uint64* pNumberOut, drflac_uint8* pCRCOut) -{ - drflac_uint8 crc; - drflac_uint64 result; - drflac_uint8 utf8[7] = {0}; - int byteCount; - int i; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pNumberOut != NULL); - DRFLAC_ASSERT(pCRCOut != NULL); - crc = *pCRCOut; - if (!drflac__read_uint8(bs, 8, utf8)) { - *pNumberOut = 0; - return DRFLAC_AT_END; - } - crc = drflac_crc8(crc, utf8[0], 8); - if ((utf8[0] & 0x80) == 0) { - *pNumberOut = utf8[0]; - *pCRCOut = crc; - return DRFLAC_SUCCESS; - } - if ((utf8[0] & 0xE0) == 0xC0) { - byteCount = 2; - } else if ((utf8[0] & 0xF0) == 0xE0) { - byteCount = 3; - } else if ((utf8[0] & 0xF8) == 0xF0) { - byteCount = 4; - } else if ((utf8[0] & 0xFC) == 0xF8) { - byteCount = 5; - } else if ((utf8[0] & 0xFE) == 0xFC) { - byteCount = 6; - } else if ((utf8[0] & 0xFF) == 0xFE) { - byteCount = 7; - } else { - *pNumberOut = 0; - return DRFLAC_CRC_MISMATCH; - } - DRFLAC_ASSERT(byteCount > 1); - result = (drflac_uint64)(utf8[0] & (0xFF >> (byteCount + 1))); - for (i = 1; i < byteCount; ++i) { - if (!drflac__read_uint8(bs, 8, utf8 + i)) { - *pNumberOut = 0; - return DRFLAC_AT_END; - } - crc = drflac_crc8(crc, utf8[i], 8); - result = (result << 6) | (utf8[i] & 0x3F); - } - *pNumberOut = result; - *pCRCOut = crc; - return DRFLAC_SUCCESS; -} -static DRFLAC_INLINE drflac_uint32 drflac__ilog2_u32(drflac_uint32 x) -{ -#if 1 - drflac_uint32 result = 0; - while (x > 0) { - result += 1; - x >>= 1; - } - return result; -#endif -} -static DRFLAC_INLINE drflac_bool32 drflac__use_64_bit_prediction(drflac_uint32 bitsPerSample, drflac_uint32 order, drflac_uint32 precision) -{ - return bitsPerSample + precision + drflac__ilog2_u32(order) > 32; -} -#if defined(__clang__) -__attribute__((no_sanitize("signed-integer-overflow"))) -#endif -static DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_32(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) -{ - drflac_int32 prediction = 0; - DRFLAC_ASSERT(order <= 32); - switch (order) - { - case 32: prediction += coefficients[31] * pDecodedSamples[-32]; - case 31: prediction += coefficients[30] * pDecodedSamples[-31]; - case 30: prediction += coefficients[29] * pDecodedSamples[-30]; - case 29: prediction += coefficients[28] * pDecodedSamples[-29]; - case 28: prediction += coefficients[27] * pDecodedSamples[-28]; - case 27: prediction += coefficients[26] * pDecodedSamples[-27]; - case 26: prediction += coefficients[25] * pDecodedSamples[-26]; - case 25: prediction += coefficients[24] * pDecodedSamples[-25]; - case 24: prediction += coefficients[23] * pDecodedSamples[-24]; - case 23: prediction += coefficients[22] * pDecodedSamples[-23]; - case 22: prediction += coefficients[21] * pDecodedSamples[-22]; - case 21: prediction += coefficients[20] * pDecodedSamples[-21]; - case 20: prediction += coefficients[19] * pDecodedSamples[-20]; - case 19: prediction += coefficients[18] * pDecodedSamples[-19]; - case 18: prediction += coefficients[17] * pDecodedSamples[-18]; - case 17: prediction += coefficients[16] * pDecodedSamples[-17]; - case 16: prediction += coefficients[15] * pDecodedSamples[-16]; - case 15: prediction += coefficients[14] * pDecodedSamples[-15]; - case 14: prediction += coefficients[13] * pDecodedSamples[-14]; - case 13: prediction += coefficients[12] * pDecodedSamples[-13]; - case 12: prediction += coefficients[11] * pDecodedSamples[-12]; - case 11: prediction += coefficients[10] * pDecodedSamples[-11]; - case 10: prediction += coefficients[ 9] * pDecodedSamples[-10]; - case 9: prediction += coefficients[ 8] * pDecodedSamples[- 9]; - case 8: prediction += coefficients[ 7] * pDecodedSamples[- 8]; - case 7: prediction += coefficients[ 6] * pDecodedSamples[- 7]; - case 6: prediction += coefficients[ 5] * pDecodedSamples[- 6]; - case 5: prediction += coefficients[ 4] * pDecodedSamples[- 5]; - case 4: prediction += coefficients[ 3] * pDecodedSamples[- 4]; - case 3: prediction += coefficients[ 2] * pDecodedSamples[- 3]; - case 2: prediction += coefficients[ 1] * pDecodedSamples[- 2]; - case 1: prediction += coefficients[ 0] * pDecodedSamples[- 1]; - } - return (drflac_int32)(prediction >> shift); -} -static DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_64(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) -{ - drflac_int64 prediction; - DRFLAC_ASSERT(order <= 32); -#ifndef DRFLAC_64BIT - if (order == 8) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; - prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; - prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; - } - else if (order == 7) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; - prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; - } - else if (order == 3) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - } - else if (order == 6) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; - } - else if (order == 5) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - } - else if (order == 4) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - } - else if (order == 12) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; - prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; - prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; - prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; - prediction += coefficients[9] * (drflac_int64)pDecodedSamples[-10]; - prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11]; - prediction += coefficients[11] * (drflac_int64)pDecodedSamples[-12]; - } - else if (order == 2) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - } - else if (order == 1) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - } - else if (order == 10) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; - prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; - prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; - prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; - prediction += coefficients[9] * (drflac_int64)pDecodedSamples[-10]; - } - else if (order == 9) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; - prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; - prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; - prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; - } - else if (order == 11) - { - prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; - prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; - prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; - prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; - prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; - prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; - prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; - prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; - prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; - prediction += coefficients[9] * (drflac_int64)pDecodedSamples[-10]; - prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11]; - } - else - { - int j; - prediction = 0; - for (j = 0; j < (int)order; ++j) { - prediction += coefficients[j] * (drflac_int64)pDecodedSamples[-j-1]; - } - } -#endif -#ifdef DRFLAC_64BIT - prediction = 0; - switch (order) - { - case 32: prediction += coefficients[31] * (drflac_int64)pDecodedSamples[-32]; - case 31: prediction += coefficients[30] * (drflac_int64)pDecodedSamples[-31]; - case 30: prediction += coefficients[29] * (drflac_int64)pDecodedSamples[-30]; - case 29: prediction += coefficients[28] * (drflac_int64)pDecodedSamples[-29]; - case 28: prediction += coefficients[27] * (drflac_int64)pDecodedSamples[-28]; - case 27: prediction += coefficients[26] * (drflac_int64)pDecodedSamples[-27]; - case 26: prediction += coefficients[25] * (drflac_int64)pDecodedSamples[-26]; - case 25: prediction += coefficients[24] * (drflac_int64)pDecodedSamples[-25]; - case 24: prediction += coefficients[23] * (drflac_int64)pDecodedSamples[-24]; - case 23: prediction += coefficients[22] * (drflac_int64)pDecodedSamples[-23]; - case 22: prediction += coefficients[21] * (drflac_int64)pDecodedSamples[-22]; - case 21: prediction += coefficients[20] * (drflac_int64)pDecodedSamples[-21]; - case 20: prediction += coefficients[19] * (drflac_int64)pDecodedSamples[-20]; - case 19: prediction += coefficients[18] * (drflac_int64)pDecodedSamples[-19]; - case 18: prediction += coefficients[17] * (drflac_int64)pDecodedSamples[-18]; - case 17: prediction += coefficients[16] * (drflac_int64)pDecodedSamples[-17]; - case 16: prediction += coefficients[15] * (drflac_int64)pDecodedSamples[-16]; - case 15: prediction += coefficients[14] * (drflac_int64)pDecodedSamples[-15]; - case 14: prediction += coefficients[13] * (drflac_int64)pDecodedSamples[-14]; - case 13: prediction += coefficients[12] * (drflac_int64)pDecodedSamples[-13]; - case 12: prediction += coefficients[11] * (drflac_int64)pDecodedSamples[-12]; - case 11: prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11]; - case 10: prediction += coefficients[ 9] * (drflac_int64)pDecodedSamples[-10]; - case 9: prediction += coefficients[ 8] * (drflac_int64)pDecodedSamples[- 9]; - case 8: prediction += coefficients[ 7] * (drflac_int64)pDecodedSamples[- 8]; - case 7: prediction += coefficients[ 6] * (drflac_int64)pDecodedSamples[- 7]; - case 6: prediction += coefficients[ 5] * (drflac_int64)pDecodedSamples[- 6]; - case 5: prediction += coefficients[ 4] * (drflac_int64)pDecodedSamples[- 5]; - case 4: prediction += coefficients[ 3] * (drflac_int64)pDecodedSamples[- 4]; - case 3: prediction += coefficients[ 2] * (drflac_int64)pDecodedSamples[- 3]; - case 2: prediction += coefficients[ 1] * (drflac_int64)pDecodedSamples[- 2]; - case 1: prediction += coefficients[ 0] * (drflac_int64)pDecodedSamples[- 1]; - } -#endif - return (drflac_int32)(prediction >> shift); -} -#if 0 -static drflac_bool32 drflac__decode_samples_with_residual__rice__reference(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - drflac_uint32 i; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pSamplesOut != NULL); - for (i = 0; i < count; ++i) { - drflac_uint32 zeroCounter = 0; - for (;;) { - drflac_uint8 bit; - if (!drflac__read_uint8(bs, 1, &bit)) { - return DRFLAC_FALSE; - } - if (bit == 0) { - zeroCounter += 1; - } else { - break; - } - } - drflac_uint32 decodedRice; - if (riceParam > 0) { - if (!drflac__read_uint32(bs, riceParam, &decodedRice)) { - return DRFLAC_FALSE; - } - } else { - decodedRice = 0; - } - decodedRice |= (zeroCounter << riceParam); - if ((decodedRice & 0x01)) { - decodedRice = ~(decodedRice >> 1); - } else { - decodedRice = (decodedRice >> 1); - } - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - pSamplesOut[i] = decodedRice + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i); - } else { - pSamplesOut[i] = decodedRice + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i); - } - } - return DRFLAC_TRUE; -} -#endif -#if 0 -static drflac_bool32 drflac__read_rice_parts__reference(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) -{ - drflac_uint32 zeroCounter = 0; - drflac_uint32 decodedRice; - for (;;) { - drflac_uint8 bit; - if (!drflac__read_uint8(bs, 1, &bit)) { - return DRFLAC_FALSE; - } - if (bit == 0) { - zeroCounter += 1; - } else { - break; - } - } - if (riceParam > 0) { - if (!drflac__read_uint32(bs, riceParam, &decodedRice)) { - return DRFLAC_FALSE; - } - } else { - decodedRice = 0; - } - *pZeroCounterOut = zeroCounter; - *pRiceParamPartOut = decodedRice; - return DRFLAC_TRUE; -} -#endif -#if 0 -static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) -{ - drflac_cache_t riceParamMask; - drflac_uint32 zeroCounter; - drflac_uint32 setBitOffsetPlus1; - drflac_uint32 riceParamPart; - drflac_uint32 riceLength; - DRFLAC_ASSERT(riceParam > 0); - riceParamMask = DRFLAC_CACHE_L1_SELECTION_MASK(riceParam); - zeroCounter = 0; - while (bs->cache == 0) { - zeroCounter += (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs); - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - } - setBitOffsetPlus1 = drflac__clz(bs->cache); - zeroCounter += setBitOffsetPlus1; - setBitOffsetPlus1 += 1; - riceLength = setBitOffsetPlus1 + riceParam; - if (riceLength < DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - riceParamPart = (drflac_uint32)((bs->cache & (riceParamMask >> setBitOffsetPlus1)) >> DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceLength)); - bs->consumedBits += riceLength; - bs->cache <<= riceLength; - } else { - drflac_uint32 bitCountLo; - drflac_cache_t resultHi; - bs->consumedBits += riceLength; - bs->cache <<= setBitOffsetPlus1 & (DRFLAC_CACHE_L1_SIZE_BITS(bs)-1); - bitCountLo = bs->consumedBits - DRFLAC_CACHE_L1_SIZE_BITS(bs); - resultHi = DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, riceParam); - if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { -#ifndef DR_FLAC_NO_CRC - drflac__update_crc16(bs); -#endif - bs->cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); - bs->consumedBits = 0; -#ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs->cache; -#endif - } else { - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - if (bitCountLo > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - return DRFLAC_FALSE; - } - } - riceParamPart = (drflac_uint32)(resultHi | DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, bitCountLo)); - bs->consumedBits += bitCountLo; - bs->cache <<= bitCountLo; - } - pZeroCounterOut[0] = zeroCounter; - pRiceParamPartOut[0] = riceParamPart; - return DRFLAC_TRUE; -} -#endif -static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts_x1(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) -{ - drflac_uint32 riceParamPlus1 = riceParam + 1; - drflac_uint32 riceParamPlus1Shift = DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPlus1); - drflac_uint32 riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1; - drflac_cache_t bs_cache = bs->cache; - drflac_uint32 bs_consumedBits = bs->consumedBits; - drflac_uint32 lzcount = drflac__clz(bs_cache); - if (lzcount < sizeof(bs_cache)*8) { - pZeroCounterOut[0] = lzcount; - extract_rice_param_part: - bs_cache <<= lzcount; - bs_consumedBits += lzcount; - if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) { - pRiceParamPartOut[0] = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); - bs_cache <<= riceParamPlus1; - bs_consumedBits += riceParamPlus1; - } else { - drflac_uint32 riceParamPartHi; - drflac_uint32 riceParamPartLo; - drflac_uint32 riceParamPartLoBitCount; - riceParamPartHi = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); - riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits; - DRFLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32); - if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { - #ifndef DR_FLAC_NO_CRC - drflac__update_crc16(bs); - #endif - bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); - bs_consumedBits = riceParamPartLoBitCount; - #ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs_cache; - #endif - } else { - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - return DRFLAC_FALSE; - } - bs_cache = bs->cache; - bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; - } - riceParamPartLo = (drflac_uint32)(bs_cache >> (DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPartLoBitCount))); - pRiceParamPartOut[0] = riceParamPartHi | riceParamPartLo; - bs_cache <<= riceParamPartLoBitCount; - } - } else { - drflac_uint32 zeroCounter = (drflac_uint32)(DRFLAC_CACHE_L1_SIZE_BITS(bs) - bs_consumedBits); - for (;;) { - if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { - #ifndef DR_FLAC_NO_CRC - drflac__update_crc16(bs); - #endif - bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); - bs_consumedBits = 0; - #ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs_cache; - #endif - } else { - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - bs_cache = bs->cache; - bs_consumedBits = bs->consumedBits; - } - lzcount = drflac__clz(bs_cache); - zeroCounter += lzcount; - if (lzcount < sizeof(bs_cache)*8) { - break; - } - } - pZeroCounterOut[0] = zeroCounter; - goto extract_rice_param_part; - } - bs->cache = bs_cache; - bs->consumedBits = bs_consumedBits; - return DRFLAC_TRUE; -} -static DRFLAC_INLINE drflac_bool32 drflac__seek_rice_parts(drflac_bs* bs, drflac_uint8 riceParam) -{ - drflac_uint32 riceParamPlus1 = riceParam + 1; - drflac_uint32 riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1; - drflac_cache_t bs_cache = bs->cache; - drflac_uint32 bs_consumedBits = bs->consumedBits; - drflac_uint32 lzcount = drflac__clz(bs_cache); - if (lzcount < sizeof(bs_cache)*8) { - extract_rice_param_part: - bs_cache <<= lzcount; - bs_consumedBits += lzcount; - if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) { - bs_cache <<= riceParamPlus1; - bs_consumedBits += riceParamPlus1; - } else { - drflac_uint32 riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits; - DRFLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32); - if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { - #ifndef DR_FLAC_NO_CRC - drflac__update_crc16(bs); - #endif - bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); - bs_consumedBits = riceParamPartLoBitCount; - #ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs_cache; - #endif - } else { - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { - return DRFLAC_FALSE; - } - bs_cache = bs->cache; - bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; - } - bs_cache <<= riceParamPartLoBitCount; - } - } else { - for (;;) { - if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { - #ifndef DR_FLAC_NO_CRC - drflac__update_crc16(bs); - #endif - bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); - bs_consumedBits = 0; - #ifndef DR_FLAC_NO_CRC - bs->crc16Cache = bs_cache; - #endif - } else { - if (!drflac__reload_cache(bs)) { - return DRFLAC_FALSE; - } - bs_cache = bs->cache; - bs_consumedBits = bs->consumedBits; - } - lzcount = drflac__clz(bs_cache); - if (lzcount < sizeof(bs_cache)*8) { - break; - } - } - goto extract_rice_param_part; - } - bs->cache = bs_cache; - bs->consumedBits = bs_consumedBits; - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar_zeroorder(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - drflac_uint32 zeroCountPart0; - drflac_uint32 riceParamPart0; - drflac_uint32 riceParamMask; - drflac_uint32 i; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pSamplesOut != NULL); - (void)bitsPerSample; - (void)order; - (void)shift; - (void)coefficients; - riceParamMask = (drflac_uint32)~((~0UL) << riceParam); - i = 0; - while (i < count) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) { - return DRFLAC_FALSE; - } - riceParamPart0 &= riceParamMask; - riceParamPart0 |= (zeroCountPart0 << riceParam); - riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; - pSamplesOut[i] = riceParamPart0; - i += 1; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - drflac_uint32 zeroCountPart0 = 0; - drflac_uint32 zeroCountPart1 = 0; - drflac_uint32 zeroCountPart2 = 0; - drflac_uint32 zeroCountPart3 = 0; - drflac_uint32 riceParamPart0 = 0; - drflac_uint32 riceParamPart1 = 0; - drflac_uint32 riceParamPart2 = 0; - drflac_uint32 riceParamPart3 = 0; - drflac_uint32 riceParamMask; - const drflac_int32* pSamplesOutEnd; - drflac_uint32 i; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pSamplesOut != NULL); - if (lpcOrder == 0) { - return drflac__decode_samples_with_residual__rice__scalar_zeroorder(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); - } - riceParamMask = (drflac_uint32)~((~0UL) << riceParam); - pSamplesOutEnd = pSamplesOut + (count & ~3); - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - while (pSamplesOut < pSamplesOutEnd) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) { - return DRFLAC_FALSE; - } - riceParamPart0 &= riceParamMask; - riceParamPart1 &= riceParamMask; - riceParamPart2 &= riceParamMask; - riceParamPart3 &= riceParamMask; - riceParamPart0 |= (zeroCountPart0 << riceParam); - riceParamPart1 |= (zeroCountPart1 << riceParam); - riceParamPart2 |= (zeroCountPart2 << riceParam); - riceParamPart3 |= (zeroCountPart3 << riceParam); - riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; - riceParamPart1 = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01]; - riceParamPart2 = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01]; - riceParamPart3 = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01]; - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); - pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 1); - pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 2); - pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 3); - pSamplesOut += 4; - } - } else { - while (pSamplesOut < pSamplesOutEnd) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) { - return DRFLAC_FALSE; - } - riceParamPart0 &= riceParamMask; - riceParamPart1 &= riceParamMask; - riceParamPart2 &= riceParamMask; - riceParamPart3 &= riceParamMask; - riceParamPart0 |= (zeroCountPart0 << riceParam); - riceParamPart1 |= (zeroCountPart1 << riceParam); - riceParamPart2 |= (zeroCountPart2 << riceParam); - riceParamPart3 |= (zeroCountPart3 << riceParam); - riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; - riceParamPart1 = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01]; - riceParamPart2 = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01]; - riceParamPart3 = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01]; - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); - pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 1); - pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 2); - pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 3); - pSamplesOut += 4; - } - } - i = (count & ~3); - while (i < count) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) { - return DRFLAC_FALSE; - } - riceParamPart0 &= riceParamMask; - riceParamPart0 |= (zeroCountPart0 << riceParam); - riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); - } else { - pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0); - } - i += 1; - pSamplesOut += 1; - } - return DRFLAC_TRUE; -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE __m128i drflac__mm_packs_interleaved_epi32(__m128i a, __m128i b) -{ - __m128i r; - r = _mm_packs_epi32(a, b); - r = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 1, 2, 0)); - r = _mm_shufflehi_epi16(r, _MM_SHUFFLE(3, 1, 2, 0)); - r = _mm_shufflelo_epi16(r, _MM_SHUFFLE(3, 1, 2, 0)); - return r; -} -#endif -#if defined(DRFLAC_SUPPORT_SSE41) -static DRFLAC_INLINE __m128i drflac__mm_not_si128(__m128i a) -{ - return _mm_xor_si128(a, _mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128())); -} -static DRFLAC_INLINE __m128i drflac__mm_hadd_epi32(__m128i x) -{ - __m128i x64 = _mm_add_epi32(x, _mm_shuffle_epi32(x, _MM_SHUFFLE(1, 0, 3, 2))); - __m128i x32 = _mm_shufflelo_epi16(x64, _MM_SHUFFLE(1, 0, 3, 2)); - return _mm_add_epi32(x64, x32); -} -static DRFLAC_INLINE __m128i drflac__mm_hadd_epi64(__m128i x) -{ - return _mm_add_epi64(x, _mm_shuffle_epi32(x, _MM_SHUFFLE(1, 0, 3, 2))); -} -static DRFLAC_INLINE __m128i drflac__mm_srai_epi64(__m128i x, int count) -{ - __m128i lo = _mm_srli_epi64(x, count); - __m128i hi = _mm_srai_epi32(x, count); - hi = _mm_and_si128(hi, _mm_set_epi32(0xFFFFFFFF, 0, 0xFFFFFFFF, 0)); - return _mm_or_si128(lo, hi); -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__sse41_32(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - int i; - drflac_uint32 riceParamMask; - drflac_int32* pDecodedSamples = pSamplesOut; - drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3); - drflac_uint32 zeroCountParts0 = 0; - drflac_uint32 zeroCountParts1 = 0; - drflac_uint32 zeroCountParts2 = 0; - drflac_uint32 zeroCountParts3 = 0; - drflac_uint32 riceParamParts0 = 0; - drflac_uint32 riceParamParts1 = 0; - drflac_uint32 riceParamParts2 = 0; - drflac_uint32 riceParamParts3 = 0; - __m128i coefficients128_0; - __m128i coefficients128_4; - __m128i coefficients128_8; - __m128i samples128_0; - __m128i samples128_4; - __m128i samples128_8; - __m128i riceParamMask128; - const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - riceParamMask = (drflac_uint32)~((~0UL) << riceParam); - riceParamMask128 = _mm_set1_epi32(riceParamMask); - coefficients128_0 = _mm_setzero_si128(); - coefficients128_4 = _mm_setzero_si128(); - coefficients128_8 = _mm_setzero_si128(); - samples128_0 = _mm_setzero_si128(); - samples128_4 = _mm_setzero_si128(); - samples128_8 = _mm_setzero_si128(); -#if 1 - { - int runningOrder = order; - if (runningOrder >= 4) { - coefficients128_0 = _mm_loadu_si128((const __m128i*)(coefficients + 0)); - samples128_0 = _mm_loadu_si128((const __m128i*)(pSamplesOut - 4)); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: coefficients128_0 = _mm_set_epi32(0, coefficients[2], coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], pSamplesOut[-3], 0); break; - case 2: coefficients128_0 = _mm_set_epi32(0, 0, coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], 0, 0); break; - case 1: coefficients128_0 = _mm_set_epi32(0, 0, 0, coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], 0, 0, 0); break; - } - runningOrder = 0; - } - if (runningOrder >= 4) { - coefficients128_4 = _mm_loadu_si128((const __m128i*)(coefficients + 4)); - samples128_4 = _mm_loadu_si128((const __m128i*)(pSamplesOut - 8)); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: coefficients128_4 = _mm_set_epi32(0, coefficients[6], coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], pSamplesOut[-7], 0); break; - case 2: coefficients128_4 = _mm_set_epi32(0, 0, coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], 0, 0); break; - case 1: coefficients128_4 = _mm_set_epi32(0, 0, 0, coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], 0, 0, 0); break; - } - runningOrder = 0; - } - if (runningOrder == 4) { - coefficients128_8 = _mm_loadu_si128((const __m128i*)(coefficients + 8)); - samples128_8 = _mm_loadu_si128((const __m128i*)(pSamplesOut - 12)); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: coefficients128_8 = _mm_set_epi32(0, coefficients[10], coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], pSamplesOut[-11], 0); break; - case 2: coefficients128_8 = _mm_set_epi32(0, 0, coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], 0, 0); break; - case 1: coefficients128_8 = _mm_set_epi32(0, 0, 0, coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], 0, 0, 0); break; - } - runningOrder = 0; - } - coefficients128_0 = _mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(0, 1, 2, 3)); - coefficients128_4 = _mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(0, 1, 2, 3)); - coefficients128_8 = _mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(0, 1, 2, 3)); - } -#else - switch (order) - { - case 12: ((drflac_int32*)&coefficients128_8)[0] = coefficients[11]; ((drflac_int32*)&samples128_8)[0] = pDecodedSamples[-12]; - case 11: ((drflac_int32*)&coefficients128_8)[1] = coefficients[10]; ((drflac_int32*)&samples128_8)[1] = pDecodedSamples[-11]; - case 10: ((drflac_int32*)&coefficients128_8)[2] = coefficients[ 9]; ((drflac_int32*)&samples128_8)[2] = pDecodedSamples[-10]; - case 9: ((drflac_int32*)&coefficients128_8)[3] = coefficients[ 8]; ((drflac_int32*)&samples128_8)[3] = pDecodedSamples[- 9]; - case 8: ((drflac_int32*)&coefficients128_4)[0] = coefficients[ 7]; ((drflac_int32*)&samples128_4)[0] = pDecodedSamples[- 8]; - case 7: ((drflac_int32*)&coefficients128_4)[1] = coefficients[ 6]; ((drflac_int32*)&samples128_4)[1] = pDecodedSamples[- 7]; - case 6: ((drflac_int32*)&coefficients128_4)[2] = coefficients[ 5]; ((drflac_int32*)&samples128_4)[2] = pDecodedSamples[- 6]; - case 5: ((drflac_int32*)&coefficients128_4)[3] = coefficients[ 4]; ((drflac_int32*)&samples128_4)[3] = pDecodedSamples[- 5]; - case 4: ((drflac_int32*)&coefficients128_0)[0] = coefficients[ 3]; ((drflac_int32*)&samples128_0)[0] = pDecodedSamples[- 4]; - case 3: ((drflac_int32*)&coefficients128_0)[1] = coefficients[ 2]; ((drflac_int32*)&samples128_0)[1] = pDecodedSamples[- 3]; - case 2: ((drflac_int32*)&coefficients128_0)[2] = coefficients[ 1]; ((drflac_int32*)&samples128_0)[2] = pDecodedSamples[- 2]; - case 1: ((drflac_int32*)&coefficients128_0)[3] = coefficients[ 0]; ((drflac_int32*)&samples128_0)[3] = pDecodedSamples[- 1]; - } -#endif - while (pDecodedSamples < pDecodedSamplesEnd) { - __m128i prediction128; - __m128i zeroCountPart128; - __m128i riceParamPart128; - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) { - return DRFLAC_FALSE; - } - zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0); - riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0); - riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128); - riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam)); - riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_add_epi32(drflac__mm_not_si128(_mm_and_si128(riceParamPart128, _mm_set1_epi32(0x01))), _mm_set1_epi32(0x01))); - if (order <= 4) { - for (i = 0; i < 4; i += 1) { - prediction128 = _mm_mullo_epi32(coefficients128_0, samples128_0); - prediction128 = drflac__mm_hadd_epi32(prediction128); - prediction128 = _mm_srai_epi32(prediction128, shift); - prediction128 = _mm_add_epi32(riceParamPart128, prediction128); - samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4); - riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4); - } - } else if (order <= 8) { - for (i = 0; i < 4; i += 1) { - prediction128 = _mm_mullo_epi32(coefficients128_4, samples128_4); - prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_0, samples128_0)); - prediction128 = drflac__mm_hadd_epi32(prediction128); - prediction128 = _mm_srai_epi32(prediction128, shift); - prediction128 = _mm_add_epi32(riceParamPart128, prediction128); - samples128_4 = _mm_alignr_epi8(samples128_0, samples128_4, 4); - samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4); - riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4); - } - } else { - for (i = 0; i < 4; i += 1) { - prediction128 = _mm_mullo_epi32(coefficients128_8, samples128_8); - prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_4, samples128_4)); - prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_0, samples128_0)); - prediction128 = drflac__mm_hadd_epi32(prediction128); - prediction128 = _mm_srai_epi32(prediction128, shift); - prediction128 = _mm_add_epi32(riceParamPart128, prediction128); - samples128_8 = _mm_alignr_epi8(samples128_4, samples128_8, 4); - samples128_4 = _mm_alignr_epi8(samples128_0, samples128_4, 4); - samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4); - riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4); - } - } - _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0); - pDecodedSamples += 4; - } - i = (count & ~3); - while (i < (int)count) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) { - return DRFLAC_FALSE; - } - riceParamParts0 &= riceParamMask; - riceParamParts0 |= (zeroCountParts0 << riceParam); - riceParamParts0 = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01]; - pDecodedSamples[0] = riceParamParts0 + drflac__calculate_prediction_32(order, shift, coefficients, pDecodedSamples); - i += 1; - pDecodedSamples += 1; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__sse41_64(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - int i; - drflac_uint32 riceParamMask; - drflac_int32* pDecodedSamples = pSamplesOut; - drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3); - drflac_uint32 zeroCountParts0 = 0; - drflac_uint32 zeroCountParts1 = 0; - drflac_uint32 zeroCountParts2 = 0; - drflac_uint32 zeroCountParts3 = 0; - drflac_uint32 riceParamParts0 = 0; - drflac_uint32 riceParamParts1 = 0; - drflac_uint32 riceParamParts2 = 0; - drflac_uint32 riceParamParts3 = 0; - __m128i coefficients128_0; - __m128i coefficients128_4; - __m128i coefficients128_8; - __m128i samples128_0; - __m128i samples128_4; - __m128i samples128_8; - __m128i prediction128; - __m128i riceParamMask128; - const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - DRFLAC_ASSERT(order <= 12); - riceParamMask = (drflac_uint32)~((~0UL) << riceParam); - riceParamMask128 = _mm_set1_epi32(riceParamMask); - prediction128 = _mm_setzero_si128(); - coefficients128_0 = _mm_setzero_si128(); - coefficients128_4 = _mm_setzero_si128(); - coefficients128_8 = _mm_setzero_si128(); - samples128_0 = _mm_setzero_si128(); - samples128_4 = _mm_setzero_si128(); - samples128_8 = _mm_setzero_si128(); -#if 1 - { - int runningOrder = order; - if (runningOrder >= 4) { - coefficients128_0 = _mm_loadu_si128((const __m128i*)(coefficients + 0)); - samples128_0 = _mm_loadu_si128((const __m128i*)(pSamplesOut - 4)); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: coefficients128_0 = _mm_set_epi32(0, coefficients[2], coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], pSamplesOut[-3], 0); break; - case 2: coefficients128_0 = _mm_set_epi32(0, 0, coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], 0, 0); break; - case 1: coefficients128_0 = _mm_set_epi32(0, 0, 0, coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], 0, 0, 0); break; - } - runningOrder = 0; - } - if (runningOrder >= 4) { - coefficients128_4 = _mm_loadu_si128((const __m128i*)(coefficients + 4)); - samples128_4 = _mm_loadu_si128((const __m128i*)(pSamplesOut - 8)); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: coefficients128_4 = _mm_set_epi32(0, coefficients[6], coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], pSamplesOut[-7], 0); break; - case 2: coefficients128_4 = _mm_set_epi32(0, 0, coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], 0, 0); break; - case 1: coefficients128_4 = _mm_set_epi32(0, 0, 0, coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], 0, 0, 0); break; - } - runningOrder = 0; - } - if (runningOrder == 4) { - coefficients128_8 = _mm_loadu_si128((const __m128i*)(coefficients + 8)); - samples128_8 = _mm_loadu_si128((const __m128i*)(pSamplesOut - 12)); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: coefficients128_8 = _mm_set_epi32(0, coefficients[10], coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], pSamplesOut[-11], 0); break; - case 2: coefficients128_8 = _mm_set_epi32(0, 0, coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], 0, 0); break; - case 1: coefficients128_8 = _mm_set_epi32(0, 0, 0, coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], 0, 0, 0); break; - } - runningOrder = 0; - } - coefficients128_0 = _mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(0, 1, 2, 3)); - coefficients128_4 = _mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(0, 1, 2, 3)); - coefficients128_8 = _mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(0, 1, 2, 3)); - } -#else - switch (order) - { - case 12: ((drflac_int32*)&coefficients128_8)[0] = coefficients[11]; ((drflac_int32*)&samples128_8)[0] = pDecodedSamples[-12]; - case 11: ((drflac_int32*)&coefficients128_8)[1] = coefficients[10]; ((drflac_int32*)&samples128_8)[1] = pDecodedSamples[-11]; - case 10: ((drflac_int32*)&coefficients128_8)[2] = coefficients[ 9]; ((drflac_int32*)&samples128_8)[2] = pDecodedSamples[-10]; - case 9: ((drflac_int32*)&coefficients128_8)[3] = coefficients[ 8]; ((drflac_int32*)&samples128_8)[3] = pDecodedSamples[- 9]; - case 8: ((drflac_int32*)&coefficients128_4)[0] = coefficients[ 7]; ((drflac_int32*)&samples128_4)[0] = pDecodedSamples[- 8]; - case 7: ((drflac_int32*)&coefficients128_4)[1] = coefficients[ 6]; ((drflac_int32*)&samples128_4)[1] = pDecodedSamples[- 7]; - case 6: ((drflac_int32*)&coefficients128_4)[2] = coefficients[ 5]; ((drflac_int32*)&samples128_4)[2] = pDecodedSamples[- 6]; - case 5: ((drflac_int32*)&coefficients128_4)[3] = coefficients[ 4]; ((drflac_int32*)&samples128_4)[3] = pDecodedSamples[- 5]; - case 4: ((drflac_int32*)&coefficients128_0)[0] = coefficients[ 3]; ((drflac_int32*)&samples128_0)[0] = pDecodedSamples[- 4]; - case 3: ((drflac_int32*)&coefficients128_0)[1] = coefficients[ 2]; ((drflac_int32*)&samples128_0)[1] = pDecodedSamples[- 3]; - case 2: ((drflac_int32*)&coefficients128_0)[2] = coefficients[ 1]; ((drflac_int32*)&samples128_0)[2] = pDecodedSamples[- 2]; - case 1: ((drflac_int32*)&coefficients128_0)[3] = coefficients[ 0]; ((drflac_int32*)&samples128_0)[3] = pDecodedSamples[- 1]; - } -#endif - while (pDecodedSamples < pDecodedSamplesEnd) { - __m128i zeroCountPart128; - __m128i riceParamPart128; - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) { - return DRFLAC_FALSE; - } - zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0); - riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0); - riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128); - riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam)); - riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_add_epi32(drflac__mm_not_si128(_mm_and_si128(riceParamPart128, _mm_set1_epi32(1))), _mm_set1_epi32(1))); - for (i = 0; i < 4; i += 1) { - prediction128 = _mm_xor_si128(prediction128, prediction128); - switch (order) - { - case 12: - case 11: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_8, _MM_SHUFFLE(1, 1, 0, 0)))); - case 10: - case 9: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_8, _MM_SHUFFLE(3, 3, 2, 2)))); - case 8: - case 7: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_4, _MM_SHUFFLE(1, 1, 0, 0)))); - case 6: - case 5: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_4, _MM_SHUFFLE(3, 3, 2, 2)))); - case 4: - case 3: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_0, _MM_SHUFFLE(1, 1, 0, 0)))); - case 2: - case 1: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_0, _MM_SHUFFLE(3, 3, 2, 2)))); - } - prediction128 = drflac__mm_hadd_epi64(prediction128); - prediction128 = drflac__mm_srai_epi64(prediction128, shift); - prediction128 = _mm_add_epi32(riceParamPart128, prediction128); - samples128_8 = _mm_alignr_epi8(samples128_4, samples128_8, 4); - samples128_4 = _mm_alignr_epi8(samples128_0, samples128_4, 4); - samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4); - riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4); - } - _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0); - pDecodedSamples += 4; - } - i = (count & ~3); - while (i < (int)count) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) { - return DRFLAC_FALSE; - } - riceParamParts0 &= riceParamMask; - riceParamParts0 |= (zeroCountParts0 << riceParam); - riceParamParts0 = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01]; - pDecodedSamples[0] = riceParamParts0 + drflac__calculate_prediction_64(order, shift, coefficients, pDecodedSamples); - i += 1; - pDecodedSamples += 1; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__sse41(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pSamplesOut != NULL); - if (lpcOrder > 0 && lpcOrder <= 12) { - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - return drflac__decode_samples_with_residual__rice__sse41_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); - } else { - return drflac__decode_samples_with_residual__rice__sse41_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); - } - } else { - return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac__vst2q_s32(drflac_int32* p, int32x4x2_t x) -{ - vst1q_s32(p+0, x.val[0]); - vst1q_s32(p+4, x.val[1]); -} -static DRFLAC_INLINE void drflac__vst2q_u32(drflac_uint32* p, uint32x4x2_t x) -{ - vst1q_u32(p+0, x.val[0]); - vst1q_u32(p+4, x.val[1]); -} -static DRFLAC_INLINE void drflac__vst2q_f32(float* p, float32x4x2_t x) -{ - vst1q_f32(p+0, x.val[0]); - vst1q_f32(p+4, x.val[1]); -} -static DRFLAC_INLINE void drflac__vst2q_s16(drflac_int16* p, int16x4x2_t x) -{ - vst1q_s16(p, vcombine_s16(x.val[0], x.val[1])); -} -static DRFLAC_INLINE void drflac__vst2q_u16(drflac_uint16* p, uint16x4x2_t x) -{ - vst1q_u16(p, vcombine_u16(x.val[0], x.val[1])); -} -static DRFLAC_INLINE int32x4_t drflac__vdupq_n_s32x4(drflac_int32 x3, drflac_int32 x2, drflac_int32 x1, drflac_int32 x0) -{ - drflac_int32 x[4]; - x[3] = x3; - x[2] = x2; - x[1] = x1; - x[0] = x0; - return vld1q_s32(x); -} -static DRFLAC_INLINE int32x4_t drflac__valignrq_s32_1(int32x4_t a, int32x4_t b) -{ - return vextq_s32(b, a, 1); -} -static DRFLAC_INLINE uint32x4_t drflac__valignrq_u32_1(uint32x4_t a, uint32x4_t b) -{ - return vextq_u32(b, a, 1); -} -static DRFLAC_INLINE int32x2_t drflac__vhaddq_s32(int32x4_t x) -{ - int32x2_t r = vadd_s32(vget_high_s32(x), vget_low_s32(x)); - return vpadd_s32(r, r); -} -static DRFLAC_INLINE int64x1_t drflac__vhaddq_s64(int64x2_t x) -{ - return vadd_s64(vget_high_s64(x), vget_low_s64(x)); -} -static DRFLAC_INLINE int32x4_t drflac__vrevq_s32(int32x4_t x) -{ - return vrev64q_s32(vcombine_s32(vget_high_s32(x), vget_low_s32(x))); -} -static DRFLAC_INLINE int32x4_t drflac__vnotq_s32(int32x4_t x) -{ - return veorq_s32(x, vdupq_n_s32(0xFFFFFFFF)); -} -static DRFLAC_INLINE uint32x4_t drflac__vnotq_u32(uint32x4_t x) -{ - return veorq_u32(x, vdupq_n_u32(0xFFFFFFFF)); -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__neon_32(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - int i; - drflac_uint32 riceParamMask; - drflac_int32* pDecodedSamples = pSamplesOut; - drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3); - drflac_uint32 zeroCountParts[4]; - drflac_uint32 riceParamParts[4]; - int32x4_t coefficients128_0; - int32x4_t coefficients128_4; - int32x4_t coefficients128_8; - int32x4_t samples128_0; - int32x4_t samples128_4; - int32x4_t samples128_8; - uint32x4_t riceParamMask128; - int32x4_t riceParam128; - int32x2_t shift64; - uint32x4_t one128; - const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - riceParamMask = ~((~0UL) << riceParam); - riceParamMask128 = vdupq_n_u32(riceParamMask); - riceParam128 = vdupq_n_s32(riceParam); - shift64 = vdup_n_s32(-shift); - one128 = vdupq_n_u32(1); - { - int runningOrder = order; - drflac_int32 tempC[4] = {0, 0, 0, 0}; - drflac_int32 tempS[4] = {0, 0, 0, 0}; - if (runningOrder >= 4) { - coefficients128_0 = vld1q_s32(coefficients + 0); - samples128_0 = vld1q_s32(pSamplesOut - 4); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: tempC[2] = coefficients[2]; tempS[1] = pSamplesOut[-3]; - case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2]; - case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1]; - } - coefficients128_0 = vld1q_s32(tempC); - samples128_0 = vld1q_s32(tempS); - runningOrder = 0; - } - if (runningOrder >= 4) { - coefficients128_4 = vld1q_s32(coefficients + 4); - samples128_4 = vld1q_s32(pSamplesOut - 8); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: tempC[2] = coefficients[6]; tempS[1] = pSamplesOut[-7]; - case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6]; - case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5]; - } - coefficients128_4 = vld1q_s32(tempC); - samples128_4 = vld1q_s32(tempS); - runningOrder = 0; - } - if (runningOrder == 4) { - coefficients128_8 = vld1q_s32(coefficients + 8); - samples128_8 = vld1q_s32(pSamplesOut - 12); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: tempC[2] = coefficients[10]; tempS[1] = pSamplesOut[-11]; - case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10]; - case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9]; - } - coefficients128_8 = vld1q_s32(tempC); - samples128_8 = vld1q_s32(tempS); - runningOrder = 0; - } - coefficients128_0 = drflac__vrevq_s32(coefficients128_0); - coefficients128_4 = drflac__vrevq_s32(coefficients128_4); - coefficients128_8 = drflac__vrevq_s32(coefficients128_8); - } - while (pDecodedSamples < pDecodedSamplesEnd) { - int32x4_t prediction128; - int32x2_t prediction64; - uint32x4_t zeroCountPart128; - uint32x4_t riceParamPart128; - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0]) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[1], &riceParamParts[1]) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[2], &riceParamParts[2]) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[3], &riceParamParts[3])) { - return DRFLAC_FALSE; - } - zeroCountPart128 = vld1q_u32(zeroCountParts); - riceParamPart128 = vld1q_u32(riceParamParts); - riceParamPart128 = vandq_u32(riceParamPart128, riceParamMask128); - riceParamPart128 = vorrq_u32(riceParamPart128, vshlq_u32(zeroCountPart128, riceParam128)); - riceParamPart128 = veorq_u32(vshrq_n_u32(riceParamPart128, 1), vaddq_u32(drflac__vnotq_u32(vandq_u32(riceParamPart128, one128)), one128)); - if (order <= 4) { - for (i = 0; i < 4; i += 1) { - prediction128 = vmulq_s32(coefficients128_0, samples128_0); - prediction64 = drflac__vhaddq_s32(prediction128); - prediction64 = vshl_s32(prediction64, shift64); - prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128))); - samples128_0 = drflac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0); - riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128); - } - } else if (order <= 8) { - for (i = 0; i < 4; i += 1) { - prediction128 = vmulq_s32(coefficients128_4, samples128_4); - prediction128 = vmlaq_s32(prediction128, coefficients128_0, samples128_0); - prediction64 = drflac__vhaddq_s32(prediction128); - prediction64 = vshl_s32(prediction64, shift64); - prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128))); - samples128_4 = drflac__valignrq_s32_1(samples128_0, samples128_4); - samples128_0 = drflac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0); - riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128); - } - } else { - for (i = 0; i < 4; i += 1) { - prediction128 = vmulq_s32(coefficients128_8, samples128_8); - prediction128 = vmlaq_s32(prediction128, coefficients128_4, samples128_4); - prediction128 = vmlaq_s32(prediction128, coefficients128_0, samples128_0); - prediction64 = drflac__vhaddq_s32(prediction128); - prediction64 = vshl_s32(prediction64, shift64); - prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128))); - samples128_8 = drflac__valignrq_s32_1(samples128_4, samples128_8); - samples128_4 = drflac__valignrq_s32_1(samples128_0, samples128_4); - samples128_0 = drflac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0); - riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128); - } - } - vst1q_s32(pDecodedSamples, samples128_0); - pDecodedSamples += 4; - } - i = (count & ~3); - while (i < (int)count) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) { - return DRFLAC_FALSE; - } - riceParamParts[0] &= riceParamMask; - riceParamParts[0] |= (zeroCountParts[0] << riceParam); - riceParamParts[0] = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01]; - pDecodedSamples[0] = riceParamParts[0] + drflac__calculate_prediction_32(order, shift, coefficients, pDecodedSamples); - i += 1; - pDecodedSamples += 1; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__neon_64(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - int i; - drflac_uint32 riceParamMask; - drflac_int32* pDecodedSamples = pSamplesOut; - drflac_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3); - drflac_uint32 zeroCountParts[4]; - drflac_uint32 riceParamParts[4]; - int32x4_t coefficients128_0; - int32x4_t coefficients128_4; - int32x4_t coefficients128_8; - int32x4_t samples128_0; - int32x4_t samples128_4; - int32x4_t samples128_8; - uint32x4_t riceParamMask128; - int32x4_t riceParam128; - int64x1_t shift64; - uint32x4_t one128; - const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; - riceParamMask = ~((~0UL) << riceParam); - riceParamMask128 = vdupq_n_u32(riceParamMask); - riceParam128 = vdupq_n_s32(riceParam); - shift64 = vdup_n_s64(-shift); - one128 = vdupq_n_u32(1); - { - int runningOrder = order; - drflac_int32 tempC[4] = {0, 0, 0, 0}; - drflac_int32 tempS[4] = {0, 0, 0, 0}; - if (runningOrder >= 4) { - coefficients128_0 = vld1q_s32(coefficients + 0); - samples128_0 = vld1q_s32(pSamplesOut - 4); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: tempC[2] = coefficients[2]; tempS[1] = pSamplesOut[-3]; - case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2]; - case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1]; - } - coefficients128_0 = vld1q_s32(tempC); - samples128_0 = vld1q_s32(tempS); - runningOrder = 0; - } - if (runningOrder >= 4) { - coefficients128_4 = vld1q_s32(coefficients + 4); - samples128_4 = vld1q_s32(pSamplesOut - 8); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: tempC[2] = coefficients[6]; tempS[1] = pSamplesOut[-7]; - case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6]; - case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5]; - } - coefficients128_4 = vld1q_s32(tempC); - samples128_4 = vld1q_s32(tempS); - runningOrder = 0; - } - if (runningOrder == 4) { - coefficients128_8 = vld1q_s32(coefficients + 8); - samples128_8 = vld1q_s32(pSamplesOut - 12); - runningOrder -= 4; - } else { - switch (runningOrder) { - case 3: tempC[2] = coefficients[10]; tempS[1] = pSamplesOut[-11]; - case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10]; - case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9]; - } - coefficients128_8 = vld1q_s32(tempC); - samples128_8 = vld1q_s32(tempS); - runningOrder = 0; - } - coefficients128_0 = drflac__vrevq_s32(coefficients128_0); - coefficients128_4 = drflac__vrevq_s32(coefficients128_4); - coefficients128_8 = drflac__vrevq_s32(coefficients128_8); - } - while (pDecodedSamples < pDecodedSamplesEnd) { - int64x2_t prediction128; - uint32x4_t zeroCountPart128; - uint32x4_t riceParamPart128; - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0]) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[1], &riceParamParts[1]) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[2], &riceParamParts[2]) || - !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[3], &riceParamParts[3])) { - return DRFLAC_FALSE; - } - zeroCountPart128 = vld1q_u32(zeroCountParts); - riceParamPart128 = vld1q_u32(riceParamParts); - riceParamPart128 = vandq_u32(riceParamPart128, riceParamMask128); - riceParamPart128 = vorrq_u32(riceParamPart128, vshlq_u32(zeroCountPart128, riceParam128)); - riceParamPart128 = veorq_u32(vshrq_n_u32(riceParamPart128, 1), vaddq_u32(drflac__vnotq_u32(vandq_u32(riceParamPart128, one128)), one128)); - for (i = 0; i < 4; i += 1) { - int64x1_t prediction64; - prediction128 = veorq_s64(prediction128, prediction128); - switch (order) - { - case 12: - case 11: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_8), vget_low_s32(samples128_8))); - case 10: - case 9: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_8), vget_high_s32(samples128_8))); - case 8: - case 7: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_4), vget_low_s32(samples128_4))); - case 6: - case 5: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_4), vget_high_s32(samples128_4))); - case 4: - case 3: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_0), vget_low_s32(samples128_0))); - case 2: - case 1: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_0), vget_high_s32(samples128_0))); - } - prediction64 = drflac__vhaddq_s64(prediction128); - prediction64 = vshl_s64(prediction64, shift64); - prediction64 = vadd_s64(prediction64, vdup_n_s64(vgetq_lane_u32(riceParamPart128, 0))); - samples128_8 = drflac__valignrq_s32_1(samples128_4, samples128_8); - samples128_4 = drflac__valignrq_s32_1(samples128_0, samples128_4); - samples128_0 = drflac__valignrq_s32_1(vcombine_s32(vreinterpret_s32_s64(prediction64), vdup_n_s32(0)), samples128_0); - riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128); - } - vst1q_s32(pDecodedSamples, samples128_0); - pDecodedSamples += 4; - } - i = (count & ~3); - while (i < (int)count) { - if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) { - return DRFLAC_FALSE; - } - riceParamParts[0] &= riceParamMask; - riceParamParts[0] |= (zeroCountParts[0] << riceParam); - riceParamParts[0] = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01]; - pDecodedSamples[0] = riceParamParts[0] + drflac__calculate_prediction_64(order, shift, coefficients, pDecodedSamples); - i += 1; - pDecodedSamples += 1; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples_with_residual__rice__neon(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(pSamplesOut != NULL); - if (lpcOrder > 0 && lpcOrder <= 12) { - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - return drflac__decode_samples_with_residual__rice__neon_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); - } else { - return drflac__decode_samples_with_residual__rice__neon_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut); - } - } else { - return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - } -} -#endif -static drflac_bool32 drflac__decode_samples_with_residual__rice(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ -#if defined(DRFLAC_SUPPORT_SSE41) - if (drflac__gIsSSE41Supported) { - return drflac__decode_samples_with_residual__rice__sse41(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported) { - return drflac__decode_samples_with_residual__rice__neon(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - } else -#endif - { - #if 0 - return drflac__decode_samples_with_residual__rice__reference(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - #else - return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut); - #endif - } -} -static drflac_bool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam) -{ - drflac_uint32 i; - DRFLAC_ASSERT(bs != NULL); - for (i = 0; i < count; ++i) { - if (!drflac__seek_rice_parts(bs, riceParam)) { - return DRFLAC_FALSE; - } - } - return DRFLAC_TRUE; -} -#if defined(__clang__) -__attribute__((no_sanitize("signed-integer-overflow"))) -#endif -static drflac_bool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 unencodedBitsPerSample, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pSamplesOut) -{ - drflac_uint32 i; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(unencodedBitsPerSample <= 31); - DRFLAC_ASSERT(pSamplesOut != NULL); - for (i = 0; i < count; ++i) { - if (unencodedBitsPerSample > 0) { - if (!drflac__read_int32(bs, unencodedBitsPerSample, pSamplesOut + i)) { - return DRFLAC_FALSE; - } - } else { - pSamplesOut[i] = 0; - } - if (drflac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) { - pSamplesOut[i] += drflac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i); - } else { - pSamplesOut[i] += drflac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i); - } - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 blockSize, drflac_uint32 lpcOrder, drflac_int32 lpcShift, drflac_uint32 lpcPrecision, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) -{ - drflac_uint8 residualMethod; - drflac_uint8 partitionOrder; - drflac_uint32 samplesInPartition; - drflac_uint32 partitionsRemaining; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(blockSize != 0); - DRFLAC_ASSERT(pDecodedSamples != NULL); - if (!drflac__read_uint8(bs, 2, &residualMethod)) { - return DRFLAC_FALSE; - } - if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { - return DRFLAC_FALSE; - } - pDecodedSamples += lpcOrder; - if (!drflac__read_uint8(bs, 4, &partitionOrder)) { - return DRFLAC_FALSE; - } - if (partitionOrder > 8) { - return DRFLAC_FALSE; - } - if ((blockSize / (1 << partitionOrder)) < lpcOrder) { - return DRFLAC_FALSE; - } - samplesInPartition = (blockSize / (1 << partitionOrder)) - lpcOrder; - partitionsRemaining = (1 << partitionOrder); - for (;;) { - drflac_uint8 riceParam = 0; - if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) { - if (!drflac__read_uint8(bs, 4, &riceParam)) { - return DRFLAC_FALSE; - } - if (riceParam == 15) { - riceParam = 0xFF; - } - } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { - if (!drflac__read_uint8(bs, 5, &riceParam)) { - return DRFLAC_FALSE; - } - if (riceParam == 31) { - riceParam = 0xFF; - } - } - if (riceParam != 0xFF) { - if (!drflac__decode_samples_with_residual__rice(bs, bitsPerSample, samplesInPartition, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) { - return DRFLAC_FALSE; - } - } else { - drflac_uint8 unencodedBitsPerSample = 0; - if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) { - return DRFLAC_FALSE; - } - if (!drflac__decode_samples_with_residual__unencoded(bs, bitsPerSample, samplesInPartition, unencodedBitsPerSample, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) { - return DRFLAC_FALSE; - } - } - pDecodedSamples += samplesInPartition; - if (partitionsRemaining == 1) { - break; - } - partitionsRemaining -= 1; - if (partitionOrder != 0) { - samplesInPartition = blockSize / (1 << partitionOrder); - } - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__read_and_seek_residual(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 order) -{ - drflac_uint8 residualMethod; - drflac_uint8 partitionOrder; - drflac_uint32 samplesInPartition; - drflac_uint32 partitionsRemaining; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(blockSize != 0); - if (!drflac__read_uint8(bs, 2, &residualMethod)) { - return DRFLAC_FALSE; - } - if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { - return DRFLAC_FALSE; - } - if (!drflac__read_uint8(bs, 4, &partitionOrder)) { - return DRFLAC_FALSE; - } - if (partitionOrder > 8) { - return DRFLAC_FALSE; - } - if ((blockSize / (1 << partitionOrder)) <= order) { - return DRFLAC_FALSE; - } - samplesInPartition = (blockSize / (1 << partitionOrder)) - order; - partitionsRemaining = (1 << partitionOrder); - for (;;) - { - drflac_uint8 riceParam = 0; - if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) { - if (!drflac__read_uint8(bs, 4, &riceParam)) { - return DRFLAC_FALSE; - } - if (riceParam == 15) { - riceParam = 0xFF; - } - } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { - if (!drflac__read_uint8(bs, 5, &riceParam)) { - return DRFLAC_FALSE; - } - if (riceParam == 31) { - riceParam = 0xFF; - } - } - if (riceParam != 0xFF) { - if (!drflac__read_and_seek_residual__rice(bs, samplesInPartition, riceParam)) { - return DRFLAC_FALSE; - } - } else { - drflac_uint8 unencodedBitsPerSample = 0; - if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) { - return DRFLAC_FALSE; - } - if (!drflac__seek_bits(bs, unencodedBitsPerSample * samplesInPartition)) { - return DRFLAC_FALSE; - } - } - if (partitionsRemaining == 1) { - break; - } - partitionsRemaining -= 1; - samplesInPartition = blockSize / (1 << partitionOrder); - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples__constant(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 subframeBitsPerSample, drflac_int32* pDecodedSamples) -{ - drflac_uint32 i; - drflac_int32 sample; - if (!drflac__read_int32(bs, subframeBitsPerSample, &sample)) { - return DRFLAC_FALSE; - } - for (i = 0; i < blockSize; ++i) { - pDecodedSamples[i] = sample; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples__verbatim(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 subframeBitsPerSample, drflac_int32* pDecodedSamples) -{ - drflac_uint32 i; - for (i = 0; i < blockSize; ++i) { - drflac_int32 sample; - if (!drflac__read_int32(bs, subframeBitsPerSample, &sample)) { - return DRFLAC_FALSE; - } - pDecodedSamples[i] = sample; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples__fixed(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 subframeBitsPerSample, drflac_uint8 lpcOrder, drflac_int32* pDecodedSamples) -{ - drflac_uint32 i; - static drflac_int32 lpcCoefficientsTable[5][4] = { - {0, 0, 0, 0}, - {1, 0, 0, 0}, - {2, -1, 0, 0}, - {3, -3, 1, 0}, - {4, -6, 4, -1} - }; - for (i = 0; i < lpcOrder; ++i) { - drflac_int32 sample; - if (!drflac__read_int32(bs, subframeBitsPerSample, &sample)) { - return DRFLAC_FALSE; - } - pDecodedSamples[i] = sample; - } - if (!drflac__decode_samples_with_residual(bs, subframeBitsPerSample, blockSize, lpcOrder, 0, 4, lpcCoefficientsTable[lpcOrder], pDecodedSamples)) { - return DRFLAC_FALSE; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_samples__lpc(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 bitsPerSample, drflac_uint8 lpcOrder, drflac_int32* pDecodedSamples) -{ - drflac_uint8 i; - drflac_uint8 lpcPrecision; - drflac_int8 lpcShift; - drflac_int32 coefficients[32]; - for (i = 0; i < lpcOrder; ++i) { - drflac_int32 sample; - if (!drflac__read_int32(bs, bitsPerSample, &sample)) { - return DRFLAC_FALSE; - } - pDecodedSamples[i] = sample; - } - if (!drflac__read_uint8(bs, 4, &lpcPrecision)) { - return DRFLAC_FALSE; - } - if (lpcPrecision == 15) { - return DRFLAC_FALSE; - } - lpcPrecision += 1; - if (!drflac__read_int8(bs, 5, &lpcShift)) { - return DRFLAC_FALSE; - } - if (lpcShift < 0) { - return DRFLAC_FALSE; - } - DRFLAC_ZERO_MEMORY(coefficients, sizeof(coefficients)); - for (i = 0; i < lpcOrder; ++i) { - if (!drflac__read_int32(bs, lpcPrecision, coefficients + i)) { - return DRFLAC_FALSE; - } - } - if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) { - return DRFLAC_FALSE; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__read_next_flac_frame_header(drflac_bs* bs, drflac_uint8 streaminfoBitsPerSample, drflac_frame_header* header) -{ - const drflac_uint32 sampleRateTable[12] = {0, 88200, 176400, 192000, 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000}; - const drflac_uint8 bitsPerSampleTable[8] = {0, 8, 12, (drflac_uint8)-1, 16, 20, 24, (drflac_uint8)-1}; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(header != NULL); - for (;;) { - drflac_uint8 crc8 = 0xCE; - drflac_uint8 reserved = 0; - drflac_uint8 blockingStrategy = 0; - drflac_uint8 blockSize = 0; - drflac_uint8 sampleRate = 0; - drflac_uint8 channelAssignment = 0; - drflac_uint8 bitsPerSample = 0; - drflac_bool32 isVariableBlockSize; - if (!drflac__find_and_seek_to_next_sync_code(bs)) { - return DRFLAC_FALSE; - } - if (!drflac__read_uint8(bs, 1, &reserved)) { - return DRFLAC_FALSE; - } - if (reserved == 1) { - continue; - } - crc8 = drflac_crc8(crc8, reserved, 1); - if (!drflac__read_uint8(bs, 1, &blockingStrategy)) { - return DRFLAC_FALSE; - } - crc8 = drflac_crc8(crc8, blockingStrategy, 1); - if (!drflac__read_uint8(bs, 4, &blockSize)) { - return DRFLAC_FALSE; - } - if (blockSize == 0) { - continue; - } - crc8 = drflac_crc8(crc8, blockSize, 4); - if (!drflac__read_uint8(bs, 4, &sampleRate)) { - return DRFLAC_FALSE; - } - crc8 = drflac_crc8(crc8, sampleRate, 4); - if (!drflac__read_uint8(bs, 4, &channelAssignment)) { - return DRFLAC_FALSE; - } - if (channelAssignment > 10) { - continue; - } - crc8 = drflac_crc8(crc8, channelAssignment, 4); - if (!drflac__read_uint8(bs, 3, &bitsPerSample)) { - return DRFLAC_FALSE; - } - if (bitsPerSample == 3 || bitsPerSample == 7) { - continue; - } - crc8 = drflac_crc8(crc8, bitsPerSample, 3); - if (!drflac__read_uint8(bs, 1, &reserved)) { - return DRFLAC_FALSE; - } - if (reserved == 1) { - continue; - } - crc8 = drflac_crc8(crc8, reserved, 1); - isVariableBlockSize = blockingStrategy == 1; - if (isVariableBlockSize) { - drflac_uint64 pcmFrameNumber; - drflac_result result = drflac__read_utf8_coded_number(bs, &pcmFrameNumber, &crc8); - if (result != DRFLAC_SUCCESS) { - if (result == DRFLAC_AT_END) { - return DRFLAC_FALSE; - } else { - continue; - } - } - header->flacFrameNumber = 0; - header->pcmFrameNumber = pcmFrameNumber; - } else { - drflac_uint64 flacFrameNumber = 0; - drflac_result result = drflac__read_utf8_coded_number(bs, &flacFrameNumber, &crc8); - if (result != DRFLAC_SUCCESS) { - if (result == DRFLAC_AT_END) { - return DRFLAC_FALSE; - } else { - continue; - } - } - header->flacFrameNumber = (drflac_uint32)flacFrameNumber; - header->pcmFrameNumber = 0; - } - DRFLAC_ASSERT(blockSize > 0); - if (blockSize == 1) { - header->blockSizeInPCMFrames = 192; - } else if (blockSize <= 5) { - DRFLAC_ASSERT(blockSize >= 2); - header->blockSizeInPCMFrames = 576 * (1 << (blockSize - 2)); - } else if (blockSize == 6) { - if (!drflac__read_uint16(bs, 8, &header->blockSizeInPCMFrames)) { - return DRFLAC_FALSE; - } - crc8 = drflac_crc8(crc8, header->blockSizeInPCMFrames, 8); - header->blockSizeInPCMFrames += 1; - } else if (blockSize == 7) { - if (!drflac__read_uint16(bs, 16, &header->blockSizeInPCMFrames)) { - return DRFLAC_FALSE; - } - crc8 = drflac_crc8(crc8, header->blockSizeInPCMFrames, 16); - if (header->blockSizeInPCMFrames == 0xFFFF) { - return DRFLAC_FALSE; - } - header->blockSizeInPCMFrames += 1; - } else { - DRFLAC_ASSERT(blockSize >= 8); - header->blockSizeInPCMFrames = 256 * (1 << (blockSize - 8)); - } - if (sampleRate <= 11) { - header->sampleRate = sampleRateTable[sampleRate]; - } else if (sampleRate == 12) { - if (!drflac__read_uint32(bs, 8, &header->sampleRate)) { - return DRFLAC_FALSE; - } - crc8 = drflac_crc8(crc8, header->sampleRate, 8); - header->sampleRate *= 1000; - } else if (sampleRate == 13) { - if (!drflac__read_uint32(bs, 16, &header->sampleRate)) { - return DRFLAC_FALSE; - } - crc8 = drflac_crc8(crc8, header->sampleRate, 16); - } else if (sampleRate == 14) { - if (!drflac__read_uint32(bs, 16, &header->sampleRate)) { - return DRFLAC_FALSE; - } - crc8 = drflac_crc8(crc8, header->sampleRate, 16); - header->sampleRate *= 10; - } else { - continue; - } - header->channelAssignment = channelAssignment; - header->bitsPerSample = bitsPerSampleTable[bitsPerSample]; - if (header->bitsPerSample == 0) { - header->bitsPerSample = streaminfoBitsPerSample; - } - if (header->bitsPerSample != streaminfoBitsPerSample) { - return DRFLAC_FALSE; - } - if (!drflac__read_uint8(bs, 8, &header->crc8)) { - return DRFLAC_FALSE; - } -#ifndef DR_FLAC_NO_CRC - if (header->crc8 != crc8) { - continue; - } -#endif - return DRFLAC_TRUE; - } -} -static drflac_bool32 drflac__read_subframe_header(drflac_bs* bs, drflac_subframe* pSubframe) -{ - drflac_uint8 header; - int type; - if (!drflac__read_uint8(bs, 8, &header)) { - return DRFLAC_FALSE; - } - if ((header & 0x80) != 0) { - return DRFLAC_FALSE; - } - type = (header & 0x7E) >> 1; - if (type == 0) { - pSubframe->subframeType = DRFLAC_SUBFRAME_CONSTANT; - } else if (type == 1) { - pSubframe->subframeType = DRFLAC_SUBFRAME_VERBATIM; - } else { - if ((type & 0x20) != 0) { - pSubframe->subframeType = DRFLAC_SUBFRAME_LPC; - pSubframe->lpcOrder = (drflac_uint8)(type & 0x1F) + 1; - } else if ((type & 0x08) != 0) { - pSubframe->subframeType = DRFLAC_SUBFRAME_FIXED; - pSubframe->lpcOrder = (drflac_uint8)(type & 0x07); - if (pSubframe->lpcOrder > 4) { - pSubframe->subframeType = DRFLAC_SUBFRAME_RESERVED; - pSubframe->lpcOrder = 0; - } - } else { - pSubframe->subframeType = DRFLAC_SUBFRAME_RESERVED; - } - } - if (pSubframe->subframeType == DRFLAC_SUBFRAME_RESERVED) { - return DRFLAC_FALSE; - } - pSubframe->wastedBitsPerSample = 0; - if ((header & 0x01) == 1) { - unsigned int wastedBitsPerSample; - if (!drflac__seek_past_next_set_bit(bs, &wastedBitsPerSample)) { - return DRFLAC_FALSE; - } - pSubframe->wastedBitsPerSample = (drflac_uint8)wastedBitsPerSample + 1; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex, drflac_int32* pDecodedSamplesOut) -{ - drflac_subframe* pSubframe; - drflac_uint32 subframeBitsPerSample; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(frame != NULL); - pSubframe = frame->subframes + subframeIndex; - if (!drflac__read_subframe_header(bs, pSubframe)) { - return DRFLAC_FALSE; - } - subframeBitsPerSample = frame->header.bitsPerSample; - if ((frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) { - subframeBitsPerSample += 1; - } else if (frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) { - subframeBitsPerSample += 1; - } - if (subframeBitsPerSample > 32) { - return DRFLAC_FALSE; - } - if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) { - return DRFLAC_FALSE; - } - subframeBitsPerSample -= pSubframe->wastedBitsPerSample; - pSubframe->pSamplesS32 = pDecodedSamplesOut; - switch (pSubframe->subframeType) - { - case DRFLAC_SUBFRAME_CONSTANT: - { - drflac__decode_samples__constant(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32); - } break; - case DRFLAC_SUBFRAME_VERBATIM: - { - drflac__decode_samples__verbatim(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32); - } break; - case DRFLAC_SUBFRAME_FIXED: - { - drflac__decode_samples__fixed(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32); - } break; - case DRFLAC_SUBFRAME_LPC: - { - drflac__decode_samples__lpc(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32); - } break; - default: return DRFLAC_FALSE; - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__seek_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex) -{ - drflac_subframe* pSubframe; - drflac_uint32 subframeBitsPerSample; - DRFLAC_ASSERT(bs != NULL); - DRFLAC_ASSERT(frame != NULL); - pSubframe = frame->subframes + subframeIndex; - if (!drflac__read_subframe_header(bs, pSubframe)) { - return DRFLAC_FALSE; - } - subframeBitsPerSample = frame->header.bitsPerSample; - if ((frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) { - subframeBitsPerSample += 1; - } else if (frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) { - subframeBitsPerSample += 1; - } - if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) { - return DRFLAC_FALSE; - } - subframeBitsPerSample -= pSubframe->wastedBitsPerSample; - pSubframe->pSamplesS32 = NULL; - switch (pSubframe->subframeType) - { - case DRFLAC_SUBFRAME_CONSTANT: - { - if (!drflac__seek_bits(bs, subframeBitsPerSample)) { - return DRFLAC_FALSE; - } - } break; - case DRFLAC_SUBFRAME_VERBATIM: - { - unsigned int bitsToSeek = frame->header.blockSizeInPCMFrames * subframeBitsPerSample; - if (!drflac__seek_bits(bs, bitsToSeek)) { - return DRFLAC_FALSE; - } - } break; - case DRFLAC_SUBFRAME_FIXED: - { - unsigned int bitsToSeek = pSubframe->lpcOrder * subframeBitsPerSample; - if (!drflac__seek_bits(bs, bitsToSeek)) { - return DRFLAC_FALSE; - } - if (!drflac__read_and_seek_residual(bs, frame->header.blockSizeInPCMFrames, pSubframe->lpcOrder)) { - return DRFLAC_FALSE; - } - } break; - case DRFLAC_SUBFRAME_LPC: - { - drflac_uint8 lpcPrecision; - unsigned int bitsToSeek = pSubframe->lpcOrder * subframeBitsPerSample; - if (!drflac__seek_bits(bs, bitsToSeek)) { - return DRFLAC_FALSE; - } - if (!drflac__read_uint8(bs, 4, &lpcPrecision)) { - return DRFLAC_FALSE; - } - if (lpcPrecision == 15) { - return DRFLAC_FALSE; - } - lpcPrecision += 1; - bitsToSeek = (pSubframe->lpcOrder * lpcPrecision) + 5; - if (!drflac__seek_bits(bs, bitsToSeek)) { - return DRFLAC_FALSE; - } - if (!drflac__read_and_seek_residual(bs, frame->header.blockSizeInPCMFrames, pSubframe->lpcOrder)) { - return DRFLAC_FALSE; - } - } break; - default: return DRFLAC_FALSE; - } - return DRFLAC_TRUE; -} -static DRFLAC_INLINE drflac_uint8 drflac__get_channel_count_from_channel_assignment(drflac_int8 channelAssignment) -{ - drflac_uint8 lookup[] = {1, 2, 3, 4, 5, 6, 7, 8, 2, 2, 2}; - DRFLAC_ASSERT(channelAssignment <= 10); - return lookup[channelAssignment]; -} -static drflac_result drflac__decode_flac_frame(drflac* pFlac) -{ - int channelCount; - int i; - drflac_uint8 paddingSizeInBits; - drflac_uint16 desiredCRC16; -#ifndef DR_FLAC_NO_CRC - drflac_uint16 actualCRC16; -#endif - DRFLAC_ZERO_MEMORY(pFlac->currentFLACFrame.subframes, sizeof(pFlac->currentFLACFrame.subframes)); - if (pFlac->currentFLACFrame.header.blockSizeInPCMFrames > pFlac->maxBlockSizeInPCMFrames) { - return DRFLAC_ERROR; - } - channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment); - if (channelCount != (int)pFlac->channels) { - return DRFLAC_ERROR; - } - for (i = 0; i < channelCount; ++i) { - if (!drflac__decode_subframe(&pFlac->bs, &pFlac->currentFLACFrame, i, pFlac->pDecodedSamples + (pFlac->currentFLACFrame.header.blockSizeInPCMFrames * i))) { - return DRFLAC_ERROR; - } - } - paddingSizeInBits = (drflac_uint8)(DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7); - if (paddingSizeInBits > 0) { - drflac_uint8 padding = 0; - if (!drflac__read_uint8(&pFlac->bs, paddingSizeInBits, &padding)) { - return DRFLAC_AT_END; - } - } -#ifndef DR_FLAC_NO_CRC - actualCRC16 = drflac__flush_crc16(&pFlac->bs); -#endif - if (!drflac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) { - return DRFLAC_AT_END; - } -#ifndef DR_FLAC_NO_CRC - if (actualCRC16 != desiredCRC16) { - return DRFLAC_CRC_MISMATCH; - } -#endif - pFlac->currentFLACFrame.pcmFramesRemaining = pFlac->currentFLACFrame.header.blockSizeInPCMFrames; - return DRFLAC_SUCCESS; -} -static drflac_result drflac__seek_flac_frame(drflac* pFlac) -{ - int channelCount; - int i; - drflac_uint16 desiredCRC16; -#ifndef DR_FLAC_NO_CRC - drflac_uint16 actualCRC16; -#endif - channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment); - for (i = 0; i < channelCount; ++i) { - if (!drflac__seek_subframe(&pFlac->bs, &pFlac->currentFLACFrame, i)) { - return DRFLAC_ERROR; - } - } - if (!drflac__seek_bits(&pFlac->bs, DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7)) { - return DRFLAC_ERROR; - } -#ifndef DR_FLAC_NO_CRC - actualCRC16 = drflac__flush_crc16(&pFlac->bs); -#endif - if (!drflac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) { - return DRFLAC_AT_END; - } -#ifndef DR_FLAC_NO_CRC - if (actualCRC16 != desiredCRC16) { - return DRFLAC_CRC_MISMATCH; - } -#endif - return DRFLAC_SUCCESS; -} -static drflac_bool32 drflac__read_and_decode_next_flac_frame(drflac* pFlac) -{ - DRFLAC_ASSERT(pFlac != NULL); - for (;;) { - drflac_result result; - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - result = drflac__decode_flac_frame(pFlac); - if (result != DRFLAC_SUCCESS) { - if (result == DRFLAC_CRC_MISMATCH) { - continue; - } else { - return DRFLAC_FALSE; - } - } - return DRFLAC_TRUE; - } -} -static void drflac__get_pcm_frame_range_of_current_flac_frame(drflac* pFlac, drflac_uint64* pFirstPCMFrame, drflac_uint64* pLastPCMFrame) -{ - drflac_uint64 firstPCMFrame; - drflac_uint64 lastPCMFrame; - DRFLAC_ASSERT(pFlac != NULL); - firstPCMFrame = pFlac->currentFLACFrame.header.pcmFrameNumber; - if (firstPCMFrame == 0) { - firstPCMFrame = ((drflac_uint64)pFlac->currentFLACFrame.header.flacFrameNumber) * pFlac->maxBlockSizeInPCMFrames; - } - lastPCMFrame = firstPCMFrame + pFlac->currentFLACFrame.header.blockSizeInPCMFrames; - if (lastPCMFrame > 0) { - lastPCMFrame -= 1; - } - if (pFirstPCMFrame) { - *pFirstPCMFrame = firstPCMFrame; - } - if (pLastPCMFrame) { - *pLastPCMFrame = lastPCMFrame; - } -} -static drflac_bool32 drflac__seek_to_first_frame(drflac* pFlac) -{ - drflac_bool32 result; - DRFLAC_ASSERT(pFlac != NULL); - result = drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes); - DRFLAC_ZERO_MEMORY(&pFlac->currentFLACFrame, sizeof(pFlac->currentFLACFrame)); - pFlac->currentPCMFrame = 0; - return result; -} -static DRFLAC_INLINE drflac_result drflac__seek_to_next_flac_frame(drflac* pFlac) -{ - DRFLAC_ASSERT(pFlac != NULL); - return drflac__seek_flac_frame(pFlac); -} -static drflac_uint64 drflac__seek_forward_by_pcm_frames(drflac* pFlac, drflac_uint64 pcmFramesToSeek) -{ - drflac_uint64 pcmFramesRead = 0; - while (pcmFramesToSeek > 0) { - if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) { - if (!drflac__read_and_decode_next_flac_frame(pFlac)) { - break; - } - } else { - if (pFlac->currentFLACFrame.pcmFramesRemaining > pcmFramesToSeek) { - pcmFramesRead += pcmFramesToSeek; - pFlac->currentFLACFrame.pcmFramesRemaining -= (drflac_uint32)pcmFramesToSeek; - pcmFramesToSeek = 0; - } else { - pcmFramesRead += pFlac->currentFLACFrame.pcmFramesRemaining; - pcmFramesToSeek -= pFlac->currentFLACFrame.pcmFramesRemaining; - pFlac->currentFLACFrame.pcmFramesRemaining = 0; - } - } - } - pFlac->currentPCMFrame += pcmFramesRead; - return pcmFramesRead; -} -static drflac_bool32 drflac__seek_to_pcm_frame__brute_force(drflac* pFlac, drflac_uint64 pcmFrameIndex) -{ - drflac_bool32 isMidFrame = DRFLAC_FALSE; - drflac_uint64 runningPCMFrameCount; - DRFLAC_ASSERT(pFlac != NULL); - if (pcmFrameIndex >= pFlac->currentPCMFrame) { - runningPCMFrameCount = pFlac->currentPCMFrame; - if (pFlac->currentPCMFrame == 0 && pFlac->currentFLACFrame.pcmFramesRemaining == 0) { - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - } else { - isMidFrame = DRFLAC_TRUE; - } - } else { - runningPCMFrameCount = 0; - if (!drflac__seek_to_first_frame(pFlac)) { - return DRFLAC_FALSE; - } - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - } - for (;;) { - drflac_uint64 pcmFrameCountInThisFLACFrame; - drflac_uint64 firstPCMFrameInFLACFrame = 0; - drflac_uint64 lastPCMFrameInFLACFrame = 0; - drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame); - pcmFrameCountInThisFLACFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1; - if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFLACFrame)) { - drflac_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount; - if (!isMidFrame) { - drflac_result result = drflac__decode_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - goto next_iteration; - } else { - return DRFLAC_FALSE; - } - } - } else { - return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; - } - } else { - if (!isMidFrame) { - drflac_result result = drflac__seek_to_next_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - runningPCMFrameCount += pcmFrameCountInThisFLACFrame; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - goto next_iteration; - } else { - return DRFLAC_FALSE; - } - } - } else { - runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining; - pFlac->currentFLACFrame.pcmFramesRemaining = 0; - isMidFrame = DRFLAC_FALSE; - } - if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) { - return DRFLAC_TRUE; - } - } - next_iteration: - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - } -} -#if !defined(DR_FLAC_NO_CRC) -#define DRFLAC_BINARY_SEARCH_APPROX_COMPRESSION_RATIO 0.6f -static drflac_bool32 drflac__seek_to_approximate_flac_frame_to_byte(drflac* pFlac, drflac_uint64 targetByte, drflac_uint64 rangeLo, drflac_uint64 rangeHi, drflac_uint64* pLastSuccessfulSeekOffset) -{ - DRFLAC_ASSERT(pFlac != NULL); - DRFLAC_ASSERT(pLastSuccessfulSeekOffset != NULL); - DRFLAC_ASSERT(targetByte >= rangeLo); - DRFLAC_ASSERT(targetByte <= rangeHi); - *pLastSuccessfulSeekOffset = pFlac->firstFLACFramePosInBytes; - for (;;) { - drflac_uint64 lastTargetByte = targetByte; - if (!drflac__seek_to_byte(&pFlac->bs, targetByte)) { - if (targetByte == 0) { - drflac__seek_to_first_frame(pFlac); - return DRFLAC_FALSE; - } - targetByte = rangeLo + ((rangeHi - rangeLo)/2); - rangeHi = targetByte; - } else { - DRFLAC_ZERO_MEMORY(&pFlac->currentFLACFrame, sizeof(pFlac->currentFLACFrame)); -#if 1 - if (!drflac__read_and_decode_next_flac_frame(pFlac)) { - targetByte = rangeLo + ((rangeHi - rangeLo)/2); - rangeHi = targetByte; - } else { - break; - } -#else - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - targetByte = rangeLo + ((rangeHi - rangeLo)/2); - rangeHi = targetByte; - } else { - break; - } -#endif - } - if(targetByte == lastTargetByte) { - return DRFLAC_FALSE; - } - } - drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &pFlac->currentPCMFrame, NULL); - DRFLAC_ASSERT(targetByte <= rangeHi); - *pLastSuccessfulSeekOffset = targetByte; - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(drflac* pFlac, drflac_uint64 offset) -{ -#if 0 - if (drflac__decode_flac_frame(pFlac) != DRFLAC_SUCCESS) { - if (drflac__read_and_decode_next_flac_frame(pFlac) == DRFLAC_FALSE) { - return DRFLAC_FALSE; - } - } -#endif - return drflac__seek_forward_by_pcm_frames(pFlac, offset) == offset; -} -static drflac_bool32 drflac__seek_to_pcm_frame__binary_search_internal(drflac* pFlac, drflac_uint64 pcmFrameIndex, drflac_uint64 byteRangeLo, drflac_uint64 byteRangeHi) -{ - drflac_uint64 targetByte; - drflac_uint64 pcmRangeLo = pFlac->totalPCMFrameCount; - drflac_uint64 pcmRangeHi = 0; - drflac_uint64 lastSuccessfulSeekOffset = (drflac_uint64)-1; - drflac_uint64 closestSeekOffsetBeforeTargetPCMFrame = byteRangeLo; - drflac_uint32 seekForwardThreshold = (pFlac->maxBlockSizeInPCMFrames != 0) ? pFlac->maxBlockSizeInPCMFrames*2 : 4096; - targetByte = byteRangeLo + (drflac_uint64)(((drflac_int64)((pcmFrameIndex - pFlac->currentPCMFrame) * pFlac->channels * pFlac->bitsPerSample)/8.0f) * DRFLAC_BINARY_SEARCH_APPROX_COMPRESSION_RATIO); - if (targetByte > byteRangeHi) { - targetByte = byteRangeHi; - } - for (;;) { - if (drflac__seek_to_approximate_flac_frame_to_byte(pFlac, targetByte, byteRangeLo, byteRangeHi, &lastSuccessfulSeekOffset)) { - drflac_uint64 newPCMRangeLo; - drflac_uint64 newPCMRangeHi; - drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &newPCMRangeLo, &newPCMRangeHi); - if (pcmRangeLo == newPCMRangeLo) { - if (!drflac__seek_to_approximate_flac_frame_to_byte(pFlac, closestSeekOffsetBeforeTargetPCMFrame, closestSeekOffsetBeforeTargetPCMFrame, byteRangeHi, &lastSuccessfulSeekOffset)) { - break; - } - if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) { - return DRFLAC_TRUE; - } else { - break; - } - } - pcmRangeLo = newPCMRangeLo; - pcmRangeHi = newPCMRangeHi; - if (pcmRangeLo <= pcmFrameIndex && pcmRangeHi >= pcmFrameIndex) { - if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame) ) { - return DRFLAC_TRUE; - } else { - break; - } - } else { - const float approxCompressionRatio = (drflac_int64)(lastSuccessfulSeekOffset - pFlac->firstFLACFramePosInBytes) / ((drflac_int64)(pcmRangeLo * pFlac->channels * pFlac->bitsPerSample)/8.0f); - if (pcmRangeLo > pcmFrameIndex) { - byteRangeHi = lastSuccessfulSeekOffset; - if (byteRangeLo > byteRangeHi) { - byteRangeLo = byteRangeHi; - } - targetByte = byteRangeLo + ((byteRangeHi - byteRangeLo) / 2); - if (targetByte < byteRangeLo) { - targetByte = byteRangeLo; - } - } else { - if ((pcmFrameIndex - pcmRangeLo) < seekForwardThreshold) { - if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) { - return DRFLAC_TRUE; - } else { - break; - } - } else { - byteRangeLo = lastSuccessfulSeekOffset; - if (byteRangeHi < byteRangeLo) { - byteRangeHi = byteRangeLo; - } - targetByte = lastSuccessfulSeekOffset + (drflac_uint64)(((drflac_int64)((pcmFrameIndex-pcmRangeLo) * pFlac->channels * pFlac->bitsPerSample)/8.0f) * approxCompressionRatio); - if (targetByte > byteRangeHi) { - targetByte = byteRangeHi; - } - if (closestSeekOffsetBeforeTargetPCMFrame < lastSuccessfulSeekOffset) { - closestSeekOffsetBeforeTargetPCMFrame = lastSuccessfulSeekOffset; - } - } - } - } - } else { - break; - } - } - drflac__seek_to_first_frame(pFlac); - return DRFLAC_FALSE; -} -static drflac_bool32 drflac__seek_to_pcm_frame__binary_search(drflac* pFlac, drflac_uint64 pcmFrameIndex) -{ - drflac_uint64 byteRangeLo; - drflac_uint64 byteRangeHi; - drflac_uint32 seekForwardThreshold = (pFlac->maxBlockSizeInPCMFrames != 0) ? pFlac->maxBlockSizeInPCMFrames*2 : 4096; - if (drflac__seek_to_first_frame(pFlac) == DRFLAC_FALSE) { - return DRFLAC_FALSE; - } - if (pcmFrameIndex < seekForwardThreshold) { - return drflac__seek_forward_by_pcm_frames(pFlac, pcmFrameIndex) == pcmFrameIndex; - } - byteRangeLo = pFlac->firstFLACFramePosInBytes; - byteRangeHi = pFlac->firstFLACFramePosInBytes + (drflac_uint64)((drflac_int64)(pFlac->totalPCMFrameCount * pFlac->channels * pFlac->bitsPerSample)/8.0f); - return drflac__seek_to_pcm_frame__binary_search_internal(pFlac, pcmFrameIndex, byteRangeLo, byteRangeHi); -} -#endif -static drflac_bool32 drflac__seek_to_pcm_frame__seek_table(drflac* pFlac, drflac_uint64 pcmFrameIndex) -{ - drflac_uint32 iClosestSeekpoint = 0; - drflac_bool32 isMidFrame = DRFLAC_FALSE; - drflac_uint64 runningPCMFrameCount; - drflac_uint32 iSeekpoint; - DRFLAC_ASSERT(pFlac != NULL); - if (pFlac->pSeekpoints == NULL || pFlac->seekpointCount == 0) { - return DRFLAC_FALSE; - } - if (pFlac->pSeekpoints[0].firstPCMFrame > pcmFrameIndex) { - return DRFLAC_FALSE; - } - for (iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) { - if (pFlac->pSeekpoints[iSeekpoint].firstPCMFrame >= pcmFrameIndex) { - break; - } - iClosestSeekpoint = iSeekpoint; - } - if (pFlac->pSeekpoints[iClosestSeekpoint].pcmFrameCount == 0 || pFlac->pSeekpoints[iClosestSeekpoint].pcmFrameCount > pFlac->maxBlockSizeInPCMFrames) { - return DRFLAC_FALSE; - } - if (pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame > pFlac->totalPCMFrameCount && pFlac->totalPCMFrameCount > 0) { - return DRFLAC_FALSE; - } -#if !defined(DR_FLAC_NO_CRC) - if (pFlac->totalPCMFrameCount > 0) { - drflac_uint64 byteRangeLo; - drflac_uint64 byteRangeHi; - byteRangeHi = pFlac->firstFLACFramePosInBytes + (drflac_uint64)((drflac_int64)(pFlac->totalPCMFrameCount * pFlac->channels * pFlac->bitsPerSample)/8.0f); - byteRangeLo = pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset; - if (iClosestSeekpoint < pFlac->seekpointCount-1) { - drflac_uint32 iNextSeekpoint = iClosestSeekpoint + 1; - if (pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset >= pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset || pFlac->pSeekpoints[iNextSeekpoint].pcmFrameCount == 0) { - return DRFLAC_FALSE; - } - if (pFlac->pSeekpoints[iNextSeekpoint].firstPCMFrame != (((drflac_uint64)0xFFFFFFFF << 32) | 0xFFFFFFFF)) { - byteRangeHi = pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset - 1; - } - } - if (drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset)) { - if (drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &pFlac->currentPCMFrame, NULL); - if (drflac__seek_to_pcm_frame__binary_search_internal(pFlac, pcmFrameIndex, byteRangeLo, byteRangeHi)) { - return DRFLAC_TRUE; - } - } - } - } -#endif - if (pcmFrameIndex >= pFlac->currentPCMFrame && pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame <= pFlac->currentPCMFrame) { - runningPCMFrameCount = pFlac->currentPCMFrame; - if (pFlac->currentPCMFrame == 0 && pFlac->currentFLACFrame.pcmFramesRemaining == 0) { - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - } else { - isMidFrame = DRFLAC_TRUE; - } - } else { - runningPCMFrameCount = pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame; - if (!drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset)) { - return DRFLAC_FALSE; - } - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - } - for (;;) { - drflac_uint64 pcmFrameCountInThisFLACFrame; - drflac_uint64 firstPCMFrameInFLACFrame = 0; - drflac_uint64 lastPCMFrameInFLACFrame = 0; - drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame); - pcmFrameCountInThisFLACFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1; - if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFLACFrame)) { - drflac_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount; - if (!isMidFrame) { - drflac_result result = drflac__decode_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - goto next_iteration; - } else { - return DRFLAC_FALSE; - } - } - } else { - return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; - } - } else { - if (!isMidFrame) { - drflac_result result = drflac__seek_to_next_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - runningPCMFrameCount += pcmFrameCountInThisFLACFrame; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - goto next_iteration; - } else { - return DRFLAC_FALSE; - } - } - } else { - runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining; - pFlac->currentFLACFrame.pcmFramesRemaining = 0; - isMidFrame = DRFLAC_FALSE; - } - if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) { - return DRFLAC_TRUE; - } - } - next_iteration: - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - } -} -#ifndef DR_FLAC_NO_OGG -typedef struct -{ - drflac_uint8 capturePattern[4]; - drflac_uint8 structureVersion; - drflac_uint8 headerType; - drflac_uint64 granulePosition; - drflac_uint32 serialNumber; - drflac_uint32 sequenceNumber; - drflac_uint32 checksum; - drflac_uint8 segmentCount; - drflac_uint8 segmentTable[255]; -} drflac_ogg_page_header; -#endif -typedef struct -{ - drflac_read_proc onRead; - drflac_seek_proc onSeek; - drflac_meta_proc onMeta; - drflac_container container; - void* pUserData; - void* pUserDataMD; - drflac_uint32 sampleRate; - drflac_uint8 channels; - drflac_uint8 bitsPerSample; - drflac_uint64 totalPCMFrameCount; - drflac_uint16 maxBlockSizeInPCMFrames; - drflac_uint64 runningFilePos; - drflac_bool32 hasStreamInfoBlock; - drflac_bool32 hasMetadataBlocks; - drflac_bs bs; - drflac_frame_header firstFrameHeader; -#ifndef DR_FLAC_NO_OGG - drflac_uint32 oggSerial; - drflac_uint64 oggFirstBytePos; - drflac_ogg_page_header oggBosHeader; -#endif -} drflac_init_info; -static DRFLAC_INLINE void drflac__decode_block_header(drflac_uint32 blockHeader, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize) -{ - blockHeader = drflac__be2host_32(blockHeader); - *isLastBlock = (drflac_uint8)((blockHeader & 0x80000000UL) >> 31); - *blockType = (drflac_uint8)((blockHeader & 0x7F000000UL) >> 24); - *blockSize = (blockHeader & 0x00FFFFFFUL); -} -static DRFLAC_INLINE drflac_bool32 drflac__read_and_decode_block_header(drflac_read_proc onRead, void* pUserData, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize) -{ - drflac_uint32 blockHeader; - *blockSize = 0; - if (onRead(pUserData, &blockHeader, 4) != 4) { - return DRFLAC_FALSE; - } - drflac__decode_block_header(blockHeader, isLastBlock, blockType, blockSize); - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__read_streaminfo(drflac_read_proc onRead, void* pUserData, drflac_streaminfo* pStreamInfo) -{ - drflac_uint32 blockSizes; - drflac_uint64 frameSizes = 0; - drflac_uint64 importantProps; - drflac_uint8 md5[16]; - if (onRead(pUserData, &blockSizes, 4) != 4) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, &frameSizes, 6) != 6) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, &importantProps, 8) != 8) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, md5, sizeof(md5)) != sizeof(md5)) { - return DRFLAC_FALSE; - } - blockSizes = drflac__be2host_32(blockSizes); - frameSizes = drflac__be2host_64(frameSizes); - importantProps = drflac__be2host_64(importantProps); - pStreamInfo->minBlockSizeInPCMFrames = (drflac_uint16)((blockSizes & 0xFFFF0000) >> 16); - pStreamInfo->maxBlockSizeInPCMFrames = (drflac_uint16) (blockSizes & 0x0000FFFF); - pStreamInfo->minFrameSizeInPCMFrames = (drflac_uint32)((frameSizes & (((drflac_uint64)0x00FFFFFF << 16) << 24)) >> 40); - pStreamInfo->maxFrameSizeInPCMFrames = (drflac_uint32)((frameSizes & (((drflac_uint64)0x00FFFFFF << 16) << 0)) >> 16); - pStreamInfo->sampleRate = (drflac_uint32)((importantProps & (((drflac_uint64)0x000FFFFF << 16) << 28)) >> 44); - pStreamInfo->channels = (drflac_uint8 )((importantProps & (((drflac_uint64)0x0000000E << 16) << 24)) >> 41) + 1; - pStreamInfo->bitsPerSample = (drflac_uint8 )((importantProps & (((drflac_uint64)0x0000001F << 16) << 20)) >> 36) + 1; - pStreamInfo->totalPCMFrameCount = ((importantProps & ((((drflac_uint64)0x0000000F << 16) << 16) | 0xFFFFFFFF))); - DRFLAC_COPY_MEMORY(pStreamInfo->md5, md5, sizeof(md5)); - return DRFLAC_TRUE; -} -static void* drflac__malloc_default(size_t sz, void* pUserData) -{ - (void)pUserData; - return DRFLAC_MALLOC(sz); -} -static void* drflac__realloc_default(void* p, size_t sz, void* pUserData) -{ - (void)pUserData; - return DRFLAC_REALLOC(p, sz); -} -static void drflac__free_default(void* p, void* pUserData) -{ - (void)pUserData; - DRFLAC_FREE(p); -} -static void* drflac__malloc_from_callbacks(size_t sz, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks == NULL) { - return NULL; - } - if (pAllocationCallbacks->onMalloc != NULL) { - return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData); - } - if (pAllocationCallbacks->onRealloc != NULL) { - return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData); - } - return NULL; -} -static void* drflac__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks == NULL) { - return NULL; - } - if (pAllocationCallbacks->onRealloc != NULL) { - return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData); - } - if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) { - void* p2; - p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData); - if (p2 == NULL) { - return NULL; - } - if (p != NULL) { - DRFLAC_COPY_MEMORY(p2, p, szOld); - pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); - } - return p2; - } - return NULL; -} -static void drflac__free_from_callbacks(void* p, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - if (p == NULL || pAllocationCallbacks == NULL) { - return; - } - if (pAllocationCallbacks->onFree != NULL) { - pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); - } -} -static drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_uint64* pFirstFramePos, drflac_uint64* pSeektablePos, drflac_uint32* pSeektableSize, drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac_uint64 runningFilePos = 42; - drflac_uint64 seektablePos = 0; - drflac_uint32 seektableSize = 0; - for (;;) { - drflac_metadata metadata; - drflac_uint8 isLastBlock = 0; - drflac_uint8 blockType; - drflac_uint32 blockSize; - if (drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize) == DRFLAC_FALSE) { - return DRFLAC_FALSE; - } - runningFilePos += 4; - metadata.type = blockType; - metadata.pRawData = NULL; - metadata.rawDataSize = 0; - switch (blockType) - { - case DRFLAC_METADATA_BLOCK_TYPE_APPLICATION: - { - if (blockSize < 4) { - return DRFLAC_FALSE; - } - if (onMeta) { - void* pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - metadata.data.application.id = drflac__be2host_32(*(drflac_uint32*)pRawData); - metadata.data.application.pData = (const void*)((drflac_uint8*)pRawData + sizeof(drflac_uint32)); - metadata.data.application.dataSize = blockSize - sizeof(drflac_uint32); - onMeta(pUserDataMD, &metadata); - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - } - } break; - case DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE: - { - seektablePos = runningFilePos; - seektableSize = blockSize; - if (onMeta) { - drflac_uint32 iSeekpoint; - void* pRawData; - pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - metadata.data.seektable.seekpointCount = blockSize/sizeof(drflac_seekpoint); - metadata.data.seektable.pSeekpoints = (const drflac_seekpoint*)pRawData; - for (iSeekpoint = 0; iSeekpoint < metadata.data.seektable.seekpointCount; ++iSeekpoint) { - drflac_seekpoint* pSeekpoint = (drflac_seekpoint*)pRawData + iSeekpoint; - pSeekpoint->firstPCMFrame = drflac__be2host_64(pSeekpoint->firstPCMFrame); - pSeekpoint->flacFrameOffset = drflac__be2host_64(pSeekpoint->flacFrameOffset); - pSeekpoint->pcmFrameCount = drflac__be2host_16(pSeekpoint->pcmFrameCount); - } - onMeta(pUserDataMD, &metadata); - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - } - } break; - case DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT: - { - if (blockSize < 8) { - return DRFLAC_FALSE; - } - if (onMeta) { - void* pRawData; - const char* pRunningData; - const char* pRunningDataEnd; - drflac_uint32 i; - pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - pRunningData = (const char*)pRawData; - pRunningDataEnd = (const char*)pRawData + blockSize; - metadata.data.vorbis_comment.vendorLength = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - if ((pRunningDataEnd - pRunningData) - 4 < (drflac_int64)metadata.data.vorbis_comment.vendorLength) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.data.vorbis_comment.vendor = pRunningData; pRunningData += metadata.data.vorbis_comment.vendorLength; - metadata.data.vorbis_comment.commentCount = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - if ((pRunningDataEnd - pRunningData) / sizeof(drflac_uint32) < metadata.data.vorbis_comment.commentCount) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.data.vorbis_comment.pComments = pRunningData; - for (i = 0; i < metadata.data.vorbis_comment.commentCount; ++i) { - drflac_uint32 commentLength; - if (pRunningDataEnd - pRunningData < 4) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - commentLength = drflac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - if (pRunningDataEnd - pRunningData < (drflac_int64)commentLength) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - pRunningData += commentLength; - } - onMeta(pUserDataMD, &metadata); - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - } - } break; - case DRFLAC_METADATA_BLOCK_TYPE_CUESHEET: - { - if (blockSize < 396) { - return DRFLAC_FALSE; - } - if (onMeta) { - void* pRawData; - const char* pRunningData; - const char* pRunningDataEnd; - drflac_uint8 iTrack; - drflac_uint8 iIndex; - pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - pRunningData = (const char*)pRawData; - pRunningDataEnd = (const char*)pRawData + blockSize; - DRFLAC_COPY_MEMORY(metadata.data.cuesheet.catalog, pRunningData, 128); pRunningData += 128; - metadata.data.cuesheet.leadInSampleCount = drflac__be2host_64(*(const drflac_uint64*)pRunningData); pRunningData += 8; - metadata.data.cuesheet.isCD = (pRunningData[0] & 0x80) != 0; pRunningData += 259; - metadata.data.cuesheet.trackCount = pRunningData[0]; pRunningData += 1; - metadata.data.cuesheet.pTrackData = pRunningData; - for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) { - drflac_uint8 indexCount; - drflac_uint32 indexPointSize; - if (pRunningDataEnd - pRunningData < 36) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - pRunningData += 35; - indexCount = pRunningData[0]; pRunningData += 1; - indexPointSize = indexCount * sizeof(drflac_cuesheet_track_index); - if (pRunningDataEnd - pRunningData < (drflac_int64)indexPointSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - for (iIndex = 0; iIndex < indexCount; ++iIndex) { - drflac_cuesheet_track_index* pTrack = (drflac_cuesheet_track_index*)pRunningData; - pRunningData += sizeof(drflac_cuesheet_track_index); - pTrack->offset = drflac__be2host_64(pTrack->offset); - } - } - onMeta(pUserDataMD, &metadata); - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - } - } break; - case DRFLAC_METADATA_BLOCK_TYPE_PICTURE: - { - if (blockSize < 32) { - return DRFLAC_FALSE; - } - if (onMeta) { - void* pRawData; - const char* pRunningData; - const char* pRunningDataEnd; - pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - pRunningData = (const char*)pRawData; - pRunningDataEnd = (const char*)pRawData + blockSize; - metadata.data.picture.type = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.mimeLength = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - if ((pRunningDataEnd - pRunningData) - 24 < (drflac_int64)metadata.data.picture.mimeLength) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.data.picture.mime = pRunningData; pRunningData += metadata.data.picture.mimeLength; - metadata.data.picture.descriptionLength = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - if ((pRunningDataEnd - pRunningData) - 20 < (drflac_int64)metadata.data.picture.descriptionLength) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.data.picture.description = pRunningData; pRunningData += metadata.data.picture.descriptionLength; - metadata.data.picture.width = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.height = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.colorDepth = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.indexColorCount = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.pictureDataSize = drflac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4; - metadata.data.picture.pPictureData = (const drflac_uint8*)pRunningData; - if (pRunningDataEnd - pRunningData < (drflac_int64)metadata.data.picture.pictureDataSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - onMeta(pUserDataMD, &metadata); - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - } - } break; - case DRFLAC_METADATA_BLOCK_TYPE_PADDING: - { - if (onMeta) { - metadata.data.padding.unused = 0; - if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) { - isLastBlock = DRFLAC_TRUE; - } else { - onMeta(pUserDataMD, &metadata); - } - } - } break; - case DRFLAC_METADATA_BLOCK_TYPE_INVALID: - { - if (onMeta) { - if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) { - isLastBlock = DRFLAC_TRUE; - } - } - } break; - default: - { - if (onMeta) { - void* pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); - if (pRawData == NULL) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, pRawData, blockSize) != blockSize) { - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - return DRFLAC_FALSE; - } - metadata.pRawData = pRawData; - metadata.rawDataSize = blockSize; - onMeta(pUserDataMD, &metadata); - drflac__free_from_callbacks(pRawData, pAllocationCallbacks); - } - } break; - } - if (onMeta == NULL && blockSize > 0) { - if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) { - isLastBlock = DRFLAC_TRUE; - } - } - runningFilePos += blockSize; - if (isLastBlock) { - break; - } - } - *pSeektablePos = seektablePos; - *pSeektableSize = seektableSize; - *pFirstFramePos = runningFilePos; - return DRFLAC_TRUE; -} -static drflac_bool32 drflac__init_private__native(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_bool32 relaxed) -{ - drflac_uint8 isLastBlock; - drflac_uint8 blockType; - drflac_uint32 blockSize; - (void)onSeek; - pInit->container = drflac_container_native; - if (!drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) { - return DRFLAC_FALSE; - } - if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) { - if (!relaxed) { - return DRFLAC_FALSE; - } else { - pInit->hasStreamInfoBlock = DRFLAC_FALSE; - pInit->hasMetadataBlocks = DRFLAC_FALSE; - if (!drflac__read_next_flac_frame_header(&pInit->bs, 0, &pInit->firstFrameHeader)) { - return DRFLAC_FALSE; - } - if (pInit->firstFrameHeader.bitsPerSample == 0) { - return DRFLAC_FALSE; - } - pInit->sampleRate = pInit->firstFrameHeader.sampleRate; - pInit->channels = drflac__get_channel_count_from_channel_assignment(pInit->firstFrameHeader.channelAssignment); - pInit->bitsPerSample = pInit->firstFrameHeader.bitsPerSample; - pInit->maxBlockSizeInPCMFrames = 65535; - return DRFLAC_TRUE; - } - } else { - drflac_streaminfo streaminfo; - if (!drflac__read_streaminfo(onRead, pUserData, &streaminfo)) { - return DRFLAC_FALSE; - } - pInit->hasStreamInfoBlock = DRFLAC_TRUE; - pInit->sampleRate = streaminfo.sampleRate; - pInit->channels = streaminfo.channels; - pInit->bitsPerSample = streaminfo.bitsPerSample; - pInit->totalPCMFrameCount = streaminfo.totalPCMFrameCount; - pInit->maxBlockSizeInPCMFrames = streaminfo.maxBlockSizeInPCMFrames; - pInit->hasMetadataBlocks = !isLastBlock; - if (onMeta) { - drflac_metadata metadata; - metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO; - metadata.pRawData = NULL; - metadata.rawDataSize = 0; - metadata.data.streaminfo = streaminfo; - onMeta(pUserDataMD, &metadata); - } - return DRFLAC_TRUE; - } -} -#ifndef DR_FLAC_NO_OGG -#define DRFLAC_OGG_MAX_PAGE_SIZE 65307 -#define DRFLAC_OGG_CAPTURE_PATTERN_CRC32 1605413199 -typedef enum -{ - drflac_ogg_recover_on_crc_mismatch, - drflac_ogg_fail_on_crc_mismatch -} drflac_ogg_crc_mismatch_recovery; -#ifndef DR_FLAC_NO_CRC -static drflac_uint32 drflac__crc32_table[] = { - 0x00000000L, 0x04C11DB7L, 0x09823B6EL, 0x0D4326D9L, - 0x130476DCL, 0x17C56B6BL, 0x1A864DB2L, 0x1E475005L, - 0x2608EDB8L, 0x22C9F00FL, 0x2F8AD6D6L, 0x2B4BCB61L, - 0x350C9B64L, 0x31CD86D3L, 0x3C8EA00AL, 0x384FBDBDL, - 0x4C11DB70L, 0x48D0C6C7L, 0x4593E01EL, 0x4152FDA9L, - 0x5F15ADACL, 0x5BD4B01BL, 0x569796C2L, 0x52568B75L, - 0x6A1936C8L, 0x6ED82B7FL, 0x639B0DA6L, 0x675A1011L, - 0x791D4014L, 0x7DDC5DA3L, 0x709F7B7AL, 0x745E66CDL, - 0x9823B6E0L, 0x9CE2AB57L, 0x91A18D8EL, 0x95609039L, - 0x8B27C03CL, 0x8FE6DD8BL, 0x82A5FB52L, 0x8664E6E5L, - 0xBE2B5B58L, 0xBAEA46EFL, 0xB7A96036L, 0xB3687D81L, - 0xAD2F2D84L, 0xA9EE3033L, 0xA4AD16EAL, 0xA06C0B5DL, - 0xD4326D90L, 0xD0F37027L, 0xDDB056FEL, 0xD9714B49L, - 0xC7361B4CL, 0xC3F706FBL, 0xCEB42022L, 0xCA753D95L, - 0xF23A8028L, 0xF6FB9D9FL, 0xFBB8BB46L, 0xFF79A6F1L, - 0xE13EF6F4L, 0xE5FFEB43L, 0xE8BCCD9AL, 0xEC7DD02DL, - 0x34867077L, 0x30476DC0L, 0x3D044B19L, 0x39C556AEL, - 0x278206ABL, 0x23431B1CL, 0x2E003DC5L, 0x2AC12072L, - 0x128E9DCFL, 0x164F8078L, 0x1B0CA6A1L, 0x1FCDBB16L, - 0x018AEB13L, 0x054BF6A4L, 0x0808D07DL, 0x0CC9CDCAL, - 0x7897AB07L, 0x7C56B6B0L, 0x71159069L, 0x75D48DDEL, - 0x6B93DDDBL, 0x6F52C06CL, 0x6211E6B5L, 0x66D0FB02L, - 0x5E9F46BFL, 0x5A5E5B08L, 0x571D7DD1L, 0x53DC6066L, - 0x4D9B3063L, 0x495A2DD4L, 0x44190B0DL, 0x40D816BAL, - 0xACA5C697L, 0xA864DB20L, 0xA527FDF9L, 0xA1E6E04EL, - 0xBFA1B04BL, 0xBB60ADFCL, 0xB6238B25L, 0xB2E29692L, - 0x8AAD2B2FL, 0x8E6C3698L, 0x832F1041L, 0x87EE0DF6L, - 0x99A95DF3L, 0x9D684044L, 0x902B669DL, 0x94EA7B2AL, - 0xE0B41DE7L, 0xE4750050L, 0xE9362689L, 0xEDF73B3EL, - 0xF3B06B3BL, 0xF771768CL, 0xFA325055L, 0xFEF34DE2L, - 0xC6BCF05FL, 0xC27DEDE8L, 0xCF3ECB31L, 0xCBFFD686L, - 0xD5B88683L, 0xD1799B34L, 0xDC3ABDEDL, 0xD8FBA05AL, - 0x690CE0EEL, 0x6DCDFD59L, 0x608EDB80L, 0x644FC637L, - 0x7A089632L, 0x7EC98B85L, 0x738AAD5CL, 0x774BB0EBL, - 0x4F040D56L, 0x4BC510E1L, 0x46863638L, 0x42472B8FL, - 0x5C007B8AL, 0x58C1663DL, 0x558240E4L, 0x51435D53L, - 0x251D3B9EL, 0x21DC2629L, 0x2C9F00F0L, 0x285E1D47L, - 0x36194D42L, 0x32D850F5L, 0x3F9B762CL, 0x3B5A6B9BL, - 0x0315D626L, 0x07D4CB91L, 0x0A97ED48L, 0x0E56F0FFL, - 0x1011A0FAL, 0x14D0BD4DL, 0x19939B94L, 0x1D528623L, - 0xF12F560EL, 0xF5EE4BB9L, 0xF8AD6D60L, 0xFC6C70D7L, - 0xE22B20D2L, 0xE6EA3D65L, 0xEBA91BBCL, 0xEF68060BL, - 0xD727BBB6L, 0xD3E6A601L, 0xDEA580D8L, 0xDA649D6FL, - 0xC423CD6AL, 0xC0E2D0DDL, 0xCDA1F604L, 0xC960EBB3L, - 0xBD3E8D7EL, 0xB9FF90C9L, 0xB4BCB610L, 0xB07DABA7L, - 0xAE3AFBA2L, 0xAAFBE615L, 0xA7B8C0CCL, 0xA379DD7BL, - 0x9B3660C6L, 0x9FF77D71L, 0x92B45BA8L, 0x9675461FL, - 0x8832161AL, 0x8CF30BADL, 0x81B02D74L, 0x857130C3L, - 0x5D8A9099L, 0x594B8D2EL, 0x5408ABF7L, 0x50C9B640L, - 0x4E8EE645L, 0x4A4FFBF2L, 0x470CDD2BL, 0x43CDC09CL, - 0x7B827D21L, 0x7F436096L, 0x7200464FL, 0x76C15BF8L, - 0x68860BFDL, 0x6C47164AL, 0x61043093L, 0x65C52D24L, - 0x119B4BE9L, 0x155A565EL, 0x18197087L, 0x1CD86D30L, - 0x029F3D35L, 0x065E2082L, 0x0B1D065BL, 0x0FDC1BECL, - 0x3793A651L, 0x3352BBE6L, 0x3E119D3FL, 0x3AD08088L, - 0x2497D08DL, 0x2056CD3AL, 0x2D15EBE3L, 0x29D4F654L, - 0xC5A92679L, 0xC1683BCEL, 0xCC2B1D17L, 0xC8EA00A0L, - 0xD6AD50A5L, 0xD26C4D12L, 0xDF2F6BCBL, 0xDBEE767CL, - 0xE3A1CBC1L, 0xE760D676L, 0xEA23F0AFL, 0xEEE2ED18L, - 0xF0A5BD1DL, 0xF464A0AAL, 0xF9278673L, 0xFDE69BC4L, - 0x89B8FD09L, 0x8D79E0BEL, 0x803AC667L, 0x84FBDBD0L, - 0x9ABC8BD5L, 0x9E7D9662L, 0x933EB0BBL, 0x97FFAD0CL, - 0xAFB010B1L, 0xAB710D06L, 0xA6322BDFL, 0xA2F33668L, - 0xBCB4666DL, 0xB8757BDAL, 0xB5365D03L, 0xB1F740B4L -}; -#endif -static DRFLAC_INLINE drflac_uint32 drflac_crc32_byte(drflac_uint32 crc32, drflac_uint8 data) -{ -#ifndef DR_FLAC_NO_CRC - return (crc32 << 8) ^ drflac__crc32_table[(drflac_uint8)((crc32 >> 24) & 0xFF) ^ data]; -#else - (void)data; - return crc32; -#endif -} -#if 0 -static DRFLAC_INLINE drflac_uint32 drflac_crc32_uint32(drflac_uint32 crc32, drflac_uint32 data) -{ - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 24) & 0xFF)); - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 16) & 0xFF)); - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 8) & 0xFF)); - crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 0) & 0xFF)); - return crc32; -} -static DRFLAC_INLINE drflac_uint32 drflac_crc32_uint64(drflac_uint32 crc32, drflac_uint64 data) -{ - crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >> 32) & 0xFFFFFFFF)); - crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >> 0) & 0xFFFFFFFF)); - return crc32; -} -#endif -static DRFLAC_INLINE drflac_uint32 drflac_crc32_buffer(drflac_uint32 crc32, drflac_uint8* pData, drflac_uint32 dataSize) -{ - drflac_uint32 i; - for (i = 0; i < dataSize; ++i) { - crc32 = drflac_crc32_byte(crc32, pData[i]); - } - return crc32; -} -static DRFLAC_INLINE drflac_bool32 drflac_ogg__is_capture_pattern(drflac_uint8 pattern[4]) -{ - return pattern[0] == 'O' && pattern[1] == 'g' && pattern[2] == 'g' && pattern[3] == 'S'; -} -static DRFLAC_INLINE drflac_uint32 drflac_ogg__get_page_header_size(drflac_ogg_page_header* pHeader) -{ - return 27 + pHeader->segmentCount; -} -static DRFLAC_INLINE drflac_uint32 drflac_ogg__get_page_body_size(drflac_ogg_page_header* pHeader) -{ - drflac_uint32 pageBodySize = 0; - int i; - for (i = 0; i < pHeader->segmentCount; ++i) { - pageBodySize += pHeader->segmentTable[i]; - } - return pageBodySize; -} -static drflac_result drflac_ogg__read_page_header_after_capture_pattern(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, drflac_uint32* pBytesRead, drflac_uint32* pCRC32) -{ - drflac_uint8 data[23]; - drflac_uint32 i; - DRFLAC_ASSERT(*pCRC32 == DRFLAC_OGG_CAPTURE_PATTERN_CRC32); - if (onRead(pUserData, data, 23) != 23) { - return DRFLAC_AT_END; - } - *pBytesRead += 23; - pHeader->capturePattern[0] = 'O'; - pHeader->capturePattern[1] = 'g'; - pHeader->capturePattern[2] = 'g'; - pHeader->capturePattern[3] = 'S'; - pHeader->structureVersion = data[0]; - pHeader->headerType = data[1]; - DRFLAC_COPY_MEMORY(&pHeader->granulePosition, &data[ 2], 8); - DRFLAC_COPY_MEMORY(&pHeader->serialNumber, &data[10], 4); - DRFLAC_COPY_MEMORY(&pHeader->sequenceNumber, &data[14], 4); - DRFLAC_COPY_MEMORY(&pHeader->checksum, &data[18], 4); - pHeader->segmentCount = data[22]; - data[18] = 0; - data[19] = 0; - data[20] = 0; - data[21] = 0; - for (i = 0; i < 23; ++i) { - *pCRC32 = drflac_crc32_byte(*pCRC32, data[i]); - } - if (onRead(pUserData, pHeader->segmentTable, pHeader->segmentCount) != pHeader->segmentCount) { - return DRFLAC_AT_END; - } - *pBytesRead += pHeader->segmentCount; - for (i = 0; i < pHeader->segmentCount; ++i) { - *pCRC32 = drflac_crc32_byte(*pCRC32, pHeader->segmentTable[i]); - } - return DRFLAC_SUCCESS; -} -static drflac_result drflac_ogg__read_page_header(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, drflac_uint32* pBytesRead, drflac_uint32* pCRC32) -{ - drflac_uint8 id[4]; - *pBytesRead = 0; - if (onRead(pUserData, id, 4) != 4) { - return DRFLAC_AT_END; - } - *pBytesRead += 4; - for (;;) { - if (drflac_ogg__is_capture_pattern(id)) { - drflac_result result; - *pCRC32 = DRFLAC_OGG_CAPTURE_PATTERN_CRC32; - result = drflac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, pHeader, pBytesRead, pCRC32); - if (result == DRFLAC_SUCCESS) { - return DRFLAC_SUCCESS; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - continue; - } else { - return result; - } - } - } else { - id[0] = id[1]; - id[1] = id[2]; - id[2] = id[3]; - if (onRead(pUserData, &id[3], 1) != 1) { - return DRFLAC_AT_END; - } - *pBytesRead += 1; - } - } -} -typedef struct -{ - drflac_read_proc onRead; - drflac_seek_proc onSeek; - void* pUserData; - drflac_uint64 currentBytePos; - drflac_uint64 firstBytePos; - drflac_uint32 serialNumber; - drflac_ogg_page_header bosPageHeader; - drflac_ogg_page_header currentPageHeader; - drflac_uint32 bytesRemainingInPage; - drflac_uint32 pageDataSize; - drflac_uint8 pageData[DRFLAC_OGG_MAX_PAGE_SIZE]; -} drflac_oggbs; -static size_t drflac_oggbs__read_physical(drflac_oggbs* oggbs, void* bufferOut, size_t bytesToRead) -{ - size_t bytesActuallyRead = oggbs->onRead(oggbs->pUserData, bufferOut, bytesToRead); - oggbs->currentBytePos += bytesActuallyRead; - return bytesActuallyRead; -} -static drflac_bool32 drflac_oggbs__seek_physical(drflac_oggbs* oggbs, drflac_uint64 offset, drflac_seek_origin origin) -{ - if (origin == drflac_seek_origin_start) { - if (offset <= 0x7FFFFFFF) { - if (!oggbs->onSeek(oggbs->pUserData, (int)offset, drflac_seek_origin_start)) { - return DRFLAC_FALSE; - } - oggbs->currentBytePos = offset; - return DRFLAC_TRUE; - } else { - if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, drflac_seek_origin_start)) { - return DRFLAC_FALSE; - } - oggbs->currentBytePos = offset; - return drflac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, drflac_seek_origin_current); - } - } else { - while (offset > 0x7FFFFFFF) { - if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - oggbs->currentBytePos += 0x7FFFFFFF; - offset -= 0x7FFFFFFF; - } - if (!oggbs->onSeek(oggbs->pUserData, (int)offset, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - oggbs->currentBytePos += offset; - return DRFLAC_TRUE; - } -} -static drflac_bool32 drflac_oggbs__goto_next_page(drflac_oggbs* oggbs, drflac_ogg_crc_mismatch_recovery recoveryMethod) -{ - drflac_ogg_page_header header; - for (;;) { - drflac_uint32 crc32 = 0; - drflac_uint32 bytesRead; - drflac_uint32 pageBodySize; -#ifndef DR_FLAC_NO_CRC - drflac_uint32 actualCRC32; -#endif - if (drflac_ogg__read_page_header(oggbs->onRead, oggbs->pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) { - return DRFLAC_FALSE; - } - oggbs->currentBytePos += bytesRead; - pageBodySize = drflac_ogg__get_page_body_size(&header); - if (pageBodySize > DRFLAC_OGG_MAX_PAGE_SIZE) { - continue; - } - if (header.serialNumber != oggbs->serialNumber) { - if (pageBodySize > 0 && !drflac_oggbs__seek_physical(oggbs, pageBodySize, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - continue; - } - if (drflac_oggbs__read_physical(oggbs, oggbs->pageData, pageBodySize) != pageBodySize) { - return DRFLAC_FALSE; - } - oggbs->pageDataSize = pageBodySize; -#ifndef DR_FLAC_NO_CRC - actualCRC32 = drflac_crc32_buffer(crc32, oggbs->pageData, oggbs->pageDataSize); - if (actualCRC32 != header.checksum) { - if (recoveryMethod == drflac_ogg_recover_on_crc_mismatch) { - continue; - } else { - drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch); - return DRFLAC_FALSE; - } - } -#else - (void)recoveryMethod; -#endif - oggbs->currentPageHeader = header; - oggbs->bytesRemainingInPage = pageBodySize; - return DRFLAC_TRUE; - } -} -#if 0 -static drflac_uint8 drflac_oggbs__get_current_segment_index(drflac_oggbs* oggbs, drflac_uint8* pBytesRemainingInSeg) -{ - drflac_uint32 bytesConsumedInPage = drflac_ogg__get_page_body_size(&oggbs->currentPageHeader) - oggbs->bytesRemainingInPage; - drflac_uint8 iSeg = 0; - drflac_uint32 iByte = 0; - while (iByte < bytesConsumedInPage) { - drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg]; - if (iByte + segmentSize > bytesConsumedInPage) { - break; - } else { - iSeg += 1; - iByte += segmentSize; - } - } - *pBytesRemainingInSeg = oggbs->currentPageHeader.segmentTable[iSeg] - (drflac_uint8)(bytesConsumedInPage - iByte); - return iSeg; -} -static drflac_bool32 drflac_oggbs__seek_to_next_packet(drflac_oggbs* oggbs) -{ - for (;;) { - drflac_bool32 atEndOfPage = DRFLAC_FALSE; - drflac_uint8 bytesRemainingInSeg; - drflac_uint8 iFirstSeg = drflac_oggbs__get_current_segment_index(oggbs, &bytesRemainingInSeg); - drflac_uint32 bytesToEndOfPacketOrPage = bytesRemainingInSeg; - for (drflac_uint8 iSeg = iFirstSeg; iSeg < oggbs->currentPageHeader.segmentCount; ++iSeg) { - drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg]; - if (segmentSize < 255) { - if (iSeg == oggbs->currentPageHeader.segmentCount-1) { - atEndOfPage = DRFLAC_TRUE; - } - break; - } - bytesToEndOfPacketOrPage += segmentSize; - } - drflac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, drflac_seek_origin_current); - oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage; - if (atEndOfPage) { - if (!drflac_oggbs__goto_next_page(oggbs)) { - return DRFLAC_FALSE; - } - if ((oggbs->currentPageHeader.headerType & 0x01) == 0) { - return DRFLAC_TRUE; - } - } else { - return DRFLAC_TRUE; - } - } -} -static drflac_bool32 drflac_oggbs__seek_to_next_frame(drflac_oggbs* oggbs) -{ - return drflac_oggbs__seek_to_next_packet(oggbs); -} -#endif -static size_t drflac__on_read_ogg(void* pUserData, void* bufferOut, size_t bytesToRead) -{ - drflac_oggbs* oggbs = (drflac_oggbs*)pUserData; - drflac_uint8* pRunningBufferOut = (drflac_uint8*)bufferOut; - size_t bytesRead = 0; - DRFLAC_ASSERT(oggbs != NULL); - DRFLAC_ASSERT(pRunningBufferOut != NULL); - while (bytesRead < bytesToRead) { - size_t bytesRemainingToRead = bytesToRead - bytesRead; - if (oggbs->bytesRemainingInPage >= bytesRemainingToRead) { - DRFLAC_COPY_MEMORY(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), bytesRemainingToRead); - bytesRead += bytesRemainingToRead; - oggbs->bytesRemainingInPage -= (drflac_uint32)bytesRemainingToRead; - break; - } - if (oggbs->bytesRemainingInPage > 0) { - DRFLAC_COPY_MEMORY(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), oggbs->bytesRemainingInPage); - bytesRead += oggbs->bytesRemainingInPage; - pRunningBufferOut += oggbs->bytesRemainingInPage; - oggbs->bytesRemainingInPage = 0; - } - DRFLAC_ASSERT(bytesRemainingToRead > 0); - if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) { - break; - } - } - return bytesRead; -} -static drflac_bool32 drflac__on_seek_ogg(void* pUserData, int offset, drflac_seek_origin origin) -{ - drflac_oggbs* oggbs = (drflac_oggbs*)pUserData; - int bytesSeeked = 0; - DRFLAC_ASSERT(oggbs != NULL); - DRFLAC_ASSERT(offset >= 0); - if (origin == drflac_seek_origin_start) { - if (!drflac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, drflac_seek_origin_start)) { - return DRFLAC_FALSE; - } - if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_fail_on_crc_mismatch)) { - return DRFLAC_FALSE; - } - return drflac__on_seek_ogg(pUserData, offset, drflac_seek_origin_current); - } - DRFLAC_ASSERT(origin == drflac_seek_origin_current); - while (bytesSeeked < offset) { - int bytesRemainingToSeek = offset - bytesSeeked; - DRFLAC_ASSERT(bytesRemainingToSeek >= 0); - if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) { - bytesSeeked += bytesRemainingToSeek; - (void)bytesSeeked; - oggbs->bytesRemainingInPage -= bytesRemainingToSeek; - break; - } - if (oggbs->bytesRemainingInPage > 0) { - bytesSeeked += (int)oggbs->bytesRemainingInPage; - oggbs->bytesRemainingInPage = 0; - } - DRFLAC_ASSERT(bytesRemainingToSeek > 0); - if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_fail_on_crc_mismatch)) { - return DRFLAC_FALSE; - } - } - return DRFLAC_TRUE; -} -static drflac_bool32 drflac_ogg__seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex) -{ - drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; - drflac_uint64 originalBytePos; - drflac_uint64 runningGranulePosition; - drflac_uint64 runningFrameBytePos; - drflac_uint64 runningPCMFrameCount; - DRFLAC_ASSERT(oggbs != NULL); - originalBytePos = oggbs->currentBytePos; - if (!drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes)) { - return DRFLAC_FALSE; - } - oggbs->bytesRemainingInPage = 0; - runningGranulePosition = 0; - for (;;) { - if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) { - drflac_oggbs__seek_physical(oggbs, originalBytePos, drflac_seek_origin_start); - return DRFLAC_FALSE; - } - runningFrameBytePos = oggbs->currentBytePos - drflac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize; - if (oggbs->currentPageHeader.granulePosition >= pcmFrameIndex) { - break; - } - if ((oggbs->currentPageHeader.headerType & 0x01) == 0) { - if (oggbs->currentPageHeader.segmentTable[0] >= 2) { - drflac_uint8 firstBytesInPage[2]; - firstBytesInPage[0] = oggbs->pageData[0]; - firstBytesInPage[1] = oggbs->pageData[1]; - if ((firstBytesInPage[0] == 0xFF) && (firstBytesInPage[1] & 0xFC) == 0xF8) { - runningGranulePosition = oggbs->currentPageHeader.granulePosition; - } - continue; - } - } - } - if (!drflac_oggbs__seek_physical(oggbs, runningFrameBytePos, drflac_seek_origin_start)) { - return DRFLAC_FALSE; - } - if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) { - return DRFLAC_FALSE; - } - runningPCMFrameCount = runningGranulePosition; - for (;;) { - drflac_uint64 firstPCMFrameInFLACFrame = 0; - drflac_uint64 lastPCMFrameInFLACFrame = 0; - drflac_uint64 pcmFrameCountInThisFrame; - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - return DRFLAC_FALSE; - } - drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame); - pcmFrameCountInThisFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1; - if (pcmFrameIndex == pFlac->totalPCMFrameCount && (runningPCMFrameCount + pcmFrameCountInThisFrame) == pFlac->totalPCMFrameCount) { - drflac_result result = drflac__decode_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - pFlac->currentPCMFrame = pcmFrameIndex; - pFlac->currentFLACFrame.pcmFramesRemaining = 0; - return DRFLAC_TRUE; - } else { - return DRFLAC_FALSE; - } - } - if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFrame)) { - drflac_result result = drflac__decode_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - drflac_uint64 pcmFramesToDecode = (size_t)(pcmFrameIndex - runningPCMFrameCount); - if (pcmFramesToDecode == 0) { - return DRFLAC_TRUE; - } - pFlac->currentPCMFrame = runningPCMFrameCount; - return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - continue; - } else { - return DRFLAC_FALSE; - } - } - } else { - drflac_result result = drflac__seek_to_next_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - runningPCMFrameCount += pcmFrameCountInThisFrame; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - continue; - } else { - return DRFLAC_FALSE; - } - } - } - } -} -static drflac_bool32 drflac__init_private__ogg(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_bool32 relaxed) -{ - drflac_ogg_page_header header; - drflac_uint32 crc32 = DRFLAC_OGG_CAPTURE_PATTERN_CRC32; - drflac_uint32 bytesRead = 0; - (void)relaxed; - pInit->container = drflac_container_ogg; - pInit->oggFirstBytePos = 0; - if (drflac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) { - return DRFLAC_FALSE; - } - pInit->runningFilePos += bytesRead; - for (;;) { - int pageBodySize; - if ((header.headerType & 0x02) == 0) { - return DRFLAC_FALSE; - } - pageBodySize = drflac_ogg__get_page_body_size(&header); - if (pageBodySize == 51) { - drflac_uint32 bytesRemainingInPage = pageBodySize; - drflac_uint8 packetType; - if (onRead(pUserData, &packetType, 1) != 1) { - return DRFLAC_FALSE; - } - bytesRemainingInPage -= 1; - if (packetType == 0x7F) { - drflac_uint8 sig[4]; - if (onRead(pUserData, sig, 4) != 4) { - return DRFLAC_FALSE; - } - bytesRemainingInPage -= 4; - if (sig[0] == 'F' && sig[1] == 'L' && sig[2] == 'A' && sig[3] == 'C') { - drflac_uint8 mappingVersion[2]; - if (onRead(pUserData, mappingVersion, 2) != 2) { - return DRFLAC_FALSE; - } - if (mappingVersion[0] != 1) { - return DRFLAC_FALSE; - } - if (!onSeek(pUserData, 2, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - if (onRead(pUserData, sig, 4) != 4) { - return DRFLAC_FALSE; - } - if (sig[0] == 'f' && sig[1] == 'L' && sig[2] == 'a' && sig[3] == 'C') { - drflac_streaminfo streaminfo; - drflac_uint8 isLastBlock; - drflac_uint8 blockType; - drflac_uint32 blockSize; - if (!drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) { - return DRFLAC_FALSE; - } - if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) { - return DRFLAC_FALSE; - } - if (drflac__read_streaminfo(onRead, pUserData, &streaminfo)) { - pInit->hasStreamInfoBlock = DRFLAC_TRUE; - pInit->sampleRate = streaminfo.sampleRate; - pInit->channels = streaminfo.channels; - pInit->bitsPerSample = streaminfo.bitsPerSample; - pInit->totalPCMFrameCount = streaminfo.totalPCMFrameCount; - pInit->maxBlockSizeInPCMFrames = streaminfo.maxBlockSizeInPCMFrames; - pInit->hasMetadataBlocks = !isLastBlock; - if (onMeta) { - drflac_metadata metadata; - metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO; - metadata.pRawData = NULL; - metadata.rawDataSize = 0; - metadata.data.streaminfo = streaminfo; - onMeta(pUserDataMD, &metadata); - } - pInit->runningFilePos += pageBodySize; - pInit->oggFirstBytePos = pInit->runningFilePos - 79; - pInit->oggSerial = header.serialNumber; - pInit->oggBosHeader = header; - break; - } else { - return DRFLAC_FALSE; - } - } else { - return DRFLAC_FALSE; - } - } else { - if (!onSeek(pUserData, bytesRemainingInPage, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - } - } else { - if (!onSeek(pUserData, bytesRemainingInPage, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - } - } else { - if (!onSeek(pUserData, pageBodySize, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - } - pInit->runningFilePos += pageBodySize; - if (drflac_ogg__read_page_header(onRead, pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) { - return DRFLAC_FALSE; - } - pInit->runningFilePos += bytesRead; - } - pInit->hasMetadataBlocks = DRFLAC_TRUE; - return DRFLAC_TRUE; -} -#endif -static drflac_bool32 drflac__init_private(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, void* pUserDataMD) -{ - drflac_bool32 relaxed; - drflac_uint8 id[4]; - if (pInit == NULL || onRead == NULL || onSeek == NULL) { - return DRFLAC_FALSE; - } - DRFLAC_ZERO_MEMORY(pInit, sizeof(*pInit)); - pInit->onRead = onRead; - pInit->onSeek = onSeek; - pInit->onMeta = onMeta; - pInit->container = container; - pInit->pUserData = pUserData; - pInit->pUserDataMD = pUserDataMD; - pInit->bs.onRead = onRead; - pInit->bs.onSeek = onSeek; - pInit->bs.pUserData = pUserData; - drflac__reset_cache(&pInit->bs); - relaxed = container != drflac_container_unknown; - for (;;) { - if (onRead(pUserData, id, 4) != 4) { - return DRFLAC_FALSE; - } - pInit->runningFilePos += 4; - if (id[0] == 'I' && id[1] == 'D' && id[2] == '3') { - drflac_uint8 header[6]; - drflac_uint8 flags; - drflac_uint32 headerSize; - if (onRead(pUserData, header, 6) != 6) { - return DRFLAC_FALSE; - } - pInit->runningFilePos += 6; - flags = header[1]; - DRFLAC_COPY_MEMORY(&headerSize, header+2, 4); - headerSize = drflac__unsynchsafe_32(drflac__be2host_32(headerSize)); - if (flags & 0x10) { - headerSize += 10; - } - if (!onSeek(pUserData, headerSize, drflac_seek_origin_current)) { - return DRFLAC_FALSE; - } - pInit->runningFilePos += headerSize; - } else { - break; - } - } - if (id[0] == 'f' && id[1] == 'L' && id[2] == 'a' && id[3] == 'C') { - return drflac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); - } -#ifndef DR_FLAC_NO_OGG - if (id[0] == 'O' && id[1] == 'g' && id[2] == 'g' && id[3] == 'S') { - return drflac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); - } -#endif - if (relaxed) { - if (container == drflac_container_native) { - return drflac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); - } -#ifndef DR_FLAC_NO_OGG - if (container == drflac_container_ogg) { - return drflac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); - } -#endif - } - return DRFLAC_FALSE; -} -static void drflac__init_from_info(drflac* pFlac, const drflac_init_info* pInit) -{ - DRFLAC_ASSERT(pFlac != NULL); - DRFLAC_ASSERT(pInit != NULL); - DRFLAC_ZERO_MEMORY(pFlac, sizeof(*pFlac)); - pFlac->bs = pInit->bs; - pFlac->onMeta = pInit->onMeta; - pFlac->pUserDataMD = pInit->pUserDataMD; - pFlac->maxBlockSizeInPCMFrames = pInit->maxBlockSizeInPCMFrames; - pFlac->sampleRate = pInit->sampleRate; - pFlac->channels = (drflac_uint8)pInit->channels; - pFlac->bitsPerSample = (drflac_uint8)pInit->bitsPerSample; - pFlac->totalPCMFrameCount = pInit->totalPCMFrameCount; - pFlac->container = pInit->container; -} -static drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, void* pUserDataMD, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac_init_info init; - drflac_uint32 allocationSize; - drflac_uint32 wholeSIMDVectorCountPerChannel; - drflac_uint32 decodedSamplesAllocationSize; -#ifndef DR_FLAC_NO_OGG - drflac_oggbs oggbs; -#endif - drflac_uint64 firstFramePos; - drflac_uint64 seektablePos; - drflac_uint32 seektableSize; - drflac_allocation_callbacks allocationCallbacks; - drflac* pFlac; - drflac__init_cpu_caps(); - if (!drflac__init_private(&init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) { - return NULL; - } - if (pAllocationCallbacks != NULL) { - allocationCallbacks = *pAllocationCallbacks; - if (allocationCallbacks.onFree == NULL || (allocationCallbacks.onMalloc == NULL && allocationCallbacks.onRealloc == NULL)) { - return NULL; - } - } else { - allocationCallbacks.pUserData = NULL; - allocationCallbacks.onMalloc = drflac__malloc_default; - allocationCallbacks.onRealloc = drflac__realloc_default; - allocationCallbacks.onFree = drflac__free_default; - } - allocationSize = sizeof(drflac); - if ((init.maxBlockSizeInPCMFrames % (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) == 0) { - wholeSIMDVectorCountPerChannel = (init.maxBlockSizeInPCMFrames / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))); - } else { - wholeSIMDVectorCountPerChannel = (init.maxBlockSizeInPCMFrames / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) + 1; - } - decodedSamplesAllocationSize = wholeSIMDVectorCountPerChannel * DRFLAC_MAX_SIMD_VECTOR_SIZE * init.channels; - allocationSize += decodedSamplesAllocationSize; - allocationSize += DRFLAC_MAX_SIMD_VECTOR_SIZE; -#ifndef DR_FLAC_NO_OGG - if (init.container == drflac_container_ogg) { - allocationSize += sizeof(drflac_oggbs); - } - DRFLAC_ZERO_MEMORY(&oggbs, sizeof(oggbs)); - if (init.container == drflac_container_ogg) { - oggbs.onRead = onRead; - oggbs.onSeek = onSeek; - oggbs.pUserData = pUserData; - oggbs.currentBytePos = init.oggFirstBytePos; - oggbs.firstBytePos = init.oggFirstBytePos; - oggbs.serialNumber = init.oggSerial; - oggbs.bosPageHeader = init.oggBosHeader; - oggbs.bytesRemainingInPage = 0; - } -#endif - firstFramePos = 42; - seektablePos = 0; - seektableSize = 0; - if (init.hasMetadataBlocks) { - drflac_read_proc onReadOverride = onRead; - drflac_seek_proc onSeekOverride = onSeek; - void* pUserDataOverride = pUserData; -#ifndef DR_FLAC_NO_OGG - if (init.container == drflac_container_ogg) { - onReadOverride = drflac__on_read_ogg; - onSeekOverride = drflac__on_seek_ogg; - pUserDataOverride = (void*)&oggbs; - } -#endif - if (!drflac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seektableSize, &allocationCallbacks)) { - return NULL; - } - allocationSize += seektableSize; - } - pFlac = (drflac*)drflac__malloc_from_callbacks(allocationSize, &allocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - drflac__init_from_info(pFlac, &init); - pFlac->allocationCallbacks = allocationCallbacks; - pFlac->pDecodedSamples = (drflac_int32*)drflac_align((size_t)pFlac->pExtraData, DRFLAC_MAX_SIMD_VECTOR_SIZE); -#ifndef DR_FLAC_NO_OGG - if (init.container == drflac_container_ogg) { - drflac_oggbs* pInternalOggbs = (drflac_oggbs*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize + seektableSize); - DRFLAC_COPY_MEMORY(pInternalOggbs, &oggbs, sizeof(oggbs)); - pFlac->bs.onRead = drflac__on_read_ogg; - pFlac->bs.onSeek = drflac__on_seek_ogg; - pFlac->bs.pUserData = (void*)pInternalOggbs; - pFlac->_oggbs = (void*)pInternalOggbs; - } -#endif - pFlac->firstFLACFramePosInBytes = firstFramePos; -#ifndef DR_FLAC_NO_OGG - if (init.container == drflac_container_ogg) - { - pFlac->pSeekpoints = NULL; - pFlac->seekpointCount = 0; - } - else -#endif - { - if (seektablePos != 0) { - pFlac->seekpointCount = seektableSize / sizeof(*pFlac->pSeekpoints); - pFlac->pSeekpoints = (drflac_seekpoint*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize); - DRFLAC_ASSERT(pFlac->bs.onSeek != NULL); - DRFLAC_ASSERT(pFlac->bs.onRead != NULL); - if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, drflac_seek_origin_start)) { - if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints, seektableSize) == seektableSize) { - drflac_uint32 iSeekpoint; - for (iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) { - pFlac->pSeekpoints[iSeekpoint].firstPCMFrame = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].firstPCMFrame); - pFlac->pSeekpoints[iSeekpoint].flacFrameOffset = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].flacFrameOffset); - pFlac->pSeekpoints[iSeekpoint].pcmFrameCount = drflac__be2host_16(pFlac->pSeekpoints[iSeekpoint].pcmFrameCount); - } - } else { - pFlac->pSeekpoints = NULL; - pFlac->seekpointCount = 0; - } - if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, drflac_seek_origin_start)) { - drflac__free_from_callbacks(pFlac, &allocationCallbacks); - return NULL; - } - } else { - pFlac->pSeekpoints = NULL; - pFlac->seekpointCount = 0; - } - } - } - if (!init.hasStreamInfoBlock) { - pFlac->currentFLACFrame.header = init.firstFrameHeader; - for (;;) { - drflac_result result = drflac__decode_flac_frame(pFlac); - if (result == DRFLAC_SUCCESS) { - break; - } else { - if (result == DRFLAC_CRC_MISMATCH) { - if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { - drflac__free_from_callbacks(pFlac, &allocationCallbacks); - return NULL; - } - continue; - } else { - drflac__free_from_callbacks(pFlac, &allocationCallbacks); - return NULL; - } - } - } - } - return pFlac; -} -#ifndef DR_FLAC_NO_STDIO -#include -#include -#include -static drflac_result drflac_result_from_errno(int e) -{ - switch (e) - { - case 0: return DRFLAC_SUCCESS; - #ifdef EPERM - case EPERM: return DRFLAC_INVALID_OPERATION; - #endif - #ifdef ENOENT - case ENOENT: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef ESRCH - case ESRCH: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef EINTR - case EINTR: return DRFLAC_INTERRUPT; - #endif - #ifdef EIO - case EIO: return DRFLAC_IO_ERROR; - #endif - #ifdef ENXIO - case ENXIO: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef E2BIG - case E2BIG: return DRFLAC_INVALID_ARGS; - #endif - #ifdef ENOEXEC - case ENOEXEC: return DRFLAC_INVALID_FILE; - #endif - #ifdef EBADF - case EBADF: return DRFLAC_INVALID_FILE; - #endif - #ifdef ECHILD - case ECHILD: return DRFLAC_ERROR; - #endif - #ifdef EAGAIN - case EAGAIN: return DRFLAC_UNAVAILABLE; - #endif - #ifdef ENOMEM - case ENOMEM: return DRFLAC_OUT_OF_MEMORY; - #endif - #ifdef EACCES - case EACCES: return DRFLAC_ACCESS_DENIED; - #endif - #ifdef EFAULT - case EFAULT: return DRFLAC_BAD_ADDRESS; - #endif - #ifdef ENOTBLK - case ENOTBLK: return DRFLAC_ERROR; - #endif - #ifdef EBUSY - case EBUSY: return DRFLAC_BUSY; - #endif - #ifdef EEXIST - case EEXIST: return DRFLAC_ALREADY_EXISTS; - #endif - #ifdef EXDEV - case EXDEV: return DRFLAC_ERROR; - #endif - #ifdef ENODEV - case ENODEV: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef ENOTDIR - case ENOTDIR: return DRFLAC_NOT_DIRECTORY; - #endif - #ifdef EISDIR - case EISDIR: return DRFLAC_IS_DIRECTORY; - #endif - #ifdef EINVAL - case EINVAL: return DRFLAC_INVALID_ARGS; - #endif - #ifdef ENFILE - case ENFILE: return DRFLAC_TOO_MANY_OPEN_FILES; - #endif - #ifdef EMFILE - case EMFILE: return DRFLAC_TOO_MANY_OPEN_FILES; - #endif - #ifdef ENOTTY - case ENOTTY: return DRFLAC_INVALID_OPERATION; - #endif - #ifdef ETXTBSY - case ETXTBSY: return DRFLAC_BUSY; - #endif - #ifdef EFBIG - case EFBIG: return DRFLAC_TOO_BIG; - #endif - #ifdef ENOSPC - case ENOSPC: return DRFLAC_NO_SPACE; - #endif - #ifdef ESPIPE - case ESPIPE: return DRFLAC_BAD_SEEK; - #endif - #ifdef EROFS - case EROFS: return DRFLAC_ACCESS_DENIED; - #endif - #ifdef EMLINK - case EMLINK: return DRFLAC_TOO_MANY_LINKS; - #endif - #ifdef EPIPE - case EPIPE: return DRFLAC_BAD_PIPE; - #endif - #ifdef EDOM - case EDOM: return DRFLAC_OUT_OF_RANGE; - #endif - #ifdef ERANGE - case ERANGE: return DRFLAC_OUT_OF_RANGE; - #endif - #ifdef EDEADLK - case EDEADLK: return DRFLAC_DEADLOCK; - #endif - #ifdef ENAMETOOLONG - case ENAMETOOLONG: return DRFLAC_PATH_TOO_LONG; - #endif - #ifdef ENOLCK - case ENOLCK: return DRFLAC_ERROR; - #endif - #ifdef ENOSYS - case ENOSYS: return DRFLAC_NOT_IMPLEMENTED; - #endif - #ifdef ENOTEMPTY - case ENOTEMPTY: return DRFLAC_DIRECTORY_NOT_EMPTY; - #endif - #ifdef ELOOP - case ELOOP: return DRFLAC_TOO_MANY_LINKS; - #endif - #ifdef ENOMSG - case ENOMSG: return DRFLAC_NO_MESSAGE; - #endif - #ifdef EIDRM - case EIDRM: return DRFLAC_ERROR; - #endif - #ifdef ECHRNG - case ECHRNG: return DRFLAC_ERROR; - #endif - #ifdef EL2NSYNC - case EL2NSYNC: return DRFLAC_ERROR; - #endif - #ifdef EL3HLT - case EL3HLT: return DRFLAC_ERROR; - #endif - #ifdef EL3RST - case EL3RST: return DRFLAC_ERROR; - #endif - #ifdef ELNRNG - case ELNRNG: return DRFLAC_OUT_OF_RANGE; - #endif - #ifdef EUNATCH - case EUNATCH: return DRFLAC_ERROR; - #endif - #ifdef ENOCSI - case ENOCSI: return DRFLAC_ERROR; - #endif - #ifdef EL2HLT - case EL2HLT: return DRFLAC_ERROR; - #endif - #ifdef EBADE - case EBADE: return DRFLAC_ERROR; - #endif - #ifdef EBADR - case EBADR: return DRFLAC_ERROR; - #endif - #ifdef EXFULL - case EXFULL: return DRFLAC_ERROR; - #endif - #ifdef ENOANO - case ENOANO: return DRFLAC_ERROR; - #endif - #ifdef EBADRQC - case EBADRQC: return DRFLAC_ERROR; - #endif - #ifdef EBADSLT - case EBADSLT: return DRFLAC_ERROR; - #endif - #ifdef EBFONT - case EBFONT: return DRFLAC_INVALID_FILE; - #endif - #ifdef ENOSTR - case ENOSTR: return DRFLAC_ERROR; - #endif - #ifdef ENODATA - case ENODATA: return DRFLAC_NO_DATA_AVAILABLE; - #endif - #ifdef ETIME - case ETIME: return DRFLAC_TIMEOUT; - #endif - #ifdef ENOSR - case ENOSR: return DRFLAC_NO_DATA_AVAILABLE; - #endif - #ifdef ENONET - case ENONET: return DRFLAC_NO_NETWORK; - #endif - #ifdef ENOPKG - case ENOPKG: return DRFLAC_ERROR; - #endif - #ifdef EREMOTE - case EREMOTE: return DRFLAC_ERROR; - #endif - #ifdef ENOLINK - case ENOLINK: return DRFLAC_ERROR; - #endif - #ifdef EADV - case EADV: return DRFLAC_ERROR; - #endif - #ifdef ESRMNT - case ESRMNT: return DRFLAC_ERROR; - #endif - #ifdef ECOMM - case ECOMM: return DRFLAC_ERROR; - #endif - #ifdef EPROTO - case EPROTO: return DRFLAC_ERROR; - #endif - #ifdef EMULTIHOP - case EMULTIHOP: return DRFLAC_ERROR; - #endif - #ifdef EDOTDOT - case EDOTDOT: return DRFLAC_ERROR; - #endif - #ifdef EBADMSG - case EBADMSG: return DRFLAC_BAD_MESSAGE; - #endif - #ifdef EOVERFLOW - case EOVERFLOW: return DRFLAC_TOO_BIG; - #endif - #ifdef ENOTUNIQ - case ENOTUNIQ: return DRFLAC_NOT_UNIQUE; - #endif - #ifdef EBADFD - case EBADFD: return DRFLAC_ERROR; - #endif - #ifdef EREMCHG - case EREMCHG: return DRFLAC_ERROR; - #endif - #ifdef ELIBACC - case ELIBACC: return DRFLAC_ACCESS_DENIED; - #endif - #ifdef ELIBBAD - case ELIBBAD: return DRFLAC_INVALID_FILE; - #endif - #ifdef ELIBSCN - case ELIBSCN: return DRFLAC_INVALID_FILE; - #endif - #ifdef ELIBMAX - case ELIBMAX: return DRFLAC_ERROR; - #endif - #ifdef ELIBEXEC - case ELIBEXEC: return DRFLAC_ERROR; - #endif - #ifdef EILSEQ - case EILSEQ: return DRFLAC_INVALID_DATA; - #endif - #ifdef ERESTART - case ERESTART: return DRFLAC_ERROR; - #endif - #ifdef ESTRPIPE - case ESTRPIPE: return DRFLAC_ERROR; - #endif - #ifdef EUSERS - case EUSERS: return DRFLAC_ERROR; - #endif - #ifdef ENOTSOCK - case ENOTSOCK: return DRFLAC_NOT_SOCKET; - #endif - #ifdef EDESTADDRREQ - case EDESTADDRREQ: return DRFLAC_NO_ADDRESS; - #endif - #ifdef EMSGSIZE - case EMSGSIZE: return DRFLAC_TOO_BIG; - #endif - #ifdef EPROTOTYPE - case EPROTOTYPE: return DRFLAC_BAD_PROTOCOL; - #endif - #ifdef ENOPROTOOPT - case ENOPROTOOPT: return DRFLAC_PROTOCOL_UNAVAILABLE; - #endif - #ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return DRFLAC_PROTOCOL_NOT_SUPPORTED; - #endif - #ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return DRFLAC_SOCKET_NOT_SUPPORTED; - #endif - #ifdef EOPNOTSUPP - case EOPNOTSUPP: return DRFLAC_INVALID_OPERATION; - #endif - #ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return DRFLAC_PROTOCOL_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return DRFLAC_ADDRESS_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EADDRINUSE - case EADDRINUSE: return DRFLAC_ALREADY_IN_USE; - #endif - #ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return DRFLAC_ERROR; - #endif - #ifdef ENETDOWN - case ENETDOWN: return DRFLAC_NO_NETWORK; - #endif - #ifdef ENETUNREACH - case ENETUNREACH: return DRFLAC_NO_NETWORK; - #endif - #ifdef ENETRESET - case ENETRESET: return DRFLAC_NO_NETWORK; - #endif - #ifdef ECONNABORTED - case ECONNABORTED: return DRFLAC_NO_NETWORK; - #endif - #ifdef ECONNRESET - case ECONNRESET: return DRFLAC_CONNECTION_RESET; - #endif - #ifdef ENOBUFS - case ENOBUFS: return DRFLAC_NO_SPACE; - #endif - #ifdef EISCONN - case EISCONN: return DRFLAC_ALREADY_CONNECTED; - #endif - #ifdef ENOTCONN - case ENOTCONN: return DRFLAC_NOT_CONNECTED; - #endif - #ifdef ESHUTDOWN - case ESHUTDOWN: return DRFLAC_ERROR; - #endif - #ifdef ETOOMANYREFS - case ETOOMANYREFS: return DRFLAC_ERROR; - #endif - #ifdef ETIMEDOUT - case ETIMEDOUT: return DRFLAC_TIMEOUT; - #endif - #ifdef ECONNREFUSED - case ECONNREFUSED: return DRFLAC_CONNECTION_REFUSED; - #endif - #ifdef EHOSTDOWN - case EHOSTDOWN: return DRFLAC_NO_HOST; - #endif - #ifdef EHOSTUNREACH - case EHOSTUNREACH: return DRFLAC_NO_HOST; - #endif - #ifdef EALREADY - case EALREADY: return DRFLAC_IN_PROGRESS; - #endif - #ifdef EINPROGRESS - case EINPROGRESS: return DRFLAC_IN_PROGRESS; - #endif - #ifdef ESTALE - case ESTALE: return DRFLAC_INVALID_FILE; - #endif - #ifdef EUCLEAN - case EUCLEAN: return DRFLAC_ERROR; - #endif - #ifdef ENOTNAM - case ENOTNAM: return DRFLAC_ERROR; - #endif - #ifdef ENAVAIL - case ENAVAIL: return DRFLAC_ERROR; - #endif - #ifdef EISNAM - case EISNAM: return DRFLAC_ERROR; - #endif - #ifdef EREMOTEIO - case EREMOTEIO: return DRFLAC_IO_ERROR; - #endif - #ifdef EDQUOT - case EDQUOT: return DRFLAC_NO_SPACE; - #endif - #ifdef ENOMEDIUM - case ENOMEDIUM: return DRFLAC_DOES_NOT_EXIST; - #endif - #ifdef EMEDIUMTYPE - case EMEDIUMTYPE: return DRFLAC_ERROR; - #endif - #ifdef ECANCELED - case ECANCELED: return DRFLAC_CANCELLED; - #endif - #ifdef ENOKEY - case ENOKEY: return DRFLAC_ERROR; - #endif - #ifdef EKEYEXPIRED - case EKEYEXPIRED: return DRFLAC_ERROR; - #endif - #ifdef EKEYREVOKED - case EKEYREVOKED: return DRFLAC_ERROR; - #endif - #ifdef EKEYREJECTED - case EKEYREJECTED: return DRFLAC_ERROR; - #endif - #ifdef EOWNERDEAD - case EOWNERDEAD: return DRFLAC_ERROR; - #endif - #ifdef ENOTRECOVERABLE - case ENOTRECOVERABLE: return DRFLAC_ERROR; - #endif - #ifdef ERFKILL - case ERFKILL: return DRFLAC_ERROR; - #endif - #ifdef EHWPOISON - case EHWPOISON: return DRFLAC_ERROR; - #endif - default: return DRFLAC_ERROR; - } -} -static drflac_result drflac_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode) -{ -#if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err; -#endif - if (ppFile != NULL) { - *ppFile = NULL; - } - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRFLAC_INVALID_ARGS; - } -#if defined(_MSC_VER) && _MSC_VER >= 1400 - err = fopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drflac_result_from_errno(err); - } -#else -#if defined(_WIN32) || defined(__APPLE__) - *ppFile = fopen(pFilePath, pOpenMode); -#else - #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE) - *ppFile = fopen64(pFilePath, pOpenMode); - #else - *ppFile = fopen(pFilePath, pOpenMode); - #endif -#endif - if (*ppFile == NULL) { - drflac_result result = drflac_result_from_errno(errno); - if (result == DRFLAC_SUCCESS) { - result = DRFLAC_ERROR; - } - return result; - } -#endif - return DRFLAC_SUCCESS; -} -#if defined(_WIN32) - #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) - #define DRFLAC_HAS_WFOPEN - #endif -#endif -static drflac_result drflac_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - if (ppFile != NULL) { - *ppFile = NULL; - } - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRFLAC_INVALID_ARGS; - } -#if defined(DRFLAC_HAS_WFOPEN) - { - #if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drflac_result_from_errno(err); - } - #else - *ppFile = _wfopen(pFilePath, pOpenMode); - if (*ppFile == NULL) { - return drflac_result_from_errno(errno); - } - #endif - (void)pAllocationCallbacks; - } -#else - { - mbstate_t mbs; - size_t lenMB; - const wchar_t* pFilePathTemp = pFilePath; - char* pFilePathMB = NULL; - char pOpenModeMB[32] = {0}; - DRFLAC_ZERO_OBJECT(&mbs); - lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs); - if (lenMB == (size_t)-1) { - return drflac_result_from_errno(errno); - } - pFilePathMB = (char*)drflac__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks); - if (pFilePathMB == NULL) { - return DRFLAC_OUT_OF_MEMORY; - } - pFilePathTemp = pFilePath; - DRFLAC_ZERO_OBJECT(&mbs); - wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs); - { - size_t i = 0; - for (;;) { - if (pOpenMode[i] == 0) { - pOpenModeMB[i] = '\0'; - break; - } - pOpenModeMB[i] = (char)pOpenMode[i]; - i += 1; - } - } - *ppFile = fopen(pFilePathMB, pOpenModeMB); - drflac__free_from_callbacks(pFilePathMB, pAllocationCallbacks); - } - if (*ppFile == NULL) { - return DRFLAC_ERROR; - } -#endif - return DRFLAC_SUCCESS; -} -static size_t drflac__on_read_stdio(void* pUserData, void* bufferOut, size_t bytesToRead) -{ - return fread(bufferOut, 1, bytesToRead, (FILE*)pUserData); -} -static drflac_bool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin) -{ - DRFLAC_ASSERT(offset >= 0); - return fseek((FILE*)pUserData, offset, (origin == drflac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; -} -DRFLAC_API drflac* drflac_open_file(const char* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - if (drflac_fopen(&pFile, pFileName, "rb") != DRFLAC_SUCCESS) { - return NULL; - } - pFlac = drflac_open(drflac__on_read_stdio, drflac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return NULL; - } - return pFlac; -} -DRFLAC_API drflac* drflac_open_file_w(const wchar_t* pFileName, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - if (drflac_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != DRFLAC_SUCCESS) { - return NULL; - } - pFlac = drflac_open(drflac__on_read_stdio, drflac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return NULL; - } - return pFlac; -} -DRFLAC_API drflac* drflac_open_file_with_metadata(const char* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - if (drflac_fopen(&pFile, pFileName, "rb") != DRFLAC_SUCCESS) { - return NULL; - } - pFlac = drflac_open_with_metadata_private(drflac__on_read_stdio, drflac__on_seek_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return pFlac; - } - return pFlac; -} -DRFLAC_API drflac* drflac_open_file_with_metadata_w(const wchar_t* pFileName, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - FILE* pFile; - if (drflac_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != DRFLAC_SUCCESS) { - return NULL; - } - pFlac = drflac_open_with_metadata_private(drflac__on_read_stdio, drflac__on_seek_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - fclose(pFile); - return pFlac; - } - return pFlac; -} -#endif -static size_t drflac__on_read_memory(void* pUserData, void* bufferOut, size_t bytesToRead) -{ - drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData; - size_t bytesRemaining; - DRFLAC_ASSERT(memoryStream != NULL); - DRFLAC_ASSERT(memoryStream->dataSize >= memoryStream->currentReadPos); - bytesRemaining = memoryStream->dataSize - memoryStream->currentReadPos; - if (bytesToRead > bytesRemaining) { - bytesToRead = bytesRemaining; - } - if (bytesToRead > 0) { - DRFLAC_COPY_MEMORY(bufferOut, memoryStream->data + memoryStream->currentReadPos, bytesToRead); - memoryStream->currentReadPos += bytesToRead; - } - return bytesToRead; -} -static drflac_bool32 drflac__on_seek_memory(void* pUserData, int offset, drflac_seek_origin origin) -{ - drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData; - DRFLAC_ASSERT(memoryStream != NULL); - DRFLAC_ASSERT(offset >= 0); - if (offset > (drflac_int64)memoryStream->dataSize) { - return DRFLAC_FALSE; - } - if (origin == drflac_seek_origin_current) { - if (memoryStream->currentReadPos + offset <= memoryStream->dataSize) { - memoryStream->currentReadPos += offset; - } else { - return DRFLAC_FALSE; - } - } else { - if ((drflac_uint32)offset <= memoryStream->dataSize) { - memoryStream->currentReadPos = offset; - } else { - return DRFLAC_FALSE; - } - } - return DRFLAC_TRUE; -} -DRFLAC_API drflac* drflac_open_memory(const void* pData, size_t dataSize, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac__memory_stream memoryStream; - drflac* pFlac; - memoryStream.data = (const drflac_uint8*)pData; - memoryStream.dataSize = dataSize; - memoryStream.currentReadPos = 0; - pFlac = drflac_open(drflac__on_read_memory, drflac__on_seek_memory, &memoryStream, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - pFlac->memoryStream = memoryStream; -#ifndef DR_FLAC_NO_OGG - if (pFlac->container == drflac_container_ogg) - { - drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; - oggbs->pUserData = &pFlac->memoryStream; - } - else -#endif - { - pFlac->bs.pUserData = &pFlac->memoryStream; - } - return pFlac; -} -DRFLAC_API drflac* drflac_open_memory_with_metadata(const void* pData, size_t dataSize, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac__memory_stream memoryStream; - drflac* pFlac; - memoryStream.data = (const drflac_uint8*)pData; - memoryStream.dataSize = dataSize; - memoryStream.currentReadPos = 0; - pFlac = drflac_open_with_metadata_private(drflac__on_read_memory, drflac__on_seek_memory, onMeta, drflac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - pFlac->memoryStream = memoryStream; -#ifndef DR_FLAC_NO_OGG - if (pFlac->container == drflac_container_ogg) - { - drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; - oggbs->pUserData = &pFlac->memoryStream; - } - else -#endif - { - pFlac->bs.pUserData = &pFlac->memoryStream; - } - return pFlac; -} -DRFLAC_API drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - return drflac_open_with_metadata_private(onRead, onSeek, NULL, drflac_container_unknown, pUserData, pUserData, pAllocationCallbacks); -} -DRFLAC_API drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - return drflac_open_with_metadata_private(onRead, onSeek, NULL, container, pUserData, pUserData, pAllocationCallbacks); -} -DRFLAC_API drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - return drflac_open_with_metadata_private(onRead, onSeek, onMeta, drflac_container_unknown, pUserData, pUserData, pAllocationCallbacks); -} -DRFLAC_API drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - return drflac_open_with_metadata_private(onRead, onSeek, onMeta, container, pUserData, pUserData, pAllocationCallbacks); -} -DRFLAC_API void drflac_close(drflac* pFlac) -{ - if (pFlac == NULL) { - return; - } -#ifndef DR_FLAC_NO_STDIO - if (pFlac->bs.onRead == drflac__on_read_stdio) { - fclose((FILE*)pFlac->bs.pUserData); - } -#ifndef DR_FLAC_NO_OGG - if (pFlac->container == drflac_container_ogg) { - drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; - DRFLAC_ASSERT(pFlac->bs.onRead == drflac__on_read_ogg); - if (oggbs->onRead == drflac__on_read_stdio) { - fclose((FILE*)oggbs->pUserData); - } - } -#endif -#endif - drflac__free_from_callbacks(pFlac, &pFlac->allocationCallbacks); -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 left = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 left0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 left1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 left2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 left3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << shift1; - drflac_uint32 right0 = left0 - side0; - drflac_uint32 right1 = left1 - side1; - drflac_uint32 right2 = left2 - side2; - drflac_uint32 right3 = left3 - side3; - pOutputSamples[i*8+0] = (drflac_int32)left0; - pOutputSamples[i*8+1] = (drflac_int32)right0; - pOutputSamples[i*8+2] = (drflac_int32)left1; - pOutputSamples[i*8+3] = (drflac_int32)right1; - pOutputSamples[i*8+4] = (drflac_int32)left2; - pOutputSamples[i*8+5] = (drflac_int32)right2; - pOutputSamples[i*8+6] = (drflac_int32)left3; - pOutputSamples[i*8+7] = (drflac_int32)right3; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - for (i = 0; i < frameCount4; ++i) { - __m128i left = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - __m128i right = _mm_sub_epi32(left, side); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right)); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - int32x4_t shift0_4; - int32x4_t shift1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - shift0_4 = vdupq_n_s32(shift0); - shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t left; - uint32x4_t side; - uint32x4_t right; - left = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4); - right = vsubq_u32(left, side); - drflac__vst2q_u32((drflac_uint32*)pOutputSamples + i*8, vzipq_u32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_left_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 side = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 side0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 side1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 side2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 side3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 right0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 right1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 right2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 right3 = pInputSamples1U32[i*4+3] << shift1; - drflac_uint32 left0 = right0 + side0; - drflac_uint32 left1 = right1 + side1; - drflac_uint32 left2 = right2 + side2; - drflac_uint32 left3 = right3 + side3; - pOutputSamples[i*8+0] = (drflac_int32)left0; - pOutputSamples[i*8+1] = (drflac_int32)right0; - pOutputSamples[i*8+2] = (drflac_int32)left1; - pOutputSamples[i*8+3] = (drflac_int32)right1; - pOutputSamples[i*8+4] = (drflac_int32)left2; - pOutputSamples[i*8+5] = (drflac_int32)right2; - pOutputSamples[i*8+6] = (drflac_int32)left3; - pOutputSamples[i*8+7] = (drflac_int32)right3; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - for (i = 0; i < frameCount4; ++i) { - __m128i side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - __m128i left = _mm_add_epi32(right, side); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right)); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - int32x4_t shift0_4; - int32x4_t shift1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - shift0_4 = vdupq_n_s32(shift0); - shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t side; - uint32x4_t right; - uint32x4_t left; - side = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4); - right = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4); - left = vaddq_u32(right, side); - drflac__vst2q_u32((drflac_uint32*)pOutputSamples + i*8, vzipq_u32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (drflac_int32)left; - pOutputSamples[i*2+1] = (drflac_int32)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_right_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample); - pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_int32 shift = unusedBitsPerSample; - if (shift > 0) { - shift -= 1; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 temp0L; - drflac_uint32 temp1L; - drflac_uint32 temp2L; - drflac_uint32 temp3L; - drflac_uint32 temp0R; - drflac_uint32 temp1R; - drflac_uint32 temp2R; - drflac_uint32 temp3R; - drflac_uint32 mid0 = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid1 = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid2 = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid3 = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid0 = (mid0 << 1) | (side0 & 0x01); - mid1 = (mid1 << 1) | (side1 & 0x01); - mid2 = (mid2 << 1) | (side2 & 0x01); - mid3 = (mid3 << 1) | (side3 & 0x01); - temp0L = (mid0 + side0) << shift; - temp1L = (mid1 + side1) << shift; - temp2L = (mid2 + side2) << shift; - temp3L = (mid3 + side3) << shift; - temp0R = (mid0 - side0) << shift; - temp1R = (mid1 - side1) << shift; - temp2R = (mid2 - side2) << shift; - temp3R = (mid3 - side3) << shift; - pOutputSamples[i*8+0] = (drflac_int32)temp0L; - pOutputSamples[i*8+1] = (drflac_int32)temp0R; - pOutputSamples[i*8+2] = (drflac_int32)temp1L; - pOutputSamples[i*8+3] = (drflac_int32)temp1R; - pOutputSamples[i*8+4] = (drflac_int32)temp2L; - pOutputSamples[i*8+5] = (drflac_int32)temp2R; - pOutputSamples[i*8+6] = (drflac_int32)temp3L; - pOutputSamples[i*8+7] = (drflac_int32)temp3R; - } - } else { - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 temp0L; - drflac_uint32 temp1L; - drflac_uint32 temp2L; - drflac_uint32 temp3L; - drflac_uint32 temp0R; - drflac_uint32 temp1R; - drflac_uint32 temp2R; - drflac_uint32 temp3R; - drflac_uint32 mid0 = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid1 = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid2 = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid3 = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid0 = (mid0 << 1) | (side0 & 0x01); - mid1 = (mid1 << 1) | (side1 & 0x01); - mid2 = (mid2 << 1) | (side2 & 0x01); - mid3 = (mid3 << 1) | (side3 & 0x01); - temp0L = (drflac_uint32)((drflac_int32)(mid0 + side0) >> 1); - temp1L = (drflac_uint32)((drflac_int32)(mid1 + side1) >> 1); - temp2L = (drflac_uint32)((drflac_int32)(mid2 + side2) >> 1); - temp3L = (drflac_uint32)((drflac_int32)(mid3 + side3) >> 1); - temp0R = (drflac_uint32)((drflac_int32)(mid0 - side0) >> 1); - temp1R = (drflac_uint32)((drflac_int32)(mid1 - side1) >> 1); - temp2R = (drflac_uint32)((drflac_int32)(mid2 - side2) >> 1); - temp3R = (drflac_uint32)((drflac_int32)(mid3 - side3) >> 1); - pOutputSamples[i*8+0] = (drflac_int32)temp0L; - pOutputSamples[i*8+1] = (drflac_int32)temp0R; - pOutputSamples[i*8+2] = (drflac_int32)temp1L; - pOutputSamples[i*8+3] = (drflac_int32)temp1R; - pOutputSamples[i*8+4] = (drflac_int32)temp2L; - pOutputSamples[i*8+5] = (drflac_int32)temp2R; - pOutputSamples[i*8+6] = (drflac_int32)temp3L; - pOutputSamples[i*8+7] = (drflac_int32)temp3R; - } - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample); - pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample); - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_int32 shift = unusedBitsPerSample; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - if (shift == 0) { - for (i = 0; i < frameCount4; ++i) { - __m128i mid; - __m128i side; - __m128i left; - __m128i right; - mid = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); - left = _mm_srai_epi32(_mm_add_epi32(mid, side), 1); - right = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right)); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)(mid + side) >> 1; - pOutputSamples[i*2+1] = (drflac_int32)(mid - side) >> 1; - } - } else { - shift -= 1; - for (i = 0; i < frameCount4; ++i) { - __m128i mid; - __m128i side; - __m128i left; - __m128i right; - mid = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); - left = _mm_slli_epi32(_mm_add_epi32(mid, side), shift); - right = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right)); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift); - pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift); - } - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_int32 shift = unusedBitsPerSample; - int32x4_t wbpsShift0_4; - int32x4_t wbpsShift1_4; - uint32x4_t one4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - wbpsShift0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - wbpsShift1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - one4 = vdupq_n_u32(1); - if (shift == 0) { - for (i = 0; i < frameCount4; ++i) { - uint32x4_t mid; - uint32x4_t side; - int32x4_t left; - int32x4_t right; - mid = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4); - mid = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, one4)); - left = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1); - right = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1); - drflac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)(mid + side) >> 1; - pOutputSamples[i*2+1] = (drflac_int32)(mid - side) >> 1; - } - } else { - int32x4_t shift4; - shift -= 1; - shift4 = vdupq_n_s32(shift); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t mid; - uint32x4_t side; - int32x4_t left; - int32x4_t right; - mid = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4); - mid = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, one4)); - left = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4)); - right = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4)); - drflac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift); - pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift); - } - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_mid_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)); - pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1; - pOutputSamples[i*8+0] = (drflac_int32)tempL0; - pOutputSamples[i*8+1] = (drflac_int32)tempR0; - pOutputSamples[i*8+2] = (drflac_int32)tempL1; - pOutputSamples[i*8+3] = (drflac_int32)tempR1; - pOutputSamples[i*8+4] = (drflac_int32)tempL2; - pOutputSamples[i*8+5] = (drflac_int32)tempR2; - pOutputSamples[i*8+6] = (drflac_int32)tempL3; - pOutputSamples[i*8+7] = (drflac_int32)tempR3; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0); - pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1); - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - __m128i left = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right)); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0); - pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1); - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - int32x4_t shift4_0 = vdupq_n_s32(shift0); - int32x4_t shift4_1 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - int32x4_t left; - int32x4_t right; - left = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift4_0)); - right = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift4_1)); - drflac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0); - pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s32__decode_independent_stereo(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int32* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s32__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 framesToRead, drflac_int32* pBufferOut) -{ - drflac_uint64 framesRead; - drflac_uint32 unusedBitsPerSample; - if (pFlac == NULL || framesToRead == 0) { - return 0; - } - if (pBufferOut == NULL) { - return drflac__seek_forward_by_pcm_frames(pFlac, framesToRead); - } - DRFLAC_ASSERT(pFlac->bitsPerSample <= 32); - unusedBitsPerSample = 32 - pFlac->bitsPerSample; - framesRead = 0; - while (framesToRead > 0) { - if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) { - if (!drflac__read_and_decode_next_flac_frame(pFlac)) { - break; - } - } else { - unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment); - drflac_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining; - drflac_uint64 frameCountThisIteration = framesToRead; - if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) { - frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining; - } - if (channelCount == 2) { - const drflac_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame; - const drflac_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame; - switch (pFlac->currentFLACFrame.header.channelAssignment) - { - case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE: - { - drflac_read_pcm_frames_s32__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE: - { - drflac_read_pcm_frames_s32__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE: - { - drflac_read_pcm_frames_s32__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: - default: - { - drflac_read_pcm_frames_s32__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - } - } else { - drflac_uint64 i; - for (i = 0; i < frameCountThisIteration; ++i) { - unsigned int j; - for (j = 0; j < channelCount; ++j) { - pBufferOut[(i*channelCount)+j] = (drflac_int32)((drflac_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample)); - } - } - } - framesRead += frameCountThisIteration; - pBufferOut += frameCountThisIteration * channelCount; - framesToRead -= frameCountThisIteration; - pFlac->currentPCMFrame += frameCountThisIteration; - pFlac->currentFLACFrame.pcmFramesRemaining -= (drflac_uint32)frameCountThisIteration; - } - } - return framesRead; -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 left = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 right = left - side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 left0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 left1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 left2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 left3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << shift1; - drflac_uint32 right0 = left0 - side0; - drflac_uint32 right1 = left1 - side1; - drflac_uint32 right2 = left2 - side2; - drflac_uint32 right3 = left3 - side3; - left0 >>= 16; - left1 >>= 16; - left2 >>= 16; - left3 >>= 16; - right0 >>= 16; - right1 >>= 16; - right2 >>= 16; - right3 >>= 16; - pOutputSamples[i*8+0] = (drflac_int16)left0; - pOutputSamples[i*8+1] = (drflac_int16)right0; - pOutputSamples[i*8+2] = (drflac_int16)left1; - pOutputSamples[i*8+3] = (drflac_int16)right1; - pOutputSamples[i*8+4] = (drflac_int16)left2; - pOutputSamples[i*8+5] = (drflac_int16)right2; - pOutputSamples[i*8+6] = (drflac_int16)left3; - pOutputSamples[i*8+7] = (drflac_int16)right3; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - for (i = 0; i < frameCount4; ++i) { - __m128i left = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - __m128i right = _mm_sub_epi32(left, side); - left = _mm_srai_epi32(left, 16); - right = _mm_srai_epi32(right, 16); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - int32x4_t shift0_4; - int32x4_t shift1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - shift0_4 = vdupq_n_s32(shift0); - shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t left; - uint32x4_t side; - uint32x4_t right; - left = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4); - right = vsubq_u32(left, side); - left = vshrq_n_u32(left, 16); - right = vshrq_n_u32(right, 16); - drflac__vst2q_u16((drflac_uint16*)pOutputSamples + i*8, vzip_u16(vmovn_u32(left), vmovn_u32(right))); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_left_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s16__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s16__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 side = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 left = right + side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 side0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 side1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 side2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 side3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 right0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 right1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 right2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 right3 = pInputSamples1U32[i*4+3] << shift1; - drflac_uint32 left0 = right0 + side0; - drflac_uint32 left1 = right1 + side1; - drflac_uint32 left2 = right2 + side2; - drflac_uint32 left3 = right3 + side3; - left0 >>= 16; - left1 >>= 16; - left2 >>= 16; - left3 >>= 16; - right0 >>= 16; - right1 >>= 16; - right2 >>= 16; - right3 >>= 16; - pOutputSamples[i*8+0] = (drflac_int16)left0; - pOutputSamples[i*8+1] = (drflac_int16)right0; - pOutputSamples[i*8+2] = (drflac_int16)left1; - pOutputSamples[i*8+3] = (drflac_int16)right1; - pOutputSamples[i*8+4] = (drflac_int16)left2; - pOutputSamples[i*8+5] = (drflac_int16)right2; - pOutputSamples[i*8+6] = (drflac_int16)left3; - pOutputSamples[i*8+7] = (drflac_int16)right3; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - for (i = 0; i < frameCount4; ++i) { - __m128i side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - __m128i left = _mm_add_epi32(right, side); - left = _mm_srai_epi32(left, 16); - right = _mm_srai_epi32(right, 16); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - int32x4_t shift0_4; - int32x4_t shift1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - shift0_4 = vdupq_n_s32(shift0); - shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t side; - uint32x4_t right; - uint32x4_t left; - side = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4); - right = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4); - left = vaddq_u32(right, side); - left = vshrq_n_u32(left, 16); - right = vshrq_n_u32(right, 16); - drflac__vst2q_u16((drflac_uint16*)pOutputSamples + i*8, vzip_u16(vmovn_u32(left), vmovn_u32(right))); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - left >>= 16; - right >>= 16; - pOutputSamples[i*2+0] = (drflac_int16)left; - pOutputSamples[i*2+1] = (drflac_int16)right; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_right_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s16__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s16__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - drflac_uint32 mid = (drflac_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample) >> 16); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift = unusedBitsPerSample; - if (shift > 0) { - shift -= 1; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 temp0L; - drflac_uint32 temp1L; - drflac_uint32 temp2L; - drflac_uint32 temp3L; - drflac_uint32 temp0R; - drflac_uint32 temp1R; - drflac_uint32 temp2R; - drflac_uint32 temp3R; - drflac_uint32 mid0 = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid1 = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid2 = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid3 = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid0 = (mid0 << 1) | (side0 & 0x01); - mid1 = (mid1 << 1) | (side1 & 0x01); - mid2 = (mid2 << 1) | (side2 & 0x01); - mid3 = (mid3 << 1) | (side3 & 0x01); - temp0L = (mid0 + side0) << shift; - temp1L = (mid1 + side1) << shift; - temp2L = (mid2 + side2) << shift; - temp3L = (mid3 + side3) << shift; - temp0R = (mid0 - side0) << shift; - temp1R = (mid1 - side1) << shift; - temp2R = (mid2 - side2) << shift; - temp3R = (mid3 - side3) << shift; - temp0L >>= 16; - temp1L >>= 16; - temp2L >>= 16; - temp3L >>= 16; - temp0R >>= 16; - temp1R >>= 16; - temp2R >>= 16; - temp3R >>= 16; - pOutputSamples[i*8+0] = (drflac_int16)temp0L; - pOutputSamples[i*8+1] = (drflac_int16)temp0R; - pOutputSamples[i*8+2] = (drflac_int16)temp1L; - pOutputSamples[i*8+3] = (drflac_int16)temp1R; - pOutputSamples[i*8+4] = (drflac_int16)temp2L; - pOutputSamples[i*8+5] = (drflac_int16)temp2R; - pOutputSamples[i*8+6] = (drflac_int16)temp3L; - pOutputSamples[i*8+7] = (drflac_int16)temp3R; - } - } else { - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 temp0L; - drflac_uint32 temp1L; - drflac_uint32 temp2L; - drflac_uint32 temp3L; - drflac_uint32 temp0R; - drflac_uint32 temp1R; - drflac_uint32 temp2R; - drflac_uint32 temp3R; - drflac_uint32 mid0 = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid1 = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid2 = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid3 = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid0 = (mid0 << 1) | (side0 & 0x01); - mid1 = (mid1 << 1) | (side1 & 0x01); - mid2 = (mid2 << 1) | (side2 & 0x01); - mid3 = (mid3 << 1) | (side3 & 0x01); - temp0L = ((drflac_int32)(mid0 + side0) >> 1); - temp1L = ((drflac_int32)(mid1 + side1) >> 1); - temp2L = ((drflac_int32)(mid2 + side2) >> 1); - temp3L = ((drflac_int32)(mid3 + side3) >> 1); - temp0R = ((drflac_int32)(mid0 - side0) >> 1); - temp1R = ((drflac_int32)(mid1 - side1) >> 1); - temp2R = ((drflac_int32)(mid2 - side2) >> 1); - temp3R = ((drflac_int32)(mid3 - side3) >> 1); - temp0L >>= 16; - temp1L >>= 16; - temp2L >>= 16; - temp3L >>= 16; - temp0R >>= 16; - temp1R >>= 16; - temp2R >>= 16; - temp3R >>= 16; - pOutputSamples[i*8+0] = (drflac_int16)temp0L; - pOutputSamples[i*8+1] = (drflac_int16)temp0R; - pOutputSamples[i*8+2] = (drflac_int16)temp1L; - pOutputSamples[i*8+3] = (drflac_int16)temp1R; - pOutputSamples[i*8+4] = (drflac_int16)temp2L; - pOutputSamples[i*8+5] = (drflac_int16)temp2R; - pOutputSamples[i*8+6] = (drflac_int16)temp3L; - pOutputSamples[i*8+7] = (drflac_int16)temp3R; - } - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)(((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample) >> 16); - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift = unusedBitsPerSample; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - if (shift == 0) { - for (i = 0; i < frameCount4; ++i) { - __m128i mid; - __m128i side; - __m128i left; - __m128i right; - mid = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); - left = _mm_srai_epi32(_mm_add_epi32(mid, side), 1); - right = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1); - left = _mm_srai_epi32(left, 16); - right = _mm_srai_epi32(right, 16); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int16)(((drflac_int32)(mid + side) >> 1) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)(((drflac_int32)(mid - side) >> 1) >> 16); - } - } else { - shift -= 1; - for (i = 0; i < frameCount4; ++i) { - __m128i mid; - __m128i side; - __m128i left; - __m128i right; - mid = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); - left = _mm_slli_epi32(_mm_add_epi32(mid, side), shift); - right = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift); - left = _mm_srai_epi32(left, 16); - right = _mm_srai_epi32(right, 16); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int16)(((mid + side) << shift) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)(((mid - side) << shift) >> 16); - } - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift = unusedBitsPerSample; - int32x4_t wbpsShift0_4; - int32x4_t wbpsShift1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - wbpsShift0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - wbpsShift1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - if (shift == 0) { - for (i = 0; i < frameCount4; ++i) { - uint32x4_t mid; - uint32x4_t side; - int32x4_t left; - int32x4_t right; - mid = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4); - mid = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1))); - left = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1); - right = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1); - left = vshrq_n_s32(left, 16); - right = vshrq_n_s32(right, 16); - drflac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right))); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int16)(((drflac_int32)(mid + side) >> 1) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)(((drflac_int32)(mid - side) >> 1) >> 16); - } - } else { - int32x4_t shift4; - shift -= 1; - shift4 = vdupq_n_s32(shift); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t mid; - uint32x4_t side; - int32x4_t left; - int32x4_t right; - mid = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4); - mid = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1))); - left = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4)); - right = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4)); - left = vshrq_n_s32(left, 16); - right = vshrq_n_s32(right, 16); - drflac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right))); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int16)(((mid + side) << shift) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)(((mid - side) << shift) >> 16); - } - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_mid_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s16__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s16__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int16)((drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)((drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) >> 16); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1; - tempL0 >>= 16; - tempL1 >>= 16; - tempL2 >>= 16; - tempL3 >>= 16; - tempR0 >>= 16; - tempR1 >>= 16; - tempR2 >>= 16; - tempR3 >>= 16; - pOutputSamples[i*8+0] = (drflac_int16)tempL0; - pOutputSamples[i*8+1] = (drflac_int16)tempR0; - pOutputSamples[i*8+2] = (drflac_int16)tempL1; - pOutputSamples[i*8+3] = (drflac_int16)tempR1; - pOutputSamples[i*8+4] = (drflac_int16)tempL2; - pOutputSamples[i*8+5] = (drflac_int16)tempR2; - pOutputSamples[i*8+6] = (drflac_int16)tempL3; - pOutputSamples[i*8+7] = (drflac_int16)tempR3; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int16)((pInputSamples0U32[i] << shift0) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)((pInputSamples1U32[i] << shift1) >> 16); - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - for (i = 0; i < frameCount4; ++i) { - __m128i left = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - left = _mm_srai_epi32(left, 16); - right = _mm_srai_epi32(right, 16); - _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), drflac__mm_packs_interleaved_epi32(left, right)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int16)((pInputSamples0U32[i] << shift0) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)((pInputSamples1U32[i] << shift1) >> 16); - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - int32x4_t shift0_4 = vdupq_n_s32(shift0); - int32x4_t shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - int32x4_t left; - int32x4_t right; - left = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4)); - right = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4)); - left = vshrq_n_s32(left, 16); - right = vshrq_n_s32(right, 16); - drflac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right))); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int16)((pInputSamples0U32[i] << shift0) >> 16); - pOutputSamples[i*2+1] = (drflac_int16)((pInputSamples1U32[i] << shift1) >> 16); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_s16__decode_independent_stereo(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, drflac_int16* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_s16__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_s16__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_s16__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 framesToRead, drflac_int16* pBufferOut) -{ - drflac_uint64 framesRead; - drflac_uint32 unusedBitsPerSample; - if (pFlac == NULL || framesToRead == 0) { - return 0; - } - if (pBufferOut == NULL) { - return drflac__seek_forward_by_pcm_frames(pFlac, framesToRead); - } - DRFLAC_ASSERT(pFlac->bitsPerSample <= 32); - unusedBitsPerSample = 32 - pFlac->bitsPerSample; - framesRead = 0; - while (framesToRead > 0) { - if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) { - if (!drflac__read_and_decode_next_flac_frame(pFlac)) { - break; - } - } else { - unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment); - drflac_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining; - drflac_uint64 frameCountThisIteration = framesToRead; - if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) { - frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining; - } - if (channelCount == 2) { - const drflac_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame; - const drflac_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame; - switch (pFlac->currentFLACFrame.header.channelAssignment) - { - case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE: - { - drflac_read_pcm_frames_s16__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE: - { - drflac_read_pcm_frames_s16__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE: - { - drflac_read_pcm_frames_s16__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: - default: - { - drflac_read_pcm_frames_s16__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - } - } else { - drflac_uint64 i; - for (i = 0; i < frameCountThisIteration; ++i) { - unsigned int j; - for (j = 0; j < channelCount; ++j) { - drflac_int32 sampleS32 = (drflac_int32)((drflac_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample)); - pBufferOut[(i*channelCount)+j] = (drflac_int16)(sampleS32 >> 16); - } - } - } - framesRead += frameCountThisIteration; - pBufferOut += frameCountThisIteration * channelCount; - framesToRead -= frameCountThisIteration; - pFlac->currentPCMFrame += frameCountThisIteration; - pFlac->currentFLACFrame.pcmFramesRemaining -= (drflac_uint32)frameCountThisIteration; - } - } - return framesRead; -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 left = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (float)((drflac_int32)left / 2147483648.0); - pOutputSamples[i*2+1] = (float)((drflac_int32)right / 2147483648.0); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - float factor = 1 / 2147483648.0; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 left0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 left1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 left2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 left3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << shift1; - drflac_uint32 right0 = left0 - side0; - drflac_uint32 right1 = left1 - side1; - drflac_uint32 right2 = left2 - side2; - drflac_uint32 right3 = left3 - side3; - pOutputSamples[i*8+0] = (drflac_int32)left0 * factor; - pOutputSamples[i*8+1] = (drflac_int32)right0 * factor; - pOutputSamples[i*8+2] = (drflac_int32)left1 * factor; - pOutputSamples[i*8+3] = (drflac_int32)right1 * factor; - pOutputSamples[i*8+4] = (drflac_int32)left2 * factor; - pOutputSamples[i*8+5] = (drflac_int32)right2 * factor; - pOutputSamples[i*8+6] = (drflac_int32)left3 * factor; - pOutputSamples[i*8+7] = (drflac_int32)right3 * factor; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (drflac_int32)left * factor; - pOutputSamples[i*2+1] = (drflac_int32)right * factor; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8; - drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8; - __m128 factor; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - factor = _mm_set1_ps(1.0f / 8388608.0f); - for (i = 0; i < frameCount4; ++i) { - __m128i left = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - __m128i right = _mm_sub_epi32(left, side); - __m128 leftf = _mm_mul_ps(_mm_cvtepi32_ps(left), factor); - __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor); - _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf)); - _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (drflac_int32)left / 8388608.0f; - pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f; - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8; - drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8; - float32x4_t factor4; - int32x4_t shift0_4; - int32x4_t shift1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - factor4 = vdupq_n_f32(1.0f / 8388608.0f); - shift0_4 = vdupq_n_s32(shift0); - shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t left; - uint32x4_t side; - uint32x4_t right; - float32x4_t leftf; - float32x4_t rightf; - left = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4); - right = vsubq_u32(left, side); - leftf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(left)), factor4); - rightf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(right)), factor4); - drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 left = pInputSamples0U32[i] << shift0; - drflac_uint32 side = pInputSamples1U32[i] << shift1; - drflac_uint32 right = left - side; - pOutputSamples[i*2+0] = (drflac_int32)left / 8388608.0f; - pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_f32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_f32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - for (i = 0; i < frameCount; ++i) { - drflac_uint32 side = (drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - drflac_uint32 right = (drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (float)((drflac_int32)left / 2147483648.0); - pOutputSamples[i*2+1] = (float)((drflac_int32)right / 2147483648.0); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - float factor = 1 / 2147483648.0; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 side0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 side1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 side2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 side3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 right0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 right1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 right2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 right3 = pInputSamples1U32[i*4+3] << shift1; - drflac_uint32 left0 = right0 + side0; - drflac_uint32 left1 = right1 + side1; - drflac_uint32 left2 = right2 + side2; - drflac_uint32 left3 = right3 + side3; - pOutputSamples[i*8+0] = (drflac_int32)left0 * factor; - pOutputSamples[i*8+1] = (drflac_int32)right0 * factor; - pOutputSamples[i*8+2] = (drflac_int32)left1 * factor; - pOutputSamples[i*8+3] = (drflac_int32)right1 * factor; - pOutputSamples[i*8+4] = (drflac_int32)left2 * factor; - pOutputSamples[i*8+5] = (drflac_int32)right2 * factor; - pOutputSamples[i*8+6] = (drflac_int32)left3 * factor; - pOutputSamples[i*8+7] = (drflac_int32)right3 * factor; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (drflac_int32)left * factor; - pOutputSamples[i*2+1] = (drflac_int32)right * factor; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8; - drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8; - __m128 factor; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - factor = _mm_set1_ps(1.0f / 8388608.0f); - for (i = 0; i < frameCount4; ++i) { - __m128i side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - __m128i left = _mm_add_epi32(right, side); - __m128 leftf = _mm_mul_ps(_mm_cvtepi32_ps(left), factor); - __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor); - _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf)); - _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (drflac_int32)left / 8388608.0f; - pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f; - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8; - drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8; - float32x4_t factor4; - int32x4_t shift0_4; - int32x4_t shift1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - factor4 = vdupq_n_f32(1.0f / 8388608.0f); - shift0_4 = vdupq_n_s32(shift0); - shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t side; - uint32x4_t right; - uint32x4_t left; - float32x4_t leftf; - float32x4_t rightf; - side = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4); - right = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4); - left = vaddq_u32(right, side); - leftf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(left)), factor4); - rightf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(right)), factor4); - drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 side = pInputSamples0U32[i] << shift0; - drflac_uint32 right = pInputSamples1U32[i] << shift1; - drflac_uint32 left = right + side; - pOutputSamples[i*2+0] = (drflac_int32)left / 8388608.0f; - pOutputSamples[i*2+1] = (drflac_int32)right / 8388608.0f; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_f32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_f32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - drflac_uint32 mid = (drflac_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = (drflac_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (float)((((drflac_int32)(mid + side) >> 1) << (unusedBitsPerSample)) / 2147483648.0); - pOutputSamples[i*2+1] = (float)((((drflac_int32)(mid - side) >> 1) << (unusedBitsPerSample)) / 2147483648.0); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift = unusedBitsPerSample; - float factor = 1 / 2147483648.0; - if (shift > 0) { - shift -= 1; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 temp0L; - drflac_uint32 temp1L; - drflac_uint32 temp2L; - drflac_uint32 temp3L; - drflac_uint32 temp0R; - drflac_uint32 temp1R; - drflac_uint32 temp2R; - drflac_uint32 temp3R; - drflac_uint32 mid0 = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid1 = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid2 = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid3 = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid0 = (mid0 << 1) | (side0 & 0x01); - mid1 = (mid1 << 1) | (side1 & 0x01); - mid2 = (mid2 << 1) | (side2 & 0x01); - mid3 = (mid3 << 1) | (side3 & 0x01); - temp0L = (mid0 + side0) << shift; - temp1L = (mid1 + side1) << shift; - temp2L = (mid2 + side2) << shift; - temp3L = (mid3 + side3) << shift; - temp0R = (mid0 - side0) << shift; - temp1R = (mid1 - side1) << shift; - temp2R = (mid2 - side2) << shift; - temp3R = (mid3 - side3) << shift; - pOutputSamples[i*8+0] = (drflac_int32)temp0L * factor; - pOutputSamples[i*8+1] = (drflac_int32)temp0R * factor; - pOutputSamples[i*8+2] = (drflac_int32)temp1L * factor; - pOutputSamples[i*8+3] = (drflac_int32)temp1R * factor; - pOutputSamples[i*8+4] = (drflac_int32)temp2L * factor; - pOutputSamples[i*8+5] = (drflac_int32)temp2R * factor; - pOutputSamples[i*8+6] = (drflac_int32)temp3L * factor; - pOutputSamples[i*8+7] = (drflac_int32)temp3R * factor; - } - } else { - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 temp0L; - drflac_uint32 temp1L; - drflac_uint32 temp2L; - drflac_uint32 temp3L; - drflac_uint32 temp0R; - drflac_uint32 temp1R; - drflac_uint32 temp2R; - drflac_uint32 temp3R; - drflac_uint32 mid0 = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid1 = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid2 = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 mid3 = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - drflac_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid0 = (mid0 << 1) | (side0 & 0x01); - mid1 = (mid1 << 1) | (side1 & 0x01); - mid2 = (mid2 << 1) | (side2 & 0x01); - mid3 = (mid3 << 1) | (side3 & 0x01); - temp0L = (drflac_uint32)((drflac_int32)(mid0 + side0) >> 1); - temp1L = (drflac_uint32)((drflac_int32)(mid1 + side1) >> 1); - temp2L = (drflac_uint32)((drflac_int32)(mid2 + side2) >> 1); - temp3L = (drflac_uint32)((drflac_int32)(mid3 + side3) >> 1); - temp0R = (drflac_uint32)((drflac_int32)(mid0 - side0) >> 1); - temp1R = (drflac_uint32)((drflac_int32)(mid1 - side1) >> 1); - temp2R = (drflac_uint32)((drflac_int32)(mid2 - side2) >> 1); - temp3R = (drflac_uint32)((drflac_int32)(mid3 - side3) >> 1); - pOutputSamples[i*8+0] = (drflac_int32)temp0L * factor; - pOutputSamples[i*8+1] = (drflac_int32)temp0R * factor; - pOutputSamples[i*8+2] = (drflac_int32)temp1L * factor; - pOutputSamples[i*8+3] = (drflac_int32)temp1R * factor; - pOutputSamples[i*8+4] = (drflac_int32)temp2L * factor; - pOutputSamples[i*8+5] = (drflac_int32)temp2R * factor; - pOutputSamples[i*8+6] = (drflac_int32)temp3L * factor; - pOutputSamples[i*8+7] = (drflac_int32)temp3R * factor; - } - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid + side) >> 1) << unusedBitsPerSample) * factor; - pOutputSamples[i*2+1] = (drflac_int32)((drflac_uint32)((drflac_int32)(mid - side) >> 1) << unusedBitsPerSample) * factor; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift = unusedBitsPerSample - 8; - float factor; - __m128 factor128; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - factor = 1.0f / 8388608.0f; - factor128 = _mm_set1_ps(factor); - if (shift == 0) { - for (i = 0; i < frameCount4; ++i) { - __m128i mid; - __m128i side; - __m128i tempL; - __m128i tempR; - __m128 leftf; - __m128 rightf; - mid = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); - tempL = _mm_srai_epi32(_mm_add_epi32(mid, side), 1); - tempR = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1); - leftf = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128); - rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128); - _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf)); - _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = ((drflac_int32)(mid + side) >> 1) * factor; - pOutputSamples[i*2+1] = ((drflac_int32)(mid - side) >> 1) * factor; - } - } else { - shift -= 1; - for (i = 0; i < frameCount4; ++i) { - __m128i mid; - __m128i side; - __m128i tempL; - __m128i tempR; - __m128 leftf; - __m128 rightf; - mid = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - side = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); - tempL = _mm_slli_epi32(_mm_add_epi32(mid, side), shift); - tempR = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift); - leftf = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128); - rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128); - _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf)); - _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift) * factor; - pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift) * factor; - } - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift = unusedBitsPerSample - 8; - float factor; - float32x4_t factor4; - int32x4_t shift4; - int32x4_t wbps0_4; - int32x4_t wbps1_4; - DRFLAC_ASSERT(pFlac->bitsPerSample <= 24); - factor = 1.0f / 8388608.0f; - factor4 = vdupq_n_f32(factor); - wbps0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample); - wbps1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample); - if (shift == 0) { - for (i = 0; i < frameCount4; ++i) { - int32x4_t lefti; - int32x4_t righti; - float32x4_t leftf; - float32x4_t rightf; - uint32x4_t mid = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbps0_4); - uint32x4_t side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbps1_4); - mid = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1))); - lefti = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1); - righti = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1); - leftf = vmulq_f32(vcvtq_f32_s32(lefti), factor4); - rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4); - drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = ((drflac_int32)(mid + side) >> 1) * factor; - pOutputSamples[i*2+1] = ((drflac_int32)(mid - side) >> 1) * factor; - } - } else { - shift -= 1; - shift4 = vdupq_n_s32(shift); - for (i = 0; i < frameCount4; ++i) { - uint32x4_t mid; - uint32x4_t side; - int32x4_t lefti; - int32x4_t righti; - float32x4_t leftf; - float32x4_t rightf; - mid = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbps0_4); - side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbps1_4); - mid = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1))); - lefti = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4)); - righti = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4)); - leftf = vmulq_f32(vcvtq_f32_s32(lefti), factor4); - rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4); - drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - drflac_uint32 mid = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - mid = (mid << 1) | (side & 0x01); - pOutputSamples[i*2+0] = (drflac_int32)((mid + side) << shift) * factor; - pOutputSamples[i*2+1] = (drflac_int32)((mid - side) << shift) * factor; - } - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_f32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_f32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -#if 0 -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - for (drflac_uint64 i = 0; i < frameCount; ++i) { - pOutputSamples[i*2+0] = (float)((drflac_int32)((drflac_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) / 2147483648.0); - pOutputSamples[i*2+1] = (float)((drflac_int32)((drflac_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) / 2147483648.0); - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample; - drflac_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample; - float factor = 1 / 2147483648.0; - for (i = 0; i < frameCount4; ++i) { - drflac_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0; - drflac_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0; - drflac_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0; - drflac_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0; - drflac_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1; - drflac_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1; - drflac_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1; - drflac_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1; - pOutputSamples[i*8+0] = (drflac_int32)tempL0 * factor; - pOutputSamples[i*8+1] = (drflac_int32)tempR0 * factor; - pOutputSamples[i*8+2] = (drflac_int32)tempL1 * factor; - pOutputSamples[i*8+3] = (drflac_int32)tempR1 * factor; - pOutputSamples[i*8+4] = (drflac_int32)tempL2 * factor; - pOutputSamples[i*8+5] = (drflac_int32)tempR2 * factor; - pOutputSamples[i*8+6] = (drflac_int32)tempL3 * factor; - pOutputSamples[i*8+7] = (drflac_int32)tempR3 * factor; - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0) * factor; - pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1) * factor; - } -} -#if defined(DRFLAC_SUPPORT_SSE2) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8; - drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8; - float factor = 1.0f / 8388608.0f; - __m128 factor128 = _mm_set1_ps(factor); - for (i = 0; i < frameCount4; ++i) { - __m128i lefti; - __m128i righti; - __m128 leftf; - __m128 rightf; - lefti = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0); - righti = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1); - leftf = _mm_mul_ps(_mm_cvtepi32_ps(lefti), factor128); - rightf = _mm_mul_ps(_mm_cvtepi32_ps(righti), factor128); - _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf)); - _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0) * factor; - pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1) * factor; - } -} -#endif -#if defined(DRFLAC_SUPPORT_NEON) -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__neon(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ - drflac_uint64 i; - drflac_uint64 frameCount4 = frameCount >> 2; - const drflac_uint32* pInputSamples0U32 = (const drflac_uint32*)pInputSamples0; - const drflac_uint32* pInputSamples1U32 = (const drflac_uint32*)pInputSamples1; - drflac_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8; - drflac_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8; - float factor = 1.0f / 8388608.0f; - float32x4_t factor4 = vdupq_n_f32(factor); - int32x4_t shift0_4 = vdupq_n_s32(shift0); - int32x4_t shift1_4 = vdupq_n_s32(shift1); - for (i = 0; i < frameCount4; ++i) { - int32x4_t lefti; - int32x4_t righti; - float32x4_t leftf; - float32x4_t rightf; - lefti = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4)); - righti = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4)); - leftf = vmulq_f32(vcvtq_f32_s32(lefti), factor4); - rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4); - drflac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf)); - } - for (i = (frameCount4 << 2); i < frameCount; ++i) { - pOutputSamples[i*2+0] = (drflac_int32)(pInputSamples0U32[i] << shift0) * factor; - pOutputSamples[i*2+1] = (drflac_int32)(pInputSamples1U32[i] << shift1) * factor; - } -} -#endif -static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo(drflac* pFlac, drflac_uint64 frameCount, drflac_uint32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) -{ -#if defined(DRFLAC_SUPPORT_SSE2) - if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#elif defined(DRFLAC_SUPPORT_NEON) - if (drflac__gIsNEONSupported && pFlac->bitsPerSample <= 24) { - drflac_read_pcm_frames_f32__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); - } else -#endif - { -#if 0 - drflac_read_pcm_frames_f32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#else - drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); -#endif - } -} -DRFLAC_API drflac_uint64 drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut) -{ - drflac_uint64 framesRead; - drflac_uint32 unusedBitsPerSample; - if (pFlac == NULL || framesToRead == 0) { - return 0; - } - if (pBufferOut == NULL) { - return drflac__seek_forward_by_pcm_frames(pFlac, framesToRead); - } - DRFLAC_ASSERT(pFlac->bitsPerSample <= 32); - unusedBitsPerSample = 32 - pFlac->bitsPerSample; - framesRead = 0; - while (framesToRead > 0) { - if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) { - if (!drflac__read_and_decode_next_flac_frame(pFlac)) { - break; - } - } else { - unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment); - drflac_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining; - drflac_uint64 frameCountThisIteration = framesToRead; - if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) { - frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining; - } - if (channelCount == 2) { - const drflac_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame; - const drflac_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame; - switch (pFlac->currentFLACFrame.header.channelAssignment) - { - case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE: - { - drflac_read_pcm_frames_f32__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE: - { - drflac_read_pcm_frames_f32__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE: - { - drflac_read_pcm_frames_f32__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: - default: - { - drflac_read_pcm_frames_f32__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); - } break; - } - } else { - drflac_uint64 i; - for (i = 0; i < frameCountThisIteration; ++i) { - unsigned int j; - for (j = 0; j < channelCount; ++j) { - drflac_int32 sampleS32 = (drflac_int32)((drflac_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample)); - pBufferOut[(i*channelCount)+j] = (float)(sampleS32 / 2147483648.0); - } - } - } - framesRead += frameCountThisIteration; - pBufferOut += frameCountThisIteration * channelCount; - framesToRead -= frameCountThisIteration; - pFlac->currentPCMFrame += frameCountThisIteration; - pFlac->currentFLACFrame.pcmFramesRemaining -= (unsigned int)frameCountThisIteration; - } - } - return framesRead; -} -DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex) -{ - if (pFlac == NULL) { - return DRFLAC_FALSE; - } - if (pFlac->currentPCMFrame == pcmFrameIndex) { - return DRFLAC_TRUE; - } - if (pFlac->firstFLACFramePosInBytes == 0) { - return DRFLAC_FALSE; - } - if (pcmFrameIndex == 0) { - pFlac->currentPCMFrame = 0; - return drflac__seek_to_first_frame(pFlac); - } else { - drflac_bool32 wasSuccessful = DRFLAC_FALSE; - drflac_uint64 originalPCMFrame = pFlac->currentPCMFrame; - if (pcmFrameIndex > pFlac->totalPCMFrameCount) { - pcmFrameIndex = pFlac->totalPCMFrameCount; - } - if (pcmFrameIndex > pFlac->currentPCMFrame) { - drflac_uint32 offset = (drflac_uint32)(pcmFrameIndex - pFlac->currentPCMFrame); - if (pFlac->currentFLACFrame.pcmFramesRemaining > offset) { - pFlac->currentFLACFrame.pcmFramesRemaining -= offset; - pFlac->currentPCMFrame = pcmFrameIndex; - return DRFLAC_TRUE; - } - } else { - drflac_uint32 offsetAbs = (drflac_uint32)(pFlac->currentPCMFrame - pcmFrameIndex); - drflac_uint32 currentFLACFramePCMFrameCount = pFlac->currentFLACFrame.header.blockSizeInPCMFrames; - drflac_uint32 currentFLACFramePCMFramesConsumed = currentFLACFramePCMFrameCount - pFlac->currentFLACFrame.pcmFramesRemaining; - if (currentFLACFramePCMFramesConsumed > offsetAbs) { - pFlac->currentFLACFrame.pcmFramesRemaining += offsetAbs; - pFlac->currentPCMFrame = pcmFrameIndex; - return DRFLAC_TRUE; - } - } -#ifndef DR_FLAC_NO_OGG - if (pFlac->container == drflac_container_ogg) - { - wasSuccessful = drflac_ogg__seek_to_pcm_frame(pFlac, pcmFrameIndex); - } - else -#endif - { - if (!pFlac->_noSeekTableSeek) { - wasSuccessful = drflac__seek_to_pcm_frame__seek_table(pFlac, pcmFrameIndex); - } -#if !defined(DR_FLAC_NO_CRC) - if (!wasSuccessful && !pFlac->_noBinarySearchSeek && pFlac->totalPCMFrameCount > 0) { - wasSuccessful = drflac__seek_to_pcm_frame__binary_search(pFlac, pcmFrameIndex); - } -#endif - if (!wasSuccessful && !pFlac->_noBruteForceSeek) { - wasSuccessful = drflac__seek_to_pcm_frame__brute_force(pFlac, pcmFrameIndex); - } - } - if (wasSuccessful) { - pFlac->currentPCMFrame = pcmFrameIndex; - } else { - if (drflac_seek_to_pcm_frame(pFlac, originalPCMFrame) == DRFLAC_FALSE) { - drflac_seek_to_pcm_frame(pFlac, 0); - } - } - return wasSuccessful; - } -} -#if defined(SIZE_MAX) - #define DRFLAC_SIZE_MAX SIZE_MAX -#else - #if defined(DRFLAC_64BIT) - #define DRFLAC_SIZE_MAX ((drflac_uint64)0xFFFFFFFFFFFFFFFF) - #else - #define DRFLAC_SIZE_MAX 0xFFFFFFFF - #endif -#endif -#define DRFLAC_DEFINE_FULL_READ_AND_CLOSE(extension, type) \ -static type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut)\ -{ \ - type* pSampleData = NULL; \ - drflac_uint64 totalPCMFrameCount; \ - \ - DRFLAC_ASSERT(pFlac != NULL); \ - \ - totalPCMFrameCount = pFlac->totalPCMFrameCount; \ - \ - if (totalPCMFrameCount == 0) { \ - type buffer[4096]; \ - drflac_uint64 pcmFramesRead; \ - size_t sampleDataBufferSize = sizeof(buffer); \ - \ - pSampleData = (type*)drflac__malloc_from_callbacks(sampleDataBufferSize, &pFlac->allocationCallbacks); \ - if (pSampleData == NULL) { \ - goto on_error; \ - } \ - \ - while ((pcmFramesRead = (drflac_uint64)drflac_read_pcm_frames_##extension(pFlac, sizeof(buffer)/sizeof(buffer[0])/pFlac->channels, buffer)) > 0) { \ - if (((totalPCMFrameCount + pcmFramesRead) * pFlac->channels * sizeof(type)) > sampleDataBufferSize) { \ - type* pNewSampleData; \ - size_t newSampleDataBufferSize; \ - \ - newSampleDataBufferSize = sampleDataBufferSize * 2; \ - pNewSampleData = (type*)drflac__realloc_from_callbacks(pSampleData, newSampleDataBufferSize, sampleDataBufferSize, &pFlac->allocationCallbacks); \ - if (pNewSampleData == NULL) { \ - drflac__free_from_callbacks(pSampleData, &pFlac->allocationCallbacks); \ - goto on_error; \ - } \ - \ - sampleDataBufferSize = newSampleDataBufferSize; \ - pSampleData = pNewSampleData; \ - } \ - \ - DRFLAC_COPY_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), buffer, (size_t)(pcmFramesRead*pFlac->channels*sizeof(type))); \ - totalPCMFrameCount += pcmFramesRead; \ - } \ - \ - \ - DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ - } else { \ - drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \ - if (dataSize > (drflac_uint64)DRFLAC_SIZE_MAX) { \ - goto on_error; \ - } \ - \ - pSampleData = (type*)drflac__malloc_from_callbacks((size_t)dataSize, &pFlac->allocationCallbacks); \ - if (pSampleData == NULL) { \ - goto on_error; \ - } \ - \ - totalPCMFrameCount = drflac_read_pcm_frames_##extension(pFlac, pFlac->totalPCMFrameCount, pSampleData); \ - } \ - \ - if (sampleRateOut) *sampleRateOut = pFlac->sampleRate; \ - if (channelsOut) *channelsOut = pFlac->channels; \ - if (totalPCMFrameCountOut) *totalPCMFrameCountOut = totalPCMFrameCount; \ - \ - drflac_close(pFlac); \ - return pSampleData; \ - \ -on_error: \ - drflac_close(pFlac); \ - return NULL; \ -} -DRFLAC_DEFINE_FULL_READ_AND_CLOSE(s32, drflac_int32) -DRFLAC_DEFINE_FULL_READ_AND_CLOSE(s16, drflac_int16) -DRFLAC_DEFINE_FULL_READ_AND_CLOSE(f32, float) -DRFLAC_API drflac_int32* drflac_open_and_read_pcm_frames_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalPCMFrameCountOut) { - *totalPCMFrameCountOut = 0; - } - pFlac = drflac_open(onRead, onSeek, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_s32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); -} -DRFLAC_API drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalPCMFrameCountOut) { - *totalPCMFrameCountOut = 0; - } - pFlac = drflac_open(onRead, onSeek, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_s16(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); -} -DRFLAC_API float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (channelsOut) { - *channelsOut = 0; - } - if (sampleRateOut) { - *sampleRateOut = 0; - } - if (totalPCMFrameCountOut) { - *totalPCMFrameCountOut = 0; - } - pFlac = drflac_open(onRead, onSeek, pUserData, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_f32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); -} -#ifndef DR_FLAC_NO_STDIO -DRFLAC_API drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - pFlac = drflac_open_file(filename, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount); -} -DRFLAC_API drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - pFlac = drflac_open_file(filename, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount); -} -DRFLAC_API float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - pFlac = drflac_open_file(filename, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount); -} -#endif -DRFLAC_API drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - pFlac = drflac_open_memory(data, dataSize, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount); -} -DRFLAC_API drflac_int16* drflac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - pFlac = drflac_open_memory(data, dataSize, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount); -} -DRFLAC_API float* drflac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - drflac* pFlac; - if (sampleRate) { - *sampleRate = 0; - } - if (channels) { - *channels = 0; - } - if (totalPCMFrameCount) { - *totalPCMFrameCount = 0; - } - pFlac = drflac_open_memory(data, dataSize, pAllocationCallbacks); - if (pFlac == NULL) { - return NULL; - } - return drflac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount); -} -DRFLAC_API void drflac_free(void* p, const drflac_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - drflac__free_from_callbacks(p, pAllocationCallbacks); - } else { - drflac__free_default(p, NULL); - } -} -DRFLAC_API void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, drflac_uint32 commentCount, const void* pComments) -{ - if (pIter == NULL) { - return; - } - pIter->countRemaining = commentCount; - pIter->pRunningData = (const char*)pComments; -} -DRFLAC_API const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, drflac_uint32* pCommentLengthOut) -{ - drflac_int32 length; - const char* pComment; - if (pCommentLengthOut) { - *pCommentLengthOut = 0; - } - if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) { - return NULL; - } - length = drflac__le2host_32_ptr_unaligned(pIter->pRunningData); - pIter->pRunningData += 4; - pComment = pIter->pRunningData; - pIter->pRunningData += length; - pIter->countRemaining -= 1; - if (pCommentLengthOut) { - *pCommentLengthOut = length; - } - return pComment; -} -DRFLAC_API void drflac_init_cuesheet_track_iterator(drflac_cuesheet_track_iterator* pIter, drflac_uint32 trackCount, const void* pTrackData) -{ - if (pIter == NULL) { - return; - } - pIter->countRemaining = trackCount; - pIter->pRunningData = (const char*)pTrackData; -} -DRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, drflac_cuesheet_track* pCuesheetTrack) -{ - drflac_cuesheet_track cuesheetTrack; - const char* pRunningData; - drflac_uint64 offsetHi; - drflac_uint64 offsetLo; - if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) { - return DRFLAC_FALSE; - } - pRunningData = pIter->pRunningData; - offsetHi = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; - offsetLo = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; - cuesheetTrack.offset = offsetLo | (offsetHi << 32); - cuesheetTrack.trackNumber = pRunningData[0]; pRunningData += 1; - DRFLAC_COPY_MEMORY(cuesheetTrack.ISRC, pRunningData, sizeof(cuesheetTrack.ISRC)); pRunningData += 12; - cuesheetTrack.isAudio = (pRunningData[0] & 0x80) != 0; - cuesheetTrack.preEmphasis = (pRunningData[0] & 0x40) != 0; pRunningData += 14; - cuesheetTrack.indexCount = pRunningData[0]; pRunningData += 1; - cuesheetTrack.pIndexPoints = (const drflac_cuesheet_track_index*)pRunningData; pRunningData += cuesheetTrack.indexCount * sizeof(drflac_cuesheet_track_index); - pIter->pRunningData = pRunningData; - pIter->countRemaining -= 1; - if (pCuesheetTrack) { - *pCuesheetTrack = cuesheetTrack; - } - return DRFLAC_TRUE; -} -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) - #pragma GCC diagnostic pop -#endif -#endif -/* dr_flac_c end */ -#endif /* DRFLAC_IMPLEMENTATION */ -#endif /* MA_NO_FLAC */ - -#if !defined(MA_NO_MP3) && !defined(MA_NO_DECODING) -#if !defined(DR_MP3_IMPLEMENTATION) && !defined(DRMP3_IMPLEMENTATION) /* For backwards compatibility. Will be removed in version 0.11 for cleanliness. */ -/* dr_mp3_c begin */ -#ifndef dr_mp3_c -#define dr_mp3_c -#include -#include -#include -DRMP3_API void drmp3_version(drmp3_uint32* pMajor, drmp3_uint32* pMinor, drmp3_uint32* pRevision) -{ - if (pMajor) { - *pMajor = DRMP3_VERSION_MAJOR; - } - if (pMinor) { - *pMinor = DRMP3_VERSION_MINOR; - } - if (pRevision) { - *pRevision = DRMP3_VERSION_REVISION; - } -} -DRMP3_API const char* drmp3_version_string(void) -{ - return DRMP3_VERSION_STRING; -} -#if defined(__TINYC__) -#define DR_MP3_NO_SIMD -#endif -#define DRMP3_OFFSET_PTR(p, offset) ((void*)((drmp3_uint8*)(p) + (offset))) -#define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE 2304 -#ifndef DRMP3_MAX_FRAME_SYNC_MATCHES -#define DRMP3_MAX_FRAME_SYNC_MATCHES 10 -#endif -#define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES DRMP3_MAX_FREE_FORMAT_FRAME_SIZE -#define DRMP3_MAX_BITRESERVOIR_BYTES 511 -#define DRMP3_SHORT_BLOCK_TYPE 2 -#define DRMP3_STOP_BLOCK_TYPE 3 -#define DRMP3_MODE_MONO 3 -#define DRMP3_MODE_JOINT_STEREO 1 -#define DRMP3_HDR_SIZE 4 -#define DRMP3_HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0) -#define DRMP3_HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60) -#define DRMP3_HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0) -#define DRMP3_HDR_IS_CRC(h) (!((h[1]) & 1)) -#define DRMP3_HDR_TEST_PADDING(h) ((h[2]) & 0x2) -#define DRMP3_HDR_TEST_MPEG1(h) ((h[1]) & 0x8) -#define DRMP3_HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10) -#define DRMP3_HDR_TEST_I_STEREO(h) ((h[3]) & 0x10) -#define DRMP3_HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20) -#define DRMP3_HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3) -#define DRMP3_HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3) -#define DRMP3_HDR_GET_LAYER(h) (((h[1]) >> 1) & 3) -#define DRMP3_HDR_GET_BITRATE(h) ((h[2]) >> 4) -#define DRMP3_HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3) -#define DRMP3_HDR_GET_MY_SAMPLE_RATE(h) (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3) -#define DRMP3_HDR_IS_FRAME_576(h) ((h[1] & 14) == 2) -#define DRMP3_HDR_IS_LAYER_1(h) ((h[1] & 6) == 6) -#define DRMP3_BITS_DEQUANTIZER_OUT -1 -#define DRMP3_MAX_SCF (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210) -#define DRMP3_MAX_SCFI ((DRMP3_MAX_SCF + 3) & ~3) -#define DRMP3_MIN(a, b) ((a) > (b) ? (b) : (a)) -#define DRMP3_MAX(a, b) ((a) < (b) ? (b) : (a)) -#if !defined(DR_MP3_NO_SIMD) -#if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64)) -#define DR_MP3_ONLY_SIMD -#endif -#if ((defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__)) -#if defined(_MSC_VER) -#include -#endif -#include -#define DRMP3_HAVE_SSE 1 -#define DRMP3_HAVE_SIMD 1 -#define DRMP3_VSTORE _mm_storeu_ps -#define DRMP3_VLD _mm_loadu_ps -#define DRMP3_VSET _mm_set1_ps -#define DRMP3_VADD _mm_add_ps -#define DRMP3_VSUB _mm_sub_ps -#define DRMP3_VMUL _mm_mul_ps -#define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y)) -#define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y)) -#define DRMP3_VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s)) -#define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3)) -typedef __m128 drmp3_f4; -#if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD) -#define drmp3_cpuid __cpuid -#else -static __inline__ __attribute__((always_inline)) void drmp3_cpuid(int CPUInfo[], const int InfoType) -{ -#if defined(__PIC__) - __asm__ __volatile__( -#if defined(__x86_64__) - "push %%rbx\n" - "cpuid\n" - "xchgl %%ebx, %1\n" - "pop %%rbx\n" -#else - "xchgl %%ebx, %1\n" - "cpuid\n" - "xchgl %%ebx, %1\n" -#endif - : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) - : "a" (InfoType)); -#else - __asm__ __volatile__( - "cpuid" - : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) - : "a" (InfoType)); -#endif -} -#endif -static int drmp3_have_simd(void) -{ -#ifdef DR_MP3_ONLY_SIMD - return 1; -#else - static int g_have_simd; - int CPUInfo[4]; -#ifdef MINIMP3_TEST - static int g_counter; - if (g_counter++ > 100) - return 0; -#endif - if (g_have_simd) - goto end; - drmp3_cpuid(CPUInfo, 0); - if (CPUInfo[0] > 0) - { - drmp3_cpuid(CPUInfo, 1); - g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; - return g_have_simd - 1; - } -end: - return g_have_simd - 1; -#endif -} -#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64) -#include -#define DRMP3_HAVE_SSE 0 -#define DRMP3_HAVE_SIMD 1 -#define DRMP3_VSTORE vst1q_f32 -#define DRMP3_VLD vld1q_f32 -#define DRMP3_VSET vmovq_n_f32 -#define DRMP3_VADD vaddq_f32 -#define DRMP3_VSUB vsubq_f32 -#define DRMP3_VMUL vmulq_f32 -#define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y) -#define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y) -#define DRMP3_VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s)) -#define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x))) -typedef float32x4_t drmp3_f4; -static int drmp3_have_simd(void) -{ - return 1; -} -#else -#define DRMP3_HAVE_SSE 0 -#define DRMP3_HAVE_SIMD 0 -#ifdef DR_MP3_ONLY_SIMD -#error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled -#endif -#endif -#else -#define DRMP3_HAVE_SIMD 0 -#endif -#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64) -#define DRMP3_HAVE_ARMV6 1 -static __inline__ __attribute__((always_inline)) drmp3_int32 drmp3_clip_int16_arm(drmp3_int32 a) -{ - drmp3_int32 x = 0; - __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a)); - return x; -} -#else -#define DRMP3_HAVE_ARMV6 0 -#endif -#ifndef DRMP3_ASSERT -#include -#define DRMP3_ASSERT(expression) assert(expression) -#endif -#ifndef DRMP3_COPY_MEMORY -#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) -#endif -#ifndef DRMP3_MOVE_MEMORY -#define DRMP3_MOVE_MEMORY(dst, src, sz) memmove((dst), (src), (sz)) -#endif -#ifndef DRMP3_ZERO_MEMORY -#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) -#endif -#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p))) -#ifndef DRMP3_MALLOC -#define DRMP3_MALLOC(sz) malloc((sz)) -#endif -#ifndef DRMP3_REALLOC -#define DRMP3_REALLOC(p, sz) realloc((p), (sz)) -#endif -#ifndef DRMP3_FREE -#define DRMP3_FREE(p) free((p)) -#endif -typedef struct -{ - const drmp3_uint8 *buf; - int pos, limit; -} drmp3_bs; -typedef struct -{ - float scf[3*64]; - drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64]; -} drmp3_L12_scale_info; -typedef struct -{ - drmp3_uint8 tab_offset, code_tab_width, band_count; -} drmp3_L12_subband_alloc; -typedef struct -{ - const drmp3_uint8 *sfbtab; - drmp3_uint16 part_23_length, big_values, scalefac_compress; - drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; - drmp3_uint8 table_select[3], region_count[3], subblock_gain[3]; - drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi; -} drmp3_L3_gr_info; -typedef struct -{ - drmp3_bs bs; - drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES]; - drmp3_L3_gr_info gr_info[4]; - float grbuf[2][576], scf[40], syn[18 + 15][2*32]; - drmp3_uint8 ist_pos[2][39]; -} drmp3dec_scratch; -static void drmp3_bs_init(drmp3_bs *bs, const drmp3_uint8 *data, int bytes) -{ - bs->buf = data; - bs->pos = 0; - bs->limit = bytes*8; -} -static drmp3_uint32 drmp3_bs_get_bits(drmp3_bs *bs, int n) -{ - drmp3_uint32 next, cache = 0, s = bs->pos & 7; - int shl = n + s; - const drmp3_uint8 *p = bs->buf + (bs->pos >> 3); - if ((bs->pos += n) > bs->limit) - return 0; - next = *p++ & (255 >> s); - while ((shl -= 8) > 0) - { - cache |= next << shl; - next = *p++; - } - return cache | (next >> -shl); -} -static int drmp3_hdr_valid(const drmp3_uint8 *h) -{ - return h[0] == 0xff && - ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) && - (DRMP3_HDR_GET_LAYER(h) != 0) && - (DRMP3_HDR_GET_BITRATE(h) != 15) && - (DRMP3_HDR_GET_SAMPLE_RATE(h) != 3); -} -static int drmp3_hdr_compare(const drmp3_uint8 *h1, const drmp3_uint8 *h2) -{ - return drmp3_hdr_valid(h2) && - ((h1[1] ^ h2[1]) & 0xFE) == 0 && - ((h1[2] ^ h2[2]) & 0x0C) == 0 && - !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2)); -} -static unsigned drmp3_hdr_bitrate_kbps(const drmp3_uint8 *h) -{ - static const drmp3_uint8 halfrate[2][3][15] = { - { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } }, - { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } }, - }; - return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(h)][DRMP3_HDR_GET_LAYER(h) - 1][DRMP3_HDR_GET_BITRATE(h)]; -} -static unsigned drmp3_hdr_sample_rate_hz(const drmp3_uint8 *h) -{ - static const unsigned g_hz[3] = { 44100, 48000, 32000 }; - return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(h)] >> (int)!DRMP3_HDR_TEST_MPEG1(h) >> (int)!DRMP3_HDR_TEST_NOT_MPEG25(h); -} -static unsigned drmp3_hdr_frame_samples(const drmp3_uint8 *h) -{ - return DRMP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)DRMP3_HDR_IS_FRAME_576(h)); -} -static int drmp3_hdr_frame_bytes(const drmp3_uint8 *h, int free_format_size) -{ - int frame_bytes = drmp3_hdr_frame_samples(h)*drmp3_hdr_bitrate_kbps(h)*125/drmp3_hdr_sample_rate_hz(h); - if (DRMP3_HDR_IS_LAYER_1(h)) - { - frame_bytes &= ~3; - } - return frame_bytes ? frame_bytes : free_format_size; -} -static int drmp3_hdr_padding(const drmp3_uint8 *h) -{ - return DRMP3_HDR_TEST_PADDING(h) ? (DRMP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0; -} -#ifndef DR_MP3_ONLY_MP3 -static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci) -{ - const drmp3_L12_subband_alloc *alloc; - int mode = DRMP3_HDR_GET_STEREO_MODE(hdr); - int nbands, stereo_bands = (mode == DRMP3_MODE_MONO) ? 0 : (mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32; - if (DRMP3_HDR_IS_LAYER_1(hdr)) - { - static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } }; - alloc = g_alloc_L1; - nbands = 32; - } else if (!DRMP3_HDR_TEST_MPEG1(hdr)) - { - static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } }; - alloc = g_alloc_L2M2; - nbands = 30; - } else - { - static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } }; - int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr); - unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (int)(mode != DRMP3_MODE_MONO); - if (!kbps) - { - kbps = 192; - } - alloc = g_alloc_L2M1; - nbands = 27; - if (kbps < 56) - { - static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } }; - alloc = g_alloc_L2M1_lowrate; - nbands = sample_rate_idx == 2 ? 12 : 8; - } else if (kbps >= 96 && sample_rate_idx != 1) - { - nbands = 30; - } - } - sci->total_bands = (drmp3_uint8)nbands; - sci->stereo_bands = (drmp3_uint8)DRMP3_MIN(stereo_bands, nbands); - return alloc; -} -static void drmp3_L12_read_scalefactors(drmp3_bs *bs, drmp3_uint8 *pba, drmp3_uint8 *scfcod, int bands, float *scf) -{ - static const float g_deq_L12[18*3] = { -#define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x - DRMP3_DQ(3),DRMP3_DQ(7),DRMP3_DQ(15),DRMP3_DQ(31),DRMP3_DQ(63),DRMP3_DQ(127),DRMP3_DQ(255),DRMP3_DQ(511),DRMP3_DQ(1023),DRMP3_DQ(2047),DRMP3_DQ(4095),DRMP3_DQ(8191),DRMP3_DQ(16383),DRMP3_DQ(32767),DRMP3_DQ(65535),DRMP3_DQ(3),DRMP3_DQ(5),DRMP3_DQ(9) - }; - int i, m; - for (i = 0; i < bands; i++) - { - float s = 0; - int ba = *pba++; - int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0; - for (m = 4; m; m >>= 1) - { - if (mask & m) - { - int b = drmp3_bs_get_bits(bs, 6); - s = g_deq_L12[ba*3 - 6 + b % 3]*(int)(1 << 21 >> b/3); - } - *scf++ = s; - } - } -} -static void drmp3_L12_read_scale_info(const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci) -{ - static const drmp3_uint8 g_bitalloc_code_tab[] = { - 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16, - 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16, - 0,17,18, 3,19,4,5,16, - 0,17,18,16, - 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15, - 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14, - 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16 - }; - const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci); - int i, k = 0, ba_bits = 0; - const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab; - for (i = 0; i < sci->total_bands; i++) - { - drmp3_uint8 ba; - if (i == k) - { - k += subband_alloc->band_count; - ba_bits = subband_alloc->code_tab_width; - ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset; - subband_alloc++; - } - ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)]; - sci->bitalloc[2*i] = ba; - if (i < sci->stereo_bands) - { - ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)]; - } - sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0; - } - for (i = 0; i < 2*sci->total_bands; i++) - { - sci->scfcod[i] = (drmp3_uint8)(sci->bitalloc[i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6); - } - drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf); - for (i = sci->stereo_bands; i < sci->total_bands; i++) - { - sci->bitalloc[2*i + 1] = 0; - } -} -static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci, int group_size) -{ - int i, j, k, choff = 576; - for (j = 0; j < 4; j++) - { - float *dst = grbuf + group_size*j; - for (i = 0; i < 2*sci->total_bands; i++) - { - int ba = sci->bitalloc[i]; - if (ba != 0) - { - if (ba < 17) - { - int half = (1 << (ba - 1)) - 1; - for (k = 0; k < group_size; k++) - { - dst[k] = (float)((int)drmp3_bs_get_bits(bs, ba) - half); - } - } else - { - unsigned mod = (2 << (ba - 17)) + 1; - unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3)); - for (k = 0; k < group_size; k++, code /= mod) - { - dst[k] = (float)((int)(code % mod - mod/2)); - } - } - } - dst += choff; - choff = 18 - choff; - } - } - return group_size*4; -} -static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst) -{ - int i, k; - DRMP3_COPY_MEMORY(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float)); - for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6) - { - for (k = 0; k < 12; k++) - { - dst[k + 0] *= scf[0]; - dst[k + 576] *= scf[3]; - } - } -} -#endif -static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr) -{ - static const drmp3_uint8 g_scf_long[8][23] = { - { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, - { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 }, - { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, - { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 }, - { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, - { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 }, - { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 }, - { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 } - }; - static const drmp3_uint8 g_scf_short[8][40] = { - { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, - { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, - { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, - { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, - { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, - { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } - }; - static const drmp3_uint8 g_scf_mixed[8][40] = { - { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, - { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, - { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, - { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, - { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, - { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } - }; - unsigned tables, scfsi = 0; - int main_data_begin, part_23_sum = 0; - int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2; - int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0); - if (DRMP3_HDR_TEST_MPEG1(hdr)) - { - gr_count *= 2; - main_data_begin = drmp3_bs_get_bits(bs, 9); - scfsi = drmp3_bs_get_bits(bs, 7 + gr_count); - } else - { - main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count; - } - do - { - if (DRMP3_HDR_IS_MONO(hdr)) - { - scfsi <<= 4; - } - gr->part_23_length = (drmp3_uint16)drmp3_bs_get_bits(bs, 12); - part_23_sum += gr->part_23_length; - gr->big_values = (drmp3_uint16)drmp3_bs_get_bits(bs, 9); - if (gr->big_values > 288) - { - return -1; - } - gr->global_gain = (drmp3_uint8)drmp3_bs_get_bits(bs, 8); - gr->scalefac_compress = (drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9); - gr->sfbtab = g_scf_long[sr_idx]; - gr->n_long_sfb = 22; - gr->n_short_sfb = 0; - if (drmp3_bs_get_bits(bs, 1)) - { - gr->block_type = (drmp3_uint8)drmp3_bs_get_bits(bs, 2); - if (!gr->block_type) - { - return -1; - } - gr->mixed_block_flag = (drmp3_uint8)drmp3_bs_get_bits(bs, 1); - gr->region_count[0] = 7; - gr->region_count[1] = 255; - if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE) - { - scfsi &= 0x0F0F; - if (!gr->mixed_block_flag) - { - gr->region_count[0] = 8; - gr->sfbtab = g_scf_short[sr_idx]; - gr->n_long_sfb = 0; - gr->n_short_sfb = 39; - } else - { - gr->sfbtab = g_scf_mixed[sr_idx]; - gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6; - gr->n_short_sfb = 30; - } - } - tables = drmp3_bs_get_bits(bs, 10); - tables <<= 5; - gr->subblock_gain[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); - gr->subblock_gain[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); - gr->subblock_gain[2] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); - } else - { - gr->block_type = 0; - gr->mixed_block_flag = 0; - tables = drmp3_bs_get_bits(bs, 15); - gr->region_count[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 4); - gr->region_count[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); - gr->region_count[2] = 255; - } - gr->table_select[0] = (drmp3_uint8)(tables >> 10); - gr->table_select[1] = (drmp3_uint8)((tables >> 5) & 31); - gr->table_select[2] = (drmp3_uint8)((tables) & 31); - gr->preflag = (drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500)); - gr->scalefac_scale = (drmp3_uint8)drmp3_bs_get_bits(bs, 1); - gr->count1_table = (drmp3_uint8)drmp3_bs_get_bits(bs, 1); - gr->scfsi = (drmp3_uint8)((scfsi >> 12) & 15); - scfsi <<= 4; - gr++; - } while(--gr_count); - if (part_23_sum + bs->pos > bs->limit + main_data_begin*8) - { - return -1; - } - return main_data_begin; -} -static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, const drmp3_uint8 *scf_size, const drmp3_uint8 *scf_count, drmp3_bs *bitbuf, int scfsi) -{ - int i, k; - for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2) - { - int cnt = scf_count[i]; - if (scfsi & 8) - { - DRMP3_COPY_MEMORY(scf, ist_pos, cnt); - } else - { - int bits = scf_size[i]; - if (!bits) - { - DRMP3_ZERO_MEMORY(scf, cnt); - DRMP3_ZERO_MEMORY(ist_pos, cnt); - } else - { - int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; - for (k = 0; k < cnt; k++) - { - int s = drmp3_bs_get_bits(bitbuf, bits); - ist_pos[k] = (drmp3_uint8)(s == max_scf ? -1 : s); - scf[k] = (drmp3_uint8)s; - } - } - } - ist_pos += cnt; - scf += cnt; - } - scf[0] = scf[1] = scf[2] = 0; -} -static float drmp3_L3_ldexp_q2(float y, int exp_q2) -{ - static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f }; - int e; - do - { - e = DRMP3_MIN(30*4, exp_q2); - y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2)); - } while ((exp_q2 -= e) > 0); - return y; -} -static void drmp3_L3_decode_scalefactors(const drmp3_uint8 *hdr, drmp3_uint8 *ist_pos, drmp3_bs *bs, const drmp3_L3_gr_info *gr, float *scf, int ch) -{ - static const drmp3_uint8 g_scf_partitions[3][28] = { - { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 }, - { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 }, - { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 } - }; - const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb]; - drmp3_uint8 scf_size[4], iscf[40]; - int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi; - float gain; - if (DRMP3_HDR_TEST_MPEG1(hdr)) - { - static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 }; - int part = g_scfc_decode[gr->scalefac_compress]; - scf_size[1] = scf_size[0] = (drmp3_uint8)(part >> 2); - scf_size[3] = scf_size[2] = (drmp3_uint8)(part & 3); - } else - { - static const drmp3_uint8 g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 }; - int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch; - sfc = gr->scalefac_compress >> ist; - for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4) - { - for (modprod = 1, i = 3; i >= 0; i--) - { - scf_size[i] = (drmp3_uint8)(sfc / modprod % g_mod[k + i]); - modprod *= g_mod[k + i]; - } - } - scf_partition += k; - scfsi = -16; - } - drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi); - if (gr->n_short_sfb) - { - int sh = 3 - scf_shift; - for (i = 0; i < gr->n_short_sfb; i += 3) - { - iscf[gr->n_long_sfb + i + 0] = (drmp3_uint8)(iscf[gr->n_long_sfb + i + 0] + (gr->subblock_gain[0] << sh)); - iscf[gr->n_long_sfb + i + 1] = (drmp3_uint8)(iscf[gr->n_long_sfb + i + 1] + (gr->subblock_gain[1] << sh)); - iscf[gr->n_long_sfb + i + 2] = (drmp3_uint8)(iscf[gr->n_long_sfb + i + 2] + (gr->subblock_gain[2] << sh)); - } - } else if (gr->preflag) - { - static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 }; - for (i = 0; i < 10; i++) - { - iscf[11 + i] = (drmp3_uint8)(iscf[11 + i] + g_preamp[i]); - } - } - gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0); - gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4), DRMP3_MAX_SCFI - gain_exp); - for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++) - { - scf[i] = drmp3_L3_ldexp_q2(gain, iscf[i] << scf_shift); - } -} -static const float g_drmp3_pow43[129 + 16] = { - 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, - 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f -}; -static float drmp3_L3_pow_43(int x) -{ - float frac; - int sign, mult = 256; - if (x < 129) - { - return g_drmp3_pow43[16 + x]; - } - if (x < 1024) - { - mult = 16; - x <<= 3; - } - sign = 2*x & 64; - frac = (float)((x & 63) - sign) / ((x & ~63) + sign); - return g_drmp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult; -} -static void drmp3_L3_huffman(float *dst, drmp3_bs *bs, const drmp3_L3_gr_info *gr_info, const float *scf, int layer3gr_limit) -{ - static const drmp3_int16 tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, - -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288, - -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288, - -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258, - -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259, - -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258, - -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258, - -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259, - -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258, - -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290, - -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259, - -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258, - -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259, - -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258, - -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 }; - static const drmp3_uint8 tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205}; - static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 }; - static const drmp3_int16 tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 }; - static const drmp3_uint8 g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 }; -#define DRMP3_PEEK_BITS(n) (bs_cache >> (32 - n)) -#define DRMP3_FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); } -#define DRMP3_CHECK_BITS while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } -#define DRMP3_BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh) - float one = 0.0f; - int ireg = 0, big_val_cnt = gr_info->big_values; - const drmp3_uint8 *sfb = gr_info->sfbtab; - const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8; - drmp3_uint32 bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7); - int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8; - bs_next_ptr += 4; - while (big_val_cnt > 0) - { - int tab_num = gr_info->table_select[ireg]; - int sfb_cnt = gr_info->region_count[ireg++]; - const drmp3_int16 *codebook = tabs + tabindex[tab_num]; - int linbits = g_linbits[tab_num]; - if (linbits) - { - do - { - np = *sfb++ / 2; - pairs_to_decode = DRMP3_MIN(big_val_cnt, np); - one = *scf++; - do - { - int j, w = 5; - int leaf = codebook[DRMP3_PEEK_BITS(w)]; - while (leaf < 0) - { - DRMP3_FLUSH_BITS(w); - w = leaf & 7; - leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)]; - } - DRMP3_FLUSH_BITS(leaf >> 8); - for (j = 0; j < 2; j++, dst++, leaf >>= 4) - { - int lsb = leaf & 0x0F; - if (lsb == 15) - { - lsb += DRMP3_PEEK_BITS(linbits); - DRMP3_FLUSH_BITS(linbits); - DRMP3_CHECK_BITS; - *dst = one*drmp3_L3_pow_43(lsb)*((drmp3_int32)bs_cache < 0 ? -1: 1); - } else - { - *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; - } - DRMP3_FLUSH_BITS(lsb ? 1 : 0); - } - DRMP3_CHECK_BITS; - } while (--pairs_to_decode); - } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); - } else - { - do - { - np = *sfb++ / 2; - pairs_to_decode = DRMP3_MIN(big_val_cnt, np); - one = *scf++; - do - { - int j, w = 5; - int leaf = codebook[DRMP3_PEEK_BITS(w)]; - while (leaf < 0) - { - DRMP3_FLUSH_BITS(w); - w = leaf & 7; - leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)]; - } - DRMP3_FLUSH_BITS(leaf >> 8); - for (j = 0; j < 2; j++, dst++, leaf >>= 4) - { - int lsb = leaf & 0x0F; - *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; - DRMP3_FLUSH_BITS(lsb ? 1 : 0); - } - DRMP3_CHECK_BITS; - } while (--pairs_to_decode); - } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); - } - } - for (np = 1 - big_val_cnt;; dst += 4) - { - const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32; - int leaf = codebook_count1[DRMP3_PEEK_BITS(4)]; - if (!(leaf & 8)) - { - leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))]; - } - DRMP3_FLUSH_BITS(leaf & 7); - if (DRMP3_BSPOS > layer3gr_limit) - { - break; - } -#define DRMP3_RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } -#define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) } - DRMP3_RELOAD_SCALEFACTOR; - DRMP3_DEQ_COUNT1(0); - DRMP3_DEQ_COUNT1(1); - DRMP3_RELOAD_SCALEFACTOR; - DRMP3_DEQ_COUNT1(2); - DRMP3_DEQ_COUNT1(3); - DRMP3_CHECK_BITS; - } - bs->pos = layer3gr_limit; -} -static void drmp3_L3_midside_stereo(float *left, int n) -{ - int i = 0; - float *right = left + 576; -#if DRMP3_HAVE_SIMD - if (drmp3_have_simd()) - { - for (; i < n - 3; i += 4) - { - drmp3_f4 vl = DRMP3_VLD(left + i); - drmp3_f4 vr = DRMP3_VLD(right + i); - DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr)); - DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr)); - } -#ifdef __GNUC__ - if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0) - return; -#endif - } -#endif - for (; i < n; i++) - { - float a = left[i]; - float b = right[i]; - left[i] = a + b; - right[i] = a - b; - } -} -static void drmp3_L3_intensity_stereo_band(float *left, int n, float kl, float kr) -{ - int i; - for (i = 0; i < n; i++) - { - left[i + 576] = left[i]*kr; - left[i] = left[i]*kl; - } -} -static void drmp3_L3_stereo_top_band(const float *right, const drmp3_uint8 *sfb, int nbands, int max_band[3]) -{ - int i, k; - max_band[0] = max_band[1] = max_band[2] = -1; - for (i = 0; i < nbands; i++) - { - for (k = 0; k < sfb[i]; k += 2) - { - if (right[k] != 0 || right[k + 1] != 0) - { - max_band[i % 3] = i; - break; - } - } - right += sfb[i]; - } -} -static void drmp3_L3_stereo_process(float *left, const drmp3_uint8 *ist_pos, const drmp3_uint8 *sfb, const drmp3_uint8 *hdr, int max_band[3], int mpeg2_sh) -{ - static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 }; - unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64; - for (i = 0; sfb[i]; i++) - { - unsigned ipos = ist_pos[i]; - if ((int)i > max_band[i % 3] && ipos < max_pos) - { - float kl, kr, s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1; - if (DRMP3_HDR_TEST_MPEG1(hdr)) - { - kl = g_pan[2*ipos]; - kr = g_pan[2*ipos + 1]; - } else - { - kl = 1; - kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh); - if (ipos & 1) - { - kl = kr; - kr = 1; - } - } - drmp3_L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s); - } else if (DRMP3_HDR_TEST_MS_STEREO(hdr)) - { - drmp3_L3_midside_stereo(left, sfb[i]); - } - left += sfb[i]; - } -} -static void drmp3_L3_intensity_stereo(float *left, drmp3_uint8 *ist_pos, const drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr) -{ - int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb; - int i, max_blocks = gr->n_short_sfb ? 3 : 1; - drmp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band); - if (gr->n_long_sfb) - { - max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]); - } - for (i = 0; i < max_blocks; i++) - { - int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0; - int itop = n_sfb - max_blocks + i; - int prev = itop - max_blocks; - ist_pos[itop] = (drmp3_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]); - } - drmp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1); -} -static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sfb) -{ - int i, len; - float *src = grbuf, *dst = scratch; - for (;0 != (len = *sfb); sfb += 3, src += 2*len) - { - for (i = 0; i < len; i++, src++) - { - *dst++ = src[0*len]; - *dst++ = src[1*len]; - *dst++ = src[2*len]; - } - } - DRMP3_COPY_MEMORY(grbuf, scratch, (dst - scratch)*sizeof(float)); -} -static void drmp3_L3_antialias(float *grbuf, int nbands) -{ - static const float g_aa[2][8] = { - {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f}, - {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f} - }; - for (; nbands > 0; nbands--, grbuf += 18) - { - int i = 0; -#if DRMP3_HAVE_SIMD - if (drmp3_have_simd()) for (; i < 8; i += 4) - { - drmp3_f4 vu = DRMP3_VLD(grbuf + 18 + i); - drmp3_f4 vd = DRMP3_VLD(grbuf + 14 - i); - drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] + i); - drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] + i); - vd = DRMP3_VREV(vd); - DRMP3_VSTORE(grbuf + 18 + i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1))); - vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0)); - DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vd)); - } -#endif -#ifndef DR_MP3_ONLY_SIMD - for(; i < 8; i++) - { - float u = grbuf[18 + i]; - float d = grbuf[17 - i]; - grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i]; - grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i]; - } -#endif - } -} -static void drmp3_L3_dct3_9(float *y) -{ - float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4; - s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8]; - t0 = s0 + s6*0.5f; - s0 -= s6; - t4 = (s4 + s2)*0.93969262f; - t2 = (s8 + s2)*0.76604444f; - s6 = (s4 - s8)*0.17364818f; - s4 += s8 - s2; - s2 = s0 - s4*0.5f; - y[4] = s4 + s0; - s8 = t0 - t2 + s6; - s0 = t0 - t4 + t2; - s4 = t0 + t4 - s6; - s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7]; - s3 *= 0.86602540f; - t0 = (s5 + s1)*0.98480775f; - t4 = (s5 - s7)*0.34202014f; - t2 = (s1 + s7)*0.64278761f; - s1 = (s1 - s5 - s7)*0.86602540f; - s5 = t0 - s3 - t2; - s7 = t4 - s3 - t0; - s3 = t4 + s3 - t2; - y[0] = s4 - s7; - y[1] = s2 + s1; - y[2] = s0 - s3; - y[3] = s8 + s5; - y[5] = s8 - s5; - y[6] = s0 + s3; - y[7] = s2 - s1; - y[8] = s4 + s7; -} -static void drmp3_L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands) -{ - int i, j; - static const float g_twid9[18] = { - 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f - }; - for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9) - { - float co[9], si[9]; - co[0] = -grbuf[0]; - si[0] = grbuf[17]; - for (i = 0; i < 4; i++) - { - si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2]; - co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2]; - si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3]; - co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]); - } - drmp3_L3_dct3_9(co); - drmp3_L3_dct3_9(si); - si[1] = -si[1]; - si[3] = -si[3]; - si[5] = -si[5]; - si[7] = -si[7]; - i = 0; -#if DRMP3_HAVE_SIMD - if (drmp3_have_simd()) for (; i < 8; i += 4) - { - drmp3_f4 vovl = DRMP3_VLD(overlap + i); - drmp3_f4 vc = DRMP3_VLD(co + i); - drmp3_f4 vs = DRMP3_VLD(si + i); - drmp3_f4 vr0 = DRMP3_VLD(g_twid9 + i); - drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 + i); - drmp3_f4 vw0 = DRMP3_VLD(window + i); - drmp3_f4 vw1 = DRMP3_VLD(window + 9 + i); - drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0)); - DRMP3_VSTORE(overlap + i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1))); - DRMP3_VSTORE(grbuf + i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1))); - vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0)); - DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vsum)); - } -#endif - for (; i < 9; i++) - { - float ovl = overlap[i]; - float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i]; - overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i]; - grbuf[i] = ovl*window[0 + i] - sum*window[9 + i]; - grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i]; - } - } -} -static void drmp3_L3_idct3(float x0, float x1, float x2, float *dst) -{ - float m1 = x1*0.86602540f; - float a1 = x0 - x2*0.5f; - dst[1] = x0 + x2; - dst[0] = a1 + m1; - dst[2] = a1 - m1; -} -static void drmp3_L3_imdct12(float *x, float *dst, float *overlap) -{ - static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f }; - float co[3], si[3]; - int i; - drmp3_L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co); - drmp3_L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si); - si[1] = -si[1]; - for (i = 0; i < 3; i++) - { - float ovl = overlap[i]; - float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i]; - overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i]; - dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i]; - dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i]; - } -} -static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands) -{ - for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) - { - float tmp[18]; - DRMP3_COPY_MEMORY(tmp, grbuf, sizeof(tmp)); - DRMP3_COPY_MEMORY(grbuf, overlap, 6*sizeof(float)); - drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6); - drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6); - drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6); - } -} -static void drmp3_L3_change_sign(float *grbuf) -{ - int b, i; - for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36) - for (i = 1; i < 18; i += 2) - grbuf[i] = -grbuf[i]; -} -static void drmp3_L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands) -{ - static const float g_mdct_window[2][18] = { - { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f }, - { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f } - }; - if (n_long_bands) - { - drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands); - grbuf += 18*n_long_bands; - overlap += 9*n_long_bands; - } - if (block_type == DRMP3_SHORT_BLOCK_TYPE) - drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands); - else - drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands); -} -static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s) -{ - int pos = (s->bs.pos + 7)/8u; - int remains = s->bs.limit/8u - pos; - if (remains > DRMP3_MAX_BITRESERVOIR_BYTES) - { - pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES; - remains = DRMP3_MAX_BITRESERVOIR_BYTES; - } - if (remains > 0) - { - DRMP3_MOVE_MEMORY(h->reserv_buf, s->maindata + pos, remains); - } - h->reserv = remains; -} -static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratch *s, int main_data_begin) -{ - int frame_bytes = (bs->limit - bs->pos)/8; - int bytes_have = DRMP3_MIN(h->reserv, main_data_begin); - DRMP3_COPY_MEMORY(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin)); - DRMP3_COPY_MEMORY(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes); - drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes); - return h->reserv >= main_data_begin; -} -static void drmp3_L3_decode(drmp3dec *h, drmp3dec_scratch *s, drmp3_L3_gr_info *gr_info, int nch) -{ - int ch; - for (ch = 0; ch < nch; ch++) - { - int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length; - drmp3_L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch); - drmp3_L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit); - } - if (DRMP3_HDR_TEST_I_STEREO(h->header)) - { - drmp3_L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header); - } else if (DRMP3_HDR_IS_MS_STEREO(h->header)) - { - drmp3_L3_midside_stereo(s->grbuf[0], 576); - } - for (ch = 0; ch < nch; ch++, gr_info++) - { - int aa_bands = 31; - int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(h->header) == 2); - if (gr_info->n_short_sfb) - { - aa_bands = n_long_bands - 1; - drmp3_L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb); - } - drmp3_L3_antialias(s->grbuf[ch], aa_bands); - drmp3_L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands); - drmp3_L3_change_sign(s->grbuf[ch]); - } -} -static void drmp3d_DCT_II(float *grbuf, int n) -{ - static const float g_sec[24] = { - 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f - }; - int i, k = 0; -#if DRMP3_HAVE_SIMD - if (drmp3_have_simd()) for (; k < n; k += 4) - { - drmp3_f4 t[4][8], *x; - float *y = grbuf + k; - for (x = t[0], i = 0; i < 8; i++, x++) - { - drmp3_f4 x0 = DRMP3_VLD(&y[i*18]); - drmp3_f4 x1 = DRMP3_VLD(&y[(15 - i)*18]); - drmp3_f4 x2 = DRMP3_VLD(&y[(16 + i)*18]); - drmp3_f4 x3 = DRMP3_VLD(&y[(31 - i)*18]); - drmp3_f4 t0 = DRMP3_VADD(x0, x3); - drmp3_f4 t1 = DRMP3_VADD(x1, x2); - drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1, x2), g_sec[3*i + 0]); - drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*i + 1]); - x[0] = DRMP3_VADD(t0, t1); - x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*i + 2]); - x[16] = DRMP3_VADD(t3, t2); - x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*i + 2]); - } - for (x = t[0], i = 0; i < 4; i++, x += 8) - { - drmp3_f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; - xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7); - x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6); - x6 = DRMP3_VSUB(x2, x5); x2 = DRMP3_VADD(x2, x5); - x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4); - x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3); - x3 = DRMP3_VSUB(x1, x2); x1 = DRMP3_VADD(x1, x2); - x[0] = DRMP3_VADD(x0, x1); - x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f); - x5 = DRMP3_VADD(x5, x6); - x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f); - x7 = DRMP3_VADD(x7, xt); - x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f); - x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f)); - x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f)); - x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f)); - x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6); - x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f); - x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f); - x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f); - x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f); - x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f); - x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f); - } - if (k > n - 3) - { -#if DRMP3_HAVE_SSE -#define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v) -#else -#define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v)) -#endif - for (i = 0; i < 7; i++, y += 4*18) - { - drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]); - DRMP3_VSAVE2(0, t[0][i]); - DRMP3_VSAVE2(1, DRMP3_VADD(t[2][i], s)); - DRMP3_VSAVE2(2, DRMP3_VADD(t[1][i], t[1][i + 1])); - DRMP3_VSAVE2(3, DRMP3_VADD(t[2][1 + i], s)); - } - DRMP3_VSAVE2(0, t[0][7]); - DRMP3_VSAVE2(1, DRMP3_VADD(t[2][7], t[3][7])); - DRMP3_VSAVE2(2, t[1][7]); - DRMP3_VSAVE2(3, t[3][7]); - } else - { -#define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v) - for (i = 0; i < 7; i++, y += 4*18) - { - drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]); - DRMP3_VSAVE4(0, t[0][i]); - DRMP3_VSAVE4(1, DRMP3_VADD(t[2][i], s)); - DRMP3_VSAVE4(2, DRMP3_VADD(t[1][i], t[1][i + 1])); - DRMP3_VSAVE4(3, DRMP3_VADD(t[2][1 + i], s)); - } - DRMP3_VSAVE4(0, t[0][7]); - DRMP3_VSAVE4(1, DRMP3_VADD(t[2][7], t[3][7])); - DRMP3_VSAVE4(2, t[1][7]); - DRMP3_VSAVE4(3, t[3][7]); - } - } else -#endif -#ifdef DR_MP3_ONLY_SIMD - {} -#else - for (; k < n; k++) - { - float t[4][8], *x, *y = grbuf + k; - for (x = t[0], i = 0; i < 8; i++, x++) - { - float x0 = y[i*18]; - float x1 = y[(15 - i)*18]; - float x2 = y[(16 + i)*18]; - float x3 = y[(31 - i)*18]; - float t0 = x0 + x3; - float t1 = x1 + x2; - float t2 = (x1 - x2)*g_sec[3*i + 0]; - float t3 = (x0 - x3)*g_sec[3*i + 1]; - x[0] = t0 + t1; - x[8] = (t0 - t1)*g_sec[3*i + 2]; - x[16] = t3 + t2; - x[24] = (t3 - t2)*g_sec[3*i + 2]; - } - for (x = t[0], i = 0; i < 4; i++, x += 8) - { - float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; - xt = x0 - x7; x0 += x7; - x7 = x1 - x6; x1 += x6; - x6 = x2 - x5; x2 += x5; - x5 = x3 - x4; x3 += x4; - x4 = x0 - x3; x0 += x3; - x3 = x1 - x2; x1 += x2; - x[0] = x0 + x1; - x[4] = (x0 - x1)*0.70710677f; - x5 = x5 + x6; - x6 = (x6 + x7)*0.70710677f; - x7 = x7 + xt; - x3 = (x3 + x4)*0.70710677f; - x5 -= x7*0.198912367f; - x7 += x5*0.382683432f; - x5 -= x7*0.198912367f; - x0 = xt - x6; xt += x6; - x[1] = (xt + x7)*0.50979561f; - x[2] = (x4 + x3)*0.54119611f; - x[3] = (x0 - x5)*0.60134488f; - x[5] = (x0 + x5)*0.89997619f; - x[6] = (x4 - x3)*1.30656302f; - x[7] = (xt - x7)*2.56291556f; - } - for (i = 0; i < 7; i++, y += 4*18) - { - y[0*18] = t[0][i]; - y[1*18] = t[2][i] + t[3][i] + t[3][i + 1]; - y[2*18] = t[1][i] + t[1][i + 1]; - y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1]; - } - y[0*18] = t[0][7]; - y[1*18] = t[2][7] + t[3][7]; - y[2*18] = t[1][7]; - y[3*18] = t[3][7]; - } -#endif -} -#ifndef DR_MP3_FLOAT_OUTPUT -typedef drmp3_int16 drmp3d_sample_t; -static drmp3_int16 drmp3d_scale_pcm(float sample) -{ - drmp3_int16 s; -#if DRMP3_HAVE_ARMV6 - drmp3_int32 s32 = (drmp3_int32)(sample + .5f); - s32 -= (s32 < 0); - s = (drmp3_int16)drmp3_clip_int16_arm(s32); -#else - if (sample >= 32766.5) return (drmp3_int16) 32767; - if (sample <= -32767.5) return (drmp3_int16)-32768; - s = (drmp3_int16)(sample + .5f); - s -= (s < 0); -#endif - return s; -} -#else -typedef float drmp3d_sample_t; -static float drmp3d_scale_pcm(float sample) -{ - return sample*(1.f/32768.f); -} -#endif -static void drmp3d_synth_pair(drmp3d_sample_t *pcm, int nch, const float *z) -{ - float a; - a = (z[14*64] - z[ 0]) * 29; - a += (z[ 1*64] + z[13*64]) * 213; - a += (z[12*64] - z[ 2*64]) * 459; - a += (z[ 3*64] + z[11*64]) * 2037; - a += (z[10*64] - z[ 4*64]) * 5153; - a += (z[ 5*64] + z[ 9*64]) * 6574; - a += (z[ 8*64] - z[ 6*64]) * 37489; - a += z[ 7*64] * 75038; - pcm[0] = drmp3d_scale_pcm(a); - z += 2; - a = z[14*64] * 104; - a += z[12*64] * 1567; - a += z[10*64] * 9727; - a += z[ 8*64] * 64019; - a += z[ 6*64] * -9975; - a += z[ 4*64] * -45; - a += z[ 2*64] * 146; - a += z[ 0*64] * -5; - pcm[16*nch] = drmp3d_scale_pcm(a); -} -static void drmp3d_synth(float *xl, drmp3d_sample_t *dstl, int nch, float *lins) -{ - int i; - float *xr = xl + 576*(nch - 1); - drmp3d_sample_t *dstr = dstl + (nch - 1); - static const float g_win[] = { - -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992, - -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856, - -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630, - -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313, - -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908, - -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415, - -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835, - -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169, - -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420, - -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590, - -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679, - -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692, - -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629, - -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494, - -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290 - }; - float *zlin = lins + 15*64; - const float *w = g_win; - zlin[4*15] = xl[18*16]; - zlin[4*15 + 1] = xr[18*16]; - zlin[4*15 + 2] = xl[0]; - zlin[4*15 + 3] = xr[0]; - zlin[4*31] = xl[1 + 18*16]; - zlin[4*31 + 1] = xr[1 + 18*16]; - zlin[4*31 + 2] = xl[1]; - zlin[4*31 + 3] = xr[1]; - drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1); - drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1); - drmp3d_synth_pair(dstl, nch, lins + 4*15); - drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64); -#if DRMP3_HAVE_SIMD - if (drmp3_have_simd()) for (i = 14; i >= 0; i--) - { -#define DRMP3_VLOAD(k) drmp3_f4 w0 = DRMP3_VSET(*w++); drmp3_f4 w1 = DRMP3_VSET(*w++); drmp3_f4 vz = DRMP3_VLD(&zlin[4*i - 64*k]); drmp3_f4 vy = DRMP3_VLD(&zlin[4*i - 64*(15 - k)]); -#define DRMP3_V0(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0)) ; a = DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1)); } -#define DRMP3_V1(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1))); } -#define DRMP3_V2(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vy, w1), DRMP3_VMUL(vz, w0))); } - drmp3_f4 a, b; - zlin[4*i] = xl[18*(31 - i)]; - zlin[4*i + 1] = xr[18*(31 - i)]; - zlin[4*i + 2] = xl[1 + 18*(31 - i)]; - zlin[4*i + 3] = xr[1 + 18*(31 - i)]; - zlin[4*i + 64] = xl[1 + 18*(1 + i)]; - zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)]; - zlin[4*i - 64 + 2] = xl[18*(1 + i)]; - zlin[4*i - 64 + 3] = xr[18*(1 + i)]; - DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7) - { -#ifndef DR_MP3_FLOAT_OUTPUT -#if DRMP3_HAVE_SSE - static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; - static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; - __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), - _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); - dstr[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 1); - dstr[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 5); - dstl[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 0); - dstl[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 4); - dstr[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 3); - dstr[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 7); - dstl[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 2); - dstl[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 6); -#else - int16x4_t pcma, pcmb; - a = DRMP3_VADD(a, DRMP3_VSET(0.5f)); - b = DRMP3_VADD(b, DRMP3_VSET(0.5f)); - pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0))))); - pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0))))); - vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1); - vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1); - vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0); - vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0); - vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3); - vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3); - vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2); - vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2); -#endif -#else - #if DRMP3_HAVE_SSE - static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f }; - #else - const drmp3_f4 g_scale = vdupq_n_f32(1.0f/32768.0f); - #endif - a = DRMP3_VMUL(a, g_scale); - b = DRMP3_VMUL(b, g_scale); -#if DRMP3_HAVE_SSE - _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1))); - _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1))); - _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0))); - _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0))); - _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3))); - _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3))); - _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); - _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2))); -#else - vst1q_lane_f32(dstr + (15 - i)*nch, a, 1); - vst1q_lane_f32(dstr + (17 + i)*nch, b, 1); - vst1q_lane_f32(dstl + (15 - i)*nch, a, 0); - vst1q_lane_f32(dstl + (17 + i)*nch, b, 0); - vst1q_lane_f32(dstr + (47 - i)*nch, a, 3); - vst1q_lane_f32(dstr + (49 + i)*nch, b, 3); - vst1q_lane_f32(dstl + (47 - i)*nch, a, 2); - vst1q_lane_f32(dstl + (49 + i)*nch, b, 2); -#endif -#endif - } - } else -#endif -#ifdef DR_MP3_ONLY_SIMD - {} -#else - for (i = 14; i >= 0; i--) - { -#define DRMP3_LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64]; -#define DRMP3_S0(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } -#define DRMP3_S1(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } -#define DRMP3_S2(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } - float a[4], b[4]; - zlin[4*i] = xl[18*(31 - i)]; - zlin[4*i + 1] = xr[18*(31 - i)]; - zlin[4*i + 2] = xl[1 + 18*(31 - i)]; - zlin[4*i + 3] = xr[1 + 18*(31 - i)]; - zlin[4*(i + 16)] = xl[1 + 18*(1 + i)]; - zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)]; - zlin[4*(i - 16) + 2] = xl[18*(1 + i)]; - zlin[4*(i - 16) + 3] = xr[18*(1 + i)]; - DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7) - dstr[(15 - i)*nch] = drmp3d_scale_pcm(a[1]); - dstr[(17 + i)*nch] = drmp3d_scale_pcm(b[1]); - dstl[(15 - i)*nch] = drmp3d_scale_pcm(a[0]); - dstl[(17 + i)*nch] = drmp3d_scale_pcm(b[0]); - dstr[(47 - i)*nch] = drmp3d_scale_pcm(a[3]); - dstr[(49 + i)*nch] = drmp3d_scale_pcm(b[3]); - dstl[(47 - i)*nch] = drmp3d_scale_pcm(a[2]); - dstl[(49 + i)*nch] = drmp3d_scale_pcm(b[2]); - } -#endif -} -static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, drmp3d_sample_t *pcm, float *lins) -{ - int i; - for (i = 0; i < nch; i++) - { - drmp3d_DCT_II(grbuf + 576*i, nbands); - } - DRMP3_COPY_MEMORY(lins, qmf_state, sizeof(float)*15*64); - for (i = 0; i < nbands; i += 2) - { - drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); - } -#ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL - if (nch == 1) - { - for (i = 0; i < 15*64; i += 2) - { - qmf_state[i] = lins[nbands*64 + i]; - } - } else -#endif - { - DRMP3_COPY_MEMORY(qmf_state, lins + nbands*64, sizeof(float)*15*64); - } -} -static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes) -{ - int i, nmatch; - for (i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++) - { - i += drmp3_hdr_frame_bytes(hdr + i, frame_bytes) + drmp3_hdr_padding(hdr + i); - if (i + DRMP3_HDR_SIZE > mp3_bytes) - return nmatch > 0; - if (!drmp3_hdr_compare(hdr, hdr + i)) - return 0; - } - return 1; -} -static int drmp3d_find_frame(const drmp3_uint8 *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes) -{ - int i, k; - for (i = 0; i < mp3_bytes - DRMP3_HDR_SIZE; i++, mp3++) - { - if (drmp3_hdr_valid(mp3)) - { - int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes); - int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3); - for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++) - { - if (drmp3_hdr_compare(mp3, mp3 + k)) - { - int fb = k - drmp3_hdr_padding(mp3); - int nextfb = fb + drmp3_hdr_padding(mp3 + k); - if (i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb)) - continue; - frame_and_padding = k; - frame_bytes = fb; - *free_format_bytes = fb; - } - } - if ((frame_bytes && i + frame_and_padding <= mp3_bytes && - drmp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) || - (!i && frame_and_padding == mp3_bytes)) - { - *ptr_frame_bytes = frame_and_padding; - return i; - } - *free_format_bytes = 0; - } - } - *ptr_frame_bytes = 0; - return mp3_bytes; -} -DRMP3_API void drmp3dec_init(drmp3dec *dec) -{ - dec->header[0] = 0; -} -DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info) -{ - int i = 0, igr, frame_size = 0, success = 1; - const drmp3_uint8 *hdr; - drmp3_bs bs_frame[1]; - drmp3dec_scratch scratch; - if (mp3_bytes > 4 && dec->header[0] == 0xff && drmp3_hdr_compare(dec->header, mp3)) - { - frame_size = drmp3_hdr_frame_bytes(mp3, dec->free_format_bytes) + drmp3_hdr_padding(mp3); - if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size))) - { - frame_size = 0; - } - } - if (!frame_size) - { - DRMP3_ZERO_MEMORY(dec, sizeof(drmp3dec)); - i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size); - if (!frame_size || i + frame_size > mp3_bytes) - { - info->frame_bytes = i; - return 0; - } - } - hdr = mp3 + i; - DRMP3_COPY_MEMORY(dec->header, hdr, DRMP3_HDR_SIZE); - info->frame_bytes = i + frame_size; - info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2; - info->hz = drmp3_hdr_sample_rate_hz(hdr); - info->layer = 4 - DRMP3_HDR_GET_LAYER(hdr); - info->bitrate_kbps = drmp3_hdr_bitrate_kbps(hdr); - drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE); - if (DRMP3_HDR_IS_CRC(hdr)) - { - drmp3_bs_get_bits(bs_frame, 16); - } - if (info->layer == 3) - { - int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr); - if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit) - { - drmp3dec_init(dec); - return 0; - } - success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin); - if (success && pcm != NULL) - { - for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels)) - { - DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float)); - drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); - drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); - } - } - drmp3_L3_save_reservoir(dec, &scratch); - } else - { -#ifdef DR_MP3_ONLY_MP3 - return 0; -#else - drmp3_L12_scale_info sci[1]; - if (pcm == NULL) { - return drmp3_hdr_frame_samples(hdr); - } - drmp3_L12_read_scale_info(hdr, bs_frame, sci); - DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float)); - for (i = 0, igr = 0; igr < 3; igr++) - { - if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) - { - i = 0; - drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); - drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); - DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float)); - pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels); - } - if (bs_frame->pos > bs_frame->limit) - { - drmp3dec_init(dec); - return 0; - } - } -#endif - } - return success*drmp3_hdr_frame_samples(dec->header); -} -DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num_samples) -{ - size_t i = 0; -#if DRMP3_HAVE_SIMD - size_t aligned_count = num_samples & ~7; - for(; i < aligned_count; i+=8) - { - drmp3_f4 scale = DRMP3_VSET(32768.0f); - drmp3_f4 a = DRMP3_VMUL(DRMP3_VLD(&in[i ]), scale); - drmp3_f4 b = DRMP3_VMUL(DRMP3_VLD(&in[i+4]), scale); -#if DRMP3_HAVE_SSE - drmp3_f4 s16max = DRMP3_VSET( 32767.0f); - drmp3_f4 s16min = DRMP3_VSET(-32768.0f); - __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, s16max), s16min)), - _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, s16max), s16min))); - out[i ] = (drmp3_int16)_mm_extract_epi16(pcm8, 0); - out[i+1] = (drmp3_int16)_mm_extract_epi16(pcm8, 1); - out[i+2] = (drmp3_int16)_mm_extract_epi16(pcm8, 2); - out[i+3] = (drmp3_int16)_mm_extract_epi16(pcm8, 3); - out[i+4] = (drmp3_int16)_mm_extract_epi16(pcm8, 4); - out[i+5] = (drmp3_int16)_mm_extract_epi16(pcm8, 5); - out[i+6] = (drmp3_int16)_mm_extract_epi16(pcm8, 6); - out[i+7] = (drmp3_int16)_mm_extract_epi16(pcm8, 7); -#else - int16x4_t pcma, pcmb; - a = DRMP3_VADD(a, DRMP3_VSET(0.5f)); - b = DRMP3_VADD(b, DRMP3_VSET(0.5f)); - pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0))))); - pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0))))); - vst1_lane_s16(out+i , pcma, 0); - vst1_lane_s16(out+i+1, pcma, 1); - vst1_lane_s16(out+i+2, pcma, 2); - vst1_lane_s16(out+i+3, pcma, 3); - vst1_lane_s16(out+i+4, pcmb, 0); - vst1_lane_s16(out+i+5, pcmb, 1); - vst1_lane_s16(out+i+6, pcmb, 2); - vst1_lane_s16(out+i+7, pcmb, 3); -#endif - } -#endif - for(; i < num_samples; i++) - { - float sample = in[i] * 32768.0f; - if (sample >= 32766.5) - out[i] = (drmp3_int16) 32767; - else if (sample <= -32767.5) - out[i] = (drmp3_int16)-32768; - else - { - short s = (drmp3_int16)(sample + .5f); - s -= (s < 0); - out[i] = s; - } - } -} -#if defined(SIZE_MAX) - #define DRMP3_SIZE_MAX SIZE_MAX -#else - #if defined(_WIN64) || defined(_LP64) || defined(__LP64__) - #define DRMP3_SIZE_MAX ((drmp3_uint64)0xFFFFFFFFFFFFFFFF) - #else - #define DRMP3_SIZE_MAX 0xFFFFFFFF - #endif -#endif -#ifndef DRMP3_SEEK_LEADING_MP3_FRAMES -#define DRMP3_SEEK_LEADING_MP3_FRAMES 2 -#endif -#define DRMP3_MIN_DATA_CHUNK_SIZE 16384 -#ifndef DRMP3_DATA_CHUNK_SIZE -#define DRMP3_DATA_CHUNK_SIZE DRMP3_MIN_DATA_CHUNK_SIZE*4 -#endif -#define DRMP3_COUNTOF(x) (sizeof(x) / sizeof(x[0])) -#define DRMP3_CLAMP(x, lo, hi) (DRMP3_MAX(lo, DRMP3_MIN(x, hi))) -#ifndef DRMP3_PI_D -#define DRMP3_PI_D 3.14159265358979323846264 -#endif -#define DRMP3_DEFAULT_RESAMPLER_LPF_ORDER 2 -static DRMP3_INLINE float drmp3_mix_f32(float x, float y, float a) -{ - return x*(1-a) + y*a; -} -static DRMP3_INLINE float drmp3_mix_f32_fast(float x, float y, float a) -{ - float r0 = (y - x); - float r1 = r0*a; - return x + r1; -} -static DRMP3_INLINE drmp3_uint32 drmp3_gcf_u32(drmp3_uint32 a, drmp3_uint32 b) -{ - for (;;) { - if (b == 0) { - break; - } else { - drmp3_uint32 t = a; - a = b; - b = t % a; - } - } - return a; -} -static void* drmp3__malloc_default(size_t sz, void* pUserData) -{ - (void)pUserData; - return DRMP3_MALLOC(sz); -} -static void* drmp3__realloc_default(void* p, size_t sz, void* pUserData) -{ - (void)pUserData; - return DRMP3_REALLOC(p, sz); -} -static void drmp3__free_default(void* p, void* pUserData) -{ - (void)pUserData; - DRMP3_FREE(p); -} -static void* drmp3__malloc_from_callbacks(size_t sz, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks == NULL) { - return NULL; - } - if (pAllocationCallbacks->onMalloc != NULL) { - return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData); - } - if (pAllocationCallbacks->onRealloc != NULL) { - return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData); - } - return NULL; -} -static void* drmp3__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks == NULL) { - return NULL; - } - if (pAllocationCallbacks->onRealloc != NULL) { - return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData); - } - if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) { - void* p2; - p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData); - if (p2 == NULL) { - return NULL; - } - if (p != NULL) { - DRMP3_COPY_MEMORY(p2, p, szOld); - pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); - } - return p2; - } - return NULL; -} -static void drmp3__free_from_callbacks(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (p == NULL || pAllocationCallbacks == NULL) { - return; - } - if (pAllocationCallbacks->onFree != NULL) { - pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); - } -} -static drmp3_allocation_callbacks drmp3_copy_allocation_callbacks_or_defaults(const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - return *pAllocationCallbacks; - } else { - drmp3_allocation_callbacks allocationCallbacks; - allocationCallbacks.pUserData = NULL; - allocationCallbacks.onMalloc = drmp3__malloc_default; - allocationCallbacks.onRealloc = drmp3__realloc_default; - allocationCallbacks.onFree = drmp3__free_default; - return allocationCallbacks; - } -} -static size_t drmp3__on_read(drmp3* pMP3, void* pBufferOut, size_t bytesToRead) -{ - size_t bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead); - pMP3->streamCursor += bytesRead; - return bytesRead; -} -static drmp3_bool32 drmp3__on_seek(drmp3* pMP3, int offset, drmp3_seek_origin origin) -{ - DRMP3_ASSERT(offset >= 0); - if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) { - return DRMP3_FALSE; - } - if (origin == drmp3_seek_origin_start) { - pMP3->streamCursor = (drmp3_uint64)offset; - } else { - pMP3->streamCursor += offset; - } - return DRMP3_TRUE; -} -static drmp3_bool32 drmp3__on_seek_64(drmp3* pMP3, drmp3_uint64 offset, drmp3_seek_origin origin) -{ - if (offset <= 0x7FFFFFFF) { - return drmp3__on_seek(pMP3, (int)offset, origin); - } - if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_start)) { - return DRMP3_FALSE; - } - offset -= 0x7FFFFFFF; - while (offset > 0) { - if (offset <= 0x7FFFFFFF) { - if (!drmp3__on_seek(pMP3, (int)offset, drmp3_seek_origin_current)) { - return DRMP3_FALSE; - } - offset = 0; - } else { - if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_current)) { - return DRMP3_FALSE; - } - offset -= 0x7FFFFFFF; - } - } - return DRMP3_TRUE; -} -static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(drmp3* pMP3, drmp3d_sample_t* pPCMFrames) -{ - drmp3_uint32 pcmFramesRead = 0; - DRMP3_ASSERT(pMP3 != NULL); - DRMP3_ASSERT(pMP3->onRead != NULL); - if (pMP3->atEnd) { - return 0; - } - for (;;) { - drmp3dec_frame_info info; - if (pMP3->dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) { - size_t bytesRead; - if (pMP3->pData != NULL) { - DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize); - } - pMP3->dataConsumed = 0; - if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) { - drmp3_uint8* pNewData; - size_t newDataCap; - newDataCap = DRMP3_DATA_CHUNK_SIZE; - pNewData = (drmp3_uint8*)drmp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks); - if (pNewData == NULL) { - return 0; - } - pMP3->pData = pNewData; - pMP3->dataCapacity = newDataCap; - } - bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); - if (bytesRead == 0) { - if (pMP3->dataSize == 0) { - pMP3->atEnd = DRMP3_TRUE; - return 0; - } - } - pMP3->dataSize += bytesRead; - } - if (pMP3->dataSize > INT_MAX) { - pMP3->atEnd = DRMP3_TRUE; - return 0; - } - DRMP3_ASSERT(pMP3->pData != NULL); - DRMP3_ASSERT(pMP3->dataCapacity > 0); - pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->pData + pMP3->dataConsumed, (int)pMP3->dataSize, pPCMFrames, &info); - if (info.frame_bytes > 0) { - pMP3->dataConsumed += (size_t)info.frame_bytes; - pMP3->dataSize -= (size_t)info.frame_bytes; - } - if (pcmFramesRead > 0) { - pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header); - pMP3->pcmFramesConsumedInMP3Frame = 0; - pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead; - pMP3->mp3FrameChannels = info.channels; - pMP3->mp3FrameSampleRate = info.hz; - break; - } else if (info.frame_bytes == 0) { - size_t bytesRead; - DRMP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize); - pMP3->dataConsumed = 0; - if (pMP3->dataCapacity == pMP3->dataSize) { - drmp3_uint8* pNewData; - size_t newDataCap; - newDataCap = pMP3->dataCapacity + DRMP3_DATA_CHUNK_SIZE; - pNewData = (drmp3_uint8*)drmp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks); - if (pNewData == NULL) { - return 0; - } - pMP3->pData = pNewData; - pMP3->dataCapacity = newDataCap; - } - bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); - if (bytesRead == 0) { - pMP3->atEnd = DRMP3_TRUE; - return 0; - } - pMP3->dataSize += bytesRead; - } - }; - return pcmFramesRead; -} -static drmp3_uint32 drmp3_decode_next_frame_ex__memory(drmp3* pMP3, drmp3d_sample_t* pPCMFrames) -{ - drmp3_uint32 pcmFramesRead = 0; - drmp3dec_frame_info info; - DRMP3_ASSERT(pMP3 != NULL); - DRMP3_ASSERT(pMP3->memory.pData != NULL); - if (pMP3->atEnd) { - return 0; - } - for (;;) { - pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->memory.pData + pMP3->memory.currentReadPos, (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos), pPCMFrames, &info); - if (pcmFramesRead > 0) { - pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header); - pMP3->pcmFramesConsumedInMP3Frame = 0; - pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead; - pMP3->mp3FrameChannels = info.channels; - pMP3->mp3FrameSampleRate = info.hz; - break; - } else if (info.frame_bytes > 0) { - pMP3->memory.currentReadPos += (size_t)info.frame_bytes; - } else { - break; - } - } - pMP3->memory.currentReadPos += (size_t)info.frame_bytes; - return pcmFramesRead; -} -static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames) -{ - if (pMP3->memory.pData != NULL && pMP3->memory.dataSize > 0) { - return drmp3_decode_next_frame_ex__memory(pMP3, pPCMFrames); - } else { - return drmp3_decode_next_frame_ex__callbacks(pMP3, pPCMFrames); - } -} -static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3) -{ - DRMP3_ASSERT(pMP3 != NULL); - return drmp3_decode_next_frame_ex(pMP3, (drmp3d_sample_t*)pMP3->pcmFrames); -} -#if 0 -static drmp3_uint32 drmp3_seek_next_frame(drmp3* pMP3) -{ - drmp3_uint32 pcmFrameCount; - DRMP3_ASSERT(pMP3 != NULL); - pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, NULL); - if (pcmFrameCount == 0) { - return 0; - } - pMP3->currentPCMFrame += pcmFrameCount; - pMP3->pcmFramesConsumedInMP3Frame = pcmFrameCount; - pMP3->pcmFramesRemainingInMP3Frame = 0; - return pcmFrameCount; -} -#endif -static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - DRMP3_ASSERT(pMP3 != NULL); - DRMP3_ASSERT(onRead != NULL); - drmp3dec_init(&pMP3->decoder); - pMP3->onRead = onRead; - pMP3->onSeek = onSeek; - pMP3->pUserData = pUserData; - pMP3->allocationCallbacks = drmp3_copy_allocation_callbacks_or_defaults(pAllocationCallbacks); - if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) { - return DRMP3_FALSE; - } - if (drmp3_decode_next_frame(pMP3) == 0) { - drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks); - return DRMP3_FALSE; - } - pMP3->channels = pMP3->mp3FrameChannels; - pMP3->sampleRate = pMP3->mp3FrameSampleRate; - return DRMP3_TRUE; -} -DRMP3_API drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (pMP3 == NULL || onRead == NULL) { - return DRMP3_FALSE; - } - DRMP3_ZERO_OBJECT(pMP3); - return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pAllocationCallbacks); -} -static size_t drmp3__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead) -{ - drmp3* pMP3 = (drmp3*)pUserData; - size_t bytesRemaining; - DRMP3_ASSERT(pMP3 != NULL); - DRMP3_ASSERT(pMP3->memory.dataSize >= pMP3->memory.currentReadPos); - bytesRemaining = pMP3->memory.dataSize - pMP3->memory.currentReadPos; - if (bytesToRead > bytesRemaining) { - bytesToRead = bytesRemaining; - } - if (bytesToRead > 0) { - DRMP3_COPY_MEMORY(pBufferOut, pMP3->memory.pData + pMP3->memory.currentReadPos, bytesToRead); - pMP3->memory.currentReadPos += bytesToRead; - } - return bytesToRead; -} -static drmp3_bool32 drmp3__on_seek_memory(void* pUserData, int byteOffset, drmp3_seek_origin origin) -{ - drmp3* pMP3 = (drmp3*)pUserData; - DRMP3_ASSERT(pMP3 != NULL); - if (origin == drmp3_seek_origin_current) { - if (byteOffset > 0) { - if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) { - byteOffset = (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos); - } - } else { - if (pMP3->memory.currentReadPos < (size_t)-byteOffset) { - byteOffset = -(int)pMP3->memory.currentReadPos; - } - } - pMP3->memory.currentReadPos += byteOffset; - } else { - if ((drmp3_uint32)byteOffset <= pMP3->memory.dataSize) { - pMP3->memory.currentReadPos = byteOffset; - } else { - pMP3->memory.currentReadPos = pMP3->memory.dataSize; - } - } - return DRMP3_TRUE; -} -DRMP3_API drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (pMP3 == NULL) { - return DRMP3_FALSE; - } - DRMP3_ZERO_OBJECT(pMP3); - if (pData == NULL || dataSize == 0) { - return DRMP3_FALSE; - } - pMP3->memory.pData = (const drmp3_uint8*)pData; - pMP3->memory.dataSize = dataSize; - pMP3->memory.currentReadPos = 0; - return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pAllocationCallbacks); -} -#ifndef DR_MP3_NO_STDIO -#include -#include -#include -static drmp3_result drmp3_result_from_errno(int e) -{ - switch (e) - { - case 0: return DRMP3_SUCCESS; - #ifdef EPERM - case EPERM: return DRMP3_INVALID_OPERATION; - #endif - #ifdef ENOENT - case ENOENT: return DRMP3_DOES_NOT_EXIST; - #endif - #ifdef ESRCH - case ESRCH: return DRMP3_DOES_NOT_EXIST; - #endif - #ifdef EINTR - case EINTR: return DRMP3_INTERRUPT; - #endif - #ifdef EIO - case EIO: return DRMP3_IO_ERROR; - #endif - #ifdef ENXIO - case ENXIO: return DRMP3_DOES_NOT_EXIST; - #endif - #ifdef E2BIG - case E2BIG: return DRMP3_INVALID_ARGS; - #endif - #ifdef ENOEXEC - case ENOEXEC: return DRMP3_INVALID_FILE; - #endif - #ifdef EBADF - case EBADF: return DRMP3_INVALID_FILE; - #endif - #ifdef ECHILD - case ECHILD: return DRMP3_ERROR; - #endif - #ifdef EAGAIN - case EAGAIN: return DRMP3_UNAVAILABLE; - #endif - #ifdef ENOMEM - case ENOMEM: return DRMP3_OUT_OF_MEMORY; - #endif - #ifdef EACCES - case EACCES: return DRMP3_ACCESS_DENIED; - #endif - #ifdef EFAULT - case EFAULT: return DRMP3_BAD_ADDRESS; - #endif - #ifdef ENOTBLK - case ENOTBLK: return DRMP3_ERROR; - #endif - #ifdef EBUSY - case EBUSY: return DRMP3_BUSY; - #endif - #ifdef EEXIST - case EEXIST: return DRMP3_ALREADY_EXISTS; - #endif - #ifdef EXDEV - case EXDEV: return DRMP3_ERROR; - #endif - #ifdef ENODEV - case ENODEV: return DRMP3_DOES_NOT_EXIST; - #endif - #ifdef ENOTDIR - case ENOTDIR: return DRMP3_NOT_DIRECTORY; - #endif - #ifdef EISDIR - case EISDIR: return DRMP3_IS_DIRECTORY; - #endif - #ifdef EINVAL - case EINVAL: return DRMP3_INVALID_ARGS; - #endif - #ifdef ENFILE - case ENFILE: return DRMP3_TOO_MANY_OPEN_FILES; - #endif - #ifdef EMFILE - case EMFILE: return DRMP3_TOO_MANY_OPEN_FILES; - #endif - #ifdef ENOTTY - case ENOTTY: return DRMP3_INVALID_OPERATION; - #endif - #ifdef ETXTBSY - case ETXTBSY: return DRMP3_BUSY; - #endif - #ifdef EFBIG - case EFBIG: return DRMP3_TOO_BIG; - #endif - #ifdef ENOSPC - case ENOSPC: return DRMP3_NO_SPACE; - #endif - #ifdef ESPIPE - case ESPIPE: return DRMP3_BAD_SEEK; - #endif - #ifdef EROFS - case EROFS: return DRMP3_ACCESS_DENIED; - #endif - #ifdef EMLINK - case EMLINK: return DRMP3_TOO_MANY_LINKS; - #endif - #ifdef EPIPE - case EPIPE: return DRMP3_BAD_PIPE; - #endif - #ifdef EDOM - case EDOM: return DRMP3_OUT_OF_RANGE; - #endif - #ifdef ERANGE - case ERANGE: return DRMP3_OUT_OF_RANGE; - #endif - #ifdef EDEADLK - case EDEADLK: return DRMP3_DEADLOCK; - #endif - #ifdef ENAMETOOLONG - case ENAMETOOLONG: return DRMP3_PATH_TOO_LONG; - #endif - #ifdef ENOLCK - case ENOLCK: return DRMP3_ERROR; - #endif - #ifdef ENOSYS - case ENOSYS: return DRMP3_NOT_IMPLEMENTED; - #endif - #ifdef ENOTEMPTY - case ENOTEMPTY: return DRMP3_DIRECTORY_NOT_EMPTY; - #endif - #ifdef ELOOP - case ELOOP: return DRMP3_TOO_MANY_LINKS; - #endif - #ifdef ENOMSG - case ENOMSG: return DRMP3_NO_MESSAGE; - #endif - #ifdef EIDRM - case EIDRM: return DRMP3_ERROR; - #endif - #ifdef ECHRNG - case ECHRNG: return DRMP3_ERROR; - #endif - #ifdef EL2NSYNC - case EL2NSYNC: return DRMP3_ERROR; - #endif - #ifdef EL3HLT - case EL3HLT: return DRMP3_ERROR; - #endif - #ifdef EL3RST - case EL3RST: return DRMP3_ERROR; - #endif - #ifdef ELNRNG - case ELNRNG: return DRMP3_OUT_OF_RANGE; - #endif - #ifdef EUNATCH - case EUNATCH: return DRMP3_ERROR; - #endif - #ifdef ENOCSI - case ENOCSI: return DRMP3_ERROR; - #endif - #ifdef EL2HLT - case EL2HLT: return DRMP3_ERROR; - #endif - #ifdef EBADE - case EBADE: return DRMP3_ERROR; - #endif - #ifdef EBADR - case EBADR: return DRMP3_ERROR; - #endif - #ifdef EXFULL - case EXFULL: return DRMP3_ERROR; - #endif - #ifdef ENOANO - case ENOANO: return DRMP3_ERROR; - #endif - #ifdef EBADRQC - case EBADRQC: return DRMP3_ERROR; - #endif - #ifdef EBADSLT - case EBADSLT: return DRMP3_ERROR; - #endif - #ifdef EBFONT - case EBFONT: return DRMP3_INVALID_FILE; - #endif - #ifdef ENOSTR - case ENOSTR: return DRMP3_ERROR; - #endif - #ifdef ENODATA - case ENODATA: return DRMP3_NO_DATA_AVAILABLE; - #endif - #ifdef ETIME - case ETIME: return DRMP3_TIMEOUT; - #endif - #ifdef ENOSR - case ENOSR: return DRMP3_NO_DATA_AVAILABLE; - #endif - #ifdef ENONET - case ENONET: return DRMP3_NO_NETWORK; - #endif - #ifdef ENOPKG - case ENOPKG: return DRMP3_ERROR; - #endif - #ifdef EREMOTE - case EREMOTE: return DRMP3_ERROR; - #endif - #ifdef ENOLINK - case ENOLINK: return DRMP3_ERROR; - #endif - #ifdef EADV - case EADV: return DRMP3_ERROR; - #endif - #ifdef ESRMNT - case ESRMNT: return DRMP3_ERROR; - #endif - #ifdef ECOMM - case ECOMM: return DRMP3_ERROR; - #endif - #ifdef EPROTO - case EPROTO: return DRMP3_ERROR; - #endif - #ifdef EMULTIHOP - case EMULTIHOP: return DRMP3_ERROR; - #endif - #ifdef EDOTDOT - case EDOTDOT: return DRMP3_ERROR; - #endif - #ifdef EBADMSG - case EBADMSG: return DRMP3_BAD_MESSAGE; - #endif - #ifdef EOVERFLOW - case EOVERFLOW: return DRMP3_TOO_BIG; - #endif - #ifdef ENOTUNIQ - case ENOTUNIQ: return DRMP3_NOT_UNIQUE; - #endif - #ifdef EBADFD - case EBADFD: return DRMP3_ERROR; - #endif - #ifdef EREMCHG - case EREMCHG: return DRMP3_ERROR; - #endif - #ifdef ELIBACC - case ELIBACC: return DRMP3_ACCESS_DENIED; - #endif - #ifdef ELIBBAD - case ELIBBAD: return DRMP3_INVALID_FILE; - #endif - #ifdef ELIBSCN - case ELIBSCN: return DRMP3_INVALID_FILE; - #endif - #ifdef ELIBMAX - case ELIBMAX: return DRMP3_ERROR; - #endif - #ifdef ELIBEXEC - case ELIBEXEC: return DRMP3_ERROR; - #endif - #ifdef EILSEQ - case EILSEQ: return DRMP3_INVALID_DATA; - #endif - #ifdef ERESTART - case ERESTART: return DRMP3_ERROR; - #endif - #ifdef ESTRPIPE - case ESTRPIPE: return DRMP3_ERROR; - #endif - #ifdef EUSERS - case EUSERS: return DRMP3_ERROR; - #endif - #ifdef ENOTSOCK - case ENOTSOCK: return DRMP3_NOT_SOCKET; - #endif - #ifdef EDESTADDRREQ - case EDESTADDRREQ: return DRMP3_NO_ADDRESS; - #endif - #ifdef EMSGSIZE - case EMSGSIZE: return DRMP3_TOO_BIG; - #endif - #ifdef EPROTOTYPE - case EPROTOTYPE: return DRMP3_BAD_PROTOCOL; - #endif - #ifdef ENOPROTOOPT - case ENOPROTOOPT: return DRMP3_PROTOCOL_UNAVAILABLE; - #endif - #ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return DRMP3_PROTOCOL_NOT_SUPPORTED; - #endif - #ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return DRMP3_SOCKET_NOT_SUPPORTED; - #endif - #ifdef EOPNOTSUPP - case EOPNOTSUPP: return DRMP3_INVALID_OPERATION; - #endif - #ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return DRMP3_PROTOCOL_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return DRMP3_ADDRESS_FAMILY_NOT_SUPPORTED; - #endif - #ifdef EADDRINUSE - case EADDRINUSE: return DRMP3_ALREADY_IN_USE; - #endif - #ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return DRMP3_ERROR; - #endif - #ifdef ENETDOWN - case ENETDOWN: return DRMP3_NO_NETWORK; - #endif - #ifdef ENETUNREACH - case ENETUNREACH: return DRMP3_NO_NETWORK; - #endif - #ifdef ENETRESET - case ENETRESET: return DRMP3_NO_NETWORK; - #endif - #ifdef ECONNABORTED - case ECONNABORTED: return DRMP3_NO_NETWORK; - #endif - #ifdef ECONNRESET - case ECONNRESET: return DRMP3_CONNECTION_RESET; - #endif - #ifdef ENOBUFS - case ENOBUFS: return DRMP3_NO_SPACE; - #endif - #ifdef EISCONN - case EISCONN: return DRMP3_ALREADY_CONNECTED; - #endif - #ifdef ENOTCONN - case ENOTCONN: return DRMP3_NOT_CONNECTED; - #endif - #ifdef ESHUTDOWN - case ESHUTDOWN: return DRMP3_ERROR; - #endif - #ifdef ETOOMANYREFS - case ETOOMANYREFS: return DRMP3_ERROR; - #endif - #ifdef ETIMEDOUT - case ETIMEDOUT: return DRMP3_TIMEOUT; - #endif - #ifdef ECONNREFUSED - case ECONNREFUSED: return DRMP3_CONNECTION_REFUSED; - #endif - #ifdef EHOSTDOWN - case EHOSTDOWN: return DRMP3_NO_HOST; - #endif - #ifdef EHOSTUNREACH - case EHOSTUNREACH: return DRMP3_NO_HOST; - #endif - #ifdef EALREADY - case EALREADY: return DRMP3_IN_PROGRESS; - #endif - #ifdef EINPROGRESS - case EINPROGRESS: return DRMP3_IN_PROGRESS; - #endif - #ifdef ESTALE - case ESTALE: return DRMP3_INVALID_FILE; - #endif - #ifdef EUCLEAN - case EUCLEAN: return DRMP3_ERROR; - #endif - #ifdef ENOTNAM - case ENOTNAM: return DRMP3_ERROR; - #endif - #ifdef ENAVAIL - case ENAVAIL: return DRMP3_ERROR; - #endif - #ifdef EISNAM - case EISNAM: return DRMP3_ERROR; - #endif - #ifdef EREMOTEIO - case EREMOTEIO: return DRMP3_IO_ERROR; - #endif - #ifdef EDQUOT - case EDQUOT: return DRMP3_NO_SPACE; - #endif - #ifdef ENOMEDIUM - case ENOMEDIUM: return DRMP3_DOES_NOT_EXIST; - #endif - #ifdef EMEDIUMTYPE - case EMEDIUMTYPE: return DRMP3_ERROR; - #endif - #ifdef ECANCELED - case ECANCELED: return DRMP3_CANCELLED; - #endif - #ifdef ENOKEY - case ENOKEY: return DRMP3_ERROR; - #endif - #ifdef EKEYEXPIRED - case EKEYEXPIRED: return DRMP3_ERROR; - #endif - #ifdef EKEYREVOKED - case EKEYREVOKED: return DRMP3_ERROR; - #endif - #ifdef EKEYREJECTED - case EKEYREJECTED: return DRMP3_ERROR; - #endif - #ifdef EOWNERDEAD - case EOWNERDEAD: return DRMP3_ERROR; - #endif - #ifdef ENOTRECOVERABLE - case ENOTRECOVERABLE: return DRMP3_ERROR; - #endif - #ifdef ERFKILL - case ERFKILL: return DRMP3_ERROR; - #endif - #ifdef EHWPOISON - case EHWPOISON: return DRMP3_ERROR; - #endif - default: return DRMP3_ERROR; - } -} -static drmp3_result drmp3_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode) -{ -#if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err; -#endif - if (ppFile != NULL) { - *ppFile = NULL; - } - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRMP3_INVALID_ARGS; - } -#if defined(_MSC_VER) && _MSC_VER >= 1400 - err = fopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drmp3_result_from_errno(err); - } -#else -#if defined(_WIN32) || defined(__APPLE__) - *ppFile = fopen(pFilePath, pOpenMode); -#else - #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE) - *ppFile = fopen64(pFilePath, pOpenMode); - #else - *ppFile = fopen(pFilePath, pOpenMode); - #endif -#endif - if (*ppFile == NULL) { - drmp3_result result = drmp3_result_from_errno(errno); - if (result == DRMP3_SUCCESS) { - result = DRMP3_ERROR; - } - return result; - } -#endif - return DRMP3_SUCCESS; -} -#if defined(_WIN32) - #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) - #define DRMP3_HAS_WFOPEN - #endif -#endif -static drmp3_result drmp3_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (ppFile != NULL) { - *ppFile = NULL; - } - if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { - return DRMP3_INVALID_ARGS; - } -#if defined(DRMP3_HAS_WFOPEN) - { - #if defined(_MSC_VER) && _MSC_VER >= 1400 - errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode); - if (err != 0) { - return drmp3_result_from_errno(err); - } - #else - *ppFile = _wfopen(pFilePath, pOpenMode); - if (*ppFile == NULL) { - return drmp3_result_from_errno(errno); - } - #endif - (void)pAllocationCallbacks; - } -#else - { - mbstate_t mbs; - size_t lenMB; - const wchar_t* pFilePathTemp = pFilePath; - char* pFilePathMB = NULL; - char pOpenModeMB[32] = {0}; - DRMP3_ZERO_OBJECT(&mbs); - lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs); - if (lenMB == (size_t)-1) { - return drmp3_result_from_errno(errno); - } - pFilePathMB = (char*)drmp3__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks); - if (pFilePathMB == NULL) { - return DRMP3_OUT_OF_MEMORY; - } - pFilePathTemp = pFilePath; - DRMP3_ZERO_OBJECT(&mbs); - wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs); - { - size_t i = 0; - for (;;) { - if (pOpenMode[i] == 0) { - pOpenModeMB[i] = '\0'; - break; - } - pOpenModeMB[i] = (char)pOpenMode[i]; - i += 1; - } - } - *ppFile = fopen(pFilePathMB, pOpenModeMB); - drmp3__free_from_callbacks(pFilePathMB, pAllocationCallbacks); - } - if (*ppFile == NULL) { - return DRMP3_ERROR; - } -#endif - return DRMP3_SUCCESS; -} -static size_t drmp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead) -{ - return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData); -} -static drmp3_bool32 drmp3__on_seek_stdio(void* pUserData, int offset, drmp3_seek_origin origin) -{ - return fseek((FILE*)pUserData, offset, (origin == drmp3_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; -} -DRMP3_API drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3_bool32 result; - FILE* pFile; - if (drmp3_fopen(&pFile, pFilePath, "rb") != DRMP3_SUCCESS) { - return DRMP3_FALSE; - } - result = drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (result != DRMP3_TRUE) { - fclose(pFile); - return result; - } - return DRMP3_TRUE; -} -DRMP3_API drmp3_bool32 drmp3_init_file_w(drmp3* pMP3, const wchar_t* pFilePath, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3_bool32 result; - FILE* pFile; - if (drmp3_wfopen(&pFile, pFilePath, L"rb", pAllocationCallbacks) != DRMP3_SUCCESS) { - return DRMP3_FALSE; - } - result = drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks); - if (result != DRMP3_TRUE) { - fclose(pFile); - return result; - } - return DRMP3_TRUE; -} -#endif -DRMP3_API void drmp3_uninit(drmp3* pMP3) -{ - if (pMP3 == NULL) { - return; - } -#ifndef DR_MP3_NO_STDIO - if (pMP3->onRead == drmp3__on_read_stdio) { - FILE* pFile = (FILE*)pMP3->pUserData; - if (pFile != NULL) { - fclose(pFile); - pMP3->pUserData = NULL; - } - } -#endif - drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks); -} -#if defined(DR_MP3_FLOAT_OUTPUT) -static void drmp3_f32_to_s16(drmp3_int16* dst, const float* src, drmp3_uint64 sampleCount) -{ - drmp3_uint64 i; - drmp3_uint64 i4; - drmp3_uint64 sampleCount4; - i = 0; - sampleCount4 = sampleCount >> 2; - for (i4 = 0; i4 < sampleCount4; i4 += 1) { - float x0 = src[i+0]; - float x1 = src[i+1]; - float x2 = src[i+2]; - float x3 = src[i+3]; - x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0)); - x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1)); - x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2)); - x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3)); - x0 = x0 * 32767.0f; - x1 = x1 * 32767.0f; - x2 = x2 * 32767.0f; - x3 = x3 * 32767.0f; - dst[i+0] = (drmp3_int16)x0; - dst[i+1] = (drmp3_int16)x1; - dst[i+2] = (drmp3_int16)x2; - dst[i+3] = (drmp3_int16)x3; - i += 4; - } - for (; i < sampleCount; i += 1) { - float x = src[i]; - x = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); - x = x * 32767.0f; - dst[i] = (drmp3_int16)x; - } -} -#endif -#if !defined(DR_MP3_FLOAT_OUTPUT) -static void drmp3_s16_to_f32(float* dst, const drmp3_int16* src, drmp3_uint64 sampleCount) -{ - drmp3_uint64 i; - for (i = 0; i < sampleCount; i += 1) { - float x = (float)src[i]; - x = x * 0.000030517578125f; - dst[i] = x; - } -} -#endif -static drmp3_uint64 drmp3_read_pcm_frames_raw(drmp3* pMP3, drmp3_uint64 framesToRead, void* pBufferOut) -{ - drmp3_uint64 totalFramesRead = 0; - DRMP3_ASSERT(pMP3 != NULL); - DRMP3_ASSERT(pMP3->onRead != NULL); - while (framesToRead > 0) { - drmp3_uint32 framesToConsume = (drmp3_uint32)DRMP3_MIN(pMP3->pcmFramesRemainingInMP3Frame, framesToRead); - if (pBufferOut != NULL) { - #if defined(DR_MP3_FLOAT_OUTPUT) - float* pFramesOutF32 = (float*)DRMP3_OFFSET_PTR(pBufferOut, sizeof(float) * totalFramesRead * pMP3->channels); - float* pFramesInF32 = (float*)DRMP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(float) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels); - DRMP3_COPY_MEMORY(pFramesOutF32, pFramesInF32, sizeof(float) * framesToConsume * pMP3->channels); - #else - drmp3_int16* pFramesOutS16 = (drmp3_int16*)DRMP3_OFFSET_PTR(pBufferOut, sizeof(drmp3_int16) * totalFramesRead * pMP3->channels); - drmp3_int16* pFramesInS16 = (drmp3_int16*)DRMP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(drmp3_int16) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels); - DRMP3_COPY_MEMORY(pFramesOutS16, pFramesInS16, sizeof(drmp3_int16) * framesToConsume * pMP3->channels); - #endif - } - pMP3->currentPCMFrame += framesToConsume; - pMP3->pcmFramesConsumedInMP3Frame += framesToConsume; - pMP3->pcmFramesRemainingInMP3Frame -= framesToConsume; - totalFramesRead += framesToConsume; - framesToRead -= framesToConsume; - if (framesToRead == 0) { - break; - } - DRMP3_ASSERT(pMP3->pcmFramesRemainingInMP3Frame == 0); - if (drmp3_decode_next_frame(pMP3) == 0) { - break; - } - } - return totalFramesRead; -} -DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut) -{ - if (pMP3 == NULL || pMP3->onRead == NULL) { - return 0; - } -#if defined(DR_MP3_FLOAT_OUTPUT) - return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut); -#else - { - drmp3_int16 pTempS16[8192]; - drmp3_uint64 totalPCMFramesRead = 0; - while (totalPCMFramesRead < framesToRead) { - drmp3_uint64 framesJustRead; - drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead; - drmp3_uint64 framesToReadNow = DRMP3_COUNTOF(pTempS16) / pMP3->channels; - if (framesToReadNow > framesRemaining) { - framesToReadNow = framesRemaining; - } - framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempS16); - if (framesJustRead == 0) { - break; - } - drmp3_s16_to_f32((float*)DRMP3_OFFSET_PTR(pBufferOut, sizeof(float) * totalPCMFramesRead * pMP3->channels), pTempS16, framesJustRead * pMP3->channels); - totalPCMFramesRead += framesJustRead; - } - return totalPCMFramesRead; - } -#endif -} -DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut) -{ - if (pMP3 == NULL || pMP3->onRead == NULL) { - return 0; - } -#if !defined(DR_MP3_FLOAT_OUTPUT) - return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut); -#else - { - float pTempF32[4096]; - drmp3_uint64 totalPCMFramesRead = 0; - while (totalPCMFramesRead < framesToRead) { - drmp3_uint64 framesJustRead; - drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead; - drmp3_uint64 framesToReadNow = DRMP3_COUNTOF(pTempF32) / pMP3->channels; - if (framesToReadNow > framesRemaining) { - framesToReadNow = framesRemaining; - } - framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempF32); - if (framesJustRead == 0) { - break; - } - drmp3_f32_to_s16((drmp3_int16*)DRMP3_OFFSET_PTR(pBufferOut, sizeof(drmp3_int16) * totalPCMFramesRead * pMP3->channels), pTempF32, framesJustRead * pMP3->channels); - totalPCMFramesRead += framesJustRead; - } - return totalPCMFramesRead; - } -#endif -} -static void drmp3_reset(drmp3* pMP3) -{ - DRMP3_ASSERT(pMP3 != NULL); - pMP3->pcmFramesConsumedInMP3Frame = 0; - pMP3->pcmFramesRemainingInMP3Frame = 0; - pMP3->currentPCMFrame = 0; - pMP3->dataSize = 0; - pMP3->atEnd = DRMP3_FALSE; - drmp3dec_init(&pMP3->decoder); -} -static drmp3_bool32 drmp3_seek_to_start_of_stream(drmp3* pMP3) -{ - DRMP3_ASSERT(pMP3 != NULL); - DRMP3_ASSERT(pMP3->onSeek != NULL); - if (!drmp3__on_seek(pMP3, 0, drmp3_seek_origin_start)) { - return DRMP3_FALSE; - } - drmp3_reset(pMP3); - return DRMP3_TRUE; -} -static drmp3_bool32 drmp3_seek_forward_by_pcm_frames__brute_force(drmp3* pMP3, drmp3_uint64 frameOffset) -{ - drmp3_uint64 framesRead; -#if defined(DR_MP3_FLOAT_OUTPUT) - framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL); -#else - framesRead = drmp3_read_pcm_frames_s16(pMP3, frameOffset, NULL); -#endif - if (framesRead != frameOffset) { - return DRMP3_FALSE; - } - return DRMP3_TRUE; -} -static drmp3_bool32 drmp3_seek_to_pcm_frame__brute_force(drmp3* pMP3, drmp3_uint64 frameIndex) -{ - DRMP3_ASSERT(pMP3 != NULL); - if (frameIndex == pMP3->currentPCMFrame) { - return DRMP3_TRUE; - } - if (frameIndex < pMP3->currentPCMFrame) { - if (!drmp3_seek_to_start_of_stream(pMP3)) { - return DRMP3_FALSE; - } - } - DRMP3_ASSERT(frameIndex >= pMP3->currentPCMFrame); - return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->currentPCMFrame)); -} -static drmp3_bool32 drmp3_find_closest_seek_point(drmp3* pMP3, drmp3_uint64 frameIndex, drmp3_uint32* pSeekPointIndex) -{ - drmp3_uint32 iSeekPoint; - DRMP3_ASSERT(pSeekPointIndex != NULL); - *pSeekPointIndex = 0; - if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) { - return DRMP3_FALSE; - } - for (iSeekPoint = 0; iSeekPoint < pMP3->seekPointCount; ++iSeekPoint) { - if (pMP3->pSeekPoints[iSeekPoint].pcmFrameIndex > frameIndex) { - break; - } - *pSeekPointIndex = iSeekPoint; - } - return DRMP3_TRUE; -} -static drmp3_bool32 drmp3_seek_to_pcm_frame__seek_table(drmp3* pMP3, drmp3_uint64 frameIndex) -{ - drmp3_seek_point seekPoint; - drmp3_uint32 priorSeekPointIndex; - drmp3_uint16 iMP3Frame; - drmp3_uint64 leftoverFrames; - DRMP3_ASSERT(pMP3 != NULL); - DRMP3_ASSERT(pMP3->pSeekPoints != NULL); - DRMP3_ASSERT(pMP3->seekPointCount > 0); - if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) { - seekPoint = pMP3->pSeekPoints[priorSeekPointIndex]; - } else { - seekPoint.seekPosInBytes = 0; - seekPoint.pcmFrameIndex = 0; - seekPoint.mp3FramesToDiscard = 0; - seekPoint.pcmFramesToDiscard = 0; - } - if (!drmp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, drmp3_seek_origin_start)) { - return DRMP3_FALSE; - } - drmp3_reset(pMP3); - for (iMP3Frame = 0; iMP3Frame < seekPoint.mp3FramesToDiscard; ++iMP3Frame) { - drmp3_uint32 pcmFramesRead; - drmp3d_sample_t* pPCMFrames; - pPCMFrames = NULL; - if (iMP3Frame == seekPoint.mp3FramesToDiscard-1) { - pPCMFrames = (drmp3d_sample_t*)pMP3->pcmFrames; - } - pcmFramesRead = drmp3_decode_next_frame_ex(pMP3, pPCMFrames); - if (pcmFramesRead == 0) { - return DRMP3_FALSE; - } - } - pMP3->currentPCMFrame = seekPoint.pcmFrameIndex - seekPoint.pcmFramesToDiscard; - leftoverFrames = frameIndex - pMP3->currentPCMFrame; - return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames); -} -DRMP3_API drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex) -{ - if (pMP3 == NULL || pMP3->onSeek == NULL) { - return DRMP3_FALSE; - } - if (frameIndex == 0) { - return drmp3_seek_to_start_of_stream(pMP3); - } - if (pMP3->pSeekPoints != NULL && pMP3->seekPointCount > 0) { - return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex); - } else { - return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex); - } -} -DRMP3_API drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount) -{ - drmp3_uint64 currentPCMFrame; - drmp3_uint64 totalPCMFrameCount; - drmp3_uint64 totalMP3FrameCount; - if (pMP3 == NULL) { - return DRMP3_FALSE; - } - if (pMP3->onSeek == NULL) { - return DRMP3_FALSE; - } - currentPCMFrame = pMP3->currentPCMFrame; - if (!drmp3_seek_to_start_of_stream(pMP3)) { - return DRMP3_FALSE; - } - totalPCMFrameCount = 0; - totalMP3FrameCount = 0; - for (;;) { - drmp3_uint32 pcmFramesInCurrentMP3Frame; - pcmFramesInCurrentMP3Frame = drmp3_decode_next_frame_ex(pMP3, NULL); - if (pcmFramesInCurrentMP3Frame == 0) { - break; - } - totalPCMFrameCount += pcmFramesInCurrentMP3Frame; - totalMP3FrameCount += 1; - } - if (!drmp3_seek_to_start_of_stream(pMP3)) { - return DRMP3_FALSE; - } - if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) { - return DRMP3_FALSE; - } - if (pMP3FrameCount != NULL) { - *pMP3FrameCount = totalMP3FrameCount; - } - if (pPCMFrameCount != NULL) { - *pPCMFrameCount = totalPCMFrameCount; - } - return DRMP3_TRUE; -} -DRMP3_API drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3) -{ - drmp3_uint64 totalPCMFrameCount; - if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) { - return 0; - } - return totalPCMFrameCount; -} -DRMP3_API drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3) -{ - drmp3_uint64 totalMP3FrameCount; - if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, NULL)) { - return 0; - } - return totalMP3FrameCount; -} -static void drmp3__accumulate_running_pcm_frame_count(drmp3* pMP3, drmp3_uint32 pcmFrameCountIn, drmp3_uint64* pRunningPCMFrameCount, float* pRunningPCMFrameCountFractionalPart) -{ - float srcRatio; - float pcmFrameCountOutF; - drmp3_uint32 pcmFrameCountOut; - srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate; - DRMP3_ASSERT(srcRatio > 0); - pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio); - pcmFrameCountOut = (drmp3_uint32)pcmFrameCountOutF; - *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut; - *pRunningPCMFrameCount += pcmFrameCountOut; -} -typedef struct -{ - drmp3_uint64 bytePos; - drmp3_uint64 pcmFrameIndex; -} drmp3__seeking_mp3_frame_info; -DRMP3_API drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints) -{ - drmp3_uint32 seekPointCount; - drmp3_uint64 currentPCMFrame; - drmp3_uint64 totalMP3FrameCount; - drmp3_uint64 totalPCMFrameCount; - if (pMP3 == NULL || pSeekPointCount == NULL || pSeekPoints == NULL) { - return DRMP3_FALSE; - } - seekPointCount = *pSeekPointCount; - if (seekPointCount == 0) { - return DRMP3_FALSE; - } - currentPCMFrame = pMP3->currentPCMFrame; - if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, &totalPCMFrameCount)) { - return DRMP3_FALSE; - } - if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) { - seekPointCount = 1; - pSeekPoints[0].seekPosInBytes = 0; - pSeekPoints[0].pcmFrameIndex = 0; - pSeekPoints[0].mp3FramesToDiscard = 0; - pSeekPoints[0].pcmFramesToDiscard = 0; - } else { - drmp3_uint64 pcmFramesBetweenSeekPoints; - drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1]; - drmp3_uint64 runningPCMFrameCount = 0; - float runningPCMFrameCountFractionalPart = 0; - drmp3_uint64 nextTargetPCMFrame; - drmp3_uint32 iMP3Frame; - drmp3_uint32 iSeekPoint; - if (seekPointCount > totalMP3FrameCount-1) { - seekPointCount = (drmp3_uint32)totalMP3FrameCount-1; - } - pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1); - if (!drmp3_seek_to_start_of_stream(pMP3)) { - return DRMP3_FALSE; - } - for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) { - drmp3_uint32 pcmFramesInCurrentMP3FrameIn; - DRMP3_ASSERT(pMP3->streamCursor >= pMP3->dataSize); - mp3FrameInfo[iMP3Frame].bytePos = pMP3->streamCursor - pMP3->dataSize; - mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount; - pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL); - if (pcmFramesInCurrentMP3FrameIn == 0) { - return DRMP3_FALSE; - } - drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart); - } - nextTargetPCMFrame = 0; - for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) { - nextTargetPCMFrame += pcmFramesBetweenSeekPoints; - for (;;) { - if (nextTargetPCMFrame < runningPCMFrameCount) { - pSeekPoints[iSeekPoint].seekPosInBytes = mp3FrameInfo[0].bytePos; - pSeekPoints[iSeekPoint].pcmFrameIndex = nextTargetPCMFrame; - pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES; - pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex); - break; - } else { - size_t i; - drmp3_uint32 pcmFramesInCurrentMP3FrameIn; - for (i = 0; i < DRMP3_COUNTOF(mp3FrameInfo)-1; ++i) { - mp3FrameInfo[i] = mp3FrameInfo[i+1]; - } - mp3FrameInfo[DRMP3_COUNTOF(mp3FrameInfo)-1].bytePos = pMP3->streamCursor - pMP3->dataSize; - mp3FrameInfo[DRMP3_COUNTOF(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount; - pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL); - if (pcmFramesInCurrentMP3FrameIn == 0) { - pSeekPoints[iSeekPoint].seekPosInBytes = mp3FrameInfo[0].bytePos; - pSeekPoints[iSeekPoint].pcmFrameIndex = nextTargetPCMFrame; - pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES; - pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex); - break; - } - drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart); - } - } - } - if (!drmp3_seek_to_start_of_stream(pMP3)) { - return DRMP3_FALSE; - } - if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) { - return DRMP3_FALSE; - } - } - *pSeekPointCount = seekPointCount; - return DRMP3_TRUE; -} -DRMP3_API drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints) -{ - if (pMP3 == NULL) { - return DRMP3_FALSE; - } - if (seekPointCount == 0 || pSeekPoints == NULL) { - pMP3->seekPointCount = 0; - pMP3->pSeekPoints = NULL; - } else { - pMP3->seekPointCount = seekPointCount; - pMP3->pSeekPoints = pSeekPoints; - } - return DRMP3_TRUE; -} -static float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) -{ - drmp3_uint64 totalFramesRead = 0; - drmp3_uint64 framesCapacity = 0; - float* pFrames = NULL; - float temp[4096]; - DRMP3_ASSERT(pMP3 != NULL); - for (;;) { - drmp3_uint64 framesToReadRightNow = DRMP3_COUNTOF(temp) / pMP3->channels; - drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp); - if (framesJustRead == 0) { - break; - } - if (framesCapacity < totalFramesRead + framesJustRead) { - drmp3_uint64 oldFramesBufferSize; - drmp3_uint64 newFramesBufferSize; - drmp3_uint64 newFramesCap; - float* pNewFrames; - newFramesCap = framesCapacity * 2; - if (newFramesCap < totalFramesRead + framesJustRead) { - newFramesCap = totalFramesRead + framesJustRead; - } - oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float); - newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(float); - if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) { - break; - } - pNewFrames = (float*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); - if (pNewFrames == NULL) { - drmp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks); - break; - } - pFrames = pNewFrames; - framesCapacity = newFramesCap; - } - DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(float))); - totalFramesRead += framesJustRead; - if (framesJustRead != framesToReadRightNow) { - break; - } - } - if (pConfig != NULL) { - pConfig->channels = pMP3->channels; - pConfig->sampleRate = pMP3->sampleRate; - } - drmp3_uninit(pMP3); - if (pTotalFrameCount) { - *pTotalFrameCount = totalFramesRead; - } - return pFrames; -} -static drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) -{ - drmp3_uint64 totalFramesRead = 0; - drmp3_uint64 framesCapacity = 0; - drmp3_int16* pFrames = NULL; - drmp3_int16 temp[4096]; - DRMP3_ASSERT(pMP3 != NULL); - for (;;) { - drmp3_uint64 framesToReadRightNow = DRMP3_COUNTOF(temp) / pMP3->channels; - drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_s16(pMP3, framesToReadRightNow, temp); - if (framesJustRead == 0) { - break; - } - if (framesCapacity < totalFramesRead + framesJustRead) { - drmp3_uint64 newFramesBufferSize; - drmp3_uint64 oldFramesBufferSize; - drmp3_uint64 newFramesCap; - drmp3_int16* pNewFrames; - newFramesCap = framesCapacity * 2; - if (newFramesCap < totalFramesRead + framesJustRead) { - newFramesCap = totalFramesRead + framesJustRead; - } - oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(drmp3_int16); - newFramesBufferSize = newFramesCap * pMP3->channels * sizeof(drmp3_int16); - if (newFramesBufferSize > (drmp3_uint64)DRMP3_SIZE_MAX) { - break; - } - pNewFrames = (drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks); - if (pNewFrames == NULL) { - drmp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks); - break; - } - pFrames = pNewFrames; - framesCapacity = newFramesCap; - } - DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(drmp3_int16))); - totalFramesRead += framesJustRead; - if (framesJustRead != framesToReadRightNow) { - break; - } - } - if (pConfig != NULL) { - pConfig->channels = pMP3->channels; - pConfig->sampleRate = pMP3->sampleRate; - } - drmp3_uninit(pMP3); - if (pTotalFrameCount) { - *pTotalFrameCount = totalFramesRead; - } - return pFrames; -} -DRMP3_API float* drmp3_open_and_read_pcm_frames_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3 mp3; - if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) { - return NULL; - } - return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount); -} -DRMP3_API drmp3_int16* drmp3_open_and_read_pcm_frames_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3 mp3; - if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) { - return NULL; - } - return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount); -} -DRMP3_API float* drmp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3 mp3; - if (!drmp3_init_memory(&mp3, pData, dataSize, pAllocationCallbacks)) { - return NULL; - } - return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount); -} -DRMP3_API drmp3_int16* drmp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3 mp3; - if (!drmp3_init_memory(&mp3, pData, dataSize, pAllocationCallbacks)) { - return NULL; - } - return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount); -} -#ifndef DR_MP3_NO_STDIO -DRMP3_API float* drmp3_open_file_and_read_pcm_frames_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3 mp3; - if (!drmp3_init_file(&mp3, filePath, pAllocationCallbacks)) { - return NULL; - } - return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount); -} -DRMP3_API drmp3_int16* drmp3_open_file_and_read_pcm_frames_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - drmp3 mp3; - if (!drmp3_init_file(&mp3, filePath, pAllocationCallbacks)) { - return NULL; - } - return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount); -} -#endif -DRMP3_API void* drmp3_malloc(size_t sz, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - return drmp3__malloc_from_callbacks(sz, pAllocationCallbacks); - } else { - return drmp3__malloc_default(sz, NULL); - } -} -DRMP3_API void drmp3_free(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks) -{ - if (pAllocationCallbacks != NULL) { - drmp3__free_from_callbacks(p, pAllocationCallbacks); - } else { - drmp3__free_default(p, NULL); - } -} -#endif -/* dr_mp3_c end */ -#endif /* DRMP3_IMPLEMENTATION */ -#endif /* MA_NO_MP3 */ - - -/* End globally disabled warnings. */ -#if defined(_MSC_VER) - #pragma warning(pop) -#endif - -#endif /* miniaudio_c */ -#endif /* MINIAUDIO_IMPLEMENTATION */ - - -/* -This software is available as a choice of the following licenses. Choose -whichever you prefer. - -=============================================================================== -ALTERNATIVE 1 - Public Domain (www.unlicense.org) -=============================================================================== -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. - -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to - -=============================================================================== -ALTERNATIVE 2 - MIT No Attribution -=============================================================================== -Copyright 2020 David Reid - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ diff --git a/dep/dr_soft/miniaudio_impl.c b/dep/dr_soft/miniaudio_impl.c deleted file mode 100644 index 4e86fab..0000000 --- a/dep/dr_soft/miniaudio_impl.c +++ /dev/null @@ -1,11 +0,0 @@ -#define MA_NO_GENERATION -#define MA_NO_DECODING -#define MA_NO_ENCODING -#define MA_NO_WAV -#define MA_NO_FLAC -#define MA_NO_MP3 -#define MA_NO_ENGINE -#define MA_NO_NODE_GRAPH -#define MA_NO_RESOURCE_MANAGER -#define MINIAUDIO_IMPLEMENTATION -#include "miniaudio.h" diff --git a/dep/glfw/glfw3.dll b/dep/glfw/glfw3.dll deleted file mode 100755 index b7afff54f59c038694ec051729be0e4cc1a78e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242176 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 b{LkM%Q09HZd{0nRi-_Qp|9||?UV(oD!02Z` diff --git a/dep/glfw/glfw3.h b/dep/glfw/glfw3.h deleted file mode 100755 index 671ba72..0000000 --- a/dep/glfw/glfw3.h +++ /dev/null @@ -1,5873 +0,0 @@ -/************************************************************************* - * GLFW 3.3 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2019 Camilla Löwy - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_h_ -#define _glfw3_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @file glfw3.h - * @brief The header of the GLFW 3 API. - * - * This is the header file of the GLFW 3 API. It defines all its types and - * declares all its functions. - * - * For more information about how to use this file, see @ref build_include. - */ -/*! @defgroup context Context reference - * @brief Functions and types related to OpenGL and OpenGL ES contexts. - * - * This is the reference documentation for OpenGL and OpenGL ES context related - * functions. For more task-oriented information, see the @ref context_guide. - */ -/*! @defgroup vulkan Vulkan reference - * @brief Functions and types related to Vulkan. - * - * This is the reference documentation for Vulkan related functions and types. - * For more task-oriented information, see the @ref vulkan_guide. - */ -/*! @defgroup init Initialization, version and error reference - * @brief Functions and types related to initialization and error handling. - * - * This is the reference documentation for initialization and termination of - * the library, version management and error handling. For more task-oriented - * information, see the @ref intro_guide. - */ -/*! @defgroup input Input reference - * @brief Functions and types related to input handling. - * - * This is the reference documentation for input related functions and types. - * For more task-oriented information, see the @ref input_guide. - */ -/*! @defgroup monitor Monitor reference - * @brief Functions and types related to monitors. - * - * This is the reference documentation for monitor related functions and types. - * For more task-oriented information, see the @ref monitor_guide. - */ -/*! @defgroup window Window reference - * @brief Functions and types related to windows. - * - * This is the reference documentation for window related functions and types, - * including creation, deletion and event polling. For more task-oriented - * information, see the @ref window_guide. - */ - - -/************************************************************************* - * Compiler- and platform-specific preprocessor work - *************************************************************************/ - -/* If we are we on Windows, we want a single define for it. - */ -#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) - #define _WIN32 -#endif /* _WIN32 */ - -/* Include because most Windows GLU headers need wchar_t and - * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. - * Include it unconditionally to avoid surprising side-effects. - */ -#include - -/* Include because it is needed by Vulkan and related functions. - * Include it unconditionally to avoid surprising side-effects. - */ -#include - -#if defined(GLFW_INCLUDE_VULKAN) - #include -#endif /* Vulkan header */ - -/* The Vulkan header may have indirectly included windows.h (because of - * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. - */ - -/* It is customary to use APIENTRY for OpenGL function pointer declarations on - * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. - */ -#if !defined(APIENTRY) - #if defined(_WIN32) - #define APIENTRY __stdcall - #else - #define APIENTRY - #endif - #define GLFW_APIENTRY_DEFINED -#endif /* APIENTRY */ - -/* Some Windows OpenGL headers need this. - */ -#if !defined(WINGDIAPI) && defined(_WIN32) - #define WINGDIAPI __declspec(dllimport) - #define GLFW_WINGDIAPI_DEFINED -#endif /* WINGDIAPI */ - -/* Some Windows GLU headers need this. - */ -#if !defined(CALLBACK) && defined(_WIN32) - #define CALLBACK __stdcall - #define GLFW_CALLBACK_DEFINED -#endif /* CALLBACK */ - -/* Include the chosen OpenGL or OpenGL ES headers. - */ -#if defined(GLFW_INCLUDE_ES1) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES2) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES3) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES31) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_ES32) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - -#elif defined(GLFW_INCLUDE_GLCOREARB) - - #if defined(__APPLE__) - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif /*GLFW_INCLUDE_GLEXT*/ - - #else /*__APPLE__*/ - - #include - - #endif /*__APPLE__*/ - -#elif !defined(GLFW_INCLUDE_NONE) - - #if defined(__APPLE__) - - #if !defined(GLFW_INCLUDE_GLEXT) - #define GL_GLEXT_LEGACY - #endif - #include - #if defined(GLFW_INCLUDE_GLU) - #include - #endif - - #else /*__APPLE__*/ - - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif - - #endif /*__APPLE__*/ - -#endif /* OpenGL and OpenGL ES headers */ - -#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) - /* GLFW_DLL must be defined by applications that are linking against the DLL - * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW - * configuration header when compiling the DLL version of the library. - */ - #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" -#endif - -/* GLFWAPI is used to declare public API functions for export - * from the DLL / shared library / dynamic library. - */ -#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a Win32 DLL */ - #define GLFWAPI __declspec(dllexport) -#elif defined(_WIN32) && defined(GLFW_DLL) - /* We are calling GLFW as a Win32 DLL */ - #define GLFWAPI __declspec(dllimport) -#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a shared / dynamic library */ - #define GLFWAPI __attribute__((visibility("default"))) -#else - /* We are building or calling GLFW as a static library */ - #define GLFWAPI -#endif - - -/************************************************************************* - * GLFW API tokens - *************************************************************************/ - -/*! @name GLFW version macros - * @{ */ -/*! @brief The major version number of the GLFW library. - * - * This is incremented when the API is changed in non-compatible ways. - * @ingroup init - */ -#define GLFW_VERSION_MAJOR 3 -/*! @brief The minor version number of the GLFW library. - * - * This is incremented when features are added to the API but it remains - * backward-compatible. - * @ingroup init - */ -#define GLFW_VERSION_MINOR 3 -/*! @brief The revision number of the GLFW library. - * - * This is incremented when a bug fix release is made that does not contain any - * API changes. - * @ingroup init - */ -#define GLFW_VERSION_REVISION 1 -/*! @} */ - -/*! @brief One. - * - * This is only semantic sugar for the number 1. You can instead use `1` or - * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal - * to one. - * - * @ingroup init - */ -#define GLFW_TRUE 1 -/*! @brief Zero. - * - * This is only semantic sugar for the number 0. You can instead use `0` or - * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is - * equal to zero. - * - * @ingroup init - */ -#define GLFW_FALSE 0 - -/*! @name Key and button actions - * @{ */ -/*! @brief The key or mouse button was released. - * - * The key or mouse button was released. - * - * @ingroup input - */ -#define GLFW_RELEASE 0 -/*! @brief The key or mouse button was pressed. - * - * The key or mouse button was pressed. - * - * @ingroup input - */ -#define GLFW_PRESS 1 -/*! @brief The key was held down until it repeated. - * - * The key was held down until it repeated. - * - * @ingroup input - */ -#define GLFW_REPEAT 2 -/*! @} */ - -/*! @defgroup hat_state Joystick hat states - * @brief Joystick hat states. - * - * See [joystick hat input](@ref joystick_hat) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_HAT_CENTERED 0 -#define GLFW_HAT_UP 1 -#define GLFW_HAT_RIGHT 2 -#define GLFW_HAT_DOWN 4 -#define GLFW_HAT_LEFT 8 -#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP) -#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN) -#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP) -#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN) -/*! @} */ - -/*! @defgroup keys Keyboard keys - * @brief Keyboard key IDs. - * - * See [key input](@ref input_key) for how these are used. - * - * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), - * but re-arranged to map to 7-bit ASCII for printable keys (function keys are - * put in the 256+ range). - * - * The naming of the key codes follow these rules: - * - The US keyboard layout is used - * - Names of printable alpha-numeric characters are used (e.g. "A", "R", - * "3", etc.) - * - For non-alphanumeric characters, Unicode:ish names are used (e.g. - * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not - * correspond to the Unicode standard (usually for brevity) - * - Keys that lack a clear US mapping are named "WORLD_x" - * - For non-printable keys, custom names are used (e.g. "F4", - * "BACKSPACE", etc.) - * - * @ingroup input - * @{ - */ - -/* The unknown key */ -#define GLFW_KEY_UNKNOWN -1 - -/* Printable keys */ -#define GLFW_KEY_SPACE 32 -#define GLFW_KEY_APOSTROPHE 39 /* ' */ -#define GLFW_KEY_COMMA 44 /* , */ -#define GLFW_KEY_MINUS 45 /* - */ -#define GLFW_KEY_PERIOD 46 /* . */ -#define GLFW_KEY_SLASH 47 /* / */ -#define GLFW_KEY_0 48 -#define GLFW_KEY_1 49 -#define GLFW_KEY_2 50 -#define GLFW_KEY_3 51 -#define GLFW_KEY_4 52 -#define GLFW_KEY_5 53 -#define GLFW_KEY_6 54 -#define GLFW_KEY_7 55 -#define GLFW_KEY_8 56 -#define GLFW_KEY_9 57 -#define GLFW_KEY_SEMICOLON 59 /* ; */ -#define GLFW_KEY_EQUAL 61 /* = */ -#define GLFW_KEY_A 65 -#define GLFW_KEY_B 66 -#define GLFW_KEY_C 67 -#define GLFW_KEY_D 68 -#define GLFW_KEY_E 69 -#define GLFW_KEY_F 70 -#define GLFW_KEY_G 71 -#define GLFW_KEY_H 72 -#define GLFW_KEY_I 73 -#define GLFW_KEY_J 74 -#define GLFW_KEY_K 75 -#define GLFW_KEY_L 76 -#define GLFW_KEY_M 77 -#define GLFW_KEY_N 78 -#define GLFW_KEY_O 79 -#define GLFW_KEY_P 80 -#define GLFW_KEY_Q 81 -#define GLFW_KEY_R 82 -#define GLFW_KEY_S 83 -#define GLFW_KEY_T 84 -#define GLFW_KEY_U 85 -#define GLFW_KEY_V 86 -#define GLFW_KEY_W 87 -#define GLFW_KEY_X 88 -#define GLFW_KEY_Y 89 -#define GLFW_KEY_Z 90 -#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ -#define GLFW_KEY_BACKSLASH 92 /* \ */ -#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ -#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ -#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ -#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ - -/* Function keys */ -#define GLFW_KEY_ESCAPE 256 -#define GLFW_KEY_ENTER 257 -#define GLFW_KEY_TAB 258 -#define GLFW_KEY_BACKSPACE 259 -#define GLFW_KEY_INSERT 260 -#define GLFW_KEY_DELETE 261 -#define GLFW_KEY_RIGHT 262 -#define GLFW_KEY_LEFT 263 -#define GLFW_KEY_DOWN 264 -#define GLFW_KEY_UP 265 -#define GLFW_KEY_PAGE_UP 266 -#define GLFW_KEY_PAGE_DOWN 267 -#define GLFW_KEY_HOME 268 -#define GLFW_KEY_END 269 -#define GLFW_KEY_CAPS_LOCK 280 -#define GLFW_KEY_SCROLL_LOCK 281 -#define GLFW_KEY_NUM_LOCK 282 -#define GLFW_KEY_PRINT_SCREEN 283 -#define GLFW_KEY_PAUSE 284 -#define GLFW_KEY_F1 290 -#define GLFW_KEY_F2 291 -#define GLFW_KEY_F3 292 -#define GLFW_KEY_F4 293 -#define GLFW_KEY_F5 294 -#define GLFW_KEY_F6 295 -#define GLFW_KEY_F7 296 -#define GLFW_KEY_F8 297 -#define GLFW_KEY_F9 298 -#define GLFW_KEY_F10 299 -#define GLFW_KEY_F11 300 -#define GLFW_KEY_F12 301 -#define GLFW_KEY_F13 302 -#define GLFW_KEY_F14 303 -#define GLFW_KEY_F15 304 -#define GLFW_KEY_F16 305 -#define GLFW_KEY_F17 306 -#define GLFW_KEY_F18 307 -#define GLFW_KEY_F19 308 -#define GLFW_KEY_F20 309 -#define GLFW_KEY_F21 310 -#define GLFW_KEY_F22 311 -#define GLFW_KEY_F23 312 -#define GLFW_KEY_F24 313 -#define GLFW_KEY_F25 314 -#define GLFW_KEY_KP_0 320 -#define GLFW_KEY_KP_1 321 -#define GLFW_KEY_KP_2 322 -#define GLFW_KEY_KP_3 323 -#define GLFW_KEY_KP_4 324 -#define GLFW_KEY_KP_5 325 -#define GLFW_KEY_KP_6 326 -#define GLFW_KEY_KP_7 327 -#define GLFW_KEY_KP_8 328 -#define GLFW_KEY_KP_9 329 -#define GLFW_KEY_KP_DECIMAL 330 -#define GLFW_KEY_KP_DIVIDE 331 -#define GLFW_KEY_KP_MULTIPLY 332 -#define GLFW_KEY_KP_SUBTRACT 333 -#define GLFW_KEY_KP_ADD 334 -#define GLFW_KEY_KP_ENTER 335 -#define GLFW_KEY_KP_EQUAL 336 -#define GLFW_KEY_LEFT_SHIFT 340 -#define GLFW_KEY_LEFT_CONTROL 341 -#define GLFW_KEY_LEFT_ALT 342 -#define GLFW_KEY_LEFT_SUPER 343 -#define GLFW_KEY_RIGHT_SHIFT 344 -#define GLFW_KEY_RIGHT_CONTROL 345 -#define GLFW_KEY_RIGHT_ALT 346 -#define GLFW_KEY_RIGHT_SUPER 347 -#define GLFW_KEY_MENU 348 - -#define GLFW_KEY_LAST GLFW_KEY_MENU - -/*! @} */ - -/*! @defgroup mods Modifier key flags - * @brief Modifier key flags. - * - * See [key input](@ref input_key) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief If this bit is set one or more Shift keys were held down. - * - * If this bit is set one or more Shift keys were held down. - */ -#define GLFW_MOD_SHIFT 0x0001 -/*! @brief If this bit is set one or more Control keys were held down. - * - * If this bit is set one or more Control keys were held down. - */ -#define GLFW_MOD_CONTROL 0x0002 -/*! @brief If this bit is set one or more Alt keys were held down. - * - * If this bit is set one or more Alt keys were held down. - */ -#define GLFW_MOD_ALT 0x0004 -/*! @brief If this bit is set one or more Super keys were held down. - * - * If this bit is set one or more Super keys were held down. - */ -#define GLFW_MOD_SUPER 0x0008 -/*! @brief If this bit is set the Caps Lock key is enabled. - * - * If this bit is set the Caps Lock key is enabled and the @ref - * GLFW_LOCK_KEY_MODS input mode is set. - */ -#define GLFW_MOD_CAPS_LOCK 0x0010 -/*! @brief If this bit is set the Num Lock key is enabled. - * - * If this bit is set the Num Lock key is enabled and the @ref - * GLFW_LOCK_KEY_MODS input mode is set. - */ -#define GLFW_MOD_NUM_LOCK 0x0020 - -/*! @} */ - -/*! @defgroup buttons Mouse buttons - * @brief Mouse button IDs. - * - * See [mouse button input](@ref input_mouse_button) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_MOUSE_BUTTON_1 0 -#define GLFW_MOUSE_BUTTON_2 1 -#define GLFW_MOUSE_BUTTON_3 2 -#define GLFW_MOUSE_BUTTON_4 3 -#define GLFW_MOUSE_BUTTON_5 4 -#define GLFW_MOUSE_BUTTON_6 5 -#define GLFW_MOUSE_BUTTON_7 6 -#define GLFW_MOUSE_BUTTON_8 7 -#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 -#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 -#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 -#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 -/*! @} */ - -/*! @defgroup joysticks Joysticks - * @brief Joystick IDs. - * - * See [joystick input](@ref joystick) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_JOYSTICK_1 0 -#define GLFW_JOYSTICK_2 1 -#define GLFW_JOYSTICK_3 2 -#define GLFW_JOYSTICK_4 3 -#define GLFW_JOYSTICK_5 4 -#define GLFW_JOYSTICK_6 5 -#define GLFW_JOYSTICK_7 6 -#define GLFW_JOYSTICK_8 7 -#define GLFW_JOYSTICK_9 8 -#define GLFW_JOYSTICK_10 9 -#define GLFW_JOYSTICK_11 10 -#define GLFW_JOYSTICK_12 11 -#define GLFW_JOYSTICK_13 12 -#define GLFW_JOYSTICK_14 13 -#define GLFW_JOYSTICK_15 14 -#define GLFW_JOYSTICK_16 15 -#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 -/*! @} */ - -/*! @defgroup gamepad_buttons Gamepad buttons - * @brief Gamepad buttons. - * - * See @ref gamepad for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_GAMEPAD_BUTTON_A 0 -#define GLFW_GAMEPAD_BUTTON_B 1 -#define GLFW_GAMEPAD_BUTTON_X 2 -#define GLFW_GAMEPAD_BUTTON_Y 3 -#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER 4 -#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER 5 -#define GLFW_GAMEPAD_BUTTON_BACK 6 -#define GLFW_GAMEPAD_BUTTON_START 7 -#define GLFW_GAMEPAD_BUTTON_GUIDE 8 -#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB 9 -#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB 10 -#define GLFW_GAMEPAD_BUTTON_DPAD_UP 11 -#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT 12 -#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN 13 -#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT 14 -#define GLFW_GAMEPAD_BUTTON_LAST GLFW_GAMEPAD_BUTTON_DPAD_LEFT - -#define GLFW_GAMEPAD_BUTTON_CROSS GLFW_GAMEPAD_BUTTON_A -#define GLFW_GAMEPAD_BUTTON_CIRCLE GLFW_GAMEPAD_BUTTON_B -#define GLFW_GAMEPAD_BUTTON_SQUARE GLFW_GAMEPAD_BUTTON_X -#define GLFW_GAMEPAD_BUTTON_TRIANGLE GLFW_GAMEPAD_BUTTON_Y -/*! @} */ - -/*! @defgroup gamepad_axes Gamepad axes - * @brief Gamepad axes. - * - * See @ref gamepad for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_GAMEPAD_AXIS_LEFT_X 0 -#define GLFW_GAMEPAD_AXIS_LEFT_Y 1 -#define GLFW_GAMEPAD_AXIS_RIGHT_X 2 -#define GLFW_GAMEPAD_AXIS_RIGHT_Y 3 -#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER 4 -#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 -#define GLFW_GAMEPAD_AXIS_LAST GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER -/*! @} */ - -/*! @defgroup errors Error codes - * @brief Error codes. - * - * See [error handling](@ref error_handling) for how these are used. - * - * @ingroup init - * @{ */ -/*! @brief No error has occurred. - * - * No error has occurred. - * - * @analysis Yay. - */ -#define GLFW_NO_ERROR 0 -/*! @brief GLFW has not been initialized. - * - * This occurs if a GLFW function was called that must not be called unless the - * library is [initialized](@ref intro_init). - * - * @analysis Application programmer error. Initialize GLFW before calling any - * function that requires initialization. - */ -#define GLFW_NOT_INITIALIZED 0x00010001 -/*! @brief No context is current for this thread. - * - * This occurs if a GLFW function was called that needs and operates on the - * current OpenGL or OpenGL ES context but no context is current on the calling - * thread. One such function is @ref glfwSwapInterval. - * - * @analysis Application programmer error. Ensure a context is current before - * calling functions that require a current context. - */ -#define GLFW_NO_CURRENT_CONTEXT 0x00010002 -/*! @brief One of the arguments to the function was an invalid enum value. - * - * One of the arguments to the function was an invalid enum value, for example - * requesting @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib. - * - * @analysis Application programmer error. Fix the offending call. - */ -#define GLFW_INVALID_ENUM 0x00010003 -/*! @brief One of the arguments to the function was an invalid value. - * - * One of the arguments to the function was an invalid value, for example - * requesting a non-existent OpenGL or OpenGL ES version like 2.7. - * - * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead - * result in a @ref GLFW_VERSION_UNAVAILABLE error. - * - * @analysis Application programmer error. Fix the offending call. - */ -#define GLFW_INVALID_VALUE 0x00010004 -/*! @brief A memory allocation failed. - * - * A memory allocation failed. - * - * @analysis A bug in GLFW or the underlying operating system. Report the bug - * to our [issue tracker](https://github.com/glfw/glfw/issues). - */ -#define GLFW_OUT_OF_MEMORY 0x00010005 -/*! @brief GLFW could not find support for the requested API on the system. - * - * GLFW could not find support for the requested API on the system. - * - * @analysis The installed graphics driver does not support the requested - * API, or does not support it via the chosen context creation backend. - * Below are a few examples. - * - * @par - * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only - * supports OpenGL ES via EGL, while Nvidia and Intel only support it via - * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa - * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary - * driver. Older graphics drivers do not support Vulkan. - */ -#define GLFW_API_UNAVAILABLE 0x00010006 -/*! @brief The requested OpenGL or OpenGL ES version is not available. - * - * The requested OpenGL or OpenGL ES version (including any requested context - * or framebuffer hints) is not available on this machine. - * - * @analysis The machine does not support your requirements. If your - * application is sufficiently flexible, downgrade your requirements and try - * again. Otherwise, inform the user that their machine does not match your - * requirements. - * - * @par - * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 - * comes out before the 4.x series gets that far, also fail with this error and - * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions - * will exist. - */ -#define GLFW_VERSION_UNAVAILABLE 0x00010007 -/*! @brief A platform-specific error occurred that does not match any of the - * more specific categories. - * - * A platform-specific error occurred that does not match any of the more - * specific categories. - * - * @analysis A bug or configuration error in GLFW, the underlying operating - * system or its drivers, or a lack of required resources. Report the issue to - * our [issue tracker](https://github.com/glfw/glfw/issues). - */ -#define GLFW_PLATFORM_ERROR 0x00010008 -/*! @brief The requested format is not supported or available. - * - * If emitted during window creation, the requested pixel format is not - * supported. - * - * If emitted when querying the clipboard, the contents of the clipboard could - * not be converted to the requested format. - * - * @analysis If emitted during window creation, one or more - * [hard constraints](@ref window_hints_hard) did not match any of the - * available pixel formats. If your application is sufficiently flexible, - * downgrade your requirements and try again. Otherwise, inform the user that - * their machine does not match your requirements. - * - * @par - * If emitted when querying the clipboard, ignore the error or report it to - * the user, as appropriate. - */ -#define GLFW_FORMAT_UNAVAILABLE 0x00010009 -/*! @brief The specified window does not have an OpenGL or OpenGL ES context. - * - * A window that does not have an OpenGL or OpenGL ES context was passed to - * a function that requires it to have one. - * - * @analysis Application programmer error. Fix the offending call. - */ -#define GLFW_NO_WINDOW_CONTEXT 0x0001000A -/*! @} */ - -/*! @addtogroup window - * @{ */ -/*! @brief Input focus window hint and attribute - * - * Input focus [window hint](@ref GLFW_FOCUSED_hint) or - * [window attribute](@ref GLFW_FOCUSED_attrib). - */ -#define GLFW_FOCUSED 0x00020001 -/*! @brief Window iconification window attribute - * - * Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib). - */ -#define GLFW_ICONIFIED 0x00020002 -/*! @brief Window resize-ability window hint and attribute - * - * Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and - * [window attribute](@ref GLFW_RESIZABLE_attrib). - */ -#define GLFW_RESIZABLE 0x00020003 -/*! @brief Window visibility window hint and attribute - * - * Window visibility [window hint](@ref GLFW_VISIBLE_hint) and - * [window attribute](@ref GLFW_VISIBLE_attrib). - */ -#define GLFW_VISIBLE 0x00020004 -/*! @brief Window decoration window hint and attribute - * - * Window decoration [window hint](@ref GLFW_DECORATED_hint) and - * [window attribute](@ref GLFW_DECORATED_attrib). - */ -#define GLFW_DECORATED 0x00020005 -/*! @brief Window auto-iconification window hint and attribute - * - * Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and - * [window attribute](@ref GLFW_AUTO_ICONIFY_attrib). - */ -#define GLFW_AUTO_ICONIFY 0x00020006 -/*! @brief Window decoration window hint and attribute - * - * Window decoration [window hint](@ref GLFW_FLOATING_hint) and - * [window attribute](@ref GLFW_FLOATING_attrib). - */ -#define GLFW_FLOATING 0x00020007 -/*! @brief Window maximization window hint and attribute - * - * Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and - * [window attribute](@ref GLFW_MAXIMIZED_attrib). - */ -#define GLFW_MAXIMIZED 0x00020008 -/*! @brief Cursor centering window hint - * - * Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint). - */ -#define GLFW_CENTER_CURSOR 0x00020009 -/*! @brief Window framebuffer transparency hint and attribute - * - * Window framebuffer transparency - * [window hint](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) and - * [window attribute](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib). - */ -#define GLFW_TRANSPARENT_FRAMEBUFFER 0x0002000A -/*! @brief Mouse cursor hover window attribute. - * - * Mouse cursor hover [window attribute](@ref GLFW_HOVERED_attrib). - */ -#define GLFW_HOVERED 0x0002000B -/*! @brief Input focus on calling show window hint and attribute - * - * Input focus [window hint](@ref GLFW_FOCUS_ON_SHOW_hint) or - * [window attribute](@ref GLFW_FOCUS_ON_SHOW_attrib). - */ -#define GLFW_FOCUS_ON_SHOW 0x0002000C - -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). - */ -#define GLFW_RED_BITS 0x00021001 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS). - */ -#define GLFW_GREEN_BITS 0x00021002 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS). - */ -#define GLFW_BLUE_BITS 0x00021003 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS). - */ -#define GLFW_ALPHA_BITS 0x00021004 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS). - */ -#define GLFW_DEPTH_BITS 0x00021005 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS). - */ -#define GLFW_STENCIL_BITS 0x00021006 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS). - */ -#define GLFW_ACCUM_RED_BITS 0x00021007 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS). - */ -#define GLFW_ACCUM_GREEN_BITS 0x00021008 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS). - */ -#define GLFW_ACCUM_BLUE_BITS 0x00021009 -/*! @brief Framebuffer bit depth hint. - * - * Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS). - */ -#define GLFW_ACCUM_ALPHA_BITS 0x0002100A -/*! @brief Framebuffer auxiliary buffer hint. - * - * Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS). - */ -#define GLFW_AUX_BUFFERS 0x0002100B -/*! @brief OpenGL stereoscopic rendering hint. - * - * OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO). - */ -#define GLFW_STEREO 0x0002100C -/*! @brief Framebuffer MSAA samples hint. - * - * Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES). - */ -#define GLFW_SAMPLES 0x0002100D -/*! @brief Framebuffer sRGB hint. - * - * Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE). - */ -#define GLFW_SRGB_CAPABLE 0x0002100E -/*! @brief Monitor refresh rate hint. - * - * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). - */ -#define GLFW_REFRESH_RATE 0x0002100F -/*! @brief Framebuffer double buffering hint. - * - * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER). - */ -#define GLFW_DOUBLEBUFFER 0x00021010 - -/*! @brief Context client API hint and attribute. - * - * Context client API [hint](@ref GLFW_CLIENT_API_hint) and - * [attribute](@ref GLFW_CLIENT_API_attrib). - */ -#define GLFW_CLIENT_API 0x00022001 -/*! @brief Context client API major version hint and attribute. - * - * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint) - * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib). - */ -#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 -/*! @brief Context client API minor version hint and attribute. - * - * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint) - * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib). - */ -#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 -/*! @brief Context client API revision number hint and attribute. - * - * Context client API revision number - * [attribute](@ref GLFW_CONTEXT_REVISION_attrib). - */ -#define GLFW_CONTEXT_REVISION 0x00022004 -/*! @brief Context robustness hint and attribute. - * - * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint) - * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib). - */ -#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 -/*! @brief OpenGL forward-compatibility hint and attribute. - * - * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) - * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib). - */ -#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 -/*! @brief OpenGL debug context hint and attribute. - * - * OpenGL debug context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and - * [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib). - */ -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 -/*! @brief OpenGL profile hint and attribute. - * - * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and - * [attribute](@ref GLFW_OPENGL_PROFILE_attrib). - */ -#define GLFW_OPENGL_PROFILE 0x00022008 -/*! @brief Context flush-on-release hint and attribute. - * - * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and - * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib). - */ -#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 -/*! @brief Context error suppression hint and attribute. - * - * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and - * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib). - */ -#define GLFW_CONTEXT_NO_ERROR 0x0002200A -/*! @brief Context creation API hint and attribute. - * - * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and - * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib). - */ -#define GLFW_CONTEXT_CREATION_API 0x0002200B -/*! @brief Window content area scaling window - * [window hint](@ref GLFW_SCALE_TO_MONITOR). - */ -#define GLFW_SCALE_TO_MONITOR 0x0002200C -/*! @brief macOS specific - * [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint). - */ -#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 -/*! @brief macOS specific - * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint). - */ -#define GLFW_COCOA_FRAME_NAME 0x00023002 -/*! @brief macOS specific - * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint). - */ -#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003 -/*! @brief X11 specific - * [window hint](@ref GLFW_X11_CLASS_NAME_hint). - */ -#define GLFW_X11_CLASS_NAME 0x00024001 -/*! @brief X11 specific - * [window hint](@ref GLFW_X11_CLASS_NAME_hint). - */ -#define GLFW_X11_INSTANCE_NAME 0x00024002 -/*! @} */ - -#define GLFW_NO_API 0 -#define GLFW_OPENGL_API 0x00030001 -#define GLFW_OPENGL_ES_API 0x00030002 - -#define GLFW_NO_ROBUSTNESS 0 -#define GLFW_NO_RESET_NOTIFICATION 0x00031001 -#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 - -#define GLFW_OPENGL_ANY_PROFILE 0 -#define GLFW_OPENGL_CORE_PROFILE 0x00032001 -#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 - -#define GLFW_CURSOR 0x00033001 -#define GLFW_STICKY_KEYS 0x00033002 -#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 -#define GLFW_LOCK_KEY_MODS 0x00033004 -#define GLFW_RAW_MOUSE_MOTION 0x00033005 - -#define GLFW_CURSOR_NORMAL 0x00034001 -#define GLFW_CURSOR_HIDDEN 0x00034002 -#define GLFW_CURSOR_DISABLED 0x00034003 - -#define GLFW_ANY_RELEASE_BEHAVIOR 0 -#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 -#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 - -#define GLFW_NATIVE_CONTEXT_API 0x00036001 -#define GLFW_EGL_CONTEXT_API 0x00036002 -#define GLFW_OSMESA_CONTEXT_API 0x00036003 - -/*! @defgroup shapes Standard cursor shapes - * @brief Standard system cursor shapes. - * - * See [standard cursor creation](@ref cursor_standard) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief The regular arrow cursor shape. - * - * The regular arrow cursor. - */ -#define GLFW_ARROW_CURSOR 0x00036001 -/*! @brief The text input I-beam cursor shape. - * - * The text input I-beam cursor shape. - */ -#define GLFW_IBEAM_CURSOR 0x00036002 -/*! @brief The crosshair shape. - * - * The crosshair shape. - */ -#define GLFW_CROSSHAIR_CURSOR 0x00036003 -/*! @brief The hand shape. - * - * The hand shape. - */ -#define GLFW_HAND_CURSOR 0x00036004 -/*! @brief The horizontal resize arrow shape. - * - * The horizontal resize arrow shape. - */ -#define GLFW_HRESIZE_CURSOR 0x00036005 -/*! @brief The vertical resize arrow shape. - * - * The vertical resize arrow shape. - */ -#define GLFW_VRESIZE_CURSOR 0x00036006 -/*! @} */ - -#define GLFW_CONNECTED 0x00040001 -#define GLFW_DISCONNECTED 0x00040002 - -/*! @addtogroup init - * @{ */ -/*! @brief Joystick hat buttons init hint. - * - * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS). - */ -#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001 -/*! @brief macOS specific init hint. - * - * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). - */ -#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001 -/*! @brief macOS specific init hint. - * - * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). - */ -#define GLFW_COCOA_MENUBAR 0x00051002 -/*! @} */ - -#define GLFW_DONT_CARE -1 - - -/************************************************************************* - * GLFW API types - *************************************************************************/ - -/*! @brief Client API function pointer type. - * - * Generic function pointer used for returning client API function pointers - * without forcing a cast from a regular pointer. - * - * @sa @ref context_glext - * @sa @ref glfwGetProcAddress - * - * @since Added in version 3.0. - * - * @ingroup context - */ -typedef void (*GLFWglproc)(void); - -/*! @brief Vulkan API function pointer type. - * - * Generic function pointer used for returning Vulkan API function pointers - * without forcing a cast from a regular pointer. - * - * @sa @ref vulkan_proc - * @sa @ref glfwGetInstanceProcAddress - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -typedef void (*GLFWvkproc)(void); - -/*! @brief Opaque monitor object. - * - * Opaque monitor object. - * - * @see @ref monitor_object - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef struct GLFWmonitor GLFWmonitor; - -/*! @brief Opaque window object. - * - * Opaque window object. - * - * @see @ref window_object - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef struct GLFWwindow GLFWwindow; - -/*! @brief Opaque cursor object. - * - * Opaque cursor object. - * - * @see @ref cursor_object - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef struct GLFWcursor GLFWcursor; - -/*! @brief The function pointer type for error callbacks. - * - * This is the function pointer type for error callbacks. An error callback - * function has the following signature: - * @code - * void callback_name(int error_code, const char* description) - * @endcode - * - * @param[in] error_code An [error code](@ref errors). Future releases may add - * more error codes. - * @param[in] description A UTF-8 encoded string describing the error. - * - * @pointer_lifetime The error description string is valid until the callback - * function returns. - * - * @sa @ref error_handling - * @sa @ref glfwSetErrorCallback - * - * @since Added in version 3.0. - * - * @ingroup init - */ -typedef void (* GLFWerrorfun)(int,const char*); - -/*! @brief The function pointer type for window position callbacks. - * - * This is the function pointer type for window position callbacks. A window - * position callback function has the following signature: - * @code - * void callback_name(GLFWwindow* window, int xpos, int ypos) - * @endcode - * - * @param[in] window The window that was moved. - * @param[in] xpos The new x-coordinate, in screen coordinates, of the - * upper-left corner of the content area of the window. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the - * upper-left corner of the content area of the window. - * - * @sa @ref window_pos - * @sa @ref glfwSetWindowPosCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); - -/*! @brief The function pointer type for window size callbacks. - * - * This is the function pointer type for window size callbacks. A window size - * callback function has the following signature: - * @code - * void callback_name(GLFWwindow* window, int width, int height) - * @endcode - * - * @param[in] window The window that was resized. - * @param[in] width The new width, in screen coordinates, of the window. - * @param[in] height The new height, in screen coordinates, of the window. - * - * @sa @ref window_size - * @sa @ref glfwSetWindowSizeCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); - -/*! @brief The function pointer type for window close callbacks. - * - * This is the function pointer type for window close callbacks. A window - * close callback function has the following signature: - * @code - * void function_name(GLFWwindow* window) - * @endcode - * - * @param[in] window The window that the user attempted to close. - * - * @sa @ref window_close - * @sa @ref glfwSetWindowCloseCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowclosefun)(GLFWwindow*); - -/*! @brief The function pointer type for window content refresh callbacks. - * - * This is the function pointer type for window content refresh callbacks. - * A window content refresh callback function has the following signature: - * @code - * void function_name(GLFWwindow* window); - * @endcode - * - * @param[in] window The window whose content needs to be refreshed. - * - * @sa @ref window_refresh - * @sa @ref glfwSetWindowRefreshCallback - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); - -/*! @brief The function pointer type for window focus callbacks. - * - * This is the function pointer type for window focus callbacks. A window - * focus callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int focused) - * @endcode - * - * @param[in] window The window that gained or lost input focus. - * @param[in] focused `GLFW_TRUE` if the window was given input focus, or - * `GLFW_FALSE` if it lost it. - * - * @sa @ref window_focus - * @sa @ref glfwSetWindowFocusCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); - -/*! @brief The function pointer type for window iconify callbacks. - * - * This is the function pointer type for window iconify callbacks. A window - * iconify callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int iconified) - * @endcode - * - * @param[in] window The window that was iconified or restored. - * @param[in] iconified `GLFW_TRUE` if the window was iconified, or - * `GLFW_FALSE` if it was restored. - * - * @sa @ref window_iconify - * @sa @ref glfwSetWindowIconifyCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); - -/*! @brief The function pointer type for window maximize callbacks. - * - * This is the function pointer type for window maximize callbacks. A window - * maximize callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int maximized) - * @endcode - * - * @param[in] window The window that was maximized or restored. - * @param[in] iconified `GLFW_TRUE` if the window was maximized, or - * `GLFW_FALSE` if it was restored. - * - * @sa @ref window_maximize - * @sa glfwSetWindowMaximizeCallback - * - * @since Added in version 3.3. - * - * @ingroup window - */ -typedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int); - -/*! @brief The function pointer type for framebuffer size callbacks. - * - * This is the function pointer type for framebuffer size callbacks. - * A framebuffer size callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int width, int height) - * @endcode - * - * @param[in] window The window whose framebuffer was resized. - * @param[in] width The new width, in pixels, of the framebuffer. - * @param[in] height The new height, in pixels, of the framebuffer. - * - * @sa @ref window_fbsize - * @sa @ref glfwSetFramebufferSizeCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); - -/*! @brief The function pointer type for window content scale callbacks. - * - * This is the function pointer type for window content scale callbacks. - * A window content scale callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, float xscale, float yscale) - * @endcode - * - * @param[in] window The window whose content scale changed. - * @param[in] xscale The new x-axis content scale of the window. - * @param[in] yscale The new y-axis content scale of the window. - * - * @sa @ref window_scale - * @sa @ref glfwSetWindowContentScaleCallback - * - * @since Added in version 3.3. - * - * @ingroup window - */ -typedef void (* GLFWwindowcontentscalefun)(GLFWwindow*,float,float); - -/*! @brief The function pointer type for mouse button callbacks. - * - * This is the function pointer type for mouse button callback functions. - * A mouse button callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int button, int action, int mods) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] button The [mouse button](@ref buttons) that was pressed or - * released. - * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. Future releases - * may add more actions. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_mouse_button - * @sa @ref glfwSetMouseButtonCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle and modifier mask parameters. - * - * @ingroup input - */ -typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); - -/*! @brief The function pointer type for cursor position callbacks. - * - * This is the function pointer type for cursor position callbacks. A cursor - * position callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, double xpos, double ypos); - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] xpos The new cursor x-coordinate, relative to the left edge of - * the content area. - * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the - * content area. - * - * @sa @ref cursor_pos - * @sa @ref glfwSetCursorPosCallback - * - * @since Added in version 3.0. Replaces `GLFWmouseposfun`. - * - * @ingroup input - */ -typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); - -/*! @brief The function pointer type for cursor enter/leave callbacks. - * - * This is the function pointer type for cursor enter/leave callbacks. - * A cursor enter/leave callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int entered) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content - * area, or `GLFW_FALSE` if it left it. - * - * @sa @ref cursor_enter - * @sa @ref glfwSetCursorEnterCallback - * - * @since Added in version 3.0. - * - * @ingroup input - */ -typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); - -/*! @brief The function pointer type for scroll callbacks. - * - * This is the function pointer type for scroll callbacks. A scroll callback - * function has the following signature: - * @code - * void function_name(GLFWwindow* window, double xoffset, double yoffset) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] xoffset The scroll offset along the x-axis. - * @param[in] yoffset The scroll offset along the y-axis. - * - * @sa @ref scrolling - * @sa @ref glfwSetScrollCallback - * - * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. - * - * @ingroup input - */ -typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); - -/*! @brief The function pointer type for keyboard key callbacks. - * - * This is the function pointer type for keyboard key callbacks. A keyboard - * key callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] key The [keyboard key](@ref keys) that was pressed or released. - * @param[in] scancode The system-specific scancode of the key. - * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future - * releases may add more actions. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_key - * @sa @ref glfwSetKeyCallback - * - * @since Added in version 1.0. - * @glfw3 Added window handle, scancode and modifier mask parameters. - * - * @ingroup input - */ -typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); - -/*! @brief The function pointer type for Unicode character callbacks. - * - * This is the function pointer type for Unicode character callbacks. - * A Unicode character callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * - * @sa @ref input_char - * @sa @ref glfwSetCharCallback - * - * @since Added in version 2.4. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); - -/*! @brief The function pointer type for Unicode character with modifiers - * callbacks. - * - * This is the function pointer type for Unicode character with modifiers - * callbacks. It is called for each input character, regardless of what - * modifier keys are held down. A Unicode character with modifiers callback - * function has the following signature: - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa @ref input_char - * @sa @ref glfwSetCharModsCallback - * - * @deprecated Scheduled for removal in version 4.0. - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); - -/*! @brief The function pointer type for path drop callbacks. - * - * This is the function pointer type for path drop callbacks. A path drop - * callback function has the following signature: - * @code - * void function_name(GLFWwindow* window, int path_count, const char* paths[]) - * @endcode - * - * @param[in] window The window that received the event. - * @param[in] path_count The number of dropped paths. - * @param[in] paths The UTF-8 encoded file and/or directory path names. - * - * @pointer_lifetime The path array and its strings are valid until the - * callback function returns. - * - * @sa @ref path_drop - * @sa @ref glfwSetDropCallback - * - * @since Added in version 3.1. - * - * @ingroup input - */ -typedef void (* GLFWdropfun)(GLFWwindow*,int,const char*[]); - -/*! @brief The function pointer type for monitor configuration callbacks. - * - * This is the function pointer type for monitor configuration callbacks. - * A monitor callback function has the following signature: - * @code - * void function_name(GLFWmonitor* monitor, int event) - * @endcode - * - * @param[in] monitor The monitor that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future - * releases may add more events. - * - * @sa @ref monitor_event - * @sa @ref glfwSetMonitorCallback - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); - -/*! @brief The function pointer type for joystick configuration callbacks. - * - * This is the function pointer type for joystick configuration callbacks. - * A joystick configuration callback function has the following signature: - * @code - * void function_name(int jid, int event) - * @endcode - * - * @param[in] jid The joystick that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future - * releases may add more events. - * - * @sa @ref joystick_event - * @sa @ref glfwSetJoystickCallback - * - * @since Added in version 3.2. - * - * @ingroup input - */ -typedef void (* GLFWjoystickfun)(int,int); - -/*! @brief Video mode type. - * - * This describes a single video mode. - * - * @sa @ref monitor_modes - * @sa @ref glfwGetVideoMode - * @sa @ref glfwGetVideoModes - * - * @since Added in version 1.0. - * @glfw3 Added refresh rate member. - * - * @ingroup monitor - */ -typedef struct GLFWvidmode -{ - /*! The width, in screen coordinates, of the video mode. - */ - int width; - /*! The height, in screen coordinates, of the video mode. - */ - int height; - /*! The bit depth of the red channel of the video mode. - */ - int redBits; - /*! The bit depth of the green channel of the video mode. - */ - int greenBits; - /*! The bit depth of the blue channel of the video mode. - */ - int blueBits; - /*! The refresh rate, in Hz, of the video mode. - */ - int refreshRate; -} GLFWvidmode; - -/*! @brief Gamma ramp. - * - * This describes the gamma ramp for a monitor. - * - * @sa @ref monitor_gamma - * @sa @ref glfwGetGammaRamp - * @sa @ref glfwSetGammaRamp - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -typedef struct GLFWgammaramp -{ - /*! An array of value describing the response of the red channel. - */ - unsigned short* red; - /*! An array of value describing the response of the green channel. - */ - unsigned short* green; - /*! An array of value describing the response of the blue channel. - */ - unsigned short* blue; - /*! The number of elements in each array. - */ - unsigned int size; -} GLFWgammaramp; - -/*! @brief Image data. - * - * This describes a single 2D image. See the documentation for each related - * function what the expected pixel format is. - * - * @sa @ref cursor_custom - * @sa @ref window_icon - * - * @since Added in version 2.1. - * @glfw3 Removed format and bytes-per-pixel members. - * - * @ingroup window - */ -typedef struct GLFWimage -{ - /*! The width, in pixels, of this image. - */ - int width; - /*! The height, in pixels, of this image. - */ - int height; - /*! The pixel data of this image, arranged left-to-right, top-to-bottom. - */ - unsigned char* pixels; -} GLFWimage; - -/*! @brief Gamepad input state - * - * This describes the input state of a gamepad. - * - * @sa @ref gamepad - * @sa @ref glfwGetGamepadState - * - * @since Added in version 3.3. - * - * @ingroup input - */ -typedef struct GLFWgamepadstate -{ - /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` - * or `GLFW_RELEASE`. - */ - unsigned char buttons[15]; - /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 - * to 1.0 inclusive. - */ - float axes[6]; -} GLFWgamepadstate; - - -/************************************************************************* - * GLFW API functions - *************************************************************************/ - -/*! @brief Initializes the GLFW library. - * - * This function initializes the GLFW library. Before most GLFW functions can - * be used, GLFW must be initialized, and before an application terminates GLFW - * should be terminated in order to free any resources allocated during or - * after initialization. - * - * If this function fails, it calls @ref glfwTerminate before returning. If it - * succeeds, you should call @ref glfwTerminate before the application exits. - * - * Additional calls to this function after successful initialization but before - * termination will return `GLFW_TRUE` immediately. - * - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. - * - * @remark @macos This function will change the current directory of the - * application to the `Contents/Resources` subdirectory of the application's - * bundle, if present. This can be disabled with the @ref - * GLFW_COCOA_CHDIR_RESOURCES init hint. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref intro_init - * @sa @ref glfwTerminate - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI int glfwInit(void); - -/*! @brief Terminates the GLFW library. - * - * This function destroys all remaining windows and cursors, restores any - * modified gamma ramps and frees any other allocated resources. Once this - * function is called, you must again call @ref glfwInit successfully before - * you will be able to use most GLFW functions. - * - * If GLFW has been successfully initialized, this function should be called - * before the application exits. If initialization fails, there is no need to - * call this function, as it is called by @ref glfwInit before it returns - * failure. - * - * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. - * - * @remark This function may be called before @ref glfwInit. - * - * @warning The contexts of any remaining windows must not be current on any - * other thread when this function is called. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref intro_init - * @sa @ref glfwInit - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwTerminate(void); - -/*! @brief Sets the specified init hint to the desired value. - * - * This function sets hints for the next initialization of GLFW. - * - * The values you set hints to are never reset by GLFW, but they only take - * effect during initialization. Once GLFW has been initialized, any values - * you set will be ignored until the library is terminated and initialized - * again. - * - * Some hints are platform specific. These may be set on any platform but they - * will only affect their specific platform. Other platforms will ignore them. - * Setting these hints requires no platform specific headers or functions. - * - * @param[in] hint The [init hint](@ref init_hints) to set. - * @param[in] value The new value of the init hint. - * - * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref - * GLFW_INVALID_VALUE. - * - * @remarks This function may be called before @ref glfwInit. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa init_hints - * @sa glfwInit - * - * @since Added in version 3.3. - * - * @ingroup init - */ -GLFWAPI void glfwInitHint(int hint, int value); - -/*! @brief Retrieves the version of the GLFW library. - * - * This function retrieves the major, minor and revision numbers of the GLFW - * library. It is intended for when you are using GLFW as a shared library and - * want to ensure that you are using the minimum required version. - * - * Any or all of the version arguments may be `NULL`. - * - * @param[out] major Where to store the major version number, or `NULL`. - * @param[out] minor Where to store the minor version number, or `NULL`. - * @param[out] rev Where to store the revision number, or `NULL`. - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref intro_version - * @sa @ref glfwGetVersionString - * - * @since Added in version 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); - -/*! @brief Returns a string describing the compile-time configuration. - * - * This function returns the compile-time generated - * [version string](@ref intro_version_string) of the GLFW library binary. It - * describes the version, platform, compiler and any platform-specific - * compile-time options. It should not be confused with the OpenGL or OpenGL - * ES version string, queried with `glGetString`. - * - * __Do not use the version string__ to parse the GLFW library version. The - * @ref glfwGetVersion function provides the version of the running library - * binary in numerical format. - * - * @return The ASCII encoded GLFW version string. - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @pointer_lifetime The returned string is static and compile-time generated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref intro_version - * @sa @ref glfwGetVersion - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI const char* glfwGetVersionString(void); - -/*! @brief Returns and clears the last error for the calling thread. - * - * This function returns and clears the [error code](@ref errors) of the last - * error that occurred on the calling thread, and optionally a UTF-8 encoded - * human-readable description of it. If no error has occurred since the last - * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is - * set to `NULL`. - * - * @param[in] description Where to store the error description pointer, or `NULL`. - * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR - * (zero). - * - * @errors None. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * next error occurs or the library is terminated. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref error_handling - * @sa @ref glfwSetErrorCallback - * - * @since Added in version 3.3. - * - * @ingroup init - */ -GLFWAPI int glfwGetError(const char** description); - -/*! @brief Sets the error callback. - * - * This function sets the error callback, which is called with an error code - * and a human-readable description each time a GLFW error occurs. - * - * The error code is set before the callback is called. Calling @ref - * glfwGetError from the error callback will return the same value as the error - * code argument. - * - * The error callback is called on the thread where the error occurred. If you - * are using GLFW from multiple threads, your error callback needs to be - * written accordingly. - * - * Because the description string may have been generated specifically for that - * error, it is not guaranteed to be valid after the callback has returned. If - * you wish to use it after the callback returns, you need to make a copy. - * - * Once set, the error callback remains set even after the library has been - * terminated. - * - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set. - * - * @callback_signature - * @code - * void callback_name(int error_code, const char* description) - * @endcode - * For more information about the callback parameters, see the - * [callback pointer type](@ref GLFWerrorfun). - * - * @errors None. - * - * @remark This function may be called before @ref glfwInit. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref error_handling - * @sa @ref glfwGetError - * - * @since Added in version 3.0. - * - * @ingroup init - */ -GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); - -/*! @brief Returns the currently connected monitors. - * - * This function returns an array of handles for all currently connected - * monitors. The primary monitor is always first in the returned array. If no - * monitors were found, this function returns `NULL`. - * - * @param[out] count Where to store the number of monitors in the returned - * array. This is set to zero if an error occurred. - * @return An array of monitor handles, or `NULL` if no monitors were found or - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * monitor configuration changes or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_monitors - * @sa @ref monitor_event - * @sa @ref glfwGetPrimaryMonitor - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); - -/*! @brief Returns the primary monitor. - * - * This function returns the primary monitor. This is usually the monitor - * where elements like the task bar or global menu bar are located. - * - * @return The primary monitor, or `NULL` if no monitors were found or if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @remark The primary monitor is always first in the array returned by @ref - * glfwGetMonitors. - * - * @sa @ref monitor_monitors - * @sa @ref glfwGetMonitors - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); - -/*! @brief Returns the position of the monitor's viewport on the virtual screen. - * - * This function returns the position, in screen coordinates, of the upper-left - * corner of the specified monitor. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. - * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); - -/*! @brief Retrieves the work area of the monitor. - * - * This function returns the position, in screen coordinates, of the upper-left - * corner of the work area of the specified monitor along with the work area - * size in screen coordinates. The work area is defined as the area of the - * monitor not occluded by the operating system task bar where present. If no - * task bar exists then the work area is the monitor resolution in screen - * coordinates. - * - * Any or all of the position and size arguments may be `NULL`. If an error - * occurs, all non-`NULL` position and size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. - * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. - * @param[out] width Where to store the monitor width, or `NULL`. - * @param[out] height Where to store the monitor height, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_workarea - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); - -/*! @brief Returns the physical size of the monitor. - * - * This function returns the size, in millimetres, of the display area of the - * specified monitor. - * - * Some systems do not provide accurate monitor size information, either - * because the monitor - * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) - * data is incorrect or because the driver does not report it accurately. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] widthMM Where to store the width, in millimetres, of the - * monitor's display area, or `NULL`. - * @param[out] heightMM Where to store the height, in millimetres, of the - * monitor's display area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @win32 calculates the returned physical size from the - * current resolution and system DPI instead of querying the monitor EDID data. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); - -/*! @brief Retrieves the content scale for the specified monitor. - * - * This function retrieves the content scale for the specified monitor. The - * content scale is the ratio between the current DPI and the platform's - * default DPI. This is especially important for text and any UI elements. If - * the pixel dimensions of your UI scaled by this look appropriate on your - * machine then it should appear at a reasonable size on other machines - * regardless of their DPI and scaling settings. This relies on the system DPI - * and scaling settings being somewhat correct. - * - * The content scale may depend on both the monitor resolution and pixel - * density and on user settings. It may be very different from the raw DPI - * calculated from the physical size and current resolution. - * - * @param[in] monitor The monitor to query. - * @param[out] xscale Where to store the x-axis content scale, or `NULL`. - * @param[out] yscale Where to store the y-axis content scale, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_scale - * @sa @ref glfwGetWindowContentScale - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); - -/*! @brief Returns the name of the specified monitor. - * - * This function returns a human-readable name, encoded as UTF-8, of the - * specified monitor. The name typically reflects the make and model of the - * monitor and is not guaranteed to be unique among the connected monitors. - * - * @param[in] monitor The monitor to query. - * @return The UTF-8 encoded name of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); - -/*! @brief Sets the user pointer of the specified monitor. - * - * This function sets the user-defined pointer of the specified monitor. The - * current value is retained until the monitor is disconnected. The initial - * value is `NULL`. - * - * This function may be called from the monitor callback, even for a monitor - * that is being disconnected. - * - * @param[in] monitor The monitor whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref monitor_userptr - * @sa @ref glfwGetMonitorUserPointer - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); - -/*! @brief Returns the user pointer of the specified monitor. - * - * This function returns the current value of the user-defined pointer of the - * specified monitor. The initial value is `NULL`. - * - * This function may be called from the monitor callback, even for a monitor - * that is being disconnected. - * - * @param[in] monitor The monitor whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref monitor_userptr - * @sa @ref glfwSetMonitorUserPointer - * - * @since Added in version 3.3. - * - * @ingroup monitor - */ -GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor); - -/*! @brief Sets the monitor configuration callback. - * - * This function sets the monitor configuration callback, or removes the - * currently set callback. This is called when a monitor is connected to or - * disconnected from the system. - * - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWmonitor* monitor, int event) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWmonitorfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_event - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback); - -/*! @brief Returns the available video modes for the specified monitor. - * - * This function returns an array of all video modes supported by the specified - * monitor. The returned array is sorted in ascending order, first by color - * bit depth (the sum of all channel depths) and then by resolution area (the - * product of width and height). - * - * @param[in] monitor The monitor to query. - * @param[out] count Where to store the number of video modes in the returned - * array. This is set to zero if an error occurred. - * @return An array of video modes, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected, this function is called again for that monitor or the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa @ref glfwGetVideoMode - * - * @since Added in version 1.0. - * @glfw3 Changed to return an array of modes for a specific monitor. - * - * @ingroup monitor - */ -GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); - -/*! @brief Returns the current mode of the specified monitor. - * - * This function returns the current video mode of the specified monitor. If - * you have created a full screen window for that monitor, the return value - * will depend on whether that window is iconified. - * - * @param[in] monitor The monitor to query. - * @return The current mode of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified monitor is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa @ref glfwGetVideoModes - * - * @since Added in version 3.0. Replaces `glfwGetDesktopMode`. - * - * @ingroup monitor - */ -GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); - -/*! @brief Generates a gamma ramp and sets it for the specified monitor. - * - * This function generates an appropriately sized gamma ramp from the specified - * exponent and then calls @ref glfwSetGammaRamp with it. The value must be - * a finite number greater than zero. - * - * The software controlled gamma ramp is applied _in addition_ to the hardware - * gamma correction, which today is usually an approximation of sRGB gamma. - * This means that setting a perfectly linear ramp, or gamma 1.0, will produce - * the default (usually sRGB-like) behavior. - * - * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref - * GLFW_SRGB_CAPABLE hint. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] gamma The desired exponent. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); - -/*! @brief Returns the current gamma ramp for the specified monitor. - * - * This function returns the current gamma ramp of the specified monitor. - * - * @param[in] monitor The monitor to query. - * @return The current gamma ramp, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR while - * returning `NULL`. - * - * @pointer_lifetime The returned structure and its arrays are allocated and - * freed by GLFW. You should not free them yourself. They are valid until the - * specified monitor is disconnected, this function is called again for that - * monitor or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); - -/*! @brief Sets the current gamma ramp for the specified monitor. - * - * This function sets the current gamma ramp for the specified monitor. The - * original gamma ramp for that monitor is saved by GLFW the first time this - * function is called and is restored by @ref glfwTerminate. - * - * The software controlled gamma ramp is applied _in addition_ to the hardware - * gamma correction, which today is usually an approximation of sRGB gamma. - * This means that setting a perfectly linear ramp, or gamma 1.0, will produce - * the default (usually sRGB-like) behavior. - * - * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref - * GLFW_SRGB_CAPABLE hint. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] ramp The gamma ramp to use. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark The size of the specified gamma ramp should match the size of the - * current ramp for that monitor. - * - * @remark @win32 The gamma ramp size must be 256. - * - * @remark @wayland Gamma handling is a privileged protocol, this function - * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified gamma ramp is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in version 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); - -/*! @brief Resets all window hints to their default values. - * - * This function resets all window hints to their - * [default values](@ref window_hints_values). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hints - * @sa @ref glfwWindowHint - * @sa @ref glfwWindowHintString - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwDefaultWindowHints(void); - -/*! @brief Sets the specified window hint to the desired value. - * - * This function sets hints for the next call to @ref glfwCreateWindow. The - * hints, once set, retain their values until changed by a call to this - * function or @ref glfwDefaultWindowHints, or until the library is terminated. - * - * Only integer value hints can be set with this function. String value hints - * are set with @ref glfwWindowHintString. - * - * This function does not check whether the specified hint values are valid. - * If you set hints to invalid values this will instead be reported by the next - * call to @ref glfwCreateWindow. - * - * Some hints are platform specific. These may be set on any platform but they - * will only affect their specific platform. Other platforms will ignore them. - * Setting these hints requires no platform specific headers or functions. - * - * @param[in] hint The [window hint](@ref window_hints) to set. - * @param[in] value The new value of the window hint. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hints - * @sa @ref glfwWindowHintString - * @sa @ref glfwDefaultWindowHints - * - * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. - * - * @ingroup window - */ -GLFWAPI void glfwWindowHint(int hint, int value); - -/*! @brief Sets the specified window hint to the desired value. - * - * This function sets hints for the next call to @ref glfwCreateWindow. The - * hints, once set, retain their values until changed by a call to this - * function or @ref glfwDefaultWindowHints, or until the library is terminated. - * - * Only string type hints can be set with this function. Integer value hints - * are set with @ref glfwWindowHint. - * - * This function does not check whether the specified hint values are valid. - * If you set hints to invalid values this will instead be reported by the next - * call to @ref glfwCreateWindow. - * - * Some hints are platform specific. These may be set on any platform but they - * will only affect their specific platform. Other platforms will ignore them. - * Setting these hints requires no platform specific headers or functions. - * - * @param[in] hint The [window hint](@ref window_hints) to set. - * @param[in] value The new value of the window hint. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @pointer_lifetime The specified string is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hints - * @sa @ref glfwWindowHint - * @sa @ref glfwDefaultWindowHints - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwWindowHintString(int hint, const char* value); - -/*! @brief Creates a window and its associated context. - * - * This function creates a window and its associated OpenGL or OpenGL ES - * context. Most of the options controlling how the window and its context - * should be created are specified with [window hints](@ref window_hints). - * - * Successful creation does not change which context is current. Before you - * can use the newly created context, you need to - * [make it current](@ref context_current). For information about the `share` - * parameter, see @ref context_sharing. - * - * The created window, framebuffer and context may differ from what you - * requested, as not all parameters and hints are - * [hard constraints](@ref window_hints_hard). This includes the size of the - * window, especially for full screen windows. To query the actual attributes - * of the created window, framebuffer and context, see @ref - * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. - * - * To create a full screen window, you need to specify the monitor the window - * will cover. If no monitor is specified, the window will be windowed mode. - * Unless you have a way for the user to choose a specific monitor, it is - * recommended that you pick the primary monitor. For more information on how - * to query connected monitors, see @ref monitor_monitors. - * - * For full screen windows, the specified size becomes the resolution of the - * window's _desired video mode_. As long as a full screen window is not - * iconified, the supported video mode most closely matching the desired video - * mode is set for the specified monitor. For more information about full - * screen windows, including the creation of so called _windowed full screen_ - * or _borderless full screen_ windows, see @ref window_windowed_full_screen. - * - * Once you have created the window, you can switch it between windowed and - * full screen mode with @ref glfwSetWindowMonitor. This will not affect its - * OpenGL or OpenGL ES context. - * - * By default, newly created windows use the placement recommended by the - * window system. To create the window at a specific position, make it - * initially invisible using the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window - * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) - * it. - * - * As long as at least one full screen window is not iconified, the screensaver - * is prohibited from starting. - * - * Window systems put limits on window sizes. Very large or very small window - * dimensions may be overridden by the window system on creation. Check the - * actual [size](@ref window_size) after creation. - * - * The [swap interval](@ref buffer_swap) is not set during window creation and - * the initial value may vary depending on driver settings and defaults. - * - * @param[in] width The desired width, in screen coordinates, of the window. - * This must be greater than zero. - * @param[in] height The desired height, in screen coordinates, of the window. - * This must be greater than zero. - * @param[in] title The initial, UTF-8 encoded window title. - * @param[in] monitor The monitor to use for full screen mode, or `NULL` for - * windowed mode. - * @param[in] share The window whose context to share resources with, or `NULL` - * to not share resources. - * @return The handle of the created window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref - * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @win32 Window creation will fail if the Microsoft GDI software - * OpenGL implementation is the only one available. - * - * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it - * will be set as the initial icon for the window. If no such icon is present, - * the `IDI_APPLICATION` icon will be used instead. To set a different icon, - * see @ref glfwSetWindowIcon. - * - * @remark @win32 The context to share resources with must not be current on - * any other thread. - * - * @remark @macos The OS only supports forward-compatible core profile contexts - * for OpenGL versions 3.2 and later. Before creating an OpenGL context of - * version 3.2 or later you must set the - * [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and - * [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. - * OpenGL 3.0 and 3.1 contexts are not supported at all on macOS. - * - * @remark @macos The GLFW window has no icon, as it is not a document - * window, but the dock icon will be the same as the application bundle's icon. - * For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. - * - * @remark @macos The first time a window is created the menu bar is created. - * If GLFW finds a `MainMenu.nib` it is loaded and assumed to contain a menu - * bar. Otherwise a minimal menu bar is created manually with common commands - * like Hide, Quit and About. The About entry opens a minimal about dialog - * with information from the application's bundle. Menu bar creation can be - * disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint. - * - * @remark @macos On OS X 10.10 and later the window frame will not be rendered - * at full resolution on Retina displays unless the - * [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint) - * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the - * application bundle's `Info.plist`. For more information, see - * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) - * in the Mac Developer Library. The GLFW test and example programs use - * a custom `Info.plist` template for this, which can be found as - * `CMake/MacOSXBundleInfo.plist.in` in the source tree. - * - * @remark @macos When activating frame autosaving with - * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified - * window size and position may be overridden by previously saved values. - * - * @remark @x11 Some window managers will not respect the placement of - * initially hidden windows. - * - * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for - * a window to reach its requested state. This means you may not be able to - * query the final size, position or other attributes directly after window - * creation. - * - * @remark @x11 The class part of the `WM_CLASS` window property will by - * default be set to the window title passed to this function. The instance - * part will use the contents of the `RESOURCE_NAME` environment variable, if - * present and not empty, or fall back to the window title. Set the - * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and - * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to - * override this. - * - * @remark @wayland Compositors should implement the xdg-decoration protocol - * for GLFW to decorate the window properly. If this protocol isn't - * supported, or if the compositor prefers client-side decorations, a very - * simple fallback frame will be drawn using the wp_viewporter protocol. A - * compositor can still emit close, maximize or fullscreen events, using for - * instance a keybind mechanism. If neither of these protocols is supported, - * the window won't be decorated. - * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size or refresh rate. - * - * @remark @wayland Screensaver inhibition requires the idle-inhibit protocol - * to be implemented in the user's compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_creation - * @sa @ref glfwDestroyWindow - * - * @since Added in version 3.0. Replaces `glfwOpenWindow`. - * - * @ingroup window - */ -GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); - -/*! @brief Destroys the specified window and its context. - * - * This function destroys the specified window and its context. On calling - * this function, no further callbacks will be called for that window. - * - * If the context of the specified window is current on the main thread, it is - * detached before being destroyed. - * - * @param[in] window The window to destroy. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @note The context of the specified window must not be current on any other - * thread when this function is called. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_creation - * @sa @ref glfwCreateWindow - * - * @since Added in version 3.0. Replaces `glfwCloseWindow`. - * - * @ingroup window - */ -GLFWAPI void glfwDestroyWindow(GLFWwindow* window); - -/*! @brief Checks the close flag of the specified window. - * - * This function returns the value of the close flag of the specified window. - * - * @param[in] window The window to query. - * @return The value of the close flag. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_close - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); - -/*! @brief Sets the close flag of the specified window. - * - * This function sets the value of the close flag of the specified window. - * This can be used to override the user's attempt to close the window, or - * to signal that it should be closed. - * - * @param[in] window The window whose flag to change. - * @param[in] value The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_close - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); - -/*! @brief Sets the title of the specified window. - * - * This function sets the window title, encoded as UTF-8, of the specified - * window. - * - * @param[in] window The window whose title to change. - * @param[in] title The UTF-8 encoded window title. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @macos The window title will not be updated until the next time you - * process events. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_title - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); - -/*! @brief Sets the icon for the specified window. - * - * This function sets the icon of the specified window. If passed an array of - * candidate images, those of or closest to the sizes desired by the system are - * selected. If no images are specified, the window reverts to its default - * icon. - * - * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight - * bits per channel with the red channel first. They are arranged canonically - * as packed sequential rows, starting from the top-left corner. - * - * The desired image sizes varies depending on platform and system settings. - * The selected images will be rescaled as needed. Good sizes include 16x16, - * 32x32 and 48x48. - * - * @param[in] window The window whose icon to set. - * @param[in] count The number of images in the specified array, or zero to - * revert to the default window icon. - * @param[in] images The images to create the icon from. This is ignored if - * count is zero. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified image data is copied before this function - * returns. - * - * @remark @macos The GLFW window has no icon, as it is not a document - * window, so this function does nothing. The dock icon will be the same as - * the application bundle's icon. For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. - * - * @remark @wayland There is no existing protocol to change an icon, the - * window will thus inherit the one defined in the application's desktop file. - * This function always emits @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_icon - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); - -/*! @brief Retrieves the position of the content area of the specified window. - * - * This function retrieves the position, in screen coordinates, of the - * upper-left corner of the content area of the specified window. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The window to query. - * @param[out] xpos Where to store the x-coordinate of the upper-left corner of - * the content area, or `NULL`. - * @param[out] ypos Where to store the y-coordinate of the upper-left corner of - * the content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no way for an application to retrieve the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * @sa @ref glfwSetWindowPos - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); - -/*! @brief Sets the position of the content area of the specified window. - * - * This function sets the position, in screen coordinates, of the upper-left - * corner of the content area of the specified windowed mode window. If the - * window is a full screen window, this function does nothing. - * - * __Do not use this function__ to move an already visible window unless you - * have very good reasons for doing so, as it will confuse and annoy the user. - * - * The window manager may put limits on what positions are allowed. GLFW - * cannot and should not override these limits. - * - * @param[in] window The window to query. - * @param[in] xpos The x-coordinate of the upper-left corner of the content area. - * @param[in] ypos The y-coordinate of the upper-left corner of the content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no way for an application to set the global - * position of its windows, this function will always emit @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * @sa @ref glfwGetWindowPos - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); - -/*! @brief Retrieves the size of the content area of the specified window. - * - * This function retrieves the size, in screen coordinates, of the content area - * of the specified window. If you wish to retrieve the size of the - * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose size to retrieve. - * @param[out] width Where to store the width, in screen coordinates, of the - * content area, or `NULL`. - * @param[out] height Where to store the height, in screen coordinates, of the - * content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * @sa @ref glfwSetWindowSize - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Sets the size limits of the specified window. - * - * This function sets the size limits of the content area of the specified - * window. If the window is full screen, the size limits only take effect - * once it is made windowed. If the window is not resizable, this function - * does nothing. - * - * The size limits are applied immediately to a windowed mode window and may - * cause it to be resized. - * - * The maximum dimensions must be greater than or equal to the minimum - * dimensions and all must be greater than or equal to zero. - * - * @param[in] window The window to set limits for. - * @param[in] minwidth The minimum width, in screen coordinates, of the content - * area, or `GLFW_DONT_CARE`. - * @param[in] minheight The minimum height, in screen coordinates, of the - * content area, or `GLFW_DONT_CARE`. - * @param[in] maxwidth The maximum width, in screen coordinates, of the content - * area, or `GLFW_DONT_CARE`. - * @param[in] maxheight The maximum height, in screen coordinates, of the - * content area, or `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark If you set size limits and an aspect ratio that conflict, the - * results are undefined. - * - * @remark @wayland The size limits will not be applied until the window is - * actually resized, either by the user or by the compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa @ref glfwSetWindowAspectRatio - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); - -/*! @brief Sets the aspect ratio of the specified window. - * - * This function sets the required aspect ratio of the content area of the - * specified window. If the window is full screen, the aspect ratio only takes - * effect once it is made windowed. If the window is not resizable, this - * function does nothing. - * - * The aspect ratio is specified as a numerator and a denominator and both - * values must be greater than zero. For example, the common 16:9 aspect ratio - * is specified as 16 and 9, respectively. - * - * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect - * ratio limit is disabled. - * - * The aspect ratio is applied immediately to a windowed mode window and may - * cause it to be resized. - * - * @param[in] window The window to set limits for. - * @param[in] numer The numerator of the desired aspect ratio, or - * `GLFW_DONT_CARE`. - * @param[in] denom The denominator of the desired aspect ratio, or - * `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark If you set size limits and an aspect ratio that conflict, the - * results are undefined. - * - * @remark @wayland The aspect ratio will not be applied until the window is - * actually resized, either by the user or by the compositor. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_sizelimits - * @sa @ref glfwSetWindowSizeLimits - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); - -/*! @brief Sets the size of the content area of the specified window. - * - * This function sets the size, in screen coordinates, of the content area of - * the specified window. - * - * For full screen windows, this function updates the resolution of its desired - * video mode and switches to the video mode closest to it, without affecting - * the window's context. As the context is unaffected, the bit depths of the - * framebuffer remain unchanged. - * - * If you wish to update the refresh rate of the desired video mode in addition - * to its resolution, see @ref glfwSetWindowMonitor. - * - * The window manager may put limits on what sizes are allowed. GLFW cannot - * and should not override these limits. - * - * @param[in] window The window to resize. - * @param[in] width The desired width, in screen coordinates, of the window - * content area. - * @param[in] height The desired height, in screen coordinates, of the window - * content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland A full screen window will not attempt to change the mode, - * no matter what the requested size. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * @sa @ref glfwGetWindowSize - * @sa @ref glfwSetWindowMonitor - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); - -/*! @brief Retrieves the size of the framebuffer of the specified window. - * - * This function retrieves the size, in pixels, of the framebuffer of the - * specified window. If you wish to retrieve the size of the window in screen - * coordinates, see @ref glfwGetWindowSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose framebuffer to query. - * @param[out] width Where to store the width, in pixels, of the framebuffer, - * or `NULL`. - * @param[out] height Where to store the height, in pixels, of the framebuffer, - * or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_fbsize - * @sa @ref glfwSetFramebufferSizeCallback - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Retrieves the size of the frame of the window. - * - * This function retrieves the size, in screen coordinates, of each edge of the - * frame of the specified window. This size includes the title bar, if the - * window has one. The size of the frame may vary depending on the - * [window-related hints](@ref window_hints_wnd) used to create it. - * - * Because this function retrieves the size of each window frame edge and not - * the offset along a particular coordinate axis, the retrieved values will - * always be zero or positive. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose frame size to query. - * @param[out] left Where to store the size, in screen coordinates, of the left - * edge of the window frame, or `NULL`. - * @param[out] top Where to store the size, in screen coordinates, of the top - * edge of the window frame, or `NULL`. - * @param[out] right Where to store the size, in screen coordinates, of the - * right edge of the window frame, or `NULL`. - * @param[out] bottom Where to store the size, in screen coordinates, of the - * bottom edge of the window frame, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in version 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); - -/*! @brief Retrieves the content scale for the specified window. - * - * This function retrieves the content scale for the specified window. The - * content scale is the ratio between the current DPI and the platform's - * default DPI. This is especially important for text and any UI elements. If - * the pixel dimensions of your UI scaled by this look appropriate on your - * machine then it should appear at a reasonable size on other machines - * regardless of their DPI and scaling settings. This relies on the system DPI - * and scaling settings being somewhat correct. - * - * On systems where each monitors can have its own content scale, the window - * content scale will depend on which monitor the system considers the window - * to be on. - * - * @param[in] window The window to query. - * @param[out] xscale Where to store the x-axis content scale, or `NULL`. - * @param[out] yscale Where to store the y-axis content scale, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_scale - * @sa @ref glfwSetWindowContentScaleCallback - * @sa @ref glfwGetMonitorContentScale - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); - -/*! @brief Returns the opacity of the whole window. - * - * This function returns the opacity of the window, including any decorations. - * - * The opacity (or alpha) value is a positive finite number between zero and - * one, where zero is fully transparent and one is fully opaque. If the system - * does not support whole window transparency, this function always returns one. - * - * The initial opacity value for newly created windows is one. - * - * @param[in] window The window to query. - * @return The opacity value of the specified window. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_transparency - * @sa @ref glfwSetWindowOpacity - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); - -/*! @brief Sets the opacity of the whole window. - * - * This function sets the opacity of the window, including any decorations. - * - * The opacity (or alpha) value is a positive finite number between zero and - * one, where zero is fully transparent and one is fully opaque. - * - * The initial opacity value for newly created windows is one. - * - * A window created with framebuffer transparency may not use whole window - * transparency. The results of doing this are undefined. - * - * @param[in] window The window to set the opacity for. - * @param[in] opacity The desired opacity of the specified window. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_transparency - * @sa @ref glfwGetWindowOpacity - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); - -/*! @brief Iconifies the specified window. - * - * This function iconifies (minimizes) the specified window if it was - * previously restored. If the window is already iconified, this function does - * nothing. - * - * If the specified window is a full screen window, the original monitor - * resolution is restored until the window is restored. - * - * @param[in] window The window to iconify. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland There is no concept of iconification in wl_shell, this - * function will emit @ref GLFW_PLATFORM_ERROR when using this deprecated - * protocol. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwRestoreWindow - * @sa @ref glfwMaximizeWindow - * - * @since Added in version 2.1. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwIconifyWindow(GLFWwindow* window); - -/*! @brief Restores the specified window. - * - * This function restores the specified window if it was previously iconified - * (minimized) or maximized. If the window is already restored, this function - * does nothing. - * - * If the specified window is a full screen window, the resolution chosen for - * the window is restored on the selected monitor. - * - * @param[in] window The window to restore. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwIconifyWindow - * @sa @ref glfwMaximizeWindow - * - * @since Added in version 2.1. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwRestoreWindow(GLFWwindow* window); - -/*! @brief Maximizes the specified window. - * - * This function maximizes the specified window if it was previously not - * maximized. If the window is already maximized, this function does nothing. - * - * If the specified window is a full screen window, this function does nothing. - * - * @param[in] window The window to maximize. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * @sa @ref glfwIconifyWindow - * @sa @ref glfwRestoreWindow - * - * @since Added in GLFW 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); - -/*! @brief Makes the specified window visible. - * - * This function makes the specified window visible if it was previously - * hidden. If the window is already visible or is in full screen mode, this - * function does nothing. - * - * By default, windowed mode windows are focused when shown - * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint - * to change this behavior for all newly created windows, or change the - * behavior for an existing window with @ref glfwSetWindowAttrib. - * - * @param[in] window The window to make visible. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hide - * @sa @ref glfwHideWindow - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwShowWindow(GLFWwindow* window); - -/*! @brief Hides the specified window. - * - * This function hides the specified window if it was previously visible. If - * the window is already hidden or is in full screen mode, this function does - * nothing. - * - * @param[in] window The window to hide. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_hide - * @sa @ref glfwShowWindow - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwHideWindow(GLFWwindow* window); - -/*! @brief Brings the specified window to front and sets input focus. - * - * This function brings the specified window to front and sets input focus. - * The window should already be visible and not iconified. - * - * By default, both windowed and full screen mode windows are focused when - * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to - * disable this behavior. - * - * Also by default, windowed mode windows are focused when shown - * with @ref glfwShowWindow. Set the - * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. - * - * __Do not use this function__ to steal focus from other applications unless - * you are certain that is what the user wants. Focus stealing can be - * extremely disruptive. - * - * For a less disruptive way of getting the user's attention, see - * [attention requests](@ref window_attention). - * - * @param[in] window The window to give input focus. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland It is not possible for an application to bring its windows - * to front, this function will always emit @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_focus - * @sa @ref window_attention - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwFocusWindow(GLFWwindow* window); - -/*! @brief Requests user attention to the specified window. - * - * This function requests user attention to the specified window. On - * platforms where this is not supported, attention is requested to the - * application as a whole. - * - * Once the user has given attention, usually by focusing the window or - * application, the system will end the request automatically. - * - * @param[in] window The window to request attention to. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @macos Attention is requested to the application as a whole, not the - * specific window. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attention - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwRequestWindowAttention(GLFWwindow* window); - -/*! @brief Returns the monitor that the window uses for full screen mode. - * - * This function returns the handle of the monitor that the specified window is - * in full screen on. - * - * @param[in] window The window to query. - * @return The monitor, or `NULL` if the window is in windowed mode or an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_monitor - * @sa @ref glfwSetWindowMonitor - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); - -/*! @brief Sets the mode, monitor, video mode and placement of a window. - * - * This function sets the monitor that the window uses for full screen mode or, - * if the monitor is `NULL`, makes it windowed mode. - * - * When setting a monitor, this function updates the width, height and refresh - * rate of the desired video mode and switches to the video mode closest to it. - * The window position is ignored when setting a monitor. - * - * When the monitor is `NULL`, the position, width and height are used to - * place the window content area. The refresh rate is ignored when no monitor - * is specified. - * - * If you only wish to update the resolution of a full screen window or the - * size of a windowed mode window, see @ref glfwSetWindowSize. - * - * When a window transitions from full screen to windowed mode, this function - * restores any previous window settings such as whether it is decorated, - * floating, resizable, has size or aspect ratio limits, etc. - * - * @param[in] window The window whose monitor, size or video mode to set. - * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. - * @param[in] xpos The desired x-coordinate of the upper-left corner of the - * content area. - * @param[in] ypos The desired y-coordinate of the upper-left corner of the - * content area. - * @param[in] width The desired with, in screen coordinates, of the content - * area or video mode. - * @param[in] height The desired height, in screen coordinates, of the content - * area or video mode. - * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, - * or `GLFW_DONT_CARE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise - * affected by any resizing or mode switching, although you may need to update - * your viewport if the framebuffer size has changed. - * - * @remark @wayland The desired window position is ignored, as there is no way - * for an application to set this property. - * - * @remark @wayland Setting the window to full screen will not attempt to - * change the mode, no matter what the requested size or refresh rate. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_monitor - * @sa @ref window_full_screen - * @sa @ref glfwGetWindowMonitor - * @sa @ref glfwSetWindowSize - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); - -/*! @brief Returns an attribute of the specified window. - * - * This function returns the value of an attribute of the specified window or - * its OpenGL or OpenGL ES context. - * - * @param[in] window The window to query. - * @param[in] attrib The [window attribute](@ref window_attribs) whose value to - * return. - * @return The value of the attribute, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @remark Framebuffer related hints are not window attributes. See @ref - * window_attribs_fb for more information. - * - * @remark Zero is a valid value for many window and context related - * attributes so you cannot use a return value of zero as an indication of - * errors. However, this function should not fail as long as it is passed - * valid arguments and the library has been [initialized](@ref intro_init). - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attribs - * @sa @ref glfwSetWindowAttrib - * - * @since Added in version 3.0. Replaces `glfwGetWindowParam` and - * `glfwGetGLVersion`. - * - * @ingroup window - */ -GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); - -/*! @brief Sets an attribute of the specified window. - * - * This function sets the value of an attribute of the specified window. - * - * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), - * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), - * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), - * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and - * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). - * - * Some of these attributes are ignored for full screen windows. The new - * value will take effect if the window is later made windowed. - * - * Some of these attributes are ignored for windowed mode windows. The new - * value will take effect if the window is later made full screen. - * - * @param[in] window The window to set the attribute for. - * @param[in] attrib A supported window attribute. - * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @remark Calling @ref glfwGetWindowAttrib will always return the latest - * value, even if that value is ignored by the current mode of the window. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_attribs - * @sa @ref glfwGetWindowAttrib - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); - -/*! @brief Sets the user pointer of the specified window. - * - * This function sets the user-defined pointer of the specified window. The - * current value is retained until the window is destroyed. The initial value - * is `NULL`. - * - * @param[in] window The window whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_userptr - * @sa @ref glfwGetWindowUserPointer - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); - -/*! @brief Returns the user pointer of the specified window. - * - * This function returns the current value of the user-defined pointer of the - * specified window. The initial value is `NULL`. - * - * @param[in] window The window whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref window_userptr - * @sa @ref glfwSetWindowUserPointer - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); - -/*! @brief Sets the position callback for the specified window. - * - * This function sets the position callback of the specified window, which is - * called when the window is moved. The callback is provided with the - * position, in screen coordinates, of the upper-left corner of the content - * area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int xpos, int ypos) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowposfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @wayland This callback will never be called, as there is no way for - * an application to know its global position. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_pos - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); - -/*! @brief Sets the size callback for the specified window. - * - * This function sets the size callback of the specified window, which is - * called when the window is resized. The callback is provided with the size, - * in screen coordinates, of the content area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int width, int height) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowsizefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); - -/*! @brief Sets the close callback for the specified window. - * - * This function sets the close callback of the specified window, which is - * called when the user attempts to close the window, for example by clicking - * the close widget in the title bar. - * - * The close flag is set before this callback is called, but you can modify it - * at any time with @ref glfwSetWindowShouldClose. - * - * The close callback is not triggered by @ref glfwDestroyWindow. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowclosefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @macos Selecting Quit from the application menu will trigger the - * close callback for all windows. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_close - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); - -/*! @brief Sets the refresh callback for the specified window. - * - * This function sets the refresh callback of the specified window, which is - * called when the content area of the window needs to be redrawn, for example - * if the window has been exposed after having been covered by another window. - * - * On compositing window systems such as Aero, Compiz, Aqua or Wayland, where - * the window contents are saved off-screen, this callback may be called only - * very infrequently or never at all. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window); - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowrefreshfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_refresh - * - * @since Added in version 2.5. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup window - */ -GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); - -/*! @brief Sets the focus callback for the specified window. - * - * This function sets the focus callback of the specified window, which is - * called when the window gains or loses input focus. - * - * After the focus callback is called for a window that lost input focus, - * synthetic key and mouse button release events will be generated for all such - * that had been pressed. For more information, see @ref glfwSetKeyCallback - * and @ref glfwSetMouseButtonCallback. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int focused) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowfocusfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_focus - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); - -/*! @brief Sets the iconify callback for the specified window. - * - * This function sets the iconification callback of the specified window, which - * is called when the window is iconified or restored. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int iconified) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowiconifyfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @wayland The wl_shell protocol has no concept of iconification, - * this callback will never be called when using this deprecated protocol. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_iconify - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); - -/*! @brief Sets the maximize callback for the specified window. - * - * This function sets the maximization callback of the specified window, which - * is called when the window is maximized or restored. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int maximized) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowmaximizefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_maximize - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); - -/*! @brief Sets the framebuffer resize callback for the specified window. - * - * This function sets the framebuffer resize callback of the specified window, - * which is called when the framebuffer of the specified window is resized. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int width, int height) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWframebuffersizefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_fbsize - * - * @since Added in version 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); - -/*! @brief Sets the window content scale callback for the specified window. - * - * This function sets the window content scale callback of the specified window, - * which is called when the content scale of the specified window changes. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, float xscale, float yscale) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWwindowcontentscalefun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref window_scale - * @sa @ref glfwGetWindowContentScale - * - * @since Added in version 3.3. - * - * @ingroup window - */ -GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); - -/*! @brief Processes all pending events. - * - * This function processes only those events that are already in the event - * queue and then returns immediately. Processing events will cause the window - * and input callbacks associated with those events to be called. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * Do not assume that callbacks you set will _only_ be called in response to - * event processing functions like this one. While it is necessary to poll for - * events, window systems that require GLFW to register callbacks of its own - * can pass events to GLFW in response to many window system function calls. - * GLFW will pass those events on to the application callbacks before - * returning. - * - * Event processing is not required for joystick input to work. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref events - * @sa @ref glfwWaitEvents - * @sa @ref glfwWaitEventsTimeout - * - * @since Added in version 1.0. - * - * @ingroup window - */ -GLFWAPI void glfwPollEvents(void); - -/*! @brief Waits until events are queued and processes them. - * - * This function puts the calling thread to sleep until at least one event is - * available in the event queue. Once one or more events are available, - * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue - * are processed and the function then returns immediately. Processing events - * will cause the window and input callbacks associated with those events to be - * called. - * - * Since not all events are associated with callbacks, this function may return - * without a callback having been called even if you are monitoring all - * callbacks. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * Do not assume that callbacks you set will _only_ be called in response to - * event processing functions like this one. While it is necessary to poll for - * events, window systems that require GLFW to register callbacks of its own - * can pass events to GLFW in response to many window system function calls. - * GLFW will pass those events on to the application callbacks before - * returning. - * - * Event processing is not required for joystick input to work. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref events - * @sa @ref glfwPollEvents - * @sa @ref glfwWaitEventsTimeout - * - * @since Added in version 2.5. - * - * @ingroup window - */ -GLFWAPI void glfwWaitEvents(void); - -/*! @brief Waits with timeout until events are queued and processes them. - * - * This function puts the calling thread to sleep until at least one event is - * available in the event queue, or until the specified timeout is reached. If - * one or more events are available, it behaves exactly like @ref - * glfwPollEvents, i.e. the events in the queue are processed and the function - * then returns immediately. Processing events will cause the window and input - * callbacks associated with those events to be called. - * - * The timeout value must be a positive finite number. - * - * Since not all events are associated with callbacks, this function may return - * without a callback having been called even if you are monitoring all - * callbacks. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * Do not assume that callbacks you set will _only_ be called in response to - * event processing functions like this one. While it is necessary to poll for - * events, window systems that require GLFW to register callbacks of its own - * can pass events to GLFW in response to many window system function calls. - * GLFW will pass those events on to the application callbacks before - * returning. - * - * Event processing is not required for joystick input to work. - * - * @param[in] timeout The maximum amount of time, in seconds, to wait. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref events - * @sa @ref glfwPollEvents - * @sa @ref glfwWaitEvents - * - * @since Added in version 3.2. - * - * @ingroup window - */ -GLFWAPI void glfwWaitEventsTimeout(double timeout); - -/*! @brief Posts an empty event to the event queue. - * - * This function posts an empty event from the current thread to the event - * queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref events - * @sa @ref glfwWaitEvents - * @sa @ref glfwWaitEventsTimeout - * - * @since Added in version 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwPostEmptyEvent(void); - -/*! @brief Returns the value of an input option for the specified window. - * - * This function returns the value of an input option for the specified window. - * The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, - * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or - * @ref GLFW_RAW_MOUSE_MOTION. - * - * @param[in] window The window to query. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, - * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or - * `GLFW_RAW_MOUSE_MOTION`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref glfwSetInputMode - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); - -/*! @brief Sets an input option for the specified window. - * - * This function sets an input mode option for the specified window. The mode - * must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, - * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or - * @ref GLFW_RAW_MOUSE_MOTION. - * - * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor - * modes: - * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. - * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the - * content area of the window but does not restrict the cursor from leaving. - * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual - * and unlimited cursor movement. This is useful for implementing for - * example 3D camera controls. - * - * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to - * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are - * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` - * the next time it is called even if the key had been released before the - * call. This is useful when you are only interested in whether keys have been - * pressed but not when or in which order. - * - * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either - * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. - * If sticky mouse buttons are enabled, a mouse button press will ensure that - * @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even - * if the mouse button had been released before the call. This is useful when - * you are only interested in whether mouse buttons have been pressed but not - * when or in which order. - * - * If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to - * enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled, - * callbacks that receive modifier bits will also have the @ref - * GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on, - * and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on. - * - * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` - * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is - * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, - * attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref - * glfwRawMouseMotionSupported to check for support. - * - * @param[in] window The window whose input mode to set. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, - * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or - * `GLFW_RAW_MOUSE_MOTION`. - * @param[in] value The new value of the specified input mode. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref glfwGetInputMode - * - * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. - * - * @ingroup input - */ -GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); - -/*! @brief Returns whether raw mouse motion is supported. - * - * This function returns whether raw mouse motion is supported on the current - * system. This status does not change after GLFW has been initialized so you - * only need to check this once. If you attempt to enable raw motion on - * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted. - * - * Raw mouse motion is closer to the actual motion of the mouse across - * a surface. It is not affected by the scaling and acceleration applied to - * the motion of the desktop cursor. That processing is suitable for a cursor - * while raw motion is better for controlling for example a 3D camera. Because - * of this, raw mouse motion is only provided when the cursor is disabled. - * - * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine, - * or `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref raw_mouse_motion - * @sa @ref glfwSetInputMode - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwRawMouseMotionSupported(void); - -/*! @brief Returns the layout-specific name of the specified printable key. - * - * This function returns the name of the specified printable key, encoded as - * UTF-8. This is typically the character that key would produce without any - * modifier keys, intended for displaying key bindings to the user. For dead - * keys, it is typically the diacritic it would add to a character. - * - * __Do not use this function__ for [text input](@ref input_char). You will - * break text input for many languages even if it happens to work for yours. - * - * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key, - * otherwise the scancode is ignored. If you specify a non-printable key, or - * `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this - * function returns `NULL` but does not emit an error. - * - * This behavior allows you to always pass in the arguments in the - * [key callback](@ref input_key) without modification. - * - * The printable keys are: - * - `GLFW_KEY_APOSTROPHE` - * - `GLFW_KEY_COMMA` - * - `GLFW_KEY_MINUS` - * - `GLFW_KEY_PERIOD` - * - `GLFW_KEY_SLASH` - * - `GLFW_KEY_SEMICOLON` - * - `GLFW_KEY_EQUAL` - * - `GLFW_KEY_LEFT_BRACKET` - * - `GLFW_KEY_RIGHT_BRACKET` - * - `GLFW_KEY_BACKSLASH` - * - `GLFW_KEY_WORLD_1` - * - `GLFW_KEY_WORLD_2` - * - `GLFW_KEY_0` to `GLFW_KEY_9` - * - `GLFW_KEY_A` to `GLFW_KEY_Z` - * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` - * - `GLFW_KEY_KP_DECIMAL` - * - `GLFW_KEY_KP_DIVIDE` - * - `GLFW_KEY_KP_MULTIPLY` - * - `GLFW_KEY_KP_SUBTRACT` - * - `GLFW_KEY_KP_ADD` - * - `GLFW_KEY_KP_EQUAL` - * - * Names for printable keys depend on keyboard layout, while names for - * non-printable keys are the same across layouts but depend on the application - * language and should be localized along with other user interface text. - * - * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. - * @param[in] scancode The scancode of the key to query. - * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark The contents of the returned string may change when a keyboard - * layout change event is received. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key_name - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetKeyName(int key, int scancode); - -/*! @brief Returns the platform-specific scancode of the specified key. - * - * This function returns the platform-specific scancode of the specified key. - * - * If the key is `GLFW_KEY_UNKNOWN` or does not exist on the keyboard this - * method will return `-1`. - * - * @param[in] key Any [named key](@ref keys). - * @return The platform-specific scancode for the key, or `-1` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref input_key - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwGetKeyScancode(int key); - -/*! @brief Returns the last reported state of a keyboard key for the specified - * window. - * - * This function returns the last state reported for the specified key to the - * specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to - * the key callback. - * - * If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns - * `GLFW_PRESS` the first time you call it for a key that was pressed, even if - * that key has already been released. - * - * The key functions deal with physical keys, with [key tokens](@ref keys) - * named after their use on the standard US keyboard layout. If you want to - * input text, use the Unicode character callback instead. - * - * The [modifier key bit masks](@ref mods) are not key tokens and cannot be - * used with this function. - * - * __Do not use this function__ to implement [text input](@ref input_char). - * - * @param[in] window The desired window. - * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is - * not a valid key for this function. - * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetKey(GLFWwindow* window, int key); - -/*! @brief Returns the last reported state of a mouse button for the specified - * window. - * - * This function returns the last state reported for the specified mouse button - * to the specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. - * - * If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function - * returns `GLFW_PRESS` the first time you call it for a mouse button that was - * pressed, even if that mouse button has already been released. - * - * @param[in] window The desired window. - * @param[in] button The desired [mouse button](@ref buttons). - * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); - -/*! @brief Retrieves the position of the cursor relative to the content area of - * the window. - * - * This function returns the position of the cursor, in screen coordinates, - * relative to the upper-left corner of the content area of the specified - * window. - * - * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor - * position is unbounded and limited only by the minimum and maximum values of - * a `double`. - * - * The coordinate can be converted to their integer equivalents with the - * `floor` function. Casting directly to an integer type works for positive - * coordinates, but fails for negative ones. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The desired window. - * @param[out] xpos Where to store the cursor x-coordinate, relative to the - * left edge of the content area, or `NULL`. - * @param[out] ypos Where to store the cursor y-coordinate, relative to the to - * top edge of the content area, or `NULL`. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa @ref glfwSetCursorPos - * - * @since Added in version 3.0. Replaces `glfwGetMousePos`. - * - * @ingroup input - */ -GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); - -/*! @brief Sets the position of the cursor, relative to the content area of the - * window. - * - * This function sets the position, in screen coordinates, of the cursor - * relative to the upper-left corner of the content area of the specified - * window. The window must have input focus. If the window does not have - * input focus when this function is called, it fails silently. - * - * __Do not use this function__ to implement things like camera controls. GLFW - * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the - * cursor, transparently re-centers it and provides unconstrained cursor - * motion. See @ref glfwSetInputMode for more information. - * - * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is - * unconstrained and limited only by the minimum and maximum values of - * a `double`. - * - * @param[in] window The desired window. - * @param[in] xpos The desired x-coordinate, relative to the left edge of the - * content area. - * @param[in] ypos The desired y-coordinate, relative to the top edge of the - * content area. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @remark @wayland This function will only work when the cursor mode is - * `GLFW_CURSOR_DISABLED`, otherwise it will do nothing. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa @ref glfwGetCursorPos - * - * @since Added in version 3.0. Replaces `glfwSetMousePos`. - * - * @ingroup input - */ -GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); - -/*! @brief Creates a custom cursor. - * - * Creates a new custom cursor image that can be set for a window with @ref - * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. - * Any remaining cursors are destroyed by @ref glfwTerminate. - * - * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight - * bits per channel with the red channel first. They are arranged canonically - * as packed sequential rows, starting from the top-left corner. - * - * The cursor hotspot is specified in pixels, relative to the upper-left corner - * of the cursor image. Like all other coordinate systems in GLFW, the X-axis - * points to the right and the Y-axis points down. - * - * @param[in] image The desired cursor image. - * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. - * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. - * @return The handle of the created cursor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified image data is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * @sa @ref glfwDestroyCursor - * @sa @ref glfwCreateStandardCursor - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); - -/*! @brief Creates a cursor with a standard shape. - * - * Returns a cursor with a [standard shape](@ref shapes), that can be set for - * a window with @ref glfwSetCursor. - * - * @param[in] shape One of the [standard shapes](@ref shapes). - * @return A new cursor ready to use or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * @sa @ref glfwCreateCursor - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); - -/*! @brief Destroys a cursor. - * - * This function destroys a cursor previously created with @ref - * glfwCreateCursor. Any remaining cursors will be destroyed by @ref - * glfwTerminate. - * - * If the specified cursor is current for any window, that window will be - * reverted to the default cursor. This does not affect the cursor mode. - * - * @param[in] cursor The cursor object to destroy. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @reentrancy This function must not be called from a callback. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * @sa @ref glfwCreateCursor - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); - -/*! @brief Sets the cursor for the window. - * - * This function sets the cursor image to be used when the cursor is over the - * content area of the specified window. The set cursor will only be visible - * when the [cursor mode](@ref cursor_mode) of the window is - * `GLFW_CURSOR_NORMAL`. - * - * On some platforms, the set cursor may not be visible unless the window also - * has input focus. - * - * @param[in] window The window to set the cursor for. - * @param[in] cursor The cursor to set, or `NULL` to switch back to the default - * arrow cursor. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_object - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); - -/*! @brief Sets the key callback. - * - * This function sets the key callback of the specified window, which is called - * when a key is pressed, repeated or released. - * - * The key functions deal with physical keys, with layout independent - * [key tokens](@ref keys) named after their values in the standard US keyboard - * layout. If you want to input text, use the - * [character callback](@ref glfwSetCharCallback) instead. - * - * When a window loses input focus, it will generate synthetic key release - * events for all pressed keys. You can tell these events from user-generated - * events by the fact that the synthetic ones are generated after the focus - * loss event has been processed, i.e. after the - * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. - * - * The scancode of a key is specific to that platform or sometimes even to that - * machine. Scancodes are intended to allow users to bind keys that don't have - * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their - * state is not saved and so it cannot be queried with @ref glfwGetKey. - * - * Sometimes GLFW needs to generate synthetic key events, in which case the - * scancode may be zero. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new key callback, or `NULL` to remove the currently - * set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWkeyfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); - -/*! @brief Sets the Unicode character callback. - * - * This function sets the character callback of the specified window, which is - * called when a Unicode character is input. - * - * The character callback is intended for Unicode text input. As it deals with - * characters, it is keyboard layout dependent, whereas the - * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 - * to physical keys, as a key may produce zero, one or more characters. If you - * want to know whether a specific physical key was pressed or released, see - * the key callback instead. - * - * The character callback behaves as system text input normally does and will - * not be called if modifier keys are held down that would prevent normal text - * input on that platform, for example a Super (Command) key on macOS or Alt key - * on Windows. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcharfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in version 2.4. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback); - -/*! @brief Sets the Unicode character with modifiers callback. - * - * This function sets the character with modifiers callback of the specified - * window, which is called when a Unicode character is input regardless of what - * modifier keys are used. - * - * The character with modifiers callback is intended for implementing custom - * Unicode character input. For regular Unicode text input, see the - * [character callback](@ref glfwSetCharCallback). Like the character - * callback, the character with modifiers callback deals with characters and is - * keyboard layout dependent. Characters do not map 1:1 to physical keys, as - * a key may produce zero, one or more characters. If you want to know whether - * a specific physical key was pressed or released, see the - * [key callback](@ref glfwSetKeyCallback) instead. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * [error](@ref error_handling) occurred. - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcharmodsfun). - * - * @deprecated Scheduled for removal in version 4.0. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback); - -/*! @brief Sets the mouse button callback. - * - * This function sets the mouse button callback of the specified window, which - * is called when a mouse button is pressed or released. - * - * When a window loses input focus, it will generate synthetic mouse button - * release events for all pressed mouse buttons. You can tell these events - * from user-generated events by the fact that the synthetic ones are generated - * after the focus loss event has been processed, i.e. after the - * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int button, int action, int mods) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWmousebuttonfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter and return value. - * - * @ingroup input - */ -GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback); - -/*! @brief Sets the cursor position callback. - * - * This function sets the cursor position callback of the specified window, - * which is called when the cursor is moved. The callback is provided with the - * position, in screen coordinates, relative to the upper-left corner of the - * content area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, double xpos, double ypos); - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcursorposfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_pos - * - * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback); - -/*! @brief Sets the cursor enter/leave callback. - * - * This function sets the cursor boundary crossing callback of the specified - * window, which is called when the cursor enters or leaves the content area of - * the window. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int entered) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWcursorenterfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref cursor_enter - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback); - -/*! @brief Sets the scroll callback. - * - * This function sets the scroll callback of the specified window, which is - * called when a scrolling device is used, such as a mouse wheel or scrolling - * area of a touchpad. - * - * The scroll callback receives all scrolling input, like that from a mouse - * wheel or a touchpad scrolling area. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new scroll callback, or `NULL` to remove the - * currently set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, double xoffset, double yoffset) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWscrollfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref scrolling - * - * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback); - -/*! @brief Sets the path drop callback. - * - * This function sets the path drop callback of the specified window, which is - * called when one or more dragged paths are dropped on the window. - * - * Because the path array and its strings may have been generated specifically - * for that event, they are not guaranteed to be valid after the callback has - * returned. If you wish to use them after the callback returns, you need to - * make a deep copy. - * - * @param[in] window The window whose callback to set. - * @param[in] callback The new file drop callback, or `NULL` to remove the - * currently set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(GLFWwindow* window, int path_count, const char* paths[]) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWdropfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @remark @wayland File drop is currently unimplemented. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref path_drop - * - * @since Added in version 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback); - -/*! @brief Returns whether the specified joystick is present. - * - * This function returns whether the specified joystick is present. - * - * There is no need to call this function before other functions that accept - * a joystick ID, as they all check for presence before performing any other - * work. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick - * - * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. - * - * @ingroup input - */ -GLFWAPI int glfwJoystickPresent(int jid); - -/*! @brief Returns the values of all axes of the specified joystick. - * - * This function returns the values of all axes of the specified joystick. - * Each element in the array is a value between -1.0 and 1.0. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of axis values in the returned - * array. This is set to zero if the joystick is not present or an error - * occurred. - * @return An array of axis values, or `NULL` if the joystick is not present or - * an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_axis - * - * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. - * - * @ingroup input - */ -GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count); - -/*! @brief Returns the state of all buttons of the specified joystick. - * - * This function returns the state of all buttons of the specified joystick. - * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. - * - * For backward compatibility with earlier versions that did not have @ref - * glfwGetJoystickHats, the button array also includes all hats, each - * represented as four buttons. The hats are in the same order as returned by - * __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and - * _left_. To disable these extra buttons, set the @ref - * GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of button states in the returned - * array. This is set to zero if the joystick is not present or an error - * occurred. - * @return An array of button states, or `NULL` if the joystick is not present - * or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_button - * - * @since Added in version 2.2. - * @glfw3 Changed to return a dynamic array. - * - * @ingroup input - */ -GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count); - -/*! @brief Returns the state of all hats of the specified joystick. - * - * This function returns the state of all hats of the specified joystick. - * Each element in the array is one of the following values: - * - * Name | Value - * ---- | ----- - * `GLFW_HAT_CENTERED` | 0 - * `GLFW_HAT_UP` | 1 - * `GLFW_HAT_RIGHT` | 2 - * `GLFW_HAT_DOWN` | 4 - * `GLFW_HAT_LEFT` | 8 - * `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP` - * `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN` - * `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP` - * `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN` - * - * The diagonal directions are bitwise combinations of the primary (up, right, - * down and left) directions and you can test for these individually by ANDing - * it with the corresponding direction. - * - * @code - * if (hats[2] & GLFW_HAT_RIGHT) - * { - * // State of hat 2 could be right-up, right or right-down - * } - * @endcode - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of hat states in the returned - * array. This is set to zero if the joystick is not present or an error - * occurred. - * @return An array of hat states, or `NULL` if the joystick is not present - * or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected, this function is called again for that joystick or the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_hat - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count); - -/*! @brief Returns the name of the specified joystick. - * - * This function returns the name, encoded as UTF-8, of the specified joystick. - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick - * is not present or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_name - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetJoystickName(int jid); - -/*! @brief Returns the SDL compatible GUID of the specified joystick. - * - * This function returns the SDL compatible GUID, as a UTF-8 encoded - * hexadecimal string, of the specified joystick. The returned string is - * allocated and freed by GLFW. You should not free it yourself. - * - * The GUID is what connects a joystick to a gamepad mapping. A connected - * joystick will always have a GUID even if there is no gamepad mapping - * assigned to it. - * - * If the specified joystick is not present this function will return `NULL` - * but will not generate an error. This can be used instead of first calling - * @ref glfwJoystickPresent. - * - * The GUID uses the format introduced in SDL 2.0.5. This GUID tries to - * uniquely identify the make and model of a joystick but does not identify - * a specific unit, e.g. all wired Xbox 360 controllers will have the same - * GUID on that platform. The GUID for a unit may vary between platforms - * depending on what hardware information the platform specific APIs provide. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick - * is not present or an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetJoystickGUID(int jid); - -/*! @brief Sets the user pointer of the specified joystick. - * - * This function sets the user-defined pointer of the specified joystick. The - * current value is retained until the joystick is disconnected. The initial - * value is `NULL`. - * - * This function may be called from the joystick callback, even for a joystick - * that is being disconnected. - * - * @param[in] jid The joystick whose pointer to set. - * @param[in] pointer The new value. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref joystick_userptr - * @sa @ref glfwGetJoystickUserPointer - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer); - -/*! @brief Returns the user pointer of the specified joystick. - * - * This function returns the current value of the user-defined pointer of the - * specified joystick. The initial value is `NULL`. - * - * This function may be called from the joystick callback, even for a joystick - * that is being disconnected. - * - * @param[in] jid The joystick whose pointer to return. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @sa @ref joystick_userptr - * @sa @ref glfwSetJoystickUserPointer - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI void* glfwGetJoystickUserPointer(int jid); - -/*! @brief Returns whether the specified joystick has a gamepad mapping. - * - * This function returns whether the specified joystick is both present and has - * a gamepad mapping. - * - * If the specified joystick is present but does not have a gamepad mapping - * this function will return `GLFW_FALSE` but will not generate an error. Call - * @ref glfwJoystickPresent to check if a joystick is present regardless of - * whether it has a mapping. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping, - * or `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwGetGamepadState - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwJoystickIsGamepad(int jid); - -/*! @brief Sets the joystick configuration callback. - * - * This function sets the joystick configuration callback, or removes the - * currently set callback. This is called when a joystick is connected to or - * disconnected from the system. - * - * For joystick connection and disconnection events to be delivered on all - * platforms, you need to call one of the [event processing](@ref events) - * functions. Joystick disconnection may also be detected and the callback - * called by joystick functions. The function will then return whatever it - * returns if the joystick is not present. - * - * @param[in] callback The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @callback_signature - * @code - * void function_name(int jid, int event) - * @endcode - * For more information about the callback parameters, see the - * [function pointer type](@ref GLFWjoystickfun). - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref joystick_event - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback); - -/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. - * - * This function parses the specified ASCII encoded string and updates the - * internal list with any gamepad mappings it finds. This string may - * contain either a single gamepad mapping or many mappings separated by - * newlines. The parser supports the full format of the `gamecontrollerdb.txt` - * source file including empty lines and comments. - * - * See @ref gamepad_mapping for a description of the format. - * - * If there is already a gamepad mapping for a given GUID in the internal list, - * it will be replaced by the one passed to this function. If the library is - * terminated and re-initialized the internal list will revert to the built-in - * default. - * - * @param[in] string The string containing the gamepad mappings. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_VALUE. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwJoystickIsGamepad - * @sa @ref glfwGetGamepadName - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwUpdateGamepadMappings(const char* string); - -/*! @brief Returns the human-readable gamepad name for the specified joystick. - * - * This function returns the human-readable name of the gamepad from the - * gamepad mapping assigned to the specified joystick. - * - * If the specified joystick is not present or does not have a gamepad mapping - * this function will return `NULL` but will not generate an error. Call - * @ref glfwJoystickPresent to check whether it is present regardless of - * whether it has a mapping. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded name of the gamepad, or `NULL` if the - * joystick is not present, does not have a mapping or an - * [error](@ref error_handling) occurred. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the specified joystick is - * disconnected, the gamepad mappings are updated or the library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwJoystickIsGamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetGamepadName(int jid); - -/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. - * - * This function retrieves the state of the specified joystick remapped to - * an Xbox-like gamepad. - * - * If the specified joystick is not present or does not have a gamepad mapping - * this function will return `GLFW_FALSE` but will not generate an error. Call - * @ref glfwJoystickPresent to check whether it is present regardless of - * whether it has a mapping. - * - * The Guide button may not be available for input as it is often hooked by the - * system or the Steam client. - * - * Not all devices have all the buttons or axes provided by @ref - * GLFWgamepadstate. Unavailable buttons and axes will always report - * `GLFW_RELEASE` and 0.0 respectively. - * - * @param[in] jid The [joystick](@ref joysticks) to query. - * @param[out] state The gamepad input state of the joystick. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is - * connected, it has no gamepad mapping or an [error](@ref error_handling) - * occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_ENUM. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref gamepad - * @sa @ref glfwUpdateGamepadMappings - * @sa @ref glfwJoystickIsGamepad - * - * @since Added in version 3.3. - * - * @ingroup input - */ -GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); - -/*! @brief Sets the clipboard to the specified string. - * - * This function sets the system clipboard to the specified, UTF-8 encoded - * string. - * - * @param[in] window Deprecated. Any valid window or `NULL`. - * @param[in] string A UTF-8 encoded string. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified string is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa @ref glfwGetClipboardString - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); - -/*! @brief Returns the contents of the clipboard as a string. - * - * This function returns the contents of the system clipboard, if it contains - * or is convertible to a UTF-8 encoded string. If the clipboard is empty or - * if its contents cannot be converted, `NULL` is returned and a @ref - * GLFW_FORMAT_UNAVAILABLE error is generated. - * - * @param[in] window Deprecated. Any valid window or `NULL`. - * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the next call to @ref - * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library - * is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa @ref glfwSetClipboardString - * - * @since Added in version 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); - -/*! @brief Returns the GLFW time. - * - * This function returns the current GLFW time, in seconds. Unless the time - * has been set using @ref glfwSetTime it measures time elapsed since GLFW was - * initialized. - * - * This function and @ref glfwSetTime are helper functions on top of @ref - * glfwGetTimerFrequency and @ref glfwGetTimerValue. - * - * The resolution of the timer is system dependent, but is usually on the order - * of a few micro- or nanoseconds. It uses the highest-resolution monotonic - * time source on each supported platform. - * - * @return The current time, in seconds, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. Reading and - * writing of the internal base time is not atomic, so it needs to be - * externally synchronized with calls to @ref glfwSetTime. - * - * @sa @ref time - * - * @since Added in version 1.0. - * - * @ingroup input - */ -GLFWAPI double glfwGetTime(void); - -/*! @brief Sets the GLFW time. - * - * This function sets the current GLFW time, in seconds. The value must be - * a positive finite number less than or equal to 18446744073.0, which is - * approximately 584.5 years. - * - * This function and @ref glfwGetTime are helper functions on top of @ref - * glfwGetTimerFrequency and @ref glfwGetTimerValue. - * - * @param[in] time The new value, in seconds. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_INVALID_VALUE. - * - * @remark The upper limit of GLFW time is calculated as - * floor((264 - 1) / 109) and is due to implementations - * storing nanoseconds in 64 bits. The limit may be increased in the future. - * - * @thread_safety This function may be called from any thread. Reading and - * writing of the internal base time is not atomic, so it needs to be - * externally synchronized with calls to @ref glfwGetTime. - * - * @sa @ref time - * - * @since Added in version 2.2. - * - * @ingroup input - */ -GLFWAPI void glfwSetTime(double time); - -/*! @brief Returns the current value of the raw timer. - * - * This function returns the current value of the raw timer, measured in - * 1 / frequency seconds. To get the frequency, call @ref - * glfwGetTimerFrequency. - * - * @return The value of the timer, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref time - * @sa @ref glfwGetTimerFrequency - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI uint64_t glfwGetTimerValue(void); - -/*! @brief Returns the frequency, in Hz, of the raw timer. - * - * This function returns the frequency, in Hz, of the raw timer. - * - * @return The frequency of the timer, in Hz, or zero if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref time - * @sa @ref glfwGetTimerValue - * - * @since Added in version 3.2. - * - * @ingroup input - */ -GLFWAPI uint64_t glfwGetTimerFrequency(void); - -/*! @brief Makes the context of the specified window current for the calling - * thread. - * - * This function makes the OpenGL or OpenGL ES context of the specified window - * current on the calling thread. A context must only be made current on - * a single thread at a time and each thread can have only a single current - * context at a time. - * - * When moving a context between threads, you must make it non-current on the - * old thread before making it current on the new one. - * - * By default, making a context non-current implicitly forces a pipeline flush. - * On machines that support `GL_KHR_context_flush_control`, you can control - * whether a context performs this flush by setting the - * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) - * hint. - * - * The specified window must have an OpenGL or OpenGL ES context. Specifying - * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT - * error. - * - * @param[in] window The window whose context to make current, or `NULL` to - * detach the current context. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_current - * @sa @ref glfwGetCurrentContext - * - * @since Added in version 3.0. - * - * @ingroup context - */ -GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); - -/*! @brief Returns the window whose context is current on the calling thread. - * - * This function returns the window whose OpenGL or OpenGL ES context is - * current on the calling thread. - * - * @return The window whose context is current, or `NULL` if no window's - * context is current. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_current - * @sa @ref glfwMakeContextCurrent - * - * @since Added in version 3.0. - * - * @ingroup context - */ -GLFWAPI GLFWwindow* glfwGetCurrentContext(void); - -/*! @brief Swaps the front and back buffers of the specified window. - * - * This function swaps the front and back buffers of the specified window when - * rendering with OpenGL or OpenGL ES. If the swap interval is greater than - * zero, the GPU driver waits the specified number of screen updates before - * swapping the buffers. - * - * The specified window must have an OpenGL or OpenGL ES context. Specifying - * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT - * error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see `vkQueuePresentKHR` instead. - * - * @param[in] window The window whose buffers to swap. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark __EGL:__ The context of the specified window must be current on the - * calling thread. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa @ref glfwSwapInterval - * - * @since Added in version 1.0. - * @glfw3 Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSwapBuffers(GLFWwindow* window); - -/*! @brief Sets the swap interval for the current context. - * - * This function sets the swap interval for the current OpenGL or OpenGL ES - * context, i.e. the number of screen updates to wait from the time @ref - * glfwSwapBuffers was called before swapping the buffers and returning. This - * is sometimes called _vertical synchronization_, _vertical retrace - * synchronization_ or just _vsync_. - * - * A context that supports either of the `WGL_EXT_swap_control_tear` and - * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap - * intervals, which allows the driver to swap immediately even if a frame - * arrives a little bit late. You can check for these extensions with @ref - * glfwExtensionSupported. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see the present mode of your swapchain instead. - * - * @param[in] interval The minimum number of screen updates to wait for - * until the buffers are swapped by @ref glfwSwapBuffers. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark This function is not called during context creation, leaving the - * swap interval set to whatever is the default on that platform. This is done - * because some swap interval extensions used by GLFW do not allow the swap - * interval to be reset to zero once it has been set to a non-zero value. - * - * @remark Some GPU drivers do not honor the requested swap interval, either - * because of a user setting that overrides the application's request or due to - * bugs in the driver. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa @ref glfwSwapBuffers - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI void glfwSwapInterval(int interval); - -/*! @brief Returns whether the specified extension is available. - * - * This function returns whether the specified - * [API extension](@ref context_glext) is supported by the current OpenGL or - * OpenGL ES context. It searches both for client API extension and context - * creation API extensions. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * As this functions retrieves and searches one or more extension strings each - * call, it is recommended that you cache its results if it is going to be used - * frequently. The extension strings will not change during the lifetime of - * a context, so there is no danger in doing this. - * - * This function does not apply to Vulkan. If you are using Vulkan, see @ref - * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` - * and `vkEnumerateDeviceExtensionProperties` instead. - * - * @param[in] extension The ASCII encoded name of the extension. - * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` - * otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref - * GLFW_PLATFORM_ERROR. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_glext - * @sa @ref glfwGetProcAddress - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI int glfwExtensionSupported(const char* extension); - -/*! @brief Returns the address of the specified function for the current - * context. - * - * This function returns the address of the specified OpenGL or OpenGL ES - * [core or extension function](@ref context_glext), if it is supported - * by the current context. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * This function does not apply to Vulkan. If you are rendering with Vulkan, - * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and - * `vkGetDeviceProcAddr` instead. - * - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. - * - * @remark The address of a given function is not guaranteed to be the same - * between contexts. - * - * @remark This function may return a non-`NULL` address despite the - * associated version or extension not being available. Always check the - * context version or extension string first. - * - * @pointer_lifetime The returned function pointer is valid until the context - * is destroyed or the library is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref context_glext - * @sa @ref glfwExtensionSupported - * - * @since Added in version 1.0. - * - * @ingroup context - */ -GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); - -/*! @brief Returns whether the Vulkan loader and an ICD have been found. - * - * This function returns whether the Vulkan loader and any minimally functional - * ICD have been found. - * - * The availability of a Vulkan loader and even an ICD does not by itself - * guarantee that surface creation or even instance creation is possible. - * For example, on Fermi systems Nvidia will install an ICD that provides no - * actual Vulkan support. Call @ref glfwGetRequiredInstanceExtensions to check - * whether the extensions necessary for Vulkan surface creation are available - * and @ref glfwGetPhysicalDevicePresentationSupport to check whether a queue - * family of a physical device supports image presentation. - * - * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` - * otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_support - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI int glfwVulkanSupported(void); - -/*! @brief Returns the Vulkan instance extensions required by GLFW. - * - * This function returns an array of names of Vulkan instance extensions required - * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the - * list will always contain `VK_KHR_surface`, so if you don't require any - * additional extensions you can pass this list directly to the - * `VkInstanceCreateInfo` struct. - * - * If Vulkan is not available on the machine, this function returns `NULL` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available. - * - * If Vulkan is available but no set of extensions allowing window surface - * creation was found, this function returns `NULL`. You may still use Vulkan - * for off-screen rendering and compute work. - * - * @param[out] count Where to store the number of extensions in the returned - * array. This is set to zero if an error occurred. - * @return An array of ASCII encoded extension names, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_API_UNAVAILABLE. - * - * @remark Additional extensions may be required by future versions of GLFW. - * You should check if any extensions you wish to enable are already in the - * returned array, as it is an error to specify an extension more than once in - * the `VkInstanceCreateInfo` struct. - * - * @remark @macos This function currently only supports the - * `VK_MVK_macos_surface` extension from MoltenVK. - * - * @pointer_lifetime The returned array is allocated and freed by GLFW. You - * should not free it yourself. It is guaranteed to be valid only until the - * library is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_ext - * @sa @ref glfwCreateWindowSurface - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); - -#if defined(VK_VERSION_1_0) - -/*! @brief Returns the address of the specified Vulkan instance function. - * - * This function returns the address of the specified Vulkan core or extension - * function for the specified instance. If instance is set to `NULL` it can - * return any function exported from the Vulkan loader, including at least the - * following functions: - * - * - `vkEnumerateInstanceExtensionProperties` - * - `vkEnumerateInstanceLayerProperties` - * - `vkCreateInstance` - * - `vkGetInstanceProcAddr` - * - * If Vulkan is not available on the machine, this function returns `NULL` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available. - * - * This function is equivalent to calling `vkGetInstanceProcAddr` with - * a platform-specific query of the Vulkan loader as a fallback. - * - * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve - * functions related to instance creation. - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_API_UNAVAILABLE. - * - * @pointer_lifetime The returned function pointer is valid until the library - * is terminated. - * - * @thread_safety This function may be called from any thread. - * - * @sa @ref vulkan_proc - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); - -/*! @brief Returns whether the specified queue family can present images. - * - * This function returns whether the specified queue family of the specified - * physical device supports presentation to the platform GLFW was built for. - * - * If Vulkan or the required window surface creation instance extensions are - * not available on the machine, or if the specified instance was not created - * with the required extensions, this function returns `GLFW_FALSE` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported - * to check whether Vulkan is at least minimally available and @ref - * glfwGetRequiredInstanceExtensions to check what instance extensions are - * required. - * - * @param[in] instance The instance that the physical device belongs to. - * @param[in] device The physical device that the queue family belongs to. - * @param[in] queuefamily The index of the queue family to query. - * @return `GLFW_TRUE` if the queue family supports presentation, or - * `GLFW_FALSE` otherwise. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. - * - * @remark @macos This function currently always returns `GLFW_TRUE`, as the - * `VK_MVK_macos_surface` extension does not provide - * a `vkGetPhysicalDevice*PresentationSupport` type function. - * - * @thread_safety This function may be called from any thread. For - * synchronization details of Vulkan objects, see the Vulkan specification. - * - * @sa @ref vulkan_present - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); - -/*! @brief Creates a Vulkan surface for the specified window. - * - * This function creates a Vulkan surface for the specified window. - * - * If the Vulkan loader or at least one minimally functional ICD were not found, - * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref - * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether - * Vulkan is at least minimally available. - * - * If the required window surface creation instance extensions are not - * available or if the specified instance was not created with these extensions - * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and - * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref - * glfwGetRequiredInstanceExtensions to check what instance extensions are - * required. - * - * The window surface cannot be shared with another API so the window must - * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) - * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error - * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. - * - * The window surface must be destroyed before the specified Vulkan instance. - * It is the responsibility of the caller to destroy the window surface. GLFW - * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the - * surface. - * - * @param[in] instance The Vulkan instance to create the surface in. - * @param[in] window The window to create the surface for. - * @param[in] allocator The allocator to use, or `NULL` to use the default - * allocator. - * @param[out] surface Where to store the handle of the surface. This is set - * to `VK_NULL_HANDLE` if an error occurred. - * @return `VK_SUCCESS` if successful, or a Vulkan error code if an - * [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref - * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE - * - * @remark If an error occurs before the creation call is made, GLFW returns - * the Vulkan error code most appropriate for the error. Appropriate use of - * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should - * eliminate almost all occurrences of these errors. - * - * @remark @macos This function currently only supports the - * `VK_MVK_macos_surface` extension from MoltenVK. - * - * @remark @macos This function creates and sets a `CAMetalLayer` instance for - * the window content view, which is required for MoltenVK to function. - * - * @thread_safety This function may be called from any thread. For - * synchronization details of Vulkan objects, see the Vulkan specification. - * - * @sa @ref vulkan_surface - * @sa @ref glfwGetRequiredInstanceExtensions - * - * @since Added in version 3.2. - * - * @ingroup vulkan - */ -GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); - -#endif /*VK_VERSION_1_0*/ - - -/************************************************************************* - * Global definition cleanup - *************************************************************************/ - -/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ - -#ifdef GLFW_WINGDIAPI_DEFINED - #undef WINGDIAPI - #undef GLFW_WINGDIAPI_DEFINED -#endif - -#ifdef GLFW_CALLBACK_DEFINED - #undef CALLBACK - #undef GLFW_CALLBACK_DEFINED -#endif - -/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally - * defined by some gl.h variants (OpenBSD) so define it after if needed. - */ -#ifndef GLAPIENTRY - #define GLAPIENTRY APIENTRY -#endif - -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_h_ */ - diff --git a/dep/glfw/glfw3native.h b/dep/glfw/glfw3native.h deleted file mode 100755 index 267e75c..0000000 --- a/dep/glfw/glfw3native.h +++ /dev/null @@ -1,525 +0,0 @@ -/************************************************************************* - * GLFW 3.3 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2018 Camilla Löwy - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_native_h_ -#define _glfw3_native_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @file glfw3native.h - * @brief The header of the native access functions. - * - * This is the header file of the native access functions. See @ref native for - * more information. - */ -/*! @defgroup native Native access - * @brief Functions related to accessing native handles. - * - * **By using the native access functions you assert that you know what you're - * doing and how to fix problems caused by using them. If you don't, you - * shouldn't be using them.** - * - * Before the inclusion of @ref glfw3native.h, you may define zero or more - * window system API macro and zero or more context creation API macros. - * - * The chosen backends must match those the library was compiled for. Failure - * to do this will cause a link-time error. - * - * The available window API macros are: - * * `GLFW_EXPOSE_NATIVE_WIN32` - * * `GLFW_EXPOSE_NATIVE_COCOA` - * * `GLFW_EXPOSE_NATIVE_X11` - * * `GLFW_EXPOSE_NATIVE_WAYLAND` - * - * The available context API macros are: - * * `GLFW_EXPOSE_NATIVE_WGL` - * * `GLFW_EXPOSE_NATIVE_NSGL` - * * `GLFW_EXPOSE_NATIVE_GLX` - * * `GLFW_EXPOSE_NATIVE_EGL` - * * `GLFW_EXPOSE_NATIVE_OSMESA` - * - * These macros select which of the native access functions that are declared - * and which platform-specific headers to include. It is then up your (by - * definition platform-specific) code to handle which of these should be - * defined. - */ - - -/************************************************************************* - * System headers and types - *************************************************************************/ - -#if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) - // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for - // example to allow applications to correctly declare a GL_ARB_debug_output - // callback) but windows.h assumes no one will define APIENTRY before it does - #if defined(GLFW_APIENTRY_DEFINED) - #undef APIENTRY - #undef GLFW_APIENTRY_DEFINED - #endif - #include -#elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) - #if defined(__OBJC__) - #import - #else - #include - typedef void* id; - #endif -#elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) - #include - #include -#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) - #include -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WGL) - /* WGL is declared by windows.h */ -#endif -#if defined(GLFW_EXPOSE_NATIVE_NSGL) - /* NSGL is declared by Cocoa.h */ -#endif -#if defined(GLFW_EXPOSE_NATIVE_GLX) - #include -#endif -#if defined(GLFW_EXPOSE_NATIVE_EGL) - #include -#endif -#if defined(GLFW_EXPOSE_NATIVE_OSMESA) - #include -#endif - - -/************************************************************************* - * Functions - *************************************************************************/ - -#if defined(GLFW_EXPOSE_NATIVE_WIN32) -/*! @brief Returns the adapter device name of the specified monitor. - * - * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) - * of the specified monitor, or `NULL` if an [error](@ref error_handling) - * occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); - -/*! @brief Returns the display device name of the specified monitor. - * - * @return The UTF-8 encoded display device name (for example - * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); - -/*! @brief Returns the `HWND` of the specified window. - * - * @return The `HWND` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WGL) -/*! @brief Returns the `HGLRC` of the specified window. - * - * @return The `HGLRC` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_COCOA) -/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. - * - * @return The `CGDirectDisplayID` of the specified monitor, or - * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); - -/*! @brief Returns the `NSWindow` of the specified window. - * - * @return The `NSWindow` of the specified window, or `nil` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_NSGL) -/*! @brief Returns the `NSOpenGLContext` of the specified window. - * - * @return The `NSOpenGLContext` of the specified window, or `nil` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_X11) -/*! @brief Returns the `Display` used by GLFW. - * - * @return The `Display` used by GLFW, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI Display* glfwGetX11Display(void); - -/*! @brief Returns the `RRCrtc` of the specified monitor. - * - * @return The `RRCrtc` of the specified monitor, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); - -/*! @brief Returns the `RROutput` of the specified monitor. - * - * @return The `RROutput` of the specified monitor, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.1. - * - * @ingroup native - */ -GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); - -/*! @brief Returns the `Window` of the specified window. - * - * @return The `Window` of the specified window, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI Window glfwGetX11Window(GLFWwindow* window); - -/*! @brief Sets the current primary selection to the specified string. - * - * @param[in] string A UTF-8 encoded string. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The specified string is copied before this function - * returns. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwGetX11SelectionString - * @sa glfwSetClipboardString - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI void glfwSetX11SelectionString(const char* string); - -/*! @brief Returns the contents of the current primary selection as a string. - * - * If the selection is empty or if its contents cannot be converted, `NULL` - * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. - * - * @return The contents of the selection as a UTF-8 encoded string, or `NULL` - * if an [error](@ref error_handling) occurred. - * - * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref - * GLFW_PLATFORM_ERROR. - * - * @pointer_lifetime The returned string is allocated and freed by GLFW. You - * should not free it yourself. It is valid until the next call to @ref - * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the - * library is terminated. - * - * @thread_safety This function must only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwSetX11SelectionString - * @sa glfwGetClipboardString - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetX11SelectionString(void); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_GLX) -/*! @brief Returns the `GLXContext` of the specified window. - * - * @return The `GLXContext` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); - -/*! @brief Returns the `GLXWindow` of the specified window. - * - * @return The `GLXWindow` of the specified window, or `None` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) -/*! @brief Returns the `struct wl_display*` used by GLFW. - * - * @return The `struct wl_display*` used by GLFW, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); - -/*! @brief Returns the `struct wl_output*` of the specified monitor. - * - * @return The `struct wl_output*` of the specified monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); - -/*! @brief Returns the main `struct wl_surface*` of the specified window. - * - * @return The main `struct wl_surface*` of the specified window, or `NULL` if - * an [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.2. - * - * @ingroup native - */ -GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_EGL) -/*! @brief Returns the `EGLDisplay` used by GLFW. - * - * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI EGLDisplay glfwGetEGLDisplay(void); - -/*! @brief Returns the `EGLContext` of the specified window. - * - * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); - -/*! @brief Returns the `EGLSurface` of the specified window. - * - * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.0. - * - * @ingroup native - */ -GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_OSMESA) -/*! @brief Retrieves the color buffer associated with the specified window. - * - * @param[in] window The window whose color buffer to retrieve. - * @param[out] width Where to store the width of the color buffer, or `NULL`. - * @param[out] height Where to store the height of the color buffer, or `NULL`. - * @param[out] format Where to store the OSMesa pixel format of the color - * buffer, or `NULL`. - * @param[out] buffer Where to store the address of the color buffer, or - * `NULL`. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); - -/*! @brief Retrieves the depth buffer associated with the specified window. - * - * @param[in] window The window whose depth buffer to retrieve. - * @param[out] width Where to store the width of the depth buffer, or `NULL`. - * @param[out] height Where to store the height of the depth buffer, or `NULL`. - * @param[out] bytesPerValue Where to store the number of bytes per depth - * buffer element, or `NULL`. - * @param[out] buffer Where to store the address of the depth buffer, or - * `NULL`. - * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); - -/*! @brief Returns the `OSMesaContext` of the specified window. - * - * @return The `OSMesaContext` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @thread_safety This function may be called from any thread. Access is not - * synchronized. - * - * @since Added in version 3.3. - * - * @ingroup native - */ -GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_native_h_ */ - diff --git a/dep/glfw/libglfw3.a b/dep/glfw/libglfw3.a deleted file mode 100644 index e36b29edf77d137cc8e4ac4159d37fa3ac9c9e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457066 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

qrLi{6MtLq<6$f~#<}8bul@w$ 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 B*|z`y diff --git a/dep/glfw/libglfw3dll.a b/dep/glfw/libglfw3dll.a deleted file mode 100755 index 0147894d69218ae68b71df176a46cff74ec169cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85450 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 diff --git a/dep/phoboslab/qoi.h b/dep/phoboslab/qoi.h deleted file mode 100644 index 6734ac4..0000000 --- a/dep/phoboslab/qoi.h +++ /dev/null @@ -1,649 +0,0 @@ -/* - -Copyright (c) 2021, Dominic Szablewski - https://phoboslab.org -SPDX-License-Identifier: MIT - - -QOI - The "Quite OK Image" format for fast, lossless image compression - --- About - -QOI encodes and decodes images in a lossless format. Compared to stb_image and -stb_image_write QOI offers 20x-50x faster encoding, 3x-4x faster decoding and -20% better compression. - - --- Synopsis - -// Define `QOI_IMPLEMENTATION` in *one* C/C++ file before including this -// library to create the implementation. - -#define QOI_IMPLEMENTATION -#include "qoi.h" - -// Encode and store an RGBA buffer to the file system. The qoi_desc describes -// the input pixel data. -qoi_write("image_new.qoi", rgba_pixels, &(qoi_desc){ - .width = 1920, - .height = 1080, - .channels = 4, - .colorspace = QOI_SRGB -}); - -// Load and decode a QOI image from the file system into a 32bbp RGBA buffer. -// The qoi_desc struct will be filled with the width, height, number of channels -// and colorspace read from the file header. -qoi_desc desc; -void *rgba_pixels = qoi_read("image.qoi", &desc, 4); - - - --- Documentation - -This library provides the following functions; -- qoi_read -- read and decode a QOI file -- qoi_decode -- decode the raw bytes of a QOI image from memory -- qoi_write -- encode and write a QOI file -- qoi_encode -- encode an rgba buffer into a QOI image in memory - -See the function declaration below for the signature and more information. - -If you don't want/need the qoi_read and qoi_write functions, you can define -QOI_NO_STDIO before including this library. - -This library uses malloc() and free(). To supply your own malloc implementation -you can define QOI_MALLOC and QOI_FREE before including this library. - -This library uses memset() to zero-initialize the index. To supply your own -implementation you can define QOI_ZEROARR before including this library. - - --- Data Format - -A QOI file has a 14 byte header, followed by any number of data "chunks" and an -8-byte end marker. - -struct qoi_header_t { - char magic[4]; // magic bytes "qoif" - uint32_t width; // image width in pixels (BE) - uint32_t height; // image height in pixels (BE) - uint8_t channels; // 3 = RGB, 4 = RGBA - uint8_t colorspace; // 0 = sRGB with linear alpha, 1 = all channels linear -}; - -Images are encoded row by row, left to right, top to bottom. The decoder and -encoder start with {r: 0, g: 0, b: 0, a: 255} as the previous pixel value. An -image is complete when all pixels specified by width * height have been covered. - -Pixels are encoded as - - a run of the previous pixel - - an index into an array of previously seen pixels - - a difference to the previous pixel value in r,g,b - - full r,g,b or r,g,b,a values - -The color channels are assumed to not be premultiplied with the alpha channel -("un-premultiplied alpha"). - -A running array[64] (zero-initialized) of previously seen pixel values is -maintained by the encoder and decoder. Each pixel that is seen by the encoder -and decoder is put into this array at the position formed by a hash function of -the color value. In the encoder, if the pixel value at the index matches the -current pixel, this index position is written to the stream as QOI_OP_INDEX. -The hash function for the index is: - - index_position = (r * 3 + g * 5 + b * 7 + a * 11) % 64 - -Each chunk starts with a 2- or 8-bit tag, followed by a number of data bits. The -bit length of chunks is divisible by 8 - i.e. all chunks are byte aligned. All -values encoded in these data bits have the most significant bit on the left. - -The 8-bit tags have precedence over the 2-bit tags. A decoder must check for the -presence of an 8-bit tag first. - -The byte stream's end is marked with 7 0x00 bytes followed a single 0x01 byte. - - -The possible chunks are: - - -.- QOI_OP_INDEX ----------. -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----------------| -| 0 0 | index | -`-------------------------` -2-bit tag b00 -6-bit index into the color index array: 0..63 - -A valid encoder must not issue 2 or more consecutive QOI_OP_INDEX chunks to the -same index. QOI_OP_RUN should be used instead. - - -.- QOI_OP_DIFF -----------. -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----+-----+-----| -| 0 1 | dr | dg | db | -`-------------------------` -2-bit tag b01 -2-bit red channel difference from the previous pixel between -2..1 -2-bit green channel difference from the previous pixel between -2..1 -2-bit blue channel difference from the previous pixel between -2..1 - -The difference to the current channel values are using a wraparound operation, -so "1 - 2" will result in 255, while "255 + 1" will result in 0. - -Values are stored as unsigned integers with a bias of 2. E.g. -2 is stored as -0 (b00). 1 is stored as 3 (b11). - -The alpha value remains unchanged from the previous pixel. - - -.- QOI_OP_LUMA -------------------------------------. -| Byte[0] | Byte[1] | -| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | -|-------+-----------------+-------------+-----------| -| 1 0 | green diff | dr - dg | db - dg | -`---------------------------------------------------` -2-bit tag b10 -6-bit green channel difference from the previous pixel -32..31 -4-bit red channel difference minus green channel difference -8..7 -4-bit blue channel difference minus green channel difference -8..7 - -The green channel is used to indicate the general direction of change and is -encoded in 6 bits. The red and blue channels (dr and db) base their diffs off -of the green channel difference and are encoded in 4 bits. I.e.: - dr_dg = (cur_px.r - prev_px.r) - (cur_px.g - prev_px.g) - db_dg = (cur_px.b - prev_px.b) - (cur_px.g - prev_px.g) - -The difference to the current channel values are using a wraparound operation, -so "10 - 13" will result in 253, while "250 + 7" will result in 1. - -Values are stored as unsigned integers with a bias of 32 for the green channel -and a bias of 8 for the red and blue channel. - -The alpha value remains unchanged from the previous pixel. - - -.- QOI_OP_RUN ------------. -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----------------| -| 1 1 | run | -`-------------------------` -2-bit tag b11 -6-bit run-length repeating the previous pixel: 1..62 - -The run-length is stored with a bias of -1. Note that the run-lengths 63 and 64 -(b111110 and b111111) are illegal as they are occupied by the QOI_OP_RGB and -QOI_OP_RGBA tags. - - -.- QOI_OP_RGB ------------------------------------------. -| Byte[0] | Byte[1] | Byte[2] | Byte[3] | -| 7 6 5 4 3 2 1 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | -|-------------------------+---------+---------+---------| -| 1 1 1 1 1 1 1 0 | red | green | blue | -`-------------------------------------------------------` -8-bit tag b11111110 -8-bit red channel value -8-bit green channel value -8-bit blue channel value - -The alpha value remains unchanged from the previous pixel. - - -.- QOI_OP_RGBA ---------------------------------------------------. -| Byte[0] | Byte[1] | Byte[2] | Byte[3] | Byte[4] | -| 7 6 5 4 3 2 1 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | -|-------------------------+---------+---------+---------+---------| -| 1 1 1 1 1 1 1 1 | red | green | blue | alpha | -`-----------------------------------------------------------------` -8-bit tag b11111111 -8-bit red channel value -8-bit green channel value -8-bit blue channel value -8-bit alpha channel value - -*/ - - -/* ----------------------------------------------------------------------------- -Header - Public functions */ - -#ifndef QOI_H -#define QOI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* A pointer to a qoi_desc struct has to be supplied to all of qoi's functions. -It describes either the input format (for qoi_write and qoi_encode), or is -filled with the description read from the file header (for qoi_read and -qoi_decode). - -The colorspace in this qoi_desc is an enum where - 0 = sRGB, i.e. gamma scaled RGB channels and a linear alpha channel - 1 = all channels are linear -You may use the constants QOI_SRGB or QOI_LINEAR. The colorspace is purely -informative. It will be saved to the file header, but does not affect -how chunks are en-/decoded. */ - -#define QOI_SRGB 0 -#define QOI_LINEAR 1 - -typedef struct { - unsigned int width; - unsigned int height; - unsigned char channels; - unsigned char colorspace; -} qoi_desc; - -#ifndef QOI_NO_STDIO - -/* Encode raw RGB or RGBA pixels into a QOI image and write it to the file -system. The qoi_desc struct must be filled with the image width, height, -number of channels (3 = RGB, 4 = RGBA) and the colorspace. - -The function returns 0 on failure (invalid parameters, or fopen or malloc -failed) or the number of bytes written on success. */ - -int qoi_write(const char *filename, const void *data, const qoi_desc *desc); - - -/* Read and decode a QOI image from the file system. If channels is 0, the -number of channels from the file header is used. If channels is 3 or 4 the -output format will be forced into this number of channels. - -The function either returns NULL on failure (invalid data, or malloc or fopen -failed) or a pointer to the decoded pixels. On success, the qoi_desc struct -will be filled with the description from the file header. - -The returned pixel data should be free()d after use. */ - -void *qoi_read(const char *filename, qoi_desc *desc, int channels); - -#endif /* QOI_NO_STDIO */ - - -/* Encode raw RGB or RGBA pixels into a QOI image in memory. - -The function either returns NULL on failure (invalid parameters or malloc -failed) or a pointer to the encoded data on success. On success the out_len -is set to the size in bytes of the encoded data. - -The returned qoi data should be free()d after use. */ - -void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len); - - -/* Decode a QOI image from memory. - -The function either returns NULL on failure (invalid parameters or malloc -failed) or a pointer to the decoded pixels. On success, the qoi_desc struct -is filled with the description from the file header. - -The returned pixel data should be free()d after use. */ - -void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels); - - -#ifdef __cplusplus -} -#endif -#endif /* QOI_H */ - - -/* ----------------------------------------------------------------------------- -Implementation */ - -#ifdef QOI_IMPLEMENTATION -#include -#include - -#ifndef QOI_MALLOC - #define QOI_MALLOC(sz) malloc(sz) - #define QOI_FREE(p) free(p) -#endif -#ifndef QOI_ZEROARR - #define QOI_ZEROARR(a) memset((a),0,sizeof(a)) -#endif - -#define QOI_OP_INDEX 0x00 /* 00xxxxxx */ -#define QOI_OP_DIFF 0x40 /* 01xxxxxx */ -#define QOI_OP_LUMA 0x80 /* 10xxxxxx */ -#define QOI_OP_RUN 0xc0 /* 11xxxxxx */ -#define QOI_OP_RGB 0xfe /* 11111110 */ -#define QOI_OP_RGBA 0xff /* 11111111 */ - -#define QOI_MASK_2 0xc0 /* 11000000 */ - -#define QOI_COLOR_HASH(C) (C.rgba.r*3 + C.rgba.g*5 + C.rgba.b*7 + C.rgba.a*11) -#define QOI_MAGIC \ - (((unsigned int)'q') << 24 | ((unsigned int)'o') << 16 | \ - ((unsigned int)'i') << 8 | ((unsigned int)'f')) -#define QOI_HEADER_SIZE 14 - -/* 2GB is the max file size that this implementation can safely handle. We guard -against anything larger than that, assuming the worst case with 5 bytes per -pixel, rounded down to a nice clean value. 400 million pixels ought to be -enough for anybody. */ -#define QOI_PIXELS_MAX ((unsigned int)400000000) - -typedef union { - struct { unsigned char r, g, b, a; } rgba; - unsigned int v; -} qoi_rgba_t; - -static const unsigned char qoi_padding[8] = {0,0,0,0,0,0,0,1}; - -static void qoi_write_32(unsigned char *bytes, int *p, unsigned int v) { - bytes[(*p)++] = (0xff000000 & v) >> 24; - bytes[(*p)++] = (0x00ff0000 & v) >> 16; - bytes[(*p)++] = (0x0000ff00 & v) >> 8; - bytes[(*p)++] = (0x000000ff & v); -} - -static unsigned int qoi_read_32(const unsigned char *bytes, int *p) { - unsigned int a = bytes[(*p)++]; - unsigned int b = bytes[(*p)++]; - unsigned int c = bytes[(*p)++]; - unsigned int d = bytes[(*p)++]; - return a << 24 | b << 16 | c << 8 | d; -} - -void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len) { - int i, max_size, p, run; - int px_len, px_end, px_pos, channels; - unsigned char *bytes; - const unsigned char *pixels; - qoi_rgba_t index[64]; - qoi_rgba_t px, px_prev; - - if ( - data == NULL || out_len == NULL || desc == NULL || - desc->width == 0 || desc->height == 0 || - desc->channels < 3 || desc->channels > 4 || - desc->colorspace > 1 || - desc->height >= QOI_PIXELS_MAX / desc->width - ) { - return NULL; - } - - max_size = - desc->width * desc->height * (desc->channels + 1) + - QOI_HEADER_SIZE + sizeof(qoi_padding); - - p = 0; - bytes = (unsigned char *) QOI_MALLOC(max_size); - if (!bytes) { - return NULL; - } - - qoi_write_32(bytes, &p, QOI_MAGIC); - qoi_write_32(bytes, &p, desc->width); - qoi_write_32(bytes, &p, desc->height); - bytes[p++] = desc->channels; - bytes[p++] = desc->colorspace; - - - pixels = (const unsigned char *)data; - - QOI_ZEROARR(index); - - run = 0; - px_prev.rgba.r = 0; - px_prev.rgba.g = 0; - px_prev.rgba.b = 0; - px_prev.rgba.a = 255; - px = px_prev; - - px_len = desc->width * desc->height * desc->channels; - px_end = px_len - desc->channels; - channels = desc->channels; - - for (px_pos = 0; px_pos < px_len; px_pos += channels) { - px.rgba.r = pixels[px_pos + 0]; - px.rgba.g = pixels[px_pos + 1]; - px.rgba.b = pixels[px_pos + 2]; - - if (channels == 4) { - px.rgba.a = pixels[px_pos + 3]; - } - - if (px.v == px_prev.v) { - run++; - if (run == 62 || px_pos == px_end) { - bytes[p++] = QOI_OP_RUN | (run - 1); - run = 0; - } - } - else { - int index_pos; - - if (run > 0) { - bytes[p++] = QOI_OP_RUN | (run - 1); - run = 0; - } - - index_pos = QOI_COLOR_HASH(px) % 64; - - if (index[index_pos].v == px.v) { - bytes[p++] = QOI_OP_INDEX | index_pos; - } - else { - index[index_pos] = px; - - if (px.rgba.a == px_prev.rgba.a) { - signed char vr = px.rgba.r - px_prev.rgba.r; - signed char vg = px.rgba.g - px_prev.rgba.g; - signed char vb = px.rgba.b - px_prev.rgba.b; - - signed char vg_r = vr - vg; - signed char vg_b = vb - vg; - - if ( - vr > -3 && vr < 2 && - vg > -3 && vg < 2 && - vb > -3 && vb < 2 - ) { - bytes[p++] = QOI_OP_DIFF | (vr + 2) << 4 | (vg + 2) << 2 | (vb + 2); - } - else if ( - vg_r > -9 && vg_r < 8 && - vg > -33 && vg < 32 && - vg_b > -9 && vg_b < 8 - ) { - bytes[p++] = QOI_OP_LUMA | (vg + 32); - bytes[p++] = (vg_r + 8) << 4 | (vg_b + 8); - } - else { - bytes[p++] = QOI_OP_RGB; - bytes[p++] = px.rgba.r; - bytes[p++] = px.rgba.g; - bytes[p++] = px.rgba.b; - } - } - else { - bytes[p++] = QOI_OP_RGBA; - bytes[p++] = px.rgba.r; - bytes[p++] = px.rgba.g; - bytes[p++] = px.rgba.b; - bytes[p++] = px.rgba.a; - } - } - } - px_prev = px; - } - - for (i = 0; i < (int)sizeof(qoi_padding); i++) { - bytes[p++] = qoi_padding[i]; - } - - *out_len = p; - return bytes; -} - -void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels) { - const unsigned char *bytes; - unsigned int header_magic; - unsigned char *pixels; - qoi_rgba_t index[64]; - qoi_rgba_t px; - int px_len, chunks_len, px_pos; - int p = 0, run = 0; - - if ( - data == NULL || desc == NULL || - (channels != 0 && channels != 3 && channels != 4) || - size < QOI_HEADER_SIZE + (int)sizeof(qoi_padding) - ) { - return NULL; - } - - bytes = (const unsigned char *)data; - - header_magic = qoi_read_32(bytes, &p); - desc->width = qoi_read_32(bytes, &p); - desc->height = qoi_read_32(bytes, &p); - desc->channels = bytes[p++]; - desc->colorspace = bytes[p++]; - - if ( - desc->width == 0 || desc->height == 0 || - desc->channels < 3 || desc->channels > 4 || - desc->colorspace > 1 || - header_magic != QOI_MAGIC || - desc->height >= QOI_PIXELS_MAX / desc->width - ) { - return NULL; - } - - if (channels == 0) { - channels = desc->channels; - } - - px_len = desc->width * desc->height * channels; - pixels = (unsigned char *) QOI_MALLOC(px_len); - if (!pixels) { - return NULL; - } - - QOI_ZEROARR(index); - px.rgba.r = 0; - px.rgba.g = 0; - px.rgba.b = 0; - px.rgba.a = 255; - - chunks_len = size - (int)sizeof(qoi_padding); - for (px_pos = 0; px_pos < px_len; px_pos += channels) { - if (run > 0) { - run--; - } - else if (p < chunks_len) { - int b1 = bytes[p++]; - - if (b1 == QOI_OP_RGB) { - px.rgba.r = bytes[p++]; - px.rgba.g = bytes[p++]; - px.rgba.b = bytes[p++]; - } - else if (b1 == QOI_OP_RGBA) { - px.rgba.r = bytes[p++]; - px.rgba.g = bytes[p++]; - px.rgba.b = bytes[p++]; - px.rgba.a = bytes[p++]; - } - else if ((b1 & QOI_MASK_2) == QOI_OP_INDEX) { - px = index[b1]; - } - else if ((b1 & QOI_MASK_2) == QOI_OP_DIFF) { - px.rgba.r += ((b1 >> 4) & 0x03) - 2; - px.rgba.g += ((b1 >> 2) & 0x03) - 2; - px.rgba.b += ( b1 & 0x03) - 2; - } - else if ((b1 & QOI_MASK_2) == QOI_OP_LUMA) { - int b2 = bytes[p++]; - int vg = (b1 & 0x3f) - 32; - px.rgba.r += vg - 8 + ((b2 >> 4) & 0x0f); - px.rgba.g += vg; - px.rgba.b += vg - 8 + (b2 & 0x0f); - } - else if ((b1 & QOI_MASK_2) == QOI_OP_RUN) { - run = (b1 & 0x3f); - } - - index[QOI_COLOR_HASH(px) % 64] = px; - } - - pixels[px_pos + 0] = px.rgba.r; - pixels[px_pos + 1] = px.rgba.g; - pixels[px_pos + 2] = px.rgba.b; - - if (channels == 4) { - pixels[px_pos + 3] = px.rgba.a; - } - } - - return pixels; -} - -#ifndef QOI_NO_STDIO -#include - -int qoi_write(const char *filename, const void *data, const qoi_desc *desc) { - FILE *f = fopen(filename, "wb"); - int size; - void *encoded; - - if (!f) { - return 0; - } - - encoded = qoi_encode(data, desc, &size); - if (!encoded) { - fclose(f); - return 0; - } - - fwrite(encoded, 1, size, f); - fclose(f); - - QOI_FREE(encoded); - return size; -} - -void *qoi_read(const char *filename, qoi_desc *desc, int channels) { - FILE *f = fopen(filename, "rb"); - int size, bytes_read; - void *pixels, *data; - - if (!f) { - return NULL; - } - - fseek(f, 0, SEEK_END); - size = ftell(f); - if (size <= 0) { - fclose(f); - return NULL; - } - fseek(f, 0, SEEK_SET); - - data = QOI_MALLOC(size); - if (!data) { - fclose(f); - return NULL; - } - - bytes_read = fread(data, 1, size, f); - fclose(f); - - pixels = qoi_decode(data, bytes_read, desc, channels); - QOI_FREE(data); - return pixels; -} - -#endif /* QOI_NO_STDIO */ -#endif /* QOI_IMPLEMENTATION */ diff --git a/dep/randygaul/cute_files.h b/dep/randygaul/cute_files.h deleted file mode 100644 index fcd585e..0000000 --- a/dep/randygaul/cute_files.h +++ /dev/null @@ -1,520 +0,0 @@ -/* - ------------------------------------------------------------------------------ - Licensing information can be found at the end of the file. - ------------------------------------------------------------------------------ - - cute_files.h - v1.0 - - To create implementation (the function definitions) - #define CUTE_FILES_IMPLEMENTATION - in *one* C/CPP file (translation unit) that includes this file - - Summary: - Utility header for traversing directories to apply a function on each found file. - Recursively finds sub-directories. Can also be used to iterate over files in a - folder manually. All operations done in a cross-platform manner (thx posix!). - - This header does no dynamic memory allocation, and performs internally safe string - copies as necessary. Strings for paths, file names and file extensions are all - capped, and intended to use primarily the C run-time stack memory. Feel free to - modify the defines in this file to adjust string size limitations. - - Read the header for specifics on each function. - - Here's an example to print all files in a folder: - cf_dir_t dir; - cf_dir_open(&dir, "a"); - - while (dir.has_next) - { - cf_file_t file; - cf_read_file(&dir, &file); - printf("%s\n", file.name); - cf_dir_next(&dir); - } - - cf_dir_close(&dir); -*/ - -#if !defined(CUTE_FILES_H) - -#define CUTE_FILES_WINDOWS 1 -#define CUTE_FILES_MAC 2 -#define CUTE_FILES_UNIX 3 - -#if defined(_WIN32) - #define CUTE_FILES_PLATFORM CUTE_FILES_WINDOWS - #if !defined(_CRT_SECURE_NO_WARNINGS) - #define _CRT_SECURE_NO_WARNINGS - #endif -#elif defined(__APPLE__) - #define CUTE_FILES_PLATFORM CUTE_FILES_MAC -#else - #define CUTE_FILES_PLATFORM CUTE_FILES_UNIX -#endif - -#include // strerror, strncpy - -// change to 0 to compile out any debug checks -#define CUTE_FILES_DEBUG_CHECKS 1 - -#if CUTE_FILES_DEBUG_CHECKS - - #include // printf - #include // assert - #include - #define CUTE_FILES_ASSERT assert - -#else - - #define CUTE_FILES_ASSERT(...) - -#endif // CUTE_FILES_DEBUG_CHECKS - -#define CUTE_FILES_MAX_PATH 1024 -#define CUTE_FILES_MAX_FILENAME 256 -#define CUTE_FILES_MAX_EXT 32 - -struct cf_file_t; -struct cf_dir_t; -struct cf_time_t; -typedef struct cf_file_t cf_file_t; -typedef struct cf_dir_t cf_dir_t; -typedef struct cf_time_t cf_time_t; -typedef void (cf_callback_t)(cf_file_t* file, void* udata); - -// Stores the file extension in cf_file_t::ext, and returns a pointer to -// cf_file_t::ext -const char* cf_get_ext(cf_file_t* file); - -// Applies a function (cb) to all files in a directory. Will recursively visit -// all subdirectories. Useful for asset management, file searching, indexing, etc. -void cf_traverse(const char* path, cf_callback_t* cb, void* udata); - -// Fills out a cf_file_t struct with file information. Does not actually open the -// file contents, and instead performs more lightweight OS-specific calls. -int cf_read_file(cf_dir_t* dir, cf_file_t* file); - -// Once a cf_dir_t is opened, this function can be used to grab another file -// from the operating system. -void cf_dir_next(cf_dir_t* dir); - -// Performs lightweight OS-specific call to close internal handle. -void cf_dir_close(cf_dir_t* dir); - -// Performs lightweight OS-specific call to open a file handle on a directory. -int cf_dir_open(cf_dir_t* dir, const char* path); - -// Compares file last write times. -1 if file at path_a was modified earlier than path_b. -// 0 if they are equal. 1 if file at path_b was modified earlier than path_a. -int cf_compare_file_times_by_path(const char* path_a, const char* path_b); - -// Retrieves time file was last modified, returns 0 upon failure -int cf_get_file_time(const char* path, cf_time_t* time); - -// Compares file last write times. -1 if time_a was modified earlier than path_b. -// 0 if they are equal. 1 if time_b was modified earlier than path_a. -int cf_compare_file_times(cf_time_t* time_a, cf_time_t* time_b); - -// Returns 1 of file exists, otherwise returns 0. -int cf_file_exists(const char* path); - -// Returns 1 if the file's extension matches the string in ext -// Returns 0 otherwise -int cf_match_ext(cf_file_t* file, const char* ext); - -// Prints detected errors to stdout -void cf_do_unit_tests(); - -#if CUTE_FILES_PLATFORM == CUTE_FILES_WINDOWS - -#if !defined _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_WARNINGS -#endif -#include - - struct cf_file_t - { - char path[CUTE_FILES_MAX_PATH]; - char name[CUTE_FILES_MAX_FILENAME]; - char ext[CUTE_FILES_MAX_EXT]; - int is_dir; - int is_reg; - size_t size; - }; - - struct cf_dir_t - { - char path[CUTE_FILES_MAX_PATH]; - int has_next; - HANDLE handle; - WIN32_FIND_DATAA fdata; - }; - - struct cf_time_t - { - FILETIME time; - }; - -#elif CUTE_FILES_PLATFORM == CUTE_FILES_MAC || CUTE_FILES_PLATFORM == CUTE_FILES_UNIX - - #include - #include - #include - #include - - struct cf_file_t - { - char path[CUTE_FILES_MAX_PATH]; - char name[CUTE_FILES_MAX_FILENAME]; - char ext[CUTE_FILES_MAX_EXT]; - int is_dir; - int is_reg; - int size; - struct stat info; - }; - - struct cf_dir_t - { - char path[CUTE_FILES_MAX_PATH]; - int has_next; - DIR* dir; - struct dirent* entry; - }; - - struct cf_time_t - { - time_t time; - }; - -#endif - -#define CUTE_FILES_H -#endif - -#ifdef CUTE_FILES_IMPLEMENTATION -#ifndef CUTE_FILES_IMPLEMENTATION_ONCE -#define CUTE_FILES_IMPLEMENTATION_ONCE - -#define cf_safe_strcpy(dst, src, n, max) cf_safe_strcpy_internal(dst, src, n, max, __FILE__, __LINE__) -static int cf_safe_strcpy_internal(char* dst, const char* src, int n, int max, const char* file, int line) -{ - int c; - const char* original = src; - - do - { - if (n >= max) - { - if (!CUTE_FILES_DEBUG_CHECKS) break; - printf("ERROR: String \"%s\" too long to copy on line %d in file %s (max length of %d).\n" - , original - , line - , file - , max); - CUTE_FILES_ASSERT(0); - } - - c = *src++; - dst[n] = c; - ++n; - } while (c); - - return n; -} - -const char* cf_get_ext(cf_file_t* file) -{ - char* name = file->name; - char* period = NULL; - while (*name++) if (*name == '.') period = name; - if (period) cf_safe_strcpy(file->ext, period, 0, CUTE_FILES_MAX_EXT); - else file->ext[0] = 0; - return file->ext; -} - -void cf_traverse(const char* path, cf_callback_t* cb, void* udata) -{ - cf_dir_t dir; - cf_dir_open(&dir, path); - - while (dir.has_next) - { - cf_file_t file; - int res = cf_read_file(&dir, &file); - - if (res == 0) { - cf_dir_next(&dir); - continue; - } - - if (file.is_dir && file.name[0] != '.') - { - char path2[CUTE_FILES_MAX_PATH]; - int n = cf_safe_strcpy(path2, path, 0, CUTE_FILES_MAX_PATH); - n = cf_safe_strcpy(path2, "/", n - 1, CUTE_FILES_MAX_PATH); - cf_safe_strcpy(path2, file.name, n -1, CUTE_FILES_MAX_PATH); - cf_traverse(path2, cb, udata); - } - - if (file.is_reg) cb(&file, udata); - cf_dir_next(&dir); - } - - cf_dir_close(&dir); -} - -int cf_match_ext(cf_file_t* file, const char* ext) -{ - return !strcmp(file->ext, ext); -} - -#if CUTE_FILES_PLATFORM == CUTE_FILES_WINDOWS - - int cf_read_file(cf_dir_t* dir, cf_file_t* file) - { - CUTE_FILES_ASSERT(dir->handle != INVALID_HANDLE_VALUE); - - int n = 0; - char* fpath = file->path; - char* dpath = dir->path; - - n = cf_safe_strcpy(fpath, dpath, 0, CUTE_FILES_MAX_PATH); - n = cf_safe_strcpy(fpath, "/", n - 1, CUTE_FILES_MAX_PATH); - - char* dname = dir->fdata.cFileName; - char* fname = file->name; - - cf_safe_strcpy(fname, dname, 0, CUTE_FILES_MAX_FILENAME); - cf_safe_strcpy(fpath, fname, n - 1, CUTE_FILES_MAX_PATH); - - size_t max_dword = MAXDWORD; - file->size = ((size_t)dir->fdata.nFileSizeHigh * (max_dword + 1)) + (size_t)dir->fdata.nFileSizeLow; - cf_get_ext(file); - - file->is_dir = !!(dir->fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); - file->is_reg = !!(dir->fdata.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) || - !(dir->fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); - - return 1; - } - - void cf_dir_next(cf_dir_t* dir) - { - CUTE_FILES_ASSERT(dir->has_next); - - if (!FindNextFileA(dir->handle, &dir->fdata)) - { - dir->has_next = 0; - DWORD err = GetLastError(); - CUTE_FILES_ASSERT(err == ERROR_SUCCESS || err == ERROR_NO_MORE_FILES); - } - } - - void cf_dir_close(cf_dir_t* dir) - { - dir->path[0] = 0; - dir->has_next = 0; - if (dir->handle != INVALID_HANDLE_VALUE) FindClose(dir->handle); - } - - int cf_dir_open(cf_dir_t* dir, const char* path) - { - int n = cf_safe_strcpy(dir->path, path, 0, CUTE_FILES_MAX_PATH); - n = cf_safe_strcpy(dir->path, "\\*", n - 1, CUTE_FILES_MAX_PATH); - dir->handle = FindFirstFileA(dir->path, &dir->fdata); - dir->path[n - 3] = 0; - - if (dir->handle == INVALID_HANDLE_VALUE) - { - printf("ERROR: Failed to open directory (%s): %s.\n", path, strerror(errno)); - cf_dir_close(dir); - CUTE_FILES_ASSERT(0); - return 0; - } - - dir->has_next = 1; - - return 1; - } - - int cf_compare_file_times_by_path(const char* path_a, const char* path_b) - { - FILETIME time_a = { 0 }; - FILETIME time_b = { 0 }; - WIN32_FILE_ATTRIBUTE_DATA data; - - if (GetFileAttributesExA(path_a, GetFileExInfoStandard, &data)) time_a = data.ftLastWriteTime; - if (GetFileAttributesExA(path_b, GetFileExInfoStandard, &data)) time_b = data.ftLastWriteTime; - return CompareFileTime(&time_a, &time_b); - } - - int cf_get_file_time(const char* path, cf_time_t* time) - { - FILETIME initialized_to_zero = { 0 }; - time->time = initialized_to_zero; - WIN32_FILE_ATTRIBUTE_DATA data; - if (GetFileAttributesExA(path, GetFileExInfoStandard, &data)) - { - time->time = data.ftLastWriteTime; - return 1; - } - return 0; - } - - int cf_compare_file_times(cf_time_t* time_a, cf_time_t* time_b) - { - return CompareFileTime(&time_a->time, &time_b->time); - } - - int cf_file_exists(const char* path) - { - WIN32_FILE_ATTRIBUTE_DATA unused; - return GetFileAttributesExA(path, GetFileExInfoStandard, &unused); - } - -#elif CUTE_FILES_PLATFORM == CUTE_FILES_MAC || CUTE_FILES_PLATFORM == CUTE_FILES_UNIX - - int cf_read_file(cf_dir_t* dir, cf_file_t* file) - { - CUTE_FILES_ASSERT(dir->entry); - - int n = 0; - char* fpath = file->path; - char* dpath = dir->path; - - n = cf_safe_strcpy(fpath, dpath, 0, CUTE_FILES_MAX_PATH); - n = cf_safe_strcpy(fpath, "/", n - 1, CUTE_FILES_MAX_PATH); - - char* dname = dir->entry->d_name; - char* fname = file->name; - - cf_safe_strcpy(fname, dname, 0, CUTE_FILES_MAX_FILENAME); - cf_safe_strcpy(fpath, fname, n - 1, CUTE_FILES_MAX_PATH); - - if (stat(file->path, &file->info)) - return 0; - - file->size = file->info.st_size; - cf_get_ext(file); - - file->is_dir = S_ISDIR(file->info.st_mode); - file->is_reg = S_ISREG(file->info.st_mode); - - return 1; - } - - void cf_dir_next(cf_dir_t* dir) - { - CUTE_FILES_ASSERT(dir->has_next); - dir->entry = readdir(dir->dir); - dir->has_next = dir->entry ? 1 : 0; - } - - void cf_dir_close(cf_dir_t* dir) - { - dir->path[0] = 0; - if (dir->dir) closedir(dir->dir); - dir->dir = 0; - dir->has_next = 0; - dir->entry = 0; - } - - int cf_dir_open(cf_dir_t* dir, const char* path) - { - cf_safe_strcpy(dir->path, path, 0, CUTE_FILES_MAX_PATH); - dir->dir = opendir(path); - - if (!dir->dir) - { - printf("ERROR: Failed to open directory (%s): %s.\n", path, strerror(errno)); - cf_dir_close(dir); - CUTE_FILES_ASSERT(0); - return 0; - } - - dir->has_next = 1; - dir->entry = readdir(dir->dir); - if (!dir->dir) dir->has_next = 0; - - return 1; - } - - // Warning : untested code! (let me know if it breaks) - int cf_compare_file_times_by_path(const char* path_a, const char* path_b) - { - time_t time_a; - time_t time_b; - struct stat info; - if (stat(path_a, &info)) return 0; - time_a = info.st_mtime; - if (stat(path_b, &info)) return 0; - time_b = info.st_mtime; - return (int)difftime(time_a, time_b); - } - - // Warning : untested code! (let me know if it breaks) - int cf_get_file_time(const char* path, cf_time_t* time) - { - struct stat info; - if (stat(path, &info)) return 0; - time->time = info.st_mtime; - return 1; - } - - // Warning : untested code! (let me know if it breaks) - int cf_compare_file_times(cf_time_t* time_a, cf_time_t* time_b) - { - return (int)difftime(time_a->time, time_b->time); - } - - // Warning : untested code! (let me know if it breaks) - int cf_file_exists(const char* path) - { - return access(path, F_OK) != -1; - } - -#endif // CUTE_FILES_PLATFORM - -#endif // CUTE_FILES_IMPLEMENTATION_ONCE -#endif // CUTE_FILES_IMPLEMENTATION - -/* - ------------------------------------------------------------------------------ - This software is available under 2 licenses - you may choose the one you like. - ------------------------------------------------------------------------------ - ALTERNATIVE A - zlib license - Copyright (c) 2017 Randy Gaul http://www.randygaul.net - This software is provided 'as-is', without any express or implied warranty. - In no event will the authors be held liable for any damages arising from - the use of this software. - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not - be misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - ------------------------------------------------------------------------------ - ALTERNATIVE B - Public Domain (www.unlicense.org) - This is free and unencumbered software released into the public domain. - Anyone is free to copy, modify, publish, use, compile, sell, or distribute this - software, either in source code form or as a compiled binary, for any purpose, - commercial or non-commercial, and by any means. - In jurisdictions that recognize copyright laws, the author or authors of this - software dedicate any and all copyright interest in the software to the public - domain. We make this dedication for the benefit of the public at large and to - the detriment of our heirs and successors. We intend this dedication to be an - overt act of relinquishment in perpetuity of all present and future rights to - this software under copyright law. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ------------------------------------------------------------------------------ -*/ diff --git a/dep/sdl/libSDL2.a b/dep/sdl/libSDL2.a new file mode 100644 index 0000000000000000000000000000000000000000..be7e6f448a42a6beab9cf44de801d0fc87e88740 GIT binary patch literal 16537310 zcmeFaeXMLtb{EzTAwu>9Mc|-(2@MEa3D{)bo#*$SCFIQcy7#u{oO{olKKI_4A*QEK z_de(J+&;a}^vC^}0C5Z<$aWkD9OKwv9EVuO`3Ddp2qg$vC;=sbg!qrdvGO5BgeXK1 zWpKcDto&B3`dC%Fc6U|nzP1tlq<;78Rkc>FTD7Wb)vBshzv*|37USD*`Raf9$m^@ zR*z3Sv2lhI!*MYqb{G*}+U-z$kZ}02=%}?~c?iYU1{=WY9+k5Z& z_b>jd|66aANGDJf4}YT{mq{IeZ#MQ)yw|iwhod;jZxvbX>J%8Kl-h`4}a#*_dfiEU+8`GwLjeZ=~-&>zxW-!kN(I?iKid1|fAXW=H~({g zs{MC(-uveL@14rvTmFS_=xzOd$KURKi~fD;r@zuW_`W|B{T=`3U+K~B;e*TQ@6*5P zr+e~udh%y_PyVg%aKEqgdY}3DSNp%;{qf#s@EiR7?^M6f{b7To-}Y6j-cEmi`s;h&_LCp*z3Sv2lhI!*MYqb z>~&zT1A86V>%d+I_BycFfxQmwbzrXpdmY&8z+MOTI*z3Sv2lhI!*MYqb>~&zT1HaOB;IAzo^!C5K4E8#(*MYqb>~&zT z1A86V>%d+I_BycFfxQmwbzrXpdmY&8z+MOTI*z3Sv2lhI!*MYqb>~&zT1A86V>%d+I_BycFfxQmwbzrXpdmY&8z+MOT zI_?4mq|Mw@p*xUd1GT7_DUI+eR z(t-cycl^QLw%=F&nLpp#)$i|p;VZp&`TNL5-p}rTdl~F?V6Ovv9oXx@ zUI+F%pmpFM{MC>3{=t9$J?i&!U-ccm=)`GdWm zr{AZa#DDAOy`PW${@7P~KW~12?qj{5Z~lgZeaLz z`ec1~RV{ps^Vw*1T`xQ)mzSffS!K!_9?xb}$D@nO!D_Tvt?xhe-UF`YMRi{)G)-#u9a{B+-IeHY|Ds@L;X0HZ1|UR8tp z(YWf*gG8v^$zo9lZ5e_TyCE?AhU^sRYPO$Z-d> zLZt%e2s$twk7hoqX3Phoj!)OC`}OMKdOi*Y5|&MC@_qffTGZEiJUUp_chm9F!9dWr zu=ADdE(}JKG_nE~%L;vHWCi0fn2&x2by>VU94!{pYH?9PkC#=XqF%Ox@t4-qMJyZh zeYtphT6-GK@F?)vd=})LOb*tQX?={@VyqSU>3ub?B=~r`9M|)CHC|P^Be32#Fx8N$ zph6bM)t6`_4Z#qY%FYE1reBuor}~jd7UY13$%~6#OkZK@^AkmiNKnvVA_b+R^+)5%PC}=fWtz%4L zvi1|sN9!fGNQ0zH66KIGi5kUH1dO#To?oO1jH4NbpE!a`68Tluzz}*kU0|ptkv@bG zGtwjPlj=X(39>LG1Zxn68#8Ewm`Z09@K3q>{ ztkg%(F9jTCg`$9ItQtupOF+-p-Y7zq;p`7*>*cK=CUBqw@q~j{qv?#yw|KJZVsT!MdpP)LxT=Q_KdDDw1AZ0<58nGAp1lP=_~e6Vew0V>!ACwb z8vHB{M&a@7EpQa>s{pHukk4s7n!Gr`4EsU=Nt_C3R|06Lqw{CVz!Uj2bTq!LPN(xK z7ziJamKVpDgCl_e(7|jqeeMk^0G^$F*3b3H<0tiNA2b-8Gyo48kWV%s@4wds1$YO~ zgW>^bX8ES~9z66(9bB9Z`e(;J@X5*3CqCqK5RgAT@E{N)FR?BT&IBfrM$*A-dNaSn zNFOA@2&?7TOxaVP(1}CF?Wbe->)f+apHU^Si zYL;+%VZ;fe&_y=Iv{E>#$Rf>7vJK~^Yz{R$t#SGdQykS!utjf zD%ln*Gb_tPB)e}zt)9(9`is$Y75luL-c|KlH_kb%9gztwsJ=x10^j{Sd?$3aVLDe^YnSD)&?8n0R2U=w zWO6pTzlYOA^XsMRBy(#2B zr}J^B@^9v3bDmZLYFJ~+7uC34OdeIs)q0_obufBW!HzkG){PdI)!jXBSjevRSF)WekSby^esTL#hw^JqeZM1|TLJQAotTp>fhKE#0zA6JJ7>(ML-Q4-18_`>pMoi~@JV;;ke~bMzY{NzTJG2kU#Xo%|YOdB>@e1nYSd zezBf6frC|j--I5ctrzv%W&%0^1LZu=Y+}581UJ3p1fYZU3fmQPJA!gvWeLcf&*t~! z9gra63@Ro;7uZ0URZ&TBk~34e9EOtIBV<6IprU&$_o(KRG&<8M{YJf2$T2FM(0DPbUl!y|UPXTwD zA%K+GO8{p0?dJh^ixnBJ{W%=tTuOgw0SEAtn>`5Xs5XIfqCyse*+b)#Svkg%c5Wo4 zd$OS(B;MAq^=Lvf$J47XT0-<~T-c0EwtAQ+*zn+t?9Vq_8WsjwHDJLGhs|p?H!J|i z{sw_ffgEBf)ZS*-mh%o!Sxxt_){Ak14W^h{t1txxs`<;;GzAh`gO(Q*M(f8p3-C;a36ba-QFkc=Ako)=c zO*Mn<3O}|R90c%WzP`Jx&qm9adU#WRUe-YtW*bv?J!WDIpf;1=D#Q5*8~tVl1Wgd6 z8cCe>i1bRAPb9r;Sm9heI^^>B?*smzzF-pgZ=GOW?^qGsjV?xa+9n`z=%Wdi!Z~gB z(bfq=Fr4+tuvubU!s!DBT8JC=p3RZ!K2PRj+ITpxVNB?Hct{8H3HfAgshB-4Dssym z^Ujk^kWj}Js|)vPkm5{c{mO|k*r2{%y&f$pKaE7C$~FW9z!fQgJlc^znc3t5X)dr! z2M?sCxb@;1hYT1&8N^fTEh)fx zKCNEU(t_z*gcumP$y4Q&+2)RcksH>^Ot-AfDqzUL;N!*UwQAm=k^$VyAGC_qLc$5s zxDaKE%UV)S)eoaU-8mhDu3P%BM#fM+R1U$sjPMA}!i)yyWjw0ywV9`@f$tN~VUOK| zi5fXQJUEJ$Sb1^X^sM2jo`x}1+rv+X{3*LOdwx$-J`o=i|`H8t^ zxw0@d=3l(v3^aP1zo`ah>x}+BJuw?&^mXWcot~J@F;0_Trzao0uZvfB=1ZNDG6kp) zSAzOA)9bu4;@&MlV*F zcQO5O%3XB_vi9$>QBc6$*(7|7&2;*Dyu{$j2=uqbP#(%u~9zcBv zw8>h}+elbcrsk`~`d)KP2(R7W<6HOlLVh40b2(krBmN7!TjtN1{R?OPEYSVAp1HqA zt9r@=@Ygl}1?rHa_maW@I$3 zb@Pvw#%F`$hq{I6uLoTExSDD{#u#>%Ff%pW;DeB+d2LnddRCjoz^vA;Xq=SN^@09g zX)3mC{9#1&C8MF!G0r*+YwJPgZ)H3&B?S>ypZ4|n-} zdxypt7Ksmc`Gd*RAp{A)@TYy`^Z^+C>9mR`93LiE1Uf~|WM)FtZKS76t-8->bUK`w zvFnt^C-+Gf?EuGK?5>Q>t_%>}qb!mHq8>anzc}-(T;6(jYa{+P?k-^Y0LX^{zH31( z{=_E!aYY**oRjN$c{*T4wV$AE{{~t9n+n8Eh?WMv&a1^WE#KgSQzt&maP22S)4#OF zQ6z0tz-wvTqws3dnoy5`eBMp~Kn9DE%X&S&WmlssSpY3>ChtS^NqcsOcqRf2w0UtD zl+KOYZ*!2m0RT~)A-7#8=N?v{v2FAQB3GKh(*rulwxGN)sZ zdYa)6k;;stPg14^91AY8Ax@`Pi;>wM1Pr{>?H>%&SlXFEgw|%{{0=jpyuliP2Gzi; z06M5Dc5oKcD>z8C1QqcnkUKRd=9N3caymR4y(IT54Mh@NgQP^5X`K*~L3L}mC?(hC&7P1R)5vLP8uBW2|2{F&;L z!356w#bfKzjp4QePqA#qr6XHe&hJ5OUbUqr_HJwfCg2e{;F$`m0uresz=9HfGfo1_ z%_MpAf$3QCQ0D2Eskbql`!?L-dQ_(UZ_gZub757*(!I%?_O`wIQKp$lqUuoLbGTJa zr5cGC&?alML)ez;nTH}%3*|PN8tzf^wFW#(nvFz{a$BlLAAN`p7Hh@u4phM?)JL++ zSneh3G&G5@*+k`OKbtJtDg3?e7@5ex(!YFruNzz>IUsyr6pooV-E`2z~XY`C>?kl;q3AmK?pKZlo^=Bd^^razk1B9m~(r1(2F&D+8v zj75su%uJjOs=HWHl5E65A!a}xUBa;%s;o1{v>oyk7dGb@*zGzL?dZD%dE8;o5zXG1 z2H>2urnG4;+Zc2Z&b#j+ax~I>H2{r94%S@Jr5Rv%)wH?=&}9Qm`)W~OGb^nF8(G!j z(1RMcVHD_7rQJ0z8v#z*4U5b4^BSAjz z`Fx7#8)oTglGuA4P3kYBV2EDB$%5so7-}v}9$Rmw+GCqgDRrp?;Uk!m+MkgVlHQ+@ zAnr0i71OYVHSINQBhK~StNQbrO9DRK#i-y1nV?i0bTIaryU?c_3VT@3E>8Ia9Zh#U zyZPhmIWnA{9P2W?6#=AUQ;bYxZUd9~eA+y7U&1HmT=E7hmgZyA7-5^NktAEpPlTjk zCa8h*eq_DkUe)|8{+2~cr7tawz=@uF z#wP$rpu*pfMKM6OfwL885hOQp)krG=qVKCewIa?0od4DdVhfDs*pcU000X$?`QCeM zr*Tc$EP3LeVuCiYH^Us;jd)p==g7f9yA8!A1t{=@(s3>3gFfbKy)!#qUd={xJzF9w z1TH)2#+)wScxM;xDSn5cptifs$ISwVHu(b#s1*v=+g-M&O*abiVonm+Y9GvAW7Fs9 z{LmD{bc9v&wLR-Y#naZKIr!433(b|);Njry z-BmqXlCh0>Y2yeH#c;#T?Q}B44vKDG`l=8Ni{(#W6Xj|ej&DcUZ5)m%qLE9ipiI@m z3YGF-!!R2fxHYjU#ho}XU&DKQ0gph!E~8H}*@i25lh8mN153n9nAh{G8SF1>2T-;p zlx27gM;jcqpybZsQQ{4-+R}tQXtHAAxW-9JBDL_&LYNHq>}!jrLAx+W4k0Lt(FJSI zW0N?+`LF6t1(rpc?Ifxd@zi^~%G79y+P2lf>d%A0>VmJxi?ed54M3IH1R7=KX4kdBI#<^`%0$OgEYH z?iQ+Pi6(|j;Q|fBvnkDaMxOzUG6=A8N9U3~pQ<6zmM)`*=@!C;S6U+sgziG_2=Kt^ z^fzKV@Q0NX&5sY{{HXnyb9+h+9AKG#gJr-h>XK9YM`qsCtdMJjgT<|NC?1=j8nU@j zk5WhpnhA=$yOjnb$Q+wQ#}t>X<9z(fgPe{GoSb>^E9~;&s_?6{^dAxg9K^ z(rU-12sV&p!g6u)@#mf#ocA#d+qsG+NjgKMZc<4v2_Coa8oYm5Kf8SR z5o3D;l2?=&l~|faf^@49!sSmhkU6nIm*789&T2RLL61yMwaY1rL4GgE6f>U~Fy=UN zedDv4)&`_Y#yYYcBk2zT2dZA3KSo3jno&%F_?J$~FU?U6(mRvp4sK8LGPWO1Jrn=!3%ZcEjls4lvJZ=lZ5bQNS0smEG?r(IHX6ANn=lq2!6cHGs>ihFeDmtQn^kn}~9%L!!#gDS{W1(Ck&-XfCnIW$sfj zb8(bQ2Qy3Aa@?X?1%WV@ElYWOj|I5IQC?)590x7GsXj`<-KHHE&shNYAr4y@CYCZ zp+EwFE*u3Qx^xtP=yFp4I&6aI0#YNF2T~W4JRTGzU_!wHE_6PR4V|wE3mDP)JWe`UIxkj!jPa-Fpze2;dOArGz8&|5KuLkm=G=kZq|yCBuAg7Gm}x^at5_|+km>h zz`0N@cKSuCWs_+C3L{N~7{b6bpdd-HU>a~8fd!j3Dj-ZF-A09Jr0`6`_>DvxAEuE) z5guBQ^bTW7Dn>iaY#0odg@$>7V#YKIq&ANNsi9O$H&Q{$#hPiPs(>>MsE#_*fKz=j z?lj=+e6r_hThd9@Tau{#Tau_uk#uVUBAuTeTt0kyaW*7p)G~Aks?MA}Jv<4raJU{>R$>)X`FcyfhKYVn*8q&ns8^%)jyhWID zcC{GBQ_kU=QXcCeW*>FaD#V2o?qzEtuL*D(1vIcD-sDMLDx>30!?S8K#dcpv-kkmF z4atj3$^9pnCl?P7j!uSylZ%rl&(4O2&jv&KJgM z-~(CDCjFZ^4ubiWk5xP{wS5F$F9_OxGWJHc>F~yM;BQgaM+ktc0`Il*fE-Xm<({Ck zMTz+$o)buz?u&6CT~IY78?Kaw4B!m$-DZ9ctV}qEJ`L2$VsL7xH6NH`g6615TF%y7 z!Lr-uo^-wylf)Ewr$RA`Bb%*cAfc3OD2*@Yv=TxNY=O{yqJ%7ZOLH-KoY*K&>eqfEtF>-zXu+sXXKsz=$`LrY)g+2Bx!rV(LEHc(32;EK>6j#^ z`ns0bA5dZOFgdzB_U4NLwao4&xn*8A$>4!!>3EMa*}MZSk-B>6C(?ImD0pY7BNXg` z>PQ+CS)8ign4!^!P5F)n&Q}W(h+pywhv!T-1gD(pBj`a2=?nH^N!2kKYyIYyGRSD> zz^N%xDE6-?SEQ&|!7WJ~8#t0k?D#gep{P?x{mk{rIKD3kflds?QCh`Ih3eq;5lpAr zk;K+v-*D7E;F}!5EN{TU{BFSDb+fiNMqq>4I>ws}jnQ2sv{KzPq8t3iSnd)cqqs>7 z$8Q4<3}XX!1A3tQW`_-m&l=xMXR9rqYR}aNXdHznPSW0j2yk2g>o6e_#JXYQo0`U_ zAZMe{V#FQ$g2EU?f2LFGA($i2`?$!jS1-KhZ1R(4+Tq*)<3!{F$mIO&RsH6v37Fbn z2H+FKhtkyjG&0z#r9SfKk`D1a+p4Ztw=HDP2k$el4&{9CO(EzBF2%!is0Xj7h(86J zbZZ6`6yWK6rjNZi>OLvd4y%;S)Hu&+b*)#rn`vE8e3TS|j}}vX4rnvM^U+jaG;sL_ zE8H}8%d4=s&w5eDO$)wwqys-VI&hZZz+i}eaqy!5&NZIhw1Gwk*w6NF!&k#A>8(oH=Zzl#9WiN4WaI7=dxj9ECC^VPM@n8K97M znQfBRMmg!kjS^~Kp&91ETVrh|(%OYfHEMYC1SX}EJR5lefgX+!;TjL7RyI=h$2?qpHCh>jT|jyB^P`SL30&X3u0b#NH3r-*iFV z%P=#?gmngdn+xh1qM|(xhtsO6KK!Qlv4wRvyr0$&JSr5trZ*f8Usj8GHN%w+9MH30 z4#R>}ut@u5jAL5!0dULvfX}nA_^i7+s4O^Chi+i;b1FI@c5}?_MsN=so>O$#J%Nc-nIx*H zyyhm=dwQJ_fXOF{V$?Y9dOXF&92eQuN?zyyt840@W%#mn%}NYUApI z3C!L|22XU`$Aoxlq=Wp%bl{s{?E;tiW(K_O#tGcl;5LcmU=YY|;u>5Z}zqK6slvL1FU z1JhPl$V8#8M0HE3Jw?8C8z4#NN|+Q!qkF^4_M|8mgwu`^=Yj4wMTt>DoEW9F6N@ly zqJlKaF$v9bOiHsHo67?#3klw{0V0XXpeLxX3n~mlYpNd-No3>um0_STkpc8= z{~9dDsvAGV1z8h}PNp9(IRJNCxa}zMY;@LSoNTtcz73pXqFljV_Is@ge z?V~&>LTi|$gA16tqDJqe)e7;ucdE5?2!r#oZHfa%c*97S>#Z>}3795i(y1}MphYarOO^ne- z4IV^m@L;GOA6J!s@4;|ebsh|x)gg1;tAf4=E2@Bl>hN)yhlxyKXq6`a4^-@0dS6P` zNb?}n2t(C%gT|1em%a4f#`xXrJ{eCgJ!S;}4tc~FyGG2`21|~@!{(6%O3^!vK z+SqepFi%-p6Vw?Th6rBNjd=gtyTr0okK>38Hz9yu9jW~b2@G`S6ZktkOU%$EG}~VJ zn9S&Ob#FMCnHPN~GpyS&O%eUR#;W=yWj3C+E=6W%i)8BZr9Dn%uqn zlaq&F1+$YWe0Yta_a5BA4QF9@qc=_XR6TlU^FaUUEi3!IRuPkj9N$hu@AaMnTDm1d zf{;2g1>qA!BJ7{`L}1d6GF6#lo(e==Y1d3FJdr~STtL*}cZZ=KOcKdDT84m--!b^S z4!-4uF3SGE%K(?8%ui8Kjcv-ymr9ilXBDu(ePnqni9=>Fv-!eM9mLR5MY9xcLDb0OK~$7352Av73CN0{B=aC4WelBoI80;# z0OPy>=!jwhf-LlKnGZokY5~AF4)3f0AUs2(;@1K-mZQ1*-Gn5)N}&+HQUKr;HXjF1vH1YJ$L0g@4x104m)U%X zFDiPNO{A-b+Qc`##U?(nnc{t`x7xh)AOpSNCerB{H}MHp@RnN$ST`WvF(HM7*HJ<= zImRK6uK)m0#8n@ssQ@Y)hYJ*0^|KcO!oh$9z`hM9U?xhC0NL1Z0%pR+36QGdOWAJr zIV+J1FihP(0293r(DC>L@Dc6;FQ#K!n1KSX2+4{!aF7V#6b9*Vtpg(BimQBQOS|^f zTU=iJWKp8b(*h>v{K7uJOspx2xV_{I2@7r5*})rO0>?cRCV+fKkV_C?^-PzulhvnN z)bJr91r#`RVu_yn5+GueqD%N2@@)U!r`ls*_=ioawxg4;Q(_2e^L|xetJ(-$-T!XfxIuF0#A|qQzStu zv}F-X!nw4zq!ZzJ-}WImty_b~eF#kT(l7qFLqkD= zBd*UmVhR5A`dYrsL>TBZ7kCkFiZHg%5ej%T>+9WqN<6x)=`DtOeyx}8LxMIQ08&|D zO$Tr8X!6Zhdnf@ljwcWlT^5mbwQGWM%;DQpoM2UrQGm;!mcF4AfNYdgSI)OB)7=To18|YyeeO{aB^Qi}n?4#na{6 z>H?LDX(AjW)O@v24sqQ;xFa)B-^??{DEQsHXESjY7`|RXngIs_0>S!O7$CE#8d84; zHW$^OW05(f zkYcXT#nq&sLpll~7EGB1+&&U7U^=`bd+-F@qk$bD`0$M0SBKNpooQr07ALW>7&74W@B?IP$AboSI>|HH^%3a81+K@!P z-3`g^S+5|YK4BQhhX*j7X64DU&J{?m4`3i4;%%Za=jGSoI5Se3K$s{^psav?Kh|edoy&cC ztz(-qc_8U;-o_ilN?7D=$l+TOi|3J79S1ynpsnHCDLIsP=u5o|ln5k!OZ#!I_?x<<5& zsQFt1Rb%_v$q;By8yN5Th z3yu+*SBFbt#xQv?vNjxDQNd!FbE$2scnUoWEQ+;NQttqZ1Y1IwU@`jRTDtWtJlLSJ zgaWwDZ(awE6&^{mc;>-gfoId8-uz@^EKxj6Ad)SgwBs6si$^SD$>KHQX!6KDNi32n z?jkpt0E)MT1=N3FSR|mX?nPk%cNJ<(rM%zA1?w3^AVyNDvq`nFwB2jKf`DxX{f?(d zvWU$ji-lgNp7RuFHqE^ODpD=c*z&`oZcL2ULkhw@(%}f=VOGI~g`4oUgc3_vf!KmX zR|Ox*!dr;i^cJF2jD0+|m6>2s@5?vqet-QEZW5 z<>#Kk7OAEH(8Pu=kBSx}=&}|b?~^V$+9yp()HiiO26TqK4(;Tzpeddw$A}Stb*BuV zC*<*D-VOd~g|(OuQbBzwzF$aGCGe>!cHY9{F<$GLfoa5^(iT$WP#WUhY>|d3kpfJ` z6X8h`t}}tf4k_V+^V2*xoS$T!d9lEN%5#N)6cvU&n|?AtIoCF1J@P=z>T)o@$?c6$ z{&U@a(NJ*QC}t!-h1U<-O!Sk4^G+mak62?6SLP-;mPKAB&RK&+g-j9{EM0BFRtJq1TvK=v}VJlWTlJ$$#XEnoBTzP6l^7yR0?2G973Z2H~d_!#FNC62y_ z+$7UB>Oqy16NCE>kJyg5Irn7;Mme78Y&=dhZ8k@xrN8q#eT+``PXyDPqzAHS8Wc7> zYtBgRGsq2kJPNS7m0VS?g03F_aY85ozWcKCWgsR_;;Mt2%SAmF-^6fxdtf z(ikMk^NG`?!O{*D$xX)E5mnQV6$^248OGrSs>2noD?UOHL#mRWN{)M^B2z3?sRkT_{4B=bM;Lhd=uW1f@R@A58e+UBM)$Ov+w~U(D8DNkVOCO&0pcXa!@4$6Ga)2D@#GV!W6_SjUl!;6a$i4W=ekAhJqu~dyG;yNGJoGs}ksbCT7D{X&zNvG?%epJu{+b|9RR7Y~qQ1TFSND>x_ z2BVXm<2)v9`5;K@3>N^#FO7|>v*3j4gcIQgVVAN;fC$teZPLY0mM0)?>) zlFkVg?|7K@nNAdhBMvp;klDHlz*vWn1B>RS(`tUR(yt1kTt!NFn$ONyFhjClx#bWs zSHs*<69)rtVK#u8kDa~1N|7D?>UItP8Di4*xq7nkWX{(Bbe&ysnlMGCxPrpyBO>;4 zRwJW+|3v1aHp7Ifo+zV*%;Srb!L!p#ZakB~Uq>~G0l}iM{4fygng%ekyD&~+*Px

##t(QP$;Y2iH5aDJX$$+7S$dYq4hZ`M4ns|7(kwAv1o*lsmk;@#Nk{N)f^NEg-hr{3=k4deocfY7xF^sIj}tL|_mLSOIJ_e~x(HL}pVOR)FZF6x?p|DSAKJr;4G+0zQQY)a-|%dkD$REl8DV zzf=aUzJ(D5Cl%;`I^RGL8d;1^a2^_7eTec99pfr5z~}^ohOQ!f4hAM10U8we03e#P z6Mf@Ps~J`86tQEdhgg0&pPl*?qf6^e&|XD?hVBeqtmgz^7*&)OEV=?HO|Nu#Uy?I9 zs9Mca2@WK8DRntxa$=}WHX6b)<}~1HnhA*uKG5wn9|Yu#(7Z*pywz~cFg1&h2bUIN z|6+TGvABY3dM1QS>V}PpmjZ=UcN~O6)wxuB! z{}zTSuC=Sn!VuU4XXWfCcV(DOD>#xYRCo(5jG9Au<18G7NMDASjaE?>vyQ`;0}%I?;q{T1>_4 zSm{kHQXH-)nQyGsoY69;_9UGt?86<$Tsm{&#wZC5=xTR%0M$Fn426`NLoFDE;iINJ zF|`S(HxV9;$JISiF()#Zve^G@3QT1=JCoh{c<}VulVb^aaWJ6Qn=w=Jq7X<7A*(Wk z!H&2OvI!TEM#NffMTR_0Y?hh<9#`ltO|ZUf(Vi6G8G|oiCbr(xTu~b|UhEDy=4nOK z#wvsZDqzH?Gl1;4;g`^Ofz3+MgsU-L#j+e4{{qV*lE9~|x$Ta99BZ^i&}dZ@MUw8N zfF2}()pM{03-WLuic(g$x}z!1jW8Zgu8;es(lEtMP)|%+`r!l*#?5CdYIB=)&J(;I zdySA=v?PRaX4Bn@r!5C}V7p)=5nAktIxq-&9@KDcTtT>Iw88>SdCJVpN-xIHJ#gNk zd)9w4dNsXK+>yn_uTFr?t(X_1*UH6)DnwT&Cntn2wiFsLnLHkVwOAG_K~p5IeEb zjZ#yKvr3gG=m|b8Rg4N@crq`OBR}~*AjVq0l*f=_OI%zkY2;W!jFJ6og=bLtMqvN2+c#h#OB_Gdk2g_wWp7Jzti@-P4 zL`7vkSlrN@7MmmLm zvZ}}R3>zg_)Zq-m5;mNPL$^sNWW&I#$I(+R5L$@>E+-(Ens8}ZC`pyqe3@c47r@*n zwSyt}te?b&$)1&YGqX(c*c02pDg+p&BcNx4!{k04P;rw|R^eMR!);F$O6$?s#6Y9e>&3Wwgjg>3G*ltL_4ZB? zBBpnz5R<%ddZIXaQ;pX&PAE3=hTTnMUtuiXK09onuvz3W#5{~cY}MYVSUQ)Z<;z6* zv&i9mys1ucN_mwz!GPQ_r7Oy#LZiom9z}2 zpcJZXpkyPYkZu?x8KpFEn|)@x7)o$jEfaq*++KJqAz|Wdr?O4Xp_!8?Vl&L^c~)b! zu2GC`#nHC$=o>$Y9QsIh&fYAsji%F9)TZ&2gkmP>#EJ#hkg*)Hib@oRXG>}J-rv?* zF{DqHAZ^vASV`LoGQy_wzKK#WD8fwKENp|2DzPB{R$&GCx5_EVpDH3Po~;dT$m{&c z?Cbo=>}NHXu&FmUR>Z1K?1(Mq_2%LNLsuKvSvZO81tpoG7uca;o>jUt&CB?3_}la_ zsKD0jfq9?EUTC5cnzi#cOD071jmA7&X*q7O^~(u6leCz|wpIvbLiNhUiQD{JS!VHX zwE7ci@G@iTz|>eLY$fj-?PhJ4(JWB{3G(&vbk|6!U=%UC!2FUnuYVj@%OTsAqVZD} zi5m&zmhFhKwr}#uxV(n*qx-ee*)p~bb~?}6e(WHyCWY+MF}A-fsE$|wLF}@6>t2A%zQpM-Q&l=>P|uT=3Jz&G?6>x><-?~J+9{QiU-qbSi z`Z=FoeNkOxNg%530wobWz^){M&c;U#SAO5Jy3I=4fRj^9VqTUBMTgUe+mtw4UBm%% zjJ-u!qBx1{sdmVem}-$co^&Hd6$8tGncml?L;thkV7;VwINP7{&A$IZCqYBZa5pg|3(&k}4u_Rv-lCX!iu zAmM7y*5eCpWvUxeovKa|n6uc*M(YUtx~g71SDvUb9Q9+bUK!QxmYh%Byb$uFpk(%4o)a66Jn&>E!J!f za8Mr4#qcetw1z?_*sw@$bP)hxH{RpU?k1bPf!2=>z457c6S5FUKC&BrlX2YuOasw| z9oPud4!3Q}Y$EB-MzcBvHkqLNWFtq${?z(z9{n?^w2l8oWLhoyRvDU^qoBB~cGfa$ z&N-O{M`xW}8VG~kL33!@$}CaNHrZW7i!PuMOnx00%C8MiSH%@cnLl&uvuy?~qu07A z*xH|tn34RBs1dUp1EE|p>(;t6+FGf6G33`jy&9V=kW^8$*&x|Ey~!9!WyYB!y7&y~ zHE`4Ai000-PJrN9HEE{PQN5_}z6*|APi9!*EEe^G?{pO`cOtY>twx3V7{}e{{g>)B zUDhgD{3tT?Khar;p1O;BNKZ*;NF_q23w{ofT?4B2{jH6esQ58z z$?D62s$OOTa}*3k4)f8YdvpO%ym~tHYXh5vV^ZbmQpc4PAlm z!cE6^>DVTjyrVVkSe#q3#7&(5+y(C8i|Wchv3t0n-C9~~Oy_HLB};e{(&n~+{CG?; zbFq{43eh7LIY_daxX_lj9Kg9ixe<6~QC%X;DC>#}fYpf| zyn;2p-AT>h*+qz53hBu1&z%rO9}BL~?Ud|}h)w4!+N&}5nRZ9@lgBS$z+EG*_HJmZ zJFFK7cCiRSe=ii3pfCF!=j3p zvJ+CI(4#Rw_=X1|chi?OQ3L|p&2VGrsR44A)jl81tDRO^$9UT%k9b~nm*jTX$jW-9 zw>mX{u*kAca5z-Nz7Gj@Gun?3L}xMD>9l_|LMVa>4c;7=X*UCe+gaX8Lt}+j!{(tV zu1m8DqPU`TiAFh%-f1bKbhuqd)7kQ!6^A2zGsLA8CBDO==LVCb9J$PTtd-X&X*9_yr3_k*s`Rj69Sk@Z`Rl&nU3|yS)@XPmJ*7HrML|Wq>$z~ z=s>usKqO$YeGnIh4`V(=n7i3qihM^;s={?vBp_3hW`Tv|rrW(0MREb%&Hjoas@1G@ zon1n2s|Tcj=yqR4C!#xQ_%^Rxx_e$TqUQTHYDGGk;QuI)V3G%wElnK=5wn?>2 zuqnQkLJ@58u9S;l6V+l7G^I&n^^*#5O|NS5nUL_8J0{;U73{E-B2wF&PX*er)%{dV zv)OP(b(TKW9g-a3O=@F{@0P53e6-DvQXoy^-fD4|b)eYlFzZ0G&1F_ja)Z;X1JStK zteoKP8+>P48T!q9M_f^rLz12=u7u)NXIv4{1b18k-OUcU0)oP$W5=YeF1a0+Bg)_4 zl-p5(X>Pfl6_((b+fiBX#5E_H#;V4S1_qEeH!bNX+^(oLHjv3&Bga+I>>uMQdh7>} zapSR#YREg0%b}UuhkW3IjKquTOKY5S@W!f+wA}5aj)Yo{leE@KZ@BWY;ceS0X;ilD z_@_}Rm59HDde+Ys2sbeG_U+NS+f;>UxHSy%5FZ*^CDGrkY@Mk&;dUmKU$-`u%Vou* zBb2TaopQ-E6)%^OxayTq@s%$=q#%UxV!C=e^v_As$w@cn;lqr7mpDH;ho2V5d+33@ zUD8yeX-AU5fyB$j^ahdNt%JK0y8-P1F4^LNHVxf6W+uuxC^wO z>$ML4DFkV|I6AsK9E~xvwqD;EbRxcMmQ@F8b#<2Vs)xjuu|HJ+T9*dn`o8jGLwA-! zFkC(BbKoPPw!7ioQ;>H|UBww{e{3qbEd$x`=*q-*Eq5OA-m&akC%oM@ar>0F+j8ES z7PU=vyJf#^9@=dwhj^*`9jjGzvfE89aG3GkjCVfO)+^_^LxoSa^^#XNvfU>sJ+S%Q z?rKPLR>iL7f6cBVT(HJaHzZ-GbY1=gbkzL5F$~hCwvG|&P&YHjZi=3l!j8X^Bqp_{ zbl}aX96x*AozQka!3N_>$(_trPa8U@Yn)(7j|wSy3YI^pM#=54qKdtuaW2YP(a;v9 z)JgVUN7{w7Jc6BAYweplHb=L%*halu`)s4$O)$LPJ~IPMhrXi6Dlx=F-A-rKWI7rS z?yG8iiyJ`o4PL*d<5V8x%hf`>aMFnm9mucOD;#ag;EtLoS^`M}!4kaYkB{AL?cd)p z;C7_shTM*XwnffLuA3&*HdSWPiOd2WtGUHiO6IQB&Pb-vO+Yl>ZJ(362#ZPxW~H47 zFG9DwDB9+`t^(lErDJ1Ljm`$=(KDtiQSQGwSXijj;)N@mLo;3-n19Ax%|3NbL`f1X#1t0Kh9#c007`4~(% zMfexhta=3}6t1goaz1V5e)G1@X59X&x}$TiZD$C#V;|v-jrtC*@%w7A!YQHXRJWZ> z5h6k%kMWvNTbF4oweMPei=~-Bp|EgIbK-qxOW{r3DI$}$eY}Mit46JTIF&%5IEjI7 zZAlb-UEVdl4pl2e)%~MeMQkTa>)Amt6LDoDNHM!(dXCHnddYkP{FTvTG}=t*zc!fkOS>Ss77{ z*nMdcohVehpxuzRb@EghwoZYl(oZK?k5r0JVPJLJH>kU^-{u-42O_n0VkN_ruS1^HC1cIwLD3Xw(Jo+SXu>qs6Kaz ztt$@3SxO;uJ`~LBkV+R-&g|U8&zcLG=mqsYt16s=yUBSEMwUC8BSgr;TEE$iZik`* z%<1f^ep6s9c>F6O=QZNCWEg!-3P+0yConm3BX84}v;}%Ns#Lnlk8p)Y8E>kI+afHL zGP4B7`513Ub*))>Cz0~$z{Ti(bT!2p-%c%#v-mYdUV3YssO1bfC&I!#H@i@U-Bi+gB6kvJNG_eqxe&~f1?FNu^6^^!(GJq}iQ ze&m+kDoD11xY_#ZpRJ}xqCwQ4S;UPs8A9_T-A^GIX(iWv%?ZrwSQP3fqV6?}#m5E}Nz`-fU6usA-85dxsst zquY8}&9?;^Xl&kiElqS)YY)~}*y{H0f)`40$J(RF?M!hprB7%4XBawhL2czEpKVNO znfLi$N2ob^Bu+Ei2qq7zZG_|qQp8hS3vy?1pS?KE!n$r7nTl#1@ABT*v_raXblM@& z4&v0V7J6mi@pMvM-cFZd_~}l#1BI=FXR!p8QZ|QA5<+AO-E}b?M6&bVqzE=g>f$PA z*KONqoi?G-3zO=m&vmsJ4&1w<{I@*@mO7KPlKadWk3K;~UMAPGl~iA`X<18Or>0U& zx3W_y?x4~_fCVkf??Z_3snDMCE4&)bC!>XWr4-)UyHWZcr%#8}ZbExzI3)|pP{3h5`5`K5tE zp=cVYo4PKH)z6N}m5YfVh%UlMOym2j8e?_YOr+lz5?#14e=!<#0yrrv9=?^wg>e7TWXuc8aAkY^PW#!U(|~^45W=m~m31 z$yCF}CP7z99V%u<3~Qnk^I|ADBc+@aPvm4*r0>v5-5Dxn7uHUfJ|oCV^fnS)#`P~F8(8ZZ4s~ZWT9eqxo9@Ke z(=}Kx@2h!A1of?wV}ew}yK=!%Gd`Q&vyN@P>D9&%zf1Z`M+_@dPom)zeHSzebeno? zS0;QK1xy^Sui=~5Y}l4DdK@=G+FGU`AAT~4IFWb*kRA|QO`2AwHq&dJEeh$iP925x z+UAj5ay#RzGedSN*s{(}uAwDZ%35r8DN|aW5OBbuIlpuv7@1)@lk?}8QgRz+nQkPT z^Gqha*i2KZaWPui$`+lsteIC(J2$W;x;R>URCGGjtmO|Jo2V5@%~g~pxULNGB$+91 zf1dT_on0rNSP?&)r|qcuDctM4C#h`L@k#`v(~yhmu70)M#!Dx7j@@~BL8?ts36%P+ zyv18GgQVfERj~?awJZTPP@2x?dO0y(Z8k^~iS#E+b&AB;a+yl;>3RK{-mbz;)z!mk zHN)OcCWVLVnL6(W0!P>z+HCE&S4#7McMg{b9hA+5M&Ej8HnVb)Y%xz$JhpZ{9U}np zQ@kRzD5YZ##Fte;DM^0V4lRJ?Q2(LGbZlepiKSvVzpdxR`a!1+XQ!j}e0)oK3w4Zn zt;-~=Xdlh$Wx_*dTl;|`Rw|-13UdW@S*FM94%=CeP4@m|nMg`UIL(cT7hX0n86st2 z&O(8h=u3d>cm9^8%|oQxqAr!mIVU<=qhhKz9H_ew6d}I2THjh8 zpzhS<#0H%t%ZOJWO6Ad_Uf-8Cuwve>Ldu%7lK|9ptWxe_w-%4D5aS$fWgNt-7O$pb zI*3PMOG;U39*r#%rl#Yz-MWym7kRr7={A{jeTt>p-Ap4(@3@+c-Xh`={F|qBPL!6g zuVsa236T%x^O~PDRkmNLOdOdmW2vK3%*SN1z|qxG^lZF?o0~;-gC4KtYG>@+^;Z8p zvb5Ra_h_FJqSW%&l|GqpsgzyC#$u_wer>C!Y@T$x>2*`V;?^v=?aHf^g{^C^PJ~-M z_#2c+%SJKQK{9$^DP})d|8?OcAXU&Kv`ozWQ(CFUa(x}af*e$!I9I2W`~|ag6b&e4#EvxNuB3V>r*NfXT+=2xpzcpmdniZ zRh8CKd#g&(eScLaD&>OEKC9Bw*=tpbjo~2fw<;#c;h;sVk&cv{@2VRi?Y-(SMzHhA zdcnG}({&wUJYmILIA2&7kvJ;l9iYXhR$8;Xz*h|;(7Cd@E}sKR zlRF|EDrB5}r8VhbD0HZLL4{k~j3rF8kZSRKKI;$ZiVRzz6pEWa@tp4YqQa3_dNXR7 zjQgxl#9T0==ng=$$Y%&+w4$dU(o4c&s4w#Qd~G}@^Vpx?uUE8v?1G4iStyZXOC-5i zu^J>9nQ$O9uCzaM-xO6yX1bbHc$&48jlt_Fw!&M_Tx>0WfM8Z=x6RAc%IYP7LWfT++p^MRciJ4B1#QAmJOs@lDc5F{>xquZjy6ZaSbe_$Wa++u}rE>A? zpi;CiK3;aI3{&V(37$VYE1jK(OI1bT)%Tqlp?%xscu`gJ&ZMHoL5IeQ(kpMeoCz%G z106bIhx+GKwZ%e8*RHsY6t%8}aQH<2A?~N&;C$J9qTchCuM6sfO8Sw(7K?8a!OMEI zTuF+L;SjDDCXVn93G<1;4g{xnRXO(H?Q&J!b;U=Q!G-0FV}hdT$Ss0UbEng*#R&4H zb)PZ)Gnp=T7bMcR(M#C9evGq@&UNZ1l1^XFxec9oB$j57mp^)G{FYxLz&q z>(#Dw<*Y`q_UdqfQ;=7PMTQrdG3fHs*JLGB#$!H34E#mGpdQj6O{Vp`AdDk?*!g|= zE=V6&bR1Zp3f@hdo>h}6-K?ijpYYL?Yup(w-eT|`!4+6e#B7uMqct)q%oj zg;#mi!E4Cn6#_~xG_kzfVPckh)Jn2IkBJ!i0-iQSI1_Y{>3BDqptcUxHpOn}v9i9P zTQpXJ1=VFT82HOuRCb$AI?jaPOI}|?`s+otqk)y_x@ofOP^axEKd`$ zPYxz{=XHgsMr1;C?rv>_&(~M8>9SK#b_3!I6>({qe51u-4&9%ZqvcC!BxGGSa%478 zENK_JDkb(Xf8b)ka=C5mXp_=7PKlyBz>vL4_6arPTXwGP;d(m5WZ8+%$s0tGqLsqt z4ZBSOLs|_}gnGjc$1PE!9!|^0fhMg2nSqG1mB(;ZXpW4zl5>I3X~i%?v4pSLXmKZM z*r6fy`hB35y>=3dyO(5%*fyJqZawVNvQbV7JinU7bM8?#A+mm&r)Z}okXys9q&rb| zzM~zHX>%TKY#h%C)rAp{PzP3E^sqmxJ2RG489UpZV_W>^n+3m}d>Pwu?^{8?9klu1 zIewz~`qsJ1u_yEK*b9`1@xQ6mQq zJ~?IT>9-4e+o|t@>CIlrf(CE%kd=^X_{h4*Gv;wCU@Gvrb>S!=Rn(jf2VOyy+Wl=^ z=F4`f#xb~4R?DQ9;vCdX+`3D=(P~I?KXy@~qypX{??rOo;yf)-4E70z{+wb$(t%n` zgx%uOg<4E%ixahr0wsEBi&=+JueUQjKW&$xWs3v2fK@O_Tj_xdxQkfh6pMNbk=p21 zE~#*$W4RmYh)Gl?ffiS=bt;vx*+R33!8Ske4hEz)(oGk0fe@T?#yFX~^h-yri~C7X z34GR?x3bx6E7`J!_dM7Q2YZ(hq@CfstCx<>u&e9o@fljX5S^j51F^YHl+MzMZKHH1sy9-0(E^&(F8YEdwTrg2J4KyE z)lnP5?WWz#6)r~em!In)xT#J&{@Ura~_O{LMt#ne$7khE7yU>lo1QH*B z)%%q;mP~Y?J()}a@61N@#5s4^t~87By`9I7yks%)5C?9O?tc0TsoM5eq?aU4v5T%_u&ulw6`kDOCLsKc`^HeGcBk+1q-(DyXSM+#5l5N}^U5{{WGi_{?m~?re1n+RF z9%d^+O~p}hNhPnk%(jz$4gF9A4kn{}Ov+v>s|N#CZ)clgB*=o7!&Xv{r}I@ZLx-cu zP3~wQaLR^*CV|ujP?%B&ObjOvSDYw{KAenP( znrBTY4l9FKi=^edZEGW9fFp)pDf(L1Wh?0b-O_!o&W9&=@SYkWg2S4C53 zw$zozs^MqvX2aw9j{c=?mzWh>{rZYNZGJm^Q?h{;y;$W{)hh4}Oy}~ddoU>8e z<82`dJzZs@?4pyth^lIJucAZ!4;}z6|pAAbPkL=v& zZQa)+-nacD-q#zMTY5+$Ht9Q#w@wkM^vmr7OruanqaC8UbySKXaevHUE?H=P_f0Ip z@4$&jjV_#uXF73W{zx}Y#*`g76KTuD&}ddOYV@DBS{)m3lH1o5<3^gydL@@+N1Ma~ za2%SWl2A3%OQGC$lu9g0j8iEX-bj^*V8*KGoT)Aa4Ue$bgD4<~hCQheOK4GzDAv{W z^k&U*i&{oS9~rm5R<%OYudQmTTVox^$S^~hsQhr)Xl5s4W~qplVoKLQi3P**H5Q2q zeq15y;}rX2t@Dvzr#50qa+Syk1b{cHm+M*Eyxd;y7PF=u@qDyiR)vN3=Lo1rQ<1V- zidlFFJ7%dbyNkW71dW!$Yj|!m@%eJY$(!+Py~NHaEe8sSz!{TAbBF0;uP6jlR$~9xDYWpkOBW5*n3#45Q6B_)!SSpNfm%SoJa?OrrV zLk^Z!c%(aFj+W?bysB~Jakb$Y@c(c~3{CZ0$WHw#hQs!X8G zx#drfY?rgx0>4n)2Nj?*ujEi__Y7qaYWj1MkdwVbNz_yowJg=(-s&IfL@u#`BHZYq zHM?}_Vk$sZkIWQsZAOe%mvf*~vc?9tpjgkjm0jJqd+UP&KH`*G4=-;JMx0XX!OUz* ztp|p(DU~#JymkcwZ*eJRt3bo4m`x$it(Z-|L>o)=u0+F1bg4vZ67^$~do@Y!f`FbH zvPxDx$hv4!g~NsVxT!*l;U=;icrm4OH%V3jzP4S-jL`<9 z?UL0HuU?N9)!}q?N2h0!`1Pph?Gbi4r|M%ng%TE$aXiO$ zo(g&kmNpM|qVy7c*d>$_#ej8=7QdE2YNIs}iwcC}JgIV`H0?T1ovoUfsdH8nGj(uo zViri%ZV_Y)NWK1&I+{9O?Htsy0?*`w$%&1EO#D=LNiNx7vmh6JG{=i?i@f2&$+&Ib zAd`ztI|rGhqI(DViXJ7Cuk}$f*<(aHg7si++|5W8sihX~XJiwI_>a5L(5~Y`5*^0_ zD;2Jk@j(|dm)vyFIfT<}A5gFt-zyQW=SE8>Oj~Mm1}5wVRX7 zdknc{zY1rk*EqNHcIdyvI($)G(a(o&Jdm123A*^Q{iehwQvFu0;)2bi#eC`IMXS6! z&}?Z2-;b}R;3c07S1AgB>wtHov@^(Y0y$-$;kfg3P_GwbK7Fky+B4oepp<-0NY^FG z(7|Fs4{PTg1vLce@mlpaS2KA(xdngI6N1s^buG&bJgN|Jy}rkLjJVmBeB8W+8|?|4 zB_7CYp_0|kR-R>QBG9vS!{X-m5!VV`lnKg%H|VR0qn0DOrnG65fI2J`*3}I zP4A+c&X6{@X?@{C3J%$D9v_NTK6~$_g+yNY(NRI@Uk)QJv`86SXM%W@Hc;9@^_qH` zRZH8_a@gxaK@EIa9y!zWPI2@IxTx2O`yQ<%nuBPUy18LAR|NtwJ3^Tn5YQ>bF6|Sx zcwW&LOCiT0&}`e1am6WDw+<5<+H+JY7@JF~5|GGjgaA8FgPPOBh6B-js$x0(d|ltU z^FfISx`%9>yG#KuZgJJ%a5SS+c{zCM&=?bO9TIjIgEFiy!$_21QWY-i#rQUd_rVw! z9?o#nJO_!M;Hc-zr`Jkjam+Ly+2JPD>w-oM+y>1$)M~`pJhaI7{gO(ivxei*tbd0c zB1}hDQ*#9}r_K;CLgnhS0|{oh;arV2{Gp4((p~Yenr^xM)lMR*+M?v7{NlWfz0a5- zWr3a}S6qp?A5GxhO^K$hsx&lm=`ZWSeN|0zihDd+sIHlVqfVz~4O@JkEkk$@XQO3S zr$2dfUoUY>{CqL3$xV}8DMKJf5Dw?=9uL8)Ys5MD$K?Y6URN2x^PqN_E~+_9Z{4SE zNAsK1g}zZ7NlZJ^I#4?r&1N}LP<7z)cu-ktUw2Y3ZD7l=PHFxQBZda4Tn2QlxA_um zd7j%dqjwy5h0Ya9n};AZG_;7 zSF=h{31-vOWrrf9T*r;MDwPc%JJ)~X81N^StkM~^L($%3lUKAtEic;59V$jw(kj!* z%wb1no~(LADea(Ix=$o~v6qMf|0$x-z9HxZ(OhpmHp9sy1QwHhn!)Mws z94w~u<<^U0X0TID+uz!=Q$`sk<@e5$u7Bx% zUW^~<>ARrSMYgtbU5L2;o;aBc1$DS-lXnwUjuyq`OCmXpY#nsc8#o+xvg~OVOGqM1 z93gVcfO%fwjGPKfIvm`?S3a7Vf7QyPo{tu9)zJ0yT5Q5c2l0)hZmP~yPHVjRRWHu# zB_f1^vDqa;?!H81$>VB7kN1N6`OP-xayyfnJi_aa=oOV+v70S-#YcN^y!Hxk)ZQ1P z71(c^AGcxiv!Yv%ByJ;vh#-r$u!h@kFRHsb;Z)={G6$2%_8pgPM6w&tnJI&}h>CQV zP2dnA@hDpA^LmCj{MqOS^D(0Mp<~RKbS{qX8x~S2YeeSYV)Qx`#lhr@>y$uI?QO!O zyH%=fHi(qk*8}3FfiONFY$nzm3b#0Ua>*6cQ4fCQjN}f^*@D|TJeN`|m6jT!vkMId z=|cSGFkMJU_3`pn=i2CjqL78=cwb0pi-onJ7jZSh8KaPm0(}aH$^sJpyiwkwKAi$a zqBBrAKTNJv!wmMu2r(NJgYnZQvut%?;%Qe1xANG!HrR@}-8yh2E~j@mg*Uppe_YM( zQ;f_AYJyJnBWPS=x+2ABv{aS%GSvU|Axa#2WI9srk~f#^>V zRU^7^ikGjT7j%3nAI+Qv#rczbWK-wC`f7z&pbEG)6m-qASWpKb1p%np)-#A<(>;Fh z!TW_$CkMu8irCy8Sx|dWF&gn2jAJ#nNiggpMT-k1-l`CL6uVbpH$2xURxm-|s zxY&i9d{UjnUG z8=$9a6dK~3%^Oi+H<*e+sfiqN1SRtj89myVR0LYsT}C;y__Uh2;Wuo4DUSC}&gd?ER9M06L<-(s=GhXL&?poZUu{l9P#Vuy zE;qcnEM!8Z2&9Bk$ncYl4PH;N-Nle)=CwW5UlljoC_>!TVlkTSh`|yvE4;S>KZLGg z7lwRF9eBwY&YDt&4{3&BG3%aXOM^*LT?8ZPl!!&+)3vXxk)a`+qglPICR#WJoG^Zu z=E*BmRUEeBir?FIR%00%^7y>n=DBL6-ak6j=n^T#5qOZ8k-szrP)8+tXd9Yv~oEF zHoGGPpJ4^J>`03djq4fWXB3>iMo+AHbcMYg*R6lu8aoGzR@qw|H!N^h5HHMg3bE5a zj)P|wCQ(zG$FZp}+x!99+-H?-d;%GzuvZ`hK@C)i`MqU5%*9vqYG!hcJnV*Fp@fBu ze%kadXv3|f+;rXZ>YO4e;nCR6*#IlcSv9C;umIGcqy}7G!zW-{|Ag-m$-%Uq4doL_ zl1s#|p&cqk1*Zr#@QTm^V(Wzx9<2h*qzVQ&sSK)dMtWhki=*L(NkAb_j8c;%zOwx` zi5y6yJmw2>{(v13EUT^WbLqyEPpcC@VtrO39_cXgO!2P7x(P_KRVE%yq2b9Xs8`0+ zqDEe+(19PQp!9|(sDQ?n6CHYd3p@ChlLjqVY2#v8R&FD!=FJ(rMS%)8?(52vts<1k zxm!Br3d&)o7b#8MjOLVR8Ei_l0v;odywvtkC2w`*Wl>AE3AxWJ4r1=S?9ro@Ql>~V zI=w0~S3hzUBbj|HL-J>}#I=iRtkAWYUXu_rxlV+bwm$M*oEbx$k7zuq+jTzEN18y8 z;$J4VN9gY~e$wrwgqYS-x*Zi=vc*?gge$$JMFdi`$nl(MrfHvPl8#&d>h@}Q9@Y#k zm9EyrQrOv=kXg7}x94`QPw&J}4q~BK(v_Uj@KLvG#-tL(Ptt}c=0-m;TfXo_3=bx7 zedA>e`-hk%&u62zSGe|zS7sNv+jnUt9M`YsvwAd9db#8U{)Tf+c|^^~xj}H4v#iw%*=c*PY4XK_ zP)B+p59@LVBZY}D6mNefb(%L#2Zkmx2%ZQDKJ0!~^;+8oj zlT|ay?v%}NoZU6cA^n{wn`u0IV8M;#I}}bZmhV@y} zc4)C`=(WnntJS^wANJJdOLK{Yo=j}N6yf2aB3L_-BcqzPofQiaaK1YO0ki5oUSq*& zxaAT~nv}}uX(t0iJwA4i!_IVBNx2l#Yh-aVDus>p+j^2x7h>qyVy3Pg@^c=Ef<| zShJah8EAAD+_pj0XVvcyndK=1(RQU2nc5B!bf&C=+lZvq*kYHoPl%jYr0UXJmRWwg z@FRQ^trMZn}`bR`+B*RySHZ%Oy@L zM<|+t;3Nn8$>^?9&02`hql7>%YZc`SxZcr+9d5wi*d;awuTAIDv_XSg^}d z3d-a?A59m6K$&oP8Vg8e)rJ=kN*e_?1tb`|v>Iw*c09!zisRRIHBw zAhR7!sUCCXlGC^3=)tLaF31$OX&b>TN!{XYz6$rex-%4^l*I`}K0cl{;x{^S;OtzwNN_mSf z*@{{wPO7Le;-q$4$2^h87n4PDij&G?C%!T*Vkb_jsM+GAGHVuFF_%>=Myae`F-oP{ z*s_k#nS1pjFkHzON=dE9Lt2G$iqgte07ZnywsIkF@G^9fQ`~RSMOtx+MKasuvglIj zO?10deG}b|Ex(C$2ib}lx4S?EvF=h7#C9S&K`&cgZO))lk+sn)m0BCU4uWeVnJK%7 z->OV#5kh6siV!LmQ-oHgd{X>!(e2Jhv-%1fOkY-;6T>HXQVL-V`Dv=Y^6_6!u?gDZ zBlMAtIiHmITk!zlyjs$exbq5kD0INgw&O2;Ngi_RBUnDpqpH4HjP7p{GON02KQrSa z9j$Tbd_I1gD+*kz9>2^+8o|js87)fjlH`s{q_ZiW$%6z;d$pdd^kvbfbN8P|YdxLg z6>-IBo00~IZCa&!aO=^zJTi&Qm|ABR9-w6wwq=M3Dr(9)d4r>R6u^#Rjg4+n+sU9O z^5}IY(G$0fuK~{<73z|4yFI`PJ7r#(A$FdWL+nJBBSS)_Dz#HcWg!?{@}y=uuNY=D zf!33-L94Y>NbSn)6jDW?M9*x(tsO3vK&#%T5@@j*lox+!E{}1Hd+d;mpo63H1ftQ zTg#S61e&q-3JDGF@gg$J;+bLzBi$D_9;|PZCGj-Ce}q8RxX$uXbf)zl;l zBwQ$tJ{~5f@B`)gK$0LT-E`AX*&g~jE;!<#Kx(*@cQ=|(%)^Vf>+5R@Mc=K5P+fe& z7u9RTZFvWDF{tdGDu(@6(|V0J6m~5K^IrQqpp3!!|EKNC`rFo#d_U9eo|$)VNi?0D zxGg8ScV6_PCEDgh64j)X#Qo`SVIu($OH~1WI47~g`lB`!3We<*P@Bv64hsIO{d2C* z?1yF)C#8Nj!#jAI_UG&NwE^E4io4p?<=j8Cr?xqZ#G<}37!1zWsSsnSh&^Hn16&Zs z6U-x(ZVbDI$5nn73?7R9XLmaBqPU`O+n??3E6hWPNtGNS6@*C1E}55+0-~pn!-Ym* z+1wr6gvH8YBsI=K)C68#gljk#=H_L>*Dx@=4E+TL9C3}H0LNgo?f+!ZL<w-Ppv8 zXaNBgpPF&Nc>PK8k)79Z_)(yAyI35t3?z~nx(A6?1tpJPl|V7HB*xaMfXbv_OlO%m zr4do6P{@-jTt|Dc2f(tvU;uFgZ6GR})_J}o+U5C~fV%+rHz8HQnyDvt}&hLv`AjJp~R030U z0uy(~7kC`k#7XlMDgi)EkryRmGQwh>PeusM^vNL8T%Srg&GxB;#HpYhR)d8CYQtDh z!xjtB<02Li%iuL+B#ZjPlx_vrlD@6rsmOylr@Z;zjc`f9w_`uZmrd<$aCmYaRit3! zGYG3W{qP_EXy4=mKv%~ud2LpZ`tN@==L_tO`_hYrPaZ@O1Ai-L;BQO@*5~$g*Nm{5 z_2F_%-8kiGZhacMbF16~XDLB(eEBZzRitqns7P}PXbo$F%}`>2^{GG0H%XC-C~r_A zFfIN7`}<%;^!RcMt3F#O#h>=DzMUM~k~{cb+016<}_9g23^A z3(F?!*JjuMMt%>KiH77ZHd}}n)P5H2 zJK=FzzdnimA7m;20$=zzbUU7ozBJ=c9;J$0ABScqE^g#vz;oGTiJ?ugqkdGQ1c$tU zWwkz_CSCW<0C#u6U_<6Xzh>Qt3^DdVbKFxDHBaTdkTa#-g<$}?*`Yi0`W6fU{b2lU zeeO@xF~REN3oNn)B?8X`_`%fX7>=$yb#N(L7k!2x?l3$)rI`c^d+>2;7G|+7=6X9A zR(V`Zx%HBbiIh->3>oVbKKod%&A00!8MLEP*0eG=W0%d7MC@89kEHn$x4* z&n*Pt8_Jdf=um}<$CLxGOzDCEL5ouf0og>Nh(Pq(bOD6I4!aZPYZ5p%l2r*D#9Ws^ z8*e7T_VI8rgJ`!f2$qF#O$4VSt15z4l0}1Map6ux1uf{KOWXb^xu8UgxuC=fYgK@7 zMo3m~a1g=z4UTlK;Gk7AlVEiMD|l1c2j7fEgl#BMEyAh8s}~U+)uTpptru!w{ew<| z?h7W(?+3IAW)do2u~HaWq0?MCQdz^Ab;41#H9jAvHb-vQuFjDy0Q$7)8RnR3k#xpo zftRl_Q(2@pY}Xda)K+zoqi&0wp>0*3S{{oFA57chC4kn87 zd}|77jt$jP0A2UiV!*U%stARl?!qw1HB@v}f-JwcE4VA1v z=Fjn(&!I$xBXRF;F-Vqs3Vrxgc`vkWw?AzgL5O)taEv8MD8@5#YvOc-+LsLFfnOc$zobJrdb0d4 z5t+d>WRSaXC{#|ifzUm~qNg5iDYEErN(d05__P|z&e)7`=A=kO zvq#vmdq2R%NANx?s>zugC))fy3SMPllpbR8HiUhq%TlzpgW=D0k1dGqt9S{)d+wnB?TR0cis$myT zxqdrtUx)q(dHq13k`ZCN8=yjpDHZwrstz;i<&6S}X)EEneG%P}DuQH;N;GZYp%PwS zx;<0_sATx>p}f(*NLw;^oQcT|ij&kZ*SYKo2ABf*16(Rd(8)vx#g((D>ZIybzT-{A zcoAjtjQ>1a$n;r~KZ7iy`@+ZzhI{T_;DEZ&DZW{~a(Q(=58cz{+>ZBf19!Iv-1Lo= zFctC{T0mjPkX0}e;liq*bz>2ME)tE%2%&gH1zAQUDuT2JMdvD-PCY&~J#}p@bS`x_ z(WcVM94(z?9S<1{Yf1*YQw*k>g~26*J&F?NfIZodN6w(KBR*b}Q}~5rD|xj}kMlqRMj9q;HeRz?SP zJkDY)CQf{W-!CwhsX+llslw@E#8|LG3aSfglGzv3x#a4x!CbjLB~T9?><*>Uz)AmR zFQPZR;{#dn8YY1)-0T5$g)Nj_P!CSb45YwN*J& zJsQdleVi}t@uF^{Oc%sLbX1>GC49pRPN6svjKd6XdVGFKLCQJ>wh!n#QZJ9y5h&_K8 zF9KT*)xn;?r~+|(ruE8G=n70?}u&e2}R^SmY< z(rB1X5ykw^qw(#963ns~O)QI$!XLwC6my$n_8WDu9J-A8jeXKQ#<2M|MjfdO=!c15 z69sGuhP?(G@wU6XA{=?RW&!Zf{_3}~rgSBq!#%dYVRxK-?!nC1b&bhjahsUO+`Ry5#5~RcK!D)Sq_S6Y90;NmuG22yvoI zTMp|s(|+R5eY2yzsx>#hiaK93_AE3O$B6ZuB}CkX!*L0TU^_7uX!b$Zjj{BSwHd@! zFkT~J7`s0(8Jc=TW<7kVVvnT>h%MCAxv-)*-3v=JbrjvfG9%Yg?g=2+(-PtB2HuW_ z8tz8_ncTyzn)N8un7xLjBRE8vT`EXG+>4c(;X}8N-|(HKP6nnR;}i<0?HtwUAs^QJ zy4_v|#FAZ*>lrKUnuh6>XP}g4`83)@=_0txrD-l|U3&YjeYx~BZ7KF?G_z%5R;KVi zqa{5J0$qD`Z1!(sH*UlaP&5(Ufkt!-H-{%Sy($wsO(}{N2Ip<`tWSV!WwD5gRZgQe zb=o#dG9x0hRYOi`*40rWmYNj(JDlt8r>d9w?QQ$q9pO6p=*C^8We0*!DTjlxgOy8S zyO0!!&Bjs!`HmL&@45XG+q>;Dt%X&&KiZgK%SiP}n6DGY~v$tC44j0d&H==d#C z8nXrD=;7IiKR#OO%O!YzZEOImX?9kn^+_aP5OIaa5iF1J}Z!q6ZA;$bd%#Bhqo9_hSD%LO>Kr&+>+xP|OOQu!lo=KC+ z(&1MfvH#u-ow$SH{{zFMIE&d9Z1*1@y8~=Og;&SRp)>^c z-oiX@T1vGk0Xktq%PA3KTZ5QzX+B;r&(Hf--(RRs2cYj=QyMYvzdyi57exT~JKJ;?bBUJQhsR$ zsD3@Zoube0$G>|M!d%!c;k} zhpBQ+!Ig21=}U=$B`swbB+GD^48w7JOv*E=My2RE5;Y{Lgx?y#a3MkxD=Lf_dWgvL z><^A8)%rvjjwTw+$I}3u6d*PPCyB6wa0bMzVch&0e96a z|79@Z%EC&zxoO~nIdPA8*xgd5U(Funx>0m=VWCAM4GXPM(Amk0^c8pW8nA^j&aPg> z%rCTvFfgc0bo0<2V9TibVRU}_A>TC^A^{;wzC6^yV?#)B z8O2OFxpgYbkKPhmD3wO}-s~?eoP);>2UzZ^DNS6cCN4ZU^oYR<%N-oDhhxUwsX3nO zsL=v^KUS~AT37B=1VaVfj-g%X>q%6}Vx=N1KVQJmP{t9Zm}48u0kB~I4fhZwmn>*N z$i4Io&_dO(j=wr}kxK3UJ0pLF$9drx06TnYFPQ<0Wq$4pA)xBARe55){&X`yF;PaU z#7Y^~Ltr@8mkAY0S~X;Fd8ri<{{c@8vBQiYE*p2H*NE#z%7^ed-O_0)SG6#OeuW$F z|1DjwT*Nx=LJ{U4$Nsk*-A(EStAmYvze}Dj3}=tQZnUx!z-d(H0xa_vE|Q=2Wy%zJ z*?hoQ#*RaR+g75J2Q)$f3o5@WwpTu#W!q12SkWOA;54ZzWNaB-3jwWMww75e$oFK| z4`1~ZQS9JTl3d7>niJAej>?uA*!E_m%>d6d95yIr}%};RStW6i`I+nB9+wxWI=Xfq40&8v+82g&rp1J z%p8X6Gl5x5v0MR6zJQClQ89Z9L_Two`BpKD5!?bsy;>pHU7`z3`ME(s$EC@goI_4& zcCctaUArL`u*C-Cb^m<+4LhH&yYrzrMP{-Ks{8IwyT66S3fQyoOS~0}C6w#t@O(qt zz@1w-4i#sj2C#EXRKDAoJ`4 z;JMb6a|fgG?DrHdHI-r6Tf_sJuCK6Qs6@KkmA9^e$PTV-HuZj*&UOE1HabNQTBFPO zL8C`TkX!l4?El@UKmUIFfBw&AW&Xat49|&M2&Vp=!Z7ze1cRUY$8obh$p3ycCtaY3 zj04{H-+Qj2x=NmP&RpR*=_%mu@jMS&v_o^lyUT&>&VP7@>-G(8nKm5B6Sevfi$ z>;=~Sk`I{02-UtacfS%&KU3Sdt!W+uYGx!J7K$wrMG0{1DRRx^8cx#3HsX2hs2`C| zr9Q?nbUnarU0b*pNb`iG>W;<=Xrb;xZ4&kZR&o(Vdm`C&y<}EpI4{d#TkdLhUoiO z7(9lIH^Upe)buhm2N57(&nMinEDBVE!VX5+d7lW)Kb;!b}pb(}kx_ zW5wWKz+=57A&Vt_V3C-^rbhN;>mv1J7F?VUKq5roj}1IPrIY+29s5 zE>E(FaKw;9oJ(rYtKG+;zntuxxD<;)k0%j>_Hv0F8=eF;Zlyn90hl!E?&78j(d9h? z1|p-Jx@wG%d`cF8P)Q3qV~irO8n+W4d}hZ=9~2Fh#{S`P zLlf2XBp2=k><1_+cj6)VuR{j~H@RdC%XIJ$)-NEYLj3_>2u%a$X6}Ys{`t@=o?t{7 zx<4e+e_llK?+8V55}DXf`uIAu<7>a)xzlze4ov9&bcgQzrW7gW%TT6gDlrVk;{-O0 zpWy!0ug9;?&!Utu+mrN{MO*{xJRlDmCuoBaPZzhTt9z&@wwD~A3ky;?9+ z>W4AF0{u`udcgvDSX>|!_(y@@XpgXG;N;j9AZ9gO>Nz$a8Vj$x05MAlva8q)o5MSfCLjxh zmSn1olikLrq&Ha_H6{+oQNyRC^NzR3)E2stss68RLMJTM?8E_CvpyxAcf4k&w(yNO z>lMr@rn^uU;&D!4Dy)h*a2UhbjX-K!_-e?InBDQNbX638;@{rL&pdScf0APHrMdx z?(6vo=R&{2`vL=8AQ-daqEWb%$zwMY+M);+-xVODE`e!3>KGW}sC!_D@p@m{jI6aK zM8ro`?;JPR@K)2g@6WHBYd8S#0*4=uyUoM%wm%%cUd~VA$N5l>Wluir>i8b0Gn4*c zp4=xI6#rv$hP_h5FSzmxmgnT|< zkaIW6bL;v7|MzR){_?c%##eX&+~h!4qQgaa^C|7&X>Jv{xeIs}n=!VdwMRm*#kRZno#k z&<e@^r}gzHXKyyttwQmC!31SdKs5R zx2n=ityQ+LxxT(CvvOMpT!=kZW>(;?TbQh8Pi|0+dHr^7?;$6EVXnhdpD~| zgk>*BZcdsIyndL1uEDM&NHm0Cg=Njj42*}yL7ux?H+F8 zrPHpvmt(URPgERV&acK}k;C`I!RI@bjnmtQTo6aIw-6CHPBF7K$An6J zaTrntEb&nXfzQIqJit~0!KY<)4<$OQb0|_)*HEM!QJu(K;B*cShY=m)3s{&&iR7sE z05=fy<3|3G<5PdTl7AvOb7;^btg1Wfl@xC=p$LR9$~!#hF07U{;Jk0*NqP0DJzB(( zavGm9C9R5$uE={TLD~X|M(A={vM^VL!ZE^Kke&R=#F$>fM#m0mE;A06wijE`Auz7C z9V|kiPKZ}Wu1G)st3Chjho9!O=FVUl*9Cq+;b1DTTnZ?4!iapcG_w)%nZ0Xl2W$ z4GK?T4unt{JWqxfUcbOG^~w0-D_EI)M3z)O2-y{U0K7&-LGeYrIUp5Vt`8TFr41K? ztP7VMuL<3dSU^0sd+p<~@jMVpR+CrZ2f%O^lLWU^8Xe)W04(Wb=*Z-{Nd~l{dE8I# zz);;{BxhhyROSu79J#{~1x%2%?zK*DRz($tv#6HcaoO^GE+;0F;hVx`iQ$bQ$p9vv z%HW+e1Rb4Agt}-5fZ;H%j<~k6%+2P(!r-!@O&qPe<@BiO*>=$MY!zsFuJ~-e*$k67 zos(Hkka3bpKdUA5I|s+|xniCyEV^1uqAffCvgFK~ZqSb%!88tq5kD`D<(DL9!Ge}B z%IS4JUyPpTLlo(SBEOq7GyK*Ch}oIX60;|`Y-x*-Vp;~)9;~f8)+W)dtL^(UvqOav^%(n9Nz4cC0{tX2Ip(e=8OrCnnHCCn>L{Iy!+l< z_OZ%OkXb`G3jj>R-XFLI9A0{eRg{rX6bay6$C-zR_6)mrel`2#YF3a72WNUKyATI< zvcsE+BrkCIxPr~Qqq-8lkds)%3F<<4z2}OV@PLJhhFdH^G$LRDxQZxL0Gn?bzouL2 z{u~Z$VO1H@xi`_8b{u!n5hM$(-zla7Uz}hlc90Z}DLWsNLOLs)% zWxoGijdcUYj5j%s)^Rq5`mC*zu?!#QX}E}p9S3w}E?_YfE(_p7akDZUCIeb1F2ond z05*@KgVz#EvU`Fa%Mp*#YW7T$^a%E18+OQmE#Q-5L zguAH8A{S!fr-DVCLEYdLGghjoOqxI+gPcU6z=56d9(pfFQx1k2@Jpgn9FD`>Jn(~b zH61Mt%<80R$TI0C(QQ{QkDN=5$y1z>DZFiPyMGrlc5@gX;oYq9+#F72b_FDH#;+ZUVZ@5d z_O;!~BZK0S622jUDbRa0wAZFP&U?gbcp9uab;s*Vw-;}ERsozHMTQk(MP#NPH+~N- zFvAS1H`YVH5{nt}6TpaWVDb0QOFO`bPN~(+EIE=w-}*K}$FHNeyFX`mk0pNd2u;e0 zk=@drbipdRBaYj)1yJxVfgU%QbMobL?F)Tao`PJW7j7U@rgegv{E zV5b$Xy4;rdPAFZgBmE)^tRwvbwn+MTdRbtiSb|vqId@H!V%CU8Rzl){7Ae$Yv}geJ z8LY(EA|H-!-A3e!D~rhmFlK8=tPqd{uBFxm$CXqpCkM5d)H97Ly~mnsRKcqe)8;N? z&0VT+w@ATt*r?@~G5lJVkKtGHQauf;qUu^It);ri?9$rA|EV9(B3sOVd3W5M`VRJR zHr)_Yy#>57$eBDMM3U)GArcHnwgiMGY_hzXV6(0~q$OUN-~9O99L+Cax6IH#cl&nQ z*c_~ySi%`f1+}jR_0V77{?vZoiDzI*On?M`-hi#=?gd_vP2B7nlVU3Cs*53H#fQj) zhAto#9@&a*=P#|hshgw=&4+x`BsZ-%Rri0HWcB#hc*0Ea2-&^ zD}@t}m=0FyA%zN-98`#4*06#fT^$vzEC|Ga?$UlJd11Y$733?WECA&2`CP4(T z-gSgga;`1jwjz3+U_)p{B|-N(_uGD-y4sRv#rpy7tT?Lk2_NK~BXiHFBDl&E?bmfHx~}U}H8txZ*VC?x8=LdtLymmy)tT&s=U_a< z<;Y(hy^;zdQ=Tg9E+;*8VAZ4~mLJz{gY+OzEI8`Nh4qR}B^G58FT0q~1@IZIWe~mC zo~mi+O77;(tlkye#LJr6&P)m4v#I2y@I4x?Wb*XHunOa`sbQ`D5W}ygAv5``$FM=H z%Hlf>YtEFml0z^iwKbKmvNtzr$;_y$2=2_O>qgh*1Xxb4-@6fwU&}a4Dc)OvNjwV0{8P_lMh%rjkCl{aF&x9M#lEvXQP<_% zcxk&`HRU+m+bz6{dg?m2tDahc&P9D6MQ3WUcgM@2Rr}{RaBma590-?fh};FSvS`z) z@cN@U!>t{I|1d>zTSgQ`Zipwa@326o`*u9RX%blBHu(;b>Bra0;py0PvHi@7yAhN; zE8L7pd$?c+zc*xwaNofzmP2wQbG&&)JU^aI)|>*MlNG639Q~2TT29G{hO@R@emm`8 z@t!P+g`n9gfl$wo)&PPlpwx4dCG3!CZ@Y1;4jx@!&gcFJgCck*dSA}cyRGeN@}Nv% zbb(9Pp?+@Jj4Yu-fZz?Mc5J!Q69HSW)gshpgMXSlH-tLWPN4L)Nf5%p(b1YqPLtnh znIZck*pt~_w~L@n#&E+nliUv6ObCVob$H6{x(|&yEA`7MfU76b>8!^G05X;p4Ac<7 z@x}!RL#-ADwgwRB*-Ml%R*bRL8e0{tLIqEwV~MG~fwlyyP#lIz^P?P~23(A^ z$T?ZSr58{Pm4%0Gj_JZkkvu}*BDqnI7LA(+xcjm{Clz}>>Y(nmrilOXeobtJW|FJRt|RE{JhX6E z&`v}M)#YR%Fgpav8@*Nfl0QN-`HXuJIIfY;-P6zvZ>mfLZHW>sgVOZtWCzfUI!%(= z!hQUq-$Rms{1yz8`?5WM7cY|aN4-T3{r#;Nb%*HPA;xYZ9<07*Q2%l4e;<`(x!56` zEsJ*xaC^w3MwGU0C=#A^T6?`I95h=xEU@T(dvI zIa#@Rnns)d+6o)#!AxElJ$;QFk6fbMmpN8k?`D5}Mvfur(=4HVU4 z;6PD%LkEh6Y*(f8i41Ak#i)~GE;jCD>0%=fju3|4Uy!p5(Q<|9;VbMlYQRz5tasX8X);lr$oeb$2v*JSIiLvdU z;{BlH<}WkSYYCh&g-s3Nm`)3CoZTJI!`pY*-_s8`)yY=Ap2WVs+&otcxH|6IKjOv_ zT`a`4qd%6!?I2s_5a!&}@VNA&^sr;-wDm0AUpHfRWb~*}en{eH;fW+_m9SVcVYRsQ z(SZxI~Y#WZWlww zXrpJBShKCS0HbXk0Kp3Fl14&<7)&;g?Vt1JM?dVwb^9V7vy9dr-Ou&cS?F)aZrks~ zWlieZpIBI&(FI2jEiAT=A|{GIA)3k~?@c@oyX0{GZU?y`o$j?i!U^cCP=ZAcZ|nBZ z9N`STpqEaOZAoo`lQ&Y)Y~&JRtz}*yZG}gO%Z*|VH|u-lI!~rYN9m9aO@f3wu?4?y zyi6CiNYfsOmoSYJ4ccf<5IPeq1bPEah5!JzY15&y<`Rqsx)hDk004r~MX$s+x*$b0 zCw8?iyELWMFao)8d~XT_hGgn*>SeGa%X!~-{dU|w^nLEhWJR>ep@>bGkr1lejY3$J zwl}DzbjL1n7>5E@&QId8R$nh7kyE>A_3ECpR~~1f1;$)lVgg`QFxMTF48yk-n>6P8 z3)A_vd(R^?qXZgGxn?-*WkGbg^6jQMsWPQ>2_~5B>FfS7h%Jy6pzKal0j>s5pe3^T z7T)jlAgo{ul(`SFA)@)g(tQ@qA?#ew-_Uj$dBj?kqKo9t z78Qv z-CI13troVYkxwSKO-6&T9O&-Pd2sfKv5^9fM8jIR5{-P}Of+)aou)2Lg9!N*4PoI~ z!46^0P65k%eI9%By**y!cDG1Z2+;^JFQcxJ%Tsz+L-cL15Wv0I>I3zP0tk@dR|hDl z5`BmV10aN<-mYyc(BOROA*qg5&Qlx^G!Ko*ZBn2+Dpi-gA>Whg1Y6x`jYy}Ws$kng z@ufS05!UeE9#*NT?g)I(AT*A*-LQ>rDva3dslOb7;g{?F523M}?iV}{vD?7{ZnPvC zYH($B&~Qu$QpLI`0V3W>2_U9-_}!EN5$UK5B;8d7AmS!cyIZV`JX3FHG#|?ugNB3# z$JZu)Bqc^);TWA6*N8Ut9kijcYp_Mn!~9MsHh{CB6VVn zq*-&8&>OzEFk}Yg5XS5XX8fZuYmI_@{F&r`YvlAq46?cl+MeWh-jVSgy7I8scgY=B)g5+OOOhx z8HP<8vc{ z+zledaMSFh7>TCoFYs)zigdYJLPX1-A=<3BL)#vO14frsP}Fxvc(m$YxTp27fP$;J zL{8DJpcF%FnSKPyL;Jt54$D-q0Ju7izuUnAAO)aK_;|4A8$i6$C#TwbT zv44OiCwbOz^U$95&9=4vZQ2!#O&ToPXd{RI*E_dib77?W++2>^*DJXd6ON%j#dd!J ztvPY6CYUx@SZ~mMt&c37A#H0BN0hconxwA8EfWfMz83~VEQKa##LFd?BjnVWa9vm)d zlS@l|PFS#XSsIpga$2UchZbt>sSEAUs)9b5zM=+=^mTY?j@`fUb%mI+{p7YxRT{0- zY^&ohScyf~Ut+S|{n@tifLJL%uuJ3_!VH|1P`A65DGAc8_PA>Xu^qCK!VF}opu9n0 z6^+@PG1VT$vQfKA1IxHw6LyZ=6;XBU#?O?UKC)1;(!ewzRAkf)2^Ash3e9wROP|t7 z|6U2FmT=|l%)?#<*=Dc`0?uINQqDtiSwe1isRd>QHk$#qi*zSA(^d|q2OTYN1?#$i z6)fxmR+D&Iiz$spQ-V?oWThyjP=1n9jJHfvDp=NJDo*lKi`5FQZ1}4vYPtJXkgI|` zk>v8*YIEP8E~jzxZFSQh4saj%x;?=ev(n?vbcV3VCVHPX8zrrO^EUeMiwx7^hhW`f0+G3wU`@z zK}!nI`5Xxzk@;hDfW5S^=?d;~-@xFoZ9lZ_?g{qVz_s>=ll;vc-0r=FK{q((O90%r zL)XL6_#zO8r!Q~;??7h+#)a_=c|#E+0J4+2<{gxb^tNyU}?F?6Cz+FZsxF;y$|3QkF zA>EHx8b1@z!bFCtuy(^V5fRjdpD>mRndSd=7L55GJf~Ir1MlGW+?O{3>AbbjBMr;s zu(`7N%qY+$j4({Xh;Tk(Bz@~s1Es<32!|TsUTbk4NEs`lY-347weAk5eXD;0&pr?0 zb-KX}A7v;=YI#XtgpnU`Y2PzkDgvW@*o?kFaKO*e!=ywWIl9>h|Fa^I?MHCXe4vy$ zDJAGxAH?=t=}Ma)zkh>+AHEH+CNJ*f8RRyIh+R{3d6I8Km;XptB;HaNTw83Yr)iRJ z6!*hAcumroS^t zFl^nxqs>@bUX8GZruMubpzT1iGUmjE1cy{zQ@LCOGMTcw1iU%|sEeXjDM&gy8;fmuvKbrIQH5&V^50kIWTi>bq z+SNGr+fEG=i}$+id~fpuw$b&!NB!2{;OaMhgk|() z9pG2i`3*KqYqF0#^XV_d3E=;Mlaw(2pMkenSzMc7{dzfrK98un$^*RYd2ZE)+;&KB zVAS|7Nt$!WT+VRm#2#jtYC{t2k<=I7W(mbx@hVR=m8+B`pd~?IBuQ?6(t>y-DB(St zv=EAWlpPG;-&QC#%;%(!)66PJF%3%X9Mh_kB?!?`K_6hybK-JB`HB;)Scvz_NNmG9 z%W$=d2u*NqSPF#e(XfFBj3O`T z`v?cCPa;&cm`>pn;=7YiDMn&FP~822O{Ss>DcPWf-4yIEh{cKfk+h8y2x*mv2x$~^ z4fnAbewlF?u#`Q_M)DV=RGv}%LoSuMF#u@prcP`&~; zpB?`%{&mkO?phFLD|}D+}6XpUJC%LxW6k@{LDBxZm{3g%@)CUYP)g;a-= zOKJB0BWJA;QFMcnaf}dA)|)~^Iqr5fdo=s{do=qbb6Gic+E{_C8rcye>2+S$b&{$k zn&9u#gmeBZ%S!#ptRIP?OqdN!z&Fw4Zqjb%b_BBo0T4EE>2%k?2pA+JH%M{A_ zS~ixa8A~^8^i8#vM~-LPcCKIj&wM$~h&OI#Qndt*nkvjh<3>LRA8?gqAWcJLf=7UO z{*^EpZd{*fCNbt;AqJ)SZ+(fu;9%--?Di)FR_n&AEf2^I zDvk-Y66W7oK*bD|bHZT3xD(qT27uDGtv?x!7`<_U!DGOUX~8j9+##XWJ@Ho+rR_KmYEd=7adT+8>C%Gnogz6yrk@JN*+woF1Np2IJi zb`HRqVJX1$OdA_AmqfbTh*AAZdv12nA<4vn*pHRhj2_|WPeh5ue-=zM>5A%5HBZ(a z+0I&LK<7nmqMX4|hl;T)@*FX25nHrJ8?Nd+j50OaV03BJ0LT^uGk#JPtT5vvC=V~X zC>ZTedMKxNL`_IG#($D2qAR0Oq3CL$%a0c$m4RT*9Lqt-KAlQNu*}Tqh;E*sy#*~^ zk6>Vb$NEq=ytFs8a$L_puubY9yP5`Hbo7bzuF^gxyl+7>G)EY z9va$x6>-X-BrZM-a4O_?Kl~KNOh0lR(TamW6hjEJI>4so5subb`1ru9)DgqM2b44p zLo7=gx1W&ABiQng{;QlB{Mb3G#p8lwArFFM91o&Q6|gz~1`hc{<+#KqZd544y8F`= za#LuRLYok!2Ww8TnA);UiyZ*w^U<3h?UTD>_j(YkwPJqI9WU}omQ_u_jnW?cb}O6< ziaqkV0{xGS!QY03nyWhI-5;v}%2(&~HE&e_<;gUdl)#IY)un&zoAGR4`d)?O$8O(F zK%`>VblQFc`Ku|#Pf#W9vxXAd2ycUmcc>W7y?$+m_OTgWrYix;+-}`AgL;etZWkzn zg32!3`5}^EwGXw5x}cAF`@pNhRs!peXR%ge&NJ0R{rl|?NZ_9L{qH)MaD=~wvxw)* zaBO!~Agw2N`ojs1X~Hok)qBdk$-;%mSQ)Yo-1Lr1ao15BnAHKETI19Q2!3n0TrAJbSm6+*jg4%^-^=niM+aW<{HIGaJayJUPIbnKuJ6 zH}~d1iX!gsPTmM%x*WPDV;hPvjc2fln#gl-ms5ELN@g<8L3F0`9DwwMo`V>f(u*Ae zF!H@zV2z~P>d47*p?J}N!7iq3z<|XS4hn#maZ@N*K=ZYVBG5{Pk5%RH<#~G;iJ`H4 z5>fwPXb@EaDaKt|ho?}N+a)Sbv6$KlQw6E&3SR{&RJID1+7z++uNLk#eds?B7mT4x}s1z6g+MKi$Tj6SzY^b8uo+A=Z34sSqf#og^xiUT{_0 zhI7j*IF#JZ7#s>$BkmOH+ls0XWnj_UcWglf#yp1+JcL6-R1>STvlXMw$}NVX%NBDv zDk~0-Wve0_zGjw=M`a}JdK?tj`NAOut}q_D^V`PVCn$6P7B+6 z#@PANH4jrp(^x-6LV6n#ABXPcr4=VK#L{40>@^&+{d$2d2XYH!HfHh!fc;rR*ZzVX z%>7TeTKwHwk-C?*eWxbWowV<(EO;A9im-;bdpy6BAh#{-&4oP(?`d_B`n^j7nH%_N zK6_E{{Czn?p5+ku6t6l9&>urB(-MgWS zwVH)SC{?RI8?Wl>t@vV?!KG4f`eThDPS|>`@}mJHG1S69rksoaABi|yvks!1vZ!4 zS|M%DDr$}YTDdbYV;&$+NJ63_gLuL8$HS51JHWxsZRJeqWPv=*Gd!6wHg$Vm%JmG6 zJChW@)t*uyqUj*;1}+rl%7OBAf<$s91r?d4;|&Gw8V2O_C?CmjFnUl8!c`Phvd4;Z zLC#pAEr?X4d#5AS(3S&O#9Fj(>bp70Y>`7Rvri7aOfhP{{lx^Bg1(|-l@(%wA^A(Y z>zd8_)VAAKI04kZKxh-&r=8#YyB(|-PKt2EhW!3=j#a_1>^;^{x$TrDVWR__LTx&6^qxB1wcI&etJ9g@Mh`QjUU^ictxn@?#b6~91zQl>5CvI#l`b5+WAE5g<@uMB{X;CdMZ;8ZcHjsR$x@BqPzfZxhi7g zU8w?8bSX5pkl4i0Qic+PXDPHhd{(oy3tMjLdF%`Y{Zb{&=;fRS$L4B!4WgGbZD$ds z$_(TYEXd%nJY^E~Amh12y*5JGL~!b$wz-RKVV$_Id)(apfxFv9@}z$!?tlT!Ja;b_ z$WGz+;{FZvjVontPLeKnMvouqenWEq<*Cmgx`6Pqk%apv=G+9{Be zWGZkyCz?5qMWz&QD=8-0&%>Rxw1L^v-vhs*TKG_Lf9Hzqd%T(y@Hw3QDC+rKRz2vD z@0UYIGswJm&iqBfnYAlgT{8PaUNNvye|&F;Cl=x3&>Y7G_C`nRM(KthU>DObC_=$; z)l~5*4U%5gNz<;*?Lq8&jqM@KQ{TWF8~p)FnF49f=ad}qWKP4=M3^^X4rMp;LFZfTN^=-sNY(^Czx*M*-d5&$oW*h z|AfG?X@EyNZoFUUQSC!Nh<~VzS_=*x)ji?h)m`s55yNm@D+nLmlaRM`5D%X!c)~`+ zucu8nC924$3tXMy$=hq$J-VZkZt{xWQ_&#Qo-E2NbF7gUOj9OL#*vpW5ABOuK!=&6 zo=d?wqjL6ORrxXu?Qz@IMQwKUsJfK;pO%GS*}3px5Xsy4RL7gzfov2ROjHk^h$|r(G0B9r9fy4n87- z6By&VlQ;t@=ZqJ7CjoBSWAQLyG5C;u?h%%*)McDp1mbvTF|V&wdT1%5^OBx47A(mb za(`)C*ai1Oc@M^Jw>iQUA;XmYl8ruvA_ir*f9n4*k_Cr<33A`Vy)A^KZ;5a-w6FtH z-Q1{_={dH59u6XLXZZoH;8Dhxb~i5(aIjbQ(_6!+{yFR1ak| z30ouJeUedcI%Yw#;#1l>%8=FISpn_RMF;Z)r9dX9FU2Xco0ZoWdE$))ROF2|P>E#I1Yw?Q z@D)9Q6>+5J8+W$cn3!W#9_Ay6NHhBvN6=;YZH60&iR~L=*3Je(%Okmd)OlDGd{HX#nRGb2Zc= zvkKXljIvBCpj35u2E2Lg$M%@JWMHv)<5*hYN^7q#Pq5VOo&{%Wv9k9_xN43=)V|o` zzlYEX2h`59=E=#F*7-{PIRh=D2XdIn0iuIy49JckES|z%Kpn+h_QIGc`h^w8Bq0Z~;O#c(OGpopKpIg%ScoXzgYSR8qY+ zNx)^KW{XUgEf=kE1DbeYQl9jAZimf!epgieecA?w9Z8~a|GdDXPv9ay(Q-ziR+7z$ zHT*mki-^y%v4|CfwiL*)ta=~9icidZ$`$zB9CytiUnzxZ?V-W1ak@Cd?RH|#40cJt zK@qrIh`8Zl375MJ%~FLrZn=a|I-{(hE-}o(6qEZngCoO^()A7K)CKsx(?IbN&^IBZ zH9pBw3GdVSuvb3$sole7R+fOaJxe@N;Dk;jGaSHzniHZj9JXqV^JvkEaf$`fPbjOG z2AE3G7$BQGE)27u%5Z!&sRyE2^l+!~>8XcU%^QjI`$AS1UW^~e#K-PZn-%2H{s^Me zYUUW6Kx9fTBW`eT(wvsyTB8(Ce{;e{s`+|W5GbZI2S+MCa|U*b?rlN3Ib8puUnfnTAueP<(`-O6@K`iuor;*1tdiM^C+K-qTo zRY5!tv4W%?VpXB*3S3v%azQIdS3xAE98)Gejeo(3#`ONhow)YzG<0Jtdhq7)6}C<7 z{%X&^`$63Mm$*nS1_6$DR_mQ|8`oQUW{O3*y6n1hqS%qaX?ODSYPlyYd9ovmqZgna z+F$U3qO+!Iuo{g4p z0_3t58eMo!s|Ezv;IJHDN&o{ROfj50#&F>hqf8m(a-1RJg+>~#$Az%S&K4ZErZkTs z-5l7EC5~v13J!;wHG1Gkp|P|!3n~V1j!CclVud6jl znY(V!)@5}1HxKQh|CP`2@PPNQIxk+3ifIagw2JZ;wj=@4a2Itf1{QW1Wwt?gJnHGh z_MA>g6YSU^tKBGfk(gYL=oJ4r_P>vsy$@ZxhqWCd!iURV?)QWHfp1`KD4p%ch0;90 zJBK4&9Yp3rlV{J&5{0v2**tad*xGZqg$t0s!Yfh(7sqUf=ZPSlgnn&@R=~K?e~~bS zHdZ~6tA_j6{>b(ZvD}K3fyJH z-`DNiS;wa7{3K5$+z6++G53Y@0+RvZU32Cu#N56Fzt`{lja>5xsMxJbJUvrxM_ULc zd&8AH`yg(JXN&dU{Zpbck@ff$=oLbwK0sY$a>0h!Nk+J@-q*^{bFZ9po(mDI3g{ zJZ!C&r)eV7yKVQ)8{BvV_07*c<(3w|uaT~2@rkdF$6h^YDsw-sPG*>rSURJy`Pl6S z*t*IkC(~WMybSFN^mwh;X~d?^w^sM|tVF|P>K^eiA&5qwSGq9%REaF&VzR`SFE(o; z^Q7&j=S_^st(kI9GcPU+*|}E{aI}J-a3ZZ6$ykAAbYNk#@6G>8IPstuJwofmj6YnV z7SqWhAU&a+Ql=VUeBG$|DZg)P6)Ttmzf}MQ?qVj|Ty^THHk%wZ*)Bp~PPdET_&)Pj zbAY6o+qg4f=Yz-#Lbc!G@BGm23hxc*zqx~VbSX9;cwL}^p5Ou%^avNI#9;PitmO<% zbr!Diol;409Cgt6S~4{gt@Q#mc}V3ffveAD9JbOEg`5)1f}SE2RjB6z<@%+h;xTlp zDRI>qs45lrjsPZKXHKn(E2XYhamn3!RS^nb5xQo@ZCzEZxYQ61!gVV)pt=s)x@)8m zX|7$B0qN>hL5xtvr>P27#!l%x#8krAT+Fqw5|zv-{0Gat{ z;wxwdQZ+iRW@elMlg}Up0-0hTSCWE6p+Izoz>zW|hlvPOr1JS~wGl^TR0b-p;#NPx zbGr9K3tM8vn^7a0_S;H;&6gPkR{)kxeuHa_&f@6@d`qwy>VMV#e4RX_d0ZV&m$O(t zo-YxzMj<4}69~FlYc?o!WUd1daV7rD{ZdsvOn2V5@H8uzjrH#imcpZZF0$>f;W8_* z8@G8e%YgSTc2Hl>9zw|Sf@cEOa(~IyPwA~>70Amo^!;?`aq*Y33IEF!BV~R?_(1v!< z35M<%6RC)6L%-)RPf^;`9-$#WgbvMdgpp21V!F&}yaL9i*p9ZG$BK#WS|&>8Nh48A zlt$vKr-D#oU3@#12%``RgizyWvC~cCFxOQiU4JTOM6BD6+o5fb#ZbZIpuku`Jih5D z1DMwb3OZte{1j0m84}*R!Z}hfyS9|0cI02f`ScgqUv}Kd_q^@b1@%TH{m5V><4XZP z_RV;<5kEmexF5_t!WDtlj==)J?$Gk7*KgywJ(SWzmw^Mzgl&SB=|ousuA2MYJq-=$ zSIl#c=VJSu3j2+xkH+YY{+MD5u`f!h{tvDwEKAyU(dn+PJKS6uHe?YZyauJ^mE z9lY~;hFgt93Q^qMV!-#8r+qgT_2fAq{*X5=jp!3CGv#Lf>ti$iw37tVVWSx)fylAT zG%FSC!T13O1I978bd++MnNxu{Z(tzLl3k$X{g%bjUSGOB43YBc>Tt@B14}H1&HzN_%3CN^XpT&}LODP3Ng z`&v$Wr$H=SUb0(+WwX82tv4$%ZL|jkHNKk3Gj%JQrLq;SQdG4CQP!Ad(nZK~?Wht= ztaz9-j#GpxVZ;F{UgQ?2=izy5hpTUle!Gs<--;}Aa0_uY zv3UB5mi3BQi=r}_+>*DH@iT%B~*P!eJTNEAZJvrXGGv*vq5W zU^-ouWEebFA>%+TYGft)3{~71OnEi85{^75mN^#%JcdZ|dRxhO8AmmR!K$qCw1+7U zY7<9SiIZ6as{B~uM5qSdk$0BfGsRPeW2l;-U(aC!*#%TKh$@TQB~&(4rifbNK*%aB zn{`O)^>U_Dr!5IBnF26_RbWyqrF$jd619dAS-nL-CCkbjfsuvfGUz}`#M3~e6g(A` zIBZ5RSq#SNz!d^g40>5&W+-7U&X^)|Nxz)YO3F_bidVDNyzxe}EG*CPP6c~WU@wUv zafWF}FK3+1YW};w9uVC>mrQTsc(sjG!8(EUg`zGaRH)A7ZrkY2MS}VaRt?n|tO{zI z7g36}6Q<@3cbN!ZmKg@Kzd^~L^1?~{*_<9;^FS~ zCO+EE4FN_L0pVDb zoeht%ZP>ZR?<@|seQPZ)x(dB$%py`7VD)=tt-qWZlG=pntqIFM4uUFj4%h2fcq8BuAXvm=E7}G6z#?2>mA0M` zm@L?A!^zQ01IIRTvC*a!hZi_>*PVQrjYEp1k@u3?yy`Y%JN*{^Apx#-%?So&$I9}- zfb-ivbw`5T@VJRWed>;9G(*?T?u8l+EE--oSOQ=TASrD6J49z$%N89vR&!3`qw~?|&4)<_LP*hREE$QXln_tlYSQ^(1(v2v6YFA@ z!Lzwy34h5Hw3OKjj1?F$Ge<&rW-u3KE2X55L~A<;DN3wBRR1D}Cn+nG#ghQ$Onl1v znDji~ncFAoEi@NEb3Uc!qyc57BJes9Y5nGwHUi!mfhb^t9$SG2I|ZQ|+XJ96Z_iE! zKB;R04oQ;~(QETXUW@`A~$Y8wVkT-#7@~yfcR9qy>8Mknqgd z9%kl~SPR>!8w5Z(J zN9bWu47{b55aay}~lm59KabszF6vcgHkF&5A zb9@6vbx{mvL{<^2Hvjjq-`w^G@u%o^$WLLZUmwvI3*o~>9s)wr{sjl3)Mc;1f}PKm zc!gmnXudSD$J=}o@pP5BeGkdh9b7qbetR(2hhnMr@|Y{~Yf$s*a8e|xhwOZDZu{*; zIN;;kDfWn4jN}7cXCp|_9IBR(pTl+o0{D$!5+1S^=f#i>T%FHD_jHNAUFV2>dj>aA z&xT>(;d5p5Sod|nS5yB8_w~icksgAi7XA*~TRXU^^xyFSvuIS2i4~$g8kK@Xsy`B# zLo3bgzQ`8b4vZvPbYU!=>BPwI1Kk)+X?J8IQD$IRnAJp$)z@g&k)T1_*EBOn8lqh2 zmZoTfYyh@Ht6NEgnD|!2*He^2Hf6;r422V^kOU@H1;4!nSI^zcMcrEziHa^Uoc=oZl1#t0s!_9d9fx2PLqt;ba9FdS24lq%3rjMkC6H=? zu>1^@MEU#M7H)m)V0|n)9=S5bz)*U%iQysuc%yo}>|^6{yxmM%6DPcHE@R7VbajLa z^~6vlvlccBA0Uqz^f*F{`cuU(W%PA8L^gsX1)VHdvx-Swi6kbuK=?fMd`@v#|R+H>Mkha|P0 z4||w55UUW^sbi2)D)gI&JQnVFqxqzVfoj*pQfYe<1q`nTOuhOtAuJ@zTq~C&Yjbb&W zE_TD&awePluZUXuCPJe3`e5p6M(jv9Q-A5ULw|bhk0ylGVCf6oX|;ni?8nf-MOQ>q z=mr@(2D;jV+(%#q)*gm4TtW1Y_KoT!SOrX*lf}al;!1gV z+nqH?gB~UwyVfz6bS^Xv62a?mN5|3O0@r>c% zFnwymC>TC06-y0~0t`6c#b`&k{&Z$O6MEKSf; zf{BNZ`~IofvpbEG$kmCV^GQfO5m7x7JrA+_^b$*ksybLWH`@IYR}=5-6qiJ(b5#Wp zD{i^Nqsq&b+Pu0@xCZ5sD_%uGDP9>O04?h|C}MPV2!$p^)Vh?xJz5_sfN;A zXNBbyzxv!XqU`vI{JViev;@S&ucZrn#UqVTo0+ zk=jGlusKLbHNZSat6ysXYqSL+t3fE7qlB|s)1`ClXtkuoj#*1eY;ayuGPF7^5s(!m zUw^?y)0x+442sOaiF_zHYoUNhk1dx_VZFryDtU8+7vBb2xR`YuTQ?wbky<$*LIu|j z=#CzQp?iH0h8!dC1XBeoxtf7h>4fI5XOIB`_2Uu@T{>n$6vl%|D@rI+gJv@0tZbBE z@O2_rH|R~L);H*A(+UTfbh*aCfQYSfRDj|dW?H3y-603ImrW?awGOU$jEIz6@1XM` z*DP4`Ef~F~F6=FwFxg;eqjokhNmQ(ontxOIFv1dnQGxcnFS3pfsV zXmERw!vK`Fzrc3qZrxvot=fGp5vM)g6_C*TgtRO{hOUM|JgiOI3Tgnw6 za)dthgkaFTvt<i`sBHZMNamOiI(0+ zW-F996F3jNLEr9XG>YnO+tc}VCZ!AE0Z`h$zC1sRchOB}z>RI%U(_arnb>e14#o1j z>D)^Mg4TX8Dp>wUVI+bjoH05QghfgqRS<9Krz9ySOWR?u1VIKqQbo>~es&xk0f+vA zT=$4VEQ4r?Y;zc;x`3zV8Hnfs9uAk9+b5>x)r_941xi6+Xb>0uvve;|5ZT71JtPsI)^wgOnkQA9g!EjZs-aCLu!wu&$+Nd9N zb1-$6Je<4C>905hN^GlT)c4kYndv+uLCY37MXzuq=G5$iUHiGg#?3F@rW`Vmfv-w$0c$~0u53;;zDGtJ=y55dY~ z#1#5legJ^iRT`)~$W^9?_6VuB?o+SL@dZ24H;!Y2=|Wlo+D)_HQ?wvuQ0=LpGU{44 zs+TUP?Q5NI^$w$k1r(J5Ep@JzFtz8DJqf+z${|!c&gcG^%DGI_D>w5%lV}MuiIvmJ zC7$-6xQ!=1 zDDr&jgMtYrKR8N}^(iMoRRSh|va%OD%upNEv~JGD1VLKdN`w}96slzlfEG+*xfH5Z zFPp-43y%z`qeU8qV$n;)@HASDSee}P4cCm7z@eM5Xpnj{8CW>&Lvd;#Xs$I=1yVm$ zyRqaCM{K2kDnu;LwxfWoWQ`V&EJCEM7U`AA^D>ujdXtc6j1FeC}6QB02MDa#b?6gAy$%H?74Y$hto$cxd;qnG(up@)j}p zD_qSByA1I5QG41T91PuY%pMdo!A_cXmF?M>D5Id<-bsm4A$rG}L?+z+%_1&p-s$7i z=9j&kh%omr-Ot(dfu3Fit37(T(Dn7%T7(Y<@g&qsTa5C# zhd00a;l3Z?hEQN^{|Hy^{)C$)Z`(#Z-V59xUvkCeIFlM4uGekED=M|vCF@=C5x*QS zE`YkV_eXOE_G9B?j#@n{n%$C^gMk}ChS;@+IogNz&?9z5=3uUNyZnkv4uovHIZau= z!L3LKGQc%li6?GL{oe249)2?U)o}~A_(8`wj$&V&I&a8C;TchJ@X-ABRdKcZ-wWoV zsJKlObeT}G(IC+3N(aPLAPkQOX|QD|%oKU3a10rB@Z&Q=4bEi6Wy3QUk*h5kqREYV zL7GXw4AV>?*~j@-SJLP}!DL|>@0mcE3@g!#lo=D^Lus4T6@O#Dd%aX#s$nW%nTZru+1_|N0N6 z)ELeeLKfs2R0ty+Cc-YD4yY_qbT5eZc@|o%U(&!b>r%d@ViIPSq_8lRG(=R5 z*XuJeE23ZdYu)`xJ|hW@&zL@}d7!E_g+v0ulCsAHYnr_5KB4i`1_e7@cGRJ`?YylN4hxKy`>@@h`V9HIPH=!FP%7{1LxT=qRIW>SFrl@_V4`qf@RT} zZtOoa*+ynA%wG~mZ65U zhp`xyseT7bFwd24&C@sVnidD3K8;b4dh|w@r7{!l_$uY5Yq#9u{(Rvs#C%_4M;J zFnc&A-#V968%t-BeWbQvSfu*Wbtf0GIb_kQvL%B!d(yqUo<}hbCwQ0<#j%{Z z(kGxZ8EXPMljjAO->M#DPe4%!Fh^FN9=?M+v z=jceugEQT(qJTse;GFA^Db5Cm9 z)C35vsHy;gKn5!0_s+B)(#2om)l9TR4)vn0z+r*VPnXpNow#w@#rvKkGe%QZMI+DI z8fKRJcHQnF1CT*U23$3VM^I1o3AZ9bp`0okvL=GkOQ5cy3o5LJF-rBSB4PrOJy4>e zl}CvZ(4)aJDC3M>g~_X9QHMd0h)Rrf6BJ+Mx($*8J1GyS8urdYNZ1L2i5f+skhFpZ9MMhrRp}jf~qxD54h=GyW(V^p;-@!9G z4I)&yxahYC3ss6O4@L(i>6x%MC5#)I#CrhQ{tPnQ(b~NZ88FzHW`D*Kp_un z57~0Ilt)5C=Y*=yOAbQiJaY7iA`w+e==8Els((-&1I<26L+GO#a_%CH<(D?`lK7Np znFJwje&m)o2_eoUG!@mn&l78;2taZFCDI;#z0=f5^R4)lQ>8Rd3SBZ%D`nBz)lwD! z#*1d2iD{aynWB7rs;}n7a4M_>FSSdp$W~Ob74flEZq0u^mp+{xKNLb{RdQ|_WB6d% zl`yCT=~3Pgq)gU{Rptwoh|SdwO5gA@#`G6!l)T?JZ%=US7hahisLOY_7H<3B$9>=I zq+gC|f}hyeL<2REwIU#C37yKV2A?Nn)fitC?y4aZ7h-8Dc}KtNnwMi=&EY1rt6xpG z7yI?Byr@{$@`Y^N+AB`KFd@`8y@(3ySRqoF8>Z$vSc|1jhunamD-+7B2!Q9gZG_@sMOYOPGh+&oRTE{avgya!+ARC{Rh-QjZ`!ahNAilw@nU&h&3NEd)v_Ea z>hiwCugZR8Fsds(y;OrsP;{2C59;VnnKN?J*@P(=iHWUa%ri&=+Ff4r_>z2%5q z0W?#YLXIqT>=4On#A}tG&gYZ-AFQbzM{|foJee3j6yeZ;ATW0lg^czX+biZ1!2WIm z0gS3Ac#Q>i!;K>pX)wa*VTV8=A0IoxW@m9&NtP7w5>2!Opr>Xt>?sX9w379zkgXrX@vi)9=N4JktD%28F)wkc_KEPi@$P94JQOr(ZmAUKI9YL0z;Vq}xD zOJ}B8u3c0Vps7U%4vZawp@Y<#7eg?ODiTI3I4zUH!i|hMG+uO=!ieews;QOWbbqot zyu1#JD&sun!Vw>+FT)tB{^fhKzragc=opNF%Z6tQ#Kb1W4UZ8WZb~3vse5wjSYfks9NLufRpHHchAM#BgxZlZp7>FiiKc!OkZ{7rvRxR8Ww3SwJ+I5OWlkhzMMk#0XrjuOOg#y0whMfU&)CoLy4Zkb&C>hg%MdgOO-52gihg>h@QeNw0sJ>K)2S2 zTdq(GtXzv0SQXV-cw~LWia}hJ#qhXVi{TY0E(S@|U7&8oQ(6Fsr>y`GTTKBhqJA)S zx!`i=$9?|<3rzo(ixZo_;7KXC#!x*?wURad=MEM@BQ-*o*rfBQkN+DUAUw9CcoO&6 z!WjyEVPxV&SoQWNnW%vx z@2(lRbSS;UA<}&Z&*XsyjJ={eD_vcz#J>Cg0c(9d!YksE)0mTbgfXwuJvh2`js}Bd z#z;+U+#@44mI*PQpr)<6Kd@C#Two{e8f#v#b~5Bh9-Yo)^~6kk^>}trM3)Tb?H-li zDQRu`)HE&o)JT>CA%W;haRe+2UUZ>p&2(NX%xHklm?-h?RT`b7uG9O-+aM%c=ayW4{Kxu8MgXkRyVRn}Q(GG_N zi26MiAd)l4D*nbC9#ePR!wN|QKG@t3khZ}aNFs&!0ykljF8QAz&0l0oUz*`(JFLZJ z&&O?S-?+z90N??h`GtphamN@9{UoKu2~I1LK)?X&m*E+X{gdh7`5vbJti~7TpMvqg zQ=df-b=T&h-L|lzPt~1;LX=$`(Vm~h$leA&S!-%h04(p?V*;&D@FFs##e2yTM7sY? zZmf^#Qt-5f!w=9i)Q(fwEDDi-K;QWs7E?nqG|W`T3LYjF*AMXhL1;ptl=-GX$zOdP zR-E8~p*1*^cW90~^YG&9<@s4$MPJrKge)%bL;D-{a_%46Q`?+H zVo_fi3pb5P?ecs_ zP_jgIr`+r4T%O?$E_8G@UydA}&llq+X7uIQ`V3oO4p)vHp4FG*M&|X!z>%4KF>ZQp zUktyP-4`Qf=l8`ekYa=gDuF3Ffr-203p|c%;-q;Bl>nfo$cqv&8DTNcCnJPr`ecx4 zu1}?$X8Tk^;#5!$tHDA6wPCEMVT%RmaS;oMW$+p@l12StO1FY*N#9oRROG>&Q{H^< zM!2Nl+p!vMa$Yerbj`fxd>Zk+Now>}NsxmE6gvy`AXzI>PVD$=+ORHQit zw1&08W+<`1`qZE0o1{oZls705m==G4{e7?^dVINsRi7=C;!k^6-_90RJ^RDmC9s|4 z2>pf0#(m!%DOxKrka*Cp88~kKSyXH(Ue46U3hvfB!%ayioD1ov7vzODaBvK^ZHR?w zYMfocqs85}J5Ldh3NSZ4LE!kmg=LfVYqRTrBfp2rL_>0yo6A$Ty>9;vTbwy|7aOS> z@EVfs&A=I5F7x`3`5sL7y&KLj(B2LWEF8Z~^=Ql(YoRX3gfgQSS))(bVT{y`@}_XU&Y_XFAlGYOTiSSgIG&}l9msjOkmI^n3=8lMkS znmQa*GIknGNG*}8xWZ$kl@5w`%&XT-(f_`8e1uqgDtxfoAY z#G-^wFDF{ve}Tr52Wq!m2NOkkzBL6k$A)StfUbLMF<{y>RfNJ&cVU?18Y;RfL6+ZJ zmmt$mOAC5sf)BuVyom>K&j-VZ6Fny}n}|8CKM~`(4lm8%)NU`%pxL#FQtL-UyZHg9 z>igg8?%&v}HDqCDBD@lBTfn|0+%g-G!NO4|*8|^>2S81GkNsu)`l&lVw(zL?@g;Y} z){v>&`Tl|<*DvZ4mgK{chDz2S^XGWY=TM@;^0PXgF6XN^_=ZV=g>%kwn{g4{5I!=^ji|Aa&YT%j z(ac3p@SEJol03bp;%X_K*Sp{5`|hk5l!JI76Gfw=&jVabGRR#x6e=g%KBY2+`)#OZ$6K(z;1+TI&N)Iu48^S(Q z=JuiAUPh7Z<9N#DVkneF{+DAo*D4_ZC33(F7qKibLx#%(b0FbNFzQj)?y%p?ZsA7!UO2cEqx##v!l9N zg2m_S4hV?!?RXmcEu0H$)v$}FT)!Q+uS0)?ynY~1$%ruC4NxJ)l!|suZ6byD>z-|;45yofS+#($nIWcn=0pFtMUePQGU!##H|a6nz?6yK~~ zxx6}`hwkZeZpVALfxFuSZu-Vbmgit)9f-EBv z6+zmAqH`5Zryif0p1QUcI+wbeXj5rrj+V}{j)x3}H6?@HDF#!`!r+p@9z}_Bz@F^K zBWF2~+#tOrN)ywNj(2n!E2D!t9%nHY6DK~x?-v-$)S!T&RN-_nVk}r81=R&L$?Oa2 zTypi;V6NPr5~zm`c85}F;G}=E7ttHu@qsLO4U@nYZuWq>!WPOds0Sxz22x$GuD zg1zo|Ad6}X9u4J&KF*i+cu}`erVC;rIx5fF!dKgWU7!MwpE3Jw z0}g(2;1ge8&Sx=A+qa}ydl*KHh?Kd180AyH-{CfJgl(uqf*pTbxZU2WRM9M&v!-4? zQRm9_3!CfqEVlZLNLmSjpN#1iQB%(^@RmpWsdL267&YXe377vm zoP_5b<^Qwy=7EtN)xGe&tr>g9Gvk(Lu}AjUmcct-Mx)uxIxVRsHKWbl(kv#S-P3A~ z+HQ5rz05)a7;F<9hr}cy8}LCO3wdAi5|Xfl1Z*(DKuCa)5E7CA2?3maB`Q%48r$N#S+(m=J`~_n8uS&bN6i$&UEG$o4H-n`r$b z?&(;f_XdWg)G=63R3sLGHHH$mh}cz;YN{i83tX>K!9#YD@HFX#Xr7};4b|7o1|j+B zp99C)UXd!Mv{<}qDTs0SOVDOt2-*zcB17NEc$M^K zi^c>aXOj>@5o4SGmJAmc4mu073q;Cyqe~b*T!qT%=-AWC)%8fXO*em%!c!e52G?NUSvsuD*fWb2@=#!>MZYc>&G zz|ke*O-Ahx2^q3_M9BAWw}>4qS%eZ-%IaKEtD<$Us7O{v5gjaKBBH-E60?gYu z?vBP9Zdv>d+{4X_bztx@yM#|iI7AuxsUU#F0)44zPu3g$5xzsQ0}YcW<8d&sw$tRJ z2fJ8rzFO_IBYd*+YXyZV9|uSLp-DjL=F$w^vau9D~e;(FgRCz&-!?v z6%-aD*($A26+5_X+-S0j2}_meaf;Pt6ktoGi+&8}x?9$&7l%&NR_aZJllR@Y%cZQ5 zNRG*dgH9b^E@PGpr+_vavl_5_w4lG;+Bv_y+d9(%IoDgRw_+npmT{F7q!$~V70Nf* z3K?1>cZ3#W*y-?M3R)>Ku#ZcHVEN(g(Pv{Pqe1pa;v@8Zuu?`R!b#foMJI)#`JRr{ zb%gWbBoW*l^*TsJQFS{33tnWBu@Mo=ziUMjy?^J5gf6S=)x9DS!1>vFl_?Q#j)=8p zXqvJ|Dve=yb?1;dpQS3k1S0aSu-p-rB+`(hGr-@Hb`^yOn?!v6<6!t$m>?6nj8P2} z2-eN#v5L{CoM$1vgUy-;R&)fZ%%P*HS_%*T7NI8jwNtg_<=Qe6Kl8&PaYiSB`5l`o zVxYDQ_6jc9MYCtV=pilcg_pdk)BrjjRSU57_9P=vl8V3Mw{e!YILk<(JTUsfQwu&=$x(Qq zDO<7DTkS5*wy@p5vsholCRE%yo}QE-5jAdMIB%ksd{Y8CVSto_s_3^hC?UCEK301x zD~+0nU&v1fM2@@0B_i*CFCx%IDgp~F%*)}pBqB1~gA*Q4&A5UIeG>YG<0P)HF#&S- zArUBYh9l-IFu{xM`e}Tl!ct15-U#kW40E>9#_HGN`E}px_gFUWb>`3E$ROQ&8)eGR z@Pr%!YfxCjSG9Purl>BsM!8n$&SG>+)WXbnWUC*6%&}}^(CV;Zkk7Xn!ALHil0VoK zs}uQ7Bp-rfxFi}fbogL}Fc)Nbyo_tmC@4Y#GR0xzxN51R)jWtDe*>MEDW{1}Ovukj zCngxy*g=8{Yx0OjK9KilWs` z8+Ue`bQR=X#~PPC4FmT?%f;Fnwv6(Zj`nt(-D}YHF$kgP?n52P*q~bUIy6%b+&UG? zkJu8LvQ~o1u}Y&?!#Vh;t;tEk-JkUfqW*Vik}Zhyq65WH}# z=IC2j*r|vFB1qaXgbK~C(<+(YQc+ZXX3@}C#-XK{X3ftBh)V3`h(i?k$s!)1hg_hU^Q`dQ=m68NjU8>wq>|cKxZ(}i$S*n09 zWl=Q*!?6e^l(MFMH5o~H>6b-3imQean;Ak*H|{d6p>QMVhj8275^icz(P9d{iir2G zVyc(Eiv3ZSIF&itY@KDJyL8>~b+E$j?_#G5y}d`zZd6bmKxap9~FWVv?etv8FO3Llmr!DwqMPn zki3xWI?Y%A1d&?7Ehjl8Pr93&-j;A()TySftm=NJtS=|!cEI~bHg#=n&(^~UPsyiE z+jhhIMzRkzCs#ZrKR(WQN~%tGJS{oPA@5h0Q(gR&%=OvqC2!IG*>-Ye#Q>SYJ5i`4 zuaxaor*3+iRC0FY944vGc+6r_*UN)u@(Q}W*?_=WGA->`iC$~P~OF_Ky1R^H$$Lh7S zNpa)h1#QZ6H60gczDc{>BR3mInm|z4*hu3*sTR~&5^>r=?nm(M&aTQ8bal4+LNfFa zD;HL}U#E8Cd32|!96NhQY@VG2qH`@U?G6@?XJ=1IiXE3>)?4TTOFp4cgu*4WSS%DPyf@EHdj`H!^_0c#E0*JEKV*3NYW0z8)}d?^^w5J*#c zomgCzYRzSV5comUAp&hBB6u&q1Jf$(G`{-aKGUQt5s zVu*~^yu7%5F_l_i#bYmOZujsSttw;s02>V{#t@6mi{q8{GWo{hF{ZQSCQz(Z{8uu# zkd@+;N4DTaJ2bI)7V3Vu%Uxjm^l1Aj`^1-mg1x0W#C7*%VxfhT90-gQ8#lj3H!!u@ z_8PN2kM9e)i5h}7)z9ECbLiI3pmvgc=GK>c+BlSJ``&*QgjbDpiBqf{DEE*6&A{sbr z*x}#Yp(m}CRCTs!BAyN3I@`C3OVa%mCcOJxqhX80Zhc275huFtj%?F*mL==6;3=vL zSm1@I8aCsS$w{I+VW*=4m3g&->n)quqa7G&Fo*=5_*=tlunLK@lWb&;64ZmvCDpox z<*9b7x32ocX=x?EkB&lvw)+!#RP#jG(Z2M1v;ZcJqPys>g74?O7&IbylvY>u<0IT9 z^B}>UmdGBXFNH*ftBy}}*V=;z4??LKO4cMQC&^fFdUIi}ua`Ik4cnhfMnrma39zNF zB$_o@A8`;#)*=ofi5f-H@b*wsh{q=A?W3k3?dhe`S0a0a#~N?H3rN>So;;^wG95pO zinirzduQaECu7BrTHjc6cvmUuI=uY^>Sb5hayXs-et)QXy0Iy%FIn!dP@SH*tyhk6 zq!XS>K+e)+or3-T3sU5Tsh;rtQ+XV=mQK;ZKAKCUaiToPr8O58U&&NjndKyDT8^Hq zXxAJm0Rx`1q{yqp9zK;P!DMcYC#hu3?MW(;)V1kg8dcT^>GR4Y?WoRDQ?;K;D3OHX zAbC$yqu1YSq8dEOMNGg}8;i(MWkOo2n39o*id9=~t>LSGJEb5UWa5^t=|x=R zi20R1*ALzCBbSt$hY(fKVPt3@bR^yPM$)@DC51`+YFgWgplTqP*_e|)9^WK2qV!M zV1%6Whp19u$m$Ft7NX`WI*mngN|EdCm^4IQwvw{<#!p(jZy${)2?sZpl}d)LwN2FJ z0UyCcmx!Ev#BT}*X8a;ki(hgOTksMwoyaAX=%!;qqC^&!VmbK?K(y2T)D*(k`=oC9 z@esYSsS6u$dF!dE4tl<%t;QILJrBMNeK zxx3pew$$7td~}re&Q5s@cQtiet?p`h3d)-s?Y9Go`+A}%X zLi0jUwV8Ad=7IY}J*z)e>0+-``wT*U;qx2|zIj22+B_$bCUJ>rl5#$KuGOuth}$F6 zGi-@wCZAh|4e8c9?A*Et;D6x?Sm>Q<)H|!V0o-wKc<^Xy@vCZbA(AR5CmgKI$?4jv z(GMX+Q0OGAdXTmG4l!MU_NNd?+0USclZ@J3eC>Vzibz%oOUI-2$s~>HSA=h`jA&mq z8)6STGx^y{v$s;Ic6;qwn?9yTwuQbFwFF_Va7Jt$;fi_B`()in^I@(b=-??eXWgETAy23hOh4{vus-j0%CXi%q-C@)i7BPJ-HFLF~`n# zYYXrRa4e+HJV&=xn)a3pRu$a6JmTggi-Myc29fRuyIMtjO-NMxs!`L#qNRv(`Y0MN z@_iSNhn4EHU@XhwXQwVyc^9fFtP1tLF{ClC+6w!C~BM%ssJznb7m#1qDMBR$er4~I>x2UzpdmV(Bz*T(pWfrtXgfb6bz78UNv{qZsHR@;l zZkP$e&9~dW!GVMD#v83pBCh%Ug_c;tKRkPI;h=#}Qxp^?dZRe-<0A3~m3J(ssDVx> zVKrPtntT!3WAV;&wDpy*PB@v6QVS=QP-5`R`e@9~zy&0C)j2=sMiw?JT2e_SFpUI> z4A+xIue`W{!|Id%m#;*vlapeiS~-ctRs|=4=n|m?#nW`>026F_dFb>KNkbiq%5co-} zpP28&49DWsc4m_p8O@n=dbKh7okmB|xzs!3Zt1Rxv>*4kJ## z)X%?+r7Tg2reQQmuXFO1pyxSBq>@XV`s+?}0=?A<__cF#mJ;>^oh{KKv22q#+zLGz^3SEgc#*pnTf87pR&w8SbF zZoEZDd1x9MWs1h~F1726E$;Q9eOe8y+xirb{hqxx;%k=2+qGo`BFCM5Y{?fV*Koe3 zE6hPcAe%)?L{t>0l>2?o5oO1sWeYY~Jngknkxv@v}IdvLLN@sA7nDh)TxS z+(sqfYZ0OnNGgbw0!YkvJbq=j6#d!Tuz8D0qT0PFUeTK3x;kPUPBcocu9%pT=!_xm zn742=mOOf8Vy5EB*lrt39X*%Ul}d}!s?(F6S#{PS1RLN#{zbivf$sH z@R7|aV2w~8>gG)^VJ)XCoz*_@q>)L;O1@d8E1zr2x#lu1{aGciiuUm?(}W?u*z?uu zcn@FR6LMo+SGB&%dRlx2Gzui3lqB-a)AeQqzs#wBxlVr#hE2~>93kUS8|q}O5NOMy z+xd8OBUo&If_j}(u;^tjQ;_qrn|&r1#RGB)&Wo=k4WQCt>XxE%ngz8@yP%k;n!zNK zRM>}NKeLNZqeSaS`qxtE%#(7pBFiN;V0zG(b>5xE`M@CM99<(}xz(26ag< zHDhT772+nuAA>YUA%y~K<2`zB5=m(^_<*0rD*2O3!kj(uqjvpNv|z%CI%zP;bhWpt zuBviMEy(!|*l}tDBChDEgSU`@`$EuG6lPXpu87#!owBosrf3G6tk_tO zenlTM{7(Q!=mrXZclT;-jOcOJ>TH&@nxbzlbywI>>inc4h}{*6j$sVnJcjML5dV5Wj_hK*IeJtBd14iI`0e`o*M}Y4oM{D07Xz z(Cddyv%8Ekcj*gvE*D&wjehB+AN_u{ydV8OX{nfo^+nYE5^29g=QF!hHt|olI$iP> z!*k}F%j>N=_Hb6}Z9mZ~gbR{#h#%pF64IZ%P@-_8)*wa^Dq6UhuvwQK(xO}D%g4`F zni7EBGVRt%y-~9^HhZp`D3z0#oK&N4q>8N`;-|J6b-D&N789t!x$|IarG6T>$Oc4q z^{a)otjhyKuoa(}JP6V$P)Q?ewC((KP2bcVOBR9;=^d16-7c0A{g$u%1R~&tZfz}@ z9JCV;Nh%N=ddQFOnM$+3Hh8bp17lf7!jD<=!b0*&)268;szZ1S=z?i*N$+}b6+|@x z!QYkqM6FU_qa3!8$CS7v(Q1}(&5HlBY8VTa4GfHg8JSArT8v}Vi;G-qGpoi~0#w@^(D@WKakmQsNQ|98_WwQ-+o3qpK#Of(p%u6OCKI$dJ#mDgW8uLMfhnZM9 z%4i};B^8V{md31;$7q^{LTvUOBWldDl`%B|rZTD~#Fpb~Omx+JL_0#^+s#x`j0-lz zCgevMWD`?>C8MbZA7a~hF&#~CX-|+?@$I=&h0|GE9&gmKFRd@^iWvYmx_lPhZ?*&H81aNFg0E62 zb-$TcB7)LY?4!~ORwZS5n?#iTNvWzJ3u0H^UC?IL?iuWhGKx=V?vIlh%jc}h>m6oT!d`hbQ zb4To+(U*#IKT*A1w~wl;>r_7_t5fcubalFZbH3;%hu!w7O?JHJV96-DNB+K3?~@38 zraXON*FEX!4_Q7b@$--ST}G@6dHjr{xLjC#vFQ_w%!y}RjAQ{meb+K#YOy+16Quj3 zZjPDN1tl)+Wk01IG9|o_MFma@FGRt8YVzQTVP6>cn;Q13Klst_n}p=#vwsXrihX7A z0u5{0l(tU_kzi8WPvLX#O?O&CX4HMDxHhNmuXS}#fZ62wLKh8vD|m8tFcFc`w=* zLL$DOLt}d18o&Lrdm7Qc)n2Zm^jjGuU3GHPcc%Mm`0eGN{xz8tL!YYdx1`iBhW+UG zi+%0;M1NIIx0kBg^-VY$_i70jL_GafZe2Y6GIToC3nS=|wb*>Kw^rl(=gWxOgqs5q zY=eB42wxUeTy9>ESGtJW(RN-;5x6bGmkQeuAA^03h1hsY&2^k6!541n@5E$!akaO0 zs#&S~?PuoPbs%J0;BriAAiz%ay&-N23w7LL*$&*u>|Z=bwlB|)EjdmgK3Xbq)6pN+ zSner#%!X68TrRCIOb(3k>iH$o^?^OB0qp@DM+iGG^ zgmy;Wm*duMWxEQ&y_ZdT|-U*#v7-0)OrO^1k{QZT&6bE_y?nh4WSyg zW+*^kUB*5(+ohVzXve0Zo9%??s^LyZB7p#fc?#Qg?=|Wa zIM6cS{7UrrtosiDv1uvBfDZvlw9!Q*fmjt9QP%)GdbXQNI#y(3^KWc@p_Nj=*65g~ zsT~7t8d52%lR%{5qipQ@gpISY3A#qwh;uRzm3EOzATsY^J4w@dQ}Xd6L=?#~zqF`R zE+Y12YmJkT7a6V8+O=lY&+`nYFpq1HIIYA?L`0nLbrArWmleCzLNg8SY;CR8KJOM^ zM9wiis-;3!s~)3FrP2|x=nxaznS(aPbt2a7EV0pJAkZhsT6?BdSx!PN_0%L`+ie35wmx5A=L5jdju_pR%A4#RCP-IkHnY~TBtNMy6TlJ1y zqJkV5$GgwQ6}8=;LJkAFDr{p$W|>fUcSyn}$4tVe?1B-SQt3Z(OHbq~@(vugdK@cm z)ugfTT-1^6MS(*}?hBRfs^8HXnYVNv=djj})t756R6HaAEe`;V`xlVzKyVz@pH|~Vu`Hei$5Ha+gfzQ(RU9ONlydWMVLbx3G;3mcn(TgG%qoc(v z%rQ1blY}l`qp5J*mewgm=2J(D!)~l1q7vq# zYgD5z8i^xC=0}d;(X@*O@wof|MQ_a98Ehe_oT@hvvoW$LKqY#ekU5;N+cOK3frVlF zW+5otJBunY)lCyP;a$=LDO^w~s&S5z(-O9hW`;Uj!CAF`PRYf@jQ}3qg;@ zw!7*6puo*va-#6T1WLU4K$dP7i;Ib<>RgPa;H=~O_y2vu0876 zMeb12OU-(W z7cXK#Rz1da}q&j#DYg}h*t*>0#S>W9V)cBh*6I& z6^~I50udN>^~&glx=Zj_;-wU-z`V^3htz zMZ;cPN=P882<&wSUWfKlAu+0-?z@`Kxpwc+$dFMYGC8iA-exb9h*+*XKVDhq%alwd z5)xB2z0~TpX$xc@NU5Es59Ip66QmTo`CQts^`NK~b5XJTP+}6k{()P4T*XJ1rbi!) zQLqPgilVK?3$!~_S$jRd9B-GA16hcYx=7gBLMe5B3h+K?yQIxqh%s|ea(!ZsBL&wt z<2cAuwN|%sdb-xYR;746PqeByX_>svSPs(nVg>gWhr|l5wvUHyHM!bk@kl5Nlt0&P zYkR~JQ}R%xc(h!q6c62{O!3fFb+Wp2JQ7}d6_0{TvphS5JUa!J8{#~6`B<&lW82+) zx`G!DRkPO-Yvk;dUaswXH<%ZJ1={L^^@Hle@5O^8K$VFbU0W5Pq%+%s zQ|-HQ9>hTm$)hl~O$xG$i&YPekngC~I<~sSD}*UkToF`TSbV8B(Fi5{H1L%=t~!Em zn@Bv4tMzu(cT=HHo1JR)nqc_!SnFJj!p7@oa6QEGGCtt?E{S>-SWr5sw@vWG^6R28 zNceZs7(`_6aCXxKBz!t*0!pH*62S8dxGNqd`8cPM1h^vivN)mKO|`; zeBIkH#JF6t>r=y4b!zAYwNBY7QidD5K-j0GH7rT7~9|@ILU?(j#Ze4A=%)X$BVV}>-7wc=dz^1ac-XEg0j+~ZKoyN#`t!dZL zF?=N@6Pp1xgeB|$|SPe(YC%+nX)BlS2+2!&o}!X}n|yj!34B2>Z} zm;Su(M8JoDRqix4D&kl+EjIXloQ_CB9Du>6T{_PfuRcz8f)CR~WQc9Ck~_@fG>nrQ zMo8ZvlA4?~J4sC`o}_1SZ7{cVVQUFKQl5deDOKCGT9Xve_p?eQ?0gfKRy`2yYQ3lg zi7R`FJdSh;lZM!I@*yh4+I{#An^3?+AlK}it+f>bu?$v0vn;;ur;kK+Y`^h72$^c2 zSf&uSB?hHLRdH|=w?a;1AS`9P25}M*_Dx78cC~`ZrLCdUkf*DvW`+AeO1Hy(ASf(x zh->VprOu{c)wPU!AJ~iAnw|ze9v^NKp9bH@$fqPpz1lYO@rV(wx1owt2l;7@8;K~!%e1fSG^OhUBuaZfTS;V$gkbQ(!2yB{u7USPI{VPSSuW$3j z9_v)9-tAOSvxF5K*^a72{mS)IkOVzUE2NJNVNQRM* z_(d@u&w{9J+xy07a1f6qT*jMRD&o`3f+EYbW?49==|onnVXZwVpj~89p-%>fsEJHz zzJ0pVtiLMyx`Lmuoz87KQ3+~ko2}41gD*I)eVmOodmu>)dh`N1xc6_^>EmEh4` z(+LUgR;{^QY14MdJ_$^cOk2@pgF?aAW+xd_)ln?eYWJl8x83e1S=(~=k*cuW(Pzq9 zA90D8OTZcs`pBpp68cE8zm-m?@`^l}l8*L?PQNObo*jGG>qFgaVtuHfO)Pya?IAgx zL#}oy7tKDfS!rXtNPQh=+R_sfgN~?hA6i!@*oPL@3HGhV*0-3n*2r>D(h^c!l(eLr zPD*NeZa1Y5Eh{}0&H3pUt9?*q$zLC%H|(d8shoT3bUr z@KS9ZXOR6jq=B9k)Oo71hP|}d zbcHzXWeg70+GMS^dpABOAh1wt*IPImpNfda(<}n;w&OE` zaiP{%%I+EN?eK9 z3p_`0g(Lc1rO~S)%y&5RDi%WB!(*GRVBdb6!esqfdEOeORH)!;KDDfnAuuu>Kh+E* zAoM7_3Q!A`X*vOsJJo45XuD&jiQ|IRN`t9RY*I1m?_eTIje(NyRB`6W>TBT)a;2a! zFHuU6y1*4M_!ySj78+iZg4A9VdcTZXl8P8Z+A3NU{-$bO+Aea2nXDM)$o`%HB??>P zxU@NHTjo0WhQ{~2L?Epil7ei`XeL2J&@bbEKoH=5N6PQ(5 zxTSS6ks_s3Iom}Hpj8T2>i{jmhB9pIgh0?z>OAbVgtH&=@qu22w!t&FHFXp3+AKpN zobMd1oj=v8w3qX1SaRY7RiF)0OVYTi#*Ux>Gb`D5Y< zSmKFa;45BA4T?W6UW%{EovXuF;uSrwzMNBD?opmkD$ghQa{(<^n5eh0Uci&2-Dk0^C~rUaQP zjUa^Wk#g7rCi|<4jA)Ug9nEeqeaST%<@r;z!=1csyG3!*u(>>Wf?V+qi?VpiD|rDc zrEB>Iypph*x=u&7Y1PL~7guItJ&1?Wa;N62tBBX-hEF!=nrBaf%W-k_#x1bNO*6wiCqBRVd0no;#K=m5cdf`Qn&G zfOuNW%}wNr=!ByaGy4M47jnhiZ2oRf-0}I@g<`%`nlE}LPZUav^Tox&{G4ZUeta4i z^f0xUD5)$>&gAB%^4>IoQ(UqIsiIBgic>RrqdZX>oyg5hm8Xk~ljWJh)byeQHn}u2 zV}s`A%f|}E#iiU#;hr34cA_+qKSo`nwo>Uey6p5If?iQncfxZgQrLD{3U#IWVc7_7 zwc{;P!wBcq33}MO+{1htF%6ukqA)%eL5~eg_f2*uj84eujgumD2R*BX0oIMhHW1RG zYez5lWzVk=kDBP#h#L<@Fsemji9#|CE2buSQ1r^JRcE4IIg5qPHFgyf7ByUn@Pt}z zvEt!QY}D78C!z?5C@$bzA{Oyn`Afa_3U*{4@=Mt7moVy=u+J~S1$P(fF3nwxo4zh( zs_nRxg4$-3fFhkB!4};S4D+?PP@G>V z=ZKhkx?RGiLPxo>jtY~q;01iYp+X%Pi>qziEn7NU?^Y3^Mq{;vv6=H~d=VIT21tR6S0#}OQd5m;%IajCQAddyP~h1xwR9aSvX*LXiV1@TVF!d1R_14f zcgf^Gffm8QirKjC006uQ*O(SD9r*;{SiN?ZPYt9LY>3E0Lunmh(8TLJ8BBOm)tX|h zY#=A*$~%cUgqs3e-KqJYEERayQ)nSHBXPqnV6?%AOdxF%_;4aQsblOz|I&GP62+9K zQ={gEhdHM)&VpR(&IQV3P$@w9ZZnu$MliP8w7ATZHAD{kPuNMY(rT{@`+`*g1}{+T z;YtG==S%C-u)_yww@#xI2yGBqp%jP~)SpsTRmV@t>A_% zE+N0dgeAbNiLY|lTHEaKYr?5R@yrj#GOS({$7iPqy1TU1;Gtl~H6Rh4Cd zO4m!E;by!mNBmg~TCJ+B<6>|?0U8UFl};D*l@21bp8AR24Y3x%Js;3etoTBGy*AP6 z@uhb*q5&||qV-26Yf2}r60dX+7+W42xEC4$82M*YC5df7M*(`u@k+friz#azGejw^ zTBC;RZA7*BBugr8alLBoVIq!b0M~~?reV4-iEkp+8Y1a*S6j?emc(eA;%Xb?_N!`i zkXXuB0TZvP#Z;2mSSdJGz?!eEz(vlfM(b3i!8}8n8>zZrnJO)-bwZ9w9M#tWWY%i9 zP?x*V0#lf22XM90Y}Ojnt(G)-3nd{rZ61pvO5NTmCk(oC?z|I-`gJSkEQd`L4+`W? zpfH|)RKQuwI1_zvqyh2Ct|@wnqH18At>Bz993HxBgZWi7>tbIN6@ayl%(8F~9pB32 z>M}vOiDEi=xAa%_H;e?ecC&)852z$NlPgLnb(e+KD!qtzSCK;`%j)G$!vv|HkBD&w z)GWeWOW^5L#2Yi_S|{LD&}vn%-sth-5p-uL*64__Zyvk;0#yp81V@M$&so(d6V_zAwI(xrWKn9Vq59Mj0mS6z z30FP1EPazPV)&+EkX-jooIuFEcI&)vI@+11@tK!LCGoLt3dYtu1=BdVZ2Vd!SDh9r z_}b)wx71wsNujFbXr4;6==+^hIS2-I;9#}EDS@kjciLQUjVEA~(TQ_!SclmfV>2PX zd&!JaEeah@*Cs1doZ4lR@>VT7UC}EWXe*Tsb7+*E;8rI)&7n(nf>V*~6b~)36FpVP zPS*5C13Q(+PE<6<25M?!gEgI5WjoC1=2PAt!g}&1@-ik`2HOZ}V203}WbU}mL>Y#xg8lk1Rl|oB)=!KT%R1GcBLp!u|PX*C(XgcCdajJ=yu4sw| z*OWy|vGj%c8rt|vkW#IQkAK2bl`AjQ>Fq=nTFTGivsIaq%f@a;t|ZnAZIBMYPW1QgN<4kN+np%X71N%we55#%JGRxnePQ(m&f$DL0k(Pj*`i-l07(W^+?>c^Cs` zmUH9dOU2x{SHV1AVZ1z9$j@MiTrB42rWU8m_mpP~GuRoCTPl@&$-B``CPOW5)%I^n9_9pToypwrRv=9PVDia8aD|PQ;=j9}TgBSuC9Js2I>Eiuh_mgFP#f zjqe^AEx}FabC@Acl^2Uk`SKh#vrNm;ISQ6VCN?JRtie!=+G4CpRJKYXG9R>KhmDoc z5K=BL?XdDd9YXVyqg6Rk`=~?VNV^rDqSu?+Qq!BQMMQANyAG3acOu7BY=hwihIyx;^4hW zR}Xu-;?!3=#i_BPlnL0dacpJO2?{Zap6ev4rz(VPSxUd5biA-QKF!?+-ppQh_jsPR zGM0}PX6C1`CDSVl2KZdTYtDj^ekxyPdo`Dec*tRzLDMalYLAuXXOd8ve6yilCOI_Vq^H9)A8#2gwg@nVsJ zJ3FQMB{W1Z?ZO6tEUoyv0~1pVCB7Wv?Ilm;=L^`@3re&j*~dR58pIgw5O!%K zCDQ5v=X(~jZJ$gfSjTZzIiE~c^{i^;i$$y^`T9B*0=4!+2{kE)V2sZ%%`IYC1OukG zx4STpiq6oQfk!P^AA&Z`AA^tJm4Q~cJn(W86SSY(Yc3>`yylU-Dn)q8OC^69D7r57 zv9vf>X3gQjibwX`J%!n&#p!67(T2zT)Wm}}^}I-ggELvZI6^ko#2)#uRezCLxQPO6 zG4-+eNwVGJg_5@_U`u@Ap7}X+j;I(=o&uvB6=AY)f-RGJuuDmB7huJ_G|KYw*@iWr zZfj+dQ-J_)oF+rz*|<}LCA>wiR`uwP;a%72>%LiM=I5rk+4JY0EIPA{0a>JJcRM$h z)yD*vdt#bI*`Q4b%6+RXg?(WM2SL|9RulnKn0VXwxIV$;{0 zy&kQXJ64>}O^oMCUhAgptVVf!8q3N#9|Og+;4}@hVDotY)C zs7gjT4_(cNyAeWC!#@Gd95Dqv_VjH9uR9xs%cD}TL zR>DGzbXm$+CibXmF;8lB3>{->wlF~-FCd2SwhmvIhj)lh z!7QqtWD7%wTdkvmokG@AMTH$eTT)hnEriASB}~bfALWq>&BJ;x{Hqg%S?X@SLxRkh zhY|5~#Ku_dsgJv5$#}3zXOfikM8V#PzJ)CoX7RNP&2Hh@6~>~?EL;tZ3+rne`F8VM z8f1%(73LMI;g!oOz)GBk&#SM1TS=_vlxK4g=F+SiQzRGWypyf*ZUUVHixy?qg1B8! zo=tC6FUm^u$Kt~Tba(-ivV0lJbj-Hb7QR?=TF5C5s+CBSR`e(uN#J)KQ(YxHkLZ=f z`~udQ%LUAwikLsUwELkTxn^6B&{rSS&6!LWPzO@XRQRUHAyRxFCtk|wBgoThC59vwMPm+&?=k~iGb4P8B6jbD< z0N%~)A&)0B8@IH8KT1>cB*rv6PU@XNBjd+DL{Z;^s`4I7>wcbF7-kA%$j|pFbaLx; z9Pg1kSJ`G1x!;6sSkbmWc%;yNcq>90$QC$)M$nF|p@FT<7M#lk99^Pa@O+yc3*FK& z;LH-UdK#S&>eyWCi5$^Yq@D@;nAeY0C@2Q@z{`L|f;l}WLQ90?kerHIh?8AB6q;;- zLX$^sp>h$`L*6|pDhD94^S!>PGLt($%%tuAwU7~a1jl%=x%#wzSV^98Kv+t40EP~y ztz-WY9UjHn2%{U6M`W3(;m{5{8*1~aZ7j9}tAMuS44PyTo3yI!I=h;I&RWaTW&K$d z96$x72o}0F3(7uf5BjBArCnVO&Xa4@E1lphmV^Y43Of!)>1YN&rRJ)bOmY&Fa0ex7 z9Der6J3-wM&6`g!$6G(wZdcAbFnNjqa{Xa%O#OSqhfLO?w7xP0t}$P~-wAV*Cx&Gbq^w-mGZTug#;L3ccaaBQG953#||#UywxCIJqi-w*RcC+>yX zJQtII9o~N~CP6`*SB83MGsfp)60}8Ec`haayeJVS;JKItJhm;H4FCTmCIKCs!*NY^ z#RNHNWxnKr>8VH=LkN(CN_Q1sj@UOPk-uGAaX|TcDdxV*N>*`F)B&Z}QvEbSHz-*N zhy|j`auoqn9B_(GA_Am&q^KYkX^TY>QJ{hgCzwV|Cv35O-V40cq*2zHd5xl#l5d8SzR2%)6FI08^Bv5E8j{2wMl&K?{gAr$TUOUIgi45%zd1 z)6r@i$nCB3;4>V^pE1X>+g;@2DR$&Osxl=p_8nvqq@q$?Rq0YrDBR*qi3jqL*kC|| zDe82Z;)K?#oG(?Qv;;+|TyR^jTuG|XJrm0sbP)@rSjLtiE!eAlGMg$!84m7O#75n# z)?UF?6%_ww907~5zUiAj*=Au>s^^s)?0bOnK7(GuCj<`QWUtBMpeSI{T#wxHw0f>f z4RoyD?)E4i4hzUiO(N5I1Nx_<*+e3R=k_3AXW)^+1G7w55Y*e^K}6TJdEwF9@4Rz3 z*1wVc2M%+DdoQ7?ReHY45xtvea4ifE!NqI&HN7LGd-yv*aLIe@fgsbxEh zxKOxJNQ0fm;(nE{W8%&lB51#rsdQNeR;m%@th_wBEFlOn2uMc-*_lR0JhIt9CF4G? zj4t5mhRh~V5ro>RzXI|=taU7)$hhtSS(o(jWwE)uf+%Pd8C3(W)0)482vWG5yiz`W zZp{Z=USq4&eyNDZ->_wNr@VZ?&2Lvv%*DvYJ-ji_9M4 z7b*9P3lAJr*6?Kp9~r>BGXXJBt@al**61z-M?Umq+{)kybm600+PzlLq>l+L2Rc_b z2axBNKpq{qL$T{6=xn7!T7`V0Rph6ZB3S7v!E>dZoQoTScq z65_@3$SMv3I*_C5Fu_HKZDf$xo%0=Z{2Kn?ySV~{Nn9>h&q&A_J`AZ`l66M1ZSY49 z9y~O<_t415zTx2mdqY%2L1bqhYVweJ#8@W zfXmip&-~Y~U1S)0GKO*PKK@?ApJ8L+-aD2l&Y=Bo10FxK$$qD&BgWn*?>L2zgUY`n z%CmfY(75->JK8$I&mi%0ZhA-V+%K{C-{+4R#@jX<#(hox{vDIb9UQw8;RDove+~wp zII2QKzR|rJa06()bwLAhdizH-;4t3aaT0QSJqKs-hn0IkFZWyE=LzIf|FL|B^m1>z z#4vvG6^3!Ipf@1t9p0y+8k>;t1!@H4AES5Ir~)yJop}55ss;jodym{XvR9Mf8^PZ{ zA>V66xqEGui*jvB-^n=}z?E5!n0e|?(?u{=tyO%t+Z5VHle5yP6E&Mg?)J+e4 z%X}B*{Pxqs*+<^W9x~ZSKEWOa8J(?o_NOCK86A55_EQ{-bkoAxHH^1M{?IO6q%tge z{`ONS{SiDo`j@Z!24rD8^w(zgkr$(Ck9<4($iE}u6|a2iaj;FD$Dgc7Wn}63!Ov!Z z1MMQ5YhG+-AHEDEA3HD%2oWB@8wr4NJowoo&uo77*=OH$hQvdXefY`j!=J}rCP0DH z-6;hqbNniDfCdIXmPek`X=l{zmNL_gwcdt__NNW7hljalV5g|HOjc-3?c8Bb0JpA84My^M{ z%j5;E>0XIc*%bf7Qy=<+Vb&C+ij>TiE&K3yWb)v0XUwQR|1l%adRC2gEH? z2~>>b;A)k9nDh{(BgZgu5cJzm53(G*7i1s)TPw#PauD>vZ$8+)0;TZYn0@%GJO}G@ zBTqi`@eQwdW%(%~U`t+~Lnh!*Lq79OyB)0bU+3xgZ9MZ2cKXvBt|yR{?J>N742kEN zuOpkDey)Wy5(F;-dLatFH~ZjkAr0O9qDQ~`g>P*Bw}(Dze*Rl`eY*GcN58}xlJ%z#U5gyI zeEPu;v8=3bP~zhc{r%RbHx2_xeSirYEkeb7YwW+DeU3UoN$Z92{lOD z8yltxDWGr`DR+CAvfO;j@QPSOc$u+^YXCYgyz|b}*m2f7bq8iVcQ)#$I?IjQTkX?# zl4pjLBL@zg+B;f3wEwQr%Av}s+VbdVb>;Bh(dCiR!+R_H_pVe9S61%YJGx>V=T4|$ zWOf_IwPS|C6wTORPR%V1kB=N09@%%tzB~2~-@dlCb`HNsm$4p;znxAEzi~?wre*Eg z^6i-FRPVq26uSwuef}l;kl5`tYcCNCHF%}%h%bR_->vt6*BZY4H2z;cTWPP{zJK`k z`O)FqSDG!*q5Ix$$4<=(+m*KUjyvw`w5zOQRpZX34kqDuo~bm>)b4EaSjdz_Kl^S6 zr~B{NcRO5o1gyVvrPaFq++pq*y$22@{mYmaRaYx*W8iCe+0a37<8s#+xZ!fLjF}A= z_nIB7fYz4LB3-<1WPdUjcd%mE9d;%*5bT*}+_aHBTY!xlh&<>qh>mA&vfdddnXMaG zu4Nue8Vm{+Sn7rzSU3zGH(Wn-3fi^-uOkQP{f5E!;yshu$eANfS!SMk@VF=V*q#)Cv|6KC1Y_eB?PAcT#-Wgfxca52PPp3KeQs2hK# zs5a=-8wh?1(|lv&?+jdtj2o6v!eL|Mr!RXmm5=>sVBgsIxyyc*UMZ1YzqtJ)GIeyH zvGLC@`>af**T35S6`6W)zp?R|%l;X!n>K9RK-O>rPOH(ueB+|mZevyCFArte%f#{d z;)HS0o35S(N@l}`6)d}v zQSVLr%?Wf2R_}$viTn&ZzazuSIpH|&ls_?In2ziWyx+)pfe#x44lquB9nDW1Ha2*| zNo<}8kl00z1QyF+>9BFJCmfVEc_x6;X0L=vU|iyv0E{gtooULZy!lg7VhF4^o5Sgh z37kHdo1c?Pqk{L3?vnyj!6W-dAux;Pta%1wIWL=u$3>G%je}1Vr^aL>D7gVWAsayf z=EZ$y}9F zpmx=CU{2IbfhrYKpu`bZEghH>wNjvr`-?0#>*l75wMLl9ot#I&Y^7y+D+u@~)IxLx zR(Ap3kAGS-2>8f>0|&Hr5O9D;w1$xIg9o&R5a7f3r?rHDVj2$}QZeynoC>pzT zK*_jV2P_&_=zt|-w+=XF4C#R5#+5qYgmIM)IBD$B0rwbJ>wppC8Xd6DxK;;@8pAqZ zzj2)oIAAuLBMl*Xw}8#tk~)F5^ZWu-CXr2Nd%ZGS#?QhvE=m4yOZe(V=7L zbtUx3ym70Zu$UV&UZ8_`zT0#ljws@Q=@8+Yi?nf&D97~&Tm%`X~v>Pba9 z>L%0n>S>Hc+?P3RjOYolDN8schJ<~3LMcCs`)ClO!5GyOFwP)y&^(UX8~gPX7+W0m zJfH*Vq*~56r~`3&u`oYj9MYjB#^7Nc2!WUA*uQa?4xbz`Ug&`AGhXC?j2bU?K=vCi zaX=0jFLgi;8ZUD|4jD%rki$mK0lCWQEd^MJz94Mu+08 zt1+vC2ptzx&lz(%oav-7uLDVkjRhUXknh%E;HRiVaD5r52aNlipo7N!PS7Ev;RGEv)|{ZbjHUy$Z?DmE zf<}yWCupDXfD<%ow4I>+Mn?zbPvplDGS2Ag;OYF#g3;4q2q&^+oY7%C*p_kD0bQJ5 zFwW_)+!O`3JFf$maE-k2Djf!PjPG-R<`+&H-><_E1rKb$S_e*I%4NJphau=x-gvDJ zL!67HSu!vWdcj%ef1REJCE-KIBQ7{so?L1F-o3^f^i&oGV2-I`Zf3;zfq>L~#v21t zM~z1VQuiA_7?66vcq}0Gpz%WisfUa=1*9G}emEfYF5^e^RJs^?#CY5d+-JPm4IDLo z)D7Hk{Fobf!1!@D@SyP)H}H`06K>#P<0sv~yNsXGfrvVV;By$$ep-iPD-}Y{7(b&! zY07{o3U75lDX6{iHXVrJ6=&4nt^>Khx6k;0bg&4Yhy3r*6EGh$-su3rb{apc!`Mj0 zd*ZtsDMfT;F5i1xG8;Zs!Tqy`(gJ2=h3gc;4+Qit5o%~5xvW%@q zakM_=N(Hi-;nS`ReE#rzE;yTSe8vUlbEDsP!E=koAGm<|6XRgr_^c~oHb0A-ABuV7 zb6!aZD@IpmeBLXKyOn?Fm4tAP#uvO2&=(Lzc6`zJBd=7;@BCx0RN=0E(UnHNC!Z7k zi7SmW`6X{Syi)|i`cqfpSYa-Qgg$!|DdMDm+#ucNh$!-ABW zrVh+4A!5^9{=_0aV0ffZ5GP~6D+Q{yfNwcoI9T*DHhQHn2k9b5%4~k3fYFYEg&7w+ z(vBZLZftVEW^;uZW3vMY-5$raJQRER5@!;klEX188e1F*xp4$q!gVUs##VO;(n5Te(#?@YFlW^K)n_T0_P@11yWK;2LJrelD zeb|x0Z0B_jAeI9d{COOXIXb(RhgNV)_$Xv-rf*iIDz<@Rd!n)VSImL!Sl(t|vJe%7 z0WZ0I@YVQGw1u|g3~sq|aP?}#*xHdOTSm6i+AtvJ*NiRuF1rM&8@8^smW?f=Tbsb! zw6)j7E=RoY-}*y%-)d|lN?Q<tiu@{FjT3n)oWUwa5y)XyXR@gtfJ5E?r|7m$FRr zCrgMjd9=(U56b0dK9_m9o`{&5h~R24d*eu&nLjSp;~fdq#}TqE`coHHkvk!t@jT+ChNc0>LFImgt6_G!MD;UIjZg?zJVj=2!OZR zz$x6Mh?pIKUV0mYZuuZdIQ#y=FGEb(FF<734>BnmwDH2o{uX=LU~Hp&*$)l;2C{9b zAluID6N5GEQ{XrsRdGJXakh$`=0^4@2H3QfZICsxAK!8}HDh)+mG-;rWn1<-diex< zxiot#y*$lcvRi47;fRs_Bplh1Qbva7`W zAL?9uLFM9)R4)El<>HGv7k|RJU`*{ZvR`7aJB@9`NcK+$9snO(ejW@CXa92W^}~QM zk$zQW>T4=ff5n-~-a*3tYtGWvc5S_e53Sj+t6cq!%GEanSJ*>L-6s1@)~O&IDm(kF zfs0V|mJ)c{pZ&+df42DeXO)kCQTg~+&c{}^lQjEpmk`d@t=N^&1|R>~{wT4NiPnEm#^4+DA2&)|7?_J0Q3Nas@cu3GxDy!7p? zX$+GWzk?TVnp>t&kF7gI`5BW-eTQUVfCF|KJE@fH26JF5O4*gc%Wc_9%)zJeww+0S zE2nI1CrWUuh59@)`$)XqT7F+ zh+N6vwr*$bdli2h+;Psx?h#ekao)&Y&7XJgIM+tU&R)Y`_v|>&Ua#e^!^TcxB|B^m z{1Nf>XQ<#ANMbDRf-NfmO%HGW1HgFN&!rwM=zHa4jTep*(voA22It_9zZ{u&5 z?Z7^Focl4dw{yVu?X1Jz!QXaJCGJ!zu~$^W*h!paN6di+1h(r@yj-6>Xb%3e#pYp+ z&AT)}MuCyeaN%q@R`R@fs! zCyne84uUX=v24y9*a5zFeFQH%vyP0AE}$9ywrx8zX|w$8((TNq&GEPF4s5~c)r{=CxwQ-q2e*$>J1m%Nz}s%@B!04Y zn*+Z^%q=kHj+uksu$VicF?Uj9?jFe;ZUculy+UK|doqzdHAiIJ) zV<#1v?U@7rM&<7!@nv6S4u0J#|NFJ_U#*q@8c{x1{MU-|x#B;lmHs-d^w(RZQ-Rrs z%z+Nd+ck$~+nRl&Ie06!RC9~-gIej2X{G-V*V|3TPD0GS$sG6>qVh6UhaWWuAGE0a zxJKnI8kL`rGNjW!XyKnU_mGpb)!0ddvOi@G90HwP|BRQN*|(d6SKlOgdxu8#of_4j zl~lP-ze|dSHO0H7XjoJHoD>by>7N&(k&XBZnoj?srPIVu_C4mnn~1pwSe5^`IrvtK zxnI+md#}dauWQZr8Rew|R#yEYSvq?(Od*20kb3nz55u$bQ}&_($TWg_k|qFPejY zV)64Ojh{c&`1v!*4?ovpWWOxAVW&E>e{OCeLW9O28PRXzkqz@1V<#1q{R?y8HGu8< z2WawO_OHyr`)`p___|i=-)N;2e;oUdH6Sthkutm{0g!DALeCUbeK&->;<&Mx6SQu1c(X# zKZUSK@c&1MddD(`p#S18!#kFd^56XBdfp`em%rW22iyPQ#ocD?B+jzmF$c~;IJ-WK zmz%Q#nZfs3Y;MeOr-=I}7xA|Z+Zme|X9Szei>o+uY-BfO*myR$V;KSUU_LkV_nkC6 zUc#Su6VqGx^PcUWrP^-Iuu)}r2UHHnpiaXL;*jSVJBg$0rI~?i!O*Uo(abkzcV-52 zFOX8aTx0JFjlJEHJ%rC=lM0A&D6`}3Bt~BHl|29M9oXaAY8%3H)aNZ!s6#a~n7DHh2L~gjFOu+1oM$ zb0D+pEqJ*;yDu~NcNWq88qouSC?Dw$W|-@_X$S8Uhca6TZ!7N;{}+#}Pi!=H65Z_K z%)q;;kP76!Df^Pl;OK2qk}uN=IU))%c2d@CE;FzRId^>$)!&_+&kVlD!n<3;D@x{= z+g##rn|82ic6O2Tx|Q*Y8Pif`3vJMZx?l!{$;vVQ4zHQY$sW%P96>QVw-D#A$Xxv~ zyj)H%yB2`a<2vz{$04|EFLO1`IEMI4;!I{Y%>{X%hE>2YMu~ zAIR(=l^nu)3i{(4GdoDphH!@QEGChUW_DhLb{y);(dY*=SCT;;S`$6o$Uc_2ifq@= zvIY5}%pNiqL(ABy5056ZgF5SwWoq7**+LC(4APYU1$bip<&d$H^dkHA%)kzmD0T@B zzTDikS1h_9Hb31EJ2rm;ABtyiofNG}P8D$x)P!G-MOxrB*&2%*dub6@vz5o#o=~ww zZ)lNA1CV*{(C?~%+ndIQtuQ$yIQQRumBE*dH&L$LMBe}Dk={L(mOQ~Y-8ib%(Y}r z{tH?5(8C^DVB7PLRQ%PHd8T!m6}|oHZR|aVGY)O)b{z)ZF|_R($~N9WWaVjWUGMOS z4mqylvM~*6CUU!J_#Q3lSs3FkiZr%4HaN7M*}mzx*IClp?CM8D!V> zyu4#{oS7iJxGT!$HH?oOg-o#FyGtf#V;Wvby~;=oUCD{cI{;L8s%u-$e%^L6gF z<8e<6^CdO{(}Fy?1)SAAujkT-5-~E{_iSTFd=P3w%{9jA)4{P>R-fyP=jG4UyNDlJ zrFh0y@3~ERJ+j|;D`or-s`&F4Yi)Ek#Q(N3k6i799XV{!s?8S(D}#Q;QLjg^lkpx- z=``(vvgRHa^vGU=kZveXG#bK@+gk3yp8?WUL@@JaYu}l=t1;NoNpbKvg^YV;I8uK9X z;eRDx5d%#Jy?PE|9AwNFGn+9<(bip5Wo|)r6Q_EwMfGN45v3oaIL)YDks>mgCYVH) z9jxH{4?rkqFkS(C4ZT1ha5c!BGHmK+0`IG)`PGev@jVRhKaus8f5q$35yQCkyLk9I zPBXn1&=+KIYUvUjoV#TJrQC(&TQ=cgm>#y_VKY5!#{=2A+wQ=_XYfE++&1EAgSi*K zH)S>r8^-NahvO6p-eTmVrb(YF?nR-mWz0~~cYFXMGCykWq$Fx^`gdpDFrP9vlk_I> z`ceWResZ}Z&2z^vKhD!%hqPBS6zhN-+WU9;T;u;m!n^Ua_nn~h6iOR;JKoGsne1H8 zH}U*6{Oo)9C5G`ya5eBGvLW@_(O(7RO1#kA3mJ-dJ&g>;I%W8zxq0+FAR~CWon^2@ zj`5?!Vjl?EubAc$pwT#QzU|{Ll+|4^ucYeI>8l0&?Emu@p+S((q+dhy&^EW7IAj>3 zn_i4l?a1;E_&Kl>FBb!EBYuqiD|o9@Ui!tfqGxV?6Cpj0l&g{FD*POH8(t3JVU!_J zNk2wN^oy1BW^>!eWJyPnr$9(lQWXyshD0U3myqZeE9uA0&HpJ&I*&YO35iO2Gai0~ zAyG-6A|(37O8Oad+iizMoqiE{ex8u1qz~iaw;2+ZM9pH-FILjq&CL};qB?y6c|K1_ zRMIne_$EW5l7=Cl4E@*vL?vB;?!Ak;IFsH>k>8|WtfbeOn}1K1 zbUX6A06(mxJRZgw5|y+_CDE_zh|f17^2A-DPOm_olY~Si_3-cjAswVTy&4Pv1-~9M zHyZGwz#hX{K3Q9z8l-c32j0sIhb z%NSl>U@i>283WCWmH?a^C1d+$VQi7#crhEuVD+3v=a(6C<_AIICCs}1GP5=>U1?NK zcMvW{-Y)?=`M=ph%gY|1(V~J7EqqPFyvH<+BSapa294UxxfUkv7nqW40R!gSa+C)F z;?BT@D6O`7jb$2lEGOD9f0~V}=5=Vyms~<9KYbHPXYB3t{4>nJ8*U;bX@$t+oCx(J zPULZg$d7U&<0>a|l#ovRM6HT}@(rf>OBRVY++y?b#t0+|O(OAX)BJmj#H$q&ujM2r zhzrHrGR%9(v=}#0b>Bv#NWKQwjIB(V_uNF|8=CZ%OOZ_e)vZ_If!wnr$VuaArh}oD zkjc5Dp_Tw#VAGXO{v3i4HqOsCYh#dC4X1F8Oq0oKfJU^*b9j9oRg+`PB19ksW2~>> zXnC^>oB{%pog=IlGmRM_#Urd2-^j40NO#`}d_H`AF^4`%%1a|*89&pcw*^w$ub>0I zoErIGklUnR7o$}3&$jKs&^02EfEqg=>TETFILijZ~JFi(i-yIj~`aj8}RUYLSl8A zAe?vN&3tzAjV}{*q66cn!_Of~VP*XY-rhu5yk0cMne>Z5<}K#7 z(IcW>KM%;e@x#h`0uR4USy)*=M@Teins=C+?;`}#i?1R5EBHA?DXgsj!rOlm7BA}q zghsyzWZq?Ndk3MC472bqx8aACbqgMDzz;9$6NEHOWxdqg{6#{bvW_CXfS*H@!pf@R ztwLD5tUo0*`o+pBnA^7GL|NyN=`4O&SwDt{A0aGOuWu335h`oW+&o4IRMz{D{u}r? zL@BJS-^bhU5tebwub@M{6c*qXnuy&<4}VNuj2`|95C1_U90eWuOM18g4>W7Nbp{VK z$^9XeLAC>S`_=|v-w)V3ZP+c309GZ;x8q@g9^QwC+v(x=@o+gFZu=%4$XjPN=nQz8 zA=_Y}JKlgl=G&NE_#1HhHT>}L?1ej!N)~0?81Up!b_0N}q0GF@ykXOhEd!gb+H{$@ z{h~p*5}E6bEn8j+5X{4kMqvl`?_6#SY6R@v;?`|S8Ha(n4VahOgw@Mq1 zhDsR|m;FjDCDdGfJFE@@-d&MrZqR+H1q=|XjAg@ohg!`>#Z_SETQmHZm{xOU{aGKyMJqBHMe~DW zTb8akvE}5(%1B-1u1oL$2b5Ru zEn`Ex>Mv5>;c{9v7VSOE6!j&dssK{ge5tB`7+f#0DhB5`p0-c~D@pms{c!BHnVG zRr;s}XJQr58I2yg0jwkYeJ||IkK!j|yqW#|2%b%2;bZvoW&TKizJedhA^$O4IOBv# z?o-Ct`wsg1e*Bom-Sp>!_!%%Bc5=eEqbSh^E+U$O zt_0$*N#3Otly??n;*J5A>=9u7Fn&mG^!HML!S=QILq7zjzcgjP*ytFS7@6zdK`#$l zfFu7OZ*LwLMU}OU-|FgaI_XZQvvd-WrImmnBqSk(ghl8iO$a0;WPzY!2w5Ns31(q& z01=29BMvw->bN^PGdi#9j5>~^4uT`<_&Tn*kB%#jj-$9QBfsa|TXnjsJNkXUf4+uF zJ@+~1o_p?6Rky0{y>@9|NfUW5AdCtS&9byi%ntWhGEZMed-w7^W zn;z1MCMf1Mj!n1vRHfu+)D|5mrXIyNwXC)r zGNoU`QrtmBE*!?@5Hqf&Mnvs~aMTHU`0#LSR9%>~U0IXQXx^3v^RKOfF*529`D{>! z5A+ICzt-53>2OE`(wYG^T4;bFr1?OAFIX%L?$`Mhf> zjS`uTwFc;>RcTmbMp>&a-KEaKW^0K$k|9A2Hfm6m#44GLwI$LWD`~_;HEDZGq&m*fktr6jh>WUS{7x?5Emme%BmvQ}NXJ3Skl{g|ZekYq15Iu0p~U&wT# z$G0ZvPL(ubMHY~wgc>2{BfW7=n9vmD2xp@SUahm?$;xq2Q2%~Py-dNptDzGiWM#o44WUDN4YQ7!VIJSi<}zW0Jb4))F=lbqlL`O zA2pTVV!IU^HKpqzyTc-<3VsaR-?32x_!DH0TI6Q6JPnR2)BMrtwFn!XL+Kf^`J*n@ znb^9porP^9wzIKafNc*pdKX5U`HR&h89ksgf5XX58`SkPf0OVC*eNrbK` zRVy}4Ey*abGZwQH)4DhGO~cn%TGmbLEGjO_*;G`RLkpg7nqI&<#zKyLG{Ax4(yESf zLQSt3Qj3;UowtbdScYt z`JANs#sUXb1xbC}N|3&pQ_11cnk+IodPFjKBqYiWn>4h#K4?@J zrlP7>r9yvMXf9W#OLHeJa=B{Uo>N_#{xEKcT&^@%(5<<&Yu);TT8GP}CnDh1H)^>q zkDj>5mEc|h)!%MM^t3eBSg3mXTrT%gSCd;i>`HR$PivYh;S}iXBb{{CNpLTA?}VoQ zF%&$A2bj3mL_UR-^$UL3Iz^V&k8T^@`cECoy0UbPw1)TdYtz#EKVa!{!%{#G?j>h8 z?IdUC5KQQhertm$4*kJ%7NsM*SN^cmubD{={6LX>1BGO_z8QH#q0Aw3vh?CS_cW2l zS`8(ctbeD$8wAJhqzIqJW_6IOWB@slh4xx(R(ByE`i%~l(O=y*r-|}*BNyN_Sp8S5 z)yvrG#irHg;;gEQzLhO~3QPZtwG{R5GSkxE;w(|yyG#1_#J1cfn7NB|-TGOC?ap~p z$^Dan#&2@rX>vQ?^M{qzTxX*{^8WtVr)?XKB^ZNDYG|7s4osPOuh8a3W ze#5$knZs=6Viv*7fADhDrSCfjMS#rzC)UiRtZSHgm(6^ynj9R3nPbw-x#ys!Vdhw@ zne$@Je8FZuvYPoR9R>O)+m)H0qVd`?^#$u1-rz-}Q8xcz5xlupn)&DU4(ZLcWM-tL zY~EvC!^|((%->lAGq*`I&lqNIi}mIO)-}xhn$7%$MKJTAG;_c(^B|j{Lo5$fb%>P> zJ9o34+f5PLJ<9b-2z)q6;KVtdn&J1`54%#(iULip(WvpAo?K%8g|cP#Qj`70WbcFS zdFSlBk5n&&L8(gQ7uy#dCG%H+48UqKS$%i=qPI!&W>b^M7Yy=GR`QTRK4vBVxP8%m zXu~ME^=k+Q|7pU z=D582lqRR<%FzGmSma9fOo5-LyV7JapQY)^xvp_}aO`U7_Q*vjiG8kd$N^x2JKr_I zo#aXmV>g-NAiab|xgn>6>gwm)_PRAEs23d?7@S78!mlh`0+Af#_;>?ooSVPhsx{?; zn@1G%(yqyMpGLXX+$pZ$TsZWrQyw^V#px?Ox0x5v^C70>Qe3XZ?!&Gi;WYOvDpH#J zOAFAaO24u+_ZRBCl#c7bQ7DY0I1UdwhSaaXOjmq9y4QT2FE9Ji(WT{baJL+LiM|;| zAjHV!{BMl8RvOf0z!1?=j1r6zG+H4VikemfQ=^h<`l8Ts8WFEJb_t^?@CseXo)~7# zV3uWXFU{UDQVU}yq>6#jYijO!uarrH>N{!CRNx-Iixv$VeKQ#Wqso?7)5HQ}5II(7 zQxjJTOfcO9g)#!x8K6nf#yEPzA8U~jg&8v&*0pSjCRvUF>(P)bLFIOoj4c}^Bzvk# zLyj>~S?pie*IA)v!6+Gh3@w`bYB~ELYF7@^jdidA-|(rVZzDzZs1oJ;f+$tqy>4Ag zk1Z{(ZaL2&s!9eUm?VMw2t}&t6qx%@F`_LXHVIk&!<&IY8geZ*t?k4(b!CR;a748m zF$^^tiXt_LI~tBAA8j}lWo5HMldy39WMkEQ^lJmy=yMNv3cl6jb2@2+SO}c?I}sr4 z_v~_%`2)-S9{jEJ`@qpgKN`!0S3Yu2;rZB>;&umd&U1wQzFoTGmBfR7PxukPv(&3k z(9FOhub|0w^t%rFMx660&Ut#+AK2xL_|x@jEzutcAN2bW-xEIMcP>O?X4-f|Am16A zVRH;su`S44VIAnL=Z)P1GZ1Y9vOBt`JJ4mIc(NUa}{nh=(U9z zHb>~1;TJXTb_={X7a0;Q!C$<40!QvC z)DD!7EnTc*ZZo4x8QsX}Rv@yOF79G(KcgoYz0Bw>py}As#lM*Qg3)+18|4d)WL0Pu z5LI!y2s2mBXgQ-!Mq3ySF}j-3Z-6kk81`;uZa<^P7`@8q9iSo^<3r}YW0Zzwr#zj& zC>Lm^j6vgEm9&BpEx({R8mL+<^>#3KGf;`-ZUdSn(bGUQx*=Ws189y!p8+W=e%x6q zG>XwwM#YR4Gg{8*3`QFnUBu{eMz=A#kI_?%US;$lBMo=o7;6Ea13=2Z0R|FvGP(=uihGFBlZ;+vbcE68 zj2z?4xYHQTVN}VegHaEoa~NI3=$DM{W^{nj-x+<&Xhg{LAf3_ijB**xX4J%}ozX5v zKV@_kqnjDs!$>>cOgD+qC`KnTDrD5lXa}Q<8C}KbcZ?oo^gN@t7=6O%7^9>UOs|e( zw2IMsMn7RR$mlXgzh?9YMh`K1gVBibW@_n-PGFSB=wwD!jBaIgAEQSZ9cJ`4BQ4uZ zEt%06Mza|$Vziu5JELAk=Q6s6(JhSbWAq-Q&lou-n7#xUjb*fmQ4^yzjQSYuWVDyj zHH>aybRVNf869Ty4x^)t=x|rZw4c#vMpGCSGg`o?fzfJ4=Q6sO(N&Co$LL;0&og?9 z(IUB&2TMt@}VS4Ph=dXv$A82y)#7Y-|* zM>1+<)Whf;Mtc}t$>?TAM;Lw1NS|z`k-}&kqcEcyMk^VuW3+|Q`HX(S=mth#Fmj$` zrklnn#3+~197c;6?PK(NMt@=Szl>gC^gbi+6f@mYMm3C9GCGsd1&l6ZbR(nRGuqGS zNk-o>N|25}Q z80}+pC6J1H9izKh`X@#Q7(K%1DIgX1c}D+Y=|_ydWb`c~7jFDi+(aPNCXWL$+7P2` zmgX>*&u9*ivJz&rjHRbAYGt&B(OEz$?nWTx!TBs5Vzif~zhv%eMmGT|E4Q-VgDgG3 z=nzYvV(vLcuLCJ7Z!`LurT=B*#!a#+p+rXMKq~G?M!764U^JW2JVup3D((^>RR+y0 zZDq8UrDrkM&uA-0DB+$Wnc5*ej2%4Bprkn&|BkSf0-md;`{kEIKl zt75bqNLe|J(FT_GG1|uHTt-7cD(+q&<-v6xd zI)|kfFn1B7%Yc-Xs~FwM(z_Ww$mjs0CxBGkr-76QZ?g1VMjx>BGv>Zxq|Z04co>ZV zQf>EmMkg`KWmF8LJeUilJXpfgI!4P`x{A3rM%_TlN*|*^mhNG6DWfYG-3X-O-VCHX zxR0d|GCIi8CzyMR(JMg8${UP6XX)3B9AUFu+>8Q1DsB)+c`%WsCo!7F(qiW3Fe(F5 zR;m~^GCG~n8b%u!ZDF*B(e;de$LJ4??q~E@Mz1jX7f?u0|MVk9U$fL-YI-^vNS%S* z&>k&g1n^hoqu*ho10EB7!6*xQxZOY+6i>y#$=2ZJGgrl2Ept1V+s)j)%-zr2qs%?Q z+>6Y;%3Qi;rb|m#C|{;Bm&e>3=H@e3#T+e4q2iv#+$!eQF}H!at<3FUE?2HV2iNfX z{ut&BYj`<^VRo^f2{Lx|)^dkehW~MAD{xjClNt8NMu~Y4V6#z~$ zbi7iB1{KHu=q(ieeAsj?RpQt`^9`LOsdE8xN#_pxuiDTdRzd4vXT|J{)47Zp98J<7 zt+k?lCiBNQ=5KM#TXD>nag3YuZ(7cXV&m_do}$D#xc2Z%-lGpE{^GlW9YqHG#9%O%57_3-M45F3?c=p+6pKY=oJy_ID zG}FKa>(UmIh+iK>($*#UBw;KIVqF_a#W%$yV?F)9rverevOqqS*Fv;529BUqa>9ha$_1fIIenT^@ zHfCSWZ9a-tiH2Da&X8D|!~8;3;%amdRksRT77mn!5VOFbDz5lN10^4`NTKB90(?>P za_o#+N>Pe2IH(s36`mQ@FxSqL;@AcDBxzkx(O8tvND2%6Q_E60QAtI^(vxT~X8k~E zA!g-4$(bHTV-B;fq4F!b45AFHqK(G0uL7u|46`<*6hxPil)>2LCM6lOG^OOsc{?Z;7xn!cDMWoFvYEHv z+Ls}odb6>=9i(UJ&ybwfW4bP;mjQe8F>~Mc8-qF4U!jNaxRLH9h&NvZN~h)H5w+!4 zf(}sdGz$SJ^`=vAHu@VvMwYZ-0jl#9M_HG8g)~Me`U?TRgs$Bsv3fJ?>F$Nz*Y+-; zvL_evirVWzIS+PVT^hrlDnI0-m_`~!e}{1W`*wXaOi21yLgR~~KPu+~XGOz=WclUi z*-CH{5;_dMJB)Oxmju1iT^|PalxJrhD$jOO)ee?t`-aN1(+@eb9V+NKg1y-FaNyvc zzKLRQ;{(*gTt4`(zYx8w{@f3#FEw;kHg%)-+?9O+SQw*QFWS?Mml!H@4lVW|)IhyB z?3;+)^_4bQl^sehe*uY-1E*103^rts9x4kUxGIH$@MWmXhhQ7UK`<~>mX4t8nPI;! z6EyZ4$X)FFsNaD7<}qr&m5d(RoxKA)${^rw?6R>@UZLrsa>Cw8ZF#UTTjqBzZl6T* z#TVo6o?2}%JsW;0$>2i+`;&LKLzl8u@1bloWQT?zPmcVTvVvS?4{nv&Fx)rX9`t2f z(?m3)7%lmv&jUTl)7Or~xerqTpL%-pN?8E|`!^pM?8|ndg1R6*GUxka z$AIaUPR1EL2ulMWA~^U7Ibum*@L*s1pfk$cq$Lmh8n*YGmYqlCKpkRP4itHGHpfQ$ zs6v>$g!|you zG4M?C?i&s9MK*E%ev(~a$S$$TWJi|7ord_Ab}=AO;mio+=EPkN3wTAdfrbV9(aHdrg z=nvRiCD)U{Y?-LK3+_M|N7umqzPw%gwV@z_VzA7)r&POvAP%|h<-5LeB=7#44C%?c z4*`7e{hp0tC=&QIIS}#TPf`Hn;28P0%r_KCPfmYmuq+^3Kyq4H`Uk%m(g*hUH(c)_ zJ()x2F_qRMu-KyZW3#(%jVe;%ZVSw|**Bb}oMR!2qwe^6#r(q2@4mJ6w(I&oqRV22Z`4?7>u ztJryl%Ba>nO2v8P)vu2o8#*;>;FZ3dA${=Zz<$&Vow9M7Mm6-`LH6pQj6FRH6CeCe zwFB5_K={a2h<`m*0V*?u`WZYhG(YPQo!G>oQfeF6Wzh~b@zx<1Y0^&?9ipU~&Ek-Y z3Z8zu9uDDbc+kiYTA~x@UJrEB2ZL0TvWb}Dz4_1Fn+I|jk@8deW@^Jf)7Nan{{N-F zriHySH8Vu*5&pq9&ye(OFmOF(;ox5Wk#jWlLjLI$b?tpvrN6YNz2!_1UfqrFo>i{F z;_U4rylzv=mfnyN!dOvrUGq>!OXoUFfe5wqg(mcdCQay_HKA?t)KFhf=Nf!^ue~ia zp&x=-Nr|D*i4%HH6p4uwdJ_}nxcM+X;#}7tT4X}FnMI;K(gCbmNQt({M4OFJG|2@> z601CK!98wQHw>b48d9B8Ol=L}!*OstHxWLs3)w`yq1Ekuo7&sELhD+3`$C=Q>rXoi zw=T2b5BiMB4(7MCo|&_{yT7ZgrDx0B0toy1yV~cj zY42+9>1;)?rKff6+zptA(Akf8-JzT{_}{jvrKcmOFqBg>J(SbY)eSq)?#pRe*V)ob zUp?^|bEYlb`BpKF<}370!`HYrwomJ6$I|q@?bDz^TR~1iZb4ygK~8UXe@|=sw2toX zoXy3m@3|3uN%}dOo7Z&pw>EEVXN_`-F2sMj7ckNA!2~qG-{MFb^4Fm)to<^sYrEhhl~6y1UjW zMUP8jCfrU+&h4a=1*}Tm9$WKpSo-JmIi*%xcR!X6C$|kpq}0(5M~dO8D|_T^lo15; zizqxHK#x8#txCB_{z_#fojCFoLwkAwX`kpPkEDVkCZ$ux$y`w(DNLS7eMqNAxg78J zh!IX1;ZJh0Z4cG#0{Z$no{ti4sB4U%XXzlky1RRwaNMucjC@BU`7a!gr@ThV)l2t< zwXvvC|wO(b2C(z>CqrqB}8QcA%$Q>U2HqC(+#KV=Sr2~NW!_j+wRu1L}g zb)@6_!+7{Y-*1j(OR?nnVxh(8hViKie6Bc#t*lr=-@evk=y26?eDSu~kUCY4)j0zz z&||ikyH}^RUlKpXpV99Az$Bdhz4lX#ds70{hVUAPdvhy}z&_#LoGKfmx3#;A<`Uss zC+;mNv}%OMOYc0o=z*F0Y{~e%^n?x5zl8fI(pbRT(cjgoB5jo_>E15PN)qmEC(v@t zS;BQGiplMyMXTIS^2$dpy0`1ZyW|QnRC|2>TZol=*J1qw_v7Q&K-=wHkH1M&*5?BF z<)1HL0g?y^qdG=}wfo&h!B^E(G?(F9>J>G0E1K~w-l|H3P&>nkBXxE7*0QP^dpvda zR@GyZ)Z-hok!qucY!dkqYBXlbk4>n4c$7M7J-K<`avw6?M-Qq{1cHqvZ< z9yylB$EYJs`9|iW>XOEZFvg0ci;bK|wQKQ-ok)4Hk@Hv{XJ3``SOHGF>R^Zp!gY1w z6^+Hlu@K9{k~$b-1+b(Jgc!jB#83x8tN<~*X4CLQv?+LSCi7Za*-#y>mERR=UV@Lz z4?`DDFE9(ts-0gj9RckC;)%1VN=?yCbrq#%C0MkBn7CEKs~OOPR|T2 z@G`QR(jz=GHSg7Q%}iM%JjDuYDXWF2L}5oti}1`+SQn`j-7_1jq9AtQ30$}Xo|Cme z3GNY7@D2EN-95d+Ghb7ki4>CvD-CCgInmows`*|-qMo!rB4tmRir~YkiM&cByPk4Q ze~%K$Ltv_>QVaYN57W~UNwiqS7AYHA@M#ejdPo+&)|5HC6BOQ}%dr79dqDOKS*6;4kH zt8l#vXQkAw>&CzWPlK{PI;BE|8&!BrN~sDjQ{k~GVHIAk!sAlvde?S#^a)RsB0?z@ z2C+gB$ETDU#3_n6Ath`O_|7loXuK-W(^P?Gr^x=6XQejgc4Tl8%6A@WDxEZm2vX-x z16u_)l?vK(x~5Yg@oNes8EC@}hmTSUTi2{GxIbP@{n15k01UgBspjzGea zK)zo^s*Ogf^~w7W?TW$#B(6xJh`ubi z?43R8bXd+H?DRN|+Y{d)g1-5qw~&Z%A`Nev<69V*os4A%U!>TJWQB@MYCXQi86lGne7~u+PxwypQ_*C5rF>;-7=9FH(jnkmB~9SCcHWIL zK+hI>KFWx%Mc)pbm7X*s;RebO1-ALs+4Q! z?$_JdCj8aX3#YfQvk&)){w3Z$h~V*d;%-6sYf>A^U=NMQui8Pty9H1db2=RNt9FnD z$Nj1ujP_!6v1Ul>q{kr{gtRU|O@K;mGfC^Ebdn50S}&zjWkvfNq(^yPdd$(>(Z6n8 zZ)*=8do-)n8vKn?T&izy4Ks@7c)>ySTj2z>NVx_Ai4Y>Wm&z4(N=+O!h$EjySNn738uhA4` zoi40wpc`cL=IW}+hK($*3s+RgcA+|Srm}1=5h|#v$O7|`OuW$O*2N3zP&*Aq=PpL7 zMCx8AMpRmZ50+Ld1$ECetb)yCr{PhoMM!7eOY)( zSxtHDoh8%eod^@9M%R~#GNaGSM7fcDCL+cufQbdhZ5|U9#_b&w3ytR*OjH`rGMHFo zJilOKvGL4;i7Mkc1rycADTj$A#`6d!YK%t^Ow@`r*&LZzD$?yloe0{AdXZr#8bqd@ zXcSp?Vwo6eCzgv*cA`lfXD3#O(RSh#F~&~hi?Md1K#a2!(~Wa2XRc5jZ`YV1POuY2 zV!WN0DYETEF}`X;Etrj#h>3P0Pn>8c@C3FI4_qeM*$6DuM(_Kp26Y8OUCpavKKVJFLKs;k4I z$WGQq@QAEj%(S!h(!pXoi2|>$swrD6O6>fCd@(DADG;+`nCW6p3{xoP#xOI)$uUfk zm>0v$G%oerfEE;saEwlgD2-uoe_a+!<%{xIsz5~S6dvI%X)yXY3+y7WHC4EjqdY3? zlG-r(8DgQGtXv}B9ah@eg*DX?vB=KV;uG49wfMS|t**->Rgs2>sIs$o*et5;6h%kx zY>8N6=hbDY#!kwMO0Aufk(b&z_)}+R@DP*oURD)BkE7l$TU^^*UP({LMMIpRx{>-E zRVzeeyht8<%i{RjDjbr_%w{!AJrH;g3#YpOK zD2p5HWTc768|@^Wsq@4g!;pF6PCMJM5KkMzOUm)m+4TGOc8&5#Staghqw+u4}6P8vk2}AI5oS>$R9+ABg#~Y^!@oJo8VWcT+N?)@}tI8Vcs>B;HWc|WQ zJPiA142!e7cr%8pXsi@(*||Dt^6eN>nS3XPC6n*QaAfj5`8<CH9VxHG)vhXnwlpF}wtV?= z;fdj@!->QB5^Q0^tPVjS+;)n(J{pRkl$0;wAD{F)5y>6D+%=nQN_sUy^ir_AV#vhvJP*KoWrG59c~gX zdj@N}H?{XvwQt0bhSW3lEoT1Zs`XgVJ#BK}J(QR%6Sasvktan-W5IZ^=~E?}xC!su zJ;8edkD-_{KSQ|&@0F!2G7nJTPcnd4{G=DWPrn{&iFHULJ@}VEeXbejA#0oiDvtSX zRRj-8!sCVC7)ly^SPoF|Wsao;{wf1WnI}@<5gG7jo=Sm3GLY=0H;(xt_^6K>Q9$@8 z_26Ur^W@33@G2|#WZ(#U@|4w+rcw+bFP^u0aoFy~3(5=WRDlS- zD1+(3M~(zv(wpH&;vMil6#PeE!!)ya-mp6LPpeaJDyK4O{!Z{MuLl) zO{6$JFUH_w{zLFHnainO4D(&nw^jr{m*G4NfX)v&&|rhZJNo+hhCsBtr%6qUTD$?*fe6eE3yrb<1>{FISnrzKUD&$nD`t7MEYbw_wmFxrqn!X-p0y+ZO!JrnX&Nq!_ z+Kgt|jE*#nrmZB;MyZf5P1f&mDilcBEP|trETn7^!7&PFrEKoOfgK#Hf}>Nm$ly2? z4Bz zQ&lJ>1;bTZ&+HY!97Uw2$pbc5h0-V!(=3_DGcqAk$+KX-rk?`G0#_oC9W2rUR}`4V zS8Q{$#OCHKo13!@Hz}<-%6@tq0#8Ula+2(3Pv8ZcJ{V6iQqg<4!;;} zQY%DozM@c=Ioq%+Z+=&8O ztct{^3aCnjlG5ZUty+crY4V(A3^z+o!I+Nzb`h-6eE)+=4W!Mddcbfqy5OaXRPrad z6klN@=P-u`&Mngd&#`k&Hs@B@oIAyIZZ$sqB7(+vFvGdiY|gE;Id{4WB^%AK+3?M1 zhO1N%&XGUC7ELdQJArQy2n0K{Km(?qs$*`g&ACpSb7z>&t)&y(nJPt}Ssd$3?_^8s zHNBGs*=KksQYpz`KfX6c>2IXs3!be7p5gSj+S1=|aF?dHAiY2vs?8U?KnrBeFmr#QE%hN=>KCbY>k+9GF}O$5UneUM$vj-51-jVE z&uvzIVY70nS%&LmM<95aHkvv)K9Nd>f|qOh1lS4OjuTLN@M0g;eBdg*DvuI>h+-Me!Y}3CsipH$O-`LvpZ@EpAKf#+c{U_v{1A##BHZ3s7 z&fQ^i?oOL?zqeJ}A57omS@kZ{H|go!rf<^Idko)1DkT{Fqo!vey#N{zs_g+S@OMuA zFSgY8+fsjstBoQC4`}+OWCi)ab^eeRXr5^n@MAVBkK3&L%`9N~=_Gv1NCclyhJ7g= z7@~y%Si%2QguFsLsZLetbi(_)!dYqi$$_Vg^O{H{7lKb~`m5y6xd@C79@YX6vp+A| z{CUad&&#Giz4AkoBKV5oO&X2r3cjj&$xc9|)3CPZ0OeKQAyO%w;A@(`j>IR)w)>_Q zpe1ruD|_3P=sUJV-&G+`N+)grHuTYlqk`|5)hR3Rh*_Po0^c{QQ#Q4KadlF%!4Gf_ zARqSPV9E=Aq6Lnz51-n6_{{X-c5?l5jB3X5;xS4cAF&F4p`~sFCCmLwqpYdizcNZX zr43i0uT>zF(gw*lDv+&e9q1c{vNDw3X8w!(f66r_eU;7s5O6z8O1x+8GXEYr0Nn`@ai*Ro94u*MSAAr;|B zN7@h-p-Od>($7l4WX^6h?BfidWY!q>vpfa0H%ZqlGr3GYq5ZB46Z? zy-trh9A-Ma6wRj&hqnOb;ouUfWHwmr&@ZAiR-?#0!MTpWaahY%9S-wsY0Nj$5UHdZ z3_J9XDc<=wJ!J)J9D%(YZ>cR_o#~tGFxRV)2LtOd7B$$QT=k_G_ezZpHMm!XahtMC zh0$N8bb`wr`XnTinnI;>s$cCW0FrLAvh@wW(3KB6yY~ zgKjFvO&~)(jv(FFg>aK2g1wGRx}OTQWA>p4_Blq;eTNK1Fp)6W?-)Zj8X_srBG}1I&qEw__ZgkwYzJqyfh$ zxkkCEaGoPbZ8Su4yG8JPM;f)q5FVr8SiHcIMy)K=yQOy%?i~jm=^s(B&%6j-=om#O z($IS2=oY~t$8mJd3biqFkz+KSDne}-UyP27BaIH!aWsh{c$LFTHLfNX_%PmC9w;+K zDm94U)eikzq~>-~PuCb8m@!d%9D4E@NHw1NVYo?YO;fX){1%9%X|7!5k_uxenMI!_ z*I_`XoW(gmHdbjP22w7mmoKp}h_hKe0#k!|EjCOwDJDJn3{7b4YJrwBFWyxZjb`>@ zTp32RV)X8UFovZVPm1CaXjWs*teOsy<;$3r&<5*r1bfCDb!qUbhJq2`8FS@$cZ{;9 zxw9E3r^@NKLO$)O#&GkNHSML{n@eTWEXP9=kugsvXI*47OV21zpaqG&JtAX)e0(6h zYXJQ;2SoF(223I7h&5P7lX*l&g?=Gon>DsbyKR1aG0-cax@LNOTv1np(Fi}J(Lm4Q zwb&{$V#|tZR>QW9r)ie*vnxeY(tp&Ndi2f@+T!e~M{QZj8OstLMZPf0Sx#WeXc|dD zv}G!}7Xf8kHfB~w%Ul*wee2qGOoGl>p;OVgNIPqE#_0*$!e))GG9G}?*)5|*4u&_U zOk}J!CQ}<z`XdCsK+33$IrCOs20W=$=yuG7^1_WEE($21y9xPE1UbkUw3)P~j zizNfGh(fzv?ug1|DdC~8(1k;N2a=B#Uc`%jOisJTUo)NeU0eZ09E;82zDVxHJ z6%{dYy$^1S%&y}oVLa+2{mgECH$w6W*HZwp-jAU$X^6AiS*YPUxd9gZdJiKaolG>z^v?S9s~1irjVl6>=d*J23|Dox>^A!lo( zt2q@j<<*=j^i`<2ofXMQaULA;`AY-)kfK*kzxS8RPLNQuG9ogP)0ld(AVhj}p*{tB zA4T?8=!D(Q%jDl1QT%RaogY)jc%=_xy*pGvuh3?Vd=ZK+J%FsboirzZJg+#?yuKeN zC85ntyItz|pktA)HKyxp^T#YgJeLl!RZe9@T^FH+(Z>FUV$lR5KTYWN)7jIXji5M@ zqV#rc=)oEf9ZKKP<`_e&hbazCX7W>&%Q%ySOade2`>;ZbYIZ78(lgGn-%$h_5icf_ z)%vyFo1*6lrIvA#G(82gG5j|p6aJsE6V~+x9WKW>YHdxVM?m>bekc#Bv3kpT9Edg- z9&wI6hayN9WX7=0rP5fiu4PTH;c2}dq6YXoRy~Qlh3bOt*8X0lFZ|zXL9(ODr?00K z%VuIA0_NeYRHgF~MVIABf0W)D98O&u4ZU}@aa4FI3k*HwIOe3a8w&SnV{=JJ`BU-N zS;QVhZKPvR0?iemd$>l2V=;)P>hCms5O!(c9sm#LJPT1L}qaA`KVVlhK08b-E^ z&8{$wVA@^-aQKLW7sa*-5!>gH(Lhuu4Y@#TK5x5TE3T&d}W!RlnizzZNIm>|sZ1lfK z{#}Eg!2FAn&xUEzpUXTg{v~EplEf<;4a8wSE3I@sw;V_|993PMU!xG~G`a9hElO*N z%=3qf&}itnj#j5lq&h^SnMi^@*J7@O)!ftH)kU)nH9W1RDC$f5vuL3T-4EGA_Ne4^e2V%F4mGZL2u3_Am~ak`x*c`_Nkm4 zo|8}mXHbSvCqIRrDm_Y1llR?)4j@OQs;0#Jr+Hoa)1%eSoIjkI&>iRh9z`aCWjH{kdcUyo*U z0`xTcgGfTVFXD$DIvCZC%Xr`0SeHUzVN8JM&?VvM7Nj{Y5iZ=;{!3wD; zN@(p?x=PNo(+`8DGr;Kv?b5qo1o51XjWG5U#B>eb$l`v8#hiD*)1|%SO91K){M=BW zCS5WfwLzVayQ3so)bjAxqg9ELRwz(E<{7&JwGT0e+Aeuoat8qU_6;X)^X-0!$+y%c zDx)r4`c`rn{3GD=4IVC0>Mnf;xnA;-A+C)TpC`phC}@h^9V@;_iYFW5i(|!?Nby2L zd~2-umr_jaf^zhvA&!=|QA<0ZKzVwX6;z(C0Z(P}UxPQ)?*dJ|w^Xze)8@>lX4gL1>qb(kh9s zptbX`6ab6V)kA3Ok~C`li`0d^YqY##FQzDU?Oko{Jt~6Hkri62oV%~l>AOmvDq2sX zZXRKEI%qAT(?PX7&$TX-)}#aBwl+??q1#NoE=i+eSL$^$>GC9&sFnL=pIm4(;0MKq zO}mPY^O}zJePBnb>y(%j!7>Zl;w0+LC!vH!V4Hm+w0n)B(h8`JX@&Uf(f0{DGJQDJ zqLAe>-*UyhmbSL$Zrs6QZKO@+s(r#SRnMRcnSK6Q}WoG6HKlaRm&r*^WJpo*x0@=SuA(YQBGASK)_rfIt0 z>y0XSlPn1pL&JxZ{n3<@g4&5AE7Qo9-zAevo(Pu%Y{ymNC1HwT2f@lTvXg4qkpwP! zkds-Kr)!!r8$2Fnry)j08dTF~FveGoG&-h3#GUdWoizILhahxURhC`!` z5;W2uBUO{|I6BiT0Yh<|)iXTFv}ObkA~J1BpI}IhdKq76DLqFPdilB9ypd+joj7vN zNGh8Nxx!B3zK!+Zg{gO&Kn9MRHO*NuqC$VX1hiDugcHQ$e!;h(~%rGa?tWBBcXWuTm`;+^ON9 z%a_f1)`fUELe4cCb3u-4LPu!S|wB}j!NhLMk6?G&W>xkiV zsY;I;Nm;HIZ8w!^wt^`)3PH9yvK_ItJ5?$R45yTm;wm^@SyD#!7v^%SJ#i#jM+k>l zr8Rj~bBnBr2(j3zQJJQ6s*IwMiQ>#{brk1rYZP0KYOL`nN418k(W;d7rG}Q#cIt9b z9c+fqobpF^i7#Svh<$SZ9CUZQ!4#iB6Ctgg3Msl(3F=$|9?yuVelYjqcVmk*q^Zzn1nB zv4N%C6bYBn?lf$qLHmu0rrl-J{z2-RVFOFM(@-8TM}24N7=xwV4T?1lB4qsXu)iLL9HQXbTd=451j5%~ zKN0Q_&c}WRHrS$F88%()yJ(wf!`zcY^qDN^(Qbrvs-8Y(rL5*%OKwnfIA}(Sxr8q-q`QmSbZR zFC(C|D92QQQe+x3_jISDOw^htMvxco{L$C$hU`jg$ad5zZcHQO-4(^RWI9T!w9RCq zJPN@iHF^I;nQ)7vuP-)f?4uHg$hR~sy450mcw}m8@*av@wYY(hq`5>0sKTy`MkGY{ zUc*-inT#(o4P7mP^FO&jyNTFvM%YYy>H#8#lO0B(%f8u2M4}^j0`_yUS=@&P4#gly z5<)<`5((>Qw@|TAlRx@m16ifIHGk%!&=kgtW>JJ~CN{j{6u4Is4cOYSoq_FaY!_hL zi|sOO)y~e4G(Tw)=ldyDlW>|R8*LQmATez znqI&<#&X&lJKNg3gk>h6}FwkUIk@m;1UBj4vogT}k`C?SW(Q`w-LDB0+voG2$>4{=Zd z%tI0`*$DN=gywRkrMWbBz~wsGz1V%!{V4)zZvF3KFG=u2ILYPH7ld4zKC6jQ-%f&k zuCe;OKG%4?{HQBwE&{XXfDRue`Y@rLN?|zUa_b3>1zI}NNDo5y)^o@im(Q(vZgD~Q zJe>2mHCKZBRxAykp&xZZoC zJHpcp@20_)=JM@yx%9;Q7P&ngD_mLbOjkmcE33Fl?zX!!DiC3pD-(*e&rtg`*KrD@ zBa<-P~(umJ@aJFJt!h;4%ZkZw#&WKt!G?A$_aB^N&2Qm5;l4I{|`AfbFu6H zI>$a~`cZL95QUKDzQx^ycBuP3vQ-ADQR-)FXeOoZKO437+Wo2!AB9gB$fEGf0j!0e zZ*G$Q<@uXIpN>@{n`sLB;GqXG9Nt~6*R2?v(2|Cwts?KM}L+DTT6ArthT zrZg0SHXH5zqiv76vh<%hI^fV;S?5`^T$v{$y?N|Rnk#|y1Ntuy-WBlQ+F$u={R0?OMY_pU!vam>H2~>>L^Xq&+I@{-QR?xAfpkm za{x+deJB|H%-l4xn54Om*L$15tU-1IC=@>edfyy(k!zHG!FHsbz5?cUI}QUu^1oD! z>6F&(aB{T%^fpSPQ@WeA6Apa}Tbo@8SGZT)?+Vf(b}b#^g_7=i+4$^{mT6kol!J*ip#UhrG4NUeX;Af9JHj{O+lLbb9tJJri)6} zZ*}=;N9oHwe2{ziA@}gb7KTqoc$VD5H`<&2xwLE1iliedJ>}72@>Di77oCUPX%06o zuXH9a>+ZthjO(yseYqSb7LgO7NK$Vs`iRHwSfP{OgWDs?>0KBw9F2wvZ>4xo8YSoz zcr>Km-^$SyJ@Qf#bwGVmFREHi%Rw%up>T?m7pclNe1)W=Rj&Mx=@h-VWVTB?NH>fr z4@wmyQ`980UMZ87O6BOIsCh(K*kX9r(cQBiqyA;KxAZQrrXhsL6)k0n6<8D~kYc%L z?*gT62nwYDqdsW9lX{zB#+fcfNGY~(jn~+eU^&LAMZJ;*s(e>uTTdsR{K+8*q>W_c z)m#bbTPLWW^&6CL#!AC#AyLw<#sHbl3aFrzj2K%mhJ!@4-563Jku05RIUX_UhwPb{ z*^p}T`-#KnqY;B7D8-Vr)p%CQIW0%4Z0WH% zPv&D=37Jv@8to}Y=vxq7YZSSuv#YIp6Xq6@1@)Mh{f#!jSeNQ(JzN!4M#KkCmsby; z%4SREBLg=%w^5O`gUrNv=!|GmYA!5{!nTNX3nYqs~Sfdqr8C(*rz5YhL^BrNo?>s&15A1T5`SbK-4T&8@VviuP zLvYq-#4+E)n_=@Ez8N+jbDLpvT!9&0g`15GX=^E%Gvr1Z}$J;aFC8K;s;7yksJo3?cEDG+&^ zF2xt}oF0aPNT1I+CKqS{Uuzh>?ZM)VbQW%*4;PPA6Vr2x?}OGEWHOvd2k<4s`TX$ zkSePu7(LDCHAbH?%EV2$ic!w!R7UMUD!)HvbUC9Nf#ylCe#hLCjGhHj{=EgH{Cl6J zAF-64lo(~oXda`bKq~GT%$)_KEF*D43Ul(i?OyRJb8iD>WAlp3(1s>TGz)d9&{cTM ztk5frjxd^nlZBGbXH?DTR7SsJv=wi2RE&EV9c1(#qpuhh_{|vgjG7sBF*=*kIgBo1 z^h-vsFv?9fEiYuWlF_A%?q~EUqyB&y_YDkdQ91fIqok=Ox17|a>CR--z-Set^^DGDbUvdS7~R3>0Y>jL`kawtnwf4gqtT2eGg`o? zp3zy1wlTVp(PfNoWb_|K-!k&xgs4h9$mj${EsVMtZDn*JqstlH!{{KRry0G@=--UK zWt4!+jq+s)qf;4mGTOvwfYHwwUC-!tMo%*OoRI^UG?iL_(O5=P8O>sJC8L`d-NWc% zM$a(%52ODw^5P<+(w)qxm{EjLJ);&z-Ha|`bOocE7(LJEO-3Ix`ks-m(DbF45niJi z{xvdM&1eIo?TjvBbOocE7~R9@VMfm~dV|qNjJ{)(hzq0hL zE@X5$qu($($mnTCuQU2DBVQ4F#ppyv^f7Mba~Y$hjG7s(XY>j8-vP&*&$N1{qz(=pIJTGkTNJ$Be#bek zRxs*dgijJ0ad$G>%jhjepD?2Cj!G?w(Q%9>Gn&b0JEMyjUCHPsM)xp!n9(zgK4UZm z-8GkOjv13fpl_=-_hx!M0K0aDUM6=qLx1(5ReQsxpdGCEaS zDPq(JG*vqNX0#axh_USK+4KBjBWrrL0Y+k(Vu{njLJVaBS& zM==@?qdzt$cb2l+}C!+(5{>JDvAZ6t( z<~)l{pEH3}&L=X$7f%iEBa9ZYw2`?Lj8121Cv)o=y};-dM*m^-DI>kgOm_sM0FWx( zAdo8E2`rt=sDM!sqj`+V7%c=+_S%6|YudnEKchh)RfBsNUCQVRMmI3}Eu%YuR2ug% zdYq+CGJ1j0D~#S|bcE5rfs{RGwdr#zkm4pYn$M_?^_rPGi@8nA?O^l^M)xp!meH$> zJ_1su_APTsOH3{eNO?7txdP@EGq;qvGnm`J+#qv5W$q^CZewmgbAM;9hdDoMo-GK zs2hJ33IM5eX^4tKRPHB9z0oYqV-6ivLvI6feazj&+%3$#%G?{weaPI$%zeik4IWUw z_<)oz0p>_mw2D|MvgGW?}y zuf#Ycb0_|Sppgu66XF3NpN)AEA^Jsi-a;r~W4=bnV`GvGuP7agDFo$`p5R7Pr$Na3 zQHfEej$+}7O_b>dL(gcV%*9~nDQ%Sb0~mTvtC(Djl%SfVADPoN8qBhag8a*sFAr2u zdZc}7VxyeBKz=X3|jRiaeDLtZ~9TI z*0mB+jr)CI=paMT8A6h(9<7Qrnv8z3KC}=}yp9@bfuYrq>e^oXjsK+?(GnrjwH{f% zv0C(0nSNeux^_rav}B@xPBL_4tJ3Iri2uznbdn&_wMoc9yk4oHBZS#{o8p)=pjOrbSP|?RI9wF^l4umN=$Ajv0z$u8(8r znYlgnhiuG?2<56-3!PmZ-6n2Xy_!CSXGk!Z%7mDDjzyn(&7eIbC*B!x@L@lp4wme* z&pzAK@1U9M0^j{x-M^+;O_Pvw8DeLkNpjd(g3ac%yxe>do#|~%<+c#Uq`urd(LC(T zaEmIxz_xJa^iAoAdM!v3%IS@@klYW>1(i}vYUM~O8)}ZDk*^<`x@yM#(Fw7p5+`7r ziu(V)GU-KT+|+gHqYS?YCZQ zhf$H#4$`w+Z;33&_90yiEkD?sKaIL~mR}HA$ioHkwp>Nti`{$?C`Cb7v@m%L=f6nM zMk&4N)RT(-N^nv9DRnR{KWVQp-@;HC2=V9%Li__yAnAu9QugRkqvdxw@Db=)f70Ge zd%8~}uRF$L$gE)x7fNNXxWF1!zFAy4#YQQ;5h~OSW|O%iWPb3_!2Z5117F-rz02hCkB1_@{8tW@XM0Ek zd+IBRT}QORIoaCB$(J0=f9A_C2FtU3D)J`Zz$^XvyB_iF9W2b26s%<&qB!Evd>MCW zxo5D}Gg#pnLabc}wUUE9&+d9SF!3X_YTr;}VBlEt?p5$7Id#NPg)cd+JbNmNED!Y)qCon<7s^n)d;Jexd&&CVem@j`=D+0Ma+?Ci;p>?zlM2u&(EjG|7i zIEpA9Sw}-4hoGWO*FMoU1tuR&-hBYs8ftbTqlwB)$;Ul+4mDGeoitQNHLrS`hiHZb zO0G;6#88EEV1NI)gX2EfA^m{=lr$x}YroH|U^BUa{euVl?^VqqdH4C0A~J-kKeRwv z8+0e9R%NFjs*s`Nv}7dy1MTHdMC$Bm|BM=-Y#ihO!uk7UlT`JGrcXDc;{8XyKX&X; zgu286QK`#sjXE^$g8}J(qddBNa4R&lE_)IVgT|q}fq(bap#3f$+M1nhROZkE=g?Rj zOp_1pDR=uyK0w7dlPg{uJT2R!y?%sJ8QSQX{92zA4eHs!ucnk|XYYF0ryQepfPm@e zUFu*_JC%L_X=fv~sRRE`-hDk8TPdgv^Y;(_W8hf-iubpZ|71t`;iCfg8NPh0e0iOG znQZt1sdl<^^2)%FTYITwfwMn(Xn|)ifN{%M)q(g7WJMb8qV#(lBlfNqYxOV~CAZlaz5Kcn%9^0wu(0thxhU%S2=k&o+ z&tRF88sCP`v|gM$Jk|{CDKGJ9Uk;X7B~*^P4)_Ms%~N0hb=LD){{9c{GitqK@1Xv{ z^;Gb5N)5qFC{kOJH4epn2-BI+44+GS2*>EX-+=*Od+8_p2STnrMJq~$PMpwtVyLq> z)Y+vz;7w~HU?U1c?y%fzs1IG^5I!G%W_w?VrXb7dwDOq(^%F4GEL4_1(->|R%2~gD z{bu}~-qzK<342Vkz+a5c?7$M6?QJ=7;f9>m7_-^d(z9i50fc@1UF~z%(46niRs>sm zTG!6qfF<}l`w_1@l(Po^+cvfIbmSCz#(YZET;`gQX-|dfRCg8rlkS3UUhya|?2M|3CKL1iq^3+5VvV}yiIfgrg7w7!Z4(G;mrwZkiI9BSLwYHM4cRXd17 z)wbHFZPkuXYn>3=s+5@c-|zRGWZ%8^+H0@9_IQT9_S)UO zJ2!Szc6N7H?3t^#?H{-==K(vsv8#Qj6+DhQbz}!Nwo#8S;^&^=3E%?GklyV*TQ+a+ z*n~PnoD&i+Fr=reduKeB8o9N5`(`DKgal3?oFM`yr?4X?EP@20j!F+zOVDxBwys0wEPcWQu48>A5&-napy&pZ~8c7r$kMoUro;ln*A?Sk}-r zHnqycd|mx&9NxLg3*h9GnmX4^Uj34F%?+*fu06c^B`x*%V6Har)~;?@+tk$9+-l6* z;iOfZ1=EZpsX~^+b`vA4Vk$KBvEZx7H0)54uoFkl8G(r7mDzEy`yD#EnS2%vk1V?m z@mYim?Xi*HBM|NCfZ<}hyyRTI`$psKTee#EcnLYt9o^jsO^{FoPmTC0G%?Dij7DW} zY-&6IA{;Ak*^>mDXJw6Gq+OCnUA8D6vc+&nsYF{*bm^V(9o#= zSoY|w#Y~OTP{14(Yz+{(tXwOTIoPovqrwjHd8`n;-E7=(k-kVem4VUEgZ2<2^9kf{ z2XQ{-wuX`z@2B;&Vyon##iRK3@!v`PB7g#`kVJ`>F9$ZQe&q2o+2K9a%?@V0n9E6z zB%kbj+4=MOgya>&ypzvP;&Ss@$Z}vIi`;l8S02MC4NW@j+||*7$)%%VJGF4v@a@I2 zr`k5jkAgf4zJ26V7>?M14{)kIjR6>>87{3b)m}6NBruau%zLd}VN1jElNPTL=i%pf z;8W7ROM1ZqyNLAbfJPU#MlJ%gEC402kAPXivd^#!nD-Ze`y3qJdTzrvw70=RjW8{- zbFlB+8ucS!??d!A;mY>lXY_vp^9F!d;9}I}V~tqWm>z(v$Hnl+24E4Q${KS7Fq?9d ziwgxgt0NXBMq-kRTYE`yiJ>Sbe%ymDo}B!t7|Gsq6RtxzrgEu!lFv6zr0_zIoyxJ$xhxQpGVi8EUo?J@oeo2z=*3fQ{v+q8vb@E`hS4tn{X31VYplNSBH}I7Bt8PxJhgS`)fm)?l{6v!%ghoxn;A? z=U>uavB8wA?*ie2(oY%$2_tW1Z=%)k(@I{ zFg{7U?k@CewmT;oYx+9;a^k>T@C@p)vSusy#>P8LcW#nrIm^D~n)K7)u~Fo6iup*=r>-NQ_P$H`rm-6_b~Kvuv_ z++x|ArCGZXx&Uq_tDcvARY+?4Iv_s+C$-IK#nkq_z;6#Q;KwxB;h-MfM z7kd&|l|fi>QBt&+hrzec&iJ~=Y7vM}hZ9!MBGRzB0N5>L^;=+-)pRU1Dp<}t@9K`- zzGBU@SpZ(Qz}ZJwaTD6KMP$6p8?7VRngC;-@h$CJ-Nv0aSMkmy=|A%e$!9-u{t(p~>Q9w+wzMurtziyuDfSYtTQ8TTj>Gv2PV#@!4Y2abgCEp9gJ zC#l_6@*D$unr&Ah8Gvcb@3cAklvgRU1@VK}NlI8l3aT|EC)sjRNbMfIHycSTb!M{t zqby_S2qsQwrzPsQ07TLXXmC&ZSait+2DyK?C6Z~tm`nRu|BgqCHMz{L1)XUIOYsthg(|XK z3pKb&Xt}RnJc1^KD*cvlJmWbqDJg9wa^bGv7t?Pk3Gow0B-O)A=I@#G!I0G!Vhzpq zXB0zkgjpmpij=4(bS#V|`NxNUjMX8SQfzC@BzS!84p==7eeS6VT07zcTt+`14m6wL z?S`Y#4B?aXLn9P#!G-Y*x7#WmAk4>lSkEAjI^oeoZwZ`7MR*z95Tv@$3YYpAle7iS zXO|-Y$(1YRg=rDSQ!Id#Y@dQgE+JQ&7@DAo3A8v(e1*`oO^LKkCM}Ao*Y7bM(I$;; zt*e8#OTj(xu2t}QcsD3W?F;9A6RwK zXD(<2da1n7Qo@1Hd9dU{(fSqia#NpM4vXQ2Si7w74zv*iWpH7u$6}c9R5(Cm!{LTlz443_C5uWKprk{r_zpo#LEua{B&0{F*jfqc z;^m%1sj?*`TSLiIk~IlQ*7ziulp@K3R7n<;QY@8ZjW72}UhaeWuR$bi%!Tkx^xRU% zQu3-x&8trG8Ye}K$LQ0fs9Q&Mr3|oI+&Zc&Wndv3vZ1GSR5jp}GUiE#JE=vf*kS?9 zlU`E7-i2pyKaJy~@%03cnm*5jbPHFSQn+QQgbPWI6j(`MxKI{3*e9|J?e1=tP7)w1Q+tT*<7b1zF)|j zJQCj>RLRIkXx#v%doex@sd0RB9S?`Lp?AH2>*(F2 zSbDc87Qg1=eAfntfk*EkT+rGT_dPe^V-%3BLeoT#Gy$u32Ryk@GuC=Ire|w;e3FXK z_q_dZzP`iZkHLT|(L=q39Aeqs=?=lM*}SV5iB`Zh!kr2CemLG0hr`9-ycxz%&#}tE z{2-iny@qW0M9FW;E8x6~I6mI3hvNg?Ubw5^yz4PcsE+kj1W#%1>^<5z^Gu?-t6|WE z;oB^~d&$y+L$$C+lO0|TpT>LoU@nR_wN?~_ z#=wG3e)#*L@j#R<04P>@7KA2R0VhC9OrhZd*@{{21{Vl&Icx|;ZQ2J4eqj1Hg(*x3 zjewmdk#c<~qLy&%U^6Tr6^5cPvvW99rq+M@kYhBQ3!#v_!Un4~urLODSt|ymm=20C zjBcG7vb(}>nR=MN5R%Yb6g>z(RQ!9~u-JDJ>rV1h$Vk{36B^W|_|>7Y;unM>^yfpI z6|VKJtp%>3rtgW>p-{Nj4Zkl`OyN;-BngK5_*)Rllfd*)mH4NJis{2r)s?geMcYQv zaPUi)qMZh*13UN&%MRrQKk)o?lry*hhMA-eQIhaS3qtdenwE>~VCLna`2xV?k`~|( z3?>TcD`_G^6T=h~%@^5c@dvh*;5n#M%8kmCcI(^H6b*>h zqX{iEQ+`9J0IgRU%D+s0S#=8!izT(ZVCVACh+rw~s!ap7684{9$gDVwP((f1UTNoJsiA{g|}gt zuOv7^4A))Ui5$>e>|3GmZd&*14CQ<>RI-T8DY0xCyRmaUO1qJz9W{M{nXy8XWKKej zEDR$BB(cM}heDApkmw4rRYsr219REOuM|NO7715`<{^sxmo*Swp=SCxc|Ih)@xL`- zR;3U9aPTv>Jsd(5hK8LEc^0}8;X;-hwHEAtUS*wq? z(UwuzlKZdRQO$?>)87Uj;s^>8=RCqLY`; z)xLa|;fvlf65~1wdafOMay6)2!DY5DK||IOUubDon=e$KWvum{hldZYy9zJJd?l?y zxz?y^b7FyYgV>^CDGF;-3{-)~CJKk^S@66c{@^^z16L2ivmvW#5NzF`IeD)<-g5g~ z$rbg2XF-1S^y}cJJR4r8>k$R=22;&S_7>Gr0v1hQmDhk@>{avxQeb^4jA0^ z2Ku&%rS&MStG5j<1I?f~E}^UROAW-8bH$xwAR44s+=T|(1xUGEZgBezbO4abcay<= z&OqNV&^HZq6p*GkVW1&HygX_EsRZ=~T5F&U2HIkvZ3g1*IF*#gGAftL48*l<&G(4G z-C!WDbZd$`40JajP4TjU{sc(#2t>RTVFMK#sMJ6U3`CVw&0~#$)*9$6K+3tp;IYS8AX!fRsy>fo2=1!O*QT(3vK7qrq)9&{h+>+d$VD=racTF(575GX@G^1zKgv z2c)s3fV5>|2AW}@(+o5pkfvB-aLWy}(LkFGv=xx1*llnhG|<%sI%J^F80aPgeF>1( z?l%nXn+AFike28PgL~3IKR2;|F;FJRRjOftwB#cUG!_v4G22cw(0mj7J_GSt0{@^} zYj7J3^nMe&%|JU1wBOKu*g)5s*c%M)vj+M%6MKh&o-$AYZsuB|GC*3Qu?Ct52&9md z+Ws2bV4!vbbr`6}K)Vfe2_WUt4@h&n&cuGgK%X{rUop_#271gue+HynFcCuilic&< zmy#Ye5LTtFaT4O!GnHVO!L2m7y#}|>;P@=5Y40$&zZx9A%(?uU04ZIo!QEwW-!iyI z4DL~b8+^Zf;xiPoldISDZ7XK!Dy)m}c~=6a%t9mhf5k7KY!jF-1H)(61m;0t_yn53 z`~nz0KPE6#`{a{e0>jU{eAZKpe>WW>umhUkB{}L6mwzW69#cS*i1Q%-E;IE`-y z9RvVPt(QE>ALsIiAfVy?xx13$8IZ#*;j<3~?d8le?ON#a!OaUa+&7ngEpurw&4VU} zUzRZWTIbSWG6l^ik|W(vhfBjuf;RWcxdMGL3eEWJ|!z4dZdT08+-lOPQ+}FFFuT;1=7GnPk`+7MK z{}S^FPV|$Dv(RAsddo1>uf{ZXhD$d`=+gJ~E=C!?NWFI7wTSzFQ}*?8o$%F^fh=@` z?CYI?%GkskBrc9_p-b7<%jhL36Nu2I?CZ@3gZG1OPb$BZeZ3T|n=kynOZW}4ulLe4 zy7Ya$4}#CNpu5`5moumA>veba#>>mO7j8e$FEh)7mtZTN%&Pql^j}gQ(&6o;fR_wa^w0Q+>Y8?edgf85(7 zdvKR#_%Na^>jCbs!v;*J?}W3v^mt zv6~a&Du%B`n2E1qU_T@81Y}{Ga`eDC<%J^WfxIhz)SLZK5W5y^FnSa)X(Q%LvDi!7OFVmq;Q0~_LEo!Gt+<6{zb%5}7F zb7OZy)1R^N?)11GYy831-oF3D#x@m2zH6%TvwZ5g*ilpP4>ml%& z^>x)&#;GG`Sed7eoM~m9I&v12%+o5@%X2mq&QBS6nw4|v$T?Q-sUzoFd8dw?hvR)u znP+vCH8ef8c5O>*<0`xrd!1&py$%l`hOnu*p%EKdH?*Bu-@Lf7rQS;P3lmjWzj*CZ zU$-z34Xc+l`Z|Tdud8WZ?duZ;@9u$3&%72QpvSIsd&TOttE5M}2^;ELpx_sfl6P-z z+PMY$q~aG@q3$62zgw{IHTIKU!Mts|l2N_8ZPyLB+jiZMZrhbW(zac}__ys!?lN`C zw%zc@f?O1kr?A2yWqA#FZOr8Z$BkDjYJI@lXW!$P9C?G3>h2cSdZi-%?(4w z6;T~BnwJ>;L&^&{J>Vh*zV6^yqg_R1~_#K`q3#AY(DOqncXQYmmN ztWGRaVej%vEA(vHmq|$xg|bjLP{PI$j1hS?>+Y+)elmN?Pd$3geOI#KBc~%Uip;X{ zeyaI1YZXG?x{D|Tc;lA6xVO_9GO1u3NW%_`GdvO3y>nI1X3f{$h3#6FsIr}binNb> z1qq5#^{i2Q*KkH+Pi*nF_C2y=XV*9ifK8YqSpW8(BGT*q7x&_Wh@)^LzX9MZWLnD2 zGEjq-gU1~p!p>Sx76|F>Dz?|yWXmrm9}p=niD2DD+TLC>f<29oJY(U?c+SZih#dk~ z3dur2K22F={8~W#XoK$({3;he$KXZUvU6R0qruC=cG)%;zuDlKwKe);7q59AFkvD z{IG7VG0ZjjZO$Gg^@m97r*QU>VmTpx)J*b5B^9#jtZ_K{$R3l=o-%;or-;JwRye=O zvd3n#0qz5eW*k+3afR$XFCqMExN_XyKkM*aXejz|sT7h9cyl54QdQ^{MU-s2(jx}hqPe7t%_;+XhM-Pe>w40ohNeP^>{ zCks*8au_?l9_6I&uF6f_OqG|q-6}tMe^z4qlx&gmHdhrSZzIy3Q-!S9#P%uKR^ufo zGUu8bG$x8aRdDG~Q({hAR6a&J&QvQE$pxET zJd|Z|obME5lZPBkYu0<6Aq{Jn`P>dixxFhJ<#MdAAo!2cTJ@lXWno8dmF0*YelIiaFu zq0&u2RTUOcfA3a+FQ{hL2r6AI57ofKA)52(Q7vnQDCtqP2%1_v@NxsS=AZ(%LReCH zm8{|OT+tVxwUvS6TICGadw3FTv8%NdX%9zuv}6&(hr;(#6RivhLtr=os|v{cRw!sq z58uw1Ql3z{Ief0GuNDeXsr7#5OkJgYA_A10_V9RCYAL;$;{TB0N01e&WG^Zw2;EUt z=35>rTY*f^a&;TGh%z6~5`|bi?J{`rdMGZ2ARrK;^<*mElKOtns!XOQqHTT(cPf>f z>!EzJBt@fVMb`V%k>J7GI>;Qzlu=gl42{>M?1CB(<&=-IP(b~+M2(*Zt zx~#JlAQ3;i@lIVR_t|j*{R@5-Is}Nrw9xtne)%vQwjRdsc)|S|znb<%KpJZ!Q^l16 zQXIdEDKyJKbq3-(n#OK25Z65v$DI?(@9TgjNWT20g+~_1a)W_BYoIR}=vD)T0r6QY z%i?;Mru_{dZVbq>UJc<+F3_J1v>Ztkw*(Ien&KirirWW>HJ4>wWuSwG?qdde)Icv8 zy5k0V&BRhiLdzQgq`8$CT+HBR7~EWgTW)Yo26w)}bs5|)gQM{P{GS9 z@>xJyN@_ePbj;92@vMXZxNy5a?#if*(*P+Qck?SmT?K{K7>HU6nn%0Abr|RafRyv) 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 z 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 E`IHc)tvn<43hlQIqIXKegY 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

g@fQV@&C&DJ5|I} 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 z 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 gCVTtBwR?qoM|#S+n2$OHn4yaK03tt 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

diBT2O>>M})LrKqin`VU3rAxkpu1&V4{ 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%0D#sj6tI}u*kdl0w=3Avvo92sZ zv>r(1xI&|!YV->rrR_nW2{KoCSfi&kdRC)9YIInmH-VItzi8SqjXu-pxJD*c29-A4 zOLtI;M(G-zpwSSGay1&O(Rhs}YQ&EkD61A~T8&1h0x7?&)@UP8A$$-pwrO;&PJL6O zk2LZPbaMoOl)QnOHd50jYT7JKJ5|#nns%N>TQvHCM!(W%KajHYIZZpH(YreJOHKO* zXp+=#uM=F4_tvN{kg`6kQ9h8;F+tPTYji!3>OC)O^bU}!)xT);twuhqyr|TH8V%N{ zP@{1g&DChWMyCTQOY1di0#ao=SMzPqXtUE|99DaX?CM zsYdfOTBy;fK+4iHfs{|r)~G}Ct<~s!AeCd6MmKA8H;}ULVU3>9sV`~T8ybD5QwI-m ztsf1ftk2h|Orr{o762(*YJimW%Qb4!e5*BT2U0mM(dY(^ehH+kzgwdRb?O04dr70u zbZTzcl{^7RN%@hc?E{)-@XBz%raht2As|)WS2g;RPE8u>N*(~Dq)gOknND2=r1Wmm zv@12=Z5llTq_n-D(I0@6U%t~QWtgiiU!!RnEzsyRASLfCjn->)fkqbrDIK?J^bn9L z(X$%80;J@3Q?u}1cAH%FpIDL_hF7LfAGI87@DQhHl8ZG)zLU(>GBXdjTW z>UNFp)~Qcv^rA+eYs78fm9}h+W@=Ooq$DraXtPF_XmmM{D$zcT4r%mPjRuZz`9=XL zz2!hk$83$Nbm~$~J6)sYI`w;+)~eCP8eOK*O&a}FqlYxwuhFYOs;_>iX`gCz97vVY zm*b*rjTUJ1J&mr>=qEs`ymxB!TOd{PM>Tp%rykU_LmGXg(PtW^kJPpRsn#@F(-vs7 zT&Ff@T2#}n*0h^}l%;oQ^oUM9q|y68O55Kx?Hf%Smg`FS1Ca9Chd`>lpKA1tM!eIb zQWJqxjuaqOA17#(t@&~_$^%k4W@vP(MrQ&kDJ?)sN4rMnX|z$JOEtP&qg_Bs$`3T{ zMvZ>1(JwW+OQZWVdPJiqGHMnBf*UX5PT=tGT?$GAF%YBXA-=^8E8s7<5w8eIaUtonhb?a}BiAXT>e zH2RHBeM+N00x2m+H0@I$mG?`HzR{_@$GX<%Xf#!$#TtE2qYWC}s?jSNCFHsCiZ!ax zC^5mcZ-7Q`Y4ov1X3*se80r>ZvXKS^r{juXj_D#?#27OWlI51GN-fp2DL{(WsAYDky{l>OYuY!O#urOe-myS4U~RHdsA=3rP0^NX+NGLyxu#vOX}dM;6;0!PM5QC_ zcjaXRDcW>Ro2hBbHLYILHfh=xP1~tyS8Li{P5X(a-L7eOY1-48_N=BI(X@9p?YO3W zqiJcjTaHX1RSv#Ps(i&)N)>I6rd4TLqoy@$+9plgqG{J_+HOs|UDJ5qROxtH)1K9| zBbxTErXAO`Z!|4mzVVMr$KSW#;Zq}K?De3PiY&jK4mORjd~v~(q~S&&_BY`X>Nfmt zilf|s*xoqGt%!XTN4XC%dB}*mfbq2jgfLocO!CX1Y>K1216XsD17LJ6lBI<0VsTYB}SP63LjjFQBDDckEX;Zt<06|rCbQg@;J)(LE%Ftv0S`M z&$~l0%7dWr0gxEwSy1@MM~uQR81NyF80GJv@Ue~<1y7jCS5#vZe)E8jcEl*dL75&$ z83)RyILd5L_Qz391I55fcTCP|%88?FqMSGix0vJu8?jvc^hFq}$}!4)pe&E0@GBd8 z<0wZ!;p%lP*JqT2HQyK|h(^PQFk+M}Q26+TqU1*->!MQEr0@$Oe4+IshoTPo^4)cX zp`gb$pTDA`!_CBY$}f?0{mXBU2|`l@&)y!mP&2Bb8)%B)S&Vbvc&d&2o8s{B>}HvN zrMPZ?l@1S1ir^X1m+!-O{afPj;B*O|Fn+tKGU^>3G<)#u@6G@^zmmW|bOiADq?HK4 z^RvO>L9++Xsh*S=+~)A0BY+2$+r!`04o@%P;YMomw^VSJgJPG_<<7ZpDiB$Qn0>S72RO*Iw7M3eU$ndE#Sug%mHuDrx-4yXpwp z=bn46OKoVcTOBcKxxt7$d8-gM>{B$)CNJ*mr?os;IlIgVx7wZ~K3Q#+A;}&n`zypV z_CS(t4C1+zX*?+|lKq!v(FEDpuhv6!_UQ4D^kzjKTKwKkk`T8Alu*38M+u?ZCS+Zx z+yGoiioTTO~>&nu**+z~#`2BCB@LTFvAaQNKKUt`j`*x~TGJFI*8T-yKleWkW( zbz5z1d2C1d>En!AMeM$3y^|mXVXK{9T<9_{LWOl9#pkbB=i#0miITYnjSKWrR|s-c zw70jm&u^`d#Ox?XgNjDTzjS&rc-cu@PEQ-+j(DD^2=c@+D6DK-?+}*GT~OTv@{$ZUswc6aUp)fMTLbE#*G8*#FCN|NeC}bsxouc+>gm>a&7i4S$Ve{j`(-reQ%eC_)W~Ub$@5#vApfm8@KL{=9KpD{2aOONWend}Zsw2Ur657UHBFr$9hx zdo;VhV@Bq zZZ6L>$ZFqQ5}DU+I6UJj}AkOI;TgPg3+Y zv140#qpM>lCV}Ar~T`c3VCp3@bICeMUdy%dT&&qZb z9Q%rM^?Q+zmYOvCfaTmuGE$-`rN71y5Yb zEBWm;!J;p=9^7!2BX|2e{|^5bJ3^0aFPjO6PItwnAH57B8eDl7IPxZbl6u89;B8g0 zdVomR$Ti01C(Vh6&i@~`jvR5(J}@SDY(vA&iH}9=w>>IWc7BR}mC1f}mg-n+Z>XV6 zHcSt>TYH7VW7jz<;WqYgaU1AI&qsB#;chQ)+%}^zUIAz~gV#8AiN{{5*FAQP>(1y% zw0p{7OS$yh@4j>W@*x_wcg*l&^8Xk8ar=y*bh>Wk^Y+L8N?z#ySRMwwp2mx!{W1D~ zWgjZLCwV=Wcf9NJjANr?^`*wM0UXb^&&&>`-fIk>k%qAcl2h;5{}}sc598WhdVF8% z4oF$s&(98T{USQbZKC0cPo{49DVoQ&N00S#6r#NziiWo@YTSCT^K-B02RUpUYexE$ z(Wq+8ap~Jn!H~S+-0idcMXx~``o&}B=KXUfz7%cPK4<3E1DzjkJ3l+f;UP8@cK(9H z)J#~g!~YtR{o7AL-+a^^tDLc>R*iG1_a+RVmDYJ3vSfXREJ!{5tlGGKl$C9Er#t08 zBRdPHjWB$WjbZg%*VSpqTAh+BKi8q#evYyIQqGbl*922{oDZd*yc>!GcBypFH0V{gfMhvlm3!G3RlKlXgXPM%#B zXQyqi!iabvG&Q)d2x0K_N2j{vY0&+y!MQ8?3qY=#=!`h)76e3 z?eI1_r=JA>m3}DqLpdh|Rj%^%V`aKMt9mW!K|h=zO*2|V$83Wf@7RX=@Ux;64dq9i z1FytgZ?T=L`3Ou1!GyW438}}XdCTwWFJt+qd@-Z<^ymV|3z*EP>fm7JY0o|O>-c)` zjw5V*>rA%)xMIZ4pPZAR>2KUF*9z#7p<^AefBW3Vtp}n_6QAk){EPD5X=?hg`P=%n zYfuvgX2Wu(!I?7G?UxT=7Hmv>5py1yR?d0!fgxLuot%2xlV865$Y1SkhrE-E&5yHE zV<()3xb}rqDMDO2&WEo^IrM2#oi9M=nl$F|_Tt0};=> zD#tso8jyOAHSwd)PvWLi?s=)peCm0~p?7z<#~ zcs_vV>FqUPUWlz5i@w7l#O=SjeSqF=eA&^#ekZdIxBs~_67`x;wP}{0sD$@-XB(quUze0o1)wbf9SeljXT)!?qe^neo15 zOn<7pR0)|^2|){vJp`@&e=iLMMths8vVVz8Skktik)3^bW_B({?XeiOM{UQl0xl2_ zMu%fcHE-LC$C4d~pr221`uQ8L9P7OkKcP2XiS=J^f7$$an&Xe!Gu;Z=ULNL%)rq0? z@cV}k-2WZc5MKNEjl-!I{}l=$EvW2zpWEZ_=z>a4TY>sG=0OZ&JNz$t<~C`k zqlV6k6_@Rgr*Sp%9g7WhhyPx5;7=c?UXlp~uk^~r>J!U*7%KsvrjEtQT}r++fYgR< z^JZ@AC_Orqc;}AuvZ+qygL*EQdg(4mcH3E(`QXt($mmp11L_NG*&j)RNW(1g%(y1O z`9)CX76&jbciTYUiNBA|L>oweUnV{h&FW#Cce+;avF&AWcSdss*kipn;M!T?V7Q&b$tg`Nxv6v z>S!4m4NI>4n4B)jb@96MwHR3(URG19^e@Ej#k1O5SL@sj*mgcr?~&`;7inmStc-dL z^YB!tw3gOrxTCYJt+hQGsSmGM-_-i4;<@Fuv&*o0KELc# zop*j~X9o>uy>+V?kB)z5Q(b4YbtM``q&-%SGEMte*2T*4?{u`)b#}nz`G$v)b~_at zZtq;ZqB#8vzRY?RT@9vF6Pa4Svnp3zme-i%tv| z73UY{7l!jzuU@?lza{l8t!r`YfaCI3x3xza@SWU9eIBZF<@fSdw05@C*R`*oT8zYK zXG>)2sz?hecqO8BxGgai%{toDiF~c$yjA$GUt8DSkT))zx3DCf*U-`mIpB`w!AyLE zsAZLb&z;JLhgFX)@Z6PHX%sB!h_rVUpvSF=6tqX0BlyfOIT(ubVE4HE;=GR5&i0j& zf`-=Cymh4$j5I7uyMI12u(GkP-LO7niRFeNw!$9Kms?5t{0W^c9ZjoR;4FNE7;#$; zzJ!iO^rLXs#O79X2jK|Xf;GYRQ#|AeB|e`S)N!%I7xD{NeQPHx69zgaNUFaR3QB9E zhLt^_4L14_Et(GFo&sW}6NIo!C_2kwz6CooQFijbQrMGh(xyW1H^ z@RPxRzc~%(g#=c@tg@<_3I{J%I9*kEAmCcKY8C4f<{Wm++!vh<&A*fD@t^Qn6s+ z{EGQ*WEO5m&&22KX-dVcrHke+t}uK~tfr!3o?%I3$%2|C)zu3ZEv}ep_=QqcR(kS%ZsVLZaN%(^T6(8^k1GRRfffup{eq z(2|AGp*07`1dGwpLi~dDIwP2uybubEkQz=qj9|eD*?5w~A8OH*!bH|tFx1l4T(_Pb zBUmJqP)LvLMzA=Y)sz-$sauC<5rQSckr`@SD-YfT$De?GXpR0MblTdL=&4a7I6+vl zLTdD=ZK^kdr9uk3BxQjSoY?n3B0ii2lkmV$aMFO2Aga;mH3D|0B|KxMor&_KV0LOG zJZGxnq}DgJ8wt;wAtw2awDVBL)quUFu^H*in(%^Y(G#);kel#^nKl9)RLMDFhWIe2 zk@5>NzGV(zW`D|H#@;nUmmw`Pr9WfuDbD^WoJl3TuVMpJu4C+|ie;rXN7h7|jf4+i z4{{DpnaI=+RcbipF2+7mv0*8^pO^5lie;zNF!qUxJ)H3b<4w1ryd|z5G zJcpy~F7kQp9_RDgeWK56cd6oZ?4GP*j@?sKEGxAQ<7aEVk#LeC3{Kfg{nLF?jBu*+ zk+y^~MHrUahSPV%NSLA6vsF1OR4hl8bC!zbs&dX&vC*oWb5v}sk=-C{Cw-8sp0Oy|{8VD^91Jtt#e}vrWaaQrq$QxM*!hUDQbE@P(*m zFzT$qAw?A_+hJSTigsxvboxS80`7q-Mu)gY5erl6ach4CCIUvnT9tc3sya&>3F{Qk z6eEpIj53^7na0ME5sRm@;0fz})<784>k&l8CS2-EI}8rxh3#=(xIE4aSH^i^XPg(V ziu1zNt`~3~ZHEW0Q?)rbHA3^RcPd-eN7dzxDwb=c)9{2n zJ}V5nd%cWEDB)ILT1C(;#qEmIP`&F;Ww$@IxvqUxq;_@PDoh>tRsV#06kjm4gU=m! zQ|?tMNk%%wC*0?={!Cp1Fd!8s9Pp(TWAsoSd)Cz@{rb5$kG&Y@vEM6Br``NP#hiBY zM-|IT#i_BSCDPnsB)sC2foHJpGKUpUIJKj0bz3ur#DrHBWmu|=hzYOxdeJVYlf0=C zbCqNNq++9$V~?oVSmoHaR4m`H{cJz!EM>ymK767O)HIre5*gl5c1SxqSo4CBotT!*cAKV>995)Ern7eoi-$tSXKpM$!hLY>x|@cg2RHnFnIS(hta`o z8P*M)Biw<0#Gt`QooOUG*>sBSXExh^2r^@d;z-*+T9SCC>&J7i%G+U>gL>661$1Ve zgJXZD*XS#qnrLfVS#z@yd@;l`+zxOLV3w|YOIkPsju^oM!gu#SDjC6jqWCVYm~#Z=c zx?W{8f;ac#rj)8s!rny(z3=k=NW^D^{uTeC&K8&bYGI!p$3B23<*tsCtHp?$ZM$UK z5TA`vG!J$d@sszNCx3x&$PEztYi1!BP=;1C;2Y%Vs%b%Ft*hojQS)98YO>-Tc5-JE z<}>Sib@8J-SY`yHy#`}y(qj|qdWmiXSBXyUYN{Mggi;OiHhOoeSc3;Xo!MZpMe(}_mW>!2y1nF(;7T&=5n9H#S0_xs@|NjzpYsZ#TQ;KfQ{f%n{9P4 z(_#;!`5!O`pO69_^m$iLv+zc6kr*Ux{~NvSX^EtBf`#hlww8gus#)9_Ku&4iWK zaQcgW<=?OYIaqfDpK(2=lxCHc^g=2g7Apod3&g$%*-RNR4U~C^RUnM0LIi80##)4& zFOi!i9_fo>uq^}$f4NoowgXp=&Baz|7qkz*5QKY?awo#@C?bae{zz7uaD=QU`I07* zmD;~T%9jY)OcCuVC{YMOwDXZMURmO|bRcA4W^5f-GKOuSj9O6Z!LS@*_##9u1-J+y z=M3=1?0u0kjGP%Da=2n4EbN|%Z+G%3LGl^hJY9|JAji`~l&5cp(*p3Rx%;O$=_*eT zQJ%gFI`2RjjlnU}vMSnWm_w{0vb_lE(+FdDSpnhc^oe1X>Uw zZ!ejKSu*vOT6+*W4J@l0X10~I6_p@y?m^YAo z7$KV}V$64leT^W-426k95S&Wf3>m&TO2)8qD3(f`0ETf0Qi<~b<|5=|#WlJYDZ?nB z^?M;iemJa~DL!)-1<~H+$afY6u_T=U9SBmk9PYCoa|YMoF>~yI3Z7zag#b1SUk49C z9~ynm_mQ>*X+mGagCBHB=IxYWSHhBqXvuOGr`!tt5cNI$MNqdxDc`gh{um-R0qkMq z9z^Z~xC=r2$;`e@%skeYw1An}DGnp~WrS>|h(G_1*aryWPd}(W1h|5o;$_O<52t02 zGmM*ciBAWBsUL#)G#_9rbLH?0U_1v)sZ?prBJ_lN9A`tgzoEGmmr32a1V<*POMLE= z!RK~#olmKF_y6FzP1Pkn_sQVHZw8i8t2Fd4ebUhRQpQpQDgOP)Y`%zcnP2&m>X2WG z|2C4}M95}}6yJw=ELKfa@%sbxMacOExntE?2p0Sm@@t4ZUu=drPraFiZnYII1IKDO zZjZ|$KEN(e@BzP;*z;&m<1TMI<^PK+e>GGsfnIa>Ox&v&vzhQOzFZl6cNs+-^p=7} zs@**5OOg^6!Td1@*=!6_!aBrGN017>5?}{H&hDN{=&coJYU`Nvsxs*#oQsu7M`4nx zl2?6Un)EYB{V{@g|4Z;0d+GhxeMx@;tJuc38lObSW{TLx_ZPoF5Zgv$%*;i|nbMPO zqeg-n;iS>ibews$W8?v4*24L`Lz`io6Q&8Yz={$He=TiD_VK6cZ=)b4|R@ zH<*5W9>RZzASU*siET9T0bkNcu!@PFA^GnJ*-Q}=vvFxP7(q;21W=8Tb4HIQ&Igqj zAfwhf$wqN(A`o|J;n=)K*=$|{{Uw`e^&VdiO&u4zbwFCNOjzQD@uI^K)9#4j7rT_0 zc2z0kcvr+Q+kImxU_7od3^VHM&8f|JKGt8W(mQ>!wl^MM@7I(}QR!(AT`oHu)pbhs zatveFi`SDdTB?Ror#e&<{1rhM%IiwA&Nq&NcYv@BL8@XE$H41hleyBDbO%=Mq$=)2 z@~sHjOp&U12eCI0q$+yj`Zg6I=W*oj)>>rZu^lNE-MQ8l4)k@GBVn{7foEGKVYF`;8IXj$d%iPa<$=HdYPspf}^++ zVfqHfM3}xDDV?Xu>FYMfh}TUqf-}IcQ9tHx&VyBBd)<^`UW&Thf-pvW{<=ApcKCMr z$2J+}o2In#eMr6qL7H9?L>Z^DU~id8dH9T%G`;7L{0u@iQ>5v=jo1+cX?p(v_yQqk zHgb1sdbu=;w_(gbn~8TrWd0-&^7HT`vuVzC%@@q1tC+-zLpCX*B@4~0KZ0nP2`~jA zXH`#HN~z^(q*(lcF^2h^X^IxnhjZ!;NZ`fs@1ZDmPL(-QA;0_0Inv)$nsK&x9 zRHMFjfOiyAmD%;Q3f0m&=D;Xbwa=MyHdW2;IkQ~agSTosSC`>tgj2EmRsL$6ujWg| zz6L?+w7lPxbD+;XErUh9`TnS>PRpC%qjM3m(_A;+j@T~{#EowPuyf~Jjhx*o%X>08 z8MmC>ONTp5lXoLHeW?_Kn(@McGUyIdPA0BF2{h<9dG2xy`V!hcM#v^r>UAVK;7|lH zXbC_KLe9*8XAmwqmAgB5QG=U1j<I$oGf#LbS1O_o;U?z zvRIIzh|huW6vD7?Mkrx^obL>?ubKD^3NdK|L~~WcC}8?>o)h`Qwrln?6F($R1O(wJ zyaL=@M)HUC$YB)T2%@Y-d5O<}cp5mzyTsV6yzm30an+{MO~aF^g(*M;MWX5LHYNw~_L07ke-?_9ia%w=Nt6hT9tk#ped(W9CHV*Q*?$U5Z|`CSTmSPB`2bub-;%ozqz zBM_xbuaR?k|JpI`8Og*M)qKfx7cxzi_WX=HkWS|X*ULziKl3>?u(Ldq5VA>?L7@$? zvk_!axDjACLQWR6$GIpo)L6;xtPInYeg~&-4f+oF5SZ-lf{s_yRiOb1y ztILw}8=zPb5W%0cwpg7z-fWes<^~V^z>2y1H0W36x5|ti=AR_aJxA>P05-m^ZEqJE z_fp`MiWv4WBpLh>!=i;>(XcNN7u#p>8tSj8Y%^%#=f{cHqcVo`v%wt@(26iTg2)X3 zS0TuhitJXH>^J$6Hj$r`oF|d|C_*+2Z1LN%@D%AqW`#`fmHmc!q9QIsb$u(zwbKV7i!sLa3E1NGeB*j4U=G5-$8FcyPLe~IiJ@!(%V$X#jhH#Wd@Ay1CBqc_ZB zK35eE#wS#G{)NG@h$mw>AvBfsD|VPc97l0J_9JMSq3Tb_{#}GD#+b_Lg=?%~1XEdg zfLw%u2aq~e%xsv#lEbW@L5z1Y?RGdPE97~(g-aOEW97N(=f@*UUj9BA_D(`5;^l96 zSH!FOxZ7a7OoqOBB@!>+zu`dJ9%lEbR=TD zZS*oF;ppCUg-zOyL?0lSChddE>!}C>pN+G!hb5I868y}Q#os~ka{j4KdB!5mXasXP zpWkhm!3`FQA7WUEF!({+qLsZA#B2F$k=kxntmIn$CdB51KOs+FNZ(d5V9C!8vF@twIP_Q{0#63!oZ2a z@2kqMVb>eMsKG1w6|~E$Ou{97ehR`=|BEiP7o_o83` zeVNyj79$$-Ulef;hWjGkp<@ww+s^6BOQB*7q6@fF#}`tXqOC-ZOA)ddV~Tb)wyr=h zMSBMD6vDuV;+(SkvRp(%jCZ=&J$fQ?H%0ppiQYjlMN7ja`DBEFFUMK2i*^fy@ptbE zITrA0iWG@&@-q8AKR0m#f*BPq23&w(c7YF}EN3kk)n29(oKw7kXnsB-Yq3+f9vJq0 z2&Qo30Amnl@nILK@ryc)YKe&PZeZc&CLGzGa-pqo!3#yUv5xY9hs@$>^EdJo|kdioE*7YODTA~Wdo z4Ej2QJ`R4vwu~`+Dv%GqEP)m7?3hBquJz**$oc3@_BjAPaC5$`Ab0lUKF?#0o!Ok1 zZorta%~YP5g!YH1FG3Ngr_Nq+K6E_eaAe?QG-wRwDrmZ|~_o z??t`!Dx!-*kEd+H`p&YuTP360xJnwR$}4_5TS(!T7}s4e7!Ai@W+W062~WU z(;tQcA>i|zkVup`4@BJtK{W%FiVuu=ptu{{y}vIn|{m6+=B1``uw>Y*f;<#EtY zf=05@@Q+WV!DMJ8BLOxGQ>hWQlc)ffH40OynsOAp9S)VA@K@7dwCmHsW}4e3y1UyV zCVFu{C!pT@{KNZ9DaeXC8 z#xTomiB;7oqo}Pip=~qlKE*<4})kQ*|o%~G8(fvI+ zsU@EKrX%wXtQDW1!w^rhkB4nvog06aQ+~((n+dZ8c0JktOFd0>r^eLG?KXZ#V$2p)Xw5ef{z z{#Y?kYA-$vk}>rJEBjhUKf%hm)=5BiQkXT;ya4lWn=DGWlH7`&)E=wYN$fG7Y}Dj@ z#%ZK+qPP$%ewGZ%8V#UEwh@=aG)hz>f$f^=s5typ(3}h#TU*KtP*tW_b(6A$tG^j6{tPRzSK?^<620chD?UhtW?cw3PD60DaJ)uoOhX+BB>G)8 zy3*)@*(h^hptFt?A-Sb#{I%|s&7CSz>h3bUIJblF{s$5kh!e2p{U^Qeq z=`Hh&ln=#>>wHG~u`!_eGYOxG@|Zd)6Angx*<4`{|&jeVS)F2DUI0GsI<^u-Mjcb#<174=W8Y$`@IDc!<~J+*x4* zuJKW&eu%-4Mx_aYTunr9>x*lSK3!ls2D-+?4Dqg6wnm(5d_d_f1h;W)zz05(^cw^? z!}~4#cq@=AK5pdJ7iS!OX3BI7bcTr;;+@%MYs5K&i;@r*80Cx1CHGY}vkuK-T}^Ba-- zsKdu#ps#~8HsCcM-{GS+aGy%M1i9j)Ii1~i^ywzkG0=S`W{7t`YHPUMXRelq$u32} zasN52-W24DxBK00cGNG4>6f_lX*IUs(#vZIbe|7I9JJX{;58&Zn9*qD+1GN-hbmmV zvgP5^C45H2H3Il73MU}M6%%IrKz5u_F6N3Vs8J_BaKb4NF)$^c`e0zi#dKt5FdOnR z1XLMU^AWt(s(l7(MD8Sa)hbLO$$VV8JPQF?Z^G&lL9Y1xMCZnI^yw4RG0-O_W{4|g z!eU#aQ?`7Hg3neWTmGyN6Idcwd`hBowvIl{GaUo7WnzZ-Z29AEvEE_u)wr*3qYVrek2X zOw16U?J8Ttm96O)+D&jR3WC?!g{@Mq-ZWVJF;+?F1xU!%B!i_~ohZ^4tS%Si)8@Z6 zSjyGy2=IHED-YnUFxWX8=Ekhty9$)~o2U6kT+CIq!C3!?2Jc>%BEUa>fBXzV%@QtH zo>%ebYl2mh01K&Ng)81B?p(EwKC6)F7+AGTYy#vE$&#=aYq72!$zwG`cs)W~D_B3Z zrS4XMP4{vn&cKdFKt-H@)u{%Hxw>7XT$$UOR`IjIG*jSGu8xwjABWWtk#d!d5Z4OG z(1(O}CdUJrQC!7)tScd6F7%%_Z)rciEKEYJ&TcvSZj%XK50x1prUq~7#%XjjvD9E) zQ^ngU)4xHQY!Yf+v+^<##v`yPr(j)WGgh)-j)mRb1k^ndMsU4umDMx5ciK?g)ajiX zYf?#LZV+CC%XzfQJ4!d(%zJsC*vuPDz0KYho7bXP7Vj4R4FM%&(pwQ+h4pECT%CGe z(NuB8gFi^$9f9gxFE#c~q9-2;+CIBhQABJtk;T;6FUS>tgJ4bz>HT4mbH$${;5^@D zgGDicG8*J}Dd+^(n-Q=}am61*G5{xTmq(!V!I9PW6a;fpSAid?%&E#QjQ@VFqm_An16*Ju~lTIrg3Ld7iy?YAymeGh! z+T%1zV;brmj`A@J;tv1DgfUIDy5-@0$7c{wqwiw1Uyv)_Q|vrQIr?l3reola!^8}6 zJuBf(Tf;T-7@u&D>P`fj=gqh0Z8mZA3MU7=)yUg|sNzNsOwuZ|YR)OVVvU~*80lj%fkSpG6gp=q+vT)amX_r!)DlW%77H>n|-BF0$7@`M^ zxP&Vvbz5e?qsqNTWjxhXN z;_K)`wXVHV>WImFP{$OPKj$tLD-6iR$UlP+Vap^mSVq%!(J;PRGwB$~#9u(w? z_X9f@%h9L%Ovk`tF)>4Yv7)v{r>1AJOA%14-(&TXAXmJB*tu9S{gRk|iAz6LEG6Dv z{8Fr$b+$P@DB=A#K3I*`<6XfrLEhRsNl*rA3-@mjb3x z-MokC_9zira3f|?=Q?KmOrSn>SgBkK=UmGK4DprycU!w-Wt(J<`~SpG(}_$1yS8Hb zCErs;X>i1`?x=Jqx%PwYMfq_lXCZ;#C}9o{yai{L6AKCT48c}A#X zwS}WUZzVE7m#akx={))etDM6>Cjvi;p9pv{`tkPZk4(bS^ReRnP}d-1c45_F?NgV5 zy8sg~#J5TxTf=p2+G9%iG9p~IIS{ene>CEgxZ*w2jy1_Uo(IiD=^~4F3xnolKQd{dAs-p^zmJBtkHjy_#yItCVri5cRHbg8Z3Y6*{V2Dbp2rDK~# zqK_h;%N4JNxQm1*Ww6af$9nVm4F!_I*W61I}Yu`(_d$C&b2RqjA!G{;!F?rLdFS%vv8X58p4|h@3`c= z0>O}sz{?ZPQVd>-z>5QWzDLeDXW?vtp(g?l(Ay9=WpEbfpxp);XB*DKLoR0`Jl-H~Y-kgPcyc6QYJ96jlh?Cxt-woaS5qN8YKd*LfTyz!B zyA;mC`;dIGf^%EYxhLqvM|#Q~N!~-7f>3}k9ibRuF@m$W^{DGC&b_ye`ix)Y(mMf< z3HhvVAjNN0zQ!{dSaCQ+@Wj0y(HdU2DmomWgQ{3DeEFDhV}_nNX4KG?_(9Q`BS#Eh zUR$|>?{Gp27dF&a4qs+|)G{0qr`zu`#T*n*1B-lEB{Qn5tFNxCj}BYLk-Q;Vg_rjU zQ_*Z!VjF`Zx6QlrVw;ZDn8dcM2^!Wms0f+ShLfnAb~$MJalUVkBHn=>zdtq2pB%tC zu&}p37)bVe)&{)C&4An=g4h%AcK?JMo4_h5qh= zoBbYd0}P5vcW>f?z-LI-E8zXT6&wazslBk71Z#6>?S^w*=H9SquQ=5oF)p3#PxAP? zukfc~D=FYzH__j{Nb;KNPvfTNG-T+lTYxODKi8G#o0eqi4SW0%?@yrU4G#;vV;5v% zz`Oq(=9-$8iZUaMz)X`z_rOAb3bH!nPlq(cqjvxfH+ek%o{08Lf~(#` z=Un6Op6d7i7bFqy2E=(51=cg8?vMoG*(m{UzZwWw>f{;z9<%+y50P@VKM@N4z;=`@ zZP+V*&*Z>Q?aJ}Cony*^%tNq=F1TOX_ z4nrDmV-(`VVS$C-o@RRqw~xg3=m#0S5UzWV!zL{C4EAK*m^$>X^DGE>KRi3W0h{6) z@CJ7SZnmq&n>2&%w=ID#q6TaHse#}6`vF4}{i(wsyv?7%t!=2OM&$Zev?jW-$NT5A z2<$CrYIa7aqx|lB^I=`wUtJ3J3O2w^|(J7^NvNq)ee(#t;rqJgl8?TL;_lgk2sN?&%3i3=Wp;Y3g1 zD|YA*hl2}|;lbJr8GNd)94dyZ5YT5a;Y! zlF`NgenxM_Wpr&^Mz43uX!F0H(O=^-x+pFqyjjEV84-sC!Vcg$EwCRs zo6)Z(;C(~0hNB7yRj9#6&vTnDIgBzC{ZSM zS^q?o#T?;>Q}CTuFrHi_=$0_ zyK(Tra~%(#u^blz-oLm#yu^6;Q5PQm^#@fV3M&U6lPbvGu_iF%lYsXi4s6|11EBl8 z9vqK6-d8P8;I3GO{n72tjmDifyKv_RSJ;QBFm_dc;B?aqr(l1ah@%?zzzM9jch8Cq z{vPi&$QVs}<+jAK_!d@^9>M>8>_^?2L#kd3H&jpI+pIlk1) z^e+GYdJK4PV>099b@uvHd(!rx*^YIa=5&l0$^L%V`BS6*ehbWTJ+Rhv3C|%-3|Mj-LMkVD-5=0Vb@M& zaRbQ<{K46jEx}~anVe^E_qo8BWIb~(-C<&Q97>1Dk4_AaW{Y^MUg=_9n2LjapP`6u z#I%WO!%gw*d1x0?#9sa|^l*Ie2Tr!D&wIb*dp|d_Q6UpLXsD}zz zc1|4n$0m$}(Pcli>-<`%eT)6b%*-y=X6`UEyVw-_dyX2WvL~@ly(>8BOv5a5F}Er? z=j<q{7O6~x$j{Yy4A02eLZ4NLvFEsn~1ukDb-p`@d z9mg0`f3bZy=E6t+z6%@uY+Ib$4fT7@U^RWQ4rSMA$#<-##gI415zsj32?URbW&YN` zpZUeeJg(e-UH6J+?(trN8V}~ha{9x+pVM~agi{*7=OUKz&2{cW_*IDWoNA_C$S{Q? z!7TKRhu3k(`M&esx4Ik+<+SNe7-V0FOfuE#?KgwRP4Dm4VZh-;%;S9q8WC>=hqD0- zGW~tLr*Y=tO`M3cN_!{>1xgIELva)tu+X2{!0wfrig{KF)Ytj@Lf!`l#K0stj%yMa z+$ZB08t|ThaTRgLp6WklxPRbae=4swFy)a*$+MCp5!)T()3Ihf(|?RvueA3APG8oT zaWjmwQ)k?a2E12j3vgd$F}+u#RIyGkhYEX2It`=c9mZtb;1bwossm@){{MpC-Y?vh z!D{&Fx(9gn`3B@VE}n1i*TFY&YRNtmoPpI2yNZ_j3n4-k6;6ONO_);pF^l&8;cOdX z^TzI|1YWnWXPrrb>%O-k>09i)w8K0RaceN2vS)o!98e=zx<)){_r$7ca2`fxz>LaqS$cK6>`6~$^snrzeHQ0WmpuQ9iOkW;{f*B zfcN|aUYlU|?#E+tb(Cc|nnwlz&vy^3?Ruo_)M?J_+-cy0Igde%_b{9>gOd02wKF{C zD7gvw+INjb0H_OlRk>|kF}fZGn80+oB1>+t3PHvO=JyUWUBjbr~@)< z!h6Trn=p5tfk`7OTgT@FKQ5Q@g5q>@l{3$I13SN2WK~t;g-g~7c_nO2DStUGcA8hP zS48<;n{r#DrlP941M`~_v4pU0zq>sqvtNrQ*Ef+PKRHz{AO65a)arV?HNlF#VISYj z=$LhU7A1Ta{F26K6fcO6Wm1H9!k6#^3YO%KD-Yo8l$&**e zPs_{uapoX={AaNJA|`Ft1P5^aau47yES-hvv0z$FtQA0an6 z*p!f$99hsKIheaE**7zBL2@t;fH+5Y6}Zf$dpdNdLM7j&i(eL*We@(&LdZ)F*7ivD zO-n3G_BlRf!av+D;V<;fl8tS?t;hBubf&mqO}FEDk1>}aIe1<|ZgQx}o0puPP|+hf z1P6n;PbB-MCMKNh+MJR&*R?g1c@^8X+Hi@QZ=i77N=x_y)KO|~^2WH5I( zE3*_5REJ7XCGi63GsZ6N4?f?u-HjcrOiirpAeoVL~&3>6>BOlTUKCvF{p1;fK z6LYYIzTRaInd#~i<4mPkmh)yHx6Sl~$*|(|*=dOhXSp`=3wscS@49t5F^(} zzDrz~m~gd7-O9)#lNn)gUJZ{vhtA;3O-v}jYG&dotQ?FX)(Hq{)=>OC(NLiht6(rf zz*>mExd>_2+4w7Z?C8fK1gu+Bb|*+u+z*lzZ-GRQFF};p2uNa&0!@KNnl%xWXJ`&6 z-_SacW znsp9HQd|O(+^z&kZnvszm(r6OyBBmEtOTt7K|Duh?2QD8m2n`kGE-&6Dq97Tv^RoE zOxn9t?>^OgMrC_c_7OjnFZ+}{?p7J!`zcmF0m**Exsv2D4m8zRITob)-jD11$UQzl?`%p;Ryb#3WZJHHT*4yarAL+ip!AW_*GkRXRgyt& zYB|#EGskM|V5MOi%l9BkZWEO9m8L6|g2eIyCBD&6(*8tgozgi?^|ASuUZD*Fl~{snqD<=~4Er9@$n#HOn(L+My0zCl+~3`h91Q=-J)t+M-+9##6i($gUE>NSvfwO3``dpoh|An`8?B>oLj z%2B;BAn{2#$!kob2tNc?M7*{w{_LBH1>RzwJKezbfwbOAhG-#kd$qw${qqqZqI?l=NFXT zPSgrzz2bZhtMv&Cd{VIDHBpy5i5)b~M^s>gjt+Mx&{;Kq`(x)Ktz=QXr ziw8qMBAWmb59X+>3?v>@fW(7prPDRGL1kwuZBW{*)B=*+t^kP#cd6_#rDv30R{9ns z{`DH*P$fw0)vIii($7HR^TkS6XzcYW`<2q2AhCB3NJ{>g%JwMzQR&Z02bKJpj+G;n z#wg8HTB+2c^h=P`%MO*@rLy}~_KeD2P}!fA4r%OnDjR&10es{Kr{&meMGtDN56n z<||bw)q%vTi&VB9B>CQ<^Z-b_dRS?f#y+pI7nR-w;XnM_t8`H5J0)+HQ{$;1$)k@_ zrc##DP>@(20g~3r)7WWBMH)L#Web&-DAg#P0TRn=K~gUpRd%(~bxOZedPwO7rB9WD z$2yje0Ey*Hl}%KdtF&6F86@qo4J0*msnXS|cb(Gjl-iVjuk=Tyca`=jeE|~xMhB<*WT2Q~I{khE$5mz_kfhf)|MvFR$yP&!s= zu+lJ)_&fZc40ADM=|ssW(V`$pYa& z#;a_VjRr|>vsG3B63f*}=V)vbNK#y?u~#Zxt+6+$?AJ$_9cYx3M6}ZGuw1(sZR+ zAhCA}NbD_9*+!)slx_h@9uI&dkB60ZY3#Eq+oSZl(%VY!gT#Y_Ao1WEm3f9Zx%C7| zZoQQTC>^6T2qgB#fW+P;m6a(i1&O^gl%h&&ls1CI-gzJ?`4t-bOQr1^dyC3$Q@U5_ z0i{PkV);3cc>21^-T_H&e*=l9pDKN$#M^KZ>j#OwRFK#^Qf0>|jRHxEaZ0&L1xhnO zVsD|+3XNT*v{9*9>1Rq8EB#XGTBVyolE-ZzDeuD?`e5y{@tEtL)E8e^dHY=@3YK4j@zUv?oYpeL#}iAQ1lJZtf7J(Msc$P5?>T z=}I+939w-2ri4ocwk%T#2XR}59p0u9N@J8}D$P-vuXKu1rP5NRbCsHueya2{rOT9l zuC!h02Bn=!4=O#T^n}vuN^dKDsI*V%E2VFhl08ms@YB#zlgBF!QyQ%_UTKQbRHa!; zbCs%;mMPUKH7H%6v_r7M*9$yM?6I;Fdn?o-;M^s>@hN_&;|De>E^V)-+rLrNiZ zHi?ZW^;P1tc@jH9X^awI7b~&3N+n7sDXmairNqy;O4_rOHYuH_#Fx*C-qlJsDBY~| zpwc5sPbfXD^tRG_O8b-!C>>VvdL0k&X#m@ou+mXV$106c`mxeXB|cAh4Ek!oTC7y1 z)Tp#psa5Ghr5#E)D)A*%#~8~GDe)DUBHOL>y3*T9e0k_GCM{o+CBzqp3I&z=D)mdnJ|`owe^P^wm1sq_;iK4T+R&Q`im zi7)e(SUz_n^lPQxDc!5|tkNE(SC#mBF|qQ#(w~*SQ9|do^@2(vr8K2SQx(0REA3FaQE8{rgG$dUy{Pnt(mP6@DIHQe ztmN(Hc+f+MuUZqYvXllXWh;$Rny55csYK}{rR7R1mG~@^K2YKlQIhs=N}nq6WpEOESScmw$a*OquQW_)w9!RD5YbShAQPKL={lvmly)ldZL;Fkb4q*?Uu1lyTN|Ti4D$P?`q_kM6LFr7TbCsHuey()2(hW*CE8U@Vm(mkTPbxEUTW=FrJ+hWO8n%L=oKpQM|mPEQ#w=WETtx;^OY`C z;x8k_$}g3!Rk}-QrxJfRAu0HoETNZ_URB~J+9mcQC4PrpWC5jQrJhQCmHI16y zQ(B_L57Ud@TBQw2o0YCm`lZr!N;fI(RC-Y9S*1Nn{C2$L+pcs_=`*FTl@2TMEAx`J zuM(fO7TK{%LzQxr_)&V%o2JC4twqMCt%YioPFLbH))Ko(sYPk45?{3|di?c|(Ctcm z?pkCIC_Svi&(TZl%S!yxyvROM;xpDF<1^Mmhm~SaTk~s|65CJdXeB;vEwTI%z0d?D zeve*cB}xmGPF3Qk>P4?nX}!`0C4N3$^nRhVL+M7PTb1rq;)muX?bAxJ=d)i?**i+_ zEAhMZlJ<}iKRGY56s2^f45ed~j#J_n>LqQi5}(BuS&>rgsqFbG<5St9$EUJ|)+nu4 zYEn91iC?6b6g!k|QMyg(9;N%0_yK!K`v)a{n_gu5l>VmlsnS1`zEk3->?Liw(g3An zl#W*#ro_+JOWN2I-DN6Upj56@sdTzhtx}`XTBVDXE?2rn={lublx|bHN9lg0Hl@dv z-cWi+>CZ}kRrI_ulpa!gUg<@p50w6*^be))l>B`h@A-_n zl%v1WQA&fAhAQPLO;eh!RHC#{=~Sf#r8AYzRccadRk~1VhtiEo_bNT0^qkTQO0Oxs zrG$%q){hVp%?ov;4zOw01}-q$gv&WL;iSkWJcMpjSN8(5G&Wmll+rk*iAs}|@|B8} z%9Iu;EmB&nRHd{`X@$}nrS(c1lr}3}ptMElN~NomwkzGBbf?nYO7|%}r1YfHvr2oE zURK(x^r6x|r2|Tbl)h2oD?6lBeM)?rhRD*C(v>ol1}P0u%2pbsG+8NMX}VI8(gLML zN{f|Z_b*qeEUL6dX}wZccQUtW?4?TEm2ObFS?N}#JC*KMYEyb#=}Dz$m0nZo>fYyv z8hcRbGo?dH-zf2m26nqC#qNiusVrS7LuruG5GB69MC^@H8mBZ-X}VI8Qn6B*(qg45 zrDaN8-CvDr>;|RHN*5??QMyuz??@5vw<~pZ&-GS~y-(>Or8cFm| zF&ISx=4*^XYgD#g=>nxKO52n!Robq^_tP9>EZ?kjt5R2YjN3H!aiu*>hK-=lIM|H63HTPg6=)%23Kw%2LW!8l^N&X`<3}r6Q$br81?( zN>xhBl=$8r@pP3^?B4bUm34J*dyB?isdSancBLDXZdSTg={}{0l-iUYS9((ES*1Nn zFDva;`cP?~(gCGIO5Z5)^>R`hKBb6KniAhRC3>-IZs}<62?+AyHi;divLPUmjZ@h~ zl~t*1naZ}Q>{6B8sU@;WjfNa{JF zve?);QDu`=kK>Toi;Y9isw_5waEuVW*cg$9o+Gk!?L*^K7TZ@Bscf<8tx?%}m0hZ` zD^DMb5vCHhQc~D*>(4)zS=M z1i|PSgY^{ouJb|q}aT4~!Oym)>^BE-Bags2$R>ese&z6s+;xlcTD1A)A z7ge$@W0Idha%Y@`&#Q5dj_KS2NpYOyQAoDON#0{Bobbd_eN74O;KwBC@Q$x#j7j*M z8DGR0lgxsIuU?Ev&Y%wN;>IMcknk0YG0F8z6(_k565ch7>F~SEyxSF%aAv_*8pb3& z&|5deNsfkuuPcn{@F_3e4~a=mhJ>#sj7j)h7hfzGlW>3G>;FVDELy!Lib8N-F$mLYO!4;U!cD}N8a3dBvd@{82;o804 zWU$r|#toxCsgs27xst`vsqQ4iRvpA&~+DS68lZ5Y=iciH) zX~s)7care=vUr_4<0QMWHLR+7N#jzy8oH*=;ff_o>Z?~fTllb_gBA4^wM(lToXz;H z70YY!nLn}C5Usalm(N8&}GkvKz`v3UZ6wO0$uu zlW@+e>e}k6PU6Das_Hc^>8!fOhU&rwG3}Diu)jFiMU?2${?z)qm5!n-ttjNJsB7r# z*4##?K%#|W$&0wVD3(SQ<89#hT4JXx<~CN>uk9p-$=o&7o$X0JrH!jr)zwG4sG8Z; zXNpQEi}O}tY_9&E$dbm|?};gm)~))UsQhYlfV#Ec6FaRsDlw(eifCi!l9X0Qr&TPk z?c^uhq)Q?2e@iOYPU$$M##wV*74KJ?^@;3~gRtU*~Rv zm^ssSqE}qMd^I|wv)i3iv0`~u%&H@HcH7P|rN~isJ&9Xcu>#|lt9DmbuWYDxw?xd1 zj{Ce==;(G$eYLyK#FEE#`j}^~;i983Hd@52=x%EJU%j$&mAiMuG~K&xN6Wg`c8rMa zv>jtQ?3EI|v^rW{yV_NK716rouFaS?_D?pSPNUH~r zD9e^tRjgV*tZsN_W@gTqF=Iz&kIf!8J~MN4b`B&XvhgP~Cp&x0s8N}j<42DjHI{+_Pk(g2~!Lqb=*{49S->!^zg-$-_s*8%V?ELu2D*lOx%ahmRZ+C#2q< zuJp$6%0_IV-iKZ3p#o!Cd?P99q)WX~o%BNSSy;xuoUtffY@xl(uJlIajEZSVzN5O- z8$Gh4-t;c@#>M3uL83)n>5Uv2XODU-y3`vJSJBj4-<95|>`wV^=~8c0TzP5lsxI}$ zjYpI&)VsASz0o5(*?Xu`wMV zaW#PbgZ+N&s80T6bg4HsE*IuIq$|B~IoVpt0P0QbQg2k8lzK&R65GFV<8nIMThx`_ z_z|7*UD2i9=uUd;yVUF4@3(ZNmy@02u4tCys;>3o8kl;wcC9yVgsZ?qS7W?_-jx0_ zu3e3Dy~$Q&%J7`*@$Qa#4#wPeUaWF0qL-8HZaBVAWa+*5x7iDE0?nP=k;M{c^uGW9F1dHFCX=vB&# z*l2QW&C8I@ea0L-X?i^El+)U|#d_G9pA|u7=4jr6I@_9;iIuO_3nBZk+s{b*dVGXv zD|#17LMu+~ZCz~~b&A+Nn`(Ad$ZFfX`K*zw*7aHAP#u$7&z#=;MY#DpSPJi)7Ho}X zO&q@~yy+%vZ><|ehnPvrimXV>qO4#`6drYR)mR!TBefMTG{bk1UYhhLbhdEwCbSX~ z`gpIoby~hlJBV6s-UVG0HbZTru&^I*H^TaV0S3myp=hvWRFR-|isJnNLx%1?EQ z4D(Kn23wwh!bB*u=8TkOqAzrC@N1q=TQV3IwByQy?R{87sQzsxC5y;Pmm;$0O$S1o z+wOzX;c&q&%^C?{HG^X5J6nsgG9gK4K3H?7v093xMJ?pcOd&UZursEjzU)@YU{QO) z5Io2X?+n&7Kh@ZK{{Xw$wuN_2PiSgOfHay|)AUtRN~vCQ-ki;dw&xfFuXH2 zq3Kc76Kb;#wOP}2D5>$UIc+s9p7wHVJN3!lpNXPnqpJ_W9x#dx&c59mFcq4GmNSix zUiVtl?STVeKx*{F+ib=p?}`Q(R>VM8R4CDu(8knOxv9rwC|LJrpG8|`@-js z>2pHs)Q;_&(K0n+I%0cGtT;8>N+00cx}7pD${I9&Pk7p6o;LP46my8_&t6lsAzHL< zIc+T3|4hlIxJuS*|B-gdzOP()oy(PHmuor7^+U=t=>M_u@bD~M@Bfna8HN4F)!#zg zt-9!UnWkKk&27>Dz2(yV(K$XY${NSf3$9zO4Zh|tS{t&%n|E?+X8I%OsE3=M3U9s} z+c@0he9^K#%jXQnILbv+njX(;Ip{u4bv)$h@!jm2%w~6<8C#kTn1kQdJbJ*0L@Rod5c$dIH8C90<&)nzH{0%zysnaVN7SFY+)Ovb~rG zr@PIJv}PMC*Hr93t5qpu`*>Ke6PtO2tN-8#ldpZKG`;n#Y}CJ*Up9YXM)H=4S>fpi zIjPF|!rglkV{NzXhxQv@2eSLk{Z7AGApK^7({HBzkbd(|yUN6WyQ_TOxvRYYf2^zI zxw=Z+{Hp8YZ>Qr_tiPP*?k}v=Fe~(5>@TCb>@O3yVkE_!d;$7Q@zxb)p9pdmiT-0I zjhMKa9TQDkhS^F6X3XgrbkewIVr_Ow>R#+gwCtG-cR|bxFy9EbPU6PlSIz#|I0A}t zp0NUh#v<&*GWC%JGWvj#70yv6nnCRFtJqPqknZ1|{uH40v+Nx;eg9F;9`pVCYp3~7 zmd<~ca<7$XlpaN0SHy&Mn}U={s(vDJx=8HnIK!^Hn+wz zs=?!@t>Q2tqbyQDo)=4Oj>huxjl|078wwXqeZtR1 z^KjN1JjFEIHj@BxAu5~Bgf`plXG?G~pmJ2z+X=`VD&qTkIs zau(Lbb$|auN)5&k?3$ai_%I`cWfweS8R0-|EWo2V+55VEd-yOmGFda|P8ZyT3p6+| zErKk_CeHZ?gw&?$_i>HbBFGjo7V9bjvn2I{CG)@adT6ROqj%#5=T(dv44b!Wp z-+SCPx${^UwjvkBIgWa64A}aGa6OHiynvwx{`;O zya(eqXT2<5ngN%dn;b9)CE_H1A#?qZM zDIHz8meE_BXpp>J%Mbhzw@b%fU+u~skb zZFZJ6RJ2p^87+^|@uowE!<)O)D;!agj8Ceu-F)!+a4)tz_V@74{H!dVFrQF^*;;;d ztnoQ!%h$de{ng%QUA1ejl5BjO`+_;Bg?AQZ4WzNDyt?AA8UJYGJ(T6wZ2T&tUwHFc z^dI1eUg734VAI}jYbIg8y$HVX++ZBMF}`W`_Gq^mjmUG^t(&thjj41cx(5zW z!Ep0es5AKF<8cFrBeb(+Ivg&P3}R+HTj8U#ExAL&JGU4Mv_!)>FFyKSr2CW5%x=l$ z4v^6@cLFTZ0mGSODGEsKgcng-QqFEeUt`)8SEA&cB}T@pnYY8RZp9Td(lCh zupQv` zbU>&z0X?jQbvhXt!FN-%mPa9-hy%%^+`st~e|CY1=n@lIKkTWf38#)S#usHxydSN0 zIGq0|vu&A@ftuh+@}Tyq=%nagr}-K&%wq&^z5#;vY<687XKE&4kZ-<-qW+?YBf&~E zc3QakEJ`^h+jZtRCpo0G_d|vqqfF}t+b@@0l^$faf6|2sqZetv9(r(YT(@v@60@I# zLsPSt`Cj-9jLX>){p9sDA7-tQ<}acr^7`|qt*eKalRc?~yr6n#rqs4H&5=42+vYDC zA8&fx=em|{=YdYu^x>hyKlx@}%b#%VdhW&po6#PvIjw7byPLPbO*DbEulfs|k>kk3 z2fNv3MG(68gO**pEw;n%$)-EwsM(UoYwWx8WMtxp>5zh7tKv$Au{`e3G#5V=x4S~C znKd9*EOa=i@hUHtmdh@Hi-%vtS$#`h_SQTeNV>H4PwceD>@*$rwB+UYZ9@v`p?p>QT%G-<;g;c&*0Vl~bU?`&q5V{HR3rFvedHKuKkeKi};3R(%_^N(cH z;sS%Sx8-GQtv=ZD+Cq-kTPwc7{71^L^|C!M1>dEioCEy7a^XPEh0O60*SL)x`@AHw zzi*euC$q`OWneZ6qzymne=wCd;ytFNRZ(B>= z^!8*V+JvFb@nf6TC%^tUClj< z|AGEy{A#p&Py1dDxo~G&oR3GeM>%9u9`iH2xg0{{>tEaFIPw2e^|S&8<9dJZ_Je2& z*Zqj_=64~G^WPlo!9Q;Q1GeS*7H=(N;FzD;vb*KE@XogI&Zl_v=YHGzsTqkk-@-BsINhHwUYx4GKL z2Hzn?Jty4M=DD71Usu?7$=_IyjS-{ZiZq5C3pLy9^wAJ53^%u(6HyzI#WoD*J0`>I zZl24S1;v}agH;OPNbBsDz8#yp5-x*~1>3Qn;HdBRPsSz}W)Q@>qqW$%wCjX8xC`eM zvEzB^+@=G?ava5;nzrxSk4@icejlStlX2K%oQLhPJEogV!kf1sa!0<|XbkU`2LP~T z&VIL6A6j^dIa1hFye&M)zZVI%p88sNu<>~xbgk=)@dsThm@R8FwqX!0!=_QN2UMw> z-F}w6fKDCoUB8S;{EP6{B=$3nAxW;)3G+h`#cT%I>nwYniBW(@uMB%T?kEO%#FlrO zSh#Dy>8z!l0$xChDR3H75JF6-wE)L4cTA+U05?F~k~HY1 zLpL4kBd|WAwIHJM2J5nzYa#(5psPQl6IPss1dl;jFO^=7n$oHSxL5Zi+A=+$RGX&$knP{xHAF|-M zZja|U)W)#${Qq#{Lw3(LZR9kc+gIlEfBJmGIlh^>3I}!czs#0*TRt~^@Vj>DgCCyUQR{F z%{km&9_zo(c+BhNJCFE%MzsfrSh=UxL3lVa{R?#r0WWCa1@(rRG{wgpIhSXVc>m z-o|yzVH|QhUPhe0Gl0{f^}-_L+ipce2~osXTxBLFL)`!^^Yr2bJf0 z+NT(IyU{=?PC4xEh51{@_IdjUmFJEhUY@nzU!DtH{jEv*Tc)&+)6a@S|BtkX>@fe! z+v8u~|BKW9m-a7nxouHasQJxkP=>N-8b+KD2aP6NKWj%fv*O38^xa+xF+PQ28ZxW+ zx5vlgjQ^$e^KXv##hL$)l_%@}((?SX#7?AH`3Gymd*}fw`cwJb#sxdmHv8JZFJ|>^j7=^T? zn!gLS1}A5B4W!Aj1sYAzE$2M@J`|p-*7$^B=e|~#{%QnmgGx6$z4dBH% zPtFbia4VJX^jMq zZ$~|z%6F7;LfcWsA-|)HmuT0tkC}Ds2hXQG@@UZd(R<$Xy)W!NuVurYl&d}rS|?-= zXvn^`dtOS?hbb3b6tpr!zo*7j4bAAic-AOB_0Pb24!ymG?Kog0RnQGR3Fl1-Ctt37b+LsNHt z`{==UFDxGW``oqny?J98H?u$|Ol zJJex2vBP$c4%@*F+ub^B^O_1TrSLimFQN=yZJDzu{Pj$mJufpaXKZH9h+!j!WoHgu zxpL(i{2f_UTX!bb4Gq=!yQ;n#`$m0r)zF4$MdcYom((@ZR#numoiqZG(Z<^9NlWow zf%@f@*sQ3pTs8?mUyUwrM7p}np-b_<>dcDznxUgIht3(9Ikcv>4tAg&9g4lAqJhIj zXxOmf4fU17<>#owUB67Nw1&@Xz>YZ_yVUCH;q}!ksw*0*slhN}DEuBZY{bxpy2kp- z>ftqYbwk&T8-q?{S?}TJr(6=s%a_(RR+g`>C||L>A!>Qk`v(*G?uzV?As*t(77Gj^D ztAsOYfoemtf;G9Dyf5h!zu{)=tIC~lKZ+Dd0gs%?>$=f z1XU`o^VWwiKgGwdlt)f)Tksh!qIVX(Vx}VXeao^JL5n8j2ywpgf51|nzMfo>Oi z@-V&_2MT7-nN={$*_etqW#n5PiJ3aTq_C{OO0c&|3kqghUb8W8cImw0;yEQ{1^JfG zNQ!bx%L+8&d%65_R>Jbyd|?x68f!T%D1k3zypie{fdjDmW2hX=CDYE9AM` z8+;HkNh>RsF0Zsa_j*%4;Ha7W82)&6dQE|RNlUP^Ro7Nop8LE<@5({}tZ)ZY=KUkt z!P3Z=7+@o-Dx%A*;7N&m=@V{kVhJutV+Zu5oX?Gu%|;;QVs0!-z5_AANWJV)<+bMU zZ3WAXQYf<0b>uGR{)*i+SYZ-HBG|Ke>{fZDk*7r(8!DDom#@MfD_CO;rHjl8E;pM; zM9{R=^_UV=YmTeBvy)}GVk*sXHW)P#nXZV2#wB)KqlwFM#la`MvjTl8xZ1=Giq!H= zO~JKCv2uo>f3V6;8%3AZS65UO=3Ct-_PGanC(J9FGkcoVBfYGTM~2x^66P1qo-$`nk=5heB(rbGMpIZe7NR%xXtg!xl;m4Iwuq7Z`DSaY$-(FI z)vTziz(`R%#iZDl@^iF*z;`nKCKTJcSM=oDa{@lTuPC9&kzQ$}*gk0v3ee-{DeU~% z%#-b_`miSjeC_z#GhtrgY?R~LbhA(TxT70Ud2v~Zl{ngn6IgT+jEV5Zg;a(}#`ZN8 zVjL35BgYNEF+Wvu4|zN$`&3gyq5hr-2P}UHHB60$26)nFGu6z2tk7|uR1Ri-e(EjY zlfRpccJcgD_!Rn)=ZN!VJ5L0|J?Z=gT)?;378|uvPoKNFU7Tlc4ltY3b7$ul60fbVDco5qT}#nHnyE9ib_`&_Gc`JB>|3Q9^b$1I#Zbxy&8`I!5KULTP57N%=S zRc9g=N6O`OwS{;sQ7Mj8R_KiZN$ft1omFvqUA?Vfh2E41A0w96x+30^h#(@S;P6-_ z(|RlPw#Y+}vm>8_C zh7%u(u%E|D?NmddKMm-{It=*uH?^p^D~%yvpav7>7w4Ab&a!&kl=dyMz&<6Lze-C+ zJ0uj96qL>@!tQjlY)>zmlb4HepsnZYjGmfXQd}}8&+74HdNpR$0UtlF)|aEgYQPaz zLT=d{*nTd;ng~xXoLyR$I~%7B<(99<9`8-iNm+%u0y7N^stRTI8Iw);n=pOWocwv{ zQXxEPa*v~X(AKhkg^4~(@HE39x@m}6{A zBF1|esc!(i2u79_ti~kU3il7O_eHD(m&x#verApm#R+?U3t_;=s5Fk#skp0RMkJ`B zmzdrg8GPh15C?pN@i%h}T7DWJksT}Xuc)oWbkcG7V}+s>OOY%O^P>CgrY56Bf?11vcg)NhTuYl6W`wB++4%(va_l*4Ox=h_*^}1};&JvgHYP64&6`<} zKhB=ac9i4A75)z1NCM8gJ4ED`l;kd)H_qzTr5u)mT}HrC_pTzQB1MlbBak9dYplS- zuYwu9DTQUTaxpj0FDNOWJ!f`77vfPPM>rMc*3KD$H&!I5%~_tkj!h|TC!22Zf|6-d zoJKH}DcX=Oa2mlS&ZV}TOSp|dn(MTIOMAhTX*jQtT5yRWUEtKeOPot>yZT*XNOLis zIeqL@&-r*t!`L)U)~RqVX{>1R!d$y#E~%?vE-5{d^Q3rTu3ajZ)Oa6IH-l zZyDbfnTKHthXc#AAjH#M9~0v0EUsS8u8S_OSzcKY#XPUU@+>q4g2q5mMME?n?;fj+ zTAq_lI-JIp*OobFJDyW}e#`Sj2+ypol8c$1(^5EAr9rj~!dVSVEl+t5j`#T#ncUV| zp2d-6(3%cW%?f5Se|hc55wofrc)pjnth(|H%Tp0z35!vuKKq)(Q9N74Wm8@xty+FH zFV6-qE1`oP><c@D{`z&9ew|@mWhVuXKtLIL-_a6-NQIUuR+5##tQS_nqpl z+cyaro&THn?(bJ!U!6L2>eQ*FtE;Q)wwi|hvwr1}ZOX*?Dznv$^aa>CoxWsc4a(N4 zsD*)@-l~HHOjWD&exJWCXKcjR)Y<5g_%GhPK zdJoJpf5^DR(v!O8(oQGQo*9=~$<#E`99@O80F`l>=E_XF8oFfcwq%afPG!^=o^iS5 zZl@wejl{I!zhQY1#v8TJHsY3f?98D+AjulK5gQ9J_8Mj!i`1e&><^6$4^+;31<)VyR ztz`aPc*NK&G2;Yz8Mj&P;o~b=pSRB{WbH+mqLIcrp`dt*%1jM4(?*!aPndI7{B41-9(iG&}Ao6DCeC4Y)fs%{^y&L4Lu+38k^|<0lpu zm(D7hHcn-BZaPiz_-Um@ljj!~;1NF9q326$@47 zsHV7!H&oY@uPhyp2X4$(R;bLAn&O^NQN5f;;^Gam${gJkXVJo{8i-uI%CL`VihbIm zs!~}w${gDi+oZ}GpY7!T#3oOKnRy{LyJ%``cK(c6(?YBKs`W`-R(8Zaw2`<{HPyZ; z`eSUZPS;bJQq1|dBw^p2%%^#kz6i(fF6WB7eM@v2?!=Mw)$%?Xa}K_cE?uD)KJ5L; zS%{5d6&x?C>qp+2d=j4WQ`51SUQ;SBE4W^-?AwyKWSkzRWAR_vwJ}4JXBUI(kkq225pdZb=)9rbVUWV@1U(&)(AVU*Joh z!|AWG&rRx$kRL1((pDkaSky7Q2*z!wDfbtw>}`G_!n+K@@#py^@^?SzZ3tn8?Ye9& zuSUN1`N`BKIeke*`HIEWrK?ugl*0OpOBZeM&-YdK1<9#h_!1pL8AW6oiw+ zR(>h%9g!0uR;*N1S~P1S?y|)gMrAT&|0rGFJIGdxgk2$}%D$+}Qb_b7D{;-r#N^^! zfE2dulqd~l2dNrv96{=zbh%zq-x8#L%%tWDN{TcHBckC36Nvb!h%h{UQ_*`y5dE`I zbbQMRB6fx%P$=K}h^R}9NZ5pe=!?6|>&gP3j;j=S6M!x-wM}V6@1pRI6^Pi?UYGRm1nG}4J<~`cv+)J2mv;5CC@>Y*tk3c2lLa8G zDMW~2gV0$u+#v%2mvxy0J})v2S1Im7fOv7^NyE(>>2`N!&2|fFKeUs`zP$4kM7hpz z6=G=EJe2+Oo@`96!!IR_q=t<^*;n*ryK$ZVVa9}(pzJHNJ{F!nh9}+}l)a}zGuY5| z@a9$Z2$T-?BiUDV$U>}9A)!eqdv8{*q|Gvt(Vi0OT-p1w*i2l9pV(+Q4JuaIS9d!k zO#J?aOr|20eN9`|u`7>ZI(@_1QuejodqD};!BUW)3%J4+qwMRtE)*6#n5u3oDi)dB z(e*7Kz(RoQa5qr5iqN`+{mYi@*RI3CIdz#FB3>H2t{!YvInl>@VCfeTr8532tJ+C@ z7bH!SJ4{W*%5vP*@NDm-da!Xs*cpYVdMC9fNKqkG-LMVl|e00qtph`3?tE2zMk%-YL@@mM7d>ru5)b)5c zJb)@9XlotqC+ru*umC!SdkKQPCkD|}Kb|lp%(Iw0yK$it9^}YBwDKZ5K*=_Go(9OUk&Orf~LeD$AfJxIM{I zffon0zRmR!{oZfvuAJcH^@L`!y(E4S>q@$HW!0F3`6-6mS&S)T3KmH9qG1C$p>@$V0U-U(SG?}#5&_xQt7m6u- z`IEvNl_`X*7D;Z)qa6ax17hBAc^RA18_9SB!+{zrKXjGZChI(JULEA>9|ALhk zqCiikx{Ik;+HhtKYe}VF63)0GgD=j;Z7zkirTU^o)3AeQ1^)Ge4<2(>+lxBZry&(b z|B*~}9co4O)shQVk6*nC+OJUU+CXi-%{Qbxtj$yNolGR{L2A)73aKnz(Feem@-ZGB zRNr9Rv1-@0bAWxF?+FB{zO!&=$mc))wf|M;0O#SPcjoukfUWTixKp4;zcB4E7>R?B zpGn6Pd~L-rGq6g%Vqs-v`C>4xT~VXjwdxGp)F-oFG3%v4Vku0D6pM7#ckaT9n*7yO z*vz(cMfr?HXL4P>Lv_bS$Y>?B(~U+HLlD4+DqZA*olPJp^9P3eC2-d_YHvIYRV>-y zKN4|6$XwO2Ah~lxa!`RZL2>q z4b7AiFTDhJF>66&K@abTA*3HFkgqLdC{~EJ^Q8FQ9%FO7Vo%c*TM~$pBAMDi%hENWZ$4EUaAU44ud3M)QyFiY zDmgwETLIhFvlP#YN%8 zGb2H9{h3XHo{@|rvzZ2IzVM$!dG~7Dm6K1*7Bo&%P}$zXeV=$kxv*jdtdV0hJT6n- zP<r6iH8UWRl4XE$$mJ^v7DBs~hwIreMp~a~?5gUk;vA zD;8B@+r4UgS?5sD?|*MI6>r#b6XR?!ws_u zxY*AEBX7FbIZQw<6rRsCGT;s1aKT3tE(lkbE%fKYR<`H8joM=0w)SiT`#^mDQ&EfO zt86ceFT3qJrGg#)@@$s);G-L!)z))4KBPm`VG-4ND877ogs`nQm;uNcJXwcFlhv+^ z48~#x#@Yax8AtC#fQ5T%A4 zK~x?Hqv3{=uS)oM%_pB7X)ZjA5I7y~#8-VD#*TOmf%5>iz~yX28a`572)QF|Z2iS| zKsi@{7zObzpXfUL78}tK*QwMfDvWo4k&hQI8pd;cMn>n}hiH!Efna1fY9?jFPL$@< zMLhUXr!GoA)u~JMRPGDDP^NMnZp`I)JRi>$3H8(1^Q&J=$-0*EFjnbWx@A~UOUd4d zpq8XolD$c~RwBAqlD!gLD^Xo5sk&Bfh7Q-lNv-UKT%~xGT507aZGwEU_`8UB3r=d~ zTH)h0p;qJ^HIzzfC5V+;;g zPHG^Cl^S>w)W_g*evdS)fombx)WAPLWDPv+6OUU1>3$7-Y8Vr0pj{(1a1&&=gOQL~ zy&4$e3k&y$gc@jMLCCL$W4aoy#?(z$!vTDRq=&0x?uiK<;h3ABPz}f2ISJM9xvqvk z!#E$pNj3Z%a`7kUxJosA<0fr~eCY_iY&2y!sRkQm!$^l~LN!cA`~*0uh9Fj|;Y?7M zz~v+(4Xfb<$Tii_7erRWET4GXYRCg4JHi^nm{1Lq5naC{yoSQ;)9m%CVWBT9Tn#4$ zcNlH!DBox`&(;NS&H~JC6kKJq<{2~-<2i%xGu-SRwgE0}b{^Yuy!8@z~ zWIo96ha0;a@zhX_T?@pbB#wcJ>xX{+uj@+R(l@B|n??qe{(8LcQI_?(JBjOWyhk0; z;n@k5{-&;UPO+YYlS+RJaxuu^3Qd*uo}080@}<&SV2netBd63t$( z(qq1`aHX5RSB(|GdP}%|6+Ek};Eof5D(F8dsDfwRAwj>BDtOkN&J|Kq1<$$*5~|>N zT?HFpm^E-x1+uwE@mk0#IO-;Si+@IwD!3Cox57ykv;qgdx4|``3SL6|b8u1xL9A54 zSD^kCE~f+1unMk$+`v*fqd;U8JmnLQTLnd6WMlorFeX&NJVe*;cb~viZDAy2R<8=y z_`;4;1qqArzWE>4=0AqzmwRZSJ-bc{%>S@EATWP2qaJp1{aKp6-#@C&-4Tmy8E|6m zvCs`&5Z6K`IpQX*fIKmGF?eRciMhuKAFm1KUW@oOaANKtR?NK{)Ln2ng-Anlr$eqW z_n9El+_^sSxaQshMw)w`VN5Xh4n)^CcQ??^(d=Swm3xgZq){{T^@nfU1KPG(uY~8)Y4Ea}!3F18#mo)4oUB`Zut^-Ed;-b08P0;VQPi-%WZIvs|(D zSK#?8oY;D+@bQ{p>$WcH4Nhzw#EPwRNrlU~5NT-ZO^|DBeKUx(_4PjSxVC->jI{M* zhB3j`Pa?X$t>=UGxn{4|wBPZC9pC2u+bG}mH)z`zVF6a#{>rg|?Qd}VCfNQ4H?FW~!ZfMTRkkX@hwlOzr!qI{I?(%w^>}p_}98g@0{!#KNox_!in+U6+T|`!EYY@79f5uoESfd z72}@`>IS%+PkU+OZ--oC{AAzwxB0~58b8Z7{%;Lqg7Nz_V*LA%;XgHdg7H;u%oi5! z2qy<~E38wk!pFNc%luxj-fc4D`RWDJBX7NK7{ixDiIEb_q12wLzflcizo=wSH6(8&USm=n}$w(7C9eNeEeT?Zo8gx#`K!Y1oet)dMNI!42Dlz{vn7!Hu{Afl`3e;Bt$RnoC(M zy@i1yHwMCqr)h#yr}%8FM`@L46x|R@v_0;~R%#|@64stm#-kxZ4`r3O1LRv_nBxK+ zo}|N(!58cBBCcX$O(Jfd`Pw`ip;;B2nCG`(Qi|71CR^b4Jc{y(dF}?!op55F*8qM8 z7kd$`VxBP{F2b1y2s!F)D!0(hOon>HvM>sL3(mj84a-2FM-=vl8|EQU0x%VB9Mg;# z0LnE8?S>n15&|Csyv@K=1hSLx+8b`fA_UF=I0bGfZEy<421~BvptXI4Z65|0wiQuz z;Q2A!i8~QE1ALhMsS$Mu+z;wOxY%k?Ief%624H&tcKRUqavucU2fgYGl=ZPPyZ}d5 zKAF{L*CK8d*tt~yjUUH#50yI)RKK<(7VB*|o7B~yT5^>pwa87E=JWzodk#*T(`NuY zCqJ?kinK4CGI4wY5lp2Sbn zC+5qC>ef`ZCxfxoD44cK0JaBUrw?*3_d(nqrojf;miw9hCeoQ=2X{y9*(mCsKj#On z_BWBS39a@wk$HZr&8u3tj$b}N%Oer_fWAFSodFlbDC;R5Q2^q2MrihDG<72=RitwF zp|YNd45AVbf^sLRtI9<@BgQbILyA&-$1&+4w8I`yFmF-5e5q$ObK7v$a1jby;g_OxQ{9}mN4kvAx9HtH51L^^0a670{X9olDcmSUFLGG(Qh}W59 z`3A^EEJk0q^|wKm&q3&sAWLr4$ODITn}34(cV_vWFD{nsw}n{i0A%?fw~r6vS>{}V z^0Lvkf{}%c1BP=)f{(inNMO&9v8Vu?SOmjW#-e8s^#FXSPrn~^u?Ub@KC|6Yg&JMs1ALQ=zLA+eK ztC2Z}1D^y>hJyG&j^>G1)ulN81m9Pc%7&0&wik(VAs{`AMg?^a#z5KZTf>3ugq{2+w70@JZF+`n-{?IG@RJRX^znsf!GkRifsytRzWyIj@rR- z`i_V@^hS`jfMm&)(?x5km2@k#D0~J{H-hj_h@bLX1njl*ayEClbw-h-p)j6UGF<;l=SK||muse6+sU<)T(j(?Z^4u;fj)BW z&z5-N8kG56$i@?{8c~J75SVlj+=!neFa=-|TphD5AJpZ|#a?#J)z5Z*Y{F7TgWEbI#YJxz@wtyM+9OHP|6vS%WdQh1MazdTm)5 zU)g}rmd!xn`w7`dgq_OxicY`2=G4>TFgT%{+lx3A9n8ta#C!>tuC2j}jO9jJ$T=`- z`uNqA8@SV1Z`Hv2VJwk3mc?bU36;fFIDh72M@Hufl@mBtf9%ZUkgTRpz|k-@Fp0T)7jI7?JT`h9sr_6Hq{4Ay>=XJ$ns_((-;lPQPhFxFY01G(8>J5GD#H?!SJXzbh#(!OD-z`MbJDcp!22f)Uhi7`AitR$O zDkM|0ngKCE{nteu@VY4ZyB4_SP08+_iobK-(!Y0gEuyN-ceOYypcB0h1PHIVPy z6`jSmtDOc2Cw6TM&>AkmuKhvi3l|#?Sz^~s0JQ5;2!wgQuU!uznYQa7ps-y#U^+^B zM!%mu6JPu&`>3`g&jHky{A7Ay$)oWWE0#R!%uTT5QD;elC12H+9FOvz3@4Uc3AvWy zRV?|2;~au~-;$e+C0BxfIhE5H`G1WWD);ZnF5&#@6p?gyYH@0|XFEcqFdX-k#@ z{U0pZ$O{~0AJOJK13gunb7WCq&LhtBgob&~J3@7Hi3UV#Q ztC;gS$4Q2K-<*q$IbQ|;Q8+Q@p8!6COE4$TKTvS7>mWAnRDSiJr1xp1aZ#WD`x<&31^+C$yea2eyx$)Y$`&c54eN7lSJ zHGl1@GG*W6w5Uc=#vny5+-!_7GC}+R#5q{~RQ4l|e57R8Rp#lbWe^OnBI_^N{7R6(E;F_5!%r`-tHlr`TTt@b>^jA)QSw)&_tx`?1+R zP&t=TU>__4Lm=|Q+zAAXzc=H;Z5WlBjtLN#M%1WhaM|M1FsF%afF$ma#4Tzk$XUEc z`~pDln3O${4F}c4H&Dvn;dJA@hzEn-0^i!x4ih+S{2lrxcpi#)4&3OT$O`=PxK4Qw z2zQWpL=(%|em@4`T{u0uUZ@*!hje}nhR6Oz_;9Hjo2YRvD-Jrurz$u+6q4+^qHKQf zb*a;w-+;{#)g zxF3PQ6D(p+LKxe7u7xha_D-W8@8&iek@1_G8pC_;T%^O?n)=-0I6p29y5Hy5tOZTf z*^7+!z>Oo9=yVrCcfuv;^dty};bI&yrG1dGeq1}{(mxfu$M#jbfntr7)Z_%;0CKQuZ1xiAMqtmq*lh=LVA2I3of{V)!*qAv=2To)byu z`uC^;CVBxP^n!z3?IaBwG7k@#uv9+WuxtcY0xV~sEdtvB&SfAOf$ITw!;LF~fGJ}^ zvFjF(m;yhe6`pbtGvYL|A@Fm!5oaRsHNY{rl3E0$jyt2c5yk5kh_TOfoDR@R#)s}1 z7|-COLyiU*1t*m}6JQ3MU&+g)l9zz67%s+>oTQTH0kD$OA+f1SUY1zNyO2yOIp-LR z!wubow15aYlgjCvqi zwUymZw^M0_I+dvk&G%!zy+D0mriy97=YyaV7iI8pF%fJfmH6#P91ufoMP zLYOFc7XTIf_=hR@1(L-TOveCjDPGr8!48hIeL-+@`MgCfXrkX=kn^A5M88NIaKa_% z*B%5OsuF7hS=29=8xyGC_cxx(c>~RqAAH;fC0OMc0pM}BCp>?x3^!*L`wWa?g=Ewh z2dCfqDV*dlEtSLD0q^O53FOF)A5&o&ojBG^0|#fY5wulm$gw823`8yi=bQt;VT8Lf z{8)GiEim^A@Nfi^_+W+tgQ+5}%IJ5sW`Oy~mT&AVb`3qid}Q~H4=^9u6WDw80P~SO zGd{q4WS_H}$~ssVyri`En4!XLd`DReEIUijienTpfH_8b1<2 z*>Bo1TekT6M=SNFE%OyU>b+^pWJN3WrY$oSo#7vJhH6m4kZRtP;wxTVxV&~4mZ6Nb zhwtHvvq;&bhe(a|H4k@$GFFk?qdpE#gibA`g%KsUw8Lu z3wdx0usW#hS8eMHsKG#~5qZ?M-T`sU28<@vD2S!__+#H?P_Z9-r(z}XC}Lf}$>U2x-=X2c#)Zbs-vxDopico^U} z3_OOwcK{#3vv1+ustZrH~N+yQVK1OG^!XThtngYpOL&^$TVz$l`si-W-?%HV%r>W3^RXh8qxg zNEydB-ZL)Hfm0=Lu@0=`ONM+5&lpS3u{-dcNIp&%=4){h;F-|p)@DhRLC;fTJEEVty|+8LdyC0t(B>eZMmtgxiy zt3g>xsG!8~-Z+ zeP^q(I`Vuyr*7vu-WB<_HpC*Ijrqc=t)48`IJD%EaB*&Aho^95*I4o$*M*4On!td6 z55g-{%i}HhDa5d=Ex;K7NOP)f<>66PLjIW$_9?ct7_;c-e>lO~Oe$RtC>Ea_U~Ko!thv=NBP) z)e@v#T!pWss!HXUNc#aRsT>7#>i)PcrysbU9iY@p<$4s;D?Aasa)V`{FKaQdf`=a@ zwt^&%bUqIw5sX?nxcZYy%0ws=Hy;Z=Uc#!JpCkD|Bp>Q0_j#~_nFBki+&6vk;BO#0 zw@J}z(lH2#R={-lst~WltaSE}Dp>1GxV)N`mCF9Y>cmES4+#5dMl&(_(rPbrox101 z{VCB`R+>zS>h`b8!)&ioPj$YwQaJ@m>Vg;Llp0Kd{$@4j6zB}lPlwB1Cpvs%rLOgj zn|v=J3n$BL=?ZE?cqm>3M%KQpCZqYAJSQHruQWx`N(jFj*J9qMJU^&txOU?>Rn7~ov<0)TA{aISeL zz^!n(JyBV~Tr)6MB$8K{-4)tItzozZyCaA*9Yn!r*HmN9M^ilj0eD4C4gX@fUr@u_ zLFPt;7vP3ni$H1?Dj9AZ*+$$C%6NoMgu}#Z3I;aL^`aQVAX&+JQw@mxvNks$%1UxD zd%_S-z4S1HMJPzwj|BY0cXeU{{mdHGubJhF)#zuK8gp0`JA_p7sLAtenf!)Elj{dy zvp+=Tq@ilq?w|D8jpbZtC_BNZB3R`;6KUGntFe_Aqus31ouSF5pw

e~X)>M_#AFA?e;Aw_MtP!wiqoi8nR4&(p_{Ba2VbtYI9WD;Y3Huyn z?EA9# zCnKPS|JlX9Z#b!oZeoe=n@rqeb#*No)WHn?flQCZ>sBNl^kE-r)uI`=m+0L`rNztE z*5IU}RXD6OILrGL%d(dG(Q_&>jVljDE=DA`woT0EE+(H#|4pJkT)6~?t4=Fc)^e*2 zS3dL6NR_q1O6P7oJnZ`^;s>UOWFzDEDVpXQSA{Rv%VeMFXD9G1Zwxd388s`)tAhWU zuzuQ}=O9@puZC%O*158NI+&m1m#x(2m?L}=|FWWN9nKhCxDvrB{I`p;6+!S6`QM8Q z=8J(@e+IDU1&EvJ;DS9zGtp`9()O(@cQN!h`SU{Uf+!Aj_yH3BkNyg(hAHidV5GE@l+W`2e{1hb0ko^6Y zpdUptSs2L~n4%X)zx4(96JYLHO8O3$!F~I1!;;G3-=}cBGz(TjPVub+@wYj5f`#*& zF`5PU2mSTD+%(@oByS!w{q&qZe+nAk<}C3O@IH{!8oKdq&Q?uKc$?D)aV&RiEP%Yt z`HtNE{lbUxQx&{rJ)eg66Ba9X67IueIIg}8lBHh;jJBFJ=k58gAn{O#W4;=$(+d@) zaxz=!eF@PjU1Zl8A@mVGJ!&WTMYer zp}+3aFE{kNh5oHizr)a<7JAoot^bpT{*KVc`1H38{Trb#@af+ex(nN>+zmdR)$Tf- zNmIjV-pdi8uLI!orZ${AJ4v?X+K=QhRwQ;aNP2gtsvyhr2oFM}wP!JEAof8JUBO$u zYN=F>L|%%>nVh7tOLFFhE-6#A0q6yt;Zy~eji1M}OGK*qKBSw;4>Xv7Uv01t^HUD= zVf~o~5?u->pJ{vr@EHUAOk->|N(CpMY49+;EpYlX4LqsfGYwqFAxD0uu@c$HzU;@r z^B|o5OamMv!6Ez2kAeDUxY%k?IfaaE48ZmP?DRqIVP(A6-t1yL17_vx<0^5o9#3=5nxJ>)nse2b z_ubp4F+QB)!c)kmh7TuO-ezy6Pfs|sYPT6yVhVc#~&iH=G+DJ3_hAOj|Dfy4BiC}AWUa4Z5a zelJCe$4G)^5o>G;p-yOl6zu~!ol@}FP9_{++}i5ho)Iaoq)pARoM=i461cf3q&IJ_ zGe)o=gCB#Wfsm%-HKBz`0_B(_-A^LAGD%B6i6OM&7@6T0NhD)xY*_^vOy0U1G#P|s zZA7pe*QISj)-I0?4J!vi`_{gY4(*Ub#|%q~;_KC^Z9=efb189`u(nEdC6!8N(K1@2 zZo@;yw;{QEm~e7?l6r(mm=*XzDIDW_4zx~gFI5N<1& znh`b`hVU>)kZh(@E%KSAs{t=^!{zcTeRc|Jv6aW7%n9qmhE$S_`o`i=n2tA^$) z@rapp!T@m!d0WCz3lQyV%iyVrWnw<3$vA{Gr~AVQ`UUBwrvLaoISV#9W1tbof+@Ao zFRS!OZH+~~H9+F%T;>Sz!G{7X=;#$K9BXzXnI`)CdgopulGYa;Gp40@V?NH-VDjKgkF)r1PysEQj#Xq>n|`tx(!m(987ew zBrKvgU0{L?9yPQA&c@CF9uo9Z9|yKV&y{0_E(YCF#q=(##}cp}!lU1Va46^#@Ltl8 z-XKX_LT|9Zgo5%cpieY2y;R{yQ1adX$iYNiwP<<+8_J-TpWzAlFL2QCZ}1$QDZNsG zCG^hF)Sy)Kc~nk&O{OsfeA90+d<6EAAo~~hvB`XA-zG8poHFF zfr&i@9G_@rdZ`Vi^QexdIhd%c7ENzpq72(N22aNr4`-{v`{>VtgSPbeIV?s3dduK! zRT&8^Xh$LzkHVm1O8Nr?57}pUuzX5-FQ12geICo=i5O*Yo|2RCO==8B5*N~kY|tl= zuPmO2p^3(Lwyg`sLoW98)XLF+1kO@(={+Xo%E*f(K?3y;WU^d5y@HN(`tJx%EEnm& z_j%~o=W(C~XukVFo@povqPtVsGBEGvseR1#p!Q{0~5XC z9)v~_v9DE+XP@xQk+U3Nf>0}o`1vpcN@E7}V@QEJ|1$bIhhlo~`{Y17B-y8DOjwbghI2!?P)FtxwhQE62A!^fL!s&UDg|m-7Io&S4%FXJ!M-;! zU4Nam;gEPuG#v+#C=>O#Ubsu>@h}VMOpgaxgbc3P8W1Ui#DBoiko0*x1%%M+FEC#9 z!dH*T!G*_B(6LG4Pj=tA!*O%05q+3FE(%d)Y& zl!a#uIBG+m4mGkKUUy#s<^QNWiisFHCZL}uc*wqv;MOS;i=w%6{S@@WDLU87!;+H{ zC@Z3p?@KWiukiazH*9BwgL?GHWMTa@^yAmx>2RK^RMGD`?Bkc}9YW!NRe!yH17cvW zfQYFM2p0>HOQZgepQJAmqUpelkq@FV1O-{~v+Z%AaFASo(ES`@60*7ggo8p1WyPaT$ZiGYv+KLTrq`dRT4U%r&Am(>=?>R?GvQrYm&^>L5|{afLlhC@=mzvs!) zAt?x{qi|h>TuiSA9G`9yfBeGq0XW9+v(B6}jrmdK(>^|KibyC$B$Og@+!WDJifAYW z8d3On4m7z44kfxB9u)*6|EX}Ha@wNwP!K)!IhX6rPk*J#n1s9Qn?{xhp5o3u^&0Ug+sp)PXyN~ z3;t#}km)f`HX-`ILoOiGdrfC3J~Iz>KDJQ*=L7)j7Rc#uaMYbytQ5I}_t9SihpMNy zMPLa%<_Ic1es;)&H^6_?$Mm0o0}H*Q0!!#oH&E$myTos$fj%}g<41$k2&_~nRcALG zUY>^huJ2zOQh`8;KrYf5aR9bMgMKIiOX&Rt4wjo76d=^xToK07pmF~;+_?28mW&Bm z6tjI0E*4^_$?&tuB|y&Y&*Bqt^a63rFHx%B+>;=icL^!yCPr>uH2B`ubpTYW0UDB^ci?In2; zKb|^SLrVET!(<3)ErJ@@;~+$o2$!f{r4!J*PE#pHD`7e+l1OY5HnN1lFNiTjkg$=m z#%;xoGe_WpF(inw)!U#}p?#uhd=PFLmWfHQ)IhMF0vBqIc>V=}5h0>uQRqi-5G>!# znJi6ASg`eg&mNM26O}+@M2Ki98oogdo??ih*$Th7I}I+BTx-Gau=s%t8kCxZZRz{4 z*P8eN_7OZhO@zKLEfSIz2}y$z`p4ShkDo71f(Ga%^rj0eqQ~!S zNQFmL5;~?%dneL90*7L~0PkH5v!VL{I8d4K;~MG|`uY_Zy?91*Gz@WAKSD_^hl31y zR5FymW0A01h-MBRCx-76acXEBQWn$d^rp{XDkJ%@*skJk*L^|J{a{GJFbpiI$|1B) zlq#Y(6vb+R``6%gYVZlNoo85weI(Mj>5Ra}nRpDTyBkYFB5So_66$vVu0bv&vKksD zA(f4+K@wI~8mhTL1c@1N4P}w~WMfH4WRq!_B(R$;M&MU`c(ncoR5SUvOiZZ4F&zOb zzt6E`Cxb7BAE@0RL{p3UOEbUe#&e^k_-U1`Mwpyz>2aDmv{7pK2Fedd$m^++U6Hvw zom>BGG4vG@<8b4Skz|>egpzCoE7=pq0)BhNh!7E@jSK_)4`LXJQ{#QK_>@rC*8#&|kjpjX2ONLYa6={rS-6l=G7du`zZyCjV%Xp5Uj#Ns)!kQnCBT(< z_bY*`0e%+*0)=EO)=M8g={Uk35@8p&7GV$75_HkRo~$J}O$Q#TCE!<`$n(is0_Kar zL$w5lf*1l{n}=!xZBQWAHhz!QD-t)tW8iue-V*|g=+P#ivY3<=8rh^-q7hQg5OB); znSl0z2?I0Xju%foSLe-P4?is9Hq;|ulFy+>l^nHp^F9Ka9LrI0S#yl6z`Bq|&Vk?* zZ3s@1WJUC52%JTa#e&5it0mBtiP?W3TVev~5GucWQ6CS$p=k8JY9kU3glpqKxB?Cs zn+KAxJrW67uaJ>Yy$xz~x7fOfo~h5cm@wk!E<7>;BKdX632=b?iiF=#1M+K;T^cf* z#ai-uc>Git3~V$vXc!mV1|mDaNgIokHR7i+ztefrYmdau*!;X9o%RJqF@&H^8bW<( zFF?6hw1V`0FK{Nkzr#6d&8B?>Ep;yV4rq8MGw@MXz==hhfDc;7&2L%!l!a{}e76o$ z<10&XYJv!5F*zOV73j|nK*?-E{%t#GK=tn8Z0rH2t%jL)MjS|!fmJ?dc?t56`&;2o z|5k0NH@{Wecp?}e7$*RO1fjL82s(--uQ9O0M)GZ<4UF=J!%%(O<&5Szr;prvw($ds$#fP(-vUzhTvrnWvM~6Lg!V(tBK>F-yEnaze$_Gzk5< znvs%j^vTqT>B&N0>t|#IlTu1zfyhQ*7p|zjBo>J*;WFtB*X4+THRy4VH0qn)9!(9{ z@y@IeD&doGPs4FJjq7t!EWz=ht{reZJS+Hdv3D9= zu$&vv`Gp1D`*7RS1FBN|NSqTex-FTQ7{hVa82tFLChsi4T`IV91o8Fb0yfFdKmje*8daSPzV!z6;)}2J!EpInePd0=^{<-Yy66=k?Q@ zskmcmH(c;r0C^EL47H0H^gq*@)3Xo>XAK-UsJg0b5Wb;XSXrSGLW9=fgy+@ks@0&? zl{JI#_r42P45}D0a>RgjBZd!Hi9h3BH*DyjidAJR)-En*$`Fi;41^2H9AmTvlw5GYs}OVE<-qiH?|1NdEN1# z&L|$PS;nK=bQp@WT;)p;L^g{S;+TVK#vy=+AeW_UD;683Z~~p4$xNEHIHy?$s7qzV z`tlVl1a!kUbvSdl(g;FcYb#mqAiIjyWi=~w$S95JALZ~ID2j!c6%~tC;LAMx2S$*z zVl^P7>7+~WC)g&cdc&%+WhMmG39dy&d+tOR=MYCMjYwxCd))HptA-^rmZ@1(}5$W#0Q(UXc9XJ&k zM(+nZH1W2(j+f!O1K@4*o&+K0M{IDLJC|<+OQ!eAN!}Q5{s3Nx>TucS6+(-5U8~Tw zoxK~gb|Ss=CUVJi`+e>@HEvRWP|owBOI)ipm=`YGoV?ssjfR2>Nu%e-3bUsX{P8aZq#e(x?>=5irWljb-jUPO4^SI7AHC; z;IO?5NrQARx-U#*xgBq*YoDhLT{JI?3eMi?c4W*pw_^dqgSkLFN znexE9YOmYPSxwty1o&%zP2$W{ihWYtQd;@{D&#_`VUg< zX_t!KWt5t&m72ZXozKxk4VQO1OYcvJtVP!cFZk`8!wA;;d?%Rz1mDyf~ z$EcI>xtpBlM*D(27}Pir_m?5XIbDXqLU-^%7l#65-tI=%fbnEKwzk{qCUf+f!ePus zuZ(z?x@myT$GB+)2u(p(v)nH8-N7>K~U1sG<^I{VSWfRk*vfOtMw8=s)uQZ(g{qw| z7C!lZw-!*Kfu7Srs=!IIaHB;Vtj2KRH0Le0x)9x_1*|*Si`M%0V0%zIAO~&79VhJ^ z69m_j8o<$4{`?^5HK>;z&=`a1R5pjot!Q>n{GetRZQHQKOCU?n-}FsdZlP|9bCp{I zjhv*t$mKWjT)xkp^TC8%DTLcrQ^Ds1Y*^iC}+xDvGck{y?#m{oJzr+pbf!`g)VfuEy-$VOO?;7NT9>0zn zWqMA{UN_R#%|r#dc5AumyYr-K>_gJ~IErxyvc3D=h*OE$aFU=d^_Q`tA-CnVcGLPH zK`nSPyakvZXK*&0fn24Htg&DOw2VBj+$UmA><(B`14?z6!Vb3t#J`4!^%EWZ+|9hz zO+6FE@t(##Hv=O8OuNzA>o(f~WjB8AHhY%-R=3&dP-+`EFk9eME_uG|o(t0X2ss-M zy7qAI3z(#h+a{lkZdWPxc91N$gR|1^#d)IhSL=OPaIEW$@=g&3=NIQ#92MEBT2BJY zHjF=r!HD`009(7q*6t*2C7mOP-M@o72`qgMxs%Ef9>j*KV|un{8r^42zTgNS(1sQ~G2GY;9?N#k759+erU%0P~W;Ckn|DG=s*_UKHY zbT^7Z(8Mx>Z$acdaSm#lD3h1AyktnwO`+#uiJW7guz2>k4w@KkC1V z*3nve2&~JfmTt2#u-P_tf*JrkzNE3APC;9tX;~jf`JjWiI-$7UN78d9;;zG6_&07g zVw)jhw!VjJ=56v274c%NGu(EN*y>BSU4O9OkGg5?wweTpJ1!nAb){`{J3|V4w2Oy~ zNOWVMoMTpCwfHiq{1$a0{q~(wn*2t&~3|hHpR_CsEd<4&u!<_vSm$kJBi%g zGz^L~5V}mkjDuy5c9X(;Af$R315n*#-0o-rspkSt0Yta)FvxZDGNVhj&OkJpkJE@SF>6yC=u46YVq5!Z8G(!L=wvj%^p95$^Lx1Po>z4lrwcp^dTrf~Ie=^3Ho_D4Ic$*5=YRT1-si488YbYwb4z=0D^T%R z!r0Mnk{^eM8lep|9Nc(X}raK5T~6_X{6!7E+t@G&l1;wsH+twLCxfp?r>aA4h z`H4uoPo&))mxi=8zid0 zyJ`vT)ndO4Y`E7|p(eM9#=SXa(+JBr?y+Y?(L*_Wu*-PfAj~aObbH3r3|G?7YrG+N zT=1OR@z~~Ox|nAqEk$JxMDj8FZoT!^ZAghVtPPe|$W=GzMcj_loH9(!Jf{=6*eaGv zgJ`iNtkM*%lCMsCSzU3VLYn8S+0QA)TMD_$K!RK8RM(o!t66c7b*7Vfv%1Ot9L33$ z@jE&X4`ZLHLafoXbkm*Pn-TV$H&jg<8DbEfgwncg+H4Eroe%MlX`SX>lOV&J##J0AW6CS|~Mna*8&>^{yMQ7^{4=2_rOb8gtc0jL%sWb8Rdks+so(@+M^&eBk? z*^GGSoV}TuFr*bK{x%kWEyu259Iy`{Q(yNkmmm!m1|Y4o^CUVoBwVv`p7RH&NMe$Q z70D0VFe_kZ{{}3)Sfo8)BHxF_l)lI-8SXm<2oAdmvh|{3*Di3*uk7*2>Mg= za&JCLo$frqdk)Of5`Dr&KghsJC4!ieN1b#&aaArM603|zmhMNoZTVmwp4Xq`X8916AJeyX<3TGikMbKOG zE<8o%2WG0fd zTbZIwYh=kuN=q*f*I}MhWVzkZUAQz*NX~B*+n$L?at^B}8yy{xCVwY~gPx5>W2qS? zJA}AGH)+1xb1pci%ugI%(1V>btV3W-cdpyaw)>6R>V3tb3`^;F@Po2RYa10$jgt!J zVdCgYrJ{qZcdbQk^Z_=SU!C1lWxi*z&-Hb#L?^dfU)YE_H&lx{k8wmnSGAlsapytbX2)}}RL=Ir z$t@>aY!94JxgLfBu-@rdOP0W}OL))jFc1Yxc7C#vPpVFfqv5hNHEhotsE4V)b7F2R zJsp`iJI~(Ppu@;OEF;l&%%U>UIipclJXJsR{Z+@zt#D^tbu6gyZh+}02A*lSXa|o*sgN6Vy%!8VZaSp^rNj%tYl2M|1Zj6xi+laPeQuA^nG=^ z`G2GvR{g@deH+s4@b}g2-v5nmn0|*<3!ClN-&eKA{x_=e1xi@Au-W#1U)^5#|6aF! z-&eP{n$nFUH||qYU;(=j7l)4$;-9a3Prl2}6X9fpK5k1A#K1*=v;^uTNyK>zj~YG~ z7cJPsCFtS6V1)3NfWC7zCryIhK8txq=0OX*EWR3>9h~bJ`G4u5O;qQF-`8YcG-a~? z!_d}*Zr`5uJx8`Jk^jxe)`V`yzOQaS`5)=l#Hjn;_tou+R#!Ma2~x%N72AYVC>|wX$Lb4mU5y-)rD>)U~Uy;bgHwuBEG&m@~Rn@aNVL zn()8jYF0VIwMen97(V_CqzGrFPg{8A>MFHz;d=gW1GcGvtN@qREK`%lj~|uQXVUaJ zCu9v7I&kQ~!PttyU0dJbhw^TUrbZ$=ux$sMD9sPsx=lC>7`wzwnCbK3R>1MM1&;fV zVrkLy?O0msHfMZV*37g{a&3oeX&SF{(mLg*Wlc=$G*Pa=1wxsToR%7UG%XrCoE9la zIWsLCywgLpDJkFsO*AoLu3q~B&wPV2LT;`<Hpw-o=2KjLb|PDRUSvToh%G~cc8KG`_bdn&jzWO zNwE6(234{stxqAWJ-Ly{{FHTR!}HTdmP_p}NgEEvv!o){ORa2bBuy+O&?z_s{5U$T zJFZUSQkvB1%;V^!TT0_PovO`b{-L^Yor>(aRH|rIS{|{Aa`osg^28ck$O56IwWHE4}n)_S#M9p1pQ` zx?``calW#W9|lY8(b(bG6S2p~W4IolV*g2q<3q&46#Z8_l+AtFJXWPKyN*xmWIx$x zZ^5UWOpIS}nl#e0?PQjwMRA>`ha|)Y^%F%2(v4;{igQjyuL=Ig72v>-L6* z-N@7(H+KK0x|{9ie+PJH9^bxBw6Xjrri?$1*^Lf7G>xCJ_;ydXXZhW%AO#%>114-Y z($`@Ncn@n{)7Cm+$Vmm8+)byX*b73z80;6ME$ZD!T6B<+7_3qk*X8)?xE(DC6m!Fj3*R}KN5+JWmif-c7OPC-{0 z+Ao2ACA8OZy-N^>tOJ5t0X+|tsip(nEwr^jY&@QN73f|;9{}Aa$ir~(Ye9p7bczBX zEoCv#3y95B8-ZRFbQ#b~f(`*`?cW8`@;YJz`9YCa3Z%8V-O&DGXsysCb&4rKI>jA8 zTHfO(_TMJ2X^GLYt5 z52X3-1=9KQAbQQ$7D)3I0cpOU0cpNJ0%@D}!nYxQEdXiz{R+spAJ8GO)rUa$3;G+7 zmfQm0l<0b!4dmwmr1N+hNXvU2NT=wFp-Sg_I*`uyRv^vyCXmkeLm-`ROSDLxZ+9Rq zWfYLkcQcUA_dy_??>~XGycB$*rc+D-(vmj<{YJ`hfr-5ZNbB+~kd}8czJby5<^yRd z7X#_o7lE{$KLXNy;ZHyhh~&>rtlJ`pO#%9q#I^>~X?q$p!0_c5+9ZQ!nArJ-R$4shVN5D``Vx{Fn!hSrB5q- zXC(3_0X+|tsVadU7TS$Kj|jRKNRLAw8`{5tv^A15@cEyl?G5y(q?iTtn4q5kX}(K= zekXk0GVz_B#7+g$)?Ep7m(aEY9TxOQ6WgM7z}Led{=4W=k#`7)4}6*GMMFCV^rFzx z+XQJR8nn@%M}f3{PXoOyDZU1JRS^H8`ZYn@47$aje*$T%dF=w!(x6TTWgD~&=%~m$ z3iOhoH-Mf1@>F*Ffc8@$ZJ}F%w1s|a&|eMe+98O|1=4ji3+O(P_Yyo^HPu13fLYhYjs1gI)r9Mq*zxv=0pW9Oyxb{imTd z%L;VPHs~aSVg?l&G}oYo25kd6N3n(d#LzAVdL6V(wcF5cGw3cLUDFQ%-Km)Nu!(&N zNXvWC&|Wp@4WRXkDc&`-KN<7|&~GJndbdEz0-$GwRtBW&=qw>aioBB;PZgqme{t2)(Pkxp=AU4W1Wc|V`9sIw5Im}={yb_z84HS3Z(P+ z$k6@>r1SU^Nax}73AAbsq+^Ex={(K{(s^8F_^vVNmq0p?dkyV=AT8xFAf3lcCiYDe z>zokekq@NvC;`%zTxie|Af3lLL)!$T^EeMk=dsJgUS(n*1=8hc(>KVY7m&_lh(RNO zbRLroZ7Pt?V>Xb^qs+vvG_kvYbRHi9`E_pitbRdm9+1wXt)X=S(s^V9={$y+*fA#d zbReC_G8223p?Up-eA@u&vUM}47m&_3$IwOt>3k;u>3oY#>}e);8<5WTD3C7OhlcO3 z27L{r^Jq38&>$5^=aC7d^XOq>2bkDmAf3lAfpi}C7`}%MIt--qc*W4(0MdE952W+> z!o+@SVtWh>@~8#Ud7KZVZB=K`Wk5QQ8w_nfkj~=(kj~>#6Z=~en`H&DYfQcE0@5k2 zMy$T~{KB9c4cc$e9R?jR=stt)H|QaQ9y91kgPt+SQ}}C0xD@psu3Cf7fG!l;l@1PU z62yZRHTu#ZD-zIFMg#QoqyYWFpjOENE#IIG1}#htVs~I>u50?w8TgYJlgL16?WTUqDv~>d`@|p9`7^bh)6-K)VIq1az68SAi}S^c~P8f_h=*yGzhCpo;}P zgE_0V)t;=t_KzF%XM6}S&aIn4 z!+>;&#u!v+Vox=+3PU^Fpxp*tZ}?s|wD*9tUA{2L86MCw4C)G`?Selu^ih8xt?5vM zCYf0LN1V?$+r*w?&~g*I+Mx9&cDted$e^E^*y{|s8%W#bL4%(8f7tsH__(WT|4ADl zKyZQttWt1*AcaoKO!g@Sv!{VHiJ2rVi-t)uX-CqeBr~ODY0FE3j6<|fL2>)Lz31aS z^*z^u1+k^21yn332v!hR8iHCD5m4#>d+u_6%lszI+LpHSX*1tB_x|qh-gD1A_uO+g z4tFnW|jA7`|i zLx0QYWe$Cf(LN5%EYfewVst8yeA@+#76Hi;RWk~5XqahzOuL2Aml*vo$NLG>b^}Si zJP#yGKFa7-j`t?etx~@f>v(QP*+4SSXEJJJ)CMHq(aUH(qmMKC9FWYx7a83JBvbxh zM%y@aC!<{)`Xr<0IdqiKs~nnEqThB5qZ5GS+uqB_48ebqaSnVGfaDdX>T!_vry;$eLymmCZ>geBwwy&bTgx2Ajyq?XY^Sh z$&D{D`aXyLfYAdS`Vgb1IrJGuf8x+rnD%!@|K!kcc_rFa0A&}(8PZ>SK=+BJa0Fr$97o%er>HK9fItxg~JD1S{4lQ6*#i6x~nmDwL zX&sDKaOh2pJ`N=L@)<^7^IL`fWy=Idlu7$2jx}M$dBSDAWGR=v59q{u2G((}5(1&SjLxp_NSg z0Mo*ZKEmh@j(0cHb^u8ZJ;~@#j9z0j>;0N9$1-vQNxq!Q=mHL1z^Ir*FJ@HFp-qgg zt=K3xOK-5h!^qwS0yV)RoW`Rr~+zXg)^!OI-)HAedw%`Vq@ z$z+tp=u{w?%9%_%o6&qm7cwegw1`m^qgqByKr+wE7_H>cYZ+b7p&wydg3(3}{S2e8 zF#0;9?=jlR==Y4?VC1gQxjL26`+#I^UBD=xQ8A-ZMwN_efn+Ja#OS{neTUJ#jJ7j+ zjnOfcTAEH}R0Je*wUAK*qadR&qX?rL7_Db?JEJ=peE~?;{`Z;o14a)3$+A7f=ot?E zEu$A0{e{shK=RptGCHP8)84^oE+aqCpo_-Sg^VuY(94+Cz^Iu+Kgg(yQ7@x4j6Tlj zKY--h?qc+94!xgg4=~!vp}QD8&FFWGMj5@u=#*+*@_CFFFscBOd8uL4$f%jo0WyjQ+{!n8iBfcLCi92|Lzx0n;vF)X1T&O#3j9 z>=D1iv>ySa+GQFQ0?B@>ict%rYk_3hVvN=S$y5dzeGW+S3_HqfLx< zGWs#2T|hGBrx|6{Y1(@jtz+~BpxXqmzRBoeAerZ%GI|n7ru=J0uK>wB|BK_LEz!@O zz~~)}-plA5M)QDV%6>*G81*rFh|%*vw~0LeozW@v`n~UB|KR`0&yMbgWcQWk-Mtgx| zD@*%;PWc!{CjiM*PGK~c(YcHkFe+wL#wZ9Rd38C{u3_4>OuL!UPZ{k2lI4Ao(Mv$G zME_!1T9b}h31fyR8$y9#NwC5S^W%Meee=$mH)9*bN zNS5OaM&~dp;dqM}RWYh%)WoQj(F#W0jIITeZ@Zq+cNlG9w1d%ZAjzTMF!}?B{+ZEh zjP^0gxLUvMWJc#P%4JjzB;QfZsDV+C(N&DDX4J=MHKQAVWGU}p^nZ*VVe}V9nIZke zI~kn^By%;NQ30b8MrDku7%gRVC8Mi>WUeBNzQX7(ASq2h0Fv+hA)_6P9%1w|Ao;{o zO#3yXzc6~4(cgh&4qWXT9nYwOQ7xmZfi}3v8}(rznX4W~*D<<*(J-TbXY?r``Q9%w z`URtB7#-K4wNy5vvl#sWNT%`%(`I+-C*BJr^LGxTLPh~b^^BSrEd`QV^bw{#%4n3) zUl|=A)^9tB(dj@ke-|<;0Frgo#PM1geU#&Ui_tF_ozkV#%LQ78S~%8~&$M13nerge zps1r;8GVM)7a0AD(X)(RX7n1PcQ4oJox$jAAX&D{nAX6knM1E-T8z=hIP_bL?gx@3 zdXQ<)F?yNNNh|bwa~PE|3NadF^k0k~Ve}lM*BG4?(J7z8XdaN{q?b`4qX46FM%9cO z7zG(!#pr5A5k@N+^#MulewWb?fNmAF`UuB+l+iC4?Pl~GkbGi2fIeV5S=Mn3_PHS;vnMuDV+y~MQHeVTSWkj(w*OgoEd`AiEi?J}l) zfN32}i!kj5rrpf6PcrQ@O#3?1zRk34OnaDVyP5V|roFQ(eD|($Y?L4H-KdB_c6+j>Kx2r zbQX||w}5GRjEXt5lu<3CCPr5>>S6Q=Mt3p#A)`G&k{d5FdWl0%jOkpR2_)m4&1gQO z3mFvv$#Rr4YT?k!8MSk0FVp%NEjUis{;!YMs4+`hTDhlawD?qwzRalj-TH~N_h@t# zqi#lzovoie7QM&@(Uag6D)*JMH2NN+-+DA{4&rUZ{}Wwv@mH329@D%`D`DCqrY&Y# z9nu0oTlGV2PEHdE7NXc8m+&Vc`?@C?`7Jn94`mukn!emiIy?#DyF^2w7pE* zFk3%62qg3J9Mk^5v}Nf!-c>*{UX*ETm^R2Xy1h`wYd%Ily9`LuHZX0FX}@OLb4;6y zDwJjO0Lf=7nYNf|%}iUyv_Yob%C!5KwuNa~kV*NDY#{lLMNBJY+U-oclWAL+ww-DJ zWE!2lCDSVblJ8i=v?$ZoFpUmilJUOBG}_58X?vMA53NViyg>3D%}iUyw2e%=ooPQ| z+AgMLoS@Uo1X6rv+G3_Hp!@A0$@F<^9}YZ8qxhLRm82{wyd+*hF~&lmZLoEl@}Y z8c&^y{LZmZazV+qP%Z)`%R*@eWfw?BewKscI@wHF4GJA6WyJXyD0Co`LHQ;qbnKEr zc@PvjEXkleMNge+ro03S9du;GNvDG2W0dRNpwQt*MjS6FSspW`9uzvb$cWPgN+Sfw zpbUZXEeqvNP#|=scYO_%FF{r{75lwGp`(M0basJ42Lu_EKY&8V{uq>fpwMAH2IZY- z%XCDKLGgh?2k#h^CQ#@&9fQ&j3LTPTP(A_*9ff01z6lB)aAQy&1%-~SF(`ing$|=J zD5pVAFoLO2whCRQcJb;+!}}ocB>6K0+&{C|9+LgXWBPQ7bY&nm?;m95nEhaXzi$xW|Zd zzltN;YKnLLQN=;SO!=;NQi1S!C;q3(^ZQjC75iX-%0iu`0zMd1UpG-W#ZDh`a(lyQP8&go;sp)+mhBQ$b~{Crl$ zfl5sIuB|E#lw`^{zfp0Z5>v*RMFNPA2me#m`&lZ^S!2YZGkE9&)#{kef@pY6RKy_N zLUHJp?K=qaXMs4-RsJMRGusj>=?mKXF-nskq50G9)Ia%qL7$P3(9daPZ7V_GSad+1 z{BaJxW~b$@#%@cBZu#`8I60usPFqLnEa`KTigPYPW~V)fFV)~oF>h6I&>bL-2Y;n5 z1>n!8RUC8>h%+ZS0_gv#;-G^-oHk^gxM2N!Tg5pa-g^ELcfz0q<6optNDH)`|@F6`fDQ7DRX?01dR20(Tk`huBQp%F@ zZ;C?Pm6We43e~No{7_Ly^d;qaMWJj-$}FXlDL_)rQ55=;luAV*ohd2TC<^gPQa+(5 zqz@(KyNW{EPg0&x6w-B)vR6?^vq{Qv^b&kXk4cJ0QAle^%KH_Cbd;oAr6{D4BxSXt zkp7XBPb&&(8%g=LqL6Npl*bi?G>N3VpeUp_B;`0IAReZ86y+?YlqkyCOlegV5L7z7 zNtAdJ<;zKwO-Yo8lPJ$8QQkQuRwhw4BvC$_MEO<{<-sJ% zACf31n9M7g=fWgPOA_VgB+93gC_hZ1{340+auS73uF@ZspCn3M5~VANvLT7`*(Ayq zrg)V6{49y`ToUD_B+4vmYT~2QIVFjblSC;@qEshQmL^eFBvIBTQEp43d@+ggtt85p zB+6q+lsy*8Kk!TTg*lZ~t&NveUEUUq_V$IAhudmaMce8_E5l=jH?LilGJHvUU)xyW zjiJ71BpT`MX{(Q|Y!COPdQWAf|C;?o39jvrhF7*#^dY^DPyCsj9wZNn3eKu#G@fQ(1FEQ|kB? z4NDpunwl*Uf)z{J8Y|lx%Ywn?#Z3(@HH+J7>su>pmn?CLwz#USu6c1=eM56?b!|mi zb8SPtC7LyRl=R}ugNRrsGG0-YI&w=rQmm?ME32re3I^Mn8kdx(j=Z?Gva+hat+k;J zg-#s}{AsNPpY|8;iuzz>ZSbWbC)M1j|{VI>YU;<+wJXtJk$a;!t~gUwF0tg&P?(4E2S2mWTWGPwTJlNDrEt zOaT`-XhvUu{q>sK)kkWmt+B4Gxw@fg3ArHK`oqySeeVO^`CttV_x0hLg|>>`o@ifh zcXzmNX-{WkUvEdLzsS`_UQ7sbSz~QmXQaQQcXhaLt?l`a?%sa;8?S?Q0c~-lv$8E1 zjyA-it76fn@G58v+tdAYM?_aR6pi(T+xk=t{am%A+a6ht;;any#BfUmJ=NEyuCkD? zs|iP!m;!_HnhR@@DFuBOh5ca^y))JkP5GSV;)T$is27zt zQC#G^R?;1x6W4E8OF^WzXk=x$H)iK570}L9i%3LzB6x=WBD=W7qtn&a9cgb{5$frL zGG|VfMUln!SQPTev_{lYs1MhBREDArL!(d|XD1&bodJgIlA3@wjzmq*5hc<4Dku0ya2tvu&X!MYS9&m_dZR-vZoEo)5G;71PMIc+Lza!Km$tmomqlRKi z+u*37c+^njQNvL~Q5$qKY$(E@bsou*?V1!K#;8dlJbFzENgB5%#W0UplLGBy)uaga zQEE~I9-p=)4@Ocb9EX^COe%xM7>!yYIE_Oc5*NwYMxYMSoW`CG(X69RhX}Uurb7%p z(sT$4VsD@WS&l9p0)nP-r9-eWqI3vUV@Zb)t8#FNpvI35A=Z(jLj*Bqbf6ofMTbB+ zPIL$mBSZ(fX>8cm7FoHft*tWLwG`$>?{zfvS}Mj~G5{v@5{yW?!;6J&zO=N!r5-^D zMK0^?#1(w~r6rnPK?5=w+lXA(3uh0R=>`eUH()&19a^<2+=(0baEqVmy%nLJj&OHv zuMvMK4eF|~&ZRWZr{9G%>O%d|DjGwUGIePv60Pp-3u3U@9d2mf^@J1rGNR{DeDAHY4in9wU4(S->md^?% zn}w`3+=u7E(N5uIToUTP#>5STM!MGGZ$Cy>wQypXA8qOB6L}5y$#>TGMk8JDERwg< zc(2Nq6mf%WJS?iA%#aevfN-CnSFI^Co{>e6DTx4PjD99LBgimVO~W}csxk&ID?{Dz zy_hWdmEn~gtJYcx{TOH%kAT1UXC-u?2^%rc(yWOhJ}#~_#Q-7N+ifCT*U{e@Gp7N9 zHPPl3H12|T)p!r2w>i>rO}~kRgstg_mT8KBbgfy5;Kt6?$`xUX2XQbxdcuW%U!KSG z@fQ^p=lhC%B>|78(C0@;o{xh4K3`Em0e%(weEIoAx%z~wE9SByK6< znLi?4vGu(d7UJ%bXJ)zTReCgsEaH{qnICo4VgmZOQ{+2!fQT2!*FVKKO=vaFvB&e3 zLS8H!yb~hOiFmiG_kIb_q29_{mbM1t+Xh~&+(XF?-d=r1u7T~9@x51msO^K>hNJIuZA=8SiJ6{hK0Lyc)UD37~pTiC1JKPKjTWK5{t~ROT0= zhoDTnD^o`u*q+T5xJ~ijp~6*`9>aI$$m?%$Rmpls-Zv9>M!tiPF2Rh=l&z7kh~G5!ZV`oQ)a6mOd>zk5@4I;BES(n<%4nMH3TeyG+s`sJ>T6p!N2stTt#Bi9p4 zSG&yVoo$Z$z?MDfNO0hHZuh1wD03FQLF8xT{djcX&3(~|miQlA<2&wYg6<8*e?IVs z*9TrKrI!+6;LT&A7tos#d7tLfqO|BG!{OJj{1953Y$y6#a^QhP_1t4ffY0AGv?X!u z`oPZ8HTdO1ZD)*rhbk&@Y{GTxRXN!^DsxU1LOqNio&4xmRjOSZ@gQ`GYxLi>JiNKj zJ$N@L$n(}r}_C4nk7n@7GQDq+WWaU%!T)ee(4I08PN2A5zu1 zHx&<8KXKQ;+(VDz*TBv+E#B@;b;s>LKvx${bO1m~v?gn4LTZSwC zi59%N&Aq8PCu75#^P?^IxHjzDx8cp)AM9H%a_z2s=!c|@!IHd^}tBapG}$UwrSP`Lg=sFKfnZ7L2LfMZK!fsqQMmp8JVQ8{SwKeIMHQTy(V_ zq~M`gquEIResINwV(22wNx&XR)R0M#0reiQ$=v$fG5C?5s4=>o8gy6D^++o-(Uf`f z1K`bZTYq;<+AdJ$#C`F`bbz_>65LK{@1>JsEWB%9DI8a;2J5$D>mGSPA>X0AvFbH4vLexvsCo8mj3!yB;eiz*^2*- zct0|X->OQ`V@s9vVga(I9!|Itr8#IXL+eQJP%Wu&i{m&|yqhZPNev z4~UUNyJHJRsCh|!w8#^kyT}_|JoIqXJMiWy?vF1-q+2VqGY1|>6YX_dntRji!7b6A zMGIq(`ycl|Jo=)bQ`~c8To2-oJ}J|SkHp`M@7*)>55XdlNzRDsmiCju(c36}_a^Y} z1TZ%iOVnrjA0K*n{fVO=Li>9lE%3-qE%9Bb^V!u|10}O!FAl89nicy~VommN+dl{X zk#^ng#3hMk=@+%--1JzYcV1#~#_-%LsW?|XQJS8(Vcu|h>2UhauK40v zcthZk8^1oVy@2(;D#s7sL}R>xT9#A*8@E0;i_3#bNK~_hJJNv~SK5U-D=91Q$Fs2F zNPuo<;sr*6)D1y9QKQ1fTy8ZE3`J z5-k_BILVjEMB7pM-hHCua(Km)s7PfgQK`17U8Wii~&9&~Eo2?XrTUnLX;JdQDt8mxzDHQzQq%WVy=H0X&nam=mb-^o31B z39{~Q;Kq$+m6f=d+GD%|@Abqh<_ztN)>87MFFDb~aRXcUA*h3j#Cp%rzSyrv&ouO( zZZ(vqE@Proqj6E+qj#8+H8IYd%IH@_Iy3^g`Ng}C4r)fcgXFUn@`>N+CqXvi+u~1X z&c}C9=(i|#dJYAO45jV$zec=uZ*na<3%xk#gInBpJg~?c|0TZSZwx*rx|3-2qJ`0N z$h;^18%UerJ17?nytzJl?f?=z+&rDrq1WVi3i%!Sr7WFjySg1xIjZp7`A@}n4wtem zA`9rD1kqQZiSh_)NBSi^^c#5H;~u;ok%&i4`2G?8b0~;HQs~vW2oTvaHFT{WK+l2d znS-onLxSevZ6xA=UMdZ~efXwpx2VqCMS6UFp!{(PO?!L!NsmtD_HVeYs(M+Qsgn`$;vvF|c)3JX3b#Bi|s~f%E}* zEjoBIFvz&W?~yYRXqF}76Mh#VX(14%Jbjf|G5S&UI@rG`*&jhd^jGj@k1oQmKsuU9 zD9`O%{OFChfCqC&zNNCYad@2=T2bFkNuENFsQ!ysK)N3E3>_|NRD}=A5f^pJ#OL8^ zRxHESLL<|IBGec>XJn`sQHAQfjrP2bCTKWLQE z5IsLvG8qDJCTLVEloJ|{%*A(BVlc;t=p+k+IR%99AYh4v8Gwr``nzv#qRjX9wxb>E7G zBQH?Z%kBs1nWJqq=V=>7TkTqu;r>X5E$^kK8X5VVig!}%*XFc-f?)%{@;c*{DLFK> z5Rr@;662C_OVq&Y$GHc|2)*vSf!EWc*AKi7*%~3MScuw*kQ(>UOZYwV3o?zNCkFOp zz=h(zWjlV4KJCnp409R2OAlK4m0@P!?Lk%*v1bOhXTb_ney;>NGE%^|KzM-3P{tRjHR{kjf=89;_ozcd z6j$O5VkiuxAB-n9oK0h=8GX;5>oFvVZyV`C`xbBT?^YR9x@|ux#0th2FZz`|KD02r z>7V%8b2}ssc(2hiB|qhO@#YtWE>KL1lQFOpEcL_{B?0lIE*&fu4HZ51Jmk|G|9lP| zP=H#G-&T7=l3GgfH&8tIY4Bbj=sA=>SSf(>@LeKuUYWB< zFp~T)rGt-0-xGg|^u&fYz3##D@Fw@B#xx9R1|N^TI6Npzd6gVEe-CpmcuP8USaHpu z&x_0s?S`{?WHY&|)I)ntd;x0iww#ARfsOGl-%P-25X` zlm{uwV9rw%Ws8VHaPwAEl&{Dr&lyn&Zr)~!vR+1^a;sDbZhpuV2h1ufgDp3QchHh$+f0it@dj zEQ<1)h(d7lYo;jQq$r=q{0XA$7EuUpPR}s7`%#K=TMk)RssadZKHd~%IYqfWXC6h7 z6+m!vmMKalMS(p*QDg-W-25(6l(S@%5+e%1&F?iudFy$RN~sZr;O28pQFhBHi;XA* zH|Lt7+#{nj8c_&tE;L2CgQ9#RXBkD26+m$F#il5I6y?60t0{`C0D_yzN2>+1fuejb zX9Y!(6+m!vl_?c3MfrTrDvBa2fZ*oKOi_-fD7WRTp(wHi5Zv5kit?vFA4{RjAc)Ik9Z;9qn z4h$t1``y6y400&w?i%_M^Db!vJJR4LkZ-&f-O4_W27TI`lkVSwiGu5nOQhdH{&s#? z*dONnRltcHy#!ej?)Fotcq%{A-yS`C|M^Mv{%rAnO2_(s8s87Rcr`c_#ZYd|9^x9_ zl11a=EvPhI`uH~UDEL8i;e!DLqY^XmC7o3!X3^wW&JZR7>L?A>Wgv2t&Yc<9el?9p zN9bJ?rv!0^o6m6VnB@vQ;U1tN5TcTQ)D{10{7LjQb4Qmd{_aq^pTg95jofHauX((Q zr^R4CZJV}-5aWdNpBiqQHSp&9SI-~5DJ}4K_rOLZLQ%z>v`!2~i+wi!x6#kY{&~1D z4Z=!8nshj{Ga#AxlHPcTWEQHI#^>Z(Acr@F3l>r$n+0QD-}3`VEco@sEf}PxpD2DWGUx0qgl z_C|9mi3&13#4I$ajtcT@X2ze|^Rs8EZDtt{z#si0`Bunw%|a2#p1@CMb2JS$G34l^ zf$iBNLr6*H+msu$^X=JOSg8+CTuRYP4dzz708;_WvJ#846PTtbB^@YVio~OXv)}Vj)%`axc!16y1jkxEvQ7HfPFL>a~f@F^((Z`NgRe($# zzoEqC9{L?hhk%!LfXMGL2#Q^XVj@x5*gP2IAsU?qCaTaJmLy|Ed?M^}9BaDUpK_n|y^v26LO1yO!u zPpL?I(h)-|n2|-~3s8JgMyN18k%E@fi}xY#?vMNft&kG_E4ZM8=(kV>$oeqNM?6VQ zRVKHQrryD9o^uDwp$t(T@W{77@o03uir%#m75wlkLJqUh^oe=FWAQ2sLj_x?vM7bX zQ|odCkiWLwxKjWmdKH)pNl7(|{kt}%&X#}6=yr^Usr%NY!|Tt} zuRjy7|Iy2W6S-7;N>rpN^>nTb>qglU|gy4i_% z12o^L)7AWw{c9cGaJ7ge{-ATc_2;N1@guOqJq+oDWbXOvOR|}}2Y&_v@^Cuk1`~$! zO?f#TBdaX1TQ2evd3rBZD6)BuQU&LcDiDcl5ss%^*frdJ>}=iPh^qYH_!e%71v7{uusU(?o@cJ9@8Tm8>_VE>S*{J|;gmm5(e!Qgvhz!r%Q@aO;74 zsA<7yJr?ZWhWVXSY5eNnGW59n4yfZCdwtmD>AfNofo(UP26^h;D|%{rFaw?Sl}Imj zd8~4z>)X)xQR-CE*Hd$2qrg4*5OVir@;aXge-t#v;79NmHBF}79AQPEX7Np4*DMs( zhllayYztEg^b+x%o^zYln^0u=?z@}ego8WIlQ@aqxAk{f$3HOi@VfUU&LGPQt?NYU zz%axPY>gHMvIkDOvn~5tixfnewaY|rT?3ICvbg8z$Q?jpF+bjN4d-*ytBI^q6MJzAb zyXQwV77!Dr|AkQE1lb`FF_H-pnUuP8adZ2gO_b9RBhi=xDH-}G;wDPbK}S!g6tt!W z71NV*DDo{7qai!76n?Bdr$4uE-Jkr+ zxX{VS`46hkxLz+&k&T=+CuWZEhdw`y zr6ogK)_n;2=6Kk5JJJF>Zu&s{m94)&W_DZFzztYxFdDcf8|w{b)0)0ESgYed+l~Q>1j`Ce_f%)`KBQ%S}Z-0#DtzJFsj0FVXb= zgvg_hsd(BHJx=o>5zI_nmT@PUc7ey-!#9Fufd_6(1h%gKh~I`|#6PC-92f3!JuVWHDJPqWvlpnBN)vIcI-N`rjdMDo#s z^@6jamkhiK0l5PeGVtc?*serXI+&lHI9Au^IaL`n54~mdIKg+4i%gSTB*jlG$xO7M z{(nk!c>WXdJzMv@H*F7OH{-F_({^EP%&CDF)~5$XZn^~d9Qh#C1=VNZg&Y4G7+F6W zc+ma-wv2wxs2`D^9OMU@UcFkhQBk2^*fO%xs7*@9v|gn%(UO^%l}qy(1Fs)@-BtT? zhW-GRB;`4AMMk_ux!_wevE<{{OKAc{kpkP?!wc#6Q+qCgs}UONOeBV8?tyhC=IzNN+qA{m+4twAf1*tx1>bh_H&tJ#-djqH!+P1Uwvn(p|Yq^u*u;sk}yn z3Ej9T%{>$*8nQ{m#Owr?7e$4esX#0MEisp1B!IYG8-?npPJz|{QPxjZ{3`VjHJhk& z0w>1)>i$t5jq|{Wxs>W@_@9HqWF{Ij0p}$OzKzc3V-I4~fB_*W9{&~^{$a(O&?o4Z z2ex?vyWE4HMU;VyX2pL4y@&@d>Q9gT4jLrUpBZ?`J^T|WtN>;PZhSO=7p#AX1f6_0 zG~Wpoi?uF^)!CGM-~spGyP%b67H;rqfCLR4U*7YNpCiXun}S6#WGmEUB-%0|_wGTO zn2JAr{?_;-TVHr@+9Qv>nf5^7Dfh=#gB)l^S^nQvyi2V1b8mVW#%ud8kWhX02yJ>$ z)d_n*uJeJHXYdWofPi6Wb|({ky$53zqW_lY$Dz7k#3~W$FkXp22`)$lMEOv^Q?W6h&Sd)y$n}@z8Z*x$&)v&jqj!PYZX|(Haqqr3E%Tr zriS{PJA}H3{z?q+v#35XYeO`Td$5-3kr?|as&n{_#Bx5gp!2B)f|;ZLK^djGbbtIU zWRvRCecP)*Bj*`971>RDgBI7#yESd(YhZ-R7}%Og&kKGX8(pS(^=r(hccFbgPkl0k z)7AuHKV$L78mL>Z5~g*5e@hpHVUbzSOodjq$fc`*;qWfCmw1$VY_`gA9C=md;5u%q7)Aa~CLb&iUKUf9(7nXiPbqXO7&r*R3o$iNobufY#pJssiGmhLHQsD>{ELRelH~;gK^xjQq*z(nV>pFCwGdQy`##n&BL1j1u?V zLd)Bl4BE7qix72Bu0HXw|8ckg(a|)^j)v0kP#WgOMrzTE5+`cJpaU^RI*9u}b`RYN z^2j6jlY(nQugNgZXcr}`}m>9*BldQtXw}k{?N8W z>EcA@EƏ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

cfKbA~ROu6cd{ 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

FVLGUXLh~X6^KaxI> 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%0A?%NS7pgYfbe?G>@5k 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

|>RWPVKH#Uau4XDp09Be;}|8 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%0Aj3H*A+bj*3<%=!8xG1qQX)C$8qO_*4 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%0AiB;m81Zu~&Rn89 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�a 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

%JIt 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�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łdHw8)Lh5xG%O3qQ27 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%0AAoX)%YtbF&WY%*&6RBH zusc&Utuz!$@U9n|;SkwHk#UK#c%mpC#-!#uUaZCtH?2k#8R7$B7s;j4L|Wj|9uJc= zsWDCy#w8?`HX><0nid%Fe5e;y>v_1Gn#{8i}4#PlBpvjNShJn2P034s$O*y$DGl!S%>+dIa>+eB%v}Sv6~dMoU1F_iF4n-9SB26d`eGD4fw)?rRoDU; z-U#ba|AK7)c9rc{Wc$BGa;u*mX03=FfL}7v5zYNwijEFqhh(?~?CgM}sQw@SLm1qa z1u&LFF?d0vZ)$7^NpUHUUCksZM7RZw#&#yyIMxG=o4@0t&*{U5NccB|%QGbr4Yt`Cle`5?xID|=pBAP}0sqi0jbW}46tp6wKpG6U1eGMLy zTJ?B^hM8TsT5FaUG`dn_bY`=dh@p+m#N1|_$C`<+nhBL2G`OakzXh0vzPMWLoB^){ zFL)|?6qmbruu|=08s@jabk`!<5<|i7)7Br5EjpV=X;z3SOHaE*a>DjZOoxZ7i9Dcb zBQ#rd7~YO^SZ*SMLB?cN<19BiEU$>_@N5zBD*w`>`cH7J&QI3e05qB(TpQmIXD%Mi zN0(@pSTxoHwVd8IbUpiv8)M09K&&(xd>6~1yr}ZKq3zLIqOsB$(cme}{;fF>V=slR zS7U(Tq7Jm_c>z^7MPoI%%I%Ei!GPv|ne^CE6Cg4?ni=Oci**D`vna1zPQ=Jn>U6GL zhnl={MS~pnaF*gozcJgNo*gXn|E$zn|1$KYzfI-F)*gkedbl4j}YJX>5f$@+AcQkP_Sy;jOe&%yLdcUrDUAWPZKV1+yiM@#nf}rMta6XIZh9LSczaT&=!tqjGj+|lt8R3O~ScZPU@Xyl8 z#Z0gRIf)f4)?2Tt*a2Maxr6c_;4UN=AN=Kxj(_ZSE_ONAS|8pZD|9Tb!>-uj$fhkD ze`kc*SZ!mOEeq@+hh%fM9#<)hEq8A=vlI*K9#f2`#NA>=IR2^I(+& zkz81=xzX=|ZD6n_Cx^kddCwFvtsMQw0S6-$^8o! z^4TN8v}=IJ&?d9lTOOwU&*QSsi?t7Pt_+)3g*n5WeI9my6U^2w3_kLU!uG+s8{?tm z#|eTR9ApNc`Zd_f-F#!|At(TbrS#>{f$b+&Pgu#r02I7IOR_?&vbfeQ3bUY}Tcicm zrNatQj%^h9(%7JxG%*W4wp%l+#(TsqI;U+fRZjSt6+3o~wp@a16%3Ws3R z&TzpCM%ZT16}8;!mNK_O*0*uQ#HHMJl91CHaY~=8{bxG{TK?JRE|J ztPIayJ8PgQcwg$Q*L9rTuJG+dGlIYC;mRiIE$+wHqanHBX>D=cZ7*h*cKJu`?&=eW z<-#a}#_J7N4Ce%zz`xKZ$Tq#jk!uo&{XtY~LtZr1d>y9q!_mO}VCU)w!V1Y9^q?jh z48-h(i3a`fnjDQ}$ew_QB$kqf?Subgg>{dAH&zDRNM!o=t8A?QTjXM30lS#H*2@+4 zoUoU{UKzGn5$2bKIW=K^Jj@vvrhO^;K=e>iZ08|=V0LU=biG*kKMafaN3h`P3^UTA3vy$J!!x65*g3<(cISj={xxh@9iGXa86Or#gKTV( zf+aJ;!XO9E3zj^9f_3?br`8g4g=JyhuS5Q=M8OKw$VD)X58Fd_Zm^u(LCXiioYXTG8FJFj4}S0ABP;2qrfS76qZGh$zn1;ylzUTCGE! zMN!cXY8`OEwhlN_tF>xt9r)k1*E#E+b8oQy`u)%UeBbl@2hKh3UTf{O*Is+xX9!iy zp|%-5v|V574&N|6J`St$rB=eaYls}75i_2W;D5~>c@OjjP=V5QkB{wvjk<(}M0|&| z_=eDi!K*}w#A2!(8B{qQq+0f8D%nx!;qxB!jccI|yK%Y`!jA2@K40F|v~|m1T$L~H zDzYuFkBBs8C79XhJ+))s!{z}sBu{y2=RRyG`}Ia;B9Q_+uo-;bIuJMb_xQ0B9ViOq z_~+yhaSnnT{Bvkm3nBbqpL&Nz5wudX+}^Ewgl8G3th9+0G_SyJv|)az_Z+cn)k5_Z z89|}FX0FaTZK8Qvq;JiURaI5G>}ja9cAQX=Xt&Ag6#vC;6KW-IKT&_J_XW`@qLF@w z$$_uG>{f&p#BoqzCNlAXRmkIBY`0@=;Y+?5 zL`+R+3u>VMjWomX%t=KfEAkbCfF=Nz4caJ7HVK7STgP=BF1h}HFm z7=tb(gIbCxKmKR@JFpOr@B*os^|+Yr)p& zUF)>6t3A1}5$2&`_)?#RT7N{_*y6A;kc}z6A5lQGa>X(H=CnQBqu?Sv3c9|S9>q-= zh+gLvlJT1*8~kQ2jHCM}Az$!SU+Vl-zF?0p^;m2q_CN;HHh3PYkKN-UV4DfUu5 zV*1n;c$Ny;AJ`DUsOaok%_J-Z*nIARThK$GD@B1kqdhYVJqR+o$G~1xU=DW5kYUuQ zoK#ZBKj=ICChbEH>Gh@Fj+$%Uv@T+%dkWy5rJg*f;lw-rIaf#gJJ6+CMdj%BQCNB> z@-fuQ9h8e3jU77uIjNmoFjvE*7Pl2p^ePn&S0fk`NNqt2d>(TJ%qUv0cN6%W8X~%a z7tmA#3$Yl(bj3W)vjH}t8wvUb-a)+yZ)jYmH#7#&eFQXS$DRT23=j=7^;vZF zxPZfb96Fjqf%iB#LH7{@{FjiVUhnH4nhnuL^Z?9=M$k3F!3c+VHyT9E!XNTOY;n^Kj<5*6ZkbJu)=o;1y?)V6!8sr zkY=;|S(cKC%tQ~a)nG}jwa$noYwOL^XtT`p|B-$jF4wzc*v`^Ss^_MkDmw22>9F2W z#N8wiX(!%{oQo~Qb0hm`|8TANd^K9aFd_vg9qjcSJ&dlT*Q)7p8KCovTmQQ_1%v~BHlsTT^?-bKl2*%CbdQPZ|U zt;(|#ZlxUc=C`hHZR_c1Q^+o`mTe%D@I;Gc0zHpXsBC4^D|%KuHvVQcNaee1+$Y>k(S1zRgfKvN9II!FXfF_3aOeyhEfsX1pzX8l@@*@&%Xh1wr%UbBJ`fZrvuWc5ohc|QY;$J_ zI#JL@LC4Ov<(?4qt{`u@&7CW#N6^KBZm+QAo)h#}LDyB<+$RJTSJ|{hf;I{&sJ6LH zf>sN4B0O2i+?VitB6A1fX+}nOA7`V# z3)# zE$DmUCT7?+rwB>|;xtAI?Jz-Og;a)Gan+4q_++PXpAwfHZ`&*&CAm|n0zAZF*3yH1zSh!ya?Vo}U2sa6)a}4^X z7^A}k9UrJtA$H%Ua@_52)bLi zI|cnt(CZ@i2SM)$_b)>GTu=(;0-Q#wppih_W<~>{@gW~Ggj+1AQP6xrU4oVgS_#DZ z)&jA<&BEO(=rTc93c5iM&0pA3dMlIBJ%SzpV$Dwo?P)>J3wlY=n}XgF^pT)X1bqp_ znuEjaeB=qL7qnc^1%hq{VoProbhmIH5Jc~;vD}M-=sh;}+B-mO!QX`YcR_gL*^28G zG*D1T&@e%V2pS8-Y2*NL8pjB?R8X~`dO-^Wogk=F(8+=#K%B;DK%BT~`p`gDC`clyMf;^Zg zb5D~bXpo>xL0N(h7c@>#zM#p1juBKUs9I3Hpap_X5Y#E?WI??^+-lbVaXmO!xaSMH zLgcO%xnBtPZb6R-_i3U1TF^^^UKR8f5U2Z*&^{6Lm7sqLGO>hV?+y?Y1Y#{ig*HOa z7~xJ7T7jSOqM&KQog=hbK`p}V6529BtAu-w(9RQdk#K)1 z=vG0$2I3O@0}$u;Z9$(2`a;mxKpZ0h+Z-HYpr8?gMhVIjG)d5OAl7mW5TqiAQ0z#sBlLJI#lEeg*H{t96_~$ z77C)TnsRDgK%Da)LF<6nf{R4%GC?;9`njMxfH=mZLVH5ci-PtDdSB4Tf<6UeEnfg} z&S^uCE%gdY0Ae}%Y6Npf3d$2SNl>|HbvEje>3w zM1RqXqsGuhV{T7IAc@c>7_O5V05cHX#F9dxj$T-|iEm2U4pfn)XoF%kuLE{8X z5HwlPbU~$p$^|t5vGpxLoJN;$mkC-a=rlna1)VKu8xZTe42bpZ5bm9V9un?eAdd02 z(EcuR-w5)LvGt7s;uzzF78crKL8l4YCg>(XcL;h?kQbYie)QCSbrKMl{wab^6Lf~4 zt%5ETbe*7^1lRvxJs{{&;XWtmb>aR&&^yBYL}-5%^p$Xpv9|R-K|=%$6EqTt ztvXU@If4p=J5y*Sg35*4AhdacjuURD&`uWAE!@+Dc7~vh!aZMT7YVvtxYrBqWj@@m~ekBwC4o9B-}p=?HxfM2={M-4hTxb?GmmpDT2~~*p@?tcBr6yL6ZfQ z0&)GT0OHoONN7J6bc3Lsg5Ck*82f=Z-M<5|Ro@7r+en;71`u z;r>n#-Bx9}_k{M5pnnMZR**5?ju8T4pAHsuxS(-@rU{xMs04`fTLr}S%@^)*f))d@ zeJh1_nxM^swhFokh+|wYw3`LpC+I;zzZUeIpqGGH%WFVv-#+1fDCiTB`&MXbg6)?C zAl8y4v}{2W1r-RI3dAuggjOx+ctHyVtq>Fuv<8U1y8(!;KVP^P38L>EacZ{OTSV?kpmv7|(Ecpw8$kyIrR3ZBNEI|n(BXoP z1mbij3vIffV}Q7xRtTCa=vYCE1)T%LIl3H(JxN~=V|1&aI|SVg#4&aWZMUFT1??5I zU(lz5z5rq^UjuQD@D7ueZi1i`AeI{;v{8a`1r-V^6;v*0o}gm|wE}UvrwFZEPy~oQ zdAgvp1YIEL3PDc@dIpGXehr8{`KF-v1brmvb3tDTIv~g_w6zQbvc>=)PUA4)9w8`K zP@$k1f{F#r5mYOv5hz`^sN;pUP*9hkWr9`;I!(|u4ONF*UQ?CX2QFQ_#s%?E1G0h`D=(_9sCO5{RVPBMfnTrLLMZ<*5qO}O^c%kKVb}j8dh>q_MD0Pw%^9?R$sXps! zD7-g|l>0j_1d;61GFsqf{L*8HOv#CKtd3~9{;rrZ4f7jZ*`n1zdv#FguZOb~8d<|~}J!W!>q$in$`2XH)dBR&8*|B;>+w%6-MQiXFwkA|Ak973(;sI)Uh`O~QTwKlc z@{UO9(ykRT)KWZo9qDK&FR`8~pWhW(!jFJEqBeF!EOrTf=dT9e`EzjF7WFzp%_~-P z^pJ-fwAno!9hL$IwRt%`yd6)k?w5*3$6;l$BR-W)Om2|JA24)T$FklI%dUxqd6Tjo zN8aSgQwnmYT@2qp{_ZrUrms?Ey zZ??)^=z6Qq z2NJJ=$NjTQ^QKr&{AW*CwrtsI{1&t??_Py#Z*K>FSK!Tvj-H;5_6fa_w#BDRScJDE z+S_{8%*Y2b(zm>0#z`H^J9@enBiPonc*%?v9m^wKeTdhcJ>ew$Z^s8YJ0}!oPpB)% zp3u3x8+srenb5WrFIeD{oGRJ<4bPQbk+zdoFPlg`2!GbIl}N3i;j^0)n|skZC$4N; zy0Qab{ao77*4sg%bmmXMs|$rW`4f7(`+634OziCLp0Ii#!oNQx)T3T`)g1i(cZP(hr)Yg{82Q4jvb%-N%m$ zt64;^uT7)>ap5dW=7+|GOD!257pSerAJ?S7Ya{frCIQvT1I`cLnGw=)#%WOvOlFiegBQo;n6sKxwB}; zm7Z;uXkG5=@DLhjSd5~CtkoZsa&J@eWbVGq%0KId6x4pgIqTL zYR`YVk3{znVh`F!;!V;hXBObMw88B-urD<$cE2f%c2|T=?j>7TkoI-^TVq_}!`}!x z&Y=uY%f+lQrl3I$Zo}Tx4J=D*Q(j}>=C9+(2CnYL*Ai}IB9djfN$!2FT#O7$A?G}_ zzA5f~u1ArF?LGM0kCr}a|5|QpzB8(t0)5BY%V&$D<)#(5 z`#ks?m5`fdrAzmgAXjo7HP%f#BN-e2?A`1g{UOEJ_@sB&)_cYf+-3ti{9l!aT06?< z-FWnQ76xuoylLm^>;r=dJ^qi8js!LH1~O{@3-{AkHTJ(_CB5}Nl5TV;4A=%A7)%j1 z@3K=81{808?KsIpWQ^MQ=fLi=(Oz;pnS;a1a$wh1u(v^fK&#nu{OBP3BC0m+U0uNG zOndE&qc&%aJ}?+X*?*z|ov5}qZ|7ztm$%oM*#6(zSz1Z?`M1-fHq~z?VIxw~WxmSA=rZ={~(_Z(qXx zgux4qxF%~AOlBD=cs zZQiwM=b#_|1i{_2Xzi&s=WZsuba|HsG}dKNn!I`KXs@n&be9-ys75m>Cr%?bmwK-w z8X3R2^muL2W}RP`6xHEu60`FJ&DtO<3xhUILpA!SD5fq6cQ|nm!H->?(SXSP+~T)H zbOV}cH&S*uN8a0)vOlQX8~fW!{&w2N4fn)d+c*}=<`4V#Qv_(=QZ_mO*@0VTc_Fro z`vsH$-p68p=IxBqUGjk_-6^m88O>Vh)}Q=elXrHU2iKpxrD=2!dC1)KVkGYYD&uL- z3@U$o;}gNnO{2Y!zvV%P5dc5kb{u6V*{*N>=oKFMhun{@D|yr2K|j6%x~;;B_G4R0 zTQ+`(TG6s;=emaL0ub4>v#)YXX+2e|`q8@H>@IBrovPG`X}kJ@`+MvHUa6+-iX6ZB zi7m5^N36eXDU~rJrs_m8kPC9(aUYSUXnZ2=+PYGq9VAnM#foexJ$`e^@%wMW^#-cK z`+sW3y+;p7QoWqD#jYfg3Z32EsP>3Tjp}qJ?Crb%z~HeC z0T~3~eHp>**r|5x-98$H=-^E1{$G0-1`!zsZJLkfaxiCS!r4jt!@6C-&xQZe&sM&n zb~-i1Z@wqp+JCtZ;W#;~pBLCGnC(4|KhY)0!oWAhVvJJfr_L8>Vnh{L}9X?}`;x3}xGj#k|JJbVcKsrUbTw?utjQt$H)XRYx!GClvb+oRq- z+!vh+OU=7K0NporQy7Ns)d<5X6T`obU{8zACW>9X#pmTO{a{Ly2*tk zFm6m4sXOQmSpNX8j_`odL=!*n*nwRJUN z+??dVY&`B#rVJ}EzoD`ztUOkzF&wT^rVcdMHa6GS*EKYS%am7Bs*4+&!VL{|4cGwD zZonf0-93x(po{WfW`2pZlj-TGq@#zOj+6%y_Ib|%Oz{M~_Puehw{vNCTf{bVK%wy* znyA)aU)d6_Zdyh zNtEd*EMLD2l#@S(QQXi_yr6li8qhBtngabYpedn0#%#n$?3aNUN#e1vaVYi)v|LGL zQ%y0-s4U#jT3c6ZS5+suupr-dn3J5BUjT=R&KiRrz2mgCd*XDmcbMFQhm7n(a7crS zzm62Aq?n|+PC1p(gGzQ8IFz)Ml%sydDFL;`_P;~An4~TDJIJ6G;|T?;DGWHl_?ewM zU1V{Yb5NsMa}$fLoH?kDj5(-e5mzlYvDnI$gQ~6fiD_q)C%p9rK4U5H` z{Ah^;#v2iQ3q@zOv9!3hw5}|+(F@tGBtj^$tP(=0WsVTaEF**vwpyYPW?L;#2<2AG z6GDYba+_DFlHG(kYM`4?rBd94YBk7Bs8K;Tp;m?5ggTY#Ce*7mH({jguSU8F1uEN3C{&}| zgh}d9H(|0m%uSf0M!N}9)!}Z!G&ROe$W=$U2@T<<=7w4|)=dqgGSr9FI5)Kf{Y)bo zTv#3HW;7L-sH5B@mK*OT)>PIuH>wG4Vt8&d<{B!;O|1^kZYpV@j;%>ebh8>N%PWMJ z>*i?_F)btoizB)RFQlN@rD1~Z9 z3}up<8AF+@j)|d6QL|zwQ&n*cWtu99p`hz4jV0x&vRG2S3cE@54VAS`jin9YaIKo{ zW`SB)U9J65?&j1NH)CR2;U-qrHijFTRHd6*fw`ZWU9>!#~Esp{NBs>7<@P1BL*x@oYd!A+@cuA#h_R)>olRHK_$Ro_}x zIj^!TteWB&HOOV|HGFS`tetR9&&8N$TWS(qwf?ENO~b8cUk0 zmc^2$spT=G{9M%?OUhF#VoCYx)L2r1>WL*4s$MrK+!8KrMw^Pb$ra)1de!Hq)r4!C z)k-(55iJtinX6)`O?CBZwVPI4UR+tL*0_nywPkhcG&c?As2|0U>gpG$wQgEHt@YID zZsKe#wA2}HS`B4yotrkVuDZE~I+*qS(RJfL)6GF8;h|$w9GxpqabqFgWIyfpxEe)S zj4|yeZhGT_#)j}*b)}n1ONMZ@`e_VR4;0(oL=3Oku(--ik_H%IXF;G2BAL8{I^-1XT1p`yuA4yWG^Kin`{; z;@YytsNKJGOO%C6D{E*E%g)!`ZhmQVLqoW>bU|}%Ws|z6e_msAiDuvHX2VVz*`XNo zmiyv(dMd!oU&S%)X>C~DAIFnajRlSnZ6X%~p@c(OOW6o`|FJ0J$rk9&RYbTtht>$EglCHmaxM$mQ6>qp8W$ah&2B zR7|QBYIhv3tfV^1ekP7R53@&%?A0ZhZao{vMP#SIuj2%G{qUPOx?XSmHjd0|qu<5R zi<{JQal~*-DNI+-$1$+4*@y-kRxk9&Y6v4c)#~^C@pxMKVt=gSvNH8je+;yRCM?IA z)XV*GW#0Kpe_U(2x+jiDb5C9qz8c44BVX&EjvCXjK)oKvEUBz52IGx5MqOzWUUb|W zN4L5O^=2HWBHU7JbN}GxR+lz4RI9gQh>aDMnC`zFLq+ed-ie`=H&?26-LwX+a$gLQ zRlXNPC6({T&`9M6gJ@S=wsC5(vxFz%-NfSNGR$7XEls#((hsM;Av_OnDfPoaRjXIt z{y6p6>QcV`IC_HQkKxpW%PKM2>Dk?Y7~cH(^Hm^*R#RMAtrB90sN1E@)q1>2jAhl; z)MH}Spps%3#igx{SWcBzsN{H#UMdcZr&9;3QsU{e>l)@4H` ze+b31O6uyWYKj}G8dYixvqTRHwde}<+%fH-Y)m=RW0+-?jZ`*`^DCQ>>A^AFs*dMQj!)nMu*gDyagD{b3W(+Glho+`gT!O#~Mvcm=L@WH;aN3af2wBI59{c%?|b2Q4;e~X>S;m zHOo|De&}2TyrE^??JBV#c?04FLVe5odhz$H5(|^BrJGJFnKUI%GOs34YW{P&*YrlZ z7N1gCrji?UVt&41nY`F|1)qsd)k1X(8Zq8gwdzq>?m6*VW{#T~uBmTYU~O2(u&V3k zTf6Wv3~J-eHP%ji3~zQbh9y&XUoo8dl?`&kErwN7++yE(vol!Vy{e<9x??5&l34O7 zCVfj>=b!J4tAT}C^a1QNeoh4>- z1o{V!3;qIiOw(rLMdpqkA|4qfmUr|<`g%G*4UX4T>!wp^s`0bKtr|1CvH`2ii~a|Y(=(4EoWp0*BZI75m$`Sssd|FR8MQjviereSv_ZmdM9iH zab`U{hNAbaVT!?&s_+8cr7BYkAc#)X;6M|`Wwada3s00(S&IQpnGyl_J#A~eQ7J28 zD~;_wCf8t*1SjhKD&^JbX;MjZQ&Sz;TC0pWGR*Nfi1RDLs6!@G&?<{tDjRK;eytM3 z5==EMq9MeJ;wFpc5t<`qGlqzCy+SGr&#NrOz4|hE+!sS_K$hl#?iYGVaTAIijx58< z07b-%(mG5Mv5Abub=2niSf0b8x&8BCSVJtwXXuj@cMI$$wSc+U*eVYh>rwr_;PdD(_23h_Uytni zy9X-tfDU+7GRcJ=G^t+=Hes|$4?PxKFvgDaxHHZZ94FM?)w^P8+Zq+xr3rx$#!7q< zBJ^ZZ2TdLHBSN94bYNh5I&_Af)`67t5fs?11B3KPm#0F{B);nq zlo@(1_!qI{1*avyXG_vgCgWdpTk(?9ikF>MyyCQCkK2k@*$Qn`z6!mjgXt=n3<RLtJ99p*^ZF@N>}J_i4-R}gfEix zz>Y6;F2{%PZJm=MOH}Af9nMvQ>1nhtAgLd78>x~h#n4yg29Sbx0cVE34R(&Tz3{y= z^#h!GqAnU`aPk?PykY3cP;!QqzQP)q{^nb#*USp_we3nSl@LEXH5oZBe0PjHHY42wav; zTA)I+m;`5%VWDEf900q9K7v4cXtohN`Y7AV3f5;?S;-+UyKjz>{sq=MfsD4*U2sqp zyCj(%RL!A*iMmUx;ZRDV?$c^HG)O;97^*Xpdr?b*iDSsI^@d(zrK(J_CN$SD>097K zXKT~u8Nt`Yv=*0X3tXlhYn!&HZ7J%~aW2!2cbRsA%d`_M)2vF^YT0I0!i5}!ab!=Z z%`huq&d|Rg5Dax1!Fl6tzb$bY*X1(qWZSqU)V-Zz+eVL8hL+m4=~~un+oqiuv20VB zlwhdOFzHj>LzBsQq0@}u%aZz9SL&y`Qa{5=oh$u1J9XVO*Sk_b)0O%LNu3f5Z8S{! zB=^u_6k2lV93wbvf}QtsU8!$zrG6gQ*?`KVh@q{9`L@=g^Kg+7q>os0pLK~#%cU+Y zm)Ra%su!N2%Z)5rR3}3#*>;6t9sxZ=N21!NhpsY$NjbLGYg}5db!olM*2?wydfPR+ zC~mM_ql@B3+cmmA-(

    +{X7`usDg&ty&L7Q;N9Ogl$s_zokuSxmdrW!haX(|+kH zw7YG~bfMj2Tc+*2*S1XCd7ovO%A^ECzcS2Bq&Jj4n~@xP#0WkwsXyjQeWxq+$EDCH zV(1COyo|J- zfsC%+#ceBS)s9JvU6{J~KC}x{7vD#AVd`r3u@ojH8`^J}eKkx8oIIt}Q+f&xNQ~sgR#T-b8KY0FPy6 zJKn*-_fSItkFE~EjP|mwUi6y@98RZEF_Cd58J)y9EAcr}n(WcTNp=S6TRVLQE;NuS zhpJ4nD3szc6JgNMBVp^=qHZjGMMDdcj zO}r1N+k_7VO^HnPnCDX>^WpbEXoe?v2;Q}3Pafk+WR{hP$|TWHvB&%y#S5XKWrpfJ z!HXr{TvxmX+c-U2ZsbrPL+|K@n%LH4Z7UW^&7P!3;ZIZ-d{q={lzAM+WSP)GyV&oG)YXRTV&L9^{Oo}n}~%{rOKzSBHIXbzZlGS8oWm#kPtwJtJu(%vx-#*x(sSgHzVx=xDLgGm1uTv_cxInR?teMMG#PxlJUWISoqQnRF=+3rcAQdfg%nV$xv8_N`x zNtGgWmB;)ZDf+y`u{LZ|=NPn)t@nv*aH|Q=IF{74;IX7?Y&Sc0Qx77+n=}WBt+yIm zOZ0mO)(wI9BrGAvuI>+NHH6J-3ut|=~{{67@txQq)q!! z<#H5N%Cw{j2&fQ!3KyRN1*J$+yrHs=2o^dj<(T9`NCZftOjo&DefOXwtrFzqC|Pf+ zr-X-`2y!q=uI*l4Z{1H|iHf9NNTf$4Dwku?y?ilks;5+?p93a(CcN3FQsySzf>2hd zc?CKa+=*yOegNU@Q0da{UIdTR!O@|)ROwPq)OL=gVuk}oaJ_A{?o9Z+0}<2br5hxN z(CrMLcPt1aecl4nxD(ZcvNKA*YUT4zC*sI#r6@Btv5tr&K=#|jb|TVU6|&nVuCXPr zC!+qb6n}9DC4D}~hf-EF4}?2_9rq`!qDon4QdSP5+gH5N-q_0bdTfD?p^qV^&r9W(?_nySZ>8u zMj?8Ck_gxmmRkC7u`(v59nkT;HkWSu*eQ2e1>M@!u8hfp=^Zy8Ojc@)&S6_GRZ0Gu zaoX-|y4m*!7&wZ6I)X&%`+ApzX-AKRLQj|@$gk#fNM%#|*HX@J8hd@7ku)^rk_Z7^ zM5Df?RJE{H*BC+dvUHy89Z8+Y@f3kl<}w{i$(LdJ(bK)ArVm{{ODA1_$a)f_Oe-xz zb+NH;Q6uh1b}X~<@~cB`vbBkYi&v~+u6H6^_@Y?20X}h9h&0>#R#?KNo{@CZ?n@G; zN~^|^VV(Gxv?cJMaY*XXU{YS$uVH#^kGcLUw7&{SfL<45YZhbK-o4n0f4`yqbsUM1 zm)HU8ALKxiB=LezpVIw@K(PSCeKK^;ca3qiR6 z=fpQ^@Xj|B8uUY-mN9%D-*Ye{_d5{CXqERUWXuFK5n?BJ67q>K354ui3|3qa6HCz6hf5HjgU%Z&5*%1P!15VW3xw_w79Xm}@p zT_Z(W{^lIen*$w+%xVHx%wBd$vD1Q>iJp z6MWk^oIK*WP)*enUJweu2H{pPZ^SumBq|7qGfBZd5cc4lu%a8y3Z2Kh?D_}5yBFtl z1&=I+?xT6X-}ux>qp{u-NiH}aiBktL8EndpXBAz%MlOB>MujT40|L}Ok97-}eaU_j zp}ZE|2N~*%w1Sneq+pU2>qdzcB(>&+UL9*lubPGbRih704l1>N{8&Q`Ny{ItiYgJ0 zIwR5q$EH#wPr?E0B1fy99?y(N4C79}QYE_1k)x^3J;oV-6U5hW=2Jx?Dc^c>*OP`X z?HK5P3KU)5`4n$2LdF%uf7VC{fH30}{CGh47Aj^E=a|)?9J2{OS|i2q-%l|vF?=1Q zalfr`7S*6{NhAHB3Mk_$BcYhmi3~vK1&X!BFmxId5jYCxOrn-h8uI~aC_ri50YIvwa^khJ@$?%fFj^?^kci-6661xi=)5n!0~qbvFE z4c~Yqn41FvSMupV)ODADY?Z|PX{%jr&mtxtBUE!6=IG^d|cs)zacm>opv=Hj@XA-C6 z9Z)VnXbaAwhY^ALdvb%1{+K!)MK^#-%|bheYqi&Rq4FO_^*oSyVZc9&&bS&LlhNqp z&dP4LVbFAG7SvBbI>z?25<9!y#uzKR#gvh9%E)KPo^h&?s55ad%>4zgJRH)V$dSvD5pUgWDqqwqunwn!HZgkb0$%>K~oSaz*$uI zZx}=qV#|tVLqGKL7NW9Sjx4p^(k!(=yX6CjsGVfRe9MXxK$(woCQ-E&TM#-MXOZ{c zu!83EmK7C-L1X!yh>8U&3Wv&pJM0R#6~BUrx`nKmV_9(*D7WF9NmOmcpAg!Mv*=~~ z#MLlW5jSqk!ygc!sUeq$@i`LbmNwbYqs46ejQ|pu%DteocxU%?FN>>dqYZ<~uO7)C zud}nc4B7b!!O_MMR1Goy@VGsOo2d`}IskFq4N^RF1?6$9;aiHRxhI37JJw?A2Fc6D zHsa?PzTC?Z(tV4njCLNhjNa)w*E;!wsj$RXXC8aea~CExA`N&FAz<4L2ql?6!gmlIBU2k($9Js?}Vsaj{~_G zXDtmIdqD92gM6{iR~bg;_Jg1^SNlm7zGj4w5hPRIPuvamjGStv&PC+2aLzasf%^b{ zNr52%m?0gGb0$U6 zHHqd-+S z{M)bV`X4lYr6;zZ!BgzN4VAY4el?c-_j4F^15Wne1MENAlQbUGi-tGBdl{$p-xr{p z=a7RQ_PtaA^AccGv?Wr=xR%(DB+NxR+JBh|*h9go{Z|Gsivr}o6#z?d&ZH>Xf7=i` zAE)-;%>Xx2fc*CuzymmoXkOO8{|=?p=|}r-r!P_o0}Bvl|78RHp#L0W+%0;DTQ5%g z)g0Stx9D})XRzdBob0q)9ZtJVKb?A5BDNcGYN!2}oK{a>x!o6lqTHW=5Oo@bj3var zBjGHtwbNP=`8b@~Xp8)Kq06EQ{1R0z~A0UnX zoko9>$DkkWw7Yyip92GTA<`|N%&?7SSs-2XZ?bJ8(u)&M@DX=6DCp+y* z?X(*1^na>5{gc65gj0Ks?sS=%r06Q&%qkc)4uq)JC`5gTGOkW|7;Npe8xi?hoZ4$I z0Q{B$e|I?4K&75|E71dikG+Z)Vgwcd&g>JtkWNLGL|FVMm@x?)7vGsEwZqWe5rd<=t3U7Y_(HO$rPi@~aR%HDJF{4v=HFrY6B(0<# zomvg-T%zqf4K7`Yvs&A>MB8~i!dK$dB~B4Bpdk4!UoN8NJ_W2xd>(a=zauvNXrC|h z<^B;^``g(Y>b+vj^eE>GAyA4Ft9isHORBXcuOr1*an>OJkv=%BS{w5zNT1*=SdBP$ zA>a2P7UdnQ-&rd6Qc!85N6jZsT7UnngFYT@=fBu6G*ABxG#6)@VYJXphK^Az zCD5W5Bhw)`8Rtym==tuk2({omcC(+WxV0(s7UG-qqkW7e_5EbYUqR4j>c#T_L{Sx# zhP`<1fu`l8pQw8Ad?iBLaO%bLetg1%ZwL$!xFy_Zl;k2r|zA zX~0;BW}%M=kPs$pX+}~K*uH5=#D>Ss6b@FVO$9&6QVl+7Oh%CSR!RfY5G)#sHxI_Z zU4yi4xG|V!m?>H<fSE zZ4-%PT2@&`4wdAsTn)>x?Xd{Mo!P`44W~lft3a*-l&eDqt0RU|wnq|BDtoX&VKQcv zPka7QqEPs-LPrjd8A`E7J4u*BIfEYb`D1d7V}{ypA-zRf(-A_3u~G6^A;U9AAOT8s zoDj7v6OW|v1b;L>R=HB+-QrZCW@TPhqE$_>%!8uJG*8B_N;0tg0ZnRyMVmOn$V+Q5 z?k`EA=q*VLeDie?=WgC$;JvauSd}+I<)uZrXcH2rIU^dQ05MR#^Rzz;&qZ`k=7l9N zeiAb%gOlABS8BDhGB0PFr}&)qA?8#NsGd19G0i2!8JnJDG-r_hqg}a%h9cW2^eR4N z!^-tcihz!&5G2g)D1$LR!1pfWa*3{iB3L>~-FeB@ZYy(IhY{K7aiwNE&C@$Dj_kqO ziX5~a&M(yzR#_?O=$c~t%qr(OR)V^HS(a5EiMy<**ub&h#thw7oHcV^DK^^3_ zU`1WvqR;@M>-ME3L#g!9s~hS(%!_Hy-lKA_q3h)u=Uqc=J}@-XLHoK`L11Bm(@>3c ziQq(5FbZq9hBB0H;S?=%wqi z8b<s#MxxoHZn!E)(=F`ZdHNp~aGI*; zP4ybUUZ&IKEu2=puoI-(W~(HH7vrS7&~-abLp9LlIt}aT!bvtzlB6C2bRjD#o~;+} zerZVC;_GmtMg{1)8RuZNqQ81Ute@kImW;dJ5br6Rq)L(@+dZ^pPRd~m2|dJ+F0?le zc@amEc}S8?%Daa6EaNa;>!jW5Dx4_qxwtH5NEh0wj@3z$bb3_YHN*1Jsc-= z(nmoH7}AAyn`3p7B%P#__$(8vleUxh&`n#(n&gr&oZ$(X><4? zoKW-xE-x{p3+)8Q+DVdhl1}2Yj6)|^1aPjxi6%goYc#CC8J8VQjg}D*_bK{r)Yqt@ zlq6m0k9HYqK3!<{kjQjR)*9y1Wgt!>(>2Uwmtq}AM4W7#$RAy3Z_-fnPQqm)Q|XeV zW6z5!nrADr+Y5(>LzXo(o&|UfYoJS_*3d{7(t_0Jas*T9lFwASu&s_h8vEGDu%(zx zBjt_`8-<61Hi2malA0b}>F;7%>5xWei-gq%Z3>eg{p$0(%MhLZL?$`V4r`tGiILqM zBdfy>S-sgzdQmo{vP4@k->8dvkRU=*Kr5YmJ2ZH*bO;6&RD&fF21b&Va{-w*U8rIW=qH7U5KDlNMh?ET6 zHme*A5~LkWJA4q?rWjcrcE~DQFU%m7zr^V%aivZNfwSpsT^lWGoEvR*Vpgw5tlla<41g7DH(R7)vVLe?adYl^*K%`{g zw)GXzMuN1FX@{*OppG7(5ZOy&WOdjft87`AK`Kjdy4*O>(nY?o<6&iKQ5|04+GwjI zaa$i@(mPMoGv$B1p;T&>Bbu@YMdKw zb>uo*A7Rq_zSbS%M%pu-f|J}xSK3*G0d%1+&-d4;X?v9Tx_EG1fD=*Za;%2+bm7=h zqlq&PKa>cZ_%SwnwK(l`+F^%doU-4?$m*~|R@r)C1tq-*r^|^GK;TS9?ZM2zqQ*JV zR!14M^${k$^kBIo0*#?h!Iaq{eC=gsGjsfO8Mdy*NL@X&*EMe2w!voYYs^ zhuv?^0&OIWBHTFRhv}~MoPnzaa_Cb%+&@E=V0ZWr5``8ECM>y$*Gu>jg4|<${&Ssp);ye*2 zJy2jDD}eiOZox?p6WE76n|=l~nj71PJ#+sDXfzME4||m`7Brgk+lRd(X#uU>L8sLZ zoj<}!>zX@p(wfFTX#1NQ$!gRwYH-www&Ao7YAn zIO&Ns`*K6+J}=*&!yQ1Es#l`*1xozv=5tpKWMb-w2y^Y1wM>( zCr(kNl#VovQC@+AofqZY8`6nLI0d8KXRcacCUy`#51*RODA?so;rELs>y{D zmf<1lRR#GIyOu9r+SlHpa&iPJy7j?P@#k%!e{nZnDDH{mETQ(>8^OC&7S@6kUJM?p z7KQmwf<(jm6{u)%Mc3*M{MlR)$IEc~V@**CUUs3^dR&A>-EBSXQOYuUjhjbXjo5hdtHHyws9>*(!mJE>z)cQj!ZRz5@dbh|aD89rZ{ zFTrp40xh^y`3!&1moU?3{MaA3^Wdzzz#0tM6klML&*#6CH9Y7`!)IU&f4wh(u4%r3 zI%xQk>DuWtiXmsN*x?(F^oF+hf@`3{Obrx4Tbj=>>tRefk;WUo1hZ+5Ws`q{rPst$ zLYC%XmgcGYdL|1XIt5`EUCbscoX(Lbk3{Eu`phFYAgQ!Y|KpTR!yob`&+r+68Gdur zHi-KCRcWxr+`bMN8bC74KdKgAz`TCl9PKKf`Hq4PvyCLueF2DMz=H$Rbp8hVPx1x* z28o(@UIq|4?|}HVQH_?*edb%F2*&t^n#V^VXAa8oh5TmH9G}nZ%ke)%sr${$2elG5 z?7XNN!~Baj>>@Gjb8Xn%e`(k_r(xTo8pW_rqlVSkhNb(>;bd4xi*48uPLF+ehQnju zX~Q;(VP_iTv66pj*i@%sXZB;*_ff+hU1wVcS0721%@fNeJ1zT*)3WnW5d!8HXV_)A zOb2pwf&ydpmJgQTiwv|+IY5qcNOZA)6$hLB^?YHRYsZyMjhJ)(bD^XpB zdA+vpk7D1g+P%@~C8Oai^Q9w{>^IjG`4XxC3{x%JB5kzTX8`Mcsao(tt$=!| zOoWG!{t~d#eZG1AYD;DYQ$GI^7H&_CVT+4CLlEDLEk{X`3XXybYDIU z8Bd7=I|&A*58OX;Q6`vPgcsU5yFSV8JO zV{=^2-ezui#Nqypx??e}gE6!tcj(>@K_B&UH^d}fg(S>3N!4{oaPcZ%HlkPgQqTkvFh0<*H4s%Sd!5gRDu)VU zCZfu?s>l^_D&gYyp%VT-;TfGRpZ~JBteDTEzS$Y@MYEc1csy9KM7l7cj| z-OKSRq!+8l=Aoy_?)^c?}~wQ>C25B^R?z6}a&P^h)y3%2yBGwZc^%Lb>vh=dPh z&?o1j$(G?2^=K&82hge4R#AzXzNL|_a{jUfQzP_wQqrxnRinQsz#M*NQAN5VZA<0p zM3U4CG##h7uf3}~*2pG2o>;kjMW4ePREiFV(c_M~JlLUSs2goPE~~8km+)5xqV|*S zFg}rh^(_J@QG(HRA&XQPHSb(TY}HS~@*@Y;?pJ z(%%#|l(9CD?Dd|56)rt=Xdj~hs#5}0DcG2?=@idN$HO%GScuWO`0WObH@S z$;D5n1d4Z4{yn>6NX1EGEj_e(c0Aj27U|h&mZk(f;lz|=s0cuXwz$B260-1X zE&N)ZG&jX-^WFk)f|J)2xfzX8d5|YB%fNdTiNuGtf%Ir|Ip4hK6i~bia{gqS;X(LLF#Oc=+9Dz)_0zu zi$(4lAl9cpeW2~z1sdynRpdSZVts!FVtwBTmmZ+EYzATr#sjhDN+7nh7Kk-Bid?J6 ztp_U7e!dWh^=%h)i=g`jJtgS(KzQ{WW%N1_TkxKs{eu1u#8zRW)=DD;gm<(NcL zXP{#=tx#z51a$(jH0L1Tc} zFXM$)DX1BUwHzn34ng$N7W?mFp>5 z&_{y45_H%YTT8B>8G?=#)G4S}(0V~z1^rymeS&rg`c%+2f&xd_77P}2sGy00ss$|& zv`WxMLE8jfCFoW`UkWnD+UceU8ZKz8ppyhe1Z@zsP0-bX9v1YhpjQRGC+Kg2jB&Ot zg9J4RY7^8g=yX9_1pP$N&jj5o=w(6Q2nt{}$8~6kpwWWz1u3A$R)4neOAdSB2Nf;{7GtAc{Y3z{ydLeP9c z?Sgs)trv8@pzVTg6?DI#rv<$t=p8|y3Hn}8GP)Elx8Z`u3YsjaOi+WMQw5zN=sZDJ z3c5wmQ-WR+^tPZ+1$`$dImfndsGuVRO%hZpXs)1ELCXaFNYJ^0E*Er@pt}V=`GVdS^r@il1tnqG!RZbabc7)MJ$sA0R?t;~ZWVODpr-}BEa)pi6Y_0+ z(*;!snkT4N&;~&l2)atpZGs*U^nsu+1bGVVbc2FM3K}nHx}XX{^8{TY=sH1n2)bL) z=j|yV&iS)~o)hjHLi?kj&jo!Y=o=u;#}G_~+4?DhjuW&@&`p9~ z6to|RZTVEtKZN@o5T}uNjGacNpbiO9`GTehcMcHSS0}XNg?6%_Zb9n>Z35yn zE&}2-E)(=q;oc~;TLj%D=w3mO00I}RCL1TnFQD_B%rUJ2+*+8Qd&G~DE zcDta5f!O93g!T#$r~3{Nr~AI3{lfi1X#WuO9T2CRgr(gmo$gE^rquv(YHdR61me_s zfjG5Qg4POmlh8H`IvAVKLs zoZ6v4oZ1|rEdb)wmI@}g?6c+D}gw*TYxyVJwTksP%L1XI~Is( zQw5a)acUKU<^pkyc|dH{VxgTXXr*x13GF69_W*Hfj{$KSy97NW+?NIYNx1I{`cSxk z6WZSeeJk7nVLOc^L5B(&BWNNJ=dBQk^EOLpwSxW+d2a$AMUnQ8ch8jx8PWj~3>Y9t zKmq~@hcE^-9N`XxJE#aK1l&cz9DuIKF$vm^c|S9h0HRMZ5JghK^c zT@VlOWQ+&uE{7udeZN)RH9bk#`#nDYeX#q=m7<7RM4*!^tgh42T00X14!oYK7~5~NXGHD!Zj%9gn~F# zA-Q+~$q;Q6u8V@Qly9!WU7?^+3YwyzYZbIgL3b;tT0u`Ms9r$_6!e~gPARDW7+dDy zfTT4|1SIpLNI^4{?|cOq(ecma0?V}vBFg<+#L${fWmE5xEh7qsc;`C+;N5TLsA)UK*@ZG!sRF& zKOK~GD-~{|!ab~T+Z3)w;kXyA49jhzWqSFImBgJ^xD;54#H9j~beAYxj>7RfD@n&4 zrX<}R3di@(61P*~>J_f9I4}pv$91kz(-!Gmb|V+-;9D1URalU&VJR^rZ0QOE>A~%` zZfr0Ch`B35!Ij^#&4U}mFh8D*!yLxbi8#zjJn@QgZU-5-j3&k>7f);AFkDT*B{DG@ z<`oyj#4ry4!{skA%x{4S#KrXjFkIRaqj?(`E?|jaxR!v+R$>@_gq-4aVwhuGq7tLw zDuQKkm=a+2$6;;-#vdooJ-~43NsP}XU`Q0hJWDx^?GwgfVvQm}p$6 z9ue0IFq7s=>SEELYNR~Y6GO$WUKUo^ncg<$;eZBNG^kj?=K~1b)8Q*Y?w4R+GDTM_ z49cnSTGkB1jV9z}(>&M=v!xlPz8U67Gt8&WFyA%9a1)RC*fW}8`ZUADzTdQEzPcF= z*MP)xUe^qBe;npfJoR0$@Y;$+SaVpi)Q0C@do8zyw|wxOpbgG1osTo;%k0ParzO|l zh_41EH=GHg$%2q|%PqIq*pgD7%rloYY_rW01y{(RE^9diE_iK#kuf`B7J$5{me+w}Av2dOw@LOi#0bcch`c@WC~ zjxo1*_K}c~X6`u8Mc|qp1tYL695W;E%}$jO*e0jg2weQ}Hv)wZd{LI<{_Xg9qdc&Iu08%p8=H3rznUfzQdgbRcj8;mPOB%z3RQ>TG4O zz78#8M*(?sXMcdGWoX9O19e`RTG2dbpTOzog!8qW8fU-2>F0#kfUX}q_>Sv+G*JuC zLJVOehpP?ld@W@}zg(`lie0Awj$tRjaS6Hs>|Mq#wwaf+BjC6M-9WrNc3hc&%g~6w zXT{5wQqT>GkC!d(y=?3qm!KOQA8#Xc_Z;X>TKuR=K{o_1kN?Ic=z{FO$F5X>{F>c) zLC^X9a&zJ|xEKVlkPdmvOQs`d#Ee-pr-eTCheu^)g{Nm_RMi-j1&}GcBrCJTOwH1d zo1?Nk4cU<`Js7HFgYk4~R>^_mp_lZM+E4ts`%6qu76N;MFBz5W;uue*X7!(;nQw$X z(#;d**F*IVH6`7(LnU5q<(hAG^Xm?~Yu`7_cg=%qk7-XfHkQ;j8v7g8*6QfSm#qC* z>seynn&mQ2<-TJcto^u4ZDSW8i?AElM|z1dYE+iX81-sRgDdy2xuaz5*ZRiLG2J|1 z6zr&px^rtO*fIUo;gYq-^o_ao=7E~1r$wx{CF~~&HBnzPkKFB{_jIGugO3E7rG1dT z(UJZteo0_F?a2!5^j~$&+&Md_KQbb}T$PK1IkJnLF6}8X>dK4L97d62Ai$ z+_-cFTzqzqUwk-If_(rMF6e_#danC^pKEcn--7w2HxKI%&+>{J7YSq zWu@2k!|nu2uD`ZltOmJG>&LGu%KG7JlI08gl`dSeaDLfB67cTd2Om)k?AyOj+0u&A z>lXGaS-P~($|15;ETLKBa_PS77SAu$+-29_vT!brUg(Yw=YaMkRNPp0{h}KeF37}& z2zd4i$CXgF7zYeyHuYSx^u|S!(C-y+4B<%-aC`{eubxHpu7F2SEm&G{Ee?H!R956t zxC%r*1k$;)IxL`cF0T}WGP&uQdntW;bjYBuU&h!xTK5d{(L8(F+zUGKgv!bDM%yRx zD2@aa6|;4QNI$>5aSD~CKk#!Hh8F~y-me3FQlthopFA$8UoR5iv>@LS9H*%F8+?-L zy~m$`O}qOC_^<{yM{fRKfp8W8ap?n%#9AQQg5^iRh$<>+FECt zcpe4NI#~)^f&=HSy&0d9=~)KF(v4DpS={&~MM&EtAf$yD7bm6x3z9Z^cYnJixBo&v zw?=Kc?{xfz)1JS&5i7P)i0#^HZ71uC!(jxM(8B(*ezk+E*fv<~Bb(^hl(&`KlsCz- z$8Nyh`nol%y5y#N%A#s>MvUY;qh-4BZC=yMAR6CI(7hNpw)dekN}?Cg9V^g9bVfma zpk6?CEN*PDMCWP?O;^~8HWkF;5-|cTYF;>G&i#hy^2>?@tpeM(`ZB8dz}WnJ%&gEZ zsz#lvU5cQJgb$24Mq)?k+|x<-XbA}js_BgOyubAEPzqZj8YFLMfX;f{UaeHi?Osig zvp?9CiO!ao55cFc$Nt@`2|kA#gmmg-J_Pq#j{~|_6MPxBu1%ryR?LUsG3#+)_iBRg z;|3v}uVOv~Pg#$Hx>plCgByf&IQ2*A;X{yT3G(sM?$rcS#N$nTB*>D7aCExj4j_Z? z(<`+5^ov2j2}9ma6}xyT=Yiz@@ave9?it#`8V_t&D%e< zp^vBv|H1uy99!G;(|tNO2C2kH|M-O1y~6*MH$6puN6wFkJ9>M&E5>`av+Th3i%MdyhpXKAr^F%l@EWR}EjnGN{uf4tdc$2F6o955-CiNqf=<`>^ z2$S%Mc3Pgdb>F_;q>#5Yy@xgP?cLYgaj3U9WGIJ!zb5{(y#I=SF{3{(gEXWAo{7GD ztVr?ccuRVDUFt<&?```O^jU}x*4w!P$nwAU(@s`;_O%2igU{uv`1#@O{ETtEXLxdI z$U8DQ1N;B9N>0UReJS`7F@TR5{li~M_6$#&&>Tr_EU)ZZCu#5Dmxk=qKEZFQ!0|gV ziOUAW?st;bM?qIA=o$qr0whB$0n}E6SgCwD%PYC8RlavB+}#TLF9rQnL6np|fF#kq zka7G7&l2KnC~x`3MdDhX^|uQIh^^~y&H6jXku0}vo%)ZzoMT9c44Qavn)SO$lXIkS)AG03WF1qzh{8IY(>ly3O z57({tjQ6yj>MR!%?x5jFvAF^cS~PObn6}aUddEW1Cf(xXqeDfj9qW_KgkXMnVJSTJm4FT6* zn-AI1MTFCi5Ym zLw|iiH_75hix+hN!h8tNsBvB`&4I;cF9r{=gHR|TBf0C-h z$pgpNek8c>LTsVavFJGSa^k>oOig^Gmv;))>TB8mY7Fi*s;6q!DdD&{GGv{J-~Ze56DZOD{QSh1B89Nt|8LAs4Cv4KiJsUa z2}$}#<|hX9*F5jV%};=psGjvcYJP&s(jWK<3`5RO^bzwDVj=-P*8D`DUL?T$gjdW@ z^bzwDQ{X=VHzz4_#3aQXc)At0pYNenE2#H35}yIW2l+pTui%};&)Xjb=08~{a9&~~ z5Mo{eLbg0F(cPYl=<)yaxd@>#`=9R^n&~B1*5`3T>a>C&z%t=rpc5oC4A1Ggp zBqm~PcVrN>c+tLcapORTd^jTnSVU)(0B22uGectOaBvCQ5;%(`md^JCIO}FOKaf~D zs{}Z+63*Qcdq13w0-X66oXrAM0}eOFrE!-V!xlFs%*V|EK3xjLAvax$!67$YM$REO zT}H_vH(kcbAvaw{${{!1-wSwfHC+i05z5_T;ps~FuMfqUxAsL@e}Vf^+~m36y5WfH z6Xf@Q>kwSj_=x21-cr{w1n+|(I7W<@ixIf)GrVmJIYhR`*QMByE7clai=k(3xwk!r z%GemTuebeBZ_-fg^VmlYzokFW|0DjfXt|LlM9D1{F_$<5it`!oZdL3}axZsEoa@tt zyy?DKV$y-b?Y14{RKr3}N$A*oE#2oX#kRT7Qj6YgueArNQZV9bdzWhNn==8X&ce!ZHb)@%Z*m>9o;j3opJ&}w{5X3aDC5O$0Oo&f zoNagH{>=jXwQ=^Mh2;xxTrLONe{0>rpg{wMG#zKZ2Gi*ZopJ2poG&6KA6dk4_Pi86 z$@#W_W!-^avWfd$)55xg4?s8&-IzmGysQz#_!O`9oEP7mq+4T28!zaZjI&3<^J?qe ze;i#4iOGOZ=LQvwscwj)HEZ#Sf2?-@h=<4)e8^<7#P~T?7AW z&^>0w%eobGBe?1y5H8P3$7nmF>SX!qHJ5AUx71-J0oQ<<1GA39(W+`HN~(^OUyBt6 znN>CAy>e^T+T4zab8D(z zEB~Dp;3@iV#n8C1VVhd#AeKc0gm6d7MroiJ^Q?QIO zI@c5kPkYQRQgGfeyGN}ls0J7DB**OA@aXe+J)E`nU{&3S$&)8)-qo#nthZ;>tjSYH zY2HYus~EM%Q?g{~{BkW}KW@^fg5q2p*%ePN z&;vDBOXwk*y9v5z_{a$bqp+}|MLgz$vjM zkI@LxsznckNKzUr(7BnNpc^r6dg1UQWKO}nQy)ZlRuLJf+qox_IiC5q2gxsDUlEGr@r#PHHO?9B5#N+j-zX7mpY-)y@G28rWi6 z{|@wUQd{bGpn)BZLB4HcbM#x$R}`reS=KCZ4s0xG@yOv;${bin!W>viBuy(GIowK> z11qHWDKW3t7onr?$b^Z*XHT9n-I=p87cBe$n1xjoMA|L%KwNRzVBvEI4H^`e4;CKi z+_;Re@s|#Y%LofS1Xo;6Sor?AIsA*u4a-aV^hb_}_b2GoVRfsf_e`FF8o=vjyW{W> z6MosoSzx^|bc}jf+DjKYR@8c)(Ytt1iSTTo0D%ChwbopSd*kx!OPAhw16HlgoL_qV zd@Rs{DdcxLk5~Q>Er9UJ7y|_6lM#Qk)>uW|GNa2cJdam?Zhws%cg|6qrji{|G67g7 zcirMrIUDL3IBV9lMkm=u`281d{Q({uY~0AT{CZ6~1G?_f zQm(Bi!ID0qw(UX@94_(_eWY#(l5*q16+-2&8swJ?zkaye2JpZ=9$SH?ovYmAT8_8O zJ%OY?fY4lJbo|6?shpv4cwnUn<;8+xWT+)?o-PssLMg8$Yo0BuAvgBc^Lk0)J;u`I z3rkm&Ue6U_d4m`ji_qHk00S!WS5htw@eA?%!?d=X0A{|w)Wok05^_FENhrhUIZS|_ z1E0UKkgSI`t{ob?`1NF7dli?D0NN|dTO8|-R?MSco|J@R>T&WpjtkepAh9RbnDLcS zE9ZhP7hZ%XskLbc%|p_MisSABUJ-F?UraX4(0Va9FA78Hi!-frkLnF17{F&5FjAyqKREB zkVQ5s0|1K!lr4VwV|UC5AI2@l!U)#Ky178dzIbAsN85=<%z%EI+?o!(aqDqwPyeaK zIjWBdc7ONOAdc|j-sTHSa1Irc2H1Hnm-C=4tfRdSTi2t=NK(h7Vjd>TcqB&(&hM#& z;o(T9@!oE5T*Y2AKOPs3uE5M1&n4hlGp*qId3wUtn0j=t$lQkvFvz{QrqEemmjzVO^xAbrukpw?Pu% zo>jPA3iqahjw*-?-7@i%D%SSNu$_UEP_}|l>4}w}a%WalkBFlIzZc+6(r$&f48ap0 zCG;~8NxGNeusOgEt_pesP@2Gfrf^>>=p-QgBaS50v=ZVNSVDygx?4fqA6NSBQV?b4 zbb_3@l)eY?EFrEAx={GCPLQ~H3b#PvT3$7zN-F5&#a!T}L!amSR(L)9H`+9CrJ>Me zXG3&2v|j>Z-6S#2xg%r-=I>Zr#ZS)sb910jQw!JcES!))=Zq0&iQ=yptVi@~ArEJZ znqT`Y6!QQy%?W_{lZB=3-FhZ|Wz7sgT_0HxrIj?wO96kjAUOxh*`XFhvQV_m^UZ;B zOvsDcb?Y_wr556^bO&oGZLk@JBUO395(E%iA4be=@c%bYW&WMtUpo6s;(IG+hfg5T zHlVY{{+#3S-!1KVCSK>xz5a$}bLXDFw`>uNX}N>UUa%0_+1nL}xc)o)jn`kd)Sle^ zn_rdn$5&-?85LJi$?3_qGq7}5Qof8hU$o zn?kyRu7z3PZ4he1bV&noAs^yxG7G#FrQT}{bBa3smeQkeE?B?U4swPsTb1JytO-==iuq32kZ2Gv|y$ch>I|JqkObwT8Ai>2X z$gpQ#E2j3NmO$afzg8tO$g5VZmCbipQ%O%RLBDuy!XS7SrJ3;cpNv;(VIaRxj$_~IVOdIJl zG%VKWx#iO(SkE>vEVSDJ0*I$xq0=6t@_T3~L#Goe7Mh>be&Q;hZk}%F70d6+-4&^8 zR_a}h@qQ#cpPZ7mbbN#7-o9%y(*TLD>u^g)gdppTQIq_#FrmeER<+shFwbZeGh zH`dP>Wavp~sjHf~13e~xy&%ql07d3~Ovm(Tv-F2q{CSR~zfO(*?2v zVb&iLAoOpn{{g(gIrJ@z=`}+|0#jNu7NBH9Rn2oW31jRIgbba5 zJR=Y^6!n-s$YTbwqF2Vq!QVk|$=}u?zp)$Qo0HB)yE72$E4-Z3H5tW783i)_U1%Z{ zb(Js<7vng27UWMsvpk8$LC+{a{{-l%A{WSMT8N~?oOCYwB7<$|VTEg>;)&+aU~PU5 z{MZ;?=F=b-vq$8~T=>~}aycUGLrG+|n6-$pHrlFW?QVQGjr5td_@KGb&F8m-B!ei4 zNU!8u1=U-82RrzFgnU0QUnHyef?XDKZ~*PbglVr^iH5kHVl2&xSdNfBXb%f zlXdgztiaG0jrApn$E?jg!ls$p2_1W9&6ygrmc0_qxNk@3SQn6{m{?049F-L?*1ZBf z7*CDSX;?LD&a5%2eoPaEf9U8HtX#l2GUr_FF(07R#CrJnX=jz7GM<|3GWUkwuUYdg z!mR=Z##wvRmslT}>=s3x@k9#0gA*_+DI0>gV?lV15$I{sqWptBghR2bDrB4py5t+FFj;~9p5`d*K|F_P zS1x1yETo!t@4 zupNrtbp|4!KQk&ztXmj*)Tk^%ZkV;mIc5`cW-G!&c?Pvjoki!eVi9s%Rb~&68Bfo3 zMfX{Pgk^b;03V9#cc4J&EKt8-Y_v!7_<`d_<>l~>1jeAL?P`^mHQ$`8XoW@;t$bI8 zt#JkGjmq|9|5VDFZyGD!5iRV;vL!_k*P_2YjrtO8ZKF|jBfzbqc}1&fx}x{vS;{F? ziz0g#A?zZHnoFp*=8j2mHJ1hR~*wT}PpeZ#W(LM>F?BkSYCB^*kO6`cF{$e-|8N{8A4h znqQqlVr8vUvcY`Ye6_O1FwX)ReUNI9K8zlMHbzHMD5mX?uoc6ZH}EJ1dhU_X zv7;<;_w7KmDbWUyiN-1qp>2W_4ubJa)RL?K+F)sfuR_T1t+1H4qdP4S{;3VefJ`-C zjy@rgsSMPx&yvq_HiSO)AZb{x(OB*`tuUwsKg>jd90+zpkdN36!gKr& ze?|{<7eX189bq%@&VLbgrWX9x82PO^RQBb~m)Lt=41XFpy{Q$Z9xLYw$)knTUbr*XVIzTf&%;^12+80Vpy`_Iq|#|Lg#)a;n6I)Ff7!L(_^#}rJ{CJvu8MjX_o4T1UBAb&D(p8(9~9Kbw3 zj&Kp~Ox!1cJA~VQ<}PL2Ew2W5K5jneqqaVd;zF2bn{CCt26qweOx!0xH)HzfK0~w_ z)A~puhYT4M?31gFn>M+R1;qt=`Kj37`y#OvN>@Jqu6E4U6d^<#!pKfzjG0%D)X+2Mc%bCPkmOBS72jmN_ z=NqhNpjx~>$2<+?$M65)ub1RZ+CRT2>Sd|~ms%9{IUXE~q6}!s{VfUpZTqZvJ&fbu zy)vpCf;L|nW$(7a-bdV0DW>cEpEvmuJS4zUgNtD537oPVJ$xe11Q77_sWS>tHpD(G z*DhVUMDuKOpC!FoVfB#xgc6TkTWah_lxTb;bpVfkxlTmnAHKNqJmKoR9C3L){3g4V zm^QWj{Q7eLAAn85&N_2TZYbCEm5D43TGE2Da*4QEAUp_u5_n5|{YrfoN@PO8q>+J3D#;xV8}io>uH3&dkU(^?DoaTxRG&_a@2IdNMXYEnzWH(xhk9h<(|Qe10l z>KyK5W_*TbEWGi$r3i;WHS+pV0hQ&n^Vk#d~ z{?@t=uS?MJ^iWC1Je0(3$u+hqoab4+vuTq_PMA|)qV|OIVHAfFY$--P>ur4{8O(i|DabHDC$9(TqwprMg= z;u@gkAnSY%DsK-=56}v11s#uT1^j}brs=cWM5LaBU%x(3>%zFmN6XlU@F7GY!Y-F# z@9~q)bx#0J07`+A0$o^gzJU-fjlV+9Wp3~9Y&q9J#@i_8JMfK@Gm|NN0kOJ-_Vm&2 z#N&3TA0h<5smZ8smb%{Ha}2k~mar_Ax{1Kk&^Z$ej-FVQ8^AJ~mZ zvKZp43m5cVdZ3-r^wYxTry}8EDX*bI^t3`QjahAaTD0N&97*-dayR0wIq9|2FRS*sLsB z7ks@yHv%QT2-V)O=(|b!q42yEH|et^{Zc$G#I1Fx$4>+3F9!cvdOG=QJu{IY;Isfb zl#F<;^wilqR%HE^xZ87W8<&1-`t^E8_9B)i zYuY^AT2GEl#sc_>#qdSR5Ub2I7w-16uxPhNPalpzJ@MQF_rx+W3LFA|ECYw|ycW0Clj9(2 z)KG1+sJuBF8oRtNFWfs9mN$?&#-yuPVO#DPF z&#BVWhZ!dqXPr76#m{4w=X~jTDLi@z&rI0N8O!r7>G?1`9>kqJ6BalgfrVCo>=GJ0 z0FPI3x2INr?8>B8zrypUxDgj;w8k=Lk?3Dbc7u?#ez>#G!I($b?6yjF*TQ2SZozJ= zWVaU2t8hcn96VkE;ChSY9?A08@ck7jdU9mRQh29Da99%5!1Dz`&~o8J{1zUk=!rfd8#}Lu=IQmYNsvqR9kt6+Z1iYVMtgMDBu7D; z0!saXBA9G1yOG_KK~`O1HW%XV4LjHLJvqcp#q&hmtQKUKbf4&1-45I;;#F7mWr05k z+-~CWIsYpHb0JnGrr|b9N|)ZiHhr#K+p6iWwxSU3dp^C*kb)?m{g%(>)jjt^S}tgM z7ee)5mH2TQ6EX%I3vg$=1%KA$tdsR2sKdqs!4Aq<1R&Cl-R$6cuI@HOuubt{gM9+?ovS0Ct=<@Yjg1x{s{a2!X?zapZe(R5kdRfa6l?&qF zfLni{4rS`X6<~NRQhz1x-23tHD1iI<@DLs@NX0r(-2EwherKRX=g*IjOtaSwvx6=M z;D303&}YMm#;k3H2fwx89y3lcvS(s`~GoV5|zqDvuz!*31z*e_jY`$^Vb z_r>tgI&;Q|-BH#_QX*QM*7v!Xp8Ml$kjN8Wh$|cC{;*m|37^hkrRf;vw){5dZ z;F2M>6W897#EH8g4u@WEIuNmdKy;=*z|INb8*sa?<}#P`a;J(n;EfX%AFjm zmpj{NYNiVwv^IJ!z)ZzbY};uu?AkQ7nIfKxoXNy`6-9;h*v*z*XIaGX8`qA@uDe?b zQHUOK`EtS2BTzYC?9>Ko{Un%MTOWnamY}Gg?6uxtEQ9rq<1KNQF!{Od?iqo&`!wBL zlpOmyB}B{R6bCb-eW9SZh2*)8y-WL35u8O=slJEI#zI06ZXY`y=1&7&GzNM!ms(oemRFJ}SLVW$lX*XhW3i|EJ{%(PSB+zV6Ac&aG4;Z%j>Oosy#U7NuUB4-={(g_H# zhz>U%$HpmiC<#(w`@D0Ix7I`x$RK$>+#RF)Qqs!yCsF#(v zxiJXcyKy5i9F$3JMdbFW#C{IvI|-7%)O}7hWnv`Gy+zT`;d&Uv&*4TQ0(5r>c$skb z0(NWnOc(74iDeMRktrmeLH?U1NQW8#qlu*DrRy9-azN_%uE3>JY^mg#k`AGCipas8 zgHpF5M6_Z>u#8^*+5wxo1!#y}=*vQ#z2W5Ic55p<)dYA0|16xt0-Tlzs|?@ zzzvdaaI$SYfxZ$y9!|Lcr_ou78$n&wYXNK(_*oyo`NYN(_(J0QV}Qa%PT>BZa2^rh zG&-Ac3od&BT!wK0NS48=kziYt<%@9x+aJzw0Zy3#=NgIqC7j1`3m(q{*ls@%*oWH( z3-xt#Rlf%KPtwy}O@Ko)crNyJb64A%6#C^y8GqwukH^l7Ie7SyQ0dHv;h_G4xHIXX z)`4KlS636bP2%bNR^o51Ch)Gr(|J$gS636b9F_+@bVlO_pIfU5Y?637ns=Am4um+0)m&0lrlPB4Lh2bZEXLuY@bDcLu*9xR6~eSj@$6gF-{o=**Vr z#dPQ42J_ph349MXb~UE69yf#1*azaKU@@znLB-vNn`oMKDsIBIT{EbyF5+#=CjM#A z(w@;M*=7y&VwyKC83Nb_O=??ZP!2Bs+P8$7VkKS7ph-n#T6mIcRJ^QOrqQ9jBdX~% z_*@t(VH$Z5H-w~9X`yN3Pf0YLw=6VGyba8jA?dcqjdai%X`yND69jr1oeB$0_ZESk zLg!Hn%`)&?fu2UEBQle`Sp@QMLn=C@7MdmCrxH!4QRdxr762Xy2x>aaN;084NuudY z!R^+{Jk)>^e-LRIR2kaR8_9nEy0Tx@>09 z9^0)=4{b%leY(G~e+u*zHmcJ8ifsEM1uc!HM7TBV zhNgsAY>Oh=HY3803TQDaAhwrCqSGFlnorcKB^aFM!DVSM!{QBattz9Kxn`BCV#-bl zNyFkn2?sofidI)CDp0i;smK@j=KBd-pRKx1mN4n$Cl`-CF7D zY67xdn@V;A1iPuu*w5E1bI^cC>^fiXu0L{7HqKM*3~t(Y(yQ%8riH$f>%4s@H$R+2 zda%VGH}#_^O==UCQnto44;BKNJz=`v;zmBvq1nR(*{s?No^nhHWoP zge{D%d4AR3{A!x=&#aWw-6xZ~fXP{AC5J8xGsIZXG&v`%q|vns#)7|=97;((wp7fS zWypn=`tmjn=AA*oJ`ySj8_9qVL8z9x?=}rxo`fjJ7*m)A)a9bT|R?Wb#s%DyZh;+}S!#YXGz)H^1!Df92{B3cv$^MF?+s>v##70YDjE*j} zt}TKuDH641+GX97v_oB+a3jIpxRXH8s?pssNqehnH4*=b8yQ1~4C4Ilv`a;>0dtHm z@<1&FVtQGZ#|dP>mlWp_h~E8i$3;g3!#M0j7oEI_XhGG8K^GmuIZct6QUS^_Vq$+$ zNa#!l-!vr4pmf;PjH8jXN8vn)WTVIk_YZ(kG0_pdpJsc)GC;iy;Gz4n3_!;UfMO)C zSlw_Gh+ZO4PBq;hi$Jq}3Wot%715QO^39?nc`dUzQFQw{3c$(hC!odvsVT27B$|%J zOUVTkt}HlCK0guxW>SvNBq+$l4_`@;i=%0cd7@sz1H9R%vCYHA=R;P?d=xx;T5<1(%QUhMvoEea%}3m%VZC5q#BH=>A`kl_ zk4%J5w`8*MYcNT+5jQ93IAO*~z9P(zamwv6+?;RYoSA){fIk;=oX?-MwYYcS<~*By zg%R$*Z?9f^eIts=-@PG+V_S`1>fBeO9e37f?G4=gEH_t%g}*g2Qn zb1dr6-$39sZJNK>>utx2;<<0ejvl}8w!^|m{R1%ii(u5oete$W=>{M`qPwDRAD_GR zIrsG@0U!lEJA9dpHSd8P1Qgv^-f3o*N$e2xn@!lXDSBbZc?})b@ux)U7QL4K_ z_YDQuPi)AXI@Eg+X^TblpuK3(X5^InTBg&T-PhYD)!PX{y}pNeq>|TL4o>cLf2MC8 zSXH{#dE2?qt{N}kz8k2?bE|Y;G5EXR(fxfPl!*6U%gx1h$>KyMhyst+zEp4GN^GYB z@&*3P75q8R#(C4- zt@`@gGVqtT=`dkib7?qdDqS#g=e&XQrjR5a50&O^<4)Goy%|2JQHC3*+ffelwaZg! zZ{t3qmB*w3v&)(6^kIl=E%05z+#yXH-|sEKpJ?YBKi=o=se>fdo3;S-Op4565vtgm zzS5gI9UeD$`@-XbVcx!F-a#ea)V?LqBxQX0wt7pd%k#XcdE{ZMxsCg``m?sk_gaxU zl?9H>jyBiFh%DjT_#TXL=~iz0KOvdCk~eIqFE2*WR>dL-(tZCW3^?7lMYw4`cdN}J zWof?Wy*Y?BV}Q3qo;PQRH)FWB>tIv{iv+q`vA65c7M{8xNLQSqsFVoPzD z=U@cQk0tz?2g#Dr?6K7Qyd#cb&Ei0QE!^BfkoK_I^jumEgi9~GX}xEd8pL$eeJy6 ze97Lf<<#wD#P=ZLb&qYL+kcpG$1A}O=eJQ7x~>7lkC~&B*t59Ri}Jg(R+6JP2O7k`?RzJ6Eyhbhj?Cw!gX; z;nTbw#)xV)1&M5pni+Kk&?Kxt`g*OSsym{lMgeuF;mKDe)ZBTuH)9r_9{1^+nLVd8 z)MyCS#>Xmb16a7DKuOu3KoRRGQa{W$^g$Z!&sT{I!l8bw1nv_#B-%E%Fh6%RYAe7p zWY^19i^fz#sm#ztI4ls&Ot!lXYJ(5Q*E8N)mmROAvs|IG%e)y^c)K#s7g6D{$^)wL zx$lKQsqS1H7ihJHiN24OnnbT)wl@Vw5ncwxOn_}k6+P}1&9~2eSuxa;xnUhTAm?0Y z#X9)huisii#i7@bac4_vV~*ShD~C4PpkWftF*ZX(0!~74P-$XcWZ#Ou>(JS7pFk1u zx`))GJ>Ko!>>a}P-~H{a^)h~U83GF21{hW^JY=|&!0Mrr;t30Jvz7d_%Re4HHGpk~ zdi@iS4D=f-@z@R)E_-mY3%3$SGq$=DI(ZIVs=m}s@&-{8ry#tqTC~4(YCg6AppYAVN2TAVnJ;-=6 z(VV-VfJ(5591e5zR-)N;zXD}INTlfI2gg$_i^j9|qK5i0ADqGF>imzdawR ztlwB2=R+dhDff8WKjKaOg1ObD9DNq|^{fpp=nJLl?lI03kYo^hPAGXdFoCmeUxeyB z6kVZfspKn>B2aYGU0zIqo+N>fy>dZ*q3f(avKDoGqA2{F~8 zxRJ^JnaLQi4kZ#7*NgB2i01m)@>`^!dla-u zL5~BHar{9+I~8;ZxWW#g-5doCRL~FwF(V~izJf+6Xsm)JDv0JQL(u3X#1}#mx>`Z= z6tqA=ixsp)LCX}xT$Nl_Dv0?jacdM*sh~R)beDoQDCj-~(IPA^DhF9?rJgq^h%;~! zw^2clD(FcCZBg6b8tUqQ4I$?vFwjw^_TRr;P*5U0H)&aa>p1*Iz}Q$alyl%t>_ z3d&c|SOxLR3K>VSg61g*Q%V|^1!BJVJ*Blz09`0>Z9R6_A7Oq<>XftdoIXs_o>dSx zTlpcQ~*D(_UdyA|{^1#MCg-=oP8 z&nnyt3VK;V2Nd)tKr+Oqfbfs{)QyJAO0R-i1Cn%{U6sCB3c6H5d>tiyixkAyQxeC; zDl(3n6s|%+RSGf{^ix1G-rp$P?-aCMLAw<6hJxNy5ND}nyr&fITLtNuE0(@^lV!!m z_2d#a8jzHJyn>39?;?f!zJhK7BxSBtxH}YdxANVjaKBK{ua)l$3deWnQi3`_QmP{g z_pXAzP|(*3`Ua4crFFpO(ndk;0ZD#bKrG|vtDwsjG(th+0Lc*Z6mEfnzNdWGDqNL< zI5#fC{#@aHsi4iu_eF){@>wYrSK-RA9nk}jxXudd21u6Lz6#f0L0q~kLyT9@H43^` zLCX|WuAnCX$#{1u+#UtJs(gwNF8>E9kI--c!&=3i=X| zl*)}}PPTN3a3rp~g2pOnfr3^6!avG6zkZV;eyDIiRk+6$?)M5;t8n`i?p+0;39xon zP5~r2$NDAdz;(qf&p?;H?1xF**tif9_khBkP;`G*I6rz6l8zgzOMWfyj%>d*K~U?e zuv}fs#NN6#Hr~Apk4JHn23-eSn{clIH982^yVA{o*vE;{Y$FC`E{1sx7!D#Nruh!a zTu9EoeC+z?c2JImw;|`AtU_jeF%lBAy_FlaAaq5b4erRwRK#C@u^ySnZao|0faaI2 zNi@2k;ZCg0FYaT)3ymviGVv>Q3qW0+EE?viTW3$S`PJLPq7nxUcVBHz#=WU|Av-{G zk${{2jIe0H05p8N-25uEXpm8$;f||}HU7HNqR}+lTE5>5b89oq-OVu7%`jV15;<5_*u*B2Wcmz86`|7Cr1V8$t-dAd))a#74w6tgta^>j#B!?gt@|H#qi@5Qx~e7}DRdrG`Mn zZN?#vl94Q$oE>;+X6B%r+|10({yF%`%+1NUbl^a^0|pNmC@`_zrCVWeRv?VM`R>vi zM&mm}6ySNAq`9pGoT(MfbJk!Cnu&Wes`!*=B^_&{e66Ua@3m!R0Am-zH@((q^P250 z%@OrJHW`i!{F?19{or+&$Qg%EjI4OSMfH`>U7oRJi}OlE)%PYVbH^pmoplhC|Ct{1?eE%sKnR_@Cf8S?j8JF?^*bbnL8ISYytq2U_17 zF07ACG!6y#mOg~%yiRPajLHR&Av_`7EPOINAz&763GT(FxKMU@fn_W^>M? z!NbP7)i9axoGs?;fC@yMN{=C4?Eu8gp_dM7Nc@LG;U5vg$H+yGYdBZ8=kY7F&;rkL}boR7jdKrbZP6V-Q|fCWI~GV zlgb@E9|v__Ysze_W9bwmsUV5oizjOzx^Tf(cfmHJaw1ToosCWcgxzw7abD*+kr%7> zH6(?v@-uz;5H6e)+*A5R_y?ZIz+mvJvJb=40%k@1$?bllDw{hxzNecr!0{7A9G|g!xA9Yo|_{UttqKC9t3Kc~ zwo!E-9`Y)V8tcLUxD%kZ26kreUzlN?U5TyI8N(vbgbR-9JF<5fl~L4E43L3H!Ug-e zWg>!!11TZcUD3-xZ0k`NGpx9ZNbC;jWgt$W=hj3P{+T-!Mi!k`M^wV!?i|%|VnST7 zNakBB>Z0(EX2p}?IrZi_vv6OS{SM76*kaDuY`)qs7Q2t;Rs6Bys=SIr6*H}LRutyV zIa)flS^Dg=IYs))dopdivUeDj)LblW`{XW+Ds3CXg*D-VEickm!w_V~=Gv&g{37h# z+6a}de+PkIz`f>0&Ky3|1)!~mIs3mhQlP5|8AfVN-AJ0BRyR^4Hr$D|e%065brhiz zzlLd;0%Z=2FrvtRkl37*ZnPWikGA4wmjzqGGj@ho)n^ae3<7=CR&#_u`ZczN4NriL zSF8?CNP)_#qVNnCK1uC84HFDc$bf-}Qir0mFE2x|H!6QGO6QY#q97aV?joruc-YgE zb&nJ?T2B0`nis%SGoC*jnUHYs3-e6qm>vntjtmvN4t^AEi@Y@pHivekigF5rtdGo2 z4UeN-Uxvq~M2aC=#m8Y$0?mSl!v&ko!bee_gN6Hybwc7f`|4PavrMyaou%!~*#hZh zg#lQJeg{)%RX~rT4nh!7br|b@!lgqt0A65xd$3UoqB=f*W47-@Gkg{=i>1 zhK+<~v>W4(_NE6#+-GJ)*epa-nXLu;B7x`ZS}TDxFp`1Knb%08_zMhBC_N>5Cv!QpJQEZ;u z$V!_vYr_#}$vhK1C1NFeOKeLEsD2AKN2f3Z>T$(nZ?r-fnJ~=^Atv+J7L&=h#T1oi zcn(-^LDtzyX+(m7!S3|b5ign0=fJk{;Et}M{6x1?byViVRyb@{`lsj)gtbawbfchn z7@VV8@mnANH`zB@?w$0upn$^%p2}Z$}=7H=lBN;g+ zCzQ0%Zr$u8h$eXIMx}Uq0=MZX%~e#153wF(y?7C}$&LOP5s6NKkz`dEwlfjC;-klK zljt$boHix&>8NlU_6lZ^)i924B3GW~Sq9v(<)oK`B9~FcPa`%7J1nR-3w8!~pg=Id z__JvBjmp-5&3c$EOYcy3#p3YP(Qa{PSt4q_ z0ue*IAQ!Y zjW2-EL>>zd;)|m2jQXmR6`eORWSy6oVqA4zdtm<%GZRNP%&5QJ%aD;(`>^w{JX2b< zCip2l4lanqNUb&6d1(%IQbfIpu=4om+>?JzF2+c?gvo#*OvWszht-7kpz@8rgHk2? zo4GZ&3-RJq1pS5HJ7>=FC@m*&H-Gmq8p(=@B01qf)JG&$7|6k+RlAI;OypqVF6$KP z{Z@bWO21hgFh}~$X#tgxC5XPEO4h&IYd`T1Lm7whtwDI>`LE3Fkx2IpWvrU+%0p>`eVkFwKc zx8t+Y%^5YpQ%2=QG<{Lk!wSv9db4m_aF4O>Dp7!Hq}8$ZT*ubSqC*8&AKH$3cw2aK zMo>1HXnrAKct#D2%AV4;dAFn(m0z%|m7)SB+b}qz$q14W`stI>!?RK_qG(P09vJw{ z6tfh#RMrZqAj(T)88FuQ0h=>Z;Tio7RjkmT=)-Rder;5GWYHC|8teFpCHTd}p2kX9 ziam{DqfAG}j}2!0km@lixmN+`VJg7`ka;#_9t4KwO;YBaVN?N-xiz`W*k;a54^N}a ztsDYR69PA&0=5Ny7qBJp9|2O}@Cbh%Rsti+&@m(@%00#fUS_dbheo?R`#{v(^9-Bp z>;nfsZs>^eXMUqM)_&3@wA~X9+|O)ifU%gbglBqCnFP02yc-_v4+}lP&ZTu!(4A9n zr0xjrH`YMn?Hl%y-z)=0FP~nLAL}8?M}tSFz8inhVOj ziv32_OaNluS)2xPU`$M8(6BVi5DzM;Tt(?fArx7f-=J@Fo$f#eF1^QRBQX`W^M&px3jGtge z<{Odmso|+WqCYq@B{B(yq56X`K@@|+oft-fF|4Q#4uKkG;-z33o|OSZ1Rtx10rH`i zQT_*_fIXuu$-)?V66P0up0>ZG2icTtcvkcews+vVfHRATnvfE`8N7qv80*G?S@27vG7oOFKYm2Hmm>9HL_#E0 zi;kBWBWomo@aB~A4ycWIe3M3E*(ooqk3I?;g2o#@v}FDs&NYaaxw4yJWmRteAo|2M zt6?NotlA(wk`=3NV_g^c1}k==d&RR7bo^|91zV|?b$PTOO*kI8Gx`c;Ds@p3h{ox1k391@WtDa$hrNrAAvZoXnQnPXZL#k|%AlyewRS zW(8d{W8L@Q8N4Q?yaFhMoS7Oe2FA)p?iN&K;$dy$pCOKM z`+fKgHMTNtZy>EG-Or%dX)jVm=Kh1nA4N_4DgAgnwuXtB;5j2S8YEy_wTnH~K};AE z!;gKf8M(4+d53I^Hp>>&HbT|Pm8>+OhrOY?GGK*_1Z{==yZlh`oqio z?E3UWrpUsB-cy<1ye5EtDN~8oc(>ae>j_Ov@#vu%f3&-$jtz2-CRCS%2zYMKW^{If ztLlw)2if4GovWzd!~u)>RV0v;{Y~f_!&uLkVQ5S;hJ;>qn`tzJ&?^`d3bHbf*~VPy zVH~yOV7E_bmIJgybC+n*a{ys#&DO3+Ec(0ojiFCdaE6F+`!@)@i6c_|#6xs~UiN0o zybsY4W7KCjhlm~pw4WAzh$AIr?}qR=ak|kD5mh)hJlhlTbVjcz8Xg{a6!Vq00sW|6 zehb=(;EB?*;Qq3u;ews|4s$j}!8CrWTTn~O-;SeS?n5yET?Yjal>>=F{vz zxD%)U&DoeOsTV+M z$x(Na$LwGp=Ft6HIcxAdv?m6|)}T<9&x7w(yuHe-hQihVY0~B2UxkPX zJd#eqfWAIFC4dfGWly%h!~N)=!IIbYgjJbE0ZgrfALe>*LdlSwzwk&5iFZcEqMKVK z$HR|HnMKG_Bd-{}v1M3YLHjLAWzl=Hv_Bt4q%*7Yk$D&kA42mpBE>9{I3%PzS$5iq zPX#`7&MzBs1-I0N^9mL4D*dKhysQfX?p`7$bgxC1ZGSv=#izaNZ+k6A1 zi0v1eEtp+ueYiCX8Z37_N^@AOV~GqEOwCo+JQGTSoQwI`JOh)idKFW9h$it>Q%sX_ z9JH$5T;Vrw3Ye4pod1?BV~t<7jM3krSIAmY4$eijCTc&?g@{#e4`o7=goDS~6rqziC1TYj1v|y`*TJLcA&7Yf zIU!|E67PXVvwN!5jb@)ftJ-c@}olX8B*~HLTwYkwvGI-OT7O5Z*j->QL7c#7hwcswht4&f=BKgs?k_$KV(pjmJ3Y4}jqPviN1=O`Ksdy;==5K|L8MJ*B-!r^$m z5qbnq;jws$Tpu1AKyj=rK+?iR{@|O&x<05Qp(1m9z?|Z*I$6FjT$B+O1Dwc}W6g@4 zc^+$!&+~8b0xiL9s*W$YI)7X6(0rQQ9@LCY}@hG;xhxOFS)md1leyB@+TNTAH^R-K=_ z`_!9V_s3L*`nqZcYLw^)9L;R$!7SZievNVzy$TitWgU!0(0-YxS(LxT(1AVHF=#Ee znI}T^IzV&a;I-#u8~L9w1kr$7JzS3{W(VJ|def+yh>=6$o6;Wf)*s z1fra=3QzM}J*dz#u$AcVgu$@iXU&@(vgXa66|-i0%mW9H%6YTxdQIHC*;*Q;J#Tgp z^JX*s)&O|MPTKQM;zk~-?Gq7Gq zW2LPTZ%L!?psq*rhZic_b5BN-p)Zm6gYTa@*wspDl+$47N@JXgo-=j$4SN?eJ?7BM zRmGGCor?NLb}hnbELjIXwuS&z=ZvbsRNgtOgK^lL<~OGV%<+En$^cmoV+BWziq{X( zt7);Q+9vz0cWVQfNWO#N z(V%DsUy9kqXzMLP+R!!I>oVthjCP|8kF=38pR8=%gE)dP#cyyB z2M|Um>q{7{fTJA1p-|tCWc+8uN++{QQ1XO<;&osG!S%vS%I08GwR03+HQ=f z?Kt_q!>HocY>7M8ZU>2G%IPKR<@YR1zT<^xDiavE-+uSG7Y7NlA@$skiclETGsG07 zMvBEG-f9TNe#JZHfykBCG~-v{DJhZJoMt>OdcnrJMCQYs`Z~1tsCV&>S-d+h%0OMC zDw^G-si?PSS-1)(Z!{_#o&d$#MpRC){%9qwfjtDHassEC(9&DaBDDN z^%7WcK}jJFl^V#>AUg{0f-|y|{kh+PFV=&vH5i4&c8Zdo35Rpm# zQ@c=ZTjki&`hKZcy zF~8zspli%m@LqQoRuG-7ZE%|vTd=MH+>P6XDpvS0A6|JHNr+^;odvwC2hfqIdId;1 zvmY=^vF2xsju$Vh>h(EW!xdY@|Bt#ifv>W-{{NpRxk+xwa&IK;VN;AmmgEAO;Kmvj zB_t#eT&f{JfP7^$3yUinP+~-}cF{^3muj(U#T~1ypjc6>;!d@#dnM9V)T*dd|L@Pt z^V}t%?f?J#z5c(~FL3TN=ggTiXU?2io|(CG%hkng$Ylnzlf`Z|Us1Mlbbu{V^8T{* zIK3R;Q_4$Yw3)@U>D+pB$LMc5A2AY7O8>OgL@)=YnVuVLU7gul9&DYR*|F-MIOuDw zA9rNZ%eGvw(+RD8SiMl^=C$rdI-6F0@)m9{p2y~FPUr(lcp+ACY^cw zfq+~hOh@@!b(yxe{H5tFcgk^(qj@k?;<%&z5mGnxQvb%)8!|`BXCI=d_^cF6SAwYT z?!@7&sXmtLCbWQc-^fmxKR0%2SM({-Zg7X}^gDH4EW0qelNmT#=e@| zk>9t@${Z$kOzYeiy^}7koX+%W-q@_J?WK3=+;plZp?}jr{R^zZK<#yFW+LbHjjdkq zwqq~4sZjp7^MW@YrfHZVh_=$2+oNL>e72tUsJr77(zv`06;q-;%SEbluV)EevO_#x z?{bEX;bpZVx8rt2FrKaK$tkn7FDj}$X!p#SxR3rabcwzoXh%dXNJivn@SB4hECRQl zxq~w}(KYuT5@6O9GR*?CE^gBX-fJSh8M@>XddAk3%(8Z}(POs%UT5YtJKTD%rI|iY zdud+tyJWi(%+4jg;{gS2ec`t2`m23Z`T+hL6|JANovcHXqsz87zk_UV##`pK?^${-p?yE0vx)C^(7u`9zQI$j zO>cE>P%HG-zjr|1kaxL%^y+?(>x9dFhMS?-imy=PpnvqYQvUuX|@xjmIAn7khFR=qn{hofH5aUujw5cfP)GFyCbwx5_4_8v5!_SPx?UJj%HFi#N{~<$L?^tZyGX) zz<-*?;yW4z9~Q4U$bnOK{6=$TD@{}Ec2M|@E=ZFyrlKz;5yja1dy@-YUDJXMHMux! z>+^Bv&&tCaYIu`jzwyi+-m7mKK}wM!EypS6lZ}ejF`CAC3&lh9&cQax0I#+$l;{p^ zx10R*b~FUhd#`N0FnZ2uN5{X^_nlxY5q&S}(Dt7)ds$s-XOr~t=Nk_YJGwgD)Khhq z+wm(AjELJn>2x$19d_Xn08a`|EIAg_)xq<*@3kDe_%GF$hZan|GJ{chb; zTh$|mN_X#l!W$Y5eRkrJW@TT}vOgHQ^a#3!hc(~hHE_c24X1p&j^D8V1O3B8+mKW6 zC&s>(zkzNTpV9Kx{+6%0{8r4N$()Mqn#qccwD{iUZ|gDuZMkPsd;LE;R!VTB~8>>LPl?GN3>NRpe*T6w>+KH zT77_3MwT?6G^?nZMuG08c(zn6M=R^y8}jE7JoRSbzd|S%dpYk-`eIMJlgw!U2iyR z|L2cmvS$(QKErbCHyEeosifAPtxsZ%j&Et0VvMba#x||ucCz;N_|Nsahf+4b`M+TY ztIY0T`RBAcPC!S$SRHz);=Lt`H>m(CoQJkhm8KnaJWaQ;@eu88Y+HX$(`hcKBY`bn zJsP@9S6sJcskvyzcPh^fr|gfqxqfV*ZNdS5-TrR}@HO++;LpHx{A4o+1ho#u=6lOb z@m{d=^T`2>T?n$FA;avcw){D;1T>(S|L+(s+7vvzRs>VpFtnvUPk2+d2U zb)SZu%}GsJxXmR`dCf1{enWl@d+m)yp00TO#@4S2K4G(TMY;PiM*-D0wLF(Z<+L^) zXdQQe8Ewmyfa~eqJiaw^(4G%prea?4jzQY4G1}IN7#0Rx0hufR?vS z!<+o2MviYncYV>?P0h~T$6LP!&ENi&3FEtN>-MI!mMjw^@o!PYw!WrEprg<@>=$F* zYLK>b4)7L&c{iN4-=7Dlci30Jz!gx#U=hKz4O$H=8Z!G-+MU`E4QU(ADztWv8uPcI zb$VOn+bnIAjoJ9b-|cMK-(^L_+Ph_2M$3~fBYx{+1%GgNYd@nZu;J8TYu-bnFWA~IBLO;XQ&e$+z>Kn6Z zs-^y8`&&sU61r67l^WVW$|M}1-s(wS)HJGoC?^@3l-}l z%LDFyP8DvL5^O#B0NbVi^ zS*K!w$Sh}cI-mQJKew>whNJDT?7ohQn7Ru##>O`!MLst}n-zG_QH`+t)1SX|lCLq& zwC`@(@8e)Slc)dO0hQhN9UYMAdXPdPV&{_0*+^Vl69)ZauG29f)^^%vVa2ZOGSe3k zE_l`2j<@&gVob8vZacKw>RPZdzE|G%#<$-dqPk+5PVJ(JwXs&9+Vk zQ@*Fb$$)Rn;cW(&Jq4&mgTx%<7j2Z@f}y@GWDfyJk8H$7z4{>#z2ME-v0>8wwiO3j zKgB6q-aVk{ufD{L#}m!wzS|mM0n>1AqZRX_x}m8%Bm2(1`5RjvqrC+nwY;;x^;M4b zKV}W9<-~CZIKe`b+r=#Tt1c^FW`o}}xQcMgww^6}!>z7O3Kva|?ZDGxO>U;LqouIq zP`Wd&68!V>vdngl6NJ`1jk|WdDWAptHgX_B)}KZ4)_uR17tk!#4%IT(!)06MhUEu3 z&IRk_-}VraUE2SC|L%0YDeB*5KU@C&Uu-HLUp>|_H-;v*hb_Ag*&d4QdAc#oyLze1{L1e#I|^AV z@dU^EmH*S{zxaZoKa=q{dE@$&x)0toH_7m zefhAXnAMB_%gQ}c<)%R$;=JTg`=ZQ&$rqdEcuv_g+^HJO% z{u{Lo7Kb0g-V<&AjlJo?WkCNmh;A*kZnOwJF(1yWo-b3l`n}c*wwP0G>?T7Z`aZrO zuJc@W-ZFASwYRwwTKgpN90z?T&HbdItnIu2Q*if-(N8yx8~s(|i5x`QJIwQ5-lv~o zgka|Jc2aYid*+T7guAb^5#E(Fq{t*iP^*_;rZvCJerub)zTEu7wk+-ZwOz2Kt((eg zwt>oa6#SupZ~1LywX8w|V(Hc=Cu^13d2+J!cUsf5)3q|JEo?>tR&6H_U_sW~yJ(#} zsC9p9Oar}EYVWO2mfj~}kvAeQMn3meXS@yey;t}?wKuxI`XBtZ z&CG?{%vM*+J4uXzt+TdLFY8+Ig73+yBNwIq+deP;`(2&dPvSW9-wZO}H^L-NpKf6y zwDA!BH#GL9uNivG`*w!bZGd2{!NT?Fk7^ms^RE!+8$aKk)>Lh`6L&TYZ>!-n;OIXz z9mxt#uf6@f`T9Et_$J`ahVba!jhUnOH3hY^^;H_{rxyj+eaq&aJy@Dh%j#cRckaE* zAIst+qc!^9okuo>@v2kv1imj9T6YX}wfEBhwzj^vzl+wFnfLxTlivTnz8Z14ja7Of zjBu8(sSDq|)K@N(nlsMuI~3aMPMwZo(L~?GWRaqBzt*w7a(i(k^+3zx!GhgUX47vU zqW(vjSODQ|~MSMPAhLcR9g^$=|MfGPKUDcA9$`_VO;e z(-gogjCO>@WcyR-Z>huin?GByoqiQ-<-xXTgEFb7FfZ=8tedAknLL(>Ff010Pr7S{ z65Eh_p^-8F|i#>-x)EcJVs_Y8)-?gZsjpm7uvBqJ)0o(dG zX35oR1@)>I+c+t~R<#={i2VqYRJ8+p3AHc^tMNTxq?n5Nk5Y^tMh%Tv&faZt)kXa) z1HbBDaD+fcituBonJz)?pw z9yOr8aX|gj6}5}&=R5Q4WlM(3zemX+=F%k-@&xNNO8lSjc=*{odrKUjE>~+0m=G!U zZr2_#Y{`-(tN0u_f9bN7JR2M9_*~vlx1g?}p>F=L#-`eNXAhgZta<7D+J@C9jv%tB zd1>8=3+tBFHPp`ot>td16PMR5ZK`i3-Le707V>}o%G!nn!$u7lRz7mTumww(AqVcJ zVHB*kv3}`7Cv*7l!p4Sqg^f+~7uU}%)U{RK%~124!dZ=V4UL6ZVMSeGL*3#!?x7Ng zV8pNy!$*u7K4MtovgU?)b%hI-EgQC~UTSZtA>6 zwGB?P&bkB|>(8yLX>yW}?EVpGQXs{!B&9VjTGr4sATePeW%0753yqMJ55x3WS zsFoVgfwkb5d)GR8wxy}LY-bV^MMo?|j zvL*HNs3hq9H^LT}J$3r{^73g;>P1=N3(PLBoam%p(fe>A6D_u(ug=3H1p*5eFRN`L zE7e$FT19pFRCuq;k+z@{EWW8nZ;r~O1_tn%9hfz(eEQ^?ikX#8T5&Il2~r%swpciE3Z7QX8gFSsS|3ZPM=g>SvGFw)bi<0UT|gC zT>VUM)_5Fw-2C|sbzCzRT-7yeCX$`3af=r(n^)UZzig@Eo#1L45r~VZXjs-%H?PSF zp4&C+uh=7)Rav)?1XcL56FjeL_DCdUW>q!SHi4gSnZjAoWEWUUZr04z%VD_CqCK6o z?^HT?QP;G22u-W_K9+%JQLNN}7{h_|ZryJL%~?sd^C;r7hH-Qa^-{dKq0UL~p7sK& z6JJ?J`(9Bu-%0ObNJ-9Nf%LAq+eqAX{>t*YB~yvYH3iL`57FsXQ*~O^%+fMrR%cN9 zVTbAWEKP1s&is`XwF~QvCDMCm$U1?X#mmd;m)0+7UNUa^^2PPmxW3`j`(%DC6N;&J z)ps%F8Kz96kDJ$2zoIT$rn1_`vz_$5q46p+(bJok%&luEUl3(zbkh47HFBkzZwh1h z^!_HIr=&(JeR4zX(&ojr4fRc{o%8{QAurB`)9O~#Eq2lec9HQ0#6?urt*CFr2b}c7 zP2A!5Y@C(Sk4TY0ari`PSN#@wYCv%z^|6z6W&FC&m%F9|1C2g^!0a<6))h(a5tg*>)@3y2tPLCzE3+XGU?xvb0%}sTy95**L ztfrrmtO>Fyv;>V?EowEsJgvVNt;TH@ z$;_e&E~Ype()y1gGMu$sRZNywT85rkMoq`PDlNO2a^z9O+j#bpsEI&t4U?{u))Xu9 zHEBmEHm%7o@{cURSHH1t;S%K$c3(^jJ_={nT=i`3%V`;>V+W__{Sx_#ulv%vRp|3- zTAo;gS&cFZ9`{;W=5;6{n=evsOMJ2JU()&~P>k9Cnl?b``*@QpCNA`ae{|hrg2AKt zPAGnhw_|?CEe>X1hF~X4W;T=(O9^DnU!m!N5KGe-)y2Hh#nj*O4ZQ48Byd|}(YT_a$*oZAec$S~-ITirZt>bO&a*-v0P7AktF1j@_Q`Z%Z8Z0INZcz;!bv8#JZu%B*EPYwJX2EX2M zt=c7xPEU7MF!&9zelcfTjU0S$VO@>2=c$$!$XXcJ|GB4GYA|bwX()>rDipq63oVWy&>zcd-C)fm^_z9eT5?fW*RNBz6tidvM8E=I4;N>M<6SDqR z6e`VIzS^<`3X}S4mNZd3W^$)FlARTrd|__%GYzCz=5wOV($X>ysIG5lYOY;82^V%U z2K0|Z$3{jt+sS^jl4&4L*W4vtZ6)lYG{-ZBnbgsQ zW>j@DX7~vWK9<{6l~I2#F6@+}&30hbV#XCG^P=7+Fm@C-Rl;gi8iU%}g|2AmSOo>N>dF zQPMRDH~`V=dbHJbBt%^onEwp&4z`q3FoyDm0jokUt3m}yPB1F0;@ibGuU=MxxrqD$ zVDsu@^LiM9PFD{)n}lbQM0Ux>7P3dw7VExW5&VTYqVYsC$#1l6&CTtWq6Sk$YHa|! zn;s>D{4t<^OsIdaJT&IAx+TjRR!?HpKraivoUe0@oUs!f=K~|>Y`kW$>At?s9jfl@ z?|@zr2b*5(Kl^11dvmKuVjoh#ut)^$Y8l)-FD@KCk4aZb2We zGsgaB=lJ@(l6!1|KCk8;o1o8Yxy1?k?9LtK>vPn6<`{JU%Ne2H%yCu2bH+Q4?sa!J zl~B=x*DJF(b3%&RgQo8RL+ooXD}}z+QZK{)p1sn+;QIGyo&pFPG;d+NGB6F z1t?qzGMB(vK#^D?*Th8+ztKxhY(J8p+$Cj%NL!3Vef~|CxApo{p2jlkAj;=bM!5Ux=sI8IJP+@%I6R zX(0Mi_0vK=A;CKY-U6Kb4w9;KR_jVy0p*xQNY9^uDD%ni?7029q-S8h!gWL)AlX;I zh>MUTzT_BRMrumoJ&?Nxn2G^~H-QW#a5UgJBX?4`;Up;lIrb@#q~>Y)$3ak^Z!~D0 zCPw}Fl{v4bxv`ct8*l3Ja*nI+DU8|^;c_=!iDF04pE1MD$@6;MqMcMn0TaR3a=L0# zHHGXa8Wj%rTx4F2=2FZMp38CPjCGv5jE@ZMj($sLJB~<6=66KgT{$U*S3+tc{c@oA zI*`H0znJC{`5DL!P&WaQTS0aZ(EDBSeIQe$hS=^0*#q@Gpky1!BKga90$oyQH2?;c z;WNi6V|^OKKbMhij9v)GFu)jHv4I$mZ}h3ePX>(9YY3bP@HbjsG=MaPAnu(RUH*tPva<$#=L0NRILO z_8(1rF<|UpPM{3%oc;rn903w_`cEMo?DU?`n`Hs_$sD%_65cw|akP--nk2( z5h=+zH4oxb^h*06oek$gph(on*HG>Sy9Ovu!?5e2{)@syf*`vo-Yy{01Ee?CID~;n zK1eNrGlh%oUH%ROl0^6bd4j6ed$eNSv@76?40r?x$_W=HkIger+B+1dI z<~{B&Gt$d@c;@^Xwl4u=PH_YbpE0{{&TgdY3K(+^Ay6PO)|;o3gt>;}uFL51TZG2E zc`-4`&Q_TQZ{Dm7zVIQjJ?O>he1wvRw{9DUyGWf&zV z#mK%l`+SMs{4S}JoLy21Z*J^K)@pujWUF7dGT!_zc#@qxp5nFQk>a-ye=}edf0)2S zLZtW$1fB<+{EtbRptv!A;aIYB^yz!^a}ug9d@sp50Aqe}B**xC^QSP^NCu4g`w-{_ zc-~x0k_2y_0O4S7c20ORx7kj77k-R~;@UCJxOeH_TCQzTuGo;E_j<>@%Z~BO zPoQ^qC1yt-hV$iGO}ZCU2#B z+l>xl2*lWY9d0Dsc3+1F3EU4*;ODUPFpP7gTamQVIVp9zzf54}BFmX2vasN|x8%5* zWvn@#X&1@dO+V_(eBdqxZ^=1KPWKY>o(BrF;?j7ofQ+BRR(B zTYo+AmjcEEenDUp;Popfk)!}5I!c}lp|b}J-;huJnNsansea7}crT>iBIf}Kz7^zs z0`CH29)j`5HT+`Aq$#oL)ZEgq&P}#DHy+2}Mb_@7dHwzB+?11}>U4NxK7g!fb^gLu z=i$%?0H!*XKG_*8h1zpc`Xj?s=T6A3qtAru^a+X8`4MbMPK9Jpoj+qXZ>sZn@))gr z)Sv^DC)rsf9;$P_cvPLUh_3=nb)HS2UWlsmVgeTdPQFXhgRAo-sIH?=zdApYP_?D& zNp>Azs#6@vF+RUK^&58g0;W2jA@CI7Rp%sU%_L zAA2ler*I;l&%u2kPlpEOibpo>Z%H6;wr@+I{5`}gL>4eyZ?@v0-xQDU z>jlIe1sGo+L*PV!`LW(=_rn%`f?0lo8(nFrb%vq&;s;m zWSG6$_RC4lQ%nmzh74TihF*OB@DMFD*|gAiN&Es}TIgI}7pnEjpccBDzz(2D5=;v{ zt0&QbX`$B=_@NNB&?gBzE<`Q#V*(vQ)Ivv-_$Ucb3%#Gf?LyQ-HPh6L(zMX?LCytC z3%!QGRYKH4A183X5Vg>;_(u_7TIehQgv$Sh_yd5c{MLAu7Pj1YQK3 z{M$&HPyo}IsVHx%;GZPg**!~nrT}BQ2b|* z^+>yHFfng~+zquI7&W!pasG{luCrAdE(!JQ0Z-xikk<@wob!R>mVy+{tPg;46+u^Ig(>eJK5PX|4g`Cva>8j6;ei+4A@f z`7&|O0mdOym94;;G=Use!d?q9y?`tyLKsinNx-C;AXgAOjo68bodsb5F&f>*Jwc4N zLq`zf4J14QNsUzKv&4OZix@ftXZ$5lj0>Chzg`rc?Q%YuTj3_5tlN-cit=-0Uk{k> zO&rNFKEF5*5`RBnilb5S8GuX{z^-iVjD8g#^;$JS>5#;98Q@0H%V)lWci>i=0Q?YQR|JY64dQUXQZ~ zVbLCE4QV^iY$j`c`PW1oLlW64Hmmug$!fjSp?t?;TT{NhHp;28X3fl^Xm0rk$5uEYeeTb?p!;GIGXXYA29B21k3YYiu1?(XCSI;jdNVL2qY-?b=YIjMl@v( zyE=jVVHcFyG!r31OgH&WINPisApU${%8#YotelLkXg!sazsnkG%_gJcR^?>e2eC-= zByDG;+3k!wNOc2Hx)FLcMmhNfiO9|Asq$sgqkK+mfj!#OEvJvRK-!^R1(a?f&1J(S zuc6L6aML3vPYE*^2fh`{-~iq1FptG?`{x`X2}_8c1(a?iI#i{}LL=?=dFflskbUoC|02^^?ETSuYR1Q#38RZ=dIv6Mo zr#Q}vm>!bzCiIs8%0T3A6j^D7$^7H!C58b-bBHXM5Q}&Y;tqhQjf$FLGCQ3l!)QWX zfm6C>G2e%wU_wz;lQZ#&Gk}5#ktnSJd^uqLhHs;3oXA@&Yxc->`{eX3`~cEbFsuU# zUk7=OfV`_nEXV!}3cF&FWLm@5P(K64U5yAWoh_i=4)VF=F3uV!|M#%ySVvqmt61_$ zcbf7qor8I{k^bZzVD88q(-sB~{!V zLefcqQ>sf6ix?LRIQy+LToWwAN+QnyN>5G2(F=*kXG(MW%4h1Som$lpKI4&Y0{w+Z z_zWcZ%udk90HM}L9YW!--7qoF+C)w z0(2rkA&7iOk@6W*%4dE9{tKX}2xW}VcoBzF+TH+Ba}oPM^qg)o!i_}!T!}ChBw6oq&__kWpdRT1(6<4n zXtxwn^CCt?>`rGI25bbHLYJnc(8d69S*-`X5GdV`jDJXtQw_U1h*zMiUoPs2%z{%4 z{Uh>=AgT}`rbsa}qZvj?3M0u5)A36u)aaCRnvGXN()holL^nVFBx zhRSNM1TtLzj|6JCUP+Q>zzo;oNwz%xaD6p#R{>_Y{uO~+0B^X~=3aETt|x7DxLzq9 z?=5a45jeH6+1F$n8?x^(+3oYn*x{FPJ2^b6ELFzW2)rUhW&8($y#OykBuyxz+0lLr zDvK?ABGYlJbFxes)0i!!0A`}5SQcA+9>1IeiSG}XauyRf2GCz>Kn{@_&;d#20{(K} zs<2s_*EfJp=tW+ev`}Z?LRN*%T5c5r$^kp(eilyK4{vD@XPH)tvzg)fhvATh=L=wK z1PYdNQtFzpIYj&+_#;56mMa>0ttzOW&za{Rhr6ql{`*+EYoNfKcAZ~%M!bcrs)8s`_W1DT5z)CZV7i&*Dx3QSpcIo zwL3_W6z9IM>BBB1VvQn;1`}B@vAW7}e-}1q(jI`k1t_YpF(yLl?}hk*B9<$HE|LUN zH*_2)0ReT9ki*E>4MYZ zCXwAB|2&Dc0Kl2_9@v{`(@Th=J0PTtK{3E7*$?JqK>m`zSV%*G;=m~^p+F5&?U8hl zr=jiyBHci=r~Fs34FI_TwqHo@ks#~F(#rt65rSmesfsto|wDd0+Ig#`If-H0i|CJzDnuOCD3yM zt4l!1Wgypzx}HE8l&PZr2t+sMM1D-55z5&>>N`tiOzhDyU z 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%0A;2F*{`q8WO;8; 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

    Q>#`NjHX&%zMAz{{>E;Q>RXysycP* zRNcDW_r4+eCK7!M@L9{st4WLyjfF&fg$`6qCH@Y8O*_#chpjbxFE^;U1&Z==gP1Kr zthIt9o{)^I&mevtfXj_Dc)3BEFRQ`ALv%ptHy29oVyv7zV6gTkx~J3XxhDQ~lSv017jb4igZ z0#qLNl0s|KJ>kN}uJC&;FyPkmJ3z2MFp}<;@Y%l)rC)hOtXcS4A+c?B#2u1(0F+(@ ziPfqAk+M(SYg%2Njkpfb#=3fndkvDOuR-2pwkR$nx;i3O=0&dSH>z>7xW#68a zzD*`#-{Q*F?v<+t5zw6#b@99FNVB{9 z03uByc848lw}a99Vs=+ejY9f)Ho&tl{v1iR3ek)0VU-~70NM%Adw-}3Vw4Oo5W(-y;ZlQ<4YqZ6R|xasaqt8hfoPC*Ov&S|0)&d z5vew*O9ax+RNrnk*wHOgDYk2!8tF2$=w^WK7wNkI*v1p>0ieNWsRo~f7FI}u^El@3 zD3Z<1QY|8)E%nvI^Pt&Eoz^Xei+S5+TN|Bf_0AFT9jHa zbZNtgR>5ysT>zMXlgc{R0NZ0-1LW548h}d60b?4VINoNL`Z&}L(dpSE9cKT3CX9X& zpwZ1irI!L4()4)dpgzu+hUl!HIh3#PJ9Li$8r>*Vy0g}Ja@T(}en)+Knxe5(`a-S7 znjOEV#j@kC=Om%NSL>nE-S6iHe{R1|eGGz)K3Y0(Sk|WjZ1-gIY4(=t-jgNwI=@CX zA9jwtDNzrA+(9KVR`~fu*8&jJW)Ra?oh*n9nN`0j`?8@xj!?xPC?%%zdTsE_fwJZ|s>ca>AyV=?}&?>5( zo((2e1~6OtpjRMM7Zi;9I<6@)tFQx>@JuJ*iK9+qLfDIPWlK`K!!mcLK20FmkZ4(c|OO-su(^>pG0Isfx zegL3J7gv*DGdx#aYX7DCz-u>lVhsQ;Lv$?U>4~~N;sWrm5s`c%r_~WHVvB&o<@crJ zj}2u(ho4EzzCd}gBO-{6C-BORSoPO93>#*PfELmg;_b`>D8OFgU0vR>rQ)Z-{ucm# zLZqdz32|%Z`+oll@EFJ&IwHs#DcO^V&H_m2AaRlK^NF4TFmw<4jt6G zQ1X@uUJDw2Msx*0LI(+!_xPU<9iHOpRKpfD4XOH6#!siB3h*x!p4MdrB;`I-K&{q15+3@CUnCGxw-+! zusmHEOi9&aGxR~PK%H3O_C2#&_Z=&VY!%1yGEbuTBA*$S+p$!~#$IUq-8Q zMRXF;7=U;#iH(ZSN}pCF(Q^P1Apr}c7IUN|UZJ#u&pQ=-bLi^;G=+%$MGK3G=K^p6 zQ5;-qb*W}z0RUGW!oay0lgmYBDVbfW*${S<3W(p3Oh*9|Zvi|CnEXg&90k%me6V5s zW8-`fVEiOb1gJB_G?ILW4cblQm~f6N=l$d>Z$48UBy!Z@@p@{wmAZ%?I48+*b5zdo zD*F-|HX#p_mn9O!x@ID=*_2RjRH$`&Ru$3ZvA^~-24$L@CWS8&od=M~MS^AqU%L~< zXbGC4HJ6n(yqk0$dP3owdP`i$%ru*sn6RO?RV72fo3E4br#P) z04o5Pp8_ysZp)B_#cl$?rdxm>Risx!(SBs~k<3X%e3K|CFq~LW9pRR)&@zITnd0Y z5K#&IU%uXA)>P4hEh>NFdli5!C;lw}&P~J@cgZ~q5+5qQZU_P||E&ALCcyED9tGe9 z!FDx?T`G}KO@c2tMvgDK0Z^BPjMD%Z6{7h<77?*&=mHUc4Z?`5tM}e%Q7ZD3Fwxln z*?W;tO7e-=J+zbP9RT!AC4OJAiP%Z9bv4YP$+JK#mAqwwuV;o;NVEkY`)?A;NM_35 zLc&`#lPZ*mx%xyX(SI_hJT;|L{6YZQOtf0aJR;STe4<+wmq?A*(u=D}>{EPpP*s_) z>w!1mj}_5a+|Cg%0$>P;J{PvTox=hl;-w;zN5n=r%ZzA~4_nx56rD*Mhg$RpFJN3HH|_QRGUP<;s(MtBv$f;uDtOR84($NG(hki zw`@Ag(o7f~q89*+iv1+CGPM`Ls3@GS3GymtHjq(K^WH~VHDEFu&>DSrl`z#7;8nsj zE#y_A?E^Oc*v88N46VeK0JM?FF>O?6r8#a8kvt;yDutmHmjKbbeO-(0H{FD$e?ki9 z6YUgo5)lm$D?;iLPK4B@oCwL1e^N?_s3dlTbQ)6vyb!>)5Z?%Z%RUISPmv!3eGQ-l zaRQ6ffQn)cLzoUT*&zS(4plNy{ znn(0&#h!X6@I8vHTMg-{Y(0S`i9ZDBQwh@Smd`3JuO<8MjXC6yO$Sik8%cQJegMW&SuaLjk-hAKxmzhg{@9PgMx{IOyau>v^F43P5YD({7~qdG!NCC*ym(Klb~bFw@-=Ziwm2a7EP zaBk6$E&kqsFAFKS99aMHU5xxe1AmjkA8_OW_~Qfp z_Xzszw{|0mE$HFi9ABT;#e3c^FK_>yg`d02lSpBR*-P-|_|n?1j)w*KU@PK_g3SL z&_j{z+d2?IvPG{zWLzNm)IeltAjNkfUUrSwltY%ecA#xmAkv4QE%50}2lg$*E5w82 z@P2V$E4ogDnH;ees6odGhw}HqKj{!&zVrYmK)q2h##= z2L#&m40IZn6*z|Pbp|`)TZMOKXW_-r>4A>D&`e+RF?`GO7*x6(Z_@U);A_mO)@F6S zQnZZkfX>3}xVseNjoWxfdT}l7fnzR z5QdoR4p9Iv$4;^NTJ5Yr3g2jd!OfXjnRrY3eRuh zwtZwk~M{8*hwB_5#J<4rgD|v@}w8N$h4YbG(M1}>L`z|O}E=ixJTcUj)zf_$L z+II(%Z#<=cR#u}mcc2i-|U9d?~?BS~*7gQCIxRpXv8s_@uSHEe?o92KQR=N;KXQ4%9jjZbXa`?9Z4Z#aiY+&^qolw-8y0-c3{&!0juD2V z?O+)!PC{+_yLIU4+k5D#GCmAbTpm&oXAvG&yo^AUJt@#)ULfU6c&D#f8T|89H6!mq z_t~dfkq86OW(s3Fb9zCd9pZ)b@|r+c8Tx#L8B)1UMqia7!HRsDk{kd|$l<*I1Cc0WEj%=6bF6XlUf~NcTXK!5Ue2uA>?V1^N;^8-6Edo9iRiDp?;h&I+_VBaksHkj^c~P>COO(sb4qtgux-f=SOpzYhsliA1*_t1$CpDp`u#>)&Oj;{7 zX$3!vgptKh5o{f#Q4@j`#Pvkfhhz2xk)VzQ`M6mM*ui&!13?Z#oxV|9fWk*w-{Rs+t+4pFsW_yBuV8Y zS&8<+wH!Aw&$sRciRbp zlw9n0FF*(xK|B}prx~2p*SbumPZA~#9L@I4?}I7S?q=kq(7y4ePbR(Lu+yhc%;{5i zdZ>xDJj;m^`4g0>6in)aT0LH;yf8@|OMEYwa00umL}bJRqnUQ6kx;@@(})^VgD>&ZGmQpO zOR7xfR8?!LxKe{=lZ-+GW|R1}XC}$Ssym%HJpw^aC(g-)V3N#M8Z7A=e#D z^6o&3zN;`Fej9gTr7wD~Xa?hoh8GODzT}0hcRw2cvZk0j1qer9){K$M8dl(2d9$-9 zv>hgzd9CBw>9z{y-^@#pW?y;(iP}ij={UAiaeEGnwD7IGEGsKJkg^1QclJ@qN4Ssb z2t6?C&ulD)9&R7i0vp+(aduF@xCHS`Z|u#EF;+)q&u;dOdVGVn@4_z!ojY{%%Yo1$ z?hf1WT57Db7CR9|1{M*60egz%x>W9Qs zY2Yzgf$jqW#|#Q|&j}uc9I<5Kl2U8cf;naLCCx{SojG%Zgx@zyP0x8MH7#d%YD&(Y)TEqeQvJEj6PCqb^Y_VCmZMic@-4RBaKcS76pV!e z{q?~x4&?SiSM2gV5}vNxEK@h{b@J>!cG+;kEivjo9d+k9ZQp^@yxh1p>5=eEjPg0n z6Bfs4lIf3r!e;C?^+?zjqp-HcTLH`35w|}*5*|2A*;{bGdY(U?Eed>R`|B3g_39^S z$8Pgf-$gOX>haePB#&J-l5lej8;?D9Pl?x@>rW9w{u-SdsO_R30lF-F-G zXYBc?uNM{FI|(P&AcNLeLoGB^xuJfKvP$mHhWgr2En4W@kI<~%(3ftlL?t}p4_en5 z>RwRoh4-Z4y>6)eCKqGrltlv^3Y9q&r#eKTnYt9kI}C~n8!BQbexHF7&E+PXlKTj0 zN;J3HBD=d#g@&4EsJjgHq@nmr&+bwp0S#1CmZ7E_>PAD|VW|5I^_`(|lC_ra4V8}j z4oY)>bX{3(f}ys6QvG-g6rNLzemrTYzZvRfLwy2DmH2N^N^=UvO;LQ3hSI_Z#3+i7 z)KIy-4X>Y}_>c!BH_}i=hC16&Ge9XV3k`3np;nmOOAT+Gp{_8wHyGYchWdk{?lsgC zhT3JQJ)l(2_kvPwdEMl`WvDL<^^Kv@aJO2O?F34d?Q1ChKwsJ5G(+W@+&sf8FjR@5 z78vS6L-E1vN*^D=qiWk^c-I>0mnQdi!@JW^j~ME4Lp^V(y@q-TR2T7_*FdS--Z!}) z8R`c^9Wqo$-04zw;WJcJ*;5QP5|rx47(-1kxn~>RbVDsQ6rY!*%C0jMA7rI?SAkNs z-DG$-8|pTbd#~Z$Z>T+n;=|9BzBdi^j-e6}U{o$24yLGM40W8Lc$ZJ*o@A)g4K>Sp$^?O6zW2naswbM|04fS_Jy$VX%?>)n-G1RA^lt+AJ z|} zdra2Dto-427prb8)T>~lY55YjWg6ahMH-pQbVmY)J33FZR-uM%21n4 z?iRzl#ZY&c-1`jgK|?)ia(5fvbB21=P;VIOZBWX7`$4HzeQR=mFjNY@)ugPEW~erx zRM`oJng&W~S!Ag5L8-E<4Rxu>z0&YD8|qd=-C?MQ4E30yc7Rf~J#Tn>4fT@A{kP%0 zXQ+=%?g7L5-cW~3Zu54!^&vwYXQ(cQIv$j=MkXlLsw|V6ZK#QcDm2tGP^#=2P^#=E zL)~QLZZ_0yCijnq_g{wEWvJbTdf8B~8R|_?sNv6Do{%EWhVD>L)~Dgn+$aiC}o%Jpd7oH+*b_szM(!c z)MubniSG^XCqwy;(YdLhRGV8Fs*9nz8|q|3onojlh8l0ENuX4{(+qExq2`&~Qo~zm zsEa@;Tdgs2RVH_nq5cR;+2wH~_matd)lmO3xiyCOiJ`tUxj!17jkhu=YqT^}8$)$7 zR8K<1C+AMR#2)1 z&zjul4fUeQeckZhGSqt}_jAMh+E9KRktho#8LGXZG7QzrP??5036yG8w&CR(YP88M zFuYsE^!>| zzGNtb9P0$hMFA&wso|9w-d4kV!0JAqyd8#j(D44- z@CGJmeS<+MeM=3m%<#4v-UEjBvElI;S(W9F%vAe&fl|Caa~CY+cbNJ2(;*zP+B}Lk zUo=%2_*~&owiUMUrHYt;{CYDF%tb~dD)Gr9aF=r}IBb#2;WvVLRPA!^0*439F6SX| zczo<~o(AU@46n=C$5J?Ybvf@*2G{&9hhxPfS(oz@IJ{nUInB|7FpNVE8j3%@0tK61 ze6N>3EZ`qUntzJZr>x|BdJF%U;j{V8XH@L@>m%>~RSas4Wy3zRmM_;uSWiruQdg1G zZufvBju~tHo$9m@MuVOw;NX9CIIiF*hr?Oov+q)!b+d&kbY$>#X~@hPSSwqSGaMPV z!e@u^Sy$B(M+S$Vkogdwb^k7QWSSw%XFo1uP+O|fk-kuu<#Onmvu2f+tkgMpU9u); zmd;!}uVlGSMyD1oSX`oWmY0=UePo~`7hZUw=FTmhxd^w_c;5`~JnLtu{)QT0sDXx( zH-G6u@}e}Ikhk;cgnId?DdoP4R0QNbwkp%S(pHz0m)K2b)EF^y;p`O)XO@+)iJ8`P zyh#c7@+6p8)1%+n`=2)(8|Z!Cv$WXzo?sLA`t@1THyjT4JNe{612P9?4jB>-pOo1T zoc@{k2=~j(JbB>2aCmUP%z*>Q2+wFX&ZZyXXKaIP>qMdawl^w}wc}Lv%Z0tiDJL2R zUf9Z;;f)MZG{#4^mAS(k9b$+GYYpW*5rWM5sP1+A*d?p8s<#+C=*#X~Yc5Yb7Pkve z!|(YbO78DK*;d-{zWq)X-TGrPro#18bxL888;}{rJaID~fIlsYrSuK#7sU)C)%G*| zdgWwQFVri!lcMY8?cS3i=lzp<2SwNW8kV>xK1WQ%Sn!XZA~(3dr1i&o5WnoGWHe9Y zh78b2!HoQ!GHT1gei(nR;1)D|0OVRZ_2L2;^=1w)ESfy2;^VZcsgX$4MQK&bGpfe6 zukux{jwDrG6sek&UUhaR5-IBrgx0=@B9$*}yyVcvWvLayMWPfYm(6$~GyX=Y`c4%A5i5tco`cI@kwWF#;+c&Mioq04c z$^IOlDfX8YpV^^`F<@3aop$!L>E}GP@d57Ltj%oqV@~^Tb8wZyHA|^vV5FuP*dt#v z*x{!ED|@EEp5dwyX|$o3v@$p1uWDU2!m(!(?a5`Pjy)Y)4vZX%Yz#vnwC#k79SP`9 z=%HTc&8?jO)5ddQ%2wco9!j4yw=(aijfG$=vV?P_BCwRJXx)KJa_TB$12}-FPia>S zmFfY0&AF~Q=5D4JY%Dm*QpOfD_eFli(ilsw~*>@odJUo*_jaPqakl)+yXN2(^LRb7%%HLd-+Pd1+Et1N)i1Vf`= zsG6K!wK#Lle^7&;>>0@vC3?*zwt#zj)ZgHkvPXHZ^62lfZ? zZhr?iy>S#~-)S2s`KwkxZdINd+Sa~emmlG-YU;18%Cr8vc6#Ia5Vtm-<*&+JXH_QD zDqWx4iW=J#U-zfbri);^D$Wix+CI23y}1lY4!C+qWL`1Bs`=hCCMzv99_g6=J*uY3V2p2H6_f!OTsbw8 zQZ+3ClvXt@6JxOMpP{v_F^f4YxVp18UXaQ$`KuliEH48iSYeX%lm^KFgHc&Sam;Hh zE2nN~rsMtKA)l26|HoK*-9aF2AKHetgw~w{OG$upEKK{SRP>72_OqbU?B}XdA{E~q z3a#r5!HTET)mnsptvgiqdF5X>PD!OLM!(6G_S?#o$j%>pFrOc#V1rv=0}exITV~}~ zLq07_*l>(CMB_4QoCOvBc2yNB{rL)O=F?>ucj+$+nNU-R>HT}7{jG*p^5lCBCgrEs z%Aes$!>8<5u-vBEugPljZ@6R4e=%UN=6qLD`MZu6Twf;2`ZA?Gml(ThL8iouiCAI= zSEfWNzt~yR$^PQS@93PZ;G|B>Ks_#je$XLuU026XIgk77O^AElSYl2MLKhX6bEYw5xmmRw?%U#Ve z_ofcPVva~VbqE%7?w+vb|DWW~Sjh=rKJJ(A-~?K&LKU{WvfQU(x&H}6zZiKsRB^wT zwEq@&JeaPT?an$$_pFuv3>x%&r~HGp(igFIW*p~cIPyO?f7czT(ldDDcwcDrUz}Ax ztzI*DBRtHiGmCkV=2VaVK4>|!m~j`gIQXAoIWyOfnR{Zqies%eaptdDZ=$Y!Jo9%P zg6E8?epOR?R4wRLH8G>=Y=2cwdzp&M(yA^<2bGPzIZ$rZaz9W?Xxp;WD!-~67};2Q zXv5UVn9#O!lELo*di1)#h1On!Bf83+8}owPSXF*nu@htSV#QlN#DrdDnJr6vT+bREgEVrR;^D*PI z6Cf3au1IKGZe(;8^fbc>V(4-{jXMjrmwl4%*CZR5k8ckTPA zD#ZyU(~b>o%W8=&C2~4PO1pA4Tk=s)dn=y$?C47uL?8Kxo^z$Y@t2p&*hO+O})Wcd*tvSSz&t1Dw;Y z`3{Efj^vu}5>|{x*D|V598DUy?=z&r`#!+uvHL#4XXkxyLJCLGkKE2sd9nV+j z5#lEpXjp&Ru~Ggq?Ktd7=`$O!?Vu4l?}E2@TrIA@q+_dq@$8vP8^Ec1?!jc~`3&hX z8&lF`koP`JhxqpGTCS3TOs}hmBG+H+y`gQdz*h!C3`;H4;|M5p@4?E0@T%{39ujx? zzA8(+1=q*)mM}Aww-^bpw;aOxd1(D;jEs28VA!v=w}iz*!r~#vihpz#|LByw5B@Yz za=S|IamlY4kJ&}@&#g?u2*&r89?DA)0UT?Ix7^0rzrGD(35T>0cL6x0-Bbjjx5OV( zjMT9hR%}@?q)rF`U6mrs1cwx}{5aSJ*PR?%N|~YM22%^BLvVc84Kl+gcVe%`MaDRh zfiVHrWgvio?VUaUK_Y^1fFao{1H9|eIs-fyiLulWH}^D4}o(E4W)@YehQYfpgf*Zcr;AAq@G0)~t%-*JMnbFmXg^?b%eGti9r`MVGLB|d~ zDh^^Bcilm5GvhjtlW#XCojv*vM?=C17o5tpnr%P0^{nXU_&^)BTAhzbdm~oA zf1+*1sc z+^&*)T=Fa8A6@pnoxFE$Wuh4`?+Q}${4OE4u}aN`bg0%kH>5Dpg@cmeWT*Jp==(7*(C7w)DX9{N zFX+lZZ&wfkOtt73Q_>aLe4r~ScI83z8O;w%pU_7*%TA;tH8w4U?re5~(owD=8``sr zdof8H)-uxQM9_Y>s2r()qfGqHOpb}k!ZpdJQ z_Jj#Hq$k$g#Ii2#So?D6PVuI4tijx>dR&t;>O8z}!j>VUW*vF0l()#vrOxZW@3 z)jsaG4dEp}uJz8CA;$BRkEx?8lir{3e?h{lGq6 z@OQ>HTPk;N9CK)6UMiF%;cQPf(xYFlcq_5;Q^Y|yRc^$$^LyT>>49`Qd=%#7F z3-&X)lGk4MAL$gh3o5pT91N}H^JkIFkRt$|`0*G3jtj-uoc7}7;@kLsVQBr`_>MF8 zAWtL33xE`0=)w^!c8rrVsz%}rV0_rwlXreaR+7$YZ$9~0?0hq;My5sOa(YZYu4*JV z{y8YyrSmIJe%ER3)k37A^To|=oU*oDIrt+f?m_NMWM|@V>{v0gWI1Yh) z=-#K~5TNHvQD*>Ily$D^-sC*vAppCZ>AkW;dq-f#!ls$%W3SM?dqVgASozeqHI=XI zJlM&Wvw|F+8tlSRz_zC#*Nazn48P+rA`tmra;bPY7wChsKT`(5PC;C+%&ZQWqd(~ z-Z2d+ddJE%?H%>nxn&;qieGt0J+AnN(>x5auqESbZX}17`cL(gGqT)BHm~>@&+mG7vP>*r% zCF8yu4d=MOjPF=-+=t<7kedRb1_8Zyw;~q87?Q^IpS;4Vvaa}6aIfAjurUlX8HgbalXA!W_kf;3TOHRXQOtM zGhOX&xL@^-JEye?=DU7=h}&T>L+dZ)86SptCnq-8PQk1m+2A&wf~n(;V;s=I!B=5^Hmjw?9N?6G>Q+X1qIzl~=Cgw{u#LBA3y z4*Knw=l?^4uFhUE^;Ry&oV{f8kXO!Lu;j+P#luCs7n-fNcyfJ4~tW8~!$3D8p zVxHz~;G@U?WL|_EF0R*O{J)fz-;S1Z(r-bE}9DPA9i^S7=G+Mv61_^;g|hAtHI672ULHL(Ch z4gHZ{+|`^0eL4;}`?#9+Tms~r--r7!9B(J&9K~{j`wma@WDX98b6x7aL*3s=!u_2S z-A1_emf*OwQR>Zb&Rv~)UvTSPgOkCzn;rhKIEZSL`u@&iKDVD2yY-z43z+)Wx%@Wn zX`S2ubvSryl=fut1P|@O9OgZ!ux;-FDaS}Q&*;Ngv6AHeQ|hO@|CC$z{u9URC3ifI za_PY>o(&w62jm!4+uvi4H+W*Ja$S2A;xtd}!DEf13VfA`HAy@gjIO_gx59WuYt@|N zwhr}!>BpJma2`zN@P<+rh)k>IxX+bc9sl_T#&g2l-{bD- z<6+u2mR_aCJ!bnSe{uNy9?pC{dMCuW`JT^EnKHO@9*tw9agh=AIEt>RVp;xfMefHW z;U-3w_a;ULj%VcF3C=mO^zMj0C&y6_IO?1n2RJ)>KEty=9G371r{*kJnMTDWP0byj z9Nr#Zx%L$K;l@64zJ3J#QTG9wqCZ7wQ=^R62ke|4FS&1W6u}?k|D-$q+TOkC;qcER z_J`$7=MTd@{!q?pqv)o5)m-EFS5x@KRM-5QkJ#QnD0@3` zs02F_i9_vc3P1F$XD`*5_;=LD&WL}PL!F9$jz1seqJvvat?APe&t?9ua^l|++vCsN zt~5qGl0#&3-)=bX+o4U4f7DrTmK*`L*6MMF!S;U@4 zxIX*=S`M?WU-_Qa>-fP@-s3^LJFrG&4*nkR2*>}QY>=K;?Q2eZSGTWG)@zw0ysypq zu^GByU*4N+UvuLJx?X=(_Q0yNs_fjVeE*tvH?6raDRCvX0{O`m2V0e$c1iD{{JwbE z_@VsK$clCq-zPlGJAaSz(I%mBd-o@Dm^SzOTjk!T(2sRHR(y^7h6Rw_{|VAYoDcql zIHf2LnQY4ZX>;`78DR3e?d<`)aoPir37{~4OT8W&|8GIB0p@R}`Gk)9fNueG2K{?% zMDqYM080UD0Gk1~0QmabAvjn05Su}MC)NU;1_%Q(3E&mu3uwatCj#070)Q`(_a=Z( zseKLSa$5nn05${G0A>JoKyE4U4>(YM6Yw11LBK75D!@uW8qVo!my|A;jpWSI+4F}kEm>T) zULqpDca557y#ef*qVae`YBjA)mNn@$v=p7MIKkFTj)3eFvE750FksNL)UDNoiR) zN&=Y+mn@zq(g{h5b{YOep`%OKNhYl-P4SD=oFyw};ps1Ei_-$h^{+tXgQuhZNQbj9 zKnV!})eN>tGW(s(-0mGX|AaB1KN&sJrSVCs33c1yFQj72_gqWoI0N+PYFH@f)raRpQIPM=;le(d-OMdR!6M~}}vy||xc z*Af@@Kr0~@8x5+(&dV7w_VnDrmOmyRO%BA&K;wh8GIH|sbEXsywi09Vp(!b51~etd z${2|f&0=PtM03=xEOxqmgSOc4(FJGb>Nrv=J&9{&9Rb9@6NG1BGO93WXS4t&ck)P7R}6YdgkGJI_BZBMas3JnK@3c zJX~pg&@^*_9Yi4Y*l%3UlnI3e-jP+K;P3~)Eu5(!eRtRc@fS4=4!_??C!G{E4h|pe zeo+IV`6r(gH4qMaF#e)O!r}Mtm&t!oqv2$!ocWlA+ebtBs3K_u%BJ~;*=fJ0!o~6&n&p;1 z+fL?_o~&fe$WaphEn`fRJur|J0<5YpTA%()`Mcj2q%wn7*iCZ zbMkP9ah76qNzQQ?XDdcmW!I_7u94)$e2SL;9Q)Yr=wJ_+`CeGI1;?I@R4xWKxZ7!b z+S@}4cMQy!;t%7qHHU5(h;;eLjiMmKqA7k>nvmpob~Y`BAUOw;;yp=L8>;p`1uC&y zr~uh*vlE9U%do)kR$_Jv%ULoCtE|KvX|P|C^N~zrOOn(Wi5(M%i$sdB)h0!am zY$o?~iDRVBOvgPE$4dEuY5Fl-R^m8un89hKR^piwVYAZaflTFO8k#l>WJ{96(q@88 zCwZD08a~}?G~eozINrA!#*^_PbL5J}FkW8TKKQrq5qzZhU&Uv;ckz+V4=`xt6#tJH zD`&ToG{$}bR|K-Coq77CNjalVA3mXY`iKeRCge{aj%909{)EEux$z_lPA@KS*0{Q* z3kwP+jGsPSR&!^;i!0>Tq;?|l1Sg$7?(`7_r{_8gVjZzFbBe71y7)N^mg497(c&-Y za}D|^PUyFMuYzvBWO0dda@&{Ck+}gMFHsGjZ$+{bbyhaAI?#Eep0S2~TS|gWOJ|8Hx5!?eZ`tqLGN=z@8R`M(xO^0Ot+-Z&Fc24^QyrIMEBwCQmOMVAz7wG1 z9F+Y)mE}`)pTZY?JI+Db4^-JpJK;Wt?^#)ks$4*vShImC-(HZ@41_7|bONS_tsa_FQbPk^6R>Y^d zg*)SLf)$l}MOe{7SYs}q;}(7ly4c*`ctu#zr6=Lw17P8qf2bD3GhPu^bi*K=V*sph z7j%6zh!4FYtmqDutp-@(j;M%Qnz!_HniV~Ye*6(&h0~ymB7M9ftmv=s{XfzF!{HND zMH9Uutmt1^mh}q23jZooX({uHu%fSqTGj^uI0O1cXZVFzgcUW*#-s*V;hgTu86NeD zu%hxD{F)44g`1-yYI(ye!iv5hjxYeQ!r6}3@v*aJq*>9WaI_2PY~e@`RZ&;32rD`; z5>HkHpdxq;D;nt)VMWVet=Y6#cyoUxvcN0CiVk9MKj#34i@K zxLtsXkq;>5FTmIcP%-jB75P#pVn`{Of~xIpO7fa~%wd3vkq;?J|0Em=f~jKU!%Fhe z0t8Ngijj|~82LRIUjs~xd{o8A-i4Oc6=0&_V@k;t;H@FwiH6%%H2eyzSIK5Hd|XAe z*C$)nRRD>GkE@9G)fCHm2q4k$aTU?F<0+C$0TKF6_WcKJ|*Ql6!E8bsNCyl!TNqI4f9s0Xho6pPpCpgj)M*+vb@ucSrV?pUkYf z+RliYRoAMKEx!=UElE{MVB88&v+8;^SN;yh-zX`w>INnG85kc>5}N^R1%6?- z*oW*BFS4wj05z?CsYG+Z7)ItAG}*pUNnQ!Y6#!?8ag&-Qw}Mj*==2Ii>4vu|6_0`U zAi(XiJWbbLYTG<2&re{NeQ*o4*;-nw%cV-oN6_#-Ky`V!Vzye1Cm4T4UC}x z)#VjR@+>g&DJh$+l}hpkFs`HIsqEY;C3znhzbA7Indd9XPr%p@aC&@!>aqV~hyXe+ zvFr;~=~+m20d(4dEE?ew#kb0_P+S6@8FzV1v7Kkzyl0@s{eUq-UM(Z!D=mGY#!FiRUVud0l`ZXAzlDP&= zwu_ZyCK7!BjuoaTE1V9_2tcPhE!E{2O2u^WrU2Y7%VV1D&KP&BE7!`n2aeI>-nmwn zyDBZ$K*JRP)#Zp{z5>Qy0IJK~RF}J6iZuH@I0Z0o4|vqSf%J0{9A zQqylyaxOsiaJTS=uScu_s2=W?9-fQz9DwTK9_isjNMBE$^l(oro?~1IYhM9SJ>1it zyq!o_15^*6l{&UmV#)(l51*ADzK->3pt^ImbZ0Bl*N`WJbGCG6T@|)^0M*5* zGEb*oi32)->drY*$7M)gNS+MXInte7NN)#pLNt-?oF}3O!1^3uS;ss6hbwFKxNLUG z-lDqFIl3#|rEIs2m|6hUmG07&Gm#zzP+d7*x^ffJ=aVNRbG&qA*;Uwc0#x^omyx*- z=}iFDl^#;Zm76SUEkJdphjit6q;~^4vDqA%lSS0p47UUue|Af|TT<)hzNC&xE$vpp zw079hN37<}hk=Cyn(o%<);PRrYx$B+X?|++A8>+O%L zEo79VLCi^WluP?qxTT}qX>cn?xyf(c#y-A-(wZKSF18uy>EdY}vJjNowzj1QP9^PF zhPAbKM5QZyRa1vP_Gul&KwwcXEt%c^7sEyTn1H9}6z>>SzTHE^Ve<^|O!pHM@7O-J zt29dGaZu?>LuIGtHs5m6=WkjD-yAUS>$we)S)}acZgCKany-<*urj3YZODZ zrn}Q>FYox6D#fpAe~iNfTMV$Re4^!mR@T*4uCiFNABtRm$9T8Rpny zBf1h05J?zQ{nJLi*{?w=9#Qvm87EiF238oq! z>n3r1SP~DEZw2v)PV54)t&5ZM1c==L+bSZuHRAB^0&!z^C-G|#7xZuvmw~w81f2kJ zK`)&Eahpyo>w|3>Rs=NWfpQYF0jP!OJk2L@iQ*I8-OrKl-rth3Sp zhTQfNf3c z+!@O`0HLBoSDYjPKsN7&Lr4I~Pchd{IbO(j;2C{;DiVIt_e4d)EBf{pvdsWo5(5}6 zR{^gEK*jHX?pEY`Ks;8X#0S7110d1uBplQL$X*Y8B>?RI1}Z*TvF8oK!6yLhJAnAc zd8r0?H2~}foq0(%=jVI?={>;D10eDwX6w@cbexD^1EYkt+y6HFB8K}48K)wmO<~Jw z!|)Z9;qM>0IycxwdBT2V-6X?UM6?C7JC5W#$ht;GxrpdGO#L{LFClBKI6)E7<#2>J zk`E(mp7=-+(E|8M9LWcf^#}kFk!Tvc31P2*cmZ50UMXZf0$?eitKfJnMSLE-FJ38R zJpy1UplR??mRg5};2(fErCvwY0RT!7P3Rj}vH)3&0gxnmGQQ-~$U2}Ti6$WW#HpQu z>7Dr5A0jJ=MTz|&o(+hjX+E+pcSMO9d(qNnSjiZDse$-P0N6x-2gFhKDzXm5&*r>8 zTPAoB5ko*6Ma)uBp@?V;fGr_b5u%7_Hz1Az29OgaXcQ5x1;ml8MAqNqXTORp6@7|` zf(SKn6froRCjqI5h;b^8B(qfLDkA!Oe92dl#puS)6OTZY!!Qu71jNyQJ+l6&B#8ou zgK;FAA*(ok_BqI6FlF_`m&X@nu>HglC1&7_Qz^5!m{Tk9{P?1akj1b~QQ{loi!!V? zmr#Cn0Wm{+oCYwf&=GwSm{FfKa8nVHuwO(}3W%d&6|!!KpZy@Rn#;bSh=}V)97X@z zmJ)A!{)J_QTL7$rMArgnCE`t3N7~h1V!GODk@*anx5^?@NW?`ZuIvZMyit~!LLx3R zab;gcW|b^7g+yFv;>vDE=3-fD3W>PX#Fga=QzHA7A|fs@@nw-YQ#Le3L|j(l%ObNx zc05ITF^MbdE+>V0If*OlE+~b1L5VBtE-8h2Nr@|~7nQgIdRajP(yK~bS-q}6)?HQ# z^|Au4yQ&oGRVA)6y{^O+;L0)sU|WSmTt4E;x@$|JUR%%{cWEiqOG{i0TwM5qG}K1K z#U-w+US8q~xC>07USQ(Na*0_AK*dB{N8-x5i%g+jWa7%|Wd?TODszUc9fd?(W#Sg& zI`eyxokYa7h5QMb9DhRSE#t^^qOF6A_iujh8WpR#NrC|8(Ej=kR$Q%K8AuEi(kU6sMLRP33GB(0p$qMyKMt1zA z%uyGADRTt4l${5lHsaW8nIo*%G77tkS)pFc$d137IXbwSor)!l!o;zcGeNL8EZ|6-_q-+PIWqr6iixVxm!+wYDE2bu z$TD-bl69A{LU$P}jK7RI8saZwx;a>+I$~kM7!t)^qa0aSO#Tv%@Y5;wA4R;F>Iq1) zt}a$<(_2Wr3qZ^#;yMN|FYb)BX(YfE{0^xSS&WK^xNsr!Jf(#Pv%>(c_!mf>BWq9* z5!WkMoQJoW09X7Sq$bGHQ$)mN$`$7UZ)+?_JxS6lPk_c;3TX=uJ}_( zJu3^;BqAjvL|mO{jdy^Pun@U|Pa*ZJEKQS$c&mXLxlG*( zK)Z;zD7o$8veZGHu@P|*ax=LMRjN!PE;?=|ub(>LU=3=CcyGwfI0=q!f&hb60s zh{4^}(*ohWCqN66?gM}xBA&SGEYjm8tB8nk-_^s^%_@_KG2hK()IX>)i5TPE%rlW% z0MONtUJO7Bh#2E_7GwO)l2t^+YZO;cHw5w=fEFe_5&%6!yc?jiNY9t7A|gh3R}X_c z<2c8Pm?4{E#dyt-O!@`j8h}V|)NG6wxLCd)yguaE^+Mj$jy}Fd~sLpNNr>=3q>m3UD>H zM-a@An3zw*m`FiJ!|^H_IvSfH;H3g^ADxKNkb;bZ{Zt%u1V2IQ3jhR(7zZiH2-qEg z&aJuzsZRh9Byu8PF(Y7i1UgsnL!>?iK#<6ZfCY?z-Bkp1s;)um6N!NNL{0=OW&~u| zV>1}=80APazA>l?ADA(Wv?qEMd!ko?Cwdh#dNC?degZH9PY`$S8IMTM17MVhR6J5y zj7JPYEY=C(fN@3_BRvR!VnizZsA8lUR#=Pyg;9j`bYKPwt%CF_08|jE_@PuVelTdT z*dR=E#syuB^aKEk5vg#YijiiFU@=d0DDXswVo!7^e$$BtS~Ww$H!3<1spz0od!mD! zW;@ZL;4?&r?*Li_>7M{-9T5YC&Kd=pVL_)!p96p>k%|_oHczxD_C$+fPqZjFglNIA zpw*FX1Asar6)luHbVdIBn)qLX88zmssBx}}8pnrm3m<@$_CiF7+W|W0k-i6j9uht0 z$vOowW21zSyi$aWEdX7L^c?_{BHHE2>W=`j4uGsVh#yx0bScum03eI#0Z�QDhYW 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

    N{YCl0edqOKF!zZGBQ>YOkiOJ*f+| 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
    uPx#(y|(2<%O#fOj76Lk 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
    M{KktFQjAyWHrsdU!rr@d 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­9f_fHQ$x%W@=66o}BipnNAMP(zBW_a8% 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]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


    J8`?A{iNUH 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 z%0A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�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 n&l+W;e(7{>Lff2__Co6u;w|? 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

    n^cOnQkkYc?4X)xRgb;`uegRibQe zM%iRtsDF&0SwBlpa7;xq6C8B+<1{Mc1V;ma(-R!cc%1P%Cg7CyiCp{%jt&Bero1-5 zOF$2${AR#FcakVw{Gcp1z3h!Tn|sc;dg37UI4}05b%uPRLc89E#a~r{sB9fHpycl!(cavuZdxm4zK+MCzlACXeZQRGQXq=eWz z#kdNRQa~(#v4_&` zU5-~Hh?EPw)HY?upVF*%{Q6BKRFRIBo=!+DVTRKi`*D<%7LSIvkhr*mO<9_p1&@b& zXW7GwlvdAlV1DjhQ`!<6;YsD*HKpCP2A&MPZ!+XNSYGy@#vm?ImU*s*tkI7~@a2iW z0dDlC2Cn+mloib9e$`->nETh13x_=i1>CS2q%&N zM7fh>sFS8bi^za;zY&^>Ey9WP)JAvxk|9WCXc9E{+20s4REQ=Sz2hDUbSM>Mgar$x z5lThLD1chfu?42L!<38cRNQA$ziSjI&vEd&BayN(s|A7eC8IV)E3LrtaAk7{%sSk0 zTN|!uYwTWHAEp_a7R!(owHtRQtYL~VWe<0Cg_m>4AP(|R#m8>SDfw8*oRXi1bNo~3 zpN!w%pNc;PKgT~6e=2^Re=2@Heyo2gegS^Fe-gftfzcTh`AADudp8X?;saGm<=Ts~ zl-f~BWjM{oZlO_Fgs7-j^(7D6Hv2+#ZTwh3~njk z?$BB|rDwzjgUY2GY)niruv$6TS#q<9Y}C&y_@Xu$!hVP3e`5HtKZIJz&At}fF708= z5w$iu)!5`@tz*cLDy}zjS)!NAayEjhlZ0g{u3(g^Ol5mp9o87yg^W;D0aCt}COFzk z#_STKZbxYHhA`C%h?UYc-WmwXtHKFpw4+04^3w1iStq&@$vmn!^SU~FR<%n*)^HSV zh3Zyc#IQ%fRV!MBww6J!0_$&b`6HQCgp;cLJPglwD!FqY~NW z)Yc7ILfN$xZ!8nqdbt6@x3#fmTel*7vCuZiy#nE=sA@E|dn$RMU2M-q@Z>$(B|~y+ zFg2o=plX+<^4RL%hQUp{Ecqjhi4M95-G+CFVcTEZq))*BEj4;^pa5GyL9mUO#r5SywPC)qjA@=w(j^UCu$s=5GD! zy0(?^EbQK_rPsOPqIRTf6WTWB2K?7hvaU>}B#!lVwseOvHK&>%iA&c*LJdjos!ipN7-E?s4=Y(E-L#HB#LW_{vIzm zsH257)1_2eQE1oOFM;5gEf~kOU)j?V(76e5mOj)QGeStO#u6TdlG5*`*~M*8EN2z8 zTo7l`^dRcnWOAx0l6Sahvh)@OpxTm1J2;8#B^>jQpQG1|r@-ikL~=i?m{4n|pn!7S z$*bJ&p@u6m|0Bl6F~-t4CSRAdMCqcd?{TB&E$rl8j`~I=&JofDk+@;>&G6(t4)we> z6a^JyqjEMfQd8z$lk_cx;W;eNQO8kQj8cgA!8lh)JBzY){9J_NAZJsMqP8~kJLTk; z?Gk1U8GQlCy$(wf-=cr$y>h}52{u(sAA^(uT|a1}D9?9MV2Vu!!7C9v+gD2w$1Gdc z7>L|&=$9h2RFD0X-H6krzRyXRR;-CkQFvqiP45U~yAVlR&l)|F5?dzy3MZ`&f|Lkd zWHt7@SBE=vp*9;Ei%Zyo*X)U`m&DJJg%;=Iej~m(o9tL`D3)f7r>sPVG|-(ZsXc94 z)&tPQrlC7gUk!9TtYuPW{*E+og!GS$&-&58LB(v|J4RHxQF^^Vt7((Nm`FW6fim4w z4~<+Sn9>_fuQFn7E8dETp9@zChuy};6;lYZGLaVxYzP}{{_vk;l8p`SB4K{LV3aWB z(lQLd9de3@V&vYHV;Zqe7T~Wbu(beX)^xNi)icbo!=UAfAFG4hyIR8HYy_d zsZ{z6Npdo|CG!xhXZ{VN{S9DJ+GIRP5&Bm>`3W*b_<^yWB2vPIA;*VZ8TQdaScc|uHL6*t&(Sp{JFo5=H&8|)QS za<*NL?AGuGq1|N9pb+U07y%c&0sl~9Hv`PEg++qh0|b;K!A`GO7rD3MAIh`bUxJ|Q z&3zOE6++&tAgJUplF@KGIVRzjZ?$SQc76*fy^;9uNWZq{oCQYmYwS6C@}-$`rI~n( zuE2q&n8InPv-6~DEr8{4Q|Y`ztG6eT8vCwKH)YdHV6lj?^L*t1MCgNw*>X;!|9(ts zl-wj3V28{9F1Q1s zsfj!>UuL0W*NvM7Q4VT3BKS)%si_@{WkSU1{PKJHdeFua5qw6M^dV|0iHMq@RdV`^ zkSsC*2^w93i7;^yO7Alg)oNt|wK~$P&9(3P`z8^bq>Fe^q;W((+az*7f(WUbJ`X0+ zJVQ58Kir>=kUa0ZT+EEAkF#4=;{@2W#uD0NHck86LR=c>D)yKyhnmYQ+ENCqlKP2R z+;ASVEvJSv%a|cQX1kn%6&k;Ypq~m?hOnZ2!j?+Yx+n&gwNL7d7P=sy4cK^9QW(}3 zq|N#ycE61$y%8LZ_JECRbOgit<$!HCb*n`=Frt`S!n3yI9`vB1Xs3c+l2BnAR=mwP zO4nYtji3%z0(_dT9X3O9ZvToI(r5OsN=y{puC#w|bIS-HRM1en4jodE$AI1eR4DI> zYG>KyIb(@5{am}7uJ}<$LR0wCn1aJR!k7xmaY>z@X?NK)$_Q=gA`~Kbgm>9yQD-7c z^e$T?mFT&2ZVK7uoO~|PyKUSR#_6_bCSpVx+db?^!y#4U6hq zWYO7o{rK|op4BCFB|^K^=6L{;_FcO#4;FwJfw{sA6h4~~1? z77)#F-0Q9b5rzw1hkvNo%|RH7NbjVm&%FaI>T?%Hv&eW;kNc!9cSV$3bbtFS#S&diO&NHep{fHdl7gC$2I=oEoBdxNvOT-nTZ4VMzD*=zJ)m^ey z--}>(!_B6wTtM-Q+c5NL>uj!qEltz!hY}QxBpBZVriwU@wADakWC2tBTBNIofF$dY^&-bsyUd z0Uq$2HkNZiBJT`LmN>`b&2liQHF^un$(6PQzwm_pg)kxwPTP~Z#F+3bvCY&cJTjk` z*y{CsmYKFxW?DB=aS>eQ+V*Zb=hIsC3y^V&TCSZ8OVk0Iwon%Nd$1sht#|@f$SLDO z+YGW|J7TyJPMWgNR%aAB4F|>>381Hyj-9CJc}y@d)=P$~>N7+@`ILi+tdDZ$c;T$I47lp2TyVH?`SR&ey=ot#C5C-qv_fd=;T0xe-3M2_1e}Ad#sKw= z=B7yO;Q^t~z)xsAy1xV2BXDK+_~my-QYZ{%p!RRg_h*E$g(n7WXneG*kpLzqKRgi+ zhgOV#oe6e~FBnpWLFjADGIarr4o{<Zp!n_Ku{^!k#W2+^ zgoT$tg66>#(8Ph)rGZ~I;FF_pK^wAqh0xBiaUSi30sjjw`$B>|G#z*q-sj zqnsj@!M{TXjVfcHgDkPFy9^JfhW7<~k|P;JvdE!cr19UV2b##H92#RAvJ&A69s+z0 zrXgp+72E|+4TuUjaUQLO>Jf(~W>bhV+mLe*HLrsD&9TEK^_qPCPk1v=Ht+b=KTjxeEh{;$C3?g_b z1gWe0wGmmi2p$7QE93o!Y6wpM7eE@tDJ=-GM z7{a~f@eWiU8mqTMb}JnBmUn{K2PcA?5Q3WFP$YxPJ$jga0s_=gjyD8iI?A^op%2qD zc`F=;@q9kPyEn^Qa6=Pwm;r6LMpb2fnrBE97Ow0hw)aR+}iY5Z-BoTZe5`^Z^m=UVJ);*6MPZa<4X-3P~=G zl_V3`FRdxm&!U8Ojg~^^aB&nDty$A~aY^K;NuH)%gj7=kQlBONjn8Z#dJ^pZlC6!U2nc3(*itrY2$rzU2lSlNZc-DnFw*0jYd zv6;im!;cFn+vl<&f8o(?F8bqRyu_Z1%}Lzp)Q<5f#$35fJC;n=&0XHIuDw}Sm*YGh z*736YuZcAJl@xZLuB)@tfG0*^R#My913Oa8 zN*J$Nfj5K^!=wk=rFg1Y9H=gws*R3lr%0uAnpv7)T|7<8jELhLw!KZtr<>&&*8`** z#^6-HNy=szvIOa38QMsx7uW(RHp(QnKo=Wj5?d(6Mw`SI>SCjHu@1Ul(T-aiU0By< zX>O`4h23@3)^nB#?KBy*q_7PKzj#j(?hR2*2j`Ae!Jv)Bn#0sgylnRd;+rZPm z0e4M}>gxpbt4K?Uia6I2#*0t6$6g;76OQEJwHPa`~CVwsW^-oNtDm;&mWl?*c zO5Fq&4m<&(B~fd3(Xk4lJR%L^e{I6P9LW5bY$|D4t)J9rck}+eM$@rcx>%~+olEoY z+TBcth!*qf+Hry3eBVZB`?!T^qcBBl*Tb31w9C@Bk<0lH^J4? z8yB>F3;Ag06a`p~pTA&JL!*w`0~;`bM9FPIbWO68zjZvZsOZ@2TMOi}!O_5$-#SNn zo$*StyWTjdHwtt&7bv2@=Z+|z^3^Jy-PuMw^s6&%cNJay!yqi9-MvtcM@GB5Q+i!Z z##LNx_vI4uG|-J(ZTB^D(DpanOfl{Lne?VMY-jI7(wou1>D~RZ^k#_#G)R071@E(c zgS#;N(yIHAQ;0|5cpyJ}2rh8K83Q>lxM>M0|7gkcTO^DJ@%fOehvPx~Vh}xWa&i+q z9YJU$e+|NMNAjf*pppD*Lm+x2pZ*vm ze+;*98a&9=h2{KoPHVvPDKH*|J8$#~>^UK@CQ_kAyWch>krY${{x|sFz*P`uS`&~- zLvg|eH?0kx4iHUni&n!k?Na>n0eo*0yAPh>DDFhK88^dY3y)t+?O-8dlK%!Nwy!+r zu0dq9GFb%C1#rAFSqowfd1z(Q2jVL7(8^>lh+E)-YoUoUax@fhMq2mju`ua}gt0J* z-ls1V;`}>cS3a!hya*QG3D1Mjdmr4i0eHRx@ilqgfahEn2y&mna|MV^X=VN%pFsLTaxA2UGXAIml*GlvUAgale1<$1*){$p2Jbwgn z2=0P%cxa1p+H4RZoJJJEOKD-Hh=1 z6nO!im28F?RdCv#mW>Ft98eG;#=#X_0Z$kNosSh<2hSTI==5pYEAWi*((OBV-i7C% zAU+_^H}EX>2~h_(EfEI)48*N)1wGJf!gw81Lql|}PFLguoCIIh%^Cn#IRdDFy zi5ncwJ?D0`qJ2cDuZ*pC7@6YSIAf{*CxPY1^w#bh!4r8qIqGVBuP(^1R-bUsZw zUxKF|`sR?%cZXop6uGo6N+%ZUo}rSpD~g3h?mcKz6zbPetXwhuIh|!TFo;ys(a(D@ zVGlBD#=G#Kt2~dE8gz<0p9+u;h{hUXIye<9Dy@Ob^`aN#N_ z%(N3g%Hf+1cYzb#)@)2@rVRlx2IJpo8UxY$Q$*C++QkyEwIX}+T}DJ*5LpSw5&ag# z|B#0w`XdP1Yp$R$9MQkw`v#69y2ps95xaMDc~?+IbPpoJ-XcX*Y)|&DgE~sl7KmI1 z#}PdPVn2B(qT?VwhO3}39FZHV*dcHnQ9j0OPEk3K5S)>szj4+rr#V5$o_yIlJ)%~K zG{bR3cYwH^JQUFjAP&M+P#BKr8~BdH$rKq8J(7x@EI1>gu`bFwdI^5aJ5z*%m z`4o;L%1gr*792;^1fl`1g2He_Ti{y{#}Q>=1m_ev(=npM84-0LB2CoN0AFrTu2~Ot zly%t<84t%1g+Z(#52a`~h#TQ5C=5sRID8MmaYVa~h`s{y1swi@e@3>^6~6UQZ?2{} zdV|5krJ*Wc4`WEqEW5CGsEi7E;gd>tyN6M8*5DiQo# zXZ7&MJsDLmJL zxSBkT@Z1ODH{@9k&l@0KCC?@BdpvficjmL*P`DUB#o9{Kc z`axfX9*tC>Qd00UHd+%XgHyFTW$?REn`mFSLJyvR9qKdIAXMbe#@Xnck;&9=TXRsf z(6%96^|>CESlhF35xiIxEnLM<$HGha>0G#jpRQ>)<9T`pt`NbUM`48Bf=X+{a23l?obhof1LGjBo9)8+O= z$wh5J=PiXCEv)Eo`e(>Py7NYH+IP9sf?a4{?M!EKqTM;t>D7FLJSi|VfMvtEfY3z8 zhzg8ujuFD{oR&B}u^^GW32q1wG035vn@FVO(R5+(Scqnz$~Z{~V}%|xK?WT5g7 zTyaT!I21a~5+gV&RKFBcVqh&9m8yqk<0*8S9=ih4_1N{~ja2698Zwd*|BN)ep){WPJm^BNLg>X&^ciM1qRvP8?=|rFvQU=N_3+PGJ6`q-A%9&Yd6nIRYD5tW4 zge?`PDigI?X+}YkmKj_WW38|R$0-njBeG{(VJUkKbc^v5MYM7>>50f~X~0=&RKE&S ze_YIwPE3#m1ML;bWZWbRkn&J5YGSsYBq=1ZVBZxQDs7N!P0rO$Hc96DVv`;(~E1d$nYy>$96qW98_bF*F^zi4^|15Inu$N( zs!W>GWDZ193nrq>EmdV9mo`|7s7$etR5_#9ibPo}&QC;0neGcDiAk@LK?sJ%gS+I0}rO=D(}Z{ik^_M2Y%QcvMKT6_2+h zX$YeR>3G4!C}rzk0gY#3tS#0T}_6Ev^8U4%^X8Z z)X_s)Q}+tU4;iha$4see_a;LHhEM&EOd~tUG{YWE%qO$RB7*7J0teWz3#6ey69iI( z7Goo@CgvHkSaw0~GS*dVfb#w-nP`#x9DKT79bHBg%#EzQ8xBSAdp!OnN!lZxNedQH zPg}_EO45jiaQeFnj~6*WAq1=r_C}Ikhua5W$Xg`bU2WP1nkBi-L0YTP`F*hPHm(&=4BtfR3UPL5R;?XfeZ~>eq z>WmO~55`G4rL7k3-#GwXcwsC~DF0fCBi^&qY@I%*Zkoe!@F^Xm8 z85(1*N}Y4*K|v|Ok${xh zhml2phC@lv;|n;uSifm66UZ7<3F&2{Q4n%N#5xfc8P1}Nz2tr01QllNCGX$hhC*f# zi2)-&T`)32mSiY{so3czksoYL%%zgMR+5IjvSN^o9SjVbPI^lDT0@>-bAWn?w6LCe zMxmRUBB_i>)JG)h4IT8Hr*zbk#I2kwszW3Rx*u~Gj`|R~A2JTp3!=?`bAew5hnn&X z9&bw0kdTR^t1xr}1tyZr>yk7ynhcl07Af(15`T@w>m%ZpRD1~TaM*>+&A@|91Zl)C zuhB?wegrgAbh39Et-wVsJ(e*!j~*-F9O4VDb}v!CmJE74%497)o`RDyM7_d{d1m$a ztp_6LU`9RZ8IWW|+>#tRGW-Qg%#BExk|P93NL%JdB&=ye2X`ILDyXRF%;K`avBgFv z4u{+%IJAWz9ydW0B!zfZlF#XZO^rnsD2ZPIrV+!VI&B0nR}z?uKO=-50R;eQ$eSXN ztr1zqf4@LP?QAACg_}uz2rS)f*>^s5frdh*?Z~gB3X+m4JGa_IFmj) z!I=*St{$oWp!31KaHtq$=WDE?md>6=vbbt0*a*=7D3#B`QKw5!nMc9B6s^po?7gIm z6p#!(W$BnZU^)b)$fJ7H2pk@-`WJavO42rw69@l<@?BSi@wU5sIEB-2s#CKtzTlHgiBr>of%%VG4+8jQrDBH5Ea! z2+xv99}p_-hL}x>`9*lY8836Pr})8;VBrgStn zFRB%BnMPL29*upNH~bFzUS`#E>G2vI)gF3&En#}t5F^3#r0dc{L^o%HEn_cv>Eg6Y zgpq$X${e7CP@!9fCJFTbCS9i5Vydikq)uH~YbPIx=+bXua}}`f1AkpTMD?q=zn|rYnZ%W<+`;9K`5x zA2#06{^;=loE$@m`aSl7qk1i~il4HII(pm#Y05cz-VZle^n{0;NH5JG52+d~!fO~H z&ueg4Injfnpn!(n$dineG0dgMy&R^V9)^)~_ePY>HI$jg4jUq&Dn5QF^3c9}XJm zL0fX>kzYlZ4>_rGEqU45&uae}^BDUyDMyjOx5a&177{`tnS&B#RrEDXIFvHAYj4VOn4<4M5Fvv(A z)}CWI5fsrNWDCsSOEleikpAqwL`VGjDu3;o9q)L;Deg zQEnmC9+@Lvl_T2_&($(VVt7V;xc$#Mo`VjWI~!rl^JsHCRGA|(ksP6sZxCyu`+=B} zkV10N2{i&k#IPY@(8Jmi|IdG6vd?+m_q^vl*Ewfqb`JF@dQ63$AVCiODu*eY!&h-j@Esh( z$t>&9HXLI5?N%JZ!|7mhVyQ&UQ)F+|tUmh%d^&+66Jr$h(@QXUjqb3QydYGMB_(qH zbaGy5oK%(6=sG$VML^!G6Gn1HlYYr36+zsG?xq%SIgC@BT$h&5zoR+D{_ zvOvi>1w6W)5IsGE(0*|{Av1I^az>!eLweJ3puhvFGDdM_P?~?lF`UdwJKBarHW|aNw`y5DGY87BD92wz~MaSr_Ct9g!BP3YZdj4@aUjVHPnFlo=E; zebEsc&+?bL?0-{!)Qzl?MH!`<1=l-Tg41vJp{vq)VmO(V7Ijy$(Sd`ew^p3!scv*S zD8GnGr2JHGwG1JTWRH&6JX(=$z17MD8cS63P%b_NBL{F`azkIoC0tBjUnOJ zN_H*|njD;$emlWB9H)q0=M5SN8o+MGVaf^8*`MW>9hzv6t(7?Fv`q0xG5Qou-S{&`=n?xJXq$4kjx}rn}>19C{EvM^UjW|~0 zu;evS@qZ2e102>0(XvarwD6`rV0#sgH8?JbN@qBG&q@dl3QH2ab6CLCLE&}1RH{QevJl!o=8XEi^-L30Q?73-*zkvRM~(r}!K z!#aZmfvLW%^UdFYtq+|nts~lwCAT=TnU3Q$9OH11?Ws8OaL}oz1V<^33LNL-u+sV` zrG>m&pRcn=HZ8lBzLlnxR&*Nm&|iw-WsjchqetPE;8==-#t$0QtPhPo9vn3Ce4Uto&C*@3$@M{rml zcL28xaSY(N69>INfNt?wACh};B;y!|!@7HC$*nu!2N8$vsGo*|?xtHGx<~CrctQ+s z-6lQ=o^CszhJ)_bTAyElr>FNO#PHUwq5a_LR@0j}=yr|uG2o+9&~~|)0DL(ziN5Fr zgG0;7ncCaaJoRF8yN;=NV_j2syO`S5-8U7lSZwN;+CFpk%qi<;=1*CJ_vWpeK5c4y zXLCnCeou_3QE(V5Q*&}iX?O_<1^q}`rP$cro1cUC@ZvQoUD&afti-t(jyXQ zO+Vf*8wslNjSbrjq12;lqDTH@9T7~ruN}W{jgF5Zm+8}G8vMY|kmqXsX8erXNHONP z@N3oET^AGfxbTuN_dJ(g@FWE_SBgtN;rNtr2Gk5!e*ij~;Vv+|!r{~w8rq#M{TavB z6um=gX)a$G)GAyLxc+V=JoKO|V2nD)NN}wk02?sIoP)2mu)EMOO7W#Xak)E3C9G|w zaOPH(uCLF?a6`#8FC_pz$#6enXtNA=6{sr>xAf&<_d^o-^n@oD8>8G6hH-;ytKoII z{f5!z+GeWh34L%tGd%7y4EH2MtE8abT$Ykz_&_JPE=a+buMQ@DPLk1-IWXEYQn9}Q zY5^nJ-2&kf8D~kEk^Ccs7AgZvjN~h1D1g)x3O;q|Er_i@un7eg2p9>f>`(@ux%=Ie z`L(xEI?to{Wjgv<50n{ReMtcoz~H7g%@Qy&R#N^0DjN^G-uzpNF&2Iqu2&?L;Ob8? z(p^5-y57iwz*A|AErz&KR*~jjS(XLaHE`won+gmgRUd(hgC03P8sAgg&l)**AVN=y zkqSG8>jHR?(niib!Or=fEZgeRpWNi`v;6YRQ*Gp+zSE_lowyK2^o)6c=bDB7u=!nK zjFB#%OO{bOt|7Sd$VMueloV90@<&f_-zLk#Cyi*L>+CU z&4$4xvK+?hBO8FAEvZx_K$MZO1Z5`43()%0FErBYjf_RcsqjZ%C;jnmC6i>>I18~# z4;kkyGR7@5&Ouu$gRzyyIO**|qZHpI>x^;d8nbH4jB({ljaf~`xLl)Tp^Hg|4{G0UY@7^jsRvu-hR@`*>Awgg5|r7^3{n3yA(6r%{X=a(51sa2h8 zoTkcZ3Fs6f=UU^8M~xhPL!WV4UV|}zkx?|w$f;en0;)(Ez1{l{SlqzM~bY-;Q*YJX-gjA}FKGb!B)`qsd zE=xA~w>M&Iqb$AYNn@<$LZe6BJg;l^CX(dRU)*?`5pZdc>-TRiFar9U0;bV6?%fP7 zKy7fPZPmRj0Mq!&#u+_cO$ka>wj8pZ5PmS~?#@O7&O;W#VW=nGKLxW@KGwWFiWB z6OG7OW$!_2l+gezeRwe7$}!p~6{BLMkub$|oeKjMR8owo)Oi}C zC@^xbFo`@O=500dEDcF4EHLscjcI0-X~PqD7|E6+SJG*M%6hFq1E&|G4}GKmxjv=R zzDUDRfeJZIbK#WWqEV*`@<|xY%Z;i@p!$vTL0nj7vMFjG#+@Ro6-lxBeIy^jx$* zc#uw`_n9tz9U3W|$}w`v@Kt7{>!^k^^>uATBama{K}O*-%ZSP&%5Y7C5e!>Tqm66& z!*bN4^FhEcq~RQC*fIwTDu#EY;nSbh-$cLJyRnVT<^U#?5h{adKV0|fyCEW6fE2dD z{Es8%Bd({r(ESqh=ioq|{aYmVPRhL@JhkDwbDeu{6^^vz(%wVI zPNo)bq|x6ra-e}KA`OunjPw~s9;RomE0LYJR!t^s5oI?)jFYtLG<^dKxDh95eEam5 zWaT}%ai_#|`oUa;+q5)J=li+(FCE%el)OuS2R9%-b#1~JgKqro%eRtK%M6VsKnq79 zK88(*D$0yeE`2@9I1Tnz!J88t=IJ=9D3FeTGHIhaP_2lov~ z2vcWz8?}A|TCbcR`))Jbml+xQr8Hj6lQRL;RR-t`2F`8Hal%HW3-eUTR=VGWgOx}# z#Yk9;0iW6gdYlUy6*w+~|`vYAFxQ+*-Yq&@>)L2q&2`R3`JJf4(b$%Ti>QqDf>Lk{L}M@LWmxXk`GJ%F}RNWfY)ej=Bc$JV4C| z$P$-Q4;C+UdP1W-15*o$`Z1-|mr_i9@>VJJE;QVw2;YS!cGczNzG=FHzHft#l zEg>K8*?b$#FP zt2>X;-Y+*& z7Qm?jsth_M(j*w;(biANQy<2BL_nKd;(iZ=dmK$XjkDL0@Ttx2wx?vfMWF6Ut98lc z4;E)GJx3eBL<$2OrjJk=wLb-eo=blawc^!(;XqjfQ&aziLrwgCbU8RR@k3?W7X@#i z&}c$}-hjRnKr6{CL13NiYM8gaZH#p36=Zq(R^uFUdLjM61YTy~m@!U%O9Lz2WdT=% z%TW=K^)U8nx2=u73zE38i-Tru_)~UoY*ba~{<+tP#EX&6_YkN5=Nj)XmD-=kN$s_ncXTgFKvPY|8JSuZ)RqeXX^pt*IFsqxN+5b>SUd@?sEeQ`Cc(vbFZ8mrRA%(ypU)nW(I5!+h+& z5+Ne0*8UqxhCNT!w%NTh9&I741d$|r`&Tq$=cir~p;VX>Dnjy2JteKZv{Bx0$*Fg- zM8x1*TgdUs_$*x}kT&8e|f0*~j}B8}WKETw1j@`?DO1 zEokge)QwHhRJ!W@{IXbjy1FC2$Rbz893i6%hHE?eb#1837VMA(Kd_I`O6<-{hT)~W z_Nna9Wj`dkrdyQ@UjN)~tBSr2-BCqW(bd=9)v01e>Jlx0wjQKhv?4Y6x<%{Cqckh8 zRib9PTKb!@n|q5SgR~u4bYXO~VnZDHy6;x=g_ezL=#7@-bRG86D(&p4wU+d5aO{H;Sqy4IBzi52~QeO;Ym6*eDh#6B>W z^tX04Z?N7=ZSIjPI=a@y3x|E3DkUbHR-_^+cUIa!vJYB&5axwbMq-8X0gjjC2Q| zAL+E>AAyYSc&)-gpO10So(Rz2?g)a@BRwHAB}Fd!WgP7(XwN`3w{_o z12K_`zSa(I!yQxQ8SBqwadzU}q31b;$im?goAEbYqAT$?OQLJ>cLt7t_zwQgl<0@} zJ4>R+@praF<>(r7CAt%+K%ysr=1HWZL1zKEgd6Bw$;|*dPa=9{q(U7)D((sz>W}phmy#iDz(Jz6jBpSqdvQVNQ0;#xr865#q zdS0K^p3{M{5W|Jt=&k-+15_=oYz8`CqHh7Ixc33k)A|8%2A+GM-{uAID5+)T$3QfQ z2gHX!sQDyu#=`ATjJg@!!sww)OYbR0HCYzd$ms9Lh_dXMXrW|Ar!tzzXeOf&qi#l* zGx`Rjdl)^+Xb+=T8U2RQKN#s}TV8n?6);-BsGiXZMqP|HGP;G)-Hcvfbdb^S7=6I# zb4I66vb;Kv(LzQIj9MA>FuI-5LyVqcbb!&X8NJU)M{`iMAjK)r}yqeFbiqVCPRx{eb=qg4>8U3A+j?Ak3`WR(0DqvK` zsDV)%qdrChjCL}*jnM;)o@DfEM(;EFj8WE9%fBg%<}xZ}w3tyZqbnF)%jh;nKVtL* zqkW8i#pn-=K4El%Q4)qEIExV^gV97rvlxXL)iPSasEg6%jD{H9!e}?67a9G6(L0R( z%E*&v`IpXU0;8FXiWt>0TF$7G(MCq!V01I1yBR&k=s8BOGkTlRM~wc-$UV*SIh9d1 zqiKu^8C5d6nbAFr9%J+zql1jzX7m-KjOmsK6B*576lPS*sGrdQqw5&m!RSFoPcb^c z=+}(S#tBZftJ#e3k~5R5W3+-%H=|9AUS#w~MxQa#W?1%;8J)`LJVt974KTWn(d~?$ zX7mc9LyZ2&=x>Z1Gc6CijHWUwU{uDafze7veT=p;+R5lPMsG1X#^@i6zGRdz%knCf z(K(Dt7}YcS9iv7}q*T3?VS;In3|M+9bRHx9T#NHEn#AZBqa-XxRorw&&jc;*T}FRl zR6F02E@!lf(JhSbX7nhdJ&Y1CaWeD4Xf>ntjIJrO^uAwiq3snGx}MRPN{d^@XcME~ zF!~dtjw*GD%q4zNZ_VM}1HM&DxeJw|UZdIw1P@)eNsMO$nk7m$+rnH$Y$EKBDwH;>U`MoSsB04eV; zX0(~51B|X_w3E>-jBaIgCy=uDETdzLQW`Aj1V%ZGLO?3NC5-A>x{lFJjP79c9HUnl z{e_Vazq3|er88;=QYAV50t?M%^le7>F?yQO5k@&nt+;a;EnsvlP`Ydpw=s7=kjmvl zj2>m_XUu)h=wB>7eVG+^Jfk^`<}sQNq|)tYbQ7aT8U2RQ5k`LpQvQ9x$Z?^?xfmrg zN@0`+q|%+vXepxsMmI3p#pp1je=!<)k=3IDK+5tWMy)`q1}_0pKKC=al%)rldzI0f zK+4`*Kv*(h_H~Sz;~LO{xw7DiVx zdY;i6Kq|lQGWs`=O3ks{LZv{;UIUPd(ZbSIjMlL9As`jwPmKP-Qb&_z*~KUkNLe1s zXcD6m)?3J^4oIbO0g%f1N|vr>)XmZj%w5jtn?TCS4XpP=mfpwcCyaJ6dJ0ITyBA1V zd6$uMg~iQe6b4ectY_2&q)NP%(OO2AGTIEJ;tnx)Eu$NNlrOik-cu}nmeC79%G1|b z?;Ykuv(-ObKuRxz(KsNL#&jU%^DIV%jEWdlFgl;n1&l6Y)C{CjyOPnpjP^77J&;QG z4~#x#^bbZ~0;#g{v{;tUVstK}A|REcdLU(a38NK^+8A{MDNok|skm3MbcoRnjBaLh zE0BtDH*@zh`Z18Q{4%3Y8Kt*c(#ebp8I>}sVYHGF?h%`ow*qAeno(TM+%1eAWb_=P zgFq_A>1~#kTp(4t1wg9Q3K@l2TF>Ybmi9B+1f=r24M>&Cbu7J+(RWyS7jyS8+6|@2N8iCG4TT2wpj5-)~Gr9su#kdMcwS${k`aMQJWON^+hk#U!$AFZT zUorZek*CX&W&$a%&R|r)sE|=9kg`_=q|#W<(iTSTEbU=#Eu+nh1{ht(=tf4jF}jn{ zqd>}oCm6lT($^XNhSA%M{>11*Mt@^;oY7Z6Dviu;3x$AGeyf30S=BMRkWmw(iy3t? zTF2-zM%x(eV00a$8yVfk=uSpIV)SE1yBR&r=tV{c7`?&hO-8?G^an;CG5VO%7mU7Q z4#|{fNRO!CQ=r62yf;qj<(sKhTug+jp45aMUvfg4w%UEw6 zqw5(x$mjr&vhp@_?=kmxAm!;7j2!(I=VFx1D1}iPkg|L_bK@E1uyhu4a~YKYsr**3 z-bE~3!Duz3E=KDaZDe!>kn-gl%zcy5O)R~GxgRik7)bfDi}m)g^c6Y%>ACxhd|1gPgoDzHksw; zVwB7%g;55hEJovjlrK5VO=C2drA5pwU{npHd|A)v`;30Vdb=1s#nLw!{fklRdduE9 zK+3BUAk{V&GOA!rUt6XhTP(_ZV|Wn0t@8G?a^323$hj%=IyM2XjAQ?kIB~ zF_)`b_VR(0&pB=F9awtH&%aOLrC1t0QXF|thba;m?&U`lSwe@0!+mZ6Nwq3i^AXI2$M!?!~8*>&IOoF5Alz=&6W4gh7Y-4UD26>I7{!=gr(sQ-~8OG;XgpL44 zblxHzC`1@~Hj*BvjWDz?<{qVH+6jRPmW^2g<_;Uv0)`&Ejac3Uh90SnFt>uC zhhZbk(_rM|t^y?wdw5Y87j!jcO+TGhVqa3~A?ij0ZuJiRk8;42==G_8n4< z`_j=Bu2(A;qvM$IaZF(x zvm}nWG>*9`j`>L(vpqpp$D!+_YjvPwQGMgqKNKu&Jl1b7gC<6|{#s+B@-TDP^sU1! zFSXdV9=uFRG%hGD3Ragk7WK5RZSAS9&2KF2t?lpb?&|4lZBaiS8b*hI3?+a17H@;) z(La_NRt>)t>g{W9UL9)cZd%dafu9ENi$H@-P&p8U>KjH@>d=%8b-lhE5j%Z`{S_l79KbeEd5DrMyr3N+SMb5Ha1X;Cq&F$|!US@jxh zX|aBbYBrrXxoW&zeO65TBCZqthZ>eS>up>Kr`uYa=vSzXJ*_mtL?zs`qBkmpl5L94 zP@7#G;gN)3v75{Jm;vQB)SGIrOwPwKUQXM7#Q<%K{ebFeF+9V%DZ*5kF@|?~g8A{00{7 zCdPIbx@Ti|Q{Sp6-ZFs%q6X$D1)M4HLsmP{(%&6LphcXd&G&Y8qZInul=6tFGiS`n ziu&ZuoH=WH?yS7rysWGl^e1atE{XGUb7$t~XJyTrGc$LZ)L%ZLT%)-f-jX>%6DuTg zYSA-qq8`TlGy_w$gP%(U@iTm7iR$Iivu~0t$MN$_{4N74F#6CuyihFP6Fmc$f?@t_ z5xIM!XW^u>2XpYrS$1XEE1a5d=PtQQh>uPe;w>}X_c0GF6yEt$^JdxVgz@)9-DWSSyB# zvYkVP1w)0N&kv2+GjK#_nTit=+_|WB;3Ln_vh1{>-hzFIn~MzWb7p&Cey}gweU#E6 zKr;F*Dr8iEk{=2c4mz_17zYL8Kc!&@~(dl9MJ~zv*Ct&M_smZeegKRX{Gl1amYvmVwG_z zBKP(lcgD#;>^L zlJlX2*(I0sRVD8_4s)bTGktQ(vNA}H?mgjnUHXTs04GaYRwE}Ja*{F14x$e}xA$H5 zHQT&m%ZU>=bB>X?0U;-P5+$7!VCQQMQAv{?b<~rl<}j5UU#Fy-O0?D--V)XNP_=ve z8_C-~fEKcmKlt3hyUBfLZTY7o`AXW1?Ou2C_J{CIF3Hr)a``Y|wL@5ss;E#_@~(xa zAO6ed2lpI3WpE!%jvIV#&rv6eEqT|TE8eB|4kx^hrgp~Ocby5(ZMiHt&^x{r1amL$(95 zxBhwfW%!i+S+W;eZ+}9%2xpNZxbp0*L#30G1ACKGin1pkN}>d=*_b_fA4Uvn8;6o) z0_b;#W{^4XR#n4FzARMo5}uD5IzK?I<(E){ce&EX*_57gDjzzjhmD;OOHrY6J2d94 z14^M_;z9EI1}MDsvd!xQFt&K4J7@Oexq5)kpdJoz=*GC)q~5j zsoT2g^fs_(l{Fw<)B3li7d2k^JQ}2xOEq2~KGKgKzYuY_p$&?APw0D(J19P-JlxnN zdt77yIfXjW5-1Pu8~9W5kn{xz4q#P* z92n@z7s<-4(GN-#2NyccIA%7?;-Og+^reksfq$Mjam`v;#nf?_5B*E>ZBz-r$D!)* ztpmRgrJk(5sD+_*wPa`gJ~Spd@Pe$TW3~T2aiVQ!8?|U<=W1k9nx&RZO%L@hTl8D6 zkiwx?qT2D7hhKqJs~vxO_&^)#STAzJk-ckPVS{BJYj719^Ln zJ%!}W{6$y7vF0zChYOK>FI2odKi0}~!G&(F(PdLM}J_j*Nf(p zw?{T0Yc8=dJ7cK2XdkMr5N7eMhNA+ix-?a70LX=GjifUe$bP9PJHwE|f#c&g-IM(I z#_T!Cj~8XnNPfI7dsgz}<=NAz#L|eHOGOYMm3hSZlbkLRd zq&GYV9X!}JsVF

    1Ijd69Kf-RRNOQR0Y1hufNcqslFEb8J=|jT5%TT@Q zuyF^uap3o#{O-`Yogd!VwzGaQ%@8*ZJ&?T>AraNWH#p-)UU3Sh;UA7mk z!acMtn{KCF<4HltIq0Er!)%zvZk(UCzYeKviwNxa0r^M6=VTfVJ%Dmp#CH}&H}(2x zvY9<+c3%Uk-%Ud;^rdXh@#Gu#;5`5Np@A1Rs*WQ2=k5xm@+7(XEX{+F?Z9O9O}}KM zuoo$dW79D$r+Edu&q5mBp}y=i?O^gQ_w14V-%8$9sLd|c`o9552D*_<7+I7l%RhO0 zKD>&e?Ggs7$l(l$tOcknx?_gP5m7XM*G@64g8rvLF!o8s~JYNgaDb zjW0vnvTuOazG4rhfJo|uX->N>DQpRGY3RQYOFzxnd2b9JJvs?ypTr_d0Armhj=e-< zomz}we3R>!V>gpCvV2v0E2KfI*R%Z}$=jB~;x!%FUdqo@GP7^+P4WX!Sd}%j(7pXY zU-suOQ96AY1DCZp`bO^ywU9FyO5ebjnc~j2fy)}OBX8Rkmn}HMk-Q5vgBe@{W?4&; zucSiWQl352Ik4Zc105W#FJ%WbK7WY}^%;m?w@$@^`qLsy+<9_1YQI$CO${pHO|81$9EPXf#h9V zit$B*Ljh7fci@lS{)xz`N9MW%9U$Z!#BhwfA8o@)Zs3K&sCGFNsv{3DQR~YX3RQ34 zvwjp7f3R5yn*;l^U~%q;kF@PX!aKXwH*bycBlJM-SyT?l)}W|-}t>hp?^J_a@Pw47!P zm6Q*yD?k_hCf)QMDybggMc&}^G|k)!`kLZZ$hjAY+HU~u1WmY`3WF$oySFHjbEt$D zo`Wxv)yr_U96(%6W@)gvoGQ7yKyJzsz z!9z!H|K!Ap4{wzH?ur-4XX_k^b?H|l`o<1?RoOQh+LuV}OQ3zM#mpzA(m%VnBYE2w zh-aIX9i@p?h8%vBPe+jf*?zI$%&;#wkAm3y)k$Y%Xay8kP6*6_Rwhi-vWvkEzBuqc zrezNbRQizT!7Ta;Jh%rQ4NZRV2)Arh!zch*m(w!HqNZgT#LH=!jAKsA zOmF10jJ>JLUORiyn)s#n2a!@hzfuGDpezY<=^a}Vlq8iBExlu9vXpE~@AvIXZ__oo z^p0{(=8w8848$zGlXrDwuNyo%ySTG&n(~WQ-2?CI%J0{|qM}pvXBx-)kL*Z}YGJ+Q zG05Rpsid`mwB&;R>$EN*E!d|7PHwA*v{1)iuhmOhbjJExTYaQuHmu=OL>DBt+;k}g zh2g}>E5N6dWi;)^I3dsbeICfwr0j~g^ou{3Z7chV3$PTD&591Xr|WF6A2u^&E(V-K6d zvU&ZkC_8%y6F-T+{)EZvD0d9gT+Op{Cg;4ZcsRQ5na3V(D{Pg-h%JJ4$S4u zVi-7Hi0c#}x9{2H-Lf&eFmE>{oxJS;{_YFOxs{a&+-dBNj?mrVw5;kO;*S>V&+;_aKRyaFjTj%qyP`+h1btZjCO_8UshQ!IF(M zqh5iCR^23Tn@r`fObynt*Ilo8VGk_HJg9DjewVjrFhnD}D%3?qfU+FOBPi2U34^_w z8e&d5fy&3y!3-4Bg2Duui-F^=)g`gW7jGr5OUNM_I%xWiMFsKmshsE`9S|8rgaFbA6afSXgaI()EXpnh z@W_r0vj&37IRAS_>In<%?!?jvvTs23`Y?sjpBgdoIj%>C`@-n&?TWvL(rv_{B zvLmnmn>BKNe6$1jSZ`#?Zq3j8vg?LAvX>2Q%w9fpQGuLQCvUr*EFIm^+%R~2NAnW! zLm>|)q`kOC=c5#9CQD_6FHTWS$R|c7V zrBvU%!Rl)6ZS%gi?S*iuq;Hzc|Kv#9hEajJgYB@o}tJZuU@+zZ!_PrIX-9F`Y9*-b27i9d8>S^ zGK!WBhfk(I9B*+av*R2w3U{pw3n4EQSt2V7738H4J=+qW=^4t-mh-Orci%aKJKX1B z#69P?$)$*&9|E2a`5fBP8@LEZF~aBNIaI9S{;t7u5;Q*IuZEXpXNB@+neWTanzCli zn)UcQy`{5j9lm>eTk#j~pKrqkm8~sP@LKie)l*h<^>?;3^=z0o4Z^Q5dYV_wLnZdL_ak0c)|8d_-?FZ$r)^4p)|9I0SyS3NyI=>}eN*rz`KDex$0Ix^ z*=^H&kO>=mVw=qw*k*Goy&t@HD&CL3wsmSxE1v%8ZJi1&I;Ks*OTY7TrcLSX>hEc8 zo!ZvbHD&$mnKGvjn9o)_oX)n6uBJY0bz$Jq8R2jky{qtCRF({AuI5!uJwhLYDs=X? zU)tITjq#&rAn0(O(%;$JzOu8mMd>F+M9&-zMj9}hO3Xk{FnpMgbapst?seotC zpm5emazZL7VnTp2Nfu`2lfuL^S0e0iD=*_+b)Djr5uVU4MoT+|>Zv$bUW?u?aa~P) z7(m2YrXg1=7F+JI*)#M=40s>C=Ss zE#DWGl!EX26A)LY*EdU*nfbzb%$JU!+i5sYhiU?)9sS^xF!B=8gibZ!!ru{D_>=fH zVk921{Sju~T-R!JO-|+~Tv=5S#$|RDD8`e4MM5(Ji)%{j!op#OYQy1$LYIO1%G&zs z>Z+PL3~)}#lm~0;!ZkHjHTdO#EE~D)EA8VdT;JBoAv5h$@-=!sKt`%AZ3vgwEvXJS z)>kg9tXhm^dkkM%Srl%_GaZVkOFG~5EQX$K`WT_BgQ11tBGgTcamAxXj9~?+3|EXG zSW^>RQa@XqGAs{E?qLP6lrWs27%@f+D?p4yF0rsS4wtZ`-u%+KiXaNU2xphds!FR- zM$`Gzr&$FSP3KLUjsjzw6`H`xSfwqCC(foS9Yr_Pl+3p(Axax;gH;Jpbda=FLy0y5 zHfYsBly<}X5;U4PPrx=<5alt)V`!>#GvM_2x!OBooQS7k5wAGB5m~Z;cM96fQi6YZYCcmwRJUB)eFKR-!8!* zyeKSY*vU{;MMY4|w3F50n$oHwG0V=@N(X1#NfdZ(c~xkkm}BRQ^TatZ%rr4KhM6u3 zVwij}FNT>R&W&Mait}QaS)wq8nJt1b%p5U4hQZ(%ily>IQ7ko0gzZ#yO=)FaZKx(3 zt`x;~5!kBoa#>iQO>tbVSP{pWJ+s*^kfTIo3~8}T zgVojLrJ-P5DF%yHyQsQqF^a3rPNJsF!EL2oP@Feitcs=bMSCnYLtGq7%@nI+sac{U zmYOZr#8PuaXACthS9HZv*iJ5%nkFuZrKXFXSSnxi+Np3uI8={5)n}&{gv+Z%zn!ZH zSJsQQcCHpZGE^tl#jtf%)ndJ!3zh^+E5!yoSzlRHB`&pda7SDgLseBT5gYAXH7)VP z<#w_dOEIy@&Q(zMHru&HRps>+G{9^bj+dSP3cCc2M4dXe$MLH11Z(qibH$Z*DF)7P zO{Hv#!SXzD)z?U;i5*`foh}ByMw&0a@io#JV(4q6GsV?kBb_C#`5NhL@y)N1&Jowz zrRBlOl0309o}4DGizlax>*L9M@vV4rhPWY~oGEUMCufOo$CIwPCS4PR8@vuy`U)NK@=5p?2Y3Z(1@OkW7P@r`FK8D6T)0WybvcT57*X;7vty>T)LyF$xCsPUPF6I(JR;s7CtifvBhKvQ^D*5z5GO_CXoZ*K6x90Rl{j9mH+~*RtF_UqaeS~& zycS1>8$xhh{7;+!mosb8VZ-9!aH5(pvQsWzA5NyGm2V6u3KkWKUkoQeU#P=!tWNxL zI4RFNe>I%coUXnZC!@KiS`+>{PNtkZG(3+MQ?o=IjuXx=tqel&n>ayLs1Cm~|7{#^ z4in<7ILU%=L(r1`&Mqwv)zy@XBQa#{f>KQP--%%{x{G&XxRUx(@drCsBTc>+Ln@Q+ z$FOAbk1-sX{8O@RsZxO}OW1hXP6q3XFnbL*)ZtddFp}z;@FKkLWf%#XS~c!A4I`nO zfWjC~A}2_$7)eFAs1#>AIlDV0Mz$DRE4X90iePEENQfcPwnO#h@_aQSR#a6{jfq)} zNQ@B#LyfgqPK6c-PrO7f6_et58eql9c)qx*W^u5lNF>LLWJ!7B`I<29I^g<)FJ3gi zs%l|Hux4Sc@W%+}%acMShC(@aOgX6-Q_et)u&A__>ZW#aDc*D;M#V@M&Mzu0$7Hpx zs-y(>ct@W^ER#(=i4cjV#fZXXG;JRf!`7CE!_^`^hQ)d+PmGNxr-_VMlA3Kzcrnew zPaRHHj7hsyC#S_I)K(SO$)$MaFaou3&x(=AvGep85|;xcKTh#jqw{qEJVNDA_p54~ zvCB5y4st)J>5t*+ue?iy?X4x5Fva@-t_yqVfg$gRsooK%3E}ItqKwG%)3sqR*sy!V zG#}mabo#K}v=}knLvP}8`}#Yv%{apO9=dVn5q`2XVurp4swv*YSqW2MF>nXn7@M6) z7)o>{dLE#>G@Yy*!gx_666ffn!AlRV*Bl5>@oCK^|dkn9e|YNhN^- zU=b+59j>GWiR-~Ree~W0kyI)}Zuy&{q%s-s_*V8~d+nr!qsf9da2(zxmCFoe`8u1{ z{Fo{4_#-^^>wbmD;yxLlhS;j8EkN0 ziMX>NmOEra;R2~p;A3K`v{2~ll-sjoBXuZUD3ywQQPf45SHsc*UuSP?XD{AYBa)U& zrE+E(t&O&mnxv%K$Eqt%y&jS40%uVXwaCmi1QICFDgzhzdgL2+8e7+QxA!#B4(1}M zP1fo%Uq@?OUn6d?(>r&pJ-w4w$#~0spjX99+og1c&mPNW{bFgo1=i^;8mN$tL~0tV z0-01HYh<83u!{nnGH|g}jdrk0n&|N1MIcShtH{PBBkA^Wx39goaV6f3gjf4?_Vsji zbYScCq#h~j^R>{MNoXH+G=tVgbLaA;UMXGg!&^<(wc-^T^iq+ezKm1H39-@Ff_J8n ziM6Na6yk{p->P-;y>3bCPYoly&4=e1kW@eJ|0i84i++c%lio6yv~lc0C|qrC)UvgE zO8wLeY^@!gz*8f;q)Xk^_cUwdz-T&?@`D_5?#lOW)rvnx7_O+UTVmeUi4m1oEjI6F z#R%w3SYKh@(Tb53*JJXg%aeSJWN~Q?-;ItDRRkNX+tOCYt){Y7FKqFw)@#xK%#4mK z*1lt9v^HE>TUFCoTDd4#juJ61X(-Zu$J*2khG-3{sX2(!D_K%gg)vZ;u6ol;-3DyH zFmj<@fMm>@U&-fck7S#r6sp1;4%c{bhj*A;OW-m*Am;VdGTN1r}UGYE);>#%kow7*=ypX-yq&V3;@J;!~Jm-jR!y1S^6UR8=;X z*H_|>?y#0is;Y2iZmg{fV#Z|NwTrbfE`!71QpG=6){`~s7I@FiFdq(+c%7gLQHzn3H4e@b?$+;P4m~30tXi6NHV^c^Y zZ8*NCm{K%l+@*2FHXu_`YJcX`K5#I%#9(Ei_@9@A+lQG5<`w=IK;(NMh_Pq&?X`Li3(LC`~qFk1{LLWIIk$A*V`mq&>-GP32dl zlO4ZT(;p|JOR*Bm_K(uMH%+#TrrM0A*^G`cjiy~qo~5ghCr#GuSQYY)SugwHL=T5QwI!oC%Gdn?r z%*;+yA-D4DY!&jPeL`8Cq{)WlRbEb3A>Wwh4tnFC@J~^MKTUSk92H8TOiYc+M6Q_$ zkxriZ^ECYj6RN@8%q20?lDdDE=T`DRU{r&K;^gYr^|xu>@33>LY|gdYoV(a^4wo8) zf3@YCEQ}7zH`&U1E#G7z_L;tkbV|_Qujvz!-qff-XK4eS%YSm`lBAp`o zuhI1Jh&T3GnTP8&?_+G`2Ah=|ZC1W*m7rSC`)|_ZirypA$&mkMOLPibht&T~^V^s`!CbG_pPa&@39&p6|A`=X=Dmxp9I#n=*=FSxt9Y%e zU&8-$W!N*OO-|5+|5ZiEbHi(DkP6UH_dg1!rJX~q=Ab#EiF9(o|GK7U!Gp0!5yk^$BDjYOZ0tPqJLB&_ZYk@wyB%upO~;%)hR3Rs8yY^0*_hMDI3}cT%DAx z|3ma1q&n7*;WO9&iRKOETN(e%=EL7CA0|-o{ay3X3eatqdT9%$Dw_W#n$6NF=5w>G zsoam7B|WAEf-h7cYfK9y|5Sl&RU==j&;&K5_?Jpbnn%IQi!ZH)Z+hVYLy{UU!e6wV@lPgOWuq>~H&(;WI=$sc<0 zh1Y+k!@H0DnPBs0qUjIn5x@HJpY2dr#Z?_lQbG)gWXC_*p>Kwnv5z2-?VslGj>Qk2 zR3`InMrW8t)hT|aLryr|s!PmrBvLew>JpOxWtT8SI+^v)cIdyPH10qy-2QnEZ!@QH zo-K_+GYyeWs{Wuur=MSqeE2;mO4)T6oCv1j9mn=$KUMm=FYN;sMY31 zo9V`wHN9v}D;+7M=*DyS?~_4_?qB85KS$tHdMn3l{~AZ~!Z|{mCguIW;f!*z~yn!cYVr@QMN=`?4~T(_!~rrR4FV`y%g zd9gbAUFsN3lfcZ2)dcD?$7q^(WnL_&EE^r8Xr=?9y!#>impjsE@{xIQOY7S9X0*jk zjx?GNP;~h=Z{gqU7(?gw%w}bOi{n%}DQ7lYCa!Q~(y1`B*)p-!kx6H#%;w1HV!&}a zooX_htr2^hBa;T^%qA<+c1Jpm!pdBha6*R=*nzi=4wX0GmaGM ztC>8~e9w_c6|e4&Ed`SOWtK>%cHzI(p@)#7dD%MU+uD9;oD!~R>h8ukwGh?cSlNZm zB4W7ts?asNW{~FK4m-C1^GjVgqb-V*@9L|NjJoqy+S%RTXQn6IDYtr4@vBkaYNRYu zZugTr!iQxq-VZNQ?vSe^r@F{uiGxmeGSLcX|Il7iOA7$`41AdEr|j zQtp<}?OQKW?vc>z+aOZzl`suA*_v02l>1~TOWxOO6)E@2-~@9Wp7J9Z%$0Ysl?6~gjnnMiq565YNvIJf7Cl*eRnJ#JaHV2=n8Kb6E5lb9w_c1dD~NlX_h zk4s{wN#J_eZb{rM-A7qHA%l0wAj<1W8N63z1LCJ-_+b@>{An59E!E9ib|U2&N$ycf z%>GQW`yWeRB!1#tSD&Kos=iLgFp*T znkJ_uPPE{p=@PmFG)+y)mjRDG*rq`7)G6ztipl{cTw`kd#TfxF7`Dp}Hb0lI-F0+|@Fk_u%x zI(@j4j0z5#d8OHM(tJ5tj>&73)ufRAHl<3Z6WpoAbk3br@1Yy;K1?l>79|-dF<_M8 zVu>ju)T|6=9h3~`Gl*?C$uYadoF~AJCF>ur0=HmAmAZ&wW~_Ce9YiBNqYk!%x;ptpLi8?0)Zfv#1A~T zB9In|AaDLA-IMkc&>0arvcZH%x_|UO2(x^&J&QJH=A@+UGP>m zNqZC5LsZ~Xd&!8T{hmRD3w?6S9+C8l3>Nv$rxRz=YqGEwkP|WEd(!LP`w*`jb#pW7 zChKBz*Pur8Ub^ATM>Y*7J?(Ki)v@6`AH+DrxeQ-t96`xa(I?94hZ>QDsjMw>J@5!B zZ%J6}HKcmR=|WJETjX6t(qki3)E2p$NHY2kk@An3TqV3RoUdAPssSaZ=U@`)55#{a z@l(K5-ck(G11xP)p{qD_ZB-5mYGlCA%Pk$M1f_E?9xAci3R_~T2qmVc9ALZ!#0aVm zE459eO2WH{BMZXsL+Bm!tWN42 zxegIHi{V+F)N^FW8E8NnsdMF8%pEvEfdUyA;lnc+y>#(1b)FIb2vdil2TbTmkJJTn5mA7rOV&2h7C<7k)cZ}S6cQs+%SPRRK#}#B z4SKd*Vx}(iQ$^sZp8hqBR+s1%spZn6a$gixG3q<8K+p7GR7kCsBW#_opSH51#cFD; zWExPIJ#@n;wLa?(=r5C&n^(1Ww15_=i=^S@z6i7U^t++gq8?aDT_R(x8m{up0dzs? zGB4%bw+e4k5UCgWsB5ZmKef>u_ss{9&_ddp`a7VtTngO2_?^j8o4jAann#YWsVh=4 z@VXJN9GukvD^i=iv%m%9;F{W!cs>GYa&S#;^>iSRVGd1}ew)-+!>4r)7pW_~S3=hs zMkD;H#QVWp!>Psdu$tN~<#JfHgrVr+HTB|=FTj8tUM&S0W>Z%u{u#U)W-Wm^+@^LU z`bx~<))K`GyQymubD>h8hFMEVq;`6WK^OX>c2i63@+<~dgzimU%W%Gp7G*g9D*w_D zXE;;m(_d;2vh&*eWap#?RiR#AK~KiWfi3Ef98c_jVD=@%k>fK}or)YiD(YaR z?K~3GAH;b8aSZ1;5|KTsQz=R$e<7I%VgyxggtbP)#T1E#II2%2rjZ(vdPqX%s751_ zNCu#DHR;e8O_dhWf#hK;HdR|h5*eti(fVaek?Jr?F?z`U%+jGsjM6d3?NqQMs3IdG zcrcS#s!GX%Cc%jH zHFD#w(iXWH9Uernv-Q0ztc~#;F{1gHuJ?6y^{uiL@=m6pOy_a>bF~{H=@+XF#4I;L zcxlfH^N~ZtG#H~&i+2GvbyVUBMXbpZhSw=>?^%Pl0=3GiX_iPy(1HmgOEGS2(eVa^ zkgB}EP6`ysfEM^Jnt>LU0Y~76Bq^2w-Pg0SzgexGd$BYQcDBg5ArjY063M7Da2CZ~ zAk|L^T#l2ORw@JLyBAJ_l6e)_i6XCUUxT%vEETo;AI`5@nNEe0GE*y0s9b0{S}Cmv z2K}Cr5bHv+ybtybxpU>8l~@TYzYL?N)2li4!Xi2;XMKdAd zB@|kvmzY#oUaIFFwKi!J6AM(3+yl<+hbtvNLtO$QbF%&DD%@#>PZ6>`MfQ=TmUOW` z5A97SrIe{!N5Ym0oSyre)ozsY+xvP^0_quBI}I9K9yY5xE=Cr7*qkjz=M~@UaA*#h=7^_=*EJ3dnP_C{>-8Chml877~fLG+k(y$t2E{Nz`|)#v9E#QGy#~3q1?U<*hBj&h|Az zyId+xRMdQV(WkQ&yG3i8q~L4_s+(G5u0U><o%d#uGgs)Qry}N310&ER^VlFLc392o|4bf;|kQ; z_Pz~5`?k80Bb=ob^-(7<8d8LIll~f_pE*-|z?fSl#96&^^cUJgS#(;MKv#vdAE#4q z#l=$XmV}$CG5XUU5ZZUrE{LN2LRf=QfImR0f2U&3^d6f0BHBizzS0pu^W471QgnjQmKjHM+D@s$vu3^ zXq5UY;h{>r2bq)I!hAuRnmp0lBf|k0}<#qXgzcXi^d+xo_zWx6`zu$$)`OY)XJkK-F%$b=pXU;iWF<-Km1v6bZ z*0Row`DCZpSL5vLeV{vMaltue_QuOH>rCG?j0-E?YE8yzE+?d8gjpeyFumIkF)Clo z$58d9fR%PAiHz%+mn|Xj%G2;iMLhwxWAN=vfEoX+v;#`S(;|Wy^|F9kg!mG6sFtk$ zSi@L|7-OQovYK{D@|PluPbPG#Ufp3x+oe?JR6&EXUMb}Molf(3_bSr%t6UAyxtP@& z7E>cpA5ranF!?g(QP&vi8e%xhVy>Gy`-E#!nLU_>J;i(~%LryE>Fn#MZc#%2FUa>A zEJ=KefB2$5D@qC0yy8B|n)Hp`k3JtU7g?xHXYqfeHCPnL;s-J-$wK+UBA;yymIem! zsixK#mZ;CQ2I~S!)lo8$JCRbA#B41R2J-!d-bZfrM_%2*38%3+|JI03RF^2KV4Z*8 zw%2L8NZsZ^Iu|t(6;jH)c6kL9t9FUy#Inezk3*A`ffJaK1R1@>5+g=}?Ny#e> zr@rf^T7qk99{Fe1|r{h4ju|*odGt6ME=36KZD*|N0m|XHR#|8Ep#?H zRr~3z7s6R-dc_^dyU7~q5!s1#+I1mQq$k{-e79s%YK(6x2VL!(H^`@aLq64d zbi?sC<;zu54lV=(U+SqDQ1{W_k?zx1jTJd$Q(cETxm0tB`%rk#LrNr`IkpnHaELww zEiUqT@!)-S|28J7o<}9JvV7ko@3r0T{{wQcZnQ;gKEAJ*_pDVq?vK{d=||Ar*$MsM zCtpmLm+Ljm$Uy2_in5mm?Pbu-7HwZW0*}CqQuCUn!5p4Wfg|`rN?d+*Bf<34xCRf} zYmj}55|O&tvPLTrQ-Y(F2$1<3rKU(zf)#8Bfg{1Z+O`e2AP@Fs4!noj>V=ShDgLmq zkHV5Mfi}x^Qb7R zod94><1FT^V|-je^&J#%nbHmg)vIn_NWsS!T)Hc5nQ>PrILdREE>>6jIPHfBL`-Uw$F{oy2e*nv~2zh!|=RK`xC+XDTsIb!z z3hu1I`}Di13gnu`fME9<&%xumAA#JC^j3tzS{04)d; z`AX=bK1j|+>@m~W+j#hQr4qGOj1v`eo+{4&0UQ~=oH~6v( zLeWe_&H-4=$hnAI0I-#j^AX{i(RGY$K;&tFClK;Cd&-7FnqOgomH&M&X=Y5)S+pg1 z+EB_XcXKf76M9p(KcuF4Xq&$UEp5i?)=Q*&jRbR9e_8kD>ec1L6?R($L{B(?h z@m7AgyLRC}Vv;6Mwm5pA$JG;}ksvjd=W*q!>X_njmBet3Ay*R0dZ``$rcb`&UE=Z9 z#_*0MZvb^vveD!4>l??^u1eC_Gaw61>fP$zNy5uLL0tRhx{Ef7BE5Sd5x{ ztK?WG@{5diEC0_(=FIo2n4Ec5zSBb|W#B~dTbFO;5A~8p$0X%g`Ln&GSushuR(`ve zv??YEC&E=;((ag~(I^0tI0c{y!6S#ag#d!ik@vT;5H>gHlz!QQ_w$3zR)5a}$sQc+ zzUy3^xp}RYH4`qHj!-xlk>vo(5Q<6=Sr5>Tkl!;6Pdj6H3?h%etT1f^k~oGBk4>Wf z@W)@;$iJ!7$}jWy=Ed;k#_-Jo-+(sDT1`H?GO!+htLz-BWQms$Az~G^^s-h=7m;GC zzr`%unZfQU)hNyrNaE8a7a(SCz9aitMiQX;ZGg8B@-Ir$ zrhFDR(w&kAyGbblC zU{PLO$3xIo-CF>k)hgkgPF`@TRCofZ7`AW-GuayZB?b{*|Ky*Ao|04f+q5V&fD@_# z1j0MOodo}loedUFtn)7bDBEONFOwG@Mt^HpQLH`3Ir70aEB|(n;j_*d-rr`8eHeyQ zRLLON$7?pvK5rk}>C3!p@9kDu++bK<(}c}VYBfhMG-CBXtwv>ar$4|tIuqp{fsy$DBG`;d-U740JGnA1&5-zTI;4e3W9 zmFp)R?7ujAr_6M1)F)0iZc^vugbPpKS|71DDl9t_wenN+qPkWxopF&`$#kkBwUX&H zMQSC}Ilw&S+Q+A8A6Iak)#eN^KH^ZNNrPj3G{oG#nv<0JO{TGV{cAzs;+ zc~O*|3ve^y+9EDf&HPheWytOqJM7r3Ub|l{JfJ3`VW)_bGwqJBGoS95!d*|`UCBx< zSBEi*VhF?sf2>a^08_Z zQL>K*>UbF!I1-+zCw<2QYiM=gNRpmFJ{?fTl%U%gkD%v@&jb>w1zphgJhOnPri{M| zsAj$uob3pC%?%B>NV4o-1=L27Ux0Qe!YpqSLpAqJTlTX7^&S)F$l>jhqOEx@(3O|9 z&XG&E&svQZu^M|FbjtHulXK+q?Xy#pFyf$r{;>|C+n1NuwOIDw1FEsBob64eRi&2w zb|94(xy+KEi!4nT^R7e|c0H=cM4xx*c6N<6#?lIp<8I9n)RRgzl`mO|G&5qlt=2m0 zG~`0=%XRKNEXlm!U`|nw88^IZ*&he`J_(0Chq6D7kY~!Ts{wtn>dJLEkL z^~ye@J$U5c_7L8}j8v{P=z)0+VgZYPcTm@F0to}4OAX9tgmBLqK@H4j0gOjb19K(7 zEQI`vk&grOHChwg6I2rb&Yo{W8b{{iacT6DZ)kqjV>}tl7&|uq4vZX|6B_i$(Qd}( zzj_HAPBan2U;a~Q)g0eS$nKjj%J`O_m#7`J%;N|i*|*)Bz=Ywc$w;n5J?A$9*Z@B; zlAuJ@*@Ud<=54y}@XVCMRdQmGkD^{&(TJVc^Io4532U+Uh zYh&LQuzB(qBNyhe@com}pqChK3lv6mleY!tdT!S~yj}b79+cy5gt;yCt=ySp-{C#6 z(TN#)-OX4cTY~HxbqhEN3zC%;jjK!xxG_*bD}DnFzedn4;Ko3eX#u=NVqT#HIkns< z!x86vUqJ!=GzM!Yc3x-Binh|SFW1)bV_bh#*4>VozFtGQT({46VA-2u z-R06gM-66cx;${UXVoaaAPVsfo-x{yS87KlhjIQR6tFS=3d%6uCHv7p(iKps8e}fg zhasp2SqpFu!bGyE2Khb24kD-q=^S}*d;UKmhfV8zNa(z26`=94XTT{)JJt&|TX43UFy?yn%X4A+91@~B2OMEmAA z3Uxn%9%qLJV%KEO)Wcry1YDaUOi=goh6U99up$uh5oTZ8TYow2*7G3<6=~Va0zGJo zbL3Ck@;^i>ZwFj~RCOgKcaUcXyq+|6j44FGSqT2WKeXVeJizMuql}zr?G&SonQB41KGz0 zaww4SCGx3}t!G!>gV7a_k6V%Ykzg}`$w4{{y2!z#G|99+7m z(}PD|(iiz0X;D^O;(6v=ugtlJ=A0Ku?$hL%^D1=wnM!HSzW_dFgytk-q)b3i<_rYL zLdgHAXU=Dxn^SC+Jo%mG6hp?BIEi-71Aq}U+NQgMf$+7~*idx>E6l0I%Y0< zvDtT9(z1I8Y<{%ypqjfRtu#-nH_jl(Z!%74-F&PixwzY#ZiqitF8V7bEZ7YHr2aW;UjxdodY8?0ovG)+Xao~aN zYG(2-Q*hG%N6hX5XAHnLgy)zHNA?yq2`hq>0I+7bTZw8CuVQgE=MN}3>@!;fN%8+srt zmp5&&y+FGh6GrvLxRo_{tq|sZT?0MYWO^&#{{a2sXs9H4ESJH550hR*7{$%;AkKVE z%?^U2ra3BJt>fXDYUec=+BLzu$V<|d!8yslAZ3EuqLHjem2wa#A*j(hA12sVIbGBv zkgyeIs9I`A`dS24OIHD0hA@$As+OKX>~REd`dFg8eLqB@3OsL*peTC#bMSqHpu9aK z1&dw?Rb+#=k%iu#4dzb0o&O#<=;Ri|5$EV}iC%@EO8SGF_u(kZIg+F=doawGc{QQu zM^V*a1$x>Xm8K}~TY)@!e~R+D6_`e+PEjtm0!ta0s{L&RS{T!p_W{q@@e3(9>&oz^ zP;8m3(_7Zww{4qif_nMjeLJ7$nO;74-=6;0Vk7b&wq7xa7s(smjrFqq*0NuPNUnHl zk*{izdhO$NTV2(6vcglkvcC3w@7}c8`DEG8KvZU%5%r9%djYkC@vJsznp$Uj&hAIH zay;q&l(Ko`pEos<6XX`bV{bI%z zTixuNs;{i8SJ$+jPqrdebl8DIsi&;2x#n7N%VK9A~+CR0*?ng0PSmS=9 z_{y8nTvHckK^J&E2fdZ9z%KT9)%Pl|C+L!uV{X>f*6WRWv81c5_QvRHPP7x5e|mW< zx8hc=YO7s2No`l_Wv41@6@78ddPB{MP^<7lR71{=kd=_i#&#@Z^!5u;^qH&hs$VAf zM>{7{Ug$;RC8zgxk>ieGwlHpcI+apuhaZ}{QQdUW$0s!!KUIxnzygv zCCOv!YoDU!g0@(*_4BbU_SpLQ*p_Iv{yw%P9$SBpt%3W|>#=XW84VsUY-WQhZ>?fS zKWc?#pQ^J?FR#OnLAsYCVNqH%Ja=Y9!*gSm2DQ%+8eYtJNNJcX8W>j^ zLh5h8awup?6?Qa7J$7K(PpI?F?uY5}*>$`N@kBP4yU+F(OYstE`-$;fsPQO>PUkM3 zMSSU+{lpTr1t;G9Qn|D61iWQGXmeCag#$1RMGfqLx&>-1dT=;XP^Sy{NSyuPczqon zT)>Co><6cNm+76=aO>RmHQW+fUuP=%n67B3z)TBjc;`o}IhJG8+)BB}X7bS=O!>6d zV@o_WTI;b!Z!uu0c^J<=wq27_7d)@>A7ljtj-)Smgo=*+SVuD!{7glU>1f{toTu5x zeyyWf);Xsyv#c!S><16pS5M!G*+V5rrI1M z_sbL82KsK7zv{7mFNRg$F2@;M^0mj|H%i?uPoN-kx14vC5>aQfQSM<|Q0`42^zP0l zI#BL2kiv5RGe!$;Y)|o$l90)-q6oKVy(B-m7?Ch9wX8|JYsKHssO}IV^Pp-5)wN)f z%Z;kbVr1ePf1j7MIVK60OIcWEVXhyNiIy_U9t?AuxC3av)3RJXd7O@ zxyOx|cI)od{?thuz7@^nk09R!>#j#AdO_6s-YEBZ5+N7r-5iP|+U%UP742JWA2m zh<%2j6unI<6)i|dLq@<)DH_I!xs__;@8?e1*GAD!uxvw6ik<{`lo2X=7vL>~iOi!E z@iM(Df>Ok7rAkpbC{qxOqE(#QTX#^=mrmM>Z4gJ-)q!Ohf>Lx7!1at!(X#+gAxvZ* zrRX!n-bGM~J~N7r^|Gv=BjBe>bQFplD+7(p{>n*v!6|>Rp_d$6N0l)kjC@GkOJO2>xZ>FQX69$JQ8%;SG<30KOJZj-e zU#gPFDh}45@q+PuNFJ~Q+7duW$b`QT@@FE2XY)g`s;vB#UecQ}NqT#g>BV^Gfdbg9 zqwKIsuJV%nWWBv=J@_Z_)_4X^;rD4&UqmLrpiu}#LlM~nu#=Gqh};bD6Go;Y@;tyZ zjLbviLx2wu^8e;3+ZSU8wpV@WCEXH}q_$T%Z3D5pDjlN>OYwXRi`re~v}Iv))ew)x zUmCr+ilxclj*8?~pzsCJe!y0s>%FAYW0KHgKIJ7%j7dTl_P&?2I3@{ePd(r@>S~Kg zLZ8T&t}^M8n55BGeiFKutw?%4CP~$&x=oX$+f8Z@_~g?I1D}3rbA!(Qec=iHt^C7Y z_T-(>1=QKu?7lPm5L5yehevza-L@g2(^n#wx&0XkkFiRM;bivPekbQ)W%~BzXvyff zXTd4<)$i`c$@Ml!y>Ppz2SW8Hh+u9~9jN6oT+|K60wjzRlfxIf)OsNc0UEu6F(NMlJkLl1 z&OCk_CKch_QxLhFc2yAp65!8y?#Q+Bpto(c^Vsm={e5$$W`{2HNwP!*m7u#Mn9I8Qb z(tMv{RsJckd?QWUfJV$DYEtW8YJ=d zk^>`^15FYl{@Y7;dwj!U_+oD_Jp?{BqRHg*-Cmmaf|tOXl;swGB{M;aTiN7P)9!Ac z5l%~V!l#70+dV?5z2X0XxQjCpB$ztLs=&-J*voRl6B5r#9G}Rj+YJl^*mpiLkx-}E zAaxl6*1otd43i0y1~03tvv%!i56&cCqN^k)*>*)5u18ZqihL>9z&)k`w zb|Lifw0p%nMa=ai^i6|)b)&hrDTtTS-!B^#>6dI-S;!Y=zEgWzgEQ&t(+IG6hYr*( z8|W3)6L?0R&of1t%si-flrsil$n+9jHeHLf@aFViPl&dQi3Mj7P&KYX*UC)`Xrm@3+PvFclouft zCn6Jdu_2ZiqcH_0eSU9JOGPgEB9bR7F;HCQw>(Q}o#J;B1^`4o2eXlt`yGazsEIc9 zO!F5AgHoc6>ukU1iZm^Jre7K>WtLwa39}R7dtIhVmYL$`NHL6iFj6I2bjVzPe)cN! zv?IKlneQ2a7R*)`RWl2`f~wX{)eHU1+TKNe9;_vL+9b;oe-=|nJYi!_3%YEnKT194 zWP24SZS`DTWteiRDhJOp)(}R&C{~;odYi`UI0mdEDz5)*!Qt-+wuSK{_V;&;so(3S z5--Eyw>=c(;eCX##U1?Nm3=!HyB}I1goj}m5+aF4D5}=`QS8?U0V}72#{{LKl80Ri z&ZV~3mA1K*O@X#G*W~vf3&A-{Wvb+1xq|bV|0N9{K>lATQI$NLP;mY)JTq-;zLACj z*Za}Fp2$u6c$|jdSVs%p%M&}uTrBq=0-Tgs{!OR|M;NE z;|SfYBOmKWV7l6N|E|`Kz8!qXb-_>jpMo%BIW5+5>Is+0Z^ zlf;KicIu>)F-fN6`uH@;{xSl5$3qA!qNrIO5)`bAW``{xPeX96HF*B3gK!f9TJ1lf z2oySqD_b4|A>AHfFcRrlN?V7(c40hAYiU&TH zgr;=qHYBMZdGsSldy&K^rDw5);l>HEOrq#aN zR;$tD2DV?QQSrc2+xKW#4!BFhQ$?_{yRuRStoKsig@T`W3*u#*I z0P1QS-qJ8qRE_?Cyx$-=R(MuN59GXD+5`?-gW4jz9Bp4Sm@vfhm3M-c!G2iqpM4Rd>Lz#7*<7A<95ln*pNIlor2 z7Vu!HOh?p_0#Gf?|DcA(AYZp=v_62$Unx0rDMRO-%e)V$ymKRY=bAj`$lb|JifaxJ zYZa{IVFNuMTk0;$;;icoG7#HO~#Ro#AMboquXR8 z2i(gH^AP|If1J~402M$p+2?5(VUP1Ot>RX_ZatZ)l7~ALoSWAR)ZR)I59c7@Yx$qjZre$Nad3?|dzfLM9;i+9EC!y&o@puLU1_bsl+}0E{LN$y7!y#35*+ zHvb?1Nw#fefFm0LrRL!*1jlOK)-NEP> zghcDet=mH61Ca#ogEd)?+EM2aH@qgPA}^%1S1A81H2SGM!m%L2vA}TfXd}OtQAv(j zN`{=xdfVv*;6dNFLzG9zz6n@_7_i3sST(&?*;&Pd7Ki$c*umYT+~^4{#lEbD9Hqq& z!JFmd#eE+LxCsHnCJ$O(lp4$8uEc!^JiWN#j^CS(J_SdCT7=+hN4g@p=dcwaV3l`l z#*y3fh}Yq$#gvOVItQ*0y*xO3nB@=xAQdw=pvmk%y;QTo$t8K`GVei^cWxx_+(_QI zbB)WR-Ia#q&dtjG%^9MY_Gv*r%SNs6b6hcW~g zGBM2{oUKzL^-Fe5jL2as7KklqV-0Y(U2hLZG8&Wu&eIWa-tllI0yFVAPLp}~_p-Q= zPs^!f-g8yn$`5hq3f=xXhcxbCZ??RK4lcTnJ&f5}7YFA-8O<@VEgVQ+c>WQ)Bhu z%1LC-q0Br4RM$Wrb@n+tJm!%v?t;r|1hV*L-78Y63MD5eL+WR%2FaEXvc5QH87`&0 z1e64GCj428fCj?@x0?9HBdUJfSkfH~=Pioz$51|URu&OmHz6veZJR@mI$!JQX9tk!O-R$EimVcft|JLo4q7S>r> zXEHeZFnMBUB3jeE(1Zyo4^+xi%4G1(Q&D>UY!uA?1=z^m51n=Kz~Vt`GcFDA*jL}7 zUEB9x!7uIp9b~y5;dGCUw^yS%N%5G;NcCs1%u3pKvXhk|#rh;!-xEd)D?LSu+5TsLHj=U8hqR3WG+1h>Ha4q|Rr(ebPf;z)dm zv_HpoZ1VDa z_L35op>&IN3FFd?bia&%HM+y(A?}O^r>J3xJzH&a&bGmxO$hx^!|Hs^i9TQR^!Z8_ znm&N0t5a}o=Zs`xfU}ZxOX~V|-;(~y);TC&g0!R#Mi(N$e>|}CzEnmTVg;Fk+Uk6y z`BaDVF{guoJDw03*FnG#wAMZx>H2xvknLv(sD|FU8Zx9BsPSBc&eDu#zl?yD*J1Jy zcg6$XM_3~5jOQH!{u+be+}@sZ$3@pdfvyEw%@Apc+PM_J6d_Rw&?jmK2`mcS%L7Af zK4UFU)&GU_c$ONs!a;pJueD|>aB9bXsNnE`G))o~-x?auQp)%{Lcq$GJjBKvzaBWx zi1l|{`Xn`iP(;dOh%KVY9CebKLPWO>t$s8_mr%S_$-^227xK`msm4lk>;U;r1aBpn z@L7Z|R%;ivQp|oUjEeTs2|4IXx{<>v2W7pAz|olb$mk!LdDi|r9*n~OmIqz^zvTgo z+QhUF3zNJQ;tmo%`x$*TORo8_ay0@b$!l>q8%%(P-#2w;5xE6v%6Eul5e-l0QpoXX z0(2-TIUR#=q{OJ@VzmKD*(B34SIK2U)G9!P>=O_n`Wq(Nmy&U%5?sXt#i3zhRYU(0 ztp}M1b9z{9{nUxk)?d08!N{9LDNF1^p1b3&uBo1g0p z%{3@aR;r(Cu;v;P$JO1>HB@t*8OPPb&oxYQ4UgkW^K*^RT-kA4>56LwDji-Oskw6E zxO)1zay8eeI4;Zj4QhywtwYvm&6O9&W&64EHP@Ipu7ICwtmYaQ$L09B#%rz#aa=(^ z*IAmYAdbuRa}{c?iE&)4bv~3ojHiipHV<^(sa9LA9$4T+HHx1W**J-b@Z|o|Ui1af z2h6WdttuXPmUXq-dR!W4>vd_MZ-+U>{WR0ycx0aO2s}Xyum5BTD2b+nF*$jDQ`5OB zXL}Nl%#DtR{g(O}o~58;ErAD*1$Eo$5BqHL5YVmjkb_&eINf;|g`gKFh*szX9yTjj z$-{00%|rC8N{Czk5VfMJimH+o_W~X$m13$oBJ!*J@~b*1zeDHX;h5wg(ux;|A_cla zN4Cl_mj&3NVZ=^ZxG>qcZ|@`mhE^WVt#~Uz7g#$ zNvl16(-l`G53>-wyNHDIbqWvXB48wZ!3z0qAnM(LO!6%p>IR9WopcC5z}UdULIjRT zJT_}G4_uG;4^*h@2vu596jd5d6czWvBENs5gpAz4M+2}*5ajV01m6f~Sbn9*3wZdo zf-*{Bhc5^hMia4y2Z{WN?P_6Fk?>~<2K{{qsVD?jJj{4+wuo_^VG(XYweM;bR2zqfVCP9R!xeud5IAWg(o7z^gT0%rY8%3SghL45N4O5bTopV3 z%=$Ce5RJ6K`||E@ya4{+Bm5D86Y}>Fwn5hg2%NRE&6(eSB8RffPd(E?IcWPlH_UGX zFn3h1MBtp({7C2Ili}Z`bLMA$obz?Y&uQxEkUtWkvvkrp{Bek*E#_x#;J<)-_k5+C z`I+ALVf2k049qWtO)cCW)g2)NfqQ)(#@33P(tr`nkFOBsYj_W|ty;>szd$jN3Gq(fBVLr^eh2~d|+hu1X@EtR}J7<1}fUiX`x7-Zf+*~flO<&%u zUWl*^VFLnhE}I{3?|+K$1;Ur4<4!s6&EJ8*Z3e$Y;7xV&@3RtmuWf0|Udb`5wGH2h^e~xKycTH~u5{+6w$@0ro?lvsMAxj^P~YfF zZmq>TDew)Y2nW6sA4gc;j8DcySXQ*J^2Lm!BI)=fx{rwALfNT4Lla?If#;m@+K9Fm zJnLWYvrxTq)yG!f+ScCUv#)*~K4j@Dfzeb=A9%X-=Sm|&R^x+E8zNC%qp|TQLGZe- zCR*^3xklRHk<}Y5{P|&#($B6E&n~-aZs8omqxo){J3fRb^gBZ55hsQ4V%TtD$SJyy zQ9G0ta&C4$1WrpwqV1-(yY`Pm&QF}br8%oe2T%7!Zr|xxQkocEA71Y!{Oq<+y4!Pt zn-E&J3)FNsa{>pso|2zne^fdg^$+5w9E5C4U zXTvl%Tm@my*u!oZ)>I-s4T_GWyQ@RjxCsTJ@JP1_2?^P5(@y*iz3JBLXg#6@h&Jfx zd4+DnS)lAXD|COj&^@2jMeg~xf`pR83x4s7({;9jf}NrJ-I-d#%tGYPX8usPfLYSq zk)iIcJAJ1+@+{ZAKh%-t<|smen{$Cj$R(k0r<-dy6k&RSn`<~md09qvPB^LzO9;K= z_N5tcsj3yYHx2RB(D&3aIkYSEVQ6^>6%=y1+U{(m4TJY*xU+|W)b7p!;hbr1&Pey1 zv)r6Q{!MK_%1G53&YtF`vPdIC;cG&Haq0iZ`RUAr(3|Nn-udSy+bwY}ai_6j-`_M1 z^_=dOgq$O;UEzkElb|GoR-_|`8|vdGq`8Aa&U)L;giYCQ_B0%(xqY030(X$JzJcUH z*^EzfbCFC^nsYIPXF4Blf?FN51UEEF>34RxXz9)g7(kr~Xj`t*kgYTrxsaoCq^7vt zon7wl-BjnRO$`*D4G2v@(~xu!YEqq#kwjbovv))MdlB)GGV}@A4Q_(72L|LiUu8PwWHql9Hl*Zo4BVZ-P2C@WV?fG_{UA%2@iY^ z=JatsN2W}ty@4)5N}BV12a8?UM_YPyQZnbWayNPlfn||7G_FKMS1rq zw|t@8(oVM|(k<zCvloZk!|kCk&i#-x)OPVE*3IEIH=(EN_Tt~vkh9Tt`}~mSN2g9p zQfyJorJehVertfUK2pv(6z3czDP*_dr0&M1?`H6C1`SxmipW6bMQ)#bHy1r-Xb*}5 zlcQTTMMPy(=L>RtORLUsHp0Qxt~z#iE>e~EuT6(hkr%nykiW#&rj_szJ`tDaTphG` z!qXw=&$xZ|VQ3rr8l2BJZrd5M*}Bn>qa*8E2slx7S#IbK?>N)VWVM2h;RR3V$AWVxO$IIpKHW)K@-?6tGp{=agw=ezx9xfP=egNuyOW%a$T0`$8`&1U z^jYqtdG1iwgfD{^cYC8jr@6x+B{>xC?c#YCH}xsEduW3@jLoQT$XRE*y$jsrBV@WJ zjI$`@+=bVJC-mmY)rPuFu%~6g*!9`hxNDqex7hBioo;c1TcC#Ke+0r=-q;Lj?Qndd zb}IWJRB8BUUM1X?2CZz4OE?a7pXc^G+jX6U@O?PHA>BD2Mq+BxEnJ7#VrBf|X>K>w`|6S`cDr3bJCKD_hYv$e z14oamx3Nuf^g#B$E#O%9QTXNXAHNUJKJYg<@}GR+QOLP?tC<~ne&gVWtapSy{6wKs zXeiskZZ(7_hgPTtnT*j{_wH|du5DN8=_}m9XS+i%-j|^)tKHKfEE(Q*2f&Vm(5*PK zMrLX?387scVM%(LCr2m}=WK7lc;r6YGhr_Zc*Qmh{k=JBpuH5-3&#=RR|?$hb&_Ll!uk8Q zoo(){kn>~2$Tll*Mi1DyCk=Z0E_VAYLS&-blTKSiOA~g|blS25po_y^_{{o%neNxH8YfuMH9VVvElNgO$oZs-F8Nd=kw|R4J zobc`8_1_QO$6CHEs9R|F(96hotv_F3&om6itVQ;5yB=Vx23Ut`aL;m{3vd8M8$W_~ zUnjGnBt3;Ar;s;LO3(E0&)CN#k9XbmZt^i0ayFXJ;`^BA_t0uPk6@lckxN~B3X-Sy zL=v>2kDNIT4bj;Ey&2$Jfw4cPFiy|5kkeQYT_U#5B*=5x;4LSqEsHQ~5y-e?dnS-8E}%TH9K?id$HCM$b> z_C-CX0v4%0!VQJ*QfWz{OWkhZ$yD7t|KK_=)W|Btag#Tf2n^}vNpgDbG^qQnDz!J~ zN`)@xnqj9ax`GU69lNbb$|PP5@toyx29Bq2_M)dO?E7rzHPzw!n*y7TbDeF6c}$HiA(aWXSP*TMZnxeB|EDkMm)5=k#!@Ak^*~v4& z>46hud-!kndtLgQmg@edhqKZHRq1XP{g zu9qL$+`jiqrE#9g0gKJBw>okH`$yHMdX-q{4aK1i;oJKtPbHx8F|l-`2ibgYbm?S} z?U|m|6Q>F$PinLaUjrR~LB|4H|FZQymJib>=f?p(xBAQ0Y&Ge)if6j>$yQh%JBHzO zx*@<*LM^B?xP3oTCDOxDyXv3Vh;_WsJE<^(cJA%8WOsyb_X@U770f@ofU0|7NV@aX zR-Wef1hTU*#|t^nZq5Dr=+Vk9r>d<<=~m0Z#TcdK$nnb0Fk_wCr!OzP^>++$WZq3%LDPx^_7nFhljvZs=p> z1^XOS=Hr~>4F{m7-}QF{(uTgv)4H~neuq~_#v11i$cMVfY|d+F+P%J66wjRRm_=O! zSH1{u^>^;ju6)Lxrdulg_&lzi&{99xCVu>$ty}5`xUz=RdR-G~`nK~G?iL!8kL~#NtaG`BV5#iDAxn4b^V z3)=b(n`Kh(H%`K*h$DoV&F!uAGn?C1H8*J@qAlv9NnCi22r?h5)l5z8tEb?m zLw!rDk~*h-Rhv$T7}VOnycSYj?%}z{`lc0aD~-A8CX1HI`wK8&^&0IWe3E8WRF$>Y zR`FfAa8qj=-U7bJYTLL*yVGBNEi2k<=Qo|-geuAPH3l@H<#->rXQ_U-^?9BorBB^0 zK_xcVwb!=MPI{rFy>3;r-(!vS_$IXaR8hV6V)N?NxRIoo=hbg$t7ux&?p0xPW8DJP zY$zzw)HC6m+E~L2;0i)R<)t+XySUf zpm}}8WNUeQTN_$O!>X3m>uXx-tIfM?SHjo)0@IDR}xIek9*kBHC+TBynw ziAO3RazaimEuD}xWa_N>L$h*6Wsl0v!F?>;*0#RE4;$^bgp-27eYpAMyLGPK7;NI? z#j~xF&ivRWBk^Kj+&-81GGK_ah9K~_24M?ANlJK6pd=+}ms6UO5m=LwRPtC#xa7$c z+}D%5CxNkP%EIN6{y`9L9hasgEhOV`kDLWMUmFaW7X~IJyOZ`hdxE9ATqo#ueXQik zlH(;$pj0J^1s;Df_8jm9gNDC?{JY#5A9H!4^M>t~%^~ zQuhQ)Qqp(1r74H)z}H<<(ovpNlqad=ILh@zN^okTHP6#;-XPa`{&~(IyVLxEshyC^ zV3?6>z9rq6+$kx$1A)6Bpftv=$%#&-(}`ew1tib2HwP7PEimLp>a4nJq|T-#29~EJ zm75wAdywyG+^p{0o|kN=k_DX-V^CS5v$Qh@lqXht_V7XcziN9fWE+b1|GdEEofM}m zae61zio`{pOuk-$-*bbldnt1d>vUJJG^H|7*EJ;-UQ0r4hEbbnNP(Y#gbEhYR7#Jc zu)!GFY_xoddc5pqF}bED27Vbw>P)n?(z81Y`y~!)*`4}gb|1_FU z$OUgELkL+r@Hb1Lz4)tXhk?#QNVl%W-zPAp>EhprlmY2 z=yO5*{@66dmkXr%S_EwZnyylJ2<>qots@8L##EJB3^YR_eh6u%Lc4)xDfG4QIT%N0 zE7}Mkc4+BVnV>o#Esx(S;_l&e>!(0`GB@3NN>DCFMQy>qfV9nD37UiLZJM?Ls95Fw z42avA)2*@C;KmL*-I@->{m1Fnt3bMrz7Uj|YG@+_O##x9X9}7p=xjmjfwa6!1l=g; zenIaD3U)U+vII>Mv_Me1pbkNI3i=~ZsVdPog3iEfMAN1VS}W*>g6;&;zVD80e{+epm_@I0@B*{0iCUAmk8~0p&bKSs#2ep)aNBN9h(QUkQ%a10n+la zfX-1lmI3LqZ3WWj(G5a-RA~PKI#=Zw-P`zY4p6nCtpv&f3R%rST1Oj@*0B$$Sn=H^ zsUH9>Q?xIDw3KuV_j-ir52U3G2C7kf(}A>4Yk{;+Hw)t1)^#~v#Q?8S8@4WLDVqiL z!4SPj$vYcJ^F0Bi`Od~5t7*M45NcX~LFIzphJ+#|<#YTkR;U`ig+_~DfkqEOuSQ)U zS);>(Ec~<%obaCiaH4n!jl@GJnun0pLs^0b3K}A4xS$+Cd4k3XDiBmGh&^or8}1^`<0E`wa0>iuMS+L79nGVt<3O1Z@_yPtZ|8zZ7)K0F(C~L9?MsOI|AILljQa zz7do()X@3}8YF16pkhI*1#J?vSJ3r>?hy2#pl1ZVEa)Rabdby(j2%K^Y^ARYihk2wEa&rJ!|!b_;q_ z(1(JoY$G{EP+vjg1x*z+Ur?=}wSsmCIwa^SK|d9AOwdb$UKeyyP`{DJzB2`l6EsE8 zJV9#&Z4-1*&{cwN5_Gqq#|6D8=rutf2>Mb`S9DXly<`d+Bq&eNBteyess%L)+9YV7 zpdSeOg`h_Ty&&i>f=&oZ$Tjx$7IcQ7(Sk|@RSG&s(D{Nk3fe2^GC@ZL{anyPf}R)j zilBD{eJaRBH?4h|F6dN2BLx)-nl9)vLDviVxuAyxJtycDL0<^U9BnKZBq&eNBteye zS_JJ7bg`fx3A$O(J%XMT^pc>#aDetfzM#p1<_M}5v|7++L5~W0L(oY6A8ZT(7p!tI81g#acUC<#xR|)!~ zptl5lBW0sLwXi$M5P8W4*vY;V?-V)Rm zlQqrPThM(ahW4tU_XOolGO4o#Efus$&}D*tEa-MY4+wHGt3o1kmT4c{$- z?h*8appOOF6(+}2LGuLF2x=0vS2O)FS9I zK|cY~Qf?M>yQDrN=%k=tOO1|6g6afaBIsHmE%|yuKb6$S1-&8YYeAXk7#(?nW(zt` z(1n6-74%<%jss~6ekJH7L4OeRS3z$IdKXB0(mmIp5rXCmY7(?h(8Yp|0%;3w6m*B6 zy97Nb=n+BB2zp-7%Yt4J^cs-1^m9RJ)rOWSC>u!IGD=Xfq%IesYS zE-0|f=$!+kdy5T%y4Dz4KS5^+Di<_g&`Lp@1$7AeyP%ZiMsl{G5<%618U<|>bWqS$ zg5DAIFF{VN(J>83dwj9bRtfqkkoNO!g8oZVUl!Ucg8m`sBSBN@jE;?ht`c-i(4T;G z|MCWq_V_=5v;`jtO074vbU~Rwx*TH#l?j?IXc>@}hnwae!cAijtrfIM&^AH4fV7Sd zK~D+#r=YG4hA&IdBtbQT&J*-QL7xZ;t}s4G1=2RB3(Az#l|pM2)DEOA-3+9Cx=&IM z3c5_t6@sn-(m8Gv+AV?}0Me2l6~5m}>dS&&6ZAJh?*M7Z{{Yfby00`SPtaOHJAiaM zI4tN^AnlDi1bqsm<%L$696f+EUoSzYNa|7`o#Qe=*GuXhKsxVTg6@^nrv?2{&?mz8 zxuC##Mn@P(mpl_lOYSFVkf1XKjRev;#tE%J&@>=zeWRdD1YIfU_k!L8(w_W8Q1|nV zEj*f zkhbriKw4W;qd}(&8VaQSHvwok^d?#p1x*z+T~H;E&aqf%=LlL3q_u4obc3Mh1idB5 zUTt!80n(B)fQBnu`U*Nj&`?361dS0?B&bwSIgqyMJVA#A{QyYoy%9+3y+zPng6=6CwxkL=4M=MnF0}E2W(ry^Xbq6g@pGX)45ZuNvq0LXF9`abq`oQ0USs%NK`B7m zf9XIuszsbCsb>hv7BouGSfCu0qgZH@1uX#5l9vMIC_Zdx^DJE}Xp^9Af_4Grs2qoY zw3P1)?Rp?x-kSvdT+lBB-3OGTq&y6yrMxcaJwYSZn$!Xy?bC7~tz(9uIg(l<=weCz zo}eE}>QSNHDCiC#ZOh$2+P>qG`YS;%3HpPeKLhC;Zwc*PLH`4!CEG2AuLqDWM=wDG z1f4Eu2#}VX4Wy-13ThR!P0)Qn+E>Q~y(DNzt4Yllv{}$TK~D;LP0-9XlXr`tKMDFw zP(i!lYmT7x#`L@slO50YeMU@!Q>buXcCY<^R@_WpP=g{wfjbscQTOn z-&~+d1>Ga)0YOgyX-j`Ev_A=YRZ_nYl(pI9m?CJcpzjNMP|)*0 z+6ONRdRbCG6qLNhNX`M$=RzTn&RZgAityD4+9K$Og6;&;Ql1jp^Fn(SNK1Z0&}%g1=R~$C8!A~%i{INenGbi`n8}B1SMQxatstyBxs4Cc0q>){aR4UP9r5xP^F++ zAYJkmf_4bnE$9$XmPPBo52U?zy`THAX-THBYB zYV9&MCkRRw)JsqwL8l8EEND28)-g*^E0ETP3#w*~!E&?kbv78KZRyp|}ao1hFqeFdE%XsDo3g2o6c5>zT^ zhM-D8iv^t{s6o(qf?9#RS`gX}K^Fq)db?OqhoBpPbl(30(k=ULK@SOfOwhA}UJ&#< zAT8xpAg%2mf&v#B$ss}A1f>b;D=16QC?G9w9FW#gA*nM3EfBOsP&JUwu?k2_X%@6w z`1T1pBIq(fR{`m~4+?rs&?kZh?lGktA}AL~=N${AZ7G-38G_~uS}bU}pawzBf?5S_ z0Me580BLOpg?5GT{YcPH1l=s?b|5X~9-%!T=n)_-`M(7P_Zr%8L1ls#2?|;I0hUDd zsEn3U6EJx%O*JS3eB%%jt-koH`GyFMEmPCTqxlMiRxY#|LR%!Xr9#89qnEc)XqO7@ za-m%>w3~$XfY2Tm+6keZ6xwjx=*R)e0zG6k3T=(h9v9kELhB2^=(1&rhvo@wkXU)%HP-D;EmBXAHdQt0OSi6b&7@WtLdK& z`3|h^>~{r-s8mbwD299Smu)LTc@44RC`wmITNXtb49c1)%2ZJ3=ZGA76Hy=K5Mo(T zlm|VYAXrgg{FJ{zjZl7z*uzMPQ2qkSYf+SUK;gqr5$!$Udp^z-p-cdU4=6<_{7~2A zC|z}+6h~2-K;h#@kz9u;CyM8CP_m*ZM?rZw%EF(4@>&$-UQqY|Qbh7^LE$SjB9sq7 z;X^?YN*dh6M|vWZJUZ?aKV=Rme0)apWaGt=ZD8RKMxt%-^`pO3aq}lzJ&CAePzfHM zwQMPoU-oi5kn8=Zva>dptsnnYT&lk8pHOAoZvzG3=OQ@vTJ%S6dK5)gfA}m4f9#_i z`(m=j{l4e%bU}(^Uvp|40|@+X8GmRV;K{;YmN5EvtH+Z7vSYv2sjmAx9yBWO3`DKO z%X!k{NmM*1=z_T4Z#%1enu0|}ou6}v@it1HO4b2AEEMMMIzs|()=3)bDT59kH zfmRcZjy0}o!h4LhwAQv3OLs~GH*MNvs0}TAxVgH#Vsc4kMfK#CRd`Oia&CTgMeE%5 zHEWt%+Uo1{bK;%w$OG}SI+r2o{s-pcRe{Ys7hYPkre^u7Mm*1r62)^)!4vA=YE5Zl zb8Ed3)Jf(l_1a&<;63KwnU;#CRc+s@rM#x8uCab@TTNSiWlin*^=;X;&3JtRp08hn z=d7zs=PsOATArPsAAxxhI5q;ubYdYMF*oMvC;wZ^yvNexT>*wV!(7(TP+!~DiNN`5 zFqqZrWRw)|wP&Ca#FHyY63xQf?#O!-ZDB1Ov^A1TDB2!v41#n5!LpUd&Siqe&A znsuEhnZ2gI$ynb>a&%R7!r=4NjIzn1TDLP$zFT{zkMjS&Kj-MLSoiCqOs;QKCBQ32 zmZOnXSCy5_&?z&TYtNs__h0*HnEzJSvhn+9c)@``I==}$MqI`+zD?ZAPfRqA9i;mmWU6UOOY`aq@7*pHlYQdp zpO*TXx@x|fq`BSi85D0GUP9t`Ph6?wgfxoqt`+ox{ssdvbK6?rq)E-qjrBE6y8L); z3)*3fAFjf> zA3M}G$U5vZ=AA609WSK^t#@VtlR$PX`lGs63@AZ)>#L3?E}>m?I>9eIR5hW^_=bHZtFk3A1!Ww z^0=!k2Y&Cqh`cD3%2pWN!`N`#rS<$NzUU+x%O8zV$KXI7RPpIT<-lDhQjs2Jv+axz z66;ikqm+i&3OG@u9Hn*;tC&@Z@Ocy$@l3=ASyY3_@M&kA>&{KA19`;?saf1>$~Jit~rEqKAByFuI^Ml@-E zD*mP(w|0PX4-I|HlX*DzVFM4{4Z1a7pFjuN1`au}Wnk8U#(@Jb_<9Ety6xSMzbwQ- z9)klZM!9DHV?3FTBD#Ovq2l1K!i>#i-kVInCED zP>sRli)x#wvi&E~?$1&67UeML8wlw`c0de{S*#Y;Fqq!~w9qd1tM>NZl~MV~%k(H- z-A@?*>^c#Q%ChV6pg4^6Vf@tyUu_vUkbZmnrmw#F1}@om6GW@}qJMTFlKaZxvxan= z{0Cosz0$T?`*(Z(q0*po+?I&rv})x&MxL)-?@o%WB2UEvrRcC=SnR zUA3t`>x{arRjpZgH5#VBEm>{2q5+BSzadMn!{V=vS8ZjL=8pB=wv{zv_3G6d@ON|_ z-qwa=Yim9J;yro|_S|gx7LGz=Ojj0~ej;H_bK*`r3ZHn+Fb){ksxZXU5=oE~ad zx-7h91?*7m%9<9-!7{uRq^qjitiTz)vT(BCRj*(Oc4=>FUA3aA9v;MN69Yk49Rgii zS7I`r6`R=D+_XY7hFyh);0CF~4d!U6iXN5Q4gQ!(c37y|v?HV@1yzQ+=61Z`jb?i` zDVAV6Y#Im4oq?H(JK$>TXsSxg9mCW?nPVX<2r8!Oh!0MoF^WMGhNQFLfpC|I>0%6J zg}MaE5WLsseUdJ$ktroJ=3*Y8@Vu(|WtMFPNnef`vlV>6$p&L^KJBxD&vbtRxt)4L z!h9?E`yQ`T;#_5v75wk+A2G@dqeof6*Lyf%4hIt`60KKFyc^n^YOUZe?aW7z<_3@B zZ`T{}=M{uRf<)GwrShmNNS)y!JA(fbs+d9O0(P%x?j?3JQdDuuX3d^i zHq%6=;PQ2{W$TnF3#%&Tm01BVHn*&7y5*?I{8@A7S60rhnuiPeprXtunLDqns%mzX zF0JBB=*)LBhoFT|s<5wrwS^pzuD$ zgyJ3~SZU}Rury>Pl=RBQQg$$nFP&^}wGt*J(4w%4Be}E(?M+HUVV1WySP7H6-3<2B zH1(FjgtEl*z&w!5xC+B*WhG2WVyz5G<10l~g(OT(Uxm|fxT2`r6$$04Msm{U!H|Rs z70F9OXQuh5DFWIN3#Sdo8xq3>z1KmoSAXH@DYGC{IeuO_tE{@Rs$w>3YjO3A*$clV zW!CJfnOK|9l^dI_ykcs(SJSac^D1VRRhL3|MJcj7+Om1drMUKOZdui~(F#{OPs6cp zuo-rBr4RWbNZs^$rgj~h!0#Ta5_cV!NQ|##@(j5Fus6@PZd&Zr`6z7H@eXq<515Nc zD{%_GGJ-l+YaBw2;!&9sD|%39R03osR;BJ$=S3>6Co=`r4s;cKLt}LsbKWqA|*$ZcVOX{LYvlopXljFHGHZN0W&obvvY-;7)(cZ}vpOWXD zRIw?uDrU_qn>BfM_1uLOSh_@|&$e9E3Sv1IR8-BIkJ<`#nu?V_t4pUTB{NHw%$`*} zWB#lXE8Ho^)Y-GA&M2#%JFjGNMTwQrDbK706-ca}TV7E%1J&6%PfS^+&0dT`RL>}z zGS5ofe>RIGGVb`QOR6>snajbO`e%G z6YWIxIuUZUm8qJfxANjG#x|ymP332tbx)BpUiB1K8kbJ2lnE*pOpCmaHs!3O4QP$dzkUZN|~&T%hNO~ zrA$S~q}8dr6jsXAK~r(DGA<2kPwK{QitYsq(%{@`E_hlg6{$19QcQ}KGOg!aL?)-{ zNl-QBS6s%kQl_gOxjYSJt3Jf=@RKi>J@LgpJ2lIJp?ObM8 zlIAMPBGgF>UlpA)KdT!2OO@o>m8%--K()iQx>aSD?4ih z`UZ_vp0YHRWlvj)nz2&O?ao2jLWi&4Vw+N}>>LwD{XQDK)7N zKw?rFmezEGQ+IVzmZ!Y}a%!6Iu1L!N$KJbuM^#<@!+X!n879n3GLwW!0t5mC1cY2j zfDi)Y4k1@_f#5BKB#;OsF&6=A1wj-160ea@b9W`cdc|Mx!c_q@;d4V;|cUTf{O*IxU2_Bm&tuFzjVOO1-!*5X8B zw?BlXuJn{Km)R400w;nyImL0GA#o#X%t~?G7)aa{s)cNJikhhF4mz>dKLGmd7`nct zli0`nd1Rjz$#G{X@r=a%P>@F^S^{(*A#t<+F3<}>kGs2)xW)e(ct!R&5F5rF73(fd z;#U8kAySg!ycLz$AMj&kt2D)S`zmoDFd4K;jBeDV4bNc|py64BzQFK&j5cR@PG?N@ zhdT{tUyyjRoA~3Y0#dR0c~(Y4j-ML6?GKHce&-)3--|foDGn8`imc;-{W!5n_lLx$ zKOk<#$?*J&Sfq~%nOT0a7o2~9!-X5Aa>8ImAj|rybRYNxMxa zk<8VwiHa^N10ADQY%07c$4}#N^bZ6twFIdoZGz*`Gh3$KXUR}e+GNNZQ1J^;xj3UN zP(LFo6)00d2m`x3o{d`uI!8ppsA?+nghW3gy-$a~9B4(_U3K#_S+U zuW6{PYR@;P1u^78bCwlDE;1(rQF2pRMQv3jCW1V&#nN$Ap+^2#1}-SnpdV$FH8+>7 zYb!E`{8&0PsgXXG0ZnRnk6~0Jh8ojj8HnN69;=d%Ssp8|X{|5AGtxKxYUWW1k`rR|2F9|l2$V=yKYc1&C*7$Kq-!Qy*6YgFHMX_dOIBslq!*xCsEZBMi|})lgh^k3J3#p7C=HXPI15lBo|bhj9qJNC zJwzbFlS3z>pGcm7o+UMTN{Frl>9TNONF-CkC!v z>B>{iVk6GS3=-2PdBUvmDfoc5y2v8P7g;;e+Z{%nB+@MBxCtju1)eNV4BZJS%=Yj+ z2NtQ$#%)qLpXXWvbFlt?nli~8CV0&2X(4mN6v>yu^Ea8t^S1ypi~ahCN9f92$o#~6 zAri8P!yUc25*Kp8)Q3S%jgm(?`?d&Kz~pq8`3{eo@h=At+}LJ zH0=qH4G80rLb`6Y-*)!ox~5W3o`Kb1z99AU5W=e`lS#NLdTZUdCXd^RE&RHDa7l&%f@2b|uIdv0RfC7jQ3 z5y-M{%|hBrZZm!H35(1n5q2x5jB<1?Zzy43xw4?0q-p&{u)+#nZ&nd%=-R6v*Ji2J zlFHz65~cMYHEo+j7RNdRshQ50uk=4mk=XB47ww6}R*0vklhN;zJo`V3DuuGgUcXMt zrtGt^^aO;R)ur;E1`X^YTUDqiYccJbB&XAi>SU7AcBzt@Mk$)pUHT-Bn*F1@m)=rj zdp7Ks*FJ@a)4N8t3z;CNQozeC_0Wt)h)^}W9kguM2wE^L&WV|{aQ#(0?K`U&cg0n+ zrus*X`~+KqH1oF-{Jl}Ge5|oJ`=M>{>^SB_6HTjC-wpyb5sxd zK|QHB1B7lIbInW64qmjAe+-17;yN&{wlh`C564qm`vn-U<2VtAkRNe>?4=UKF>lF4 zJOB;rO+|RuU0YA!T9FE*O5tt7!2M4a2zJ+YQLCNkz2;UP)mQ*ER0kGw**{*#Wv@!^@ikQDO8b+neFf#?GMqE>$(Fp2XbPBJ;>EYNuq?P|9WDLlNrS|GD(m7;yLaIj=@*+t^ zEGHm~MeL7@il`3~C5~tVgUXRstWGJrb&Sr%6hqaFE-s*D3-P5bTBVV_K~j$$(QWFS zs)|yT1g3ms$hDN+6=`Fn)m} ze<^4*vgKC;kQ?&*0jLS*f61iG_$C04tWZK_;KI}I`9CnlW*h;a(Rq%=P54~Qcm_lo z&zCErpjJEM6%cDdY&MCqSmb{O8h02os1?%yI%shhh#A!HQ^&s7QnL+{D(WAJ2vY<) z1$$r`~(yRP4S9P0HCx~Ixv#$K$8(=)DIm4y9Gpf?VC`@UHSrKF^95AoxSUz zr<_Ir*Fj%74GXS=flBJ-&Fph0-v(iNNrpT5F98hW5M|UqmI6uGB(L3*1@)hSL@#Ci z5Xby+P(yEKyiS1>1n8Zle;`nqWlLZl@LVwHt&Mp!20R4`GGEAF8XGYC=1)`cAg~!C zeK_)e3=uVI%p)V-MUeO9M+f{aVz3!|A-D$zoAGskYbZcw+zD_ij+|A9Rzmy2KS@Z-LQZM0GhLZa?~jH|$+!K}?>S%cXq3G!ez;|CC-YBOkw@IXiXVE%uAMRl@( z-cq3p4^d4nZ9<3w@>+*M>n($X49l6m6u;Xy$rqN%-Vkc1D_i*e%R$0D#^)K;L&`5#+0k20c_Y+h+3DUUP5S@(IdVC~=+l^*aLq#1wL7tFNlR}bygLMap zLg8SF^!uR*k`zn~sx&!b5i})16K-T!M&J_7omhe_h5>v8l2fERkyXG>Qjub+V6#a@ zDhOHy5hj>vnh_#WD%;Yg!M0ooq|bu$GN9OJS3I%M<_{N!wMjX0MFzVF=28YrI7^c? z83{zm{M^nICr?F~s)?*e5wmiHsa$IjVwzKu%C0p1tL2>RbkjU`9ho;{|89wb&S$@8 zU$k2aSNg$nFlH*oRplA^@YgKj)PBkgd8OczQ@{uJ$c|{}B z0%UwtZ-Ejqb6x1nX%;7qUBRQ75n_>3rY1#6Ew;M>gT37Y7`^QoMYFdG0rQ6(R47%I zsa7auC3d1BE%T#;U2dn>q&Ug}FLT*^i2^MpH&NX$%Yh3VvgPbe$W-`E7Rh1Lb2t># zDgx*=9Pv>3)o&0TMi?__mpCYBN2#QTo9x;5r zJY|BkE%s9K> zY&J4MiPE_MhvY95X{om%GLFejBti2sIMrgq6Z|7Zf5btC(V1qcQZ&P&Q>O-8rGsO%^-?Z$ze(CHY% z7K)RF1OB4ZOomN#TB4|y0yoe9euG%C#VQ3+lURJMC9a4eCh8hZOp>K6ciw^5Ys~$haL8~mk!eRYp;)>lPW+4kw%Fi%= z!U?q#j=(y4PVVqfSFZK2LN1m%I|utj?!e$kF4odJx8(LMDq1vu+oHnxTe0xItzbcJ zUw_w@Q9MkCs5Ur;mRv~S{|G;yMdJTXCRcri7jLEh7i4pC;9)HJDT~c7^5PLy|Zpzm0p{R232Na!yTj#9w&YD2uzf3 zIW|h!gr|Jyc7ggtc$BX45gWGRa|*~BJY>(zVBhwhEyK}B!}u69yPM@vH*^k}fQmo_ zdVgzZj7T6+wK1eHxW2oKr1?#H!{{^QnfMxeJ-)x5Y8b`dla0WLk??WqZMPa>e6~Ho zyUhGD`yT!de9(J^F$eUljbJUm%?PGEYot>+#|V`mMuSn}eZ~ln7}+P|bL=Iz8Yy4~ zy}sJLM!?hNu6ny&K>)yKiHY4mlyWPl!ko3AI{>d;>Q-Klmsx05-hede#U?BMCS_7W~zi44BkwOx}gi$;?RbLdLy)cT}o2Mdu-lHC}HR zk3PpVUpwN}?lC4R?G755juc^!Z<*IU=`#3?j7u^SRv13tEfmp^?rsRBvagcbA-;}{ zHoT4OmI!hjCHa=IJHoE)WQ)8Sz#T?zkd}NFD%~4auLDkXr;|&3i;!qaYKoBz+H7w- zNI_$Eqv5ZC=yHy=#Jkp*z0oilO>fnbEvuLHKp@vF!c9gRq9=F{aS;YyH)O8&4X+$Q z+Iu)liH5HMfk%xKA!m4fRwgbmy`IYoj1^0awA}_ucpc}%@b-RUbC@xmBcI`QCrTsT zJw)EwajbEP?$`V&WS{044*IdtmEkX{5O) zkg1yx+Gyn!4n$rJxd5%gJ^Bn-TNEqk4nJe0k{jTK@yJuE`z&O}>waYCZc6!iB!XJ9 zdbJ^IjleLnJV@2Sor)5%)yoGAS&uZI1`Dn&#-0&UZtdLOw-ryb@fxvt?=;$jFfwnj zsAWZZSdkt*!((!NUFxgv++DJyxqQj@EU43Q#B5eKX2pN?o8yJnScWqVv2ou^p6vQn z%-4~tag{Ez%y`z)9^&nBRV1dmBNAV1euCx!g67Kfvlgtuc3nB1KIV+H6ics}b(>+D zM9~-ueS2MT-Jm4AIak(XvDsU{dm%QO{neFa3crQmQ^q`eS_un!X)w`Ng_>1{+%7meu|WSc1hS-cco0WCNXm1K*Fu-`R}H z@pld*x`#EF(Kb!{8qkSM`!4<}?n6Mdo|-D2#NYXhUc_Gv@}RwrzbcKt0;w2N;rq+&Dz6(w(X~Lz(i?%4rQg@w zA8PcFMlWgf29UCzc3@Jr{0@k2{iTWzHSKR2(Lh|lT)MBOVocF!29U~mwWieqQFBQZ zbfwxfZ2K-ES2&h4L#rJ`zv{S|HTJAoLjsPkD z{Yum55r!g;aS&(;qwfMKPtxu|DsK;J^q5A^0x7TkMAPW&+Ig&ncJWbhKhkmrnuoG^ zB9P)v(`XKm($}hKr)nBq<)|3X0Vzvg(6l$T+((-BH%$v-#--A&22xsTfmGcML#~)@ zUIs+BO;SY$xQd3knZTkw9$Whuf0du<)&|z-LAw`u%VP9|M!(hQV~wtcW+k@|niZn2 z8!Pk!jqcUxNsV682ur7Cj7*K5)QG-rtnxORW?6bUkfL3qY2VkhJ2dT4O?yw%J_S3Ks*>HK1Qy ztGU-}^gWGk)#$KB4`}p+Mn^UJ5s=dSs;0f6(OVk5qtPEV`dFiX0Vzw}SnXE&LK*fgYBU{4#mLuakw&YvT!Tg}ntPf?8#UUm(d8Qb14wz-hg&HM&DW?;qfw2%qS1FW z`W=w6)H}(lVId$zn*gNpI}=Fda*jqhT5hpMwHloUq-t!RrhQ4Hy+CLV=Us^AZ7EN8XX40f0WjvIH|bLY3@%n`YDjo_X~~Q z*60r!{Z*p??o^sy(`c?nD>Q1+=roPa)aU|@uGQ#vAeE21HF^X{dG{GD_ohbgX!NN@ zegroNa@?7X;%X&OTVts!&>gBraiCGD;mA7(OW>u zzCUZ)-!yXJ{-8?3s}VgisAwq~O#xE&&DOMe8Z87;X%qvY5K$wlHEPsyEgH20sTi9y z+5)8Fo}=Y@V@0v{N$)m_KhG4{Rd9O+adY|B{rvhSnAxsX(j&Yyh`9hii)%A5jb=o~Tx zKNtd;?_~+`5Ct8-eWnc6Dz~KhZT#8-IVQm-^qfh;^(FKS**H=7swqP?@p$`t9y4X=$qKimD=}(O z&ff>7j1X4+p+{uY&!S|;QF7xb6>${m1Dty30W~LuuBx1r%i<{4$5DP5M|nDqLeJ+r zHUA}!5>!nHVpdM4#ZeZ=QRtB#r{>LZlyl-Jm&8%7cTny?=zn~lJX&&!y)|HeJJ#`F zoSo4!;(P$lxl`j1@A82?5!K3*#(Hwp&UZYAYG*_vI(CY)J^uVZ z?sqotIFGF}FXrifQ{MI@JX6S-wx`3H7WY^^Q&GtFhx3^h^K3uUqAvq*5St}hFAmtE z=qKQr=6G3wDY36Pn5y_aikL^@?X1|GDEstd?JOGiu)K{rmTD!hR$2AK{v5~tk_Z#* z@1QUN*|fcC!X#TbchQofEZa}-SGQp7{pt!A7c5-J^3nb3ZnzDPjBr;HzhB*D==^EF zy6u;%zNQ1GtTFbhTMzmz=-_j%R&vzCmx}dq`_(C~^Y5-P_N&{4@gNX0{6Sybesw?F zfR~+;uy351?h4piI>vr=cyLB^#SCFA7qeg8FEMD|w9RQB%Z;^P-FbNQ=2j((WL3H` z`_(-I`i+pY|5#tles#|y-7UNE7__Mm*;o2v_N#jZ{qy3B?b=MaG4`wT(?rwuE2aJZ zV)m<}r?#g;ZiAU_7UUsUo_}P|IoZDPNmpVYF4|A(KGLIim^w@F7GSophH9It%V>qs zE+5Os{%;;^gBLhZ5#6V*q7u7qC0QFv9j&OOG!ImiSQN+}ttcTP_JRvw$EQ=?qX64S zn|RTrN>R?@O})M-yyy440U1Rj9aa*1p7g2w(sq4?2L?+HtV!Mb@@N?Dc(U-6)2&== zyzFQ-T^oq~PbA%2o&I!Xc9Pr(qeAa8v3l}>;Sz?l-PVPmCEaVBiXtVMS5^ZjW^90!Aqw(0X2efpeVU>cj#Olp`0f|11WJjNeI z-=`&=Ur&4Pd9tytV{I%)=5wjNmk%Cqrr_ttM^pG_1z(Q6J zV9P)=?fum#tEBT6fxrLslA|k2sJ$OunN8E%qbtv${o#&Q@GgSNBNc%Ir&}J`-Ue^b z3O;!wG3l_IypeLrso9C}MhH0$Q_gUW9!)wn$EPC4=7xlOKAo1d_go0u5;zG7tp9IJ zU^Kkv$voblPVaAM_wD41!2Hyy!rO<>{n- z8B{lao|hM4Xb&W9Rjzc7wmk#@;B|4sb@ZP;hlDQYF>(;l66KkR?{y(J($ zg5&e|a`DHup(E`dc;4^H!~?fvUqh$*x&xynd!J4E%Ka3oYC51hDYen!4Ip1qorTf~ z!5^qu)T_{CA(e%%6lbdG2dXNqa@&6tHRCJvLITx_$`Uy;RN@|engUfNOOno~n?)tX zN$1~B=W(OACLM0guG#f>Ptt{#g2DsLuD{D|HMb*=j&Zp6}WL(mP=OL8?se7|f z+y?@C1+}Es>{L*WK;VF9?=hS}Nk>AHQQ3XSrib!tC3*mTJJIO!88nFbxa>ivKHWpJ zn;80Jq6cH>WZBB1>KRGr{}G%$$0P{>kw1M_Vk|@qs+=Ic^eF^&lA24SGPsX@>Kc=c z94oeaOg82yitQPbO=}6P+!&Kh%Noq~j>+~Z_K|nTB^^HEuzXcfb@oUaB2oTmgmGm2 z-pcHH?UBjZ8x67RnrL)z8*Ofh=bl7d(=GAb7UG&-iRZ2*E)@l`70+EqTv`)~=b}X0 zimLNRTFp#h0_)5a3D}g!mnL&fZPuhDG&iO}xt~{bzlGTp# zkL>!p0qP~5y=Y9Izt>MGpuy$8yz89omEt~blvh2ze~m9`?*{NN{=IiH$^38@R0_hCAmgpxE9yzqcC%Yd6!&E-QtV zWGEfPsa*qGw_*>(tU+vD*fSDk(hl!gGlyxPRV6@6uvtCZyLx)MhqLfFQI^`EpLbj( z8`KvovRG{E=!u|4e3}U>y&cEArwg`gJU1x8HdiMa4S~w5F z^J4f>GJ&?4Rh!WMf`Y`wjy%|emX_*mo6!E#;x5AelkbHSp~~mc`^J)S*f(}5x*<01 ze`Md-S78IT9ip_og>nzNL{2-p@04?Y&M5u=>pO6<$ExJdERWgu)cQZ&fs1w4%X=_c zQKewp;L4`czQNW1q8+$6cc;lyG5m7wZ2Mo?GH0Xyzq11uo7pEzRufi>pflN8k?17Ui6keX zUWA;41`&1=8bz{`&?Hivgp)+7lh7~M23^FR!npf+QlR% zVV#)lB%CZVorHWb#YtEoraB1)BFjlA6w{o9g<`ssut>~s5*CYWC!t8pbP|?`Sx!Qp zIKfG1u4-*-ZVDJkv7)iQzDz7~5}T^9w|S*l?4-7^fkjRt z9NtpbSWzpMIO)~-qBw@KKrD@+6kxH);neCvu`GtNP%Mw3ED|eXD2qjD45dhv#ZZ=r z@)!!XB&>)f<%`N#(gIQCBw^$ChSrvf=Bla&QSD@bimlAqA1j@lrm{AC&tR34Skur_ z)!Zs-oYYnLJb+m3q&1bTtZHi#wN7efRb3T67f|PB@HSyNLTJ|xgugU+JI$!cm`3wLdF5>ZlS z=eEhosLn4Cy|JW1(HBcvD9(r_EfSk!NsGmnSW=PL8cSLt`eR57^29(aDPIi6k`{Z=;s#92;S3tD7FtJoGpZEb84+nuzs zm1Q*zVuzF1hEENMvz;`UBfbZ>N*Crm?QA zo;sLaW6`gE-{z{5#Mhlv zx@4%T6W@rT@<4H|lgQsy5#MwY)qHP(xXwv#scI@~E^Ea%a1J>c*d1A1A45XlDZb^T z@kpgw;tesJW;A8-Z6~p+orpI&iD(I^=y!}k%oBGysjaIT+gh;Oc}vvpyPOi0RTVY( zWK5KQx07Gd*4$jxP_eG9p{7;*aBN;nTRF4uak612jqGq3<}HWgcsvzQ%zNXQ*0i=t z+!x2w^V%wLe;kvh*bl@}qcidc<9KD_p*UK(csPz$As&gNRf;^|e*6_{&?C*wGERV^*zsW|dV>;z0xlc(c2W%a0-R4c^MI9_FWU6lPy z9D5CBkMxP4a!j|LjpHJ+UEsMm0d@WGd>oyxH+~dHR@X*9j-!{gil4+0tJ*7Ix_BXu zflptxputw*Q>l(_7S$81<|<^TPP{Z0PfaUd9*b30St))x76Wae6_;bJ;+3(udfxf! zSX^_u`dS>1=AP=B@Mm#6W#sE)(@|rZ*NHdcnB_GMWnlbA9HX(K6`vIPc^uvBCd4n| zIIF7K%Pj7jPHtUAYjd4A7DL3H7JUEbS20xd?&7T&8b0O?{e5p}zwt&Yd5@v*GN`X)@wnuR}x zQC88>g3GCjRoD<9#@LDuzEljx)2V|MiShL6#^$wU&6Of4p2eOD#nYRs@P#_8KZN61 z<&BNC^<~YqEh0IFSKa7#>x;ntQ{*3@CL+S<4h zAH@=pCHF&OH?Ju8O8edn|oB9;S~K3&mqjjq>STX1^}Tf5Ur zY*%MLe>!m7tp+QAD`z#xG-=#=@E&fDPf_z528u*vAWj)LbSyhK2}E< zyY10xG`&EXObhTaAFF#5bhgm?J`sJaE`VpJ)9X>5Ab%k&P{Sc#(EQR@U^RyWLH^QLpf}uu(KONr?F6F&_+6a>RM=873?2YA7m1N z^(<7UDIM0Qu>zgUX@VR0+f5>{A@ejuZVk=HUC2N;XSO|*M1dX-oE$V?73tYN*f)d^ zec`idfsI_urv|t5Y#iypXIM9F>KQV3t`dP>j<-Gta&J7hkGUIy&R89G?Psv|ZfNhu zw>!Hu1UtOtEVlU~OB1og?_BWG|^ZGm-8G z4+i^&J7^OtehJ2Wq9ZWGypdoxy;gzrse1Hus1gx@VdicR_6!be>lxb8b5_q55g3{L z7HZu&LG!z8fwQLlZ3P}K3HEN|ckKe(Gef1=3p|Jq;3BC}e6cKWHkZP_Ab;>IaL%L% z1TJ<~caB@g8>3>qcd>dkM=#PF)yFtKxw6>Duxv;L}SOr-jY2 zNrxx4Y&cz0Ld`ymF-54wdUf`na>;G8 ze9SHW^RH$~N{=Nq{y3^CoABXcOn?1f#OJwl;EN=aYZ1a<@@ zQp*beXK3$S%RR^JM*Yfe)LY7^5WUSG{N@<)D|0|;77?z^ zK^5|-R1=-4Vl{$uEz(I(I3(S>Nhv*SnH`=WLmTE1o@CFjWsvQNhV+J2*I11+zptnG(*D?w^re^HF0ahiA%A z!hFlF6O?{4v$Ivm%SE0lR_h}6( zloWZ7Qg4)j-6+yfDxH4%1F`n0A`Ow9`$~%u3i{+GbY5^(qMC$ewVgbgzXu8Rf7v6y7L9J-L?OdL72~ zIgC5QG7f7GBD~qMjh(T@vW;umuw@%Nam2Juq*H?7QR)7KQooU$7d~5teyvkK$C3J% z9jTvdrmiaePAhe8n!6mSpXW$@w@#fB4DXTdA*7e_b(j(e?~|c9czr|lHWxWkKj29H zVpV5-BAp_JFOlvKNy}@Ths$MXr`B?%L(5eTEmvC}RG0PPuS&kI4~TS96uw5f7eP

    &L~OjNY&+!8dc8yIw=AuyKHp%uhKu6cmTR~uZnRv(_4y{#HL5;;$5EfZ ztLrma6TVrxFJ{v?!?(%MHQKa09H!mrFzqf!q1|m+#)bAn%QCj}9?LSe^RQ`|NPmbN zbFXxtfb=q^q4oyC56jSh>eL@~q<+Ma`eVA#C}Q|=>As1y)FF@+J}N`~3oQ3O>(KI? zL(B7)d#&X#5&n@<97x;9(=-wOu_Ex;@DtTZrBYY-g2L&Mzmfqjnmw9GClkUiN%#9? z&w~g|4!*3BPe9`nDs{cT~ui)`unAL7IhP+F}(a7vQ^AadH8^XB8(` zwBPCCq-4YIqxFytFQX~tg+G#^#6ru4j~zCAV%hLVGX2joOxJ-v)9W?en61d<12pxe zA?B~9ugUM9nx0PU2IFrkkd@XA&firaTb0OXDl}V7DgL37nK zhuyBwt=de(rDj8FV&YXHPlU}J=Q7RgZtd;CMp$8=iwCk$T6bmNFnZ1e6;36i$19vp zM*9_>9O~V z!@P9MyiMlS1l*Y6O1Ylgs8XJ&> zLWk0YrcyP;FLLpm)2EumVwazy1yqyx3m`WML!^`1aFNS>h|<98bGVpV<_hItUjWtZ zu5hGLYNjF5Ni5)y4wuaZZgWkf>HB1!?rwKYq&aiuw%#6^Ztrkq(A+fh3^n+j z?TXMOF!KyGf%=jwLKCmdGkD5!j%xzVbim}>AtL-`S2|5TGS4t~We=b0N~ie%MIXU8 zfnoSgR|bvknO#c%E>|WE%9&l3it}7kX(-I>vQ+GLO{LK(vnx7W>~T$_p(eA->aovv zO{I=Gv(t*S*ENy);Y>^50@nnprkQ8rQ6Jbnhjip54a{#*Ol3=DHppYQ*V*kJv1T9vspmgUKWdVsu$sJy4;CK(OkSvzFJ-ZiE&l+or8nur)vB9yE_^N`ti!BlUA;r zE}hgenuEKXv{jg2x`oHCQ6zuEU4UfNy}6qH!O;;jJ>g6KX6P-jf}4@DNIsNI=7=CJ zemCJ2+2rf_>d2#(RU8qMzvaGJt6Yh@G|0cD^u^?FhmK&f9PAXyH$_Oj2yPI`-(lzr zZWqblWf%(X5Xm<)OvhcfuFWF(dmPH*yM8?)`THE4ZC;Hh|A2#exEkL$GCYDyG?9D@ zlZw>MER%LC(@K?C@4)DmZWMj;ZA@KdN^0`$Ol}Hx4~`CsxG0<$^f!M)evj+j_;_^zFgS;O?rnr=(qT;^ak2CHYWu})-Oh0rO=oN#Y>3E!3!xC>4ToFEj> zBnc0OAu`f&m(EI)bp@8XmqNgqS_|J&Gs|;XNZ>XzuT}+Cq|$9X5t>PZVk!I46U41$ z+{7(2^GdVjKsisAWAbX#8mMr8k5Z-K1ovw(o%03S0(3_{h^b{@O_1)60>g)E8B<26 zS{a_H5HdXb5F1ZMQ1HA~O zMeb{U{Tvi^xZ5W$mJHXpNMiAzC~;!?ja&6y@iPU z$4rjCq-=PuvG`O1icf2w)9DY`v=7NNdQ^t|&1?{VMnuv=PFHd0xrgcc4`hCC$;{C* z^|+L@Yz=|RDySfo3VPN75pzM9LB(OERzsr1>?a~6JDm_jX>2t-CnJ#UN%6^qD}Zf?tnl8DH1jv7)A{zO*rgFmUEdWu`h{a<$IO5`w7#(~+P^C(cxfq9`s3RG|) zFE~2fxv8gP5Pw9Zl2a*EG!d!d;3DgpkjTneYpbZy&;}m#rJ=|wzK|%vb0%kX;QMr& zMWiNl8bnHoA|k6NbRke_J$r-J&6k;x+GHvWJnDn58(Ga_SVZdBqPn1sR6n5)8t6eE z^bC-Yh;AK4+Oh^9e=2M4>h0Uo4YG)=Va4l%QOeqBqmb)X zkFG@4ajf343efCCS4B<@QQm{S*d#$jP7hP_RDFM>!|eObr;|`iHg?h%;3Mmq;S1Ib zw~P)B4h)U-bepvz(i!>@v;{&?A|e}7-bWzB9keCT74lY7pGqBUq}!i`KstA@k)FU( z1SXr^lO?~AV;s3@jWfljAqWVmy) z{oy{v`3K6cLLBa+spwQ>d(ZeXvANGeex~!@tA^)GAR3;Jh(-FSOqn&E>;)$P!VD_h zDAno_XMxK4s5}*$dTT@~BMzyf5{+`A8Gy_wBy&45NQD-a0cWQbn~E*UiFVeEAow*) zkjl^|Xz#Wkw`8agZ8B!x{SK%zs34;(C^kTtK}E?_5GDb~7ns=&BWJp)xMxz=YZWL@ zb6R+x8WA}sYaZg87mjja;xUBAZSGL)W<2pWG*Z(Y-TbI!gob!Ih6Ha+)Z8;Xh=&?` z@FYsS4pZXHQLJ)dc9}FymL$wug+4-Ugw)a3E#xwDF5I;hf#n>K=*-USK-VYa3MRPF zd+pdV&VLk6rq+{~NRmCIU=AF|lo zGh;L{dwN;N>{Pza>cC>lz)(l$)@8H=Kd*)f)3trsJ)W!%NVGbs-BHL63IW6e*7dOEwgGzUgUI`D!|otQ9P zW|D2UQVbfSr!%6DP*^?AF5uZ?WUX8+Td5}-lP?XvqYb6UHw7nZxuJS!U~6=quafpx z$rH#M8MT(3>_D1F(H3Kvh>Y}_Mt(e(Oj}8U+&h!SDgpbR+MfI5R9em)AUVzf{SkA? zcFf9K=^nLGm|mPkogk-Yx{@vl)OAK#f4ADvT%=7gD5WP!AA6G#CvJGY3!NESv$%H3DSsddDm0Z!%(n5VU7SWry_Lp%Gpml)X&dC_eNr|-8I`BJb`9d?%mN0v zfC|QS5MTToO9fx4S(Q-8o26V24JaIFc@nU8|5k?lgR zl~ajH+aX496tYF_GKDN^1c4m8kQNo>I?27A``|4*3;6q>@?^=A+(Qt#6h{F@96WYD zJcvIu=m~j>oZJKD_?)niI2LV2;9VFcZ-%(sEW?kSgpJ1^2bG@Bn1f^SJqWY`)KcJP z1ilS$hyve0;3%pbYfE`frjt`XrHrjtjOh~iUB)@d=Ur4aCW4*ug@uP7ciWzLI{S*~Pu z?evP01E!2!{W8TrAAC`Khbi!IjFLQ2{1cP)dJGHuhkRhNK8|565XAwX%2Xn1u|3rS zQGBAwniIoXB8pd=tjZWxu_*2{SsgK~#iDqh$vQiRRV0ePXR@w}VJ#BHN5P^2?T#20 zvi!EmdOn7QEV~m_taoBq$nrFkB~hDVvb@4%O^#s|isI8u*5Vk}LQ#A!STu$<$FNq2 z;%iOT))*EPK4`M`#jqBNk~hJko|>%l9Q^cLFMx+y63)H}+k~%ln<%Z#o*pR0`w#PG zOFZF&rI?~qu_oq6OQApKQj@t_COp+F#Pa>%h~;1Azh~m_xWzsAJBms@Ott)K1TF^H zhhxPJ2)GYkw6m1djY1Ru36r{ExdYlb?rjjg1;=7i_XNOW6rdE|0QeaNC{Zg=MoE;B z>XP%IvK$=~<;|e)58{`X3L=d*#jOC()e3PV5+Vur!AmI99+^j3mkpw13ncbKg1D|x zI>9p+v1eSgt7+amv=bWgi@N}5!ts&Pr5)(NS{n54T`|GL}Y@U#CJvHcsohm7?FNO!z^bklQGs?qgc$9viwYv4R;{p zK^*ehn~;rFJgj|IPGia+Vb2FRYB+13wVQ)l4Xswo&o&d)bka*S&uxS=~VQojYjH z*I^+)NT%u4zs*0bF37hz(IXI7nSKzdt4zPWm{O++yc>tg^xO4jrW@(?EBW?m11i&v z>g6l>cCR7?8u`^L`Sz#^hgSa>DcHR-X5nCNX*tEQHX?s1Z%0C<(1H4oqM5t~7O{_h zS!xdV%D`W)F%29$_iA2hrJ)yR;`(~2f;jL-74r~sT?94C>|Jeo?;pQp&juLc&s3t|g#aV+@+ zfnET5`ges`M;Wckf%ayNbmfCjM5NQnE@gC|i(jXdJy!`!&|K}b+Xe~Ff8Wr?#$-Y08C$qSIs z9le@rxwbJ^_4BRZbH950E};R}(5n1}yjyh#6X0sq9o)^u-N40n4;Np9s$w0~_=P;| zCs}o|J`;#9)?H&a1iCF`H3K0p=jrq@^dmGAmDkcps;U^CFhKR!RqXOwv*xQxbR}Cs z-vH=k@4$Hn08!@&im15_dI0QDB)(D?ouz{@yVC_Yz?zaaDp z4oBt4L-|Yk!^sTG(Pp8sirOETjNc4l7`*93{{eS2^e#cw9NI z0-&P55DB5M;SR1G(INhO5YQ#h6~d$D+CDCM<(a!6p`3jc;0hcq6rVkFFGBa=aCjyQ*%0(6M9B=xZIlef{}Cjg!@-{U6~HekK%V(4 zz@I5Vp0NTp&&(UkGY?pvq0jP>XTF7m#`Mg1ME@es6uY2-mLuLYHOPE!RlfD2cq&-5 zr16nrVM-^bw6~C$rcWSa@--=Tn!}O z(Wol#h9=ech6|}7)bpa_a5;@?YAhaZv5m#Ur}0?KEp$}1P`YLu+zk89nncqm(K_~Q zz`7Gm?-mc$^mq5*(zPFXf(>+BJM%QFMfNYVS|q*MF8f>MG-{xpMtbiDFI(er8jjpU zreH7{yZuM+J=;_4bWMK#Rs(W&-2Q|+}<9a}ry7Pqd|H>kb^Iwx^Xj%l46tQCh6 zdVt|(Of{*1+y@0;Jy7P4H%U;s8}RUtkf+KQP#9F)$MT5~0(wB{xiOs_eQgAb_SqMannt{j8- zy%5kHmN|&4AzpRmc_k3wQG5+uAM8Tc(hrKfcJUhsei_zo!?E^l1W^2IKjO1*?LYY( zSTY{d>-!<_Jsi!X;65l2)G=WCpRxfNrUJ7}A0(B%r1Fyx`*9Cs&cneT)&Ux1z6R=7i9@Aw8^A3%T6z(e2bm`jdJKnI zs%pOXBF1A$f6P*SrPGZ6IwW7iv5quzS|1?vJ`T3R3fM~X7tj({noq!dE=?D>R962& z0;)6{Y-NQj>j(sNS#5*S_;GDs28P&&Lw*$c5jmA=6D_bv9Bf$@K!gHh>ma}x6d*6q z0?5~Kv`~EZ!aWGxj>GaoUM83|JYKGkqz3w{Ma!ER(&VG}NVR;rA~G3Hg{MYA`MKM1|g3%;-{dI1OWnG4{nMPR6GgNxY-b$?8ju8gfK^%g+#_P5hK6fRAeYcffVUZ^!uZ+ zgF#zDMTnk=2#L{@lTxHzJOpvgCGoJ7H7R69@-!Hp3rY%-@Y&;}vMspunqV^?_E4;d zsgKPgeQBmWnvibVV`d;jXTa1jF$ETtWMBYFv$AG#CfjwR$=NldheA9b#hW@ooRC4j z%_4yNz7r&c$-3zV7sd>tP&nIkhMB<3LYwbaWRS91g<>U@4J2Hcz@CsJS7cZPNm@%- z&uk}I5$9+kB1dKC=7?AoSPiDh@jPb)rDc8&ysr#6A%p5yY5G^oInf+L6&ypB z4no?!<*12y`*%x}X+AQWui#bX85CMz*ISd~&|F~pL1|Ws3PGcaVy7*1&|tx$Or+E- z?<@DWrM3Il8Ed&tEH*@bic6^}@U8m($XVV6`j#U^#S_SPU#d zYW1Wcn!s{OfLhE7R)|QYv66meN*M{D;o38w#YR@xorje!1WmV7RjTr1)Tp+*1=Af< z37RyOuET??Ol{oU&8*irXfSfM%9&XpwN7=)sycfdj3=g5W-roU8e|4>L1I-+RUw+} zeA9}P#_$aKVNKC*=)-(OH)_MH4X}fRxW#FwmmKd3_Zl8E>x_? zaRUyQIEcUYA5Dhd!Xd?)w{e<_6;QzWIMH`?04-q@kolu1IXGM*?+~4r;EjDeu2X+4*vdJ z0%WF=vJ`$%s%tEv7~e%SmFW%KX!&~)P8$w-^ZM(OjxE>-(V0S=o<( z@=P4{MNnRkqhfA=sX#Uk)Wi8WEm9DI{F8!+v``?`tY47}KscF+j+#eIv{P{*4&=4= z5P?fsu8B_9;ef5BbS9lFqcn0gH_48qR6;w!LOXb0OW4w-^}=_UZ>uC0(Jg#SY<`TA zVO=z3i|i5wnrd-rr6LUn97Ly9hAm~NKeR>)>S;LbWN1rYt%&j34=QF3*c8KFNvR^A z1Z5-xD~q)d2dvcXQfMcZB3qMDCeb}Io8Mf5Bx!leCK)9aCz zU>nOd(dhylXbqKgrUY2VN&;d0DEj{$qsWR)IABTCY}>#_7v*#*?Qpb3jA<%SGE9$} zWs&2X$}W_^ceoS|3c9Fy2Hhw1Oh3l?4<@$s#GbE!{10%za5_ft3^Vpb|}ynB+0HI7=QPunPxlqSFDU zAG~iT0dl1m1%T_>LzY`PQdAcq(zhB1+7F#b62(?w#Q-@fA2m#Si~0t;l9OyoDx*s9 z+=2Q{#!1CNLgtUgRqIF1g{rqz_bs~B&C<<-RXD64b-i?xEDHzmtRF4T%s>*f+VKk< zzrpbb9M+FY^NaX&3u*}t%5o_eS?!aOFj`BPzoq9wm zKT8bK3E6_1h0Mvx9Ukh+J;QtjCKr#6bq@B4+=0Q7T)a2Xxh1!6QPHCL+ZGkh--^dl zw-qeN?d$K_LJx@|stt~zB{wGrqZ%GoQ%XCAtuIz0;jRJf^)fV)(@P~VJc73mOic0| z?g9^vp)kLT9t{rmZSUDK91UYv0^WNzO2KQ#^n$g6uwkHcs5?rbjW?qqEB{dn-mtY1 z;cYgIUpb2k(e|Er(9`^0Yn0Bf|3-u6tG7`CZ>MF;ft6ARW!g+jz5No6vvm}Y#zuq6 zr?Fv&BDmS+eRY!$5lk{YuREmT(=B0xTY~#FAq^wNsPIZd9`c?+Sb9^u?(u)J;9pYQ z9||3E|4jZV#XVq#!>bLW)=2Q)W~4wtpu`AzYxfu#zzN=Mw;F~w)yOEu=`1L%HH;dZ z+|QhQ9jOj@Vn6L^Q0~$D<6e2ZOf|%1$~fJa;659r=dDdMbK~=sz_niY4Aca7_5V{<&@rps2rM<^IihO>%5t>KxqqjhRf;7rWrPuxWxh2OdZX@i4bLJ!C>j0@b)LI1}@1qBdzztmD z?mwU!!pt4da1x;sW2*c7oh3%O`yZl&Qrx{0zD-S0mDBKE31O>(L4B$bt})Wqa-u7} zXkO9?yDvk0Tj~?2RJqPQ0PqMh=*uyT)!y?-mDfGsLlr|4;x=@)&7E-J2hbOC??vN* z;Pc`EBpq^(M`d)M1r<V)B2$#o&4$-&USi%q_ zcZ%;dqtHE2g1*ijF7aOHeUL0mzYdOmXy-;a>q!ik(BZD8z}2d|p^l2`!VH|z*(7)m zl6hYDwB5s_wWGte-j%*(zER((*Ea&W2{t+3CZh+DU{()mb`Dar1xw)8-+VHb1BE*-qy zI70=`Fu9vmaI+bgdM|dwI%Kd90c5ZbW>5wxCW45mtn&J@jFiPK_YTCx2Gt(v8wUM+gKSRlj=Hz|lDT@ImrLN@_suUO=hm1q z8Z)L$q+W(b5k0J^_8skfM`Eh>11VX~Qc$qy)h>BY8+bbSkf>OH(46{ahqgpYdNe+*0=)(Iy!y-yj zVM?fSV9S=yp_OWvp|O%vPfbQS^#j=8WG!v$qG)PE2A)UNbPH?@I6O@IPU-wN*&aAB zb4IWBsL0*?K0I5_desX&(Zt{eY%>xKx9k{RTTdI~(6$$t<>G5_3M{ZdfdvX#E52($ zn|Jn^Z_3jPWu_6a9><$N^hAY9OT7=p{=wcW(e&B(%HL6<-9sqAZoHsnCWF*@GOJ{1 z9tXu+2UULYerun@?;|?~d!nwW=WTUV%xJ-(xHn)!0&Dij;ymAk=Lfn+yRdnM%3;}P zci%v49$WFa8E>u^N(2Cv2SckQsg5MX_bV9UU^cqX3QRrbf$Ag%;srwuE(32p1`>*{6a&=Wob z{ZZ*Qy!{;wMbTP3M>DW38jj{aT3c6ER1{~;UfIw#Co6wJ&VrmgT$+V&e2$+K@*H2l z+s}(*H6MoSQr{YY%V>sxc9jIDMOBqGL{DV=)0HFQ?q!HNTu1G9x9G@6K zV!pDc6FsZ_uDfl)GGw|^#pDI9Lx_*K7gF2{++~TOJsv1<&y(X5L)A|}&C^hGG|^M- z-vJ7gYD%TQ*VMBMSD5tR1@!DCJr|Om3p{0sse6oy#JUaR6H^f}1XTg3@|8W6=&AL) z`o|zw`(3w>L59)ffBJohywkI{QJX82&6NYNufky;9?MWa6fC`)G?snUiPuQiD@YSj z9Tryl-KFj^Y^j6;>4k<&99}VizYB1r@;eg+j4s39LPj6s?_x$pFqw)hRa5{iVMKe5 zDJ^?|ikU{mv6Ru>KqZWhYPlZ)Eo0ihfR;0wgiFp9j8+4wG}?ev8tZ{n8uUz)(tHz; z(tKFU(Hj^_?oV3Ii(*xBGk_F#HjuKQK+}petqF)8^GoF?lU0lX&D{p1{6d>xDej{{ z%F=%UDf^O9#46pDK#EIGtSS$E7f8uH38b|ARHN5{lzmMoaOI6tfRvUqfK-fc04aU< z0x5mZ1F3X>uH}vaDSfk1iAp(d9YAG_=(($MM&ohkOKA>kG+Cn=8m$1T;23K)8qnxM zjc(ECIgQ@a$cF__rR4;Tsx|7-=zNWC(ukfTs$>g(rP1daWnz^}ahGbePNTDdRJzw_ zbgxEl04bk-2&8=f09MedIJFmn6iuQ9DHH-yB{Ks^`L78`l}9g-Dv#}&`(+?i9^Zx5 zg{=90{8hE?S&iP%=r+_V6$2zQ4eE5$aCmu$P>4EOh0-;etWlOm*&5B(Xr4yYO(`u@ z(-oq;Dnz+as8l2JwxXdjiD@|eg8B_b`wVCf)6RfTcUHM&our!;z5qkm~Mey(Lf znnu|gzt(8{d@J2Fjb>_8 zpi!AdjT+sd(Zd=&uhAPC{Z=Cnmbz6glQqiHh!(;Xw?v~_joLNZsL_Z4pwT%R zU8K=98huBjr!@MFMjvVPxkf=uE6uXhXqiT}8m-f)SEEsl_GolaqeB|~Nh6w~snn7* znyk@WjfynFlXGT_OEkJoqX#v5R->P3^tMLhFqo@!mupn3(K?MbX>`6uS7>y-Mz?A7 zkVemG^twiW)yRWMgt8!6qb!YbH7e0)wMOk4ZPe&SjqcRw5sjYE=p~JQsgY~3WlNGq znHt@s(FvG7nKol`q0nzM8i$FGqCKzC>l%Hm(Ve)IP;#$o^p-|@G1*nz?`w2eqe++m zEADKKx-~jeqjNPnpwTOsOscpOFbz^@kwz67-B^RSk1+aq#o~HvW>gKNVtiTCF4nYb z{x9y{1u&}W+8f_z9$_Gp%uEPLP$Hv_Jd}_JA%qYh$s|BXNMark6orrnL_>mk2r5-% z5@j4gtdDwITfNn`w$)y>77(lkP{7vPBDNK3AJn#%6kDnGD%DoL-`e|}HFIVL+IxGy zd;i~mATz)HTWhbq_Isb#K0ues`SM{#|H{&5fYPPCJ&X=8dX3RpM#(isYL^2k%hMUn zVCj73{EQZ{w1c_p7~RPz#OQt?<=?*mO_uri21~!iXcwcsj9zARn9=Kue$40>Kq`&* znEQayUm4NP94fz~86`1FV{`$di9pJ75uI~Y9xr1JJt=H6lSKBLMeL$4V~rO^tc z(pbZ&i>2QLQkLIi^eIb|mKs)Sft230%yj}O%j+2Rvh-;n72_16k6Ai;nPEAD(PT!Y zK+19jqZ*)eS*s0HW!$?MJ}7(S1P5gNK0BsQd&=pJenMM$a?a&*&hdA2ND_(J>%p`B%*SmeGem%7afB zxvnxi9m{9}BQK+=jItONFe+kH38d0k2BgaQTISX;+RErDM$ZB%@Am_#@;k`rhm77} z^fN{$7>zLc1EcqWl;uyDJIly@wc+zPMpJ>52U&~?7!@({Gg`=~j!`3{Rv=X_Hvp+} z*~r}OjK0k10Ha?pdY{oJj9e=W%NGMF%afVw08*{SrbhuO&dn%~Q3IoXMq3!&3#3Zz0Y*C+?O}8PNTqQYNR`1cmi~;t76r*Pt4Ff5AKLE-UbR_a)=6=EGETfFoMvP1#s;yi`MU3V# zTF9u1Q6r;fM%Mr-%N@*J$7lnP@_93(uQK{~Ms(JBBK~k@5#K7tWQ&0^z-3G61eW5| zu+HH$p&p}hnahg zxf9I&hPerv;hz^sl|~zLYnh`vnpL^bqX0_JhEh|UgUfHad_xn=q? zcTmTg@Cqv|#``=ClIlq6NQF1>?KLrfLnz0@Oop`*6VnK$&cyVCS!H5A2ZquMr*#m_ zu!;FSm?I`84f#G{VhX^(NQ9lMNXNv`8_nnvayTt|&mdjs4Ks(y4w`D1p?9r%VFzjg zk@5Kt(lIe47zP>ENd$9(ndx$$Tm|cA*GLz^YNZc1LIkF?}`e z;L$(iOS~GK-WxU~{n1uak};n&l^KBxkFfLRYFyo=WKEw-bRFuuR;`RwV?M^c^P?cK zYQG#EqX1%#ZpR^Yy!ehuN-WlO$beO&eiZv@)^)}}WYxY8)!3}H={hK2==?|znQhUv zV){7oXVp?9j{dq?*GZB(&2ZQots?H!btpF~M~`xPUY&U^hB+L=ycxs%A%^)|43kdP zD?dhBm&Y)rF-(07(;CABVweYG7`i@gPW`1A=0pthNenZATa}RuJn0=}nXa*`59zE! zXnI@w>H&HU4_=$2O_b8h&oz-=g#L6r$|k626p_-KX-+o- zyoU~GB0kbTy7(UP31Zfq3cVcN9<7|DUSVE@79Kf@|O<{_q&YXA-eEKY_Y*W_mIDs$Y8n8 z8F<-t^#}!|e}~F_Hd?$W=0@?K4KG^?j~tf+`n?hj%nd2ixG>#?ZoI=%j`gRu2ukw$mfQp@nrJ!R{OYJ=hO=TbIwL z*VqntPRnU37e@)D(&e*-7M63QgJi1~kpiENzV+zlO+KG>;QOI!U#e?ox$m;VQq47Z zH=-4fa@|Rb){t{(7{O5L(4+VXR{JJ^Sp^uf4Q*D87fxmb8+{HcG)mjZPpDiKFdYJb zgPKFtf4R>~y2-J82Jtjlne=t^oy4 z4I^n5QKZ%(6+H_;@v<

    E&9WQJTWg;QoDYJGKqF#pbhTA2PMxEYi}u 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


    ^XG&*ywxqaz}taT0~0e_#&9v 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�)cTL3 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

    `rNeVCjhJ+(xJIn3Yv?VpqWxLgbRUh;6lQ6 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

    R$$xCzXL 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

    DhopNs51p@%@)%2A>Bggyf4__^2F z>F^4rg0yR%$i@pz25HN4gi3{0g0$atAe}=Sg<8aQi^%$g!XRz=JfX{kz6;WI{D&fY zKxDrX*{dRZQ)Je9+wT~V4r7wgTyb44vNDiPM?FZVW1Y|@aqSe@7NIamhp|KSE)v&E zg)S4rjUsCm8Wz`GBD+}V zN^$);NVke#34JWIVuS5kEp(yK6+*uj`n^!vM%(WMAwNi`C@8WGAYC%eLha%@AhNK~ z4v@BTnb41gel7I0&>J9~S8t2#bCJ2QO{=z-3(|TML^fMw^F&r5vNa;xB(gSo|+=|};55K7x@Tb?9T0@6OJgw_gmfON`xg!;wxJfTBEKN7v0 zgzgafxzIx(9qz9|y080#&>N!nme2=}_gC$e&+SEpkYNc+7{WDkn0s1rL2BSiZA`wP5vYtd>O+k1Ft4XntiUG&?o#Fi>h zE`$>A^K}Rd@MRrV_yzv1h?3y(4qgW$qVpOgwAw>N@*yO&zC%QU$u8c-HzJt>39Z!- zk(>$%t*k&2BoCh|NN6pDh-3f~TCE@=*$)Y=A)qBiv;qhFB?&fwuxJyehmA!46!97; znkgKYl|z5E!2B(0#WwNgLoV@htVplW$XagJX^1vr{C}S!f)A=F?4-3|$7;f;&n-rW z>bA@J3H`);era^Zz{O?l!B1>(j~g8?>lEOx&PjlLUNkx=GT7N1s{r|1Mh681oe-CS z7%=d6qm#lqU!@K{_G7I3;NqeeP2+r0j1Gz(It$q5|Nyy z9UMA+MnbkUelpIe{9LqF_O1pBwxfxa;11|J2PV>OJgLBF_IlIlFMQw zKa7#w6C-&pM)E<7#7h;KKX#la#7Gv$NE%}#;TXv!F_Q1ZNPZS0c_c>iQjFwpF%qw| zFFO^JVk8St3QvCJQE{%J4W*F7)h4&6n08ajFFVa zNH)YsMq(rv$4I^%Be^q1@gk%2k(?bPxhzI_D7p8n1On_F62hdQ>|M_6FgM(iknwf(~OVe}EN z7-p=6hli9NgcP26=9#uW@0q2V^?Jy9MZU1!JfRw^`eVhoDl9Y??OsW%yJBfYEKlFm zjp3wT=xh~j_SUbOo3Mmg)Dn^`(My$^MI~9ni>A^VuG&jzB#eFCuzVU;UF;9FV9i4< z*UPJQV0Cu?b}Wt@q&4Mvq4%Pm@K6iZHH#PvK(3mxT3s_O4Nq%#Hq+o1Ym4$4)Qf2y zH^*XhSoskv;A#~t!3I~o{A>WZZrms>fp8?u#<_Mp?Ckshv530N%8K!d$9DUVMN?ke z6l!k8QnjcJSgN+Uxu$L+bc3`D^T4<1$gj_M-Rv<>j8_q@;} zuhGi7q2Yl+TK|&8MsXNxK#!6&@(z-w4%&;>vH|0Qk`C}@Ay|ul2lker#WhXLjRvjY z+tOau(>m0G_1>L+sb)pVvD6{9{Me~8Mq;lIv2-mjI=XVGrFE1OFSmFsc_hiT{n`>1 z-;6W}M}S=3ts_{A(li%mJC1SG%~D&8cI@e&H@6u}L-w56p`CddcEp(-P(9*EwKY~W zfmimnguAt-PVUO8<~UgiDT;u$4ZzxnL+E8hIVN|Zr|mUWQ?nFB#E2H*gtUmf8nw|Zdn_^?f3pmumR7gyz%C$m9%xxzOHbHjiWZ=wi#n#Y9-WDn z+~WMCsAzv8FC7@dVvblElVc4n>?#mtvAU-}CK{3xk##NEyI4JzymExLjHF(5R5bj( z+go;qYy0b|f2U@QARIdr*rg&ubbX`s^huy}V5Gl2M%^iuNY?iZ+u0Fa83+2bZKqV? z>xh-^ukG&0KRD><#j!6Y&WjF#HdZ}?t9*x)Dp_so7Mv4C3GG!xjhM1TA})JwL}z-S z4eRnoi)sg3+OUzPWRB_$dW|56_U zWo2keJguWk5sRmyX*g@7ZWwVIj9%uH`zY!}B?`3o=_n~|=yP~fg9(JC^QC5B@?up> zc$5V?4|7*vL0jlL^1Txk({VW3xuJgu%MH^q@zF)CdzF|{G@Y@t#Hkc%l%dy3xdV++%}vjBO?Z*f<@nP0_!&p6c!Ca9AVL6bXZzJ!a^5F zVU?lowqn;CM-V9V(b*Acp?Zf5USOF=Fx%V0y&ZNuD7UfKYyURvXgq|KpS98C;*ye* zc?FSA$-;#v&zo~{$(#iR1qEdQf5R-#6?krrKF8x*pn{v7GidA(=g$f?=RW5wS{xM??IAtKOd1LA zLvZ!D*8PyC4e_C=71&!rDrLyre0phq z)iVn<msQc=uN! zuyYIHO8Qh}m(~|%z{W-Og>H_{MZYAMKf(pc$RNHKd{I@Q@1n;_z9@OOtQ(`yI6K^V{da%X7Auw;wYJx6_ZpcB7zu`}gVM z8_q&bax5NU3EA2ApnJmu#sjINWKl#JNNJ7^9vL(PMU_KYg5Qh;c;f7?FZ9CmTV%xe zM`R{Ji$kDnaodKCJ6FF##AyEh;liZ|YSI2Xz6Me_^4xSXoS{>v%Cs1K-= z=Uo5|D(A1_cYjk3#RWv3^63{fW8(fMH$`pcyWd)Z!vZ8=1&+PO*~fJV6^QIVc^4J! zzIRY{M$-2^Sa{KsD7yzP{Tb`px#KRpf}(?H>9joc_OqrOBk6nU?O!6jbc@2)`H9~0 zdUi=sJ2tD)R~`i|z1ZrneP;n(e_(`2J$Yk8)f#_Ib5)?U&R@4)ZQF{ofPMX9527KZ zy|HLP_zv4mu5F-XZ(h>4rg_b(y5_Lnt6rJI?L5l2g^CSe6T|ib6RGxrj&T2s;R0MM z_VOkd1;gDP1<|$&Fn-XNQvXN)QGrK{n4o*Y1^olVc6MyrD&xa>bIqk4(u2Z?my$@7 z3XGYKej1Lq7xeV&6!4WIj>MM6f==wm*U^4T!8G&))EQ9Y{~R4B>K#6A z3oES`l$D%p7F#cv-PhN*1AphWWB)|_hQl5BJBa<~I)*UvpN#<9w$5&)fitc!m(7La z@JN5hvM$=xucr-%EkkYH%P=D{+=Gkjp@D+gUHIRQDUio(R z4Ln+S2S#5}QE_;vtr&OmItGf7wb)2ATuimduh0j;bE3?Dk-Yqg;5VTe-KBH_~m*uOQuoG2w1(epWErNAEy?7m5aoUJtVfJZ=ip z<0f+misjM1Ew3DNBolmY)@mOZq02GE-NcSv-6IHQ5u)TO9CsB*$)lr0p|fMjLUNrx zjw0-a6c@`lo{`20BHvmtGlx>oJ{Ha=jT7h0ME{rI)p3lCXyO<*`?%BUhTa$|r%HcS zsKRi4T|))Vn{JY0&Zbwnf9@)UqPu}2tlYoOe3ZhYBMf2ON3-6*q3c3hW8Pflel;r* zhhDeG?IE`#>{eBaZ4*5Clg=aGrM1`<%Cj$>(^9&=zCwBSb2hlko3Js9@?5I*DywS! z^~&?rOobZYdKZQg-0n{FQ^=!WpaxEtW$c1MkNZy)NL8@07F)P_uFCu&4n6J?_)2m& zu;R7(oa&%HIy|l#ZXTTzBx(-U*Qvw>T8ZMS1q(CqbPiG*k(@k^Qjm;o6YA8MNmd3` zi)2pRn8{WSX(u;n#~D`k0*>4D2r9WM*c3t#V@|Th|CEkb`D@CnD%6;-TO8TsRdp4i zhN^ls=6WmR>rhB(UfF=OWO%bP7NEiVXxLq%yg9iPygr<(yt!FiJ=k@g^5*ejA|K9I z-m#hF)vHpehE)L5C=bRcH=Fk6yWT=T?f`=Eu1h0#R~`POQeM*CG1g8{?xvt0TevFE z_i{p{Uu6!zpVQ8VCgPqO_&8-%pay%r)?g2zX65!g>3R^B(y7k^Q+dOJsF3U^Ik~UH z-;`Brs@T)hu78TBr^VA6RGFt;9t>DL?mw`4Q%yPPCylpGfRqCvHi5uZ;cy{)NWtHf zRjX=i*RYQX)&}u0L41(2N}6EN&2Nu;DSIgm)K~k1>}eKuUblmpC7!f`N}6RIW^V)R zt-OrA6k897mtyf!UZ#?YttVLhd#t{)s!n^DWBpA$%n=Xdtdizf3AiuiaX-sm>^(#& z0~T3yPfcgQBJpK36r7i^M=$=SU}rPlekda;kZ~ylzTS?`VU@JnOSMkK^ z{}(1R?nJfF{ddy0)9!{mGul_6rV)F)l&jriqU8-Wyj3aMO|(3;K2%>(tz)UIQI0|E zD{U8$_MV`!CQGRY0xgDpE#^q*E2$S{E_}pf)QlO6} zFbq&6lOy0h-UtuCDb({v(KBm<^v ziOGN&`p9I!OnqcB-~@eSGT=lVJ(B?^=_8W?v-FY4fZ6)UWI&NVG8s^;k4y&4(MKi& zO7xM*fVu7zx-UDCP7$2oCY3zT?Rg$K;c?GJo^U;Q87bwALA6G&Mcd@6loO8o0Ai2( zWBeU^5ILQLn{@fq(dCoJeCna|_u`MrSyf-#P=-#Gc9cSQkn(i0YYCKdsn?|g-6JMD z)L0yZj>k=ADf1&X)XbD;le5O-p_#lLD&=UhseLqr@Wvg8IV-Bgtw}c7quV<0=g@sQvRR?`4HgpVW@>C-BVsl zP9K5ciFs{1X!Z~Lys4BwYR!VYww)sTla>{#Tuf8l- z2vY7n!1kE}t_p{n*~0?-We?g%w(ETHk?r&WFWIik*-IyRK^B(PRtIZC*vPTAhIYYH z6MYl1UWc2neS2tlCkBDOiJUzueLIroo0LKwB6`_2KQ6$O@3>^{kCl709p7ZnRdx^< zHU!H3^%WdIfp1DyBPPiZfZprMH&q7^3GsLqxOIqy9HLi3oW>z$AjBxMzUiLN5Z<_( z5leUK0xRQ32qSMurJii1>_qXZye^fxNVApKs!|tgPRMIfsi$amsqy4Jb&2Kbh3|2H zL_d;|y4=c0#{5HGe;e&f99F3-tRyalJX_$`8ty!M2fEZ!%Xc*b_2#~UkW zR_l0s^GbIPcR1uVTAl<0dK*`~c9k*=1Ic-HeN>}UgE|Ob-b#JERv%~NmFnX|-Aj;U1U zB;Y>Ef^-t3<0-RKPq$ojFyV6?c+=)&+zmCH;?w5pV)gA*Y4aG}DvNZ|=DWTL6&LAE zI1d#hBdsPQ5syofr(ncW&_~t6?c1)>*0R*=>jtvar?SXrTAk~0GDW_#To9zMn0P#R zBJl*8fLWTpD&sGZr2hrB(pPgeQt4DJ(%0mX1KCfn68q^@+P-hFhqgCQuV$AF9AbOx zuu88X;z zWh`}hVLs~;(rTV?Hh2Q@&6%sckK-vx#JsDgO=VVPo`mdHK0L;oStn`4FxlcAdp#o>|W^n&ZPw;^F2_xhvV+$tS1G26mqBGut)e;g|Lf z#IKRXi+pyo{MX#&taku8{w(U4Y^bZRlWgp2QG6{3SFyi_OW<0oapw2@x)1cvk|tiu-9kLh-J2Mehu1!X3UyU9=E5_W&5zNC*0iK zgZ&!2RAwiOc8~~r^U;$5Ebe0Q*(}Cv+#n0PS-8j7NBcYKx|q3z6L+33+>QNYhg4?o z*ky>{6~6AC;bwG&!z!~sb1j~oy;3C2{Csle09T$vK7Dk?xaZ;RFxRWhFgtzMhv}zn zDsv?BeE7e?$K6ZjHa$>NVJF5Q zCMtOT!s$!gnk%aUwArdkh|vkw*45Yf1NF*vOegW}j%pgU*p3u~5#Fmf<1rUC1UnVK zvtG4RQCZ~=t-`*}xCpK?(bu9frdPhFX+{3F=wb zWiZZ-bY&HdeW;(#cp;toqvQ01PR7}Z)H;fQ)hl;Y1dL7Xy78mE=ekxdN*@-8_zz_HoX}aCc3iGtva1l#^s6AI+2GScQ5{qrR=1N zo6mpt6H$i4c@T}><9-Ak^dw)_DM^pQi94LErQCHWUn_6bjRu>wjJqdvid1A-%d==Y z%&UviJkx|-yYpMJ7WWwo)u=fkZ7ok?Mp)xmj` zVR8+E&S_*lN5|KWK=<@y2=kHgZy`}0_qm7(H;G7ubq@BpE})oZK-;v=?1r>!aWsaX z9HLw0*5pjC&$?YeAac%ZXWWq0V|8y61Q$?i<2v8_&=!y@*!Zs`lF z>@L^sFg4*}WVbhaOU4r1WI~6I(@}PBE+td>21&C6k1#;He*y)J@fYc554cjGp7j+} znw%x$L*R+ToR7oZbR!7Yak)#!@;ogyoBFB{NlxWic9Y%1ExnCB9otpjEbf8aja&8A z-q@u)^^0TshL9S&!ny;2c-;5m@05r`bG^#=6anignXz4Immi11z%7+fLs?lxD5MW+ zYU}Aif^zCI;Z`50uE5U8=$dd)(TGz;bEty4aXCbP1A&_aff~Aws;Z#b0{QI-Bc6*}#6A_~T5 z70j!%BVui-nPw7=pR*#4RsQvuE~2Dj?kt2vsWT&vnD?rv3DNn`sjxGmP+8%xZ>Xz? za^4Yf*13S_qQ7r0uM0F*)T!+e=la@O#Hwa}b8YErY)T$d+ahjyCucSsY6#Lv6KNfB zxZ^xhjp$-S^B_&=4@aErb9Xo*G8s>rcE*14dL+Q)w zpa*#H3@a*BGtSYh_r=@Ln~F*mYACG@qFN%hm6%nPmZms4$ORENJhN`ab#sR*bAT&F0`2cChu(Tr$PVNxWXyei5sSJ8^PY8ri%v%(XHE_P;UWkVGn6)UT& zsHlN+Sye-b@|U*wZssx|n{Qr^GNQb#$2}2$d2;~wNjO_xe)*au4taSk;z9{{#mH+h z>#DP!{Bh z+J9H4S@p~6H3xW%x^4OxQ>V3NbiKAKL;P02fpbfs+|=FTe@;2+q7C656*`P{%@s8b z)wHwsZk0vd_}Fi_9!CeCk&bhW9*>T_GVQn@m@XYR70b9C)~^p%H2Z_Wsz8}8sQ_lm z;ws5qBvck^Kdi_n0o+D&S~IzU)=ur+q0A?V_{vT-K6#8%L#sv|)?xCwWR$z<&iz$Y zwMd7FoQF<2qZN@>)E=W>=dW2=fgwq(UMYH*<`8bIp?~3&j)|jGSwVNzoN@QY(F#@I zEVHT>X9TBaQXEZv0(EL7$I(K@)~)9bKFVN99M#f>O0>HuHQ%w-8UqzgQM##dbkVb} zj7~|~F|}e0rpHk={Uf@Z2DEQy;xpoCN1BDdY*n;+=9j6PP;eu3RP3|9%olp)`iga^ z05p*gzo=Qx2xfnoU+u{sLh+YYt&ih7=gWNKVlh-vRi)cxY{{^~$k9B&iicw1SARvah`HAkwTqi>rS#|NFW8c=28dYBZ)gD9F4 zy0fkw7e`-bcXa!n97nIb0%!ODZpYNo=-eJIIIS0axi3DaI`yY~xjuyw-4{=da}R#(L7^QOhotwV*O0Tdc&RGXe2M;8T&A-Nt@M=8(v z5@i#Q=xmtzpFIR>R-qB<2R8W3bHac2Q(Cc-o;s&f_la?|ooRKbo)kyb#M+!6OZ|12 zAgfce;%Mp*Q0oH~AvI_5As)((^2)=2=se+EURC_n6da9z?TtKd-(#P=3m?VYuYi@tfT3cBOAf~eHR^SAcP{Fy=trrZ z8DCXrcRUYg#rH5eK2Zj!?jl-e$M>o)>MAj8!jLv9a_7YNFgh%g)lpt|#rGOjMDdch zJHEfsLB_LVQn}~9v%rtSHJ8!ts{lQS8aZuvFOS>JI(s~G9Z+A73l{2|oBg36CibGn z5lQjQ=z`&^sD{w!3zy{heq;<8bp=sgTkXdP0r%x-pb$GwPKj^KnGPP{$6V2Qulld5 ze8jWeTvXEk)u$udlm9!vjsCg--B!cJGM;$E3|r)+dfzp13l3q_qi}FGb)GxARos4V zbVZAJHnm*R+VlU>fFsFU;+rttxo(%HR&R~3YF{m^FDos>HA8KUJ?H2=7i>N$Zc>lw zmrr#q@jdZrQrBTUPieA+{j|pS6GuJf6rkGT`yE{#$BeX;OM84n$MhK0Q#uN#BfcHS zrATv?4w1#`vBj7*nTA%$!wu#cN-lDRym)nb7hd%Og*!7;iEd z=FBLK?`3q-B-VQ7kiG8N9k=vHsXB7x++%s*=*7-ScJDhz0D6un?(F2FAIHtRW2PrE z$H{4W`NO#0B~1}^N4j2#?`d?HbRxr45x>wd&skGeoEEq1ax_B6%pvm&CbF9c||SvG?xbQB_y}_&Lc;7|4*xKu7{fAR$8x7a;*e zRL~5QAw&`qa{*K|gk(Y@xtW=8sany1bvmX6FD0qUrD|JS(bB%CC}^!kdy%&G zEn00sX=^VpwQ8H+XRUqqo->m(7_iU#`{&E^klAP5_S$=|eOr5-eT=vGN}EcfGg0Z; z@tG=Y?%8n8jpjJ-?D$MM&bQcI$Baf*l{mLEcfy4Z%SQ1=mqW6B=tOm{b|h$NtS0(8 zI!a>4`&{jLYii8h?AM7E{lZ5P*OE(Uh3`tJ@gr+m^LofsN-(@=%^)=~ZCrnRW=is7 zavyrhnl9d?7FzlY+HbO~_IPG-{A}(-dk&9?(dZ9e1PZ}{iVnG8e$>A5!)GIdUn#@8 zbr7;JDx-Fcr5(f|sktS?)0#%o~ALdHUdq#)c;8tcNO5tV`~qY8&qO=hRNl5)JqvJ7V0=#U=kfPejL zSerzn@PPS-HKTdVj^^298j*iz%@|*8jVmh23(;gOHL;0aQSPn7J#!-ZLX~~l*GE)? z@()77Uz;BSBz{xfvSTq}Ph1?=cchZ{9&`f&zIT(>*=)6lRs}T5zae@M>)?1$!7!y`P z-P*0$Ol}*aMxw=|O5iLzta-gY4$o>@fziw~HZ#k0)-0AqRQYTe0aH}H_}cGGz-@%~ z#ZRED=FyieTddsRkr9gVS-pH_wqXsv|L2z3ti}y5@IBTo^~OdPv1)sMY0cwH%yRp0 zELm20ucY@f66VzVx+NP}>Tsb$LbkG#mTU;u#N8N)N<}yDSagwcoa9&FP?NnBSgutq z@nWrJu6Ed%_TJwunUxpZDyAhChU+b`4D(i(YqjZ?UJIc}wYP3L=tNX*69Pv>To?!Y zy*p*ZjEFxHot~8c%Lw?4e7Qpq&tDVq$YWq*#G?hG7y!&whA7k>a}p?PAz-*yjpA5$ zo`nQs1c@1jNyeSlGU8_;ycM*fo>yH<{r+;c067J5&9A-CvM?hM6P?jnP;&x7GX6By zX2bys_6L4%^)QoMXDv!J1|Oh^Flu23D^{-7N-nc3g^5GXzb37TvDBIoF>4&$SyfZs zRN-wvJc$e(Hu00i7hh+Yu~9I&nxnn4#fVf6qt&DvDHm-8m;qJ`MpL2Dk;5VpJmqOcytcUpn+o9erwuF%f?)>LMu67$q?U` z(zqzP4NG*6T1ViZuW4C1%*@zEa-TZ-BTIp1vnIZBzmLMrc`_!&_y5F_EnW}K)8LKC z_6ckLk7`+3NEQFVGHd_pGaCi5PPb;YG9*(cB+eOU(qQlmsv}RJEceC_{b|rmu}(h5(++1hZ5YV`>U+wNNt7-7;a5ewNE6F6Q>V) zL%qLlC0-iUq4QEy?mN`bQwT9sY0^>9kj(m!)!aGbHt`pPCdsm;0S|(xE zN?mU)jutOC)b%1t!^_Q7+-jLEytefAnKWR_&P%h=t{W`bjS*f2&Wnsip!Du#S;)|?_*Mn!~;*H5LriaeVBm&+{74?mg&|6g3K5M?pntIE9T=mN3 z+K#VV)YcV$`yR-rw(a( zC{>dPSyB31mW?qYL8b~NQEqEdRxh++eQu!`2^nWCM2^kyy77!;$#0&TNY;33S;FB) z(+a;xYAm&hVb^<>m0>TgmS$Pbvf_@^m6X4pl@z6l*Slm% zeG^Z1R6Bn=H!1SfOOvF(pPMA?!g=3olJvjlCW(r3`m9(DiyQXF054VFJ1bH0*lqT3(H8+97h)j1I>{KoYJwXYu9X)VCaVD!e}vlZCyvSv?E5+47+b+{D6u-inGrqM^#+V=)p+?kLsSfH!Cd#l_U#xS5 zhGxg0WhqPx8@|7f-#c!=yE-v7NTEo_?zR*_2denw9lepwhlLGr14QfY;4Vw1_!^LE z(;aN4I;3p(?zWU*G``UYyeJb_%aO<2JlK(pW&12;#A|_-9mn>_bIPXj%9WM%atvL8Eh zF}N0~I#pz!xn3zlZNIgIIPEDAiLTi)S{c!tmEyQFcCB0d>k&zVBN=y*i90)0@iDZf z|MsleP3;N+?vV*lW2m76u3);-hY_|81DaW%_ud$hK86%I{?#;K2*b-@W=Y3?Z!JmL zo4iggdOv8rud<#jcevG|phw=emKWD-!=;&(dcj%vD7uRvH#{=0t`X|fm#JFwT zRAOR_ZIo|WGskybS&N8qpd*H*jVt&KtokO34dUB=$+g;m%jMhOPo#~!v(bEfCyoov zb}yvV{@YTDy6hOknCZaOi*IxB#3-1rux2)Mn1hN1Q{6{18Bw9bdFwx#mqyUKN<{gY z^lbQOHUt?gt*mG?E|Hbzr6w7T31r0CTCJ}V8(_ozZL$CwW%5%j-%F8ahQ^J<6dz!D zs7VumV~nMUXn2f;Fmt1mjM3IIxZ~0+8qM8wK(!QKnX0e!YVVGy7g4(VMn zTuW;l4MgpjX7giiOL-I^feRWfVu7h5_fE8AidRAnaCp}mpJuvJ+`%n-5eeFnckY7X z8h59)DDyFgr9S4?A(ig5mJ?q#?0&^+p1<1w>*b|RoK7beS{F}_x5i+Du@z2v!jDYkznLuV-Kd{zM4PhkdZEH!YmPk9bwKlyq$eogG=jfs{7tdPK@R@{Uy_`T+ zT(PW0nyQ^-z4CEnsVX8#Km9n8NWjlVCcrQR1kcATTj%o2D*MZlwOeChDz0@@+VD>d0B9G|i*fywh2qvo;CSdz!*A&ja}lRGO=~RMYP^4O&dBAv-T^NVq|}{{S{P zaq4n=Ag^c>*c*D!XpUA)U#wX4|ia9 zTC-c!7@HJ0#*Uc7SQ`$H8-bKGYbhgdK-Kvm%r!D$@Dn5S)mYbIX;`s>Z;n-x$guW~ zx3q+Ky%LCu8*v}B7G|`i)WrOjmw5{veM_6G{tB>ZJF+a*vt~0z7BcfrYv%Z}#d_(D zs{&#wY3&qCEeu9WezVz8JvX0Ggt8odLv(oT@j7en_>$Dsz&+Klg6>l?xfCh;lJhJ} za7F=fjazChLM-)gB7>Z35FjGXkwpk#d?jSh9FZ1QqT-a9cHmn2c9nZYjX9r5HYQ-qe;?TC>LR)K}qKSn-TkC18x3 zo74c#{Crd;qC*TvR7^SO<5?EhZp0f_d8M~v1-`~cUp^7;*l2ZNKs$bor4-r0hBKRs z2L9Kr`Qx=v8w<13Fs`Q@|COaGBNP>9rmv4onAn_{dT&e>@A|!^MjSV24DLK&iq}xu z|CE?o$Rqn#TWMi)2C+y`SsT1B70dnLE2|c8gGj8@z1!KBW`P( z|GuRyh$Yri>+61KgxTTVGm=iNZi$r92-0k|ME9b{jWlu<9CIJ88W=RX4%cFAiM`S% z&V`-eCLi;HA^O&@c@&{h{hY6%=N-hyxQd?nM|d5*tYpKU&f#kjoZHC17{TOc`_%|$ zI`=O}F#FklJ%X9e{Rfe^qhHTqu5+jR5Npq_KnqA4xO4OnHVcaIk~~U*S;BchmJO zXS|&yzEku1FyT$fob|cimdxzudSfy(pX;s3%$(rnWK&pxYyjGfinZ}s-SE%3oXsu& z%y1Sr{WJa9-uBN-BfjyUsYiJ0Khuuz=6^L?h?_UmFmkpZ6yZG2@}nZmlif z>sfp~i-r7WzM#dT&fzOs%=e%Ck`@b0@HMUYiizKanf8D*9gJ`*7B5BZ!dR6ALX0(O zG$0|y^-Z~-(+4Cu%LE^hj4!=(KPI{dpAX;8`7V6sPH-Q-vB6iaTfVZGKbtAS6U8`n zjvqJVD)@LGIAjrL^N~YlIOh)?GIxTH9SY}$@$$v6cjd@V5`5rAw(gleHpUsB%Lm7p z@f+!(+_0Cb9#f)e7*)A3KN=qh-Z)~v05q@XG@_S1xV1(aXGImqeag;Qo zj_~tI!@k|bN{sOPO$oo7#6l8$J1M?tEx*8HjsT?6eB3YkutFpJs*lANHI&blboozw z|AX~8>u-QC*ExL$ggHn4Ef6L@o9}@zLxOLDh}Tp279#WDE#4SO@QzBnk(}vcL!9>r zKR9%zFE;VGnBc2T@%oJLJ2|Y{xqmB%*+0(ra#+9!znNo9?(&X!W%4x1o>ky4uM3DP z!M9q(YEXXIXV@38xEV(H6)bg6SL0HA&W~Osv;3G6SHlQDsAN=war8W_HfR7i>#x>u z{t0Ts$S=W%XUrXjvi|sAuVGz2?iXxWNP@4}#CMg1-(up1PVhY@`k0x2MPs!#G&FRx zHp!K&X<5HbO1^)xrWJPRnl{Qd5r4B5C8te(2u~}QH`QMWi>j92rz1yEJq~mIGLY=d zMB;lKntnz>6a=9qory#kjh1{S8hJ&MX5*vH1X{|KF6)v|M^&7_)ky-ocq zZ`xbP#o_uV2(l+nJ7fc$vwc%{tCl@w+H^abRvSk$v-6Y3Kx8t>wTb>LG%)MLicFn+ z7ijFZd-0bm;c+BHm2%3B{IY+JKcKk|sBxQ-bQcypk8}>DbKTP&a~{z&*B79sdzO3q z1OT1=uDD8A#;F9LH^$zeT1_C)hWHdU{!q=Kj=#)#+$HXG?!y zU!Xf=KyPQL$Jx`@0U(dYnme2u9It5$oo)S{oxv7#{O+brTwu)|;p$%m*&91rp!i_s zTga0L09w>=v&Sk0di2i20{%z{Vna9`+E#?I?;X0MLjL)>F;huJsnK_GN{u{n8si; zI*P__p7P)r!*~J+D3VmXmHK_ zo75>lc;XRD`+B-G_y43`3S@EAb{aZD=)~^dIvW6=6@^!}U>tKFclH2W5(U@x1Uq<& zbid9V^P{MG7@g*RgTV`<;OdU_-5s^EPq z^-IvDJjz?s+uYI-LT~$h>H%PuMKP$M=FX)(=qrCn{WVZkQB-AjZ+~cMPfI_V>IBzR zt+T$pXOpbGldMC7a~VuR!ro@sYG++@M^FLZVc;5PHI+d1H_d&D;cJ~-ZWH{E3~wbX z3ib3UF@IukdsIPD=0L0F{@(zc4lw z#V%DnNOS+ynfbJ)ZH^)zcd3__x$cfV(l;0w&zwQ?CMUYZO=M^I@84>mYsp zckC7*w?&bLtyXro1~5FH=9<1enrC$n2F|)b3%b`oxCZWs!&US(uhZP`aY1%Oamxc+ z*7Y>^wF>k<8GX029Cg~)vqiSo`z&#n(E|i@X&(l-b^UE^G=hGRx)<8+b~g65VzROz z_%QVq5bTK+93$dioW}#snr^}Fr`4S1{x^g7IxztT+oe83seggAeVIJ?H?{V4Y$Q^< zK7po_M>CbVud1%>ZtKz94&BxKjHVsPtf*?L>S=DR>R8v;+y_H<>8UpWagY$;k_(1F z5XPLYkG%)DLxgMW?liNxbsnvb5K2rXz8$V{Eb*VmX6 zY_f{7bheP=1TPPC20{U)Vz%y_40&$~R9ka@Cl#E`4kT?I>oxa8-FYb}PGqj^@7&Pb z9b0EpM4g?I$hf-67j^TlM59`VEv8Vr1$ufrviQ3sGiGG5Jks1#_4GS{eovwyCAP*2 zMU8z}R2>L4cN(p*vLmobb5GYNd>y=+Zr}`K7RVX8^8k=GiG<*)<}GACGxf2*0LEd$ z#AZ25Wa-q4RyB8o{2MW^Hgt3adiv4qb444a>qYf}?$%Xk`2Jp|(A@KMHsK7tsJ6dL z08#$=qMEY7(2tdFcWXV*$Mwx@$`=Z3F0i5IzEA^9i^o~beX+pg6Q-xvgt$Z?JfuOC zL5v8Cbmu7)tynMebq1RId_7&gYT8*W_-5%vl|dzr25`()m+I;IvzV^*qGioNp`aWu z>ic_pd-_mvub`Qae8Ch;q`8-f!Y_mbjQ{aipTI7nykl{O0_A#o4iqTkLisv7dU>oO zH8ppIu)}h_2yGaLTc)R#fNvQq9*3(G3Rek*tI^k+*JCk(LA6RxZ3I^>=O#MRvJTW` z5V_UpsXf3o=tbU^mOw9A<9cs*YdN+Bn!8SSZU=I;UKDD_avf96N`2gFEK%3!MJ?@t zmJNZ{rVy0w?+Y}wna9mlIO~#Frq=$hE{sX51*}ys3JS|;3bJVgg=t(V(CvEB zCblxQg1buRC0wUMU>CkYb6>5eN1$7;USwKm!T{IkyvPjcMaC)WzBQdQ2eeP!NIA+)V@6d~`@9*f_(9}lTA||1a`~aJpx_g>}auoZ#P&+rdXrmZNrH)_GN4@ahSZpR2^M>W? zIxnzGY$OIVXtU=2FMaaY4{O?dTTwv49@3{g{3ER2i7WtnVZw*?g69ETWGiZ;oxJ-y zqCc0}w5-Lb2Kt}PJ1e{G2iSSpZM0m^qOHd|LNT6G?RW(Gw2S`I{>pBvl%%xTky1iP z=X?t->~t?le+m!A+P~b`>Ik*`Tq5jlxUVkFCqf5AhVeU&xZM@Wl(ySGg$MYBI88el zyN&iw(?hzuUAI#$W%j}9g1i{MP9IB}YnkhL^CEy71kjebuCqU25OxZfBeS`)x4qc_ zb_t*}vlSh<-2iqAV0xxl%NWoe0nNw^!a32>(P@Bt1vooX?A4p(`saE9&&_OZX~A|b zs&Jn`3-Vwy2v(s3W!FD$Z z{Mg0577BU-YyvqS+&77*s?1)o&cIL+#L)Cf0j{NW97e`X9cUEUXVFt=#MIn33!(;C z0p_k?plMy8y?J8??M1c<)M}tGY@p|vynXIl1aeKLX~1m?_N`yn)Y9B5*8H~$lC_!W zvw^-o5;-71tq>V%?&yZ$t!r-CfB^~nb%AQn6zk0(QswxnHQ`kZ_^S9-)r2$e@-QeOYMa)WwiMTlH+(_@ft+ZXVjGOThI=^T0uK z1Ou}Ew*#|TZuOn)W@O^-ll;wQDf9J{71!By}OV7Iqy z;u{Xy?K$NjHStaN^(R2>4EC=JZo$CWrA>S*>(9SPf1W5ZLVW_yY^^0P%i5Teb0_vfSp9!U`3izK%cG~|5 z8l&$1PMoxh6Hr558UP;Jxe2HeCELaW6j$atMMK7yU7d_S1Vf%wTJ#A?NxLwUcI+`X zoVwjab2AnSwA+f(fcs7WJhaUcP@*BpL{An*+pHMO(?m}@6agh80sU)4PfbsI5XJ!b zR|%wjfgm^f&nN)0$lFRQe@R|IK&rDE3C!jcRSl%g%%Z;wBoVFfd6|=KbgZiZ@X*pe z2HFpR-By88vFTM*m9qz;oYrGylX4xjaC0v6);F!f=G$Ahq^Y-KbD*=St*5W6IiyXR z%xnHA1rEWRg4nv#3Km|MPOOQW`*57XWVRSV#;l0-Z+{STrJ&a)f4DifzWvEYo(-kY(;<^3NfNZHLM%^WrEXILmZH?8l) zj?C;!nRNbyN}zHH73(jVG&|#3VDbqQ>!z4AXM7MC4`IxXlu0Gy2LUf8IQ;Z|fvS#R z2!$#g|6c&l;w;*GdV+yks&x1)QRip_ZPMKFuY;h32uM8>HWcdXSl6+UsTPiR{T$0~ zmTvOGP@ux3#Tg#p78(-Fei%kyI(`n&i(nc%VIXW8ei#5dzS%Z*=S)qf1-uhSN!_%n zk1h>zJiK1koV?mM!>3S>u?e_vjB7d5(kK6d9Oy(0BcN?hPLZn=Fek&vnmWjTM*gFm z^LV3&76i4iH3`vqQBE-v^{NYV(+Tu%w#k2IH8!xeAd|0uTnEYD>R4U-PCes=cWIWno)pj zJDWq)Z4`P=-W$iL5iQZw3ORF`Vm?vO0Ypc0C+!?^F37ta*)1e+L!b|sE!H6OS{qJz31zpD#H`0L%#Z}81n_F4$5EcSpHBV|%ywHZLEeR$c~kN}gLDq1 zZF$Qa58{DU&b!?6&QBm+8<$LE`BT12WR$k$1sz8fS$~leeG6pch^)}_8Zfz(9``!5 z$n#A9BLOHqj>z(+dHziRX2JZg?15+LqVsxCReG=a!=DUjb0FHMGG~h{mjJ)$-=KeoMn{Lz};~1IFF6p(CK> z&1Yb0WkXv7yZNfu_pJ=A>(mzJEl6MalF=%83kyDhv}l#Qi>7=Q5297_F6IY^>rpE8 zB?XTF<8*zE9u^fG!b7@?7Gime`60u#iR$9gg13RmcHK!2mldR=dUIXnL{?TX0}uJG z4rG?+Em(mEkLxf=TT;-Chho=7gz**Ji-%dRJQ7e|@ZWeSaXms9f5BULn6D*oM_sU` zgeWWiW44rAQTMP1;Mhp0KuiSSRsxcZJt%?Mlmdq8*KWH<;;DF&>AMp6KN6TtDUiR3 zAG?k0#BO^*QrV!SP>NE(jKPoHMn-41y(_7xE(8^!fyu-Vt40+gFw^Zw5jxwDR3d5G z6%D1p{VZzBZflVEL51gvp+}(a!VgxYtVl?ben*i~3iv0O>UE~NUsC;2QBew1zh$aq zuC-@5O%@enYyQn_ZDo1Y>F*wu)>c!H@iGMP7?4*xWjY=VYrBFU3~Q?^@Bw33TYbT5 zJQ&v2P|$}5!`d1P?!bd#Z7UgLSlgB+`Kh$R_JSoy z8&=pcWfdL_E4+>$9LCYHTo2`KDEK^RoX%S8W3;@^f^Xp|-C2vnl)SEj=kUPs9CY@c z*IjTN&m73H1pYrQuZID-PV$o(0)tv!Z$S#?lzc6DlPnRbB)YrVW~Kwm)gusFNl17x>R_2)Sz727Wc3K2%MaGx|?ILMvskJTp4;76PV z&@O@&v?AQiZX=$ozhgk8?N|0QNI+r@0cq%?omVzt0c@2(+IBIe#B7lm+IcZhV(yZd zpDP|t{hA)-elv}@lsoNg1e&;k83h1iXon#%BnFrQiJ^^xNu*g> zKTtD-mbH?cHc5hQ?QFL>vA+2{Q2N*YKh@D>7w{9oHvF-J>ACf_ta8n5IGb(5gHY0 z>g~Z05$J2`=MXGy>RjioK+bZucdW-zCr-k9)|1O)>b%siqKG9F^3RTArP4A180Kl zTi~GArWQ00B6+4>!a{1DIKxLUFA75uw@sUxgYa&N*uqwA>LMm;AoT@ZQ){4EtW7E6 zeClGxucokCXvRA9a=jqLZtA6D22;qj!ZnXbF62P!sHmE$m$|;5M&1zt5B1>?5od){ z%UEd0S?Q}@ig+uIc%SNZej6>a*}0K|W?RXLJatLV%-tqe zhPLYCrvNiQ)7uxY&>-l)9-daM@D?-y$QEW+23Nu!S}jPm!dpc}Ey4+V3u0usZMTWG zEsN${-Gi|Jy{~Y)o_P&qmM5rxtuU--_JLqoW@~Q;!jgm?2Dl(Bs>yhaWebQ#gY+!f{$4OJii=7xmPm zm>X^s%wk|H+$|V(3m|nv^ewIMKB3hf1@6EAg0~9_?-v?8pb$o1-y{0^UIp(9v}uK3 z7SMeP8Vtb1z9OKHDroO|o)ikds*jv7e1no|2hox z@0k>oXy9aLeN-QR5V-d;E4#X?5N}sm?b8asrBD7jfFBkCNYSwd_}lvUw*l4=?Wl-B z{T+S65WqGDD{>$n)5mAv+}eTQK=h}6%ojM9DEywNET@2~euSX#!pHU8Nnl8q3<#L% z3U+jFXc7L)!u_H>GXx%CMR@HhihV+0vjvupsA$?WQ#>gs5S1!Ac=yJ5ith`G{CEwt z!UK9*K6LX4Oh<2TGfCD8e<0w+k^}oJK1?b6p+4pw*w`$+2)&Y5M@?8OHQ~)JtYQkE z(#I4*T!~)PL=)dC?{a@*tycK7FwBx9EF@_;XJaHU1K96Ab$RlYSnj2-#G+li9O^kQ z?Ms*?M^%?MH2Lv*Fut{j5B<;^Bm(ALQPEiCtz(GJRCEn3;gk3Y-_!6mRyCkm$B|Ia ztmI`7mrhX-Mh3If#=eOM-1+RIE7!r=)VRXC%3J3*L5=rP2`NyzVxSK`RM)JiY`}dd zQGAldZ$x?KCO?S$W;qKl*GJbNp9yqyP*|lq+08%UbtqO?ExLd$lNT3-D~!oq8`Ds~ zw4Pg`Mo*py=JVGSUZvY_L29;FE4*4Cci4gCDy?vhK5jql)n|s9*Ymev>2q^9dzp*S z+`@W2{e!o#&}d(Ux5)|{#F(mOw$;Fdw8BPx40#mr7Gemo%%T1usPNK@R=846J(dFV zCPYtLX!$w;UM0ZknQg6`FyYJ7<-*m5c@i8k))bZpJGjy?$;{5SrLY{W5TP7vp?`j6 zOB;nb)A_Gfc&$F+O$^jG5)fmF05<94N$p)l?L>&qt`#D5bvx+L1=@*DtY?}95LVw_ z(T^os6~e-_LPV?*DJ;F+INZ?+TLcU?-nwZ;e^+&IJJ`s9@2p7-X;z!--kpdOfwphP8mMja})4BMyrSev2|0_D#(+rm8l!ISSkL%ZQ4- zIJ88|zGMvA4W1AQq_r6Xg&$@Tm6x0)pt(%a&4|*?Us(hn;XlCsH)? zfbb7QNNHLuN$zx{MbQaJdCSbE5r#Z`w7|)pL2{|zXOjzx|3KtrlBSPnsMiA6g0$U6 z=Uto|%>>yr>x=5!4~f~M=?@D2;gJvZr!C+|9edmm-o~4DAwOb_A=YUNlSx{N7|$l&u2bmLC>mKYYOSiqXtsPs z&8ihKFno2Yyk=EB-j$Eitu8Iapc#FZ7mVXg_$bg<N&XX`@WfP@t|sbC@9VRClxqwh|v+z(A&rF~Mr;=W3~@=Vji?<&B!t1X*5P zUtU+OjWvPlDshiMy_P0s98oXyUcEMPSMp7$ygcW`lcOodj2#RU-x)`}OJf(p#8bj& z$XfwZC}Q|J}!OWy$}zvxX-ilV?(h}xBJ*o(~0Tf-qX z8;F>66?sXWI$L_T7)q5T<Ly>S1v8&~%2SHT4gzI9|DMQRWZ9a@!HnXS)>Cx419YamE75|STLw)yW{-|je zd>NyNerqAc^(O7qE+7||J}`&E=8|^W7IYYI%WL|!*%aQFw9~Nw{vvu!UDLOhQm|jr zPUnR%LpW1-6{UY_0?CD)^1p=?z^vash2obzfK0{z3pZ{Mnqi@=US%imqyFiFo`*H< zGSFN^|67c9MBt|WnF4z2JZa~e3$YJ__7%3@Iv1PX^oz4_(Q8B2fzbsye1l4-8!D3Ioo5U=xGT>VjJdfa) zt})=0vpuI#ne}}o*)EMYicL8-h_04}FW9haABIeOV#~lDjFEJG__Dw&1eF_DD zOh?B0?#DqY>}>rM!_F3sfjAm8G@nTZ^*{OgrCwy`l?O;(ha`QskWiFsNGRjjb-ic~ z^`0V7Ov3*QqlMJ;;#}(ITLJFF|7iJr?AX$$v$HU1XZwX6nm&UcD5GDJ7~CCT^cugc zHBA>$YEzIM9Rv}L*?vugv)GY$4Tu`?U-W?Uxd+^f=ezK~ybYcSO>frsA-BaBpo}zd zy!2J21CWND(*`hQrU3@?O z6bqQfRt`)RVHU$Ec<@|oaG(mb#Tih92HiCVi#-`ia3?};+TvmZeS<>ZYDQNBP2>4a z1D(9HHAP$82`JgogNkV^n6$;)0H=ZPDFrVi_@X_Al*Lpl#Q26H*u?}t1e}cK(%%{c z!a{Ku{NKFu*cHQABlaO>kz(z7sJc(l~iO98?fr%0Q2|C8-ys(xcr4 z0!pOV^h;AIDR4SKql!VAn~DjSh%{|<5i%KL@Y@A{>Ucfbk(wH1a*j30UkI+Tx?VY+ z#HAHLfjNMCo9EVFpzsHT_I*I?R|^M&XRC&NoV8JkB=fjM;s*e%VB6QY3H@D_jx_7Qj*kgsk%> z3gFyWpcF6Qu%;+Dn=1$1Lf;D5U?z)r+`sB5bx;b*N#8c0A1zX$)5 zwIFRF&HreUvoU=wg-R|L$y)qeEs|#9u>iRRnDRMqI0en>SKxn=wo{|owa-YKr4UWE zfZI$oa{a`lL{lkf93~o!YSDj0;}tYc6OA)Up;BB?=i?E2+35E;{_9$O6A-uIKY{6Y z5dU?pmVS0{vi=_Y>=8+@@IPc3_wPA8Cut@3(=V+@AcB6d(LwSG`dI}L$fT7rB#}f- zzxU%mNPdbRnu>`8)X{%{y@V$cK`c^~uC0`c5m>SVELmAeaKrp9xEo0iDpo9aqvS@z zl3oe8S6OqflH8&tDQB9hDGU0&5C2gy<{AKm|K;MZsMV+ukP*v&A&g}%x`I{EZKObBB^_%9+ozv0X z(%Fw2Zop_t4wErw_G}`tg3p;f$B2oUBVJ@4Nq%!^xgR4?%0PSq4&$-sGqe{nXSY!C z=$NXdFEqQI>L(b&xrmV#dqh090Edb}>4-hhCP?YvArx#C4?sw^^>EoKA~OTh>svb% zJso|D2OJ291m(zY?ga6S9O;>kAfivkHYp0=Mu|S+Z8Hf$I}<-v?R4G1x}MD@D!PU$ z`qRc=)5wU3A}tcvLTy_Ypfx#sHvb^X3W&*V>lgCMuFq1geCdO+oPv3c#pz zqC$*&6ICq~?eE^uy{VgO6whb|Ry^1eqN)Zpni2O{@p~BnV0Zmp53 zjJ(B>{0HZiYnK}3Ym;V7_R5iWn8tjP@@*BS5 zQM2oso%>&Mk#4t-A8*%F((R*eu&6iuZ-W@>@)COd@Dfr z8=!6WX+$#HJ`K>-_Gy>f?Tb>bvM*#l$DN9*gaP;4$EA#SjI(<$fru|FeRp5(^9JJZX}ET2Hd^Cr926t zR}8R_F)6h~S8Lbj+efD)U%tbh4pKdN!ISj3;z@qAr@RU&<3o$Umz;O&fPHkv0lPgp zRd*EFi&>>tL6_X16Hj620Qgg(yq#*xeYrh%xqVa{P*nr=StNW<%0b{J0GVbVRc6y)`&S>`!yt=5SLqx=a01z5A6viluXMI86UT~VwRroi zHy~d9)3Ea&#%Ohq9~~*sxabWAds;ehlqGJ?B5|v@U$W3X&HRo5BBgP<0e1|Ci*&X% zQalGDKmwF&MQ6{t=1w}nz&$Y(pi8W#N5tz2h&WcmX|Hf7@Jlq66feV$o_6I0ijDQv zDk;h~Cj2)DZEE@vyb);W;7b77#CwfY26)^L*zhkJ<1t!%`2M)%pUR?WBz2`7l+ z1`%^L3p7PhX&X0~JUQ}3MvZDBzLBXie0U2HE<0`I2CmPT8%R0w(|mfzPGRsM1}9pB zB-s>T9b{E_9$>@b%hk;1hkQiHC5={6BgO7e@K9%)9|LD^fQ^ChqT+9)6>`G@F`MEa)V3`ax^(I_i7m#*rgb)Q$H08}f1Iw#D`@69YXoavo0fi?&6}1nVE3gJC+$khr=R^}(lWfyq@{bGOLKY;r#ZaOrrDOH)>uIO zsT!>s>7R7FLH0nBFU{EkzGu>G8g_5|FCSA|9a6qD$Ms{@O1Xx?`zg}v zHqvXr=1ZI3k~XU{ZGKXHnrB(s{E9JY>Aq*6({qr0IL%f8Zv(ve_@9se8QQh@TfnL7 z@HY+rQ?$+aJC$K~D%e4!3K^D)$`EwvNO>4GMZr7@R*BR!#1|1;C&LQV&?dT!v0!e=?Ynar7MkvrY$N(UUea5w}N@F0-3?`=z0mk zF&`;G=Top{3RbURs}+p=hvY-e(8xn8q#RJG6kx{Tf2#Hu{B_`eiuO-E= z5~oh7R4&$m0=7b>22|>MD)k4I%0niC!+|B6NL{Q_2UP0MD&>MAf-X;`W~$UhDpjFU zjVjfmQrD~0%_=phQeRZ52UY4_l}aBiHJGeYvsCJ0m0G4!D^;phrTSEAt4e)FrFN^- zLn?Lt7@6-<^axQ0n^o$tN?n9axxjX*)IODZLZv=bDL4Fpf@88u%~Gi=U>E`$QK?-j zbwH(ltWu*8J|#G^Rm!7M(^YDLO8HdkH!AfHl^Tc9PRLuXQrD~0O)53RE$O}r!xbD~ z#DRuL?Z}j=FR7Fh#w@UlRBD+@HK^2&RqAdW3JH!qDmCRn37e%-Qyx+FjPJ*QIkZ%SC|!!or%rF<&Yq*6arsTWl0Rh63hh?G*IQj1jTE|t1prGk%2j$2e} zP^EtQeTn__0hv0YQs4QZg#7|HXoH?Ko zqEa;~wML~nRBEG24XD%(mHLuOJ)}~PtJK}ENL{|HQV*+C%P%E%uS!+^PQva}sfSc5 z?M;dGsMK7Qy6}X=_NmmNlM?nnDph<+&WINxC2V}DN__^Y44xbBRH@G^>{k@*>ninv zO1-2~|4^w9R7(4!%y$A(X~-i*%TX||N?oo}YZTo&1q&(IClu^<1^a=5y@-@3+p9>4 z68&1Gjw|dt3ifA}(*Gnm>?)O|QaLKM2&ptKhZiYKvMABzDz#c+cPQBXNC~YTRLp5+!<4rGBDP z|4^yX@5(xGAtg8p6>PeKU8+*G3VV%$^(fel3U;STJ)p1;DcAu8ds@MMq*A|8*xxDG zDV2I(VQHP1j{m9rS7;x=8dIb&acY<-fu${kfQ1xnvx42NV7nCTQ3ZQU!DjOv)p*3e ze-CNedaPIRm;S{3yTN$UwR|m!X=2d)a2Nj4hK6Yv@=g4uEld>h6F_Knj72WF{qXNC z{NJi*W^>3eBfte3eJ#ie1;F?_o1F^c0gRxDLG#1xb%?Mw{!u=bG<{J)tdD*Wl1O6g zKU53~}i(JT=WU0^P22Co{V2Nk(uhF1!G7XHBHH#%&r?Q7_Fly5< z2<_~|KS{G^807h3kY5dhoE!%Ea2RB)sxq0EXBdPI@uK>4;AwU%Zrfas7hMp)WTbIR zZeL)de8QQGOg8t?i*rHw$R0d{2f=UJY&I;~BujIngl7;#C7nGC&F}H-Ur6nZ`=7X?w-n{u2EFj3*F;)6lHrb

    Aex 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

    nc)wSqG9-! zGyM9I|M3tPa!Uf-^w@-HOXSezc|qD4v)NKhxMerJ@a#f7Ny`l}yJPO~mU$?50@ zfX4joJidPCBVRqSYhc8pv1!;vVrT5kT#e30J4?zC?!Si(VJ9it4Bt|-4T;ui0KYRo zNV{^e=vsB+IDF5{N689LJQWzcxeNT_Nnq%T7vN;6^$gH1S9HYSP_cUY5aRtfJoTk5 z2Z4>7&}AJPy|#n_%yaZ|5?sD$NnJ|Q0*Y_;^rVlDrk!AB&cF=o=1z3t1C;67Cit-j}_w!zH+jQ za-1+^ToUl;OiZc57PzJaJB@BZ>7DOBdh(S7ep%ui;@Ap~Q>g-GlxsdJp{-l6x8RLX z6*rv9!M&mZxN4ut!i^0Qc>fl>9V6F;G85t4aA4k6=ab!b{40B;6c^Ltqg&2ORjrHhdUB4t9n<{}dS6?tEU` zPVN+ePuEXxcW?5P)88bpe+Rm7Cpmfw1SjT}9mpG#MpE^h1pczay*ACHR1_Hdb35Iy zDw!#$ia`RO-|1d57vn$)36$>g2+<8CDd-XZ!0o%-3s)hAA@P~EWVd_UrvOqU&56{r zwt=bL?roofYw{2SUvW!lAJYakv5YDu1-6$u=gKVSALTih$p?H@sY_wP3k5m0x;az&59f+kao--t zu-i(^ngdJc;-h<9jTAtr=KsI*RI3Ci42sL zPT#f8@uad1VOXO{<%8=S?WYY+o+5wEHG_F-{G@9rMy!nzKflg#^T38%gv+&#R4y?b zGLRY5JWboW9;-*;`2`xv&g!*BqEj(=8#)nFpTp(lb*g^9T-@jtz=N%(s*@|6(>j{i z3PJ@))zd57u&Fc1(%Ymev=S?>sJ!xkfTVA)bPkU4*~>%XyNFeXB$fwVUU`7{v`y8U zS7FCflwC%))(M>z@C_$A=}XMoa#r>1D(8a``2w)Vo`um_?HnUXL4tIZ2ioD@Yt=Va zJD-1$0$1~6q^foeHV-a^%mh4(tIw0Fx30mvYA&JarH}qpDyuw?UiJJMA7rdSvRy!~ z6I<6}85gu{ns$xn86#5l&b5xAVBSdO!B89Y;95LM#pubKQKaf?F6haF(P#Qk*J2~< zk}AVI|J_f10rk1zSXAs3oR5OjXVav*Xe|!Gt*rsw3}6W1 z7=3MuR_~<{;n*aNa7gtvYjL_p5+%c6;J#2bsPWCbezsli)s7q;NXz9`_pig#LV&Po zxOpCrQgJEgF-Y}C*GUS!LNh&pa@;KA|o171Dqp^TT`Dl4(NCCrU5LgB7gH?Z2Wcyj4f(AQq z+h!?+pl$U@OR8VmEKmy4*tOoAOCnv2jgh70)&*f<5`R$aoYv$-*cim$7CUDpZ7_6> zNcF-JJTV+t3B&mmlkwVCBEgD{r6AS866fqSXGWRi^wc^v5CbL7Wh;#>t;|D8wtxHS zLaN_bf{*t*h%|4Okm`5Kh}1ASJ}V;(^VIl3iE{-s&D9CVBI)RqQnZui&fxXN*tM{@ z9)5Bw&i7lJ`ob9Mns_+A&3P#k0OA+IGUV`Yw_$J74Q*P$a5%DEJV~I5N|6zDYgoRK z9DZawwjyE#8IEusKEA`*b1+K@BWMQg@V1@u;>JMA!48(Ffe-?$JvsdPo!Au@V~-I_ zqYwq2m6baD%uex4iY9PttN=M2-i7m=a)hN4aBY-v&hCnWYJC{CoD&Ymip=Ank*6bS z%>LtUY(J#vqe%~g;9lD8T5w(TJ+t&IQ&+Z=YufEO94W=8yrpPGbkcW}U_O+})2fv9 zZ%$5h!4p3@*lZw&&p7YvnudaL$c@hbzmlNw-|h%n<6{SKcHJm0_zXgOoo<#>(&l)lQr$!+HXTQ^=<~0r2Idv8y z76F&zf*^L+U4ei=qCs(&0WJ$``z0)!!-@G~P=cd2co-y+icDmVDbtXH>~56c$QlGV z`jPX}HaW+FTs@SRFjN*Yt?+nUI?@jhn{%ueo5U9%^|2I&)t89OCgAEU z4{vLRj$k|IFw~f=Fub!e(FeH;cm!I9`}h&(T!ST-oVOK6CFZb!AoUOc4AY%Q#m_t# z#KVYy*?3vA1O&BTXrv>}5+e=I6+yv_46J}Wd0lg~1ucZ?{g>~u6Xo0C{tJ9NStlJ; z+m@@jyCoQhmIY6f^O0d6RE0^+;#TLP%~ma8Bpz;+FzKjMeJ_kU>&+M8B!T+O?kuU< z*(UC)hY%*$u$$VDcpW9l`~$_DkeU_kGGmL|f;1j%#|5Yz=9)&i(T=S+CZU%Mf_f38 z=E5=gQKT(_?xh{_qez?TqeyB}9oRDyg#5Kb!ippAbwY6L2Sjx`ryd#1xTZ?X zlOi>bcFKoHwjUt zMXPpI^XubyD^W~G7)g9`_nwf~Gb08J&I2dp^-SAr1wXb+erUDU(0R5?!VzSe0ng{f zBGVwqWCqgLv<7v}54$AXCbhkKUWGcteATGwmhgDg=aHIo6LEZ0tLBbwnITc0szOo0 z^W8GiG`8ki@#!9!0aZXc`og-|AT?`xCEOBK5ax4OHP`k^3!)pgha#AcCtYBe&LY;F z?USYh_PDZ!L4DQ*20!2ev4Ow~th(h@2E=?Yt7c8V1RJ!RInt^(_e-qfhPGU%roz~O z7L1mSaqbVocqMjfhyyfI^FkOeIx=nH4G!g$cuajgR1e~5Ezwl-infYv2P_pj^;>^nmY!C zm739F;YECKP%n)|s1caEk*xw@Fy{`q3STy zE^Nu2hZpEc?XvB75=k}I_A6^=w~PBJCIU2PqxMH`FxXzv!0ZgY*P`(Zs44(w?)$sNlU-bQlqXBopGfU>rQ(5$6+(XuCPFM3jgi_P zm137saKw6Z*_m8cqo&%hT`35WFCS9-&OLZ#bPa^KJ7l=J=N*xc;akeY53lnP$mf~k zy==G?=$cTP3PTox)MobL3txqew32VgjB94{@x2m$mugdVi$H2$*emX#vYz$kU9jE5 zkIs!zoxnI4+)EIHszZmWTFX>m-DPg@mEL zE6<}9Z%^;T3xW_u`7oHSzwN_EcU%G@lecca^L1J6x^jCGuJ5V^=fNL{L8+&hx?-`z zHhQgyx@{7bRD@vzr0&&*YJJv*&yieu`yf57JeW!9eqpG9=N(bA(RC-bJKOvMq=H>e z!o>nerbKbiuFvf5y z1z;fQ4hO#@G;*n1wb#=^rvidoMdQV~Z|?PEg48P#hCwYitn1QZ8%)lqR*W6Wt$U-v zsglM!70JS3Ea3FN4GxT39GDMx?{|*Y3JfSCNLimq-Cy>5l0O489S*LG9T2!Mq_{nq zal@2tPev1|44i`MVwEsS-IoryT=DX-Kz4`9F}s#dpOxs;-`Tlnx0hpXU4fz%kJLR- zjwhHTo|Cup6~iOMlHkt1&dMx_rLrpogic zE-Iw%{RbUmbNi9VU+Vt-AYOuH`BPR-ZK3v-!0;yFCFmkR>X!u3ql7kx zK(%S-ij7KAe+}+KImdhGWp<9Yixh2x?@Q6K7Jbz(XbjT+3ZD4&#NuEs4)>K=?X~(u zBP#iRDHy}u!3YjE;mYfmKua>rov!aaiUg^QLQvaQnAnnjkmC(D=RlgN+>5rDHCMO(A(-bnP z|3WK%BHO3YqR^}dP>7y3@uKR&3WvG?Q~!T(7m7A)zKm(Z2~t!9-Qb9;Ds* zs|$!h))9zu>oH^sF9Azj@!oR`v7`uedM*>_aZ)r2-~RMYgZ6~k0a?}&q`j%~R62iF z>wJI|{p3=1-UqJGbc|LYA@$F81Zls14yy&b+8XobPT#G*(wlBoNd5DjzI$D!KCt|5 z3SDZBG}+BL?)$V*_~KSFc3gZvM$m*o$)F6l8_G@?Eq)crlKSr*cYggy(q+u=hMTPu zCww0t+up!--G9P&2Q|Mtde}<$iI;WZ7khnK+#qtwrlP4tdpe!sMMdkkb(_uQ-3yty zOpu~C!M8u=k{)n{-9peCqs@dA-ud_>yre<*EcF?$&5!50gOna*P#YF8@}^1AKKTCs zkvve1{+=Ku$WKd4C8ZsruK!4n?=C6A$9oC&HNC$3g=$wy%B%j}y}mo|Iy{WTg1$>2 zsYF~U(MQkw;X6|G(LUe9s{WXDXTaLm`+PTdOu?u{&406_e%DFor{yHAIa`qUankx* zPWry0oBC*;fI~jncm^tHCE*;Q;H7rTVh)hv9TEVDs^KGb+lBH}xPDI^$IT@R09wM>z({SN)x*kkhUhr9-QjQR;#GFMRvMAMVxQ3p{u# zNPG0t4za#eXQ22rUaSjldN>CqRyzT2JdKk>zIUJ)1XBN=(>Ut!y%(O-_}po1aQx`U zCWlMvA3u#p-iNMqpPtnJ{2&IOWQk6&VLG^zb&*k@yAOnA*3@p);6q<@p( zZxt29IZ}>a_H|9HX5t&3F30DfUE#zDijN__Q0Qh>I& zFoi!}iLX|;1g6Dm8&+01R|2)2Y3vW-STqMazO(#xVneP9UwU#!9}04mgxjCevp$^X(DR#}?&B;2~W2-?iqcvHF?VvPK z4CSUe$9rFPqB8k4ceN0v7fqHzlL`rcPG}GPAdb~DD0a^P2R|25^w3sYl zo)>Vj-u3vRm76r&>VA9+FWC3Oi$Sl_a=zB-T|31oyj*|I0PN@qgxZr6GpTqoOYbL> z;2$r?)i&i?Ykp4f)eCXmF=voY$N}}h)ddp#)k0k1SiB|gdSa1tK}ICkkk+*p;RL^A z0C3VnqwvZW5UOhb(YdZN^ni)nlf zlqGe#YAGokyUt)J{&%PInP8uKgCUCU^1ruh;Z0TL%wyvtyPRWGNnSLQ(Ac#buX(4U5s6FF z3ovu044*H$G~K`i`04)#-BgjrS*U0FPVN`@!i`c|lr%oI*LQtVkYNZq_xY|*3N*hB z)p+kde45igv1mO26I=J=qW~Vdpes*HE}ob$Zml=oupb??u{pjgWaMZEu*DjmP_9g& zvu}-i4*0~wbOv%a%Dal;_+%0;PNZX`@f`iLfSN)$?Js6>23aXLgf=n(;%EQ{^_9ehMgeo z1M%rtCL5WaQIV4s{unt};hPhaDcA&(NW+zDFk1PDKM0P!ZC7L|s&n%{0WFaz8 zFY0#260kJ$q5ak&fApt7C&0>~fImI}^g>qzILg4&2Zm9(Er5?QyPtA}`vHbt3gB}~ z?mOx`e{Bd}RZ2tL&2Q~Dp00G>2ojkWFv!V?NO}SVgvxqq)Z`Ua{_$+ga@bG%SWzJOlZGO|P;6gn6Kn?aSTo0sOc<}Wa$0MsE zQ_?;-_*D(|TwK#{;a8K!IkmnhxrHxE8es!^+l+U^GM&LLXnieCWO@*W$pP)J^<(Bx zr^?`dlE$lQ{m?!NY<3A@S@T80Hog?{f;5R-nKvw%DA}a>?NKCGFoupJo0_|bNqwUGb zcrwPZzp@(7Xn7ggV}pF6YrN^G0USg`n*MtY-nW(~w>=td&85|li6x^WkY$oaWI@hV-d}w{gI)>)eU;I2w`{H>AK(vd^k%RO-Jpz3)51;I-Sa3P9T+5^*@XQ)-;lXT zezeI)$?KFed|=?jW^Zdzcf`&S_~2%5qQS_Ts*t9#VsAFr3KhigwqkFV%L*$r5kiVF!Qib0yw1kmCdK+(v3#kfyh9@wUhngy%xKY^&SY zfEr;tpBFrpt=O>0c4B}-v+_hE z2!S*`vK6n%vUmnRjWj*66~BHZ4OZAadu}UsM`XeCoioxjcN@NC;R#WnU?tnI!ITAs zF|l)TNK@4|90d3StrOn6&5QOM2-g=r(v&c~F)2$lw)4t94QaZ`@WiASK%Mt@Zo|g{ zWihSR3)1unPng`!avRRr|Ar@da#(8%_|!H$#~j_Om~!(klAxz7)7lT(Ui^_?Ug3P* z4#iVidjJFCbUbpTWi38VE<=?82&MQ~y@ezHwpPk#vLn%STBcZ=H>$zGgOOkQpuwZ77mUWXX}gtam%^r();e zp|(^m2`I1FfS-esAxB3EkR#7-!1q$z!SJaO+vs*`=rnQbb>u4>-3mM(4LA*M!ndE? zajFqlNsip>BODjtWt(LTwm!iO27w%jZN}HAo$S61jD=l!#by~l)drVY6>{YE&3Hgu zQkiE=KCl^wU@lSfOvx8qqH0qg8QOIr_!<&X-)2 z*6@FZTKPw}EI{{DluAuspJbJq){vslz_;~P9*U-ck)t;)2-0Q+YpbG5D&Z8oNt>mf z2h?7Hy9cx!Z8DZ%uaJ`FlcjjlSPMfKESzPdBii^KWpw1ICw5hs%9daKez`6 zA|43_HHl@7R4*@cPE=S?O_S|#QD<5mK+=3e8Jp$PXPr3Nt128eK0-rJv??N5&<|rKPgrX=^%CrJlbHwoasYf_& z%)bDSgr0XH2P2V&IlB3fyE$qL$*0qM4mn5FRtCz5%vN%(m`5`ScoBiYV`-iU;Gzc- zgOp9j^p)$Y0q4lll23#J3K*|+jx3#Ez>I&>2N-TEda9gVNhg{Z7;yM(m2-e9hz5*y zRQrZjMVcS-0nIS4isee}s7eohtm==eKO#U7-$PJxN3R0lPFuU^h8A2kA}qf@xLXayVZ8AQ3Yb)1eYbES?yALyzC3qCLlDyZzlJh2zJP*=&qDbT zSH>UN8BN4UvtVA<;WULia=F#-sP|$rkPr1qLv;yRsyGk`Zg+z_Z%oxqj>N6vtqtyC zKx;f8@P!7v`zFpRCyg{u2ZK)~U3dl@qBW7q7@X_pgYL|Yj;KcDq`AM*o&3#6AgP}; z;^IOsBxQ5}YMR_xEl!zX9^KyL&ZJtQ0k41aN*t~F43~CtnQUrWzY@!C8yLoV<_Nw| zW0`)kSeV&_FsEEzJc7j_3T6x=N%O{|*d20*!e?yYsCSYKL*024PY!p~*@ru0M;-TI zEr!D!Jd)YrC|4K~v zb5~kq1T%2|qAM*j0-EEamCcS@A{G)=F%{!Tn)fsZ*S(vsCBi~OZU$)%H9ID>t;j$a zTH6HoMVcD?gPq-`R|v9XF(D4jFK3@1#D^j4$wd>_&A_zufF*;#o<- zAl#oc<1J)4O8GJf4saNB z$Hv-4l!6S9mVaA{XNwP*m850MGM_QE5Ul0qWzLB=DG4xS5X5hnIp1KAg4W(!Ynfc` zooJ>5p$XFRt>t*myBjeM$0d7sg>wk*#6Cmi`?W1!U4d6@Po!#~Fj5UGeJ7QR;h$GJ zomI35SwP_X3Y*^Yc2VAZLq~-7`#~?xsOdBQA(!WaF2J}ZJ;weZF zD*q*|ix&igDej~d)*3@oZ4_JIv>+In;0OhU!vI*<^Djpm{Wi6l@+A@CPnBwQYuk2h z!0}089(e2VJRpsuwvTVXuAMwyYXZ)(^`2L0Cv96cy0IZTc?LL63jGK6=Sw z?5VkxI){6-*qe%}^f5RX%k~m)GoY)zd1fXCRdDSe+N=%z0gv@iq5-yYR9h3u9Q)NZS{8VFMuxrcHzY z+~pXzs{a(*XwI4XCu;0p-i6m6S!(daCvEF?J7#tY(1fvc!$;c6cRL=o6-0%aU%F`m zyT2PpPx7p*y^^-rZZ9IVo(nhb#uizYHhm_LwmWybF(-y+Mv?ajgERsABiVQ+MhjMx z_D9#?w7aM&Fo4*@x6H!hIT0u?lTMO$C}D8uWof%8-;;K5sQp)0;D<7OW{qy$zfeQHS2;suenr1$Ci)wdF!1k3*;LLLH+272GsK*{h`(~g|Gqof5&zSq=q~scP6r4oE8`Q&C_!9;&i=L! zYzor83*HlunIdq_CU-s(rNx}n)Xb3fk8N_}=iBpT?tx2n$7Xy6NpOKQ_QSoQyhZH| zoAF&vU%?Ga8pQ0IFXQ9kYd^^9llCuN+I|#cPuhRH8P`Pdl^e~*|8X-eQR8bD+!T`b z6~%}VWyX%)#b)d{De8uA>q|LKQ^!u>c-MATcu#SVQXuz+x|p(C*x;kZc*XHm$lL;- zEyj!WrRXEy`eloQBX8krnb$temWj0AR*cV0h^{Ivk?4iVG~BnHu=j(xf|w329GhJd z{EPhZEYc+#DRYNETjIuX#2t2kKM$v$(y(kmL8=Ut5$j2@Cx^fnHuu+AL(8#mP~Ia5F8;raPeJdNF`yt=ie3&`9< z!!kDx1!hC-A(T8v=a}9RKAUjteaqZ9g!#Sn=CXyl*}WVsETU@&>cw#ZF-z~(<-up? z$}SuN9okrj_bT)Q>NZb`mL)6Irh`#_@bOUW=!zr;dx=X3wH)_ z;52!btiZNLo&}MqvjcYG^=Cue_Teyb8df;Z&kp*6T|Al@Z;NMU5|LS0PSf$pscaIi zLiR$=DjlDQk&c%ZI&U9{AZd2CSt;4ymO5sH^KkOVk#uZa z<{C%mj&xKm!`l~ySLrakpqEO+kqIaQ6HCO>DX5?fDU;6M8_u`7!3dDf8(Z)JS2rM) zr1L4yAXTKZx78~pYOn`eD4qAW;0H$2JlV7;(|V*B6bSnjZ9b7j z?B$V~47TH)IyXYptU~8Mw|f;Lg90J`x!tP} z85St+z%f@?>LqDajHL6k$6P5c2I1Nk>hMeu!%|hGKStjlBAuV;zz3Rz$I^nveAQdo ziI35_!sd#S?DWjP$)oH1pH4SwoXEnXV~UyW3GaDW38d{^}WH1QP~O3n!_4$y@%$y$MRpj&ea#}c;HIc*5_g+Vw~tI_mMu&q~t5y z>XZ2NgrIpalGdrZWZ(toAXPa_I%iIbA3Nqg55wdt{OyzOWu`0e-hLM{>zL(c>(+i3 zW{bB6C0-GBVYWB`sBzX4fUd~D2)mfdoDic$}lUg)+Xvq2IeVzfr5FqRahwzO{!AXuWKo5&gdBo6F@%5)% zL>-tMu8mKha?S%46pn6PPo4IMsC=FL+-ZDx&V}?Dk;9Q|bQ`;V*oEE3GUU3R8}=we zUERMo>`{gc3e@f3h(Az}z<9G8s4kih)gs9kM(|Y@!4X6VFa@(`TufsGq0gRQoN+N; z2#HUg;8~n9ljlmGJO6st7n1U)&b(24!AhP)uH=zXZ@lU{{)JH&ymm+60d6Rhp+>Gd z#$4zEh5&tf@0bg7j4@!2EgbiVp(|x(+{JXoS`If(jTJo_40u$U6^#t zE?3OO5s&QZnmHM9!EP^HnMtZoXKB{%(TEGDB@YL5wELWkNtXu%iuxH}fOKu$5yhJq zf@UR;Fs`yUM#XPg@p#7$4&?Sfev+53yuB0R=g=L=H8>^rPq>&Cd4k|`V^Pcxx#|<- ze9VtwXLz8NkNAlPj>_KiF6irvO=#=NKc9CItn&7tc-tmj1gji?o}(O?O2;x&sl+fP&n8_&WM&wPxiIA-UgWS`Q}3VhLY=OmWpNj#7xpi&jZZ^$Sj~XH zF76`fVM4JU%;i_PnBXR4KBUuE;X6=*R@fRWe_)@u%J~7cyvWc5&WE@9f_F;wL4L;t ze5*~6Z*^=9qe43Wbisx5V1Z=bnmLhhu`8wGp3K3G)^w8I)#?05!o{pmVfs_5PtqO9 zrsLOwWtw*3+l1rOGl^K<`a(KCHSJ~utkJ-1Zcn;cr)-GRos`!m#qW5kLZjtft%*c3 z$e${|O5&sSqWWmv5uY+0DV(3MJRf47ex_p-52kRGB#*%D%(qf_mbeD85L^mdLwVr5 zo&A@9QoRJPARyigCY@_%a7^a{f{U$u22VNnNUGel4ew(!c)|6Gif-(5j?Lhc7A}y@ zR`BAC{Ag&~v840%8N7QXMvm5+kHH6L@Jj9qBwua+9R^k}^eY6)cNj_Mlk$A=)|{_D z$@66f$>(e7)zW;iO()X1|LWj>Udi_wg=Avf1S6ftu9lv8Mu>cl#;(S`vk+B$FN1Wx z@@i=fN$Gt!HTDVijmS7-2%1~Kl8vAs!LZ^}q}C?=xVQR?1g@A>m^ zqk|T2g_F#%y^xW1rcB6uI6m)UOpRPKsQf{BJcCa-3JFxzUxOUYe&260(k`lsieuk- zS!pFyLClfw=B#w|ViN?C&blnlV~EMiI?h9eDt}l`X2tK*g{LFwY-=Pv0l_Q%PxHhC zK0h6LvJqPZhv3wN)gPNq8D8`X)d`f)=V2*A<5ZH++naD$DozlGfC^}dST;1#0XJD^ zNNCOxiKMR;Nd`PE?HYRf5v;^s$?T6!!u`{9M5)0N`oBl;wDXFsr3^ypqh3kQ!4@mf z7=?EPXHv;bta)Z4M?&8@irp1AzYZS?* z(j@d$EA|EaK?QYsSDQ!uZ_Ou`Pp+-)68Uh;F}DQ=(qGw*97v@M#Kg~78Hlr_XaK$) z3b%0UNOPE4_n4n-b0VSt3~6Dw5g(z?v7+1YT3z1IPvC|O^r;qsP{?^fBPU9Ves#&n z>4O3V@RXztRZYi&lng}GEk9>M8Y4xs@a?aVpsYh0sG*NhTZ`%4$AXjsp&B=QP^<^Y zWuIiNeOODGgzo6Tugv(i7J)h!r2)3 z0atb6WU?pfZ3mu&nnKREg9|!9`W)1Ip;vQB=%XPVGWf&*g$DalbKIlH(LS9^sK)z_ z<2bGDf=mqx$a?;`JLi;7CJl=^D*5GQLg^FuUcCoeE%AYYr%&Kp?|yf1DxRIv^(8|> zC%SMM0uSBk#RuAAP#qZH@nl~r5r<16p%3+VoI8M}ycgaUI}a5L zA_)>2==DyX0?FPm1Dn?CaacfWF2?ElLGLVww)aVF6k81mhJzt~PoKxw5#w=PBqu$( zw-%^C>?=-sbZ==I2y#=QU!TNTUl(&l1>*d^vfrZ=O$nsXv;EGs778x1MnI6=VA!J` z8WCYCKVm>EoC?x4(JDi;YXC2(GD!LPnZ^MeuZd#u<&=bm2E=z3bhbEvA(uizxdA+1 zrO7d%8B-{49>C6$JhD|r0&MC4o?_Cd`CE~TCKX?<84TXNR12Jx_%i$(7Rj9>MXm5%xMCI8x6C;IbSB0+?tuj>mw*h+ z!NDLU0!5eqrO`A>ihkrXO}g`M6I&i14ATBtZ0TXRwW!b34++HvgGb|nTlNJ9U+ckI zz9e+xATBxW11o*zsPdouV#O3wetZxoC_PYaJKQAnAA`b0t+=jRs=eNa8c+V$AP$J7 ziPv0g5}H4RGm5T(EMq7V+A@S=0oUkypkW=+)C}Q06(70*CymE5y+bH{CvUotSAW%z z8)twkM!rw~Y8X7xBXJh9Tm$4D{X2%RZze5A?Anshr-#HhQQ9NO;A=@{g6MHv_H;d*zlK|KTpZu8LsumUuFfp5+K%+pRwqE{c#&MJA$=OqPR0 zOIMxK%)20n>Qs~CFPE<1FONwz4Upr%-=iM{lWVI56vy9QroV411;KcymM}(+FW&p2 zJ1#gOAKxoI4yp(l0*IqwpENIO1?v7>0(iK0pR_LN&9x1ygG@we@-%^&Y|imV z%O^6D66T0#Yx(&2!JGLpOj*iw96kXaJ6MvHB+DSKwpcb2Pk;v1ROl~h3DRW+1QY5b z75bA^f=F;MWP(de@%E3G9+I9BR4BO&!y(5XJS1%!24Jg~x33RKD^~wXx_0KTJJY zas0j2NI9f|G6?DO)!*eWqs?(dg7_EcQEfj0dAu5FnIH(0DMI;8H5wr~6wJ}Q!^ku^ z!q7QmDdNp?Fw+Lt=aQI=}EfRsyoT6I}>kqmL z(XKXxnfmU-$ej}Jl4%0-W*m%PJ-QJZ6pp8_cI0?njm!)K1~qb&s-k?68>o?*Vbd9lh3Tpq zWJyH?WLlPPs*#)_XiXr;-&-R&(x^2k`olG7O%owLe&SC8$h=qwZm1Y? z8s0=Z4JEwke=FM#9U2d5-)zdC`0dk6lB$e!SJS^atR9&uy;x(qXhfxT}485x+oab4umuI?>o@)?hcF3zP&pUmgQoSCnKY!{N_$HO=JM_?d1P) zOAEJ>FYQETTZR~J*sj>+5`kHb{kxnz0~>kj6O(kc?n2W^h7BD=o!!H`W*p+H!qh;q zjx6cQ?LyO1h8$!e-m(knzZ3?t4*FA0P>SBAL1d4ixFXYmLlA&czdP{Om>d-*(<}i^DQw4UdsY_Y7v# z+Riw`1W5NYyBrOuGfpMx?%C}Fj_K-7_k+9jYvwkqgfnr?x$IOb9luUVkerAoC)CJ} zbT2RMf2HSgYHD>{(C%kqHpbKyHMTVEFFsZkITs}-Q$Cn!qvbiT%StMQU^ej z`akU1;N)gGkEsPRC;gXu{(OUH$!OFzmN|w8&eUS1duy3v{38R%x&D2b5Bfj})x3}H zp1qCL2ggC#K@rzxBCMX$C*5z|=jfU`^UcuA25s~H zZ8LsR3PwS@Y}-A%--pp>H0!urxqiFf2Wz0g!*WkA0kTs^-2(^w6NzFLl1a#B;IrJ_ zpE>aKb$&@*Ia$(uh4W^Wu#SY17vpNFD$;#pxqsuR<95N#OM3T=bU#&oqj%fL22#g2 zdZiuJCVk zSr!-0w1K`SNcUqE{!JqzHn#$&4*55YdS|E&$dK-b5BcEYF^%kli{SBSd?u0vMcEnf zPf-xC*`mKbFwNim^r|bUoBT!Y>41MT3U#DC65ZWW>7QxHr~ZjbAAD^#%-ln%uJTWJ z24^OWH-Nftukw#%C5Hy_x`n0uU6p?d#0N86?T2LOsuYDe`b@PS9+8R$Uf}3q$0HR2 zi>GoH0S6YJJM4!SXoBU&Z+(pq+K{hg7i)YVnh*Q;YtTShCUPtVTQG4!x+iK8jpC@r ze8sD4oziBOq+t-V>HVi#l(2V4mre9ex*x0^dj)qh++kY;?cee)NsGvrbU$5-);f38 z;u!VswP@4NJsen$)pckG!yQuoT2fYrwvXI_vXz8%x7VTg-V>HtJ4fq&eYHmoVpQq@ z8R@>Z&huQ!O(-BRy)Rb$fxdHJOKUA~PSf;HQ`hw9_+^vC9*PVyIk$9z+7)D3r{o~ie1 zj^4$8T{wE;OE z*86w#@^3tvQ+-iX%k_4e#tfyT-w)Bx%E#tLNhJ;Cz&5Ixl^k*<2e)DoIK|G3g|PegFI7-YUb z(DUb&jtNcSKGeE+q-SK6U!pLbXzlsJD!&xihzvSWw%RWRHbPgDp4Vb%OV_24h~aN+ zYP0D~dY)R1_TRh!nrHFLtC4)Y0HZm)VGT++dBD`C+MzXQUU)#{6D_pHA9>nOv&b4J z?^R3%U~5b%K1q6JeG-CETS?Db*XRiYrTV~Q`!6F)isulrkraIqzHL(3-LZ*y1Qws% zL_EcgHXNY`zFN% zp|oqi7Pj(eIUv$IcPF}z;oKu{*&Rv3xvMnky>cfy4<`>0AiaBcNiogF{+3;$W3RB> z9Z6rH=b-V?r z5I-JL{xcAtj=@XLN|jVrSiAQFrBXcPL%_J5+~au0tuPtK;O?7Y0{!P6(FxR@%fzD= z6R4?7SeGmjfUPe$Uz^t0vV^E4y)}D9r3;lZX3s&nPN>BJC;U=Ld*gD~UPo7nk)>hw z!(Nm<-v91J`PqV69G-$Z6Ny-RGI9=v%N}uXpXlhRIXYE2=^68x6cpc9Pols)d2pZO zDL}?)AsiUVC-;lalR`i(xonme-h{bmP}X}6IBw<$kjZpdjT6B>y?nqijuAj*YYMHn z3TqWAN!a^7=ffKU_}muGb-vjw0H>K3ycAw}5IL9y^>Zjb5ldOvf|n19+5&3?(4b_6 z=tNc^+Tm_dG^?)^->N|Oz?^wtE8BrXqAQ!ysnM(X=R?S=vGjP=@i2H_O9Fb2iYIs1 zVdlxLCq-|BZ|nRoLSm%v3DB0zjVsu@m`BwVa7xcJ?V^XkEmUAAfSi*8^e8CYo4PuH zd<3Uf`5w`m@s)I^=Bjs~I2fe&-2tZ?t}46A|J(ZqpA8@b>O_Dx_s|AW?+*iL=Ewu& zt?SPT4x`6DRoM%U&FUZ=iNsYk(u%%t@i zLwbKMsM~mfA-#X96f;r!3PE~TRUzYCXf=W>C)r#&Hr@*Lf5t;Y5h!sFo?qWoDw|?| zLLNomE9N<-NL9%efDO}=naOC3{S(sn+j&SAT+(U+4UoQz^O18^V4fN%b>jaC&!8qk zN#FDH1$}+x{uSKVRW3LyQr3P0vF^#|7a#*rNQhb^E0_Q|`OxKPJrTwMk9h{}>uT7L zF;O;BPnIrpI$xx!i`I}5mB-p$3!P2^<%8G}^zns`yC^DH`vk;j%2jfR*e2oKoaBV! zMggVK3#7k(i=dba;%KgQ{~xxXMWv9`Ib8enxfp%72orUBD-x6tio$DaB0fXXy_N>;zj3FakuZ)ABcm%a3znw;zjwMC9}L0?3h#2d zuxylYi{)f|2w!b1VCprltme*Rj#pZZl&C|k%$(ouLUq;zx;JYH=`X@rMo|Q=9HqNa zRsVOm~K9unSe>NO;`_S*}>v zt?;E}Jvi1IHXy?#q@xVWg0APJu@n%ERd^mO9Ns9HyW*N@g3z^{guk&-R+ntS_|!SD zNzltR5~%)!iTlS*vU6G?&J4r}`_m@bIj!I+4l6B}Vg@GRD>tLmcp-DlW}>29HkNdG zF&YX{ER`e@E-gl-o#Yy0iMJFZS62>3vw0*uT#Q^(Q4lNZM8fG}H1!0aw0UA>65b#w zUweb_?qcNO2~cHk4n8Z1WIOpt_y>}rvYaX;{Ci0aaGD`SB`D=p$aummjWs7DiP=mX z%4I;&IOU=){Vf^Twn)$oHG#uM}IUP0Xn@s34ja zZCQydqAWcYI#ja~tsCNaeB@Um@f1=WSexle1C|3G2&Vx>GM3DC!D9jD&90#zEk#>P z(vaZa#IA`XG?P8luuL#O!31_rMByZ;@?a<#dgn5fkC-F@_!Dj2At_beC8aq6w@;b4`47Yk;|5OF>WuA1KhsMCh`yqD>P~{jo%a za%W`diIpyfoQ;OXq06C@s|15JU25>Qvw8y}A1^?LKDkQFq9DA&2H^_FGuU}*!vWcV zkfA-R#Y`}w%3uZBR*NlhsJ)#H7+)=B!tJ4u1-NcCvTp_Kw>_A}OucP2Qdu!j9p5;o z?vrQMQupBj;q)&tnCR$( z;z{t*y~fCQ7a?0BM1lbzKu-59_Cx{~#siBTJ%1A`1F2ke$~dg6mY`v^oQ_5eYYn@8 z35vA@P%QN8ZH|Glkq`w!8nDLMV~CCHH$Xl^kM{};1w ztyY5}ZJM{H;q}6BB2JG!=v)kce+LS~oG{wbkx5z`9<^`UiP&&z-##%J>wtn{a8`y4 zf6)0Ng-$(ci8|kpOA||Uu1$yGTX6YXCjdq{-1JLLCgazEJ3jpDT@u`PrV=LMKUwN% z;B*mavk0D{iPQ3)3c1nP47l)QxMRQ%{V( zlY>q?4exfY=c)6F!9q|!FB^{lRq!8!-u+XVW6)>~sbCqXTe;V9$+U*byQ@5Wy%ZE( zFi%azVhOkq4+ZvN!N`!|KRI88(5YcIMfndIzIh)y4eK;!xGDH@+MANYEB7Pg?hYhC zhF2eOTy(9u;0ic%z;VU1M&P?jWccX=62^@QWGJ4=MG~xVF%%D@dI!T2E|*Y}LQtH+ zuQ*q;)EVrLz!ks*-8p3!l7_b*l&~G<<}gC@DkMyoxxISI70x_C+7wUp*Hs`#-AQ@G zK!Mb!Do}Ld4mIEQHanL zsH`jvSTHb81RV1x_A)ep@mX;kpELJFAA3+h0-PI4C=4Ik$DIorIuoUjYS6i$ zp*>uGitdGI*9Y;azTdf^p*$>%>XI4{qZ*E;W3ePP|B$jJ!zuilne4b2uqb3anKS71 z_nnI_+DpIz9RyKPdymso41)0OaEJ>J-5s@P=f{&+K+Dob7xsT^9V`6`Qfm{^0b%nO8lWcY>#bR?`W z3phZtiuUekKrV(jlzpuCp$4?=Ee>d&Xk_@|1{5WW1LengKa>EnjPiaXt}!@JBg6B9 zsQg4>7H~rx;cX70s7MIHCMK#53X9Y1>yzQ$ps?ba8{0)6=Yz=4E6kWRWd8KJ-YaC@ zHTdD%y+T?<2pa%Gypw9@vEzQSsiD)}T@= z@uerp=Gx(*k=fl631brn3jd}}X?WW<5kwjNCiv5VIuSMGCVywL{X$hY>n(kLB* zuI3S_MF!)xYriXvf~P)H7h+`O_WdY27MF|K9EN-A0f`L*UHjDbu;{$eOZ%2wJVBox z9+_9}%1)?MFce_s#&TD4zyJe0{lW_j8rsH#uBMVo4#xq$UOMPX`AtB;*;s`KAZ5uU zBVVaNfu^j+srQz^^$5o%r@>wTNrxPdT3Oi}mA6c5Dq%iPKl1b;lvt1@Fw>qk?$eC4 z1l$ogn~YASQ|gg|k$VEJmeaxHjOwDqCYbaut3)GM*n`%5JWCh$hrZzC`*+Vd)`7_z z&E$o`&e*&v;RJxrGIzzcRUrc@Dlq1V1*=fRAlz143CT#f%IPqXg)sO^s{0CLWV#B4 z3DT4>7vc3)$jXX>SgfG`QsqJi^~H~je4+|Db&`a@2_0@4$;fxy$VIgsWaPi9ke@9| zhT2$PxvJ5`mcu}7Y{Oe}awyC$)KnvvL=GX}CU@gKJvlH-iyW;+F`6V^o;{v*MV!GJ z-&&29Fj0E)ZSlR;((AigON#z~C<(iNbP0?kz-lp-JoBlA5(l7EcdRg^=82!FSR@^I zV`Q+=6HxmZ{x6wTRE`}@K6C3Li5<{6wo&mR`(t zDV&OB)p1g{4)m>}GbKwT4h@*8G{I_uy=@6v_Qc#6TT)d_F4Wp0;WQjuQ59tRf7WVy zcM)>AgeDXMv{3Qdw`*eW1H$z@aOy$RbpE9xa`x?| zNKG6NX+0w=jK7p3+wFh>b$@B%h7uEv!SPzODSr0c9uecMa@R_qeaL{_11P`)q!wEB zEMrCASNDk6Lxu|z$~cG_5PKPN8l4yf07v4;*>?z~m~@)>y{luXXf8vm9+I-47<#a+j6o7!p*`)`Nt17^e z1qjIHpM=f;>%6f2Y6B&I5IVt|htVIKfWvx9BKGVL%aOk;z>IRyqBEWyfO!n*2Xc1! zpqxlg#gh}MYslHp9hB2&wH*lVO^48V6ak9WhLz;(Gp-s|k+XvVH$7I9v)^#luno>K zr$Dj?Dp6P^%&6L$&-*`C$|=gY>0l zax>wn)HR@{h@bCQi=4{U=Zq>4NP5Ga7A+Zaw&JiGsTx3_EFMURUmXMM_NK!kn`H$l z(>&9&zdtOJ4L4({&B@vB8gb1FO(c|3>B?d;(HTj?&uQgm;Mot=h@_EKB0{vH9=%x* zqh_D}P8B>kI}g9o>@fO@b!0C~pfQitiW@nT2Uv>^6ghN`TY{Y`uM@d%qH@oSJ0khk zI`JV;D{l8hF2*O7W4l~U|57KerZynJ$auZD|7wH6_41K=alJGxHApx+8^kGs(^>Iz z@dWq}d9PQTy{|#scU9G~nR>185DNByi-O|Rs3>7j^L%QigNPct$V$-{qpynu^Bs}H zYbu0Lpz-UVK*CAEvkNm`4x*`7kf}mJ#_C37NeZJ#gcxOw0&%gz9sNI}&>_G$(ulVF z3KK>Bc&*Bd!Gk-~h-RoW28#ug;>PhXWb%FG*3Y z&J@iTdJ>;Ga->^ri{`~2q=rguuDLKvnos~E*tL!Cv8@SNKS3yi(?HHPG@f+b*f2V<3X7@cu^#0Z)`%Ibit1ESHwGo$H8V1B4s4pz5kyG=4~LgNhZ4rq=i-pQ?xH6P$>>eBVgaBH zK!A)sU5m6yj0D)PR+4o}$=v2-oYg`Z4b`FjJy9r583Ou39on074+PxB>qXAVD9eNT zXd9~trvAW5swAU7@CQjrg^V6_e(YIUM7VIQ$)@64J& zIl=E~6S)^_r$E~DW1^hX?uB~;7$@+_c9G5T0tC)X#iJQkG-@<(%!@Jtg$NC%-@A@^ znSRVYUDDxYfmJ|&l&KCBF-coI1%=D}D;-{z=`J|#9O0Iksm7*GFH37TY_c(+H+On* zdwYPkj&yv2f&IPHi^BGvy9)NG$mrbTUPP~=zzDwbxOAL@)Lw-FAN;RAz;I0%IpIY> za6*9AC7OjYJY@8vC%o8M1O=jcOP3b~4M%~j3AVidsmlvl;i(ASD;&M9+lvaQC|u~@ z?e-#c?rQAl@uE)*hE0^&9!~;Sy&nY&M(>JVFZ>Ne(vwu5zTN9Z-xN`+m@i5;HUdsuiJ1|W3=I<*kKC`7cZ5DA?)Z!nPs`vCY1&w^`e*d zRb+H1?4o~m6Gy!bPez{zqeP`B4+acA8r1{xMkIGG9&L$T7l(JOOdj(a2c(@8$e?E< zJmK}b0qKMn27vKR4N51x+Q8Ur=J5N2((0u*r`-=p4{!UmGjJR~1JNH(NRiR+51|b! zu^|pY`NMcLp5-VwtPGx#P9cSonOIg$4cvZ8Y{wK$I!I2N6Np<+OWVCX6cF*_r=?ei zJQ$eBwZqYJ=K?P=-dNCywgvny2t*N2I;fo(R-cjU>8L z^a>-_J~F!EjI?dBhT>wr?TpyrOr(d(W(SK`etkxIa_h}O$hV!99;K5x*wIcWK`?nb zNJjs7R(ewMix6sD*dLooKz0UgnU9_sm0r8U(MTdf&*z$F>}N)$ohKE`dK}5HK@f4nGiDoj^Ev6I zfyvxr4sD4_FAWX@_}Zwn6)cFzXVHQQR8&RG>0mlx!S~q-mwekQ*dr4z`L;pie7DA2 z@?B-Y_dmzv`DPPG%AU>lPITr)sG$DtmJC2-sw=irM zcQTIDOcKkqhx@8HTIHpoY<6((j0;>lLRmn#Ucp7iQa2xoqcB&JF5`~tH{-|?l|`bj zgpd9zE_Bw8vw+!Aw2JZcQXIM0vXq$j4aw;0tB?oj6%Nn516QG|n9{SDm(_fyB5 zmKwjxz0RB0_-nji;a#{}Juqn6gM0r~?kA$n4%{PGp-m{saWrgek9b&N=>_-J!E&Q#*9GKWNQw$=^E6&?Z{$szJcAe9>w~t%Gjjng>5^QbtqU@G%LVrn z*|2Z%E-yfA*Ww`$Tp9NVzIVa>(x4^upY=eEWwM-%UY2kpA{NWw4~v+O=L_< zS~@*RNJh_1OU}K58N%zPC3VF)KY07Jq-C+q4t{7_(sUNicYSGE(wF5qIPguTC6!nt z0r$eRWC$aaep`}6X+05b$EY@$3^KaI4XTzoBcs8jq>;5sn++t<{*DM|_DQouQquD& znBXF#uSuf3vp8v$7Pjtgccj^l+$Y?TW|ew+RGKuFczQaCu3`#_M`?(cpuZ(0-SGlx zpLHqZF<9rp*gL$5$m}^dkUk!wDUC@u-=3UM-@=7I#M0XF=&?W6qTv?O+n<^$;u}ji@_^oz3?WY zejjeEtPzEg(uf!0#)nbH?r20FfHa)>HJP#JUBa~|;rY#2ADeHi642O*CX}C*AdXHX zdUX=uSd2+8MvOhuE@ERyX`O~mrc^^Dzi z^r^SFnX1;^F=kp~Q*iklqPnrmn(uLXzQ}UkSi>KSWU|Ln>1*KqWeZkrZhrBv{;|>% zyEbdl$#c#7@A0pbz6d;OY0=AYOZ=Ta_5vzv(aD!vd}Sr2UQn~>=wR!imwn_W9RuCU zL6InP?WwVM`PxxGoPx0Eq^QkLvGvEUfdV)d-Q3VNJ$H_aHPm|Mgr{=n&nK+dd8Tdi zWnTKBW|54Iw<9;&h1H@c;5f`Z=5A%vn5Hn5Wb8H{VA|7ZYQPqCpm@=#5~rZSrX$b`^(+mbcl!X!{o)s$ZxIxvunP`v zlCd)(ZwgCMU<~#;AOCkG1{C(A9$~`jSxhpv<^MN$ex1;w==)K0V7rN1gq6_4K_;d_n zyKH14l8wMi%h3y}^4;3wct|nt^!(IRmld*sG1keT}YO!js9dK_xAtF=uXd$S`47gthISh>R69ew2 zMl5|SVp<$(2HnRxP%ISusr*dDy9ZHfS6Y`f8}Ro*_vRdOE~#8P8UuOVHsnR_+FhWr zKgz>si?TB9x+Ccebe@l&k{&(_9PWO6^OW@PS-|zjA~X|$vIl|F(&o$pHypb<2anP~ ze&emDr9)tYrDYY0)!Jte_U0?yUr+x(+P(xns_OdxMnRM!BE$e;N!UTbB>_Za%fd2{ zKuE&AOeQmrWMDEgc{2kEvI$5c$d1)oTf5rY)oNXST7ULum!Gw^wXL?+*6zQy)^2~h z+Vy|#TkbpW&6|1e-uq}jrO8b0_nv$1xo5lQ-iu6+YwpmY{#;XaWP5rOGPizk{3g-J z_B%JBBS(IqHHwW4+J`oIZRj}0XEk=_&px-wE2~`)isdw3-sH8_RuIF=di`b-TH<^R zam{%R*o^Y4oOpQ|ud$nvFU|>;=NQcv0;8U{OMa?B2+UlcHMv+kg*=xXn~@6fJx&wN znd{mYAev{U>)htmN14YVNqSzM>!X`d##<7+c$VwGH{Udz#p{wi707YDy!quLL2;^3 zhU?dxQ5HpV7*xDmd@-^mz+n{5Zk2682^86p6wYnU46vI5nXTFY8CEc_wQ&ndZA!AM za8@h11!d2;d!ecnoWU(3R?F0N6vN0NeRK;7rG<#e^Ta>D1$oUvka?KZS@-O~jdl=kq7 zY&IQU7Ei!A)=W4=f1|e?LT)dcil!3!7bJZ1J3RC8e!;3pcqD!aM~<{=56x{2=Xi^vLdim1E(7o3Kv8KNGOCcGb$KWz zJZ0$r?Jcg{^Li*GA5RYTihW(7>^ysEsMp$e1@S-NUkpXb4EIS{o=COR%k(v-!G*19 zdh3GrOG6~tk&ARF8FPQ7ZPPHcf_=f&MH29USwtmmUmfOopwB^y+15-_wf$fOs^aGA zp6!ga)t92WE-s7^eTOZ+1Fi|N81ms#WK$&3sz}@XYee~*Ph2%=yN4exk%F=?mw^r| z^W5un&Yo6q7VULI%a(Dotsok(?V2&XY+J6RI`k{#nw1W^pVOv};gt&~1{2e_$MEvX z3B?xNhOxX*Dkc~ z);Eq<4VZ10_Q1pB^jevgTzfXsks)nwk3%|`iw-td8^-f;$0Ubw<1twXkl^wPUg=w% z>w<^T68in+ZfmTkf_IWUAc4#mDv>|#i{aFT+YFMpCTVJO(w3dzW%cZ;#LXm;wl^mr zf5X+|wWC=5UojCKOXp~bxJ=q6PUIT|JQ-)xtfcLhiAePPkddzfN!waZGMt)*w52)8 zuxSUXVEQMbBl14RVFN(wg|s~|5otRgNaj)`ZO?K}X(3T3ZQsQ-xQjUR$yO*4IO1;v z5t?ULuRWFqj}_`)X-Aw;Re5BOclC1t^v(#px}NO7z$8+7tEb`f4~OYIdMnCSaB;zf zPE*-N-nbPVK#@f?^>3tUfhcM!nbgZU)}(2~faZ)up1268n8TwN9%6afFCfPdeY!znPJeijI5S+q8Jh<$_N)Qo zBb)KKGZ19@JQ^IwqYqly*!_*gXh(`uJS>j5qhrp`TY|Pf0`7-R!h4pW-J*ayVe>J- zyR^ILOw-L*W1Gk}6T50W%OeDE8E=NxdY0G=z%#BSB;j>dV2OFP*7LAQQG%NxWnnjw z&(sBr$ap)qUerYDI?G8ae1R+GK3#QqPi^LOgZB!?Sf@sj&WYL1vu& z*;15s=3CJ&u#B%Omx;o{ElxD`6G>!jjQz|qR3*Yirz;>E|JdcCO2HMEG2nnYTZplk53!Yk^qRPuK6LjfNaQOk1w9rY=y()Ws{}n3AN{bYy=Rr6 z$Ks&?t*qNDM#dUG(q1*crX< z$XEn#SdB`Pc&v&?AB^c2R{P&3)fc;w;qd5y@&6y<9b`LGu>uOFV~yafu8wpmS|SDk zlgNu}1O?g+j`8;9rT~d#41KRCDr{=Ua?z}9-~-qC-`KWIe?Ax+c6_a8Uf6wIWuQ_I=HQPJlZ!SFtlsdJ&z@{D8g61TiJkeZyeYzS!5D9x&iGP%Yorpdtd`vWE`-C^ROiH-y6_b zuRt&{#oyb2(mGt|R`$-O8vnKdtzLOROzVh^UT0O@r3)u^-JK>9soE$eUEbJu1dSWL z>V=Dqpit&7u@Pk>xLKaBEst+R){Ps_nT#TlheYvQQZOX){6^$$@lfZ2hUeyI8&MLD z1J^ZCLL!%JLa8$UaPH|05*aTB=bjlLk%d9RVJ>dmgz|X)hi!(VNR?pJ%qAfTH&Kh` z1I}#{TKPV(@d!S-NoeJ>I0-QZ0**~W){B7^Qi5-85?TTtxR?!>ZT4L?sgF3L)!4$} z_QKKJgv~+*(k=KRktLqz*jzPqe(*se;mxR|$p2Ds_qR#pz-A$Z;tq%B7+ifV6*T8mdI|HFgIC8%)XcwDqtE z7ZRNv@S`G(sKj(s3?>7`ho^r3z(5g@6Xw&rFq(2tr_?M> z&Z%A6&L3&7oQbIMuoU$857y`Po@Wv3R$)twGZM1HL)5Ej`lyHeYM^6*v5PR1NK}Mznw$Y4|D3V6mFc_Tma9m6La{D1iauY4t_lf2h>GO#M?M zJ)<73si{xxNhVT}SZzG3x?SiMtr+!de;1ef9Zm5LfqzFv{rxnv%0Wz*(IedQl1?bF zijZjhc$CjehB-%<-xmyQ)9868F2=x|*GWXbINIk8y_}uUm>E5lkV zv3dn|1>w*XiGI2q-IQ}Nx{jxiTUEZDGEU%^*eMddp#s&22G$MJ=9ZCKUV-dk@EtL; zL85IJg>$CO=&cBJ-MA?9vlU)DR6HW>sm>p&Kq6htdjJJR<6C-BqV65lE19SoPiNu! z_}JQr&zQLgN)?Gc5<$5aL1N5wU~F=`XK|p;NkkK51fsi0>~K3eRqc}wttq{2%(=*7 zmqyWUDGyppE^X!mNvti(#bUS&HVwA|)#Vft`%aW=I8bY*L}?O|#OB95cT_MBwU%ph zirPzJkH+{rrMDqKwKltxBsM}pchh;ZPD{Ge5r1n3%EtL_2NHN|hvyCm9xw=-QV*e1 z)D}I(?(N{3D+>iq?&_Cgli1rGp4TY2Q^GJn`^M?>lyD_T>;QhP-J2mU6fIMs_L#)} z-07KQ$7HRDcXZbGCL>+(s8$3)v*h%OrC4*^bKjsC&YD~{oy(Hg<8dyH5$b}?4{c41 z-^n%6A^n}t_+CY$O4opTever@%Lv8ZyVJ9J5|6GSwMTn7d0CF$31Zlq*cJHcTJJft zgP3l0Y{xDxS=7j?g|}MZ8ob!Ic6nZKf``G{Lb?wzqah(i0Y-tP`5pYyt2a9|VzjBg zxr=M6&4y?MPjsQ&yw9$UNFrfElxQvKCAdQ%o2u+=m*dv;kvf3grNoAsI;m(j)p)SiqWu}|fM2WUJx5&Oz+0nyV(qd|bwRPT|40KImvZ>9e=skGqg<2hhGc)lEcUyjK8ucY zo05+Rp6KqlmIhdH2iJUSP_6K;ur}on-N6+|vc?VYrZtI8JceF)@)my9+PDfgcJdgP zZes0qElXl2`efQeCMT8H4bRci4QG^3_(LC;y>n2-6kcmT*OGRJf#vXGKff5$`EAMe z(%@&sov7}TV~(`u(EYOGf;`T(>xHr;_VRHqrJy|)0c>oKo0o-~`hVjIF11|P0l(E_#K#LvynTa*L;siSg=`?GasZ`kON^F<&0{Y6YvsZKG$x zX%0cLFd)xkDxCSJk>>JG1w+7_JnK($NQ?_LhU=O>jm&`;Nd-4}`cEU{#EW8X@4W9c z$6~fNcRqI-ZU1@o&AGMn@@Z6P>V<9JlOeG;Pa}7Rud%r+G~f*KUA-VQH{9IKsW^kQ zweObpOvSu290ITP4o)EQe45UnP|p_)rYF|TO}*aIZTo=4`p=-O69*lJytzsWycsJ)TP?u8QokRm_pbs8DP zjM|SzmO&%MJwaZ6*6ZYT0Zc7xL}Is`<(5X2xyVZeuRSZsZH*j9A~=2)c|$x?r)R`8 zuDN7yZ$ImGLrgK2*^;d!_O3u^)RKT!y6!V)QE((Ya1GR!0Qt&Ul)B`{&ClBY>-~1txO&Zw72SC=;2l1B@tqUdU{&Su~ z(ODGfd9g7UIGlZ}v6a=Ddx1l=j3kdsPHW8tj`dXt2Cw^_7dQ-GA;5wuvcnf1xYJLO zy_Uc+(47gg2QF}gDH?{cnxDMDk-)JUx+ZX5y1=0xEi79C=T~?j#qx!kCA5l1j7n|o zf)I${tS^Z2?omEBoBcvo5oN|`&r4Hvx6&`Bnd4TDjYa`c5DYMof#{*-KI^mm61@T5 zD51ykBiVHs{T*PU^ptyEkX?W?v{W_%n;@#&B>uGAXL&;&?JKJ0&IWPV0oz5P7^}2a z=8ZuHgNx5v+Qp5=SI3A7S^-EV6f4Jy3Po{b5Q@jfiVB6sX~YN0VWO0eLop#2U)}J4 z!28CDPLvxUW9g9bq5@R}mXbRjg&)%6H^{9f3aJPR*DSYFc6q-tsEswO{cEYzaLC32 zGcV0p`+6{>I&guvt0tg`R-CsEU|{Yua=^{BB$g->@OyrI3fhn6Ag+L&Bg)%?qqV6xV`+kQ z!#B-wkY__P^$$_1ry^s?3uh=~E!(WDnTkqQc##bK)iKpy5aFD|M!WVR%7LkO4vElpI)ws?aXCtCmA~~8Hdho z3sTR>4v#|tu`n2%Lna+BjYI2O5DG$m?QI1ockA$_0^HcOsa%pi3c5a(fM=~q$JfTA zeH=+N#>q()C@;kg>YR7d@tz8#c)9VG!h>?zUefW83Yit7qtwLULQ`wQxMPR+Gu=f* zUB@&_ojSfyDIf8q z*QFufZ5#5YiSk3<5P_2baLTmf@rg3C(vXU3C-6wemPshj$vqDm4%PeLpCqHO4Vap2 zHUguIX(fbXQv^Z#EF$}UcWodtJWKNaaN=~d zn1wJ6`B;c=-xdPOw_59@iDNdaYr6P)vn@0*UiE-{e8*6PXW=KV(w}SE#5FutRWRc!plz z*ZJs`o}sFiUI-Tlsv?~mh9ZUPZtDCXnZ9!8t3y3Q0yn&RNIG=FXpM_`EnV0cNvFZv z>s)-5&&0ib#F_;*ZjY&pq_u5s?Ua1yvsa*S zwC?PTFu|T0j%++9mCF*5Os9R&Ge;mJF9c^2cFzc*rL2u|St^>#*a@3bDnXbA#|SGG zCoGgn(Xy+Uowk3JipwEGG|B6_MrcCUN7OhyuGQ3;%BEWAnRE!$3{|78;~!mvRFQ&Vnt{Q!irOholubb$7AA@*6Ps+@H&RsY7@omMdEcgcOiH7)VRcQGO;2EQhFRDhmjtfWI^fKtummE^X@rSF?stOFZip0xib9xqx zk;MqECh`BhD8RExylT$Hpm+|6Kf(`8Z-vdDtod`1itsmC7EmKR_YMVA@lVV}Nis2z z)v0WJM_f-6TU!h9SvR8;o)~h*Ou)s@-puKH=vV3LOw-3|f|(&$eBeA3z4{`sE|N$X z%Z0?F^H4c8Z*wz+8lQIyN-y|Afl}cJ+;^ZATo^*p8A*2F4TSi8w|H(K*lk(}?)^>} zXJu?i|GtIOCk?r}1g7GO%;$8L5u9$W<3F8`wy}M2%%rGEji*%DO4C(}Ns@XiuTHjE z>iFxoqQi>5=)vtlHy&Dmj>-80z*af_<^pa4PXEzQIzJ3+iRerC>lv<)n!19b$<#oI{WK+ZI&rdJL1NphYaiY z^(gM~MPIWLD_|x%m-1tEz%2`Fc4!^bs|w>^T*|xl^pi~%1}xy_WxW234wA7@7=ymG zjCWAl@i}le%=`w4Z(YtisMeGU*Lj%=;Q8ge%3af|`Aef=1@F>u1zN6Tb!@X9(3JN7 ztUxC}eM!@X&UjX-jU?zZc5J-S5bvVdoJwhrjM970<9`hCI%TLih)-rEFS}`b%M$(& zxAzgY7Y`RVu0q}tH<~Fz=~alOeo(9^!I&0Jx8Au5#hiRFX0Y*|RcJAYKokfy9$STC zH4$7hHX!krR-rZT1IiW>yt&HXkwkq3WnkCIa^>wYd7ejK(tt`We9(oV^?M2om5_%# zvcX@)HzT@$37FM@6pRlFO|P8Z?alT%OqpHUfIJm0Fe6IX*5L1Or#UK<8uu6>*TACMry7t_@-Y~Flfh)gM?_j%8tJ(Pq|tnIp68jr#>vS%zxn>u_o z->CAP)N5Ds(PDQ|YghBBH&?%s#M@T$`4_G*1>Mu0)el&8p+4B{>YScg%_rN)w` z?0jrI5@Me5If&8^h?AY8y-V)h2MI58sS#C);c@P-K$@P1I18jkRpAA5RC>SjSKfyV z+$pp`&A~3J6l9(S)vQG5WyCw54hjn9bj}3iON+71s_fqRo(ae$6hkxaGTC|EL}`BM zP$)jy`MHUxHdBT^3lw;G?IfR>eCHCgrdB5vG@~PA-+A{W6jR7hyj)G?(q!k`lYC~< zJ!z$QW;$+XY_iWyST9)Z(Y>87O-8;v*QjCFC9X5mVs8Gr-Y~^yA|#JoH+*wleg>a- zm8M!p1@XFWswi*Wi8aq*>^wgeh2%W+YG&QyFWLG3@bOLwBvV-)oQ9;dh$rBfo_ss{ z7tb1dZ5Uw(ki%e+omWlw7uOWWF^4y8IudXH!*erxi#@BbT?c4Qp3CC!tQhuyG>4h; zEMWHlG8fjJ@<2@JKQJBn3I2I+G0ZejPstLMZ=Sv_%lU$4;>bGf-iVf7m=_eESR` zUFEOr1Q6Y+Im?56B`bPzJ1uJct4w*X(rt_hcWi2)a^N$ngA>pqWmZOp2>jHMCN zayBG!WD626aiA)a_}v!H(3Fv+r;qf?J(5_p6=fy-QIt-D7)D~zNG4kg?_GC*GnLO&$=2dU~7B-E&h9h2YZe!X&oDJCY&zFFa74n6n+Jc6nkgXdwGr+c~2T z53;qJTy?T<4hKs%g9ftS3d@kKm#rHUK_i^}Tg4Nr+m^)H4UODPU!F*{M-nXmpLnDV znLuu|6$;#Y+^$5jF12Baha)mgxd&HUB zl*o02k|go#c9aO@W~z>2);1=#Mv>Pj2WH01iLXa})`__41f9SF;#nP&nRO_X+8tN+ zki?l7+Lh)XwGLB @le8Z}7NuZA}KvP4!vn-JpUs_@j1<_zh%*uw1c5>!tZNg_u)DyY}a~Fh>BVVZelj?NwdU_T>_jmv^q(g>_VGP ze&yL{T?0x_)vm9C3%jz>ToyLwVXP!6pb3jXf>ZU=q=309hFMJ#ttoNL`kelT%yM|c z6n?_{Hi@661XQa*>oT~s)(vxUTAWs=A9a6PU{xFRnV0WxfRLM-5z;Mz<-Grv5+-wX z5SXGz_VCJ!Eyi3IB8g!=yrXeI;FO5v6YlHb^<5pXnn5-PteB!b%J9Dkr z2nuA@h1di<*vp#(GKkUd6(fludwrg3G1^g5wBS<*Fg9}6M-n*&J5$0#?mB-?;k=Hz`kS&w+HSHI?TJOF#vG&eklO(3`QN1p#Xe> zZ%P5oC5g79G8E`l=1Y5`iChNCzzoAc4HeubX}E?C+_Mha2M~y=t!xgbuQNk9gyR?QViny#enEl> zEF}BUDdcN&Qs;Nm_^+qXD|4KEm|MnIokrOpAq+O;Yfp17Wwd&VZtd2d78iGBS2mv( zpAfd8=~@_}o<{1LmxbnrG2K~eHg-vmpGK84GJu-eHMaada2hFXX;5?D@2S(s&EiIN zZs)#q8ifR$XjZD`SEt3bc+suge@n=rrVvS@?2Nyo=7xC-K|hn|fTI7qM2w!o(C-_CGrIs>rSR_L&^+)BwnEwm9j{VYn=`jck^ky*!u zXSr9t31K`vZti|=I?KJdOeCLspWSEwZ!gRAa1A$a=kw09+)jZ(EKA51PzCQl%WZZI zWXn|i*I91whhdl-L*Ew1fJhv6_1-+|?@kD#X9$Jpee%X{bR+Gub5Z~}1~Rh@Br*OR zpTFRsN>hw^yqYTn%C^v;?wNb2Xyc0{cAi5yXCH!X48V2Y?8rGj4Q*m+>?VnKbCTlN z_kb)ACo3EP`TJ2{J;$ev9e_;J{o))-Px)Z7JC5Vi{Jp4upBsBg2^n}Pf&Y~7cY`;M z%FgpCDYso3lDP3apWlf#R}9%8i52Jh6cWN<7lD`?G;Qbk1Qh4dNaBw3{;p3jNY|f7 zHh$sTS9s6)n}+jDB&IWOSK+bqXjjUIRM^1W_Y}T%9#uhcLb@mEN#eKX(LMzyrY$*r z*#(s0;{>vleZ>Vn(ZyVYr+Zi;c-{rRrH^qmi($Son`pYg=j0SZ(muB(ZaXjV`3=6) zwudh8#U|M9;`HymoJ`blil=NJzQ8AM+GMyUY@f#yDQG3ro0=#jg#@ln?W_7(i6e%=6okR0F3J7P< zXbBJL%3Ou~EWZey5f$F(gQ8qOB3&KKN?FQ5I_gHF?1e_~EwQ>~74EU4*u#@n>SO&_KLdi^4%^4c%=~2jP`h;p# zdVm$zjz)}h^&@Pn3Mutdqld-V6!>assq~MGMiT7Z)~?V$KN`)Ruf}$D{{7KNllW_I zYT`eSMuyB+Q&Ra7bTKJ}Nv}n2d*R|Kma^9i4=&rVMWD0x{!8BKIIWPb6 z^wzm@v}%0yZr56$Ihr2?s{Tf zD2%VQ&4l&%p4zT(XkA88@wZf+(laR}`P4w<1P6$0n(pMv%e=Obi&0*f@K0Wbt~T&V zI2_K0U>hpuFfV8o9WaTcj^B*(DKd!KoTc8n8Ey9Xg{zIkI&9RDRBRq9l@P`;pDRgy zW1c8k`cth&+6eC6pmRe~vu;6~P+a8M@JxA0y+2UADv~Oj?^&{(CxIbt9&`d>j9Kru zLh>P2B~yEnZUVO=p3G+0cz-wFvo47Pn~Gjbwl|?z9VBl>3()TbX~g4IQX5ak=$Ro# zcW43HwDAjz5lQO71)jlG{?IXmK@>@iT8Q+j2r*RclGMEmJ-z$l1W_2a(k@+uQd=TK zt&eANkpxNYT!gYTet}x(!}jntQ>+yZ3u2~`)a#1`mTW;hHr`!}1th|PO~FMcb~;~J zEU$jY{ZnVX8KMJq(X>f@QNxcwEZ z)blGux#iq&N=*rQrd(VkfsWE{oDPRX)PfTSQ#wZe1|oI zSOXP^U9={6VqpQl`y#;3At}-%M=ebkY->VkK!I6TRAAfdO(>n}7sQ!LBB^C-1za*G zOy0T6)RSuwn_M%Ud8@@OO`vCyCNv|<=MT&!hcv$#jg$k$<}H#`Q!}!8qA<+q>}*C} zA~zby(!OTo)cFG_o|GY})6FOnk%Y8zF(mbYW|Xbuz{OV2Ou>-UWBi=MKqU1dKj$z2 z%e(xz8F>o+hJ|tTtjj-}krT@gVrEH(wQvik71`(INM^Kf3#WzVwBRIF--0{=e`72V z%x`Q#{;NME8ppVW^4%>cFTe}sPz}dgkiRd61uOdg7H&O72Zv<}R!0lBJXw(*3t+w~ zMv9FsOx69YgG>$u`wIT!TbGGdmjL)~W@(Uq_ zatjmJ2o5bTNQ}0kd@{%Q?1Ff(m0y~js>3yky1Nx^+6j`!f}T&c^2?@^%Az64ms-(9 z#Ddf^ad|xeY7H>9I{(s&GKJg(Qm^(M>rigUAA-}5B&mvZ+-`HN*OJ;+E$99^2i;(GwB1 z3;#tV8G(B?&1f$D!Y!T``s3F5OhG4M8B40>BPkMLNj@lJ$UD6^33&;I3WeQqxa3#6 ziYfi4`JS7EULBY+#2E5{Tahm<#t;Xlc~NS5&;rjik{7wDcrr_iBcL2wwK))s{>}yH zxV8ZO)-r+;gIHY4*ruOeASWdj=+Yi|(}IE;>WoSE)eAjSLPeQlb>}yY3z6?C z#RrO4n~Nvt-O}mbER<6rb}|jvDw5u_$aCk6WB3McHA(;IV&Kju>E(-qq!)^hp<>l` z3tal+i;)4AoTGYD2CH+*5oPM@1mS&{`Qr`OA#3VhY*0TbIW5Hl-VEKn@x8EjX$_oN=XzJ916y?&{j6HyEIv1U`LY-ht#xaCMuv+;~}RG=x>o``2U70X+G zV(C!APRxl6qCig@B3Y>NvHBUcOiqmIBD83T9;(;V7#8x!mZ6AKU<8GbnMX&K%dIqs ze6o$8Gr`ZtK{#{fQp@FBeuNJP-4&=Ih2s#}_zoj*V*Pw&x#Sc;HEJYU#4DY&LXuH> zxhq_evqJ&tVTA8rA!p2uGFk_&rQudQU_G2IAVB&NRp=zC*FNZxE~9=y=pw>1jq$0F z=c_+O^_xBj@Yi!YV2*RDy(pUvX4uNEOJ&rBuWs1PWLK^}Dr2Gb-t;>fphA?5;=3#5 z1WLz+3juCNjIeQhddeJZNUOENqlvUoHlEW z#OW~;8sIWo=QqhE$nr56x$kX~^KG?b_|_pNMsmqoIX0|TvU|V}*PmKRsVh?1Ogfdd zzrM;k+qrh$37O^S=*(4besQf_$l~1xo0AF6=-vzg7YObRNLs>k6c>g_qA?PG-7J@# zY|3RiUD(X@BWd1L>K^?7gWW+{WD@7mBZi`GuaD0QY1F^2tCtDHe9jLoKd#X7mU zXz7AyL+c`{MfAtk$+>_|L`LeM^^&vOl`%xp3=a)PvmTW7a^|@u72T!iwdAlL$ENWM z>*dnu)N_TPxgp-Jf@~U5oE}|SY@fVAZY#t`C(Os#yTS9>f}$=#OD~*lr3={Ha{2iN zIUmCT$R@OAqns_&aoI$Ea3iWX5>V(iI7Z~4O>)sqYrMzm}9 zpuEyuTg3$HX4Yo8_$aR%*OCX;-HFX|kwk%weWy-&1CPqJ?x5IGDX_QSv;~O_KdAfO zJ4r{kpyk33o4-3w(g(L7*$D#DjN0@~@q4x)Z$$*&v3*U_k8VNP>;Mp1`t++?P<~bf z*n2ztms^mh%-w~xkK^38hGLQ}C|Hp|wrwwu+A1T(7P%DEZBzBettbyGNwl@4x?(G` z=8~u`+lXyjWhC0p6ubpQ(g(H%H-{M6*ob>qK!lr{KqUR}R+**ffA8nTt>_6h{u%YT z^Yg2%$h>j)QfPOEq%YZq+~UA+nc5n)O-3Hko{US-Nz${oq0}os@z#!#>C(IQ(zH#A z^A%UH=mS>!)#m(f0rsdlJPs8!)o!}drrhW8)c z_x|4zF1?H8k-53-=&mWA1itU0=?cZ6_ojwrOueI@=144_a_glgEMsq+y`V}kx6ZbP z(FPnh>m14P;@SS5Fv|PLcI9fRFN9G#lDmhdNH47yhJd;*0yVe06ypPy!1;7o#+k8a z_g@U7Obb7$?rC_E{$*Gu2KSMDzqAb{Il1XBn0v2ilc8HA^L}gFH&2S|jKaBblHSlJ zW1^f1Y?98j$+#FTh4R)UeX30+r%)hW{joNgu-r!;nWUd)Y0;GV9A zW0UmtCH)A6ephBqRJ*Acd<^Z_lksd!_g_kpM&3%W@9EeXdsYE*9&M41) zPdBNsv)&aO7;C;HWB^4cNNbl$GtiBrQ6MP_+7g9( zv6CI7`|;5Mh_r#mNE}ig1c^q)cXxMr5G3koFxhXEd+ykIPqr~sSUjy`f`Btr4CCOJ z#~_0%Jjr%c7<+Uq3gH5R1s*&b1Z-R zJaqqgg2*&l2tdR~CZcog0z|-y9x+J{0=$7kf)JX^rI-%fZziGR^&DftC`=?nlSRBi z3Pq3DYlkFM1!_Svr2E0i=t39Ybh$t=;zmtDMN+Ooc)nRG;PvjC;uU1LLAm?9=cXW@ z`6bKlc9HJSPC>IM2IA_wk?yZf@ruh`hH58|`9eRHAF35A{9_98TEvEIS;P@j<-wfx zaMo1hr1>O}X?fDUVk&xKh_|_`a^F7HD{GxUm3gY2bnl*u?2b>uEcFS&z*J<3eYeN@ zhID^?s*js?G-aUOaiN8Xv$mv$S{9I z?T&f+f&8#lM13RX8SoUrHK-(NNbwAiyhyFvyxC;|0^`2kiENQPiP}3*YE>L59C=Xf@D@?O8uxVTc?Pec z0tdo7WmbqGI<@qqFHxV_iOjL+z-d8sy^@IZDlu9aPM_I<`#97oyFBwE-ovNZ#`C{K zJ-jP`xkre=%)jkInq8OyosndRLezB$U2>k#}_ku!M{!t!ZItI)%(){NV;C#rw;25 zfIM2Wt9I${G^#tg15iEs1uy2c0tPGJ?nb*}qSE4m%oy9Lq7oC)4pyexwHjvi`)U9# zLPI2%jCSffMC%o`oxK92zCZH-_pyG%q=8py{G=Q8@@xQWheCmNo01DapePo&Y-fVP zYKV8mLH%q{;a~j#By0rwIIVMtTDCtBR0tQqC(XbkG3xF61F(hk zF-@ZWW`6)Wnr>4hi2BHZ0Ccp5RhLN7mvxcDIR9V(v5bbTn?AZD3yxc}(w$S_bRl~E zUA^ZZ|Ecag3#b);5%nJjgJ4Nq4;yYf6hL&-q=CW0yyW%({0JQl7Gzg&XiOo!aC-o{ zer--sdszT`!{GpYTnx#q#}^L=V3{>!?Uex~qSExhbw>iw9cC!|@go7qPfNTbsa=wl z%&y78Rb@mSb~FGp?}P;bJ$5vJgrSiM`t{KO)}fjI*>Xn^e5AM3!onGFEGRIS3R&}5 zj@o_<)#r=)HXD?7xakFq#*@baP#p#uO!W1Ao_qR5Vr;6(4fTsMOGG`_C$n_4XGIKH z&Glqj=`VdUVhP3ONhM|ghhiCR#T#c4)KB!wc%U|D=G$L!r;HMH!(^Oz-<^nD*WHl9 z(^hc%Vc2mrZJeM6TZuaJxYwRyVaf~;mXcq394$~Wf~@>GB#)1yvI1E+8gmgfcN|Tz zETo|@?>dfx0WnM?!~LP-$ioyvDv;lP`nb6K8MAED7_S^hdnJOD8j0xN9!K^@2FkSE z15Y5AUj~pRp~s& z`?R!kT3O=u+PkC;NnYBPsEhAH-nW

    sDmLUD6UvfePhByYAvXOXcLGnPG&_t&Hd$ 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 *#SW9nP4Kh(p&Y-ZVvY=L>fbR`;Hf49Q!P^#K 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 z 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 literal 0 HcmV?d00001 diff --git a/dep/sdl/libSDL2.dll.a b/dep/sdl/libSDL2.dll.a new file mode 100755 index 0000000000000000000000000000000000000000..cd79afa9956a715db171717644cc7609dc619f3e GIT binary patch literal 556746 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 H_$2**jQci| literal 0 HcmV?d00001 diff --git a/dep/sdl/libSDL2main.a b/dep/sdl/libSDL2main.a new file mode 100644 index 0000000000000000000000000000000000000000..75d45da08ed6d70301cf81060aa66540237625b5 GIT binary patch literal 8076 zcmcgxdvF`aecr|0fhU3lNr4g{qNt+;y($ABD2k$8JqSKTQKd+h57Cb8Kp=1=k%9n& z2PtVhmLr+AX$@VgX&#=WwcWTKPwO`6jO)67bl5nGrjtoV&2-!*eWgj;u^YE(>o#%X z*6jD&Jsb~$`fr!Ky>Gw$e!t)D-re5bqU~5L8=pT>88S*!xU1{v;r659@Damk7gf&O zFuFR5`ty~HF$KrBi$^q`N#`;tGa5_hlF@}&GR9gQ_!d)zMd+4I$|Kr>t z8-m*Nl@tBL(dA@1ky*}(IKfP)GGy0F2X;@uA88MRlpezE?OmOnhHK&6JsHPR36Nm7xDtj%y2Q*g5!g2vb+^1gN>aJCSv)RLw6_G!`jz_Gr8QI>YUso zq|25%?1bQ$>QpfXe?1|paHRLQFt!NYOWP&cfm08w?G0h9o#{dJA?|fDmhNzS3HdN* zY`wOGlKwiwC8UAU2@J+_jgp3YsXI~{w;TM&Y0w-=wC`wX+!Z+ZEOakh{?H8RubX4(MTz${j5H8jx z{Vl7Lesxv#OXBK#`pSCEqyGf)>dkBY{+6|t6}ni@<6x`({@RUOs}J~f=mm4L->;Hm z)HH6~y82!fKs`D5O_0~%eC69UPyHEi_+Nhb;Mywy45sgh^ILEacWb}EZ7-@HT;uAn zUl-2cpng^T?UnWXeH8TS4ZfNeZIuo>rK7u3{+5T6*VHc;J+JjM7urz;iahV7p#6UR zrs@v@O53lakt?6v*w}!gikcH9L|tKIgXe}pPq&NEU;Ub~`oaAlk3RU;(`aG+n)>2R zlCtn$tsb*SP8CwBM>rMdmQ|~-*N%`_4(Q7I!$+^Bpm_*A{kz$xuRZW4gSPhSO}=r9 zVhgDp@Zu&}Uj0r}xXI))7S@@5+tpwA~%nbHg2~_WzuufTGs@&2~DM# zno8!Hx?ctqwWU6|ZkI(<-Ksi0G}1ddI?R;I)nup2!qpm4=${@P?`O)|&L@ORbvBiW zq1D4<=SGLXKU4R6BH&MvSD^b=2Zd{wOOw42-PJ2L8*Dd0jKI|J=*VDnY;v5bN1G^& zIx+OIf#@VtKfS*lBdhnFj*K&HC$FV0>eI5gpZlnQ68PY;jwMKC7oTmJynTTTy+OiV^b`Uav= zrYg6TpMk6_qzgGS!BC{3Lc47haaCA9XzHIssHvBcyQ)+%0*OpvCS@|UfX*N8z?F9& zsHYo5oe~7A`2N=Y!gL9wrYgu?x@uWz>IuO6_R8L= z$;r`?iRkdasmbW%XmosN@bn~mq~^AmMVY839qAe4td@im^O@y|sLrbG3o}%p-(i$%+m^P+>9kIvMs;ST0fkL$5JAU=bYMNmwGzc4Y>bL zazTJ?BkNgePQ`1ywMqj|&js5~JZ8`M;zd>wa_u6rvshdAK1J7U9cHbRnPwFyT?Uck zq@!+2FG(ywm!dSYVM42T)3u9kkCmdvF+Q6Pm*Y9%uv0qx5{VzQM=z2}W#X*zU<(bO zDA4%PV7*Pk&GGA{9ySb``LS#!j!Q&(RvBn1WqR5fnbh}X78YXZ#BefgPG%z6xut1V z6;~R{>7H)36^%LJMzCLoW!)7T35w&;PP1ws1#(h|M9)*Bwcci)Y1Qjkd($<9Q*Ifh9`fh9Ue&w} z?58W>bVu=1K(71wJSPc5HO37gBM>#kvU739=Y7(eHQ^OChlumL&<%|cE&m0%Xz@!bozae^g!*=5SN}l3a2TwP6SdlWiJq8ej2M9NL&U=JY3s`@}46gXuc&I-Xrz2 za0JpdjGRDKu4RB``W~a(zO5DDBLq4L4`kxHKF^vXAVuHq2cW*it=eMWV0bU0eFM=h z$SOvDo6m!!S*dEJNk`c{gkRHL$`jO+qxWzFzd(PK|Wo1Frc`EX|&`Ee*Ab zi+bUN?Zt|4boQ)R4>I1!*P-K#*YUl&&!gx&^g6!PUE6@c@iUL-1Sq_s_pu=#-f!EP zqTl2BdC%P*Drz+l5O5Q~>R}(ct6LgPYPR^eqI*2jh(lXh?eNhJD-R63n@+2IC?3PO zSF8Mlhx~8adJn+11vWJTU|?&5{A5$HP5YaMe8-w7NS!9yyVY5n);H^YLFP20aP_tp zEq7|SIV<)z$pG6+$zt3Fr{AIz%yUk)q-l_Q8b8-7n%kr~#>9mWyyjKRq;))uuI#XF zG3wNV63Z4T{7i2XX?F%O*mAhal&zi47!7~eiz~dVghO1z!>1Z(0Ndafw?x=Sh22l0 zHLk|%y-@5aR^TbxiTZK=YOiOi;a<;uo@oz>_Xh1a)CNN=ad2P2Ck~oZ04GT%@PHeVj0z^rozC4Zt26U1J=PKY__GE0+_FU1h1pqH5B+M9A zDt_)z@ev%a;V2FcIVEq!M3|PNG{@5%SxldTQd21tI_f|!2diBT+uiERm*V|5-3868)2L`;Iect-WZ94gZhq%Qh zp!ndUcHpMKtIV!1u6*&$3bqXgUj4{-3v?9u9)X6C`vrOw`F<01!0(}$tL4p1j z`OgXT@5pK8;%5JCBYI>HiQ1h&vUabH!a#S4+DV|j!uA26fZ!H^Xl+%`XuU^oe>eW{ z`o-a4KSGW*E|{MnrhJZjcx(StMFYL{i9v`&p@(OKeo9_+$PeZ-bTBDWLpl|sK-V_HcHs&qK&TD=<_yu z-bQcO=!T8xn%9W2qUTM=KA_#gWCFA_vg`6s! z-lh0Kz>%E4xsca8MR)$*f=A)b8pm%fs?c;gqHIDM8%i{bD4c$2Dg7;i>eeYkqHCpa z`jw?TeaoWg8Y!H9VJT1Fu_)Yr&=|>pw`H%x3w?$OX& zo_6-=x7q*y_C~S08I6|jVnt pair into the hashmap. If the key is already - present in the hashmap, updates its value. - - hmputs - shputs - T hmputs(T*, T item) - T shputs(T*, T item) - Inserts a struct with T.key into the hashmap. If the struct is already - present in the hashmap, updates it. - - hmdel - shdel - int hmdel(T*, TK key) - int shdel(T*, char* key) - If 'key' is in the hashmap, deletes its entry and returns 1. - Otherwise returns 0. - - Function interface (actually macros) for strings only: - - sh_new_strdup - void sh_new_strdup(T*); - Overwrites the existing pointer with a newly allocated - string hashmap which will automatically allocate and free - each string key using realloc/free - - sh_new_arena - void sh_new_arena(T*); - Overwrites the existing pointer with a newly allocated - string hashmap which will automatically allocate each string - key to a string arena. Every string key ever used by this - hash table remains in the arena until the arena is freed. - Additionally, any key which is deleted and reinserted will - be allocated multiple times in the string arena. - -NOTES - - * These data structures are realloc'd when they grow, and the macro - "functions" write to the provided pointer. This means: (a) the pointer - must be an lvalue, and (b) the pointer to the data structure is not - stable, and you must maintain it the same as you would a realloc'd - pointer. For example, if you pass a pointer to a dynamic array to a - function which updates it, the function must return back the new - pointer to the caller. This is the price of trying to do this in C. - - * The following are the only functions that are thread-safe on a single data - structure, i.e. can be run in multiple threads simultaneously on the same - data structure - hmlen shlen - hmlenu shlenu - hmget_ts shget_ts - hmgeti_ts shgeti_ts - hmgets_ts shgets_ts - - * You iterate over the contents of a dynamic array and a hashmap in exactly - the same way, using arrlen/hmlen/shlen: - - for (i=0; i < arrlen(foo); ++i) - ... foo[i] ... - - * All operations except arrins/arrdel are O(1) amortized, but individual - operations can be slow, so these data structures may not be suitable - for real time use. Dynamic arrays double in capacity as needed, so - elements are copied an average of once. Hash tables double/halve - their size as needed, with appropriate hysteresis to maintain O(1) - performance. - -NOTES - DYNAMIC ARRAY - - * If you know how long a dynamic array is going to be in advance, you can avoid - extra memory allocations by using arrsetlen to allocate it to that length in - advance and use foo[n] while filling it out, or arrsetcap to allocate the memory - for that length and use arrput/arrpush as normal. - - * Unlike some other versions of the dynamic array, this version should - be safe to use with strict-aliasing optimizations. - -NOTES - HASH MAP - - * For compilers other than GCC and clang (e.g. Visual Studio), for hmput/hmget/hmdel - and variants, the key must be an lvalue (so the macro can take the address of it). - Extensions are used that eliminate this requirement if you're using C99 and later - in GCC or clang, or if you're using C++ in GCC. But note that this can make your - code less portable. - - * To test for presence of a key in a hashmap, just do 'hmgeti(foo,key) >= 0'. - - * The iteration order of your data in the hashmap is determined solely by the - order of insertions and deletions. In particular, if you never delete, new - keys are always added at the end of the array. This will be consistent - across all platforms and versions of the library. However, you should not - attempt to serialize the internal hash table, as the hash is not consistent - between different platforms, and may change with future versions of the library. - - * Use sh_new_arena() for string hashmaps that you never delete from. Initialize - with NULL if you're managing the memory for your strings, or your strings are - never freed (at least until the hashmap is freed). Otherwise, use sh_new_strdup(). - @TODO: make an arena variant that garbage collects the strings with a trivial - copy collector into a new arena whenever the table shrinks / rebuilds. Since - current arena recommendation is to only use arena if it never deletes, then - this can just replace current arena implementation. - - * If adversarial input is a serious concern and you're on a 64-bit platform, - enable STBDS_SIPHASH_2_4 (see the 'Compile-time options' section), and pass - a strong random number to stbds_rand_seed. - - * The default value for the hash table is stored in foo[-1], so if you - use code like 'hmget(T,k)->value = 5' you can accidentally overwrite - the value stored by hmdefault if 'k' is not present. - -CREDITS - - Sean Barrett -- library, idea for dynamic array API/implementation - Per Vognsen -- idea for hash table API/implementation - Rafael Sachetto -- arrpop() - github:HeroicKatora -- arraddn() reworking - - Bugfixes: - Andy Durdin - Shane Liesegang - Vinh Truong - Andreas Molzer - github:hashitaku - github:srdjanstipic - Macoy Madson - Andreas Vennstrom - Tobias Mansfield-Williams -*/ - -#ifdef STBDS_UNIT_TESTS -#define _CRT_SECURE_NO_WARNINGS -#endif - -#ifndef INCLUDE_STB_DS_H -#define INCLUDE_STB_DS_H - -#include -#include - -#ifndef STBDS_NO_SHORT_NAMES -#define arrlen stbds_arrlen -#define arrlenu stbds_arrlenu -#define arrput stbds_arrput -#define arrpush stbds_arrput -#define arrpop stbds_arrpop -#define arrfree stbds_arrfree -#define arraddn stbds_arraddn // deprecated, use one of the following instead: -#define arraddnptr stbds_arraddnptr -#define arraddnindex stbds_arraddnindex -#define arrsetlen stbds_arrsetlen -#define arrlast stbds_arrlast -#define arrins stbds_arrins -#define arrinsn stbds_arrinsn -#define arrdel stbds_arrdel -#define arrdeln stbds_arrdeln -#define arrdelswap stbds_arrdelswap -#define arrcap stbds_arrcap -#define arrsetcap stbds_arrsetcap - -#define hmput stbds_hmput -#define hmputs stbds_hmputs -#define hmget stbds_hmget -#define hmget_ts stbds_hmget_ts -#define hmgets stbds_hmgets -#define hmgetp stbds_hmgetp -#define hmgetp_ts stbds_hmgetp_ts -#define hmgetp_null stbds_hmgetp_null -#define hmgeti stbds_hmgeti -#define hmgeti_ts stbds_hmgeti_ts -#define hmdel stbds_hmdel -#define hmlen stbds_hmlen -#define hmlenu stbds_hmlenu -#define hmfree stbds_hmfree -#define hmdefault stbds_hmdefault -#define hmdefaults stbds_hmdefaults - -#define shput stbds_shput -#define shputi stbds_shputi -#define shputs stbds_shputs -#define shget stbds_shget -#define shgeti stbds_shgeti -#define shgets stbds_shgets -#define shgetp stbds_shgetp -#define shgetp_null stbds_shgetp_null -#define shdel stbds_shdel -#define shlen stbds_shlen -#define shlenu stbds_shlenu -#define shfree stbds_shfree -#define shdefault stbds_shdefault -#define shdefaults stbds_shdefaults -#define sh_new_arena stbds_sh_new_arena -#define sh_new_strdup stbds_sh_new_strdup - -#define stralloc stbds_stralloc -#define strreset stbds_strreset -#endif - -#if defined(STBDS_REALLOC) && !defined(STBDS_FREE) || !defined(STBDS_REALLOC) && defined(STBDS_FREE) -#error "You must define both STBDS_REALLOC and STBDS_FREE, or neither." -#endif -#if !defined(STBDS_REALLOC) && !defined(STBDS_FREE) -#include -#define STBDS_REALLOC(c,p,s) realloc(p,s) -#define STBDS_FREE(c,p) free(p) -#endif - -#ifdef _MSC_VER -#define STBDS_NOTUSED(v) (void)(v) -#else -#define STBDS_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// for security against attackers, seed the library with a random number, at least time() but stronger is better -extern void stbds_rand_seed(size_t seed); - -// these are the hash functions used internally if you want to test them or use them for other purposes -extern size_t stbds_hash_bytes(void *p, size_t len, size_t seed); -extern size_t stbds_hash_string(char *str, size_t seed); - -// this is a simple string arena allocator, initialize with e.g. 'stbds_string_arena my_arena={0}'. -typedef struct stbds_string_arena stbds_string_arena; -extern char * stbds_stralloc(stbds_string_arena *a, char *str); -extern void stbds_strreset(stbds_string_arena *a); - -// have to #define STBDS_UNIT_TESTS to call this -extern void stbds_unit_tests(void); - -/////////////// -// -// Everything below here is implementation details -// - -extern void * stbds_arrgrowf(void *a, size_t elemsize, size_t addlen, size_t min_cap); -extern void stbds_arrfreef(void *a); -extern void stbds_hmfree_func(void *p, size_t elemsize); -extern void * stbds_hmget_key(void *a, size_t elemsize, void *key, size_t keysize, int mode); -extern void * stbds_hmget_key_ts(void *a, size_t elemsize, void *key, size_t keysize, ptrdiff_t *temp, int mode); -extern void * stbds_hmput_default(void *a, size_t elemsize); -extern void * stbds_hmput_key(void *a, size_t elemsize, void *key, size_t keysize, int mode); -extern void * stbds_hmdel_key(void *a, size_t elemsize, void *key, size_t keysize, size_t keyoffset, int mode); -extern void * stbds_shmode_func(size_t elemsize, int mode); - -#ifdef __cplusplus -} -#endif - -#if defined(__GNUC__) || defined(__clang__) -#define STBDS_HAS_TYPEOF -#ifdef __cplusplus -//#define STBDS_HAS_LITERAL_ARRAY // this is currently broken for clang -#endif -#endif - -#if !defined(__cplusplus) -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#define STBDS_HAS_LITERAL_ARRAY -#endif -#endif - -// this macro takes the address of the argument, but on gcc/clang can accept rvalues -#if defined(STBDS_HAS_LITERAL_ARRAY) && defined(STBDS_HAS_TYPEOF) - #if __clang__ - #define STBDS_ADDRESSOF(typevar, value) ((__typeof__(typevar)[1]){value}) // literal array decays to pointer to value - #else - #define STBDS_ADDRESSOF(typevar, value) ((typeof(typevar)[1]){value}) // literal array decays to pointer to value - #endif -#else -#define STBDS_ADDRESSOF(typevar, value) &(value) -#endif - -#define STBDS_OFFSETOF(var,field) ((char *) &(var)->field - (char *) (var)) - -#define stbds_header(t) ((stbds_array_header *) (t) - 1) -#define stbds_temp(t) stbds_header(t)->temp -#define stbds_temp_key(t) (*(char **) stbds_header(t)->hash_table) - -#define stbds_arrsetcap(a,n) (stbds_arrgrow(a,0,n)) -#define stbds_arrsetlen(a,n) ((stbds_arrcap(a) < (size_t) (n) ? stbds_arrsetcap((a),(size_t)(n)),0 : 0), (a) ? stbds_header(a)->length = (size_t) (n) : 0) -#define stbds_arrcap(a) ((a) ? stbds_header(a)->capacity : 0) -#define stbds_arrlen(a) ((a) ? (ptrdiff_t) stbds_header(a)->length : 0) -#define stbds_arrlenu(a) ((a) ? stbds_header(a)->length : 0) -#define stbds_arrput(a,v) (stbds_arrmaybegrow(a,1), (a)[stbds_header(a)->length++] = (v)) -#define stbds_arrpush stbds_arrput // synonym -#define stbds_arrpop(a) (stbds_header(a)->length--, (a)[stbds_header(a)->length]) -#define stbds_arraddn(a,n) ((void)(stbds_arraddnindex(a, n))) // deprecated, use one of the following instead: -#define stbds_arraddnptr(a,n) (stbds_arrmaybegrow(a,n), (n) ? (stbds_header(a)->length += (n), &(a)[stbds_header(a)->length-(n)]) : (a)) -#define stbds_arraddnindex(a,n)(stbds_arrmaybegrow(a,n), (n) ? (stbds_header(a)->length += (n), stbds_header(a)->length-(n)) : stbds_arrlen(a)) -#define stbds_arraddnoff stbds_arraddnindex -#define stbds_arrlast(a) ((a)[stbds_header(a)->length-1]) -#define stbds_arrfree(a) ((void) ((a) ? STBDS_FREE(NULL,stbds_header(a)) : (void)0), (a)=NULL) -#define stbds_arrdel(a,i) stbds_arrdeln(a,i,1) -#define stbds_arrdeln(a,i,n) (memmove(&(a)[i], &(a)[(i)+(n)], sizeof *(a) * (stbds_header(a)->length-(n)-(i))), stbds_header(a)->length -= (n)) -#define stbds_arrdelswap(a,i) ((a)[i] = stbds_arrlast(a), stbds_header(a)->length -= 1) -#define stbds_arrinsn(a,i,n) (stbds_arraddn((a),(n)), memmove(&(a)[(i)+(n)], &(a)[i], sizeof *(a) * (stbds_header(a)->length-(n)-(i)))) -#define stbds_arrins(a,i,v) (stbds_arrinsn((a),(i),1), (a)[i]=(v)) - -#define stbds_arrmaybegrow(a,n) ((!(a) || stbds_header(a)->length + (n) > stbds_header(a)->capacity) \ - ? (stbds_arrgrow(a,n,0),0) : 0) - -#define stbds_arrgrow(a,b,c) ((a) = stbds_arrgrowf_wrapper((a), sizeof *(a), (b), (c))) - -#define stbds_hmput(t, k, v) \ - ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), (void*) STBDS_ADDRESSOF((t)->key, (k)), sizeof (t)->key, 0), \ - (t)[stbds_temp((t)-1)].key = (k), \ - (t)[stbds_temp((t)-1)].value = (v)) - -#define stbds_hmputs(t, s) \ - ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), &(s).key, sizeof (s).key, STBDS_HM_BINARY), \ - (t)[stbds_temp((t)-1)] = (s)) - -#define stbds_hmgeti(t,k) \ - ((t) = stbds_hmget_key_wrapper((t), sizeof *(t), (void*) STBDS_ADDRESSOF((t)->key, (k)), sizeof (t)->key, STBDS_HM_BINARY), \ - stbds_temp((t)-1)) - -#define stbds_hmgeti_ts(t,k,temp) \ - ((t) = stbds_hmget_key_ts_wrapper((t), sizeof *(t), (void*) STBDS_ADDRESSOF((t)->key, (k)), sizeof (t)->key, &(temp), STBDS_HM_BINARY), \ - (temp)) - -#define stbds_hmgetp(t, k) \ - ((void) stbds_hmgeti(t,k), &(t)[stbds_temp((t)-1)]) - -#define stbds_hmgetp_ts(t, k, temp) \ - ((void) stbds_hmgeti_ts(t,k,temp), &(t)[temp]) - -#define stbds_hmdel(t,k) \ - (((t) = stbds_hmdel_key_wrapper((t),sizeof *(t), (void*) STBDS_ADDRESSOF((t)->key, (k)), sizeof (t)->key, STBDS_OFFSETOF((t),key), STBDS_HM_BINARY)),(t)?stbds_temp((t)-1):0) - -#define stbds_hmdefault(t, v) \ - ((t) = stbds_hmput_default_wrapper((t), sizeof *(t)), (t)[-1].value = (v)) - -#define stbds_hmdefaults(t, s) \ - ((t) = stbds_hmput_default_wrapper((t), sizeof *(t)), (t)[-1] = (s)) - -#define stbds_hmfree(p) \ - ((void) ((p) != NULL ? stbds_hmfree_func((p)-1,sizeof*(p)),0 : 0),(p)=NULL) - -#define stbds_hmgets(t, k) (*stbds_hmgetp(t,k)) -#define stbds_hmget(t, k) (stbds_hmgetp(t,k)->value) -#define stbds_hmget_ts(t, k, temp) (stbds_hmgetp_ts(t,k,temp)->value) -#define stbds_hmlen(t) ((t) ? (ptrdiff_t) stbds_header((t)-1)->length-1 : 0) -#define stbds_hmlenu(t) ((t) ? stbds_header((t)-1)->length-1 : 0) -#define stbds_hmgetp_null(t,k) (stbds_hmgeti(t,k) == -1 ? NULL : &(t)[stbds_temp((t)-1)]) - -#define stbds_shput(t, k, v) \ - ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), (void*) (k), sizeof (t)->key, STBDS_HM_STRING), \ - (t)[stbds_temp((t)-1)].value = (v)) - -#define stbds_shputi(t, k, v) \ - ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), (void*) (k), sizeof (t)->key, STBDS_HM_STRING), \ - (t)[stbds_temp((t)-1)].value = (v), stbds_temp((t)-1)) - -#define stbds_shputs(t, s) \ - ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), (void*) (s).key, sizeof (s).key, STBDS_HM_STRING), \ - (t)[stbds_temp((t)-1)] = (s), \ - (t)[stbds_temp((t)-1)].key = stbds_temp_key((t)-1)) // above line overwrites whole structure, so must rewrite key here if it was allocated internally - -#define stbds_pshput(t, p) \ - ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), (void*) (p)->key, sizeof (p)->key, STBDS_HM_PTR_TO_STRING), \ - (t)[stbds_temp((t)-1)] = (p)) - -#define stbds_shgeti(t,k) \ - ((t) = stbds_hmget_key_wrapper((t), sizeof *(t), (void*) (k), sizeof (t)->key, STBDS_HM_STRING), \ - stbds_temp((t)-1)) - -#define stbds_pshgeti(t,k) \ - ((t) = stbds_hmget_key_wrapper((t), sizeof *(t), (void*) (k), sizeof (*(t))->key, STBDS_HM_PTR_TO_STRING), \ - stbds_temp((t)-1)) - -#define stbds_shgetp(t, k) \ - ((void) stbds_shgeti(t,k), &(t)[stbds_temp((t)-1)]) - -#define stbds_pshget(t, k) \ - ((void) stbds_pshgeti(t,k), (t)[stbds_temp((t)-1)]) - -#define stbds_shdel(t,k) \ - (((t) = stbds_hmdel_key_wrapper((t),sizeof *(t), (void*) (k), sizeof (t)->key, STBDS_OFFSETOF((t),key), STBDS_HM_STRING)),(t)?stbds_temp((t)-1):0) -#define stbds_pshdel(t,k) \ - (((t) = stbds_hmdel_key_wrapper((t),sizeof *(t), (void*) (k), sizeof (*(t))->key, STBDS_OFFSETOF(*(t),key), STBDS_HM_PTR_TO_STRING)),(t)?stbds_temp((t)-1):0) - -#define stbds_sh_new_arena(t) \ - ((t) = stbds_shmode_func_wrapper(t, sizeof *(t), STBDS_SH_ARENA)) -#define stbds_sh_new_strdup(t) \ - ((t) = stbds_shmode_func_wrapper(t, sizeof *(t), STBDS_SH_STRDUP)) - -#define stbds_shdefault(t, v) stbds_hmdefault(t,v) -#define stbds_shdefaults(t, s) stbds_hmdefaults(t,s) - -#define stbds_shfree stbds_hmfree -#define stbds_shlenu stbds_hmlenu - -#define stbds_shgets(t, k) (*stbds_shgetp(t,k)) -#define stbds_shget(t, k) (stbds_shgetp(t,k)->value) -#define stbds_shgetp_null(t,k) (stbds_shgeti(t,k) == -1 ? NULL : &(t)[stbds_temp((t)-1)]) -#define stbds_shlen stbds_hmlen - -typedef struct -{ - size_t length; - size_t capacity; - void * hash_table; - ptrdiff_t temp; -} stbds_array_header; - -typedef struct stbds_string_block -{ - struct stbds_string_block *next; - char storage[8]; -} stbds_string_block; - -struct stbds_string_arena -{ - stbds_string_block *storage; - size_t remaining; - unsigned char block; - unsigned char mode; // this isn't used by the string arena itself -}; - -#define STBDS_HM_BINARY 0 -#define STBDS_HM_STRING 1 - -enum -{ - STBDS_SH_NONE, - STBDS_SH_DEFAULT, - STBDS_SH_STRDUP, - STBDS_SH_ARENA -}; - -#ifdef __cplusplus -// in C we use implicit assignment from these void*-returning functions to T*. -// in C++ these templates make the same code work -template static T * stbds_arrgrowf_wrapper(T *a, size_t elemsize, size_t addlen, size_t min_cap) { - return (T*)stbds_arrgrowf((void *)a, elemsize, addlen, min_cap); -} -template static T * stbds_hmget_key_wrapper(T *a, size_t elemsize, void *key, size_t keysize, int mode) { - return (T*)stbds_hmget_key((void*)a, elemsize, key, keysize, mode); -} -template static T * stbds_hmget_key_ts_wrapper(T *a, size_t elemsize, void *key, size_t keysize, ptrdiff_t *temp, int mode) { - return (T*)stbds_hmget_key_ts((void*)a, elemsize, key, keysize, temp, mode); -} -template static T * stbds_hmput_default_wrapper(T *a, size_t elemsize) { - return (T*)stbds_hmput_default((void *)a, elemsize); -} -template static T * stbds_hmput_key_wrapper(T *a, size_t elemsize, void *key, size_t keysize, int mode) { - return (T*)stbds_hmput_key((void*)a, elemsize, key, keysize, mode); -} -template static T * stbds_hmdel_key_wrapper(T *a, size_t elemsize, void *key, size_t keysize, size_t keyoffset, int mode){ - return (T*)stbds_hmdel_key((void*)a, elemsize, key, keysize, keyoffset, mode); -} -template static T * stbds_shmode_func_wrapper(T *, size_t elemsize, int mode) { - return (T*)stbds_shmode_func(elemsize, mode); -} -#else -#define stbds_arrgrowf_wrapper stbds_arrgrowf -#define stbds_hmget_key_wrapper stbds_hmget_key -#define stbds_hmget_key_ts_wrapper stbds_hmget_key_ts -#define stbds_hmput_default_wrapper stbds_hmput_default -#define stbds_hmput_key_wrapper stbds_hmput_key -#define stbds_hmdel_key_wrapper stbds_hmdel_key -#define stbds_shmode_func_wrapper(t,e,m) stbds_shmode_func(e,m) -#endif - -#endif // INCLUDE_STB_DS_H - - -////////////////////////////////////////////////////////////////////////////// -// -// IMPLEMENTATION -// - -#ifdef STB_DS_IMPLEMENTATION -#include -#include - -#ifndef STBDS_ASSERT -#define STBDS_ASSERT_WAS_UNDEFINED -#define STBDS_ASSERT(x) ((void) 0) -#endif - -#ifdef STBDS_STATISTICS -#define STBDS_STATS(x) x -size_t stbds_array_grow; -size_t stbds_hash_grow; -size_t stbds_hash_shrink; -size_t stbds_hash_rebuild; -size_t stbds_hash_probes; -size_t stbds_hash_alloc; -size_t stbds_rehash_probes; -size_t stbds_rehash_items; -#else -#define STBDS_STATS(x) -#endif - -// -// stbds_arr implementation -// - -//int *prev_allocs[65536]; -//int num_prev; - -void *stbds_arrgrowf(void *a, size_t elemsize, size_t addlen, size_t min_cap) -{ - stbds_array_header temp={0}; // force debugging - void *b; - size_t min_len = stbds_arrlen(a) + addlen; - (void) sizeof(temp); - - // compute the minimum capacity needed - if (min_len > min_cap) - min_cap = min_len; - - if (min_cap <= stbds_arrcap(a)) - return a; - - // increase needed capacity to guarantee O(1) amortized - if (min_cap < 2 * stbds_arrcap(a)) - min_cap = 2 * stbds_arrcap(a); - else if (min_cap < 4) - min_cap = 4; - - //if (num_prev < 65536) if (a) prev_allocs[num_prev++] = (int *) ((char *) a+1); - //if (num_prev == 2201) - // num_prev = num_prev; - b = STBDS_REALLOC(NULL, (a) ? stbds_header(a) : 0, elemsize * min_cap + sizeof(stbds_array_header)); - //if (num_prev < 65536) prev_allocs[num_prev++] = (int *) (char *) b; - b = (char *) b + sizeof(stbds_array_header); - if (a == NULL) { - stbds_header(b)->length = 0; - stbds_header(b)->hash_table = 0; - stbds_header(b)->temp = 0; - } else { - STBDS_STATS(++stbds_array_grow); - } - stbds_header(b)->capacity = min_cap; - - return b; -} - -void stbds_arrfreef(void *a) -{ - STBDS_FREE(NULL, stbds_header(a)); -} - -// -// stbds_hm hash table implementation -// - -#ifdef STBDS_INTERNAL_SMALL_BUCKET -#define STBDS_BUCKET_LENGTH 4 -#else -#define STBDS_BUCKET_LENGTH 8 -#endif - -#define STBDS_BUCKET_SHIFT (STBDS_BUCKET_LENGTH == 8 ? 3 : 2) -#define STBDS_BUCKET_MASK (STBDS_BUCKET_LENGTH-1) -#define STBDS_CACHE_LINE_SIZE 64 - -#define STBDS_ALIGN_FWD(n,a) (((n) + (a) - 1) & ~((a)-1)) - -typedef struct -{ - size_t hash [STBDS_BUCKET_LENGTH]; - ptrdiff_t index[STBDS_BUCKET_LENGTH]; -} stbds_hash_bucket; // in 32-bit, this is one 64-byte cache line; in 64-bit, each array is one 64-byte cache line - -typedef struct -{ - char * temp_key; // this MUST be the first field of the hash table - size_t slot_count; - size_t used_count; - size_t used_count_threshold; - size_t used_count_shrink_threshold; - size_t tombstone_count; - size_t tombstone_count_threshold; - size_t seed; - size_t slot_count_log2; - stbds_string_arena string; - stbds_hash_bucket *storage; // not a separate allocation, just 64-byte aligned storage after this struct -} stbds_hash_index; - -#define STBDS_INDEX_EMPTY -1 -#define STBDS_INDEX_DELETED -2 -#define STBDS_INDEX_IN_USE(x) ((x) >= 0) - -#define STBDS_HASH_EMPTY 0 -#define STBDS_HASH_DELETED 1 - -static size_t stbds_hash_seed=0x31415926; - -void stbds_rand_seed(size_t seed) -{ - stbds_hash_seed = seed; -} - -#define stbds_load_32_or_64(var, temp, v32, v64_hi, v64_lo) \ - temp = v64_lo ^ v32, temp <<= 16, temp <<= 16, temp >>= 16, temp >>= 16, /* discard if 32-bit */ \ - var = v64_hi, var <<= 16, var <<= 16, /* discard if 32-bit */ \ - var ^= temp ^ v32 - -#define STBDS_SIZE_T_BITS ((sizeof (size_t)) * 8) - -static size_t stbds_probe_position(size_t hash, size_t slot_count, size_t slot_log2) -{ - size_t pos; - STBDS_NOTUSED(slot_log2); - pos = hash & (slot_count-1); - #ifdef STBDS_INTERNAL_BUCKET_START - pos &= ~STBDS_BUCKET_MASK; - #endif - return pos; -} - -static size_t stbds_log2(size_t slot_count) -{ - size_t n=0; - while (slot_count > 1) { - slot_count >>= 1; - ++n; - } - return n; -} - -static stbds_hash_index *stbds_make_hash_index(size_t slot_count, stbds_hash_index *ot) -{ - stbds_hash_index *t; - t = (stbds_hash_index *) STBDS_REALLOC(NULL,0,(slot_count >> STBDS_BUCKET_SHIFT) * sizeof(stbds_hash_bucket) + sizeof(stbds_hash_index) + STBDS_CACHE_LINE_SIZE-1); - t->storage = (stbds_hash_bucket *) STBDS_ALIGN_FWD((size_t) (t+1), STBDS_CACHE_LINE_SIZE); - t->slot_count = slot_count; - t->slot_count_log2 = stbds_log2(slot_count); - t->tombstone_count = 0; - t->used_count = 0; - - #if 0 // A1 - t->used_count_threshold = slot_count*12/16; // if 12/16th of table is occupied, grow - t->tombstone_count_threshold = slot_count* 2/16; // if tombstones are 2/16th of table, rebuild - t->used_count_shrink_threshold = slot_count* 4/16; // if table is only 4/16th full, shrink - #elif 1 // A2 - //t->used_count_threshold = slot_count*12/16; // if 12/16th of table is occupied, grow - //t->tombstone_count_threshold = slot_count* 3/16; // if tombstones are 3/16th of table, rebuild - //t->used_count_shrink_threshold = slot_count* 4/16; // if table is only 4/16th full, shrink - - // compute without overflowing - t->used_count_threshold = slot_count - (slot_count>>2); - t->tombstone_count_threshold = (slot_count>>3) + (slot_count>>4); - t->used_count_shrink_threshold = slot_count >> 2; - - #elif 0 // B1 - t->used_count_threshold = slot_count*13/16; // if 13/16th of table is occupied, grow - t->tombstone_count_threshold = slot_count* 2/16; // if tombstones are 2/16th of table, rebuild - t->used_count_shrink_threshold = slot_count* 5/16; // if table is only 5/16th full, shrink - #else // C1 - t->used_count_threshold = slot_count*14/16; // if 14/16th of table is occupied, grow - t->tombstone_count_threshold = slot_count* 2/16; // if tombstones are 2/16th of table, rebuild - t->used_count_shrink_threshold = slot_count* 6/16; // if table is only 6/16th full, shrink - #endif - // Following statistics were measured on a Core i7-6700 @ 4.00Ghz, compiled with clang 7.0.1 -O2 - // Note that the larger tables have high variance as they were run fewer times - // A1 A2 B1 C1 - // 0.10ms : 0.10ms : 0.10ms : 0.11ms : 2,000 inserts creating 2K table - // 0.96ms : 0.95ms : 0.97ms : 1.04ms : 20,000 inserts creating 20K table - // 14.48ms : 14.46ms : 10.63ms : 11.00ms : 200,000 inserts creating 200K table - // 195.74ms : 196.35ms : 203.69ms : 214.92ms : 2,000,000 inserts creating 2M table - // 2193.88ms : 2209.22ms : 2285.54ms : 2437.17ms : 20,000,000 inserts creating 20M table - // 65.27ms : 53.77ms : 65.33ms : 65.47ms : 500,000 inserts & deletes in 2K table - // 72.78ms : 62.45ms : 71.95ms : 72.85ms : 500,000 inserts & deletes in 20K table - // 89.47ms : 77.72ms : 96.49ms : 96.75ms : 500,000 inserts & deletes in 200K table - // 97.58ms : 98.14ms : 97.18ms : 97.53ms : 500,000 inserts & deletes in 2M table - // 118.61ms : 119.62ms : 120.16ms : 118.86ms : 500,000 inserts & deletes in 20M table - // 192.11ms : 194.39ms : 196.38ms : 195.73ms : 500,000 inserts & deletes in 200M table - - if (slot_count <= STBDS_BUCKET_LENGTH) - t->used_count_shrink_threshold = 0; - // to avoid infinite loop, we need to guarantee that at least one slot is empty and will terminate probes - STBDS_ASSERT(t->used_count_threshold + t->tombstone_count_threshold < t->slot_count); - STBDS_STATS(++stbds_hash_alloc); - if (ot) { - t->string = ot->string; - // reuse old seed so we can reuse old hashes so below "copy out old data" doesn't do any hashing - t->seed = ot->seed; - } else { - size_t a,b,temp; - memset(&t->string, 0, sizeof(t->string)); - t->seed = stbds_hash_seed; - // LCG - // in 32-bit, a = 2147001325 b = 715136305 - // in 64-bit, a = 2862933555777941757 b = 3037000493 - stbds_load_32_or_64(a,temp, 2147001325, 0x27bb2ee6, 0x87b0b0fd); - stbds_load_32_or_64(b,temp, 715136305, 0, 0xb504f32d); - stbds_hash_seed = stbds_hash_seed * a + b; - } - - { - size_t i,j; - for (i=0; i < slot_count >> STBDS_BUCKET_SHIFT; ++i) { - stbds_hash_bucket *b = &t->storage[i]; - for (j=0; j < STBDS_BUCKET_LENGTH; ++j) - b->hash[j] = STBDS_HASH_EMPTY; - for (j=0; j < STBDS_BUCKET_LENGTH; ++j) - b->index[j] = STBDS_INDEX_EMPTY; - } - } - - // copy out the old data, if any - if (ot) { - size_t i,j; - t->used_count = ot->used_count; - for (i=0; i < ot->slot_count >> STBDS_BUCKET_SHIFT; ++i) { - stbds_hash_bucket *ob = &ot->storage[i]; - for (j=0; j < STBDS_BUCKET_LENGTH; ++j) { - if (STBDS_INDEX_IN_USE(ob->index[j])) { - size_t hash = ob->hash[j]; - size_t pos = stbds_probe_position(hash, t->slot_count, t->slot_count_log2); - size_t step = STBDS_BUCKET_LENGTH; - STBDS_STATS(++stbds_rehash_items); - for (;;) { - size_t limit,z; - stbds_hash_bucket *bucket; - bucket = &t->storage[pos >> STBDS_BUCKET_SHIFT]; - STBDS_STATS(++stbds_rehash_probes); - - for (z=pos & STBDS_BUCKET_MASK; z < STBDS_BUCKET_LENGTH; ++z) { - if (bucket->hash[z] == 0) { - bucket->hash[z] = hash; - bucket->index[z] = ob->index[j]; - goto done; - } - } - - limit = pos & STBDS_BUCKET_MASK; - for (z = 0; z < limit; ++z) { - if (bucket->hash[z] == 0) { - bucket->hash[z] = hash; - bucket->index[z] = ob->index[j]; - goto done; - } - } - - pos += step; // quadratic probing - step += STBDS_BUCKET_LENGTH; - pos &= (t->slot_count-1); - } - } - done: - ; - } - } - } - - return t; -} - -#define STBDS_ROTATE_LEFT(val, n) (((val) << (n)) | ((val) >> (STBDS_SIZE_T_BITS - (n)))) -#define STBDS_ROTATE_RIGHT(val, n) (((val) >> (n)) | ((val) << (STBDS_SIZE_T_BITS - (n)))) - -size_t stbds_hash_string(char *str, size_t seed) -{ - size_t hash = seed; - while (*str) - hash = STBDS_ROTATE_LEFT(hash, 9) + (unsigned char) *str++; - - // Thomas Wang 64-to-32 bit mix function, hopefully also works in 32 bits - hash ^= seed; - hash = (~hash) + (hash << 18); - hash ^= hash ^ STBDS_ROTATE_RIGHT(hash,31); - hash = hash * 21; - hash ^= hash ^ STBDS_ROTATE_RIGHT(hash,11); - hash += (hash << 6); - hash ^= STBDS_ROTATE_RIGHT(hash,22); - return hash+seed; -} - -#ifdef STBDS_SIPHASH_2_4 -#define STBDS_SIPHASH_C_ROUNDS 2 -#define STBDS_SIPHASH_D_ROUNDS 4 -typedef int STBDS_SIPHASH_2_4_can_only_be_used_in_64_bit_builds[sizeof(size_t) == 8 ? 1 : -1]; -#endif - -#ifndef STBDS_SIPHASH_C_ROUNDS -#define STBDS_SIPHASH_C_ROUNDS 1 -#endif -#ifndef STBDS_SIPHASH_D_ROUNDS -#define STBDS_SIPHASH_D_ROUNDS 1 -#endif - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4127) // conditional expression is constant, for do..while(0) and sizeof()== -#endif - -static size_t stbds_siphash_bytes(void *p, size_t len, size_t seed) -{ - unsigned char *d = (unsigned char *) p; - size_t i,j; - size_t v0,v1,v2,v3, data; - - // hash that works on 32- or 64-bit registers without knowing which we have - // (computes different results on 32-bit and 64-bit platform) - // derived from siphash, but on 32-bit platforms very different as it uses 4 32-bit state not 4 64-bit - v0 = ((((size_t) 0x736f6d65 << 16) << 16) + 0x70736575) ^ seed; - v1 = ((((size_t) 0x646f7261 << 16) << 16) + 0x6e646f6d) ^ ~seed; - v2 = ((((size_t) 0x6c796765 << 16) << 16) + 0x6e657261) ^ seed; - v3 = ((((size_t) 0x74656462 << 16) << 16) + 0x79746573) ^ ~seed; - - #ifdef STBDS_TEST_SIPHASH_2_4 - // hardcoded with key material in the siphash test vectors - v0 ^= 0x0706050403020100ull ^ seed; - v1 ^= 0x0f0e0d0c0b0a0908ull ^ ~seed; - v2 ^= 0x0706050403020100ull ^ seed; - v3 ^= 0x0f0e0d0c0b0a0908ull ^ ~seed; - #endif - - #define STBDS_SIPROUND() \ - do { \ - v0 += v1; v1 = STBDS_ROTATE_LEFT(v1, 13); v1 ^= v0; v0 = STBDS_ROTATE_LEFT(v0,STBDS_SIZE_T_BITS/2); \ - v2 += v3; v3 = STBDS_ROTATE_LEFT(v3, 16); v3 ^= v2; \ - v2 += v1; v1 = STBDS_ROTATE_LEFT(v1, 17); v1 ^= v2; v2 = STBDS_ROTATE_LEFT(v2,STBDS_SIZE_T_BITS/2); \ - v0 += v3; v3 = STBDS_ROTATE_LEFT(v3, 21); v3 ^= v0; \ - } while (0) - - for (i=0; i+sizeof(size_t) <= len; i += sizeof(size_t), d += sizeof(size_t)) { - data = d[0] | (d[1] << 8) | (d[2] << 16) | (d[3] << 24); - data |= (size_t) (d[4] | (d[5] << 8) | (d[6] << 16) | (d[7] << 24)) << 16 << 16; // discarded if size_t == 4 - - v3 ^= data; - for (j=0; j < STBDS_SIPHASH_C_ROUNDS; ++j) - STBDS_SIPROUND(); - v0 ^= data; - } - data = len << (STBDS_SIZE_T_BITS-8); - switch (len - i) { - case 7: data |= ((size_t) d[6] << 24) << 24; // fall through - case 6: data |= ((size_t) d[5] << 20) << 20; // fall through - case 5: data |= ((size_t) d[4] << 16) << 16; // fall through - case 4: data |= (d[3] << 24); // fall through - case 3: data |= (d[2] << 16); // fall through - case 2: data |= (d[1] << 8); // fall through - case 1: data |= d[0]; // fall through - case 0: break; - } - v3 ^= data; - for (j=0; j < STBDS_SIPHASH_C_ROUNDS; ++j) - STBDS_SIPROUND(); - v0 ^= data; - v2 ^= 0xff; - for (j=0; j < STBDS_SIPHASH_D_ROUNDS; ++j) - STBDS_SIPROUND(); - -#ifdef STBDS_SIPHASH_2_4 - return v0^v1^v2^v3; -#else - return v1^v2^v3; // slightly stronger since v0^v3 in above cancels out final round operation? I tweeted at the authors of SipHash about this but they didn't reply -#endif -} - -size_t stbds_hash_bytes(void *p, size_t len, size_t seed) -{ -#ifdef STBDS_SIPHASH_2_4 - return stbds_siphash_bytes(p,len,seed); -#else - unsigned char *d = (unsigned char *) p; - - if (len == 4) { - unsigned int hash = d[0] | (d[1] << 8) | (d[2] << 16) | (d[3] << 24); - #if 0 - // HASH32-A Bob Jenkin's hash function w/o large constants - hash ^= seed; - hash -= (hash<<6); - hash ^= (hash>>17); - hash -= (hash<<9); - hash ^= seed; - hash ^= (hash<<4); - hash -= (hash<<3); - hash ^= (hash<<10); - hash ^= (hash>>15); - #elif 1 - // HASH32-BB Bob Jenkin's presumably-accidental version of Thomas Wang hash with rotates turned into shifts. - // Note that converting these back to rotates makes it run a lot slower, presumably due to collisions, so I'm - // not really sure what's going on. - hash ^= seed; - hash = (hash ^ 61) ^ (hash >> 16); - hash = hash + (hash << 3); - hash = hash ^ (hash >> 4); - hash = hash * 0x27d4eb2d; - hash ^= seed; - hash = hash ^ (hash >> 15); - #else // HASH32-C - Murmur3 - hash ^= seed; - hash *= 0xcc9e2d51; - hash = (hash << 17) | (hash >> 15); - hash *= 0x1b873593; - hash ^= seed; - hash = (hash << 19) | (hash >> 13); - hash = hash*5 + 0xe6546b64; - hash ^= hash >> 16; - hash *= 0x85ebca6b; - hash ^= seed; - hash ^= hash >> 13; - hash *= 0xc2b2ae35; - hash ^= hash >> 16; - #endif - // Following statistics were measured on a Core i7-6700 @ 4.00Ghz, compiled with clang 7.0.1 -O2 - // Note that the larger tables have high variance as they were run fewer times - // HASH32-A // HASH32-BB // HASH32-C - // 0.10ms // 0.10ms // 0.10ms : 2,000 inserts creating 2K table - // 0.96ms // 0.95ms // 0.99ms : 20,000 inserts creating 20K table - // 14.69ms // 14.43ms // 14.97ms : 200,000 inserts creating 200K table - // 199.99ms // 195.36ms // 202.05ms : 2,000,000 inserts creating 2M table - // 2234.84ms // 2187.74ms // 2240.38ms : 20,000,000 inserts creating 20M table - // 55.68ms // 53.72ms // 57.31ms : 500,000 inserts & deletes in 2K table - // 63.43ms // 61.99ms // 65.73ms : 500,000 inserts & deletes in 20K table - // 80.04ms // 77.96ms // 81.83ms : 500,000 inserts & deletes in 200K table - // 100.42ms // 97.40ms // 102.39ms : 500,000 inserts & deletes in 2M table - // 119.71ms // 120.59ms // 121.63ms : 500,000 inserts & deletes in 20M table - // 185.28ms // 195.15ms // 187.74ms : 500,000 inserts & deletes in 200M table - // 15.58ms // 14.79ms // 15.52ms : 200,000 inserts creating 200K table with varying key spacing - - return (((size_t) hash << 16 << 16) | hash) ^ seed; - } else if (len == 8 && sizeof(size_t) == 8) { - size_t hash = d[0] | (d[1] << 8) | (d[2] << 16) | (d[3] << 24); - hash |= (size_t) (d[4] | (d[5] << 8) | (d[6] << 16) | (d[7] << 24)) << 16 << 16; // avoid warning if size_t == 4 - hash ^= seed; - hash = (~hash) + (hash << 21); - hash ^= STBDS_ROTATE_RIGHT(hash,24); - hash *= 265; - hash ^= STBDS_ROTATE_RIGHT(hash,14); - hash ^= seed; - hash *= 21; - hash ^= STBDS_ROTATE_RIGHT(hash,28); - hash += (hash << 31); - hash = (~hash) + (hash << 18); - return hash; - } else { - return stbds_siphash_bytes(p,len,seed); - } -#endif -} -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - -static int stbds_is_key_equal(void *a, size_t elemsize, void *key, size_t keysize, size_t keyoffset, int mode, size_t i) -{ - if (mode >= STBDS_HM_STRING) - return 0==strcmp((char *) key, * (char **) ((char *) a + elemsize*i + keyoffset)); - else - return 0==memcmp(key, (char *) a + elemsize*i + keyoffset, keysize); -} - -#define STBDS_HASH_TO_ARR(x,elemsize) ((char*) (x) - (elemsize)) -#define STBDS_ARR_TO_HASH(x,elemsize) ((char*) (x) + (elemsize)) - -#define stbds_hash_table(a) ((stbds_hash_index *) stbds_header(a)->hash_table) - -void stbds_hmfree_func(void *a, size_t elemsize) -{ - if (a == NULL) return; - if (stbds_hash_table(a) != NULL) { - if (stbds_hash_table(a)->string.mode == STBDS_SH_STRDUP) { - size_t i; - // skip 0th element, which is default - for (i=1; i < stbds_header(a)->length; ++i) - STBDS_FREE(NULL, *(char**) ((char *) a + elemsize*i)); - } - stbds_strreset(&stbds_hash_table(a)->string); - } - STBDS_FREE(NULL, stbds_header(a)->hash_table); - STBDS_FREE(NULL, stbds_header(a)); -} - -static ptrdiff_t stbds_hm_find_slot(void *a, size_t elemsize, void *key, size_t keysize, size_t keyoffset, int mode) -{ - void *raw_a = STBDS_HASH_TO_ARR(a,elemsize); - stbds_hash_index *table = stbds_hash_table(raw_a); - size_t hash = mode >= STBDS_HM_STRING ? stbds_hash_string((char*)key,table->seed) : stbds_hash_bytes(key, keysize,table->seed); - size_t step = STBDS_BUCKET_LENGTH; - size_t limit,i; - size_t pos; - stbds_hash_bucket *bucket; - - if (hash < 2) hash += 2; // stored hash values are forbidden from being 0, so we can detect empty slots - - pos = stbds_probe_position(hash, table->slot_count, table->slot_count_log2); - - for (;;) { - STBDS_STATS(++stbds_hash_probes); - bucket = &table->storage[pos >> STBDS_BUCKET_SHIFT]; - - // start searching from pos to end of bucket, this should help performance on small hash tables that fit in cache - for (i=pos & STBDS_BUCKET_MASK; i < STBDS_BUCKET_LENGTH; ++i) { - if (bucket->hash[i] == hash) { - if (stbds_is_key_equal(a, elemsize, key, keysize, keyoffset, mode, bucket->index[i])) { - return (pos & ~STBDS_BUCKET_MASK)+i; - } - } else if (bucket->hash[i] == STBDS_HASH_EMPTY) { - return -1; - } - } - - // search from beginning of bucket to pos - limit = pos & STBDS_BUCKET_MASK; - for (i = 0; i < limit; ++i) { - if (bucket->hash[i] == hash) { - if (stbds_is_key_equal(a, elemsize, key, keysize, keyoffset, mode, bucket->index[i])) { - return (pos & ~STBDS_BUCKET_MASK)+i; - } - } else if (bucket->hash[i] == STBDS_HASH_EMPTY) { - return -1; - } - } - - // quadratic probing - pos += step; - step += STBDS_BUCKET_LENGTH; - pos &= (table->slot_count-1); - } - /* NOTREACHED */ -} - -void * stbds_hmget_key_ts(void *a, size_t elemsize, void *key, size_t keysize, ptrdiff_t *temp, int mode) -{ - size_t keyoffset = 0; - if (a == NULL) { - // make it non-empty so we can return a temp - a = stbds_arrgrowf(0, elemsize, 0, 1); - stbds_header(a)->length += 1; - memset(a, 0, elemsize); - *temp = STBDS_INDEX_EMPTY; - // adjust a to point after the default element - return STBDS_ARR_TO_HASH(a,elemsize); - } else { - stbds_hash_index *table; - void *raw_a = STBDS_HASH_TO_ARR(a,elemsize); - // adjust a to point to the default element - table = (stbds_hash_index *) stbds_header(raw_a)->hash_table; - if (table == 0) { - *temp = -1; - } else { - ptrdiff_t slot = stbds_hm_find_slot(a, elemsize, key, keysize, keyoffset, mode); - if (slot < 0) { - *temp = STBDS_INDEX_EMPTY; - } else { - stbds_hash_bucket *b = &table->storage[slot >> STBDS_BUCKET_SHIFT]; - *temp = b->index[slot & STBDS_BUCKET_MASK]; - } - } - return a; - } -} - -void * stbds_hmget_key(void *a, size_t elemsize, void *key, size_t keysize, int mode) -{ - ptrdiff_t temp; - void *p = stbds_hmget_key_ts(a, elemsize, key, keysize, &temp, mode); - stbds_temp(STBDS_HASH_TO_ARR(p,elemsize)) = temp; - return p; -} - -void * stbds_hmput_default(void *a, size_t elemsize) -{ - // three cases: - // a is NULL <- allocate - // a has a hash table but no entries, because of shmode <- grow - // a has entries <- do nothing - if (a == NULL || stbds_header(STBDS_HASH_TO_ARR(a,elemsize))->length == 0) { - a = stbds_arrgrowf(a ? STBDS_HASH_TO_ARR(a,elemsize) : NULL, elemsize, 0, 1); - stbds_header(a)->length += 1; - memset(a, 0, elemsize); - a=STBDS_ARR_TO_HASH(a,elemsize); - } - return a; -} - -static char *stbds_strdup(char *str); - -void *stbds_hmput_key(void *a, size_t elemsize, void *key, size_t keysize, int mode) -{ - size_t keyoffset=0; - void *raw_a; - stbds_hash_index *table; - - if (a == NULL) { - a = stbds_arrgrowf(0, elemsize, 0, 1); - memset(a, 0, elemsize); - stbds_header(a)->length += 1; - // adjust a to point AFTER the default element - a = STBDS_ARR_TO_HASH(a,elemsize); - } - - // adjust a to point to the default element - raw_a = a; - a = STBDS_HASH_TO_ARR(a,elemsize); - - table = (stbds_hash_index *) stbds_header(a)->hash_table; - - if (table == NULL || table->used_count >= table->used_count_threshold) { - stbds_hash_index *nt; - size_t slot_count; - - slot_count = (table == NULL) ? STBDS_BUCKET_LENGTH : table->slot_count*2; - nt = stbds_make_hash_index(slot_count, table); - if (table) - STBDS_FREE(NULL, table); - else - nt->string.mode = mode >= STBDS_HM_STRING ? STBDS_SH_DEFAULT : 0; - stbds_header(a)->hash_table = table = nt; - STBDS_STATS(++stbds_hash_grow); - } - - // we iterate hash table explicitly because we want to track if we saw a tombstone - { - size_t hash = mode >= STBDS_HM_STRING ? stbds_hash_string((char*)key,table->seed) : stbds_hash_bytes(key, keysize,table->seed); - size_t step = STBDS_BUCKET_LENGTH; - size_t pos; - ptrdiff_t tombstone = -1; - stbds_hash_bucket *bucket; - - // stored hash values are forbidden from being 0, so we can detect empty slots to early out quickly - if (hash < 2) hash += 2; - - pos = stbds_probe_position(hash, table->slot_count, table->slot_count_log2); - - for (;;) { - size_t limit, i; - STBDS_STATS(++stbds_hash_probes); - bucket = &table->storage[pos >> STBDS_BUCKET_SHIFT]; - - // start searching from pos to end of bucket - for (i=pos & STBDS_BUCKET_MASK; i < STBDS_BUCKET_LENGTH; ++i) { - if (bucket->hash[i] == hash) { - if (stbds_is_key_equal(raw_a, elemsize, key, keysize, keyoffset, mode, bucket->index[i])) { - stbds_temp(a) = bucket->index[i]; - if (mode >= STBDS_HM_STRING) - stbds_temp_key(a) = * (char **) ((char *) raw_a + elemsize*bucket->index[i] + keyoffset); - return STBDS_ARR_TO_HASH(a,elemsize); - } - } else if (bucket->hash[i] == 0) { - pos = (pos & ~STBDS_BUCKET_MASK) + i; - goto found_empty_slot; - } else if (tombstone < 0) { - if (bucket->index[i] == STBDS_INDEX_DELETED) - tombstone = (ptrdiff_t) ((pos & ~STBDS_BUCKET_MASK) + i); - } - } - - // search from beginning of bucket to pos - limit = pos & STBDS_BUCKET_MASK; - for (i = 0; i < limit; ++i) { - if (bucket->hash[i] == hash) { - if (stbds_is_key_equal(raw_a, elemsize, key, keysize, keyoffset, mode, bucket->index[i])) { - stbds_temp(a) = bucket->index[i]; - return STBDS_ARR_TO_HASH(a,elemsize); - } - } else if (bucket->hash[i] == 0) { - pos = (pos & ~STBDS_BUCKET_MASK) + i; - goto found_empty_slot; - } else if (tombstone < 0) { - if (bucket->index[i] == STBDS_INDEX_DELETED) - tombstone = (ptrdiff_t) ((pos & ~STBDS_BUCKET_MASK) + i); - } - } - - // quadratic probing - pos += step; - step += STBDS_BUCKET_LENGTH; - pos &= (table->slot_count-1); - } - found_empty_slot: - if (tombstone >= 0) { - pos = tombstone; - --table->tombstone_count; - } - ++table->used_count; - - { - ptrdiff_t i = (ptrdiff_t) stbds_arrlen(a); - // we want to do stbds_arraddn(1), but we can't use the macros since we don't have something of the right type - if ((size_t) i+1 > stbds_arrcap(a)) - *(void **) &a = stbds_arrgrowf(a, elemsize, 1, 0); - raw_a = STBDS_ARR_TO_HASH(a,elemsize); - - STBDS_ASSERT((size_t) i+1 <= stbds_arrcap(a)); - stbds_header(a)->length = i+1; - bucket = &table->storage[pos >> STBDS_BUCKET_SHIFT]; - bucket->hash[pos & STBDS_BUCKET_MASK] = hash; - bucket->index[pos & STBDS_BUCKET_MASK] = i-1; - stbds_temp(a) = i-1; - - switch (table->string.mode) { - case STBDS_SH_STRDUP: stbds_temp_key(a) = *(char **) ((char *) a + elemsize*i) = stbds_strdup((char*) key); break; - case STBDS_SH_ARENA: stbds_temp_key(a) = *(char **) ((char *) a + elemsize*i) = stbds_stralloc(&table->string, (char*)key); break; - case STBDS_SH_DEFAULT: stbds_temp_key(a) = *(char **) ((char *) a + elemsize*i) = (char *) key; break; - default: memcpy((char *) a + elemsize*i, key, keysize); break; - } - } - return STBDS_ARR_TO_HASH(a,elemsize); - } -} - -void * stbds_shmode_func(size_t elemsize, int mode) -{ - void *a = stbds_arrgrowf(0, elemsize, 0, 1); - stbds_hash_index *h; - memset(a, 0, elemsize); - stbds_header(a)->length = 1; - stbds_header(a)->hash_table = h = (stbds_hash_index *) stbds_make_hash_index(STBDS_BUCKET_LENGTH, NULL); - h->string.mode = (unsigned char) mode; - return STBDS_ARR_TO_HASH(a,elemsize); -} - -void * stbds_hmdel_key(void *a, size_t elemsize, void *key, size_t keysize, size_t keyoffset, int mode) -{ - if (a == NULL) { - return 0; - } else { - stbds_hash_index *table; - void *raw_a = STBDS_HASH_TO_ARR(a,elemsize); - table = (stbds_hash_index *) stbds_header(raw_a)->hash_table; - stbds_temp(raw_a) = 0; - if (table == 0) { - return a; - } else { - ptrdiff_t slot; - slot = stbds_hm_find_slot(a, elemsize, key, keysize, keyoffset, mode); - if (slot < 0) - return a; - else { - stbds_hash_bucket *b = &table->storage[slot >> STBDS_BUCKET_SHIFT]; - int i = slot & STBDS_BUCKET_MASK; - ptrdiff_t old_index = b->index[i]; - ptrdiff_t final_index = (ptrdiff_t) stbds_arrlen(raw_a)-1-1; // minus one for the raw_a vs a, and minus one for 'last' - STBDS_ASSERT(slot < (ptrdiff_t) table->slot_count); - --table->used_count; - ++table->tombstone_count; - stbds_temp(raw_a) = 1; - STBDS_ASSERT(table->used_count >= 0); - //STBDS_ASSERT(table->tombstone_count < table->slot_count/4); - b->hash[i] = STBDS_HASH_DELETED; - b->index[i] = STBDS_INDEX_DELETED; - - if (mode == STBDS_HM_STRING && table->string.mode == STBDS_SH_STRDUP) - STBDS_FREE(NULL, *(char**) ((char *) a+elemsize*old_index)); - - // if indices are the same, memcpy is a no-op, but back-pointer-fixup will fail, so skip - if (old_index != final_index) { - // swap delete - memmove((char*) a + elemsize*old_index, (char*) a + elemsize*final_index, elemsize); - - // now find the slot for the last element - if (mode == STBDS_HM_STRING) - slot = stbds_hm_find_slot(a, elemsize, *(char**) ((char *) a+elemsize*old_index + keyoffset), keysize, keyoffset, mode); - else - slot = stbds_hm_find_slot(a, elemsize, (char* ) a+elemsize*old_index + keyoffset, keysize, keyoffset, mode); - STBDS_ASSERT(slot >= 0); - b = &table->storage[slot >> STBDS_BUCKET_SHIFT]; - i = slot & STBDS_BUCKET_MASK; - STBDS_ASSERT(b->index[i] == final_index); - b->index[i] = old_index; - } - stbds_header(raw_a)->length -= 1; - - if (table->used_count < table->used_count_shrink_threshold && table->slot_count > STBDS_BUCKET_LENGTH) { - stbds_header(raw_a)->hash_table = stbds_make_hash_index(table->slot_count>>1, table); - STBDS_FREE(NULL, table); - STBDS_STATS(++stbds_hash_shrink); - } else if (table->tombstone_count > table->tombstone_count_threshold) { - stbds_header(raw_a)->hash_table = stbds_make_hash_index(table->slot_count , table); - STBDS_FREE(NULL, table); - STBDS_STATS(++stbds_hash_rebuild); - } - - return a; - } - } - } - /* NOTREACHED */ -} - -static char *stbds_strdup(char *str) -{ - // to keep replaceable allocator simple, we don't want to use strdup. - // rolling our own also avoids problem of strdup vs _strdup - size_t len = strlen(str)+1; - char *p = (char*) STBDS_REALLOC(NULL, 0, len); - memmove(p, str, len); - return p; -} - -#ifndef STBDS_STRING_ARENA_BLOCKSIZE_MIN -#define STBDS_STRING_ARENA_BLOCKSIZE_MIN 512u -#endif -#ifndef STBDS_STRING_ARENA_BLOCKSIZE_MAX -#define STBDS_STRING_ARENA_BLOCKSIZE_MAX (1u<<20) -#endif - -char *stbds_stralloc(stbds_string_arena *a, char *str) -{ - char *p; - size_t len = strlen(str)+1; - if (len > a->remaining) { - // compute the next blocksize - size_t blocksize = a->block; - - // size is 512, 512, 1024, 1024, 2048, 2048, 4096, 4096, etc., so that - // there are log(SIZE) allocations to free when we destroy the table - blocksize = (size_t) (STBDS_STRING_ARENA_BLOCKSIZE_MIN) << (blocksize>>1); - - // if size is under 1M, advance to next blocktype - if (blocksize < (size_t)(STBDS_STRING_ARENA_BLOCKSIZE_MAX)) - ++a->block; - - if (len > blocksize) { - // if string is larger than blocksize, then just allocate the full size. - // note that we still advance string_block so block size will continue - // increasing, so e.g. if somebody only calls this with 1000-long strings, - // eventually the arena will start doubling and handling those as well - stbds_string_block *sb = (stbds_string_block *) STBDS_REALLOC(NULL, 0, sizeof(*sb)-8 + len); - memmove(sb->storage, str, len); - if (a->storage) { - // insert it after the first element, so that we don't waste the space there - sb->next = a->storage->next; - a->storage->next = sb; - } else { - sb->next = 0; - a->storage = sb; - a->remaining = 0; // this is redundant, but good for clarity - } - return sb->storage; - } else { - stbds_string_block *sb = (stbds_string_block *) STBDS_REALLOC(NULL, 0, sizeof(*sb)-8 + blocksize); - sb->next = a->storage; - a->storage = sb; - a->remaining = blocksize; - } - } - - STBDS_ASSERT(len <= a->remaining); - p = a->storage->storage + a->remaining - len; - a->remaining -= len; - memmove(p, str, len); - return p; -} - -void stbds_strreset(stbds_string_arena *a) -{ - stbds_string_block *x,*y; - x = a->storage; - while (x) { - y = x->next; - STBDS_FREE(NULL, x); - x = y; - } - memset(a, 0, sizeof(*a)); -} - -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// UNIT TESTS -// - -#ifdef STBDS_UNIT_TESTS -#include -#ifdef STBDS_ASSERT_WAS_UNDEFINED -#undef STBDS_ASSERT -#endif -#ifndef STBDS_ASSERT -#define STBDS_ASSERT assert -#include -#endif - -typedef struct { int key,b,c,d; } stbds_struct; -typedef struct { int key[2],b,c,d; } stbds_struct2; - -static char buffer[256]; -char *strkey(int n) -{ -#if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__) - sprintf_s(buffer, sizeof(buffer), "test_%d", n); -#else - sprintf(buffer, "test_%d", n); -#endif - return buffer; -} - -void stbds_unit_tests(void) -{ -#if defined(_MSC_VER) && _MSC_VER <= 1200 && defined(__cplusplus) - // VC6 C++ doesn't like the template<> trick on unnamed structures, so do nothing! - STBDS_ASSERT(0); -#else - const int testsize = 100000; - const int testsize2 = testsize/20; - int *arr=NULL; - struct { int key; int value; } *intmap = NULL; - struct { char *key; int value; } *strmap = NULL, s; - struct { stbds_struct key; int value; } *map = NULL; - stbds_struct *map2 = NULL; - stbds_struct2 *map3 = NULL; - stbds_string_arena sa = { 0 }; - int key3[2] = { 1,2 }; - ptrdiff_t temp; - - int i,j; - - STBDS_ASSERT(arrlen(arr)==0); - for (i=0; i < 20000; i += 50) { - for (j=0; j < i; ++j) - arrpush(arr,j); - arrfree(arr); - } - - for (i=0; i < 4; ++i) { - arrpush(arr,1); arrpush(arr,2); arrpush(arr,3); arrpush(arr,4); - arrdel(arr,i); - arrfree(arr); - arrpush(arr,1); arrpush(arr,2); arrpush(arr,3); arrpush(arr,4); - arrdelswap(arr,i); - arrfree(arr); - } - - for (i=0; i < 5; ++i) { - arrpush(arr,1); arrpush(arr,2); arrpush(arr,3); arrpush(arr,4); - stbds_arrins(arr,i,5); - STBDS_ASSERT(arr[i] == 5); - if (i < 4) - STBDS_ASSERT(arr[4] == 4); - arrfree(arr); - } - - i = 1; - STBDS_ASSERT(hmgeti(intmap,i) == -1); - hmdefault(intmap, -2); - STBDS_ASSERT(hmgeti(intmap, i) == -1); - STBDS_ASSERT(hmget (intmap, i) == -2); - for (i=0; i < testsize; i+=2) - hmput(intmap, i, i*5); - for (i=0; i < testsize; i+=1) { - if (i & 1) STBDS_ASSERT(hmget(intmap, i) == -2 ); - else STBDS_ASSERT(hmget(intmap, i) == i*5); - if (i & 1) STBDS_ASSERT(hmget_ts(intmap, i, temp) == -2 ); - else STBDS_ASSERT(hmget_ts(intmap, i, temp) == i*5); - } - for (i=0; i < testsize; i+=2) - hmput(intmap, i, i*3); - for (i=0; i < testsize; i+=1) - if (i & 1) STBDS_ASSERT(hmget(intmap, i) == -2 ); - else STBDS_ASSERT(hmget(intmap, i) == i*3); - for (i=2; i < testsize; i+=4) - hmdel(intmap, i); // delete half the entries - for (i=0; i < testsize; i+=1) - if (i & 3) STBDS_ASSERT(hmget(intmap, i) == -2 ); - else STBDS_ASSERT(hmget(intmap, i) == i*3); - for (i=0; i < testsize; i+=1) - hmdel(intmap, i); // delete the rest of the entries - for (i=0; i < testsize; i+=1) - STBDS_ASSERT(hmget(intmap, i) == -2 ); - hmfree(intmap); - for (i=0; i < testsize; i+=2) - hmput(intmap, i, i*3); - hmfree(intmap); - - #if defined(__clang__) || defined(__GNUC__) - #ifndef __cplusplus - intmap = NULL; - hmput(intmap, 15, 7); - hmput(intmap, 11, 3); - hmput(intmap, 9, 5); - STBDS_ASSERT(hmget(intmap, 9) == 5); - STBDS_ASSERT(hmget(intmap, 11) == 3); - STBDS_ASSERT(hmget(intmap, 15) == 7); - #endif - #endif - - for (i=0; i < testsize; ++i) - stralloc(&sa, strkey(i)); - strreset(&sa); - - { - s.key = "a", s.value = 1; - shputs(strmap, s); - STBDS_ASSERT(*strmap[0].key == 'a'); - STBDS_ASSERT(strmap[0].key == s.key); - STBDS_ASSERT(strmap[0].value == s.value); - shfree(strmap); - } - - { - s.key = "a", s.value = 1; - sh_new_strdup(strmap); - shputs(strmap, s); - STBDS_ASSERT(*strmap[0].key == 'a'); - STBDS_ASSERT(strmap[0].key != s.key); - STBDS_ASSERT(strmap[0].value == s.value); - shfree(strmap); - } - - { - s.key = "a", s.value = 1; - sh_new_arena(strmap); - shputs(strmap, s); - STBDS_ASSERT(*strmap[0].key == 'a'); - STBDS_ASSERT(strmap[0].key != s.key); - STBDS_ASSERT(strmap[0].value == s.value); - shfree(strmap); - } - - for (j=0; j < 2; ++j) { - STBDS_ASSERT(shgeti(strmap,"foo") == -1); - if (j == 0) - sh_new_strdup(strmap); - else - sh_new_arena(strmap); - STBDS_ASSERT(shgeti(strmap,"foo") == -1); - shdefault(strmap, -2); - STBDS_ASSERT(shgeti(strmap,"foo") == -1); - for (i=0; i < testsize; i+=2) - shput(strmap, strkey(i), i*3); - for (i=0; i < testsize; i+=1) - if (i & 1) STBDS_ASSERT(shget(strmap, strkey(i)) == -2 ); - else STBDS_ASSERT(shget(strmap, strkey(i)) == i*3); - for (i=2; i < testsize; i+=4) - shdel(strmap, strkey(i)); // delete half the entries - for (i=0; i < testsize; i+=1) - if (i & 3) STBDS_ASSERT(shget(strmap, strkey(i)) == -2 ); - else STBDS_ASSERT(shget(strmap, strkey(i)) == i*3); - for (i=0; i < testsize; i+=1) - shdel(strmap, strkey(i)); // delete the rest of the entries - for (i=0; i < testsize; i+=1) - STBDS_ASSERT(shget(strmap, strkey(i)) == -2 ); - shfree(strmap); - } - - { - struct { char *key; char value; } *hash = NULL; - char name[4] = "jen"; - shput(hash, "bob" , 'h'); - shput(hash, "sally" , 'e'); - shput(hash, "fred" , 'l'); - shput(hash, "jen" , 'x'); - shput(hash, "doug" , 'o'); - - shput(hash, name , 'l'); - shfree(hash); - } - - for (i=0; i < testsize; i += 2) { - stbds_struct s = { i,i*2,i*3,i*4 }; - hmput(map, s, i*5); - } - - for (i=0; i < testsize; i += 1) { - stbds_struct s = { i,i*2,i*3 ,i*4 }; - stbds_struct t = { i,i*2,i*3+1,i*4 }; - if (i & 1) STBDS_ASSERT(hmget(map, s) == 0); - else STBDS_ASSERT(hmget(map, s) == i*5); - if (i & 1) STBDS_ASSERT(hmget_ts(map, s, temp) == 0); - else STBDS_ASSERT(hmget_ts(map, s, temp) == i*5); - //STBDS_ASSERT(hmget(map, t.key) == 0); - } - - for (i=0; i < testsize; i += 2) { - stbds_struct s = { i,i*2,i*3,i*4 }; - hmputs(map2, s); - } - hmfree(map); - - for (i=0; i < testsize; i += 1) { - stbds_struct s = { i,i*2,i*3,i*4 }; - stbds_struct t = { i,i*2,i*3+1,i*4 }; - if (i & 1) STBDS_ASSERT(hmgets(map2, s.key).d == 0); - else STBDS_ASSERT(hmgets(map2, s.key).d == i*4); - //STBDS_ASSERT(hmgetp(map2, t.key) == 0); - } - hmfree(map2); - - for (i=0; i < testsize; i += 2) { - stbds_struct2 s = { { i,i*2 }, i*3,i*4, i*5 }; - hmputs(map3, s); - } - for (i=0; i < testsize; i += 1) { - stbds_struct2 s = { { i,i*2}, i*3, i*4, i*5 }; - stbds_struct2 t = { { i,i*2}, i*3+1, i*4, i*5 }; - if (i & 1) STBDS_ASSERT(hmgets(map3, s.key).d == 0); - else STBDS_ASSERT(hmgets(map3, s.key).d == i*5); - //STBDS_ASSERT(hmgetp(map3, t.key) == 0); - } -#endif -} -#endif - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2019 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ - diff --git a/dep/stb/stb_image.h b/dep/stb/stb_image.h deleted file mode 100644 index 0f8459a..0000000 --- a/dep/stb/stb_image.h +++ /dev/null @@ -1,7890 +0,0 @@ -/* stb_image - v2.27 - public domain image loader - http://nothings.org/stb - no warranty implied; use at your own risk - - Do this: - #define STB_IMAGE_IMPLEMENTATION - before you include this file in *one* C or C++ file to create the implementation. - - // i.e. it should look like this: - #include ... - #include ... - #include ... - #define STB_IMAGE_IMPLEMENTATION - #include "stb_image.h" - - You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. - And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free - - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8/16-bit-per-channel - - TGA (not sure what subset, if a subset) - BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels, 8/16 bit-per-channel) - - GIF (*comp always reports as 4-channel) - HDR (radiance rgbE format) - PIC (Softimage PIC) - PNM (PPM and PGM binary only) - - Animated GIF still needs a proper API, but here's one way to do it: - http://gist.github.com/urraka/685d9a6340b26b830d49 - - - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - - decode from arbitrary I/O callbacks - - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) - - Full documentation under "DOCUMENTATION" below. - - -LICENSE - - See end of file for license information. - -RECENT REVISION HISTORY: - - 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes - 2.26 (2020-07-13) many minor fixes - 2.25 (2020-02-02) fix warnings - 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically - 2.23 (2019-08-11) fix clang static analysis warning - 2.22 (2019-03-04) gif fixes, fix warnings - 2.21 (2019-02-25) fix typo in comment - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings - 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes - 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 - RGB-format JPEG; remove white matting in PSD; - allocate large structures on the stack; - correct channel count for PNG & BMP - 2.10 (2016-01-22) avoid warning introduced in 2.09 - 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED - - See end of file for full revision history. - - - ============================ Contributors ========================= - - Image formats Extensions, features - Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) - Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) - Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) - Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) - Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) - Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) - Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) - github:urraka (animated gif) Junggon Kim (PNM comments) - Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) - socks-the-fox (16-bit PNG) - Jeremy Sawicki (handle all ImageNet JPGs) - Optimizations & bugfixes Mikhail Morozov (1-bit BMP) - Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) - Arseny Kapoulkine Simon Breuss (16-bit PNM) - John-Mark Allen - Carmelo J Fdez-Aguera - - Bug & warning fixes - Marc LeBlanc David Woo Guillaume George Martins Mozeiko - Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski - Phil Jordan Dave Moore Roy Eltham - Hayaki Saito Nathan Reed Won Chun - Luke Graham Johan Duparc Nick Verigakis the Horde3D community - Thomas Ruf Ronny Chevalier github:rlyeh - Janez Zemva John Bartholomew Michal Cichon github:romigrou - Jonathan Blow Ken Hamada Tero Hanninen github:svdijk - Eugene Golushkov Laurent Gomila Cort Stratton github:snagar - Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex - Cass Everitt Ryamond Barbiero github:grim210 - Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw - Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus - Josh Tobin Matthew Gregan github:poppolopoppo - Julian Raschke Gregory Mullen Christian Floisand github:darealshinji - Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 - Brad Weinberger Matvey Cherevko github:mosra - Luca Sas Alexander Veselov Zack Middleton [reserved] - Ryan C. Gordon [reserved] [reserved] - DO NOT ADD YOUR NAME HERE - - Jacko Dirks - - To add your name to the credits, pick a random blank space in the middle and fill it. - 80% of merge conflicts on stb PRs are due to people adding their name at the end - of the credits. -*/ - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -// DOCUMENTATION -// -// Limitations: -// - no 12-bit-per-channel JPEG -// - no JPEGs with arithmetic coding -// - GIF always returns *comp=4 -// -// Basic usage (see HDR discussion below for HDR usage): -// int x,y,n; -// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... -// // ... x = width, y = height, n = # 8-bit components per pixel ... -// // ... replace '0' with '1'..'4' to force that many components per pixel -// // ... but 'n' will always be the number that it would have been if you said 0 -// stbi_image_free(data) -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *channels_in_file -- outputs # of image components in image file -// int desired_channels -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data, or NULL on an allocation failure or if the image is -// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, -// with each pixel consisting of N interleaved 8-bit components; the first -// pixel pointed to is top-left-most in the image. There is no padding between -// image scanlines or between pixels, regardless of format. The number of -// components N is 'desired_channels' if desired_channels is non-zero, or -// *channels_in_file otherwise. If desired_channels is non-zero, -// *channels_in_file has the number of components that _would_ have been -// output otherwise. E.g. if you set desired_channels to 4, you will always -// get RGBA output, but you can check *channels_in_file to see if it's trivially -// opaque because e.g. there were only 3 channels in the source image. -// -// An output image with N components has the following components interleaved -// in this order in each pixel: -// -// N=#comp components -// 1 grey -// 2 grey, alpha -// 3 red, green, blue -// 4 red, green, blue, alpha -// -// If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *channels_in_file will be unchanged. The function -// stbi_failure_reason() can be queried for an extremely brief, end-user -// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS -// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. -// -// To query the width, height and component count of an image without having to -// decode the full file, you can use the stbi_info family of functions: -// -// int x,y,n,ok; -// ok = stbi_info(filename, &x, &y, &n); -// // returns ok=1 and sets x, y, n if image is a supported format, -// // 0 otherwise. -// -// Note that stb_image pervasively uses ints in its public API for sizes, -// including sizes of memory buffers. This is now part of the API and thus -// hard to change without causing breakage. As a result, the various image -// loaders all have certain limits on image size; these differ somewhat -// by format but generally boil down to either just under 2GB or just under -// 1GB. When the decoded image would be larger than this, stb_image decoding -// will fail. -// -// Additionally, stb_image will reject image files that have any of their -// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, -// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, -// the only way to have an image with such dimensions load correctly -// is for it to have a rather extreme aspect ratio. Either way, the -// assumption here is that such larger images are likely to be malformed -// or malicious. If you do need to load an image with individual dimensions -// larger than that, and it still fits in the overall size limit, you can -// #define STBI_MAX_DIMENSIONS on your own to be something larger. -// -// =========================================================================== -// -// UNICODE: -// -// If compiling for Windows and you wish to use Unicode filenames, compile -// with -// #define STBI_WINDOWS_UTF8 -// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert -// Windows wchar_t filenames to utf8. -// -// =========================================================================== -// -// Philosophy -// -// stb libraries are designed with the following priorities: -// -// 1. easy to use -// 2. easy to maintain -// 3. good performance -// -// Sometimes I let "good performance" creep up in priority over "easy to maintain", -// and for best performance I may provide less-easy-to-use APIs that give higher -// performance, in addition to the easy-to-use ones. Nevertheless, it's important -// to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. -// -// Some secondary priorities arise directly from the first two, some of which -// provide more explicit reasons why performance can't be emphasized. -// -// - Portable ("ease of use") -// - Small source code footprint ("easy to maintain") -// - No dependencies ("ease of use") -// -// =========================================================================== -// -// I/O callbacks -// -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. -// -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). -// -// =========================================================================== -// -// SIMD support -// -// The JPEG decoder will try to automatically use SIMD kernels on x86 when -// supported by the compiler. For ARM Neon support, you must explicitly -// request it. -// -// (The old do-it-yourself SIMD API is no longer supported in the current -// code.) -// -// On x86, SSE2 will automatically be used when available based on a run-time -// test; if not, the generic C versions are used as a fall-back. On ARM targets, -// the typical path is to have separate builds for NEON and non-NEON devices -// (at least this is true for iOS and Android). Therefore, the NEON support is -// toggled by a build flag: define STBI_NEON to get NEON loops. -// -// If for some reason you do not want to use any of SIMD code, or if -// you have issues compiling it, you can disable it entirely by -// defining STBI_NO_SIMD. -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image supports loading HDR images in general, and currently the Radiance -// .HDR file format specifically. You can still load any file through the existing -// interface; if you attempt to load an HDR file, it will be automatically remapped -// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -// both of these constants can be reconfigured through this interface: -// -// stbi_hdr_to_ldr_gamma(2.2f); -// stbi_hdr_to_ldr_scale(1.0f); -// -// (note, do not use _inverse_ constants; stbi_image will invert them -// appropriately). -// -// Additionally, there is a new, parallel interface for loading files as -// (linear) floats to preserve the full dynamic range: -// -// float *data = stbi_loadf(filename, &x, &y, &n, 0); -// -// If you load LDR images through this interface, those images will -// be promoted to floating point values, run through the inverse of -// constants corresponding to the above: -// -// stbi_ldr_to_hdr_scale(1.0f); -// stbi_ldr_to_hdr_gamma(2.2f); -// -// Finally, given a filename (or an open file or memory block--see header -// file for details) containing image data, you can query for the "most -// appropriate" interface to use (that is, whether the image is HDR or -// not), using: -// -// stbi_is_hdr(char *filename); -// -// =========================================================================== -// -// iPhone PNG support: -// -// We optionally support converting iPhone-formatted PNGs (which store -// premultiplied BGRA) back to RGB, even though they're internally encoded -// differently. To enable this conversion, call -// stbi_convert_iphone_png_to_rgb(1). -// -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). -// -// =========================================================================== -// -// ADDITIONAL CONFIGURATION -// -// - You can suppress implementation of any of the decoders to reduce -// your code footprint by #defining one or more of the following -// symbols before creating the implementation. -// -// STBI_NO_JPEG -// STBI_NO_PNG -// STBI_NO_BMP -// STBI_NO_PSD -// STBI_NO_TGA -// STBI_NO_GIF -// STBI_NO_HDR -// STBI_NO_PIC -// STBI_NO_PNM (.ppm and .pgm) -// -// - You can request *only* certain decoders and suppress all other ones -// (this will be more forward-compatible, as addition of new decoders -// doesn't require you to disable them explicitly): -// -// STBI_ONLY_JPEG -// STBI_ONLY_PNG -// STBI_ONLY_BMP -// STBI_ONLY_PSD -// STBI_ONLY_TGA -// STBI_ONLY_GIF -// STBI_ONLY_HDR -// STBI_ONLY_PIC -// STBI_ONLY_PNM (.ppm and .pgm) -// -// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still -// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB -// -// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater -// than that size (in either width or height) without further processing. -// This is to let programs in the wild set an upper bound to prevent -// denial-of-service attacks on untrusted data, as one could generate a -// valid image of gigantic dimensions and force stb_image to allocate a -// huge block of memory and spend disproportionate time decoding it. By -// default this is set to (1 << 24), which is 16777216, but that's still -// very big. - -#ifndef STBI_NO_STDIO -#include -#endif // STBI_NO_STDIO - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for desired_channels - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -#include -typedef unsigned char stbi_uc; -typedef unsigned short stbi_us; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef STBIDEF -#ifdef STB_IMAGE_STATIC -#define STBIDEF static -#else -#define STBIDEF extern -#endif -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// PRIMARY API - works on images of any type -// - -// -// load image by filename, open file, or memory buffer -// - -typedef struct -{ - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative - int (*eof) (void *user); // returns nonzero if we are at end of file/data -} stbi_io_callbacks; - -//////////////////////////////////// -// -// 8-bits-per-channel interface -// - -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -#endif - -#ifdef STBI_WINDOWS_UTF8 -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif - -//////////////////////////////////// -// -// 16-bits-per-channel interface -// - -STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -#endif - -//////////////////////////////////// -// -// float-per-channel interface -// -#ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - - #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); - #endif -#endif - -#ifndef STBI_NO_HDR - STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); - STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif // STBI_NO_HDR - -#ifndef STBI_NO_LINEAR - STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); - STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_LINEAR - -// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename); -STBIDEF int stbi_is_hdr_from_file(FILE *f); -#endif // STBI_NO_STDIO - - -// get a VERY brief reason for failure -// on most compilers (and ALL modern mainstream compilers) this is threadsafe -STBIDEF const char *stbi_failure_reason (void); - -// free the loaded image -- this is just free() -STBIDEF void stbi_image_free (void *retval_from_stbi_load); - -// get image dimensions & components without fully decoding -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit (char const *filename); -STBIDEF int stbi_is_16_bit_from_file(FILE *f); -#endif - - - -// for image formats that explicitly notate that they have premultiplied alpha, -// we just return the colors as stored in the file. set this flag to force -// unpremultiplication. results are undefined if the unpremultiply overflow. -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - -// indicate whether we should process iphone images back to canonical format, -// or just pass them through "as-is" -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - -// flip the image vertically, so the first pixel in the output array is the bottom left -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - -// as above, but only applies to images loaded on the thread that calls the function -// this function is only available if your compiler supports thread-local variables; -// calling it will fail to link if your compiler doesn't -STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); -STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); - -// ZLIB client - used by PNG, available for other purposes - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); -STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifdef STB_IMAGE_IMPLEMENTATION - -#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ - || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ - || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ - || defined(STBI_ONLY_ZLIB) - #ifndef STBI_ONLY_JPEG - #define STBI_NO_JPEG - #endif - #ifndef STBI_ONLY_PNG - #define STBI_NO_PNG - #endif - #ifndef STBI_ONLY_BMP - #define STBI_NO_BMP - #endif - #ifndef STBI_ONLY_PSD - #define STBI_NO_PSD - #endif - #ifndef STBI_ONLY_TGA - #define STBI_NO_TGA - #endif - #ifndef STBI_ONLY_GIF - #define STBI_NO_GIF - #endif - #ifndef STBI_ONLY_HDR - #define STBI_NO_HDR - #endif - #ifndef STBI_ONLY_PIC - #define STBI_NO_PIC - #endif - #ifndef STBI_ONLY_PNM - #define STBI_NO_PNM - #endif -#endif - -#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) -#define STBI_NO_ZLIB -#endif - - -#include -#include // ptrdiff_t on osx -#include -#include -#include - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp, pow -#endif - -#ifndef STBI_NO_STDIO -#include -#endif - -#ifndef STBI_ASSERT -#include -#define STBI_ASSERT(x) assert(x) -#endif - -#ifdef __cplusplus -#define STBI_EXTERN extern "C" -#else -#define STBI_EXTERN extern -#endif - - -#ifndef _MSC_VER - #ifdef __cplusplus - #define stbi_inline inline - #else - #define stbi_inline - #endif -#else - #define stbi_inline __forceinline -#endif - -#ifndef STBI_NO_THREAD_LOCALS - #if defined(__cplusplus) && __cplusplus >= 201103L - #define STBI_THREAD_LOCAL thread_local - #elif defined(__GNUC__) && __GNUC__ < 5 - #define STBI_THREAD_LOCAL __thread - #elif defined(_MSC_VER) - #define STBI_THREAD_LOCAL __declspec(thread) - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) - #define STBI_THREAD_LOCAL _Thread_local - #endif - - #ifndef STBI_THREAD_LOCAL - #if defined(__GNUC__) - #define STBI_THREAD_LOCAL __thread - #endif - #endif -#endif - -#ifdef _MSC_VER -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; -#else -#include -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; -#endif - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; - -#ifdef _MSC_VER -#define STBI_NOTUSED(v) (void)(v) -#else -#define STBI_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL - #define stbi_lrot(x,y) _lrotl(x,y) -#else - #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) -#endif - -#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -// ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." -#endif - -#ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,newsz) realloc(p,newsz) -#define STBI_FREE(p) free(p) -#endif - -#ifndef STBI_REALLOC_SIZED -#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) -#endif - -// x86/x64 detection -#if defined(__x86_64__) || defined(_M_X64) -#define STBI__X64_TARGET -#elif defined(__i386) || defined(_M_IX86) -#define STBI__X86_TARGET -#endif - -#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// which in turn means it gets to use SSE2 everywhere. This is unfortunate, -// but previous attempts to provide the SSE2 functions with runtime -// detection caused numerous issues. The way architecture extensions are -// exposed in GCC/Clang is, sadly, not really suited for one-file libs. -// New behavior: if compiled with -msse2, we use SSE2 without any -// detection; if not, we don't use it at all. -#define STBI_NO_SIMD -#endif - -#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) -// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET -// -// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the -// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. -// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not -// simultaneously enabling "-mstackrealign". -// -// See https://github.com/nothings/stb/issues/81 for more information. -// -// So default to no SSE2 on 32-bit MinGW. If you've read this far and added -// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. -#define STBI_NO_SIMD -#endif - -#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) -#define STBI_SSE2 -#include - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include // __cpuid -static int stbi__cpuid3(void) -{ - int info[4]; - __cpuid(info,1); - return info[3]; -} -#else -static int stbi__cpuid3(void) -{ - int res; - __asm { - mov eax,1 - cpuid - mov res,edx - } - return res; -} -#endif - -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; -} -#endif - -#else // assume GCC-style if not VC++ -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - // If we're even attempting to compile this on GCC/Clang, that means - // -msse2 is on, which means the compiler is allowed to use SSE2 - // instructions at will, and so are we. - return 1; -} -#endif - -#endif -#endif - -// ARM NEON -#if defined(STBI_NO_SIMD) && defined(STBI_NEON) -#undef STBI_NEON -#endif - -#ifdef STBI_NEON -#include -#ifdef _MSC_VER -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -#else -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif -#endif - -#ifndef STBI_SIMD_ALIGN -#define STBI_SIMD_ALIGN(type, name) type name -#endif - -#ifndef STBI_MAX_DIMENSIONS -#define STBI_MAX_DIMENSIONS (1 << 24) -#endif - -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct -{ - stbi__uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void *io_user_data; - - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; - int callback_already_read; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -} stbi__context; - - -static void stbi__refill_buffer(stbi__context *s); - -// initialize a memory-decode context -static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) -{ - s->io.read = NULL; - s->read_from_callbacks = 0; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; -} - -// initialize a callback-based context -static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) -{ - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->callback_already_read = 0; - s->img_buffer = s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; -} - -#ifndef STBI_NO_STDIO - -static int stbi__stdio_read(void *user, char *data, int size) -{ - return (int) fread(data,1,size,(FILE*) user); -} - -static void stbi__stdio_skip(void *user, int n) -{ - int ch; - fseek((FILE*) user, n, SEEK_CUR); - ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ - if (ch != EOF) { - ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ - } -} - -static int stbi__stdio_eof(void *user) -{ - return feof((FILE*) user) || ferror((FILE *) user); -} - -static stbi_io_callbacks stbi__stdio_callbacks = -{ - stbi__stdio_read, - stbi__stdio_skip, - stbi__stdio_eof, -}; - -static void stbi__start_file(stbi__context *s, FILE *f) -{ - stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); -} - -//static void stop_file(stbi__context *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi__rewind(stbi__context *s) -{ - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; - s->img_buffer_end = s->img_buffer_original_end; -} - -enum -{ - STBI_ORDER_RGB, - STBI_ORDER_BGR -}; - -typedef struct -{ - int bits_per_channel; - int num_channels; - int channel_order; -} stbi__result_info; - -#ifndef STBI_NO_JPEG -static int stbi__jpeg_test(stbi__context *s); -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNG -static int stbi__png_test(stbi__context *s); -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__png_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_BMP -static int stbi__bmp_test(stbi__context *s); -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_TGA -static int stbi__tga_test(stbi__context *s); -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s); -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__psd_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_HDR -static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_test(stbi__context *s); -static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_GIF -static int stbi__gif_test(stbi__context *s); -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNM -static int stbi__pnm_test(stbi__context *s); -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__pnm_is16(stbi__context *s); -#endif - -static -#ifdef STBI_THREAD_LOCAL -STBI_THREAD_LOCAL -#endif -const char *stbi__g_failure_reason; - -STBIDEF const char *stbi_failure_reason(void) -{ - return stbi__g_failure_reason; -} - -#ifndef STBI_NO_FAILURE_STRINGS -static int stbi__err(const char *str) -{ - stbi__g_failure_reason = str; - return 0; -} -#endif - -static void *stbi__malloc(size_t size) -{ - return STBI_MALLOC(size); -} - -// stb_image uses ints pervasively, including for offset calculations. -// therefore the largest decoded image size we can support with the -// current code, even on 64-bit targets, is INT_MAX. this is not a -// significant limitation for the intended use case. -// -// we do, however, need to make sure our size calculations don't -// overflow. hence a few helper functions for size calculations that -// multiply integers together, making sure that they're non-negative -// and no overflow occurs. - -// return 1 if the sum is valid, 0 on overflow. -// negative terms are considered invalid. -static int stbi__addsizes_valid(int a, int b) -{ - if (b < 0) return 0; - // now 0 <= b <= INT_MAX, hence also - // 0 <= INT_MAX - b <= INTMAX. - // And "a + b <= INT_MAX" (which might overflow) is the - // same as a <= INT_MAX - b (no overflow) - return a <= INT_MAX - b; -} - -// returns 1 if the product is valid, 0 on overflow. -// negative factors are considered invalid. -static int stbi__mul2sizes_valid(int a, int b) -{ - if (a < 0 || b < 0) return 0; - if (b == 0) return 1; // mul-by-0 is always safe - // portable way to check for no overflows in a*b - return a <= INT_MAX/b; -} - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow -static int stbi__mad2sizes_valid(int a, int b, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); -} -#endif - -// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow -static int stbi__mad3sizes_valid(int a, int b, int c, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__addsizes_valid(a*b*c, add); -} - -// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); -} -#endif - -#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) -// mallocs with size overflow checking -static void *stbi__malloc_mad2(int a, int b, int add) -{ - if (!stbi__mad2sizes_valid(a, b, add)) return NULL; - return stbi__malloc(a*b + add); -} -#endif - -static void *stbi__malloc_mad3(int a, int b, int c, int add) -{ - if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; - return stbi__malloc(a*b*c + add); -} - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) -{ - if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; - return stbi__malloc(a*b*c*d + add); -} -#endif - -// stbi__err - error -// stbi__errpf - error returning pointer to float -// stbi__errpuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS - #define stbi__err(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) - #define stbi__err(x,y) stbi__err(y) -#else - #define stbi__err(x,y) stbi__err(x) -#endif - -#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) - -STBIDEF void stbi_image_free(void *retval_from_stbi_load) -{ - STBI_FREE(retval_from_stbi_load); -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_HDR -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -static int stbi__vertically_flip_on_load_global = 0; - -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load_global = flag_true_if_should_flip; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global -#else -static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; - -STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load_local = flag_true_if_should_flip; - stbi__vertically_flip_on_load_set = 1; -} - -#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ - ? stbi__vertically_flip_on_load_local \ - : stbi__vertically_flip_on_load_global) -#endif // STBI_THREAD_LOCAL - -static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields - ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - - // test the formats with a very explicit header first (at least a FOURCC - // or distinctive magic number first) - #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); - #else - STBI_NOTUSED(bpc); - #endif - #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); - #endif - - // then the formats that can end up attempting to load with just 1 or 2 - // bytes matching expectations; these are prone to false positives, so - // try them later - #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); - return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - - #ifndef STBI_NO_TGA - // test tga last because it's a crappy test! - if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp, ri); - #endif - - return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); -} - -static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi_uc *reduced; - - reduced = (stbi_uc *) stbi__malloc(img_len); - if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling - - STBI_FREE(orig); - return reduced; -} - -static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi__uint16 *enlarged; - - enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); - if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff - - STBI_FREE(orig); - return enlarged; -} - -static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) -{ - int row; - size_t bytes_per_row = (size_t)w * bytes_per_pixel; - stbi_uc temp[2048]; - stbi_uc *bytes = (stbi_uc *)image; - - for (row = 0; row < (h>>1); row++) { - stbi_uc *row0 = bytes + row*bytes_per_row; - stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; - // swap row0 with row1 - size_t bytes_left = bytes_per_row; - while (bytes_left) { - size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); - memcpy(temp, row0, bytes_copy); - memcpy(row0, row1, bytes_copy); - memcpy(row1, temp, bytes_copy); - row0 += bytes_copy; - row1 += bytes_copy; - bytes_left -= bytes_copy; - } - } -} - -#ifndef STBI_NO_GIF -static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) -{ - int slice; - int slice_size = w * h * bytes_per_pixel; - - stbi_uc *bytes = (stbi_uc *)image; - for (slice = 0; slice < z; ++slice) { - stbi__vertical_flip(bytes, w, h, bytes_per_pixel); - bytes += slice_size; - } -} -#endif - -static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 8) { - result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } - - // @TODO: move stbi__convert_format to here - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); - } - - return (unsigned char *) result; -} - -static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); - - if (result == NULL) - return NULL; - - // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. - STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); - - if (ri.bits_per_channel != 16) { - result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } - - // @TODO: move stbi__convert_format16 to here - // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); - } - - return (stbi__uint16 *) result; -} - -#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) -static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) -{ - if (stbi__vertically_flip_on_load && result != NULL) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); - } -} -#endif - -#ifndef STBI_NO_STDIO - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); -#endif - -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbi__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) - return 0; - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - - -STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - unsigned char *result; - if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__uint16 *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - stbi__uint16 *result; - if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file_16(f,x,y,comp,req_comp); - fclose(f); - return result; -} - - -#endif //!STBI_NO_STDIO - -STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_mem(&s,buffer,len); - - result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); - if (stbi__vertically_flip_on_load) { - stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); - } - - return result; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - stbi__result_info ri; - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); - if (hdr_data) - stbi__float_postprocess(hdr_data,x,y,comp,req_comp); - return hdr_data; - } - #endif - data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); - if (data) - return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); -} - -STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - float *result; - FILE *f = stbi__fopen(filename, "rb"); - if (!f) return stbi__errpf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_file(&s,f); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_LINEAR - -// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is -// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always -// reports false! - -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; - #endif -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -STBIDEF int stbi_is_hdr_from_file(FILE *f) -{ - #ifndef STBI_NO_HDR - long pos = ftell(f); - int res; - stbi__context s; - stbi__start_file(&s,f); - res = stbi__hdr_test(&s); - fseek(f, pos, SEEK_SET); - return res; - #else - STBI_NOTUSED(f); - return 0; - #endif -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); - return 0; - #endif -} - -#ifndef STBI_NO_LINEAR -static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; - -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } -#endif - -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; - -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - STBI__SCAN_load=0, - STBI__SCAN_type, - STBI__SCAN_header -}; - -static void stbi__refill_buffer(stbi__context *s) -{ - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); - s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file - s->read_from_callbacks = 0; - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start+1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static stbi_uc stbi__get8(stbi__context *s) -{ - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - stbi__refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -stbi_inline static int stbi__at_eof(stbi__context *s) -{ - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) -// nothing -#else -static void stbi__skip(stbi__context *s, int n) -{ - if (n == 0) return; // already there! - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; - } - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) -// nothing -#else -static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) -{ - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); - res = (count == (n-blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} -#endif - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static int stbi__get16be(stbi__context *s) -{ - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) -// nothing -#else -static stbi__uint32 stbi__get32be(stbi__context *s) -{ - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); -} -#endif - -#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) -// nothing -#else -static int stbi__get16le(stbi__context *s) -{ - int z = stbi__get8(s); - return z + (stbi__get8(s) << 8); -} -#endif - -#ifndef STBI_NO_BMP -static stbi__uint32 stbi__get32le(stbi__context *s) -{ - stbi__uint32 z = stbi__get16le(s); - z += (stbi__uint32)stbi__get16le(s) << 16; - return z; -} -#endif - -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings - -#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static stbi_uc stbi__compute_y(int r, int g, int b) -{ - return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) -// nothing -#else -static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); - if (good == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 stbi__compute_y_16(int r, int g, int b) -{ - return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); -} -#endif - -#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) -// nothing -#else -static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - stbi__uint16 *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); - if (good == NULL) { - STBI_FREE(data); - return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - stbi__uint16 *src = data + j * x * img_n ; - stbi__uint16 *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output; - if (!data) return NULL; - output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } - } - if (n < comp) { - for (i=0; i < x*y; ++i) { - output[i*comp + n] = data[i*comp + n]/255.0f; - } - } - STBI_FREE(data); - return output; -} -#endif - -#ifndef STBI_NO_HDR -#define stbi__float2int(x) ((int) (x)) -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output; - if (!data) return NULL; - output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - } - STBI_FREE(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder -// -// simple implementation -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - some SIMD kernels for common paths on targets with SSE2/NEON -// - uses a lot of intermediate memory, could cache poorly - -#ifndef STBI_NO_JPEG - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - stbi_uc fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - stbi__uint16 code[256]; - stbi_uc values[256]; - stbi_uc size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} stbi__huffman; - -typedef struct -{ - stbi__context *s; - stbi__huffman huff_dc[4]; - stbi__huffman huff_ac[4]; - stbi__uint16 dequant[4][64]; - stbi__int16 fast_ac[4][1 << FAST_BITS]; - -// sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - -// definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - stbi_uc *data; - void *raw_data, *raw_coeff; - stbi_uc *linebuf; - short *coeff; // progressive only - int coeff_w, coeff_h; // number of 8x8 coefficient blocks - } img_comp[4]; - - stbi__uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int progressive; - int spec_start; - int spec_end; - int succ_high; - int succ_low; - int eob_run; - int jfif; - int app14_color_transform; // Adobe APP14 tag - int rgb; - - int scan_n, order[4]; - int restart_interval, todo; - -// kernels - void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); - void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); - stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); -} stbi__jpeg; - -static int stbi__build_huffman(stbi__huffman *h, int *count) -{ - int i,j,k=0; - unsigned int code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) - for (j=0; j < count[i]; ++j) - h->size[k++] = (stbi_uc) (i+1); - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (stbi_uc) i; - } - } - } - return 1; -} - -// build a table that decodes both magnitude and value of small ACs in -// one go. -static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) -{ - int i; - for (i=0; i < (1 << FAST_BITS); ++i) { - stbi_uc fast = h->fast[i]; - fast_ac[i] = 0; - if (fast < 255) { - int rs = h->values[fast]; - int run = (rs >> 4) & 15; - int magbits = rs & 15; - int len = h->size[fast]; - - if (magbits && len + magbits <= FAST_BITS) { - // magnitude code followed by receive_extend code - int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); - int m = 1 << (magbits - 1); - if (k < m) k += (~0U << magbits) + 1; - // if the result is small enough, we can fit it in fast_ac table - if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); - } - } - } -} - -static void stbi__grow_buffer_unsafe(stbi__jpeg *j) -{ - do { - unsigned int b = j->nomore ? 0 : stbi__get8(j->s); - if (b == 0xff) { - int c = stbi__get8(j->s); - while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); - - sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k + (stbi__jbias[n] & (sgn - 1)); -} - -// get some unsigned bits -stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) -{ - unsigned int k; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k; -} - -stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) -{ - unsigned int k; - if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); - k = j->code_buffer; - j->code_buffer <<= 1; - --j->code_bits; - return k & 0x80000000; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static const stbi_uc stbi__jpeg_dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) -{ - int diff,dc,k; - int t; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? stbi__extend_receive(j, t) : 0; - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc * dequant[0]); - - // decode AC components, see JPEG spec - k = 1; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * dequant[zig]); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); - } - } - } while (k < 64); - return 1; -} - -static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) -{ - int diff,dc; - int t; - if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - if (j->succ_high == 0) { - // first scan for DC coefficient, must be first - memset(data,0,64*sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - diff = t ? stbi__extend_receive(j, t) : 0; - - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc * (1 << j->succ_low)); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) - data[0] += (short) (1 << j->succ_low); - } - return 1; -} - -// @OPTIMIZE: store non-zigzagged during the decode passes, -// and only de-zigzag when dequantizing -static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) -{ - int k; - if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->succ_high == 0) { - int shift = j->succ_low; - - if (j->eob_run) { - --j->eob_run; - return 1; - } - - k = j->spec_start; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * (1 << shift)); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r); - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - --j->eob_run; - break; - } - k += 16; - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); - } - } - } while (k <= j->spec_end); - } else { - // refinement scan for these AC coefficients - - short bit = (short) (1 << j->succ_low); - - if (j->eob_run) { - --j->eob_run; - for (k = j->spec_start; k <= j->spec_end; ++k) { - short *p = &data[stbi__jpeg_dezigzag[k]]; - if (*p != 0) - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } - } else { - k = j->spec_start; - do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r) - 1; - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - r = 64; // force end of block - } else { - // r=15 s=0 should write 16 0s, so we just do - // a run of 15 0s and then write s (which is 0), - // so we don't have to do anything special here - } - } else { - if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); - // sign bit - if (stbi__jpeg_get_bit(j)) - s = bit; - else - s = -bit; - } - - // advance by r - while (k <= j->spec_end) { - short *p = &data[stbi__jpeg_dezigzag[k++]]; - if (*p != 0) { - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } else { - if (r == 0) { - *p = (short) s; - break; - } - --r; - } - } - } while (k <= j->spec_end); - } - } - return 1; -} - -// take a -128..127 value and stbi__clamp it and convert to 0..255 -stbi_inline static stbi_uc stbi__clamp(int x) -{ - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (stbi_uc) x; -} - -#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) -#define stbi__fsh(x) ((x) * 4096) - -// derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ - int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2+p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3*stbi__f2f(-1.847759065f); \ - t3 = p1 + p2*stbi__f2f( 0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = stbi__fsh(p2+p3); \ - t1 = stbi__fsh(p2-p3); \ - x0 = t0+t3; \ - x3 = t0-t3; \ - x1 = t1+t2; \ - x2 = t1-t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0+t2; \ - p4 = t1+t3; \ - p1 = t0+t3; \ - p2 = t1+t2; \ - p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ - t0 = t0*stbi__f2f( 0.298631336f); \ - t1 = t1*stbi__f2f( 2.053119869f); \ - t2 = t2*stbi__f2f( 3.072711026f); \ - t3 = t3*stbi__f2f( 1.501321110f); \ - p1 = p5 + p1*stbi__f2f(-0.899976223f); \ - p2 = p5 + p2*stbi__f2f(-2.562915447f); \ - p3 = p3*stbi__f2f(-1.961570560f); \ - p4 = p4*stbi__f2f(-0.390180644f); \ - t3 += p1+p4; \ - t2 += p2+p3; \ - t1 += p2+p4; \ - t0 += p1+p3; - -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) -{ - int i,val[64],*v=val; - stbi_uc *o; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0]*4; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128<<17); - x1 += 65536 + (128<<17); - x2 += 65536 + (128<<17); - x3 += 65536 + (128<<17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = stbi__clamp((x0+t3) >> 17); - o[7] = stbi__clamp((x0-t3) >> 17); - o[1] = stbi__clamp((x1+t2) >> 17); - o[6] = stbi__clamp((x1-t2) >> 17); - o[2] = stbi__clamp((x2+t1) >> 17); - o[5] = stbi__clamp((x2-t1) >> 17); - o[3] = stbi__clamp((x3+t0) >> 17); - o[4] = stbi__clamp((x3-t0) >> 17); - } -} - -#ifdef STBI_SSE2 -// sse2 integer IDCT. not the fastest possible implementation but it -// produces bit-identical results to the generic C version so it's -// fully "transparent". -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - // This is constructed to match our regular (generic) integer IDCT exactly. - __m128i row0, row1, row2, row3, row4, row5, row6, row7; - __m128i tmp; - - // dot product constant: even elems=x, odd elems=y - #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) - - // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) - // out(1) = c1[even]*x + c1[odd]*y - #define dct_rot(out0,out1, x,y,c0,c1) \ - __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ - __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ - __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ - __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ - __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ - __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) - - // out = in << 12 (in 16-bit, out 32-bit) - #define dct_widen(out, in) \ - __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ - __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) - - // wide add - #define dct_wadd(out, a, b) \ - __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_add_epi32(a##_h, b##_h) - - // wide sub - #define dct_wsub(out, a, b) \ - __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) - - // butterfly a/b, add bias, then shift by "s" and pack - #define dct_bfly32o(out0, out1, a,b,bias,s) \ - { \ - __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ - __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ - dct_wadd(sum, abiased, b); \ - dct_wsub(dif, abiased, b); \ - out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ - out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ - } - - // 8-bit interleave step (for transposes) - #define dct_interleave8(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi8(a, b); \ - b = _mm_unpackhi_epi8(tmp, b) - - // 16-bit interleave step (for transposes) - #define dct_interleave16(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi16(a, b); \ - b = _mm_unpackhi_epi16(tmp, b) - - #define dct_pass(bias,shift) \ - { \ - /* even part */ \ - dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ - __m128i sum04 = _mm_add_epi16(row0, row4); \ - __m128i dif04 = _mm_sub_epi16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ - dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ - __m128i sum17 = _mm_add_epi16(row1, row7); \ - __m128i sum35 = _mm_add_epi16(row3, row5); \ - dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ - dct_wadd(x4, y0o, y4o); \ - dct_wadd(x5, y1o, y5o); \ - dct_wadd(x6, y2o, y5o); \ - dct_wadd(x7, y3o, y4o); \ - dct_bfly32o(row0,row7, x0,x7,bias,shift); \ - dct_bfly32o(row1,row6, x1,x6,bias,shift); \ - dct_bfly32o(row2,row5, x2,x5,bias,shift); \ - dct_bfly32o(row3,row4, x3,x4,bias,shift); \ - } - - __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); - __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); - __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); - __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); - __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); - __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); - __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); - __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); - - // rounding biases in column/row passes, see stbi__idct_block for explanation. - __m128i bias_0 = _mm_set1_epi32(512); - __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); - - // load - row0 = _mm_load_si128((const __m128i *) (data + 0*8)); - row1 = _mm_load_si128((const __m128i *) (data + 1*8)); - row2 = _mm_load_si128((const __m128i *) (data + 2*8)); - row3 = _mm_load_si128((const __m128i *) (data + 3*8)); - row4 = _mm_load_si128((const __m128i *) (data + 4*8)); - row5 = _mm_load_si128((const __m128i *) (data + 5*8)); - row6 = _mm_load_si128((const __m128i *) (data + 6*8)); - row7 = _mm_load_si128((const __m128i *) (data + 7*8)); - - // column pass - dct_pass(bias_0, 10); - - { - // 16bit 8x8 transpose pass 1 - dct_interleave16(row0, row4); - dct_interleave16(row1, row5); - dct_interleave16(row2, row6); - dct_interleave16(row3, row7); - - // transpose pass 2 - dct_interleave16(row0, row2); - dct_interleave16(row1, row3); - dct_interleave16(row4, row6); - dct_interleave16(row5, row7); - - // transpose pass 3 - dct_interleave16(row0, row1); - dct_interleave16(row2, row3); - dct_interleave16(row4, row5); - dct_interleave16(row6, row7); - } - - // row pass - dct_pass(bias_1, 17); - - { - // pack - __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 - __m128i p1 = _mm_packus_epi16(row2, row3); - __m128i p2 = _mm_packus_epi16(row4, row5); - __m128i p3 = _mm_packus_epi16(row6, row7); - - // 8bit 8x8 transpose pass 1 - dct_interleave8(p0, p2); // a0e0a1e1... - dct_interleave8(p1, p3); // c0g0c1g1... - - // transpose pass 2 - dct_interleave8(p0, p1); // a0c0e0g0... - dct_interleave8(p2, p3); // b0d0f0h0... - - // transpose pass 3 - dct_interleave8(p0, p2); // a0b0c0d0... - dct_interleave8(p1, p3); // a4b4c4d4... - - // store - _mm_storel_epi64((__m128i *) out, p0); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p2); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p1); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p3); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); - } - -#undef dct_const -#undef dct_rot -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_interleave8 -#undef dct_interleave16 -#undef dct_pass -} - -#endif // STBI_SSE2 - -#ifdef STBI_NEON - -// NEON integer IDCT. should produce bit-identical -// results to the generic C version. -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; - - int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); - int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); - int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); - int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); - int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); - int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); - int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); - int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); - int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); - int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); - int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); - int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); - -#define dct_long_mul(out, inq, coeff) \ - int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) - -#define dct_long_mac(out, acc, inq, coeff) \ - int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) - -#define dct_widen(out, inq) \ - int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ - int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) - -// wide add -#define dct_wadd(out, a, b) \ - int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vaddq_s32(a##_h, b##_h) - -// wide sub -#define dct_wsub(out, a, b) \ - int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vsubq_s32(a##_h, b##_h) - -// butterfly a/b, then shift using "shiftop" by "s" and pack -#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ - { \ - dct_wadd(sum, a, b); \ - dct_wsub(dif, a, b); \ - out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ - out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ - } - -#define dct_pass(shiftop, shift) \ - { \ - /* even part */ \ - int16x8_t sum26 = vaddq_s16(row2, row6); \ - dct_long_mul(p1e, sum26, rot0_0); \ - dct_long_mac(t2e, p1e, row6, rot0_1); \ - dct_long_mac(t3e, p1e, row2, rot0_2); \ - int16x8_t sum04 = vaddq_s16(row0, row4); \ - int16x8_t dif04 = vsubq_s16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - int16x8_t sum15 = vaddq_s16(row1, row5); \ - int16x8_t sum17 = vaddq_s16(row1, row7); \ - int16x8_t sum35 = vaddq_s16(row3, row5); \ - int16x8_t sum37 = vaddq_s16(row3, row7); \ - int16x8_t sumodd = vaddq_s16(sum17, sum35); \ - dct_long_mul(p5o, sumodd, rot1_0); \ - dct_long_mac(p1o, p5o, sum17, rot1_1); \ - dct_long_mac(p2o, p5o, sum35, rot1_2); \ - dct_long_mul(p3o, sum37, rot2_0); \ - dct_long_mul(p4o, sum15, rot2_1); \ - dct_wadd(sump13o, p1o, p3o); \ - dct_wadd(sump24o, p2o, p4o); \ - dct_wadd(sump23o, p2o, p3o); \ - dct_wadd(sump14o, p1o, p4o); \ - dct_long_mac(x4, sump13o, row7, rot3_0); \ - dct_long_mac(x5, sump24o, row5, rot3_1); \ - dct_long_mac(x6, sump23o, row3, rot3_2); \ - dct_long_mac(x7, sump14o, row1, rot3_3); \ - dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ - dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ - dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ - dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ - } - - // load - row0 = vld1q_s16(data + 0*8); - row1 = vld1q_s16(data + 1*8); - row2 = vld1q_s16(data + 2*8); - row3 = vld1q_s16(data + 3*8); - row4 = vld1q_s16(data + 4*8); - row5 = vld1q_s16(data + 5*8); - row6 = vld1q_s16(data + 6*8); - row7 = vld1q_s16(data + 7*8); - - // add DC bias - row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); - - // column pass - dct_pass(vrshrn_n_s32, 10); - - // 16bit 8x8 transpose - { -// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. -// whether compilers actually get this is another story, sadly. -#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } -#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } - - // pass 1 - dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 - dct_trn16(row2, row3); - dct_trn16(row4, row5); - dct_trn16(row6, row7); - - // pass 2 - dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 - dct_trn32(row1, row3); - dct_trn32(row4, row6); - dct_trn32(row5, row7); - - // pass 3 - dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 - dct_trn64(row1, row5); - dct_trn64(row2, row6); - dct_trn64(row3, row7); - -#undef dct_trn16 -#undef dct_trn32 -#undef dct_trn64 - } - - // row pass - // vrshrn_n_s32 only supports shifts up to 16, we need - // 17. so do a non-rounding shift of 16 first then follow - // up with a rounding shift by 1. - dct_pass(vshrn_n_s32, 16); - - { - // pack and round - uint8x8_t p0 = vqrshrun_n_s16(row0, 1); - uint8x8_t p1 = vqrshrun_n_s16(row1, 1); - uint8x8_t p2 = vqrshrun_n_s16(row2, 1); - uint8x8_t p3 = vqrshrun_n_s16(row3, 1); - uint8x8_t p4 = vqrshrun_n_s16(row4, 1); - uint8x8_t p5 = vqrshrun_n_s16(row5, 1); - uint8x8_t p6 = vqrshrun_n_s16(row6, 1); - uint8x8_t p7 = vqrshrun_n_s16(row7, 1); - - // again, these can translate into one instruction, but often don't. -#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } -#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } - - // sadly can't use interleaved stores here since we only write - // 8 bytes to each scan line! - - // 8x8 8-bit transpose pass 1 - dct_trn8_8(p0, p1); - dct_trn8_8(p2, p3); - dct_trn8_8(p4, p5); - dct_trn8_8(p6, p7); - - // pass 2 - dct_trn8_16(p0, p2); - dct_trn8_16(p1, p3); - dct_trn8_16(p4, p6); - dct_trn8_16(p5, p7); - - // pass 3 - dct_trn8_32(p0, p4); - dct_trn8_32(p1, p5); - dct_trn8_32(p2, p6); - dct_trn8_32(p3, p7); - - // store - vst1_u8(out, p0); out += out_stride; - vst1_u8(out, p1); out += out_stride; - vst1_u8(out, p2); out += out_stride; - vst1_u8(out, p3); out += out_stride; - vst1_u8(out, p4); out += out_stride; - vst1_u8(out, p5); out += out_stride; - vst1_u8(out, p6); out += out_stride; - vst1_u8(out, p7); - -#undef dct_trn8_8 -#undef dct_trn8_16 -#undef dct_trn8_32 - } - -#undef dct_long_mul -#undef dct_long_mac -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_pass -} - -#endif // STBI_NEON - -#define STBI__MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static stbi_uc stbi__get_marker(stbi__jpeg *j) -{ - stbi_uc x; - if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } - x = stbi__get8(j->s); - if (x != 0xff) return STBI__MARKER_none; - while (x == 0xff) - x = stbi__get8(j->s); // consume repeated 0xff fill bytes - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, stbi__jpeg_reset the entropy decoder and -// the dc prediction -static void stbi__jpeg_reset(stbi__jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; - j->marker = STBI__MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - j->eob_run = 0; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int stbi__parse_entropy_coded_data(stbi__jpeg *z) -{ - stbi__jpeg_reset(z); - if (!z->progressive) { - if (z->scan_n == 1) { - int i,j; - STBI_SIMD_ALIGN(short, data[64]); - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - STBI_SIMD_ALIGN(short, data[64]); - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } else { - if (z->scan_n == 1) { - int i,j; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - if (z->spec_start == 0) { - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } else { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) - return 0; - } - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x); - int y2 = (j*z->img_comp[n].v + y); - short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } -} - -static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) -{ - int i; - for (i=0; i < 64; ++i) - data[i] *= dequant[i]; -} - -static void stbi__jpeg_finish(stbi__jpeg *z) -{ - if (z->progressive) { - // dequantize and idct the data - int i,j,n; - for (n=0; n < z->s->img_n; ++n) { - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - } - } - } - } -} - -static int stbi__process_marker(stbi__jpeg *z, int m) -{ - int L; - switch (m) { - case STBI__MARKER_none: // no marker found - return stbi__err("expected marker","Corrupt JPEG"); - - case 0xDD: // DRI - specify restart interval - if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); - z->restart_interval = stbi__get16be(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = stbi__get16be(z->s)-2; - while (L > 0) { - int q = stbi__get8(z->s); - int p = q >> 4, sixteen = (p != 0); - int t = q & 15,i; - if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); - if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); - - for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); - L -= (sixteen ? 129 : 65); - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = stbi__get16be(z->s)-2; - while (L > 0) { - stbi_uc *v; - int sizes[16],i,n=0; - int q = stbi__get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = stbi__get8(z->s); - n += sizes[i]; - } - L -= 17; - if (tc == 0) { - if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < n; ++i) - v[i] = stbi__get8(z->s); - if (tc != 0) - stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); - L -= n; - } - return L==0; - } - - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - L = stbi__get16be(z->s); - if (L < 2) { - if (m == 0xFE) - return stbi__err("bad COM len","Corrupt JPEG"); - else - return stbi__err("bad APP len","Corrupt JPEG"); - } - L -= 2; - - if (m == 0xE0 && L >= 5) { // JFIF APP0 segment - static const unsigned char tag[5] = {'J','F','I','F','\0'}; - int ok = 1; - int i; - for (i=0; i < 5; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 5; - if (ok) - z->jfif = 1; - } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment - static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; - int ok = 1; - int i; - for (i=0; i < 6; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 6; - if (ok) { - stbi__get8(z->s); // version - stbi__get16be(z->s); // flags0 - stbi__get16be(z->s); // flags1 - z->app14_color_transform = stbi__get8(z->s); // color transform - L -= 6; - } - } - - stbi__skip(z->s, L); - return 1; - } - - return stbi__err("unknown marker","Corrupt JPEG"); -} - -// after we see SOS -static int stbi__process_scan_header(stbi__jpeg *z) -{ - int i; - int Ls = stbi__get16be(z->s); - z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = stbi__get8(z->s), which; - int q = stbi__get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) return 0; // no match - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - - { - int aa; - z->spec_start = stbi__get8(z->s); - z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 - aa = stbi__get8(z->s); - z->succ_high = (aa >> 4); - z->succ_low = (aa & 15); - if (z->progressive) { - if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) - return stbi__err("bad SOS", "Corrupt JPEG"); - } else { - if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); - if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); - z->spec_end = 63; - } - } - - return 1; -} - -static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) -{ - int i; - for (i=0; i < ncomp; ++i) { - if (z->img_comp[i].raw_data) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - z->img_comp[i].data = NULL; - } - if (z->img_comp[i].raw_coeff) { - STBI_FREE(z->img_comp[i].raw_coeff); - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].coeff = 0; - } - if (z->img_comp[i].linebuf) { - STBI_FREE(z->img_comp[i].linebuf); - z->img_comp[i].linebuf = NULL; - } - } - return why; -} - -static int stbi__process_frame_header(stbi__jpeg *z, int scan) -{ - stbi__context *s = z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); - - z->rgb = 0; - for (i=0; i < s->img_n; ++i) { - static const unsigned char rgb[3] = { 'R', 'G', 'B' }; - z->img_comp[i].id = stbi__get8(s); - if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) - ++z->rgb; - q = stbi__get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); - z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); - } - - if (scan != STBI__SCAN_load) return 1; - - if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - // these sizes can't be more than 17 bits - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - // - // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) - // so these muls can't overflow with 32-bit ints (which we require) - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].linebuf = NULL; - z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); - if (z->img_comp[i].raw_data == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - // align blocks for idct using mmx/sse - z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - if (z->progressive) { - // w2, h2 are multiples of 8 (see above) - z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; - z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; - z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); - if (z->img_comp[i].raw_coeff == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define stbi__DNL(x) ((x) == 0xdc) -#define stbi__SOI(x) ((x) == 0xd8) -#define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) -#define stbi__SOS(x) ((x) == 0xda) - -#define stbi__SOF_progressive(x) ((x) == 0xc2) - -static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) -{ - int m; - z->jfif = 0; - z->app14_color_transform = -1; // valid values are 0,1,2 - z->marker = STBI__MARKER_none; // initialize cached marker to empty - m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); - if (scan == STBI__SCAN_type) return 1; - m = stbi__get_marker(z); - while (!stbi__SOF(m)) { - if (!stbi__process_marker(z,m)) return 0; - m = stbi__get_marker(z); - while (m == STBI__MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); - m = stbi__get_marker(z); - } - } - z->progressive = stbi__SOF_progressive(m); - if (!stbi__process_frame_header(z, scan)) return 0; - return 1; -} - -// decode image to YCbCr format -static int stbi__decode_jpeg_image(stbi__jpeg *j) -{ - int m; - for (m = 0; m < 4; m++) { - j->img_comp[m].raw_data = NULL; - j->img_comp[m].raw_coeff = NULL; - } - j->restart_interval = 0; - if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; - m = stbi__get_marker(j); - while (!stbi__EOI(m)) { - if (stbi__SOS(m)) { - if (!stbi__process_scan_header(j)) return 0; - if (!stbi__parse_entropy_coded_data(j)) return 0; - if (j->marker == STBI__MARKER_none ) { - // handle 0s at the end of image data from IP Kamera 9060 - while (!stbi__at_eof(j->s)) { - int x = stbi__get8(j->s); - if (x == 255) { - j->marker = stbi__get8(j->s); - break; - } - } - // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 - } - } else if (stbi__DNL(m)) { - int Ld = stbi__get16be(j->s); - stbi__uint32 NL = stbi__get16be(j->s); - if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); - if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); - } else { - if (!stbi__process_marker(j, m)) return 0; - } - m = stbi__get_marker(j); - } - if (j->progressive) - stbi__jpeg_finish(j); - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, - int w, int hs); - -#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) - -static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i=0; i < w; ++i) - out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - stbi_uc *input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = stbi__div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = stbi__div4(n+input[i-1]); - out[i*2+1] = stbi__div4(n+input[i+1]); - } - out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) - -static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = stbi__div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i=0,t0,t1; - - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - // process groups of 8 pixels for as long as we can. - // note we can't handle the last pixel in a row in this loop - // because we need to handle the filter boundary conditions. - for (; i < ((w-1) & ~7); i += 8) { -#if defined(STBI_SSE2) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - __m128i zero = _mm_setzero_si128(); - __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); - __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); - __m128i farw = _mm_unpacklo_epi8(farb, zero); - __m128i nearw = _mm_unpacklo_epi8(nearb, zero); - __m128i diff = _mm_sub_epi16(farw, nearw); - __m128i nears = _mm_slli_epi16(nearw, 2); - __m128i curr = _mm_add_epi16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - __m128i prv0 = _mm_slli_si128(curr, 2); - __m128i nxt0 = _mm_srli_si128(curr, 2); - __m128i prev = _mm_insert_epi16(prv0, t1, 0); - __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - __m128i bias = _mm_set1_epi16(8); - __m128i curs = _mm_slli_epi16(curr, 2); - __m128i prvd = _mm_sub_epi16(prev, curr); - __m128i nxtd = _mm_sub_epi16(next, curr); - __m128i curb = _mm_add_epi16(curs, bias); - __m128i even = _mm_add_epi16(prvd, curb); - __m128i odd = _mm_add_epi16(nxtd, curb); - - // interleave even and odd pixels, then undo scaling. - __m128i int0 = _mm_unpacklo_epi16(even, odd); - __m128i int1 = _mm_unpackhi_epi16(even, odd); - __m128i de0 = _mm_srli_epi16(int0, 4); - __m128i de1 = _mm_srli_epi16(int1, 4); - - // pack and write output - __m128i outv = _mm_packus_epi16(de0, de1); - _mm_storeu_si128((__m128i *) (out + i*2), outv); -#elif defined(STBI_NEON) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - uint8x8_t farb = vld1_u8(in_far + i); - uint8x8_t nearb = vld1_u8(in_near + i); - int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); - int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); - int16x8_t curr = vaddq_s16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - int16x8_t prv0 = vextq_s16(curr, curr, 7); - int16x8_t nxt0 = vextq_s16(curr, curr, 1); - int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); - int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - int16x8_t curs = vshlq_n_s16(curr, 2); - int16x8_t prvd = vsubq_s16(prev, curr); - int16x8_t nxtd = vsubq_s16(next, curr); - int16x8_t even = vaddq_s16(curs, prvd); - int16x8_t odd = vaddq_s16(curs, nxtd); - - // undo scaling and round, then store with even/odd phases interleaved - uint8x8x2_t o; - o.val[0] = vqrshrun_n_s16(even, 4); - o.val[1] = vqrshrun_n_s16(odd, 4); - vst2_u8(out + i*2, o); -#endif - - // "previous" value for next iter - t1 = 3*in_near[i+7] + in_far[i+7]; - } - - t0 = t1; - t1 = 3*in_near[i] + in_far[i]; - out[i*2] = stbi__div16(3*t1 + t0 + 8); - - for (++i; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} -#endif - -static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - STBI_NOTUSED(in_far); - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -// this is a reduced-precision calculation of YCbCr-to-RGB introduced -// to make sure the code produces the same results in both SIMD and scalar -#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) -{ - int i = 0; - -#ifdef STBI_SSE2 - // step == 3 is pretty ugly on the final interleave, and i'm not convinced - // it's useful in practice (you wouldn't use it for textures, for example). - // so just accelerate step == 4 case. - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - __m128i signflip = _mm_set1_epi8(-0x80); - __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); - __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); - __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); - __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); - __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); - __m128i xw = _mm_set1_epi16(255); // alpha channel - - for (; i+7 < count; i += 8) { - // load - __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); - __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); - __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); - __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 - __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 - - // unpack to short (and left-shift cr, cb by 8) - __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); - __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); - __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); - - // color transform - __m128i yws = _mm_srli_epi16(yw, 4); - __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); - __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); - __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); - __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); - __m128i rws = _mm_add_epi16(cr0, yws); - __m128i gwt = _mm_add_epi16(cb0, yws); - __m128i bws = _mm_add_epi16(yws, cb1); - __m128i gws = _mm_add_epi16(gwt, cr1); - - // descale - __m128i rw = _mm_srai_epi16(rws, 4); - __m128i bw = _mm_srai_epi16(bws, 4); - __m128i gw = _mm_srai_epi16(gws, 4); - - // back to byte, set up for transpose - __m128i brb = _mm_packus_epi16(rw, bw); - __m128i gxb = _mm_packus_epi16(gw, xw); - - // transpose to interleave channels - __m128i t0 = _mm_unpacklo_epi8(brb, gxb); - __m128i t1 = _mm_unpackhi_epi8(brb, gxb); - __m128i o0 = _mm_unpacklo_epi16(t0, t1); - __m128i o1 = _mm_unpackhi_epi16(t0, t1); - - // store - _mm_storeu_si128((__m128i *) (out + 0), o0); - _mm_storeu_si128((__m128i *) (out + 16), o1); - out += 32; - } - } -#endif - -#ifdef STBI_NEON - // in this version, step=3 support would be easy to add. but is there demand? - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - uint8x8_t signflip = vdup_n_u8(0x80); - int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); - int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); - int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); - int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); - - for (; i+7 < count; i += 8) { - // load - uint8x8_t y_bytes = vld1_u8(y + i); - uint8x8_t cr_bytes = vld1_u8(pcr + i); - uint8x8_t cb_bytes = vld1_u8(pcb + i); - int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); - int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); - - // expand to s16 - int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); - int16x8_t crw = vshll_n_s8(cr_biased, 7); - int16x8_t cbw = vshll_n_s8(cb_biased, 7); - - // color transform - int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); - int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); - int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); - int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); - int16x8_t rws = vaddq_s16(yws, cr0); - int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); - int16x8_t bws = vaddq_s16(yws, cb1); - - // undo scaling, round, convert to byte - uint8x8x4_t o; - o.val[0] = vqrshrun_n_s16(rws, 4); - o.val[1] = vqrshrun_n_s16(gws, 4); - o.val[2] = vqrshrun_n_s16(bws, 4); - o.val[3] = vdup_n_u8(255); - - // store, interleaving r/g/b/a - vst4_u8(out, o); - out += 8*4; - } - } -#endif - - for (; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#endif - -// set up the kernels -static void stbi__setup_jpeg(stbi__jpeg *j) -{ - j->idct_block_kernel = stbi__idct_block; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; - -#ifdef STBI_SSE2 - if (stbi__sse2_available()) { - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; - } -#endif - -#ifdef STBI_NEON - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; -#endif -} - -// clean up the temporary component buffers -static void stbi__cleanup_jpeg(stbi__jpeg *j) -{ - stbi__free_jpeg_components(j, j->s->img_n, 0); -} - -typedef struct -{ - resample_row_func resample; - stbi_uc *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi__resample; - -// fast 0..255 * 0..255 => 0..255 rounded multiplication -static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) -{ - unsigned int t = x*y + 128; - return (stbi_uc) ((t + (t >>8)) >> 8); -} - -static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n, is_rgb; - z->s->img_n = 0; // make stbi__cleanup_jpeg safe - - // validate req_comp - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - - // load a jpeg image from whichever source, but leave in YCbCr format - if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - - is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - - if (z->s->img_n == 3 && n < 3 && !is_rgb) - decode_n = 1; - else - decode_n = z->s->img_n; - - // nothing to do if no components requested; check this now to avoid - // accessing uninitialized coutput[0] later - if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } - - // resample and color-convert - { - int k; - unsigned int i,j; - stbi_uc *output; - stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; - - stbi__resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; - else r->resample = stbi__resample_row_generic; - } - - // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); - if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s->img_y; ++j) { - stbi_uc *out = output + n * z->s->img_x * j; - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - stbi_uc *y = coutput[0]; - if (z->s->img_n == 3) { - if (is_rgb) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = y[i]; - out[1] = coutput[1][i]; - out[2] = coutput[2][i]; - out[3] = 255; - out += n; - } - } else { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else if (z->s->img_n == 4) { - if (z->app14_color_transform == 0) { // CMYK - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(coutput[0][i], m); - out[1] = stbi__blinn_8x8(coutput[1][i], m); - out[2] = stbi__blinn_8x8(coutput[2][i], m); - out[3] = 255; - out += n; - } - } else if (z->app14_color_transform == 2) { // YCCK - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(255 - out[0], m); - out[1] = stbi__blinn_8x8(255 - out[1], m); - out[2] = stbi__blinn_8x8(255 - out[2], m); - out += n; - } - } else { // YCbCr + alpha? Ignore the fourth channel for now - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else - for (i=0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - if (is_rgb) { - if (n == 1) - for (i=0; i < z->s->img_x; ++i) - *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - else { - for (i=0; i < z->s->img_x; ++i, out += 2) { - out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - out[1] = 255; - } - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); - stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); - stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); - out[0] = stbi__compute_y(r, g, b); - out[1] = 255; - out += n; - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); - out[1] = 255; - out += n; - } - } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } - } - } - } - stbi__cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output - return output; - } -} - -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - unsigned char* result; - stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); - if (!j) return stbi__errpuc("outofmem", "Out of memory"); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); - result = load_jpeg_image(j, x,y,comp,req_comp); - STBI_FREE(j); - return result; -} - -static int stbi__jpeg_test(stbi__context *s) -{ - int r; - stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); - if (!j) return stbi__err("outofmem", "Out of memory"); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); - stbi__rewind(s); - STBI_FREE(j); - return r; -} - -static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) -{ - if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { - stbi__rewind( j->s ); - return 0; - } - if (x) *x = j->s->img_x; - if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; - return 1; -} - -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) -{ - int result; - stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); - if (!j) return stbi__err("outofmem", "Out of memory"); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); - return result; -} -#endif - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -#ifndef STBI_NO_ZLIB - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables -#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) -#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - stbi__uint16 fast[1 << STBI__ZFAST_BITS]; - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; - stbi_uc size[STBI__ZNSYMS]; - stbi__uint16 value[STBI__ZNSYMS]; -} stbi__zhuffman; - -stbi_inline static int stbi__bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int stbi__bit_reverse(int v, int bits) -{ - STBI_ASSERT(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return stbi__bitreverse16(v) >> (16-bits); -} - -static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 0, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - if (sizes[i] > (1 << i)) - return stbi__err("bad sizes", "Corrupt PNG"); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (stbi__uint16) code; - z->firstsymbol[i] = (stbi__uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); - z->size [c] = (stbi_uc ) s; - z->value[c] = (stbi__uint16) i; - if (s <= STBI__ZFAST_BITS) { - int j = stbi__bit_reverse(next_code[s],s); - while (j < (1 << STBI__ZFAST_BITS)) { - z->fast[j] = fastv; - j += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - stbi_uc *zbuffer, *zbuffer_end; - int num_bits; - stbi__uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - stbi__zhuffman z_length, z_distance; -} stbi__zbuf; - -stbi_inline static int stbi__zeof(stbi__zbuf *z) -{ - return (z->zbuffer >= z->zbuffer_end); -} - -stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) -{ - return stbi__zeof(z) ? 0 : *z->zbuffer++; -} - -static void stbi__fill_bits(stbi__zbuf *z) -{ - do { - if (z->code_buffer >= (1U << z->num_bits)) { - z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ - return; - } - z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) stbi__fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s,k; - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = stbi__bit_reverse(a->code_buffer, 16); - for (s=STBI__ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s >= 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! - if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s; - if (a->num_bits < 16) { - if (stbi__zeof(a)) { - return -1; /* report error for unexpected end of data. */ - } - stbi__fill_bits(a); - } - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; - a->code_buffer >>= s; - a->num_bits -= s; - return b & 511; - } - return stbi__zhuffman_decode_slowpath(a, z); -} - -static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes -{ - char *q; - unsigned int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); - cur = (unsigned int) (z->zout - z->zout_start); - limit = old_limit = (unsigned) (z->zout_end - z->zout_start); - if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); - while (cur + n > limit) { - if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); - limit *= 2; - } - q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) return stbi__err("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static const int stbi__zlength_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static const int stbi__zlength_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, -257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static const int stbi__zdist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int stbi__parse_huffman_block(stbi__zbuf *a) -{ - char *zout = a->zout; - for(;;) { - int z = stbi__zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (zout >= a->zout_end) { - if (!stbi__zexpand(a, zout, 1)) return 0; - zout = a->zout; - } - *zout++ = (char) z; - } else { - stbi_uc *p; - int len,dist; - if (z == 256) { - a->zout = zout; - return 1; - } - z -= 257; - len = stbi__zlength_base[z]; - if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); - z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); - dist = stbi__zdist_base[z]; - if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (zout + len > a->zout_end) { - if (!stbi__zexpand(a, zout, len)) return 0; - zout = a->zout; - } - p = (stbi_uc *) (zout - dist); - if (dist == 1) { // run of one byte; common in images. - stbi_uc v = *p; - if (len) { do *zout++ = v; while (--len); } - } else { - if (len) { do *zout++ = *p++; while (--len); } - } - } - } -} - -static int stbi__compute_huffman_codes(stbi__zbuf *a) -{ - static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - stbi__zhuffman z_codelength; - stbi_uc lencodes[286+32+137];//padding for maximum single op - stbi_uc codelength_sizes[19]; - int i,n; - - int hlit = stbi__zreceive(a,5) + 257; - int hdist = stbi__zreceive(a,5) + 1; - int hclen = stbi__zreceive(a,4) + 4; - int ntot = hlit + hdist; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = stbi__zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; - } - if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < ntot) { - int c = stbi__zhuffman_decode(a, &z_codelength); - if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); - if (c < 16) - lencodes[n++] = (stbi_uc) c; - else { - stbi_uc fill = 0; - if (c == 16) { - c = stbi__zreceive(a,2)+3; - if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n-1]; - } else if (c == 17) { - c = stbi__zreceive(a,3)+3; - } else if (c == 18) { - c = stbi__zreceive(a,7)+11; - } else { - return stbi__err("bad codelengths", "Corrupt PNG"); - } - if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes+n, fill, c); - n += c; - } - } - if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); - if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int stbi__parse_uncompressed_block(stbi__zbuf *a) -{ - stbi_uc header[4]; - int len,nlen,k; - if (a->num_bits & 7) - stbi__zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check - a->code_buffer >>= 8; - a->num_bits -= 8; - } - if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, a->zout, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int stbi__parse_zlib_header(stbi__zbuf *a) -{ - int cmf = stbi__zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); - if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = -{ - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 -}; -static const stbi_uc stbi__zdefault_distance[32] = -{ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 -}; -/* -Init algorithm: -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; - for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; - for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; - for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; - - for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; -} -*/ - -static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!stbi__parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - do { - final = stbi__zreceive(a,1); - type = stbi__zreceive(a,2); - if (type == 0) { - if (!stbi__parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; - } else { - if (!stbi__compute_huffman_codes(a)) return 0; - } - if (!stbi__parse_huffman_block(a)) return 0; - } - } while (!final); - return 1; -} - -static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return stbi__parse_zlib(a, parse_header); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer+len; - if (stbi__do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} -#endif - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - -#ifndef STBI_NO_PNG -typedef struct -{ - stbi__uint32 length; - stbi__uint32 type; -} stbi__pngchunk; - -static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) -{ - stbi__pngchunk c; - c.length = stbi__get32be(s); - c.type = stbi__get32be(s); - return c; -} - -static int stbi__check_png_header(stbi__context *s) -{ - static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -} stbi__png; - - -enum { - STBI__F_none=0, - STBI__F_sub=1, - STBI__F_up=2, - STBI__F_avg=3, - STBI__F_paeth=4, - // synthetic filters used for first scanline to avoid needing a dummy row of 0s - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static stbi_uc first_row_filter[5] = -{ - STBI__F_none, - STBI__F_sub, - STBI__F_none, - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static int stbi__paeth(int a, int b, int c) -{ - int p = a + b - c; - int pa = abs(p-a); - int pb = abs(p-b); - int pc = abs(p-c); - if (pa <= pb && pa <= pc) return a; - if (pb <= pc) return b; - return c; -} - -static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; - -// create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) -{ - int bytes = (depth == 16? 2 : 1); - stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n*bytes; - stbi__uint32 img_len, img_width_bytes; - int k; - int img_n = s->img_n; // copy it into a local for later - - int output_bytes = out_n*bytes; - int filter_bytes = img_n*bytes; - int width = x; - - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into - if (!a->out) return stbi__err("outofmem", "Out of memory"); - - if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); - img_width_bytes = (((img_n * x * depth) + 7) >> 3); - img_len = (img_width_bytes + 1) * y; - - // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, - // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), - // so just check for raw_len < img_len always. - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *prior; - int filter = *raw++; - - if (filter > 4) - return stbi__err("invalid filter","Corrupt PNG"); - - if (depth < 8) { - if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG"); - cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place - filter_bytes = 1; - width = img_width_bytes; - } - prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above - - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - - // handle first byte explicitly - for (k=0; k < filter_bytes; ++k) { - switch (filter) { - case STBI__F_none : cur[k] = raw[k]; break; - case STBI__F_sub : cur[k] = raw[k]; break; - case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; - case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; - case STBI__F_avg_first : cur[k] = raw[k]; break; - case STBI__F_paeth_first: cur[k] = raw[k]; break; - } - } - - if (depth == 8) { - if (img_n != out_n) - cur[img_n] = 255; // first pixel - raw += img_n; - cur += out_n; - prior += out_n; - } else if (depth == 16) { - if (img_n != out_n) { - cur[filter_bytes] = 255; // first pixel top byte - cur[filter_bytes+1] = 255; // first pixel bottom byte - } - raw += filter_bytes; - cur += output_bytes; - prior += output_bytes; - } else { - raw += 1; - cur += 1; - prior += 1; - } - - // this is a little gross, so that we don't switch per-pixel or per-component - if (depth < 8 || img_n == out_n) { - int nk = (width - 1)*filter_bytes; - #define STBI__CASE(f) \ - case f: \ - for (k=0; k < nk; ++k) - switch (filter) { - // "none" filter turns into a memcpy here; make that explicit. - case STBI__F_none: memcpy(cur, raw, nk); break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; - } - #undef STBI__CASE - raw += nk; - } else { - STBI_ASSERT(img_n+1 == out_n); - #define STBI__CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ - for (k=0; k < filter_bytes; ++k) - switch (filter) { - STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; - } - #undef STBI__CASE - - // the loop above sets the high byte of the pixels' alpha, but for - // 16 bit png files we also need the low byte set. we'll do that here. - if (depth == 16) { - cur = a->out + stride*j; // start at the beginning of the row again - for (i=0; i < x; ++i,cur+=output_bytes) { - cur[filter_bytes+1] = 255; - } - } - } - } - - // we make a separate pass to expand bits to pixels; for performance, - // this could run two scanlines behind the above code, so it won't - // intefere with filtering but will still be in the cache. - if (depth < 8) { - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; - // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit - // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop - stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range - - // note that the final byte might overshoot and write more data than desired. - // we can allocate enough data that this never writes out of memory, but it - // could also overwrite the next scanline. can it overwrite non-empty data - // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. - // so we need to explicitly clamp the final ones - - if (depth == 4) { - for (k=x*img_n; k >= 2; k-=2, ++in) { - *cur++ = scale * ((*in >> 4) ); - *cur++ = scale * ((*in ) & 0x0f); - } - if (k > 0) *cur++ = scale * ((*in >> 4) ); - } else if (depth == 2) { - for (k=x*img_n; k >= 4; k-=4, ++in) { - *cur++ = scale * ((*in >> 6) ); - *cur++ = scale * ((*in >> 4) & 0x03); - *cur++ = scale * ((*in >> 2) & 0x03); - *cur++ = scale * ((*in ) & 0x03); - } - if (k > 0) *cur++ = scale * ((*in >> 6) ); - if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); - if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); - } else if (depth == 1) { - for (k=x*img_n; k >= 8; k-=8, ++in) { - *cur++ = scale * ((*in >> 7) ); - *cur++ = scale * ((*in >> 6) & 0x01); - *cur++ = scale * ((*in >> 5) & 0x01); - *cur++ = scale * ((*in >> 4) & 0x01); - *cur++ = scale * ((*in >> 3) & 0x01); - *cur++ = scale * ((*in >> 2) & 0x01); - *cur++ = scale * ((*in >> 1) & 0x01); - *cur++ = scale * ((*in ) & 0x01); - } - if (k > 0) *cur++ = scale * ((*in >> 7) ); - if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); - if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); - if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); - if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); - if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); - if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); - } - if (img_n != out_n) { - int q; - // insert alpha = 255 - cur = a->out + stride*j; - if (img_n == 1) { - for (q=x-1; q >= 0; --q) { - cur[q*2+1] = 255; - cur[q*2+0] = cur[q]; - } - } else { - STBI_ASSERT(img_n == 3); - for (q=x-1; q >= 0; --q) { - cur[q*4+3] = 255; - cur[q*4+2] = cur[q*3+2]; - cur[q*4+1] = cur[q*3+1]; - cur[q*4+0] = cur[q*3+0]; - } - } - } - } - } else if (depth == 16) { - // force the image data from big-endian to platform-native. - // this is done in a separate pass due to the decoding relying - // on the data being untouched, but could probably be done - // per-line during decode if care is taken. - stbi_uc *cur = a->out; - stbi__uint16 *cur16 = (stbi__uint16*)cur; - - for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { - *cur16 = (cur[0] << 8) | cur[1]; - } - } - - return 1; -} - -static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) -{ - int bytes = (depth == 16 ? 2 : 1); - int out_bytes = out_n * bytes; - stbi_uc *final; - int p; - if (!interlaced) - return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); - - // de-interlacing - final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); - if (!final) return stbi__err("outofmem", "Out of memory"); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; - if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { - STBI_FREE(final); - return 0; - } - for (j=0; j < y; ++j) { - for (i=0; i < x; ++i) { - int out_y = j*yspc[p]+yorig[p]; - int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, - a->out + (j*x+i)*out_bytes, out_bytes); - } - } - STBI_FREE(a->out); - image_data += img_len; - image_data_len -= img_len; - } - } - a->out = final; - - return 1; -} - -static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi__uint16 *p = (stbi__uint16*) z->out; - - // compute color-based transparency, assuming we've - // already got 65535 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 65535); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) -{ - stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; - stbi_uc *p, *temp_out, *orig = a->out; - - p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); - if (p == NULL) return stbi__err("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - STBI_FREE(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi__unpremultiply_on_load_global = 0; -static int stbi__de_iphone_flag_global = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_global = flag_true_if_should_convert; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global -#define stbi__de_iphone_flag stbi__de_iphone_flag_global -#else -static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; -static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; - -STBIDEF void stbi__unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; - stbi__unpremultiply_on_load_set = 1; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_local = flag_true_if_should_convert; - stbi__de_iphone_flag_set = 1; -} - -#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ - ? stbi__unpremultiply_on_load_local \ - : stbi__unpremultiply_on_load_global) -#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ - ? stbi__de_iphone_flag_local \ - : stbi__de_iphone_flag_global) -#endif // STBI_THREAD_LOCAL - -static void stbi__de_iphone(stbi__png *z) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - STBI_ASSERT(s->img_out_n == 4); - if (stbi__unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i=0; i < pixel_count; ++i) { - stbi_uc a = p[3]; - stbi_uc t = p[0]; - if (a) { - stbi_uc half = a / 2; - p[0] = (p[2] * 255 + half) / a; - p[1] = (p[1] * 255 + half) / a; - p[2] = ( t * 255 + half) / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) - -static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) -{ - stbi_uc palette[1024], pal_img_n=0; - stbi_uc has_trans=0, tc[3]={0}; - stbi__uint16 tc16[3]; - stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, is_iphone=0; - stbi__context *s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!stbi__check_png_header(s)) return 0; - - if (scan == STBI__SCAN_type) return 1; - - for (;;) { - stbi__pngchunk c = stbi__get_chunk_header(s); - switch (c.type) { - case STBI__PNG_TYPE('C','g','B','I'): - is_iphone = 1; - stbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I','H','D','R'): { - int comp,filter; - if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); - s->img_x = stbi__get32be(s); - s->img_y = stbi__get32be(s); - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); - comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); - filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); - interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - if (scan == STBI__SCAN_header) return 1; - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); - // if SCAN_header, have to scan to see if we have a tRNS - } - break; - } - - case STBI__PNG_TYPE('P','L','T','E'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = stbi__get8(s); - palette[i*4+1] = stbi__get8(s); - palette[i*4+2] = stbi__get8(s); - palette[i*4+3] = 255; - } - break; - } - - case STBI__PNG_TYPE('t','R','N','S'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = stbi__get8(s); - } else { - if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); - if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); - has_trans = 1; - if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is - } else { - for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger - } - } - break; - } - - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } - if ((int)(ioff + c.length) < (int)ioff) return 0; - if (ioff + c.length > idata_limit) { - stbi__uint32 idata_limit_old = idata_limit; - stbi_uc *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); - z->idata = p; - } - if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); - ioff += c.length; - break; - } - - case STBI__PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len, bpl; - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) return 1; - if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); - if (z->expanded == NULL) return 0; // zlib should set error - STBI_FREE(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; - if (has_trans) { - if (z->depth == 16) { - if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; - } else { - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; - } - } - if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) - stbi__de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - // non-paletted image with tRNS -> source image has (constant) alpha - ++s->img_n; - } - STBI_FREE(z->expanded); z->expanded = NULL; - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - return 1; - } - - default: - // if critical, fail - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { - #ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX PNG chunk not known"; - invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); - invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); - invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); - invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); - #endif - return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); - } - stbi__skip(s, c.length); - break; - } - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - } -} - -static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) -{ - void *result=NULL; - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth <= 8) - ri->bits_per_channel = 8; - else if (p->depth == 16) - ri->bits_per_channel = 16; - else - return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - if (ri->bits_per_channel == 8) - result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - else - result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) *n = p->s->img_n; - } - STBI_FREE(p->out); p->out = NULL; - STBI_FREE(p->expanded); p->expanded = NULL; - STBI_FREE(p->idata); p->idata = NULL; - - return result; -} - -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi__png p; - p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp, ri); -} - -static int stbi__png_test(stbi__context *s) -{ - int r; - r = stbi__check_png_header(s); - stbi__rewind(s); - return r; -} - -static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) -{ - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); - return 0; - } - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; - return 1; -} - -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__png p; - p.s = s; - return stbi__png_info_raw(&p, x, y, comp); -} - -static int stbi__png_is16(stbi__context *s) -{ - stbi__png p; - p.s = s; - if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); - return 0; - } - return 1; -} -#endif - -// Microsoft/Windows BMP image - -#ifndef STBI_NO_BMP -static int stbi__bmp_test_raw(stbi__context *s) -{ - int r; - int sz; - if (stbi__get8(s) != 'B') return 0; - if (stbi__get8(s) != 'M') return 0; - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - stbi__get32le(s); // discard data offset - sz = stbi__get32le(s); - r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); - return r; -} - -static int stbi__bmp_test(stbi__context *s) -{ - int r = stbi__bmp_test_raw(s); - stbi__rewind(s); - return r; -} - - -// returns 0..31 for the highest set bit -static int stbi__high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) { n += 16; z >>= 16; } - if (z >= 0x00100) { n += 8; z >>= 8; } - if (z >= 0x00010) { n += 4; z >>= 4; } - if (z >= 0x00004) { n += 2; z >>= 2; } - if (z >= 0x00002) { n += 1;/* >>= 1;*/ } - return n; -} - -static int stbi__bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -// extract an arbitrarily-aligned N-bit value (N=bits) -// from v, and then make it 8-bits long and fractionally -// extend it to full full range. -static int stbi__shiftsigned(unsigned int v, int shift, int bits) -{ - static unsigned int mul_table[9] = { - 0, - 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, - 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, - }; - static unsigned int shift_table[9] = { - 0, 0,0,1,0,2,4,6,0, - }; - if (shift < 0) - v <<= -shift; - else - v >>= shift; - STBI_ASSERT(v < 256); - v >>= (8-bits); - STBI_ASSERT(bits >= 0 && bits <= 8); - return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; -} - -typedef struct -{ - int bpp, offset, hsz; - unsigned int mr,mg,mb,ma, all_a; - int extra_read; -} stbi__bmp_data; - -static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) -{ - // BI_BITFIELDS specifies masks explicitly, don't override - if (compress == 3) - return 1; - - if (compress == 0) { - if (info->bpp == 16) { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } else if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - // otherwise, use defaults, which is all-0 - info->mr = info->mg = info->mb = info->ma = 0; - } - return 1; - } - return 0; // error -} - -static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) -{ - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; - info->extra_read = 14; - - if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = stbi__get16le(s); - s->img_y = stbi__get16le(s); - } else { - s->img_x = stbi__get32le(s); - s->img_y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - info->bpp = stbi__get16le(s); - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); - if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes - if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres - stbi__get32le(s); // discard colorsused - stbi__get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { - stbi__bmp_set_mask_defaults(info, compress); - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->extra_read += 12; - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { - // V4/V5 header - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); - if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs - stbi__bmp_set_mask_defaults(info, compress); - stbi__get32le(s); // discard color space - for (i=0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters - if (hsz == 124) { - stbi__get32le(s); // discard rendering intent - stbi__get32le(s); // discard offset of profile data - stbi__get32le(s); // discard size of profile data - stbi__get32le(s); // discard reserved - } - } - } - return (void *) 1; -} - - -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, all_a; - stbi_uc pal[256][4]; - int psize=0,i,j,width; - int flip_vertically, pad, target; - stbi__bmp_data info; - STBI_NOTUSED(ri); - - info.all_a = 255; - if (stbi__bmp_parse_header(s, &info) == NULL) - return NULL; // error code already set - - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - mr = info.mr; - mg = info.mg; - mb = info.mb; - ma = info.ma; - all_a = info.all_a; - - if (info.hsz == 12) { - if (info.bpp < 24) - psize = (info.offset - info.extra_read - 24) / 3; - } else { - if (info.bpp < 16) - psize = (info.offset - info.extra_read - info.hsz) >> 2; - } - if (psize == 0) { - if (info.offset != s->callback_already_read + (s->img_buffer - s->img_buffer_original)) { - return stbi__errpuc("bad offset", "Corrupt BMP"); - } - } - - if (info.bpp == 24 && ma == 0xff000000) - s->img_n = 3; - else - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - - // sanity-check size - if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "Corrupt BMP"); - - out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (info.bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - if (info.hsz != 12) stbi__get8(s); - pal[i][3] = 255; - } - stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 1) width = (s->img_x + 7) >> 3; - else if (info.bpp == 4) width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) width = s->img_x; - else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - if (info.bpp == 1) { - for (j=0; j < (int) s->img_y; ++j) { - int bit_offset = 7, v = stbi__get8(s); - for (i=0; i < (int) s->img_x; ++i) { - int color = (v>>bit_offset)&0x1; - out[z++] = pal[color][0]; - out[z++] = pal[color][1]; - out[z++] = pal[color][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - if((--bit_offset) < 0) { - bit_offset = 7; - v = stbi__get8(s); - } - } - stbi__skip(s, pad); - } - } else { - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (info.bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (info.bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - stbi__skip(s, pad); - } - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - stbi__skip(s, info.offset - info.extra_read - info.hsz); - if (info.bpp == 24) width = 3 * s->img_x; - else if (info.bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (info.bpp == 24) { - easy = 1; - } else if (info.bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - // right shift amt to put high bit in position #7 - rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); - gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); - if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - unsigned char a; - out[z+2] = stbi__get8(s); - out[z+1] = stbi__get8(s); - out[z+0] = stbi__get8(s); - z += 3; - a = (easy == 2 ? stbi__get8(s) : 255); - all_a |= a; - if (target == 4) out[z++] = a; - } - } else { - int bpp = info.bpp; - for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - unsigned int a; - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); - a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - all_a |= a; - if (target == 4) out[z++] = STBI__BYTECAST(a); - } - } - stbi__skip(s, pad); - } - } - - // if alpha channel is all 0s, replace with all 255s - if (target == 4 && all_a == 0) - for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) - out[i] = 255; - - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i]; p1[i] = p2[i]; p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - return out; -} -#endif - -// Targa Truevision - TGA -// by Jonathan Dummer -#ifndef STBI_NO_TGA -// returns STBI_rgb or whatever, 0 on error -static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) -{ - // only RGB or RGBA (incl. 16bit) or grey allowed - if (is_rgb16) *is_rgb16 = 0; - switch(bits_per_pixel) { - case 8: return STBI_grey; - case 16: if(is_grey) return STBI_grey_alpha; - // fallthrough - case 15: if(is_rgb16) *is_rgb16 = 1; - return STBI_rgb; - case 24: // fallthrough - case 32: return bits_per_pixel/8; - default: return 0; - } -} - -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) -{ - int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; - int sz, tga_colormap_type; - stbi__get8(s); // discard Offset - tga_colormap_type = stbi__get8(s); // colormap type - if( tga_colormap_type > 1 ) { - stbi__rewind(s); - return 0; // only RGB or indexed allowed - } - tga_image_type = stbi__get8(s); // image type - if ( tga_colormap_type == 1 ) { // colormapped (paletted) image - if (tga_image_type != 1 && tga_image_type != 9) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip image x and y origin - tga_colormap_bpp = sz; - } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE - if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { - stbi__rewind(s); - return 0; // only RGB or grey allowed, +/- RLE - } - stbi__skip(s,9); // skip colormap specification and image x/y origin - tga_colormap_bpp = 0; - } - tga_w = stbi__get16le(s); - if( tga_w < 1 ) { - stbi__rewind(s); - return 0; // test width - } - tga_h = stbi__get16le(s); - if( tga_h < 1 ) { - stbi__rewind(s); - return 0; // test height - } - tga_bits_per_pixel = stbi__get8(s); // bits per pixel - stbi__get8(s); // ignore alpha bits - if (tga_colormap_bpp != 0) { - if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { - // when using a colormap, tga_bits_per_pixel is the size of the indexes - // I don't think anything but 8 or 16bit indexes makes sense - stbi__rewind(s); - return 0; - } - tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); - } else { - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); - } - if(!tga_comp) { - stbi__rewind(s); - return 0; - } - if (x) *x = tga_w; - if (y) *y = tga_h; - if (comp) *comp = tga_comp; - return 1; // seems to have passed everything -} - -static int stbi__tga_test(stbi__context *s) -{ - int res = 0; - int sz, tga_color_type; - stbi__get8(s); // discard Offset - tga_color_type = stbi__get8(s); // color type - if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed - sz = stbi__get8(s); // image type - if ( tga_color_type == 1 ) { // colormapped (paletted) image - if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - stbi__skip(s,4); // skip image x and y origin - } else { // "normal" image w/o colormap - if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE - stbi__skip(s,9); // skip colormap specification and image x/y origin - } - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height - sz = stbi__get8(s); // bits per pixel - if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - - res = 1; // if we got this far, everything's good and we can return 1 instead of 0 - -errorEnd: - stbi__rewind(s); - return res; -} - -// read 16bit value and convert to 24bit RGB -static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) -{ - stbi__uint16 px = (stbi__uint16)stbi__get16le(s); - stbi__uint16 fiveBitMask = 31; - // we have 3 channels with 5bits each - int r = (px >> 10) & fiveBitMask; - int g = (px >> 5) & fiveBitMask; - int b = px & fiveBitMask; - // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (stbi_uc)((r * 255)/31); - out[1] = (stbi_uc)((g * 255)/31); - out[2] = (stbi_uc)((b * 255)/31); - - // some people claim that the most significant bit might be used for alpha - // (possibly if an alpha-bit is set in the "image descriptor byte") - // but that only made 16bit test images completely translucent.. - // so let's treat all 15 and 16bit TGAs as RGB with no alpha. -} - -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - // read in the TGA header stuff - int tga_offset = stbi__get8(s); - int tga_indexed = stbi__get8(s); - int tga_image_type = stbi__get8(s); - int tga_is_RLE = 0; - int tga_palette_start = stbi__get16le(s); - int tga_palette_len = stbi__get16le(s); - int tga_palette_bits = stbi__get8(s); - int tga_x_origin = stbi__get16le(s); - int tga_y_origin = stbi__get16le(s); - int tga_width = stbi__get16le(s); - int tga_height = stbi__get16le(s); - int tga_bits_per_pixel = stbi__get8(s); - int tga_comp, tga_rgb16=0; - int tga_inverted = stbi__get8(s); - // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4] = {0}; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); - STBI_NOTUSED(tga_x_origin); // @TODO - STBI_NOTUSED(tga_y_origin); // @TODO - - if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); - else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); - - if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency - return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); - - // tga info - *x = tga_width; - *y = tga_height; - if (comp) *comp = tga_comp; - - if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) - return stbi__errpuc("too large", "Corrupt TGA"); - - tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); - if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - stbi__skip(s, tga_offset ); - - if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { - for (i=0; i < tga_height; ++i) { - int row = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; - stbi__getn(s, tga_row, tga_width * tga_comp); - } - } else { - // do I need to load a palette? - if ( tga_indexed) - { - if (tga_palette_len == 0) { /* you have to have at least one entry! */ - STBI_FREE(tga_data); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); - if (!tga_palette) { - STBI_FREE(tga_data); - return stbi__errpuc("outofmem", "Out of memory"); - } - if (tga_rgb16) { - stbi_uc *pal_entry = tga_palette; - STBI_ASSERT(tga_comp == STBI_rgb); - for (i=0; i < tga_palette_len; ++i) { - stbi__tga_read_rgb16(s, pal_entry); - pal_entry += tga_comp; - } - } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - } - // load the data - for (i=0; i < tga_width * tga_height; ++i) - { - // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? - if ( tga_is_RLE ) - { - if ( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = stbi__get8(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if ( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if ( read_next_pixel ) - { - // load however much data we did have - if ( tga_indexed ) - { - // read in index, then perform the lookup - int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); - if ( pal_idx >= tga_palette_len ) { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_comp; - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else if(tga_rgb16) { - STBI_ASSERT(tga_comp == STBI_rgb); - stbi__tga_read_rgb16(s, raw_data); - } else { - // read in the data raw - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = stbi__get8(s); - } - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - - // copy data - for (j = 0; j < tga_comp; ++j) - tga_data[i*tga_comp+j] = raw_data[j]; - - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if ( tga_inverted ) - { - for (j = 0; j*2 < tga_height; ++j) - { - int index1 = j * tga_width * tga_comp; - int index2 = (tga_height - 1 - j) * tga_width * tga_comp; - for (i = tga_width * tga_comp; i > 0; --i) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if ( tga_palette != NULL ) - { - STBI_FREE( tga_palette ); - } - } - - // swap RGB - if the source data was RGB16, it already is in the right order - if (tga_comp >= 3 && !tga_rgb16) - { - unsigned char* tga_pixel = tga_data; - for (i=0; i < tga_width * tga_height; ++i) - { - unsigned char temp = tga_pixel[0]; - tga_pixel[0] = tga_pixel[2]; - tga_pixel[2] = temp; - tga_pixel += tga_comp; - } - } - - // convert to target component count - if (req_comp && req_comp != tga_comp) - tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); - - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - STBI_NOTUSED(tga_palette_start); - // OK, done - return tga_data; -} -#endif - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s) -{ - int r = (stbi__get32be(s) == 0x38425053); - stbi__rewind(s); - return r; -} - -static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) -{ - int count, nleft, len; - - count = 0; - while ((nleft = pixelCount - count) > 0) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - if (len > nleft) return 0; // corrupt data - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len = 257 - len; - if (len > nleft) return 0; // corrupt data - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - - return 1; -} - -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - int pixelCount; - int channelCount, compression; - int channel, i; - int bitdepth; - int w,h; - stbi_uc *out; - STBI_NOTUSED(ri); - - // Check identifier - if (stbi__get32be(s) != 0x38425053) // "8BPS" - return stbi__errpuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (stbi__get16be(s) != 1) - return stbi__errpuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - stbi__skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) - return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = stbi__get32be(s); - w = stbi__get32be(s); - - if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (stbi__get16be(s) != 3) - return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - stbi__skip(s,stbi__get32be(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - stbi__skip(s, stbi__get32be(s) ); - - // Skip the reserved data. - stbi__skip(s, stbi__get32be(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = stbi__get16be(s); - if (compression > 1) - return stbi__errpuc("bad compression", "PSD has an unknown compression format"); - - // Check size - if (!stbi__mad3sizes_valid(4, w, h, 0)) - return stbi__errpuc("too large", "Corrupt PSD"); - - // Create the destination image. - - if (!compression && bitdepth == 16 && bpc == 16) { - out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); - ri->bits_per_channel = 16; - } else - out = (stbi_uc *) stbi__malloc(4 * w*h); - - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = (channel == 3 ? 255 : 0); - } else { - // Read the RLE data. - if (!stbi__psd_decode_rle(s, p, pixelCount)) { - STBI_FREE(out); - return stbi__errpuc("corrupt", "bad RLE data"); - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - if (channel >= channelCount) { - // Fill this channel with default data. - if (bitdepth == 16 && bpc == 16) { - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - stbi__uint16 val = channel == 3 ? 65535 : 0; - for (i = 0; i < pixelCount; i++, q += 4) - *q = val; - } else { - stbi_uc *p = out+channel; - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } - } else { - if (ri->bits_per_channel == 16) { // output bpc - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - for (i = 0; i < pixelCount; i++, q += 4) - *q = (stbi__uint16) stbi__get16be(s); - } else { - stbi_uc *p = out+channel; - if (bitdepth == 16) { // input bpc - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc) (stbi__get16be(s) >> 8); - } else { - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); - } - } - } - } - } - - // remove weird white matte from PSD - if (channelCount >= 4) { - if (ri->bits_per_channel == 16) { - for (i=0; i < w*h; ++i) { - stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; - if (pixel[3] != 0 && pixel[3] != 65535) { - float a = pixel[3] / 65535.0f; - float ra = 1.0f / a; - float inv_a = 65535.0f * (1 - ra); - pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); - pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); - pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); - } - } - } else { - for (i=0; i < w*h; ++i) { - unsigned char *pixel = out + 4*i; - if (pixel[3] != 0 && pixel[3] != 255) { - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); - pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); - pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); - } - } - } - } - - // convert to desired output format - if (req_comp && req_comp != 4) { - if (ri->bits_per_channel == 16) - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); - else - out = stbi__convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - if (comp) *comp = 4; - *y = h; - *x = w; - - return out; -} -#endif - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -#ifndef STBI_NO_PIC -static int stbi__pic_is4(stbi__context *s,const char *str) -{ - int i; - for (i=0; i<4; ++i) - if (stbi__get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int stbi__pic_test_core(stbi__context *s) -{ - int i; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) - return 0; - - for(i=0;i<84;++i) - stbi__get8(s); - - if (!stbi__pic_is4(s,"PICT")) - return 0; - - return 1; -} - -typedef struct -{ - stbi_uc size,type,channel; -} stbi__pic_packet; - -static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) -{ - int mask=0x80, i; - - for (i=0; i<4; ++i, mask>>=1) { - if (channel & mask) { - if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); - dest[i]=stbi__get8(s); - } - } - - return dest; -} - -static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) -{ - int mask=0x80,i; - - for (i=0;i<4; ++i, mask>>=1) - if (channel&mask) - dest[i]=src[i]; -} - -static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) -{ - int act_comp=0,num_packets=0,y,chained; - stbi__pic_packet packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return stbi__errpuc("bad format","too many packets"); - - packet = &packets[num_packets++]; - - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - - act_comp |= packet->channel; - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); - if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for(y=0; ytype) { - default: - return stbi__errpuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;xchannel,dest)) - return 0; - break; - } - - case 1://Pure RLE - { - int left=width, i; - - while (left>0) { - stbi_uc count,value[4]; - - count=stbi__get8(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); - - if (count > left) - count = (stbi_uc) left; - - if (!stbi__readval(s,packet->channel,value)) return 0; - - for(i=0; ichannel,dest,value); - left -= count; - } - } - break; - - case 2: {//Mixed RLE - int left=width; - while (left>0) { - int count = stbi__get8(s), i; - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - - if (count==128) - count = stbi__get16be(s); - else - count -= 127; - if (count > left) - return stbi__errpuc("bad file","scanline overrun"); - - if (!stbi__readval(s,packet->channel,value)) - return 0; - - for(i=0;ichannel,dest,value); - } else { // Raw - ++count; - if (count>left) return stbi__errpuc("bad file","scanline overrun"); - - for(i=0;ichannel,dest)) - return 0; - } - left-=count; - } - break; - } - } - } - } - - return result; -} - -static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) -{ - stbi_uc *result; - int i, x,y, internal_comp; - STBI_NOTUSED(ri); - - if (!comp) comp = &internal_comp; - - for (i=0; i<92; ++i) - stbi__get8(s); - - x = stbi__get16be(s); - y = stbi__get16be(s); - - if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); - - stbi__get32be(s); //skip `ratio' - stbi__get16be(s); //skip `fields' - stbi__get16be(s); //skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); - if (!result) return stbi__errpuc("outofmem", "Out of memory"); - memset(result, 0xff, x*y*4); - - if (!stbi__pic_load_core(s,x,y,comp, result)) { - STBI_FREE(result); - result=0; - } - *px = x; - *py = y; - if (req_comp == 0) req_comp = *comp; - result=stbi__convert_format(result,4,req_comp,x,y); - - return result; -} - -static int stbi__pic_test(stbi__context *s) -{ - int r = stbi__pic_test_core(s); - stbi__rewind(s); - return r; -} -#endif - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb - -#ifndef STBI_NO_GIF -typedef struct -{ - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; - -typedef struct -{ - int w,h; - stbi_uc *out; // output buffer (always 4 components) - stbi_uc *background; // The current "background" as far as a gif is concerned - stbi_uc *history; - int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; - stbi__gif_lzw codes[8192]; - stbi_uc *color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; - int delay; -} stbi__gif; - -static int stbi__gif_test_raw(stbi__context *s) -{ - int sz; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; - sz = stbi__get8(s); - if (sz != '9' && sz != '7') return 0; - if (stbi__get8(s) != 'a') return 0; - return 1; -} - -static int stbi__gif_test(stbi__context *s) -{ - int r = stbi__gif_test_raw(s); - stbi__rewind(s); - return r; -} - -static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) -{ - int i; - for (i=0; i < num_entries; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - pal[i][3] = transp == i ? 0 : 255; - } -} - -static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) -{ - stbi_uc version; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return stbi__err("not GIF", "Corrupt GIF"); - - version = stbi__get8(s); - if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - - stbi__g_failure_reason = ""; - g->w = stbi__get16le(s); - g->h = stbi__get16le(s); - g->flags = stbi__get8(s); - g->bgindex = stbi__get8(s); - g->ratio = stbi__get8(s); - g->transparent = -1; - - if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); - - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; - - if (g->flags & 0x80) - stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); - if (!g) return stbi__err("outofmem", "Out of memory"); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind( s ); - return 0; - } - if (x) *x = g->w; - if (y) *y = g->h; - STBI_FREE(g); - return 1; -} - -static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) -{ - stbi_uc *p, *c; - int idx; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi__out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) return; - - idx = g->cur_x + g->cur_y; - p = &g->out[idx]; - g->history[idx / 4] = 1; - - c = &g->color_table[g->codes[code].suffix * 4]; - if (c[3] > 128) { // don't render transparent pixels; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) -{ - stbi_uc lzw_cs; - stbi__int32 len, init_code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw *p; - - lzw_cs = stbi__get8(s); - if (lzw_cs > 12) return NULL; - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (init_code = 0; init_code < clear; init_code++) { - g->codes[init_code].prefix = -1; - g->codes[init_code].first = (stbi_uc) init_code; - g->codes[init_code].suffix = (stbi_uc) init_code; - } - - // support no starting clear code - avail = clear+2; - oldcode = -1; - - len = 0; - for(;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = stbi__get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (stbi__int32) stbi__get8(s) << valid_bits; - valid_bits += 8; - } else { - stbi__int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); - while ((len = stbi__get8(s)) > 0) - stbi__skip(s,len); - return g->out; - } else if (code <= avail) { - if (first) { - return stbi__errpuc("no clear code", "Corrupt GIF"); - } - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 8192) { - return stbi__errpuc("too many codes", "Corrupt GIF"); - } - - p->prefix = (stbi__int16) oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - - stbi__out_gif_code(g, (stbi__uint16) code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -// two back is the image from two frames ago, used for a very specific disposal format -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) -{ - int dispose; - int first_frame; - int pi; - int pcount; - STBI_NOTUSED(req_comp); - - // on first frame, any non-written pixels get the background colour (non-transparent) - first_frame = 0; - if (g->out == 0) { - if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header - if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) - return stbi__errpuc("too large", "GIF image is too large"); - pcount = g->w * g->h; - g->out = (stbi_uc *) stbi__malloc(4 * pcount); - g->background = (stbi_uc *) stbi__malloc(4 * pcount); - g->history = (stbi_uc *) stbi__malloc(pcount); - if (!g->out || !g->background || !g->history) - return stbi__errpuc("outofmem", "Out of memory"); - - // image is treated as "transparent" at the start - ie, nothing overwrites the current background; - // background colour is only used for pixels that are not rendered first frame, after that "background" - // color refers to the color that was there the previous frame. - memset(g->out, 0x00, 4 * pcount); - memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) - memset(g->history, 0x00, pcount); // pixels that were affected previous frame - first_frame = 1; - } else { - // second frame - how do we dispose of the previous one? - dispose = (g->eflags & 0x1C) >> 2; - pcount = g->w * g->h; - - if ((dispose == 3) && (two_back == 0)) { - dispose = 2; // if I don't have an image to revert back to, default to the old background - } - - if (dispose == 3) { // use previous graphic - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); - } - } - } else if (dispose == 2) { - // restore what was changed last frame to background before that frame; - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); - } - } - } else { - // This is a non-disposal case eithe way, so just - // leave the pixels as is, and they will become the new background - // 1: do not dispose - // 0: not specified. - } - - // background is what out is after the undoing of the previou frame; - memcpy( g->background, g->out, 4 * g->w * g->h ); - } - - // clear my history; - memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame - - for (;;) { - int tag = stbi__get8(s); - switch (tag) { - case 0x2C: /* Image Descriptor */ - { - stbi__int32 x, y, w, h; - stbi_uc *o; - - x = stbi__get16le(s); - y = stbi__get16le(s); - w = stbi__get16le(s); - h = stbi__get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - // if the width of the specified rectangle is 0, that means - // we may not see *any* pixels or the image is malformed; - // to make sure this is caught, move the current y down to - // max_y (which is what out_gif_code checks). - if (w == 0) - g->cur_y = g->max_y; - - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; - } else if (g->flags & 0x80) { - g->color_table = (stbi_uc *) g->pal; - } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - - o = stbi__process_gif_raster(s, g); - if (!o) return NULL; - - // if this was the first frame, - pcount = g->w * g->h; - if (first_frame && (g->bgindex > 0)) { - // if first frame, any pixel not drawn to gets the background color - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi] == 0) { - g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; - memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); - } - } - } - - return o; - } - - case 0x21: // Comment Extension. - { - int len; - int ext = stbi__get8(s); - if (ext == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { - g->eflags = stbi__get8(s); - g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. - - // unset old transparent - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 255; - } - if (g->eflags & 0x01) { - g->transparent = stbi__get8(s); - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 0; - } - } else { - // don't need transparent - stbi__skip(s, 1); - g->transparent = -1; - } - } else { - stbi__skip(s, len); - break; - } - } - while ((len = stbi__get8(s)) != 0) { - stbi__skip(s, len); - } - break; - } - - case 0x3B: // gif stream termination code - return (stbi_uc *) s; // using '1' causes warning on some compilers - - default: - return stbi__errpuc("unknown code", "Corrupt GIF"); - } - } -} - -static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) -{ - STBI_FREE(g->out); - STBI_FREE(g->history); - STBI_FREE(g->background); - - if (out) STBI_FREE(out); - if (delays && *delays) STBI_FREE(*delays); - return stbi__errpuc("outofmem", "Out of memory"); -} - -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - if (stbi__gif_test(s)) { - int layers = 0; - stbi_uc *u = 0; - stbi_uc *out = 0; - stbi_uc *two_back = 0; - stbi__gif g; - int stride; - int out_size = 0; - int delays_size = 0; - - STBI_NOTUSED(out_size); - STBI_NOTUSED(delays_size); - - memset(&g, 0, sizeof(g)); - if (delays) { - *delays = 0; - } - - do { - u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - - if (u) { - *x = g.w; - *y = g.h; - ++layers; - stride = g.w * g.h * 4; - - if (out) { - void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); - if (!tmp) - return stbi__load_gif_main_outofmem(&g, out, delays); - else { - out = (stbi_uc*) tmp; - out_size = layers * stride; - } - - if (delays) { - int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); - if (!new_delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - *delays = new_delays; - delays_size = layers * sizeof(int); - } - } else { - out = (stbi_uc*)stbi__malloc( layers * stride ); - if (!out) - return stbi__load_gif_main_outofmem(&g, out, delays); - out_size = layers * stride; - if (delays) { - *delays = (int*) stbi__malloc( layers * sizeof(int) ); - if (!*delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - delays_size = layers * sizeof(int); - } - } - memcpy( out + ((layers - 1) * stride), u, stride ); - if (layers >= 2) { - two_back = out - 2 * stride; - } - - if (delays) { - (*delays)[layers - 1U] = g.delay; - } - } - } while (u != 0); - - // free temp buffer; - STBI_FREE(g.out); - STBI_FREE(g.history); - STBI_FREE(g.background); - - // do the final conversion after loading everything; - if (req_comp && req_comp != 4) - out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); - - *z = layers; - return out; - } else { - return stbi__errpuc("not GIF", "Image was not as a gif type."); - } -} - -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *u = 0; - stbi__gif g; - memset(&g, 0, sizeof(g)); - STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, &g, comp, req_comp, 0); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - if (u) { - *x = g.w; - *y = g.h; - - // moved conversion to after successful load so that the same - // can be done for multiple frames. - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g.w, g.h); - } else if (g.out) { - // if there was an error and we allocated an image buffer, free it! - STBI_FREE(g.out); - } - - // free buffers needed for multiple frame loading; - STBI_FREE(g.history); - STBI_FREE(g.background); - - return u; -} - -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) -{ - return stbi__gif_info_raw(s,x,y,comp); -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s, const char *signature) -{ - int i; - for (i=0; signature[i]; ++i) - if (stbi__get8(s) != signature[i]) - return 0; - stbi__rewind(s); - return 1; -} - -static int stbi__hdr_test(stbi__context* s) -{ - int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); - stbi__rewind(s); - if(!r) { - r = stbi__hdr_test_core(s, "#?RGBE\n"); - stbi__rewind(s); - } - return r; -} - -#define STBI__HDR_BUFLEN 1024 -static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) -{ - int len=0; - char c = '\0'; - - c = (char) stbi__get8(z); - - while (!stbi__at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == STBI__HDR_BUFLEN-1) { - // flush to end of line - while (!stbi__at_eof(z) && stbi__get8(z) != '\n') - ; - break; - } - c = (char) stbi__get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if ( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - const char *headerToken; - STBI_NOTUSED(ri); - - // Check identifier - headerToken = stbi__hdr_gettoken(s,buffer); - if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) - return stbi__errpf("not HDR", "Corrupt HDR image"); - - // Parse header - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = (int) strtol(token, NULL, 10); - - if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); - if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); - - *x = width; - *y = height; - - if (comp) *comp = 3; - if (req_comp == 0) req_comp = 3; - - if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) - return stbi__errpf("too large", "HDR image is too large"); - - // Read data - hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); - if (!hdr_data) - return stbi__errpf("outofmem", "Out of memory"); - - // Load image data - // image data is stored as some number of sca - if ( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - stbi__getn(s, rgbe, 4); - stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = stbi__get8(s); - c2 = stbi__get8(s); - len = stbi__get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4]; - rgbe[0] = (stbi_uc) c1; - rgbe[1] = (stbi_uc) c2; - rgbe[2] = (stbi_uc) len; - rgbe[3] = (stbi_uc) stbi__get8(s); - stbi__hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - STBI_FREE(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= stbi__get8(s); - if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) { - scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); - if (!scanline) { - STBI_FREE(hdr_data); - return stbi__errpf("outofmem", "Out of memory"); - } - } - - for (k = 0; k < 4; ++k) { - int nleft; - i = 0; - while ((nleft = width - i) > 0) { - count = stbi__get8(s); - if (count > 128) { - // Run - value = stbi__get8(s); - count -= 128; - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = stbi__get8(s); - } - } - } - for (i=0; i < width; ++i) - stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - if (scanline) - STBI_FREE(scanline); - } - - return hdr_data; -} - -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int dummy; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (stbi__hdr_test(s) == 0) { - stbi__rewind( s ); - return 0; - } - - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) { - stbi__rewind( s ); - return 0; - } - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *y = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *x = (int) strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -#ifndef STBI_NO_BMP -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) -{ - void *p; - stbi__bmp_data info; - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); - if (p == NULL) { - stbi__rewind( s ); - return 0; - } - if (x) *x = s->img_x; - if (y) *y = s->img_y; - if (comp) { - if (info.bpp == 24 && info.ma == 0xff000000) - *comp = 3; - else - *comp = info.ma ? 4 : 3; - } - return 1; -} -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) -{ - int channelCount, dummy, depth; - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - *y = stbi__get32be(s); - *x = stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 8 && depth != 16) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 3) { - stbi__rewind( s ); - return 0; - } - *comp = 4; - return 1; -} - -static int stbi__psd_is16(stbi__context *s) -{ - int channelCount, depth; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - STBI_NOTUSED(stbi__get32be(s)); - STBI_NOTUSED(stbi__get32be(s)); - depth = stbi__get16be(s); - if (depth != 16) { - stbi__rewind( s ); - return 0; - } - return 1; -} -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) -{ - int act_comp=0,num_packets=0,chained,dummy; - stbi__pic_packet packets[10]; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 88); - - *x = stbi__get16be(s); - *y = stbi__get16be(s); - if (stbi__at_eof(s)) { - stbi__rewind( s); - return 0; - } - if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; - } - - stbi__skip(s, 8); - - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - act_comp |= packet->channel; - - if (stbi__at_eof(s)) { - stbi__rewind( s ); - return 0; - } - if (packet->size != 8) { - stbi__rewind( s ); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} -#endif - -// ************************************************************************************************* -// Portable Gray Map and Portable Pixel Map loader -// by Ken Miller -// -// PGM: http://netpbm.sourceforge.net/doc/pgm.html -// PPM: http://netpbm.sourceforge.net/doc/ppm.html -// -// Known limitations: -// Does not support comments in the header section -// Does not support ASCII image data (formats P2 and P3) - -#ifndef STBI_NO_PNM - -static int stbi__pnm_test(stbi__context *s) -{ - char p, t; - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); - return 0; - } - return 1; -} - -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - STBI_NOTUSED(ri); - - ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); - if (ri->bits_per_channel == 0) - return 0; - - if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - - if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8)); - - if (req_comp && req_comp != s->img_n) { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - return out; -} - -static int stbi__pnm_isspace(char c) -{ - return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; -} - -static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) -{ - for (;;) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); - - if (stbi__at_eof(s) || *c != '#') - break; - - while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) - *c = (char) stbi__get8(s); - } -} - -static int stbi__pnm_isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int stbi__pnm_getinteger(stbi__context *s, char *c) -{ - int value = 0; - - while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { - value = value*10 + (*c - '0'); - *c = (char) stbi__get8(s); - } - - return value; -} - -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) -{ - int maxv, dummy; - char c, p, t; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - stbi__rewind(s); - - // Get identifier - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - - *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm - - c = (char) stbi__get8(s); - stbi__pnm_skip_whitespace(s, &c); - - *x = stbi__pnm_getinteger(s, &c); // read width - stbi__pnm_skip_whitespace(s, &c); - - *y = stbi__pnm_getinteger(s, &c); // read height - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value - if (maxv > 65535) - return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); - else if (maxv > 255) - return 16; - else - return 8; -} - -static int stbi__pnm_is16(stbi__context *s) -{ - if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) - return 1; - return 0; -} -#endif - -static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) -{ - #ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_GIF - if (stbi__gif_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_BMP - if (stbi__bmp_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PIC - if (stbi__pic_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNM - if (stbi__pnm_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) return 1; - #endif - - // test tga last because it's a crappy test! - #ifndef STBI_NO_TGA - if (stbi__tga_info(s, x, y, comp)) - return 1; - #endif - return stbi__err("unknown image type", "Image not of any known type, or corrupt"); -} - -static int stbi__is_16_main(stbi__context *s) -{ - #ifndef STBI_NO_PNG - if (stbi__png_is16(s)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_is16(s)) return 1; - #endif - - #ifndef STBI_NO_PNM - if (stbi__pnm_is16(s)) return 1; - #endif - return 0; -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__info_main(&s,x,y,comp); - fseek(f,pos,SEEK_SET); - return r; -} - -STBIDEF int stbi_is_16_bit(char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_is_16_bit_from_file(f); - fclose(f); - return result; -} - -STBIDEF int stbi_is_16_bit_from_file(FILE *f) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__is_16_main(&s); - fseek(f,pos,SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__is_16_main(&s); -} - -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__is_16_main(&s); -} - -#endif // STB_IMAGE_IMPLEMENTATION - -/* - revision history: - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug - 1-bit BMP - *_is_16_bit api - avoid warnings - 2.16 (2017-07-23) all functions have 16-bit variants; - STBI_NO_STDIO works again; - compilation fixes; - fix rounding in unpremultiply; - optimize vertical flip; - disable raw_len validation; - documentation fixes - 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; - warning fixes; disable run-time SSE detection on gcc; - uniform handling of optional "return" values; - thread-safe initialization of zlib tables - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) allocate large structures on the stack - remove white matting for transparent PSD - fix reported channel count for PNG & BMP - re-enable SSE2 in non-gcc 64-bit - support RGB-formatted JPEG - read 16-bit PNGs (only as 8-bit) - 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED - 2.09 (2016-01-16) allow comments in PNM files - 16-bit-per-pixel TGA (not bit-per-component) - info() for TGA could break due to .hdr handling - info() for BMP to shares code instead of sloppy parse - can use STBI_REALLOC_SIZED if allocator doesn't support realloc - code cleanup - 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA - 2.07 (2015-09-13) fix compiler warnings - partial animated GIF support - limited 16-bpc PSD support - #ifdef unused functions - bug with < 92 byte PIC,PNM,HDR,TGA - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) extra corruption checking (mmozeiko) - stbi_set_flip_vertically_on_load (nguillemot) - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) - progressive JPEG (stb) - PGM/PPM support (Ken Miller) - STBI_MALLOC,STBI_REALLOC,STBI_FREE - GIF bugfix -- seemingly never worked - STBI_NO_*, STBI_ONLY_* - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) - optimize PNG (ryg) - fix bug in interlaced PNG with user-specified channel count (stb) - 1.46 (2014-08-26) - fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG - 1.45 (2014-08-16) - fix MSVC-ARM internal compiler error by wrapping malloc - 1.44 (2014-08-07) - various warning fixes from Ronny Chevalier - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 (2008-08-02) - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 (2006-11-19) - first released version -*/ - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/dep/stb/stb_include.h b/dep/stb/stb_include.h deleted file mode 100644 index 6a90097..0000000 --- a/dep/stb/stb_include.h +++ /dev/null @@ -1,313 +0,0 @@ -// stb_include.h - v0.02 - parse and process #include directives - public domain -// -// To build this, in one source file that includes this file do -// #define STB_INCLUDE_IMPLEMENTATION -// -// This program parses a string and replaces lines of the form -// #include "foo" -// with the contents of a file named "foo". It also embeds the -// appropriate #line directives. Note that all include files must -// reside in the location specified in the path passed to the API; -// it does not check multiple directories. -// -// If the string contains a line of the form -// #inject -// then it will be replaced with the contents of the string 'inject' passed to the API. -// -// Options: -// -// Define STB_INCLUDE_LINE_GLSL to get GLSL-style #line directives -// which use numbers instead of filenames. -// -// Define STB_INCLUDE_LINE_NONE to disable output of #line directives. -// -// Standard libraries: -// -// stdio.h FILE, fopen, fclose, fseek, ftell -// stdlib.h malloc, realloc, free -// string.h strcpy, strncmp, memcpy -// -// Credits: -// -// Written by Sean Barrett. -// -// Fixes: -// Michal Klos - -#ifndef STB_INCLUDE_STB_INCLUDE_H -#define STB_INCLUDE_STB_INCLUDE_H - -// Do include-processing on the string 'str'. To free the return value, pass it to free() -char *stb_include_string(char *str, char *inject, char *path_to_includes, char *filename_for_line_directive, char error[256]); - -// Concatenate the strings 'strs' and do include-processing on the result. To free the return value, pass it to free() -char *stb_include_strings(char **strs, int count, char *inject, char *path_to_includes, char *filename_for_line_directive, char error[256]); - -// Load the file 'filename' and do include-processing on the string therein. note that -// 'filename' is opened directly; 'path_to_includes' is not used. To free the return value, pass it to free() -char *stb_include_file(char *filename, char *inject, char *path_to_includes, char error[256]); - -#endif - - -#ifdef STB_INCLUDE_IMPLEMENTATION - -#include -#include - -#ifndef STB_MALLOC - #define STB_STDLIB - #define STB_MALLOC malloc -#endif - -#ifndef STB_FREE - #define STB_STDLIB - #define STB_FREE free -#endif - -#ifndef STB_REALLOC - #define STB_STDLIB - #define STB_REALLOC realloc -#endif - -#ifdef STB_STDLIB - #include -#endif - -static char *stb_include_load_file(char *filename, size_t *plen) -{ - char *text; - size_t len; - FILE *f = fopen(filename, "rb"); - if (f == 0) return 0; - fseek(f, 0, SEEK_END); - len = (size_t) ftell(f); - if (plen) *plen = len; - text = (char *) STB_MALLOC(len+1); - if (text == 0) return 0; - fseek(f, 0, SEEK_SET); - fread(text, 1, len, f); - fclose(f); - text[len] = 0; - return text; -} - -typedef struct -{ - int offset; - int end; - char *filename; - int next_line_after; -} include_info; - -static include_info *stb_include_append_include(include_info *array, int len, int offset, int end, char *filename, int next_line) -{ - include_info *z = (include_info *)STB_REALLOC(array, sizeof(*z) * (len+1)); - z[len].offset = offset; - z[len].end = end; - z[len].filename = filename; - z[len].next_line_after = next_line; - return z; -} - -static void stb_include_free_includes(include_info *array, int len) -{ - int i; - for (i=0; i < len; ++i) - STB_FREE(array[i].filename); - STB_FREE(array); -} - -static int stb_include_isspace(int ch) -{ - return (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'); -} - -// find location of all #include and #inject -static int stb_include_find_includes(char *text, include_info **plist) -{ - int line_count = 1; - int inc_count = 0; - char *s = text, *start; - include_info *list = NULL; - while (*s) { - // parse is always at start of line when we reach here - start = s; - while (*s == ' ' || *s == '\t') - ++s; - if (*s == '#') { - ++s; - while (*s == ' ' || *s == '\t') - ++s; - if (0==strncmp(s, "include", 7) && stb_include_isspace(s[7])) { - s += 7; - while (*s == ' ' || *s == '\t') - ++s; - if (*s == '"') { - char *t = ++s; - while (*t != '"' && *t != '\n' && *t != '\r' && *t != 0) - ++t; - if (*t == '"') { - char *filename = (char *) STB_MALLOC(t-s+1); - memcpy(filename, s, t-s); - filename[t-s] = 0; - s=t; - while (*s != '\r' && *s != '\n' && *s != 0) - ++s; - // s points to the newline, so s-start is everything except the newline - list = stb_include_append_include(list, inc_count++, start-text, s-text, filename, line_count+1); - } - } - } else if (0==strncmp(s, "inject", 6) && (stb_include_isspace(s[6]) || s[6]==0)) { - while (*s != '\r' && *s != '\n' && *s != 0) - ++s; - list = stb_include_append_include(list, inc_count++, start-text, s-text, NULL, line_count+1); - } - } - while (*s != '\r' && *s != '\n' && *s != 0) - ++s; - if (*s == '\r' || *s == '\n') { - s = s + (s[0] + s[1] == '\r' + '\n' ? 2 : 1); - } - ++line_count; - } - *plist = list; - return inc_count; -} - -// avoid dependency on sprintf() -static void stb_include_itoa(char str[9], int n) -{ - int i; - for (i=0; i < 8; ++i) - str[i] = ' '; - str[i] = 0; - - for (i=1; i < 8; ++i) { - str[7-i] = '0' + (n % 10); - n /= 10; - if (n == 0) - break; - } -} - -static char *stb_include_append(char *str, size_t *curlen, char *addstr, size_t addlen) -{ - str = (char *)STB_REALLOC(str, *curlen + addlen); - memcpy(str + *curlen, addstr, addlen); - *curlen += addlen; - return str; -} - -char *stb_include_string(char *str, char *inject, char *path_to_includes, char *filename, char error[256]) -{ - char temp[4096]; - include_info *inc_list; - int i, num = stb_include_find_includes(str, &inc_list); - size_t source_len = strlen(str); - char *text=0; - size_t textlen=0, last=0; - for (i=0; i < num; ++i) { - text = stb_include_append(text, &textlen, str+last, inc_list[i].offset - last); - // write out line directive for the include - #ifndef STB_INCLUDE_LINE_NONE - #ifdef STB_INCLUDE_LINE_GLSL - if (textlen != 0) // GLSL #version must appear first, so don't put a #line at the top - #endif - { - strcpy(temp, "#line "); - stb_include_itoa(temp+6, 1); - strcat(temp, " "); - #ifdef STB_INCLUDE_LINE_GLSL - stb_include_itoa(temp+15, i+1); - #else - strcat(temp, "\""); - if (inc_list[i].filename == 0) - strcmp(temp, "INJECT"); - else - strcat(temp, inc_list[i].filename); - strcat(temp, "\""); - #endif - strcat(temp, "\n"); - text = stb_include_append(text, &textlen, temp, strlen(temp)); - } - #endif - if (inc_list[i].filename == 0) { - if (inject != 0) - text = stb_include_append(text, &textlen, inject, strlen(inject)); - } else { - char *inc; - strcpy(temp, path_to_includes); - strcat(temp, "/"); - strcat(temp, inc_list[i].filename); - inc = stb_include_file(temp, inject, path_to_includes, error); - if (inc == NULL) { - stb_include_free_includes(inc_list, num); - return NULL; - } - text = stb_include_append(text, &textlen, inc, strlen(inc)); - STB_FREE(inc); - } - // write out line directive - #ifndef STB_INCLUDE_LINE_NONE - strcpy(temp, "\n#line "); - stb_include_itoa(temp+6, inc_list[i].next_line_after); - strcat(temp, " "); - #ifdef STB_INCLUDE_LINE_GLSL - stb_include_itoa(temp+15, 0); - #else - strcat(temp, filename != 0 ? filename : "source-file"); - #endif - text = stb_include_append(text, &textlen, temp, strlen(temp)); - // no newlines, because we kept the #include newlines, which will get appended next - #endif - last = inc_list[i].end; - } - text = stb_include_append(text, &textlen, str+last, source_len - last + 1); // append '\0' - stb_include_free_includes(inc_list, num); - return text; -} - -char *stb_include_strings(char **strs, int count, char *inject, char *path_to_includes, char *filename, char error[256]) -{ - char *text; - char *result; - int i; - size_t length=0; - for (i=0; i < count; ++i) - length += strlen(strs[i]); - text = (char *) STB_MALLOC(length+1); - length = 0; - for (i=0; i < count; ++i) { - strcpy(text + length, strs[i]); - length += strlen(strs[i]); - } - result = stb_include_string(text, inject, path_to_includes, filename, error); - STB_FREE(text); - return result; -} - -char *stb_include_file(char *filename, char *inject, char *path_to_includes, char error[256]) -{ - size_t len; - char *result; - char *text = stb_include_load_file(filename, &len); - if (text == NULL) { - strcpy(error, "Error: couldn't load '"); - strcat(error, filename); - strcat(error, "'"); - return 0; - } - result = stb_include_string(text, inject, path_to_includes, filename, error); - STB_FREE(text); - return result; -} - -#if 0 // @TODO, GL_ARB_shader_language_include-style system that doesn't touch filesystem -char *stb_include_preloaded(char *str, char *inject, char *includes[][2], char error[256]) -{ - -} -#endif - -#endif // STB_INCLUDE_IMPLEMENTATION diff --git a/dep/stb/stb_vorbis.h b/dep/stb/stb_vorbis.h deleted file mode 100644 index 3279c96..0000000 --- a/dep/stb/stb_vorbis.h +++ /dev/null @@ -1,5584 +0,0 @@ -// Ogg Vorbis audio decoder - v1.22 - public domain -// http://nothings.org/stb_vorbis/ -// -// Original version written by Sean Barrett in 2007. -// -// Originally sponsored by RAD Game Tools. Seeking implementation -// sponsored by Phillip Bennefall, Marc Andersen, Aaron Baker, -// Elias Software, Aras Pranckevicius, and Sean Barrett. -// -// LICENSE -// -// See end of file for license information. -// -// Limitations: -// -// - floor 0 not supported (used in old ogg vorbis files pre-2004) -// - lossless sample-truncation at beginning ignored -// - cannot concatenate multiple vorbis streams -// - sample positions are 32-bit, limiting seekable 192Khz -// files to around 6 hours (Ogg supports 64-bit) -// -// Feature contributors: -// Dougall Johnson (sample-exact seeking) -// -// Bugfix/warning contributors: -// Terje Mathisen Niklas Frykholm Andy Hill -// Casey Muratori John Bolton Gargaj -// Laurent Gomila Marc LeBlanc Ronny Chevalier -// Bernhard Wodo Evan Balster github:alxprd -// Tom Beaumont Ingo Leitgeb Nicolas Guillemot -// Phillip Bennefall Rohit Thiago Goulart -// github:manxorist Saga Musix github:infatum -// Timur Gagiev Maxwell Koo Peter Waller -// github:audinowho Dougall Johnson David Reid -// github:Clownacy Pedro J. Estebanez Remi Verschelde -// AnthoFoxo github:morlat Gabriel Ravier -// -// Partial history: -// 1.22 - 2021-07-11 - various small fixes -// 1.21 - 2021-07-02 - fix bug for files with no comments -// 1.20 - 2020-07-11 - several small fixes -// 1.19 - 2020-02-05 - warnings -// 1.18 - 2020-02-02 - fix seek bugs; parse header comments; misc warnings etc. -// 1.17 - 2019-07-08 - fix CVE-2019-13217..CVE-2019-13223 (by ForAllSecure) -// 1.16 - 2019-03-04 - fix warnings -// 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found -// 1.14 - 2018-02-11 - delete bogus dealloca usage -// 1.13 - 2018-01-29 - fix truncation of last frame (hopefully) -// 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files -// 1.11 - 2017-07-23 - fix MinGW compilation -// 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory -// 1.09 - 2016-04-04 - back out 'truncation of last frame' fix from previous version -// 1.08 - 2016-04-02 - warnings; setup memory leaks; truncation of last frame -// 1.07 - 2015-01-16 - fixes for crashes on invalid files; warning fixes; const -// 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson) -// some crash fixes when out of memory or with corrupt files -// fix some inappropriately signed shifts -// 1.05 - 2015-04-19 - don't define __forceinline if it's redundant -// 1.04 - 2014-08-27 - fix missing const-correct case in API -// 1.03 - 2014-08-07 - warning fixes -// 1.02 - 2014-07-09 - declare qsort comparison as explicitly _cdecl in Windows -// 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float (interleaved was correct) -// 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in >2-channel; -// (API change) report sample rate for decode-full-file funcs -// -// See end of file for full version history. - - -////////////////////////////////////////////////////////////////////////////// -// -// HEADER BEGINS HERE -// - -#ifndef STB_VORBIS_INCLUDE_STB_VORBIS_H -#define STB_VORBIS_INCLUDE_STB_VORBIS_H - -#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) -#define STB_VORBIS_NO_STDIO 1 -#endif - -#ifndef STB_VORBIS_NO_STDIO -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/////////// THREAD SAFETY - -// Individual stb_vorbis* handles are not thread-safe; you cannot decode from -// them from multiple threads at the same time. However, you can have multiple -// stb_vorbis* handles and decode from them independently in multiple thrads. - - -/////////// MEMORY ALLOCATION - -// normally stb_vorbis uses malloc() to allocate memory at startup, -// and alloca() to allocate temporary memory during a frame on the -// stack. (Memory consumption will depend on the amount of setup -// data in the file and how you set the compile flags for speed -// vs. size. In my test files the maximal-size usage is ~150KB.) -// -// You can modify the wrapper functions in the source (setup_malloc, -// setup_temp_malloc, temp_malloc) to change this behavior, or you -// can use a simpler allocation model: you pass in a buffer from -// which stb_vorbis will allocate _all_ its memory (including the -// temp memory). "open" may fail with a VORBIS_outofmem if you -// do not pass in enough data; there is no way to determine how -// much you do need except to succeed (at which point you can -// query get_info to find the exact amount required. yes I know -// this is lame). -// -// If you pass in a non-NULL buffer of the type below, allocation -// will occur from it as described above. Otherwise just pass NULL -// to use malloc()/alloca() - -typedef struct -{ - char *alloc_buffer; - int alloc_buffer_length_in_bytes; -} stb_vorbis_alloc; - - -/////////// FUNCTIONS USEABLE WITH ALL INPUT MODES - -typedef struct stb_vorbis stb_vorbis; - -typedef struct -{ - unsigned int sample_rate; - int channels; - - unsigned int setup_memory_required; - unsigned int setup_temp_memory_required; - unsigned int temp_memory_required; - - int max_frame_size; -} stb_vorbis_info; - -typedef struct -{ - char *vendor; - - int comment_list_length; - char **comment_list; -} stb_vorbis_comment; - -// get general information about the file -extern stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f); - -// get ogg comments -extern stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f); - -// get the last error detected (clears it, too) -extern int stb_vorbis_get_error(stb_vorbis *f); - -// close an ogg vorbis file and free all memory in use -extern void stb_vorbis_close(stb_vorbis *f); - -// this function returns the offset (in samples) from the beginning of the -// file that will be returned by the next decode, if it is known, or -1 -// otherwise. after a flush_pushdata() call, this may take a while before -// it becomes valid again. -// NOT WORKING YET after a seek with PULLDATA API -extern int stb_vorbis_get_sample_offset(stb_vorbis *f); - -// returns the current seek point within the file, or offset from the beginning -// of the memory buffer. In pushdata mode it returns 0. -extern unsigned int stb_vorbis_get_file_offset(stb_vorbis *f); - -/////////// PUSHDATA API - -#ifndef STB_VORBIS_NO_PUSHDATA_API - -// this API allows you to get blocks of data from any source and hand -// them to stb_vorbis. you have to buffer them; stb_vorbis will tell -// you how much it used, and you have to give it the rest next time; -// and stb_vorbis may not have enough data to work with and you will -// need to give it the same data again PLUS more. Note that the Vorbis -// specification does not bound the size of an individual frame. - -extern stb_vorbis *stb_vorbis_open_pushdata( - const unsigned char * datablock, int datablock_length_in_bytes, - int *datablock_memory_consumed_in_bytes, - int *error, - const stb_vorbis_alloc *alloc_buffer); -// create a vorbis decoder by passing in the initial data block containing -// the ogg&vorbis headers (you don't need to do parse them, just provide -// the first N bytes of the file--you're told if it's not enough, see below) -// on success, returns an stb_vorbis *, does not set error, returns the amount of -// data parsed/consumed on this call in *datablock_memory_consumed_in_bytes; -// on failure, returns NULL on error and sets *error, does not change *datablock_memory_consumed -// if returns NULL and *error is VORBIS_need_more_data, then the input block was -// incomplete and you need to pass in a larger block from the start of the file - -extern int stb_vorbis_decode_frame_pushdata( - stb_vorbis *f, - const unsigned char *datablock, int datablock_length_in_bytes, - int *channels, // place to write number of float * buffers - float ***output, // place to write float ** array of float * buffers - int *samples // place to write number of output samples - ); -// decode a frame of audio sample data if possible from the passed-in data block -// -// return value: number of bytes we used from datablock -// -// possible cases: -// 0 bytes used, 0 samples output (need more data) -// N bytes used, 0 samples output (resynching the stream, keep going) -// N bytes used, M samples output (one frame of data) -// note that after opening a file, you will ALWAYS get one N-bytes,0-sample -// frame, because Vorbis always "discards" the first frame. -// -// Note that on resynch, stb_vorbis will rarely consume all of the buffer, -// instead only datablock_length_in_bytes-3 or less. This is because it wants -// to avoid missing parts of a page header if they cross a datablock boundary, -// without writing state-machiney code to record a partial detection. -// -// The number of channels returned are stored in *channels (which can be -// NULL--it is always the same as the number of channels reported by -// get_info). *output will contain an array of float* buffers, one per -// channel. In other words, (*output)[0][0] contains the first sample from -// the first channel, and (*output)[1][0] contains the first sample from -// the second channel. -// -// *output points into stb_vorbis's internal output buffer storage; these -// buffers are owned by stb_vorbis and application code should not free -// them or modify their contents. They are transient and will be overwritten -// once you ask for more data to get decoded, so be sure to grab any data -// you need before then. - -extern void stb_vorbis_flush_pushdata(stb_vorbis *f); -// inform stb_vorbis that your next datablock will not be contiguous with -// previous ones (e.g. you've seeked in the data); future attempts to decode -// frames will cause stb_vorbis to resynchronize (as noted above), and -// once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it -// will begin decoding the _next_ frame. -// -// if you want to seek using pushdata, you need to seek in your file, then -// call stb_vorbis_flush_pushdata(), then start calling decoding, then once -// decoding is returning you data, call stb_vorbis_get_sample_offset, and -// if you don't like the result, seek your file again and repeat. -#endif - - -////////// PULLING INPUT API - -#ifndef STB_VORBIS_NO_PULLDATA_API -// This API assumes stb_vorbis is allowed to pull data from a source-- -// either a block of memory containing the _entire_ vorbis stream, or a -// FILE * that you or it create, or possibly some other reading mechanism -// if you go modify the source to replace the FILE * case with some kind -// of callback to your code. (But if you don't support seeking, you may -// just want to go ahead and use pushdata.) - -#if !defined(STB_VORBIS_NO_STDIO) && !defined(STB_VORBIS_NO_INTEGER_CONVERSION) -extern int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output); -#endif -#if !defined(STB_VORBIS_NO_INTEGER_CONVERSION) -extern int stb_vorbis_decode_memory(const unsigned char *mem, int len, int *channels, int *sample_rate, short **output); -#endif -// decode an entire file and output the data interleaved into a malloc()ed -// buffer stored in *output. The return value is the number of samples -// decoded, or -1 if the file could not be opened or was not an ogg vorbis file. -// When you're done with it, just free() the pointer returned in *output. - -extern stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len, - int *error, const stb_vorbis_alloc *alloc_buffer); -// create an ogg vorbis decoder from an ogg vorbis stream in memory (note -// this must be the entire stream!). on failure, returns NULL and sets *error - -#ifndef STB_VORBIS_NO_STDIO -extern stb_vorbis * stb_vorbis_open_filename(const char *filename, - int *error, const stb_vorbis_alloc *alloc_buffer); -// create an ogg vorbis decoder from a filename via fopen(). on failure, -// returns NULL and sets *error (possibly to VORBIS_file_open_failure). - -extern stb_vorbis * stb_vorbis_open_file(FILE *f, int close_handle_on_close, - int *error, const stb_vorbis_alloc *alloc_buffer); -// create an ogg vorbis decoder from an open FILE *, looking for a stream at -// the _current_ seek point (ftell). on failure, returns NULL and sets *error. -// note that stb_vorbis must "own" this stream; if you seek it in between -// calls to stb_vorbis, it will become confused. Moreover, if you attempt to -// perform stb_vorbis_seek_*() operations on this file, it will assume it -// owns the _entire_ rest of the file after the start point. Use the next -// function, stb_vorbis_open_file_section(), to limit it. - -extern stb_vorbis * stb_vorbis_open_file_section(FILE *f, int close_handle_on_close, - int *error, const stb_vorbis_alloc *alloc_buffer, unsigned int len); -// create an ogg vorbis decoder from an open FILE *, looking for a stream at -// the _current_ seek point (ftell); the stream will be of length 'len' bytes. -// on failure, returns NULL and sets *error. note that stb_vorbis must "own" -// this stream; if you seek it in between calls to stb_vorbis, it will become -// confused. -#endif - -extern int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number); -extern int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number); -// these functions seek in the Vorbis file to (approximately) 'sample_number'. -// after calling seek_frame(), the next call to get_frame_*() will include -// the specified sample. after calling stb_vorbis_seek(), the next call to -// stb_vorbis_get_samples_* will start with the specified sample. If you -// do not need to seek to EXACTLY the target sample when using get_samples_*, -// you can also use seek_frame(). - -extern int stb_vorbis_seek_start(stb_vorbis *f); -// this function is equivalent to stb_vorbis_seek(f,0) - -extern unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f); -extern float stb_vorbis_stream_length_in_seconds(stb_vorbis *f); -// these functions return the total length of the vorbis stream - -extern int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output); -// decode the next frame and return the number of samples. the number of -// channels returned are stored in *channels (which can be NULL--it is always -// the same as the number of channels reported by get_info). *output will -// contain an array of float* buffers, one per channel. These outputs will -// be overwritten on the next call to stb_vorbis_get_frame_*. -// -// You generally should not intermix calls to stb_vorbis_get_frame_*() -// and stb_vorbis_get_samples_*(), since the latter calls the former. - -#ifndef STB_VORBIS_NO_INTEGER_CONVERSION -extern int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts); -extern int stb_vorbis_get_frame_short (stb_vorbis *f, int num_c, short **buffer, int num_samples); -#endif -// decode the next frame and return the number of *samples* per channel. -// Note that for interleaved data, you pass in the number of shorts (the -// size of your array), but the return value is the number of samples per -// channel, not the total number of samples. -// -// The data is coerced to the number of channels you request according to the -// channel coercion rules (see below). You must pass in the size of your -// buffer(s) so that stb_vorbis will not overwrite the end of the buffer. -// The maximum buffer size needed can be gotten from get_info(); however, -// the Vorbis I specification implies an absolute maximum of 4096 samples -// per channel. - -// Channel coercion rules: -// Let M be the number of channels requested, and N the number of channels present, -// and Cn be the nth channel; let stereo L be the sum of all L and center channels, -// and stereo R be the sum of all R and center channels (channel assignment from the -// vorbis spec). -// M N output -// 1 k sum(Ck) for all k -// 2 * stereo L, stereo R -// k l k > l, the first l channels, then 0s -// k l k <= l, the first k channels -// Note that this is not _good_ surround etc. mixing at all! It's just so -// you get something useful. - -extern int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats); -extern int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples); -// gets num_samples samples, not necessarily on a frame boundary--this requires -// buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES. -// Returns the number of samples stored per channel; it may be less than requested -// at the end of the file. If there are no more samples in the file, returns 0. - -#ifndef STB_VORBIS_NO_INTEGER_CONVERSION -extern int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts); -extern int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int num_samples); -#endif -// gets num_samples samples, not necessarily on a frame boundary--this requires -// buffering so you have to supply the buffers. Applies the coercion rules above -// to produce 'channels' channels. Returns the number of samples stored per channel; -// it may be less than requested at the end of the file. If there are no more -// samples in the file, returns 0. - -#endif - -//////// ERROR CODES - -enum STBVorbisError -{ - VORBIS__no_error, - - VORBIS_need_more_data=1, // not a real error - - VORBIS_invalid_api_mixing, // can't mix API modes - VORBIS_outofmem, // not enough memory - VORBIS_feature_not_supported, // uses floor 0 - VORBIS_too_many_channels, // STB_VORBIS_MAX_CHANNELS is too small - VORBIS_file_open_failure, // fopen() failed - VORBIS_seek_without_length, // can't seek in unknown-length file - - VORBIS_unexpected_eof=10, // file is truncated? - VORBIS_seek_invalid, // seek past EOF - - // decoding errors (corrupt/invalid stream) -- you probably - // don't care about the exact details of these - - // vorbis errors: - VORBIS_invalid_setup=20, - VORBIS_invalid_stream, - - // ogg errors: - VORBIS_missing_capture_pattern=30, - VORBIS_invalid_stream_structure_version, - VORBIS_continued_packet_flag_invalid, - VORBIS_incorrect_stream_serial_number, - VORBIS_invalid_first_page, - VORBIS_bad_packet_type, - VORBIS_cant_find_last_page, - VORBIS_seek_failed, - VORBIS_ogg_skeleton_not_supported -}; - - -#ifdef __cplusplus -} -#endif - -#endif // STB_VORBIS_INCLUDE_STB_VORBIS_H -// -// HEADER ENDS HERE -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef STB_VORBIS_HEADER_ONLY - -// global configuration settings (e.g. set these in the project/makefile), -// or just set them in this file at the top (although ideally the first few -// should be visible when the header file is compiled too, although it's not -// crucial) - -// STB_VORBIS_NO_PUSHDATA_API -// does not compile the code for the various stb_vorbis_*_pushdata() -// functions -// #define STB_VORBIS_NO_PUSHDATA_API - -// STB_VORBIS_NO_PULLDATA_API -// does not compile the code for the non-pushdata APIs -// #define STB_VORBIS_NO_PULLDATA_API - -// STB_VORBIS_NO_STDIO -// does not compile the code for the APIs that use FILE *s internally -// or externally (implied by STB_VORBIS_NO_PULLDATA_API) -// #define STB_VORBIS_NO_STDIO - -// STB_VORBIS_NO_INTEGER_CONVERSION -// does not compile the code for converting audio sample data from -// float to integer (implied by STB_VORBIS_NO_PULLDATA_API) -// #define STB_VORBIS_NO_INTEGER_CONVERSION - -// STB_VORBIS_NO_FAST_SCALED_FLOAT -// does not use a fast float-to-int trick to accelerate float-to-int on -// most platforms which requires endianness be defined correctly. -//#define STB_VORBIS_NO_FAST_SCALED_FLOAT - - -// STB_VORBIS_MAX_CHANNELS [number] -// globally define this to the maximum number of channels you need. -// The spec does not put a restriction on channels except that -// the count is stored in a byte, so 255 is the hard limit. -// Reducing this saves about 16 bytes per value, so using 16 saves -// (255-16)*16 or around 4KB. Plus anything other memory usage -// I forgot to account for. Can probably go as low as 8 (7.1 audio), -// 6 (5.1 audio), or 2 (stereo only). -#ifndef STB_VORBIS_MAX_CHANNELS -#define STB_VORBIS_MAX_CHANNELS 16 // enough for anyone? -#endif - -// STB_VORBIS_PUSHDATA_CRC_COUNT [number] -// after a flush_pushdata(), stb_vorbis begins scanning for the -// next valid page, without backtracking. when it finds something -// that looks like a page, it streams through it and verifies its -// CRC32. Should that validation fail, it keeps scanning. But it's -// possible that _while_ streaming through to check the CRC32 of -// one candidate page, it sees another candidate page. This #define -// determines how many "overlapping" candidate pages it can search -// at once. Note that "real" pages are typically ~4KB to ~8KB, whereas -// garbage pages could be as big as 64KB, but probably average ~16KB. -// So don't hose ourselves by scanning an apparent 64KB page and -// missing a ton of real ones in the interim; so minimum of 2 -#ifndef STB_VORBIS_PUSHDATA_CRC_COUNT -#define STB_VORBIS_PUSHDATA_CRC_COUNT 4 -#endif - -// STB_VORBIS_FAST_HUFFMAN_LENGTH [number] -// sets the log size of the huffman-acceleration table. Maximum -// supported value is 24. with larger numbers, more decodings are O(1), -// but the table size is larger so worse cache missing, so you'll have -// to probe (and try multiple ogg vorbis files) to find the sweet spot. -#ifndef STB_VORBIS_FAST_HUFFMAN_LENGTH -#define STB_VORBIS_FAST_HUFFMAN_LENGTH 10 -#endif - -// STB_VORBIS_FAST_BINARY_LENGTH [number] -// sets the log size of the binary-search acceleration table. this -// is used in similar fashion to the fast-huffman size to set initial -// parameters for the binary search - -// STB_VORBIS_FAST_HUFFMAN_INT -// The fast huffman tables are much more efficient if they can be -// stored as 16-bit results instead of 32-bit results. This restricts -// the codebooks to having only 65535 possible outcomes, though. -// (At least, accelerated by the huffman table.) -#ifndef STB_VORBIS_FAST_HUFFMAN_INT -#define STB_VORBIS_FAST_HUFFMAN_SHORT -#endif - -// STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH -// If the 'fast huffman' search doesn't succeed, then stb_vorbis falls -// back on binary searching for the correct one. This requires storing -// extra tables with the huffman codes in sorted order. Defining this -// symbol trades off space for speed by forcing a linear search in the -// non-fast case, except for "sparse" codebooks. -// #define STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH - -// STB_VORBIS_DIVIDES_IN_RESIDUE -// stb_vorbis precomputes the result of the scalar residue decoding -// that would otherwise require a divide per chunk. you can trade off -// space for time by defining this symbol. -// #define STB_VORBIS_DIVIDES_IN_RESIDUE - -// STB_VORBIS_DIVIDES_IN_CODEBOOK -// vorbis VQ codebooks can be encoded two ways: with every case explicitly -// stored, or with all elements being chosen from a small range of values, -// and all values possible in all elements. By default, stb_vorbis expands -// this latter kind out to look like the former kind for ease of decoding, -// because otherwise an integer divide-per-vector-element is required to -// unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can -// trade off storage for speed. -//#define STB_VORBIS_DIVIDES_IN_CODEBOOK - -#ifdef STB_VORBIS_CODEBOOK_SHORTS -#error "STB_VORBIS_CODEBOOK_SHORTS is no longer supported as it produced incorrect results for some input formats" -#endif - -// STB_VORBIS_DIVIDE_TABLE -// this replaces small integer divides in the floor decode loop with -// table lookups. made less than 1% difference, so disabled by default. - -// STB_VORBIS_NO_INLINE_DECODE -// disables the inlining of the scalar codebook fast-huffman decode. -// might save a little codespace; useful for debugging -// #define STB_VORBIS_NO_INLINE_DECODE - -// STB_VORBIS_NO_DEFER_FLOOR -// Normally we only decode the floor without synthesizing the actual -// full curve. We can instead synthesize the curve immediately. This -// requires more memory and is very likely slower, so I don't think -// you'd ever want to do it except for debugging. -// #define STB_VORBIS_NO_DEFER_FLOOR - - - - -////////////////////////////////////////////////////////////////////////////// - -#ifdef STB_VORBIS_NO_PULLDATA_API - #define STB_VORBIS_NO_INTEGER_CONVERSION - #define STB_VORBIS_NO_STDIO -#endif - -#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) - #define STB_VORBIS_NO_STDIO 1 -#endif - -#ifndef STB_VORBIS_NO_INTEGER_CONVERSION -#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT - - // only need endianness for fast-float-to-int, which we don't - // use for pushdata - - #ifndef STB_VORBIS_BIG_ENDIAN - #define STB_VORBIS_ENDIAN 0 - #else - #define STB_VORBIS_ENDIAN 1 - #endif - -#endif -#endif - - -#ifndef STB_VORBIS_NO_STDIO -#include -#endif - -#ifndef STB_VORBIS_NO_CRT - #include - #include - #include - #include - - // find definition of alloca if it's not in stdlib.h: - #if defined(_MSC_VER) || defined(__MINGW32__) - #include - #endif - #if defined(__linux__) || defined(__linux) || defined(__sun__) || defined(__EMSCRIPTEN__) || defined(__NEWLIB__) - #include - #endif -#else // STB_VORBIS_NO_CRT - #define NULL 0 - #define malloc(s) 0 - #define free(s) ((void) 0) - #define realloc(s) 0 -#endif // STB_VORBIS_NO_CRT - -#include - -#ifdef __MINGW32__ - // eff you mingw: - // "fixed": - // http://sourceforge.net/p/mingw-w64/mailman/message/32882927/ - // "no that broke the build, reverted, who cares about C": - // http://sourceforge.net/p/mingw-w64/mailman/message/32890381/ - #ifdef __forceinline - #undef __forceinline - #endif - #define __forceinline - #ifndef alloca - #define alloca __builtin_alloca - #endif -#elif !defined(_MSC_VER) - #if __GNUC__ - #define __forceinline inline - #else - #define __forceinline - #endif -#endif - -#if STB_VORBIS_MAX_CHANNELS > 256 -#error "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range" -#endif - -#if STB_VORBIS_FAST_HUFFMAN_LENGTH > 24 -#error "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range" -#endif - - -#if 0 -#include -#define CHECK(f) _CrtIsValidHeapPointer(f->channel_buffers[1]) -#else -#define CHECK(f) ((void) 0) -#endif - -#define MAX_BLOCKSIZE_LOG 13 // from specification -#define MAX_BLOCKSIZE (1 << MAX_BLOCKSIZE_LOG) - - -typedef unsigned char uint8; -typedef signed char int8; -typedef unsigned short uint16; -typedef signed short int16; -typedef unsigned int uint32; -typedef signed int int32; - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -typedef float codetype; - -#ifdef _MSC_VER -#define STBV_NOTUSED(v) (void)(v) -#else -#define STBV_NOTUSED(v) (void)sizeof(v) -#endif - -// @NOTE -// -// Some arrays below are tagged "//varies", which means it's actually -// a variable-sized piece of data, but rather than malloc I assume it's -// small enough it's better to just allocate it all together with the -// main thing -// -// Most of the variables are specified with the smallest size I could pack -// them into. It might give better performance to make them all full-sized -// integers. It should be safe to freely rearrange the structures or change -// the sizes larger--nothing relies on silently truncating etc., nor the -// order of variables. - -#define FAST_HUFFMAN_TABLE_SIZE (1 << STB_VORBIS_FAST_HUFFMAN_LENGTH) -#define FAST_HUFFMAN_TABLE_MASK (FAST_HUFFMAN_TABLE_SIZE - 1) - -typedef struct -{ - int dimensions, entries; - uint8 *codeword_lengths; - float minimum_value; - float delta_value; - uint8 value_bits; - uint8 lookup_type; - uint8 sequence_p; - uint8 sparse; - uint32 lookup_values; - codetype *multiplicands; - uint32 *codewords; - #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT - int16 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; - #else - int32 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; - #endif - uint32 *sorted_codewords; - int *sorted_values; - int sorted_entries; -} Codebook; - -typedef struct -{ - uint8 order; - uint16 rate; - uint16 bark_map_size; - uint8 amplitude_bits; - uint8 amplitude_offset; - uint8 number_of_books; - uint8 book_list[16]; // varies -} Floor0; - -typedef struct -{ - uint8 partitions; - uint8 partition_class_list[32]; // varies - uint8 class_dimensions[16]; // varies - uint8 class_subclasses[16]; // varies - uint8 class_masterbooks[16]; // varies - int16 subclass_books[16][8]; // varies - uint16 Xlist[31*8+2]; // varies - uint8 sorted_order[31*8+2]; - uint8 neighbors[31*8+2][2]; - uint8 floor1_multiplier; - uint8 rangebits; - int values; -} Floor1; - -typedef union -{ - Floor0 floor0; - Floor1 floor1; -} Floor; - -typedef struct -{ - uint32 begin, end; - uint32 part_size; - uint8 classifications; - uint8 classbook; - uint8 **classdata; - int16 (*residue_books)[8]; -} Residue; - -typedef struct -{ - uint8 magnitude; - uint8 angle; - uint8 mux; -} MappingChannel; - -typedef struct -{ - uint16 coupling_steps; - MappingChannel *chan; - uint8 submaps; - uint8 submap_floor[15]; // varies - uint8 submap_residue[15]; // varies -} Mapping; - -typedef struct -{ - uint8 blockflag; - uint8 mapping; - uint16 windowtype; - uint16 transformtype; -} Mode; - -typedef struct -{ - uint32 goal_crc; // expected crc if match - int bytes_left; // bytes left in packet - uint32 crc_so_far; // running crc - int bytes_done; // bytes processed in _current_ chunk - uint32 sample_loc; // granule pos encoded in page -} CRCscan; - -typedef struct -{ - uint32 page_start, page_end; - uint32 last_decoded_sample; -} ProbedPage; - -struct stb_vorbis -{ - // user-accessible info - unsigned int sample_rate; - int channels; - - unsigned int setup_memory_required; - unsigned int temp_memory_required; - unsigned int setup_temp_memory_required; - - char *vendor; - int comment_list_length; - char **comment_list; - - // input config -#ifndef STB_VORBIS_NO_STDIO - FILE *f; - uint32 f_start; - int close_on_free; -#endif - - uint8 *stream; - uint8 *stream_start; - uint8 *stream_end; - - uint32 stream_len; - - uint8 push_mode; - - // the page to seek to when seeking to start, may be zero - uint32 first_audio_page_offset; - - // p_first is the page on which the first audio packet ends - // (but not necessarily the page on which it starts) - ProbedPage p_first, p_last; - - // memory management - stb_vorbis_alloc alloc; - int setup_offset; - int temp_offset; - - // run-time results - int eof; - enum STBVorbisError error; - - // user-useful data - - // header info - int blocksize[2]; - int blocksize_0, blocksize_1; - int codebook_count; - Codebook *codebooks; - int floor_count; - uint16 floor_types[64]; // varies - Floor *floor_config; - int residue_count; - uint16 residue_types[64]; // varies - Residue *residue_config; - int mapping_count; - Mapping *mapping; - int mode_count; - Mode mode_config[64]; // varies - - uint32 total_samples; - - // decode buffer - float *channel_buffers[STB_VORBIS_MAX_CHANNELS]; - float *outputs [STB_VORBIS_MAX_CHANNELS]; - - float *previous_window[STB_VORBIS_MAX_CHANNELS]; - int previous_length; - - #ifndef STB_VORBIS_NO_DEFER_FLOOR - int16 *finalY[STB_VORBIS_MAX_CHANNELS]; - #else - float *floor_buffers[STB_VORBIS_MAX_CHANNELS]; - #endif - - uint32 current_loc; // sample location of next frame to decode - int current_loc_valid; - - // per-blocksize precomputed data - - // twiddle factors - float *A[2],*B[2],*C[2]; - float *window[2]; - uint16 *bit_reverse[2]; - - // current page/packet/segment streaming info - uint32 serial; // stream serial number for verification - int last_page; - int segment_count; - uint8 segments[255]; - uint8 page_flag; - uint8 bytes_in_seg; - uint8 first_decode; - int next_seg; - int last_seg; // flag that we're on the last segment - int last_seg_which; // what was the segment number of the last seg? - uint32 acc; - int valid_bits; - int packet_bytes; - int end_seg_with_known_loc; - uint32 known_loc_for_packet; - int discard_samples_deferred; - uint32 samples_output; - - // push mode scanning - int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching -#ifndef STB_VORBIS_NO_PUSHDATA_API - CRCscan scan[STB_VORBIS_PUSHDATA_CRC_COUNT]; -#endif - - // sample-access - int channel_buffer_start; - int channel_buffer_end; -}; - -#if defined(STB_VORBIS_NO_PUSHDATA_API) - #define IS_PUSH_MODE(f) FALSE -#elif defined(STB_VORBIS_NO_PULLDATA_API) - #define IS_PUSH_MODE(f) TRUE -#else - #define IS_PUSH_MODE(f) ((f)->push_mode) -#endif - -typedef struct stb_vorbis vorb; - -static int error(vorb *f, enum STBVorbisError e) -{ - f->error = e; - if (!f->eof && e != VORBIS_need_more_data) { - f->error=e; // breakpoint for debugging - } - return 0; -} - - -// these functions are used for allocating temporary memory -// while decoding. if you can afford the stack space, use -// alloca(); otherwise, provide a temp buffer and it will -// allocate out of those. - -#define array_size_required(count,size) (count*(sizeof(void *)+(size))) - -#define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size)) -#define temp_free(f,p) (void)0 -#define temp_alloc_save(f) ((f)->temp_offset) -#define temp_alloc_restore(f,p) ((f)->temp_offset = (p)) - -#define temp_block_array(f,count,size) make_block_array(temp_alloc(f,array_size_required(count,size)), count, size) - -// given a sufficiently large block of memory, make an array of pointers to subblocks of it -static void *make_block_array(void *mem, int count, int size) -{ - int i; - void ** p = (void **) mem; - char *q = (char *) (p + count); - for (i=0; i < count; ++i) { - p[i] = q; - q += size; - } - return p; -} - -static void *setup_malloc(vorb *f, int sz) -{ - sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs. - f->setup_memory_required += sz; - if (f->alloc.alloc_buffer) { - void *p = (char *) f->alloc.alloc_buffer + f->setup_offset; - if (f->setup_offset + sz > f->temp_offset) return NULL; - f->setup_offset += sz; - return p; - } - return sz ? malloc(sz) : NULL; -} - -static void setup_free(vorb *f, void *p) -{ - if (f->alloc.alloc_buffer) return; // do nothing; setup mem is a stack - free(p); -} - -static void *setup_temp_malloc(vorb *f, int sz) -{ - sz = (sz+7) & ~7; // round up to nearest 8 for alignment of future allocs. - if (f->alloc.alloc_buffer) { - if (f->temp_offset - sz < f->setup_offset) return NULL; - f->temp_offset -= sz; - return (char *) f->alloc.alloc_buffer + f->temp_offset; - } - return malloc(sz); -} - -static void setup_temp_free(vorb *f, void *p, int sz) -{ - if (f->alloc.alloc_buffer) { - f->temp_offset += (sz+7)&~7; - return; - } - free(p); -} - -#define CRC32_POLY 0x04c11db7 // from spec - -static uint32 crc_table[256]; -static void crc32_init(void) -{ - int i,j; - uint32 s; - for(i=0; i < 256; i++) { - for (s=(uint32) i << 24, j=0; j < 8; ++j) - s = (s << 1) ^ (s >= (1U<<31) ? CRC32_POLY : 0); - crc_table[i] = s; - } -} - -static __forceinline uint32 crc32_update(uint32 crc, uint8 byte) -{ - return (crc << 8) ^ crc_table[byte ^ (crc >> 24)]; -} - - -// used in setup, and for huffman that doesn't go fast path -static unsigned int bit_reverse(unsigned int n) -{ - n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); - n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); - n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); - n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); - return (n >> 16) | (n << 16); -} - -static float square(float x) -{ - return x*x; -} - -// this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3 -// as required by the specification. fast(?) implementation from stb.h -// @OPTIMIZE: called multiple times per-packet with "constants"; move to setup -static int ilog(int32 n) -{ - static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; - - if (n < 0) return 0; // signed n returns 0 - - // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29) - if (n < (1 << 14)) - if (n < (1 << 4)) return 0 + log2_4[n ]; - else if (n < (1 << 9)) return 5 + log2_4[n >> 5]; - else return 10 + log2_4[n >> 10]; - else if (n < (1 << 24)) - if (n < (1 << 19)) return 15 + log2_4[n >> 15]; - else return 20 + log2_4[n >> 20]; - else if (n < (1 << 29)) return 25 + log2_4[n >> 25]; - else return 30 + log2_4[n >> 30]; -} - -#ifndef M_PI - #define M_PI 3.14159265358979323846264f // from CRC -#endif - -// code length assigned to a value with no huffman encoding -#define NO_CODE 255 - -/////////////////////// LEAF SETUP FUNCTIONS ////////////////////////// -// -// these functions are only called at setup, and only a few times -// per file - -static float float32_unpack(uint32 x) -{ - // from the specification - uint32 mantissa = x & 0x1fffff; - uint32 sign = x & 0x80000000; - uint32 exp = (x & 0x7fe00000) >> 21; - double res = sign ? -(double)mantissa : (double)mantissa; - return (float) ldexp((float)res, (int)exp-788); -} - - -// zlib & jpeg huffman tables assume that the output symbols -// can either be arbitrarily arranged, or have monotonically -// increasing frequencies--they rely on the lengths being sorted; -// this makes for a very simple generation algorithm. -// vorbis allows a huffman table with non-sorted lengths. This -// requires a more sophisticated construction, since symbols in -// order do not map to huffman codes "in order". -static void add_entry(Codebook *c, uint32 huff_code, int symbol, int count, int len, uint32 *values) -{ - if (!c->sparse) { - c->codewords [symbol] = huff_code; - } else { - c->codewords [count] = huff_code; - c->codeword_lengths[count] = len; - values [count] = symbol; - } -} - -static int compute_codewords(Codebook *c, uint8 *len, int n, uint32 *values) -{ - int i,k,m=0; - uint32 available[32]; - - memset(available, 0, sizeof(available)); - // find the first entry - for (k=0; k < n; ++k) if (len[k] < NO_CODE) break; - if (k == n) { assert(c->sorted_entries == 0); return TRUE; } - assert(len[k] < 32); // no error return required, code reading lens checks this - // add to the list - add_entry(c, 0, k, m++, len[k], values); - // add all available leaves - for (i=1; i <= len[k]; ++i) - available[i] = 1U << (32-i); - // note that the above code treats the first case specially, - // but it's really the same as the following code, so they - // could probably be combined (except the initial code is 0, - // and I use 0 in available[] to mean 'empty') - for (i=k+1; i < n; ++i) { - uint32 res; - int z = len[i], y; - if (z == NO_CODE) continue; - assert(z < 32); // no error return required, code reading lens checks this - // find lowest available leaf (should always be earliest, - // which is what the specification calls for) - // note that this property, and the fact we can never have - // more than one free leaf at a given level, isn't totally - // trivial to prove, but it seems true and the assert never - // fires, so! - while (z > 0 && !available[z]) --z; - if (z == 0) { return FALSE; } - res = available[z]; - available[z] = 0; - add_entry(c, bit_reverse(res), i, m++, len[i], values); - // propagate availability up the tree - if (z != len[i]) { - for (y=len[i]; y > z; --y) { - assert(available[y] == 0); - available[y] = res + (1 << (32-y)); - } - } - } - return TRUE; -} - -// accelerated huffman table allows fast O(1) match of all symbols -// of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH -static void compute_accelerated_huffman(Codebook *c) -{ - int i, len; - for (i=0; i < FAST_HUFFMAN_TABLE_SIZE; ++i) - c->fast_huffman[i] = -1; - - len = c->sparse ? c->sorted_entries : c->entries; - #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT - if (len > 32767) len = 32767; // largest possible value we can encode! - #endif - for (i=0; i < len; ++i) { - if (c->codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) { - uint32 z = c->sparse ? bit_reverse(c->sorted_codewords[i]) : c->codewords[i]; - // set table entries for all bit combinations in the higher bits - while (z < FAST_HUFFMAN_TABLE_SIZE) { - c->fast_huffman[z] = i; - z += 1 << c->codeword_lengths[i]; - } - } - } -} - -#ifdef _MSC_VER -#define STBV_CDECL __cdecl -#else -#define STBV_CDECL -#endif - -static int STBV_CDECL uint32_compare(const void *p, const void *q) -{ - uint32 x = * (uint32 *) p; - uint32 y = * (uint32 *) q; - return x < y ? -1 : x > y; -} - -static int include_in_sort(Codebook *c, uint8 len) -{ - if (c->sparse) { assert(len != NO_CODE); return TRUE; } - if (len == NO_CODE) return FALSE; - if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return TRUE; - return FALSE; -} - -// if the fast table above doesn't work, we want to binary -// search them... need to reverse the bits -static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values) -{ - int i, len; - // build a list of all the entries - // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN. - // this is kind of a frivolous optimization--I don't see any performance improvement, - // but it's like 4 extra lines of code, so. - if (!c->sparse) { - int k = 0; - for (i=0; i < c->entries; ++i) - if (include_in_sort(c, lengths[i])) - c->sorted_codewords[k++] = bit_reverse(c->codewords[i]); - assert(k == c->sorted_entries); - } else { - for (i=0; i < c->sorted_entries; ++i) - c->sorted_codewords[i] = bit_reverse(c->codewords[i]); - } - - qsort(c->sorted_codewords, c->sorted_entries, sizeof(c->sorted_codewords[0]), uint32_compare); - c->sorted_codewords[c->sorted_entries] = 0xffffffff; - - len = c->sparse ? c->sorted_entries : c->entries; - // now we need to indicate how they correspond; we could either - // #1: sort a different data structure that says who they correspond to - // #2: for each sorted entry, search the original list to find who corresponds - // #3: for each original entry, find the sorted entry - // #1 requires extra storage, #2 is slow, #3 can use binary search! - for (i=0; i < len; ++i) { - int huff_len = c->sparse ? lengths[values[i]] : lengths[i]; - if (include_in_sort(c,huff_len)) { - uint32 code = bit_reverse(c->codewords[i]); - int x=0, n=c->sorted_entries; - while (n > 1) { - // invariant: sc[x] <= code < sc[x+n] - int m = x + (n >> 1); - if (c->sorted_codewords[m] <= code) { - x = m; - n -= (n>>1); - } else { - n >>= 1; - } - } - assert(c->sorted_codewords[x] == code); - if (c->sparse) { - c->sorted_values[x] = values[i]; - c->codeword_lengths[x] = huff_len; - } else { - c->sorted_values[x] = i; - } - } - } -} - -// only run while parsing the header (3 times) -static int vorbis_validate(uint8 *data) -{ - static uint8 vorbis[6] = { 'v', 'o', 'r', 'b', 'i', 's' }; - return memcmp(data, vorbis, 6) == 0; -} - -// called from setup only, once per code book -// (formula implied by specification) -static int lookup1_values(int entries, int dim) -{ - int r = (int) floor(exp((float) log((float) entries) / dim)); - if ((int) floor(pow((float) r+1, dim)) <= entries) // (int) cast for MinGW warning; - ++r; // floor() to avoid _ftol() when non-CRT - if (pow((float) r+1, dim) <= entries) - return -1; - if ((int) floor(pow((float) r, dim)) > entries) - return -1; - return r; -} - -// called twice per file -static void compute_twiddle_factors(int n, float *A, float *B, float *C) -{ - int n4 = n >> 2, n8 = n >> 3; - int k,k2; - - for (k=k2=0; k < n4; ++k,k2+=2) { - A[k2 ] = (float) cos(4*k*M_PI/n); - A[k2+1] = (float) -sin(4*k*M_PI/n); - B[k2 ] = (float) cos((k2+1)*M_PI/n/2) * 0.5f; - B[k2+1] = (float) sin((k2+1)*M_PI/n/2) * 0.5f; - } - for (k=k2=0; k < n8; ++k,k2+=2) { - C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); - C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); - } -} - -static void compute_window(int n, float *window) -{ - int n2 = n >> 1, i; - for (i=0; i < n2; ++i) - window[i] = (float) sin(0.5 * M_PI * square((float) sin((i - 0 + 0.5) / n2 * 0.5 * M_PI))); -} - -static void compute_bitreverse(int n, uint16 *rev) -{ - int ld = ilog(n) - 1; // ilog is off-by-one from normal definitions - int i, n8 = n >> 3; - for (i=0; i < n8; ++i) - rev[i] = (bit_reverse(i) >> (32-ld+3)) << 2; -} - -static int init_blocksize(vorb *f, int b, int n) -{ - int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3; - f->A[b] = (float *) setup_malloc(f, sizeof(float) * n2); - f->B[b] = (float *) setup_malloc(f, sizeof(float) * n2); - f->C[b] = (float *) setup_malloc(f, sizeof(float) * n4); - if (!f->A[b] || !f->B[b] || !f->C[b]) return error(f, VORBIS_outofmem); - compute_twiddle_factors(n, f->A[b], f->B[b], f->C[b]); - f->window[b] = (float *) setup_malloc(f, sizeof(float) * n2); - if (!f->window[b]) return error(f, VORBIS_outofmem); - compute_window(n, f->window[b]); - f->bit_reverse[b] = (uint16 *) setup_malloc(f, sizeof(uint16) * n8); - if (!f->bit_reverse[b]) return error(f, VORBIS_outofmem); - compute_bitreverse(n, f->bit_reverse[b]); - return TRUE; -} - -static void neighbors(uint16 *x, int n, int *plow, int *phigh) -{ - int low = -1; - int high = 65536; - int i; - for (i=0; i < n; ++i) { - if (x[i] > low && x[i] < x[n]) { *plow = i; low = x[i]; } - if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; } - } -} - -// this has been repurposed so y is now the original index instead of y -typedef struct -{ - uint16 x,id; -} stbv__floor_ordering; - -static int STBV_CDECL point_compare(const void *p, const void *q) -{ - stbv__floor_ordering *a = (stbv__floor_ordering *) p; - stbv__floor_ordering *b = (stbv__floor_ordering *) q; - return a->x < b->x ? -1 : a->x > b->x; -} - -// -/////////////////////// END LEAF SETUP FUNCTIONS ////////////////////////// - - -#if defined(STB_VORBIS_NO_STDIO) - #define USE_MEMORY(z) TRUE -#else - #define USE_MEMORY(z) ((z)->stream) -#endif - -static uint8 get8(vorb *z) -{ - if (USE_MEMORY(z)) { - if (z->stream >= z->stream_end) { z->eof = TRUE; return 0; } - return *z->stream++; - } - - #ifndef STB_VORBIS_NO_STDIO - { - int c = fgetc(z->f); - if (c == EOF) { z->eof = TRUE; return 0; } - return c; - } - #endif -} - -static uint32 get32(vorb *f) -{ - uint32 x; - x = get8(f); - x += get8(f) << 8; - x += get8(f) << 16; - x += (uint32) get8(f) << 24; - return x; -} - -static int getn(vorb *z, uint8 *data, int n) -{ - if (USE_MEMORY(z)) { - if (z->stream+n > z->stream_end) { z->eof = 1; return 0; } - memcpy(data, z->stream, n); - z->stream += n; - return 1; - } - - #ifndef STB_VORBIS_NO_STDIO - if (fread(data, n, 1, z->f) == 1) - return 1; - else { - z->eof = 1; - return 0; - } - #endif -} - -static void skip(vorb *z, int n) -{ - if (USE_MEMORY(z)) { - z->stream += n; - if (z->stream >= z->stream_end) z->eof = 1; - return; - } - #ifndef STB_VORBIS_NO_STDIO - { - long x = ftell(z->f); - fseek(z->f, x+n, SEEK_SET); - } - #endif -} - -static int set_file_offset(stb_vorbis *f, unsigned int loc) -{ - #ifndef STB_VORBIS_NO_PUSHDATA_API - if (f->push_mode) return 0; - #endif - f->eof = 0; - if (USE_MEMORY(f)) { - if (f->stream_start + loc >= f->stream_end || f->stream_start + loc < f->stream_start) { - f->stream = f->stream_end; - f->eof = 1; - return 0; - } else { - f->stream = f->stream_start + loc; - return 1; - } - } - #ifndef STB_VORBIS_NO_STDIO - if (loc + f->f_start < loc || loc >= 0x80000000) { - loc = 0x7fffffff; - f->eof = 1; - } else { - loc += f->f_start; - } - if (!fseek(f->f, loc, SEEK_SET)) - return 1; - f->eof = 1; - fseek(f->f, f->f_start, SEEK_END); - return 0; - #endif -} - - -static uint8 ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 }; - -static int capture_pattern(vorb *f) -{ - if (0x4f != get8(f)) return FALSE; - if (0x67 != get8(f)) return FALSE; - if (0x67 != get8(f)) return FALSE; - if (0x53 != get8(f)) return FALSE; - return TRUE; -} - -#define PAGEFLAG_continued_packet 1 -#define PAGEFLAG_first_page 2 -#define PAGEFLAG_last_page 4 - -static int start_page_no_capturepattern(vorb *f) -{ - uint32 loc0,loc1,n; - if (f->first_decode && !IS_PUSH_MODE(f)) { - f->p_first.page_start = stb_vorbis_get_file_offset(f) - 4; - } - // stream structure version - if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version); - // header flag - f->page_flag = get8(f); - // absolute granule position - loc0 = get32(f); - loc1 = get32(f); - // @TODO: validate loc0,loc1 as valid positions? - // stream serial number -- vorbis doesn't interleave, so discard - get32(f); - //if (f->serial != get32(f)) return error(f, VORBIS_incorrect_stream_serial_number); - // page sequence number - n = get32(f); - f->last_page = n; - // CRC32 - get32(f); - // page_segments - f->segment_count = get8(f); - if (!getn(f, f->segments, f->segment_count)) - return error(f, VORBIS_unexpected_eof); - // assume we _don't_ know any the sample position of any segments - f->end_seg_with_known_loc = -2; - if (loc0 != ~0U || loc1 != ~0U) { - int i; - // determine which packet is the last one that will complete - for (i=f->segment_count-1; i >= 0; --i) - if (f->segments[i] < 255) - break; - // 'i' is now the index of the _last_ segment of a packet that ends - if (i >= 0) { - f->end_seg_with_known_loc = i; - f->known_loc_for_packet = loc0; - } - } - if (f->first_decode) { - int i,len; - len = 0; - for (i=0; i < f->segment_count; ++i) - len += f->segments[i]; - len += 27 + f->segment_count; - f->p_first.page_end = f->p_first.page_start + len; - f->p_first.last_decoded_sample = loc0; - } - f->next_seg = 0; - return TRUE; -} - -static int start_page(vorb *f) -{ - if (!capture_pattern(f)) return error(f, VORBIS_missing_capture_pattern); - return start_page_no_capturepattern(f); -} - -static int start_packet(vorb *f) -{ - while (f->next_seg == -1) { - if (!start_page(f)) return FALSE; - if (f->page_flag & PAGEFLAG_continued_packet) - return error(f, VORBIS_continued_packet_flag_invalid); - } - f->last_seg = FALSE; - f->valid_bits = 0; - f->packet_bytes = 0; - f->bytes_in_seg = 0; - // f->next_seg is now valid - return TRUE; -} - -static int maybe_start_packet(vorb *f) -{ - if (f->next_seg == -1) { - int x = get8(f); - if (f->eof) return FALSE; // EOF at page boundary is not an error! - if (0x4f != x ) return error(f, VORBIS_missing_capture_pattern); - if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); - if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); - if (0x53 != get8(f)) return error(f, VORBIS_missing_capture_pattern); - if (!start_page_no_capturepattern(f)) return FALSE; - if (f->page_flag & PAGEFLAG_continued_packet) { - // set up enough state that we can read this packet if we want, - // e.g. during recovery - f->last_seg = FALSE; - f->bytes_in_seg = 0; - return error(f, VORBIS_continued_packet_flag_invalid); - } - } - return start_packet(f); -} - -static int next_segment(vorb *f) -{ - int len; - if (f->last_seg) return 0; - if (f->next_seg == -1) { - f->last_seg_which = f->segment_count-1; // in case start_page fails - if (!start_page(f)) { f->last_seg = 1; return 0; } - if (!(f->page_flag & PAGEFLAG_continued_packet)) return error(f, VORBIS_continued_packet_flag_invalid); - } - len = f->segments[f->next_seg++]; - if (len < 255) { - f->last_seg = TRUE; - f->last_seg_which = f->next_seg-1; - } - if (f->next_seg >= f->segment_count) - f->next_seg = -1; - assert(f->bytes_in_seg == 0); - f->bytes_in_seg = len; - return len; -} - -#define EOP (-1) -#define INVALID_BITS (-1) - -static int get8_packet_raw(vorb *f) -{ - if (!f->bytes_in_seg) { // CLANG! - if (f->last_seg) return EOP; - else if (!next_segment(f)) return EOP; - } - assert(f->bytes_in_seg > 0); - --f->bytes_in_seg; - ++f->packet_bytes; - return get8(f); -} - -static int get8_packet(vorb *f) -{ - int x = get8_packet_raw(f); - f->valid_bits = 0; - return x; -} - -static int get32_packet(vorb *f) -{ - uint32 x; - x = get8_packet(f); - x += get8_packet(f) << 8; - x += get8_packet(f) << 16; - x += (uint32) get8_packet(f) << 24; - return x; -} - -static void flush_packet(vorb *f) -{ - while (get8_packet_raw(f) != EOP); -} - -// @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important -// as the huffman decoder? -static uint32 get_bits(vorb *f, int n) -{ - uint32 z; - - if (f->valid_bits < 0) return 0; - if (f->valid_bits < n) { - if (n > 24) { - // the accumulator technique below would not work correctly in this case - z = get_bits(f, 24); - z += get_bits(f, n-24) << 24; - return z; - } - if (f->valid_bits == 0) f->acc = 0; - while (f->valid_bits < n) { - int z = get8_packet_raw(f); - if (z == EOP) { - f->valid_bits = INVALID_BITS; - return 0; - } - f->acc += z << f->valid_bits; - f->valid_bits += 8; - } - } - - assert(f->valid_bits >= n); - z = f->acc & ((1 << n)-1); - f->acc >>= n; - f->valid_bits -= n; - return z; -} - -// @OPTIMIZE: primary accumulator for huffman -// expand the buffer to as many bits as possible without reading off end of packet -// it might be nice to allow f->valid_bits and f->acc to be stored in registers, -// e.g. cache them locally and decode locally -static __forceinline void prep_huffman(vorb *f) -{ - if (f->valid_bits <= 24) { - if (f->valid_bits == 0) f->acc = 0; - do { - int z; - if (f->last_seg && !f->bytes_in_seg) return; - z = get8_packet_raw(f); - if (z == EOP) return; - f->acc += (unsigned) z << f->valid_bits; - f->valid_bits += 8; - } while (f->valid_bits <= 24); - } -} - -enum -{ - VORBIS_packet_id = 1, - VORBIS_packet_comment = 3, - VORBIS_packet_setup = 5 -}; - -static int codebook_decode_scalar_raw(vorb *f, Codebook *c) -{ - int i; - prep_huffman(f); - - if (c->codewords == NULL && c->sorted_codewords == NULL) - return -1; - - // cases to use binary search: sorted_codewords && !c->codewords - // sorted_codewords && c->entries > 8 - if (c->entries > 8 ? c->sorted_codewords!=NULL : !c->codewords) { - // binary search - uint32 code = bit_reverse(f->acc); - int x=0, n=c->sorted_entries, len; - - while (n > 1) { - // invariant: sc[x] <= code < sc[x+n] - int m = x + (n >> 1); - if (c->sorted_codewords[m] <= code) { - x = m; - n -= (n>>1); - } else { - n >>= 1; - } - } - // x is now the sorted index - if (!c->sparse) x = c->sorted_values[x]; - // x is now sorted index if sparse, or symbol otherwise - len = c->codeword_lengths[x]; - if (f->valid_bits >= len) { - f->acc >>= len; - f->valid_bits -= len; - return x; - } - - f->valid_bits = 0; - return -1; - } - - // if small, linear search - assert(!c->sparse); - for (i=0; i < c->entries; ++i) { - if (c->codeword_lengths[i] == NO_CODE) continue; - if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) { - if (f->valid_bits >= c->codeword_lengths[i]) { - f->acc >>= c->codeword_lengths[i]; - f->valid_bits -= c->codeword_lengths[i]; - return i; - } - f->valid_bits = 0; - return -1; - } - } - - error(f, VORBIS_invalid_stream); - f->valid_bits = 0; - return -1; -} - -#ifndef STB_VORBIS_NO_INLINE_DECODE - -#define DECODE_RAW(var, f,c) \ - if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) \ - prep_huffman(f); \ - var = f->acc & FAST_HUFFMAN_TABLE_MASK; \ - var = c->fast_huffman[var]; \ - if (var >= 0) { \ - int n = c->codeword_lengths[var]; \ - f->acc >>= n; \ - f->valid_bits -= n; \ - if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \ - } else { \ - var = codebook_decode_scalar_raw(f,c); \ - } - -#else - -static int codebook_decode_scalar(vorb *f, Codebook *c) -{ - int i; - if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) - prep_huffman(f); - // fast huffman table lookup - i = f->acc & FAST_HUFFMAN_TABLE_MASK; - i = c->fast_huffman[i]; - if (i >= 0) { - f->acc >>= c->codeword_lengths[i]; - f->valid_bits -= c->codeword_lengths[i]; - if (f->valid_bits < 0) { f->valid_bits = 0; return -1; } - return i; - } - return codebook_decode_scalar_raw(f,c); -} - -#define DECODE_RAW(var,f,c) var = codebook_decode_scalar(f,c); - -#endif - -#define DECODE(var,f,c) \ - DECODE_RAW(var,f,c) \ - if (c->sparse) var = c->sorted_values[var]; - -#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK - #define DECODE_VQ(var,f,c) DECODE_RAW(var,f,c) -#else - #define DECODE_VQ(var,f,c) DECODE(var,f,c) -#endif - - - - - - -// CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case -// where we avoid one addition -#define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off]) -#define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off]) -#define CODEBOOK_ELEMENT_BASE(c) (0) - -static int codebook_decode_start(vorb *f, Codebook *c) -{ - int z = -1; - - // type 0 is only legal in a scalar context - if (c->lookup_type == 0) - error(f, VORBIS_invalid_stream); - else { - DECODE_VQ(z,f,c); - if (c->sparse) assert(z < c->sorted_entries); - if (z < 0) { // check for EOP - if (!f->bytes_in_seg) - if (f->last_seg) - return z; - error(f, VORBIS_invalid_stream); - } - } - return z; -} - -static int codebook_decode(vorb *f, Codebook *c, float *output, int len) -{ - int i,z = codebook_decode_start(f,c); - if (z < 0) return FALSE; - if (len > c->dimensions) len = c->dimensions; - -#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - float last = CODEBOOK_ELEMENT_BASE(c); - int div = 1; - for (i=0; i < len; ++i) { - int off = (z / div) % c->lookup_values; - float val = CODEBOOK_ELEMENT_FAST(c,off) + last; - output[i] += val; - if (c->sequence_p) last = val + c->minimum_value; - div *= c->lookup_values; - } - return TRUE; - } -#endif - - z *= c->dimensions; - if (c->sequence_p) { - float last = CODEBOOK_ELEMENT_BASE(c); - for (i=0; i < len; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - output[i] += val; - last = val + c->minimum_value; - } - } else { - float last = CODEBOOK_ELEMENT_BASE(c); - for (i=0; i < len; ++i) { - output[i] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; - } - } - - return TRUE; -} - -static int codebook_decode_step(vorb *f, Codebook *c, float *output, int len, int step) -{ - int i,z = codebook_decode_start(f,c); - float last = CODEBOOK_ELEMENT_BASE(c); - if (z < 0) return FALSE; - if (len > c->dimensions) len = c->dimensions; - -#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - int div = 1; - for (i=0; i < len; ++i) { - int off = (z / div) % c->lookup_values; - float val = CODEBOOK_ELEMENT_FAST(c,off) + last; - output[i*step] += val; - if (c->sequence_p) last = val; - div *= c->lookup_values; - } - return TRUE; - } -#endif - - z *= c->dimensions; - for (i=0; i < len; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - output[i*step] += val; - if (c->sequence_p) last = val; - } - - return TRUE; -} - -static int codebook_decode_deinterleave_repeat(vorb *f, Codebook *c, float **outputs, int ch, int *c_inter_p, int *p_inter_p, int len, int total_decode) -{ - int c_inter = *c_inter_p; - int p_inter = *p_inter_p; - int i,z, effective = c->dimensions; - - // type 0 is only legal in a scalar context - if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); - - while (total_decode > 0) { - float last = CODEBOOK_ELEMENT_BASE(c); - DECODE_VQ(z,f,c); - #ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK - assert(!c->sparse || z < c->sorted_entries); - #endif - if (z < 0) { - if (!f->bytes_in_seg) - if (f->last_seg) return FALSE; - return error(f, VORBIS_invalid_stream); - } - - // if this will take us off the end of the buffers, stop short! - // we check by computing the length of the virtual interleaved - // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), - // and the length we'll be using (effective) - if (c_inter + p_inter*ch + effective > len * ch) { - effective = len*ch - (p_inter*ch - c_inter); - } - - #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - int div = 1; - for (i=0; i < effective; ++i) { - int off = (z / div) % c->lookup_values; - float val = CODEBOOK_ELEMENT_FAST(c,off) + last; - if (outputs[c_inter]) - outputs[c_inter][p_inter] += val; - if (++c_inter == ch) { c_inter = 0; ++p_inter; } - if (c->sequence_p) last = val; - div *= c->lookup_values; - } - } else - #endif - { - z *= c->dimensions; - if (c->sequence_p) { - for (i=0; i < effective; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - if (outputs[c_inter]) - outputs[c_inter][p_inter] += val; - if (++c_inter == ch) { c_inter = 0; ++p_inter; } - last = val; - } - } else { - for (i=0; i < effective; ++i) { - float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; - if (outputs[c_inter]) - outputs[c_inter][p_inter] += val; - if (++c_inter == ch) { c_inter = 0; ++p_inter; } - } - } - } - - total_decode -= effective; - } - *c_inter_p = c_inter; - *p_inter_p = p_inter; - return TRUE; -} - -static int predict_point(int x, int x0, int x1, int y0, int y1) -{ - int dy = y1 - y0; - int adx = x1 - x0; - // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86? - int err = abs(dy) * (x - x0); - int off = err / adx; - return dy < 0 ? y0 - off : y0 + off; -} - -// the following table is block-copied from the specification -static float inverse_db_table[256] = -{ - 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f, - 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f, - 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f, - 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f, - 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f, - 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f, - 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f, - 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f, - 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f, - 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f, - 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f, - 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f, - 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f, - 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f, - 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f, - 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f, - 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f, - 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f, - 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f, - 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f, - 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f, - 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f, - 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f, - 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f, - 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f, - 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f, - 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f, - 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f, - 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f, - 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f, - 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f, - 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f, - 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f, - 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f, - 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f, - 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f, - 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f, - 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f, - 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f, - 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f, - 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f, - 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f, - 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f, - 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f, - 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f, - 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f, - 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f, - 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f, - 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f, - 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f, - 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f, - 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f, - 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f, - 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f, - 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f, - 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f, - 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f, - 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f, - 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f, - 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f, - 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f, - 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f, - 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f, - 0.82788260f, 0.88168307f, 0.9389798f, 1.0f -}; - - -// @OPTIMIZE: if you want to replace this bresenham line-drawing routine, -// note that you must produce bit-identical output to decode correctly; -// this specific sequence of operations is specified in the spec (it's -// drawing integer-quantized frequency-space lines that the encoder -// expects to be exactly the same) -// ... also, isn't the whole point of Bresenham's algorithm to NOT -// have to divide in the setup? sigh. -#ifndef STB_VORBIS_NO_DEFER_FLOOR -#define LINE_OP(a,b) a *= b -#else -#define LINE_OP(a,b) a = b -#endif - -#ifdef STB_VORBIS_DIVIDE_TABLE -#define DIVTAB_NUMER 32 -#define DIVTAB_DENOM 64 -int8 integer_divide_table[DIVTAB_NUMER][DIVTAB_DENOM]; // 2KB -#endif - -static __forceinline void draw_line(float *output, int x0, int y0, int x1, int y1, int n) -{ - int dy = y1 - y0; - int adx = x1 - x0; - int ady = abs(dy); - int base; - int x=x0,y=y0; - int err = 0; - int sy; - -#ifdef STB_VORBIS_DIVIDE_TABLE - if (adx < DIVTAB_DENOM && ady < DIVTAB_NUMER) { - if (dy < 0) { - base = -integer_divide_table[ady][adx]; - sy = base-1; - } else { - base = integer_divide_table[ady][adx]; - sy = base+1; - } - } else { - base = dy / adx; - if (dy < 0) - sy = base - 1; - else - sy = base+1; - } -#else - base = dy / adx; - if (dy < 0) - sy = base - 1; - else - sy = base+1; -#endif - ady -= abs(base) * adx; - if (x1 > n) x1 = n; - if (x < x1) { - LINE_OP(output[x], inverse_db_table[y&255]); - for (++x; x < x1; ++x) { - err += ady; - if (err >= adx) { - err -= adx; - y += sy; - } else - y += base; - LINE_OP(output[x], inverse_db_table[y&255]); - } - } -} - -static int residue_decode(vorb *f, Codebook *book, float *target, int offset, int n, int rtype) -{ - int k; - if (rtype == 0) { - int step = n / book->dimensions; - for (k=0; k < step; ++k) - if (!codebook_decode_step(f, book, target+offset+k, n-offset-k, step)) - return FALSE; - } else { - for (k=0; k < n; ) { - if (!codebook_decode(f, book, target+offset, n-k)) - return FALSE; - k += book->dimensions; - offset += book->dimensions; - } - } - return TRUE; -} - -// n is 1/2 of the blocksize -- -// specification: "Correct per-vector decode length is [n]/2" -static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int rn, uint8 *do_not_decode) -{ - int i,j,pass; - Residue *r = f->residue_config + rn; - int rtype = f->residue_types[rn]; - int c = r->classbook; - int classwords = f->codebooks[c].dimensions; - unsigned int actual_size = rtype == 2 ? n*2 : n; - unsigned int limit_r_begin = (r->begin < actual_size ? r->begin : actual_size); - unsigned int limit_r_end = (r->end < actual_size ? r->end : actual_size); - int n_read = limit_r_end - limit_r_begin; - int part_read = n_read / r->part_size; - int temp_alloc_point = temp_alloc_save(f); - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - uint8 ***part_classdata = (uint8 ***) temp_block_array(f,f->channels, part_read * sizeof(**part_classdata)); - #else - int **classifications = (int **) temp_block_array(f,f->channels, part_read * sizeof(**classifications)); - #endif - - CHECK(f); - - for (i=0; i < ch; ++i) - if (!do_not_decode[i]) - memset(residue_buffers[i], 0, sizeof(float) * n); - - if (rtype == 2 && ch != 1) { - for (j=0; j < ch; ++j) - if (!do_not_decode[j]) - break; - if (j == ch) - goto done; - - for (pass=0; pass < 8; ++pass) { - int pcount = 0, class_set = 0; - if (ch == 2) { - while (pcount < part_read) { - int z = r->begin + pcount*r->part_size; - int c_inter = (z & 1), p_inter = z>>1; - if (pass == 0) { - Codebook *c = f->codebooks+r->classbook; - int q; - DECODE(q,f,c); - if (q == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[0][class_set] = r->classdata[q]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[0][i+pcount] = q % r->classifications; - q /= r->classifications; - } - #endif - } - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - int z = r->begin + pcount*r->part_size; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[0][class_set][i]; - #else - int c = classifications[0][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - Codebook *book = f->codebooks + b; - #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) - goto done; - #else - // saves 1% - if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) - goto done; - #endif - } else { - z += r->part_size; - c_inter = z & 1; - p_inter = z >> 1; - } - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } else if (ch > 2) { - while (pcount < part_read) { - int z = r->begin + pcount*r->part_size; - int c_inter = z % ch, p_inter = z/ch; - if (pass == 0) { - Codebook *c = f->codebooks+r->classbook; - int q; - DECODE(q,f,c); - if (q == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[0][class_set] = r->classdata[q]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[0][i+pcount] = q % r->classifications; - q /= r->classifications; - } - #endif - } - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - int z = r->begin + pcount*r->part_size; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[0][class_set][i]; - #else - int c = classifications[0][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - Codebook *book = f->codebooks + b; - if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) - goto done; - } else { - z += r->part_size; - c_inter = z % ch; - p_inter = z / ch; - } - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } - } - goto done; - } - CHECK(f); - - for (pass=0; pass < 8; ++pass) { - int pcount = 0, class_set=0; - while (pcount < part_read) { - if (pass == 0) { - for (j=0; j < ch; ++j) { - if (!do_not_decode[j]) { - Codebook *c = f->codebooks+r->classbook; - int temp; - DECODE(temp,f,c); - if (temp == EOP) goto done; - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - part_classdata[j][class_set] = r->classdata[temp]; - #else - for (i=classwords-1; i >= 0; --i) { - classifications[j][i+pcount] = temp % r->classifications; - temp /= r->classifications; - } - #endif - } - } - } - for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { - for (j=0; j < ch; ++j) { - if (!do_not_decode[j]) { - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - int c = part_classdata[j][class_set][i]; - #else - int c = classifications[j][pcount]; - #endif - int b = r->residue_books[c][pass]; - if (b >= 0) { - float *target = residue_buffers[j]; - int offset = r->begin + pcount * r->part_size; - int n = r->part_size; - Codebook *book = f->codebooks + b; - if (!residue_decode(f, book, target, offset, n, rtype)) - goto done; - } - } - } - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - ++class_set; - #endif - } - } - done: - CHECK(f); - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - temp_free(f,part_classdata); - #else - temp_free(f,classifications); - #endif - temp_alloc_restore(f,temp_alloc_point); -} - - -#if 0 -// slow way for debugging -void inverse_mdct_slow(float *buffer, int n) -{ - int i,j; - int n2 = n >> 1; - float *x = (float *) malloc(sizeof(*x) * n2); - memcpy(x, buffer, sizeof(*x) * n2); - for (i=0; i < n; ++i) { - float acc = 0; - for (j=0; j < n2; ++j) - // formula from paper: - //acc += n/4.0f * x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); - // formula from wikipedia - //acc += 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); - // these are equivalent, except the formula from the paper inverts the multiplier! - // however, what actually works is NO MULTIPLIER!?! - //acc += 64 * 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); - acc += x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); - buffer[i] = acc; - } - free(x); -} -#elif 0 -// same as above, but just barely able to run in real time on modern machines -void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) -{ - float mcos[16384]; - int i,j; - int n2 = n >> 1, nmask = (n << 2) -1; - float *x = (float *) malloc(sizeof(*x) * n2); - memcpy(x, buffer, sizeof(*x) * n2); - for (i=0; i < 4*n; ++i) - mcos[i] = (float) cos(M_PI / 2 * i / n); - - for (i=0; i < n; ++i) { - float acc = 0; - for (j=0; j < n2; ++j) - acc += x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask]; - buffer[i] = acc; - } - free(x); -} -#elif 0 -// transform to use a slow dct-iv; this is STILL basically trivial, -// but only requires half as many ops -void dct_iv_slow(float *buffer, int n) -{ - float mcos[16384]; - float x[2048]; - int i,j; - int n2 = n >> 1, nmask = (n << 3) - 1; - memcpy(x, buffer, sizeof(*x) * n); - for (i=0; i < 8*n; ++i) - mcos[i] = (float) cos(M_PI / 4 * i / n); - for (i=0; i < n; ++i) { - float acc = 0; - for (j=0; j < n; ++j) - acc += x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask]; - buffer[i] = acc; - } -} - -void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) -{ - int i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4; - float temp[4096]; - - memcpy(temp, buffer, n2 * sizeof(float)); - dct_iv_slow(temp, n2); // returns -c'-d, a-b' - - for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4]; // a-b' - for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1]; // b-a', c+d' - for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4]; // c'+d -} -#endif - -#ifndef LIBVORBIS_MDCT -#define LIBVORBIS_MDCT 0 -#endif - -#if LIBVORBIS_MDCT -// directly call the vorbis MDCT using an interface documented -// by Jeff Roberts... useful for performance comparison -typedef struct -{ - int n; - int log2n; - - float *trig; - int *bitrev; - - float scale; -} mdct_lookup; - -extern void mdct_init(mdct_lookup *lookup, int n); -extern void mdct_clear(mdct_lookup *l); -extern void mdct_backward(mdct_lookup *init, float *in, float *out); - -mdct_lookup M1,M2; - -void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) -{ - mdct_lookup *M; - if (M1.n == n) M = &M1; - else if (M2.n == n) M = &M2; - else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; } - else { - if (M2.n) __asm int 3; - mdct_init(&M2, n); - M = &M2; - } - - mdct_backward(M, buffer, buffer); -} -#endif - - -// the following were split out into separate functions while optimizing; -// they could be pushed back up but eh. __forceinline showed no change; -// they're probably already being inlined. -static void imdct_step3_iter0_loop(int n, float *e, int i_off, int k_off, float *A) -{ - float *ee0 = e + i_off; - float *ee2 = ee0 + k_off; - int i; - - assert((n & 3) == 0); - for (i=(n>>2); i > 0; --i) { - float k00_20, k01_21; - k00_20 = ee0[ 0] - ee2[ 0]; - k01_21 = ee0[-1] - ee2[-1]; - ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0] + ee2[ 0]; - ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1] + ee2[-1]; - ee2[ 0] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-1] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - - k00_20 = ee0[-2] - ee2[-2]; - k01_21 = ee0[-3] - ee2[-3]; - ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2] + ee2[-2]; - ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3] + ee2[-3]; - ee2[-2] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-3] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - - k00_20 = ee0[-4] - ee2[-4]; - k01_21 = ee0[-5] - ee2[-5]; - ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4] + ee2[-4]; - ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5] + ee2[-5]; - ee2[-4] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-5] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - - k00_20 = ee0[-6] - ee2[-6]; - k01_21 = ee0[-7] - ee2[-7]; - ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6] + ee2[-6]; - ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7] + ee2[-7]; - ee2[-6] = k00_20 * A[0] - k01_21 * A[1]; - ee2[-7] = k01_21 * A[0] + k00_20 * A[1]; - A += 8; - ee0 -= 8; - ee2 -= 8; - } -} - -static void imdct_step3_inner_r_loop(int lim, float *e, int d0, int k_off, float *A, int k1) -{ - int i; - float k00_20, k01_21; - - float *e0 = e + d0; - float *e2 = e0 + k_off; - - for (i=lim >> 2; i > 0; --i) { - k00_20 = e0[-0] - e2[-0]; - k01_21 = e0[-1] - e2[-1]; - e0[-0] += e2[-0];//e0[-0] = e0[-0] + e2[-0]; - e0[-1] += e2[-1];//e0[-1] = e0[-1] + e2[-1]; - e2[-0] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-1] = (k01_21)*A[0] + (k00_20) * A[1]; - - A += k1; - - k00_20 = e0[-2] - e2[-2]; - k01_21 = e0[-3] - e2[-3]; - e0[-2] += e2[-2];//e0[-2] = e0[-2] + e2[-2]; - e0[-3] += e2[-3];//e0[-3] = e0[-3] + e2[-3]; - e2[-2] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-3] = (k01_21)*A[0] + (k00_20) * A[1]; - - A += k1; - - k00_20 = e0[-4] - e2[-4]; - k01_21 = e0[-5] - e2[-5]; - e0[-4] += e2[-4];//e0[-4] = e0[-4] + e2[-4]; - e0[-5] += e2[-5];//e0[-5] = e0[-5] + e2[-5]; - e2[-4] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-5] = (k01_21)*A[0] + (k00_20) * A[1]; - - A += k1; - - k00_20 = e0[-6] - e2[-6]; - k01_21 = e0[-7] - e2[-7]; - e0[-6] += e2[-6];//e0[-6] = e0[-6] + e2[-6]; - e0[-7] += e2[-7];//e0[-7] = e0[-7] + e2[-7]; - e2[-6] = (k00_20)*A[0] - (k01_21) * A[1]; - e2[-7] = (k01_21)*A[0] + (k00_20) * A[1]; - - e0 -= 8; - e2 -= 8; - - A += k1; - } -} - -static void imdct_step3_inner_s_loop(int n, float *e, int i_off, int k_off, float *A, int a_off, int k0) -{ - int i; - float A0 = A[0]; - float A1 = A[0+1]; - float A2 = A[0+a_off]; - float A3 = A[0+a_off+1]; - float A4 = A[0+a_off*2+0]; - float A5 = A[0+a_off*2+1]; - float A6 = A[0+a_off*3+0]; - float A7 = A[0+a_off*3+1]; - - float k00,k11; - - float *ee0 = e +i_off; - float *ee2 = ee0+k_off; - - for (i=n; i > 0; --i) { - k00 = ee0[ 0] - ee2[ 0]; - k11 = ee0[-1] - ee2[-1]; - ee0[ 0] = ee0[ 0] + ee2[ 0]; - ee0[-1] = ee0[-1] + ee2[-1]; - ee2[ 0] = (k00) * A0 - (k11) * A1; - ee2[-1] = (k11) * A0 + (k00) * A1; - - k00 = ee0[-2] - ee2[-2]; - k11 = ee0[-3] - ee2[-3]; - ee0[-2] = ee0[-2] + ee2[-2]; - ee0[-3] = ee0[-3] + ee2[-3]; - ee2[-2] = (k00) * A2 - (k11) * A3; - ee2[-3] = (k11) * A2 + (k00) * A3; - - k00 = ee0[-4] - ee2[-4]; - k11 = ee0[-5] - ee2[-5]; - ee0[-4] = ee0[-4] + ee2[-4]; - ee0[-5] = ee0[-5] + ee2[-5]; - ee2[-4] = (k00) * A4 - (k11) * A5; - ee2[-5] = (k11) * A4 + (k00) * A5; - - k00 = ee0[-6] - ee2[-6]; - k11 = ee0[-7] - ee2[-7]; - ee0[-6] = ee0[-6] + ee2[-6]; - ee0[-7] = ee0[-7] + ee2[-7]; - ee2[-6] = (k00) * A6 - (k11) * A7; - ee2[-7] = (k11) * A6 + (k00) * A7; - - ee0 -= k0; - ee2 -= k0; - } -} - -static __forceinline void iter_54(float *z) -{ - float k00,k11,k22,k33; - float y0,y1,y2,y3; - - k00 = z[ 0] - z[-4]; - y0 = z[ 0] + z[-4]; - y2 = z[-2] + z[-6]; - k22 = z[-2] - z[-6]; - - z[-0] = y0 + y2; // z0 + z4 + z2 + z6 - z[-2] = y0 - y2; // z0 + z4 - z2 - z6 - - // done with y0,y2 - - k33 = z[-3] - z[-7]; - - z[-4] = k00 + k33; // z0 - z4 + z3 - z7 - z[-6] = k00 - k33; // z0 - z4 - z3 + z7 - - // done with k33 - - k11 = z[-1] - z[-5]; - y1 = z[-1] + z[-5]; - y3 = z[-3] + z[-7]; - - z[-1] = y1 + y3; // z1 + z5 + z3 + z7 - z[-3] = y1 - y3; // z1 + z5 - z3 - z7 - z[-5] = k11 - k22; // z1 - z5 + z2 - z6 - z[-7] = k11 + k22; // z1 - z5 - z2 + z6 -} - -static void imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n) -{ - int a_off = base_n >> 3; - float A2 = A[0+a_off]; - float *z = e + i_off; - float *base = z - 16 * n; - - while (z > base) { - float k00,k11; - float l00,l11; - - k00 = z[-0] - z[ -8]; - k11 = z[-1] - z[ -9]; - l00 = z[-2] - z[-10]; - l11 = z[-3] - z[-11]; - z[ -0] = z[-0] + z[ -8]; - z[ -1] = z[-1] + z[ -9]; - z[ -2] = z[-2] + z[-10]; - z[ -3] = z[-3] + z[-11]; - z[ -8] = k00; - z[ -9] = k11; - z[-10] = (l00+l11) * A2; - z[-11] = (l11-l00) * A2; - - k00 = z[ -4] - z[-12]; - k11 = z[ -5] - z[-13]; - l00 = z[ -6] - z[-14]; - l11 = z[ -7] - z[-15]; - z[ -4] = z[ -4] + z[-12]; - z[ -5] = z[ -5] + z[-13]; - z[ -6] = z[ -6] + z[-14]; - z[ -7] = z[ -7] + z[-15]; - z[-12] = k11; - z[-13] = -k00; - z[-14] = (l11-l00) * A2; - z[-15] = (l00+l11) * -A2; - - iter_54(z); - iter_54(z-8); - z -= 16; - } -} - -static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) -{ - int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; - int ld; - // @OPTIMIZE: reduce register pressure by using fewer variables? - int save_point = temp_alloc_save(f); - float *buf2 = (float *) temp_alloc(f, n2 * sizeof(*buf2)); - float *u=NULL,*v=NULL; - // twiddle factors - float *A = f->A[blocktype]; - - // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" - // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function. - - // kernel from paper - - - // merged: - // copy and reflect spectral data - // step 0 - - // note that it turns out that the items added together during - // this step are, in fact, being added to themselves (as reflected - // by step 0). inexplicable inefficiency! this became obvious - // once I combined the passes. - - // so there's a missing 'times 2' here (for adding X to itself). - // this propagates through linearly to the end, where the numbers - // are 1/2 too small, and need to be compensated for. - - { - float *d,*e, *AA, *e_stop; - d = &buf2[n2-2]; - AA = A; - e = &buffer[0]; - e_stop = &buffer[n2]; - while (e != e_stop) { - d[1] = (e[0] * AA[0] - e[2]*AA[1]); - d[0] = (e[0] * AA[1] + e[2]*AA[0]); - d -= 2; - AA += 2; - e += 4; - } - - e = &buffer[n2-3]; - while (d >= buf2) { - d[1] = (-e[2] * AA[0] - -e[0]*AA[1]); - d[0] = (-e[2] * AA[1] + -e[0]*AA[0]); - d -= 2; - AA += 2; - e -= 4; - } - } - - // now we use symbolic names for these, so that we can - // possibly swap their meaning as we change which operations - // are in place - - u = buffer; - v = buf2; - - // step 2 (paper output is w, now u) - // this could be in place, but the data ends up in the wrong - // place... _somebody_'s got to swap it, so this is nominated - { - float *AA = &A[n2-8]; - float *d0,*d1, *e0, *e1; - - e0 = &v[n4]; - e1 = &v[0]; - - d0 = &u[n4]; - d1 = &u[0]; - - while (AA >= A) { - float v40_20, v41_21; - - v41_21 = e0[1] - e1[1]; - v40_20 = e0[0] - e1[0]; - d0[1] = e0[1] + e1[1]; - d0[0] = e0[0] + e1[0]; - d1[1] = v41_21*AA[4] - v40_20*AA[5]; - d1[0] = v40_20*AA[4] + v41_21*AA[5]; - - v41_21 = e0[3] - e1[3]; - v40_20 = e0[2] - e1[2]; - d0[3] = e0[3] + e1[3]; - d0[2] = e0[2] + e1[2]; - d1[3] = v41_21*AA[0] - v40_20*AA[1]; - d1[2] = v40_20*AA[0] + v41_21*AA[1]; - - AA -= 8; - - d0 += 4; - d1 += 4; - e0 += 4; - e1 += 4; - } - } - - // step 3 - ld = ilog(n) - 1; // ilog is off-by-one from normal definitions - - // optimized step 3: - - // the original step3 loop can be nested r inside s or s inside r; - // it's written originally as s inside r, but this is dumb when r - // iterates many times, and s few. So I have two copies of it and - // switch between them halfway. - - // this is iteration 0 of step 3 - imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*0, -(n >> 3), A); - imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*1, -(n >> 3), A); - - // this is iteration 1 of step 3 - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*0, -(n >> 4), A, 16); - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*1, -(n >> 4), A, 16); - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*2, -(n >> 4), A, 16); - imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*3, -(n >> 4), A, 16); - - l=2; - for (; l < (ld-3)>>1; ++l) { - int k0 = n >> (l+2), k0_2 = k0>>1; - int lim = 1 << (l+1); - int i; - for (i=0; i < lim; ++i) - imdct_step3_inner_r_loop(n >> (l+4), u, n2-1 - k0*i, -k0_2, A, 1 << (l+3)); - } - - for (; l < ld-6; ++l) { - int k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1; - int rlim = n >> (l+6), r; - int lim = 1 << (l+1); - int i_off; - float *A0 = A; - i_off = n2-1; - for (r=rlim; r > 0; --r) { - imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0); - A0 += k1*4; - i_off -= 8; - } - } - - // iterations with count: - // ld-6,-5,-4 all interleaved together - // the big win comes from getting rid of needless flops - // due to the constants on pass 5 & 4 being all 1 and 0; - // combining them to be simultaneous to improve cache made little difference - imdct_step3_inner_s_loop_ld654(n >> 5, u, n2-1, A, n); - - // output is u - - // step 4, 5, and 6 - // cannot be in-place because of step 5 - { - uint16 *bitrev = f->bit_reverse[blocktype]; - // weirdly, I'd have thought reading sequentially and writing - // erratically would have been better than vice-versa, but in - // fact that's not what my testing showed. (That is, with - // j = bitreverse(i), do you read i and write j, or read j and write i.) - - float *d0 = &v[n4-4]; - float *d1 = &v[n2-4]; - while (d0 >= v) { - int k4; - - k4 = bitrev[0]; - d1[3] = u[k4+0]; - d1[2] = u[k4+1]; - d0[3] = u[k4+2]; - d0[2] = u[k4+3]; - - k4 = bitrev[1]; - d1[1] = u[k4+0]; - d1[0] = u[k4+1]; - d0[1] = u[k4+2]; - d0[0] = u[k4+3]; - - d0 -= 4; - d1 -= 4; - bitrev += 2; - } - } - // (paper output is u, now v) - - - // data must be in buf2 - assert(v == buf2); - - // step 7 (paper output is v, now v) - // this is now in place - { - float *C = f->C[blocktype]; - float *d, *e; - - d = v; - e = v + n2 - 4; - - while (d < e) { - float a02,a11,b0,b1,b2,b3; - - a02 = d[0] - e[2]; - a11 = d[1] + e[3]; - - b0 = C[1]*a02 + C[0]*a11; - b1 = C[1]*a11 - C[0]*a02; - - b2 = d[0] + e[ 2]; - b3 = d[1] - e[ 3]; - - d[0] = b2 + b0; - d[1] = b3 + b1; - e[2] = b2 - b0; - e[3] = b1 - b3; - - a02 = d[2] - e[0]; - a11 = d[3] + e[1]; - - b0 = C[3]*a02 + C[2]*a11; - b1 = C[3]*a11 - C[2]*a02; - - b2 = d[2] + e[ 0]; - b3 = d[3] - e[ 1]; - - d[2] = b2 + b0; - d[3] = b3 + b1; - e[0] = b2 - b0; - e[1] = b1 - b3; - - C += 4; - d += 4; - e -= 4; - } - } - - // data must be in buf2 - - - // step 8+decode (paper output is X, now buffer) - // this generates pairs of data a la 8 and pushes them directly through - // the decode kernel (pushing rather than pulling) to avoid having - // to make another pass later - - // this cannot POSSIBLY be in place, so we refer to the buffers directly - - { - float *d0,*d1,*d2,*d3; - - float *B = f->B[blocktype] + n2 - 8; - float *e = buf2 + n2 - 8; - d0 = &buffer[0]; - d1 = &buffer[n2-4]; - d2 = &buffer[n2]; - d3 = &buffer[n-4]; - while (e >= v) { - float p0,p1,p2,p3; - - p3 = e[6]*B[7] - e[7]*B[6]; - p2 = -e[6]*B[6] - e[7]*B[7]; - - d0[0] = p3; - d1[3] = - p3; - d2[0] = p2; - d3[3] = p2; - - p1 = e[4]*B[5] - e[5]*B[4]; - p0 = -e[4]*B[4] - e[5]*B[5]; - - d0[1] = p1; - d1[2] = - p1; - d2[1] = p0; - d3[2] = p0; - - p3 = e[2]*B[3] - e[3]*B[2]; - p2 = -e[2]*B[2] - e[3]*B[3]; - - d0[2] = p3; - d1[1] = - p3; - d2[2] = p2; - d3[1] = p2; - - p1 = e[0]*B[1] - e[1]*B[0]; - p0 = -e[0]*B[0] - e[1]*B[1]; - - d0[3] = p1; - d1[0] = - p1; - d2[3] = p0; - d3[0] = p0; - - B -= 8; - e -= 8; - d0 += 4; - d2 += 4; - d1 -= 4; - d3 -= 4; - } - } - - temp_free(f,buf2); - temp_alloc_restore(f,save_point); -} - -#if 0 -// this is the original version of the above code, if you want to optimize it from scratch -void inverse_mdct_naive(float *buffer, int n) -{ - float s; - float A[1 << 12], B[1 << 12], C[1 << 11]; - int i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; - int n3_4 = n - n4, ld; - // how can they claim this only uses N words?! - // oh, because they're only used sparsely, whoops - float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13]; - // set up twiddle factors - - for (k=k2=0; k < n4; ++k,k2+=2) { - A[k2 ] = (float) cos(4*k*M_PI/n); - A[k2+1] = (float) -sin(4*k*M_PI/n); - B[k2 ] = (float) cos((k2+1)*M_PI/n/2); - B[k2+1] = (float) sin((k2+1)*M_PI/n/2); - } - for (k=k2=0; k < n8; ++k,k2+=2) { - C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); - C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); - } - - // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" - // Note there are bugs in that pseudocode, presumably due to them attempting - // to rename the arrays nicely rather than representing the way their actual - // implementation bounces buffers back and forth. As a result, even in the - // "some formulars corrected" version, a direct implementation fails. These - // are noted below as "paper bug". - - // copy and reflect spectral data - for (k=0; k < n2; ++k) u[k] = buffer[k]; - for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1]; - // kernel from paper - // step 1 - for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) { - v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1]; - v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2]; - } - // step 2 - for (k=k4=0; k < n8; k+=1, k4+=4) { - w[n2+3+k4] = v[n2+3+k4] + v[k4+3]; - w[n2+1+k4] = v[n2+1+k4] + v[k4+1]; - w[k4+3] = (v[n2+3+k4] - v[k4+3])*A[n2-4-k4] - (v[n2+1+k4]-v[k4+1])*A[n2-3-k4]; - w[k4+1] = (v[n2+1+k4] - v[k4+1])*A[n2-4-k4] + (v[n2+3+k4]-v[k4+3])*A[n2-3-k4]; - } - // step 3 - ld = ilog(n) - 1; // ilog is off-by-one from normal definitions - for (l=0; l < ld-3; ++l) { - int k0 = n >> (l+2), k1 = 1 << (l+3); - int rlim = n >> (l+4), r4, r; - int s2lim = 1 << (l+2), s2; - for (r=r4=0; r < rlim; r4+=4,++r) { - for (s2=0; s2 < s2lim; s2+=2) { - u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4]; - u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4]; - u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1] - - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1]; - u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1] - + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1]; - } - } - if (l+1 < ld-3) { - // paper bug: ping-ponging of u&w here is omitted - memcpy(w, u, sizeof(u)); - } - } - - // step 4 - for (i=0; i < n8; ++i) { - int j = bit_reverse(i) >> (32-ld+3); - assert(j < n8); - if (i == j) { - // paper bug: original code probably swapped in place; if copying, - // need to directly copy in this case - int i8 = i << 3; - v[i8+1] = u[i8+1]; - v[i8+3] = u[i8+3]; - v[i8+5] = u[i8+5]; - v[i8+7] = u[i8+7]; - } else if (i < j) { - int i8 = i << 3, j8 = j << 3; - v[j8+1] = u[i8+1], v[i8+1] = u[j8 + 1]; - v[j8+3] = u[i8+3], v[i8+3] = u[j8 + 3]; - v[j8+5] = u[i8+5], v[i8+5] = u[j8 + 5]; - v[j8+7] = u[i8+7], v[i8+7] = u[j8 + 7]; - } - } - // step 5 - for (k=0; k < n2; ++k) { - w[k] = v[k*2+1]; - } - // step 6 - for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) { - u[n-1-k2] = w[k4]; - u[n-2-k2] = w[k4+1]; - u[n3_4 - 1 - k2] = w[k4+2]; - u[n3_4 - 2 - k2] = w[k4+3]; - } - // step 7 - for (k=k2=0; k < n8; ++k, k2 += 2) { - v[n2 + k2 ] = ( u[n2 + k2] + u[n-2-k2] + C[k2+1]*(u[n2+k2]-u[n-2-k2]) + C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; - v[n-2 - k2] = ( u[n2 + k2] + u[n-2-k2] - C[k2+1]*(u[n2+k2]-u[n-2-k2]) - C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; - v[n2+1+ k2] = ( u[n2+1+k2] - u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; - v[n-1 - k2] = (-u[n2+1+k2] + u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; - } - // step 8 - for (k=k2=0; k < n4; ++k,k2 += 2) { - X[k] = v[k2+n2]*B[k2 ] + v[k2+1+n2]*B[k2+1]; - X[n2-1-k] = v[k2+n2]*B[k2+1] - v[k2+1+n2]*B[k2 ]; - } - - // decode kernel to output - // determined the following value experimentally - // (by first figuring out what made inverse_mdct_slow work); then matching that here - // (probably vorbis encoder premultiplies by n or n/2, to save it on the decoder?) - s = 0.5; // theoretically would be n4 - - // [[[ note! the s value of 0.5 is compensated for by the B[] in the current code, - // so it needs to use the "old" B values to behave correctly, or else - // set s to 1.0 ]]] - for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4]; - for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1]; - for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4]; -} -#endif - -static float *get_window(vorb *f, int len) -{ - len <<= 1; - if (len == f->blocksize_0) return f->window[0]; - if (len == f->blocksize_1) return f->window[1]; - return NULL; -} - -#ifndef STB_VORBIS_NO_DEFER_FLOOR -typedef int16 YTYPE; -#else -typedef int YTYPE; -#endif -static int do_floor(vorb *f, Mapping *map, int i, int n, float *target, YTYPE *finalY, uint8 *step2_flag) -{ - int n2 = n >> 1; - int s = map->chan[i].mux, floor; - floor = map->submap_floor[s]; - if (f->floor_types[floor] == 0) { - return error(f, VORBIS_invalid_stream); - } else { - Floor1 *g = &f->floor_config[floor].floor1; - int j,q; - int lx = 0, ly = finalY[0] * g->floor1_multiplier; - for (q=1; q < g->values; ++q) { - j = g->sorted_order[q]; - #ifndef STB_VORBIS_NO_DEFER_FLOOR - STBV_NOTUSED(step2_flag); - if (finalY[j] >= 0) - #else - if (step2_flag[j]) - #endif - { - int hy = finalY[j] * g->floor1_multiplier; - int hx = g->Xlist[j]; - if (lx != hx) - draw_line(target, lx,ly, hx,hy, n2); - CHECK(f); - lx = hx, ly = hy; - } - } - if (lx < n2) { - // optimization of: draw_line(target, lx,ly, n,ly, n2); - for (j=lx; j < n2; ++j) - LINE_OP(target[j], inverse_db_table[ly]); - CHECK(f); - } - } - return TRUE; -} - -// The meaning of "left" and "right" -// -// For a given frame: -// we compute samples from 0..n -// window_center is n/2 -// we'll window and mix the samples from left_start to left_end with data from the previous frame -// all of the samples from left_end to right_start can be output without mixing; however, -// this interval is 0-length except when transitioning between short and long frames -// all of the samples from right_start to right_end need to be mixed with the next frame, -// which we don't have, so those get saved in a buffer -// frame N's right_end-right_start, the number of samples to mix with the next frame, -// has to be the same as frame N+1's left_end-left_start (which they are by -// construction) - -static int vorbis_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) -{ - Mode *m; - int i, n, prev, next, window_center; - f->channel_buffer_start = f->channel_buffer_end = 0; - - retry: - if (f->eof) return FALSE; - if (!maybe_start_packet(f)) - return FALSE; - // check packet type - if (get_bits(f,1) != 0) { - if (IS_PUSH_MODE(f)) - return error(f,VORBIS_bad_packet_type); - while (EOP != get8_packet(f)); - goto retry; - } - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - - i = get_bits(f, ilog(f->mode_count-1)); - if (i == EOP) return FALSE; - if (i >= f->mode_count) return FALSE; - *mode = i; - m = f->mode_config + i; - if (m->blockflag) { - n = f->blocksize_1; - prev = get_bits(f,1); - next = get_bits(f,1); - } else { - prev = next = 0; - n = f->blocksize_0; - } - -// WINDOWING - - window_center = n >> 1; - if (m->blockflag && !prev) { - *p_left_start = (n - f->blocksize_0) >> 2; - *p_left_end = (n + f->blocksize_0) >> 2; - } else { - *p_left_start = 0; - *p_left_end = window_center; - } - if (m->blockflag && !next) { - *p_right_start = (n*3 - f->blocksize_0) >> 2; - *p_right_end = (n*3 + f->blocksize_0) >> 2; - } else { - *p_right_start = window_center; - *p_right_end = n; - } - - return TRUE; -} - -static int vorbis_decode_packet_rest(vorb *f, int *len, Mode *m, int left_start, int left_end, int right_start, int right_end, int *p_left) -{ - Mapping *map; - int i,j,k,n,n2; - int zero_channel[256]; - int really_zero_channel[256]; - -// WINDOWING - - STBV_NOTUSED(left_end); - n = f->blocksize[m->blockflag]; - map = &f->mapping[m->mapping]; - -// FLOORS - n2 = n >> 1; - - CHECK(f); - - for (i=0; i < f->channels; ++i) { - int s = map->chan[i].mux, floor; - zero_channel[i] = FALSE; - floor = map->submap_floor[s]; - if (f->floor_types[floor] == 0) { - return error(f, VORBIS_invalid_stream); - } else { - Floor1 *g = &f->floor_config[floor].floor1; - if (get_bits(f, 1)) { - short *finalY; - uint8 step2_flag[256]; - static int range_list[4] = { 256, 128, 86, 64 }; - int range = range_list[g->floor1_multiplier-1]; - int offset = 2; - finalY = f->finalY[i]; - finalY[0] = get_bits(f, ilog(range)-1); - finalY[1] = get_bits(f, ilog(range)-1); - for (j=0; j < g->partitions; ++j) { - int pclass = g->partition_class_list[j]; - int cdim = g->class_dimensions[pclass]; - int cbits = g->class_subclasses[pclass]; - int csub = (1 << cbits)-1; - int cval = 0; - if (cbits) { - Codebook *c = f->codebooks + g->class_masterbooks[pclass]; - DECODE(cval,f,c); - } - for (k=0; k < cdim; ++k) { - int book = g->subclass_books[pclass][cval & csub]; - cval = cval >> cbits; - if (book >= 0) { - int temp; - Codebook *c = f->codebooks + book; - DECODE(temp,f,c); - finalY[offset++] = temp; - } else - finalY[offset++] = 0; - } - } - if (f->valid_bits == INVALID_BITS) goto error; // behavior according to spec - step2_flag[0] = step2_flag[1] = 1; - for (j=2; j < g->values; ++j) { - int low, high, pred, highroom, lowroom, room, val; - low = g->neighbors[j][0]; - high = g->neighbors[j][1]; - //neighbors(g->Xlist, j, &low, &high); - pred = predict_point(g->Xlist[j], g->Xlist[low], g->Xlist[high], finalY[low], finalY[high]); - val = finalY[j]; - highroom = range - pred; - lowroom = pred; - if (highroom < lowroom) - room = highroom * 2; - else - room = lowroom * 2; - if (val) { - step2_flag[low] = step2_flag[high] = 1; - step2_flag[j] = 1; - if (val >= room) - if (highroom > lowroom) - finalY[j] = val - lowroom + pred; - else - finalY[j] = pred - val + highroom - 1; - else - if (val & 1) - finalY[j] = pred - ((val+1)>>1); - else - finalY[j] = pred + (val>>1); - } else { - step2_flag[j] = 0; - finalY[j] = pred; - } - } - -#ifdef STB_VORBIS_NO_DEFER_FLOOR - do_floor(f, map, i, n, f->floor_buffers[i], finalY, step2_flag); -#else - // defer final floor computation until _after_ residue - for (j=0; j < g->values; ++j) { - if (!step2_flag[j]) - finalY[j] = -1; - } -#endif - } else { - error: - zero_channel[i] = TRUE; - } - // So we just defer everything else to later - - // at this point we've decoded the floor into buffer - } - } - CHECK(f); - // at this point we've decoded all floors - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - - // re-enable coupled channels if necessary - memcpy(really_zero_channel, zero_channel, sizeof(really_zero_channel[0]) * f->channels); - for (i=0; i < map->coupling_steps; ++i) - if (!zero_channel[map->chan[i].magnitude] || !zero_channel[map->chan[i].angle]) { - zero_channel[map->chan[i].magnitude] = zero_channel[map->chan[i].angle] = FALSE; - } - - CHECK(f); -// RESIDUE DECODE - for (i=0; i < map->submaps; ++i) { - float *residue_buffers[STB_VORBIS_MAX_CHANNELS]; - int r; - uint8 do_not_decode[256]; - int ch = 0; - for (j=0; j < f->channels; ++j) { - if (map->chan[j].mux == i) { - if (zero_channel[j]) { - do_not_decode[ch] = TRUE; - residue_buffers[ch] = NULL; - } else { - do_not_decode[ch] = FALSE; - residue_buffers[ch] = f->channel_buffers[j]; - } - ++ch; - } - } - r = map->submap_residue[i]; - decode_residue(f, residue_buffers, ch, n2, r, do_not_decode); - } - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - CHECK(f); - -// INVERSE COUPLING - for (i = map->coupling_steps-1; i >= 0; --i) { - int n2 = n >> 1; - float *m = f->channel_buffers[map->chan[i].magnitude]; - float *a = f->channel_buffers[map->chan[i].angle ]; - for (j=0; j < n2; ++j) { - float a2,m2; - if (m[j] > 0) - if (a[j] > 0) - m2 = m[j], a2 = m[j] - a[j]; - else - a2 = m[j], m2 = m[j] + a[j]; - else - if (a[j] > 0) - m2 = m[j], a2 = m[j] + a[j]; - else - a2 = m[j], m2 = m[j] - a[j]; - m[j] = m2; - a[j] = a2; - } - } - CHECK(f); - - // finish decoding the floors -#ifndef STB_VORBIS_NO_DEFER_FLOOR - for (i=0; i < f->channels; ++i) { - if (really_zero_channel[i]) { - memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); - } else { - do_floor(f, map, i, n, f->channel_buffers[i], f->finalY[i], NULL); - } - } -#else - for (i=0; i < f->channels; ++i) { - if (really_zero_channel[i]) { - memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); - } else { - for (j=0; j < n2; ++j) - f->channel_buffers[i][j] *= f->floor_buffers[i][j]; - } - } -#endif - -// INVERSE MDCT - CHECK(f); - for (i=0; i < f->channels; ++i) - inverse_mdct(f->channel_buffers[i], n, f, m->blockflag); - CHECK(f); - - // this shouldn't be necessary, unless we exited on an error - // and want to flush to get to the next packet - flush_packet(f); - - if (f->first_decode) { - // assume we start so first non-discarded sample is sample 0 - // this isn't to spec, but spec would require us to read ahead - // and decode the size of all current frames--could be done, - // but presumably it's not a commonly used feature - f->current_loc = 0u - n2; // start of first frame is positioned for discard (NB this is an intentional unsigned overflow/wrap-around) - // we might have to discard samples "from" the next frame too, - // if we're lapping a large block then a small at the start? - f->discard_samples_deferred = n - right_end; - f->current_loc_valid = TRUE; - f->first_decode = FALSE; - } else if (f->discard_samples_deferred) { - if (f->discard_samples_deferred >= right_start - left_start) { - f->discard_samples_deferred -= (right_start - left_start); - left_start = right_start; - *p_left = left_start; - } else { - left_start += f->discard_samples_deferred; - *p_left = left_start; - f->discard_samples_deferred = 0; - } - } else if (f->previous_length == 0 && f->current_loc_valid) { - // we're recovering from a seek... that means we're going to discard - // the samples from this packet even though we know our position from - // the last page header, so we need to update the position based on - // the discarded samples here - // but wait, the code below is going to add this in itself even - // on a discard, so we don't need to do it here... - } - - // check if we have ogg information about the sample # for this packet - if (f->last_seg_which == f->end_seg_with_known_loc) { - // if we have a valid current loc, and this is final: - if (f->current_loc_valid && (f->page_flag & PAGEFLAG_last_page)) { - uint32 current_end = f->known_loc_for_packet; - // then let's infer the size of the (probably) short final frame - if (current_end < f->current_loc + (right_end-left_start)) { - if (current_end < f->current_loc) { - // negative truncation, that's impossible! - *len = 0; - } else { - *len = current_end - f->current_loc; - } - *len += left_start; // this doesn't seem right, but has no ill effect on my test files - if (*len > right_end) *len = right_end; // this should never happen - f->current_loc += *len; - return TRUE; - } - } - // otherwise, just set our sample loc - // guess that the ogg granule pos refers to the _middle_ of the - // last frame? - // set f->current_loc to the position of left_start - f->current_loc = f->known_loc_for_packet - (n2-left_start); - f->current_loc_valid = TRUE; - } - if (f->current_loc_valid) - f->current_loc += (right_start - left_start); - - if (f->alloc.alloc_buffer) - assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); - *len = right_end; // ignore samples after the window goes to 0 - CHECK(f); - - return TRUE; -} - -static int vorbis_decode_packet(vorb *f, int *len, int *p_left, int *p_right) -{ - int mode, left_end, right_end; - if (!vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0; - return vorbis_decode_packet_rest(f, len, f->mode_config + mode, *p_left, left_end, *p_right, right_end, p_left); -} - -static int vorbis_finish_frame(stb_vorbis *f, int len, int left, int right) -{ - int prev,i,j; - // we use right&left (the start of the right- and left-window sin()-regions) - // to determine how much to return, rather than inferring from the rules - // (same result, clearer code); 'left' indicates where our sin() window - // starts, therefore where the previous window's right edge starts, and - // therefore where to start mixing from the previous buffer. 'right' - // indicates where our sin() ending-window starts, therefore that's where - // we start saving, and where our returned-data ends. - - // mixin from previous window - if (f->previous_length) { - int i,j, n = f->previous_length; - float *w = get_window(f, n); - if (w == NULL) return 0; - for (i=0; i < f->channels; ++i) { - for (j=0; j < n; ++j) - f->channel_buffers[i][left+j] = - f->channel_buffers[i][left+j]*w[ j] + - f->previous_window[i][ j]*w[n-1-j]; - } - } - - prev = f->previous_length; - - // last half of this data becomes previous window - f->previous_length = len - right; - - // @OPTIMIZE: could avoid this copy by double-buffering the - // output (flipping previous_window with channel_buffers), but - // then previous_window would have to be 2x as large, and - // channel_buffers couldn't be temp mem (although they're NOT - // currently temp mem, they could be (unless we want to level - // performance by spreading out the computation)) - for (i=0; i < f->channels; ++i) - for (j=0; right+j < len; ++j) - f->previous_window[i][j] = f->channel_buffers[i][right+j]; - - if (!prev) - // there was no previous packet, so this data isn't valid... - // this isn't entirely true, only the would-have-overlapped data - // isn't valid, but this seems to be what the spec requires - return 0; - - // truncate a short frame - if (len < right) right = len; - - f->samples_output += right-left; - - return right - left; -} - -static int vorbis_pump_first_frame(stb_vorbis *f) -{ - int len, right, left, res; - res = vorbis_decode_packet(f, &len, &left, &right); - if (res) - vorbis_finish_frame(f, len, left, right); - return res; -} - -#ifndef STB_VORBIS_NO_PUSHDATA_API -static int is_whole_packet_present(stb_vorbis *f) -{ - // make sure that we have the packet available before continuing... - // this requires a full ogg parse, but we know we can fetch from f->stream - - // instead of coding this out explicitly, we could save the current read state, - // read the next packet with get8() until end-of-packet, check f->eof, then - // reset the state? but that would be slower, esp. since we'd have over 256 bytes - // of state to restore (primarily the page segment table) - - int s = f->next_seg, first = TRUE; - uint8 *p = f->stream; - - if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag - for (; s < f->segment_count; ++s) { - p += f->segments[s]; - if (f->segments[s] < 255) // stop at first short segment - break; - } - // either this continues, or it ends it... - if (s == f->segment_count) - s = -1; // set 'crosses page' flag - if (p > f->stream_end) return error(f, VORBIS_need_more_data); - first = FALSE; - } - for (; s == -1;) { - uint8 *q; - int n; - - // check that we have the page header ready - if (p + 26 >= f->stream_end) return error(f, VORBIS_need_more_data); - // validate the page - if (memcmp(p, ogg_page_header, 4)) return error(f, VORBIS_invalid_stream); - if (p[4] != 0) return error(f, VORBIS_invalid_stream); - if (first) { // the first segment must NOT have 'continued_packet', later ones MUST - if (f->previous_length) - if ((p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); - // if no previous length, we're resynching, so we can come in on a continued-packet, - // which we'll just drop - } else { - if (!(p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); - } - n = p[26]; // segment counts - q = p+27; // q points to segment table - p = q + n; // advance past header - // make sure we've read the segment table - if (p > f->stream_end) return error(f, VORBIS_need_more_data); - for (s=0; s < n; ++s) { - p += q[s]; - if (q[s] < 255) - break; - } - if (s == n) - s = -1; // set 'crosses page' flag - if (p > f->stream_end) return error(f, VORBIS_need_more_data); - first = FALSE; - } - return TRUE; -} -#endif // !STB_VORBIS_NO_PUSHDATA_API - -static int start_decoder(vorb *f) -{ - uint8 header[6], x,y; - int len,i,j,k, max_submaps = 0; - int longest_floorlist=0; - - // first page, first packet - f->first_decode = TRUE; - - if (!start_page(f)) return FALSE; - // validate page flag - if (!(f->page_flag & PAGEFLAG_first_page)) return error(f, VORBIS_invalid_first_page); - if (f->page_flag & PAGEFLAG_last_page) return error(f, VORBIS_invalid_first_page); - if (f->page_flag & PAGEFLAG_continued_packet) return error(f, VORBIS_invalid_first_page); - // check for expected packet length - if (f->segment_count != 1) return error(f, VORBIS_invalid_first_page); - if (f->segments[0] != 30) { - // check for the Ogg skeleton fishead identifying header to refine our error - if (f->segments[0] == 64 && - getn(f, header, 6) && - header[0] == 'f' && - header[1] == 'i' && - header[2] == 's' && - header[3] == 'h' && - header[4] == 'e' && - header[5] == 'a' && - get8(f) == 'd' && - get8(f) == '\0') return error(f, VORBIS_ogg_skeleton_not_supported); - else - return error(f, VORBIS_invalid_first_page); - } - - // read packet - // check packet header - if (get8(f) != VORBIS_packet_id) return error(f, VORBIS_invalid_first_page); - if (!getn(f, header, 6)) return error(f, VORBIS_unexpected_eof); - if (!vorbis_validate(header)) return error(f, VORBIS_invalid_first_page); - // vorbis_version - if (get32(f) != 0) return error(f, VORBIS_invalid_first_page); - f->channels = get8(f); if (!f->channels) return error(f, VORBIS_invalid_first_page); - if (f->channels > STB_VORBIS_MAX_CHANNELS) return error(f, VORBIS_too_many_channels); - f->sample_rate = get32(f); if (!f->sample_rate) return error(f, VORBIS_invalid_first_page); - get32(f); // bitrate_maximum - get32(f); // bitrate_nominal - get32(f); // bitrate_minimum - x = get8(f); - { - int log0,log1; - log0 = x & 15; - log1 = x >> 4; - f->blocksize_0 = 1 << log0; - f->blocksize_1 = 1 << log1; - if (log0 < 6 || log0 > 13) return error(f, VORBIS_invalid_setup); - if (log1 < 6 || log1 > 13) return error(f, VORBIS_invalid_setup); - if (log0 > log1) return error(f, VORBIS_invalid_setup); - } - - // framing_flag - x = get8(f); - if (!(x & 1)) return error(f, VORBIS_invalid_first_page); - - // second packet! - if (!start_page(f)) return FALSE; - - if (!start_packet(f)) return FALSE; - - if (!next_segment(f)) return FALSE; - - if (get8_packet(f) != VORBIS_packet_comment) return error(f, VORBIS_invalid_setup); - for (i=0; i < 6; ++i) header[i] = get8_packet(f); - if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); - //file vendor - len = get32_packet(f); - f->vendor = (char*)setup_malloc(f, sizeof(char) * (len+1)); - if (f->vendor == NULL) return error(f, VORBIS_outofmem); - for(i=0; i < len; ++i) { - f->vendor[i] = get8_packet(f); - } - f->vendor[len] = (char)'\0'; - //user comments - f->comment_list_length = get32_packet(f); - f->comment_list = NULL; - if (f->comment_list_length > 0) - { - f->comment_list = (char**) setup_malloc(f, sizeof(char*) * (f->comment_list_length)); - if (f->comment_list == NULL) return error(f, VORBIS_outofmem); - } - - for(i=0; i < f->comment_list_length; ++i) { - len = get32_packet(f); - f->comment_list[i] = (char*)setup_malloc(f, sizeof(char) * (len+1)); - if (f->comment_list[i] == NULL) return error(f, VORBIS_outofmem); - - for(j=0; j < len; ++j) { - f->comment_list[i][j] = get8_packet(f); - } - f->comment_list[i][len] = (char)'\0'; - } - - // framing_flag - x = get8_packet(f); - if (!(x & 1)) return error(f, VORBIS_invalid_setup); - - - skip(f, f->bytes_in_seg); - f->bytes_in_seg = 0; - - do { - len = next_segment(f); - skip(f, len); - f->bytes_in_seg = 0; - } while (len); - - // third packet! - if (!start_packet(f)) return FALSE; - - #ifndef STB_VORBIS_NO_PUSHDATA_API - if (IS_PUSH_MODE(f)) { - if (!is_whole_packet_present(f)) { - // convert error in ogg header to write type - if (f->error == VORBIS_invalid_stream) - f->error = VORBIS_invalid_setup; - return FALSE; - } - } - #endif - - crc32_init(); // always init it, to avoid multithread race conditions - - if (get8_packet(f) != VORBIS_packet_setup) return error(f, VORBIS_invalid_setup); - for (i=0; i < 6; ++i) header[i] = get8_packet(f); - if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); - - // codebooks - - f->codebook_count = get_bits(f,8) + 1; - f->codebooks = (Codebook *) setup_malloc(f, sizeof(*f->codebooks) * f->codebook_count); - if (f->codebooks == NULL) return error(f, VORBIS_outofmem); - memset(f->codebooks, 0, sizeof(*f->codebooks) * f->codebook_count); - for (i=0; i < f->codebook_count; ++i) { - uint32 *values; - int ordered, sorted_count; - int total=0; - uint8 *lengths; - Codebook *c = f->codebooks+i; - CHECK(f); - x = get_bits(f, 8); if (x != 0x42) return error(f, VORBIS_invalid_setup); - x = get_bits(f, 8); if (x != 0x43) return error(f, VORBIS_invalid_setup); - x = get_bits(f, 8); if (x != 0x56) return error(f, VORBIS_invalid_setup); - x = get_bits(f, 8); - c->dimensions = (get_bits(f, 8)<<8) + x; - x = get_bits(f, 8); - y = get_bits(f, 8); - c->entries = (get_bits(f, 8)<<16) + (y<<8) + x; - ordered = get_bits(f,1); - c->sparse = ordered ? 0 : get_bits(f,1); - - if (c->dimensions == 0 && c->entries != 0) return error(f, VORBIS_invalid_setup); - - if (c->sparse) - lengths = (uint8 *) setup_temp_malloc(f, c->entries); - else - lengths = c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); - - if (!lengths) return error(f, VORBIS_outofmem); - - if (ordered) { - int current_entry = 0; - int current_length = get_bits(f,5) + 1; - while (current_entry < c->entries) { - int limit = c->entries - current_entry; - int n = get_bits(f, ilog(limit)); - if (current_length >= 32) return error(f, VORBIS_invalid_setup); - if (current_entry + n > (int) c->entries) { return error(f, VORBIS_invalid_setup); } - memset(lengths + current_entry, current_length, n); - current_entry += n; - ++current_length; - } - } else { - for (j=0; j < c->entries; ++j) { - int present = c->sparse ? get_bits(f,1) : 1; - if (present) { - lengths[j] = get_bits(f, 5) + 1; - ++total; - if (lengths[j] == 32) - return error(f, VORBIS_invalid_setup); - } else { - lengths[j] = NO_CODE; - } - } - } - - if (c->sparse && total >= c->entries >> 2) { - // convert sparse items to non-sparse! - if (c->entries > (int) f->setup_temp_memory_required) - f->setup_temp_memory_required = c->entries; - - c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); - if (c->codeword_lengths == NULL) return error(f, VORBIS_outofmem); - memcpy(c->codeword_lengths, lengths, c->entries); - setup_temp_free(f, lengths, c->entries); // note this is only safe if there have been no intervening temp mallocs! - lengths = c->codeword_lengths; - c->sparse = 0; - } - - // compute the size of the sorted tables - if (c->sparse) { - sorted_count = total; - } else { - sorted_count = 0; - #ifndef STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH - for (j=0; j < c->entries; ++j) - if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE) - ++sorted_count; - #endif - } - - c->sorted_entries = sorted_count; - values = NULL; - - CHECK(f); - if (!c->sparse) { - c->codewords = (uint32 *) setup_malloc(f, sizeof(c->codewords[0]) * c->entries); - if (!c->codewords) return error(f, VORBIS_outofmem); - } else { - unsigned int size; - if (c->sorted_entries) { - c->codeword_lengths = (uint8 *) setup_malloc(f, c->sorted_entries); - if (!c->codeword_lengths) return error(f, VORBIS_outofmem); - c->codewords = (uint32 *) setup_temp_malloc(f, sizeof(*c->codewords) * c->sorted_entries); - if (!c->codewords) return error(f, VORBIS_outofmem); - values = (uint32 *) setup_temp_malloc(f, sizeof(*values) * c->sorted_entries); - if (!values) return error(f, VORBIS_outofmem); - } - size = c->entries + (sizeof(*c->codewords) + sizeof(*values)) * c->sorted_entries; - if (size > f->setup_temp_memory_required) - f->setup_temp_memory_required = size; - } - - if (!compute_codewords(c, lengths, c->entries, values)) { - if (c->sparse) setup_temp_free(f, values, 0); - return error(f, VORBIS_invalid_setup); - } - - if (c->sorted_entries) { - // allocate an extra slot for sentinels - c->sorted_codewords = (uint32 *) setup_malloc(f, sizeof(*c->sorted_codewords) * (c->sorted_entries+1)); - if (c->sorted_codewords == NULL) return error(f, VORBIS_outofmem); - // allocate an extra slot at the front so that c->sorted_values[-1] is defined - // so that we can catch that case without an extra if - c->sorted_values = ( int *) setup_malloc(f, sizeof(*c->sorted_values ) * (c->sorted_entries+1)); - if (c->sorted_values == NULL) return error(f, VORBIS_outofmem); - ++c->sorted_values; - c->sorted_values[-1] = -1; - compute_sorted_huffman(c, lengths, values); - } - - if (c->sparse) { - setup_temp_free(f, values, sizeof(*values)*c->sorted_entries); - setup_temp_free(f, c->codewords, sizeof(*c->codewords)*c->sorted_entries); - setup_temp_free(f, lengths, c->entries); - c->codewords = NULL; - } - - compute_accelerated_huffman(c); - - CHECK(f); - c->lookup_type = get_bits(f, 4); - if (c->lookup_type > 2) return error(f, VORBIS_invalid_setup); - if (c->lookup_type > 0) { - uint16 *mults; - c->minimum_value = float32_unpack(get_bits(f, 32)); - c->delta_value = float32_unpack(get_bits(f, 32)); - c->value_bits = get_bits(f, 4)+1; - c->sequence_p = get_bits(f,1); - if (c->lookup_type == 1) { - int values = lookup1_values(c->entries, c->dimensions); - if (values < 0) return error(f, VORBIS_invalid_setup); - c->lookup_values = (uint32) values; - } else { - c->lookup_values = c->entries * c->dimensions; - } - if (c->lookup_values == 0) return error(f, VORBIS_invalid_setup); - mults = (uint16 *) setup_temp_malloc(f, sizeof(mults[0]) * c->lookup_values); - if (mults == NULL) return error(f, VORBIS_outofmem); - for (j=0; j < (int) c->lookup_values; ++j) { - int q = get_bits(f, c->value_bits); - if (q == EOP) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_invalid_setup); } - mults[j] = q; - } - -#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK - if (c->lookup_type == 1) { - int len, sparse = c->sparse; - float last=0; - // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop - if (sparse) { - if (c->sorted_entries == 0) goto skip; - c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->sorted_entries * c->dimensions); - } else - c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->entries * c->dimensions); - if (c->multiplicands == NULL) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } - len = sparse ? c->sorted_entries : c->entries; - for (j=0; j < len; ++j) { - unsigned int z = sparse ? c->sorted_values[j] : j; - unsigned int div=1; - for (k=0; k < c->dimensions; ++k) { - int off = (z / div) % c->lookup_values; - float val = mults[off]*c->delta_value + c->minimum_value + last; - c->multiplicands[j*c->dimensions + k] = val; - if (c->sequence_p) - last = val; - if (k+1 < c->dimensions) { - if (div > UINT_MAX / (unsigned int) c->lookup_values) { - setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); - return error(f, VORBIS_invalid_setup); - } - div *= c->lookup_values; - } - } - } - c->lookup_type = 2; - } - else -#endif - { - float last=0; - CHECK(f); - c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->lookup_values); - if (c->multiplicands == NULL) { setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } - for (j=0; j < (int) c->lookup_values; ++j) { - float val = mults[j] * c->delta_value + c->minimum_value + last; - c->multiplicands[j] = val; - if (c->sequence_p) - last = val; - } - } -#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK - skip:; -#endif - setup_temp_free(f, mults, sizeof(mults[0])*c->lookup_values); - - CHECK(f); - } - CHECK(f); - } - - // time domain transfers (notused) - - x = get_bits(f, 6) + 1; - for (i=0; i < x; ++i) { - uint32 z = get_bits(f, 16); - if (z != 0) return error(f, VORBIS_invalid_setup); - } - - // Floors - f->floor_count = get_bits(f, 6)+1; - f->floor_config = (Floor *) setup_malloc(f, f->floor_count * sizeof(*f->floor_config)); - if (f->floor_config == NULL) return error(f, VORBIS_outofmem); - for (i=0; i < f->floor_count; ++i) { - f->floor_types[i] = get_bits(f, 16); - if (f->floor_types[i] > 1) return error(f, VORBIS_invalid_setup); - if (f->floor_types[i] == 0) { - Floor0 *g = &f->floor_config[i].floor0; - g->order = get_bits(f,8); - g->rate = get_bits(f,16); - g->bark_map_size = get_bits(f,16); - g->amplitude_bits = get_bits(f,6); - g->amplitude_offset = get_bits(f,8); - g->number_of_books = get_bits(f,4) + 1; - for (j=0; j < g->number_of_books; ++j) - g->book_list[j] = get_bits(f,8); - return error(f, VORBIS_feature_not_supported); - } else { - stbv__floor_ordering p[31*8+2]; - Floor1 *g = &f->floor_config[i].floor1; - int max_class = -1; - g->partitions = get_bits(f, 5); - for (j=0; j < g->partitions; ++j) { - g->partition_class_list[j] = get_bits(f, 4); - if (g->partition_class_list[j] > max_class) - max_class = g->partition_class_list[j]; - } - for (j=0; j <= max_class; ++j) { - g->class_dimensions[j] = get_bits(f, 3)+1; - g->class_subclasses[j] = get_bits(f, 2); - if (g->class_subclasses[j]) { - g->class_masterbooks[j] = get_bits(f, 8); - if (g->class_masterbooks[j] >= f->codebook_count) return error(f, VORBIS_invalid_setup); - } - for (k=0; k < 1 << g->class_subclasses[j]; ++k) { - g->subclass_books[j][k] = (int16)get_bits(f,8)-1; - if (g->subclass_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); - } - } - g->floor1_multiplier = get_bits(f,2)+1; - g->rangebits = get_bits(f,4); - g->Xlist[0] = 0; - g->Xlist[1] = 1 << g->rangebits; - g->values = 2; - for (j=0; j < g->partitions; ++j) { - int c = g->partition_class_list[j]; - for (k=0; k < g->class_dimensions[c]; ++k) { - g->Xlist[g->values] = get_bits(f, g->rangebits); - ++g->values; - } - } - // precompute the sorting - for (j=0; j < g->values; ++j) { - p[j].x = g->Xlist[j]; - p[j].id = j; - } - qsort(p, g->values, sizeof(p[0]), point_compare); - for (j=0; j < g->values-1; ++j) - if (p[j].x == p[j+1].x) - return error(f, VORBIS_invalid_setup); - for (j=0; j < g->values; ++j) - g->sorted_order[j] = (uint8) p[j].id; - // precompute the neighbors - for (j=2; j < g->values; ++j) { - int low = 0,hi = 0; - neighbors(g->Xlist, j, &low,&hi); - g->neighbors[j][0] = low; - g->neighbors[j][1] = hi; - } - - if (g->values > longest_floorlist) - longest_floorlist = g->values; - } - } - - // Residue - f->residue_count = get_bits(f, 6)+1; - f->residue_config = (Residue *) setup_malloc(f, f->residue_count * sizeof(f->residue_config[0])); - if (f->residue_config == NULL) return error(f, VORBIS_outofmem); - memset(f->residue_config, 0, f->residue_count * sizeof(f->residue_config[0])); - for (i=0; i < f->residue_count; ++i) { - uint8 residue_cascade[64]; - Residue *r = f->residue_config+i; - f->residue_types[i] = get_bits(f, 16); - if (f->residue_types[i] > 2) return error(f, VORBIS_invalid_setup); - r->begin = get_bits(f, 24); - r->end = get_bits(f, 24); - if (r->end < r->begin) return error(f, VORBIS_invalid_setup); - r->part_size = get_bits(f,24)+1; - r->classifications = get_bits(f,6)+1; - r->classbook = get_bits(f,8); - if (r->classbook >= f->codebook_count) return error(f, VORBIS_invalid_setup); - for (j=0; j < r->classifications; ++j) { - uint8 high_bits=0; - uint8 low_bits=get_bits(f,3); - if (get_bits(f,1)) - high_bits = get_bits(f,5); - residue_cascade[j] = high_bits*8 + low_bits; - } - r->residue_books = (short (*)[8]) setup_malloc(f, sizeof(r->residue_books[0]) * r->classifications); - if (r->residue_books == NULL) return error(f, VORBIS_outofmem); - for (j=0; j < r->classifications; ++j) { - for (k=0; k < 8; ++k) { - if (residue_cascade[j] & (1 << k)) { - r->residue_books[j][k] = get_bits(f, 8); - if (r->residue_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); - } else { - r->residue_books[j][k] = -1; - } - } - } - // precompute the classifications[] array to avoid inner-loop mod/divide - // call it 'classdata' since we already have r->classifications - r->classdata = (uint8 **) setup_malloc(f, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); - if (!r->classdata) return error(f, VORBIS_outofmem); - memset(r->classdata, 0, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); - for (j=0; j < f->codebooks[r->classbook].entries; ++j) { - int classwords = f->codebooks[r->classbook].dimensions; - int temp = j; - r->classdata[j] = (uint8 *) setup_malloc(f, sizeof(r->classdata[j][0]) * classwords); - if (r->classdata[j] == NULL) return error(f, VORBIS_outofmem); - for (k=classwords-1; k >= 0; --k) { - r->classdata[j][k] = temp % r->classifications; - temp /= r->classifications; - } - } - } - - f->mapping_count = get_bits(f,6)+1; - f->mapping = (Mapping *) setup_malloc(f, f->mapping_count * sizeof(*f->mapping)); - if (f->mapping == NULL) return error(f, VORBIS_outofmem); - memset(f->mapping, 0, f->mapping_count * sizeof(*f->mapping)); - for (i=0; i < f->mapping_count; ++i) { - Mapping *m = f->mapping + i; - int mapping_type = get_bits(f,16); - if (mapping_type != 0) return error(f, VORBIS_invalid_setup); - m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan)); - if (m->chan == NULL) return error(f, VORBIS_outofmem); - if (get_bits(f,1)) - m->submaps = get_bits(f,4)+1; - else - m->submaps = 1; - if (m->submaps > max_submaps) - max_submaps = m->submaps; - if (get_bits(f,1)) { - m->coupling_steps = get_bits(f,8)+1; - if (m->coupling_steps > f->channels) return error(f, VORBIS_invalid_setup); - for (k=0; k < m->coupling_steps; ++k) { - m->chan[k].magnitude = get_bits(f, ilog(f->channels-1)); - m->chan[k].angle = get_bits(f, ilog(f->channels-1)); - if (m->chan[k].magnitude >= f->channels) return error(f, VORBIS_invalid_setup); - if (m->chan[k].angle >= f->channels) return error(f, VORBIS_invalid_setup); - if (m->chan[k].magnitude == m->chan[k].angle) return error(f, VORBIS_invalid_setup); - } - } else - m->coupling_steps = 0; - - // reserved field - if (get_bits(f,2)) return error(f, VORBIS_invalid_setup); - if (m->submaps > 1) { - for (j=0; j < f->channels; ++j) { - m->chan[j].mux = get_bits(f, 4); - if (m->chan[j].mux >= m->submaps) return error(f, VORBIS_invalid_setup); - } - } else - // @SPECIFICATION: this case is missing from the spec - for (j=0; j < f->channels; ++j) - m->chan[j].mux = 0; - - for (j=0; j < m->submaps; ++j) { - get_bits(f,8); // discard - m->submap_floor[j] = get_bits(f,8); - m->submap_residue[j] = get_bits(f,8); - if (m->submap_floor[j] >= f->floor_count) return error(f, VORBIS_invalid_setup); - if (m->submap_residue[j] >= f->residue_count) return error(f, VORBIS_invalid_setup); - } - } - - // Modes - f->mode_count = get_bits(f, 6)+1; - for (i=0; i < f->mode_count; ++i) { - Mode *m = f->mode_config+i; - m->blockflag = get_bits(f,1); - m->windowtype = get_bits(f,16); - m->transformtype = get_bits(f,16); - m->mapping = get_bits(f,8); - if (m->windowtype != 0) return error(f, VORBIS_invalid_setup); - if (m->transformtype != 0) return error(f, VORBIS_invalid_setup); - if (m->mapping >= f->mapping_count) return error(f, VORBIS_invalid_setup); - } - - flush_packet(f); - - f->previous_length = 0; - - for (i=0; i < f->channels; ++i) { - f->channel_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1); - f->previous_window[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); - f->finalY[i] = (int16 *) setup_malloc(f, sizeof(int16) * longest_floorlist); - if (f->channel_buffers[i] == NULL || f->previous_window[i] == NULL || f->finalY[i] == NULL) return error(f, VORBIS_outofmem); - memset(f->channel_buffers[i], 0, sizeof(float) * f->blocksize_1); - #ifdef STB_VORBIS_NO_DEFER_FLOOR - f->floor_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); - if (f->floor_buffers[i] == NULL) return error(f, VORBIS_outofmem); - #endif - } - - if (!init_blocksize(f, 0, f->blocksize_0)) return FALSE; - if (!init_blocksize(f, 1, f->blocksize_1)) return FALSE; - f->blocksize[0] = f->blocksize_0; - f->blocksize[1] = f->blocksize_1; - -#ifdef STB_VORBIS_DIVIDE_TABLE - if (integer_divide_table[1][1]==0) - for (i=0; i < DIVTAB_NUMER; ++i) - for (j=1; j < DIVTAB_DENOM; ++j) - integer_divide_table[i][j] = i / j; -#endif - - // compute how much temporary memory is needed - - // 1. - { - uint32 imdct_mem = (f->blocksize_1 * sizeof(float) >> 1); - uint32 classify_mem; - int i,max_part_read=0; - for (i=0; i < f->residue_count; ++i) { - Residue *r = f->residue_config + i; - unsigned int actual_size = f->blocksize_1 / 2; - unsigned int limit_r_begin = r->begin < actual_size ? r->begin : actual_size; - unsigned int limit_r_end = r->end < actual_size ? r->end : actual_size; - int n_read = limit_r_end - limit_r_begin; - int part_read = n_read / r->part_size; - if (part_read > max_part_read) - max_part_read = part_read; - } - #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE - classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(uint8 *)); - #else - classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(int *)); - #endif - - // maximum reasonable partition size is f->blocksize_1 - - f->temp_memory_required = classify_mem; - if (imdct_mem > f->temp_memory_required) - f->temp_memory_required = imdct_mem; - } - - - if (f->alloc.alloc_buffer) { - assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes); - // check if there's enough temp memory so we don't error later - if (f->setup_offset + sizeof(*f) + f->temp_memory_required > (unsigned) f->temp_offset) - return error(f, VORBIS_outofmem); - } - - // @TODO: stb_vorbis_seek_start expects first_audio_page_offset to point to a page - // without PAGEFLAG_continued_packet, so this either points to the first page, or - // the page after the end of the headers. It might be cleaner to point to a page - // in the middle of the headers, when that's the page where the first audio packet - // starts, but we'd have to also correctly skip the end of any continued packet in - // stb_vorbis_seek_start. - if (f->next_seg == -1) { - f->first_audio_page_offset = stb_vorbis_get_file_offset(f); - } else { - f->first_audio_page_offset = 0; - } - - return TRUE; -} - -static void vorbis_deinit(stb_vorbis *p) -{ - int i,j; - - setup_free(p, p->vendor); - for (i=0; i < p->comment_list_length; ++i) { - setup_free(p, p->comment_list[i]); - } - setup_free(p, p->comment_list); - - if (p->residue_config) { - for (i=0; i < p->residue_count; ++i) { - Residue *r = p->residue_config+i; - if (r->classdata) { - for (j=0; j < p->codebooks[r->classbook].entries; ++j) - setup_free(p, r->classdata[j]); - setup_free(p, r->classdata); - } - setup_free(p, r->residue_books); - } - } - - if (p->codebooks) { - CHECK(p); - for (i=0; i < p->codebook_count; ++i) { - Codebook *c = p->codebooks + i; - setup_free(p, c->codeword_lengths); - setup_free(p, c->multiplicands); - setup_free(p, c->codewords); - setup_free(p, c->sorted_codewords); - // c->sorted_values[-1] is the first entry in the array - setup_free(p, c->sorted_values ? c->sorted_values-1 : NULL); - } - setup_free(p, p->codebooks); - } - setup_free(p, p->floor_config); - setup_free(p, p->residue_config); - if (p->mapping) { - for (i=0; i < p->mapping_count; ++i) - setup_free(p, p->mapping[i].chan); - setup_free(p, p->mapping); - } - CHECK(p); - for (i=0; i < p->channels && i < STB_VORBIS_MAX_CHANNELS; ++i) { - setup_free(p, p->channel_buffers[i]); - setup_free(p, p->previous_window[i]); - #ifdef STB_VORBIS_NO_DEFER_FLOOR - setup_free(p, p->floor_buffers[i]); - #endif - setup_free(p, p->finalY[i]); - } - for (i=0; i < 2; ++i) { - setup_free(p, p->A[i]); - setup_free(p, p->B[i]); - setup_free(p, p->C[i]); - setup_free(p, p->window[i]); - setup_free(p, p->bit_reverse[i]); - } - #ifndef STB_VORBIS_NO_STDIO - if (p->close_on_free) fclose(p->f); - #endif -} - -void stb_vorbis_close(stb_vorbis *p) -{ - if (p == NULL) return; - vorbis_deinit(p); - setup_free(p,p); -} - -static void vorbis_init(stb_vorbis *p, const stb_vorbis_alloc *z) -{ - memset(p, 0, sizeof(*p)); // NULL out all malloc'd pointers to start - if (z) { - p->alloc = *z; - p->alloc.alloc_buffer_length_in_bytes &= ~7; - p->temp_offset = p->alloc.alloc_buffer_length_in_bytes; - } - p->eof = 0; - p->error = VORBIS__no_error; - p->stream = NULL; - p->codebooks = NULL; - p->page_crc_tests = -1; - #ifndef STB_VORBIS_NO_STDIO - p->close_on_free = FALSE; - p->f = NULL; - #endif -} - -int stb_vorbis_get_sample_offset(stb_vorbis *f) -{ - if (f->current_loc_valid) - return f->current_loc; - else - return -1; -} - -stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) -{ - stb_vorbis_info d; - d.channels = f->channels; - d.sample_rate = f->sample_rate; - d.setup_memory_required = f->setup_memory_required; - d.setup_temp_memory_required = f->setup_temp_memory_required; - d.temp_memory_required = f->temp_memory_required; - d.max_frame_size = f->blocksize_1 >> 1; - return d; -} - -stb_vorbis_comment stb_vorbis_get_comment(stb_vorbis *f) -{ - stb_vorbis_comment d; - d.vendor = f->vendor; - d.comment_list_length = f->comment_list_length; - d.comment_list = f->comment_list; - return d; -} - -int stb_vorbis_get_error(stb_vorbis *f) -{ - int e = f->error; - f->error = VORBIS__no_error; - return e; -} - -static stb_vorbis * vorbis_alloc(stb_vorbis *f) -{ - stb_vorbis *p = (stb_vorbis *) setup_malloc(f, sizeof(*p)); - return p; -} - -#ifndef STB_VORBIS_NO_PUSHDATA_API - -void stb_vorbis_flush_pushdata(stb_vorbis *f) -{ - f->previous_length = 0; - f->page_crc_tests = 0; - f->discard_samples_deferred = 0; - f->current_loc_valid = FALSE; - f->first_decode = FALSE; - f->samples_output = 0; - f->channel_buffer_start = 0; - f->channel_buffer_end = 0; -} - -static int vorbis_search_for_page_pushdata(vorb *f, uint8 *data, int data_len) -{ - int i,n; - for (i=0; i < f->page_crc_tests; ++i) - f->scan[i].bytes_done = 0; - - // if we have room for more scans, search for them first, because - // they may cause us to stop early if their header is incomplete - if (f->page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) { - if (data_len < 4) return 0; - data_len -= 3; // need to look for 4-byte sequence, so don't miss - // one that straddles a boundary - for (i=0; i < data_len; ++i) { - if (data[i] == 0x4f) { - if (0==memcmp(data+i, ogg_page_header, 4)) { - int j,len; - uint32 crc; - // make sure we have the whole page header - if (i+26 >= data_len || i+27+data[i+26] >= data_len) { - // only read up to this page start, so hopefully we'll - // have the whole page header start next time - data_len = i; - break; - } - // ok, we have it all; compute the length of the page - len = 27 + data[i+26]; - for (j=0; j < data[i+26]; ++j) - len += data[i+27+j]; - // scan everything up to the embedded crc (which we must 0) - crc = 0; - for (j=0; j < 22; ++j) - crc = crc32_update(crc, data[i+j]); - // now process 4 0-bytes - for ( ; j < 26; ++j) - crc = crc32_update(crc, 0); - // len is the total number of bytes we need to scan - n = f->page_crc_tests++; - f->scan[n].bytes_left = len-j; - f->scan[n].crc_so_far = crc; - f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + (data[i+24]<<16) + (data[i+25]<<24); - // if the last frame on a page is continued to the next, then - // we can't recover the sample_loc immediately - if (data[i+27+data[i+26]-1] == 255) - f->scan[n].sample_loc = ~0; - else - f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + (data[i+ 8]<<16) + (data[i+ 9]<<24); - f->scan[n].bytes_done = i+j; - if (f->page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT) - break; - // keep going if we still have room for more - } - } - } - } - - for (i=0; i < f->page_crc_tests;) { - uint32 crc; - int j; - int n = f->scan[i].bytes_done; - int m = f->scan[i].bytes_left; - if (m > data_len - n) m = data_len - n; - // m is the bytes to scan in the current chunk - crc = f->scan[i].crc_so_far; - for (j=0; j < m; ++j) - crc = crc32_update(crc, data[n+j]); - f->scan[i].bytes_left -= m; - f->scan[i].crc_so_far = crc; - if (f->scan[i].bytes_left == 0) { - // does it match? - if (f->scan[i].crc_so_far == f->scan[i].goal_crc) { - // Houston, we have page - data_len = n+m; // consumption amount is wherever that scan ended - f->page_crc_tests = -1; // drop out of page scan mode - f->previous_length = 0; // decode-but-don't-output one frame - f->next_seg = -1; // start a new page - f->current_loc = f->scan[i].sample_loc; // set the current sample location - // to the amount we'd have decoded had we decoded this page - f->current_loc_valid = f->current_loc != ~0U; - return data_len; - } - // delete entry - f->scan[i] = f->scan[--f->page_crc_tests]; - } else { - ++i; - } - } - - return data_len; -} - -// return value: number of bytes we used -int stb_vorbis_decode_frame_pushdata( - stb_vorbis *f, // the file we're decoding - const uint8 *data, int data_len, // the memory available for decoding - int *channels, // place to write number of float * buffers - float ***output, // place to write float ** array of float * buffers - int *samples // place to write number of output samples - ) -{ - int i; - int len,right,left; - - if (!IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - - if (f->page_crc_tests >= 0) { - *samples = 0; - return vorbis_search_for_page_pushdata(f, (uint8 *) data, data_len); - } - - f->stream = (uint8 *) data; - f->stream_end = (uint8 *) data + data_len; - f->error = VORBIS__no_error; - - // check that we have the entire packet in memory - if (!is_whole_packet_present(f)) { - *samples = 0; - return 0; - } - - if (!vorbis_decode_packet(f, &len, &left, &right)) { - // save the actual error we encountered - enum STBVorbisError error = f->error; - if (error == VORBIS_bad_packet_type) { - // flush and resynch - f->error = VORBIS__no_error; - while (get8_packet(f) != EOP) - if (f->eof) break; - *samples = 0; - return (int) (f->stream - data); - } - if (error == VORBIS_continued_packet_flag_invalid) { - if (f->previous_length == 0) { - // we may be resynching, in which case it's ok to hit one - // of these; just discard the packet - f->error = VORBIS__no_error; - while (get8_packet(f) != EOP) - if (f->eof) break; - *samples = 0; - return (int) (f->stream - data); - } - } - // if we get an error while parsing, what to do? - // well, it DEFINITELY won't work to continue from where we are! - stb_vorbis_flush_pushdata(f); - // restore the error that actually made us bail - f->error = error; - *samples = 0; - return 1; - } - - // success! - len = vorbis_finish_frame(f, len, left, right); - for (i=0; i < f->channels; ++i) - f->outputs[i] = f->channel_buffers[i] + left; - - if (channels) *channels = f->channels; - *samples = len; - *output = f->outputs; - return (int) (f->stream - data); -} - -stb_vorbis *stb_vorbis_open_pushdata( - const unsigned char *data, int data_len, // the memory available for decoding - int *data_used, // only defined if result is not NULL - int *error, const stb_vorbis_alloc *alloc) -{ - stb_vorbis *f, p; - vorbis_init(&p, alloc); - p.stream = (uint8 *) data; - p.stream_end = (uint8 *) data + data_len; - p.push_mode = TRUE; - if (!start_decoder(&p)) { - if (p.eof) - *error = VORBIS_need_more_data; - else - *error = p.error; - vorbis_deinit(&p); - return NULL; - } - f = vorbis_alloc(&p); - if (f) { - *f = p; - *data_used = (int) (f->stream - data); - *error = 0; - return f; - } else { - vorbis_deinit(&p); - return NULL; - } -} -#endif // STB_VORBIS_NO_PUSHDATA_API - -unsigned int stb_vorbis_get_file_offset(stb_vorbis *f) -{ - #ifndef STB_VORBIS_NO_PUSHDATA_API - if (f->push_mode) return 0; - #endif - if (USE_MEMORY(f)) return (unsigned int) (f->stream - f->stream_start); - #ifndef STB_VORBIS_NO_STDIO - return (unsigned int) (ftell(f->f) - f->f_start); - #endif -} - -#ifndef STB_VORBIS_NO_PULLDATA_API -// -// DATA-PULLING API -// - -static uint32 vorbis_find_page(stb_vorbis *f, uint32 *end, uint32 *last) -{ - for(;;) { - int n; - if (f->eof) return 0; - n = get8(f); - if (n == 0x4f) { // page header candidate - unsigned int retry_loc = stb_vorbis_get_file_offset(f); - int i; - // check if we're off the end of a file_section stream - if (retry_loc - 25 > f->stream_len) - return 0; - // check the rest of the header - for (i=1; i < 4; ++i) - if (get8(f) != ogg_page_header[i]) - break; - if (f->eof) return 0; - if (i == 4) { - uint8 header[27]; - uint32 i, crc, goal, len; - for (i=0; i < 4; ++i) - header[i] = ogg_page_header[i]; - for (; i < 27; ++i) - header[i] = get8(f); - if (f->eof) return 0; - if (header[4] != 0) goto invalid; - goal = header[22] + (header[23] << 8) + (header[24]<<16) + ((uint32)header[25]<<24); - for (i=22; i < 26; ++i) - header[i] = 0; - crc = 0; - for (i=0; i < 27; ++i) - crc = crc32_update(crc, header[i]); - len = 0; - for (i=0; i < header[26]; ++i) { - int s = get8(f); - crc = crc32_update(crc, s); - len += s; - } - if (len && f->eof) return 0; - for (i=0; i < len; ++i) - crc = crc32_update(crc, get8(f)); - // finished parsing probable page - if (crc == goal) { - // we could now check that it's either got the last - // page flag set, OR it's followed by the capture - // pattern, but I guess TECHNICALLY you could have - // a file with garbage between each ogg page and recover - // from it automatically? So even though that paranoia - // might decrease the chance of an invalid decode by - // another 2^32, not worth it since it would hose those - // invalid-but-useful files? - if (end) - *end = stb_vorbis_get_file_offset(f); - if (last) { - if (header[5] & 0x04) - *last = 1; - else - *last = 0; - } - set_file_offset(f, retry_loc-1); - return 1; - } - } - invalid: - // not a valid page, so rewind and look for next one - set_file_offset(f, retry_loc); - } - } -} - - -#define SAMPLE_unknown 0xffffffff - -// seeking is implemented with a binary search, which narrows down the range to -// 64K, before using a linear search (because finding the synchronization -// pattern can be expensive, and the chance we'd find the end page again is -// relatively high for small ranges) -// -// two initial interpolation-style probes are used at the start of the search -// to try to bound either side of the binary search sensibly, while still -// working in O(log n) time if they fail. - -static int get_seek_page_info(stb_vorbis *f, ProbedPage *z) -{ - uint8 header[27], lacing[255]; - int i,len; - - // record where the page starts - z->page_start = stb_vorbis_get_file_offset(f); - - // parse the header - getn(f, header, 27); - if (header[0] != 'O' || header[1] != 'g' || header[2] != 'g' || header[3] != 'S') - return 0; - getn(f, lacing, header[26]); - - // determine the length of the payload - len = 0; - for (i=0; i < header[26]; ++i) - len += lacing[i]; - - // this implies where the page ends - z->page_end = z->page_start + 27 + header[26] + len; - - // read the last-decoded sample out of the data - z->last_decoded_sample = header[6] + (header[7] << 8) + (header[8] << 16) + (header[9] << 24); - - // restore file state to where we were - set_file_offset(f, z->page_start); - return 1; -} - -// rarely used function to seek back to the preceding page while finding the -// start of a packet -static int go_to_page_before(stb_vorbis *f, unsigned int limit_offset) -{ - unsigned int previous_safe, end; - - // now we want to seek back 64K from the limit - if (limit_offset >= 65536 && limit_offset-65536 >= f->first_audio_page_offset) - previous_safe = limit_offset - 65536; - else - previous_safe = f->first_audio_page_offset; - - set_file_offset(f, previous_safe); - - while (vorbis_find_page(f, &end, NULL)) { - if (end >= limit_offset && stb_vorbis_get_file_offset(f) < limit_offset) - return 1; - set_file_offset(f, end); - } - - return 0; -} - -// implements the search logic for finding a page and starting decoding. if -// the function succeeds, current_loc_valid will be true and current_loc will -// be less than or equal to the provided sample number (the closer the -// better). -static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) -{ - ProbedPage left, right, mid; - int i, start_seg_with_known_loc, end_pos, page_start; - uint32 delta, stream_length, padding, last_sample_limit; - double offset = 0.0, bytes_per_sample = 0.0; - int probe = 0; - - // find the last page and validate the target sample - stream_length = stb_vorbis_stream_length_in_samples(f); - if (stream_length == 0) return error(f, VORBIS_seek_without_length); - if (sample_number > stream_length) return error(f, VORBIS_seek_invalid); - - // this is the maximum difference between the window-center (which is the - // actual granule position value), and the right-start (which the spec - // indicates should be the granule position (give or take one)). - padding = ((f->blocksize_1 - f->blocksize_0) >> 2); - if (sample_number < padding) - last_sample_limit = 0; - else - last_sample_limit = sample_number - padding; - - left = f->p_first; - while (left.last_decoded_sample == ~0U) { - // (untested) the first page does not have a 'last_decoded_sample' - set_file_offset(f, left.page_end); - if (!get_seek_page_info(f, &left)) goto error; - } - - right = f->p_last; - assert(right.last_decoded_sample != ~0U); - - // starting from the start is handled differently - if (last_sample_limit <= left.last_decoded_sample) { - if (stb_vorbis_seek_start(f)) { - if (f->current_loc > sample_number) - return error(f, VORBIS_seek_failed); - return 1; - } - return 0; - } - - while (left.page_end != right.page_start) { - assert(left.page_end < right.page_start); - // search range in bytes - delta = right.page_start - left.page_end; - if (delta <= 65536) { - // there's only 64K left to search - handle it linearly - set_file_offset(f, left.page_end); - } else { - if (probe < 2) { - if (probe == 0) { - // first probe (interpolate) - double data_bytes = right.page_end - left.page_start; - bytes_per_sample = data_bytes / right.last_decoded_sample; - offset = left.page_start + bytes_per_sample * (last_sample_limit - left.last_decoded_sample); - } else { - // second probe (try to bound the other side) - double error = ((double) last_sample_limit - mid.last_decoded_sample) * bytes_per_sample; - if (error >= 0 && error < 8000) error = 8000; - if (error < 0 && error > -8000) error = -8000; - offset += error * 2; - } - - // ensure the offset is valid - if (offset < left.page_end) - offset = left.page_end; - if (offset > right.page_start - 65536) - offset = right.page_start - 65536; - - set_file_offset(f, (unsigned int) offset); - } else { - // binary search for large ranges (offset by 32K to ensure - // we don't hit the right page) - set_file_offset(f, left.page_end + (delta / 2) - 32768); - } - - if (!vorbis_find_page(f, NULL, NULL)) goto error; - } - - for (;;) { - if (!get_seek_page_info(f, &mid)) goto error; - if (mid.last_decoded_sample != ~0U) break; - // (untested) no frames end on this page - set_file_offset(f, mid.page_end); - assert(mid.page_start < right.page_start); - } - - // if we've just found the last page again then we're in a tricky file, - // and we're close enough (if it wasn't an interpolation probe). - if (mid.page_start == right.page_start) { - if (probe >= 2 || delta <= 65536) - break; - } else { - if (last_sample_limit < mid.last_decoded_sample) - right = mid; - else - left = mid; - } - - ++probe; - } - - // seek back to start of the last packet - page_start = left.page_start; - set_file_offset(f, page_start); - if (!start_page(f)) return error(f, VORBIS_seek_failed); - end_pos = f->end_seg_with_known_loc; - assert(end_pos >= 0); - - for (;;) { - for (i = end_pos; i > 0; --i) - if (f->segments[i-1] != 255) - break; - - start_seg_with_known_loc = i; - - if (start_seg_with_known_loc > 0 || !(f->page_flag & PAGEFLAG_continued_packet)) - break; - - // (untested) the final packet begins on an earlier page - if (!go_to_page_before(f, page_start)) - goto error; - - page_start = stb_vorbis_get_file_offset(f); - if (!start_page(f)) goto error; - end_pos = f->segment_count - 1; - } - - // prepare to start decoding - f->current_loc_valid = FALSE; - f->last_seg = FALSE; - f->valid_bits = 0; - f->packet_bytes = 0; - f->bytes_in_seg = 0; - f->previous_length = 0; - f->next_seg = start_seg_with_known_loc; - - for (i = 0; i < start_seg_with_known_loc; i++) - skip(f, f->segments[i]); - - // start decoding (optimizable - this frame is generally discarded) - if (!vorbis_pump_first_frame(f)) - return 0; - if (f->current_loc > sample_number) - return error(f, VORBIS_seek_failed); - return 1; - -error: - // try to restore the file to a valid state - stb_vorbis_seek_start(f); - return error(f, VORBIS_seek_failed); -} - -// the same as vorbis_decode_initial, but without advancing -static int peek_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) -{ - int bits_read, bytes_read; - - if (!vorbis_decode_initial(f, p_left_start, p_left_end, p_right_start, p_right_end, mode)) - return 0; - - // either 1 or 2 bytes were read, figure out which so we can rewind - bits_read = 1 + ilog(f->mode_count-1); - if (f->mode_config[*mode].blockflag) - bits_read += 2; - bytes_read = (bits_read + 7) / 8; - - f->bytes_in_seg += bytes_read; - f->packet_bytes -= bytes_read; - skip(f, -bytes_read); - if (f->next_seg == -1) - f->next_seg = f->segment_count - 1; - else - f->next_seg--; - f->valid_bits = 0; - - return 1; -} - -int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number) -{ - uint32 max_frame_samples; - - if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - - // fast page-level search - if (!seek_to_sample_coarse(f, sample_number)) - return 0; - - assert(f->current_loc_valid); - assert(f->current_loc <= sample_number); - - // linear search for the relevant packet - max_frame_samples = (f->blocksize_1*3 - f->blocksize_0) >> 2; - while (f->current_loc < sample_number) { - int left_start, left_end, right_start, right_end, mode, frame_samples; - if (!peek_decode_initial(f, &left_start, &left_end, &right_start, &right_end, &mode)) - return error(f, VORBIS_seek_failed); - // calculate the number of samples returned by the next frame - frame_samples = right_start - left_start; - if (f->current_loc + frame_samples > sample_number) { - return 1; // the next frame will contain the sample - } else if (f->current_loc + frame_samples + max_frame_samples > sample_number) { - // there's a chance the frame after this could contain the sample - vorbis_pump_first_frame(f); - } else { - // this frame is too early to be relevant - f->current_loc += frame_samples; - f->previous_length = 0; - maybe_start_packet(f); - flush_packet(f); - } - } - // the next frame should start with the sample - if (f->current_loc != sample_number) return error(f, VORBIS_seek_failed); - return 1; -} - -int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number) -{ - if (!stb_vorbis_seek_frame(f, sample_number)) - return 0; - - if (sample_number != f->current_loc) { - int n; - uint32 frame_start = f->current_loc; - stb_vorbis_get_frame_float(f, &n, NULL); - assert(sample_number > frame_start); - assert(f->channel_buffer_start + (int) (sample_number-frame_start) <= f->channel_buffer_end); - f->channel_buffer_start += (sample_number - frame_start); - } - - return 1; -} - -int stb_vorbis_seek_start(stb_vorbis *f) -{ - if (IS_PUSH_MODE(f)) { return error(f, VORBIS_invalid_api_mixing); } - set_file_offset(f, f->first_audio_page_offset); - f->previous_length = 0; - f->first_decode = TRUE; - f->next_seg = -1; - return vorbis_pump_first_frame(f); -} - -unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f) -{ - unsigned int restore_offset, previous_safe; - unsigned int end, last_page_loc; - - if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - if (!f->total_samples) { - unsigned int last; - uint32 lo,hi; - char header[6]; - - // first, store the current decode position so we can restore it - restore_offset = stb_vorbis_get_file_offset(f); - - // now we want to seek back 64K from the end (the last page must - // be at most a little less than 64K, but let's allow a little slop) - if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset) - previous_safe = f->stream_len - 65536; - else - previous_safe = f->first_audio_page_offset; - - set_file_offset(f, previous_safe); - // previous_safe is now our candidate 'earliest known place that seeking - // to will lead to the final page' - - if (!vorbis_find_page(f, &end, &last)) { - // if we can't find a page, we're hosed! - f->error = VORBIS_cant_find_last_page; - f->total_samples = 0xffffffff; - goto done; - } - - // check if there are more pages - last_page_loc = stb_vorbis_get_file_offset(f); - - // stop when the last_page flag is set, not when we reach eof; - // this allows us to stop short of a 'file_section' end without - // explicitly checking the length of the section - while (!last) { - set_file_offset(f, end); - if (!vorbis_find_page(f, &end, &last)) { - // the last page we found didn't have the 'last page' flag - // set. whoops! - break; - } - //previous_safe = last_page_loc+1; // NOTE: not used after this point, but note for debugging - last_page_loc = stb_vorbis_get_file_offset(f); - } - - set_file_offset(f, last_page_loc); - - // parse the header - getn(f, (unsigned char *)header, 6); - // extract the absolute granule position - lo = get32(f); - hi = get32(f); - if (lo == 0xffffffff && hi == 0xffffffff) { - f->error = VORBIS_cant_find_last_page; - f->total_samples = SAMPLE_unknown; - goto done; - } - if (hi) - lo = 0xfffffffe; // saturate - f->total_samples = lo; - - f->p_last.page_start = last_page_loc; - f->p_last.page_end = end; - f->p_last.last_decoded_sample = lo; - - done: - set_file_offset(f, restore_offset); - } - return f->total_samples == SAMPLE_unknown ? 0 : f->total_samples; -} - -float stb_vorbis_stream_length_in_seconds(stb_vorbis *f) -{ - return stb_vorbis_stream_length_in_samples(f) / (float) f->sample_rate; -} - - - -int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output) -{ - int len, right,left,i; - if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); - - if (!vorbis_decode_packet(f, &len, &left, &right)) { - f->channel_buffer_start = f->channel_buffer_end = 0; - return 0; - } - - len = vorbis_finish_frame(f, len, left, right); - for (i=0; i < f->channels; ++i) - f->outputs[i] = f->channel_buffers[i] + left; - - f->channel_buffer_start = left; - f->channel_buffer_end = left+len; - - if (channels) *channels = f->channels; - if (output) *output = f->outputs; - return len; -} - -#ifndef STB_VORBIS_NO_STDIO - -stb_vorbis * stb_vorbis_open_file_section(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc, unsigned int length) -{ - stb_vorbis *f, p; - vorbis_init(&p, alloc); - p.f = file; - p.f_start = (uint32) ftell(file); - p.stream_len = length; - p.close_on_free = close_on_free; - if (start_decoder(&p)) { - f = vorbis_alloc(&p); - if (f) { - *f = p; - vorbis_pump_first_frame(f); - return f; - } - } - if (error) *error = p.error; - vorbis_deinit(&p); - return NULL; -} - -stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc) -{ - unsigned int len, start; - start = (unsigned int) ftell(file); - fseek(file, 0, SEEK_END); - len = (unsigned int) (ftell(file) - start); - fseek(file, start, SEEK_SET); - return stb_vorbis_open_file_section(file, close_on_free, error, alloc, len); -} - -stb_vorbis * stb_vorbis_open_filename(const char *filename, int *error, const stb_vorbis_alloc *alloc) -{ - FILE *f; -#if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__) - if (0 != fopen_s(&f, filename, "rb")) - f = NULL; -#else - f = fopen(filename, "rb"); -#endif - if (f) - return stb_vorbis_open_file(f, TRUE, error, alloc); - if (error) *error = VORBIS_file_open_failure; - return NULL; -} -#endif // STB_VORBIS_NO_STDIO - -stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len, int *error, const stb_vorbis_alloc *alloc) -{ - stb_vorbis *f, p; - if (!data) { - if (error) *error = VORBIS_unexpected_eof; - return NULL; - } - vorbis_init(&p, alloc); - p.stream = (uint8 *) data; - p.stream_end = (uint8 *) data + len; - p.stream_start = (uint8 *) p.stream; - p.stream_len = len; - p.push_mode = FALSE; - if (start_decoder(&p)) { - f = vorbis_alloc(&p); - if (f) { - *f = p; - vorbis_pump_first_frame(f); - if (error) *error = VORBIS__no_error; - return f; - } - } - if (error) *error = p.error; - vorbis_deinit(&p); - return NULL; -} - -#ifndef STB_VORBIS_NO_INTEGER_CONVERSION -#define PLAYBACK_MONO 1 -#define PLAYBACK_LEFT 2 -#define PLAYBACK_RIGHT 4 - -#define SBVL (PLAYBACK_LEFT | PLAYBACK_MONO) -#define SBVC (PLAYBACK_LEFT | PLAYBACK_RIGHT | PLAYBACK_MONO) -#define SBVR (PLAYBACK_RIGHT | PLAYBACK_MONO) - -static int8 channel_position[7][6] = -{ - { 0 }, - { SBVC }, - { SBVL, SBVR }, - { SBVL, SBVC, SBVR }, - { SBVL, SBVR, SBVL, SBVR }, - { SBVL, SBVC, SBVR, SBVL, SBVR }, - { SBVL, SBVC, SBVR, SBVL, SBVR, SBVC }, -}; - - -#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT - typedef union { - float f; - int i; - } float_conv; - typedef char stb_vorbis_float_size_test[sizeof(float)==4 && sizeof(int) == 4]; - #define FASTDEF(x) float_conv x - // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round - #define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT)) - #define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22)) - #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + MAGIC(s), temp.i - ADDEND(s)) - #define check_endianness() -#else - #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int) ((x) * (1 << (s)))) - #define check_endianness() - #define FASTDEF(x) -#endif - -static void copy_samples(short *dest, float *src, int len) -{ - int i; - check_endianness(); - for (i=0; i < len; ++i) { - FASTDEF(temp); - int v = FAST_SCALED_FLOAT_TO_INT(temp, src[i],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - dest[i] = v; - } -} - -static void compute_samples(int mask, short *output, int num_c, float **data, int d_offset, int len) -{ - #define STB_BUFFER_SIZE 32 - float buffer[STB_BUFFER_SIZE]; - int i,j,o,n = STB_BUFFER_SIZE; - check_endianness(); - for (o = 0; o < len; o += STB_BUFFER_SIZE) { - memset(buffer, 0, sizeof(buffer)); - if (o + n > len) n = len - o; - for (j=0; j < num_c; ++j) { - if (channel_position[num_c][j] & mask) { - for (i=0; i < n; ++i) - buffer[i] += data[j][d_offset+o+i]; - } - } - for (i=0; i < n; ++i) { - FASTDEF(temp); - int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - output[o+i] = v; - } - } - #undef STB_BUFFER_SIZE -} - -static void compute_stereo_samples(short *output, int num_c, float **data, int d_offset, int len) -{ - #define STB_BUFFER_SIZE 32 - float buffer[STB_BUFFER_SIZE]; - int i,j,o,n = STB_BUFFER_SIZE >> 1; - // o is the offset in the source data - check_endianness(); - for (o = 0; o < len; o += STB_BUFFER_SIZE >> 1) { - // o2 is the offset in the output data - int o2 = o << 1; - memset(buffer, 0, sizeof(buffer)); - if (o + n > len) n = len - o; - for (j=0; j < num_c; ++j) { - int m = channel_position[num_c][j] & (PLAYBACK_LEFT | PLAYBACK_RIGHT); - if (m == (PLAYBACK_LEFT | PLAYBACK_RIGHT)) { - for (i=0; i < n; ++i) { - buffer[i*2+0] += data[j][d_offset+o+i]; - buffer[i*2+1] += data[j][d_offset+o+i]; - } - } else if (m == PLAYBACK_LEFT) { - for (i=0; i < n; ++i) { - buffer[i*2+0] += data[j][d_offset+o+i]; - } - } else if (m == PLAYBACK_RIGHT) { - for (i=0; i < n; ++i) { - buffer[i*2+1] += data[j][d_offset+o+i]; - } - } - } - for (i=0; i < (n<<1); ++i) { - FASTDEF(temp); - int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - output[o2+i] = v; - } - } - #undef STB_BUFFER_SIZE -} - -static void convert_samples_short(int buf_c, short **buffer, int b_offset, int data_c, float **data, int d_offset, int samples) -{ - int i; - if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { - static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; - for (i=0; i < buf_c; ++i) - compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples); - } else { - int limit = buf_c < data_c ? buf_c : data_c; - for (i=0; i < limit; ++i) - copy_samples(buffer[i]+b_offset, data[i]+d_offset, samples); - for ( ; i < buf_c; ++i) - memset(buffer[i]+b_offset, 0, sizeof(short) * samples); - } -} - -int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples) -{ - float **output = NULL; - int len = stb_vorbis_get_frame_float(f, NULL, &output); - if (len > num_samples) len = num_samples; - if (len) - convert_samples_short(num_c, buffer, 0, f->channels, output, 0, len); - return len; -} - -static void convert_channels_short_interleaved(int buf_c, short *buffer, int data_c, float **data, int d_offset, int len) -{ - int i; - check_endianness(); - if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { - assert(buf_c == 2); - for (i=0; i < buf_c; ++i) - compute_stereo_samples(buffer, data_c, data, d_offset, len); - } else { - int limit = buf_c < data_c ? buf_c : data_c; - int j; - for (j=0; j < len; ++j) { - for (i=0; i < limit; ++i) { - FASTDEF(temp); - float f = data[i][d_offset+j]; - int v = FAST_SCALED_FLOAT_TO_INT(temp, f,15);//data[i][d_offset+j],15); - if ((unsigned int) (v + 32768) > 65535) - v = v < 0 ? -32768 : 32767; - *buffer++ = v; - } - for ( ; i < buf_c; ++i) - *buffer++ = 0; - } - } -} - -int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts) -{ - float **output; - int len; - if (num_c == 1) return stb_vorbis_get_frame_short(f,num_c,&buffer, num_shorts); - len = stb_vorbis_get_frame_float(f, NULL, &output); - if (len) { - if (len*num_c > num_shorts) len = num_shorts / num_c; - convert_channels_short_interleaved(num_c, buffer, f->channels, output, 0, len); - } - return len; -} - -int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts) -{ - float **outputs; - int len = num_shorts / channels; - int n=0; - while (n < len) { - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= len) k = len - n; - if (k) - convert_channels_short_interleaved(channels, buffer, f->channels, f->channel_buffers, f->channel_buffer_start, k); - buffer += k*channels; - n += k; - f->channel_buffer_start += k; - if (n == len) break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; - } - return n; -} - -int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int len) -{ - float **outputs; - int n=0; - while (n < len) { - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= len) k = len - n; - if (k) - convert_samples_short(channels, buffer, n, f->channels, f->channel_buffers, f->channel_buffer_start, k); - n += k; - f->channel_buffer_start += k; - if (n == len) break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; - } - return n; -} - -#ifndef STB_VORBIS_NO_STDIO -int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output) -{ - int data_len, offset, total, limit, error; - short *data; - stb_vorbis *v = stb_vorbis_open_filename(filename, &error, NULL); - if (v == NULL) return -1; - limit = v->channels * 4096; - *channels = v->channels; - if (sample_rate) - *sample_rate = v->sample_rate; - offset = data_len = 0; - total = limit; - data = (short *) malloc(total * sizeof(*data)); - if (data == NULL) { - stb_vorbis_close(v); - return -2; - } - for (;;) { - int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); - if (n == 0) break; - data_len += n; - offset += n * v->channels; - if (offset + limit > total) { - short *data2; - total *= 2; - data2 = (short *) realloc(data, total * sizeof(*data)); - if (data2 == NULL) { - free(data); - stb_vorbis_close(v); - return -2; - } - data = data2; - } - } - *output = data; - stb_vorbis_close(v); - return data_len; -} -#endif // NO_STDIO - -int stb_vorbis_decode_memory(const uint8 *mem, int len, int *channels, int *sample_rate, short **output) -{ - int data_len, offset, total, limit, error; - short *data; - stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL); - if (v == NULL) return -1; - limit = v->channels * 4096; - *channels = v->channels; - if (sample_rate) - *sample_rate = v->sample_rate; - offset = data_len = 0; - total = limit; - data = (short *) malloc(total * sizeof(*data)); - if (data == NULL) { - stb_vorbis_close(v); - return -2; - } - for (;;) { - int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); - if (n == 0) break; - data_len += n; - offset += n * v->channels; - if (offset + limit > total) { - short *data2; - total *= 2; - data2 = (short *) realloc(data, total * sizeof(*data)); - if (data2 == NULL) { - free(data); - stb_vorbis_close(v); - return -2; - } - data = data2; - } - } - *output = data; - stb_vorbis_close(v); - return data_len; -} -#endif // STB_VORBIS_NO_INTEGER_CONVERSION - -int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats) -{ - float **outputs; - int len = num_floats / channels; - int n=0; - int z = f->channels; - if (z > channels) z = channels; - while (n < len) { - int i,j; - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= len) k = len - n; - for (j=0; j < k; ++j) { - for (i=0; i < z; ++i) - *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j]; - for ( ; i < channels; ++i) - *buffer++ = 0; - } - n += k; - f->channel_buffer_start += k; - if (n == len) - break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) - break; - } - return n; -} - -int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples) -{ - float **outputs; - int n=0; - int z = f->channels; - if (z > channels) z = channels; - while (n < num_samples) { - int i; - int k = f->channel_buffer_end - f->channel_buffer_start; - if (n+k >= num_samples) k = num_samples - n; - if (k) { - for (i=0; i < z; ++i) - memcpy(buffer[i]+n, f->channel_buffers[i]+f->channel_buffer_start, sizeof(float)*k); - for ( ; i < channels; ++i) - memset(buffer[i]+n, 0, sizeof(float) * k); - } - n += k; - f->channel_buffer_start += k; - if (n == num_samples) - break; - if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) - break; - } - return n; -} -#endif // STB_VORBIS_NO_PULLDATA_API - -/* Version history - 1.17 - 2019-07-08 - fix CVE-2019-13217, -13218, -13219, -13220, -13221, -13222, -13223 - found with Mayhem by ForAllSecure - 1.16 - 2019-03-04 - fix warnings - 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found - 1.14 - 2018-02-11 - delete bogus dealloca usage - 1.13 - 2018-01-29 - fix truncation of last frame (hopefully) - 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files - 1.11 - 2017-07-23 - fix MinGW compilation - 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory - 1.09 - 2016-04-04 - back out 'avoid discarding last frame' fix from previous version - 1.08 - 2016-04-02 - fixed multiple warnings; fix setup memory leaks; - avoid discarding last frame of audio data - 1.07 - 2015-01-16 - fixed some warnings, fix mingw, const-correct API - some more crash fixes when out of memory or with corrupt files - 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson) - some crash fixes when out of memory or with corrupt files - 1.05 - 2015-04-19 - don't define __forceinline if it's redundant - 1.04 - 2014-08-27 - fix missing const-correct case in API - 1.03 - 2014-08-07 - Warning fixes - 1.02 - 2014-07-09 - Declare qsort compare function _cdecl on windows - 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float - 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in multichannel - (API change) report sample rate for decode-full-file funcs - 0.99996 - bracket #include for macintosh compilation by Laurent Gomila - 0.99995 - use union instead of pointer-cast for fast-float-to-int to avoid alias-optimization problem - 0.99994 - change fast-float-to-int to work in single-precision FPU mode, remove endian-dependence - 0.99993 - remove assert that fired on legal files with empty tables - 0.99992 - rewind-to-start - 0.99991 - bugfix to stb_vorbis_get_samples_short by Bernhard Wodo - 0.9999 - (should have been 0.99990) fix no-CRT support, compiling as C++ - 0.9998 - add a full-decode function with a memory source - 0.9997 - fix a bug in the read-from-FILE case in 0.9996 addition - 0.9996 - query length of vorbis stream in samples/seconds - 0.9995 - bugfix to another optimization that only happened in certain files - 0.9994 - bugfix to one of the optimizations that caused significant (but inaudible?) errors - 0.9993 - performance improvements; runs in 99% to 104% of time of reference implementation - 0.9992 - performance improvement of IMDCT; now performs close to reference implementation - 0.9991 - performance improvement of IMDCT - 0.999 - (should have been 0.9990) performance improvement of IMDCT - 0.998 - no-CRT support from Casey Muratori - 0.997 - bugfixes for bugs found by Terje Mathisen - 0.996 - bugfix: fast-huffman decode initialized incorrectly for sparse codebooks; fixing gives 10% speedup - found by Terje Mathisen - 0.995 - bugfix: fix to 'effective' overrun detection - found by Terje Mathisen - 0.994 - bugfix: garbage decode on final VQ symbol of a non-multiple - found by Terje Mathisen - 0.993 - bugfix: pushdata API required 1 extra byte for empty page (failed to consume final page if empty) - found by Terje Mathisen - 0.992 - fixes for MinGW warning - 0.991 - turn fast-float-conversion on by default - 0.990 - fix push-mode seek recovery if you seek into the headers - 0.98b - fix to bad release of 0.98 - 0.98 - fix push-mode seek recovery; robustify float-to-int and support non-fast mode - 0.97 - builds under c++ (typecasting, don't use 'class' keyword) - 0.96 - somehow MY 0.95 was right, but the web one was wrong, so here's my 0.95 rereleased as 0.96, fixes a typo in the clamping code - 0.95 - clamping code for 16-bit functions - 0.94 - not publically released - 0.93 - fixed all-zero-floor case (was decoding garbage) - 0.92 - fixed a memory leak - 0.91 - conditional compiles to omit parts of the API and the infrastructure to support them: STB_VORBIS_NO_PULLDATA_API, STB_VORBIS_NO_PUSHDATA_API, STB_VORBIS_NO_STDIO, STB_VORBIS_NO_INTEGER_CONVERSION - 0.90 - first public release -*/ - -#endif // STB_VORBIS_HEADER_ONLY - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/install.sh b/install.sh deleted file mode 100755 index b23bd59..0000000 --- a/install.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -echo "Setting up compiler symlinks" -compiler=`realpath vg_compiler.sh` -ln -s $compiler /usr/bin/vgc diff --git a/platformutils/force_link_glibc_2.23.h b/platformutils/force_link_glibc_2.23.h deleted file mode 100644 index 87b1c12..0000000 --- a/platformutils/force_link_glibc_2.23.h +++ /dev/null @@ -1,3727 +0,0 @@ -#if !defined(SET_GLIBC_LINK_VERSIONS_HEADER) && !defined(__ASSEMBLER__) -#define SET_GLIBC_LINK_VERSIONS_HEADER -__asm__(".symver _Exit,_Exit@GLIBC_2.2.5"); -__asm__(".symver _IO_2_1_stderr_,_IO_2_1_stderr_@GLIBC_2.2.5"); -__asm__(".symver _IO_2_1_stdin_,_IO_2_1_stdin_@GLIBC_2.2.5"); -__asm__(".symver _IO_2_1_stdout_,_IO_2_1_stdout_@GLIBC_2.2.5"); -__asm__(".symver _IO_adjust_column,_IO_adjust_column@GLIBC_2.2.5"); -__asm__(".symver _IO_adjust_wcolumn,_IO_adjust_wcolumn@GLIBC_2.2.5"); -__asm__(".symver _IO_default_doallocate,_IO_default_doallocate@GLIBC_2.2.5"); -__asm__(".symver _IO_default_finish,_IO_default_finish@GLIBC_2.2.5"); -__asm__(".symver _IO_default_pbackfail,_IO_default_pbackfail@GLIBC_2.2.5"); -__asm__(".symver _IO_default_uflow,_IO_default_uflow@GLIBC_2.2.5"); -__asm__(".symver _IO_default_xsgetn,_IO_default_xsgetn@GLIBC_2.2.5"); -__asm__(".symver _IO_default_xsputn,_IO_default_xsputn@GLIBC_2.2.5"); -__asm__(".symver _IO_do_write,_IO_do_write@GLIBC_2.2.5"); -__asm__(".symver _IO_doallocbuf,_IO_doallocbuf@GLIBC_2.2.5"); -__asm__(".symver _IO_fclose,_IO_fclose@GLIBC_2.2.5"); -__asm__(".symver _IO_fdopen,_IO_fdopen@GLIBC_2.2.5"); -__asm__(".symver _IO_feof,_IO_feof@GLIBC_2.2.5"); -__asm__(".symver _IO_ferror,_IO_ferror@GLIBC_2.2.5"); -__asm__(".symver _IO_fflush,_IO_fflush@GLIBC_2.2.5"); -__asm__(".symver _IO_fgetpos,_IO_fgetpos@GLIBC_2.2.5"); -__asm__(".symver _IO_fgetpos64,_IO_fgetpos64@GLIBC_2.2.5"); -__asm__(".symver _IO_fgets,_IO_fgets@GLIBC_2.2.5"); -__asm__(".symver _IO_file_attach,_IO_file_attach@GLIBC_2.2.5"); -__asm__(".symver _IO_file_close,_IO_file_close@GLIBC_2.2.5"); -__asm__(".symver _IO_file_close_it,_IO_file_close_it@GLIBC_2.2.5"); -__asm__(".symver _IO_file_doallocate,_IO_file_doallocate@GLIBC_2.2.5"); -__asm__(".symver _IO_file_finish,_IO_file_finish@GLIBC_2.2.5"); -__asm__(".symver _IO_file_fopen,_IO_file_fopen@GLIBC_2.2.5"); -__asm__(".symver _IO_file_init,_IO_file_init@GLIBC_2.2.5"); -__asm__(".symver _IO_file_jumps,_IO_file_jumps@GLIBC_2.2.5"); -__asm__(".symver _IO_file_open,_IO_file_open@GLIBC_2.2.5"); -__asm__(".symver _IO_file_overflow,_IO_file_overflow@GLIBC_2.2.5"); -__asm__(".symver _IO_file_read,_IO_file_read@GLIBC_2.2.5"); -__asm__(".symver _IO_file_seek,_IO_file_seek@GLIBC_2.2.5"); -__asm__(".symver _IO_file_seekoff,_IO_file_seekoff@GLIBC_2.2.5"); -__asm__(".symver _IO_file_setbuf,_IO_file_setbuf@GLIBC_2.2.5"); -__asm__(".symver _IO_file_stat,_IO_file_stat@GLIBC_2.2.5"); -__asm__(".symver _IO_file_sync,_IO_file_sync@GLIBC_2.2.5"); -__asm__(".symver _IO_file_underflow,_IO_file_underflow@GLIBC_2.2.5"); -__asm__(".symver _IO_file_write,_IO_file_write@GLIBC_2.2.5"); -__asm__(".symver _IO_file_xsputn,_IO_file_xsputn@GLIBC_2.2.5"); -__asm__(".symver _IO_flockfile,_IO_flockfile@GLIBC_2.2.5"); -__asm__(".symver _IO_flush_all,_IO_flush_all@GLIBC_2.2.5"); -__asm__(".symver _IO_flush_all_linebuffered,_IO_flush_all_linebuffered@GLIBC_2.2.5"); -__asm__(".symver _IO_fopen,_IO_fopen@GLIBC_2.2.5"); -__asm__(".symver _IO_fprintf,_IO_fprintf@GLIBC_2.2.5"); -__asm__(".symver _IO_fputs,_IO_fputs@GLIBC_2.2.5"); -__asm__(".symver _IO_fread,_IO_fread@GLIBC_2.2.5"); -__asm__(".symver _IO_free_backup_area,_IO_free_backup_area@GLIBC_2.2.5"); -__asm__(".symver _IO_free_wbackup_area,_IO_free_wbackup_area@GLIBC_2.2.5"); -__asm__(".symver _IO_fsetpos,_IO_fsetpos@GLIBC_2.2.5"); -__asm__(".symver _IO_fsetpos64,_IO_fsetpos64@GLIBC_2.2.5"); -__asm__(".symver _IO_ftell,_IO_ftell@GLIBC_2.2.5"); -__asm__(".symver _IO_ftrylockfile,_IO_ftrylockfile@GLIBC_2.2.5"); -__asm__(".symver _IO_funlockfile,_IO_funlockfile@GLIBC_2.2.5"); -__asm__(".symver _IO_fwrite,_IO_fwrite@GLIBC_2.2.5"); -__asm__(".symver _IO_getc,_IO_getc@GLIBC_2.2.5"); -__asm__(".symver _IO_getline,_IO_getline@GLIBC_2.2.5"); -__asm__(".symver _IO_getline_info,_IO_getline_info@GLIBC_2.2.5"); -__asm__(".symver _IO_gets,_IO_gets@GLIBC_2.2.5"); -__asm__(".symver _IO_init,_IO_init@GLIBC_2.2.5"); -__asm__(".symver _IO_init_marker,_IO_init_marker@GLIBC_2.2.5"); -__asm__(".symver _IO_init_wmarker,_IO_init_wmarker@GLIBC_2.2.5"); -__asm__(".symver _IO_iter_begin,_IO_iter_begin@GLIBC_2.2.5"); -__asm__(".symver _IO_iter_end,_IO_iter_end@GLIBC_2.2.5"); -__asm__(".symver _IO_iter_file,_IO_iter_file@GLIBC_2.2.5"); -__asm__(".symver _IO_iter_next,_IO_iter_next@GLIBC_2.2.5"); -__asm__(".symver _IO_least_wmarker,_IO_least_wmarker@GLIBC_2.2.5"); -__asm__(".symver _IO_link_in,_IO_link_in@GLIBC_2.2.5"); -__asm__(".symver _IO_list_all,_IO_list_all@GLIBC_2.2.5"); -__asm__(".symver _IO_list_lock,_IO_list_lock@GLIBC_2.2.5"); -__asm__(".symver _IO_list_resetlock,_IO_list_resetlock@GLIBC_2.2.5"); -__asm__(".symver _IO_list_unlock,_IO_list_unlock@GLIBC_2.2.5"); -__asm__(".symver _IO_marker_delta,_IO_marker_delta@GLIBC_2.2.5"); -__asm__(".symver _IO_marker_difference,_IO_marker_difference@GLIBC_2.2.5"); -__asm__(".symver _IO_padn,_IO_padn@GLIBC_2.2.5"); -__asm__(".symver _IO_peekc_locked,_IO_peekc_locked@GLIBC_2.2.5"); -__asm__(".symver _IO_popen,_IO_popen@GLIBC_2.2.5"); -__asm__(".symver _IO_printf,_IO_printf@GLIBC_2.2.5"); -__asm__(".symver _IO_proc_close,_IO_proc_close@GLIBC_2.2.5"); -__asm__(".symver _IO_proc_open,_IO_proc_open@GLIBC_2.2.5"); -__asm__(".symver _IO_putc,_IO_putc@GLIBC_2.2.5"); -__asm__(".symver _IO_puts,_IO_puts@GLIBC_2.2.5"); -__asm__(".symver _IO_remove_marker,_IO_remove_marker@GLIBC_2.2.5"); -__asm__(".symver _IO_seekmark,_IO_seekmark@GLIBC_2.2.5"); -__asm__(".symver _IO_seekoff,_IO_seekoff@GLIBC_2.2.5"); -__asm__(".symver _IO_seekpos,_IO_seekpos@GLIBC_2.2.5"); -__asm__(".symver _IO_seekwmark,_IO_seekwmark@GLIBC_2.2.5"); -__asm__(".symver _IO_setb,_IO_setb@GLIBC_2.2.5"); -__asm__(".symver _IO_setbuffer,_IO_setbuffer@GLIBC_2.2.5"); -__asm__(".symver _IO_setvbuf,_IO_setvbuf@GLIBC_2.2.5"); -__asm__(".symver _IO_sgetn,_IO_sgetn@GLIBC_2.2.5"); -__asm__(".symver _IO_sprintf,_IO_sprintf@GLIBC_2.2.5"); -__asm__(".symver _IO_sputbackc,_IO_sputbackc@GLIBC_2.2.5"); -__asm__(".symver _IO_sputbackwc,_IO_sputbackwc@GLIBC_2.2.5"); -__asm__(".symver _IO_sscanf,_IO_sscanf@GLIBC_2.2.5"); -__asm__(".symver _IO_str_init_readonly,_IO_str_init_readonly@GLIBC_2.2.5"); -__asm__(".symver _IO_str_init_static,_IO_str_init_static@GLIBC_2.2.5"); -__asm__(".symver _IO_str_overflow,_IO_str_overflow@GLIBC_2.2.5"); -__asm__(".symver _IO_str_pbackfail,_IO_str_pbackfail@GLIBC_2.2.5"); -__asm__(".symver _IO_str_seekoff,_IO_str_seekoff@GLIBC_2.2.5"); -__asm__(".symver _IO_str_underflow,_IO_str_underflow@GLIBC_2.2.5"); -__asm__(".symver _IO_sungetc,_IO_sungetc@GLIBC_2.2.5"); -__asm__(".symver _IO_sungetwc,_IO_sungetwc@GLIBC_2.2.5"); -__asm__(".symver _IO_switch_to_get_mode,_IO_switch_to_get_mode@GLIBC_2.2.5"); -__asm__(".symver _IO_switch_to_main_wget_area,_IO_switch_to_main_wget_area@GLIBC_2.2.5"); -__asm__(".symver _IO_switch_to_wbackup_area,_IO_switch_to_wbackup_area@GLIBC_2.2.5"); -__asm__(".symver _IO_switch_to_wget_mode,_IO_switch_to_wget_mode@GLIBC_2.2.5"); -__asm__(".symver _IO_un_link,_IO_un_link@GLIBC_2.2.5"); -__asm__(".symver _IO_ungetc,_IO_ungetc@GLIBC_2.2.5"); -__asm__(".symver _IO_unsave_markers,_IO_unsave_markers@GLIBC_2.2.5"); -__asm__(".symver _IO_unsave_wmarkers,_IO_unsave_wmarkers@GLIBC_2.2.5"); -__asm__(".symver _IO_vfprintf,_IO_vfprintf@GLIBC_2.2.5"); -__asm__(".symver _IO_vfscanf,_IO_vfscanf@GLIBC_2.2.5"); -__asm__(".symver _IO_vsprintf,_IO_vsprintf@GLIBC_2.2.5"); -__asm__(".symver _IO_wdefault_doallocate,_IO_wdefault_doallocate@GLIBC_2.2.5"); -__asm__(".symver _IO_wdefault_finish,_IO_wdefault_finish@GLIBC_2.2.5"); -__asm__(".symver _IO_wdefault_pbackfail,_IO_wdefault_pbackfail@GLIBC_2.2.5"); -__asm__(".symver _IO_wdefault_uflow,_IO_wdefault_uflow@GLIBC_2.2.5"); -__asm__(".symver _IO_wdefault_xsgetn,_IO_wdefault_xsgetn@GLIBC_2.2.5"); -__asm__(".symver _IO_wdefault_xsputn,_IO_wdefault_xsputn@GLIBC_2.2.5"); -__asm__(".symver _IO_wdo_write,_IO_wdo_write@GLIBC_2.2.5"); -__asm__(".symver _IO_wdoallocbuf,_IO_wdoallocbuf@GLIBC_2.2.5"); -__asm__(".symver _IO_wfile_jumps,_IO_wfile_jumps@GLIBC_2.2.5"); -__asm__(".symver _IO_wfile_overflow,_IO_wfile_overflow@GLIBC_2.2.5"); -__asm__(".symver _IO_wfile_seekoff,_IO_wfile_seekoff@GLIBC_2.2.5"); -__asm__(".symver _IO_wfile_sync,_IO_wfile_sync@GLIBC_2.2.5"); -__asm__(".symver _IO_wfile_underflow,_IO_wfile_underflow@GLIBC_2.2.5"); -__asm__(".symver _IO_wfile_xsputn,_IO_wfile_xsputn@GLIBC_2.2.5"); -__asm__(".symver _IO_wmarker_delta,_IO_wmarker_delta@GLIBC_2.2.5"); -__asm__(".symver _IO_wsetb,_IO_wsetb@GLIBC_2.2.5"); -__asm__(".symver _LIB_VERSION,_LIB_VERSION@GLIBC_2.2.5"); -__asm__(".symver _ZGVbN2v_cos,_ZGVbN2v_cos@GLIBC_2.22"); -__asm__(".symver _ZGVbN2v_exp,_ZGVbN2v_exp@GLIBC_2.22"); -__asm__(".symver _ZGVbN2v_log,_ZGVbN2v_log@GLIBC_2.22"); -__asm__(".symver _ZGVbN2v_sin,_ZGVbN2v_sin@GLIBC_2.22"); -__asm__(".symver _ZGVbN2vv_pow,_ZGVbN2vv_pow@GLIBC_2.22"); -__asm__(".symver _ZGVbN2vvv_sincos,_ZGVbN2vvv_sincos@GLIBC_2.22"); -__asm__(".symver _ZGVbN4v_cosf,_ZGVbN4v_cosf@GLIBC_2.22"); -__asm__(".symver _ZGVbN4v_expf,_ZGVbN4v_expf@GLIBC_2.22"); -__asm__(".symver _ZGVbN4v_logf,_ZGVbN4v_logf@GLIBC_2.22"); -__asm__(".symver _ZGVbN4v_sinf,_ZGVbN4v_sinf@GLIBC_2.22"); -__asm__(".symver _ZGVbN4vv_powf,_ZGVbN4vv_powf@GLIBC_2.22"); -__asm__(".symver _ZGVbN4vvv_sincosf,_ZGVbN4vvv_sincosf@GLIBC_2.22"); -__asm__(".symver _ZGVcN4v_cos,_ZGVcN4v_cos@GLIBC_2.22"); -__asm__(".symver _ZGVcN4v_exp,_ZGVcN4v_exp@GLIBC_2.22"); -__asm__(".symver _ZGVcN4v_log,_ZGVcN4v_log@GLIBC_2.22"); -__asm__(".symver _ZGVcN4v_sin,_ZGVcN4v_sin@GLIBC_2.22"); -__asm__(".symver _ZGVcN4vv_pow,_ZGVcN4vv_pow@GLIBC_2.22"); -__asm__(".symver _ZGVcN4vvv_sincos,_ZGVcN4vvv_sincos@GLIBC_2.22"); -__asm__(".symver _ZGVcN8v_cosf,_ZGVcN8v_cosf@GLIBC_2.22"); -__asm__(".symver _ZGVcN8v_expf,_ZGVcN8v_expf@GLIBC_2.22"); -__asm__(".symver _ZGVcN8v_logf,_ZGVcN8v_logf@GLIBC_2.22"); -__asm__(".symver _ZGVcN8v_sinf,_ZGVcN8v_sinf@GLIBC_2.22"); -__asm__(".symver _ZGVcN8vv_powf,_ZGVcN8vv_powf@GLIBC_2.22"); -__asm__(".symver _ZGVcN8vvv_sincosf,_ZGVcN8vvv_sincosf@GLIBC_2.22"); -__asm__(".symver _ZGVdN4v_cos,_ZGVdN4v_cos@GLIBC_2.22"); -__asm__(".symver _ZGVdN4v_exp,_ZGVdN4v_exp@GLIBC_2.22"); -__asm__(".symver _ZGVdN4v_log,_ZGVdN4v_log@GLIBC_2.22"); -__asm__(".symver _ZGVdN4v_sin,_ZGVdN4v_sin@GLIBC_2.22"); -__asm__(".symver _ZGVdN4vv_pow,_ZGVdN4vv_pow@GLIBC_2.22"); -__asm__(".symver _ZGVdN4vvv_sincos,_ZGVdN4vvv_sincos@GLIBC_2.22"); -__asm__(".symver _ZGVdN8v_cosf,_ZGVdN8v_cosf@GLIBC_2.22"); -__asm__(".symver _ZGVdN8v_expf,_ZGVdN8v_expf@GLIBC_2.22"); -__asm__(".symver _ZGVdN8v_logf,_ZGVdN8v_logf@GLIBC_2.22"); -__asm__(".symver _ZGVdN8v_sinf,_ZGVdN8v_sinf@GLIBC_2.22"); -__asm__(".symver _ZGVdN8vv_powf,_ZGVdN8vv_powf@GLIBC_2.22"); -__asm__(".symver _ZGVdN8vvv_sincosf,_ZGVdN8vvv_sincosf@GLIBC_2.22"); -__asm__(".symver _ZGVeN16v_cosf,_ZGVeN16v_cosf@GLIBC_2.22"); -__asm__(".symver _ZGVeN16v_expf,_ZGVeN16v_expf@GLIBC_2.22"); -__asm__(".symver _ZGVeN16v_logf,_ZGVeN16v_logf@GLIBC_2.22"); -__asm__(".symver _ZGVeN16v_sinf,_ZGVeN16v_sinf@GLIBC_2.22"); -__asm__(".symver _ZGVeN16vv_powf,_ZGVeN16vv_powf@GLIBC_2.22"); -__asm__(".symver _ZGVeN16vvv_sincosf,_ZGVeN16vvv_sincosf@GLIBC_2.22"); -__asm__(".symver _ZGVeN8v_cos,_ZGVeN8v_cos@GLIBC_2.22"); -__asm__(".symver _ZGVeN8v_exp,_ZGVeN8v_exp@GLIBC_2.22"); -__asm__(".symver _ZGVeN8v_log,_ZGVeN8v_log@GLIBC_2.22"); -__asm__(".symver _ZGVeN8v_sin,_ZGVeN8v_sin@GLIBC_2.22"); -__asm__(".symver _ZGVeN8vv_pow,_ZGVeN8vv_pow@GLIBC_2.22"); -__asm__(".symver _ZGVeN8vvv_sincos,_ZGVeN8vvv_sincos@GLIBC_2.22"); -__asm__(".symver __acos_finite,__acos_finite@GLIBC_2.15"); -__asm__(".symver __acosf_finite,__acosf_finite@GLIBC_2.15"); -__asm__(".symver __acosh_finite,__acosh_finite@GLIBC_2.15"); -__asm__(".symver __acoshf_finite,__acoshf_finite@GLIBC_2.15"); -__asm__(".symver __acoshl_finite,__acoshl_finite@GLIBC_2.15"); -__asm__(".symver __acosl_finite,__acosl_finite@GLIBC_2.15"); -__asm__(".symver __adjtimex,__adjtimex@GLIBC_2.2.5"); -__asm__(".symver __after_morecore_hook,__after_morecore_hook@GLIBC_2.2.5"); -__asm__(".symver __arch_prctl,__arch_prctl@GLIBC_2.2.5"); -__asm__(".symver __argz_count,__argz_count@GLIBC_2.2.5"); -__asm__(".symver __argz_next,__argz_next@GLIBC_2.2.5"); -__asm__(".symver __argz_stringify,__argz_stringify@GLIBC_2.2.5"); -__asm__(".symver __asin_finite,__asin_finite@GLIBC_2.15"); -__asm__(".symver __asinf_finite,__asinf_finite@GLIBC_2.15"); -__asm__(".symver __asinl_finite,__asinl_finite@GLIBC_2.15"); -__asm__(".symver __asprintf,__asprintf@GLIBC_2.2.5"); -__asm__(".symver __asprintf_chk,__asprintf_chk@GLIBC_2.8"); -__asm__(".symver __assert,__assert@GLIBC_2.2.5"); -__asm__(".symver __assert_fail,__assert_fail@GLIBC_2.2.5"); -__asm__(".symver __assert_perror_fail,__assert_perror_fail@GLIBC_2.2.5"); -__asm__(".symver __atan2_finite,__atan2_finite@GLIBC_2.15"); -__asm__(".symver __atan2f_finite,__atan2f_finite@GLIBC_2.15"); -__asm__(".symver __atan2l_finite,__atan2l_finite@GLIBC_2.15"); -__asm__(".symver __atanh_finite,__atanh_finite@GLIBC_2.15"); -__asm__(".symver __atanhf_finite,__atanhf_finite@GLIBC_2.15"); -__asm__(".symver __atanhl_finite,__atanhl_finite@GLIBC_2.15"); -__asm__(".symver __b64_ntop,__b64_ntop@GLIBC_2.2.5"); -__asm__(".symver __b64_pton,__b64_pton@GLIBC_2.2.5"); -__asm__(".symver __backtrace,__backtrace@GLIBC_2.2.5"); -__asm__(".symver __backtrace_symbols,__backtrace_symbols@GLIBC_2.2.5"); -__asm__(".symver __backtrace_symbols_fd,__backtrace_symbols_fd@GLIBC_2.2.5"); -__asm__(".symver __bsd_getpgrp,__bsd_getpgrp@GLIBC_2.2.5"); -__asm__(".symver __bzero,__bzero@GLIBC_2.2.5"); -__asm__(".symver __check_rhosts_file,__check_rhosts_file@GLIBC_2.2.5"); -__asm__(".symver __chk_fail,__chk_fail@GLIBC_2.3.4"); -__asm__(".symver __clog10,__clog10@GLIBC_2.2.5"); -__asm__(".symver __clog10f,__clog10f@GLIBC_2.2.5"); -__asm__(".symver __clog10l,__clog10l@GLIBC_2.2.5"); -__asm__(".symver __clone,__clone@GLIBC_2.2.5"); -__asm__(".symver __close,__close@GLIBC_2.2.5"); -__asm__(".symver __cmsg_nxthdr,__cmsg_nxthdr@GLIBC_2.2.5"); -__asm__(".symver __confstr_chk,__confstr_chk@GLIBC_2.4"); -__asm__(".symver __connect,__connect@GLIBC_2.2.5"); -__asm__(".symver __cosh_finite,__cosh_finite@GLIBC_2.15"); -__asm__(".symver __coshf_finite,__coshf_finite@GLIBC_2.15"); -__asm__(".symver __coshl_finite,__coshl_finite@GLIBC_2.15"); -__asm__(".symver __ctype_b_loc,__ctype_b_loc@GLIBC_2.3"); -__asm__(".symver __ctype_get_mb_cur_max,__ctype_get_mb_cur_max@GLIBC_2.2.5"); -__asm__(".symver __ctype_tolower_loc,__ctype_tolower_loc@GLIBC_2.3"); -__asm__(".symver __ctype_toupper_loc,__ctype_toupper_loc@GLIBC_2.3"); -__asm__(".symver __curbrk,__curbrk@GLIBC_2.2.5"); -__asm__(".symver __cxa_at_quick_exit,__cxa_at_quick_exit@GLIBC_2.10"); -__asm__(".symver __cxa_atexit,__cxa_atexit@GLIBC_2.2.5"); -__asm__(".symver __cxa_finalize,__cxa_finalize@GLIBC_2.2.5"); -__asm__(".symver __cxa_thread_atexit_impl,__cxa_thread_atexit_impl@GLIBC_2.18"); -__asm__(".symver __cyg_profile_func_enter,__cyg_profile_func_enter@GLIBC_2.2.5"); -__asm__(".symver __cyg_profile_func_exit,__cyg_profile_func_exit@GLIBC_2.2.5"); -__asm__(".symver __daylight,__daylight@GLIBC_2.2.5"); -__asm__(".symver __dcgettext,__dcgettext@GLIBC_2.2.5"); -__asm__(".symver __default_morecore,__default_morecore@GLIBC_2.2.5"); -__asm__(".symver __dgettext,__dgettext@GLIBC_2.2.5"); -__asm__(".symver __dn_comp,__dn_comp@GLIBC_2.2.5"); -__asm__(".symver __dn_count_labels,__dn_count_labels@GLIBC_2.2.5"); -__asm__(".symver __dn_expand,__dn_expand@GLIBC_2.2.5"); -__asm__(".symver __dn_skipname,__dn_skipname@GLIBC_2.2.5"); -__asm__(".symver __dprintf_chk,__dprintf_chk@GLIBC_2.8"); -__asm__(".symver __dup2,__dup2@GLIBC_2.2.5"); -__asm__(".symver __duplocale,__duplocale@GLIBC_2.2.5"); -__asm__(".symver __endmntent,__endmntent@GLIBC_2.2.5"); -__asm__(".symver __environ,__environ@GLIBC_2.2.5"); -__asm__(".symver __errno_location,__errno_location@GLIBC_2.2.5"); -__asm__(".symver __exp10_finite,__exp10_finite@GLIBC_2.15"); -__asm__(".symver __exp10f_finite,__exp10f_finite@GLIBC_2.15"); -__asm__(".symver __exp10l_finite,__exp10l_finite@GLIBC_2.15"); -__asm__(".symver __exp2_finite,__exp2_finite@GLIBC_2.15"); -__asm__(".symver __exp2f_finite,__exp2f_finite@GLIBC_2.15"); -__asm__(".symver __exp2l_finite,__exp2l_finite@GLIBC_2.15"); -__asm__(".symver __exp_finite,__exp_finite@GLIBC_2.15"); -__asm__(".symver __expf_finite,__expf_finite@GLIBC_2.15"); -__asm__(".symver __expl_finite,__expl_finite@GLIBC_2.15"); -__asm__(".symver __fbufsize,__fbufsize@GLIBC_2.2.5"); -__asm__(".symver __fcntl,__fcntl@GLIBC_2.2.5"); -__asm__(".symver __fdelt_chk,__fdelt_chk@GLIBC_2.15"); -__asm__(".symver __fdelt_warn,__fdelt_warn@GLIBC_2.15"); -__asm__(".symver __fentry__,__fentry__@GLIBC_2.13"); -__asm__(".symver __ffs,__ffs@GLIBC_2.2.5"); -__asm__(".symver __fgets_chk,__fgets_chk@GLIBC_2.4"); -__asm__(".symver __fgets_unlocked_chk,__fgets_unlocked_chk@GLIBC_2.4"); -__asm__(".symver __fgetws_chk,__fgetws_chk@GLIBC_2.4"); -__asm__(".symver __fgetws_unlocked_chk,__fgetws_unlocked_chk@GLIBC_2.4"); -__asm__(".symver __finite,__finite@GLIBC_2.2.5"); -__asm__(".symver __finitef,__finitef@GLIBC_2.2.5"); -__asm__(".symver __finitel,__finitel@GLIBC_2.2.5"); -__asm__(".symver __flbf,__flbf@GLIBC_2.2.5"); -__asm__(".symver __fmod_finite,__fmod_finite@GLIBC_2.15"); -__asm__(".symver __fmodf_finite,__fmodf_finite@GLIBC_2.15"); -__asm__(".symver __fmodl_finite,__fmodl_finite@GLIBC_2.15"); -__asm__(".symver __fork,__fork@GLIBC_2.2.5"); -__asm__(".symver __fp_nquery,__fp_nquery@GLIBC_2.2.5"); -__asm__(".symver __fp_query,__fp_query@GLIBC_2.2.5"); -__asm__(".symver __fp_resstat,__fp_resstat@GLIBC_2.2.5"); -__asm__(".symver __fpclassify,__fpclassify@GLIBC_2.2.5"); -__asm__(".symver __fpclassifyf,__fpclassifyf@GLIBC_2.2.5"); -__asm__(".symver __fpclassifyl,__fpclassifyl@GLIBC_2.2.5"); -__asm__(".symver __fpending,__fpending@GLIBC_2.2.5"); -__asm__(".symver __fprintf_chk,__fprintf_chk@GLIBC_2.3.4"); -__asm__(".symver __fpu_control,__fpu_control@GLIBC_2.2.5"); -__asm__(".symver __fpurge,__fpurge@GLIBC_2.2.5"); -__asm__(".symver __fread_chk,__fread_chk@GLIBC_2.7"); -__asm__(".symver __fread_unlocked_chk,__fread_unlocked_chk@GLIBC_2.7"); -__asm__(".symver __freadable,__freadable@GLIBC_2.2.5"); -__asm__(".symver __freading,__freading@GLIBC_2.2.5"); -__asm__(".symver __free_fdresult,__free_fdresult@GLIBC_2.2.5"); -__asm__(".symver __free_hook,__free_hook@GLIBC_2.2.5"); -__asm__(".symver __freelocale,__freelocale@GLIBC_2.2.5"); -__asm__(".symver __fsetlocking,__fsetlocking@GLIBC_2.2.5"); -__asm__(".symver __fwprintf_chk,__fwprintf_chk@GLIBC_2.4"); -__asm__(".symver __fwritable,__fwritable@GLIBC_2.2.5"); -__asm__(".symver __fwriting,__fwriting@GLIBC_2.2.5"); -__asm__(".symver __fxstat,__fxstat@GLIBC_2.2.5"); -__asm__(".symver __fxstat64,__fxstat64@GLIBC_2.2.5"); -__asm__(".symver __fxstatat,__fxstatat@GLIBC_2.4"); -__asm__(".symver __fxstatat64,__fxstatat64@GLIBC_2.4"); -__asm__(".symver __gamma_r_finite,__gamma_r_finite@GLIBC_2.15"); -__asm__(".symver __gammaf_r_finite,__gammaf_r_finite@GLIBC_2.15"); -__asm__(".symver __gammal_r_finite,__gammal_r_finite@GLIBC_2.15"); -__asm__(".symver __getauxval,__getauxval@GLIBC_2.16"); -__asm__(".symver __getcwd_chk,__getcwd_chk@GLIBC_2.4"); -__asm__(".symver __getdelim,__getdelim@GLIBC_2.2.5"); -__asm__(".symver __getdomainname_chk,__getdomainname_chk@GLIBC_2.4"); -__asm__(".symver __getgroups_chk,__getgroups_chk@GLIBC_2.4"); -__asm__(".symver __gethostname_chk,__gethostname_chk@GLIBC_2.4"); -__asm__(".symver __getlogin_r_chk,__getlogin_r_chk@GLIBC_2.4"); -__asm__(".symver __getmntent_r,__getmntent_r@GLIBC_2.2.5"); -__asm__(".symver __getpagesize,__getpagesize@GLIBC_2.2.5"); -__asm__(".symver __getpgid,__getpgid@GLIBC_2.2.5"); -__asm__(".symver __getpid,__getpid@GLIBC_2.2.5"); -__asm__(".symver __gets_chk,__gets_chk@GLIBC_2.3.4"); -__asm__(".symver __gettimeofday,__gettimeofday@GLIBC_2.2.5"); -__asm__(".symver __getwd_chk,__getwd_chk@GLIBC_2.4"); -__asm__(".symver __gmtime_r,__gmtime_r@GLIBC_2.2.5"); -__asm__(".symver __h_errno_location,__h_errno_location@GLIBC_2.2.5"); -__asm__(".symver __hostalias,__hostalias@GLIBC_2.2.5"); -__asm__(".symver __hypot_finite,__hypot_finite@GLIBC_2.15"); -__asm__(".symver __hypotf_finite,__hypotf_finite@GLIBC_2.15"); -__asm__(".symver __hypotl_finite,__hypotl_finite@GLIBC_2.15"); -__asm__(".symver __isalnum_l,__isalnum_l@GLIBC_2.2.5"); -__asm__(".symver __isalpha_l,__isalpha_l@GLIBC_2.2.5"); -__asm__(".symver __isascii_l,__isascii_l@GLIBC_2.2.5"); -__asm__(".symver __isblank_l,__isblank_l@GLIBC_2.2.5"); -__asm__(".symver __iscntrl_l,__iscntrl_l@GLIBC_2.2.5"); -__asm__(".symver __isctype,__isctype@GLIBC_2.3"); -__asm__(".symver __isdigit_l,__isdigit_l@GLIBC_2.2.5"); -__asm__(".symver __isgraph_l,__isgraph_l@GLIBC_2.2.5"); -__asm__(".symver __isinf,__isinf@GLIBC_2.2.5"); -__asm__(".symver __isinff,__isinff@GLIBC_2.2.5"); -__asm__(".symver __isinfl,__isinfl@GLIBC_2.2.5"); -__asm__(".symver __islower_l,__islower_l@GLIBC_2.2.5"); -__asm__(".symver __isnan,__isnan@GLIBC_2.2.5"); -__asm__(".symver __isnanf,__isnanf@GLIBC_2.2.5"); -__asm__(".symver __isnanl,__isnanl@GLIBC_2.2.5"); -__asm__(".symver __isoc99_fscanf,__isoc99_fscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_fwscanf,__isoc99_fwscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_scanf,__isoc99_scanf@GLIBC_2.7"); -__asm__(".symver __isoc99_sscanf,__isoc99_sscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_swscanf,__isoc99_swscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_vfscanf,__isoc99_vfscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_vfwscanf,__isoc99_vfwscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_vscanf,__isoc99_vscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_vsscanf,__isoc99_vsscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_vswscanf,__isoc99_vswscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_vwscanf,__isoc99_vwscanf@GLIBC_2.7"); -__asm__(".symver __isoc99_wscanf,__isoc99_wscanf@GLIBC_2.7"); -__asm__(".symver __isprint_l,__isprint_l@GLIBC_2.2.5"); -__asm__(".symver __ispunct_l,__ispunct_l@GLIBC_2.2.5"); -__asm__(".symver __issignaling,__issignaling@GLIBC_2.18"); -__asm__(".symver __issignalingf,__issignalingf@GLIBC_2.18"); -__asm__(".symver __issignalingl,__issignalingl@GLIBC_2.18"); -__asm__(".symver __isspace_l,__isspace_l@GLIBC_2.2.5"); -__asm__(".symver __isupper_l,__isupper_l@GLIBC_2.2.5"); -__asm__(".symver __iswalnum_l,__iswalnum_l@GLIBC_2.2.5"); -__asm__(".symver __iswalpha_l,__iswalpha_l@GLIBC_2.2.5"); -__asm__(".symver __iswblank_l,__iswblank_l@GLIBC_2.2.5"); -__asm__(".symver __iswcntrl_l,__iswcntrl_l@GLIBC_2.2.5"); -__asm__(".symver __iswctype,__iswctype@GLIBC_2.2.5"); -__asm__(".symver __iswctype_l,__iswctype_l@GLIBC_2.2.5"); -__asm__(".symver __iswdigit_l,__iswdigit_l@GLIBC_2.2.5"); -__asm__(".symver __iswgraph_l,__iswgraph_l@GLIBC_2.2.5"); -__asm__(".symver __iswlower_l,__iswlower_l@GLIBC_2.2.5"); -__asm__(".symver __iswprint_l,__iswprint_l@GLIBC_2.2.5"); -__asm__(".symver __iswpunct_l,__iswpunct_l@GLIBC_2.2.5"); -__asm__(".symver __iswspace_l,__iswspace_l@GLIBC_2.2.5"); -__asm__(".symver __iswupper_l,__iswupper_l@GLIBC_2.2.5"); -__asm__(".symver __iswxdigit_l,__iswxdigit_l@GLIBC_2.2.5"); -__asm__(".symver __isxdigit_l,__isxdigit_l@GLIBC_2.2.5"); -__asm__(".symver __ivaliduser,__ivaliduser@GLIBC_2.2.5"); -__asm__(".symver __j0_finite,__j0_finite@GLIBC_2.15"); -__asm__(".symver __j0f_finite,__j0f_finite@GLIBC_2.15"); -__asm__(".symver __j0l_finite,__j0l_finite@GLIBC_2.15"); -__asm__(".symver __j1_finite,__j1_finite@GLIBC_2.15"); -__asm__(".symver __j1f_finite,__j1f_finite@GLIBC_2.15"); -__asm__(".symver __j1l_finite,__j1l_finite@GLIBC_2.15"); -__asm__(".symver __jn_finite,__jn_finite@GLIBC_2.15"); -__asm__(".symver __jnf_finite,__jnf_finite@GLIBC_2.15"); -__asm__(".symver __jnl_finite,__jnl_finite@GLIBC_2.15"); -__asm__(".symver __key_decryptsession_pk_LOCAL,__key_decryptsession_pk_LOCAL@GLIBC_2.2.5"); -__asm__(".symver __key_encryptsession_pk_LOCAL,__key_encryptsession_pk_LOCAL@GLIBC_2.2.5"); -__asm__(".symver __key_gendes_LOCAL,__key_gendes_LOCAL@GLIBC_2.2.5"); -__asm__(".symver __lgamma_r_finite,__lgamma_r_finite@GLIBC_2.15"); -__asm__(".symver __lgammaf_r_finite,__lgammaf_r_finite@GLIBC_2.15"); -__asm__(".symver __lgammal_r_finite,__lgammal_r_finite@GLIBC_2.15"); -__asm__(".symver __libc_allocate_rtsig,__libc_allocate_rtsig@GLIBC_2.2.5"); -__asm__(".symver __libc_calloc,__libc_calloc@GLIBC_2.2.5"); -__asm__(".symver __libc_current_sigrtmax,__libc_current_sigrtmax@GLIBC_2.2.5"); -__asm__(".symver __libc_current_sigrtmin,__libc_current_sigrtmin@GLIBC_2.2.5"); -__asm__(".symver __libc_free,__libc_free@GLIBC_2.2.5"); -__asm__(".symver __libc_freeres,__libc_freeres@GLIBC_2.2.5"); -__asm__(".symver __libc_init_first,__libc_init_first@GLIBC_2.2.5"); -__asm__(".symver __libc_mallinfo,__libc_mallinfo@GLIBC_2.2.5"); -__asm__(".symver __libc_malloc,__libc_malloc@GLIBC_2.2.5"); -__asm__(".symver __libc_mallopt,__libc_mallopt@GLIBC_2.2.5"); -__asm__(".symver __libc_memalign,__libc_memalign@GLIBC_2.2.5"); -__asm__(".symver __libc_pvalloc,__libc_pvalloc@GLIBC_2.2.5"); -__asm__(".symver __libc_realloc,__libc_realloc@GLIBC_2.2.5"); -__asm__(".symver __libc_sa_len,__libc_sa_len@GLIBC_2.2.5"); -__asm__(".symver __libc_stack_end,__libc_stack_end@GLIBC_2.2.5"); -__asm__(".symver __libc_start_main,__libc_start_main@GLIBC_2.2.5"); -__asm__(".symver __libc_valloc,__libc_valloc@GLIBC_2.2.5"); -__asm__(".symver __loc_aton,__loc_aton@GLIBC_2.2.5"); -__asm__(".symver __loc_ntoa,__loc_ntoa@GLIBC_2.2.5"); -__asm__(".symver __log10_finite,__log10_finite@GLIBC_2.15"); -__asm__(".symver __log10f_finite,__log10f_finite@GLIBC_2.15"); -__asm__(".symver __log10l_finite,__log10l_finite@GLIBC_2.15"); -__asm__(".symver __log2_finite,__log2_finite@GLIBC_2.15"); -__asm__(".symver __log2f_finite,__log2f_finite@GLIBC_2.15"); -__asm__(".symver __log2l_finite,__log2l_finite@GLIBC_2.15"); -__asm__(".symver __log_finite,__log_finite@GLIBC_2.15"); -__asm__(".symver __logf_finite,__logf_finite@GLIBC_2.15"); -__asm__(".symver __logl_finite,__logl_finite@GLIBC_2.15"); -__asm__(".symver __longjmp_chk,__longjmp_chk@GLIBC_2.11"); -__asm__(".symver __lseek,__lseek@GLIBC_2.2.5"); -__asm__(".symver __lxstat,__lxstat@GLIBC_2.2.5"); -__asm__(".symver __lxstat64,__lxstat64@GLIBC_2.2.5"); -__asm__(".symver __malloc_hook,__malloc_hook@GLIBC_2.2.5"); -__asm__(".symver __malloc_initialize_hook,__malloc_initialize_hook@GLIBC_2.2.5"); -__asm__(".symver __mbrlen,__mbrlen@GLIBC_2.2.5"); -__asm__(".symver __mbrtowc,__mbrtowc@GLIBC_2.2.5"); -__asm__(".symver __mbsnrtowcs_chk,__mbsnrtowcs_chk@GLIBC_2.4"); -__asm__(".symver __mbsrtowcs_chk,__mbsrtowcs_chk@GLIBC_2.4"); -__asm__(".symver __mbstowcs_chk,__mbstowcs_chk@GLIBC_2.4"); -__asm__(".symver __memalign_hook,__memalign_hook@GLIBC_2.2.5"); -__asm__(".symver __memcpy_chk,__memcpy_chk@GLIBC_2.3.4"); -__asm__(".symver __memmove_chk,__memmove_chk@GLIBC_2.3.4"); -__asm__(".symver __mempcpy,__mempcpy@GLIBC_2.2.5"); -__asm__(".symver __mempcpy_chk,__mempcpy_chk@GLIBC_2.3.4"); -__asm__(".symver __mempcpy_small,__mempcpy_small@GLIBC_2.2.5"); -__asm__(".symver __memset_chk,__memset_chk@GLIBC_2.3.4"); -__asm__(".symver __monstartup,__monstartup@GLIBC_2.2.5"); -__asm__(".symver __morecore,__morecore@GLIBC_2.2.5"); -__asm__(".symver __mq_open_2,__mq_open_2@GLIBC_2.7"); -__asm__(".symver __nanosleep,__nanosleep@GLIBC_2.2.6"); -__asm__(".symver __newlocale,__newlocale@GLIBC_2.2.5"); -__asm__(".symver __nis_default_access,__nis_default_access@GLIBC_2.2.5"); -__asm__(".symver __nis_default_group,__nis_default_group@GLIBC_2.2.5"); -__asm__(".symver __nis_default_owner,__nis_default_owner@GLIBC_2.2.5"); -__asm__(".symver __nis_default_ttl,__nis_default_ttl@GLIBC_2.2.5"); -__asm__(".symver __nis_finddirectory,__nis_finddirectory@GLIBC_2.2.5"); -__asm__(".symver __nis_hash,__nis_hash@GLIBC_2.2.5"); -__asm__(".symver __nisbind_connect,__nisbind_connect@GLIBC_2.2.5"); -__asm__(".symver __nisbind_create,__nisbind_create@GLIBC_2.2.5"); -__asm__(".symver __nisbind_destroy,__nisbind_destroy@GLIBC_2.2.5"); -__asm__(".symver __nisbind_next,__nisbind_next@GLIBC_2.2.5"); -__asm__(".symver __nl_langinfo_l,__nl_langinfo_l@GLIBC_2.2.5"); -__asm__(".symver __nss_configure_lookup,__nss_configure_lookup@GLIBC_2.2.5"); -__asm__(".symver __nss_database_lookup,__nss_database_lookup@GLIBC_2.2.5"); -__asm__(".symver __nss_group_lookup,__nss_group_lookup@GLIBC_2.2.5"); -__asm__(".symver __nss_hostname_digits_dots,__nss_hostname_digits_dots@GLIBC_2.2.5"); -__asm__(".symver __nss_hosts_lookup,__nss_hosts_lookup@GLIBC_2.2.5"); -__asm__(".symver __nss_next,__nss_next@GLIBC_2.2.5"); -__asm__(".symver __nss_passwd_lookup,__nss_passwd_lookup@GLIBC_2.2.5"); -__asm__(".symver __obstack_printf_chk,__obstack_printf_chk@GLIBC_2.8"); -__asm__(".symver __obstack_vprintf_chk,__obstack_vprintf_chk@GLIBC_2.8"); -__asm__(".symver __open,__open@GLIBC_2.2.5"); -__asm__(".symver __open64,__open64@GLIBC_2.2.5"); -__asm__(".symver __open64_2,__open64_2@GLIBC_2.7"); -__asm__(".symver __open_2,__open_2@GLIBC_2.7"); -__asm__(".symver __openat64_2,__openat64_2@GLIBC_2.7"); -__asm__(".symver __openat_2,__openat_2@GLIBC_2.7"); -__asm__(".symver __overflow,__overflow@GLIBC_2.2.5"); -__asm__(".symver __p_cdname,__p_cdname@GLIBC_2.2.5"); -__asm__(".symver __p_cdnname,__p_cdnname@GLIBC_2.2.5"); -__asm__(".symver __p_class,__p_class@GLIBC_2.2.5"); -__asm__(".symver __p_class_syms,__p_class_syms@GLIBC_2.2.5"); -__asm__(".symver __p_fqname,__p_fqname@GLIBC_2.2.5"); -__asm__(".symver __p_fqnname,__p_fqnname@GLIBC_2.2.5"); -__asm__(".symver __p_option,__p_option@GLIBC_2.2.5"); -__asm__(".symver __p_query,__p_query@GLIBC_2.2.5"); -__asm__(".symver __p_rcode,__p_rcode@GLIBC_2.3.2"); -__asm__(".symver __p_secstodate,__p_secstodate@GLIBC_2.2.5"); -__asm__(".symver __p_time,__p_time@GLIBC_2.2.5"); -__asm__(".symver __p_type,__p_type@GLIBC_2.2.5"); -__asm__(".symver __p_type_syms,__p_type_syms@GLIBC_2.2.5"); -__asm__(".symver __pipe,__pipe@GLIBC_2.2.5"); -__asm__(".symver __poll,__poll@GLIBC_2.2.5"); -__asm__(".symver __poll_chk,__poll_chk@GLIBC_2.16"); -__asm__(".symver __posix_getopt,__posix_getopt@GLIBC_2.10"); -__asm__(".symver __pow_finite,__pow_finite@GLIBC_2.15"); -__asm__(".symver __powf_finite,__powf_finite@GLIBC_2.15"); -__asm__(".symver __powl_finite,__powl_finite@GLIBC_2.15"); -__asm__(".symver __ppoll_chk,__ppoll_chk@GLIBC_2.16"); -__asm__(".symver __pread64,__pread64@GLIBC_2.2.5"); -__asm__(".symver __pread64_chk,__pread64_chk@GLIBC_2.4"); -__asm__(".symver __pread_chk,__pread_chk@GLIBC_2.4"); -__asm__(".symver __printf_chk,__printf_chk@GLIBC_2.3.4"); -__asm__(".symver __printf_fp,__printf_fp@GLIBC_2.2.5"); -__asm__(".symver __profile_frequency,__profile_frequency@GLIBC_2.2.5"); -__asm__(".symver __progname,__progname@GLIBC_2.2.5"); -__asm__(".symver __progname_full,__progname_full@GLIBC_2.2.5"); -__asm__(".symver __pthread_cleanup_routine,__pthread_cleanup_routine@GLIBC_2.3.3"); -__asm__(".symver __pthread_getspecific,__pthread_getspecific@GLIBC_2.2.5"); -#ifndef _GLIBCXX_SHARED -#ifndef IN_LIBGCC2 -#ifdef _REENTRANT -__asm__(".symver __pthread_key_create,__pthread_key_create@GLIBC_2.2.5"); -#endif -#endif -#endif -__asm__(".symver __pthread_mutex_destroy,__pthread_mutex_destroy@GLIBC_2.2.5"); -__asm__(".symver __pthread_mutex_init,__pthread_mutex_init@GLIBC_2.2.5"); -__asm__(".symver __pthread_mutex_lock,__pthread_mutex_lock@GLIBC_2.2.5"); -__asm__(".symver __pthread_mutex_trylock,__pthread_mutex_trylock@GLIBC_2.2.5"); -__asm__(".symver __pthread_mutex_unlock,__pthread_mutex_unlock@GLIBC_2.2.5"); -__asm__(".symver __pthread_mutexattr_destroy,__pthread_mutexattr_destroy@GLIBC_2.2.5"); -__asm__(".symver __pthread_mutexattr_init,__pthread_mutexattr_init@GLIBC_2.2.5"); -__asm__(".symver __pthread_mutexattr_settype,__pthread_mutexattr_settype@GLIBC_2.2.5"); -__asm__(".symver __pthread_once,__pthread_once@GLIBC_2.2.5"); -__asm__(".symver __pthread_register_cancel,__pthread_register_cancel@GLIBC_2.3.3"); -__asm__(".symver __pthread_register_cancel_defer,__pthread_register_cancel_defer@GLIBC_2.3.3"); -__asm__(".symver __pthread_rwlock_destroy,__pthread_rwlock_destroy@GLIBC_2.2.5"); -__asm__(".symver __pthread_rwlock_init,__pthread_rwlock_init@GLIBC_2.2.5"); -__asm__(".symver __pthread_rwlock_rdlock,__pthread_rwlock_rdlock@GLIBC_2.2.5"); -__asm__(".symver __pthread_rwlock_tryrdlock,__pthread_rwlock_tryrdlock@GLIBC_2.2.5"); -__asm__(".symver __pthread_rwlock_trywrlock,__pthread_rwlock_trywrlock@GLIBC_2.2.5"); -__asm__(".symver __pthread_rwlock_unlock,__pthread_rwlock_unlock@GLIBC_2.2.5"); -__asm__(".symver __pthread_rwlock_wrlock,__pthread_rwlock_wrlock@GLIBC_2.2.5"); -__asm__(".symver __pthread_setspecific,__pthread_setspecific@GLIBC_2.2.5"); -__asm__(".symver __pthread_unregister_cancel,__pthread_unregister_cancel@GLIBC_2.3.3"); -__asm__(".symver __pthread_unregister_cancel_restore,__pthread_unregister_cancel_restore@GLIBC_2.3.3"); -__asm__(".symver __pthread_unwind_next,__pthread_unwind_next@GLIBC_2.3.3"); -__asm__(".symver __ptsname_r_chk,__ptsname_r_chk@GLIBC_2.4"); -__asm__(".symver __putlong,__putlong@GLIBC_2.2.5"); -__asm__(".symver __putshort,__putshort@GLIBC_2.2.5"); -__asm__(".symver __pwrite64,__pwrite64@GLIBC_2.2.5"); -__asm__(".symver __rawmemchr,__rawmemchr@GLIBC_2.2.5"); -__asm__(".symver __rcmd_errstr,__rcmd_errstr@GLIBC_2.2.5"); -__asm__(".symver __read,__read@GLIBC_2.2.5"); -__asm__(".symver __read_chk,__read_chk@GLIBC_2.4"); -__asm__(".symver __readlink_chk,__readlink_chk@GLIBC_2.4"); -__asm__(".symver __readlinkat_chk,__readlinkat_chk@GLIBC_2.5"); -__asm__(".symver __realloc_hook,__realloc_hook@GLIBC_2.2.5"); -__asm__(".symver __realpath_chk,__realpath_chk@GLIBC_2.4"); -__asm__(".symver __recv_chk,__recv_chk@GLIBC_2.4"); -__asm__(".symver __recvfrom_chk,__recvfrom_chk@GLIBC_2.4"); -#ifdef _REENTRANT -__asm__(".symver __register_atfork,__register_atfork@GLIBC_2.3.2"); -#endif -__asm__(".symver __remainder_finite,__remainder_finite@GLIBC_2.15"); -__asm__(".symver __remainderf_finite,__remainderf_finite@GLIBC_2.15"); -__asm__(".symver __remainderl_finite,__remainderl_finite@GLIBC_2.15"); -__asm__(".symver __res_close,__res_close@GLIBC_2.2.5"); -__asm__(".symver __res_dnok,__res_dnok@GLIBC_2.2.5"); -__asm__(".symver __res_hnok,__res_hnok@GLIBC_2.2.5"); -__asm__(".symver __res_hostalias,__res_hostalias@GLIBC_2.2.5"); -__asm__(".symver __res_init,__res_init@GLIBC_2.2.5"); -__asm__(".symver __res_isourserver,__res_isourserver@GLIBC_2.2.5"); -__asm__(".symver __res_mailok,__res_mailok@GLIBC_2.2.5"); -__asm__(".symver __res_mkquery,__res_mkquery@GLIBC_2.2.5"); -__asm__(".symver __res_nameinquery,__res_nameinquery@GLIBC_2.2.5"); -__asm__(".symver __res_nclose,__res_nclose@GLIBC_2.2.5"); -__asm__(".symver __res_ninit,__res_ninit@GLIBC_2.2.5"); -__asm__(".symver __res_nmkquery,__res_nmkquery@GLIBC_2.2.5"); -__asm__(".symver __res_nquery,__res_nquery@GLIBC_2.2.5"); -__asm__(".symver __res_nquerydomain,__res_nquerydomain@GLIBC_2.2.5"); -__asm__(".symver __res_nsearch,__res_nsearch@GLIBC_2.2.5"); -__asm__(".symver __res_nsend,__res_nsend@GLIBC_2.2.5"); -__asm__(".symver __res_ownok,__res_ownok@GLIBC_2.2.5"); -__asm__(".symver __res_queriesmatch,__res_queriesmatch@GLIBC_2.2.5"); -__asm__(".symver __res_query,__res_query@GLIBC_2.2.5"); -__asm__(".symver __res_querydomain,__res_querydomain@GLIBC_2.2.5"); -__asm__(".symver __res_randomid,__res_randomid@GLIBC_2.2.5"); -__asm__(".symver __res_search,__res_search@GLIBC_2.2.5"); -__asm__(".symver __res_send,__res_send@GLIBC_2.2.5"); -__asm__(".symver __res_state,__res_state@GLIBC_2.2.5"); -__asm__(".symver __rpc_thread_svc_max_pollfd,__rpc_thread_svc_max_pollfd@GLIBC_2.2.5"); -__asm__(".symver __rpc_thread_svc_pollfd,__rpc_thread_svc_pollfd@GLIBC_2.2.5"); -__asm__(".symver __sbrk,__sbrk@GLIBC_2.2.5"); -__asm__(".symver __scalb_finite,__scalb_finite@GLIBC_2.15"); -__asm__(".symver __scalbf_finite,__scalbf_finite@GLIBC_2.15"); -__asm__(".symver __scalbl_finite,__scalbl_finite@GLIBC_2.15"); -__asm__(".symver __sched_cpualloc,__sched_cpualloc@GLIBC_2.7"); -__asm__(".symver __sched_cpucount,__sched_cpucount@GLIBC_2.6"); -__asm__(".symver __sched_cpufree,__sched_cpufree@GLIBC_2.7"); -__asm__(".symver __sched_get_priority_max,__sched_get_priority_max@GLIBC_2.2.5"); -__asm__(".symver __sched_get_priority_min,__sched_get_priority_min@GLIBC_2.2.5"); -__asm__(".symver __sched_getparam,__sched_getparam@GLIBC_2.2.5"); -__asm__(".symver __sched_getscheduler,__sched_getscheduler@GLIBC_2.2.5"); -__asm__(".symver __sched_setscheduler,__sched_setscheduler@GLIBC_2.2.5"); -__asm__(".symver __sched_yield,__sched_yield@GLIBC_2.2.5"); -__asm__(".symver __select,__select@GLIBC_2.2.5"); -__asm__(".symver __send,__send@GLIBC_2.2.5"); -__asm__(".symver __setmntent,__setmntent@GLIBC_2.2.5"); -__asm__(".symver __setpgid,__setpgid@GLIBC_2.2.5"); -__asm__(".symver __sigaction,__sigaction@GLIBC_2.2.5"); -__asm__(".symver __sigaddset,__sigaddset@GLIBC_2.2.5"); -__asm__(".symver __sigdelset,__sigdelset@GLIBC_2.2.5"); -__asm__(".symver __sigismember,__sigismember@GLIBC_2.2.5"); -__asm__(".symver __signbit,__signbit@GLIBC_2.2.5"); -__asm__(".symver __signbitf,__signbitf@GLIBC_2.2.5"); -__asm__(".symver __signbitl,__signbitl@GLIBC_2.2.5"); -__asm__(".symver __signgam,__signgam@GLIBC_2.23"); -__asm__(".symver __sigpause,__sigpause@GLIBC_2.2.5"); -__asm__(".symver __sigsetjmp,__sigsetjmp@GLIBC_2.2.5"); -__asm__(".symver __sigsuspend,__sigsuspend@GLIBC_2.2.5"); -__asm__(".symver __sinh_finite,__sinh_finite@GLIBC_2.15"); -__asm__(".symver __sinhf_finite,__sinhf_finite@GLIBC_2.15"); -__asm__(".symver __sinhl_finite,__sinhl_finite@GLIBC_2.15"); -__asm__(".symver __snprintf_chk,__snprintf_chk@GLIBC_2.3.4"); -__asm__(".symver __sprintf_chk,__sprintf_chk@GLIBC_2.3.4"); -__asm__(".symver __sqrt_finite,__sqrt_finite@GLIBC_2.15"); -__asm__(".symver __sqrtf_finite,__sqrtf_finite@GLIBC_2.15"); -__asm__(".symver __sqrtl_finite,__sqrtl_finite@GLIBC_2.15"); -__asm__(".symver __stack_chk_fail,__stack_chk_fail@GLIBC_2.4"); -__asm__(".symver __statfs,__statfs@GLIBC_2.2.5"); -__asm__(".symver __stpcpy,__stpcpy@GLIBC_2.2.5"); -__asm__(".symver __stpcpy_chk,__stpcpy_chk@GLIBC_2.3.4"); -__asm__(".symver __stpcpy_small,__stpcpy_small@GLIBC_2.2.5"); -__asm__(".symver __stpncpy,__stpncpy@GLIBC_2.2.5"); -__asm__(".symver __stpncpy_chk,__stpncpy_chk@GLIBC_2.4"); -__asm__(".symver __strcasecmp,__strcasecmp@GLIBC_2.2.5"); -__asm__(".symver __strcasecmp_l,__strcasecmp_l@GLIBC_2.2.5"); -__asm__(".symver __strcasestr,__strcasestr@GLIBC_2.2.5"); -__asm__(".symver __strcat_chk,__strcat_chk@GLIBC_2.3.4"); -__asm__(".symver __strcoll_l,__strcoll_l@GLIBC_2.2.5"); -__asm__(".symver __strcpy_chk,__strcpy_chk@GLIBC_2.3.4"); -__asm__(".symver __strcpy_small,__strcpy_small@GLIBC_2.2.5"); -__asm__(".symver __strcspn_c1,__strcspn_c1@GLIBC_2.2.5"); -__asm__(".symver __strcspn_c2,__strcspn_c2@GLIBC_2.2.5"); -__asm__(".symver __strcspn_c3,__strcspn_c3@GLIBC_2.2.5"); -__asm__(".symver __strdup,__strdup@GLIBC_2.2.5"); -__asm__(".symver __strerror_r,__strerror_r@GLIBC_2.2.5"); -__asm__(".symver __strfmon_l,__strfmon_l@GLIBC_2.2.5"); -__asm__(".symver __strftime_l,__strftime_l@GLIBC_2.3"); -__asm__(".symver __strncasecmp_l,__strncasecmp_l@GLIBC_2.2.5"); -__asm__(".symver __strncat_chk,__strncat_chk@GLIBC_2.3.4"); -__asm__(".symver __strncpy_chk,__strncpy_chk@GLIBC_2.3.4"); -__asm__(".symver __strndup,__strndup@GLIBC_2.2.5"); -__asm__(".symver __strpbrk_c2,__strpbrk_c2@GLIBC_2.2.5"); -__asm__(".symver __strpbrk_c3,__strpbrk_c3@GLIBC_2.2.5"); -__asm__(".symver __strsep_1c,__strsep_1c@GLIBC_2.2.5"); -__asm__(".symver __strsep_2c,__strsep_2c@GLIBC_2.2.5"); -__asm__(".symver __strsep_3c,__strsep_3c@GLIBC_2.2.5"); -__asm__(".symver __strsep_g,__strsep_g@GLIBC_2.2.5"); -__asm__(".symver __strspn_c1,__strspn_c1@GLIBC_2.2.5"); -__asm__(".symver __strspn_c2,__strspn_c2@GLIBC_2.2.5"); -__asm__(".symver __strspn_c3,__strspn_c3@GLIBC_2.2.5"); -__asm__(".symver __strtod_internal,__strtod_internal@GLIBC_2.2.5"); -__asm__(".symver __strtod_l,__strtod_l@GLIBC_2.2.5"); -__asm__(".symver __strtof_internal,__strtof_internal@GLIBC_2.2.5"); -__asm__(".symver __strtof_l,__strtof_l@GLIBC_2.2.5"); -__asm__(".symver __strtok_r,__strtok_r@GLIBC_2.2.5"); -__asm__(".symver __strtok_r_1c,__strtok_r_1c@GLIBC_2.2.5"); -__asm__(".symver __strtol_internal,__strtol_internal@GLIBC_2.2.5"); -__asm__(".symver __strtol_l,__strtol_l@GLIBC_2.2.5"); -__asm__(".symver __strtold_internal,__strtold_internal@GLIBC_2.2.5"); -__asm__(".symver __strtold_l,__strtold_l@GLIBC_2.2.5"); -__asm__(".symver __strtoll_internal,__strtoll_internal@GLIBC_2.2.5"); -__asm__(".symver __strtoll_l,__strtoll_l@GLIBC_2.2.5"); -__asm__(".symver __strtoul_internal,__strtoul_internal@GLIBC_2.2.5"); -__asm__(".symver __strtoul_l,__strtoul_l@GLIBC_2.2.5"); -__asm__(".symver __strtoull_internal,__strtoull_internal@GLIBC_2.2.5"); -__asm__(".symver __strtoull_l,__strtoull_l@GLIBC_2.2.5"); -__asm__(".symver __strverscmp,__strverscmp@GLIBC_2.2.5"); -__asm__(".symver __strxfrm_l,__strxfrm_l@GLIBC_2.2.5"); -__asm__(".symver __swprintf_chk,__swprintf_chk@GLIBC_2.4"); -__asm__(".symver __sym_ntop,__sym_ntop@GLIBC_2.2.5"); -__asm__(".symver __sym_ntos,__sym_ntos@GLIBC_2.2.5"); -__asm__(".symver __sym_ston,__sym_ston@GLIBC_2.2.5"); -__asm__(".symver __sysconf,__sysconf@GLIBC_2.2.5"); -__asm__(".symver __sysctl,__sysctl@GLIBC_2.2.5"); -__asm__(".symver __syslog_chk,__syslog_chk@GLIBC_2.4"); -__asm__(".symver __sysv_signal,__sysv_signal@GLIBC_2.2.5"); -__asm__(".symver __timezone,__timezone@GLIBC_2.2.5"); -__asm__(".symver __tls_get_addr,__tls_get_addr@GLIBC_2.3"); -__asm__(".symver __toascii_l,__toascii_l@GLIBC_2.2.5"); -__asm__(".symver __tolower_l,__tolower_l@GLIBC_2.2.5"); -__asm__(".symver __toupper_l,__toupper_l@GLIBC_2.2.5"); -__asm__(".symver __towctrans,__towctrans@GLIBC_2.2.5"); -__asm__(".symver __towctrans_l,__towctrans_l@GLIBC_2.2.5"); -__asm__(".symver __towlower_l,__towlower_l@GLIBC_2.2.5"); -__asm__(".symver __towupper_l,__towupper_l@GLIBC_2.2.5"); -__asm__(".symver __ttyname_r_chk,__ttyname_r_chk@GLIBC_2.4"); -__asm__(".symver __tzname,__tzname@GLIBC_2.2.5"); -__asm__(".symver __uflow,__uflow@GLIBC_2.2.5"); -__asm__(".symver __underflow,__underflow@GLIBC_2.2.5"); -__asm__(".symver __uselocale,__uselocale@GLIBC_2.3"); -__asm__(".symver __vasprintf_chk,__vasprintf_chk@GLIBC_2.8"); -__asm__(".symver __vdprintf_chk,__vdprintf_chk@GLIBC_2.8"); -__asm__(".symver __vfork,__vfork@GLIBC_2.2.5"); -__asm__(".symver __vfprintf_chk,__vfprintf_chk@GLIBC_2.3.4"); -__asm__(".symver __vfscanf,__vfscanf@GLIBC_2.2.5"); -__asm__(".symver __vfwprintf_chk,__vfwprintf_chk@GLIBC_2.4"); -__asm__(".symver __vprintf_chk,__vprintf_chk@GLIBC_2.3.4"); -__asm__(".symver __vsnprintf,__vsnprintf@GLIBC_2.2.5"); -__asm__(".symver __vsnprintf_chk,__vsnprintf_chk@GLIBC_2.3.4"); -__asm__(".symver __vsprintf_chk,__vsprintf_chk@GLIBC_2.3.4"); -__asm__(".symver __vsscanf,__vsscanf@GLIBC_2.2.5"); -__asm__(".symver __vswprintf_chk,__vswprintf_chk@GLIBC_2.4"); -__asm__(".symver __vsyslog_chk,__vsyslog_chk@GLIBC_2.4"); -__asm__(".symver __vwprintf_chk,__vwprintf_chk@GLIBC_2.4"); -__asm__(".symver __wait,__wait@GLIBC_2.2.5"); -__asm__(".symver __waitpid,__waitpid@GLIBC_2.2.5"); -__asm__(".symver __wcpcpy_chk,__wcpcpy_chk@GLIBC_2.4"); -__asm__(".symver __wcpncpy_chk,__wcpncpy_chk@GLIBC_2.4"); -__asm__(".symver __wcrtomb_chk,__wcrtomb_chk@GLIBC_2.4"); -__asm__(".symver __wcscasecmp_l,__wcscasecmp_l@GLIBC_2.2.5"); -__asm__(".symver __wcscat_chk,__wcscat_chk@GLIBC_2.4"); -__asm__(".symver __wcscoll_l,__wcscoll_l@GLIBC_2.2.5"); -__asm__(".symver __wcscpy_chk,__wcscpy_chk@GLIBC_2.4"); -__asm__(".symver __wcsftime_l,__wcsftime_l@GLIBC_2.3"); -__asm__(".symver __wcsncasecmp_l,__wcsncasecmp_l@GLIBC_2.2.5"); -__asm__(".symver __wcsncat_chk,__wcsncat_chk@GLIBC_2.4"); -__asm__(".symver __wcsncpy_chk,__wcsncpy_chk@GLIBC_2.4"); -__asm__(".symver __wcsnrtombs_chk,__wcsnrtombs_chk@GLIBC_2.4"); -__asm__(".symver __wcsrtombs_chk,__wcsrtombs_chk@GLIBC_2.4"); -__asm__(".symver __wcstod_internal,__wcstod_internal@GLIBC_2.2.5"); -__asm__(".symver __wcstod_l,__wcstod_l@GLIBC_2.2.5"); -__asm__(".symver __wcstof_internal,__wcstof_internal@GLIBC_2.2.5"); -__asm__(".symver __wcstof_l,__wcstof_l@GLIBC_2.2.5"); -__asm__(".symver __wcstol_internal,__wcstol_internal@GLIBC_2.2.5"); -__asm__(".symver __wcstol_l,__wcstol_l@GLIBC_2.2.5"); -__asm__(".symver __wcstold_internal,__wcstold_internal@GLIBC_2.2.5"); -__asm__(".symver __wcstold_l,__wcstold_l@GLIBC_2.2.5"); -__asm__(".symver __wcstoll_internal,__wcstoll_internal@GLIBC_2.2.5"); -__asm__(".symver __wcstoll_l,__wcstoll_l@GLIBC_2.2.5"); -__asm__(".symver __wcstombs_chk,__wcstombs_chk@GLIBC_2.4"); -__asm__(".symver __wcstoul_internal,__wcstoul_internal@GLIBC_2.2.5"); -__asm__(".symver __wcstoul_l,__wcstoul_l@GLIBC_2.2.5"); -__asm__(".symver __wcstoull_internal,__wcstoull_internal@GLIBC_2.2.5"); -__asm__(".symver __wcstoull_l,__wcstoull_l@GLIBC_2.2.5"); -__asm__(".symver __wcsxfrm_l,__wcsxfrm_l@GLIBC_2.2.5"); -__asm__(".symver __wctomb_chk,__wctomb_chk@GLIBC_2.4"); -__asm__(".symver __wctrans_l,__wctrans_l@GLIBC_2.2.5"); -__asm__(".symver __wctype_l,__wctype_l@GLIBC_2.2.5"); -__asm__(".symver __wmemcpy_chk,__wmemcpy_chk@GLIBC_2.4"); -__asm__(".symver __wmemmove_chk,__wmemmove_chk@GLIBC_2.4"); -__asm__(".symver __wmempcpy_chk,__wmempcpy_chk@GLIBC_2.4"); -__asm__(".symver __wmemset_chk,__wmemset_chk@GLIBC_2.4"); -__asm__(".symver __woverflow,__woverflow@GLIBC_2.2.5"); -__asm__(".symver __wprintf_chk,__wprintf_chk@GLIBC_2.4"); -__asm__(".symver __write,__write@GLIBC_2.2.5"); -__asm__(".symver __wuflow,__wuflow@GLIBC_2.2.5"); -__asm__(".symver __wunderflow,__wunderflow@GLIBC_2.2.5"); -__asm__(".symver __xmknod,__xmknod@GLIBC_2.2.5"); -__asm__(".symver __xmknodat,__xmknodat@GLIBC_2.4"); -__asm__(".symver __xpg_basename,__xpg_basename@GLIBC_2.2.5"); -__asm__(".symver __xpg_sigpause,__xpg_sigpause@GLIBC_2.2.5"); -__asm__(".symver __xpg_strerror_r,__xpg_strerror_r@GLIBC_2.3.4"); -__asm__(".symver __xstat,__xstat@GLIBC_2.2.5"); -__asm__(".symver __xstat64,__xstat64@GLIBC_2.2.5"); -__asm__(".symver __y0_finite,__y0_finite@GLIBC_2.15"); -__asm__(".symver __y0f_finite,__y0f_finite@GLIBC_2.15"); -__asm__(".symver __y0l_finite,__y0l_finite@GLIBC_2.15"); -__asm__(".symver __y1_finite,__y1_finite@GLIBC_2.15"); -__asm__(".symver __y1f_finite,__y1f_finite@GLIBC_2.15"); -__asm__(".symver __y1l_finite,__y1l_finite@GLIBC_2.15"); -__asm__(".symver __yn_finite,__yn_finite@GLIBC_2.15"); -__asm__(".symver __ynf_finite,__ynf_finite@GLIBC_2.15"); -__asm__(".symver __ynl_finite,__ynl_finite@GLIBC_2.15"); -__asm__(".symver __yp_check,__yp_check@GLIBC_2.2.5"); -__asm__(".symver _dl_mcount,_dl_mcount@GLIBC_2.2.5"); -__asm__(".symver _dl_mcount_wrapper,_dl_mcount_wrapper@GLIBC_2.2.5"); -__asm__(".symver _dl_mcount_wrapper_check,_dl_mcount_wrapper_check@GLIBC_2.2.5"); -__asm__(".symver _environ,_environ@GLIBC_2.2.5"); -__asm__(".symver _exit,_exit@GLIBC_2.2.5"); -__asm__(".symver _flushlbf,_flushlbf@GLIBC_2.2.5"); -__asm__(".symver _gethtbyaddr,_gethtbyaddr@GLIBC_2.2.5"); -__asm__(".symver _gethtbyname,_gethtbyname@GLIBC_2.2.5"); -__asm__(".symver _gethtbyname2,_gethtbyname2@GLIBC_2.2.5"); -__asm__(".symver _gethtent,_gethtent@GLIBC_2.2.5"); -__asm__(".symver _getlong,_getlong@GLIBC_2.2.5"); -__asm__(".symver _getshort,_getshort@GLIBC_2.2.5"); -__asm__(".symver _libc_intl_domainname,_libc_intl_domainname@GLIBC_2.2.5"); -__asm__(".symver _longjmp,_longjmp@GLIBC_2.2.5"); -__asm__(".symver _mcleanup,_mcleanup@GLIBC_2.2.5"); -__asm__(".symver _mcount,_mcount@GLIBC_2.2.5"); -__asm__(".symver _nl_default_dirname,_nl_default_dirname@GLIBC_2.2.5"); -__asm__(".symver _nl_domain_bindings,_nl_domain_bindings@GLIBC_2.2.5"); -__asm__(".symver _nl_msg_cat_cntr,_nl_msg_cat_cntr@GLIBC_2.2.5"); -__asm__(".symver _obstack_allocated_p,_obstack_allocated_p@GLIBC_2.2.5"); -__asm__(".symver _obstack_begin,_obstack_begin@GLIBC_2.2.5"); -__asm__(".symver _obstack_begin_1,_obstack_begin_1@GLIBC_2.2.5"); -__asm__(".symver _obstack_free,_obstack_free@GLIBC_2.2.5"); -__asm__(".symver _obstack_memory_used,_obstack_memory_used@GLIBC_2.2.5"); -__asm__(".symver _obstack_newchunk,_obstack_newchunk@GLIBC_2.2.5"); -__asm__(".symver _pthread_cleanup_pop,_pthread_cleanup_pop@GLIBC_2.2.5"); -__asm__(".symver _pthread_cleanup_pop_restore,_pthread_cleanup_pop_restore@GLIBC_2.2.5"); -__asm__(".symver _pthread_cleanup_push,_pthread_cleanup_push@GLIBC_2.2.5"); -__asm__(".symver _pthread_cleanup_push_defer,_pthread_cleanup_push_defer@GLIBC_2.2.5"); -__asm__(".symver _r_debug,_r_debug@GLIBC_2.2.5"); -__asm__(".symver _res_hconf,_res_hconf@GLIBC_2.2.5"); -__asm__(".symver _res_opcodes,_res_opcodes@GLIBC_2.2.5"); -__asm__(".symver _sethtent,_sethtent@GLIBC_2.2.5"); -__asm__(".symver _setjmp,_setjmp@GLIBC_2.2.5"); -__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.12"); -__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.12"); -__asm__(".symver _sys_siglist,_sys_siglist@GLIBC_2.3.3"); -__asm__(".symver _tolower,_tolower@GLIBC_2.2.5"); -__asm__(".symver _toupper,_toupper@GLIBC_2.2.5"); -__asm__(".symver a64l,a64l@GLIBC_2.2.5"); -__asm__(".symver abort,abort@GLIBC_2.2.5"); -__asm__(".symver abs,abs@GLIBC_2.2.5"); -__asm__(".symver accept,accept@GLIBC_2.2.5"); -__asm__(".symver accept4,accept4@GLIBC_2.10"); -__asm__(".symver access,access@GLIBC_2.2.5"); -__asm__(".symver acct,acct@GLIBC_2.2.5"); -__asm__(".symver acos,acos@GLIBC_2.2.5"); -__asm__(".symver acosf,acosf@GLIBC_2.2.5"); -__asm__(".symver acosh,acosh@GLIBC_2.2.5"); -__asm__(".symver acoshf,acoshf@GLIBC_2.2.5"); -__asm__(".symver acoshl,acoshl@GLIBC_2.2.5"); -__asm__(".symver acosl,acosl@GLIBC_2.2.5"); -__asm__(".symver addmntent,addmntent@GLIBC_2.2.5"); -__asm__(".symver addseverity,addseverity@GLIBC_2.2.5"); -__asm__(".symver adjtime,adjtime@GLIBC_2.2.5"); -__asm__(".symver adjtimex,adjtimex@GLIBC_2.2.5"); -__asm__(".symver aio_cancel,aio_cancel@GLIBC_2.2.5"); -__asm__(".symver aio_cancel64,aio_cancel64@GLIBC_2.2.5"); -__asm__(".symver aio_error,aio_error@GLIBC_2.2.5"); -__asm__(".symver aio_error64,aio_error64@GLIBC_2.2.5"); -__asm__(".symver aio_fsync,aio_fsync@GLIBC_2.2.5"); -__asm__(".symver aio_fsync64,aio_fsync64@GLIBC_2.2.5"); -__asm__(".symver aio_init,aio_init@GLIBC_2.2.5"); -__asm__(".symver aio_read,aio_read@GLIBC_2.2.5"); -__asm__(".symver aio_read64,aio_read64@GLIBC_2.2.5"); -__asm__(".symver aio_return,aio_return@GLIBC_2.2.5"); -__asm__(".symver aio_return64,aio_return64@GLIBC_2.2.5"); -__asm__(".symver aio_suspend,aio_suspend@GLIBC_2.2.5"); -__asm__(".symver aio_suspend64,aio_suspend64@GLIBC_2.2.5"); -__asm__(".symver aio_write,aio_write@GLIBC_2.2.5"); -__asm__(".symver aio_write64,aio_write64@GLIBC_2.2.5"); -__asm__(".symver alarm,alarm@GLIBC_2.2.5"); -__asm__(".symver aligned_alloc,aligned_alloc@GLIBC_2.16"); -__asm__(".symver alphasort,alphasort@GLIBC_2.2.5"); -__asm__(".symver alphasort64,alphasort64@GLIBC_2.2.5"); -__asm__(".symver arch_prctl,arch_prctl@GLIBC_2.2.5"); -__asm__(".symver argp_err_exit_status,argp_err_exit_status@GLIBC_2.2.5"); -__asm__(".symver argp_error,argp_error@GLIBC_2.2.5"); -__asm__(".symver argp_failure,argp_failure@GLIBC_2.2.5"); -__asm__(".symver argp_help,argp_help@GLIBC_2.2.5"); -__asm__(".symver argp_parse,argp_parse@GLIBC_2.2.5"); -__asm__(".symver argp_program_bug_address,argp_program_bug_address@GLIBC_2.2.5"); -__asm__(".symver argp_program_version,argp_program_version@GLIBC_2.2.5"); -__asm__(".symver argp_program_version_hook,argp_program_version_hook@GLIBC_2.2.5"); -__asm__(".symver argp_state_help,argp_state_help@GLIBC_2.2.5"); -__asm__(".symver argp_usage,argp_usage@GLIBC_2.2.5"); -__asm__(".symver argz_add,argz_add@GLIBC_2.2.5"); -__asm__(".symver argz_add_sep,argz_add_sep@GLIBC_2.2.5"); -__asm__(".symver argz_append,argz_append@GLIBC_2.2.5"); -__asm__(".symver argz_count,argz_count@GLIBC_2.2.5"); -__asm__(".symver argz_create,argz_create@GLIBC_2.2.5"); -__asm__(".symver argz_create_sep,argz_create_sep@GLIBC_2.2.5"); -__asm__(".symver argz_delete,argz_delete@GLIBC_2.2.5"); -__asm__(".symver argz_extract,argz_extract@GLIBC_2.2.5"); -__asm__(".symver argz_insert,argz_insert@GLIBC_2.2.5"); -__asm__(".symver argz_next,argz_next@GLIBC_2.2.5"); -__asm__(".symver argz_replace,argz_replace@GLIBC_2.2.5"); -__asm__(".symver argz_stringify,argz_stringify@GLIBC_2.2.5"); -__asm__(".symver asctime,asctime@GLIBC_2.2.5"); -__asm__(".symver asctime_r,asctime_r@GLIBC_2.2.5"); -__asm__(".symver asin,asin@GLIBC_2.2.5"); -__asm__(".symver asinf,asinf@GLIBC_2.2.5"); -__asm__(".symver asinh,asinh@GLIBC_2.2.5"); -__asm__(".symver asinhf,asinhf@GLIBC_2.2.5"); -__asm__(".symver asinhl,asinhl@GLIBC_2.2.5"); -__asm__(".symver asinl,asinl@GLIBC_2.2.5"); -__asm__(".symver asprintf,asprintf@GLIBC_2.2.5"); -__asm__(".symver atan,atan@GLIBC_2.2.5"); -__asm__(".symver atan2,atan2@GLIBC_2.2.5"); -__asm__(".symver atan2f,atan2f@GLIBC_2.2.5"); -__asm__(".symver atan2l,atan2l@GLIBC_2.2.5"); -__asm__(".symver atanf,atanf@GLIBC_2.2.5"); -__asm__(".symver atanh,atanh@GLIBC_2.2.5"); -__asm__(".symver atanhf,atanhf@GLIBC_2.2.5"); -__asm__(".symver atanhl,atanhl@GLIBC_2.2.5"); -__asm__(".symver atanl,atanl@GLIBC_2.2.5"); -__asm__(".symver atof,atof@GLIBC_2.2.5"); -__asm__(".symver atoi,atoi@GLIBC_2.2.5"); -__asm__(".symver atol,atol@GLIBC_2.2.5"); -__asm__(".symver atoll,atoll@GLIBC_2.2.5"); -__asm__(".symver authdes_create,authdes_create@GLIBC_2.2.5"); -__asm__(".symver authdes_pk_create,authdes_pk_create@GLIBC_2.2.5"); -__asm__(".symver authunix_create_default,authunix_create_default@GLIBC_2.2.5"); -__asm__(".symver backtrace,backtrace@GLIBC_2.2.5"); -__asm__(".symver backtrace_symbols,backtrace_symbols@GLIBC_2.2.5"); -__asm__(".symver backtrace_symbols_fd,backtrace_symbols_fd@GLIBC_2.2.5"); -__asm__(".symver basename,basename@GLIBC_2.2.5"); -__asm__(".symver bcmp,bcmp@GLIBC_2.2.5"); -__asm__(".symver bcopy,bcopy@GLIBC_2.2.5"); -__asm__(".symver bind,bind@GLIBC_2.2.5"); -__asm__(".symver bind_textdomain_codeset,bind_textdomain_codeset@GLIBC_2.2.5"); -__asm__(".symver bindresvport,bindresvport@GLIBC_2.2.5"); -__asm__(".symver bindtextdomain,bindtextdomain@GLIBC_2.2.5"); -__asm__(".symver brk,brk@GLIBC_2.2.5"); -__asm__(".symver bsd_signal,bsd_signal@GLIBC_2.2.5"); -__asm__(".symver bsearch,bsearch@GLIBC_2.2.5"); -__asm__(".symver btowc,btowc@GLIBC_2.2.5"); -__asm__(".symver bzero,bzero@GLIBC_2.2.5"); -__asm__(".symver c16rtomb,c16rtomb@GLIBC_2.16"); -__asm__(".symver c32rtomb,c32rtomb@GLIBC_2.16"); -__asm__(".symver cabs,cabs@GLIBC_2.2.5"); -__asm__(".symver cabsf,cabsf@GLIBC_2.2.5"); -__asm__(".symver cabsl,cabsl@GLIBC_2.2.5"); -__asm__(".symver cacos,cacos@GLIBC_2.2.5"); -__asm__(".symver cacosf,cacosf@GLIBC_2.2.5"); -__asm__(".symver cacosh,cacosh@GLIBC_2.2.5"); -__asm__(".symver cacoshf,cacoshf@GLIBC_2.2.5"); -__asm__(".symver cacoshl,cacoshl@GLIBC_2.2.5"); -__asm__(".symver cacosl,cacosl@GLIBC_2.2.5"); -__asm__(".symver calloc,calloc@GLIBC_2.2.5"); -__asm__(".symver canonicalize_file_name,canonicalize_file_name@GLIBC_2.2.5"); -__asm__(".symver capget,capget@GLIBC_2.2.5"); -__asm__(".symver capset,capset@GLIBC_2.2.5"); -__asm__(".symver carg,carg@GLIBC_2.2.5"); -__asm__(".symver cargf,cargf@GLIBC_2.2.5"); -__asm__(".symver cargl,cargl@GLIBC_2.2.5"); -__asm__(".symver casin,casin@GLIBC_2.2.5"); -__asm__(".symver casinf,casinf@GLIBC_2.2.5"); -__asm__(".symver casinh,casinh@GLIBC_2.2.5"); -__asm__(".symver casinhf,casinhf@GLIBC_2.2.5"); -__asm__(".symver casinhl,casinhl@GLIBC_2.2.5"); -__asm__(".symver casinl,casinl@GLIBC_2.2.5"); -__asm__(".symver catan,catan@GLIBC_2.2.5"); -__asm__(".symver catanf,catanf@GLIBC_2.2.5"); -__asm__(".symver catanh,catanh@GLIBC_2.2.5"); -__asm__(".symver catanhf,catanhf@GLIBC_2.2.5"); -__asm__(".symver catanhl,catanhl@GLIBC_2.2.5"); -__asm__(".symver catanl,catanl@GLIBC_2.2.5"); -__asm__(".symver catclose,catclose@GLIBC_2.2.5"); -__asm__(".symver catgets,catgets@GLIBC_2.2.5"); -__asm__(".symver catopen,catopen@GLIBC_2.2.5"); -__asm__(".symver cbrt,cbrt@GLIBC_2.2.5"); -__asm__(".symver cbrtf,cbrtf@GLIBC_2.2.5"); -__asm__(".symver cbrtl,cbrtl@GLIBC_2.2.5"); -__asm__(".symver ccos,ccos@GLIBC_2.2.5"); -__asm__(".symver ccosf,ccosf@GLIBC_2.2.5"); -__asm__(".symver ccosh,ccosh@GLIBC_2.2.5"); -__asm__(".symver ccoshf,ccoshf@GLIBC_2.2.5"); -__asm__(".symver ccoshl,ccoshl@GLIBC_2.2.5"); -__asm__(".symver ccosl,ccosl@GLIBC_2.2.5"); -__asm__(".symver ceil,ceil@GLIBC_2.2.5"); -__asm__(".symver ceilf,ceilf@GLIBC_2.2.5"); -__asm__(".symver ceill,ceill@GLIBC_2.2.5"); -__asm__(".symver cexp,cexp@GLIBC_2.2.5"); -__asm__(".symver cexpf,cexpf@GLIBC_2.2.5"); -__asm__(".symver cexpl,cexpl@GLIBC_2.2.5"); -__asm__(".symver cfgetispeed,cfgetispeed@GLIBC_2.2.5"); -__asm__(".symver cfgetospeed,cfgetospeed@GLIBC_2.2.5"); -__asm__(".symver cfmakeraw,cfmakeraw@GLIBC_2.2.5"); -__asm__(".symver cfree,cfree@GLIBC_2.2.5"); -__asm__(".symver cfsetispeed,cfsetispeed@GLIBC_2.2.5"); -__asm__(".symver cfsetospeed,cfsetospeed@GLIBC_2.2.5"); -__asm__(".symver cfsetspeed,cfsetspeed@GLIBC_2.2.5"); -__asm__(".symver chdir,chdir@GLIBC_2.2.5"); -__asm__(".symver chflags,chflags@GLIBC_2.2.5"); -__asm__(".symver chmod,chmod@GLIBC_2.2.5"); -__asm__(".symver chown,chown@GLIBC_2.2.5"); -__asm__(".symver chroot,chroot@GLIBC_2.2.5"); -__asm__(".symver cimag,cimag@GLIBC_2.2.5"); -__asm__(".symver cimagf,cimagf@GLIBC_2.2.5"); -__asm__(".symver cimagl,cimagl@GLIBC_2.2.5"); -__asm__(".symver clearenv,clearenv@GLIBC_2.2.5"); -__asm__(".symver clearerr,clearerr@GLIBC_2.2.5"); -__asm__(".symver clearerr_unlocked,clearerr_unlocked@GLIBC_2.2.5"); -__asm__(".symver clnt_create,clnt_create@GLIBC_2.2.5"); -__asm__(".symver clnt_pcreateerror,clnt_pcreateerror@GLIBC_2.2.5"); -__asm__(".symver clnt_perror,clnt_perror@GLIBC_2.2.5"); -__asm__(".symver clnt_sperrno,clnt_sperrno@GLIBC_2.2.5"); -__asm__(".symver clnttcp_create,clnttcp_create@GLIBC_2.2.5"); -__asm__(".symver clntudp_create,clntudp_create@GLIBC_2.2.5"); -__asm__(".symver clock,clock@GLIBC_2.2.5"); -__asm__(".symver clock_adjtime,clock_adjtime@GLIBC_2.14"); -__asm__(".symver clock_getcpuclockid,clock_getcpuclockid@GLIBC_2.17"); -__asm__(".symver clock_getres,clock_getres@GLIBC_2.17"); -__asm__(".symver clock_gettime,clock_gettime@GLIBC_2.17"); -__asm__(".symver clock_nanosleep,clock_nanosleep@GLIBC_2.17"); -__asm__(".symver clock_settime,clock_settime@GLIBC_2.17"); -__asm__(".symver clog,clog@GLIBC_2.2.5"); -__asm__(".symver clog10,clog10@GLIBC_2.2.5"); -__asm__(".symver clog10f,clog10f@GLIBC_2.2.5"); -__asm__(".symver clog10l,clog10l@GLIBC_2.2.5"); -__asm__(".symver clogf,clogf@GLIBC_2.2.5"); -__asm__(".symver clogl,clogl@GLIBC_2.2.5"); -__asm__(".symver clone,clone@GLIBC_2.2.5"); -__asm__(".symver close,close@GLIBC_2.2.5"); -__asm__(".symver closedir,closedir@GLIBC_2.2.5"); -__asm__(".symver closelog,closelog@GLIBC_2.2.5"); -__asm__(".symver confstr,confstr@GLIBC_2.2.5"); -__asm__(".symver conj,conj@GLIBC_2.2.5"); -__asm__(".symver conjf,conjf@GLIBC_2.2.5"); -__asm__(".symver conjl,conjl@GLIBC_2.2.5"); -__asm__(".symver connect,connect@GLIBC_2.2.5"); -__asm__(".symver copysign,copysign@GLIBC_2.2.5"); -__asm__(".symver copysignf,copysignf@GLIBC_2.2.5"); -__asm__(".symver copysignl,copysignl@GLIBC_2.2.5"); -__asm__(".symver cos,cos@GLIBC_2.2.5"); -__asm__(".symver cosf,cosf@GLIBC_2.2.5"); -__asm__(".symver cosh,cosh@GLIBC_2.2.5"); -__asm__(".symver coshf,coshf@GLIBC_2.2.5"); -__asm__(".symver coshl,coshl@GLIBC_2.2.5"); -__asm__(".symver cosl,cosl@GLIBC_2.2.5"); -__asm__(".symver cpow,cpow@GLIBC_2.2.5"); -__asm__(".symver cpowf,cpowf@GLIBC_2.2.5"); -__asm__(".symver cpowl,cpowl@GLIBC_2.2.5"); -__asm__(".symver cproj,cproj@GLIBC_2.2.5"); -__asm__(".symver cprojf,cprojf@GLIBC_2.2.5"); -__asm__(".symver cprojl,cprojl@GLIBC_2.2.5"); -__asm__(".symver creal,creal@GLIBC_2.2.5"); -__asm__(".symver crealf,crealf@GLIBC_2.2.5"); -__asm__(".symver creall,creall@GLIBC_2.2.5"); -__asm__(".symver creat,creat@GLIBC_2.2.5"); -__asm__(".symver creat64,creat64@GLIBC_2.2.5"); -__asm__(".symver crypt,crypt@GLIBC_2.2.5"); -__asm__(".symver crypt_r,crypt_r@GLIBC_2.2.5"); -__asm__(".symver csin,csin@GLIBC_2.2.5"); -__asm__(".symver csinf,csinf@GLIBC_2.2.5"); -__asm__(".symver csinh,csinh@GLIBC_2.2.5"); -__asm__(".symver csinhf,csinhf@GLIBC_2.2.5"); -__asm__(".symver csinhl,csinhl@GLIBC_2.2.5"); -__asm__(".symver csinl,csinl@GLIBC_2.2.5"); -__asm__(".symver csqrt,csqrt@GLIBC_2.2.5"); -__asm__(".symver csqrtf,csqrtf@GLIBC_2.2.5"); -__asm__(".symver csqrtl,csqrtl@GLIBC_2.2.5"); -__asm__(".symver ctan,ctan@GLIBC_2.2.5"); -__asm__(".symver ctanf,ctanf@GLIBC_2.2.5"); -__asm__(".symver ctanh,ctanh@GLIBC_2.2.5"); -__asm__(".symver ctanhf,ctanhf@GLIBC_2.2.5"); -__asm__(".symver ctanhl,ctanhl@GLIBC_2.2.5"); -__asm__(".symver ctanl,ctanl@GLIBC_2.2.5"); -__asm__(".symver ctermid,ctermid@GLIBC_2.2.5"); -__asm__(".symver ctime,ctime@GLIBC_2.2.5"); -__asm__(".symver ctime_r,ctime_r@GLIBC_2.2.5"); -__asm__(".symver cuserid,cuserid@GLIBC_2.2.5"); -__asm__(".symver daemon,daemon@GLIBC_2.2.5"); -__asm__(".symver daylight,daylight@GLIBC_2.2.5"); -__asm__(".symver dcgettext,dcgettext@GLIBC_2.2.5"); -__asm__(".symver dcngettext,dcngettext@GLIBC_2.2.5"); -__asm__(".symver delete_module,delete_module@GLIBC_2.2.5"); -__asm__(".symver dgettext,dgettext@GLIBC_2.2.5"); -__asm__(".symver difftime,difftime@GLIBC_2.2.5"); -__asm__(".symver dirfd,dirfd@GLIBC_2.2.5"); -__asm__(".symver dirname,dirname@GLIBC_2.2.5"); -__asm__(".symver div,div@GLIBC_2.2.5"); -__asm__(".symver dl_iterate_phdr,dl_iterate_phdr@GLIBC_2.2.5"); -__asm__(".symver dladdr,dladdr@GLIBC_2.2.5"); -__asm__(".symver dladdr1,dladdr1@GLIBC_2.3.3"); -__asm__(".symver dlclose,dlclose@GLIBC_2.2.5"); -__asm__(".symver dlerror,dlerror@GLIBC_2.2.5"); -__asm__(".symver dlinfo,dlinfo@GLIBC_2.3.3"); -__asm__(".symver dlmopen,dlmopen@GLIBC_2.3.4"); -__asm__(".symver dlopen,dlopen@GLIBC_2.2.5"); -__asm__(".symver dlsym,dlsym@GLIBC_2.2.5"); -__asm__(".symver dlvsym,dlvsym@GLIBC_2.2.5"); -__asm__(".symver dngettext,dngettext@GLIBC_2.2.5"); -__asm__(".symver dprintf,dprintf@GLIBC_2.2.5"); -__asm__(".symver drand48,drand48@GLIBC_2.2.5"); -__asm__(".symver drand48_r,drand48_r@GLIBC_2.2.5"); -__asm__(".symver drem,drem@GLIBC_2.2.5"); -__asm__(".symver dremf,dremf@GLIBC_2.2.5"); -__asm__(".symver dreml,dreml@GLIBC_2.2.5"); -__asm__(".symver dup,dup@GLIBC_2.2.5"); -__asm__(".symver dup2,dup2@GLIBC_2.2.5"); -__asm__(".symver dup3,dup3@GLIBC_2.9"); -__asm__(".symver duplocale,duplocale@GLIBC_2.3"); -__asm__(".symver dysize,dysize@GLIBC_2.2.5"); -__asm__(".symver eaccess,eaccess@GLIBC_2.4"); -__asm__(".symver ecvt,ecvt@GLIBC_2.2.5"); -__asm__(".symver ecvt_r,ecvt_r@GLIBC_2.2.5"); -__asm__(".symver encrypt,encrypt@GLIBC_2.2.5"); -__asm__(".symver encrypt_r,encrypt_r@GLIBC_2.2.5"); -__asm__(".symver endaliasent,endaliasent@GLIBC_2.2.5"); -__asm__(".symver endfsent,endfsent@GLIBC_2.2.5"); -__asm__(".symver endgrent,endgrent@GLIBC_2.2.5"); -__asm__(".symver endhostent,endhostent@GLIBC_2.2.5"); -__asm__(".symver endmntent,endmntent@GLIBC_2.2.5"); -__asm__(".symver endnetent,endnetent@GLIBC_2.2.5"); -__asm__(".symver endnetgrent,endnetgrent@GLIBC_2.2.5"); -__asm__(".symver endprotoent,endprotoent@GLIBC_2.2.5"); -__asm__(".symver endpwent,endpwent@GLIBC_2.2.5"); -__asm__(".symver endrpcent,endrpcent@GLIBC_2.2.5"); -__asm__(".symver endservent,endservent@GLIBC_2.2.5"); -__asm__(".symver endsgent,endsgent@GLIBC_2.10"); -__asm__(".symver endspent,endspent@GLIBC_2.2.5"); -__asm__(".symver endttyent,endttyent@GLIBC_2.2.5"); -__asm__(".symver endusershell,endusershell@GLIBC_2.2.5"); -__asm__(".symver endutent,endutent@GLIBC_2.2.5"); -__asm__(".symver endutxent,endutxent@GLIBC_2.2.5"); -__asm__(".symver environ,environ@GLIBC_2.2.5"); -__asm__(".symver envz_add,envz_add@GLIBC_2.2.5"); -__asm__(".symver envz_entry,envz_entry@GLIBC_2.2.5"); -__asm__(".symver envz_get,envz_get@GLIBC_2.2.5"); -__asm__(".symver envz_merge,envz_merge@GLIBC_2.2.5"); -__asm__(".symver envz_remove,envz_remove@GLIBC_2.2.5"); -__asm__(".symver envz_strip,envz_strip@GLIBC_2.2.5"); -__asm__(".symver epoll_create,epoll_create@GLIBC_2.3.2"); -__asm__(".symver epoll_create1,epoll_create1@GLIBC_2.9"); -__asm__(".symver epoll_ctl,epoll_ctl@GLIBC_2.3.2"); -__asm__(".symver epoll_pwait,epoll_pwait@GLIBC_2.6"); -__asm__(".symver epoll_wait,epoll_wait@GLIBC_2.3.2"); -__asm__(".symver erand48,erand48@GLIBC_2.2.5"); -__asm__(".symver erand48_r,erand48_r@GLIBC_2.2.5"); -__asm__(".symver erf,erf@GLIBC_2.2.5"); -__asm__(".symver erfc,erfc@GLIBC_2.2.5"); -__asm__(".symver erfcf,erfcf@GLIBC_2.2.5"); -__asm__(".symver erfcl,erfcl@GLIBC_2.2.5"); -__asm__(".symver erff,erff@GLIBC_2.2.5"); -__asm__(".symver erfl,erfl@GLIBC_2.2.5"); -__asm__(".symver err,err@GLIBC_2.2.5"); -__asm__(".symver error,error@GLIBC_2.2.5"); -__asm__(".symver error_at_line,error_at_line@GLIBC_2.2.5"); -__asm__(".symver error_message_count,error_message_count@GLIBC_2.2.5"); -__asm__(".symver error_one_per_line,error_one_per_line@GLIBC_2.2.5"); -__asm__(".symver error_print_progname,error_print_progname@GLIBC_2.2.5"); -__asm__(".symver errx,errx@GLIBC_2.2.5"); -__asm__(".symver ether_aton,ether_aton@GLIBC_2.2.5"); -__asm__(".symver ether_aton_r,ether_aton_r@GLIBC_2.2.5"); -__asm__(".symver ether_hostton,ether_hostton@GLIBC_2.2.5"); -__asm__(".symver ether_line,ether_line@GLIBC_2.2.5"); -__asm__(".symver ether_ntoa,ether_ntoa@GLIBC_2.2.5"); -__asm__(".symver ether_ntoa_r,ether_ntoa_r@GLIBC_2.2.5"); -__asm__(".symver ether_ntohost,ether_ntohost@GLIBC_2.2.5"); -__asm__(".symver euidaccess,euidaccess@GLIBC_2.2.5"); -__asm__(".symver eventfd,eventfd@GLIBC_2.7"); -__asm__(".symver eventfd_read,eventfd_read@GLIBC_2.7"); -__asm__(".symver eventfd_write,eventfd_write@GLIBC_2.7"); -__asm__(".symver execl,execl@GLIBC_2.2.5"); -__asm__(".symver execle,execle@GLIBC_2.2.5"); -__asm__(".symver execlp,execlp@GLIBC_2.2.5"); -__asm__(".symver execv,execv@GLIBC_2.2.5"); -__asm__(".symver execve,execve@GLIBC_2.2.5"); -__asm__(".symver execvp,execvp@GLIBC_2.2.5"); -__asm__(".symver execvpe,execvpe@GLIBC_2.11"); -__asm__(".symver exit,exit@GLIBC_2.2.5"); -__asm__(".symver exp,exp@GLIBC_2.2.5"); -__asm__(".symver exp10,exp10@GLIBC_2.2.5"); -__asm__(".symver exp10f,exp10f@GLIBC_2.2.5"); -__asm__(".symver exp10l,exp10l@GLIBC_2.2.5"); -__asm__(".symver exp2,exp2@GLIBC_2.2.5"); -__asm__(".symver exp2f,exp2f@GLIBC_2.2.5"); -__asm__(".symver exp2l,exp2l@GLIBC_2.2.5"); -__asm__(".symver expf,expf@GLIBC_2.2.5"); -__asm__(".symver expl,expl@GLIBC_2.2.5"); -__asm__(".symver expm1,expm1@GLIBC_2.2.5"); -__asm__(".symver expm1f,expm1f@GLIBC_2.2.5"); -__asm__(".symver expm1l,expm1l@GLIBC_2.2.5"); -__asm__(".symver fabs,fabs@GLIBC_2.2.5"); -__asm__(".symver fabsf,fabsf@GLIBC_2.2.5"); -__asm__(".symver fabsl,fabsl@GLIBC_2.2.5"); -__asm__(".symver faccessat,faccessat@GLIBC_2.4"); -__asm__(".symver fallocate,fallocate@GLIBC_2.10"); -__asm__(".symver fallocate64,fallocate64@GLIBC_2.10"); -__asm__(".symver fanotify_init,fanotify_init@GLIBC_2.13"); -__asm__(".symver fanotify_mark,fanotify_mark@GLIBC_2.13"); -__asm__(".symver fattach,fattach@GLIBC_2.2.5"); -__asm__(".symver fchdir,fchdir@GLIBC_2.2.5"); -__asm__(".symver fchflags,fchflags@GLIBC_2.2.5"); -__asm__(".symver fchmod,fchmod@GLIBC_2.2.5"); -__asm__(".symver fchmodat,fchmodat@GLIBC_2.4"); -__asm__(".symver fchown,fchown@GLIBC_2.2.5"); -__asm__(".symver fchownat,fchownat@GLIBC_2.4"); -__asm__(".symver fclose,fclose@GLIBC_2.2.5"); -__asm__(".symver fcloseall,fcloseall@GLIBC_2.2.5"); -__asm__(".symver fcntl,fcntl@GLIBC_2.2.5"); -__asm__(".symver fcrypt,fcrypt@GLIBC_2.2.5"); -__asm__(".symver fcvt,fcvt@GLIBC_2.2.5"); -__asm__(".symver fcvt_r,fcvt_r@GLIBC_2.2.5"); -__asm__(".symver fdatasync,fdatasync@GLIBC_2.2.5"); -__asm__(".symver fdetach,fdetach@GLIBC_2.2.5"); -__asm__(".symver fdim,fdim@GLIBC_2.2.5"); -__asm__(".symver fdimf,fdimf@GLIBC_2.2.5"); -__asm__(".symver fdiml,fdiml@GLIBC_2.2.5"); -__asm__(".symver fdopen,fdopen@GLIBC_2.2.5"); -__asm__(".symver fdopendir,fdopendir@GLIBC_2.4"); -__asm__(".symver feclearexcept,feclearexcept@GLIBC_2.2.5"); -__asm__(".symver fedisableexcept,fedisableexcept@GLIBC_2.2.5"); -__asm__(".symver feenableexcept,feenableexcept@GLIBC_2.2.5"); -__asm__(".symver fegetenv,fegetenv@GLIBC_2.2.5"); -__asm__(".symver fegetexcept,fegetexcept@GLIBC_2.2.5"); -__asm__(".symver fegetexceptflag,fegetexceptflag@GLIBC_2.2.5"); -__asm__(".symver fegetround,fegetround@GLIBC_2.2.5"); -__asm__(".symver feholdexcept,feholdexcept@GLIBC_2.2.5"); -__asm__(".symver feof,feof@GLIBC_2.2.5"); -__asm__(".symver feof_unlocked,feof_unlocked@GLIBC_2.2.5"); -__asm__(".symver feraiseexcept,feraiseexcept@GLIBC_2.2.5"); -__asm__(".symver ferror,ferror@GLIBC_2.2.5"); -__asm__(".symver ferror_unlocked,ferror_unlocked@GLIBC_2.2.5"); -__asm__(".symver fesetenv,fesetenv@GLIBC_2.2.5"); -__asm__(".symver fesetexceptflag,fesetexceptflag@GLIBC_2.2.5"); -__asm__(".symver fesetround,fesetround@GLIBC_2.2.5"); -__asm__(".symver fetestexcept,fetestexcept@GLIBC_2.2.5"); -__asm__(".symver feupdateenv,feupdateenv@GLIBC_2.2.5"); -__asm__(".symver fexecve,fexecve@GLIBC_2.2.5"); -__asm__(".symver fflush,fflush@GLIBC_2.2.5"); -__asm__(".symver fflush_unlocked,fflush_unlocked@GLIBC_2.2.5"); -__asm__(".symver ffs,ffs@GLIBC_2.2.5"); -__asm__(".symver ffsl,ffsl@GLIBC_2.2.5"); -__asm__(".symver ffsll,ffsll@GLIBC_2.2.5"); -__asm__(".symver fgetc,fgetc@GLIBC_2.2.5"); -__asm__(".symver fgetc_unlocked,fgetc_unlocked@GLIBC_2.2.5"); -__asm__(".symver fgetgrent,fgetgrent@GLIBC_2.2.5"); -__asm__(".symver fgetgrent_r,fgetgrent_r@GLIBC_2.2.5"); -__asm__(".symver fgetpos,fgetpos@GLIBC_2.2.5"); -__asm__(".symver fgetpos64,fgetpos64@GLIBC_2.2.5"); -__asm__(".symver fgetpwent,fgetpwent@GLIBC_2.2.5"); -__asm__(".symver fgetpwent_r,fgetpwent_r@GLIBC_2.2.5"); -__asm__(".symver fgets,fgets@GLIBC_2.2.5"); -__asm__(".symver fgets_unlocked,fgets_unlocked@GLIBC_2.2.5"); -__asm__(".symver fgetsgent,fgetsgent@GLIBC_2.10"); -__asm__(".symver fgetsgent_r,fgetsgent_r@GLIBC_2.10"); -__asm__(".symver fgetspent,fgetspent@GLIBC_2.2.5"); -__asm__(".symver fgetspent_r,fgetspent_r@GLIBC_2.2.5"); -__asm__(".symver fgetwc,fgetwc@GLIBC_2.2.5"); -__asm__(".symver fgetwc_unlocked,fgetwc_unlocked@GLIBC_2.2.5"); -__asm__(".symver fgetws,fgetws@GLIBC_2.2.5"); -__asm__(".symver fgetws_unlocked,fgetws_unlocked@GLIBC_2.2.5"); -__asm__(".symver fgetxattr,fgetxattr@GLIBC_2.3"); -__asm__(".symver fileno,fileno@GLIBC_2.2.5"); -__asm__(".symver fileno_unlocked,fileno_unlocked@GLIBC_2.2.5"); -__asm__(".symver finite,finite@GLIBC_2.2.5"); -__asm__(".symver finitef,finitef@GLIBC_2.2.5"); -__asm__(".symver finitel,finitel@GLIBC_2.2.5"); -__asm__(".symver flistxattr,flistxattr@GLIBC_2.3"); -__asm__(".symver flock,flock@GLIBC_2.2.5"); -__asm__(".symver flockfile,flockfile@GLIBC_2.2.5"); -__asm__(".symver floor,floor@GLIBC_2.2.5"); -__asm__(".symver floorf,floorf@GLIBC_2.2.5"); -__asm__(".symver floorl,floorl@GLIBC_2.2.5"); -__asm__(".symver fma,fma@GLIBC_2.2.5"); -__asm__(".symver fmaf,fmaf@GLIBC_2.2.5"); -__asm__(".symver fmal,fmal@GLIBC_2.2.5"); -__asm__(".symver fmax,fmax@GLIBC_2.2.5"); -__asm__(".symver fmaxf,fmaxf@GLIBC_2.2.5"); -__asm__(".symver fmaxl,fmaxl@GLIBC_2.2.5"); -__asm__(".symver fmemopen,fmemopen@GLIBC_2.22"); -__asm__(".symver fmin,fmin@GLIBC_2.2.5"); -__asm__(".symver fminf,fminf@GLIBC_2.2.5"); -__asm__(".symver fminl,fminl@GLIBC_2.2.5"); -__asm__(".symver fmod,fmod@GLIBC_2.2.5"); -__asm__(".symver fmodf,fmodf@GLIBC_2.2.5"); -__asm__(".symver fmodl,fmodl@GLIBC_2.2.5"); -__asm__(".symver fmtmsg,fmtmsg@GLIBC_2.2.5"); -__asm__(".symver fnmatch,fnmatch@GLIBC_2.2.5"); -__asm__(".symver fopen,fopen@GLIBC_2.2.5"); -__asm__(".symver fopen64,fopen64@GLIBC_2.2.5"); -__asm__(".symver fopencookie,fopencookie@GLIBC_2.2.5"); -__asm__(".symver fork,fork@GLIBC_2.2.5"); -__asm__(".symver forkpty,forkpty@GLIBC_2.2.5"); -__asm__(".symver fpathconf,fpathconf@GLIBC_2.2.5"); -__asm__(".symver fprintf,fprintf@GLIBC_2.2.5"); -__asm__(".symver fputc,fputc@GLIBC_2.2.5"); -__asm__(".symver fputc_unlocked,fputc_unlocked@GLIBC_2.2.5"); -__asm__(".symver fputs,fputs@GLIBC_2.2.5"); -__asm__(".symver fputs_unlocked,fputs_unlocked@GLIBC_2.2.5"); -__asm__(".symver fputwc,fputwc@GLIBC_2.2.5"); -__asm__(".symver fputwc_unlocked,fputwc_unlocked@GLIBC_2.2.5"); -__asm__(".symver fputws,fputws@GLIBC_2.2.5"); -__asm__(".symver fputws_unlocked,fputws_unlocked@GLIBC_2.2.5"); -__asm__(".symver fread,fread@GLIBC_2.2.5"); -__asm__(".symver fread_unlocked,fread_unlocked@GLIBC_2.2.5"); -__asm__(".symver free,free@GLIBC_2.2.5"); -__asm__(".symver freeaddrinfo,freeaddrinfo@GLIBC_2.2.5"); -__asm__(".symver freeifaddrs,freeifaddrs@GLIBC_2.3"); -__asm__(".symver freelocale,freelocale@GLIBC_2.3"); -__asm__(".symver fremovexattr,fremovexattr@GLIBC_2.3"); -__asm__(".symver freopen,freopen@GLIBC_2.2.5"); -__asm__(".symver freopen64,freopen64@GLIBC_2.2.5"); -__asm__(".symver frexp,frexp@GLIBC_2.2.5"); -__asm__(".symver frexpf,frexpf@GLIBC_2.2.5"); -__asm__(".symver frexpl,frexpl@GLIBC_2.2.5"); -__asm__(".symver fscanf,fscanf@GLIBC_2.2.5"); -__asm__(".symver fseek,fseek@GLIBC_2.2.5"); -__asm__(".symver fseeko,fseeko@GLIBC_2.2.5"); -__asm__(".symver fseeko64,fseeko64@GLIBC_2.2.5"); -__asm__(".symver fsetpos,fsetpos@GLIBC_2.2.5"); -__asm__(".symver fsetpos64,fsetpos64@GLIBC_2.2.5"); -__asm__(".symver fsetxattr,fsetxattr@GLIBC_2.3"); -__asm__(".symver fstatfs,fstatfs@GLIBC_2.2.5"); -__asm__(".symver fstatfs64,fstatfs64@GLIBC_2.2.5"); -__asm__(".symver fstatvfs,fstatvfs@GLIBC_2.2.5"); -__asm__(".symver fstatvfs64,fstatvfs64@GLIBC_2.2.5"); -__asm__(".symver fsync,fsync@GLIBC_2.2.5"); -__asm__(".symver ftell,ftell@GLIBC_2.2.5"); -__asm__(".symver ftello,ftello@GLIBC_2.2.5"); -__asm__(".symver ftello64,ftello64@GLIBC_2.2.5"); -__asm__(".symver ftime,ftime@GLIBC_2.2.5"); -__asm__(".symver ftok,ftok@GLIBC_2.2.5"); -__asm__(".symver ftruncate,ftruncate@GLIBC_2.2.5"); -__asm__(".symver ftruncate64,ftruncate64@GLIBC_2.2.5"); -__asm__(".symver ftrylockfile,ftrylockfile@GLIBC_2.2.5"); -__asm__(".symver fts64_children,fts64_children@GLIBC_2.23"); -__asm__(".symver fts64_close,fts64_close@GLIBC_2.23"); -__asm__(".symver fts64_open,fts64_open@GLIBC_2.23"); -__asm__(".symver fts64_read,fts64_read@GLIBC_2.23"); -__asm__(".symver fts64_set,fts64_set@GLIBC_2.23"); -__asm__(".symver fts_children,fts_children@GLIBC_2.2.5"); -__asm__(".symver fts_close,fts_close@GLIBC_2.2.5"); -__asm__(".symver fts_open,fts_open@GLIBC_2.2.5"); -__asm__(".symver fts_read,fts_read@GLIBC_2.2.5"); -__asm__(".symver fts_set,fts_set@GLIBC_2.2.5"); -__asm__(".symver ftw,ftw@GLIBC_2.2.5"); -__asm__(".symver ftw64,ftw64@GLIBC_2.2.5"); -__asm__(".symver funlockfile,funlockfile@GLIBC_2.2.5"); -__asm__(".symver futimens,futimens@GLIBC_2.6"); -__asm__(".symver futimes,futimes@GLIBC_2.3"); -__asm__(".symver futimesat,futimesat@GLIBC_2.4"); -__asm__(".symver fwide,fwide@GLIBC_2.2.5"); -__asm__(".symver fwprintf,fwprintf@GLIBC_2.2.5"); -__asm__(".symver fwrite,fwrite@GLIBC_2.2.5"); -__asm__(".symver fwrite_unlocked,fwrite_unlocked@GLIBC_2.2.5"); -__asm__(".symver fwscanf,fwscanf@GLIBC_2.2.5"); -__asm__(".symver gai_cancel,gai_cancel@GLIBC_2.2.5"); -__asm__(".symver gai_error,gai_error@GLIBC_2.2.5"); -__asm__(".symver gai_strerror,gai_strerror@GLIBC_2.2.5"); -__asm__(".symver gai_suspend,gai_suspend@GLIBC_2.2.5"); -__asm__(".symver gamma,gamma@GLIBC_2.2.5"); -__asm__(".symver gammaf,gammaf@GLIBC_2.2.5"); -__asm__(".symver gammal,gammal@GLIBC_2.2.5"); -__asm__(".symver gcvt,gcvt@GLIBC_2.2.5"); -__asm__(".symver get_avphys_pages,get_avphys_pages@GLIBC_2.2.5"); -__asm__(".symver get_current_dir_name,get_current_dir_name@GLIBC_2.2.5"); -__asm__(".symver get_myaddress,get_myaddress@GLIBC_2.2.5"); -__asm__(".symver get_nprocs,get_nprocs@GLIBC_2.2.5"); -__asm__(".symver get_nprocs_conf,get_nprocs_conf@GLIBC_2.2.5"); -__asm__(".symver get_phys_pages,get_phys_pages@GLIBC_2.2.5"); -__asm__(".symver getaddrinfo,getaddrinfo@GLIBC_2.2.5"); -__asm__(".symver getaddrinfo_a,getaddrinfo_a@GLIBC_2.2.5"); -__asm__(".symver getaliasbyname,getaliasbyname@GLIBC_2.2.5"); -__asm__(".symver getaliasbyname_r,getaliasbyname_r@GLIBC_2.2.5"); -__asm__(".symver getaliasent,getaliasent@GLIBC_2.2.5"); -__asm__(".symver getaliasent_r,getaliasent_r@GLIBC_2.2.5"); -__asm__(".symver getauxval,getauxval@GLIBC_2.16"); -__asm__(".symver getc,getc@GLIBC_2.2.5"); -__asm__(".symver getc_unlocked,getc_unlocked@GLIBC_2.2.5"); -__asm__(".symver getchar,getchar@GLIBC_2.2.5"); -__asm__(".symver getchar_unlocked,getchar_unlocked@GLIBC_2.2.5"); -__asm__(".symver getcontext,getcontext@GLIBC_2.2.5"); -__asm__(".symver getcwd,getcwd@GLIBC_2.2.5"); -__asm__(".symver getdate,getdate@GLIBC_2.2.5"); -__asm__(".symver getdate_err,getdate_err@GLIBC_2.2.5"); -__asm__(".symver getdate_r,getdate_r@GLIBC_2.2.5"); -__asm__(".symver getdelim,getdelim@GLIBC_2.2.5"); -__asm__(".symver getdirentries,getdirentries@GLIBC_2.2.5"); -__asm__(".symver getdirentries64,getdirentries64@GLIBC_2.2.5"); -__asm__(".symver getdomainname,getdomainname@GLIBC_2.2.5"); -__asm__(".symver getdtablesize,getdtablesize@GLIBC_2.2.5"); -__asm__(".symver getegid,getegid@GLIBC_2.2.5"); -__asm__(".symver getenv,getenv@GLIBC_2.2.5"); -__asm__(".symver geteuid,geteuid@GLIBC_2.2.5"); -__asm__(".symver getfsent,getfsent@GLIBC_2.2.5"); -__asm__(".symver getfsfile,getfsfile@GLIBC_2.2.5"); -__asm__(".symver getfsspec,getfsspec@GLIBC_2.2.5"); -__asm__(".symver getgid,getgid@GLIBC_2.2.5"); -__asm__(".symver getgrent,getgrent@GLIBC_2.2.5"); -__asm__(".symver getgrent_r,getgrent_r@GLIBC_2.2.5"); -__asm__(".symver getgrgid,getgrgid@GLIBC_2.2.5"); -__asm__(".symver getgrgid_r,getgrgid_r@GLIBC_2.2.5"); -__asm__(".symver getgrnam,getgrnam@GLIBC_2.2.5"); -__asm__(".symver getgrnam_r,getgrnam_r@GLIBC_2.2.5"); -__asm__(".symver getgrouplist,getgrouplist@GLIBC_2.2.5"); -__asm__(".symver getgroups,getgroups@GLIBC_2.2.5"); -__asm__(".symver gethostbyaddr,gethostbyaddr@GLIBC_2.2.5"); -__asm__(".symver gethostbyaddr_r,gethostbyaddr_r@GLIBC_2.2.5"); -__asm__(".symver gethostbyname,gethostbyname@GLIBC_2.2.5"); -__asm__(".symver gethostbyname2,gethostbyname2@GLIBC_2.2.5"); -__asm__(".symver gethostbyname2_r,gethostbyname2_r@GLIBC_2.2.5"); -__asm__(".symver gethostbyname_r,gethostbyname_r@GLIBC_2.2.5"); -__asm__(".symver gethostent,gethostent@GLIBC_2.2.5"); -__asm__(".symver gethostent_r,gethostent_r@GLIBC_2.2.5"); -__asm__(".symver gethostid,gethostid@GLIBC_2.2.5"); -__asm__(".symver gethostname,gethostname@GLIBC_2.2.5"); -__asm__(".symver getifaddrs,getifaddrs@GLIBC_2.3"); -__asm__(".symver getipv4sourcefilter,getipv4sourcefilter@GLIBC_2.3.4"); -__asm__(".symver getitimer,getitimer@GLIBC_2.2.5"); -__asm__(".symver getline,getline@GLIBC_2.2.5"); -__asm__(".symver getloadavg,getloadavg@GLIBC_2.2.5"); -__asm__(".symver getlogin,getlogin@GLIBC_2.2.5"); -__asm__(".symver getlogin_r,getlogin_r@GLIBC_2.2.5"); -__asm__(".symver getmntent,getmntent@GLIBC_2.2.5"); -__asm__(".symver getmntent_r,getmntent_r@GLIBC_2.2.5"); -__asm__(".symver getmsg,getmsg@GLIBC_2.2.5"); -__asm__(".symver getnameinfo,getnameinfo@GLIBC_2.2.5"); -__asm__(".symver getnetbyaddr,getnetbyaddr@GLIBC_2.2.5"); -__asm__(".symver getnetbyaddr_r,getnetbyaddr_r@GLIBC_2.2.5"); -__asm__(".symver getnetbyname,getnetbyname@GLIBC_2.2.5"); -__asm__(".symver getnetbyname_r,getnetbyname_r@GLIBC_2.2.5"); -__asm__(".symver getnetent,getnetent@GLIBC_2.2.5"); -__asm__(".symver getnetent_r,getnetent_r@GLIBC_2.2.5"); -__asm__(".symver getnetgrent,getnetgrent@GLIBC_2.2.5"); -__asm__(".symver getnetgrent_r,getnetgrent_r@GLIBC_2.2.5"); -__asm__(".symver getopt,getopt@GLIBC_2.2.5"); -__asm__(".symver getopt_long,getopt_long@GLIBC_2.2.5"); -__asm__(".symver getopt_long_only,getopt_long_only@GLIBC_2.2.5"); -__asm__(".symver getpagesize,getpagesize@GLIBC_2.2.5"); -__asm__(".symver getpass,getpass@GLIBC_2.2.5"); -__asm__(".symver getpeername,getpeername@GLIBC_2.2.5"); -__asm__(".symver getpgid,getpgid@GLIBC_2.2.5"); -__asm__(".symver getpgrp,getpgrp@GLIBC_2.2.5"); -__asm__(".symver getpid,getpid@GLIBC_2.2.5"); -__asm__(".symver getpmsg,getpmsg@GLIBC_2.2.5"); -__asm__(".symver getppid,getppid@GLIBC_2.2.5"); -__asm__(".symver getpriority,getpriority@GLIBC_2.2.5"); -__asm__(".symver getprotobyname,getprotobyname@GLIBC_2.2.5"); -__asm__(".symver getprotobyname_r,getprotobyname_r@GLIBC_2.2.5"); -__asm__(".symver getprotobynumber,getprotobynumber@GLIBC_2.2.5"); -__asm__(".symver getprotobynumber_r,getprotobynumber_r@GLIBC_2.2.5"); -__asm__(".symver getprotoent,getprotoent@GLIBC_2.2.5"); -__asm__(".symver getprotoent_r,getprotoent_r@GLIBC_2.2.5"); -__asm__(".symver getpt,getpt@GLIBC_2.2.5"); -__asm__(".symver getpw,getpw@GLIBC_2.2.5"); -__asm__(".symver getpwent,getpwent@GLIBC_2.2.5"); -__asm__(".symver getpwent_r,getpwent_r@GLIBC_2.2.5"); -__asm__(".symver getpwnam,getpwnam@GLIBC_2.2.5"); -__asm__(".symver getpwnam_r,getpwnam_r@GLIBC_2.2.5"); -__asm__(".symver getpwuid,getpwuid@GLIBC_2.2.5"); -__asm__(".symver getpwuid_r,getpwuid_r@GLIBC_2.2.5"); -__asm__(".symver getresgid,getresgid@GLIBC_2.2.5"); -__asm__(".symver getresuid,getresuid@GLIBC_2.2.5"); -__asm__(".symver getrlimit,getrlimit@GLIBC_2.2.5"); -__asm__(".symver getrlimit64,getrlimit64@GLIBC_2.2.5"); -__asm__(".symver getrpcbyname,getrpcbyname@GLIBC_2.2.5"); -__asm__(".symver getrpcbyname_r,getrpcbyname_r@GLIBC_2.2.5"); -__asm__(".symver getrpcbynumber,getrpcbynumber@GLIBC_2.2.5"); -__asm__(".symver getrpcbynumber_r,getrpcbynumber_r@GLIBC_2.2.5"); -__asm__(".symver getrpcent,getrpcent@GLIBC_2.2.5"); -__asm__(".symver getrpcent_r,getrpcent_r@GLIBC_2.2.5"); -__asm__(".symver getrpcport,getrpcport@GLIBC_2.2.5"); -__asm__(".symver getrusage,getrusage@GLIBC_2.2.5"); -__asm__(".symver gets,gets@GLIBC_2.2.5"); -__asm__(".symver getservbyname,getservbyname@GLIBC_2.2.5"); -__asm__(".symver getservbyname_r,getservbyname_r@GLIBC_2.2.5"); -__asm__(".symver getservbyport,getservbyport@GLIBC_2.2.5"); -__asm__(".symver getservbyport_r,getservbyport_r@GLIBC_2.2.5"); -__asm__(".symver getservent,getservent@GLIBC_2.2.5"); -__asm__(".symver getservent_r,getservent_r@GLIBC_2.2.5"); -__asm__(".symver getsgent,getsgent@GLIBC_2.10"); -__asm__(".symver getsgent_r,getsgent_r@GLIBC_2.10"); -__asm__(".symver getsgnam,getsgnam@GLIBC_2.10"); -__asm__(".symver getsgnam_r,getsgnam_r@GLIBC_2.10"); -__asm__(".symver getsid,getsid@GLIBC_2.2.5"); -__asm__(".symver getsockname,getsockname@GLIBC_2.2.5"); -__asm__(".symver getsockopt,getsockopt@GLIBC_2.2.5"); -__asm__(".symver getsourcefilter,getsourcefilter@GLIBC_2.3.4"); -__asm__(".symver getspent,getspent@GLIBC_2.2.5"); -__asm__(".symver getspent_r,getspent_r@GLIBC_2.2.5"); -__asm__(".symver getspnam,getspnam@GLIBC_2.2.5"); -__asm__(".symver getspnam_r,getspnam_r@GLIBC_2.2.5"); -__asm__(".symver getsubopt,getsubopt@GLIBC_2.2.5"); -__asm__(".symver gettext,gettext@GLIBC_2.2.5"); -__asm__(".symver gettimeofday,gettimeofday@GLIBC_2.2.5"); -__asm__(".symver getttyent,getttyent@GLIBC_2.2.5"); -__asm__(".symver getttynam,getttynam@GLIBC_2.2.5"); -__asm__(".symver getuid,getuid@GLIBC_2.2.5"); -__asm__(".symver getusershell,getusershell@GLIBC_2.2.5"); -__asm__(".symver getutent,getutent@GLIBC_2.2.5"); -__asm__(".symver getutent_r,getutent_r@GLIBC_2.2.5"); -__asm__(".symver getutid,getutid@GLIBC_2.2.5"); -__asm__(".symver getutid_r,getutid_r@GLIBC_2.2.5"); -__asm__(".symver getutline,getutline@GLIBC_2.2.5"); -__asm__(".symver getutline_r,getutline_r@GLIBC_2.2.5"); -__asm__(".symver getutmp,getutmp@GLIBC_2.2.5"); -__asm__(".symver getutmpx,getutmpx@GLIBC_2.2.5"); -__asm__(".symver getutxent,getutxent@GLIBC_2.2.5"); -__asm__(".symver getutxid,getutxid@GLIBC_2.2.5"); -__asm__(".symver getutxline,getutxline@GLIBC_2.2.5"); -__asm__(".symver getw,getw@GLIBC_2.2.5"); -__asm__(".symver getwc,getwc@GLIBC_2.2.5"); -__asm__(".symver getwc_unlocked,getwc_unlocked@GLIBC_2.2.5"); -__asm__(".symver getwchar,getwchar@GLIBC_2.2.5"); -__asm__(".symver getwchar_unlocked,getwchar_unlocked@GLIBC_2.2.5"); -__asm__(".symver getwd,getwd@GLIBC_2.2.5"); -__asm__(".symver getxattr,getxattr@GLIBC_2.3"); -__asm__(".symver glob,glob@GLIBC_2.2.5"); -__asm__(".symver glob64,glob64@GLIBC_2.2.5"); -__asm__(".symver glob_pattern_p,glob_pattern_p@GLIBC_2.2.5"); -__asm__(".symver globfree,globfree@GLIBC_2.2.5"); -__asm__(".symver globfree64,globfree64@GLIBC_2.2.5"); -__asm__(".symver gmtime,gmtime@GLIBC_2.2.5"); -__asm__(".symver gmtime_r,gmtime_r@GLIBC_2.2.5"); -__asm__(".symver gnu_dev_major,gnu_dev_major@GLIBC_2.3.3"); -__asm__(".symver gnu_dev_makedev,gnu_dev_makedev@GLIBC_2.3.3"); -__asm__(".symver gnu_dev_minor,gnu_dev_minor@GLIBC_2.3.3"); -__asm__(".symver gnu_get_libc_release,gnu_get_libc_release@GLIBC_2.2.5"); -__asm__(".symver gnu_get_libc_version,gnu_get_libc_version@GLIBC_2.2.5"); -__asm__(".symver grantpt,grantpt@GLIBC_2.2.5"); -__asm__(".symver group_member,group_member@GLIBC_2.2.5"); -__asm__(".symver gsignal,gsignal@GLIBC_2.2.5"); -__asm__(".symver gtty,gtty@GLIBC_2.2.5"); -__asm__(".symver h_errlist,h_errlist@GLIBC_2.2.5"); -__asm__(".symver h_nerr,h_nerr@GLIBC_2.2.5"); -__asm__(".symver hasmntopt,hasmntopt@GLIBC_2.2.5"); -__asm__(".symver hcreate,hcreate@GLIBC_2.2.5"); -__asm__(".symver hcreate_r,hcreate_r@GLIBC_2.2.5"); -__asm__(".symver hdestroy,hdestroy@GLIBC_2.2.5"); -__asm__(".symver hdestroy_r,hdestroy_r@GLIBC_2.2.5"); -__asm__(".symver herror,herror@GLIBC_2.2.5"); -__asm__(".symver host2netname,host2netname@GLIBC_2.2.5"); -__asm__(".symver hsearch,hsearch@GLIBC_2.2.5"); -__asm__(".symver hsearch_r,hsearch_r@GLIBC_2.2.5"); -__asm__(".symver hstrerror,hstrerror@GLIBC_2.2.5"); -__asm__(".symver htonl,htonl@GLIBC_2.2.5"); -__asm__(".symver htons,htons@GLIBC_2.2.5"); -__asm__(".symver hypot,hypot@GLIBC_2.2.5"); -__asm__(".symver hypotf,hypotf@GLIBC_2.2.5"); -__asm__(".symver hypotl,hypotl@GLIBC_2.2.5"); -__asm__(".symver iconv,iconv@GLIBC_2.2.5"); -__asm__(".symver iconv_close,iconv_close@GLIBC_2.2.5"); -__asm__(".symver iconv_open,iconv_open@GLIBC_2.2.5"); -__asm__(".symver if_freenameindex,if_freenameindex@GLIBC_2.2.5"); -__asm__(".symver if_indextoname,if_indextoname@GLIBC_2.2.5"); -__asm__(".symver if_nameindex,if_nameindex@GLIBC_2.2.5"); -__asm__(".symver if_nametoindex,if_nametoindex@GLIBC_2.2.5"); -__asm__(".symver ilogb,ilogb@GLIBC_2.2.5"); -__asm__(".symver ilogbf,ilogbf@GLIBC_2.2.5"); -__asm__(".symver ilogbl,ilogbl@GLIBC_2.2.5"); -__asm__(".symver imaxabs,imaxabs@GLIBC_2.2.5"); -__asm__(".symver imaxdiv,imaxdiv@GLIBC_2.2.5"); -__asm__(".symver in6addr_any,in6addr_any@GLIBC_2.2.5"); -__asm__(".symver in6addr_loopback,in6addr_loopback@GLIBC_2.2.5"); -__asm__(".symver index,index@GLIBC_2.2.5"); -__asm__(".symver inet6_opt_append,inet6_opt_append@GLIBC_2.5"); -__asm__(".symver inet6_opt_find,inet6_opt_find@GLIBC_2.5"); -__asm__(".symver inet6_opt_finish,inet6_opt_finish@GLIBC_2.5"); -__asm__(".symver inet6_opt_get_val,inet6_opt_get_val@GLIBC_2.5"); -__asm__(".symver inet6_opt_init,inet6_opt_init@GLIBC_2.5"); -__asm__(".symver inet6_opt_next,inet6_opt_next@GLIBC_2.5"); -__asm__(".symver inet6_opt_set_val,inet6_opt_set_val@GLIBC_2.5"); -__asm__(".symver inet6_option_alloc,inet6_option_alloc@GLIBC_2.3.3"); -__asm__(".symver inet6_option_append,inet6_option_append@GLIBC_2.3.3"); -__asm__(".symver inet6_option_find,inet6_option_find@GLIBC_2.3.3"); -__asm__(".symver inet6_option_init,inet6_option_init@GLIBC_2.3.3"); -__asm__(".symver inet6_option_next,inet6_option_next@GLIBC_2.3.3"); -__asm__(".symver inet6_option_space,inet6_option_space@GLIBC_2.3.3"); -__asm__(".symver inet6_rth_add,inet6_rth_add@GLIBC_2.5"); -__asm__(".symver inet6_rth_getaddr,inet6_rth_getaddr@GLIBC_2.5"); -__asm__(".symver inet6_rth_init,inet6_rth_init@GLIBC_2.5"); -__asm__(".symver inet6_rth_reverse,inet6_rth_reverse@GLIBC_2.5"); -__asm__(".symver inet6_rth_segments,inet6_rth_segments@GLIBC_2.5"); -__asm__(".symver inet6_rth_space,inet6_rth_space@GLIBC_2.5"); -__asm__(".symver inet_addr,inet_addr@GLIBC_2.2.5"); -__asm__(".symver inet_aton,inet_aton@GLIBC_2.2.5"); -__asm__(".symver inet_lnaof,inet_lnaof@GLIBC_2.2.5"); -__asm__(".symver inet_makeaddr,inet_makeaddr@GLIBC_2.2.5"); -__asm__(".symver inet_net_ntop,inet_net_ntop@GLIBC_2.2.5"); -__asm__(".symver inet_net_pton,inet_net_pton@GLIBC_2.2.5"); -__asm__(".symver inet_neta,inet_neta@GLIBC_2.2.5"); -__asm__(".symver inet_netof,inet_netof@GLIBC_2.2.5"); -__asm__(".symver inet_network,inet_network@GLIBC_2.2.5"); -__asm__(".symver inet_nsap_addr,inet_nsap_addr@GLIBC_2.2.5"); -__asm__(".symver inet_nsap_ntoa,inet_nsap_ntoa@GLIBC_2.2.5"); -__asm__(".symver inet_ntoa,inet_ntoa@GLIBC_2.2.5"); -__asm__(".symver inet_ntop,inet_ntop@GLIBC_2.2.5"); -__asm__(".symver inet_pton,inet_pton@GLIBC_2.2.5"); -__asm__(".symver init_module,init_module@GLIBC_2.2.5"); -__asm__(".symver initgroups,initgroups@GLIBC_2.2.5"); -__asm__(".symver initstate,initstate@GLIBC_2.2.5"); -__asm__(".symver initstate_r,initstate_r@GLIBC_2.2.5"); -__asm__(".symver innetgr,innetgr@GLIBC_2.2.5"); -__asm__(".symver inotify_add_watch,inotify_add_watch@GLIBC_2.4"); -__asm__(".symver inotify_init,inotify_init@GLIBC_2.4"); -__asm__(".symver inotify_init1,inotify_init1@GLIBC_2.9"); -__asm__(".symver inotify_rm_watch,inotify_rm_watch@GLIBC_2.4"); -__asm__(".symver insque,insque@GLIBC_2.2.5"); -__asm__(".symver ioctl,ioctl@GLIBC_2.2.5"); -__asm__(".symver ioperm,ioperm@GLIBC_2.2.5"); -__asm__(".symver iopl,iopl@GLIBC_2.2.5"); -__asm__(".symver iruserok,iruserok@GLIBC_2.2.5"); -__asm__(".symver iruserok_af,iruserok_af@GLIBC_2.2.5"); -__asm__(".symver isalnum,isalnum@GLIBC_2.2.5"); -__asm__(".symver isalnum_l,isalnum_l@GLIBC_2.3"); -__asm__(".symver isalpha,isalpha@GLIBC_2.2.5"); -__asm__(".symver isalpha_l,isalpha_l@GLIBC_2.3"); -__asm__(".symver isascii,isascii@GLIBC_2.2.5"); -__asm__(".symver isastream,isastream@GLIBC_2.2.5"); -__asm__(".symver isatty,isatty@GLIBC_2.2.5"); -__asm__(".symver isblank,isblank@GLIBC_2.2.5"); -__asm__(".symver isblank_l,isblank_l@GLIBC_2.3"); -__asm__(".symver iscntrl,iscntrl@GLIBC_2.2.5"); -__asm__(".symver iscntrl_l,iscntrl_l@GLIBC_2.3"); -__asm__(".symver isctype,isctype@GLIBC_2.3"); -__asm__(".symver isdigit,isdigit@GLIBC_2.2.5"); -__asm__(".symver isdigit_l,isdigit_l@GLIBC_2.3"); -__asm__(".symver isfdtype,isfdtype@GLIBC_2.2.5"); -__asm__(".symver isgraph,isgraph@GLIBC_2.2.5"); -__asm__(".symver isgraph_l,isgraph_l@GLIBC_2.3"); -__asm__(".symver isinf,isinf@GLIBC_2.2.5"); -__asm__(".symver isinff,isinff@GLIBC_2.2.5"); -__asm__(".symver isinfl,isinfl@GLIBC_2.2.5"); -__asm__(".symver islower,islower@GLIBC_2.2.5"); -__asm__(".symver islower_l,islower_l@GLIBC_2.3"); -__asm__(".symver isnan,isnan@GLIBC_2.2.5"); -__asm__(".symver isnanf,isnanf@GLIBC_2.2.5"); -__asm__(".symver isnanl,isnanl@GLIBC_2.2.5"); -__asm__(".symver isprint,isprint@GLIBC_2.2.5"); -__asm__(".symver isprint_l,isprint_l@GLIBC_2.3"); -__asm__(".symver ispunct,ispunct@GLIBC_2.2.5"); -__asm__(".symver ispunct_l,ispunct_l@GLIBC_2.3"); -__asm__(".symver isspace,isspace@GLIBC_2.2.5"); -__asm__(".symver isspace_l,isspace_l@GLIBC_2.3"); -__asm__(".symver isupper,isupper@GLIBC_2.2.5"); -__asm__(".symver isupper_l,isupper_l@GLIBC_2.3"); -__asm__(".symver iswalnum,iswalnum@GLIBC_2.2.5"); -__asm__(".symver iswalnum_l,iswalnum_l@GLIBC_2.3"); -__asm__(".symver iswalpha,iswalpha@GLIBC_2.2.5"); -__asm__(".symver iswalpha_l,iswalpha_l@GLIBC_2.3"); -__asm__(".symver iswblank,iswblank@GLIBC_2.2.5"); -__asm__(".symver iswblank_l,iswblank_l@GLIBC_2.3"); -__asm__(".symver iswcntrl,iswcntrl@GLIBC_2.2.5"); -__asm__(".symver iswcntrl_l,iswcntrl_l@GLIBC_2.3"); -__asm__(".symver iswctype,iswctype@GLIBC_2.2.5"); -__asm__(".symver iswctype_l,iswctype_l@GLIBC_2.3"); -__asm__(".symver iswdigit,iswdigit@GLIBC_2.2.5"); -__asm__(".symver iswdigit_l,iswdigit_l@GLIBC_2.3"); -__asm__(".symver iswgraph,iswgraph@GLIBC_2.2.5"); -__asm__(".symver iswgraph_l,iswgraph_l@GLIBC_2.3"); -__asm__(".symver iswlower,iswlower@GLIBC_2.2.5"); -__asm__(".symver iswlower_l,iswlower_l@GLIBC_2.3"); -__asm__(".symver iswprint,iswprint@GLIBC_2.2.5"); -__asm__(".symver iswprint_l,iswprint_l@GLIBC_2.3"); -__asm__(".symver iswpunct,iswpunct@GLIBC_2.2.5"); -__asm__(".symver iswpunct_l,iswpunct_l@GLIBC_2.3"); -__asm__(".symver iswspace,iswspace@GLIBC_2.2.5"); -__asm__(".symver iswspace_l,iswspace_l@GLIBC_2.3"); -__asm__(".symver iswupper,iswupper@GLIBC_2.2.5"); -__asm__(".symver iswupper_l,iswupper_l@GLIBC_2.3"); -__asm__(".symver iswxdigit,iswxdigit@GLIBC_2.2.5"); -__asm__(".symver iswxdigit_l,iswxdigit_l@GLIBC_2.3"); -__asm__(".symver isxdigit,isxdigit@GLIBC_2.2.5"); -__asm__(".symver isxdigit_l,isxdigit_l@GLIBC_2.3"); -__asm__(".symver j0,j0@GLIBC_2.2.5"); -__asm__(".symver j0f,j0f@GLIBC_2.2.5"); -__asm__(".symver j0l,j0l@GLIBC_2.2.5"); -__asm__(".symver j1,j1@GLIBC_2.2.5"); -__asm__(".symver j1f,j1f@GLIBC_2.2.5"); -__asm__(".symver j1l,j1l@GLIBC_2.2.5"); -__asm__(".symver jn,jn@GLIBC_2.2.5"); -__asm__(".symver jnf,jnf@GLIBC_2.2.5"); -__asm__(".symver jnl,jnl@GLIBC_2.2.5"); -__asm__(".symver jrand48,jrand48@GLIBC_2.2.5"); -__asm__(".symver jrand48_r,jrand48_r@GLIBC_2.2.5"); -__asm__(".symver key_gendes,key_gendes@GLIBC_2.2.5"); -__asm__(".symver key_secretkey_is_set,key_secretkey_is_set@GLIBC_2.2.5"); -__asm__(".symver kill,kill@GLIBC_2.2.5"); -__asm__(".symver killpg,killpg@GLIBC_2.2.5"); -__asm__(".symver klogctl,klogctl@GLIBC_2.2.5"); -__asm__(".symver l64a,l64a@GLIBC_2.2.5"); -__asm__(".symver labs,labs@GLIBC_2.2.5"); -__asm__(".symver lchmod,lchmod@GLIBC_2.3.2"); -__asm__(".symver lchown,lchown@GLIBC_2.2.5"); -__asm__(".symver lckpwdf,lckpwdf@GLIBC_2.2.5"); -__asm__(".symver lcong48,lcong48@GLIBC_2.2.5"); -__asm__(".symver lcong48_r,lcong48_r@GLIBC_2.2.5"); -__asm__(".symver ldexp,ldexp@GLIBC_2.2.5"); -__asm__(".symver ldexpf,ldexpf@GLIBC_2.2.5"); -__asm__(".symver ldexpl,ldexpl@GLIBC_2.2.5"); -__asm__(".symver ldiv,ldiv@GLIBC_2.2.5"); -__asm__(".symver lfind,lfind@GLIBC_2.2.5"); -__asm__(".symver lgamma,lgamma@GLIBC_2.23"); -__asm__(".symver lgamma_r,lgamma_r@GLIBC_2.2.5"); -__asm__(".symver lgammaf,lgammaf@GLIBC_2.23"); -__asm__(".symver lgammaf_r,lgammaf_r@GLIBC_2.2.5"); -__asm__(".symver lgammal,lgammal@GLIBC_2.23"); -__asm__(".symver lgammal_r,lgammal_r@GLIBC_2.2.5"); -__asm__(".symver lgetxattr,lgetxattr@GLIBC_2.3"); -__asm__(".symver link,link@GLIBC_2.2.5"); -__asm__(".symver linkat,linkat@GLIBC_2.4"); -__asm__(".symver lio_listio,lio_listio@GLIBC_2.4"); -__asm__(".symver lio_listio64,lio_listio64@GLIBC_2.4"); -__asm__(".symver listen,listen@GLIBC_2.2.5"); -__asm__(".symver listxattr,listxattr@GLIBC_2.3"); -__asm__(".symver llabs,llabs@GLIBC_2.2.5"); -__asm__(".symver lldiv,lldiv@GLIBC_2.2.5"); -__asm__(".symver llistxattr,llistxattr@GLIBC_2.3"); -__asm__(".symver llrint,llrint@GLIBC_2.2.5"); -__asm__(".symver llrintf,llrintf@GLIBC_2.2.5"); -__asm__(".symver llrintl,llrintl@GLIBC_2.2.5"); -__asm__(".symver llround,llround@GLIBC_2.2.5"); -__asm__(".symver llroundf,llroundf@GLIBC_2.2.5"); -__asm__(".symver llroundl,llroundl@GLIBC_2.2.5"); -__asm__(".symver llseek,llseek@GLIBC_2.2.5"); -__asm__(".symver localeconv,localeconv@GLIBC_2.2.5"); -__asm__(".symver localtime,localtime@GLIBC_2.2.5"); -__asm__(".symver localtime_r,localtime_r@GLIBC_2.2.5"); -__asm__(".symver lockf,lockf@GLIBC_2.2.5"); -__asm__(".symver lockf64,lockf64@GLIBC_2.2.5"); -__asm__(".symver log,log@GLIBC_2.2.5"); -__asm__(".symver log10,log10@GLIBC_2.2.5"); -__asm__(".symver log10f,log10f@GLIBC_2.2.5"); -__asm__(".symver log10l,log10l@GLIBC_2.2.5"); -__asm__(".symver log1p,log1p@GLIBC_2.2.5"); -__asm__(".symver log1pf,log1pf@GLIBC_2.2.5"); -__asm__(".symver log1pl,log1pl@GLIBC_2.2.5"); -__asm__(".symver log2,log2@GLIBC_2.2.5"); -__asm__(".symver log2f,log2f@GLIBC_2.2.5"); -__asm__(".symver log2l,log2l@GLIBC_2.2.5"); -__asm__(".symver logb,logb@GLIBC_2.2.5"); -__asm__(".symver logbf,logbf@GLIBC_2.2.5"); -__asm__(".symver logbl,logbl@GLIBC_2.2.5"); -__asm__(".symver logf,logf@GLIBC_2.2.5"); -__asm__(".symver login,login@GLIBC_2.2.5"); -__asm__(".symver login_tty,login_tty@GLIBC_2.2.5"); -__asm__(".symver logl,logl@GLIBC_2.2.5"); -__asm__(".symver logout,logout@GLIBC_2.2.5"); -__asm__(".symver logwtmp,logwtmp@GLIBC_2.2.5"); -__asm__(".symver longjmp,longjmp@GLIBC_2.2.5"); -__asm__(".symver lrand48,lrand48@GLIBC_2.2.5"); -__asm__(".symver lrand48_r,lrand48_r@GLIBC_2.2.5"); -__asm__(".symver lremovexattr,lremovexattr@GLIBC_2.3"); -__asm__(".symver lrint,lrint@GLIBC_2.2.5"); -__asm__(".symver lrintf,lrintf@GLIBC_2.2.5"); -__asm__(".symver lrintl,lrintl@GLIBC_2.2.5"); -__asm__(".symver lround,lround@GLIBC_2.2.5"); -__asm__(".symver lroundf,lroundf@GLIBC_2.2.5"); -__asm__(".symver lroundl,lroundl@GLIBC_2.2.5"); -__asm__(".symver lsearch,lsearch@GLIBC_2.2.5"); -__asm__(".symver lseek,lseek@GLIBC_2.2.5"); -__asm__(".symver lseek64,lseek64@GLIBC_2.2.5"); -__asm__(".symver lsetxattr,lsetxattr@GLIBC_2.3"); -__asm__(".symver lutimes,lutimes@GLIBC_2.3"); -__asm__(".symver madvise,madvise@GLIBC_2.2.5"); -__asm__(".symver makecontext,makecontext@GLIBC_2.2.5"); -__asm__(".symver mallinfo,mallinfo@GLIBC_2.2.5"); -__asm__(".symver malloc,malloc@GLIBC_2.2.5"); -__asm__(".symver malloc_get_state,malloc_get_state@GLIBC_2.2.5"); -__asm__(".symver malloc_info,malloc_info@GLIBC_2.10"); -__asm__(".symver malloc_set_state,malloc_set_state@GLIBC_2.2.5"); -__asm__(".symver malloc_stats,malloc_stats@GLIBC_2.2.5"); -__asm__(".symver malloc_trim,malloc_trim@GLIBC_2.2.5"); -__asm__(".symver malloc_usable_size,malloc_usable_size@GLIBC_2.2.5"); -__asm__(".symver mallopt,mallopt@GLIBC_2.2.5"); -__asm__(".symver mallwatch,mallwatch@GLIBC_2.2.5"); -__asm__(".symver matherr,matherr@GLIBC_2.2.5"); -__asm__(".symver mblen,mblen@GLIBC_2.2.5"); -__asm__(".symver mbrlen,mbrlen@GLIBC_2.2.5"); -__asm__(".symver mbrtoc16,mbrtoc16@GLIBC_2.16"); -__asm__(".symver mbrtoc32,mbrtoc32@GLIBC_2.16"); -__asm__(".symver mbrtowc,mbrtowc@GLIBC_2.2.5"); -__asm__(".symver mbsinit,mbsinit@GLIBC_2.2.5"); -__asm__(".symver mbsnrtowcs,mbsnrtowcs@GLIBC_2.2.5"); -__asm__(".symver mbsrtowcs,mbsrtowcs@GLIBC_2.2.5"); -__asm__(".symver mbstowcs,mbstowcs@GLIBC_2.2.5"); -__asm__(".symver mbtowc,mbtowc@GLIBC_2.2.5"); -__asm__(".symver mcheck,mcheck@GLIBC_2.2.5"); -__asm__(".symver mcheck_check_all,mcheck_check_all@GLIBC_2.2.5"); -__asm__(".symver mcheck_pedantic,mcheck_pedantic@GLIBC_2.2.5"); -__asm__(".symver mcount,mcount@GLIBC_2.2.5"); -__asm__(".symver memalign,memalign@GLIBC_2.2.5"); -__asm__(".symver memccpy,memccpy@GLIBC_2.2.5"); -__asm__(".symver memchr,memchr@GLIBC_2.2.5"); -__asm__(".symver memcmp,memcmp@GLIBC_2.2.5"); -__asm__(".symver memcpy,memcpy@GLIBC_2.14"); -__asm__(".symver memfrob,memfrob@GLIBC_2.2.5"); -__asm__(".symver memmem,memmem@GLIBC_2.2.5"); -__asm__(".symver memmove,memmove@GLIBC_2.2.5"); -__asm__(".symver mempcpy,mempcpy@GLIBC_2.2.5"); -__asm__(".symver memrchr,memrchr@GLIBC_2.2.5"); -__asm__(".symver memset,memset@GLIBC_2.2.5"); -__asm__(".symver mincore,mincore@GLIBC_2.2.5"); -__asm__(".symver mkdir,mkdir@GLIBC_2.2.5"); -__asm__(".symver mkdirat,mkdirat@GLIBC_2.4"); -__asm__(".symver mkdtemp,mkdtemp@GLIBC_2.2.5"); -__asm__(".symver mkfifo,mkfifo@GLIBC_2.2.5"); -__asm__(".symver mkfifoat,mkfifoat@GLIBC_2.4"); -__asm__(".symver mkostemp,mkostemp@GLIBC_2.7"); -__asm__(".symver mkostemp64,mkostemp64@GLIBC_2.7"); -__asm__(".symver mkostemps,mkostemps@GLIBC_2.11"); -__asm__(".symver mkostemps64,mkostemps64@GLIBC_2.11"); -__asm__(".symver mkstemp,mkstemp@GLIBC_2.2.5"); -__asm__(".symver mkstemp64,mkstemp64@GLIBC_2.2.5"); -__asm__(".symver mkstemps,mkstemps@GLIBC_2.11"); -__asm__(".symver mkstemps64,mkstemps64@GLIBC_2.11"); -__asm__(".symver mktemp,mktemp@GLIBC_2.2.5"); -__asm__(".symver mktime,mktime@GLIBC_2.2.5"); -__asm__(".symver mlock,mlock@GLIBC_2.2.5"); -__asm__(".symver mlockall,mlockall@GLIBC_2.2.5"); -__asm__(".symver mmap,mmap@GLIBC_2.2.5"); -__asm__(".symver mmap64,mmap64@GLIBC_2.2.5"); -__asm__(".symver modf,modf@GLIBC_2.2.5"); -__asm__(".symver modff,modff@GLIBC_2.2.5"); -__asm__(".symver modfl,modfl@GLIBC_2.2.5"); -__asm__(".symver modify_ldt,modify_ldt@GLIBC_2.2.5"); -__asm__(".symver moncontrol,moncontrol@GLIBC_2.2.5"); -__asm__(".symver monstartup,monstartup@GLIBC_2.2.5"); -__asm__(".symver mount,mount@GLIBC_2.2.5"); -__asm__(".symver mprobe,mprobe@GLIBC_2.2.5"); -__asm__(".symver mprotect,mprotect@GLIBC_2.2.5"); -__asm__(".symver mq_close,mq_close@GLIBC_2.3.4"); -__asm__(".symver mq_getattr,mq_getattr@GLIBC_2.3.4"); -__asm__(".symver mq_notify,mq_notify@GLIBC_2.3.4"); -__asm__(".symver mq_open,mq_open@GLIBC_2.3.4"); -__asm__(".symver mq_receive,mq_receive@GLIBC_2.3.4"); -__asm__(".symver mq_send,mq_send@GLIBC_2.3.4"); -__asm__(".symver mq_setattr,mq_setattr@GLIBC_2.3.4"); -__asm__(".symver mq_timedreceive,mq_timedreceive@GLIBC_2.3.4"); -__asm__(".symver mq_timedsend,mq_timedsend@GLIBC_2.3.4"); -__asm__(".symver mq_unlink,mq_unlink@GLIBC_2.3.4"); -__asm__(".symver mrand48,mrand48@GLIBC_2.2.5"); -__asm__(".symver mrand48_r,mrand48_r@GLIBC_2.2.5"); -__asm__(".symver mremap,mremap@GLIBC_2.2.5"); -__asm__(".symver msgctl,msgctl@GLIBC_2.2.5"); -__asm__(".symver msgget,msgget@GLIBC_2.2.5"); -__asm__(".symver msgrcv,msgrcv@GLIBC_2.2.5"); -__asm__(".symver msgsnd,msgsnd@GLIBC_2.2.5"); -__asm__(".symver msync,msync@GLIBC_2.2.5"); -__asm__(".symver mtrace,mtrace@GLIBC_2.2.5"); -__asm__(".symver munlock,munlock@GLIBC_2.2.5"); -__asm__(".symver munlockall,munlockall@GLIBC_2.2.5"); -__asm__(".symver munmap,munmap@GLIBC_2.2.5"); -__asm__(".symver muntrace,muntrace@GLIBC_2.2.5"); -__asm__(".symver name_to_handle_at,name_to_handle_at@GLIBC_2.14"); -__asm__(".symver nan,nan@GLIBC_2.2.5"); -__asm__(".symver nanf,nanf@GLIBC_2.2.5"); -__asm__(".symver nanl,nanl@GLIBC_2.2.5"); -__asm__(".symver nanosleep,nanosleep@GLIBC_2.2.5"); -__asm__(".symver nearbyint,nearbyint@GLIBC_2.2.5"); -__asm__(".symver nearbyintf,nearbyintf@GLIBC_2.2.5"); -__asm__(".symver nearbyintl,nearbyintl@GLIBC_2.2.5"); -__asm__(".symver newlocale,newlocale@GLIBC_2.3"); -__asm__(".symver nextafter,nextafter@GLIBC_2.2.5"); -__asm__(".symver nextafterf,nextafterf@GLIBC_2.2.5"); -__asm__(".symver nextafterl,nextafterl@GLIBC_2.2.5"); -__asm__(".symver nexttoward,nexttoward@GLIBC_2.2.5"); -__asm__(".symver nexttowardf,nexttowardf@GLIBC_2.2.5"); -__asm__(".symver nexttowardl,nexttowardl@GLIBC_2.2.5"); -__asm__(".symver nfsservctl,nfsservctl@GLIBC_2.2.5"); -__asm__(".symver nftw,nftw@GLIBC_2.3.3"); -__asm__(".symver nftw64,nftw64@GLIBC_2.3.3"); -__asm__(".symver ngettext,ngettext@GLIBC_2.2.5"); -__asm__(".symver nice,nice@GLIBC_2.2.5"); -__asm__(".symver nis_add,nis_add@GLIBC_2.2.5"); -__asm__(".symver nis_add_entry,nis_add_entry@GLIBC_2.2.5"); -__asm__(".symver nis_addmember,nis_addmember@GLIBC_2.2.5"); -__asm__(".symver nis_checkpoint,nis_checkpoint@GLIBC_2.2.5"); -__asm__(".symver nis_clone_directory,nis_clone_directory@GLIBC_2.2.5"); -__asm__(".symver nis_clone_object,nis_clone_object@GLIBC_2.2.5"); -__asm__(".symver nis_clone_result,nis_clone_result@GLIBC_2.2.5"); -__asm__(".symver nis_creategroup,nis_creategroup@GLIBC_2.2.5"); -__asm__(".symver nis_destroy_object,nis_destroy_object@GLIBC_2.2.5"); -__asm__(".symver nis_destroygroup,nis_destroygroup@GLIBC_2.2.5"); -__asm__(".symver nis_dir_cmp,nis_dir_cmp@GLIBC_2.2.5"); -__asm__(".symver nis_domain_of,nis_domain_of@GLIBC_2.2.5"); -__asm__(".symver nis_domain_of_r,nis_domain_of_r@GLIBC_2.2.5"); -__asm__(".symver nis_first_entry,nis_first_entry@GLIBC_2.2.5"); -__asm__(".symver nis_free_directory,nis_free_directory@GLIBC_2.2.5"); -__asm__(".symver nis_free_object,nis_free_object@GLIBC_2.2.5"); -__asm__(".symver nis_free_request,nis_free_request@GLIBC_2.2.5"); -__asm__(".symver nis_freenames,nis_freenames@GLIBC_2.2.5"); -__asm__(".symver nis_freeresult,nis_freeresult@GLIBC_2.2.5"); -__asm__(".symver nis_freeservlist,nis_freeservlist@GLIBC_2.2.5"); -__asm__(".symver nis_freetags,nis_freetags@GLIBC_2.2.5"); -__asm__(".symver nis_getnames,nis_getnames@GLIBC_2.2.5"); -__asm__(".symver nis_getservlist,nis_getservlist@GLIBC_2.2.5"); -__asm__(".symver nis_ismember,nis_ismember@GLIBC_2.2.5"); -__asm__(".symver nis_leaf_of,nis_leaf_of@GLIBC_2.2.5"); -__asm__(".symver nis_leaf_of_r,nis_leaf_of_r@GLIBC_2.2.5"); -__asm__(".symver nis_lerror,nis_lerror@GLIBC_2.2.5"); -__asm__(".symver nis_list,nis_list@GLIBC_2.2.5"); -__asm__(".symver nis_local_directory,nis_local_directory@GLIBC_2.2.5"); -__asm__(".symver nis_local_group,nis_local_group@GLIBC_2.2.5"); -__asm__(".symver nis_local_host,nis_local_host@GLIBC_2.2.5"); -__asm__(".symver nis_local_principal,nis_local_principal@GLIBC_2.2.5"); -__asm__(".symver nis_lookup,nis_lookup@GLIBC_2.2.5"); -__asm__(".symver nis_mkdir,nis_mkdir@GLIBC_2.2.5"); -__asm__(".symver nis_modify,nis_modify@GLIBC_2.2.5"); -__asm__(".symver nis_modify_entry,nis_modify_entry@GLIBC_2.2.5"); -__asm__(".symver nis_name_of,nis_name_of@GLIBC_2.2.5"); -__asm__(".symver nis_name_of_r,nis_name_of_r@GLIBC_2.2.5"); -__asm__(".symver nis_next_entry,nis_next_entry@GLIBC_2.2.5"); -__asm__(".symver nis_perror,nis_perror@GLIBC_2.2.5"); -__asm__(".symver nis_ping,nis_ping@GLIBC_2.2.5"); -__asm__(".symver nis_print_directory,nis_print_directory@GLIBC_2.2.5"); -__asm__(".symver nis_print_entry,nis_print_entry@GLIBC_2.2.5"); -__asm__(".symver nis_print_group,nis_print_group@GLIBC_2.2.5"); -__asm__(".symver nis_print_group_entry,nis_print_group_entry@GLIBC_2.2.5"); -__asm__(".symver nis_print_link,nis_print_link@GLIBC_2.2.5"); -__asm__(".symver nis_print_object,nis_print_object@GLIBC_2.2.5"); -__asm__(".symver nis_print_result,nis_print_result@GLIBC_2.2.5"); -__asm__(".symver nis_print_rights,nis_print_rights@GLIBC_2.2.5"); -__asm__(".symver nis_print_table,nis_print_table@GLIBC_2.2.5"); -__asm__(".symver nis_read_obj,nis_read_obj@GLIBC_2.2.5"); -__asm__(".symver nis_remove,nis_remove@GLIBC_2.2.5"); -__asm__(".symver nis_remove_entry,nis_remove_entry@GLIBC_2.2.5"); -__asm__(".symver nis_removemember,nis_removemember@GLIBC_2.2.5"); -__asm__(".symver nis_rmdir,nis_rmdir@GLIBC_2.2.5"); -__asm__(".symver nis_servstate,nis_servstate@GLIBC_2.2.5"); -__asm__(".symver nis_sperrno,nis_sperrno@GLIBC_2.2.5"); -__asm__(".symver nis_sperror,nis_sperror@GLIBC_2.2.5"); -__asm__(".symver nis_sperror_r,nis_sperror_r@GLIBC_2.2.5"); -__asm__(".symver nis_stats,nis_stats@GLIBC_2.2.5"); -__asm__(".symver nis_verifygroup,nis_verifygroup@GLIBC_2.2.5"); -__asm__(".symver nis_write_obj,nis_write_obj@GLIBC_2.2.5"); -__asm__(".symver nl_langinfo,nl_langinfo@GLIBC_2.2.5"); -__asm__(".symver nl_langinfo_l,nl_langinfo_l@GLIBC_2.3"); -__asm__(".symver nrand48,nrand48@GLIBC_2.2.5"); -__asm__(".symver nrand48_r,nrand48_r@GLIBC_2.2.5"); -__asm__(".symver ns_datetosecs,ns_datetosecs@GLIBC_2.9"); -__asm__(".symver ns_format_ttl,ns_format_ttl@GLIBC_2.9"); -__asm__(".symver ns_get16,ns_get16@GLIBC_2.9"); -__asm__(".symver ns_get32,ns_get32@GLIBC_2.9"); -__asm__(".symver ns_initparse,ns_initparse@GLIBC_2.9"); -__asm__(".symver ns_makecanon,ns_makecanon@GLIBC_2.9"); -__asm__(".symver ns_msg_getflag,ns_msg_getflag@GLIBC_2.9"); -__asm__(".symver ns_name_compress,ns_name_compress@GLIBC_2.9"); -__asm__(".symver ns_name_ntol,ns_name_ntol@GLIBC_2.9"); -__asm__(".symver ns_name_ntop,ns_name_ntop@GLIBC_2.9"); -__asm__(".symver ns_name_pack,ns_name_pack@GLIBC_2.9"); -__asm__(".symver ns_name_pton,ns_name_pton@GLIBC_2.9"); -__asm__(".symver ns_name_rollback,ns_name_rollback@GLIBC_2.9"); -__asm__(".symver ns_name_skip,ns_name_skip@GLIBC_2.9"); -__asm__(".symver ns_name_uncompress,ns_name_uncompress@GLIBC_2.9"); -__asm__(".symver ns_name_unpack,ns_name_unpack@GLIBC_2.9"); -__asm__(".symver ns_parse_ttl,ns_parse_ttl@GLIBC_2.9"); -__asm__(".symver ns_parserr,ns_parserr@GLIBC_2.9"); -__asm__(".symver ns_put16,ns_put16@GLIBC_2.9"); -__asm__(".symver ns_put32,ns_put32@GLIBC_2.9"); -__asm__(".symver ns_samedomain,ns_samedomain@GLIBC_2.9"); -__asm__(".symver ns_samename,ns_samename@GLIBC_2.9"); -__asm__(".symver ns_skiprr,ns_skiprr@GLIBC_2.9"); -__asm__(".symver ns_sprintrr,ns_sprintrr@GLIBC_2.9"); -__asm__(".symver ns_sprintrrf,ns_sprintrrf@GLIBC_2.9"); -__asm__(".symver ns_subdomain,ns_subdomain@GLIBC_2.9"); -__asm__(".symver ntohl,ntohl@GLIBC_2.2.5"); -__asm__(".symver ntohs,ntohs@GLIBC_2.2.5"); -__asm__(".symver ntp_adjtime,ntp_adjtime@GLIBC_2.2.5"); -__asm__(".symver ntp_gettime,ntp_gettime@GLIBC_2.2.5"); -__asm__(".symver ntp_gettimex,ntp_gettimex@GLIBC_2.12"); -__asm__(".symver obstack_alloc_failed_handler,obstack_alloc_failed_handler@GLIBC_2.2.5"); -__asm__(".symver obstack_exit_failure,obstack_exit_failure@GLIBC_2.2.5"); -__asm__(".symver obstack_free,obstack_free@GLIBC_2.2.5"); -__asm__(".symver obstack_printf,obstack_printf@GLIBC_2.2.5"); -__asm__(".symver obstack_vprintf,obstack_vprintf@GLIBC_2.2.5"); -__asm__(".symver on_exit,on_exit@GLIBC_2.2.5"); -__asm__(".symver open,open@GLIBC_2.2.5"); -__asm__(".symver open64,open64@GLIBC_2.2.5"); -__asm__(".symver open_by_handle_at,open_by_handle_at@GLIBC_2.14"); -__asm__(".symver open_memstream,open_memstream@GLIBC_2.2.5"); -__asm__(".symver open_wmemstream,open_wmemstream@GLIBC_2.4"); -__asm__(".symver openat,openat@GLIBC_2.4"); -__asm__(".symver openat64,openat64@GLIBC_2.4"); -__asm__(".symver opendir,opendir@GLIBC_2.2.5"); -__asm__(".symver openlog,openlog@GLIBC_2.2.5"); -__asm__(".symver openpty,openpty@GLIBC_2.2.5"); -__asm__(".symver optarg,optarg@GLIBC_2.2.5"); -__asm__(".symver opterr,opterr@GLIBC_2.2.5"); -__asm__(".symver optind,optind@GLIBC_2.2.5"); -__asm__(".symver optopt,optopt@GLIBC_2.2.5"); -__asm__(".symver parse_printf_format,parse_printf_format@GLIBC_2.2.5"); -__asm__(".symver pathconf,pathconf@GLIBC_2.2.5"); -__asm__(".symver pause,pause@GLIBC_2.2.5"); -__asm__(".symver pclose,pclose@GLIBC_2.2.5"); -__asm__(".symver perror,perror@GLIBC_2.2.5"); -__asm__(".symver personality,personality@GLIBC_2.2.5"); -__asm__(".symver pipe,pipe@GLIBC_2.2.5"); -__asm__(".symver pipe2,pipe2@GLIBC_2.9"); -__asm__(".symver pivot_root,pivot_root@GLIBC_2.2.5"); -__asm__(".symver poll,poll@GLIBC_2.2.5"); -__asm__(".symver popen,popen@GLIBC_2.2.5"); -__asm__(".symver posix_fadvise,posix_fadvise@GLIBC_2.2.5"); -__asm__(".symver posix_fadvise64,posix_fadvise64@GLIBC_2.2.5"); -__asm__(".symver posix_fallocate,posix_fallocate@GLIBC_2.2.5"); -__asm__(".symver posix_fallocate64,posix_fallocate64@GLIBC_2.2.5"); -__asm__(".symver posix_madvise,posix_madvise@GLIBC_2.2.5"); -__asm__(".symver posix_memalign,posix_memalign@GLIBC_2.2.5"); -__asm__(".symver posix_openpt,posix_openpt@GLIBC_2.2.5"); -__asm__(".symver posix_spawn,posix_spawn@GLIBC_2.15"); -__asm__(".symver posix_spawn_file_actions_addclose,posix_spawn_file_actions_addclose@GLIBC_2.2.5"); -__asm__(".symver posix_spawn_file_actions_adddup2,posix_spawn_file_actions_adddup2@GLIBC_2.2.5"); -__asm__(".symver posix_spawn_file_actions_addopen,posix_spawn_file_actions_addopen@GLIBC_2.2.5"); -__asm__(".symver posix_spawn_file_actions_destroy,posix_spawn_file_actions_destroy@GLIBC_2.2.5"); -__asm__(".symver posix_spawn_file_actions_init,posix_spawn_file_actions_init@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_destroy,posix_spawnattr_destroy@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_getflags,posix_spawnattr_getflags@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_getpgroup,posix_spawnattr_getpgroup@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_getschedparam,posix_spawnattr_getschedparam@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_getschedpolicy,posix_spawnattr_getschedpolicy@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_getsigdefault,posix_spawnattr_getsigdefault@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_getsigmask,posix_spawnattr_getsigmask@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_init,posix_spawnattr_init@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_setflags,posix_spawnattr_setflags@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_setpgroup,posix_spawnattr_setpgroup@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_setschedparam,posix_spawnattr_setschedparam@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_setschedpolicy,posix_spawnattr_setschedpolicy@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_setsigdefault,posix_spawnattr_setsigdefault@GLIBC_2.2.5"); -__asm__(".symver posix_spawnattr_setsigmask,posix_spawnattr_setsigmask@GLIBC_2.2.5"); -__asm__(".symver posix_spawnp,posix_spawnp@GLIBC_2.15"); -__asm__(".symver pow,pow@GLIBC_2.2.5"); -__asm__(".symver pow10,pow10@GLIBC_2.2.5"); -__asm__(".symver pow10f,pow10f@GLIBC_2.2.5"); -__asm__(".symver pow10l,pow10l@GLIBC_2.2.5"); -__asm__(".symver powf,powf@GLIBC_2.2.5"); -__asm__(".symver powl,powl@GLIBC_2.2.5"); -__asm__(".symver ppoll,ppoll@GLIBC_2.4"); -__asm__(".symver prctl,prctl@GLIBC_2.2.5"); -__asm__(".symver pread,pread@GLIBC_2.2.5"); -__asm__(".symver pread64,pread64@GLIBC_2.2.5"); -__asm__(".symver preadv,preadv@GLIBC_2.10"); -__asm__(".symver preadv64,preadv64@GLIBC_2.10"); -__asm__(".symver printf,printf@GLIBC_2.2.5"); -__asm__(".symver printf_size,printf_size@GLIBC_2.2.5"); -__asm__(".symver printf_size_info,printf_size_info@GLIBC_2.2.5"); -__asm__(".symver prlimit,prlimit@GLIBC_2.13"); -__asm__(".symver prlimit64,prlimit64@GLIBC_2.13"); -__asm__(".symver process_vm_readv,process_vm_readv@GLIBC_2.15"); -__asm__(".symver process_vm_writev,process_vm_writev@GLIBC_2.15"); -__asm__(".symver profil,profil@GLIBC_2.2.5"); -__asm__(".symver program_invocation_name,program_invocation_name@GLIBC_2.2.5"); -__asm__(".symver program_invocation_short_name,program_invocation_short_name@GLIBC_2.2.5"); -__asm__(".symver pselect,pselect@GLIBC_2.2.5"); -__asm__(".symver psiginfo,psiginfo@GLIBC_2.10"); -__asm__(".symver psignal,psignal@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_attr_destroy,pthread_attr_destroy@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_attr_getaffinity_np,pthread_attr_getaffinity_np@GLIBC_2.3.4"); -#ifdef _REENTRANT -__asm__(".symver pthread_attr_getdetachstate,pthread_attr_getdetachstate@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_attr_getguardsize,pthread_attr_getguardsize@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_attr_getinheritsched,pthread_attr_getinheritsched@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_attr_getschedparam,pthread_attr_getschedparam@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_attr_getschedpolicy,pthread_attr_getschedpolicy@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_attr_getscope,pthread_attr_getscope@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_attr_getstack,pthread_attr_getstack@GLIBC_2.2.5"); -__asm__(".symver pthread_attr_getstackaddr,pthread_attr_getstackaddr@GLIBC_2.2.5"); -__asm__(".symver pthread_attr_getstacksize,pthread_attr_getstacksize@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_attr_init,pthread_attr_init@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_attr_setaffinity_np,pthread_attr_setaffinity_np@GLIBC_2.3.4"); -#ifdef _REENTRANT -__asm__(".symver pthread_attr_setdetachstate,pthread_attr_setdetachstate@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_attr_setguardsize,pthread_attr_setguardsize@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_attr_setinheritsched,pthread_attr_setinheritsched@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_attr_setschedparam,pthread_attr_setschedparam@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_attr_setschedpolicy,pthread_attr_setschedpolicy@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_attr_setscope,pthread_attr_setscope@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_attr_setstack,pthread_attr_setstack@GLIBC_2.2.5"); -__asm__(".symver pthread_attr_setstackaddr,pthread_attr_setstackaddr@GLIBC_2.2.5"); -__asm__(".symver pthread_attr_setstacksize,pthread_attr_setstacksize@GLIBC_2.2.5"); -__asm__(".symver pthread_barrier_destroy,pthread_barrier_destroy@GLIBC_2.2.5"); -__asm__(".symver pthread_barrier_init,pthread_barrier_init@GLIBC_2.2.5"); -__asm__(".symver pthread_barrier_wait,pthread_barrier_wait@GLIBC_2.2.5"); -__asm__(".symver pthread_barrierattr_destroy,pthread_barrierattr_destroy@GLIBC_2.2.5"); -__asm__(".symver pthread_barrierattr_getpshared,pthread_barrierattr_getpshared@GLIBC_2.3.3"); -__asm__(".symver pthread_barrierattr_init,pthread_barrierattr_init@GLIBC_2.2.5"); -__asm__(".symver pthread_barrierattr_setpshared,pthread_barrierattr_setpshared@GLIBC_2.2.5"); -__asm__(".symver pthread_cancel,pthread_cancel@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_cond_broadcast,pthread_cond_broadcast@GLIBC_2.3.2"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_cond_destroy,pthread_cond_destroy@GLIBC_2.3.2"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_cond_init,pthread_cond_init@GLIBC_2.3.2"); -#endif -__asm__(".symver pthread_cond_signal,pthread_cond_signal@GLIBC_2.3.2"); -#ifdef _REENTRANT -__asm__(".symver pthread_cond_timedwait,pthread_cond_timedwait@GLIBC_2.3.2"); -#endif -__asm__(".symver pthread_cond_wait,pthread_cond_wait@GLIBC_2.3.2"); -#ifdef _REENTRANT -__asm__(".symver pthread_condattr_destroy,pthread_condattr_destroy@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_condattr_getclock,pthread_condattr_getclock@GLIBC_2.3.3"); -__asm__(".symver pthread_condattr_getpshared,pthread_condattr_getpshared@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_condattr_init,pthread_condattr_init@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_condattr_setclock,pthread_condattr_setclock@GLIBC_2.3.3"); -__asm__(".symver pthread_condattr_setpshared,pthread_condattr_setpshared@GLIBC_2.2.5"); -#ifndef _GLIBCXX_SHARED -#ifdef _REENTRANT -__asm__(".symver pthread_create,pthread_create@GLIBC_2.2.5"); -#endif -#endif -#ifndef _GLIBCXX_SHARED -#ifdef _REENTRANT -__asm__(".symver pthread_detach,pthread_detach@GLIBC_2.2.5"); -#endif -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_equal,pthread_equal@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_exit,pthread_exit@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_getaffinity_np,pthread_getaffinity_np@GLIBC_2.3.4"); -__asm__(".symver pthread_getattr_default_np,pthread_getattr_default_np@GLIBC_2.18"); -__asm__(".symver pthread_getattr_np,pthread_getattr_np@GLIBC_2.2.5"); -__asm__(".symver pthread_getconcurrency,pthread_getconcurrency@GLIBC_2.2.5"); -__asm__(".symver pthread_getcpuclockid,pthread_getcpuclockid@GLIBC_2.2.5"); -__asm__(".symver pthread_getname_np,pthread_getname_np@GLIBC_2.12"); -#ifdef _REENTRANT -__asm__(".symver pthread_getschedparam,pthread_getschedparam@GLIBC_2.2.5"); -#endif -#ifndef _GLIBCXX_SHARED -#ifndef IN_LIBGCC2 -#ifdef _REENTRANT -__asm__(".symver pthread_getspecific,pthread_getspecific@GLIBC_2.2.5"); -#endif -#endif -#endif -#ifndef _GLIBCXX_SHARED -#ifdef _REENTRANT -__asm__(".symver pthread_join,pthread_join@GLIBC_2.2.5"); -#endif -#endif -#ifndef _GLIBCXX_SHARED -#ifndef IN_LIBGCC2 -#ifdef _REENTRANT -__asm__(".symver pthread_key_create,pthread_key_create@GLIBC_2.2.5"); -#endif -#endif -#endif -#ifndef _GLIBCXX_SHARED -#ifdef _REENTRANT -__asm__(".symver pthread_key_delete,pthread_key_delete@GLIBC_2.2.5"); -#endif -#endif -__asm__(".symver pthread_kill,pthread_kill@GLIBC_2.2.5"); -__asm__(".symver pthread_mutex_consistent,pthread_mutex_consistent@GLIBC_2.12"); -__asm__(".symver pthread_mutex_consistent_np,pthread_mutex_consistent_np@GLIBC_2.4"); -#ifdef _REENTRANT -__asm__(".symver pthread_mutex_destroy,pthread_mutex_destroy@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_mutex_getprioceiling,pthread_mutex_getprioceiling@GLIBC_2.4"); -#ifdef _REENTRANT -__asm__(".symver pthread_mutex_init,pthread_mutex_init@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_mutex_lock,pthread_mutex_lock@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_mutex_setprioceiling,pthread_mutex_setprioceiling@GLIBC_2.4"); -__asm__(".symver pthread_mutex_timedlock,pthread_mutex_timedlock@GLIBC_2.2.5"); -__asm__(".symver pthread_mutex_trylock,pthread_mutex_trylock@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_mutex_unlock,pthread_mutex_unlock@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_mutexattr_destroy,pthread_mutexattr_destroy@GLIBC_2.2.5"); -__asm__(".symver pthread_mutexattr_getkind_np,pthread_mutexattr_getkind_np@GLIBC_2.2.5"); -__asm__(".symver pthread_mutexattr_getprioceiling,pthread_mutexattr_getprioceiling@GLIBC_2.4"); -__asm__(".symver pthread_mutexattr_getprotocol,pthread_mutexattr_getprotocol@GLIBC_2.4"); -__asm__(".symver pthread_mutexattr_getpshared,pthread_mutexattr_getpshared@GLIBC_2.2.5"); -__asm__(".symver pthread_mutexattr_getrobust,pthread_mutexattr_getrobust@GLIBC_2.12"); -__asm__(".symver pthread_mutexattr_getrobust_np,pthread_mutexattr_getrobust_np@GLIBC_2.4"); -__asm__(".symver pthread_mutexattr_gettype,pthread_mutexattr_gettype@GLIBC_2.2.5"); -__asm__(".symver pthread_mutexattr_init,pthread_mutexattr_init@GLIBC_2.2.5"); -__asm__(".symver pthread_mutexattr_setkind_np,pthread_mutexattr_setkind_np@GLIBC_2.2.5"); -__asm__(".symver pthread_mutexattr_setprioceiling,pthread_mutexattr_setprioceiling@GLIBC_2.4"); -__asm__(".symver pthread_mutexattr_setprotocol,pthread_mutexattr_setprotocol@GLIBC_2.4"); -__asm__(".symver pthread_mutexattr_setpshared,pthread_mutexattr_setpshared@GLIBC_2.2.5"); -__asm__(".symver pthread_mutexattr_setrobust,pthread_mutexattr_setrobust@GLIBC_2.12"); -__asm__(".symver pthread_mutexattr_setrobust_np,pthread_mutexattr_setrobust_np@GLIBC_2.4"); -__asm__(".symver pthread_mutexattr_settype,pthread_mutexattr_settype@GLIBC_2.2.5"); -#ifndef _GLIBCXX_SHARED -#ifndef IN_LIBGCC2 -#ifdef _REENTRANT -__asm__(".symver pthread_once,pthread_once@GLIBC_2.2.5"); -#endif -#endif -#endif -__asm__(".symver pthread_rwlock_destroy,pthread_rwlock_destroy@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_init,pthread_rwlock_init@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_rdlock,pthread_rwlock_rdlock@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_timedrdlock,pthread_rwlock_timedrdlock@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_timedwrlock,pthread_rwlock_timedwrlock@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_tryrdlock,pthread_rwlock_tryrdlock@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_trywrlock,pthread_rwlock_trywrlock@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_unlock,pthread_rwlock_unlock@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlock_wrlock,pthread_rwlock_wrlock@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlockattr_destroy,pthread_rwlockattr_destroy@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlockattr_getkind_np,pthread_rwlockattr_getkind_np@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlockattr_getpshared,pthread_rwlockattr_getpshared@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlockattr_init,pthread_rwlockattr_init@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlockattr_setkind_np,pthread_rwlockattr_setkind_np@GLIBC_2.2.5"); -__asm__(".symver pthread_rwlockattr_setpshared,pthread_rwlockattr_setpshared@GLIBC_2.2.5"); -#ifdef _REENTRANT -__asm__(".symver pthread_self,pthread_self@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_setaffinity_np,pthread_setaffinity_np@GLIBC_2.3.4"); -__asm__(".symver pthread_setattr_default_np,pthread_setattr_default_np@GLIBC_2.18"); -#ifdef _REENTRANT -__asm__(".symver pthread_setcancelstate,pthread_setcancelstate@GLIBC_2.2.5"); -#endif -#ifdef _REENTRANT -__asm__(".symver pthread_setcanceltype,pthread_setcanceltype@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_setconcurrency,pthread_setconcurrency@GLIBC_2.2.5"); -__asm__(".symver pthread_setname_np,pthread_setname_np@GLIBC_2.12"); -#ifdef _REENTRANT -__asm__(".symver pthread_setschedparam,pthread_setschedparam@GLIBC_2.2.5"); -#endif -__asm__(".symver pthread_setschedprio,pthread_setschedprio@GLIBC_2.3.4"); -#ifndef _GLIBCXX_SHARED -#ifndef IN_LIBGCC2 -#ifdef _REENTRANT -__asm__(".symver pthread_setspecific,pthread_setspecific@GLIBC_2.2.5"); -#endif -#endif -#endif -__asm__(".symver pthread_sigmask,pthread_sigmask@GLIBC_2.2.5"); -__asm__(".symver pthread_sigqueue,pthread_sigqueue@GLIBC_2.11"); -__asm__(".symver pthread_spin_destroy,pthread_spin_destroy@GLIBC_2.2.5"); -__asm__(".symver pthread_spin_init,pthread_spin_init@GLIBC_2.2.5"); -__asm__(".symver pthread_spin_lock,pthread_spin_lock@GLIBC_2.2.5"); -__asm__(".symver pthread_spin_trylock,pthread_spin_trylock@GLIBC_2.2.5"); -__asm__(".symver pthread_spin_unlock,pthread_spin_unlock@GLIBC_2.2.5"); -__asm__(".symver pthread_testcancel,pthread_testcancel@GLIBC_2.2.5"); -__asm__(".symver pthread_timedjoin_np,pthread_timedjoin_np@GLIBC_2.3.3"); -__asm__(".symver pthread_tryjoin_np,pthread_tryjoin_np@GLIBC_2.3.3"); -__asm__(".symver pthread_yield,pthread_yield@GLIBC_2.2.5"); -__asm__(".symver ptrace,ptrace@GLIBC_2.2.5"); -__asm__(".symver ptsname,ptsname@GLIBC_2.2.5"); -__asm__(".symver ptsname_r,ptsname_r@GLIBC_2.2.5"); -__asm__(".symver putc,putc@GLIBC_2.2.5"); -__asm__(".symver putc_unlocked,putc_unlocked@GLIBC_2.2.5"); -__asm__(".symver putchar,putchar@GLIBC_2.2.5"); -__asm__(".symver putchar_unlocked,putchar_unlocked@GLIBC_2.2.5"); -__asm__(".symver putenv,putenv@GLIBC_2.2.5"); -__asm__(".symver putgrent,putgrent@GLIBC_2.2.5"); -__asm__(".symver putmsg,putmsg@GLIBC_2.2.5"); -__asm__(".symver putpmsg,putpmsg@GLIBC_2.2.5"); -__asm__(".symver putpwent,putpwent@GLIBC_2.2.5"); -__asm__(".symver puts,puts@GLIBC_2.2.5"); -__asm__(".symver putsgent,putsgent@GLIBC_2.10"); -__asm__(".symver putspent,putspent@GLIBC_2.2.5"); -__asm__(".symver pututline,pututline@GLIBC_2.2.5"); -__asm__(".symver pututxline,pututxline@GLIBC_2.2.5"); -__asm__(".symver putw,putw@GLIBC_2.2.5"); -__asm__(".symver putwc,putwc@GLIBC_2.2.5"); -__asm__(".symver putwc_unlocked,putwc_unlocked@GLIBC_2.2.5"); -__asm__(".symver putwchar,putwchar@GLIBC_2.2.5"); -__asm__(".symver putwchar_unlocked,putwchar_unlocked@GLIBC_2.2.5"); -__asm__(".symver pvalloc,pvalloc@GLIBC_2.2.5"); -__asm__(".symver pwrite,pwrite@GLIBC_2.2.5"); -__asm__(".symver pwrite64,pwrite64@GLIBC_2.2.5"); -__asm__(".symver pwritev,pwritev@GLIBC_2.10"); -__asm__(".symver pwritev64,pwritev64@GLIBC_2.10"); -__asm__(".symver qecvt,qecvt@GLIBC_2.2.5"); -__asm__(".symver qecvt_r,qecvt_r@GLIBC_2.2.5"); -__asm__(".symver qfcvt,qfcvt@GLIBC_2.2.5"); -__asm__(".symver qfcvt_r,qfcvt_r@GLIBC_2.2.5"); -__asm__(".symver qgcvt,qgcvt@GLIBC_2.2.5"); -__asm__(".symver qsort,qsort@GLIBC_2.2.5"); -__asm__(".symver qsort_r,qsort_r@GLIBC_2.8"); -__asm__(".symver quick_exit,quick_exit@GLIBC_2.10"); -__asm__(".symver quotactl,quotactl@GLIBC_2.2.5"); -__asm__(".symver raise,raise@GLIBC_2.2.5"); -__asm__(".symver rand,rand@GLIBC_2.2.5"); -__asm__(".symver rand_r,rand_r@GLIBC_2.2.5"); -__asm__(".symver random,random@GLIBC_2.2.5"); -__asm__(".symver random_r,random_r@GLIBC_2.2.5"); -__asm__(".symver rawmemchr,rawmemchr@GLIBC_2.2.5"); -__asm__(".symver rcmd,rcmd@GLIBC_2.2.5"); -__asm__(".symver rcmd_af,rcmd_af@GLIBC_2.2.5"); -__asm__(".symver re_comp,re_comp@GLIBC_2.2.5"); -__asm__(".symver re_compile_fastmap,re_compile_fastmap@GLIBC_2.2.5"); -__asm__(".symver re_compile_pattern,re_compile_pattern@GLIBC_2.2.5"); -__asm__(".symver re_exec,re_exec@GLIBC_2.2.5"); -__asm__(".symver re_match,re_match@GLIBC_2.2.5"); -__asm__(".symver re_match_2,re_match_2@GLIBC_2.2.5"); -__asm__(".symver re_max_failures,re_max_failures@GLIBC_2.2.5"); -__asm__(".symver re_search,re_search@GLIBC_2.2.5"); -__asm__(".symver re_search_2,re_search_2@GLIBC_2.2.5"); -__asm__(".symver re_set_registers,re_set_registers@GLIBC_2.2.5"); -__asm__(".symver re_set_syntax,re_set_syntax@GLIBC_2.2.5"); -__asm__(".symver re_syntax_options,re_syntax_options@GLIBC_2.2.5"); -__asm__(".symver read,read@GLIBC_2.2.5"); -__asm__(".symver readColdStartFile,readColdStartFile@GLIBC_2.2.5"); -__asm__(".symver readahead,readahead@GLIBC_2.3"); -__asm__(".symver readdir,readdir@GLIBC_2.2.5"); -__asm__(".symver readdir64,readdir64@GLIBC_2.2.5"); -__asm__(".symver readdir64_r,readdir64_r@GLIBC_2.2.5"); -__asm__(".symver readdir_r,readdir_r@GLIBC_2.2.5"); -__asm__(".symver readlink,readlink@GLIBC_2.2.5"); -__asm__(".symver readlinkat,readlinkat@GLIBC_2.4"); -__asm__(".symver readv,readv@GLIBC_2.2.5"); -__asm__(".symver realloc,realloc@GLIBC_2.2.5"); -__asm__(".symver realpath,realpath@GLIBC_2.3"); -__asm__(".symver reboot,reboot@GLIBC_2.2.5"); -__asm__(".symver recv,recv@GLIBC_2.2.5"); -__asm__(".symver recvfrom,recvfrom@GLIBC_2.2.5"); -__asm__(".symver recvmmsg,recvmmsg@GLIBC_2.12"); -__asm__(".symver recvmsg,recvmsg@GLIBC_2.2.5"); -__asm__(".symver regcomp,regcomp@GLIBC_2.2.5"); -__asm__(".symver regerror,regerror@GLIBC_2.2.5"); -__asm__(".symver regexec,regexec@GLIBC_2.3.4"); -__asm__(".symver regfree,regfree@GLIBC_2.2.5"); -__asm__(".symver register_printf_function,register_printf_function@GLIBC_2.2.5"); -__asm__(".symver register_printf_modifier,register_printf_modifier@GLIBC_2.10"); -__asm__(".symver register_printf_specifier,register_printf_specifier@GLIBC_2.10"); -__asm__(".symver register_printf_type,register_printf_type@GLIBC_2.10"); -__asm__(".symver remainder,remainder@GLIBC_2.2.5"); -__asm__(".symver remainderf,remainderf@GLIBC_2.2.5"); -__asm__(".symver remainderl,remainderl@GLIBC_2.2.5"); -__asm__(".symver remap_file_pages,remap_file_pages@GLIBC_2.3.3"); -__asm__(".symver remove,remove@GLIBC_2.2.5"); -__asm__(".symver removexattr,removexattr@GLIBC_2.3"); -__asm__(".symver remque,remque@GLIBC_2.2.5"); -__asm__(".symver remquo,remquo@GLIBC_2.2.5"); -__asm__(".symver remquof,remquof@GLIBC_2.2.5"); -__asm__(".symver remquol,remquol@GLIBC_2.2.5"); -__asm__(".symver rename,rename@GLIBC_2.2.5"); -__asm__(".symver renameat,renameat@GLIBC_2.4"); -__asm__(".symver res_gethostbyaddr,res_gethostbyaddr@GLIBC_2.2.5"); -__asm__(".symver res_gethostbyname,res_gethostbyname@GLIBC_2.2.5"); -__asm__(".symver res_gethostbyname2,res_gethostbyname2@GLIBC_2.2.5"); -__asm__(".symver res_send_setqhook,res_send_setqhook@GLIBC_2.2.5"); -__asm__(".symver res_send_setrhook,res_send_setrhook@GLIBC_2.2.5"); -__asm__(".symver revoke,revoke@GLIBC_2.2.5"); -__asm__(".symver rewind,rewind@GLIBC_2.2.5"); -__asm__(".symver rewinddir,rewinddir@GLIBC_2.2.5"); -__asm__(".symver rexec,rexec@GLIBC_2.2.5"); -__asm__(".symver rexec_af,rexec_af@GLIBC_2.2.5"); -__asm__(".symver rexecoptions,rexecoptions@GLIBC_2.2.5"); -__asm__(".symver rindex,rindex@GLIBC_2.2.5"); -__asm__(".symver rint,rint@GLIBC_2.2.5"); -__asm__(".symver rintf,rintf@GLIBC_2.2.5"); -__asm__(".symver rintl,rintl@GLIBC_2.2.5"); -__asm__(".symver rmdir,rmdir@GLIBC_2.2.5"); -__asm__(".symver round,round@GLIBC_2.2.5"); -__asm__(".symver roundf,roundf@GLIBC_2.2.5"); -__asm__(".symver roundl,roundl@GLIBC_2.2.5"); -__asm__(".symver rpc_createerr,rpc_createerr@GLIBC_2.2.5"); -__asm__(".symver rpmatch,rpmatch@GLIBC_2.2.5"); -__asm__(".symver rresvport,rresvport@GLIBC_2.2.5"); -__asm__(".symver rresvport_af,rresvport_af@GLIBC_2.2.5"); -__asm__(".symver ruserok,ruserok@GLIBC_2.2.5"); -__asm__(".symver ruserok_af,ruserok_af@GLIBC_2.2.5"); -__asm__(".symver ruserpass,ruserpass@GLIBC_2.2.5"); -__asm__(".symver sbrk,sbrk@GLIBC_2.2.5"); -__asm__(".symver scalb,scalb@GLIBC_2.2.5"); -__asm__(".symver scalbf,scalbf@GLIBC_2.2.5"); -__asm__(".symver scalbl,scalbl@GLIBC_2.2.5"); -__asm__(".symver scalbln,scalbln@GLIBC_2.2.5"); -__asm__(".symver scalblnf,scalblnf@GLIBC_2.2.5"); -__asm__(".symver scalblnl,scalblnl@GLIBC_2.2.5"); -__asm__(".symver scalbn,scalbn@GLIBC_2.2.5"); -__asm__(".symver scalbnf,scalbnf@GLIBC_2.2.5"); -__asm__(".symver scalbnl,scalbnl@GLIBC_2.2.5"); -__asm__(".symver scandir,scandir@GLIBC_2.2.5"); -__asm__(".symver scandir64,scandir64@GLIBC_2.2.5"); -__asm__(".symver scandirat,scandirat@GLIBC_2.15"); -__asm__(".symver scandirat64,scandirat64@GLIBC_2.15"); -__asm__(".symver scanf,scanf@GLIBC_2.2.5"); -__asm__(".symver sched_get_priority_max,sched_get_priority_max@GLIBC_2.2.5"); -__asm__(".symver sched_get_priority_min,sched_get_priority_min@GLIBC_2.2.5"); -__asm__(".symver sched_getaffinity,sched_getaffinity@GLIBC_2.3.4"); -__asm__(".symver sched_getcpu,sched_getcpu@GLIBC_2.6"); -__asm__(".symver sched_getparam,sched_getparam@GLIBC_2.2.5"); -__asm__(".symver sched_getscheduler,sched_getscheduler@GLIBC_2.2.5"); -__asm__(".symver sched_rr_get_interval,sched_rr_get_interval@GLIBC_2.2.5"); -__asm__(".symver sched_setaffinity,sched_setaffinity@GLIBC_2.3.4"); -__asm__(".symver sched_setparam,sched_setparam@GLIBC_2.2.5"); -__asm__(".symver sched_setscheduler,sched_setscheduler@GLIBC_2.2.5"); -__asm__(".symver sched_yield,sched_yield@GLIBC_2.2.5"); -__asm__(".symver secure_getenv,secure_getenv@GLIBC_2.17"); -__asm__(".symver seed48,seed48@GLIBC_2.2.5"); -__asm__(".symver seed48_r,seed48_r@GLIBC_2.2.5"); -__asm__(".symver seekdir,seekdir@GLIBC_2.2.5"); -__asm__(".symver select,select@GLIBC_2.2.5"); -__asm__(".symver sem_close,sem_close@GLIBC_2.2.5"); -__asm__(".symver sem_destroy,sem_destroy@GLIBC_2.2.5"); -__asm__(".symver sem_getvalue,sem_getvalue@GLIBC_2.2.5"); -__asm__(".symver sem_init,sem_init@GLIBC_2.2.5"); -__asm__(".symver sem_open,sem_open@GLIBC_2.2.5"); -__asm__(".symver sem_post,sem_post@GLIBC_2.2.5"); -__asm__(".symver sem_timedwait,sem_timedwait@GLIBC_2.2.5"); -__asm__(".symver sem_trywait,sem_trywait@GLIBC_2.2.5"); -__asm__(".symver sem_unlink,sem_unlink@GLIBC_2.2.5"); -__asm__(".symver sem_wait,sem_wait@GLIBC_2.2.5"); -__asm__(".symver semctl,semctl@GLIBC_2.2.5"); -__asm__(".symver semget,semget@GLIBC_2.2.5"); -__asm__(".symver semop,semop@GLIBC_2.2.5"); -__asm__(".symver semtimedop,semtimedop@GLIBC_2.3.3"); -__asm__(".symver send,send@GLIBC_2.2.5"); -__asm__(".symver sendfile,sendfile@GLIBC_2.2.5"); -__asm__(".symver sendfile64,sendfile64@GLIBC_2.3"); -__asm__(".symver sendmmsg,sendmmsg@GLIBC_2.14"); -__asm__(".symver sendmsg,sendmsg@GLIBC_2.2.5"); -__asm__(".symver sendto,sendto@GLIBC_2.2.5"); -__asm__(".symver setaliasent,setaliasent@GLIBC_2.2.5"); -__asm__(".symver setbuf,setbuf@GLIBC_2.2.5"); -__asm__(".symver setbuffer,setbuffer@GLIBC_2.2.5"); -__asm__(".symver setcontext,setcontext@GLIBC_2.2.5"); -__asm__(".symver setdomainname,setdomainname@GLIBC_2.2.5"); -__asm__(".symver setegid,setegid@GLIBC_2.2.5"); -__asm__(".symver setenv,setenv@GLIBC_2.2.5"); -__asm__(".symver seteuid,seteuid@GLIBC_2.2.5"); -__asm__(".symver setfsent,setfsent@GLIBC_2.2.5"); -__asm__(".symver setfsgid,setfsgid@GLIBC_2.2.5"); -__asm__(".symver setfsuid,setfsuid@GLIBC_2.2.5"); -__asm__(".symver setgid,setgid@GLIBC_2.2.5"); -__asm__(".symver setgrent,setgrent@GLIBC_2.2.5"); -__asm__(".symver setgroups,setgroups@GLIBC_2.2.5"); -__asm__(".symver sethostent,sethostent@GLIBC_2.2.5"); -__asm__(".symver sethostid,sethostid@GLIBC_2.2.5"); -__asm__(".symver sethostname,sethostname@GLIBC_2.2.5"); -__asm__(".symver setipv4sourcefilter,setipv4sourcefilter@GLIBC_2.3.4"); -__asm__(".symver setitimer,setitimer@GLIBC_2.2.5"); -__asm__(".symver setjmp,setjmp@GLIBC_2.2.5"); -__asm__(".symver setkey,setkey@GLIBC_2.2.5"); -__asm__(".symver setkey_r,setkey_r@GLIBC_2.2.5"); -__asm__(".symver setlinebuf,setlinebuf@GLIBC_2.2.5"); -__asm__(".symver setlocale,setlocale@GLIBC_2.2.5"); -__asm__(".symver setlogin,setlogin@GLIBC_2.2.5"); -__asm__(".symver setlogmask,setlogmask@GLIBC_2.2.5"); -__asm__(".symver setmntent,setmntent@GLIBC_2.2.5"); -__asm__(".symver setnetent,setnetent@GLIBC_2.2.5"); -__asm__(".symver setnetgrent,setnetgrent@GLIBC_2.2.5"); -__asm__(".symver setns,setns@GLIBC_2.14"); -__asm__(".symver setpgid,setpgid@GLIBC_2.2.5"); -__asm__(".symver setpgrp,setpgrp@GLIBC_2.2.5"); -__asm__(".symver setpriority,setpriority@GLIBC_2.2.5"); -__asm__(".symver setprotoent,setprotoent@GLIBC_2.2.5"); -__asm__(".symver setpwent,setpwent@GLIBC_2.2.5"); -__asm__(".symver setregid,setregid@GLIBC_2.2.5"); -__asm__(".symver setresgid,setresgid@GLIBC_2.2.5"); -__asm__(".symver setresuid,setresuid@GLIBC_2.2.5"); -__asm__(".symver setreuid,setreuid@GLIBC_2.2.5"); -__asm__(".symver setrlimit,setrlimit@GLIBC_2.2.5"); -__asm__(".symver setrlimit64,setrlimit64@GLIBC_2.2.5"); -__asm__(".symver setrpcent,setrpcent@GLIBC_2.2.5"); -__asm__(".symver setservent,setservent@GLIBC_2.2.5"); -__asm__(".symver setsgent,setsgent@GLIBC_2.10"); -__asm__(".symver setsid,setsid@GLIBC_2.2.5"); -__asm__(".symver setsockopt,setsockopt@GLIBC_2.2.5"); -__asm__(".symver setsourcefilter,setsourcefilter@GLIBC_2.3.4"); -__asm__(".symver setspent,setspent@GLIBC_2.2.5"); -__asm__(".symver setstate,setstate@GLIBC_2.2.5"); -__asm__(".symver setstate_r,setstate_r@GLIBC_2.2.5"); -__asm__(".symver settimeofday,settimeofday@GLIBC_2.2.5"); -__asm__(".symver setttyent,setttyent@GLIBC_2.2.5"); -__asm__(".symver setuid,setuid@GLIBC_2.2.5"); -__asm__(".symver setusershell,setusershell@GLIBC_2.2.5"); -__asm__(".symver setutent,setutent@GLIBC_2.2.5"); -__asm__(".symver setutxent,setutxent@GLIBC_2.2.5"); -__asm__(".symver setvbuf,setvbuf@GLIBC_2.2.5"); -__asm__(".symver setxattr,setxattr@GLIBC_2.3"); -__asm__(".symver sgetsgent,sgetsgent@GLIBC_2.10"); -__asm__(".symver sgetsgent_r,sgetsgent_r@GLIBC_2.10"); -__asm__(".symver sgetspent,sgetspent@GLIBC_2.2.5"); -__asm__(".symver sgetspent_r,sgetspent_r@GLIBC_2.2.5"); -__asm__(".symver shm_open,shm_open@GLIBC_2.2.5"); -__asm__(".symver shm_unlink,shm_unlink@GLIBC_2.2.5"); -__asm__(".symver shmat,shmat@GLIBC_2.2.5"); -__asm__(".symver shmctl,shmctl@GLIBC_2.2.5"); -__asm__(".symver shmdt,shmdt@GLIBC_2.2.5"); -__asm__(".symver shmget,shmget@GLIBC_2.2.5"); -__asm__(".symver shutdown,shutdown@GLIBC_2.2.5"); -__asm__(".symver sigaction,sigaction@GLIBC_2.2.5"); -__asm__(".symver sigaddset,sigaddset@GLIBC_2.2.5"); -__asm__(".symver sigaltstack,sigaltstack@GLIBC_2.2.5"); -__asm__(".symver sigandset,sigandset@GLIBC_2.2.5"); -__asm__(".symver sigblock,sigblock@GLIBC_2.2.5"); -__asm__(".symver sigdelset,sigdelset@GLIBC_2.2.5"); -__asm__(".symver sigemptyset,sigemptyset@GLIBC_2.2.5"); -__asm__(".symver sigfillset,sigfillset@GLIBC_2.2.5"); -__asm__(".symver siggetmask,siggetmask@GLIBC_2.2.5"); -__asm__(".symver sighold,sighold@GLIBC_2.2.5"); -__asm__(".symver sigignore,sigignore@GLIBC_2.2.5"); -__asm__(".symver siginterrupt,siginterrupt@GLIBC_2.2.5"); -__asm__(".symver sigisemptyset,sigisemptyset@GLIBC_2.2.5"); -__asm__(".symver sigismember,sigismember@GLIBC_2.2.5"); -__asm__(".symver siglongjmp,siglongjmp@GLIBC_2.2.5"); -__asm__(".symver signal,signal@GLIBC_2.2.5"); -__asm__(".symver signalfd,signalfd@GLIBC_2.7"); -__asm__(".symver signgam,signgam@GLIBC_2.2.5"); -__asm__(".symver significand,significand@GLIBC_2.2.5"); -__asm__(".symver significandf,significandf@GLIBC_2.2.5"); -__asm__(".symver significandl,significandl@GLIBC_2.2.5"); -__asm__(".symver sigorset,sigorset@GLIBC_2.2.5"); -__asm__(".symver sigpause,sigpause@GLIBC_2.2.5"); -__asm__(".symver sigpending,sigpending@GLIBC_2.2.5"); -__asm__(".symver sigprocmask,sigprocmask@GLIBC_2.2.5"); -__asm__(".symver sigqueue,sigqueue@GLIBC_2.2.5"); -__asm__(".symver sigrelse,sigrelse@GLIBC_2.2.5"); -__asm__(".symver sigreturn,sigreturn@GLIBC_2.2.5"); -__asm__(".symver sigset,sigset@GLIBC_2.2.5"); -__asm__(".symver sigsetmask,sigsetmask@GLIBC_2.2.5"); -__asm__(".symver sigstack,sigstack@GLIBC_2.2.5"); -__asm__(".symver sigsuspend,sigsuspend@GLIBC_2.2.5"); -__asm__(".symver sigtimedwait,sigtimedwait@GLIBC_2.2.5"); -__asm__(".symver sigwait,sigwait@GLIBC_2.2.5"); -__asm__(".symver sigwaitinfo,sigwaitinfo@GLIBC_2.2.5"); -__asm__(".symver sin,sin@GLIBC_2.2.5"); -__asm__(".symver sincos,sincos@GLIBC_2.2.5"); -__asm__(".symver sincosf,sincosf@GLIBC_2.2.5"); -__asm__(".symver sincosl,sincosl@GLIBC_2.2.5"); -__asm__(".symver sinf,sinf@GLIBC_2.2.5"); -__asm__(".symver sinh,sinh@GLIBC_2.2.5"); -__asm__(".symver sinhf,sinhf@GLIBC_2.2.5"); -__asm__(".symver sinhl,sinhl@GLIBC_2.2.5"); -__asm__(".symver sinl,sinl@GLIBC_2.2.5"); -__asm__(".symver sleep,sleep@GLIBC_2.2.5"); -__asm__(".symver snprintf,snprintf@GLIBC_2.2.5"); -__asm__(".symver sockatmark,sockatmark@GLIBC_2.2.5"); -__asm__(".symver socket,socket@GLIBC_2.2.5"); -__asm__(".symver socketpair,socketpair@GLIBC_2.2.5"); -__asm__(".symver splice,splice@GLIBC_2.5"); -__asm__(".symver sprintf,sprintf@GLIBC_2.2.5"); -__asm__(".symver sprofil,sprofil@GLIBC_2.2.5"); -__asm__(".symver sqrt,sqrt@GLIBC_2.2.5"); -__asm__(".symver sqrtf,sqrtf@GLIBC_2.2.5"); -__asm__(".symver sqrtl,sqrtl@GLIBC_2.2.5"); -__asm__(".symver srand,srand@GLIBC_2.2.5"); -__asm__(".symver srand48,srand48@GLIBC_2.2.5"); -__asm__(".symver srand48_r,srand48_r@GLIBC_2.2.5"); -__asm__(".symver srandom,srandom@GLIBC_2.2.5"); -__asm__(".symver srandom_r,srandom_r@GLIBC_2.2.5"); -__asm__(".symver sscanf,sscanf@GLIBC_2.2.5"); -__asm__(".symver ssignal,ssignal@GLIBC_2.2.5"); -__asm__(".symver sstk,sstk@GLIBC_2.2.5"); -__asm__(".symver statfs,statfs@GLIBC_2.2.5"); -__asm__(".symver statfs64,statfs64@GLIBC_2.2.5"); -__asm__(".symver statvfs,statvfs@GLIBC_2.2.5"); -__asm__(".symver statvfs64,statvfs64@GLIBC_2.2.5"); -__asm__(".symver stderr,stderr@GLIBC_2.2.5"); -__asm__(".symver stdin,stdin@GLIBC_2.2.5"); -__asm__(".symver stdout,stdout@GLIBC_2.2.5"); -__asm__(".symver stime,stime@GLIBC_2.2.5"); -__asm__(".symver stpcpy,stpcpy@GLIBC_2.2.5"); -__asm__(".symver stpncpy,stpncpy@GLIBC_2.2.5"); -__asm__(".symver strcasecmp,strcasecmp@GLIBC_2.2.5"); -__asm__(".symver strcasecmp_l,strcasecmp_l@GLIBC_2.3"); -__asm__(".symver strcasestr,strcasestr@GLIBC_2.2.5"); -__asm__(".symver strcat,strcat@GLIBC_2.2.5"); -__asm__(".symver strchr,strchr@GLIBC_2.2.5"); -__asm__(".symver strchrnul,strchrnul@GLIBC_2.2.5"); -__asm__(".symver strcmp,strcmp@GLIBC_2.2.5"); -__asm__(".symver strcoll,strcoll@GLIBC_2.2.5"); -__asm__(".symver strcoll_l,strcoll_l@GLIBC_2.3"); -__asm__(".symver strcpy,strcpy@GLIBC_2.2.5"); -__asm__(".symver strcspn,strcspn@GLIBC_2.2.5"); -__asm__(".symver strdup,strdup@GLIBC_2.2.5"); -__asm__(".symver strerror,strerror@GLIBC_2.2.5"); -__asm__(".symver strerror_l,strerror_l@GLIBC_2.6"); -__asm__(".symver strerror_r,strerror_r@GLIBC_2.2.5"); -__asm__(".symver strfmon,strfmon@GLIBC_2.2.5"); -__asm__(".symver strfmon_l,strfmon_l@GLIBC_2.3"); -__asm__(".symver strfry,strfry@GLIBC_2.2.5"); -__asm__(".symver strftime,strftime@GLIBC_2.2.5"); -__asm__(".symver strftime_l,strftime_l@GLIBC_2.3"); -__asm__(".symver strlen,strlen@GLIBC_2.2.5"); -__asm__(".symver strncasecmp,strncasecmp@GLIBC_2.2.5"); -__asm__(".symver strncasecmp_l,strncasecmp_l@GLIBC_2.3"); -__asm__(".symver strncat,strncat@GLIBC_2.2.5"); -__asm__(".symver strncmp,strncmp@GLIBC_2.2.5"); -__asm__(".symver strncpy,strncpy@GLIBC_2.2.5"); -__asm__(".symver strndup,strndup@GLIBC_2.2.5"); -__asm__(".symver strnlen,strnlen@GLIBC_2.2.5"); -__asm__(".symver strpbrk,strpbrk@GLIBC_2.2.5"); -__asm__(".symver strptime,strptime@GLIBC_2.2.5"); -__asm__(".symver strptime_l,strptime_l@GLIBC_2.3.2"); -__asm__(".symver strrchr,strrchr@GLIBC_2.2.5"); -__asm__(".symver strsep,strsep@GLIBC_2.2.5"); -__asm__(".symver strsignal,strsignal@GLIBC_2.2.5"); -__asm__(".symver strspn,strspn@GLIBC_2.2.5"); -__asm__(".symver strstr,strstr@GLIBC_2.2.5"); -__asm__(".symver strtod,strtod@GLIBC_2.2.5"); -__asm__(".symver strtod_l,strtod_l@GLIBC_2.3"); -__asm__(".symver strtof,strtof@GLIBC_2.2.5"); -__asm__(".symver strtof_l,strtof_l@GLIBC_2.3"); -__asm__(".symver strtoimax,strtoimax@GLIBC_2.2.5"); -__asm__(".symver strtok,strtok@GLIBC_2.2.5"); -__asm__(".symver strtok_r,strtok_r@GLIBC_2.2.5"); -__asm__(".symver strtol,strtol@GLIBC_2.2.5"); -__asm__(".symver strtol_l,strtol_l@GLIBC_2.3"); -__asm__(".symver strtold,strtold@GLIBC_2.2.5"); -__asm__(".symver strtold_l,strtold_l@GLIBC_2.3"); -__asm__(".symver strtoll,strtoll@GLIBC_2.2.5"); -__asm__(".symver strtoll_l,strtoll_l@GLIBC_2.3.3"); -__asm__(".symver strtoq,strtoq@GLIBC_2.2.5"); -__asm__(".symver strtoul,strtoul@GLIBC_2.2.5"); -__asm__(".symver strtoul_l,strtoul_l@GLIBC_2.3"); -__asm__(".symver strtoull,strtoull@GLIBC_2.2.5"); -__asm__(".symver strtoull_l,strtoull_l@GLIBC_2.3.3"); -__asm__(".symver strtoumax,strtoumax@GLIBC_2.2.5"); -__asm__(".symver strtouq,strtouq@GLIBC_2.2.5"); -__asm__(".symver strverscmp,strverscmp@GLIBC_2.2.5"); -__asm__(".symver strxfrm,strxfrm@GLIBC_2.2.5"); -__asm__(".symver strxfrm_l,strxfrm_l@GLIBC_2.3"); -__asm__(".symver stty,stty@GLIBC_2.2.5"); -__asm__(".symver svc_fdset,svc_fdset@GLIBC_2.2.5"); -__asm__(".symver svc_getreq_poll,svc_getreq_poll@GLIBC_2.2.5"); -__asm__(".symver svc_max_pollfd,svc_max_pollfd@GLIBC_2.2.5"); -__asm__(".symver svc_pollfd,svc_pollfd@GLIBC_2.2.5"); -__asm__(".symver svc_register,svc_register@GLIBC_2.2.5"); -__asm__(".symver svc_sendreply,svc_sendreply@GLIBC_2.2.5"); -__asm__(".symver svcauthdes_stats,svcauthdes_stats@GLIBC_2.2.5"); -__asm__(".symver svcerr_decode,svcerr_decode@GLIBC_2.2.5"); -__asm__(".symver svcerr_noproc,svcerr_noproc@GLIBC_2.2.5"); -__asm__(".symver svcerr_systemerr,svcerr_systemerr@GLIBC_2.2.5"); -__asm__(".symver svctcp_create,svctcp_create@GLIBC_2.2.5"); -__asm__(".symver svcudp_bufcreate,svcudp_bufcreate@GLIBC_2.2.5"); -__asm__(".symver swab,swab@GLIBC_2.2.5"); -__asm__(".symver swapcontext,swapcontext@GLIBC_2.2.5"); -__asm__(".symver swapoff,swapoff@GLIBC_2.2.5"); -__asm__(".symver swapon,swapon@GLIBC_2.2.5"); -__asm__(".symver swprintf,swprintf@GLIBC_2.2.5"); -__asm__(".symver swscanf,swscanf@GLIBC_2.2.5"); -__asm__(".symver symlink,symlink@GLIBC_2.2.5"); -__asm__(".symver symlinkat,symlinkat@GLIBC_2.4"); -__asm__(".symver sync,sync@GLIBC_2.2.5"); -__asm__(".symver sync_file_range,sync_file_range@GLIBC_2.6"); -__asm__(".symver syncfs,syncfs@GLIBC_2.14"); -__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.12"); -__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.12"); -__asm__(".symver sys_sigabbrev,sys_sigabbrev@GLIBC_2.3.3"); -__asm__(".symver sys_siglist,sys_siglist@GLIBC_2.3.3"); -__asm__(".symver syscall,syscall@GLIBC_2.2.5"); -__asm__(".symver sysconf,sysconf@GLIBC_2.2.5"); -__asm__(".symver sysctl,sysctl@GLIBC_2.2.5"); -__asm__(".symver sysinfo,sysinfo@GLIBC_2.2.5"); -__asm__(".symver syslog,syslog@GLIBC_2.2.5"); -__asm__(".symver system,system@GLIBC_2.2.5"); -__asm__(".symver sysv_signal,sysv_signal@GLIBC_2.2.5"); -__asm__(".symver tan,tan@GLIBC_2.2.5"); -__asm__(".symver tanf,tanf@GLIBC_2.2.5"); -__asm__(".symver tanh,tanh@GLIBC_2.2.5"); -__asm__(".symver tanhf,tanhf@GLIBC_2.2.5"); -__asm__(".symver tanhl,tanhl@GLIBC_2.2.5"); -__asm__(".symver tanl,tanl@GLIBC_2.2.5"); -__asm__(".symver tcdrain,tcdrain@GLIBC_2.2.5"); -__asm__(".symver tcflow,tcflow@GLIBC_2.2.5"); -__asm__(".symver tcflush,tcflush@GLIBC_2.2.5"); -__asm__(".symver tcgetattr,tcgetattr@GLIBC_2.2.5"); -__asm__(".symver tcgetpgrp,tcgetpgrp@GLIBC_2.2.5"); -__asm__(".symver tcgetsid,tcgetsid@GLIBC_2.2.5"); -__asm__(".symver tcsendbreak,tcsendbreak@GLIBC_2.2.5"); -__asm__(".symver tcsetattr,tcsetattr@GLIBC_2.2.5"); -__asm__(".symver tcsetpgrp,tcsetpgrp@GLIBC_2.2.5"); -__asm__(".symver td_init,td_init@GLIBC_2.2.5"); -__asm__(".symver td_log,td_log@GLIBC_2.2.5"); -__asm__(".symver td_symbol_list,td_symbol_list@GLIBC_2.2.5"); -__asm__(".symver td_ta_clear_event,td_ta_clear_event@GLIBC_2.2.5"); -__asm__(".symver td_ta_delete,td_ta_delete@GLIBC_2.2.5"); -__asm__(".symver td_ta_enable_stats,td_ta_enable_stats@GLIBC_2.2.5"); -__asm__(".symver td_ta_event_addr,td_ta_event_addr@GLIBC_2.2.5"); -__asm__(".symver td_ta_event_getmsg,td_ta_event_getmsg@GLIBC_2.2.5"); -__asm__(".symver td_ta_get_nthreads,td_ta_get_nthreads@GLIBC_2.2.5"); -__asm__(".symver td_ta_get_ph,td_ta_get_ph@GLIBC_2.2.5"); -__asm__(".symver td_ta_get_stats,td_ta_get_stats@GLIBC_2.2.5"); -__asm__(".symver td_ta_map_id2thr,td_ta_map_id2thr@GLIBC_2.2.5"); -__asm__(".symver td_ta_map_lwp2thr,td_ta_map_lwp2thr@GLIBC_2.2.5"); -__asm__(".symver td_ta_new,td_ta_new@GLIBC_2.2.5"); -__asm__(".symver td_ta_reset_stats,td_ta_reset_stats@GLIBC_2.2.5"); -__asm__(".symver td_ta_set_event,td_ta_set_event@GLIBC_2.2.5"); -__asm__(".symver td_ta_setconcurrency,td_ta_setconcurrency@GLIBC_2.2.5"); -__asm__(".symver td_ta_thr_iter,td_ta_thr_iter@GLIBC_2.2.5"); -__asm__(".symver td_ta_tsd_iter,td_ta_tsd_iter@GLIBC_2.2.5"); -__asm__(".symver td_thr_clear_event,td_thr_clear_event@GLIBC_2.2.5"); -__asm__(".symver td_thr_dbresume,td_thr_dbresume@GLIBC_2.2.5"); -__asm__(".symver td_thr_dbsuspend,td_thr_dbsuspend@GLIBC_2.2.5"); -__asm__(".symver td_thr_event_enable,td_thr_event_enable@GLIBC_2.2.5"); -__asm__(".symver td_thr_event_getmsg,td_thr_event_getmsg@GLIBC_2.2.5"); -__asm__(".symver td_thr_get_info,td_thr_get_info@GLIBC_2.2.5"); -__asm__(".symver td_thr_getfpregs,td_thr_getfpregs@GLIBC_2.2.5"); -__asm__(".symver td_thr_getgregs,td_thr_getgregs@GLIBC_2.2.5"); -__asm__(".symver td_thr_getxregs,td_thr_getxregs@GLIBC_2.2.5"); -__asm__(".symver td_thr_getxregsize,td_thr_getxregsize@GLIBC_2.2.5"); -__asm__(".symver td_thr_set_event,td_thr_set_event@GLIBC_2.2.5"); -__asm__(".symver td_thr_setfpregs,td_thr_setfpregs@GLIBC_2.2.5"); -__asm__(".symver td_thr_setgregs,td_thr_setgregs@GLIBC_2.2.5"); -__asm__(".symver td_thr_setprio,td_thr_setprio@GLIBC_2.2.5"); -__asm__(".symver td_thr_setsigpending,td_thr_setsigpending@GLIBC_2.2.5"); -__asm__(".symver td_thr_setxregs,td_thr_setxregs@GLIBC_2.2.5"); -__asm__(".symver td_thr_sigsetmask,td_thr_sigsetmask@GLIBC_2.2.5"); -__asm__(".symver td_thr_tls_get_addr,td_thr_tls_get_addr@GLIBC_2.3"); -__asm__(".symver td_thr_tlsbase,td_thr_tlsbase@GLIBC_2.3.3"); -__asm__(".symver td_thr_tsd,td_thr_tsd@GLIBC_2.2.5"); -__asm__(".symver td_thr_validate,td_thr_validate@GLIBC_2.2.5"); -__asm__(".symver tdelete,tdelete@GLIBC_2.2.5"); -__asm__(".symver tdestroy,tdestroy@GLIBC_2.2.5"); -__asm__(".symver tee,tee@GLIBC_2.5"); -__asm__(".symver telldir,telldir@GLIBC_2.2.5"); -__asm__(".symver tempnam,tempnam@GLIBC_2.2.5"); -__asm__(".symver textdomain,textdomain@GLIBC_2.2.5"); -__asm__(".symver tfind,tfind@GLIBC_2.2.5"); -__asm__(".symver tgamma,tgamma@GLIBC_2.2.5"); -__asm__(".symver tgammaf,tgammaf@GLIBC_2.2.5"); -__asm__(".symver tgammal,tgammal@GLIBC_2.2.5"); -__asm__(".symver time,time@GLIBC_2.2.5"); -__asm__(".symver timegm,timegm@GLIBC_2.2.5"); -__asm__(".symver timelocal,timelocal@GLIBC_2.2.5"); -__asm__(".symver timer_create,timer_create@GLIBC_2.3.3"); -__asm__(".symver timer_delete,timer_delete@GLIBC_2.3.3"); -__asm__(".symver timer_getoverrun,timer_getoverrun@GLIBC_2.3.3"); -__asm__(".symver timer_gettime,timer_gettime@GLIBC_2.3.3"); -__asm__(".symver timer_settime,timer_settime@GLIBC_2.3.3"); -__asm__(".symver timerfd_create,timerfd_create@GLIBC_2.8"); -__asm__(".symver timerfd_gettime,timerfd_gettime@GLIBC_2.8"); -__asm__(".symver timerfd_settime,timerfd_settime@GLIBC_2.8"); -__asm__(".symver times,times@GLIBC_2.2.5"); -__asm__(".symver timespec_get,timespec_get@GLIBC_2.16"); -__asm__(".symver timezone,timezone@GLIBC_2.2.5"); -__asm__(".symver tmpfile,tmpfile@GLIBC_2.2.5"); -__asm__(".symver tmpfile64,tmpfile64@GLIBC_2.2.5"); -__asm__(".symver tmpnam,tmpnam@GLIBC_2.2.5"); -__asm__(".symver tmpnam_r,tmpnam_r@GLIBC_2.2.5"); -__asm__(".symver toascii,toascii@GLIBC_2.2.5"); -__asm__(".symver tolower,tolower@GLIBC_2.2.5"); -__asm__(".symver tolower_l,tolower_l@GLIBC_2.3"); -__asm__(".symver toupper,toupper@GLIBC_2.2.5"); -__asm__(".symver toupper_l,toupper_l@GLIBC_2.3"); -__asm__(".symver towctrans,towctrans@GLIBC_2.2.5"); -__asm__(".symver towctrans_l,towctrans_l@GLIBC_2.3"); -__asm__(".symver towlower,towlower@GLIBC_2.2.5"); -__asm__(".symver towlower_l,towlower_l@GLIBC_2.3"); -__asm__(".symver towupper,towupper@GLIBC_2.2.5"); -__asm__(".symver towupper_l,towupper_l@GLIBC_2.3"); -__asm__(".symver tr_break,tr_break@GLIBC_2.2.5"); -__asm__(".symver trunc,trunc@GLIBC_2.2.5"); -__asm__(".symver truncate,truncate@GLIBC_2.2.5"); -__asm__(".symver truncate64,truncate64@GLIBC_2.2.5"); -__asm__(".symver truncf,truncf@GLIBC_2.2.5"); -__asm__(".symver truncl,truncl@GLIBC_2.2.5"); -__asm__(".symver tsearch,tsearch@GLIBC_2.2.5"); -__asm__(".symver ttyname,ttyname@GLIBC_2.2.5"); -__asm__(".symver ttyname_r,ttyname_r@GLIBC_2.2.5"); -__asm__(".symver ttyslot,ttyslot@GLIBC_2.2.5"); -__asm__(".symver twalk,twalk@GLIBC_2.2.5"); -__asm__(".symver tzname,tzname@GLIBC_2.2.5"); -__asm__(".symver tzset,tzset@GLIBC_2.2.5"); -__asm__(".symver ualarm,ualarm@GLIBC_2.2.5"); -__asm__(".symver ulckpwdf,ulckpwdf@GLIBC_2.2.5"); -__asm__(".symver ulimit,ulimit@GLIBC_2.2.5"); -__asm__(".symver umask,umask@GLIBC_2.2.5"); -__asm__(".symver umount,umount@GLIBC_2.2.5"); -__asm__(".symver umount2,umount2@GLIBC_2.2.5"); -__asm__(".symver uname,uname@GLIBC_2.2.5"); -__asm__(".symver ungetc,ungetc@GLIBC_2.2.5"); -__asm__(".symver ungetwc,ungetwc@GLIBC_2.2.5"); -__asm__(".symver unlink,unlink@GLIBC_2.2.5"); -__asm__(".symver unlinkat,unlinkat@GLIBC_2.4"); -__asm__(".symver unlockpt,unlockpt@GLIBC_2.2.5"); -__asm__(".symver unsetenv,unsetenv@GLIBC_2.2.5"); -__asm__(".symver unshare,unshare@GLIBC_2.4"); -__asm__(".symver updwtmp,updwtmp@GLIBC_2.2.5"); -__asm__(".symver updwtmpx,updwtmpx@GLIBC_2.2.5"); -__asm__(".symver uselocale,uselocale@GLIBC_2.3"); -__asm__(".symver usleep,usleep@GLIBC_2.2.5"); -__asm__(".symver ustat,ustat@GLIBC_2.2.5"); -__asm__(".symver utime,utime@GLIBC_2.2.5"); -__asm__(".symver utimensat,utimensat@GLIBC_2.6"); -__asm__(".symver utimes,utimes@GLIBC_2.2.5"); -__asm__(".symver utmpname,utmpname@GLIBC_2.2.5"); -__asm__(".symver utmpxname,utmpxname@GLIBC_2.2.5"); -__asm__(".symver valloc,valloc@GLIBC_2.2.5"); -__asm__(".symver vasprintf,vasprintf@GLIBC_2.2.5"); -__asm__(".symver vdprintf,vdprintf@GLIBC_2.2.5"); -__asm__(".symver verr,verr@GLIBC_2.2.5"); -__asm__(".symver verrx,verrx@GLIBC_2.2.5"); -__asm__(".symver versionsort,versionsort@GLIBC_2.2.5"); -__asm__(".symver versionsort64,versionsort64@GLIBC_2.2.5"); -__asm__(".symver vfork,vfork@GLIBC_2.2.5"); -__asm__(".symver vfprintf,vfprintf@GLIBC_2.2.5"); -__asm__(".symver vfscanf,vfscanf@GLIBC_2.2.5"); -__asm__(".symver vfwprintf,vfwprintf@GLIBC_2.2.5"); -__asm__(".symver vfwscanf,vfwscanf@GLIBC_2.2.5"); -__asm__(".symver vhangup,vhangup@GLIBC_2.2.5"); -__asm__(".symver vlimit,vlimit@GLIBC_2.2.5"); -__asm__(".symver vmsplice,vmsplice@GLIBC_2.5"); -__asm__(".symver vprintf,vprintf@GLIBC_2.2.5"); -__asm__(".symver vscanf,vscanf@GLIBC_2.2.5"); -__asm__(".symver vsnprintf,vsnprintf@GLIBC_2.2.5"); -__asm__(".symver vsprintf,vsprintf@GLIBC_2.2.5"); -__asm__(".symver vsscanf,vsscanf@GLIBC_2.2.5"); -__asm__(".symver vswprintf,vswprintf@GLIBC_2.2.5"); -__asm__(".symver vswscanf,vswscanf@GLIBC_2.2.5"); -__asm__(".symver vsyslog,vsyslog@GLIBC_2.2.5"); -__asm__(".symver vtimes,vtimes@GLIBC_2.2.5"); -__asm__(".symver vwarn,vwarn@GLIBC_2.2.5"); -__asm__(".symver vwarnx,vwarnx@GLIBC_2.2.5"); -__asm__(".symver vwprintf,vwprintf@GLIBC_2.2.5"); -__asm__(".symver vwscanf,vwscanf@GLIBC_2.2.5"); -__asm__(".symver wait,wait@GLIBC_2.2.5"); -__asm__(".symver wait3,wait3@GLIBC_2.2.5"); -__asm__(".symver wait4,wait4@GLIBC_2.2.5"); -__asm__(".symver waitid,waitid@GLIBC_2.2.5"); -__asm__(".symver waitpid,waitpid@GLIBC_2.2.5"); -__asm__(".symver warn,warn@GLIBC_2.2.5"); -__asm__(".symver warnx,warnx@GLIBC_2.2.5"); -__asm__(".symver wcpcpy,wcpcpy@GLIBC_2.2.5"); -__asm__(".symver wcpncpy,wcpncpy@GLIBC_2.2.5"); -__asm__(".symver wcrtomb,wcrtomb@GLIBC_2.2.5"); -__asm__(".symver wcscasecmp,wcscasecmp@GLIBC_2.2.5"); -__asm__(".symver wcscasecmp_l,wcscasecmp_l@GLIBC_2.3"); -__asm__(".symver wcscat,wcscat@GLIBC_2.2.5"); -__asm__(".symver wcschr,wcschr@GLIBC_2.2.5"); -__asm__(".symver wcschrnul,wcschrnul@GLIBC_2.2.5"); -__asm__(".symver wcscmp,wcscmp@GLIBC_2.2.5"); -__asm__(".symver wcscoll,wcscoll@GLIBC_2.2.5"); -__asm__(".symver wcscoll_l,wcscoll_l@GLIBC_2.3"); -__asm__(".symver wcscpy,wcscpy@GLIBC_2.2.5"); -__asm__(".symver wcscspn,wcscspn@GLIBC_2.2.5"); -__asm__(".symver wcsdup,wcsdup@GLIBC_2.2.5"); -__asm__(".symver wcsftime,wcsftime@GLIBC_2.2.5"); -__asm__(".symver wcsftime_l,wcsftime_l@GLIBC_2.3"); -__asm__(".symver wcslen,wcslen@GLIBC_2.2.5"); -__asm__(".symver wcsncasecmp,wcsncasecmp@GLIBC_2.2.5"); -__asm__(".symver wcsncasecmp_l,wcsncasecmp_l@GLIBC_2.3"); -__asm__(".symver wcsncat,wcsncat@GLIBC_2.2.5"); -__asm__(".symver wcsncmp,wcsncmp@GLIBC_2.2.5"); -__asm__(".symver wcsncpy,wcsncpy@GLIBC_2.2.5"); -__asm__(".symver wcsnlen,wcsnlen@GLIBC_2.2.5"); -__asm__(".symver wcsnrtombs,wcsnrtombs@GLIBC_2.2.5"); -__asm__(".symver wcspbrk,wcspbrk@GLIBC_2.2.5"); -__asm__(".symver wcsrchr,wcsrchr@GLIBC_2.2.5"); -__asm__(".symver wcsrtombs,wcsrtombs@GLIBC_2.2.5"); -__asm__(".symver wcsspn,wcsspn@GLIBC_2.2.5"); -__asm__(".symver wcsstr,wcsstr@GLIBC_2.2.5"); -__asm__(".symver wcstod,wcstod@GLIBC_2.2.5"); -__asm__(".symver wcstod_l,wcstod_l@GLIBC_2.3"); -__asm__(".symver wcstof,wcstof@GLIBC_2.2.5"); -__asm__(".symver wcstof_l,wcstof_l@GLIBC_2.3"); -__asm__(".symver wcstoimax,wcstoimax@GLIBC_2.2.5"); -__asm__(".symver wcstok,wcstok@GLIBC_2.2.5"); -__asm__(".symver wcstol,wcstol@GLIBC_2.2.5"); -__asm__(".symver wcstol_l,wcstol_l@GLIBC_2.3"); -__asm__(".symver wcstold,wcstold@GLIBC_2.2.5"); -__asm__(".symver wcstold_l,wcstold_l@GLIBC_2.3"); -__asm__(".symver wcstoll,wcstoll@GLIBC_2.2.5"); -__asm__(".symver wcstoll_l,wcstoll_l@GLIBC_2.3"); -__asm__(".symver wcstombs,wcstombs@GLIBC_2.2.5"); -__asm__(".symver wcstoq,wcstoq@GLIBC_2.2.5"); -__asm__(".symver wcstoul,wcstoul@GLIBC_2.2.5"); -__asm__(".symver wcstoul_l,wcstoul_l@GLIBC_2.3"); -__asm__(".symver wcstoull,wcstoull@GLIBC_2.2.5"); -__asm__(".symver wcstoull_l,wcstoull_l@GLIBC_2.3"); -__asm__(".symver wcstoumax,wcstoumax@GLIBC_2.2.5"); -__asm__(".symver wcstouq,wcstouq@GLIBC_2.2.5"); -__asm__(".symver wcswcs,wcswcs@GLIBC_2.2.5"); -__asm__(".symver wcswidth,wcswidth@GLIBC_2.2.5"); -__asm__(".symver wcsxfrm,wcsxfrm@GLIBC_2.2.5"); -__asm__(".symver wcsxfrm_l,wcsxfrm_l@GLIBC_2.3"); -__asm__(".symver wctob,wctob@GLIBC_2.2.5"); -__asm__(".symver wctomb,wctomb@GLIBC_2.2.5"); -__asm__(".symver wctrans,wctrans@GLIBC_2.2.5"); -__asm__(".symver wctrans_l,wctrans_l@GLIBC_2.3"); -__asm__(".symver wctype,wctype@GLIBC_2.2.5"); -__asm__(".symver wctype_l,wctype_l@GLIBC_2.3"); -__asm__(".symver wcwidth,wcwidth@GLIBC_2.2.5"); -__asm__(".symver wmemchr,wmemchr@GLIBC_2.2.5"); -__asm__(".symver wmemcmp,wmemcmp@GLIBC_2.2.5"); -__asm__(".symver wmemcpy,wmemcpy@GLIBC_2.2.5"); -__asm__(".symver wmemmove,wmemmove@GLIBC_2.2.5"); -__asm__(".symver wmempcpy,wmempcpy@GLIBC_2.2.5"); -__asm__(".symver wmemset,wmemset@GLIBC_2.2.5"); -__asm__(".symver wordexp,wordexp@GLIBC_2.2.5"); -__asm__(".symver wordfree,wordfree@GLIBC_2.2.5"); -__asm__(".symver wprintf,wprintf@GLIBC_2.2.5"); -__asm__(".symver write,write@GLIBC_2.2.5"); -__asm__(".symver writeColdStartFile,writeColdStartFile@GLIBC_2.2.5"); -__asm__(".symver writev,writev@GLIBC_2.2.5"); -__asm__(".symver wscanf,wscanf@GLIBC_2.2.5"); -__asm__(".symver xdecrypt,xdecrypt@GLIBC_2.2.5"); -__asm__(".symver xdr_array,xdr_array@GLIBC_2.2.5"); -__asm__(".symver xdr_bool,xdr_bool@GLIBC_2.2.5"); -__asm__(".symver xdr_bytes,xdr_bytes@GLIBC_2.2.5"); -__asm__(".symver xdr_cback_data,xdr_cback_data@GLIBC_2.2.5"); -__asm__(".symver xdr_domainname,xdr_domainname@GLIBC_2.2.5"); -__asm__(".symver xdr_enum,xdr_enum@GLIBC_2.2.5"); -__asm__(".symver xdr_free,xdr_free@GLIBC_2.2.5"); -__asm__(".symver xdr_int,xdr_int@GLIBC_2.2.5"); -__asm__(".symver xdr_keydat,xdr_keydat@GLIBC_2.2.5"); -__asm__(".symver xdr_mapname,xdr_mapname@GLIBC_2.2.5"); -__asm__(".symver xdr_netobj,xdr_netobj@GLIBC_2.2.5"); -__asm__(".symver xdr_obj_p,xdr_obj_p@GLIBC_2.2.5"); -__asm__(".symver xdr_opaque,xdr_opaque@GLIBC_2.2.5"); -__asm__(".symver xdr_peername,xdr_peername@GLIBC_2.2.5"); -__asm__(".symver xdr_pointer,xdr_pointer@GLIBC_2.2.5"); -__asm__(".symver xdr_sizeof,xdr_sizeof@GLIBC_2.2.5"); -__asm__(".symver xdr_string,xdr_string@GLIBC_2.2.5"); -__asm__(".symver xdr_u_char,xdr_u_char@GLIBC_2.2.5"); -__asm__(".symver xdr_u_int,xdr_u_int@GLIBC_2.2.5"); -__asm__(".symver xdr_uint32_t,xdr_uint32_t@GLIBC_2.2.5"); -__asm__(".symver xdr_valdat,xdr_valdat@GLIBC_2.2.5"); -__asm__(".symver xdr_void,xdr_void@GLIBC_2.2.5"); -__asm__(".symver xdr_yp_buf,xdr_yp_buf@GLIBC_2.2.5"); -__asm__(".symver xdr_ypall,xdr_ypall@GLIBC_2.2.5"); -__asm__(".symver xdr_ypbind_binding,xdr_ypbind_binding@GLIBC_2.2.5"); -__asm__(".symver xdr_ypbind_resp,xdr_ypbind_resp@GLIBC_2.2.5"); -__asm__(".symver xdr_ypbind_resptype,xdr_ypbind_resptype@GLIBC_2.2.5"); -__asm__(".symver xdr_ypbind_setdom,xdr_ypbind_setdom@GLIBC_2.2.5"); -__asm__(".symver xdr_ypdelete_args,xdr_ypdelete_args@GLIBC_2.2.5"); -__asm__(".symver xdr_ypmap_parms,xdr_ypmap_parms@GLIBC_2.2.5"); -__asm__(".symver xdr_ypmaplist,xdr_ypmaplist@GLIBC_2.2.5"); -__asm__(".symver xdr_yppush_status,xdr_yppush_status@GLIBC_2.2.5"); -__asm__(".symver xdr_yppushresp_xfr,xdr_yppushresp_xfr@GLIBC_2.2.5"); -__asm__(".symver xdr_ypreq_key,xdr_ypreq_key@GLIBC_2.2.5"); -__asm__(".symver xdr_ypreq_nokey,xdr_ypreq_nokey@GLIBC_2.2.5"); -__asm__(".symver xdr_ypreq_xfr,xdr_ypreq_xfr@GLIBC_2.2.5"); -__asm__(".symver xdr_ypresp_all,xdr_ypresp_all@GLIBC_2.2.5"); -__asm__(".symver xdr_ypresp_key_val,xdr_ypresp_key_val@GLIBC_2.2.5"); -__asm__(".symver xdr_ypresp_maplist,xdr_ypresp_maplist@GLIBC_2.2.5"); -__asm__(".symver xdr_ypresp_master,xdr_ypresp_master@GLIBC_2.2.5"); -__asm__(".symver xdr_ypresp_order,xdr_ypresp_order@GLIBC_2.2.5"); -__asm__(".symver xdr_ypresp_val,xdr_ypresp_val@GLIBC_2.2.5"); -__asm__(".symver xdr_ypresp_xfr,xdr_ypresp_xfr@GLIBC_2.2.5"); -__asm__(".symver xdr_ypstat,xdr_ypstat@GLIBC_2.2.5"); -__asm__(".symver xdr_ypupdate_args,xdr_ypupdate_args@GLIBC_2.2.5"); -__asm__(".symver xdr_ypxfrstat,xdr_ypxfrstat@GLIBC_2.2.5"); -__asm__(".symver xdrmem_create,xdrmem_create@GLIBC_2.2.5"); -__asm__(".symver xdrstdio_create,xdrstdio_create@GLIBC_2.2.5"); -__asm__(".symver xprt_unregister,xprt_unregister@GLIBC_2.2.5"); -__asm__(".symver y0,y0@GLIBC_2.2.5"); -__asm__(".symver y0f,y0f@GLIBC_2.2.5"); -__asm__(".symver y0l,y0l@GLIBC_2.2.5"); -__asm__(".symver y1,y1@GLIBC_2.2.5"); -__asm__(".symver y1f,y1f@GLIBC_2.2.5"); -__asm__(".symver y1l,y1l@GLIBC_2.2.5"); -__asm__(".symver yn,yn@GLIBC_2.2.5"); -__asm__(".symver ynf,ynf@GLIBC_2.2.5"); -__asm__(".symver ynl,ynl@GLIBC_2.2.5"); -__asm__(".symver yp_all,yp_all@GLIBC_2.2.5"); -__asm__(".symver yp_bind,yp_bind@GLIBC_2.2.5"); -__asm__(".symver yp_first,yp_first@GLIBC_2.2.5"); -__asm__(".symver yp_get_default_domain,yp_get_default_domain@GLIBC_2.2.5"); -__asm__(".symver yp_maplist,yp_maplist@GLIBC_2.2.5"); -__asm__(".symver yp_master,yp_master@GLIBC_2.2.5"); -__asm__(".symver yp_match,yp_match@GLIBC_2.2.5"); -__asm__(".symver yp_next,yp_next@GLIBC_2.2.5"); -__asm__(".symver yp_order,yp_order@GLIBC_2.2.5"); -__asm__(".symver yp_unbind,yp_unbind@GLIBC_2.2.5"); -__asm__(".symver yp_update,yp_update@GLIBC_2.2.5"); -__asm__(".symver ypbinderr_string,ypbinderr_string@GLIBC_2.2.5"); -__asm__(".symver yperr_string,yperr_string@GLIBC_2.2.5"); -__asm__(".symver ypprot_err,ypprot_err@GLIBC_2.2.5"); -__asm__(".symver __acosf128_finite,__acosf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __acoshf128_finite,__acoshf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __asinf128_finite,__asinf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __atan2f128_finite,__atan2f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __atanhf128_finite,__atanhf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __coshf128_finite,__coshf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __exp10f128_finite,__exp10f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __exp2f128_finite,__exp2f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __expf128_finite,__expf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __explicit_bzero_chk,__explicit_bzero_chk@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __finitef128,__finitef128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __fmodf128_finite,__fmodf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __fpclassifyf128,__fpclassifyf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __gammaf128_r_finite,__gammaf128_r_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __hypotf128_finite,__hypotf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __iscanonicall,__iscanonicall@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __iseqsig,__iseqsig@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __iseqsigf,__iseqsigf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __iseqsigf128,__iseqsigf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __iseqsigl,__iseqsigl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __isinff128,__isinff128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __isnanf128,__isnanf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __issignalingf128,__issignalingf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __j0f128_finite,__j0f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __j1f128_finite,__j1f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __jnf128_finite,__jnf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __lgammaf128_r_finite,__lgammaf128_r_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __log10f128_finite,__log10f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __log2f128_finite,__log2f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __logf128_finite,__logf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __powf128_finite,__powf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __remainderf128_finite,__remainderf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __rpc_thread_createerr,__rpc_thread_createerr@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __rpc_thread_svc_fdset,__rpc_thread_svc_fdset@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __secure_getenv,__secure_getenv@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __signbitf128,__signbitf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __sinhf128_finite,__sinhf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __sqrtf128_finite,__sqrtf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __strtof128_internal,__strtof128_internal@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __wcstof128_internal,__wcstof128_internal@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __y0f128_finite,__y0f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __y1f128_finite,__y1f128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver __ynf128_finite,__ynf128_finite@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver _authenticate,_authenticate@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver _null_auth,_null_auth@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver _rpc_dtablesize,_rpc_dtablesize@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver _seterr_reply,_seterr_reply@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acosf128,acosf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acosf32,acosf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acosf32x,acosf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acosf64,acosf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acosf64x,acosf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acoshf128,acoshf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acoshf32,acoshf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acoshf32x,acoshf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acoshf64,acoshf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver acoshf64x,acoshf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver advance,advance@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinf128,asinf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinf32,asinf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinf32x,asinf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinf64,asinf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinf64x,asinf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinhf128,asinhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinhf32,asinhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinhf32x,asinhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinhf64,asinhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver asinhf64x,asinhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atan2f128,atan2f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atan2f32,atan2f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atan2f32x,atan2f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atan2f64,atan2f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atan2f64x,atan2f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanf128,atanf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanf32,atanf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanf32x,atanf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanf64,atanf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanf64x,atanf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanhf128,atanhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanhf32,atanhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanhf32x,atanhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanhf64,atanhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver atanhf64x,atanhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver authdes_getucred,authdes_getucred@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver authnone_create,authnone_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver authunix_create,authunix_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver bdflush,bdflush@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cabsf128,cabsf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cabsf32,cabsf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cabsf32x,cabsf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cabsf64,cabsf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cabsf64x,cabsf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacosf128,cacosf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacosf32,cacosf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacosf32x,cacosf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacosf64,cacosf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacosf64x,cacosf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacoshf128,cacoshf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacoshf32,cacoshf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacoshf32x,cacoshf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacoshf64,cacoshf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cacoshf64x,cacoshf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver callrpc,callrpc@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalize,canonicalize@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalizef,canonicalizef@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalizef128,canonicalizef128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalizef32,canonicalizef32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalizef32x,canonicalizef32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalizef64,canonicalizef64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalizef64x,canonicalizef64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver canonicalizel,canonicalizel@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cargf128,cargf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cargf32,cargf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cargf32x,cargf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cargf64,cargf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cargf64x,cargf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinf128,casinf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinf32,casinf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinf32x,casinf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinf64,casinf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinf64x,casinf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinhf128,casinhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinhf32,casinhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinhf32x,casinhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinhf64,casinhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver casinhf64x,casinhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanf128,catanf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanf32,catanf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanf32x,catanf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanf64,catanf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanf64x,catanf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanhf128,catanhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanhf32,catanhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanhf32x,catanhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanhf64,catanhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver catanhf64x,catanhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cbc_crypt,cbc_crypt@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cbrtf128,cbrtf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cbrtf32,cbrtf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cbrtf32x,cbrtf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cbrtf64,cbrtf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cbrtf64x,cbrtf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccosf128,ccosf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccosf32,ccosf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccosf32x,ccosf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccosf64,ccosf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccosf64x,ccosf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccoshf128,ccoshf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccoshf32,ccoshf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccoshf32x,ccoshf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccoshf64,ccoshf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ccoshf64x,ccoshf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ceilf128,ceilf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ceilf32,ceilf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ceilf32x,ceilf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ceilf64,ceilf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ceilf64x,ceilf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cexpf128,cexpf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cexpf32,cexpf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cexpf32x,cexpf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cexpf64,cexpf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cexpf64x,cexpf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cimagf128,cimagf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cimagf32,cimagf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cimagf32x,cimagf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cimagf64,cimagf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cimagf64x,cimagf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clnt_broadcast,clnt_broadcast@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clnt_perrno,clnt_perrno@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clnt_spcreateerror,clnt_spcreateerror@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clnt_sperror,clnt_sperror@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clntraw_create,clntraw_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clntudp_bufcreate,clntudp_bufcreate@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clntunix_create,clntunix_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clog10f128,clog10f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clog10f32,clog10f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clog10f32x,clog10f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clog10f64,clog10f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clog10f64x,clog10f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clogf128,clogf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clogf32,clogf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clogf32x,clogf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clogf64,clogf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver clogf64x,clogf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver conjf128,conjf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver conjf32,conjf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver conjf32x,conjf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver conjf64,conjf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver conjf64x,conjf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver copy_file_range,copy_file_range@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver copysignf128,copysignf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver copysignf32,copysignf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver copysignf32x,copysignf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver copysignf64,copysignf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver copysignf64x,copysignf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cosf128,cosf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cosf32,cosf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cosf32x,cosf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cosf64,cosf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cosf64x,cosf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver coshf128,coshf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver coshf32,coshf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver coshf32x,coshf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver coshf64,coshf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver coshf64x,coshf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cpowf128,cpowf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cpowf32,cpowf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cpowf32x,cpowf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cpowf64,cpowf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cpowf64x,cpowf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cprojf128,cprojf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cprojf32,cprojf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cprojf32x,cprojf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cprojf64,cprojf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver cprojf64x,cprojf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver crealf128,crealf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver crealf32,crealf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver crealf32x,crealf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver crealf64,crealf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver crealf64x,crealf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver create_module,create_module@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinf128,csinf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinf32,csinf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinf32x,csinf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinf64,csinf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinf64x,csinf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinhf128,csinhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinhf32,csinhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinhf32x,csinhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinhf64,csinhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csinhf64x,csinhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csqrtf128,csqrtf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csqrtf32,csqrtf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csqrtf32x,csqrtf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csqrtf64,csqrtf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver csqrtf64x,csqrtf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanf128,ctanf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanf32,ctanf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanf32x,ctanf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanf64,ctanf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanf64x,ctanf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanhf128,ctanhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanhf32,ctanhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanhf32x,ctanhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanhf64,ctanhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ctanhf64x,ctanhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver des_setparity,des_setparity@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ecb_crypt,ecb_crypt@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erfcf128,erfcf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erfcf32,erfcf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erfcf32x,erfcf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erfcf64,erfcf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erfcf64x,erfcf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erff128,erff128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erff32,erff32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erff32x,erff32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erff64,erff64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver erff64x,erff64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp10f128,exp10f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp10f32,exp10f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp10f32x,exp10f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp10f64,exp10f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp10f64x,exp10f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp2f128,exp2f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp2f32,exp2f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp2f32x,exp2f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp2f64,exp2f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver exp2f64x,exp2f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expf128,expf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expf32,expf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expf32x,expf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expf64,expf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expf64x,expf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver explicit_bzero,explicit_bzero@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expm1f128,expm1f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expm1f32,expm1f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expm1f32x,expm1f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expm1f64,expm1f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver expm1f64x,expm1f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fabsf128,fabsf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fabsf32,fabsf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fabsf32x,fabsf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fabsf64,fabsf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fabsf64x,fabsf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fdimf128,fdimf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fdimf32,fdimf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fdimf32x,fdimf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fdimf64,fdimf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fdimf64x,fdimf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fegetmode,fegetmode@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fesetexcept,fesetexcept@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fesetmode,fesetmode@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fetestexceptflag,fetestexceptflag@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver floorf128,floorf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver floorf32,floorf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver floorf32x,floorf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver floorf64,floorf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver floorf64x,floorf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaf128,fmaf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaf32,fmaf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaf32x,fmaf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaf64,fmaf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaf64x,fmaf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxf128,fmaxf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxf32,fmaxf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxf32x,fmaxf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxf64,fmaxf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxf64x,fmaxf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmag,fmaxmag@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmagf,fmaxmagf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmagf128,fmaxmagf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmagf32,fmaxmagf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmagf32x,fmaxmagf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmagf64,fmaxmagf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmagf64x,fmaxmagf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmaxmagl,fmaxmagl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminf128,fminf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminf32,fminf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminf32x,fminf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminf64,fminf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminf64x,fminf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmag,fminmag@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmagf,fminmagf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmagf128,fminmagf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmagf32,fminmagf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmagf32x,fminmagf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmagf64,fminmagf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmagf64x,fminmagf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fminmagl,fminmagl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmodf128,fmodf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmodf32,fmodf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmodf32x,fmodf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmodf64,fmodf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fmodf64x,fmodf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver frexpf128,frexpf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver frexpf32,frexpf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver frexpf32x,frexpf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver frexpf64,frexpf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver frexpf64x,frexpf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfp,fromfp@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpf,fromfpf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpf128,fromfpf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpf32,fromfpf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpf32x,fromfpf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpf64,fromfpf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpf64x,fromfpf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpl,fromfpl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpx,fromfpx@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpxf,fromfpxf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpxf128,fromfpxf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpxf32,fromfpxf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpxf32x,fromfpxf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpxf64,fromfpxf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpxf64x,fromfpxf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver fromfpxl,fromfpxl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver get_kernel_syms,get_kernel_syms@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getentropy,getentropy@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getnetname,getnetname@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayload,getpayload@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayloadf,getpayloadf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayloadf128,getpayloadf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayloadf32,getpayloadf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayloadf32x,getpayloadf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayloadf64,getpayloadf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayloadf64x,getpayloadf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpayloadl,getpayloadl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getpublickey,getpublickey@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getrandom,getrandom@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver getsecretkey,getsecretkey@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver hypotf128,hypotf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver hypotf32,hypotf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver hypotf32x,hypotf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver hypotf64,hypotf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver hypotf64x,hypotf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ilogbf128,ilogbf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ilogbf32,ilogbf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ilogbf32x,ilogbf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ilogbf64,ilogbf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ilogbf64x,ilogbf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j0f128,j0f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j0f32,j0f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j0f32x,j0f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j0f64,j0f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j0f64x,j0f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j1f128,j1f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j1f32,j1f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j1f32x,j1f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j1f64,j1f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver j1f64x,j1f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver jnf128,jnf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver jnf32,jnf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver jnf32x,jnf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver jnf64,jnf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver jnf64x,jnf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver key_decryptsession,key_decryptsession@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver key_decryptsession_pk,key_decryptsession_pk@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver key_encryptsession,key_encryptsession@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver key_encryptsession_pk,key_encryptsession_pk@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver key_get_conv,key_get_conv@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver key_setnet,key_setnet@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver key_setsecret,key_setsecret@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ldexpf128,ldexpf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ldexpf32,ldexpf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ldexpf32x,ldexpf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ldexpf64,ldexpf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ldexpf64x,ldexpf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf128,lgammaf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf128_r,lgammaf128_r@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf32,lgammaf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf32_r,lgammaf32_r@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf32x,lgammaf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf32x_r,lgammaf32x_r@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf64,lgammaf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf64_r,lgammaf64_r@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf64x,lgammaf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lgammaf64x_r,lgammaf64x_r@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogb,llogb@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogbf,llogbf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogbf128,llogbf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogbf32,llogbf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogbf32x,llogbf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogbf64,llogbf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogbf64x,llogbf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llogbl,llogbl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llrintf128,llrintf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llrintf32,llrintf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llrintf32x,llrintf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llrintf64,llrintf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llrintf64x,llrintf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llroundf128,llroundf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llroundf32,llroundf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llroundf32x,llroundf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llroundf64,llroundf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver llroundf64x,llroundf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver loc1,loc1@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver loc2,loc2@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver locs,locs@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log10f128,log10f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log10f32,log10f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log10f32x,log10f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log10f64,log10f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log10f64x,log10f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log1pf128,log1pf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log1pf32,log1pf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log1pf32x,log1pf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log1pf64,log1pf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log1pf64x,log1pf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log2f128,log2f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log2f32,log2f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log2f32x,log2f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log2f64,log2f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver log2f64x,log2f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logbf128,logbf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logbf32,logbf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logbf32x,logbf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logbf64,logbf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logbf64x,logbf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logf128,logf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logf32,logf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logf32x,logf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logf64,logf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver logf64x,logf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lrintf128,lrintf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lrintf32,lrintf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lrintf32x,lrintf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lrintf64,lrintf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lrintf64x,lrintf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lroundf128,lroundf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lroundf32,lroundf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lroundf32x,lroundf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lroundf64,lroundf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver lroundf64x,lroundf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver memfd_create,memfd_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver mlock2,mlock2@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver modff128,modff128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver modff32,modff32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver modff32x,modff32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver modff64,modff64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver modff64x,modff64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nanf128,nanf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nanf32,nanf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nanf32x,nanf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nanf64,nanf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nanf64x,nanf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nearbyintf128,nearbyintf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nearbyintf32,nearbyintf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nearbyintf32x,nearbyintf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nearbyintf64,nearbyintf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nearbyintf64x,nearbyintf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver netname2host,netname2host@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver netname2user,netname2user@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextafterf128,nextafterf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextafterf32,nextafterf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextafterf32x,nextafterf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextafterf64,nextafterf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextafterf64x,nextafterf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdown,nextdown@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdownf,nextdownf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdownf128,nextdownf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdownf32,nextdownf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdownf32x,nextdownf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdownf64,nextdownf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdownf64x,nextdownf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextdownl,nextdownl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextup,nextup@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextupf,nextupf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextupf128,nextupf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextupf32,nextupf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextupf32x,nextupf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextupf64,nextupf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextupf64x,nextupf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver nextupl,nextupl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver passwd2des,passwd2des@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pkey_alloc,pkey_alloc@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pkey_free,pkey_free@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pkey_get,pkey_get@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pkey_mprotect,pkey_mprotect@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pkey_set,pkey_set@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pmap_getmaps,pmap_getmaps@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pmap_getport,pmap_getport@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pmap_rmtcall,pmap_rmtcall@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pmap_set,pmap_set@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pmap_unset,pmap_unset@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver powf128,powf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver powf32,powf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver powf32x,powf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver powf64,powf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver powf64x,powf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver preadv2,preadv2@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver preadv64v2,preadv64v2@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pwritev2,pwritev2@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver pwritev64v2,pwritev64v2@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver query_module,query_module@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver reallocarray,reallocarray@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver registerrpc,registerrpc@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remainderf128,remainderf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remainderf32,remainderf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remainderf32x,remainderf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remainderf64,remainderf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remainderf64x,remainderf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remquof128,remquof128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remquof32,remquof32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remquof32x,remquof32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remquof64,remquof64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver remquof64x,remquof64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver rintf128,rintf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver rintf32,rintf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver rintf32x,rintf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver rintf64,rintf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver rintf64x,rintf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundeven,roundeven@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundevenf,roundevenf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundevenf128,roundevenf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundevenf32,roundevenf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundevenf32x,roundevenf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundevenf64,roundevenf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundevenf64x,roundevenf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundevenl,roundevenl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundf128,roundf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundf32,roundf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundf32x,roundf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundf64,roundf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver roundf64x,roundf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver rtime,rtime@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalblnf128,scalblnf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalblnf32,scalblnf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalblnf32x,scalblnf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalblnf64,scalblnf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalblnf64x,scalblnf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalbnf128,scalbnf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalbnf32,scalbnf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalbnf32x,scalbnf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalbnf64,scalbnf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver scalbnf64x,scalbnf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayload,setpayload@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadf,setpayloadf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadf128,setpayloadf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadf32,setpayloadf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadf32x,setpayloadf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadf64,setpayloadf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadf64x,setpayloadf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadl,setpayloadl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsig,setpayloadsig@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsigf,setpayloadsigf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsigf128,setpayloadsigf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsigf32,setpayloadsigf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsigf32x,setpayloadsigf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsigf64,setpayloadsigf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsigf64x,setpayloadsigf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver setpayloadsigl,setpayloadsigl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sigvec,sigvec@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sincosf128,sincosf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sincosf32,sincosf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sincosf32x,sincosf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sincosf64,sincosf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sincosf64x,sincosf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinf128,sinf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinf32,sinf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinf32x,sinf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinf64,sinf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinf64x,sinf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinhf128,sinhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinhf32,sinhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinhf32x,sinhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinhf64,sinhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sinhf64x,sinhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sqrtf128,sqrtf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sqrtf32,sqrtf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sqrtf32x,sqrtf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sqrtf64,sqrtf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver sqrtf64x,sqrtf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver step,step@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfromd,strfromd@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfromf,strfromf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfromf128,strfromf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfromf32,strfromf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfromf32x,strfromf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfromf64,strfromf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfromf64x,strfromf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strfroml,strfroml@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof128,strtof128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof128_l,strtof128_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof32,strtof32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof32_l,strtof32_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof32x,strtof32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof32x_l,strtof32x_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof64,strtof64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof64_l,strtof64_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof64x,strtof64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver strtof64x_l,strtof64x_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svc_exit,svc_exit@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svc_getreq,svc_getreq@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svc_getreq_common,svc_getreq_common@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svc_getreqset,svc_getreqset@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svc_run,svc_run@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svc_unregister,svc_unregister@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcerr_auth,svcerr_auth@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcerr_noprog,svcerr_noprog@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcerr_progvers,svcerr_progvers@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcerr_weakauth,svcerr_weakauth@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcfd_create,svcfd_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcraw_create,svcraw_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcudp_create,svcudp_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcudp_enablecache,svcudp_enablecache@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcunix_create,svcunix_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver svcunixfd_create,svcunixfd_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanf128,tanf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanf32,tanf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanf32x,tanf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanf64,tanf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanf64x,tanf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanhf128,tanhf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanhf32,tanhf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanhf32x,tanhf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanhf64,tanhf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tanhf64x,tanhf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tgammaf128,tgammaf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tgammaf32,tgammaf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tgammaf32x,tgammaf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tgammaf64,tgammaf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver tgammaf64x,tgammaf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorder,totalorder@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorderf,totalorderf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorderf128,totalorderf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorderf32,totalorderf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorderf32x,totalorderf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorderf64,totalorderf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorderf64x,totalorderf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalorderl,totalorderl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermag,totalordermag@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermagf,totalordermagf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermagf128,totalordermagf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermagf32,totalordermagf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermagf32x,totalordermagf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermagf64,totalordermagf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermagf64x,totalordermagf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver totalordermagl,totalordermagl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver truncf128,truncf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver truncf32,truncf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver truncf32x,truncf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver truncf64,truncf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver truncf64x,truncf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfp,ufromfp@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpf,ufromfpf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpf128,ufromfpf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpf32,ufromfpf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpf32x,ufromfpf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpf64,ufromfpf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpf64x,ufromfpf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpl,ufromfpl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpx,ufromfpx@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpxf,ufromfpxf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpxf128,ufromfpxf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpxf32,ufromfpxf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpxf32x,ufromfpxf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpxf64,ufromfpxf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpxf64x,ufromfpxf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ufromfpxl,ufromfpxl@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver uselib,uselib@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver user2netname,user2netname@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof128,wcstof128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof128_l,wcstof128_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof32,wcstof32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof32_l,wcstof32_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof32x,wcstof32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof32x_l,wcstof32x_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof64,wcstof64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof64_l,wcstof64_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof64x,wcstof64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver wcstof64x_l,wcstof64x_l@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_accepted_reply,xdr_accepted_reply@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_authdes_cred,xdr_authdes_cred@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_authdes_verf,xdr_authdes_verf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_authunix_parms,xdr_authunix_parms@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_callhdr,xdr_callhdr@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_callmsg,xdr_callmsg@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_char,xdr_char@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_cryptkeyarg,xdr_cryptkeyarg@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_cryptkeyarg2,xdr_cryptkeyarg2@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_cryptkeyres,xdr_cryptkeyres@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_des_block,xdr_des_block@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_double,xdr_double@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_float,xdr_float@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_getcredres,xdr_getcredres@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_hyper,xdr_hyper@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_int16_t,xdr_int16_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_int32_t,xdr_int32_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_int64_t,xdr_int64_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_int8_t,xdr_int8_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_key_netstarg,xdr_key_netstarg@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_key_netstres,xdr_key_netstres@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_keybuf,xdr_keybuf@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_keystatus,xdr_keystatus@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_long,xdr_long@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_longlong_t,xdr_longlong_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_netnamestr,xdr_netnamestr@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_opaque_auth,xdr_opaque_auth@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_pmap,xdr_pmap@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_pmaplist,xdr_pmaplist@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_quad_t,xdr_quad_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_reference,xdr_reference@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_rejected_reply,xdr_rejected_reply@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_replymsg,xdr_replymsg@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_rmtcall_args,xdr_rmtcall_args@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_rmtcallres,xdr_rmtcallres@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_short,xdr_short@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_u_hyper,xdr_u_hyper@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_u_long,xdr_u_long@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_u_longlong_t,xdr_u_longlong_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_u_quad_t,xdr_u_quad_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_u_short,xdr_u_short@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_uint16_t,xdr_uint16_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_uint64_t,xdr_uint64_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_uint8_t,xdr_uint8_t@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_union,xdr_union@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_unixcred,xdr_unixcred@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_vector,xdr_vector@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdr_wrapstring,xdr_wrapstring@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdrrec_create,xdrrec_create@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdrrec_endofrecord,xdrrec_endofrecord@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdrrec_eof,xdrrec_eof@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xdrrec_skiprecord,xdrrec_skiprecord@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xencrypt,xencrypt@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver xprt_register,xprt_register@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y0f128,y0f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y0f32,y0f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y0f32x,y0f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y0f64,y0f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y0f64x,y0f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y1f128,y1f128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y1f32,y1f32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y1f32x,y1f32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y1f64,y1f64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver y1f64x,y1f64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ynf128,ynf128@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ynf32,ynf32@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ynf32x,ynf32x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ynf64,ynf64@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -__asm__(".symver ynf64x,ynf64x@GLIBC_WRAP_ERROR_SYMBOL_NOT_PRESENT_IN_REQUESTED_VERSION"); -#endif diff --git a/src/vg/vg.h b/src/vg/vg.h deleted file mode 100644 index 77d27e2..0000000 --- a/src/vg/vg.h +++ /dev/null @@ -1,812 +0,0 @@ -/* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */ - -/* - * Memory model: - * [global (.data)] [temp-stack] [system-stack] [game-heap] - * - * 1. Program starts: .data memory is loaded - * 2. System initialization: - * 2a. the large heap buffer is allocated - * 2b. each engine system is initialized in order, using some of the - * system stack - * 2c. game systems are also put into here - */ - - -#ifndef VG_HEADER_H -#define VG_HEADER_H - -#include "vg_platform.h" -#include "vg_mem.h" - -#ifndef _WIN32 -#include -#endif - - -#if defined(VG_SERVER) || defined(VG_TOOLS) - #define VG_NON_CLIENT -#endif - -#ifndef VG_SERVER -#include "../../dep/glad/glad.h" - -#define GLFW_INCLUDE_GLCOREARB - -#ifdef _WIN32 - #define GLFW_DLL -#endif - -#include "../../dep/glfw/glfw3.h" -#endif - -#include "vg_stdint.h" - -void vg_register_exit( void( *funcptr )(void), const char *name ); - -#include "vg_m.h" -#include "vg_io.h" -#include "vg_log.h" - -#ifdef VG_STEAM -//#include "vg_steamworks.h" -#include "vg_steam.h" -#endif - -#ifndef VG_NON_CLIENT - -struct vg -{ - /* Engine sync */ - GLFWwindow* window; - - vg_mutex mux_context; - vg_semaphore sem_allow_exec, - sem_exec_finished, - sem_loader, - sem_fatal; - int exec_context; - - vg_mutex mux_engine_status; - enum engine_status - { - k_engine_status_none, - k_engine_status_running, - k_engine_status_crashed - } - engine_status; - const char *str_const_engine_err; - int is_loaded; - - /* Window information */ - int window_x, - window_y, - samples; - float refresh_rate; - - double mouse_pos[2]; - v2f - mouse_delta, - mouse_wheel; - - /* Runtime */ - double time, - time_delta, - frame_delta, - time_real, - time_real_last, - time_rate, - accumulator; - - int fixed_iterations; - - enum engine_stage - { - k_engine_stage_none, - k_engine_stage_update, - k_engine_stage_update_fixed, - k_engine_stage_rendering, - k_engine_stage_ui - } - engine_stage; - - /* graphics */ - m4x4f pv; - enum quality_profile - { - k_quality_profile_high = 0, - k_quality_profile_low = 1, - } - quality_profile; - - /* Gamepad */ - GLFWgamepadstate gamepad; - int gamepad_ready; - const char *gamepad_name; - int gamepad_id; - int gamepad_use_trackpad_look; -} -VG_STATIC vg = { .time_rate = 1.0 }; - -struct vg_thread_info -{ - enum vg_thread_purpose - { - k_thread_purpose_nothing, - k_thread_purpose_main, - k_thread_purpose_loader - } - purpose; - - int gl_context_level; -}; - -static VG_THREAD_LOCAL struct vg_thread_info vg_thread_info; - - -//#define VG_SYNC_DEBUG - -#ifdef VG_SYNC_DEBUG - #define VG_SYNC_LOG(STR,...) vg_info(STR,vg_thread_info.purpose,##__VA_ARGS__) -#else - #define VG_SYNC_LOG(...) -#endif - -VG_STATIC void vg_fatal_exit_loop( const char *error ); -VG_STATIC void vg_required( void *ptr, const char *path ) -{ - if( !ptr ) - { - vg_fatal_exit_loop( path ); - } -} - - -VG_STATIC void vg_ensure_engine_running(void) -{ - /* Check if the engine is no longer running */ - vg_mutex_lock( &vg.mux_engine_status ); - if( vg.engine_status != k_engine_status_running ) - { - VG_SYNC_LOG( "[%d] Engine is no longer running\n"); - vg_mutex_unlock( &vg.mux_engine_status ); - - /* Safe to disregard loader thread from this point on, elswhere */ - if( vg_thread_info.purpose == k_thread_purpose_loader ) - { - vg_semaphore_post( &vg.sem_loader ); - } - - VG_SYNC_LOG( "[%d] about to kill\n"); - vg_thread_exit(); - } - vg_mutex_unlock( &vg.mux_engine_status ); -} - -/* - * Sync execution so that the OpenGL context is switched onto this thread. - * Anything after this call will be in a valid context. - */ -VG_STATIC void vg_acquire_thread_sync(void) -{ - /* We dont want to do anything if this is the main thread */ - if( vg_thread_info.purpose == k_thread_purpose_main ) - return; - - assert( vg_thread_info.purpose == k_thread_purpose_loader ); - - vg_ensure_engine_running(); - - /* Check if thread already has the context */ - if( vg_thread_info.gl_context_level ) - { - vg_thread_info.gl_context_level ++; - VG_SYNC_LOG( "[%d] We already have sync here\n" ); - return; - } - - vg_mutex_lock( &vg.mux_context ); - VG_SYNC_LOG( "[%d] Signal to sync.\n" ); - vg.exec_context = 1; - vg_mutex_unlock( &vg.mux_context ); - - /* wait until told we can go */ - VG_SYNC_LOG( "[%d] Waiting to acuire sync.\n" ); - vg_semaphore_wait( &vg.sem_allow_exec ); - glfwMakeContextCurrent( vg.window ); - - /* context now valid to work in while we hold up main thread */ - VG_SYNC_LOG( "[%d] Context acquired.\n" ); - vg_thread_info.gl_context_level ++; -} - -/* - * Signify that we are done with the OpenGL context in this thread. - * Anything after this call will be in an undefined context. - */ -VG_STATIC void vg_release_thread_sync(void) -{ - if( vg_thread_info.purpose == k_thread_purpose_main ) - return; - - assert( vg_thread_info.purpose == k_thread_purpose_loader ); - - /* signal that we are done */ - vg_thread_info.gl_context_level --; - - if( !vg_thread_info.gl_context_level ) - { - VG_SYNC_LOG( "[%d] Releasing context.\n" ); - glfwMakeContextCurrent( NULL ); - vg_semaphore_post( &vg.sem_exec_finished ); - } -} - -VG_STATIC void vg_run_synced_content(void) -{ - assert( vg_thread_info.purpose == k_thread_purpose_main ); - - vg_mutex_lock( &vg.mux_context ); - - if( vg.exec_context != 0 ) - { - VG_SYNC_LOG( "[%d] Allowing content (%d).\n", vg.exec_context ); - - /* allow operations to go */ - vg_thread_info.gl_context_level = 0; - glfwMakeContextCurrent( NULL ); - vg_semaphore_post( &vg.sem_allow_exec ); - - /* wait for operations to complete */ - VG_SYNC_LOG( "[%d] Waiting for content (%d).\n", vg.exec_context ); - vg_semaphore_wait( &vg.sem_exec_finished ); - - /* check if we killed the engine */ - vg_ensure_engine_running(); - - /* re-engage main thread */ - VG_SYNC_LOG( "[%d] Re-engaging.\n" ); - vg.exec_context = 0; - glfwMakeContextCurrent( vg.window ); - vg_thread_info.gl_context_level = 1; - } - - vg_mutex_unlock( &vg.mux_context ); -} - -VG_STATIC void vg_opengl_sync_init(void) -{ - vg_semaphore_init( &vg.sem_allow_exec, 0 ); - vg_semaphore_init( &vg.sem_exec_finished, 0 ); - vg_semaphore_init( &vg.sem_loader, 1 ); - vg_semaphore_init( &vg.sem_fatal, 1 ); - vg_mutex_init( &vg.mux_context ); - - vg_set_thread_name( "[vg] Main" ); - vg_thread_info.purpose = k_thread_purpose_main; - vg_thread_info.gl_context_level = 1; -} - -VG_STATIC void vg_checkgl( const char *src_info ); -#define VG_STRINGIT( X ) #X -#define VG_CHECK_GL_ERR() vg_checkgl( __FILE__ ":L" VG_STRINGIT(__LINE__) ) - -#include "vg_console.h" -#include "vg_profiler.h" -#include "vg_audio.h" -#include "vg_shader.h" -#include "vg_tex.h" -#include "vg_input.h" -#include "vg_ui.h" -#include "vg_lines.h" -#include "vg_loader.h" -#include "vg_opt.h" - -/* Diagnostic */ -VG_STATIC struct vg_profile vg_prof_update = {.name="update()"}, - vg_prof_render = {.name="render()"}; - -#define VG_GAMELOOP -VG_STATIC void vg_register(void) VG_GAMELOOP; -VG_STATIC void vg_start(void) VG_GAMELOOP; - -VG_STATIC void vg_update(int loaded) VG_GAMELOOP; -VG_STATIC void vg_update_fixed(int loaded) VG_GAMELOOP; -VG_STATIC void vg_update_post(int loaded) VG_GAMELOOP; - -VG_STATIC void vg_framebuffer_resize(int w, int h) VG_GAMELOOP; -VG_STATIC void vg_render(void) VG_GAMELOOP; -VG_STATIC void vg_ui(void) VG_GAMELOOP; - -VG_STATIC void vg_checkgl( const char *src_info ) -{ - int fail = 0; - - GLenum err; - while( (err = glGetError()) != GL_NO_ERROR ) - { - vg_error( "(%s) OpenGL Error: #%d\n", src_info, err ); - fail = 1; - } - - if( fail ) - vg_fatal_exit_loop( "OpenGL Error" ); -} - -void vg_mouse_callback( GLFWwindow* ptrW, double xpos, double ypos ) -{ - vg.mouse_delta[0] += xpos - vg.mouse_pos[0]; - vg.mouse_delta[1] += ypos - vg.mouse_pos[1]; - - vg.mouse_pos[0] = xpos; - vg.mouse_pos[1] = ypos; -} - -void vg_scroll_callback( GLFWwindow* ptrW, double xoffset, double yoffset ) -{ - vg.mouse_wheel[0] += xoffset; - vg.mouse_wheel[1] += yoffset; -} - -void vg_framebuffer_resize_callback( GLFWwindow *ptrW, int w, int h ) -{ - if( !w || !h ) - { - vg_warn( "Got a invalid framebuffer size: %dx%d... ignoring\n", w, h ); - return; - } - - vg.window_x = w; - vg.window_y = h; - - vg_framebuffer_resize(w,h); -} - -VG_STATIC void vg_bake_shaders(void) -{ - vg_acquire_thread_sync(); - -#if 0 - vg_function_push( (struct vg_cmd) - { - .name = "shaders", - .function = vg_shaders_live_recompile - }); -#endif - - vg_shaders_compile(); - vg_release_thread_sync(); -} - -VG_STATIC void vg_preload(void); -VG_STATIC void vg_load(void); -VG_STATIC void vg_load_full(void) -{ - vg_preload(); - - /* internal */ - vg_loader_highwater( vg_gamepad_init, NULL, NULL ); - vg_loader_highwater( vg_lines_init, NULL, NULL ); - vg_loader_highwater( vg_audio_init, vg_audio_free, NULL ); - vg_loader_highwater( vg_profiler_init, NULL, NULL ); - - /* client */ - vg_load(); - - vg_acquire_thread_sync(); - vg.is_loaded = 1; - vg_release_thread_sync(); -} - -VG_STATIC void vg_enter( int argc, char *argv[], const char *window_name ) -{ - char *arg; - while( vg_argp( argc, argv ) ) - { - if( (arg = vg_opt_arg( 'w' )) ) - { - vg.window_x = atoi( arg ); - } - - if( (arg = vg_opt_arg( 'h' )) ) - { - vg.window_y = atoi( arg ); - } - - if( (arg = vg_long_opt_arg( "samples" )) ) - { - vg.samples = VG_MAX( 0, VG_MIN( 8, atoi( arg ) ) ); - } - - if( vg_long_opt( "use-libc-malloc" ) ) - { - vg_mem.use_libc_malloc = atoi( arg ); - } - - if( vg_long_opt( "high-performance" ) ) - { - vg.quality_profile = k_quality_profile_low; - } - } - - vg_alloc_quota(); - vg_log_init(); - vg_console_init(); - - glfwInit(); - glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 ); - glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 ); - glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE ); - //glfwWindowHint( GLFW_OPENGL_DEBUG_CONTEXT, GL_FALSE ); - glfwWindowHint( GLFW_CONTEXT_RELEASE_BEHAVIOR, GLFW_RELEASE_BEHAVIOR_FLUSH ); - - glfwWindowHint( GLFW_RESIZABLE, GLFW_FALSE ); - glfwWindowHint( GLFW_DOUBLEBUFFER, GLFW_TRUE ); - - glfwWindowHint( GLFW_SAMPLES, vg.samples ); - - GLFWmonitor *monitor_primary = glfwGetPrimaryMonitor(); - - const GLFWvidmode *mode = glfwGetVideoMode( monitor_primary ); - glfwWindowHint( GLFW_RED_BITS, mode->redBits ); - glfwWindowHint( GLFW_GREEN_BITS, mode->greenBits ); - glfwWindowHint( GLFW_BLUE_BITS, mode->blueBits ); - - glfwWindowHint( GLFW_REFRESH_RATE, mode->refreshRate ); - - if( !vg.window_x ) - vg.window_x = mode->width; - - if( !vg.window_y ) - vg.window_y = mode->height; - - vg.refresh_rate = mode->refreshRate; - - if( (vg.window = glfwCreateWindow( vg.window_x, vg.window_y, - window_name, monitor_primary, NULL)) ) - { - glfwGetFramebufferSize( vg.window, &vg.window_x, &vg.window_y ); - vg_success( "Window created (%dx%d)\n", vg.window_x, vg.window_y ); - } - else - { - vg_error( "GLFW Failed to initialize\n" ); - return; - } - - /* We need 3.1.2 for correct VSync on windows */ - { - int vmaj, vmin, vrev; - glfwGetVersion( &vmaj, &vmin, &vrev ); - - if( vmaj < 3 || - (vmaj == 3 && vmin < 1) || - (vmaj == 3 && vmin == 1 && vrev < 2 ) ) - { - vg_error( "GLFW out of date (%d.%d.%d); (3.1.2 is required)\n", - vmaj, vmin, vrev ); - - glfwTerminate(); - return; - } - - vg_success( "GLFW Version %d.%d.%d\n", vmaj, vmin, vrev ); - } - - glfwMakeContextCurrent( vg.window ); - glfwSwapInterval( 1 ); - - glfwSetWindowSizeLimits( vg.window, 800, 600, GLFW_DONT_CARE,GLFW_DONT_CARE); - glfwSetFramebufferSizeCallback( vg.window, vg_framebuffer_resize_callback ); - - glfwSetCursorPosCallback( vg.window, vg_mouse_callback ); - glfwSetScrollCallback( vg.window, vg_scroll_callback ); - - glfwSetCharCallback( vg.window, console_proc_wchar ); - glfwSetKeyCallback( vg.window, console_proc_key ); - glfwSetInputMode( vg.window, GLFW_CURSOR, GLFW_CURSOR_DISABLED ); - - if( glfwRawMouseMotionSupported() ) - glfwSetInputMode( vg.window, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE ); - - if( !gladLoadGLLoader((GLADloadproc)glfwGetProcAddress) ) - { - vg_error( "Glad Failed to initialize\n" ); - glfwTerminate(); - return; - } - - const unsigned char* glver = glGetString( GL_VERSION ); - vg_success( "Load setup complete, OpenGL version: %s\n", glver ); - - /* init systems - * -----------------------------------------------------------------------*/ - ui_init_context(); - vg_loader_init(); - - vg_mutex_init( &vg.mux_engine_status ); - vg.engine_status = k_engine_status_running; - - vg_opengl_sync_init(); - vg_loader_start(); - - vg.accumulator = 0.75f * (1.0f/60.0f); - - int loaded = 0; - while(1) - { - if( glfwWindowShouldClose( vg.window ) ) - break; - - v2_zero( vg.mouse_wheel ); - v2_zero( vg.mouse_delta ); - - glfwPollEvents(); - - vg.time_real_last = vg.time_real; - vg.time_real = glfwGetTime(); - vg.frame_delta = vg.time_real-vg.time_real_last; - - /* scaled time */ - vg.time_delta = vg.frame_delta * vg.time_rate; - vg.time += vg.time_delta; - - if( vg.is_loaded ) - { - if( !loaded ) - { - vg_start(); - loaded = 1; - } - } - else - { - vg_loader_render(); - } - - /* - * Game logic - * ------------------------------------------------------- - */ - vg_profile_begin( &vg_prof_update ); - vg_update_inputs(); - - vg.engine_stage = k_engine_stage_update; - vg_update( loaded ); - - /* Fixed update loop */ - vg.engine_stage = k_engine_stage_update_fixed; - vg.accumulator += vg.time_delta; - - vg.fixed_iterations = 0; - vg_lines.allow_input = 1; - while( vg.accumulator >= (VG_TIMESTEP_FIXED-0.00125) ) - { - vg_update_fixed( loaded ); - vg_lines.allow_input = 0; - - vg.accumulator -= VG_TIMESTEP_FIXED; - vg.accumulator = VG_MAX( 0.0, vg.accumulator ); - - vg.fixed_iterations ++; - if( vg.fixed_iterations == 8 ) - { - break; - } - } - vg_lines.allow_input = 1; - - /* - * Rendering - * --------------------------------------------- - */ - vg.engine_stage = k_engine_stage_update; - vg_update_post( loaded ); - vg_profile_end( &vg_prof_update ); - - vg_profile_begin( &vg_prof_render ); - - if( loaded ) - { - /* render */ - vg.engine_stage = k_engine_stage_rendering; - vg_render(); - - /* ui */ - vg.engine_stage = k_engine_stage_ui; - { - ui_begin( vg.window_x, vg.window_y ); - - /* TODO */ - ui_set_mouse( vg.mouse_pos[0], vg.mouse_pos[1], 0 ); - - vg_profile_drawn( - (struct vg_profile *[]){&vg_prof_update,&vg_prof_render}, 2, - (1.0f/(float)vg.refresh_rate)*1000.0f, - (ui_rect){ 4, 4, 250, 0 }, 0 - ); - - if( vg_profiler ) - { - - char perf[128]; - - snprintf( perf, 127, - "x: %d y: %d\n" - "refresh: %.1f (%.1fms)\n" - "samples: %d\n" - "iterations: %d (acc: %.3fms%%)\n", - vg.window_x, vg.window_y, - vg.refresh_rate, (1.0f/vg.refresh_rate)*1000.0f, - vg.samples, - vg.fixed_iterations, - (vg.accumulator/VG_TIMESTEP_FIXED)*100.0f ); - - ui_text( (ui_rect){258, 4+24+12,0,0},perf, 1,0); - } - - audio_debug_ui( vg.pv ); - vg_ui(); - vg_console_draw(); - - ui_resolve(); - ui_draw( NULL ); - } - } - - vg_profile_end( &vg_prof_render ); - - glfwSwapBuffers( vg.window ); - vg_run_synced_content(); - } - - vg_console_write_persistent(); - - vg_mutex_lock( &vg.mux_engine_status ); - vg.engine_status = k_engine_status_none; - vg_mutex_unlock( &vg.mux_engine_status ); - - vg_loader_free(); - - vg_success( "If you see this it means everything went.. \"well\".....\n" ); - glfwTerminate(); -} - -/* - * Immediately transfer away from calling thread into a safe loop, signal for - * others to shutdown, then free everything once the user closes the window. - * - * FIXME(bug): glfwWindowShouldClose() never returns 1 in windows via wine, ONLY - * when calling the program from outside its normal directory. - */ -VG_STATIC void vg_fatal_exit_loop( const char *error ) -{ - /* - * https://www.gnu.org/software/libc/manual/html_node/Backtraces.html - * thanks gnu <3 - * - * TODO: this on windows? - */ - -#ifndef _WIN32 - - void *array[20]; - char **strings; - int size, i; - - size = backtrace( array, 20 ); - strings = backtrace_symbols( array, size ); - - if( strings != NULL ) - { - vg_error( "---------------- gnu backtrace -------------\n" ); - - for( int i=0; i - -#ifdef I_THINK_THIS_IS_WHAT_MSCV_WANTS_BUT_HAVNT_TESTED_IT_YET - - #define VG_DEPRECATED __declspec(deprecated) - #define VG_THREAD_LOCAL __declspec( thread ) - -#else /* MINGW-64 */ - - #define VG_THREAD_LOCAL __thread - #define VG_DEPRECATED __attribute__((deprecated)) - -#endif - - typedef HANDLE vg_semaphore; - typedef HANDLE vg_mutex; - typedef u64 vg_timespec; - -#else - #include - #include - - #define VG_DEPRECATED __attribute__((deprecated)) - #define VG_THREAD_LOCAL __thread - - typedef sem_t vg_semaphore; - typedef pthread_mutex_t vg_mutex; - typedef struct timespec vg_timespec; - -#endif - -VG_STATIC void vg_strncpy( const char *src, char *dst, u32 len ) -{ - for( u32 i=0; i -#include -#include -#include -#include -#include -#include - -VG_STATIC int vg_thread_run( void *pfunc, void *data ); -VG_STATIC void vg_thread_exit(void); -VG_STATIC void vg_set_thread_name( const char *name ); -VG_STATIC int vg_semaphore_init( vg_semaphore *sem, u32 value ); -VG_STATIC int vg_semaphore_trywait( vg_semaphore *sem ); -VG_STATIC int vg_semaphore_wait( vg_semaphore *sem ); -VG_STATIC int vg_semaphore_post( vg_semaphore *sem ); -VG_STATIC void vg_semaphore_free( vg_semaphore *sem ); -VG_STATIC int vg_mutex_init( vg_mutex *mutex ); -VG_STATIC int vg_mutex_lock( vg_mutex *mutex ); -VG_STATIC int vg_mutex_unlock( vg_mutex *mutex ); -VG_STATIC void vg_mutex_free( vg_mutex *mutex ); -VG_STATIC void vg_sleep_ms( long msec ); -VG_STATIC double vg_time_diff( vg_timespec start, vg_timespec end ); - -#ifdef _WIN32_NO - -VG_STATIC int vg_thread_run( void *pfunc, void *data ) -{ - HANDLE hThread = CreateThread - ( - NULL, /* Thread attributes */ - 0, /* Stack size (0 = use default) */ - pfunc, /* Thread start address */ - data, /* Parameter to pass to the thread */ - 0, /* Creation flags */ - NULL /* Thread id */ - ); - - if ( hThread == NULL ) - { - /* - * Thread creation failed. - * More details can be retrieved by calling GetLastError() - */ - return 1; - } - else - { - CloseHandle( hThread ); - return 0; - } -} - -VG_STATIC void vg_thread_exit(void) -{ - ExitThread(0); -} - -VG_STATIC void vg_set_thread_name( const char *name ) -{ - /* I believe this is a meaningless concept in windows */ -} - -VG_STATIC int vg_semaphore_init( vg_semaphore *sem, u32 value ); -VG_STATIC int vg_semaphore_trywait( vg_semaphore *sem ); -VG_STATIC int vg_semaphore_wait( vg_semaphore *sem ); -VG_STATIC int vg_semaphore_post( vg_semaphore *sem ); -VG_STATIC void vg_semaphore_free( vg_semaphore *sem ); -VG_STATIC int vg_mutex_init( vg_mutex *mutex ); -VG_STATIC int vg_mutex_lock( vg_mutex *mutex ); -VG_STATIC int vg_mutex_unlock( vg_mutex *mutex ); -VG_STATIC void vg_mutex_free( vg_mutex *mutex ); -VG_STATIC void vg_sleep_ms( long msec ); -VG_STATIC double vg_time_diff( vg_timespec start, vg_timespec end ); - -#else - -VG_STATIC int vg_thread_run( void *pfunc, void *data ) -{ - pthread_t hThread; - if( pthread_create( &hThread, NULL, pfunc, data ) ) - { - return 1; - } - else - { - pthread_detach( hThread ); - return 0; - } -} - - -VG_STATIC void vg_thread_exit(void) -{ - pthread_exit(NULL); -} - -VG_STATIC void vg_set_thread_name( const char *name ) -{ - /* not defined but links?? */ -#if 0 - pthread_setname_np(pthread_self()); -#endif -} - -VG_STATIC int vg_semaphore_init( vg_semaphore *sem, u32 value ) -{ - return !sem_init( sem, 0, value ); -} - -VG_STATIC int vg_semaphore_trywait( vg_semaphore *sem ) -{ - return !sem_trywait( sem ); -} - -VG_STATIC int vg_semaphore_wait( vg_semaphore *sem ) -{ - return !sem_wait( sem ); -} - -VG_STATIC int vg_semaphore_post( vg_semaphore *sem ) -{ - return !sem_post( sem ); -} - -VG_STATIC void vg_semaphore_free( vg_semaphore *sem ) -{ - sem_destroy( sem ); -} - -VG_STATIC int vg_mutex_init( vg_mutex *mutex ) -{ - memset( mutex, 0, sizeof(vg_mutex) ); - return 1; -} - -VG_STATIC int vg_mutex_lock( vg_mutex *mutex ) -{ - if( !pthread_mutex_lock( mutex ) ) - return 1; - else - return 0; -} - -VG_STATIC int vg_mutex_unlock( vg_mutex *mutex ) -{ - if( !pthread_mutex_unlock( mutex ) ) - return 1; - else - return 0; -} - -VG_STATIC void vg_mutex_free( vg_mutex *mutex ) -{ - -} - -VG_STATIC void vg_sleep_ms( long msec ) -{ - struct timespec ts; - - ts.tv_sec = msec / 1000; - ts.tv_nsec = (msec % 1000) * 1000000; - nanosleep( &ts, &ts ); -} - -/* diff two timespecs in MS */ -VG_STATIC double vg_time_diff( struct timespec start, struct timespec end ) -{ - double elapsed = 1000.0*end.tv_sec + 1e-6*end.tv_nsec - - (1000.0*start.tv_sec + 1e-6*start.tv_nsec); - - return elapsed; -} - -#endif - -#define VG_MIN( A, B ) ((A)<(B)?(A):(B)) -#define VG_MAX( A, B ) ((A)>(B)?(A):(B)) - -#endif diff --git a/src/vg/vg_steamworks.h b/src/vg/vg_steamworks.h deleted file mode 100644 index 1a3e899..0000000 --- a/src/vg/vg_steamworks.h +++ /dev/null @@ -1,885 +0,0 @@ -#if defined(__linux__) || defined(__APPLE__) -// The 32-bit version of gcc has the alignment requirement for u64 and double set to -// 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned. -// The 64-bit version of gcc has the alignment requirement for these types set to -// 8 meaning that unless we use #pragma pack(4) our structures will get bigger. -// The 64-bit structure packing has to match the 32-bit structure packing for each platform. - #define VALVE_CALLBACK_PACK_SMALL -#else - #define VALVE_CALLBACK_PACK_LARGE -#endif - -#if defined( VALVE_CALLBACK_PACK_SMALL ) - #pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) - #pragma pack( push, 8 ) -#else - #error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -// Types -typedef void ISteamFriends; -typedef void ISteamUserStats; -typedef void ISteamUtils; -typedef void ISteamUser; -typedef void ISteamNetworking; - -typedef i32 HSteamPipe; -typedef i32 HSteamUser; - -typedef int E_iCallBack_t; - -typedef u32 SNetSocket_t; // CreateP2PConnectionSocket() -typedef u32 SNetListenSocket_t; // CreateListenSocket() - -typedef u64 u64_steamid; -typedef u64 SteamAPICall_t; - -enum { k_iSteamUserCallbacks = 100 }; -enum { k_iSteamGameServerCallbacks = 200 }; -enum { k_iSteamFriendsCallbacks = 300 }; -enum { k_iSteamBillingCallbacks = 400 }; -enum { k_iSteamMatchmakingCallbacks = 500 }; -enum { k_iSteamContentServerCallbacks = 600 }; -enum { k_iSteamUtilsCallbacks = 700 }; -enum { k_iClientFriendsCallbacks = 800 }; -enum { k_iClientUserCallbacks = 900 }; -enum { k_iSteamAppsCallbacks = 1000 }; -enum { k_iSteamUserStatsCallbacks = 1100 }; -enum { k_iSteamNetworkingCallbacks = 1200 }; -enum { k_iSteamNetworkingSocketsCallbacks = 1220 }; -enum { k_iSteamNetworkingMessagesCallbacks = 1250 }; -enum { k_iSteamNetworkingUtilsCallbacks = 1280 }; -enum { k_iClientRemoteStorageCallbacks = 1300 }; -enum { k_iClientDepotBuilderCallbacks = 1400 }; -enum { k_iSteamGameServerItemsCallbacks = 1500 }; -enum { k_iClientUtilsCallbacks = 1600 }; -enum { k_iSteamGameCoordinatorCallbacks = 1700 }; -enum { k_iSteamGameServerStatsCallbacks = 1800 }; -enum { k_iSteam2AsyncCallbacks = 1900 }; -enum { k_iSteamGameStatsCallbacks = 2000 }; -enum { k_iClientHTTPCallbacks = 2100 }; -enum { k_iClientScreenshotsCallbacks = 2200 }; -enum { k_iSteamScreenshotsCallbacks = 2300 }; -enum { k_iClientAudioCallbacks = 2400 }; -enum { k_iClientUnifiedMessagesCallbacks = 2500 }; -enum { k_iSteamStreamLauncherCallbacks = 2600 }; -enum { k_iClientControllerCallbacks = 2700 }; -enum { k_iSteamControllerCallbacks = 2800 }; -enum { k_iClientParentalSettingsCallbacks = 2900 }; -enum { k_iClientDeviceAuthCallbacks = 3000 }; -enum { k_iClientNetworkDeviceManagerCallbacks = 3100 }; -enum { k_iClientMusicCallbacks = 3200 }; -enum { k_iClientRemoteClientManagerCallbacks = 3300 }; -enum { k_iClientUGCCallbacks = 3400 }; -enum { k_iSteamStreamClientCallbacks = 3500 }; -enum { k_IClientProductBuilderCallbacks = 3600 }; -enum { k_iClientShortcutsCallbacks = 3700 }; -enum { k_iClientRemoteControlManagerCallbacks = 3800 }; -enum { k_iSteamAppListCallbacks = 3900 }; -enum { k_iSteamMusicCallbacks = 4000 }; -enum { k_iSteamMusicRemoteCallbacks = 4100 }; -enum { k_iClientVRCallbacks = 4200 }; -enum { k_iClientGameNotificationCallbacks = 4300 }; -enum { k_iSteamGameNotificationCallbacks = 4400 }; -enum { k_iSteamHTMLSurfaceCallbacks = 4500 }; -enum { k_iClientVideoCallbacks = 4600 }; -enum { k_iClientInventoryCallbacks = 4700 }; -enum { k_iClientBluetoothManagerCallbacks = 4800 }; -enum { k_iClientSharedConnectionCallbacks = 4900 }; -enum { k_ISteamParentalSettingsCallbacks = 5000 }; -enum { k_iClientShaderCallbacks = 5100 }; -enum { k_iSteamGameSearchCallbacks = 5200 }; -enum { k_iSteamPartiesCallbacks = 5300 }; -enum { k_iClientPartiesCallbacks = 5400 }; -enum { k_iSteamSTARCallbacks = 5500 }; -enum { k_iClientSTARCallbacks = 5600 }; -enum { k_iSteamRemotePlayCallbacks = 5700 }; -enum { k_iClientCompatCallbacks = 5800 }; -enum { k_iSteamChatCallbacks = 5900 }; - -// General result codes -typedef enum EResult -{ - k_EResultNone = 0, // no result - k_EResultOK = 1, // success - k_EResultFail = 2, // generic failure - k_EResultNoConnection = 3, // no/failed network connection -// k_EResultNoConnectionRetry = 4, // OBSOLETE - removed - k_EResultInvalidPassword = 5, // password/ticket is invalid - k_EResultLoggedInElsewhere = 6, // same user logged in elsewhere - k_EResultInvalidProtocolVer = 7, // protocol version is incorrect - k_EResultInvalidParam = 8, // a parameter is incorrect - k_EResultFileNotFound = 9, // file was not found - k_EResultBusy = 10, // called method busy - action not taken - k_EResultInvalidState = 11, // called object was in an invalid state - k_EResultInvalidName = 12, // name is invalid - k_EResultInvalidEmail = 13, // email is invalid - k_EResultDuplicateName = 14, // name is not unique - k_EResultAccessDenied = 15, // access is denied - k_EResultTimeout = 16, // operation timed out - k_EResultBanned = 17, // VAC2 banned - k_EResultAccountNotFound = 18, // account not found - k_EResultInvalidSteamID = 19, // steamID is invalid - k_EResultServiceUnavailable = 20, // The requested service is currently unavailable - k_EResultNotLoggedOn = 21, // The user is not logged on - k_EResultPending = 22, // Request is pending (may be in process, or waiting on third party) - k_EResultEncryptionFailure = 23, // Encryption or Decryption failed - k_EResultInsufficientPrivilege = 24, // Insufficient privilege - k_EResultLimitExceeded = 25, // Too much of a good thing - k_EResultRevoked = 26, // Access has been revoked (used for revoked guest passes) - k_EResultExpired = 27, // License/Guest pass the user is trying to access is expired - k_EResultAlreadyRedeemed = 28, // Guest pass has already been redeemed by account, cannot be acked again - k_EResultDuplicateRequest = 29, // The request is a duplicate and the action has already occurred in the past, ignored this time - k_EResultAlreadyOwned = 30, // All the games in this guest pass redemption request are already owned by the user - k_EResultIPNotFound = 31, // IP address not found - k_EResultPersistFailed = 32, // failed to write change to the data store - k_EResultLockingFailed = 33, // failed to acquire access lock for this operation - k_EResultLogonSessionReplaced = 34, - k_EResultConnectFailed = 35, - k_EResultHandshakeFailed = 36, - k_EResultIOFailure = 37, - k_EResultRemoteDisconnect = 38, - k_EResultShoppingCartNotFound = 39, // failed to find the shopping cart requested - k_EResultBlocked = 40, // a user didn't allow it - k_EResultIgnored = 41, // target is ignoring sender - k_EResultNoMatch = 42, // nothing matching the request found - k_EResultAccountDisabled = 43, - k_EResultServiceReadOnly = 44, // this service is not accepting content changes right now - k_EResultAccountNotFeatured = 45, // account doesn't have value, so this feature isn't available - k_EResultAdministratorOK = 46, // allowed to take this action, but only because requester is admin - k_EResultContentVersion = 47, // A Version mismatch in content transmitted within the Steam protocol. - k_EResultTryAnotherCM = 48, // The current CM can't service the user making a request, user should try another. - k_EResultPasswordRequiredToKickSession = 49,// You are already logged in elsewhere, this cached credential login has failed. - k_EResultAlreadyLoggedInElsewhere = 50, // You are already logged in elsewhere, you must wait - k_EResultSuspended = 51, // Long running operation (content download) suspended/paused - k_EResultCancelled = 52, // Operation canceled (typically by user: content download) - k_EResultDataCorruption = 53, // Operation canceled because data is ill formed or unrecoverable - k_EResultDiskFull = 54, // Operation canceled - not enough disk space. - k_EResultRemoteCallFailed = 55, // an remote call or IPC call failed - k_EResultPasswordUnset = 56, // Password could not be verified as it's unset server side - k_EResultExternalAccountUnlinked = 57, // External account (PSN, Facebook...) is not linked to a Steam account - k_EResultPSNTicketInvalid = 58, // PSN ticket was invalid - k_EResultExternalAccountAlreadyLinked = 59, // External account (PSN, Facebook...) is already linked to some other account, must explicitly request to replace/delete the link first - k_EResultRemoteFileConflict = 60, // The sync cannot resume due to a conflict between the local and remote files - k_EResultIllegalPassword = 61, // The requested new password is not legal - k_EResultSameAsPreviousValue = 62, // new value is the same as the old one ( secret question and answer ) - k_EResultAccountLogonDenied = 63, // account login denied due to 2nd factor authentication failure - k_EResultCannotUseOldPassword = 64, // The requested new password is not legal - k_EResultInvalidLoginAuthCode = 65, // account login denied due to auth code invalid - k_EResultAccountLogonDeniedNoMail = 66, // account login denied due to 2nd factor auth failure - and no mail has been sent - k_EResultHardwareNotCapableOfIPT = 67, // - k_EResultIPTInitError = 68, // - k_EResultParentalControlRestricted = 69, // operation failed due to parental control restrictions for current user - k_EResultFacebookQueryError = 70, // Facebook query returned an error - k_EResultExpiredLoginAuthCode = 71, // account login denied due to auth code expired - k_EResultIPLoginRestrictionFailed = 72, - k_EResultAccountLockedDown = 73, - k_EResultAccountLogonDeniedVerifiedEmailRequired = 74, - k_EResultNoMatchingURL = 75, - k_EResultBadResponse = 76, // parse failure, missing field, etc. - k_EResultRequirePasswordReEntry = 77, // The user cannot complete the action until they re-enter their password - k_EResultValueOutOfRange = 78, // the value entered is outside the acceptable range - k_EResultUnexpectedError = 79, // something happened that we didn't expect to ever happen - k_EResultDisabled = 80, // The requested service has been configured to be unavailable - k_EResultInvalidCEGSubmission = 81, // The set of files submitted to the CEG server are not valid ! - k_EResultRestrictedDevice = 82, // The device being used is not allowed to perform this action - k_EResultRegionLocked = 83, // The action could not be complete because it is region restricted - k_EResultRateLimitExceeded = 84, // Temporary rate limit exceeded, try again later, different from k_EResultLimitExceeded which may be permanent - k_EResultAccountLoginDeniedNeedTwoFactor = 85, // Need two-factor code to login - k_EResultItemDeleted = 86, // The thing we're trying to access has been deleted - k_EResultAccountLoginDeniedThrottle = 87, // login attempt failed, try to throttle response to possible attacker - k_EResultTwoFactorCodeMismatch = 88, // two factor code mismatch - k_EResultTwoFactorActivationCodeMismatch = 89, // activation code for two-factor didn't match - k_EResultAccountAssociatedToMultiplePartners = 90, // account has been associated with multiple partners - k_EResultNotModified = 91, // data not modified - k_EResultNoMobileDevice = 92, // the account does not have a mobile device associated with it - k_EResultTimeNotSynced = 93, // the time presented is out of range or tolerance - k_EResultSmsCodeFailed = 94, // SMS code failure (no match, none pending, etc.) - k_EResultAccountLimitExceeded = 95, // Too many accounts access this resource - k_EResultAccountActivityLimitExceeded = 96, // Too many changes to this account - k_EResultPhoneActivityLimitExceeded = 97, // Too many changes to this phone - k_EResultRefundToWallet = 98, // Cannot refund to payment method, must use wallet - k_EResultEmailSendFailure = 99, // Cannot send an email - k_EResultNotSettled = 100, // Can't perform operation till payment has settled - k_EResultNeedCaptcha = 101, // Needs to provide a valid captcha - k_EResultGSLTDenied = 102, // a game server login token owned by this token's owner has been banned - k_EResultGSOwnerDenied = 103, // game server owner is denied for other reason (account lock, community ban, vac ban, missing phone) - k_EResultInvalidItemType = 104, // the type of thing we were requested to act on is invalid - k_EResultIPBanned = 105, // the ip address has been banned from taking this action - k_EResultGSLTExpired = 106, // this token has expired from disuse; can be reset for use - k_EResultInsufficientFunds = 107, // user doesn't have enough wallet funds to complete the action - k_EResultTooManyPending = 108, // There are too many of this thing pending already - k_EResultNoSiteLicensesFound = 109, // No site licenses found - k_EResultWGNetworkSendExceeded = 110, // the WG couldn't send a response because we exceeded max network send size - k_EResultAccountNotFriends = 111, // the user is not mutually friends - k_EResultLimitedUserAccount = 112, // the user is limited - k_EResultCantRemoveItem = 113, // item can't be removed - k_EResultAccountDeleted = 114, // account has been deleted - k_EResultExistingUserCancelledLicense = 115, // A license for this already exists, but cancelled - k_EResultCommunityCooldown = 116, // access is denied because of a community cooldown (probably from support profile data resets) - k_EResultNoLauncherSpecified = 117, // No launcher was specified, but a launcher was needed to choose correct realm for operation. - k_EResultMustAgreeToSSA = 118, // User must agree to china SSA or global SSA before login - k_EResultLauncherMigrated = 119, // The specified launcher type is no longer supported; the user should be directed elsewhere - k_EResultSteamRealmMismatch = 120, // The user's realm does not match the realm of the requested resource - k_EResultInvalidSignature = 121, // signature check did not match - k_EResultParseFailure = 122, // Failed to parse input - k_EResultNoVerifiedPhone = 123, // account does not have a verified phone number -} EResult; - -// Structures -typedef struct { - u32 m_u32; - u64 m_u64; - u16 m_u16; - double m_d; -} ValvePackingSentinel_t; - -typedef struct { - - HSteamUser m_hSteamUser; // Specific user to whom this callback applies. - int m_iCallback; // Callback identifier. (Corresponds to the k_iCallback enum in the callback structure.) - u8 *m_pubParam; // Points to the callback structure - int m_cubParam; // Size of the data pointed to by m_pubParam - -} CallbackMsg_t; - -typedef struct { - - SteamAPICall_t m_hAsyncCall; - int m_iCallback; - u32 m_cubParam; - -} SteamAPICallCompleted_t; - -// Steam universes. Each universe is a self-contained Steam instance. -typedef enum { - k_EUniverseInvalid = 0, - k_EUniversePublic = 1, - k_EUniverseBeta = 2, - k_EUniverseInternal = 3, - k_EUniverseDev = 4, - // k_EUniverseRC = 5, // no such universe anymore - k_EUniverseMax -} EUniverse_t; - -typedef struct -{ - // 64 bits total - union { - struct SteamIDComponent_t - { -#ifdef VALVE_BIG_ENDIAN - EUniverse_t m_EUniverse : 8; // universe this account belongs to - unsigned int m_EAccountType : 4; // type of account - can't show as EAccountType, due to signed / unsigned difference - unsigned int m_unAccountInstance : 20; // dynamic instance ID - u32 m_unAccountID : 32; // unique account identifier -#else - u32 m_unAccountID : 32; // unique account identifier - unsigned int m_unAccountInstance : 20; // dynamic instance ID - unsigned int m_EAccountType : 4; // type of account - can't show as EAccountType, due to signed / unsigned difference - EUniverse_t m_EUniverse : 8; // universe this account belongs to -#endif - } m_comp; - - u64 m_unAll64Bits; - }; -} CSteamID; - -typedef struct GameID_t -{ -#ifdef VALVE_BIG_ENDIAN - unsigned int m_nModID : 32; - unsigned int m_nType : 8; - unsigned int m_nAppID : 24; -#else - unsigned int m_nAppID : 24; - unsigned int m_nType : 8; - unsigned int m_nModID : 32; -#endif -} CGameID; - -#define SW_CBID_SteamAPICallCompleted (k_iSteamUtilsCallbacks + 3) - -typedef enum ESteamAPICallFailure -{ - k_ESteamAPICallFailureNone = -1, // no failure - k_ESteamAPICallFailureSteamGone = 0, // the local Steam process has gone away - k_ESteamAPICallFailureNetworkFailure = 1, // the network connection to Steam has been broken, or was already broken - // SteamServersDisconnected_t callback will be sent around the same time - // SteamServersConnected_t will be sent when the client is able to talk to the Steam servers again - k_ESteamAPICallFailureInvalidHandle = 2, // the SteamAPICall_t handle passed in no longer exists - k_ESteamAPICallFailureMismatchedCallback = 3,// GetAPICallResult() was called with the wrong callback type for this API call -} ESteamAPICallFailure; - -typedef u64 UGCHandle_t; -typedef u64 PublishedFileUpdateHandle_t; -typedef u64 PublishedFileId_t; -const PublishedFileId_t k_PublishedFileIdInvalid = 0; -const UGCHandle_t k_UGCHandleInvalid = 0xffffffffffffffffull; -const PublishedFileUpdateHandle_t k_PublishedFileUpdateHandleInvalid = 0xffffffffffffffffull; - -// Handle for writing to Steam Cloud -typedef u64 UGCFileWriteStreamHandle_t; - -// size limit on stat or achievement name (UTF-8 encoded) -enum { k_cchStatNameMax = 128 }; - -// maximum number of bytes for a leaderboard name (UTF-8 encoded) -enum { k_cchLeaderboardNameMax = 128 }; - -// maximum number of details i32's storable for a single leaderboard entry -enum { k_cLeaderboardDetailsMax = 64 }; - -// handle to a single leaderboard -typedef u64 SteamLeaderboard_t; - -// handle to a set of downloaded entries in a leaderboard -typedef u64 SteamLeaderboardEntries_t; - -// type of data request, when downloading leaderboard entries -typedef enum ELeaderboardDataRequest -{ - k_ELeaderboardDataRequestGlobal = 0, - k_ELeaderboardDataRequestGlobalAroundUser = 1, - k_ELeaderboardDataRequestFriends = 2, - k_ELeaderboardDataRequestUsers = 3 -} ELeaderboardDataRequest; - -// the sort order of a leaderboard -typedef enum ELeaderboardSortMethod -{ - k_ELeaderboardSortMethodNone = 0, - k_ELeaderboardSortMethodAscending = 1, // top-score is lowest number - k_ELeaderboardSortMethodDescending = 2, // top-score is highest number -} ELeaderboardSortMethod; - -// the display type (used by the Steam Community web site) for a leaderboard -typedef enum ELeaderboardDisplayType -{ - k_ELeaderboardDisplayTypeNone = 0, - k_ELeaderboardDisplayTypeNumeric = 1, // simple numerical score - k_ELeaderboardDisplayTypeTimeSeconds = 2, // the score represents a time, in seconds - k_ELeaderboardDisplayTypeTimeMilliSeconds = 3, // the score represents a time, in milliseconds -} ELeaderboardDisplayType; - -typedef enum ELeaderboardUploadScoreMethod -{ - k_ELeaderboardUploadScoreMethodNone = 0, - k_ELeaderboardUploadScoreMethodKeepBest = 1, // Leaderboard will keep user's best score - k_ELeaderboardUploadScoreMethodForceUpdate = 2, // Leaderboard will always replace score with specified -} ELeaderboardUploadScoreMethod; - -// a single entry in a leaderboard, as returned by GetDownloadedLeaderboardEntry() -typedef struct LeaderboardEntry_t -{ - CSteamID m_steamIDUser; // user with the entry - use SteamFriends()->GetFriendPersonaName() & SteamFriends()->GetFriendAvatar() to get more info - i32 m_nGlobalRank; // [1..N], where N is the number of users with an entry in the leaderboard - i32 m_nScore; // score as set in the leaderboard - i32 m_cDetails; // number of i32 details available for this entry - UGCHandle_t m_hUGC; // handle for UGC attached to the entry -} LeaderboardEntry_t; - -//----------------------------------------------------------------------------- -// Purpose: called when the latests stats and achievements have been received -// from the server -//----------------------------------------------------------------------------- -typedef struct UserStatsReceived_t -{ - u64 m_nGameID; // Game these stats are for - EResult m_eResult; // Success / error fetching the stats - CSteamID m_steamIDUser; // The user for whom the stats are retrieved for -} UserStatsReceived_t; -#define SW_CBID_UserStatsReceived (k_iSteamUserStatsCallbacks + 1) - -//----------------------------------------------------------------------------- -// Purpose: result of a request to store the user stats for a game -//----------------------------------------------------------------------------- -typedef struct UserStatsStored_t -{ - u64 m_nGameID; // Game these stats are for - EResult m_eResult; // success / error -} UserStatsStored_t; -#define SW_CBID_UserStatsStored (k_iSteamUserStatsCallbacks + 2) - -//----------------------------------------------------------------------------- -// Purpose: result of a request to store the achievements for a game, or an -// "indicate progress" call. If both m_nCurProgress and m_nMaxProgress -// are zero, that means the achievement has been fully unlocked. -//----------------------------------------------------------------------------- -typedef struct UserAchievementStored_t -{ - u64 m_nGameID; // Game this is for - int m_bGroupAchievement; // if this is a "group" achievement - char m_rgchAchievementName[k_cchStatNameMax]; // name of the achievement - u32 m_nCurProgress; // current progress towards the achievement - u32 m_nMaxProgress; // "out of" this many -} UserAchievementStored_t; -#define SW_CBID_UserAchievementStored (k_iSteamUserStatsCallbacks + 3) - -//----------------------------------------------------------------------------- -// Purpose: call result for finding a leaderboard, returned as a result of FindOrCreateLeaderboard() or FindLeaderboard() -// use CCallResult<> to map this async result to a member function -//----------------------------------------------------------------------------- -typedef struct LeaderboardFindResult_t -{ - SteamLeaderboard_t m_hSteamLeaderboard; // handle to the leaderboard serarched for, 0 if no leaderboard found - u8 m_bLeaderboardFound; // 0 if no leaderboard found -} LeaderboardFindResult_t; -#define SW_CBID_LeaderboardFindResult (k_iSteamUserStatsCallbacks + 4) - -//----------------------------------------------------------------------------- -// Purpose: call result indicating scores for a leaderboard have been downloaded and are ready to be retrieved, returned as a result of DownloadLeaderboardEntries() -// use CCallResult<> to map this async result to a member function -//----------------------------------------------------------------------------- -typedef struct LeaderboardScoresDownloaded_t -{ - SteamLeaderboard_t m_hSteamLeaderboard; - SteamLeaderboardEntries_t m_hSteamLeaderboardEntries; // the handle to pass into GetDownloadedLeaderboardEntries() - int m_cEntryCount; // the number of entries downloaded -} LeaderboardScoresDownloaded_t; -#define SW_CBID_LeaderboardScoresDownloaded (k_iSteamUserStatsCallbacks + 5) - -//----------------------------------------------------------------------------- -// Purpose: call result indicating scores has been uploaded, returned as a result of UploadLeaderboardScore() -// use CCallResult<> to map this async result to a member function -//----------------------------------------------------------------------------- -typedef struct LeaderboardScoreUploaded_t -{ - u8 m_bSuccess; // 1 if the call was successful - SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was - i32 m_nScore; // the score that was attempted to set - u8 m_bScoreChanged; // true if the score in the leaderboard change, false if the existing score was better - int m_nGlobalRankNew; // the new global rank of the user in this leaderboard - int m_nGlobalRankPrevious; // the previous global rank of the user in this leaderboard; 0 if the user had no existing entry in the leaderboard -} LeaderboardScoreUploaded_t; -#define SW_CBID_LeaderboardScoreUploaded (k_iSteamUserStatsCallbacks + 6) - -typedef struct NumberOfCurrentPlayers_t -{ - u8 m_bSuccess; // 1 if the call was successful - i32 m_cPlayers; // Number of players currently playing -} NumberOfCurrentPlayers_t; -#define SW_CBID_NumberOfCurrentPlayers (k_iSteamUserStatsCallbacks + 7) - - -//----------------------------------------------------------------------------- -// Purpose: Callback indicating that a user's stats have been unloaded. -// Call RequestUserStats again to access stats for this user -//----------------------------------------------------------------------------- -typedef struct UserStatsUnloaded_t -{ - CSteamID m_steamIDUser; // User whose stats have been unloaded -} UserStatsUnloaded_t; -#define SW_CBID_UserStatsUnloaded (k_iSteamUserStatsCallbacks + 8) - - -//----------------------------------------------------------------------------- -// Purpose: Callback indicating that an achievement icon has been fetched -//----------------------------------------------------------------------------- -typedef struct UserAchievementIconFetched_t -{ - CGameID m_nGameID; // Game this is for - char m_rgchAchievementName[k_cchStatNameMax]; // name of the achievement - int m_bAchieved; // Is the icon for the achieved or not achieved version? - int m_nIconHandle; // Handle to the image, which can be used in SteamUtils()->GetImageRGBA(), 0 means no image is set for the achievement -} UserAchievementIconFetched_t; -#define SW_CBID_UserAchievementIconFetched (k_iSteamUserStatsCallbacks + 9) - -//----------------------------------------------------------------------------- -// Purpose: Callback indicating that global achievement percentages are fetched -//----------------------------------------------------------------------------- -typedef struct GlobalAchievementPercentagesReady_t -{ - u64 m_nGameID; // Game this is for - EResult m_eResult; // Result of the operation -} GlobalAchievementPercentagesReady_t; -#define SW_CBID_GlobalAchievementPercentagesReady (k_iSteamUserStatsCallbacks + 10) - -//----------------------------------------------------------------------------- -// Purpose: call result indicating UGC has been uploaded, returned as a result of SetLeaderboardUGC() -//----------------------------------------------------------------------------- -typedef struct LeaderboardUGCSet_t -{ - EResult m_eResult; // The result of the operation - SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was -} LeaderboardUGCSet_t; -#define SW_CBID_LeaderboardUGCSet (k_iSteamUserStatsCallbacks + 11) - -//----------------------------------------------------------------------------- -// Purpose: callback indicating that PS3 trophies have been installed -//----------------------------------------------------------------------------- -typedef struct PS3TrophiesInstalled_t -{ - u64 m_nGameID; // Game these stats are for - EResult m_eResult; // The result of the operation - u64 m_ulRequiredDiskSpace; // If m_eResult is k_EResultDiskFull, will contain the amount of space needed to install trophies - -} PS3TrophiesInstalled_t; -#define SW_CBID_TrophiesInstalled (k_iSteamUserStatsCallbacks + 12) - -//----------------------------------------------------------------------------- -// Purpose: callback indicating global stats have been received. -// Returned as a result of RequestGlobalStats() -//----------------------------------------------------------------------------- -typedef struct GlobalStatsReceived_t -{ - u64 m_nGameID; // Game global stats were requested for - EResult m_eResult; // The result of the request -} GlobalStatsReceived_t; -#define SW_CBID_GlobalStatsReceived (k_iSteamUserStatsCallbacks + 12) - -#pragma pack( pop ) - -// API -void SteamAPI_Shutdown(); -int SteamAPI_Init(); -int SteamAPI_RestartAppIfNecessary( u32 unOwnAppID ); - -void SteamAPI_ManualDispatch_Init(); -void SteamAPI_ManualDispatch_RunFrame( HSteamPipe hSteamPipe ); -int SteamAPI_ManualDispatch_GetNextCallback( HSteamPipe hSteamPipe, CallbackMsg_t *pCallbackMsg ); -void SteamAPI_ManualDispatch_FreeLastCallback( HSteamPipe hSteamPipe ); -int SteamAPI_ManualDispatch_GetAPICallResult( HSteamPipe hSteamPipe, SteamAPICall_t hSteamAPICall, void *pCallback, int cubCallback, int iCallbackExpected, int *pbFailed ); -void SteamAPI_ReleaseCurrentThreadMemory(); - -int SteamAPI_ISteamUserStats_SetAchievement( ISteamUserStats *self, const char *pchName ); - -ESteamAPICallFailure SteamAPI_ISteamUtils_GetAPICallFailureReason( ISteamUtils* self, SteamAPICall_t hSteamAPICall ); - -// Friends -char *SteamAPI_ISteamFriends_GetPersonaName( ISteamFriends *self ); -const char *SteamAPI_ISteamFriends_GetFriendPersonaName( ISteamFriends *self, u64_steamid steamIDFriend ); -u64_steamid SteamAPI_ISteamUser_GetSteamID( ISteamUser *self ); -int SteamAPI_ISteamFriends_GetSmallFriendAvatar( ISteamFriends *self, u64_steamid steamIDFriend ); // 32x32 -int SteamAPI_ISteamUtils_GetImageSize( ISteamUtils *self, int iImage, u32 *pnWidth, u32 *pnHeight ); -int SteamAPI_ISteamUtils_GetImageRGBA( ISteamUtils *self, int iImage, u8 *pubDest, int nDestBufferSize ); - -// Leaderboards -SteamAPICall_t SteamAPI_ISteamUserStats_FindOrCreateLeaderboard( ISteamUserStats* self, const char * pchLeaderboardName, ELeaderboardSortMethod eLeaderboardSortMethod, ELeaderboardDisplayType eLeaderboardDisplayType ); -SteamAPICall_t SteamAPI_ISteamUserStats_FindLeaderboard( ISteamUserStats* self, const char * pchLeaderboardName ); -const char * SteamAPI_ISteamUserStats_GetLeaderboardName( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard ); -int SteamAPI_ISteamUserStats_GetLeaderboardEntryCount( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard ); -ELeaderboardSortMethod SteamAPI_ISteamUserStats_GetLeaderboardSortMethod( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard ); -ELeaderboardDisplayType SteamAPI_ISteamUserStats_GetLeaderboardDisplayType( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard ); -SteamAPICall_t SteamAPI_ISteamUserStats_DownloadLeaderboardEntries( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard, ELeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd ); -SteamAPICall_t SteamAPI_ISteamUserStats_DownloadLeaderboardEntriesForUsers( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard, CSteamID * prgUsers, int cUsers ); -int SteamAPI_ISteamUserStats_GetDownloadedLeaderboardEntry( ISteamUserStats* self, SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, LeaderboardEntry_t * pLeaderboardEntry, i32 * pDetails, int cDetailsMax ); -SteamAPICall_t SteamAPI_ISteamUserStats_UploadLeaderboardScore( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard, ELeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, i32 nScore, const i32 * pScoreDetails, int cScoreDetailsCount ); -SteamAPICall_t SteamAPI_ISteamUserStats_AttachLeaderboardUGC( ISteamUserStats* self, SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC ); - -#define sw_get_image_size(...) SteamAPI_ISteamUtils_GetImageSize( steam_api_classes.utils, __VA_ARGS__ ) -#define sw_get_image_rgba(...) SteamAPI_ISteamUtils_GetImageRGBA( steam_api_classes.utils, __VA_ARGS__ ) -#define sw_get_small_friend_avatar(...) SteamAPI_ISteamFriends_GetSmallFriendAvatar( steam_api_classes.friends, __VA_ARGS__ ) -#define sw_get_steamid() SteamAPI_ISteamUser_GetSteamID( steam_api_classes.friends ) -#define sw_get_friend_persona_name(...) SteamAPI_ISteamFriends_GetFriendPersonaName( steam_api_classes.friends, __VA_ARGS__ ) -#define sw_get_persona_name() SteamAPI_ISteamFriends_GetPersonaName( steam_api_classes.friends ) -#define sw_find_leaderboard(...) SteamAPI_ISteamUserStats_FindLeaderboard( steam_api_classes.stats, __VA_ARGS__ ); -#define sw_get_leaderboard_name(...) SteamAPI_ISteamUserStats_GetLeaderboardName( steam_api_classes.stats, __VA_ARGS__ ) -#define sw_download_leaderboard_entries(...) SteamAPI_ISteamUserStats_DownloadLeaderboardEntries( steam_api_classes.stats, __VA_ARGS__ ) -#define sw_get_downloaded_entry(...) SteamAPI_ISteamUserStats_GetDownloadedLeaderboardEntry( steam_api_classes.stats, __VA_ARGS__ ) -#define sw_upload_leaderboard_score(...) SteamAPI_ISteamUserStats_UploadLeaderboardScore( steam_api_classes.stats, __VA_ARGS__ ) - -HSteamPipe SteamAPI_GetHSteamPipe(); -HSteamUser SteamAPI_GetHSteamUser(); - -struct -{ - ISteamFriends *friends; - ISteamUser *user; - ISteamUserStats *stats; - ISteamNetworking *net; - ISteamUtils *utils; - - HSteamPipe pipe; - - struct cached_player - { - u64_steamid id; - GLuint avatar_texture; // tex_unkown.name - - struct cached_player *l, *r; - } - cached_players[20]; - - struct cached_player *cache_head, *cache_tail; - - u32 cache_count; - -} steam_api_classes; - -static void _sw_cache_push( struct cached_player *player ) -{ - player->l = NULL; - player->r = steam_api_classes.cache_head; - if( steam_api_classes.cache_head ) steam_api_classes.cache_head->l = player; - if( !steam_api_classes.cache_tail ) steam_api_classes.cache_tail = player; - steam_api_classes.cache_head = player; - steam_api_classes.cache_count ++; -} - -static void _sw_cache_evict( struct cached_player *player ) -{ - if( player == steam_api_classes.cache_tail ) steam_api_classes.cache_tail = player->l; - if( player == steam_api_classes.cache_head ) steam_api_classes.cache_head = player->r; - if( player->l ) player->l->r = player->r; - if( player->r ) player->r->l = player->l; - steam_api_classes.cache_count --; -} - -static void _sw_access_cache( struct cached_player *player ) -{ - _sw_cache_evict( player ); - _sw_cache_push( player ); -} - -static GLuint sw_get_player_image( u64_steamid usr ) -{ -#ifdef VG_STEAM - - // Look for player in cache - for( int i = 0; i < steam_api_classes.cache_count; i ++ ) - { - struct cached_player *player = &steam_api_classes.cached_players[i]; - - if( player->id == usr ) - { - _sw_access_cache( player ); - return player->avatar_texture; - } - } - - struct cached_player *dest; - - if( steam_api_classes.cache_count == vg_list_size( steam_api_classes.cached_players ) ) - { - dest = steam_api_classes.cache_tail; - _sw_access_cache( dest ); - - // Delete previous before creating a new one - glDeleteTextures( 1, &dest->avatar_texture ); - } - else - { - dest = &steam_api_classes.cached_players[ steam_api_classes.cache_count ]; - _sw_cache_push( dest ); - } - - dest->id = usr; - dest->avatar_texture = 0; - - // Upload new image - u32 x = 32, y = 32; - int steam_image; - - steam_image = sw_get_small_friend_avatar( usr ); - if( !steam_image ) - return 0; - - if( !sw_get_image_size( steam_image, &x, &y ) ) - return 0; - - u8 * img_buf = (u8 *)malloc( x * y * 4 ); - - if( !sw_get_image_rgba(steam_image, img_buf, x * y * 4) ) - { - free( img_buf ); - return 0; - } - - glGenTextures( 1, &dest->avatar_texture ); - glBindTexture( GL_TEXTURE_2D, dest->avatar_texture ); - - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, img_buf ); - glGenerateMipmap( GL_TEXTURE_2D ); - - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - - free( img_buf ); - - return dest->avatar_texture; - -#else - return 0; -#endif -} - -ISteamFriends *SteamAPI_SteamFriends_v017(); -ISteamUser *SteamAPI_SteamUser_v021(); -ISteamUserStats *SteamAPI_SteamUserStats_v012(); -ISteamNetworking *SteamAPI_SteamNetworking_v006(); -ISteamUtils *SteamAPI_SteamUtils_v010(); - -static void sw_exit(void) -{ -#ifdef VG_STEAM - SteamAPI_Shutdown(); -#endif -} - -static void sw_free_opengl(void) -{ - for( int i = 0; i < steam_api_classes.cache_count; i ++ ) - if( steam_api_classes.cached_players[i].avatar_texture ) - glDeleteTextures( 1, &steam_api_classes.cached_players[i].avatar_texture ); -} - -static int sw_init(void) -{ -#ifdef VG_STEAM - #if defined(VALVE_CALLBACK_PACK_SMALL) - if( sizeof(ValvePackingSentinel_t) != 24 ){ - printf( "Struct packing error: ValvePackingSentinel_t expected 24 got %i\nThe application is built incorrectly\n", (int)sizeof(ValvePackingSentinel_t)); - return 0; - } - #else - if( sizeof(ValvePackingSentinel_t) != 32 ){ - printf( "Struct packing error: ValvePackingSentinel_t expected 32 got %i\nThe application is built incorrectly\n", (int)sizeof(ValvePackingSentinel_t)); - return 0; - } - #endif - - vg_info( "Intializing steamworks\n" ); - - if( SteamAPI_RestartAppIfNecessary( VG_STEAM_APPID ) == 1 ) - { - vg_info( "Restarting app via steam\n" ); - return 0; - } - - if( !SteamAPI_Init() ) - { - vg_error( "Steamworks connection failed\n" ); - return 0; - } - - SteamAPI_ManualDispatch_Init(); - - steam_api_classes.friends = SteamAPI_SteamFriends_v017(); - steam_api_classes.user = SteamAPI_SteamUser_v021(); - steam_api_classes.stats = SteamAPI_SteamUserStats_v012(); - steam_api_classes.net = SteamAPI_SteamNetworking_v006(); - steam_api_classes.utils = SteamAPI_SteamUtils_v010(); - - if( !steam_api_classes.friends || !steam_api_classes.user || !steam_api_classes.stats || !steam_api_classes.net || !steam_api_classes.utils ) - { - vg_error( "Steamworks interface pointers failed. Steamworks DLL may be old\n" ); - SteamAPI_Shutdown(); - return 0; - } - - steam_api_classes.pipe = SteamAPI_GetHSteamPipe(); - vg_success( "Steamworks API running\n" ); - - vg_register_exit( &sw_exit, "SteamAPI" ); - return 1; -#else - return 1; -#endif -} - - -void (*sw_leaderboard_found)( LeaderboardFindResult_t *pCallback ); -void (*sw_leaderboard_downloaded)( LeaderboardScoresDownloaded_t *pCallback ); - -static void sw_event_loop(void) -{ -#ifdef VG_STEAM - SteamAPI_ManualDispatch_RunFrame( steam_api_classes.pipe ); - CallbackMsg_t callback; - - while( SteamAPI_ManualDispatch_GetNextCallback( steam_api_classes.pipe, &callback ) ) - { - vg_info( "steamworks_event::callback( %i )\n", callback.m_iCallback ); - - // Check for dispatching API call results - if( callback.m_iCallback == SW_CBID_SteamAPICallCompleted ){ - - SteamAPICallCompleted_t *pCallCompleted = (SteamAPICallCompleted_t *)callback.m_pubParam; - void *pTmpCallResult = malloc( pCallCompleted->m_cubParam ); - int bFailed; - - if( SteamAPI_ManualDispatch_GetAPICallResult( - steam_api_classes.pipe, - pCallCompleted->m_hAsyncCall, - pTmpCallResult, - pCallCompleted->m_cubParam, - pCallCompleted->m_iCallback, - &bFailed ) - ) - { - // Dispatch the call result to the registered handler(s) for the - // call identified by pCallCompleted->m_hAsyncCall - - vg_info( "steamworks_event::api_call_completed( %lu )\n", pCallCompleted->m_hAsyncCall ); - - switch( pCallCompleted->m_iCallback ) - { - case SW_CBID_LeaderboardFindResult: - if( sw_leaderboard_found ) sw_leaderboard_found( (LeaderboardFindResult_t*)pTmpCallResult ); - break; - case SW_CBID_LeaderboardScoresDownloaded: - if( sw_leaderboard_downloaded ) sw_leaderboard_downloaded( (LeaderboardScoresDownloaded_t*)pTmpCallResult ); - break; - default:break; - } - } - else - { - typedef enum ESteamAPICallFailure - { - k_ESteamAPICallFailureNone = -1, // no failure - k_ESteamAPICallFailureSteamGone = 0, // the local Steam process has gone away - k_ESteamAPICallFailureNetworkFailure = 1, // the network connection to Steam has been broken, or was already broken - // SteamServersDisconnected_t callback will be sent around the same time - // SteamServersConnected_t will be sent when the client is able to talk to the Steam servers again - k_ESteamAPICallFailureInvalidHandle = 2, // the SteamAPICall_t handle passed in no longer exists - k_ESteamAPICallFailureMismatchedCallback = 3,// GetAPICallResult() was called with the wrong callback type for this API call - } ESteamAPICallFailure; - - ESteamAPICallFailure fail_why = - SteamAPI_ISteamUtils_GetAPICallFailureReason( steam_api_classes.utils, pCallCompleted->m_hAsyncCall ); - - vg_error( "steamworks_event: error getting call result on %lu (code %d)\n", pCallCompleted->m_hAsyncCall, fail_why ); - } - - free( pTmpCallResult ); - } - else - { - // Look at callback.m_iCallback to see what kind of callback it is, - // and dispatch to appropriate handler(s) - //void *data = callback.m_pubParam; - - switch( callback.m_iCallback ) - { - default: break; - } - } - - SteamAPI_ManualDispatch_FreeLastCallback( steam_api_classes.pipe ); - } -#endif -} - -static void sw_set_achievement( const char *vg_ach_name ) -{ - struct vg_achievement *ach = NULL; - - for( int i = 0; i < vg_list_size( vg_achievements ); i ++ ) - if( !strcmp( vg_ach_name, vg_achievements[i].name ) ) - ach = &vg_achievements[i]; - - if( !ach->is_set ) - { -#ifdef VG_STEAM - SteamAPI_ISteamUserStats_SetAchievement( steam_api_classes.stats, vg_ach_name ); -#endif - ach->is_set = 1; - vg_success( "Achievement set: '%s'\n", vg_ach_name ); - } -} diff --git a/submodules/SDL b/submodules/SDL new file mode 160000 index 0000000..eef4d3c --- /dev/null +++ b/submodules/SDL @@ -0,0 +1 @@ +Subproject commit eef4d3c86a653f91b7221c80809ba8ab56f94cf1 diff --git a/submodules/SDL_GameControllerDB b/submodules/SDL_GameControllerDB new file mode 160000 index 0000000..6ed8d05 --- /dev/null +++ b/submodules/SDL_GameControllerDB @@ -0,0 +1 @@ +Subproject commit 6ed8d054340ee8a93a684e11360b66cd8a5c168e diff --git a/submodules/anyascii b/submodules/anyascii new file mode 160000 index 0000000..44e971c --- /dev/null +++ b/submodules/anyascii @@ -0,0 +1 @@ +Subproject commit 44e971c774d9ec67ca6c1f16c5a476724821ab63 diff --git a/submodules/qoi b/submodules/qoi new file mode 160000 index 0000000..b8d77df --- /dev/null +++ b/submodules/qoi @@ -0,0 +1 @@ +Subproject commit b8d77df1e80b652a57f0b7270449b179a6b91f40 diff --git a/submodules/stb b/submodules/stb new file mode 160000 index 0000000..8b5f1f3 --- /dev/null +++ b/submodules/stb @@ -0,0 +1 @@ +Subproject commit 8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55 diff --git a/submodules/tinydir b/submodules/tinydir new file mode 160000 index 0000000..9f866c1 --- /dev/null +++ b/submodules/tinydir @@ -0,0 +1 @@ +Subproject commit 9f866c1ec09e62aa4df50d7209556ed705a4dd90 diff --git a/vg.h b/vg.h new file mode 100644 index 0000000..a7b994d --- /dev/null +++ b/vg.h @@ -0,0 +1,915 @@ +/* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */ + +/* + + .-. VG Event loop +| 0 | +| | .-----------. +|API| | vg_enter | +| | '-----------' +| | | +| | v +|IMP| vg_launch_opt(void) <--. +| | | | +| | |'---------------' +| | | .-. +| | |'-----------------------------------| 1 |------. +| | | | | | +| | | | | v +| | | |IMP| vg_preload(void) +| | | | | | +| | .-----+. | | v +| | | | |IMP| vg_load(void) +| | | v '___' | +|IMP| | vg_framebuffer_resize(void) | +| | | | | +|IMP| | |.------------- vg_start(void) ---------------' +| | | | +| | | v +|IMP| | vg_update( int loaded ) +| | | | +| | | .-----+. +| | | | | +| | | | v +|IMP| | '- vg_update_fixed( int loaded ) +| | | | +| | | .-' +| | | | +| | | v +|IMP| | vg_update_post(void) +| | | | +| | | v +|IMP| | vg_render(void) +| | | | +| | | v +|IMP| | vg_ui(void) +| | | | +| | '----' +'___' + +*/ + +#ifndef VG_STATIC + #define VG_STATIC +#endif + +/* API */ +VG_STATIC void vg_enter( int argc, char *argv[], const char *window_name ); + +/* Thread 1 */ +VG_STATIC void vg_preload(void); +VG_STATIC void vg_load(void); + +/* Main thread */ +VG_STATIC void vg_launch_opt(void); +VG_STATIC void vg_start(void); + +VG_STATIC void vg_framebuffer_resize(int w, int h); +VG_STATIC void vg_update(int loaded); +VG_STATIC void vg_update_fixed(int loaded); +VG_STATIC void vg_update_post(int loaded); + +VG_STATIC void vg_render(void); +VG_STATIC void vg_ui(void); + +#ifndef VG_HEADER_H + #define VG_HEADER_H + + #include "vg_platform.h" + #include "vg_mem.h" + + #ifndef _WIN32 + #include + #endif + + #ifdef VG_GAME + #include "dep/glad/glad.h" + #include "submodules/SDL/include/SDL.h" + #include "vg_stdint.h" + + void vg_register_exit( void( *funcptr )(void), const char *name ); + + #include "vg_m.h" + #include "vg_io.h" + #include "vg_log.h" + #include "vg_steam.h" + + //#define VG_SYNC_DEBUG + #ifdef VG_SYNC_DEBUG + #define VG_SYNC_LOG(STR,...) \ + vg_info(STR,SDL_GetThreadID(NULL),##__VA_ARGS__) + #else + #define VG_SYNC_LOG(...) + #endif + +struct vg +{ + /* Engine sync */ + SDL_Window *window; + SDL_GLContext gl_context; + + SDL_SpinLock sl_context; + SDL_sem *sem_allow_exec, + *sem_exec_finished, + *sem_loader; + + SDL_threadID thread_id_main, + thread_id_loader, + thread_id_with_opengl_context; + int context_ownership_refcount; + + int exec_context; + + enum engine_status + { + k_engine_status_none, + k_engine_status_running, + k_engine_status_crashed + } + engine_status; + const char *str_const_engine_err; + int is_loaded; + + /* Window information */ + int window_x, + window_y, + samples, + window_should_close; + + float refresh_rate; + + double mouse_pos[2]; + v2f mouse_delta, + mouse_wheel; + + /* Runtime */ + double time, + time_delta, + frame_delta, + time_real, + time_real_last, + time_rate, + accumulator; + + int fixed_iterations; + + enum engine_stage + { + k_engine_stage_none, + k_engine_stage_update, + k_engine_stage_update_fixed, + k_engine_stage_rendering, + k_engine_stage_ui + } + engine_stage; + + /* graphics */ + m4x4f pv; + enum quality_profile + { + k_quality_profile_high = 0, + k_quality_profile_low = 1, + } + quality_profile; +} +VG_STATIC vg = { .time_rate = 1.0 }; + +struct vg_thread_info +{ + enum vg_thread_purpose + { + k_thread_purpose_nothing, + k_thread_purpose_main, + k_thread_purpose_loader + } + purpose; + + int gl_context_level; +}; + +VG_STATIC void vg_fatal_exit_loop( const char *error ); +VG_STATIC void vg_required( void *ptr, const char *path ) +{ + if( !ptr ) + { + vg_fatal_exit_loop( path ); + } +} + +VG_STATIC void vg_ensure_engine_running(void) +{ + VG_SYNC_LOG( "[%d] Checks if engine is running\n" ); + + /* Check if the engine is no longer running */ + SDL_AtomicLock( &vg.sl_context ); + + if( vg.engine_status != k_engine_status_running ) + { + VG_SYNC_LOG( "[%d] Engine is no longer running\n"); + + /* Safe to disregard loader thread from this point on, elswhere */ + if( vg.thread_id_loader == SDL_GetThreadID(NULL) ) + { + SDL_SemPost( vg.sem_loader ); + } + + SDL_AtomicUnlock( &vg.sl_context ); + + VG_SYNC_LOG( "[%d] is just going to hang around and wait to die\n"); + while(1) SDL_Delay(1000); + } + + SDL_AtomicUnlock( &vg.sl_context ); +} + +/* + * Sync execution so that the OpenGL context is switched onto this thread. + * Anything after this call will be in a valid context. + */ +VG_STATIC void vg_acquire_thread_sync(void) +{ + VG_SYNC_LOG( "[%d] Starts acquiring sync\n" ); + + /* We dont want to do anything if this is the main thread */ + SDL_AtomicLock( &vg.sl_context ); + if( vg.thread_id_main == SDL_GetThreadID(NULL) ) + { + SDL_AtomicUnlock( &vg.sl_context ); + return; + } + SDL_AtomicUnlock( &vg.sl_context ); + + vg_ensure_engine_running(); + + /* Check if thread already has the context */ + SDL_AtomicLock( &vg.sl_context ); + if( vg.thread_id_with_opengl_context == SDL_GetThreadID(NULL) ) + { + vg.context_ownership_refcount ++; + SDL_AtomicUnlock( &vg.sl_context ); + + VG_SYNC_LOG( "[%d] We already have sync here\n" ); + return; + } + + VG_SYNC_LOG( "[%d] Signal to sync.\n" ); + vg.exec_context = 1; + SDL_AtomicUnlock( &vg.sl_context ); + + /* wait until told we can go */ + VG_SYNC_LOG( "[%d] Waiting to acuire sync.\n" ); + + SDL_SemWait( vg.sem_allow_exec ); + SDL_GL_MakeCurrent( vg.window, vg.gl_context ); + + VG_SYNC_LOG( "[%d] Allow exec passed\n" ); + + /* context now valid to work in while we hold up main thread */ + SDL_AtomicLock( &vg.sl_context ); + vg.context_ownership_refcount ++; + SDL_AtomicUnlock( &vg.sl_context ); + + VG_SYNC_LOG( "[%d] Context acquired.\n" ); +} + +/* + * Signify that we are done with the OpenGL context in this thread. + * Anything after this call will be in an undefined context. + */ +VG_STATIC void vg_release_thread_sync(void) +{ + VG_SYNC_LOG( "[%d] Releases sync\n" ); + + SDL_AtomicLock( &vg.sl_context ); + if( vg.thread_id_main == SDL_GetThreadID(NULL) ) + { + SDL_AtomicUnlock( &vg.sl_context ); + return; + } + + /* signal that we are done */ + vg.context_ownership_refcount --; + if( !vg.context_ownership_refcount ) + { + SDL_AtomicUnlock( &vg.sl_context ); + + VG_SYNC_LOG( "[%d] Releasing context.\n" ); + + SDL_GL_MakeCurrent( NULL, NULL ); + SDL_SemPost( vg.sem_exec_finished ); + } + else + SDL_AtomicUnlock( &vg.sl_context ); +} + +VG_STATIC void vg_run_synced_content(void) +{ + SDL_AtomicLock( &vg.sl_context ); + + if( vg.exec_context != 0 ) + { + VG_SYNC_LOG( "[%d] Allowing content (%d).\n", vg.exec_context ); + vg.exec_context = 0; + SDL_AtomicUnlock( &vg.sl_context ); + + /* allow operations to go */ + SDL_GL_MakeCurrent( NULL, NULL ); + SDL_SemPost( vg.sem_allow_exec ); + + /* wait for operations to complete */ + VG_SYNC_LOG( "[%d] Waiting for content.\n" ); + SDL_SemWait( vg.sem_exec_finished ); + + /* check if we killed the engine */ + vg_ensure_engine_running(); + + /* re-engage main thread */ + VG_SYNC_LOG( "[%d] Re-engaging.\n" ); + SDL_GL_MakeCurrent( vg.window, vg.gl_context ); + } + else + SDL_AtomicUnlock( &vg.sl_context ); +} + +VG_STATIC void vg_opengl_sync_init(void) +{ + vg.sem_allow_exec = SDL_CreateSemaphore(0); + vg.sem_exec_finished = SDL_CreateSemaphore(0); + vg.sem_loader = SDL_CreateSemaphore(1); +} + +VG_STATIC void vg_checkgl( const char *src_info ); +#define VG_STRINGIT( X ) #X +#define VG_CHECK_GL_ERR() vg_checkgl( __FILE__ ":L" VG_STRINGIT(__LINE__) ) + +#include "vg_console.h" +#include "vg_profiler.h" +#include "vg_audio.h" +#include "vg_shader.h" +#include "vg_tex.h" +#include "vg_input.h" +#include "vg_ui.h" +#include "vg_lines.h" +#include "vg_loader.h" +#include "vg_opt.h" + +/* Diagnostic */ +VG_STATIC struct vg_profile vg_prof_update = {.name="update()"}, + vg_prof_render = {.name="render()"}; + +VG_STATIC void vg_checkgl( const char *src_info ) +{ + int fail = 0; + + GLenum err; + while( (err = glGetError()) != GL_NO_ERROR ) + { + vg_error( "(%s) OpenGL Error: #%d\n", src_info, err ); + fail = 1; + } + + if( fail ) + vg_fatal_exit_loop( "OpenGL Error" ); +} + +VG_STATIC void vg_bake_shaders(void) +{ + vg_acquire_thread_sync(); + +#if 0 + vg_function_push( (struct vg_cmd) + { + .name = "shaders", + .function = vg_shaders_live_recompile + }); +#endif + + vg_shaders_compile(); + vg_release_thread_sync(); +} + +VG_STATIC void vg_load_full(void) +{ + vg_preload(); + + /* internal */ + vg_loader_highwater( vg_input_init, vg_input_free, NULL ); + vg_loader_highwater( vg_lines_init, NULL, NULL ); + vg_loader_highwater( vg_audio_init, vg_audio_free, NULL ); + vg_loader_highwater( vg_profiler_init, NULL, NULL ); + + /* client */ + vg_load(); + + vg_acquire_thread_sync(); + vg.is_loaded = 1; + vg_release_thread_sync(); +} + +VG_STATIC void vg_process_events(void) +{ + /* Update timers */ + vg.time_real_last = vg.time_real; + vg.time_real = (double)SDL_GetTicks64() / 1000.0; + vg.frame_delta = vg.time_real-vg.time_real_last; + + v2_zero( vg.mouse_wheel ); + v2_zero( vg.mouse_delta ); + + /* SDL event loop */ + SDL_Event event; + while( SDL_PollEvent( &event ) ) + { + if( event.type == SDL_KEYDOWN ) + { + console_proc_key( event.key.keysym ); + } + else if( event.type == SDL_MOUSEWHEEL ) + { + vg.mouse_wheel[0] += event.wheel.preciseX; + vg.mouse_wheel[1] += event.wheel.preciseY; + } + else if( event.type == SDL_CONTROLLERAXISMOTION || + event.type == SDL_CONTROLLERBUTTONDOWN || + event.type == SDL_CONTROLLERBUTTONUP || + event.type == SDL_CONTROLLERDEVICEADDED || + event.type == SDL_CONTROLLERDEVICEREMOVED + ) + { + vg_input_controller_event( &event ); + } + else if( event.type == SDL_MOUSEMOTION ) + { + vg.mouse_delta[0] += event.motion.xrel; + vg.mouse_delta[1] += event.motion.yrel; + } + else if( event.type == SDL_WINDOWEVENT ) + { + if( event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED ) + { + int w, h; + SDL_GL_GetDrawableSize( vg.window, &w, &h ); + + if( !w || !h ) + { + vg_warn( "Got a invalid framebuffer size: " + "%dx%d... ignoring\n", w, h ); + } + else + { + vg.window_x = w; + vg.window_y = h; + + vg_framebuffer_resize(w,h); + } + } + else if( event.window.event == SDL_WINDOWEVENT_CLOSE ) + { + vg.window_should_close = 1; + } + } + else if( event.type == SDL_TEXTINPUT ) + { + console_proc_utf8( event.text.text ); + } + } + + vg.mouse_pos[0] += vg.mouse_delta[0]; + vg.mouse_pos[1] += vg.mouse_delta[1]; + + /* Update input */ + vg_update_inputs(); +} + +VG_STATIC void vg_gameloop_update( int post_start ) +{ + vg_profile_begin( &vg_prof_update ); + + vg.engine_stage = k_engine_stage_update; + vg_update( post_start ); + + /* Fixed update loop */ + vg.engine_stage = k_engine_stage_update_fixed; + vg.accumulator += vg.time_delta; + + vg.fixed_iterations = 0; + vg_lines.allow_input = 1; + while( vg.accumulator >= (VG_TIMESTEP_FIXED-0.00125) ) + { + vg_update_fixed( post_start ); + vg_lines.allow_input = 0; + + vg.accumulator -= VG_TIMESTEP_FIXED; + vg.accumulator = VG_MAX( 0.0, vg.accumulator ); + + vg.fixed_iterations ++; + if( vg.fixed_iterations == 8 ) + { + break; + } + } + vg_lines.allow_input = 1; + + vg.engine_stage = k_engine_stage_update; + vg_update_post( post_start ); + vg_profile_end( &vg_prof_update ); +} + +VG_STATIC void vg_gameloop_render( int post_start ) +{ + vg_profile_begin( &vg_prof_render ); + + if( post_start ) + { + /* render */ + vg.engine_stage = k_engine_stage_rendering; + vg_render(); + + /* ui */ + vg.engine_stage = k_engine_stage_ui; + { + ui_begin( vg.window_x, vg.window_y ); + + /* TODO */ + ui_set_mouse( vg.mouse_pos[0], vg.mouse_pos[1], 0 ); + + vg_profile_drawn( + (struct vg_profile *[]){&vg_prof_update,&vg_prof_render}, 2, + (1.0f/(float)vg.refresh_rate)*1000.0f, + (ui_rect){ 4, 4, 250, 0 }, 0 + ); + + if( vg_profiler ) + { + + char perf[128]; + + snprintf( perf, 127, + "x: %d y: %d\n" + "refresh: %.1f (%.1fms)\n" + "samples: %d\n" + "iterations: %d (acc: %.3fms%%)\n", + vg.window_x, vg.window_y, + vg.refresh_rate, (1.0f/vg.refresh_rate)*1000.0f, + vg.samples, + vg.fixed_iterations, + (vg.accumulator/VG_TIMESTEP_FIXED)*100.0f ); + + ui_text( (ui_rect){258, 4+24+12,0,0},perf, 1,0); + } + + audio_debug_ui( vg.pv ); + vg_ui(); + vg_console_draw(); + + ui_resolve(); + ui_draw( NULL ); + } + } + + vg_profile_end( &vg_prof_render ); +} + +VG_STATIC void vg_gameloop(void) +{ + vg.accumulator = 0.75f * (1.0f/60.0f); + + int post_start = 0; + while(1) + { + vg_process_events(); + + if( vg.window_should_close ) + break; + + /* scaled time */ + vg.time_delta = vg.frame_delta * vg.time_rate; + vg.time += vg.time_delta; + + if( vg.is_loaded ) + { + if( !post_start ) + { + vg_start(); + post_start = 1; + } + } + else + { + vg_loader_render(); + } + + vg_gameloop_update( post_start ); + vg_gameloop_render( post_start ); + + SDL_GL_SwapWindow( vg.window ); + vg_run_synced_content(); + } +} + +VG_STATIC void vg_process_launch_opts_internal(void) +{ + char *arg; + while( vg_argp( argc, argv ) ) + { + if( (arg = vg_opt_arg( 'w' )) ) + { + vg.window_x = atoi( arg ); + } + + if( (arg = vg_opt_arg( 'h' )) ) + { + vg.window_y = atoi( arg ); + } + + if( (arg = vg_long_opt_arg( "samples" )) ) + { + vg.samples = VG_MAX( 0, VG_MIN( 8, atoi( arg ) ) ); + } + + if( vg_long_opt( "use-libc-malloc" ) ) + { + vg_mem.use_libc_malloc = atoi( arg ); + } + + if( vg_long_opt( "high-performance" ) ) + { + vg.quality_profile = k_quality_profile_low; + } + + vg_launch_opt(); + } +} + +VG_STATIC void vg_init_window(void) +{ + if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_GAMECONTROLLER) != 0 ) + { + vg_error( "SDL_Init failed: %s\n", SDL_GetError() ); + exit(0); + } + + SDL_GL_SetSwapInterval( 1 ); + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 ); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 ); + SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, + SDL_GL_CONTEXT_PROFILE_CORE ); + + SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 1 ); + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); + SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 ); + + if( vg.samples > 1 ) + { + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 ); + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, vg.samples ); + } + + SDL_GL_SetAttribute( SDL_GL_CONTEXT_RELEASE_BEHAVIOR, + SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH ); + + /* + * Get monitor information + */ + int display_count = 0, display_index = 0, mode_index = 0; + if( (display_count = SDL_GetNumVideoDisplays()) < 1 ) + { + vg_error( "SDL_GetNumVideoDisplays returned: %i\n", display_count ); + exit(0); + } + + /* TODO: Allow chosing the modes at startup */ + SDL_DisplayMode mode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 }; + if( SDL_GetDisplayMode( display_index, mode_index, &mode ) != 0 ) + { + vg_error( "SDL_GetDisplayMode failed: %s", SDL_GetError() ); + exit(0); + } + + vg.refresh_rate = mode.refresh_rate; + + /* TODO: Allow selecting closest video mode from launch opts */ + if((vg.window = SDL_CreateWindow( window_name, + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + mode.w, mode.h, + + SDL_WINDOW_FULLSCREEN | + SDL_WINDOW_OPENGL | + SDL_WINDOW_INPUT_GRABBED ))) + { + } + else + { + vg_error( "SDL_CreateWindow failed: %s", SDL_GetError() ); + exit(0); + } + + /* + * OpenGL loading + */ + if( (vg.gl_context = SDL_GL_CreateContext(vg.window) )) + { + SDL_GL_GetDrawableSize( vg.window, &vg.window_x, &vg.window_y ); + vg_success( "Window created (%dx%d)\n", vg.window_x, vg.window_y ); + } + else + { + vg_error( "SDL_GL_CreateContext failed: %s\n", SDL_GetError() ); + SDL_Quit(); + exit(0); + } + + if( !gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress) ) + { + vg_error( "Glad Failed to initialize\n" ); + SDL_GL_DeleteContext( vg.gl_context ); + SDL_Quit(); + exit(0); + } + + const unsigned char* glver = glGetString( GL_VERSION ); + vg_success( "Load setup complete, OpenGL version: %s\n", glver ); +} + +VG_STATIC void vg_enter( int argc, char *argv[], const char *window_name ) +{ + vg_process_launch_opts_internal(); + + /* Systems init */ + vg_alloc_quota(); + vg_log_init(); + vg_console_init(); + vg_init_window(); + + SDL_SetRelativeMouseMode(1); + vg.thread_id_main = SDL_GetThreadID(NULL); + + /* Opengl-required systems */ + ui_init_context(); + vg_loader_init(); + + vg.engine_status = k_engine_status_running; + + vg_opengl_sync_init(); + vg_loader_start(); + + /* main */ + vg_gameloop(); + + /* Shutdown */ + vg_console_write_persistent(); + + SDL_AtomicLock( &vg.sl_context ); + vg.engine_status = k_engine_status_none; + SDL_AtomicUnlock( &vg.sl_context ); + + vg_loader_free(); + + vg_success( "If you see this it means everything went.. \"well\".....\n" ); + + SDL_GL_DeleteContext( vg.gl_context ); + SDL_Quit(); +} + +/* + * Immediately transfer away from calling thread into a safe loop, signal for + * others to shutdown, then free everything once the user closes the window. + * + * FIXME(bug): glfwWindowShouldClose() never returns 1 in windows via wine, ONLY + * when calling the program from outside its normal directory. + */ +VG_STATIC void vg_fatal_exit_loop( const char *error ) +{ + /* + * https://www.gnu.org/software/libc/manual/html_node/Backtraces.html + * thanks gnu <3 + * + * TODO: this on windows? + */ + +#ifndef _WIN32 + + void *array[20]; + char **strings; + int size, i; + + size = backtrace( array, 20 ); + strings = backtrace_symbols( array, size ); + + if( strings != NULL ) + { + vg_error( "---------------- gnu backtrace -------------\n" ); + + for( int i=0; iplayback.format = ma_format_f32; - dconf->playback.channels = 2; - dconf->sampleRate = 44100; - dconf->dataCallback = audio_mixer_callback; - dconf->periodSizeInFrames = 441; - - dconf->pUserData = NULL; - - vg_info( "Starting audio engine\n" ); - - if( ma_device_init( NULL, dconf, device) != MA_SUCCESS ) + SDL_AudioSpec spec_desired, spec_got; + spec_desired.callback = audio_mixer_callback; + spec_desired.channels = 2; + spec_desired.format = AUDIO_F32; + spec_desired.freq = 44100; + spec_desired.padding = 0; + spec_desired.samples = 512; + spec_desired.silence = 0; + spec_desired.size = 0; + spec_desired.userdata = NULL; + + vg_audio.sdl_output_device = + SDL_OpenAudioDevice( NULL, 0, &spec_desired, &spec_got, + SDL_AUDIO_ALLOW_SAMPLES_CHANGE ); + + if( vg_audio.sdl_output_device ) { - vg_fatal_exit_loop( "(audio) ma_device failed to initialize" ); - } - else - { - if( ma_device_start( device ) != MA_SUCCESS ) - { - ma_device_uninit( device ); - vg_fatal_exit_loop( "(audio) ma_device failed to start" ); - } + SDL_PauseAudioDevice( vg_audio.sdl_output_device, 0 ); } - + else + { + vg_fatal_exit_loop( + "SDL_OpenAudioDevice failed. Your default audio device must support:\n" + " Frequency: 44100 hz\n" + " Buffer size: 512\n" + " Channels: 2\n" + " Format: s16 or f32\n" ); + } + vg_success( "Ready\n" ); } VG_STATIC void vg_audio_free(void * nothing) { - ma_device *device = &vg_audio.miniaudio_device; - ma_device_uninit( device ); - -#if 0 - vg_free( vg_audio.mem ); - vg_audio.mem = NULL; -#endif + SDL_CloseAudioDevice( vg_audio.sdl_output_device ); } /* @@ -717,19 +704,14 @@ VG_STATIC void audio_entity_mix( aatree_ptr id, float *buffer, vg_profile_end( &_vg_prof_audio_mix ); } -/* - * callback from miniaudio.h interface - */ -VG_STATIC void audio_mixer_callback( ma_device *pDevice, void *pOutBuf, - const void *pInput, ma_uint32 frame_count ) +VG_STATIC void audio_mixer_callback( void *user, u8 *stream, int byte_count ) { - struct timespec time_start, time_end; - clock_gettime( CLOCK_REALTIME, &time_start ); - audio_system_enque(); + + int frame_count = byte_count/(2*sizeof(float)); /* Clear buffer */ - float *pOut32F = (float *)pOutBuf; + float *pOut32F = (float *)stream; for( int i=0; i #include -#include "vg/vg_log.h" +#include "vg_log.h" struct compiler_info { @@ -97,7 +97,7 @@ void vg_build_start( const char *name, enum compiler compiler ) vg_compiler_str() ); vg_build_syscall( "mkdir -p %s", vg_compiler.build_dir ); - vg_build_include( "-I. -I./vg/src " ); + vg_build_include( "-I. -I./vg " ); vg_build_library_dir( "-L. " ); } @@ -106,16 +106,15 @@ void vg_build_add_link_for_graphics(void) if( (vg_compiler.compiler == k_compiler_gcc) || (vg_compiler.compiler == k_compiler_clang ) ) { - vg_build_link( "-lGL -lglfw3 -lX11 -lXxf86vm -lXrandr -lXi -ldl " ); + vg_build_link( "-lSDL2 -lGL -lX11 -lXxf86vm -lXrandr -lXi -ldl " ); } else { - vg_build_link( "-lglfw3dll -lopengl32 -static -mwindows " ); + vg_build_link( "-lmingw32 -lSDL2main -lSDL2 -lopengl32 -mwindows " ); } vg_build_object( "vg/dep/glad/glad.c " ); vg_build_link( "-lm -pthread " ); - vg_build_library_dir( "-L./vg/dep/glfw " ); } void vg_build_add_link_for_game(void) @@ -124,17 +123,13 @@ void vg_build_add_link_for_game(void) (vg_compiler.compiler == k_compiler_clang ) ) { vg_build_link( "-lsteam_api " ); - vg_build_object( "vg/dep/dr_soft/miniaudio." ); } else { + vg_build_library_dir( "-L./vg/dep/sdl " ); vg_build_link( "vg/dep/steam/steam_api.dll " ); - vg_build_object( "vg/dep/dr_soft/miniaudio." ); } - vg_build_object( vg_compiler_str() ); - vg_build_object( ".o " ); - vg_build_include( "-I./vg/dep " ); vg_build_library_dir( "-L./vg/dep/steam " ); } @@ -159,12 +154,15 @@ void vg_build_copy_graphics_dependencies(void) { if( vg_compiler.compiler == k_compiler_mingw ) { - vg_build_bin_dependency_file( "vg/dep/glfw/glfw3.dll" ); + vg_build_bin_dependency_file( "vg/dep/sdl/SDL2.dll" ); } } void vg_build_copy_game_dependencies(void) { + vg_build_bin_dependency_file( + "vg/submodules/SDL_GameControllerDB/gamecontrollerdb.txt" ); + if( (vg_compiler.compiler == k_compiler_gcc) || (vg_compiler.compiler == k_compiler_clang) ) { @@ -186,14 +184,6 @@ void vg_build_mode_debug(void) vg_compiler.optimization_profile = k_optimization_profile_debug; } -void vg_build_miniaudio(void) -{ - vg_build_syscall( "ccache %s -O3\\\n" - " -c vg/dep/dr_soft/miniaudio_impl.c\\\n" - " -o vg/dep/dr_soft/miniaudio.%s.o", - vg_compiler_str(), vg_compiler_str() ); -} - void vg_build(void) { char cmd[4096]; diff --git a/vg_build.sh b/vg_build.sh deleted file mode 100644 index 70913c7..0000000 --- a/vg_build.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/bash -# Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved -# -# Build script utilities -# Usage: -# 1) in your build script, define the function -# -# vg_command(){ -# -# } -# -# it should handle $1 as the switch for different commands -# if you want to run an existing command, use run_command to do it. -# -# -# 2) at the end of the build script, include: -# -# source vg/vg_build.sh -# -# this runs the triggers that are passed in from the invoker -# -# -# 3) targets with standard tool support should run the command: -# -# vg_compile_tools -# -# make sure _compiler _options, and _ext are setup for that target -# these will only invoke the tooling compilers if tools is passed to the -# build script. -# -# Util -# ============================================================================== - -error(){ - echo -e "\033[1;31mError:\e[0m $@" - exit 1 -} - -warning(){ - echo -e "\033[1;33mWarning:\e[0m $@" -} - -success(){ - echo -e "\033[1;32mSuccess:\e[0m $@" -} - -logit(){ - echo -e "\033[0;37m$@\e[0m" -} - -titleit(){ - echo "" - echo -e "\033[1;35m$@\e[0m" - echo "================================================================" - echo "" -} - -titleit " vg_build.sh ver: 2.0\n" - -# Compile shit -# ============================================================================== - -compiler_cache="ccache" - -# Autodetect ccache unavailible -if ! [ -x "$( command -v $compiler_cache )" ]; then - compiler_cache="" -fi - -compile_x(){ - cmd="$compiler_cache $_compiler - $_options - $_warnings - $_include - $_library - $_src - -o $_folder/$_dst$_ext - $_link - $_epilogue" - - logit " $cmd\n" - $cmd - - if [ $? -ne 0 ]; then - error "compiler failed" - fi - - success "Compiled item\n" -} - -# Tools scripts -# ============================================================================== -enable_tools=false - -vg_compile_tools() { - if [ $enable_tools = true ]; then source vg/src/tools.sh; fi -} - -run_command(){ - case "$1" in - tools) - enable_tools=true - ;; - "") - return - ;; - *) - vg_command $1 - esac -} - -run_command $1 -run_command $2 -run_command $3 -run_command $4 -run_command $5 -run_command $6 -run_command $7 -run_command $8 -run_command $9 diff --git a/vg_compiler.sh b/vg_compiler.sh deleted file mode 100755 index 33d8057..0000000 --- a/vg_compiler.sh +++ /dev/null @@ -1,389 +0,0 @@ -#!/bin/bash -# Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved - -vg_root=`readlink $0` -vg_root=`dirname $vg_root` -vg_version="0.2" - -opt_assets=false -opt_shaders=false -opt_release=false -opt_play=false -opt_linux=false -opt_windows=false -opt_tools=false -opt_recompile_mini_audio=false -opt_steam="" - -target_platform_include="" -target_standard="-std=c99" -target_link_steam=false -target_shaders="" - -# Util -# =========================================== -error(){ - echo -e "\033[1;31mError:\e[0m $@" - exit 1 -} - -warning(){ - echo -e "\033[1;33mWarning:\e[0m $@" -} - -success(){ - echo -e "\033[1;32mSuccess:\e[0m $@" -} - -logit(){ - echo -e "\033[0;37m$@\e[0m" -} - -titleit(){ - echo "" - echo -e "\033[1;35m$@\e[0m" - echo "==========================" - echo "" -} - -checkfatal(){ - if [ $? -ne 0 ]; then - error "compiler signaled fail" - exit 1 - fi -} - -# Platforms -# =========================================== - -target_os_windows(){ - target_ext=".exe" - target_compiler="i686-w64-mingw32-gcc" - target_libs="-lglfw3dll -lopengl32 -lm -mwindows" - target_libs_steam="$vg_root/dep/steam/steam_api.dll" - target_dir="build.win32" - target_steam_api="steam_api.dll" - target_miniaudio="$vg_root/dep/dr_soft/miniaudio_win32.o" - target_platform_include="" - - if [ $opt_release = true ]; then - target_opts="-O3 -DVG_RELEASE" - else - target_opts="-ggdb3" - fi -} - -target_os_linux(){ - target_ext="" - target_compiler="gcc" - target_libs="-lGL -lglfw3 -lX11 -lXxf86vm -lXrandr -lm -pthread -lXi -ldl" - target_libs_steam="-lsteam_api" - #target_platform_include="-include $vg_root/platformutils/force_link_glibc_2.23.h" - target_platform_include="" - target_dir="build.linux" - target_steam_api="libsteam_api.so" - target_miniaudio="$vg_root/dep/dr_soft/miniaudio_linux.o" - if [ $opt_release = true ]; then - target_opts="-O3 -DVG_RELEASE" - else - target_opts="-O0 -fsanitize=address -ggdb3 -fno-omit-frame-pointer" - fi -} - -precompile_x(){ - if ! [ -x "$(command -v $target_compiler)" ]; then - warning "Compiler $target_compiler is not installed. Skipping item" - return 0 - fi - sources="$1" - output="-o $2" - cmd="$target_compiler $target_standard $target_opts $target_platform_include - -c $sources - $output" - - logit " $cmd" - $cmd - - checkfatal - success "$2 built" -} - -compile_x(){ - if ! [ -x "$(command -v $target_compiler)" ]; then - warning "Compiler $target_compiler is not installed. Skipping item" - return 0 - fi - - include="-I. -I$vg_root/dep -I$vg_root/src" - libs="-L./ -L$vg_root/dep/glfw -L$vg_root/dep/steam" - - steam_part="" - if [ "$opt_steam" != "" ]; then - steam_part="$opt_steam $target_libs_steam" - fi - - warnings="-Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable" - sources="$1 $vg_root/dep/glad/glad.c $target_miniaudio" - output="-o $2$target_ext" - - cmd="$target_compiler -D_REENTRANT $target_standard $target_opts $target_platform_include - $warnings - $include - $libs - $sources - $output - $target_libs $steam_part - -Wl,-rpath=./" - - logit " $cmd\n" - $cmd - - checkfatal - success "$2$target_ext built" -} - -compile_main(){ - titleit "Main build: $target_dir" - mkdir -p $target_dir - - if [ "$opt_recompile_mini_audio" == true ]; then - precompile_x $vg_root/dep/dr_soft/miniaudio_impl.c $target_miniaudio - fi - - compile_x $vg_src $target_dir/$vg_target - echo "" - logit "Setting up build structure" - - # Setup build folder - mkdir $target_dir/cfg -p - mkdir $target_dir/textures -p - mkdir $target_dir/sound -p - mkdir $target_dir/maps -p - mkdir $target_dir/sav -p - - # Copy libraries - if [ "$opt_steam" != "" ]; then - cp $vg_root/dep/steam/$target_steam_api $target_dir/$target_steam_api - fi -} - -compile_tools(){ - # These should only be compiled for native platform - titleit "Tools" - - mkdir $vg_root/bin -p - - steam_prev=$opt_steam - opt_steam="" - - compile_x $vg_root/src/fontcomp.c $vg_root/bin/fontcomp - compile_x $vg_root/src/texsheet.c $vg_root/bin/texsheet - compile_x $vg_root/src/qoiconv.c $vg_root/bin/qoiconv - compile_x $vg_root/src/shader.c $vg_root/bin/shader - - opt_steam=$steam_prev -} -compile_assets(){ - titleit "Assets" - [[ -d .temp_textures ]] && rm -r .temp_textures - mkdir .temp_textures - - # Convert all png to qoi - echo "Compile textures:" - for f in textures/*.png; - do logit " qoi: $f"; - $vg_root/bin/qoiconv$target_ext $f .temp_textures/"$(basename "$f" .png).qoi" - done - - if [[ -d "textures_combine" ]]; then - echo " [combine]:" - - auto_combine="" - cd textures_combine - for f in *.png; - do logit " combine: $f"; - auto_combine="$auto_combine $f" - done - $vg_root/bin/texsheet$target_ext ../.temp_textures/autocombine.qoi ../sprites_autocombine.h sprites_auto_combine $auto_combine - cd .. - fi - - # Compile font file - echo "" - echo "Compile fonts:" - $vg_root/bin/fontcomp$target_ext $vg_root/src/fonts/vg_font.png $vg_root/src/vg/vg_pxfont.h - - # Clear and copy assets - rm -r $target_dir/textures - rm -r $target_dir/sound - rm -r $target_dir/maps - - cp -r .temp_textures $target_dir - mv $target_dir/.temp_textures $target_dir/textures - cp -r sound $target_dir - cp -r maps $target_dir - cp -r models $target_dir -} - -compile_shaders(){ - titleit "Shaders" - - if [[ -d "shaders" ]]; then - cd shaders - $vg_root/bin/shader$target_ext $target_shaders - cd .. - fi -} - -shader(){ - target_shaders="$target_shaders $1 $2 $3" -} - -# ============================================================== -# Compile process - -options=rptlwas -longopts=release,build-linux,build-windows,steam,play,build-tools,assets,full,miniaudio,template -parsed=$(getopt --options=$options --longoptions=$longopts --name "vgc" -- "$@") - -if [ $? -ne 0 ]; then - error "getopt failed" - exit 1 -fi - -eval set -- "$parsed" -while true; do - case "$1" in - -s|--shaders) - opt_shaders=true - shift; - ;; - -a|--assets) - opt_assets=true - opt_shaders=true - shift; - ;; - -r|--release) - opt_release=true - shift; - ;; - -p|--play) - opt_play=true - shift; - ;; - -l|--build-linux) - opt_linux=true - shift; - ;; - -w|--build-windows) - opt_windows=true - shift; - ;; - -t|--build-tools) - opt_tools=true - shift; - ;; - --full) - opt_assets=true - opt_release=true - opt_linux=true - opt_windows=true - opt_tools=true - opt_steam="-DVG_STEAM" - opt_recompile_mini_audio=true - shift; - ;; - --miniaudio) - opt_recompile_mini_audio=true - shift; - ;; - --steam) - opt_steam="-DVG_STEAM" - shift; - ;; - --template) - - if [ -f "main.c" ]; then error "main.c already exists"; - elif [ -f "vg_config.h" ]; then error "vg_config.h already exists"; - elif [ -f "vg.conf" ]; then error "vg.conf already exists"; - else - cp $vg_root/src/template/main.c main.c - cp $vg_root/src/template/vg_config.h vg_config.h - cp $vg_root/src/template/vg.conf vg.conf - fi - - shift; - ;; - --) - shift - break - ;; - *) - error "programming error" - break - ;; - esac -done - -if [[ -f vg.conf ]]; then - source vg.conf -else - error "Directory is not a VG project" - exit 1 -fi - -detect_os(){ - if [[ "$OSTYPE" != "linux-gnu"* ]]; then - host_os=win32 - target_os_windows - else - host_os=linux - target_os_linux - fi -} - -detect_os - -titleit " vgc ver: $vg_version\n host: $host_os" -logit " assets: $opt_assets" -logit " shaders: $opt_shaders" -logit " release: $opt_release" -logit " play: $opt_play" -logit " build-linux: $opt_linux" -logit "build-windows: $opt_windows" -logit " build-tools: $opt_tools" -logit " steam: $opt_steam" -logit " miniaudio: $opt_recompile_mini_audio" - -# Main build steps - -if [ $opt_tools = true ]; then detect_os; compile_tools; fi -if [ $opt_assets = true ]; then compile_assets; fi -if [ $opt_shaders = true ]; then compile_shaders; fi -if [ $opt_linux = true ]; then target_os_linux; compile_main; fi -if [ $opt_windows = true ]; then - target_os_windows - compile_main - - cp $vg_root/dep/glfw/glfw3.dll $target_dir/glfw3.dll -fi - -success "Build completed (check compiler results)" - -if [ $opt_play = true ]; then - - if [ $host_os = linux ]; then - target_os_linux - else - target_os_windows - fi - - echo "" - logit "======= exec: $target_dir/$vg_target$target_ext =======" - echo "" - - cd $target_dir - ./$vg_target$target_ext - cd ./../ - -fi diff --git a/src/vg/vg_console.h b/vg_console.h similarity index 86% rename from src/vg/vg_console.h rename to vg_console.h index b0758c1..15c605c 100644 --- a/src/vg/vg_console.h +++ b/vg_console.h @@ -3,6 +3,10 @@ #ifndef VG_CONSOLE_H #define VG_CONSOLE_H +#ifndef VG_GAME + #define VG_GAME +#endif + #include "vg/vg_ui.h" #include "vg/vg_log.h" @@ -87,10 +91,8 @@ VG_STATIC void console_to_clipboard(void); VG_STATIC void console_clipboard_paste(void); VG_STATIC void console_put_char( char c ); VG_STATIC void console_history_get( char* buf, int entry_num ); -VG_STATIC void console_proc_key( GLFWwindow* ptrW, int key, - int scancode, int action, int mods ); -VG_STATIC void console_proc_wchar( GLFWwindow* ptrW, u32 uWchar ); VG_STATIC int vg_console_enabled(void); +VG_STATIC void console_proc_key( SDL_Keysym ev ); /* * Implementation @@ -122,7 +124,7 @@ VG_STATIC void vg_console_draw( void ) if( !vg_console.enabled ) return; - vg_mutex_lock( &log_print_mutex ); + SDL_AtomicLock( &log_print_sl ); int ptr = vg_log.buffer_line_current; int const fh = 14, @@ -173,7 +175,7 @@ VG_STATIC void vg_console_draw( void ) ui_fill_rect( vg_uictx.cursor, 0x66ffffff ); } ui_end_down(); - vg_mutex_unlock( &log_print_mutex ); + SDL_AtomicUnlock( &log_print_sl ); } VG_STATIC int vg_console_list( int argc, char const *argv[] ) @@ -456,21 +458,29 @@ VG_STATIC void console_to_clipboard(void) { memcpy( buffer, &vg_console.input[ start ], end-start ); buffer[ end-start ] = 0x00; - glfwSetClipboardString( NULL, buffer ); + SDL_SetClipboardText( buffer ); } } VG_STATIC void console_clipboard_paste(void) { - int datastart = console_delete_char(0); - const char* clipboard = glfwGetClipboardString(NULL); - int length = strlen(clipboard); - - int cpylength = console_makeroom(datastart, length); + if( !SDL_HasClipboardText() ) + return; - memcpy( vg_console.input + datastart, clipboard, cpylength); + char *text = SDL_GetClipboardText(); + + if( !text ) + return; + + int datastart = console_delete_char( 0 ); + int length = strlen( text ); + int cpylength = console_makeroom( datastart, length ); + + memcpy( vg_console.input + datastart, text, cpylength); console_move_cursor( &vg_console.cursor_user, &vg_console.cursor_pos, cpylength, 1 ); + + SDL_free( text ); } VG_STATIC void console_put_char( char c ) @@ -631,59 +641,64 @@ VG_STATIC void _console_enter(void) vg_console.input[0] = '\0'; } -VG_STATIC void console_proc_key( GLFWwindow* ptrW, int key, int scancode, - int action, int mods ) +VG_STATIC void console_proc_key( SDL_Keysym ev ) { - if( !action ) - return; - /* Open / close console */ - if( key == GLFW_KEY_GRAVE_ACCENT ) + if( ev.sym == SDLK_BACKQUOTE ) + { vg_console.enabled = !vg_console.enabled; + + if( vg_console.enabled ) + SDL_StartTextInput(); + else + SDL_StopTextInput(); + } if( !vg_console.enabled ) return; struct console_mapping { - u32 mod, key; + u16 mod; + SDL_Keycode key; + void (*handler)(void); } mapping[] = { - { 0, GLFW_KEY_LEFT, _console_left }, - { GLFW_MOD_SHIFT, GLFW_KEY_LEFT, _console_left_select }, - { 0, GLFW_KEY_RIGHT, _console_right }, - { GLFW_MOD_SHIFT, GLFW_KEY_RIGHT, _console_right_select }, - { 0, GLFW_KEY_DOWN, _console_down }, - { 0, GLFW_KEY_UP, _console_up }, - { 0, GLFW_KEY_BACKSPACE, _console_backspace }, - { 0, GLFW_KEY_DELETE, _console_delete }, - { 0, GLFW_KEY_HOME, _console_home }, - { GLFW_MOD_SHIFT, GLFW_KEY_HOME, _console_home_select }, - { 0, GLFW_KEY_END, _console_end }, - { GLFW_MOD_SHIFT, GLFW_KEY_END, _console_end_select }, - { GLFW_MOD_CONTROL, GLFW_KEY_A, _console_select_all }, - { GLFW_MOD_CONTROL, GLFW_KEY_C, console_to_clipboard }, - { GLFW_MOD_CONTROL, GLFW_KEY_X, _console_cut }, - { GLFW_MOD_CONTROL, GLFW_KEY_V, console_clipboard_paste }, - { 0, GLFW_KEY_ENTER, _console_enter } + { 0, SDLK_LEFT, _console_left }, + { KMOD_SHIFT, SDLK_LEFT, _console_left_select }, + { 0, SDLK_RIGHT, _console_right }, + { KMOD_SHIFT, SDLK_RIGHT, _console_right_select }, + { 0, SDLK_DOWN, _console_down }, + { 0, SDLK_UP, _console_up }, + { 0, SDLK_BACKSPACE, _console_backspace }, + { 0, SDLK_DELETE, _console_delete }, + { 0, SDLK_HOME, _console_home }, + { KMOD_SHIFT, SDLK_HOME, _console_home_select }, + { 0, SDLK_END, _console_end }, + { KMOD_SHIFT, SDLK_END, _console_end_select }, + { KMOD_CTRL, SDLK_a, _console_select_all }, + { KMOD_CTRL, SDLK_c, console_to_clipboard }, + { KMOD_CTRL, SDLK_x, _console_cut }, + { KMOD_CTRL, SDLK_v, console_clipboard_paste }, + { 0, SDLK_RETURN, _console_enter } }; for( int i=0; ikey == key ) + if( mk->key == ev.sym ) { if( mk->mod == 0 ) { - if( mods == 0 ) + if( ev.mod == 0 ) { mk->handler(); return; } } - else if( (mods & mk->mod) == mk->mod ) + else if( (ev.mod & mk->mod) == mk->mod ) { mk->handler(); return; @@ -692,13 +707,16 @@ VG_STATIC void console_proc_key( GLFWwindow* ptrW, int key, int scancode, } } -/* Handle an OS based input of UTF32 character from the keyboard or such */ -VG_STATIC void console_proc_wchar( GLFWwindow* ptrW, u32 uWchar ) +VG_STATIC void console_proc_utf8( const char *text ) { - if( uWchar <= 0x7F && (char)uWchar != 0x60) - { - console_put_char((char)uWchar); - } + const char *ptr = text; + + while( *ptr ) + { + if( *ptr != '`' ) + console_put_char( *ptr ); + ptr ++; + } } #endif /* VG_CONSOLE_H */ diff --git a/src/vg/vg_input.h b/vg_input.h similarity index 60% rename from src/vg/vg_input.h rename to vg_input.h index 5b16287..f97a41a 100644 --- a/src/vg/vg_input.h +++ b/vg_input.h @@ -22,7 +22,7 @@ enum vg_button_state k_button_state_none = 0 }; -VG_STATIC struct input_binding +struct input_binding { const char *name; @@ -44,9 +44,9 @@ VG_STATIC struct input_binding { struct input_axis { - u32 gamepad_axis, - keyboard_positive, - keyboard_negative; + SDL_GameControllerAxis gamepad_axis; + SDL_Keycode keyboard_positive, + keyboard_negative; int gamepad_inverted; float value; @@ -55,16 +55,31 @@ VG_STATIC struct input_binding struct { - u32 gamepad_id, keyboard_id; + SDL_GameControllerButton gamepad_id; + SDL_Keycode keyboard_id; int value, prev; } button; }; int save_this; +}; + +struct +{ + const u8 *sdl_keys; + struct input_binding named_inputs[ 32 ]; + u32 named_input_count; + + const char *controller_name; + SDL_GameController *controller_handle; /* null if unplugged */ + SDL_JoystickID controller_joystick_id; + int controller_should_use_trackpad_look; + + float controller_axises[ SDL_CONTROLLER_AXIS_MAX ]; + int controller_buttons[ SDL_CONTROLLER_BUTTON_MAX ]; } -vg_named_inputs[ 32 ]; -VG_STATIC u32 vg_named_input_count = 0; +VG_STATIC vg_input; VG_STATIC void vg_create_unnamed_input( struct input_binding *bind, enum input_type type ) @@ -85,7 +100,8 @@ VG_STATIC void vg_create_unnamed_input( struct input_binding *bind, VG_STATIC struct input_binding *vg_create_named_input( const char *name, enum input_type type ) { - struct input_binding *bind = &vg_named_inputs[ vg_named_input_count ++ ]; + struct input_binding *bind = + &vg_input.named_inputs[ vg_input.named_input_count ++ ]; memset( bind, 0, sizeof(struct input_binding) ); bind->name = name; @@ -106,9 +122,9 @@ VG_STATIC struct input_binding *vg_get_named_input( const char *name ) if( name[0] == '+' || name[0] == '-' ) name ++; - for( u32 i=0; iname, name ) ) return bind; } @@ -125,43 +141,43 @@ struct input_en } vg_all_bindable_inputs[] = { - {k_input_type_keyboard_key, "space", GLFW_KEY_SPACE}, - {k_input_type_keyboard_key, ";", GLFW_KEY_SEMICOLON}, - {k_input_type_keyboard_key, "-", GLFW_KEY_MINUS}, - {k_input_type_keyboard_key, ".", GLFW_KEY_PERIOD}, - {k_input_type_keyboard_key, ",", GLFW_KEY_COMMA}, - {k_input_type_keyboard_key, "=", GLFW_KEY_EQUAL}, - {k_input_type_keyboard_key, "[", GLFW_KEY_LEFT_BRACKET}, - {k_input_type_keyboard_key, "]", GLFW_KEY_RIGHT_BRACKET}, - {k_input_type_keyboard_key, "left", GLFW_KEY_LEFT}, - {k_input_type_keyboard_key, "right", GLFW_KEY_RIGHT}, - {k_input_type_keyboard_key, "up", GLFW_KEY_UP}, - {k_input_type_keyboard_key, "down", GLFW_KEY_DOWN}, - {k_input_type_keyboard_key, "shift", GLFW_KEY_LEFT_SHIFT}, - {k_input_type_keyboard_key, "control", GLFW_KEY_LEFT_CONTROL}, - {k_input_type_keyboard_key, "\2enter", GLFW_KEY_ENTER}, - {k_input_type_keyboard_key, "\2escape", GLFW_KEY_ESCAPE }, + {k_input_type_keyboard_key, "space", SDLK_SPACE}, + {k_input_type_keyboard_key, ";", SDLK_SEMICOLON}, + {k_input_type_keyboard_key, "-", SDLK_MINUS}, + {k_input_type_keyboard_key, ".", SDLK_PERIOD}, + {k_input_type_keyboard_key, ",", SDLK_COMMA}, + {k_input_type_keyboard_key, "=", SDLK_EQUALS}, + {k_input_type_keyboard_key, "[", SDLK_LEFTBRACKET}, + {k_input_type_keyboard_key, "]", SDLK_RIGHTBRACKET}, + {k_input_type_keyboard_key, "left", SDLK_LEFT}, + {k_input_type_keyboard_key, "right", SDLK_RIGHT}, + {k_input_type_keyboard_key, "up", SDLK_UP}, + {k_input_type_keyboard_key, "down", SDLK_DOWN}, + {k_input_type_keyboard_key, "shift", SDLK_LSHIFT}, + {k_input_type_keyboard_key, "control", SDLK_LCTRL}, + {k_input_type_keyboard_key, "\2enter", SDLK_RETURN}, + {k_input_type_keyboard_key, "\2escape", SDLK_ESCAPE }, - {k_input_type_gamepad_axis, "gp-lt", GLFW_GAMEPAD_AXIS_LEFT_TRIGGER}, - {k_input_type_gamepad_axis, "gp-rt", GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER}, - {k_input_type_gamepad_axis, "gp-ls-h", GLFW_GAMEPAD_AXIS_LEFT_X}, - {k_input_type_gamepad_axis, "gp-ls-v", GLFW_GAMEPAD_AXIS_LEFT_Y}, - {k_input_type_gamepad_axis, "gp-rs-h", GLFW_GAMEPAD_AXIS_RIGHT_X}, - {k_input_type_gamepad_axis, "gp-rs-v", GLFW_GAMEPAD_AXIS_RIGHT_Y}, + {k_input_type_gamepad_axis, "gp-lt", SDL_CONTROLLER_AXIS_TRIGGERLEFT}, + {k_input_type_gamepad_axis, "gp-rt", SDL_CONTROLLER_AXIS_TRIGGERRIGHT}, + {k_input_type_gamepad_axis, "gp-ls-h", SDL_CONTROLLER_AXIS_LEFTX}, + {k_input_type_gamepad_axis, "gp-ls-v", SDL_CONTROLLER_AXIS_LEFTY}, + {k_input_type_gamepad_axis, "gp-rs-h", SDL_CONTROLLER_AXIS_RIGHTX}, + {k_input_type_gamepad_axis, "gp-rs-v", SDL_CONTROLLER_AXIS_RIGHTY}, - {k_input_type_gamepad_button, "gp-a", GLFW_GAMEPAD_BUTTON_A}, - {k_input_type_gamepad_button, "gp-b", GLFW_GAMEPAD_BUTTON_B}, - {k_input_type_gamepad_button, "gp-x", GLFW_GAMEPAD_BUTTON_X}, - {k_input_type_gamepad_button, "gp-y", GLFW_GAMEPAD_BUTTON_Y}, - {k_input_type_gamepad_button, "gp-rb", GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER}, - {k_input_type_gamepad_button, "gp-lb", GLFW_GAMEPAD_BUTTON_LEFT_BUMPER}, - {k_input_type_gamepad_button, "gp-rs", GLFW_GAMEPAD_BUTTON_RIGHT_THUMB}, - {k_input_type_gamepad_button, "gp-ls", GLFW_GAMEPAD_BUTTON_LEFT_THUMB}, - {k_input_type_gamepad_button, "gp-dpad-down", GLFW_GAMEPAD_BUTTON_DPAD_DOWN}, - {k_input_type_gamepad_button, "gp-dpad-left", GLFW_GAMEPAD_BUTTON_DPAD_LEFT}, - {k_input_type_gamepad_button, "gp-dpad-right", GLFW_GAMEPAD_BUTTON_DPAD_RIGHT}, - {k_input_type_gamepad_button, "gp-dpad-up", GLFW_GAMEPAD_BUTTON_DPAD_UP}, - {k_input_type_gamepad_button, "\2gp-menu", GLFW_GAMEPAD_BUTTON_BACK} + {k_input_type_gamepad_button, "gp-a", SDL_CONTROLLER_BUTTON_A}, + {k_input_type_gamepad_button, "gp-b", SDL_CONTROLLER_BUTTON_B}, + {k_input_type_gamepad_button, "gp-x", SDL_CONTROLLER_BUTTON_X}, + {k_input_type_gamepad_button, "gp-y", SDL_CONTROLLER_BUTTON_Y}, + {k_input_type_gamepad_button, "gp-rb", SDL_CONTROLLER_BUTTON_RIGHTSHOULDER}, + {k_input_type_gamepad_button, "gp-lb", SDL_CONTROLLER_BUTTON_LEFTSHOULDER}, + {k_input_type_gamepad_button, "gp-rs", SDL_CONTROLLER_BUTTON_RIGHTSTICK}, + {k_input_type_gamepad_button, "gp-ls", SDL_CONTROLLER_BUTTON_LEFTSTICK}, + {k_input_type_gamepad_button, "gp-dpad-down", SDL_CONTROLLER_BUTTON_DPAD_DOWN}, + {k_input_type_gamepad_button, "gp-dpad-left", SDL_CONTROLLER_BUTTON_DPAD_LEFT}, + {k_input_type_gamepad_button,"gp-dpad-right",SDL_CONTROLLER_BUTTON_DPAD_RIGHT}, + {k_input_type_gamepad_button, "gp-dpad-up", SDL_CONTROLLER_BUTTON_DPAD_UP}, + {k_input_type_gamepad_button, "\2gp-menu", SDL_CONTROLLER_BUTTON_BACK} }; VG_STATIC const char *vg_input_to_str( u32 input, enum input_type input_type ) @@ -171,16 +187,16 @@ VG_STATIC const char *vg_input_to_str( u32 input, enum input_type input_type ) if( input_type == k_input_type_keyboard_key ) { - if( (input >= GLFW_KEY_A) && (input <= GLFW_KEY_Z) ) + if( (input >= SDLK_a) && (input <= SDLK_z) ) { return &"a\0b\0c\0d\0e\0f\0g\0h\0i\0j\0k\0l\0m\0n\0o\0p\0" - "q\0r\0s\0t\0u\0v\0w\0x\0y\0z\0"[(input-GLFW_KEY_A)*2]; + "q\0r\0s\0t\0u\0v\0w\0x\0y\0z\0"[(input-SDLK_a)*2]; } - if( (input >= GLFW_KEY_0) && (input <= GLFW_KEY_9) ) + if( (input >= SDLK_0) && (input <= SDLK_9) ) { return &"0\0" "1\0" "2\0" "3\0" "4\0" - "5\0" "6\0" "7\0" "8\0" "9\0"[(input-GLFW_KEY_0)*2]; + "5\0" "6\0" "7\0" "8\0" "9\0"[(input-SDLK_0)*2]; } } @@ -217,13 +233,13 @@ VG_STATIC enum input_type vg_str_to_input( const char *str, u32 *input ) if( (uch >= (u8)'a') && (uch <= (u8)'z') ) { - *input = GLFW_KEY_A + (uch-(u8)'a'); + *input = SDLK_a + (uch-(u8)'a'); return k_input_type_keyboard_key; } if( (uch >= (u8)'0') && (uch <= (u8)'9') ) { - *input = GLFW_KEY_0 + (uch-(u8)'0'); + *input = SDLK_0 + (uch-(u8)'0'); return k_input_type_keyboard_key; } } @@ -404,6 +420,12 @@ VG_STATIC int vg_rebind_input_cmd( int argc, const char *argv[] ) return 0; } +VG_STATIC u8 vg_getkey( SDL_Keycode kc ) +{ + SDL_Scancode sc = SDL_GetScancodeFromKey( kc ); + return vg_input.sdl_keys[sc]; +} + VG_STATIC void vg_input_update( u32 num, struct input_binding *binds ) { if( vg_console.enabled ) @@ -432,11 +454,11 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds ) bind->button.value = 0; if( bind->button.gamepad_id != -1 ) - bind->button.value |= vg.gamepad.buttons[ bind->button.gamepad_id ]; + bind->button.value |= + vg_input.controller_buttons[ bind->button.gamepad_id ]; if( bind->button.keyboard_id != -1 ) - bind->button.value |= glfwGetKey( vg.window, - bind->button.keyboard_id ); + bind->button.value |= vg_getkey( bind->button.keyboard_id ); } else if( bind->type == k_input_type_axis ) { @@ -444,16 +466,18 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds ) gamepad_value = 0.0f; if( bind->axis.keyboard_positive != -1 ) - if( glfwGetKey( vg.window, bind->axis.keyboard_positive ) ) + if( vg_getkey( bind->axis.keyboard_positive ) ) keyboard_value += 1.0f; if( bind->axis.keyboard_negative != -1 ) - if( glfwGetKey( vg.window, bind->axis.keyboard_negative ) ) + if( vg_getkey( bind->axis.keyboard_negative ) ) keyboard_value -= 1.0f; if( bind->axis.gamepad_axis != -1 ) { - gamepad_value = vg.gamepad.axes[ bind->axis.gamepad_axis ]; + gamepad_value = + vg_input.controller_axises[ bind->axis.gamepad_axis ]; + if( bind->axis.gamepad_inverted ) gamepad_value *= -1.0f; } @@ -468,76 +492,91 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds ) } else if( bind->type == k_input_type_axis_norm ) { - float value = -1.0f; + float value = 0.0f; if( bind->axis.keyboard_positive != -1 ) - if( glfwGetKey( vg.window, bind->axis.keyboard_positive )) + if( vg_getkey( bind->axis.keyboard_positive )) value = 1.0f; if( bind->axis.gamepad_axis != -1 ) - value = vg_maxf( value, vg.gamepad.axes[bind->axis.gamepad_axis] ); + value = vg_maxf( value, + vg_input.controller_axises[bind->axis.gamepad_axis] ); - bind->axis.value = value * 0.5f + 0.5f; + bind->axis.value = value; } } } -VG_STATIC int vg_console_enabled(void); -VG_STATIC int vg_input_button_down( struct input_binding *bind ) -{ - if( bind->button.value && !bind->button.prev ) - return 1; - return 0; -} -#if 0 - -VG_STATIC float vg_get_axis( const char *axis ) -{ - return 0.0f; -} - - -VG_STATIC void vg_get_button_states( const char *name, int *cur, int *prev ) +VG_STATIC void vg_input_controller_event( SDL_Event *ev ) { + if( ev->type == SDL_CONTROLLERAXISMOTION ) + { + if( ev->caxis.which == vg_input.controller_joystick_id ) + { + vg_input.controller_axises[ ev->caxis.axis ] = + (float)ev->caxis.value / 32767.0f; + } + } + else if( ev->type == SDL_CONTROLLERBUTTONDOWN ) + { + if( ev->cbutton.which == vg_input.controller_joystick_id ) + vg_input.controller_buttons[ ev->cbutton.button ] = 1; + } + else if( ev->type == SDL_CONTROLLERBUTTONUP ) + { + if( ev->cbutton.which == vg_input.controller_joystick_id ) + vg_input.controller_buttons[ ev->cbutton.button ] = 0; + } } -VG_STATIC int vg_get_button( const char *button ) +VG_STATIC void vg_try_attach_controller(void) { - return 0; + int joy_count = SDL_NumJoysticks(); + for( int i=0; ibutton.value && !bind->button.prev ) + return 1; + return 0; +} + +VG_STATIC void vg_input_init(void) { vg_acquire_thread_sync(); @@ -547,32 +586,32 @@ VG_STATIC void vg_gamepad_init(void) .function = vg_rebind_input_cmd }); - for( int id=0; id<=GLFW_JOYSTICK_LAST; id ++ ) + vg_info( "Checking for controller\n" ); + SDL_GameControllerAddMappingsFromFile( "gamecontrollerdb.txt" ); + + int joy_count = SDL_NumJoysticks(); + for( int i=0; i #include #include -#include "vg/vg_stdint.h" -#include "vg/vg_platform.h" +#include "vg_stdint.h" +#include "vg_platform.h" #define KNRM "\x1B[0m" #define KRED "\x1B[31m" @@ -16,7 +16,9 @@ #define KCYN "\x1B[36m" #define KWHT "\x1B[37m" -vg_mutex log_print_mutex; +#ifdef VG_GAME +static SDL_SpinLock log_print_sl; +#endif struct vg_log { @@ -50,7 +52,9 @@ void vg_console_append_to_log( const char *str ) VG_STATIC void vg_log_write( FILE *file, const char *prefix, const char *fmt, va_list args ) { - vg_mutex_lock( &log_print_mutex ); +#ifdef VG_GAME + SDL_AtomicLock( &log_print_sl ); +#endif char buffer[ 4096 ]; int i, j; @@ -69,12 +73,13 @@ VG_STATIC void vg_log_write( FILE *file, const char *prefix, fputs( buffer, file ); vg_console_append_to_log( buffer ); - vg_mutex_unlock( &log_print_mutex ); +#ifdef VG_GAME + SDL_AtomicUnlock( &log_print_sl ); +#endif } VG_STATIC void vg_log_init(void) { - vg_mutex_init( &log_print_mutex ); } #define VG_LOGX( NAME, PIPE, PFX ) \ diff --git a/src/vg/vg_m.h b/vg_m.h similarity index 60% rename from src/vg/vg_m.h rename to vg_m.h index 8e49fe5..7403320 100644 --- a/src/vg/vg_m.h +++ b/vg_m.h @@ -12,17 +12,17 @@ static inline float vg_minf( float a, float b ) { - return a < b? a: b; + return a < b? a: b; } static inline float vg_maxf( float a, float b ) { - return a > b? a: b; + return a > b? a: b; } static inline float vg_clampf( float a, float min, float max ) { - return vg_minf( max, vg_maxf( a, min ) ); + return vg_minf( max, vg_maxf( a, min ) ); } static inline float vg_signf( float a ) @@ -47,17 +47,17 @@ static float stable_force( float current, float diff ) static inline int vg_min( int a, int b ) { - return a < b? a: b; + return a < b? a: b; } static inline int vg_max( int a, int b ) { - return a > b? a: b; + return a > b? a: b; } static inline float vg_rad( float deg ) { - return deg * VG_PIf / 180.0f; + return deg * VG_PIf / 180.0f; } /* @@ -65,130 +65,130 @@ static inline float vg_rad( float deg ) */ static inline void v2_copy( v2f a, v2f b ) { - b[0] = a[0]; b[1] = a[1]; + b[0] = a[0]; b[1] = a[1]; } static inline void v2_zero( v2f a ) { - a[0] = 0.f; a[1] = 0.f; + a[0] = 0.f; a[1] = 0.f; } static inline void v2i_copy( v2i a, v2i b ) { - b[0] = a[0]; b[1] = a[1]; + b[0] = a[0]; b[1] = a[1]; } static inline int v2i_eq( v2i a, v2i b ) { - return ((a[0] == b[0]) && (a[1] == b[1])); + return ((a[0] == b[0]) && (a[1] == b[1])); } static inline void v2i_add( v2i a, v2i b, v2i d ) { - d[0] = a[0]+b[0]; d[1] = a[1]+b[1]; + d[0] = a[0]+b[0]; d[1] = a[1]+b[1]; } static inline void v2i_sub( v2i a, v2i b, v2i d ) { - d[0] = a[0]-b[0]; d[1] = a[1]-b[1]; + d[0] = a[0]-b[0]; d[1] = a[1]-b[1]; } static inline void v2_minv( v2f a, v2f b, v2f dest ) { - dest[0] = vg_minf(a[0], b[0]); - dest[1] = vg_minf(a[1], b[1]); + dest[0] = vg_minf(a[0], b[0]); + dest[1] = vg_minf(a[1], b[1]); } static inline void v2_maxv( v2f a, v2f b, v2f dest ) { - dest[0] = vg_maxf(a[0], b[0]); - dest[1] = vg_maxf(a[1], b[1]); + dest[0] = vg_maxf(a[0], b[0]); + dest[1] = vg_maxf(a[1], b[1]); } static inline void v2_sub( v2f a, v2f b, v2f d ) { - d[0] = a[0]-b[0]; d[1] = a[1]-b[1]; + d[0] = a[0]-b[0]; d[1] = a[1]-b[1]; } static inline float v2_dot( v2f a, v2f b ) { - return a[0] * b[0] + a[1] * b[1]; + return a[0] * b[0] + a[1] * b[1]; } static inline float v2_cross( v2f a, v2f b ) { - return a[0]*b[1] - a[1]*b[0]; + return a[0]*b[1] - a[1]*b[0]; } static inline void v2_add( v2f a, v2f b, v2f d ) { - d[0] = a[0]+b[0]; d[1] = a[1]+b[1]; + d[0] = a[0]+b[0]; d[1] = a[1]+b[1]; } static inline void v2_muls( v2f a, float s, v2f d ) { - d[0] = a[0]*s; d[1] = a[1]*s; + d[0] = a[0]*s; d[1] = a[1]*s; } static inline void v2_divs( v2f a, float s, v2f d ) { - d[0] = a[0]/s; d[1] = a[1]/s; + d[0] = a[0]/s; d[1] = a[1]/s; } static inline void v2_mul( v2f a, v2f b, v2f d ) { - d[0] = a[0]*b[0]; - d[1] = a[1]*b[1]; + d[0] = a[0]*b[0]; + d[1] = a[1]*b[1]; } static inline void v2_div( v2f a, v2f b, v2f d ) { - d[0] = a[0]/b[0]; d[1] = a[1]/b[1]; + d[0] = a[0]/b[0]; d[1] = a[1]/b[1]; } static inline void v2_muladd( v2f a, v2f b, v2f s, v2f d ) { - d[0] = a[0]+b[0]*s[0]; - d[1] = a[1]+b[1]*s[1]; + d[0] = a[0]+b[0]*s[0]; + d[1] = a[1]+b[1]*s[1]; } static inline void v2_muladds( v2f a, v2f b, float s, v2f d ) { - d[0] = a[0]+b[0]*s; - d[1] = a[1]+b[1]*s; + d[0] = a[0]+b[0]*s; + d[1] = a[1]+b[1]*s; } static inline float v2_length2( v2f a ) { - return a[0]*a[0] + a[1]*a[1]; + return a[0]*a[0] + a[1]*a[1]; } static inline float v2_length( v2f a ) { - return sqrtf( v2_length2( a ) ); + return sqrtf( v2_length2( a ) ); } static inline float v2_dist2( v2f a, v2f b ) { - v2f delta; - v2_sub( a, b, delta ); - return v2_length2( delta ); + v2f delta; + v2_sub( a, b, delta ); + return v2_length2( delta ); } static inline float v2_dist( v2f a, v2f b ) { - return sqrtf( v2_dist2( a, b ) ); + return sqrtf( v2_dist2( a, b ) ); } static inline void v2_lerp( v2f a, v2f b, float t, v2f d ) { - d[0] = a[0] + t*(b[0]-a[0]); - d[1] = a[1] + t*(b[1]-a[1]); + d[0] = a[0] + t*(b[0]-a[0]); + d[1] = a[1] + t*(b[1]-a[1]); } static inline void v2_normalize( v2f a ) { - v2_muls( a, 1.0f / v2_length( a ), a ); + v2_muls( a, 1.0f / v2_length( a ), a ); } static void v2_normalize_clamp( v2f a ) @@ -209,59 +209,59 @@ static inline void v2_floor( v2f a, v2f b ) */ static inline void v3_zero( v3f a ) { - a[0] = 0.f; a[1] = 0.f; a[2] = 0.f; + a[0] = 0.f; a[1] = 0.f; a[2] = 0.f; } static inline void v3_copy( v3f a, v3f b ) { - b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; + b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; } static inline void v3_add( v3f a, v3f b, v3f d ) { - d[0] = a[0]+b[0]; d[1] = a[1]+b[1]; d[2] = a[2]+b[2]; + d[0] = a[0]+b[0]; d[1] = a[1]+b[1]; d[2] = a[2]+b[2]; } static inline void v3_sub( v3f a, v3f b, v3f d ) { - d[0] = a[0]-b[0]; d[1] = a[1]-b[1]; d[2] = a[2]-b[2]; + d[0] = a[0]-b[0]; d[1] = a[1]-b[1]; d[2] = a[2]-b[2]; } static inline void v3_mul( v3f a, v3f b, v3f d ) { - d[0] = a[0]*b[0]; d[1] = a[1]*b[1]; d[2] = a[2]*b[2]; + d[0] = a[0]*b[0]; d[1] = a[1]*b[1]; d[2] = a[2]*b[2]; } static inline void v3_div( v3f a, v3f b, v3f d ) { - d[0] = a[0]/b[0]; d[1] = a[1]/b[1]; d[2] = a[2]/b[2]; + d[0] = a[0]/b[0]; d[1] = a[1]/b[1]; d[2] = a[2]/b[2]; } static inline void v3_muls( v3f a, float s, v3f d ) { - d[0] = a[0]*s; d[1] = a[1]*s; d[2] = a[2]*s; + d[0] = a[0]*s; d[1] = a[1]*s; d[2] = a[2]*s; } static inline void v3_divs( v3f a, float s, v3f d ) { - d[0] = a[0]/s; d[1] = a[1]/s; d[2] = a[2]/s; + d[0] = a[0]/s; d[1] = a[1]/s; d[2] = a[2]/s; } static inline void v3_muladds( v3f a, v3f b, float s, v3f d ) { - d[0] = a[0]+b[0]*s; d[1] = a[1]+b[1]*s; d[2] = a[2]+b[2]*s; + d[0] = a[0]+b[0]*s; d[1] = a[1]+b[1]*s; d[2] = a[2]+b[2]*s; } static inline void v3_muladd( v2f a, v2f b, v2f s, v2f d ) { - d[0] = a[0]+b[0]*s[0]; - d[1] = a[1]+b[1]*s[1]; - d[2] = a[2]+b[2]*s[2]; + d[0] = a[0]+b[0]*s[0]; + d[1] = a[1]+b[1]*s[1]; + d[2] = a[2]+b[2]*s[2]; } static inline float v3_dot( v3f a, v3f b ) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } static inline void v3_cross( v3f a, v3f b, v3f dest ) @@ -275,39 +275,39 @@ static inline void v3_cross( v3f a, v3f b, v3f dest ) static inline float v3_length2( v3f a ) { - return v3_dot( a, a ); + return v3_dot( a, a ); } static inline float v3_length( v3f a ) { - return sqrtf( v3_length2( a ) ); + return sqrtf( v3_length2( a ) ); } static inline float v3_dist2( v3f a, v3f b ) { - v3f delta; - v3_sub( a, b, delta ); - return v3_length2( delta ); + v3f delta; + v3_sub( a, b, delta ); + return v3_length2( delta ); } static inline float v3_dist( v3f a, v3f b ) { - return sqrtf( v3_dist2( a, b ) ); + return sqrtf( v3_dist2( a, b ) ); } static inline void v3_normalize( v3f a ) { - v3_muls( a, 1.f / v3_length( a ), a ); + v3_muls( a, 1.f / v3_length( a ), a ); } static inline float vg_lerpf( float a, float b, float t ) { - return a + t*(b-a); + return a + t*(b-a); } static inline double vg_lerp( double a, double b, double t ) { - return a + t*(b-a); + return a + t*(b-a); } /* correctly lerp around circular period -pi -> pi */ @@ -320,40 +320,40 @@ static float vg_alerpf( float a, float b, float t ) static inline void v3_lerp( v3f a, v3f b, float t, v3f d ) { - d[0] = a[0] + t*(b[0]-a[0]); - d[1] = a[1] + t*(b[1]-a[1]); - d[2] = a[2] + t*(b[2]-a[2]); + d[0] = a[0] + t*(b[0]-a[0]); + d[1] = a[1] + t*(b[1]-a[1]); + d[2] = a[2] + t*(b[2]-a[2]); } static inline void v3_minv( v3f a, v3f b, v3f dest ) { - dest[0] = vg_minf(a[0], b[0]); - dest[1] = vg_minf(a[1], b[1]); - dest[2] = vg_minf(a[2], b[2]); + dest[0] = vg_minf(a[0], b[0]); + dest[1] = vg_minf(a[1], b[1]); + dest[2] = vg_minf(a[2], b[2]); } static inline void v3_maxv( v3f a, v3f b, v3f dest ) { - dest[0] = vg_maxf(a[0], b[0]); - dest[1] = vg_maxf(a[1], b[1]); - dest[2] = vg_maxf(a[2], b[2]); + dest[0] = vg_maxf(a[0], b[0]); + dest[1] = vg_maxf(a[1], b[1]); + dest[2] = vg_maxf(a[2], b[2]); } static inline float v3_minf( v3f a ) { - return vg_minf( vg_minf( a[0], a[1] ), a[2] ); + return vg_minf( vg_minf( a[0], a[1] ), a[2] ); } static inline float v3_maxf( v3f a ) { - return vg_maxf( vg_maxf( a[0], a[1] ), a[2] ); + return vg_maxf( vg_maxf( a[0], a[1] ), a[2] ); } static inline void v3_fill( v3f a, float v ) { - a[0] = v; - a[1] = v; - a[2] = v; + a[0] = v; + a[1] = v; + a[2] = v; } static inline void v3_floor( v3f a, v3f b ) @@ -400,17 +400,17 @@ static inline void v3_rotate( v3f v, float angle, v3f axis, v3f d ) */ static inline void v4_copy( v4f a, v4f b ) { - b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; b[3] = a[3]; + b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; b[3] = a[3]; } static inline void v4_zero( v4f a ) { - a[0] = 0.f; a[1] = 0.f; a[2] = 0.f; a[3] = 0.f; + a[0] = 0.f; a[1] = 0.f; a[2] = 0.f; a[3] = 0.f; } static inline void v4_muls( v4f a, float s, v4f d ) { - d[0] = a[0]*s; + d[0] = a[0]*s; d[1] = a[1]*s; d[2] = a[2]*s; d[3] = a[3]*s; @@ -418,7 +418,7 @@ static inline void v4_muls( v4f a, float s, v4f d ) static inline void v4_muladds( v4f a, v4f b, float s, v4f d ) { - d[0] = a[0]+b[0]*s; + d[0] = a[0]+b[0]*s; d[1] = a[1]+b[1]*s; d[2] = a[2]+b[2]*s; d[3] = a[3]+b[3]*s; @@ -426,15 +426,15 @@ static inline void v4_muladds( v4f a, v4f b, float s, v4f d ) static inline void v4_lerp( v4f a, v4f b, float t, v4f d ) { - d[0] = a[0] + t*(b[0]-a[0]); - d[1] = a[1] + t*(b[1]-a[1]); - d[2] = a[2] + t*(b[2]-a[2]); - d[3] = a[3] + t*(b[3]-a[3]); + d[0] = a[0] + t*(b[0]-a[0]); + d[1] = a[1] + t*(b[1]-a[1]); + d[2] = a[2] + t*(b[2]-a[2]); + d[3] = a[3] + t*(b[3]-a[3]); } static inline float v4_dot( v4f a, v4f b ) { - return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*a[3]; + return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*a[3]; } static inline float v4_length( v4f a ) @@ -446,206 +446,206 @@ static inline float v4_length( v4f a ) * Matrix 2x2 */ -#define M2X2_INDENTIY {{1.0f, 0.0f, }, \ - { 0.0f, 1.0f, }} - -#define M2X2_ZERO {{0.0f, 0.0f, }, \ - { 0.0f, 0.0f, }} +#define M2X2_INDENTIY {{1.0f, 0.0f, }, \ + { 0.0f, 1.0f, }} + +#define M2X2_ZERO {{0.0f, 0.0f, }, \ + { 0.0f, 0.0f, }} static inline void m2x2_copy( m2x2f a, m2x2f b ) { - v2_copy( a[0], b[0] ); - v2_copy( a[1], b[1] ); + v2_copy( a[0], b[0] ); + v2_copy( a[1], b[1] ); } static inline void m2x2_identity( m2x2f a ) { - m2x2f id = M2X2_INDENTIY; - m2x2_copy( id, a ); + m2x2f id = M2X2_INDENTIY; + m2x2_copy( id, a ); } static inline void m2x2_create_rotation( m2x2f a, float theta ) { - float s, c; - - s = sinf( theta ); - c = cosf( theta ); - - a[0][0] = c; - a[0][1] = -s; - a[1][0] = s; - a[1][1] = c; + float s, c; + + s = sinf( theta ); + c = cosf( theta ); + + a[0][0] = c; + a[0][1] = -s; + a[1][0] = s; + a[1][1] = c; } /* * Matrix 3x3 */ -#define M3X3_IDENTITY {{1.0f, 0.0f, 0.0f, },\ - { 0.0f, 1.0f, 0.0f, },\ - { 0.0f, 0.0f, 1.0f, }} - -#define M3X3_ZERO {{0.0f, 0.0f, 0.0f, },\ - { 0.0f, 0.0f, 0.0f, },\ - { 0.0f, 0.0f, 0.0f, }} +#define M3X3_IDENTITY {{1.0f, 0.0f, 0.0f, },\ + { 0.0f, 1.0f, 0.0f, },\ + { 0.0f, 0.0f, 1.0f, }} + +#define M3X3_ZERO {{0.0f, 0.0f, 0.0f, },\ + { 0.0f, 0.0f, 0.0f, },\ + { 0.0f, 0.0f, 0.0f, }} static inline void m3x3_copy( m3x3f a, m3x3f b ) { - v3_copy( a[0], b[0] ); - v3_copy( a[1], b[1] ); - v3_copy( a[2], b[2] ); + v3_copy( a[0], b[0] ); + v3_copy( a[1], b[1] ); + v3_copy( a[2], b[2] ); } static inline void m3x3_identity( m3x3f a ) { - m3x3f id = M3X3_IDENTITY; - m3x3_copy( id, a ); + m3x3f id = M3X3_IDENTITY; + m3x3_copy( id, a ); } static inline void m3x3_zero( m3x3f a ) { - m3x3f z = M3X3_ZERO; - m3x3_copy( z, a ); + m3x3f z = M3X3_ZERO; + m3x3_copy( z, a ); } static inline void m3x3_inv( m3x3f src, m3x3f dest ) { - float a = src[0][0], b = src[0][1], c = src[0][2], - d = src[1][0], e = src[1][1], f = src[1][2], - g = src[2][0], h = src[2][1], i = src[2][2]; + float a = src[0][0], b = src[0][1], c = src[0][2], + d = src[1][0], e = src[1][1], f = src[1][2], + g = src[2][0], h = src[2][1], i = src[2][2]; - float det = 1.f / - (+a*(e*i-h*f) + float det = 1.f / + (+a*(e*i-h*f) -b*(d*i-f*g) +c*(d*h-e*g)); - dest[0][0] = (e*i-h*f)*det; - dest[0][1] = -(b*i-c*h)*det; - dest[0][2] = (b*f-c*e)*det; - dest[1][0] = -(d*i-f*g)*det; - dest[1][1] = (a*i-c*g)*det; - dest[1][2] = -(a*f-d*c)*det; - dest[2][0] = (d*h-g*e)*det; - dest[2][1] = -(a*h-g*b)*det; - dest[2][2] = (a*e-d*b)*det; + dest[0][0] = (e*i-h*f)*det; + dest[0][1] = -(b*i-c*h)*det; + dest[0][2] = (b*f-c*e)*det; + dest[1][0] = -(d*i-f*g)*det; + dest[1][1] = (a*i-c*g)*det; + dest[1][2] = -(a*f-d*c)*det; + dest[2][0] = (d*h-g*e)*det; + dest[2][1] = -(a*h-g*b)*det; + dest[2][2] = (a*e-d*b)*det; } static inline void m3x3_transpose( m3x3f src, m3x3f dest ) { - float a = src[0][0], b = src[0][1], c = src[0][2], - d = src[1][0], e = src[1][1], f = src[1][2], - g = src[2][0], h = src[2][1], i = src[2][2]; - - dest[0][0] = a; - dest[0][1] = d; - dest[0][2] = g; - dest[1][0] = b; - dest[1][1] = e; - dest[1][2] = h; - dest[2][0] = c; - dest[2][1] = f; - dest[2][2] = i; + float a = src[0][0], b = src[0][1], c = src[0][2], + d = src[1][0], e = src[1][1], f = src[1][2], + g = src[2][0], h = src[2][1], i = src[2][2]; + + dest[0][0] = a; + dest[0][1] = d; + dest[0][2] = g; + dest[1][0] = b; + dest[1][1] = e; + dest[1][2] = h; + dest[2][0] = c; + dest[2][1] = f; + dest[2][2] = i; } static inline void m3x3_mul( m3x3f a, m3x3f b, m3x3f d ) { - float a00 = a[0][0], a01 = a[0][1], a02 = a[0][2], - a10 = a[1][0], a11 = a[1][1], a12 = a[1][2], - a20 = a[2][0], a21 = a[2][1], a22 = a[2][2], + float a00 = a[0][0], a01 = a[0][1], a02 = a[0][2], + a10 = a[1][0], a11 = a[1][1], a12 = a[1][2], + a20 = a[2][0], a21 = a[2][1], a22 = a[2][2], - b00 = b[0][0], b01 = b[0][1], b02 = b[0][2], - b10 = b[1][0], b11 = b[1][1], b12 = b[1][2], - b20 = b[2][0], b21 = b[2][1], b22 = b[2][2]; + b00 = b[0][0], b01 = b[0][1], b02 = b[0][2], + b10 = b[1][0], b11 = b[1][1], b12 = b[1][2], + b20 = b[2][0], b21 = b[2][1], b22 = b[2][2]; - d[0][0] = a00*b00 + a10*b01 + a20*b02; - d[0][1] = a01*b00 + a11*b01 + a21*b02; - d[0][2] = a02*b00 + a12*b01 + a22*b02; - d[1][0] = a00*b10 + a10*b11 + a20*b12; - d[1][1] = a01*b10 + a11*b11 + a21*b12; - d[1][2] = a02*b10 + a12*b11 + a22*b12; - d[2][0] = a00*b20 + a10*b21 + a20*b22; - d[2][1] = a01*b20 + a11*b21 + a21*b22; - d[2][2] = a02*b20 + a12*b21 + a22*b22; + d[0][0] = a00*b00 + a10*b01 + a20*b02; + d[0][1] = a01*b00 + a11*b01 + a21*b02; + d[0][2] = a02*b00 + a12*b01 + a22*b02; + d[1][0] = a00*b10 + a10*b11 + a20*b12; + d[1][1] = a01*b10 + a11*b11 + a21*b12; + d[1][2] = a02*b10 + a12*b11 + a22*b12; + d[2][0] = a00*b20 + a10*b21 + a20*b22; + d[2][1] = a01*b20 + a11*b21 + a21*b22; + d[2][2] = a02*b20 + a12*b21 + a22*b22; } static inline void m3x3_mulv( m3x3f m, v3f v, v3f d ) { - v3f res; - - res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2]; - res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2]; - res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2]; - - v3_copy( res, d ); + v3f res; + + res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2]; + res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2]; + res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2]; + + v3_copy( res, d ); } static inline void m3x3_projection( m3x3f dst, float const left, float const right, float const bottom, float const top ) { - float rl, tb; - - m3x3_zero( dst ); + float rl, tb; + + m3x3_zero( dst ); - rl = 1.0f / (right - left); - tb = 1.0f / (top - bottom); + rl = 1.0f / (right - left); + tb = 1.0f / (top - bottom); - dst[0][0] = 2.0f * rl; - dst[1][1] = 2.0f * tb; - dst[2][2] = 1.0f; + dst[0][0] = 2.0f * rl; + dst[1][1] = 2.0f * tb; + dst[2][2] = 1.0f; } static inline void m3x3_translate( m3x3f m, v3f v ) { - m[2][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0]; - m[2][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1]; - m[2][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2]; + m[2][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0]; + m[2][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1]; + m[2][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2]; } static inline void m3x3_scale( m3x3f m, v3f v ) { - m[0][0] = m[0][0] * v[0]; - m[0][1] = m[0][1] * v[0]; - m[0][2] = m[0][2] * v[0]; + m[0][0] = m[0][0] * v[0]; + m[0][1] = m[0][1] * v[0]; + m[0][2] = m[0][2] * v[0]; - m[1][0] = m[1][0] * v[1]; - m[1][1] = m[1][1] * v[1]; - m[1][2] = m[1][2] * v[1]; + m[1][0] = m[1][0] * v[1]; + m[1][1] = m[1][1] * v[1]; + m[1][2] = m[1][2] * v[1]; } static inline void m3x3_rotate( m3x3f m, float angle ) { - float m00 = m[0][0], m10 = m[1][0], - m01 = m[0][1], m11 = m[1][1], - m02 = m[0][2], m12 = m[1][2]; - float c, s; + float m00 = m[0][0], m10 = m[1][0], + m01 = m[0][1], m11 = m[1][1], + m02 = m[0][2], m12 = m[1][2]; + float c, s; - s = sinf( angle ); - c = cosf( angle ); + s = sinf( angle ); + c = cosf( angle ); - m[0][0] = m00 * c + m10 * s; - m[0][1] = m01 * c + m11 * s; - m[0][2] = m02 * c + m12 * s; + m[0][0] = m00 * c + m10 * s; + m[0][1] = m01 * c + m11 * s; + m[0][2] = m02 * c + m12 * s; - m[1][0] = m00 * -s + m10 * c; - m[1][1] = m01 * -s + m11 * c; - m[1][2] = m02 * -s + m12 * c; + m[1][0] = m00 * -s + m10 * c; + m[1][1] = m01 * -s + m11 * c; + m[1][2] = m02 * -s + m12 * c; } /* * Matrix 4x3 */ -#define M4X3_IDENTITY {{1.0f, 0.0f, 0.0f, },\ - { 0.0f, 1.0f, 0.0f, },\ - { 0.0f, 0.0f, 1.0f, },\ - { 0.0f, 0.0f, 0.0f }} +#define M4X3_IDENTITY {{1.0f, 0.0f, 0.0f, },\ + { 0.0f, 1.0f, 0.0f, },\ + { 0.0f, 0.0f, 1.0f, },\ + { 0.0f, 0.0f, 0.0f }} static inline void m4x3_to_3x3( m4x3f a, m3x3f b ) { - v3_copy( a[0], b[0] ); - v3_copy( a[1], b[1] ); - v3_copy( a[2], b[2] ); + v3_copy( a[0], b[0] ); + v3_copy( a[1], b[1] ); + v3_copy( a[2], b[2] ); } static inline void m4x3_invert_affine( m4x3f a, m4x3f b ) @@ -696,53 +696,53 @@ static void m4x3_invert_full( m4x3f src, m4x3f dst ) static inline void m4x3_copy( m4x3f a, m4x3f b ) { - v3_copy( a[0], b[0] ); - v3_copy( a[1], b[1] ); - v3_copy( a[2], b[2] ); - v3_copy( a[3], b[3] ); + v3_copy( a[0], b[0] ); + v3_copy( a[1], b[1] ); + v3_copy( a[2], b[2] ); + v3_copy( a[3], b[3] ); } static inline void m4x3_identity( m4x3f a ) { - m4x3f id = M4X3_IDENTITY; - m4x3_copy( id, a ); + m4x3f id = M4X3_IDENTITY; + m4x3_copy( id, a ); } static inline void m4x3_mul( m4x3f a, m4x3f b, m4x3f d ) { - float - a00 = a[0][0], a01 = a[0][1], a02 = a[0][2], - a10 = a[1][0], a11 = a[1][1], a12 = a[1][2], - a20 = a[2][0], a21 = a[2][1], a22 = a[2][2], - a30 = a[3][0], a31 = a[3][1], a32 = a[3][2], - b00 = b[0][0], b01 = b[0][1], b02 = b[0][2], - b10 = b[1][0], b11 = b[1][1], b12 = b[1][2], - b20 = b[2][0], b21 = b[2][1], b22 = b[2][2], - b30 = b[3][0], b31 = b[3][1], b32 = b[3][2]; - - d[0][0] = a00*b00 + a10*b01 + a20*b02; - d[0][1] = a01*b00 + a11*b01 + a21*b02; - d[0][2] = a02*b00 + a12*b01 + a22*b02; - d[1][0] = a00*b10 + a10*b11 + a20*b12; - d[1][1] = a01*b10 + a11*b11 + a21*b12; - d[1][2] = a02*b10 + a12*b11 + a22*b12; - d[2][0] = a00*b20 + a10*b21 + a20*b22; - d[2][1] = a01*b20 + a11*b21 + a21*b22; - d[2][2] = a02*b20 + a12*b21 + a22*b22; - d[3][0] = a00*b30 + a10*b31 + a20*b32 + a30; - d[3][1] = a01*b30 + a11*b31 + a21*b32 + a31; - d[3][2] = a02*b30 + a12*b31 + a22*b32 + a32; + float + a00 = a[0][0], a01 = a[0][1], a02 = a[0][2], + a10 = a[1][0], a11 = a[1][1], a12 = a[1][2], + a20 = a[2][0], a21 = a[2][1], a22 = a[2][2], + a30 = a[3][0], a31 = a[3][1], a32 = a[3][2], + b00 = b[0][0], b01 = b[0][1], b02 = b[0][2], + b10 = b[1][0], b11 = b[1][1], b12 = b[1][2], + b20 = b[2][0], b21 = b[2][1], b22 = b[2][2], + b30 = b[3][0], b31 = b[3][1], b32 = b[3][2]; + + d[0][0] = a00*b00 + a10*b01 + a20*b02; + d[0][1] = a01*b00 + a11*b01 + a21*b02; + d[0][2] = a02*b00 + a12*b01 + a22*b02; + d[1][0] = a00*b10 + a10*b11 + a20*b12; + d[1][1] = a01*b10 + a11*b11 + a21*b12; + d[1][2] = a02*b10 + a12*b11 + a22*b12; + d[2][0] = a00*b20 + a10*b21 + a20*b22; + d[2][1] = a01*b20 + a11*b21 + a21*b22; + d[2][2] = a02*b20 + a12*b21 + a22*b22; + d[3][0] = a00*b30 + a10*b31 + a20*b32 + a30; + d[3][1] = a01*b30 + a11*b31 + a21*b32 + a31; + d[3][2] = a02*b30 + a12*b31 + a22*b32 + a32; } static inline void m4x3_mulv( m4x3f m, v3f v, v3f d ) { - v3f res; + v3f res; - res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2] + m[3][0]; - res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2] + m[3][1]; - res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2] + m[3][2]; + res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2] + m[3][0]; + res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2] + m[3][1]; + res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2] + m[3][2]; - v3_copy( res, d ); + v3_copy( res, d ); } /* @@ -765,16 +765,16 @@ static inline void m4x3_mulp( m4x3f m, v4f p, v4f d ) static inline void m4x3_translate( m4x3f m, v3f v ) { - v3_muladds( m[3], m[0], v[0], m[3] ); - v3_muladds( m[3], m[1], v[1], m[3] ); - v3_muladds( m[3], m[2], v[2], m[3] ); + v3_muladds( m[3], m[0], v[0], m[3] ); + v3_muladds( m[3], m[1], v[1], m[3] ); + v3_muladds( m[3], m[2], v[2], m[3] ); } static inline void m4x3_scale( m4x3f m, float s ) { - v3_muls( m[0], s, m[0] ); - v3_muls( m[1], s, m[1] ); - v3_muls( m[2], s, m[2] ); + v3_muls( m[0], s, m[0] ); + v3_muls( m[1], s, m[1] ); + v3_muls( m[2], s, m[2] ); } static inline void m4x3_scalev( m4x3f m, v3f v ) @@ -786,50 +786,50 @@ static inline void m4x3_scalev( m4x3f m, v3f v ) static inline void m4x3_rotate_x( m4x3f m, float angle ) { - m4x3f t = M4X3_IDENTITY; - float c, s; + m4x3f t = M4X3_IDENTITY; + float c, s; - c = cosf( angle ); - s = sinf( angle ); + c = cosf( angle ); + s = sinf( angle ); - t[1][1] = c; - t[1][2] = s; - t[2][1] = -s; - t[2][2] = c; + t[1][1] = c; + t[1][2] = s; + t[2][1] = -s; + t[2][2] = c; - m4x3_mul( m, t, m ); + m4x3_mul( m, t, m ); } static inline void m4x3_rotate_y( m4x3f m, float angle ) { - m4x3f t = M4X3_IDENTITY; - float c, s; + m4x3f t = M4X3_IDENTITY; + float c, s; - c = cosf( angle ); - s = sinf( angle ); + c = cosf( angle ); + s = sinf( angle ); - t[0][0] = c; - t[0][2] = -s; - t[2][0] = s; - t[2][2] = c; + t[0][0] = c; + t[0][2] = -s; + t[2][0] = s; + t[2][2] = c; - m4x3_mul( m, t, m ); + m4x3_mul( m, t, m ); } static inline void m4x3_rotate_z( m4x3f m, float angle ) { - m4x3f t = M4X3_IDENTITY; - float c, s; + m4x3f t = M4X3_IDENTITY; + float c, s; - c = cosf( angle ); - s = sinf( angle ); + c = cosf( angle ); + s = sinf( angle ); - t[0][0] = c; - t[0][1] = s; - t[1][0] = -s; - t[1][1] = c; + t[0][0] = c; + t[0][1] = s; + t[1][0] = -s; + t[1][1] = c; - m4x3_mul( m, t, m ); + m4x3_mul( m, t, m ); } static inline void m4x3_expand( m4x3f m, m4x4f d ) @@ -846,64 +846,64 @@ static inline void m4x3_expand( m4x3f m, m4x4f d ) static inline void m4x3_expand_aabb_point( m4x3f m, boxf box, v3f point ) { - v3f v; - m4x3_mulv( m, point, v ); + v3f v; + m4x3_mulv( m, point, v ); - v3_minv( box[0], v, box[0] ); - v3_maxv( box[1], v, box[1] ); + v3_minv( box[0], v, box[0] ); + v3_maxv( box[1], v, box[1] ); } static inline void box_addpt( boxf a, v3f pt ) { - v3_minv( a[0], pt, a[0] ); - v3_maxv( a[1], pt, a[1] ); + v3_minv( a[0], pt, a[0] ); + v3_maxv( a[1], pt, a[1] ); } static inline void box_concat( boxf a, boxf b ) { - v3_minv( a[0], b[0], a[0] ); - v3_maxv( a[1], b[1], a[1] ); + v3_minv( a[0], b[0], a[0] ); + v3_maxv( a[1], b[1], a[1] ); } static inline void box_copy( boxf a, boxf b ) { - v3_copy( a[0], b[0] ); - v3_copy( a[1], b[1] ); + v3_copy( a[0], b[0] ); + v3_copy( a[1], b[1] ); } static inline int box_overlap( boxf a, boxf b ) { return - ( a[0][0] <= b[1][0] && a[1][0] >= b[0][0] ) && - ( a[0][1] <= b[1][1] && a[1][1] >= b[0][1] ) && - ( a[0][2] <= b[1][2] && a[1][2] >= b[0][2] ) - ; + ( a[0][0] <= b[1][0] && a[1][0] >= b[0][0] ) && + ( a[0][1] <= b[1][1] && a[1][1] >= b[0][1] ) && + ( a[0][2] <= b[1][2] && a[1][2] >= b[0][2] ) + ; } static inline void box_init_inf( boxf box ) { - v3_fill( box[0], INFINITY ); - v3_fill( box[1], -INFINITY ); + v3_fill( box[0], INFINITY ); + v3_fill( box[1], -INFINITY ); } static inline void m4x3_transform_aabb( m4x3f m, boxf box ) { - v3f a; v3f b; - - v3_copy( box[0], a ); - v3_copy( box[1], b ); - v3_fill( box[0], INFINITY ); - v3_fill( box[1], -INFINITY ); + v3f a; v3f b; + + v3_copy( box[0], a ); + v3_copy( box[1], b ); + v3_fill( box[0], INFINITY ); + v3_fill( box[1], -INFINITY ); - m4x3_expand_aabb_point( m, box, (v3f){ a[0], a[1], a[2] } ); - m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], a[2] } ); - m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], a[2] } ); - m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], a[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ a[0], a[1], a[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], a[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], a[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], a[2] } ); - m4x3_expand_aabb_point( m, box, (v3f){ a[0], a[1], b[2] } ); - m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], b[2] } ); - m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], b[2] } ); - m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], b[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ a[0], a[1], b[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], b[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], b[2] } ); + m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], b[2] } ); } int ray_aabb( boxf box, v3f co, v3f dir, float dist ) @@ -945,14 +945,14 @@ static inline void m4x3_lookat( m4x3f m, v3f pos, v3f target, v3f up ) * Matrix 4x4 */ -#define M4X4_IDENTITY {{1.0f, 0.0f, 0.0f, 0.0f },\ - { 0.0f, 1.0f, 0.0f, 0.0f },\ - { 0.0f, 0.0f, 1.0f, 0.0f },\ - { 0.0f, 0.0f, 0.0f, 1.0f }} -#define M4X4_ZERO {{0.0f, 0.0f, 0.0f, 0.0f },\ - { 0.0f, 0.0f, 0.0f, 0.0f },\ - { 0.0f, 0.0f, 0.0f, 0.0f },\ - { 0.0f, 0.0f, 0.0f, 0.0f }} +#define M4X4_IDENTITY {{1.0f, 0.0f, 0.0f, 0.0f },\ + { 0.0f, 1.0f, 0.0f, 0.0f },\ + { 0.0f, 0.0f, 1.0f, 0.0f },\ + { 0.0f, 0.0f, 0.0f, 1.0f }} +#define M4X4_ZERO {{0.0f, 0.0f, 0.0f, 0.0f },\ + { 0.0f, 0.0f, 0.0f, 0.0f },\ + { 0.0f, 0.0f, 0.0f, 0.0f },\ + { 0.0f, 0.0f, 0.0f, 0.0f }} static void m4x4_projection( m4x4f m, float angle, float ratio, float fnear, float ffar ) @@ -990,22 +990,22 @@ static void m4x4_translate( m4x4f m, v3f v ) static inline void m4x4_copy( m4x4f a, m4x4f b ) { - v4_copy( a[0], b[0] ); - v4_copy( a[1], b[1] ); - v4_copy( a[2], b[2] ); - v4_copy( a[3], b[3] ); + v4_copy( a[0], b[0] ); + v4_copy( a[1], b[1] ); + v4_copy( a[2], b[2] ); + v4_copy( a[3], b[3] ); } static inline void m4x4_identity( m4x4f a ) { - m4x4f id = M4X4_IDENTITY; - m4x4_copy( id, a ); + m4x4f id = M4X4_IDENTITY; + m4x4_copy( id, a ); } static inline void m4x4_zero( m4x4f a ) { - m4x4f zero = M4X4_ZERO; - m4x4_copy( zero, a ); + m4x4f zero = M4X4_ZERO; + m4x4_copy( zero, a ); } static inline void m4x4_mul( m4x4f a, m4x4f b, m4x4f d ) @@ -1040,14 +1040,14 @@ static inline void m4x4_mul( m4x4f a, m4x4f b, m4x4f d ) static inline void m4x4_mulv( m4x4f m, v4f v, v4f d ) { - v4f res; + v4f res; - res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2] + m[3][0]*v[3]; - res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2] + m[3][1]*v[3]; - res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2] + m[3][2]*v[3]; - res[3] = m[0][3]*v[0] + m[1][3]*v[1] + m[2][3]*v[2] + m[3][3]*v[3]; + res[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2] + m[3][0]*v[3]; + res[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2] + m[3][1]*v[3]; + res[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2] + m[3][2]*v[3]; + res[3] = m[0][3]*v[0] + m[1][3]*v[1] + m[2][3]*v[2] + m[3][3]*v[3]; - v4_copy( res, d ); + v4_copy( res, d ); } static inline void m4x4_inv( m4x4f a, m4x4f d ) @@ -1113,71 +1113,71 @@ static inline void m4x4_inv( m4x4f a, m4x4f d ) static inline void tri_to_plane( double a[3], double b[3], double c[3], double p[4] ) { - double edge0[3]; - double edge1[3]; - double l; - - edge0[0] = b[0] - a[0]; - edge0[1] = b[1] - a[1]; - edge0[2] = b[2] - a[2]; - - edge1[0] = c[0] - a[0]; - edge1[1] = c[1] - a[1]; - edge1[2] = c[2] - a[2]; - - p[0] = edge0[1] * edge1[2] - edge0[2] * edge1[1]; - p[1] = edge0[2] * edge1[0] - edge0[0] * edge1[2]; - p[2] = edge0[0] * edge1[1] - edge0[1] * edge1[0]; - - l = sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]); - p[3] = (p[0] * a[0] + p[1] * a[1] + p[2] * a[2]) / l; - - p[0] = p[0] / l; - p[1] = p[1] / l; - p[2] = p[2] / l; + double edge0[3]; + double edge1[3]; + double l; + + edge0[0] = b[0] - a[0]; + edge0[1] = b[1] - a[1]; + edge0[2] = b[2] - a[2]; + + edge1[0] = c[0] - a[0]; + edge1[1] = c[1] - a[1]; + edge1[2] = c[2] - a[2]; + + p[0] = edge0[1] * edge1[2] - edge0[2] * edge1[1]; + p[1] = edge0[2] * edge1[0] - edge0[0] * edge1[2]; + p[2] = edge0[0] * edge1[1] - edge0[1] * edge1[0]; + + l = sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]); + p[3] = (p[0] * a[0] + p[1] * a[1] + p[2] * a[2]) / l; + + p[0] = p[0] / l; + p[1] = p[1] / l; + p[2] = p[2] / l; } static inline int plane_intersect( double a[4], double b[4], double c[4], double p[4] ) { - double const epsilon = 1e-8f; - - double x[3]; - double d; - - x[0] = a[1] * b[2] - a[2] * b[1]; - x[1] = a[2] * b[0] - a[0] * b[2]; - x[2] = a[0] * b[1] - a[1] * b[0]; - - d = x[0] * c[0] + x[1] * c[1] + x[2] * c[2]; - - if( d < epsilon && d > -epsilon ) return 0; - - p[0] = (b[1] * c[2] - b[2] * c[1]) * -a[3]; - p[1] = (b[2] * c[0] - b[0] * c[2]) * -a[3]; - p[2] = (b[0] * c[1] - b[1] * c[0]) * -a[3]; - - p[0] += (c[1] * a[2] - c[2] * a[1]) * -b[3]; - p[1] += (c[2] * a[0] - c[0] * a[2]) * -b[3]; - p[2] += (c[0] * a[1] - c[1] * a[0]) * -b[3]; - - p[0] += (a[1] * b[2] - a[2] * b[1]) * -c[3]; - p[1] += (a[2] * b[0] - a[0] * b[2]) * -c[3]; - p[2] += (a[0] * b[1] - a[1] * b[0]) * -c[3]; - - p[0] = -p[0] / d; - p[1] = -p[1] / d; - p[2] = -p[2] / d; - - return 1; + double const epsilon = 1e-8f; + + double x[3]; + double d; + + x[0] = a[1] * b[2] - a[2] * b[1]; + x[1] = a[2] * b[0] - a[0] * b[2]; + x[2] = a[0] * b[1] - a[1] * b[0]; + + d = x[0] * c[0] + x[1] * c[1] + x[2] * c[2]; + + if( d < epsilon && d > -epsilon ) return 0; + + p[0] = (b[1] * c[2] - b[2] * c[1]) * -a[3]; + p[1] = (b[2] * c[0] - b[0] * c[2]) * -a[3]; + p[2] = (b[0] * c[1] - b[1] * c[0]) * -a[3]; + + p[0] += (c[1] * a[2] - c[2] * a[1]) * -b[3]; + p[1] += (c[2] * a[0] - c[0] * a[2]) * -b[3]; + p[2] += (c[0] * a[1] - c[1] * a[0]) * -b[3]; + + p[0] += (a[1] * b[2] - a[2] * b[1]) * -c[3]; + p[1] += (a[2] * b[0] - a[0] * b[2]) * -c[3]; + p[2] += (a[0] * b[1] - a[1] * b[0]) * -c[3]; + + p[0] = -p[0] / d; + p[1] = -p[1] / d; + p[2] = -p[2] / d; + + return 1; } static inline double plane_polarity( double p[4], double a[3] ) { - return - (a[0] * p[0] + a[1] * p[1] + a[2] * p[2]) - -(p[0]*p[3] * p[0] + p[1]*p[3] * p[1] + p[2]*p[3] * p[2]) - ; + return + (a[0] * p[0] + a[1] * p[1] + a[2] * p[2]) + -(p[0]*p[3] * p[0] + p[1]*p[3] * p[1] + p[2]*p[3] * p[2]) + ; } /* Quaternions */ diff --git a/src/vg/vg_mem.h b/vg_mem.h similarity index 100% rename from src/vg/vg_mem.h rename to vg_mem.h diff --git a/src/vg/vg_opt.h b/vg_opt.h similarity index 98% rename from src/vg/vg_opt.h rename to vg_opt.h index a11f2c0..c817d06 100644 --- a/src/vg/vg_opt.h +++ b/vg_opt.h @@ -6,8 +6,8 @@ #define VG_OPT_H #include -#include "vg/vg_platform.h" -#include "vg/vg_log.h" +#include "vg_platform.h" +#include "vg_log.h" /* * Supported: diff --git a/vg_platform.h b/vg_platform.h new file mode 100644 index 0000000..6707af7 --- /dev/null +++ b/vg_platform.h @@ -0,0 +1,66 @@ +#ifndef VG_PLATFORM_H +#define VG_PLATFORM_H + +//#include "vg.h" +#include "vg_stdint.h" + +/* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */ + +typedef unsigned int uint; + +typedef int v2i[2]; +typedef int v3i[3]; +typedef int v4i[4]; +typedef float v2f[2]; +typedef float v3f[3]; +typedef float v4f[4]; +typedef v2f m2x2f[2]; +typedef v3f m3x3f[3]; +typedef v3f m4x3f[4]; +typedef v4f m4x4f[4]; +typedef v3f boxf[2]; + +// Resource types +typedef struct vg_tex2d vg_tex2d; + +struct vg_achievement +{ + int is_set; + const char *name; +}; + +#ifndef VG_STATIC +#define VG_STATIC static +#endif + +#define vg_static_assert _Static_assert +#define vg_list_size( A ) (sizeof(A)/sizeof(A[0])) +#define VG_MUST_USE_RESULT __attribute__((warn_unused_result)) + +VG_STATIC void vg_strncpy( const char *src, char *dst, u32 len ) +{ + for( u32 i=0; i +#include +#include +#include +#include +#include +#include + +#define VG_MIN( A, B ) ((A)<(B)?(A):(B)) +#define VG_MAX( A, B ) ((A)>(B)?(A):(B)) + +#endif diff --git a/src/vg/vg_profiler.h b/vg_profiler.h similarity index 89% rename from src/vg/vg_profiler.h rename to vg_profiler.h index 87de34f..784fc28 100644 --- a/src/vg/vg_profiler.h +++ b/vg_profiler.h @@ -1,6 +1,7 @@ #ifndef VG_PROFILER_H #define VG_PROFILER_H +#include "vg.h" #include "vg_platform.h" #define VG_PROFILE_SAMPLE_COUNT 128 @@ -11,7 +12,7 @@ struct vg_profile { const char *name; - float samples[ VG_PROFILE_SAMPLE_COUNT ]; + u32 samples[ VG_PROFILE_SAMPLE_COUNT ]; u32 buffer_count, buffer_current; enum profile_mode @@ -21,12 +22,12 @@ struct vg_profile } mode; - struct timespec start; + u64 start; }; VG_STATIC void vg_profile_begin( struct vg_profile *profile ) { - clock_gettime( CLOCK_REALTIME, &profile->start ); + profile->start = SDL_GetPerformanceCounter(); } VG_STATIC void vg_profile_increment( struct vg_profile *profile ) @@ -44,11 +45,10 @@ VG_STATIC void vg_profile_increment( struct vg_profile *profile ) VG_STATIC void vg_profile_end( struct vg_profile *profile ) { - struct timespec time_end; - - clock_gettime( CLOCK_REALTIME, &time_end ); - float delta = vg_time_diff( profile->start, time_end ); + u64 time_end; + time_end = SDL_GetPerformanceCounter(); + u64 delta = profile->start - time_end; if( profile->mode == k_profile_mode_frame ) { @@ -91,6 +91,8 @@ VG_STATIC void vg_profile_drawn( struct vg_profile **profiles, u32 count, u32 colours[] = { 0xff0000ff, 0xff00ff00, 0xff00ffff, 0xffff0000, 0xffff00ff, 0xffffff00 }; + float rate_mul = 1.0f / (float)SDL_GetPerformanceFrequency(); + for( int i=0; isamples[ptrs[j]], + float sample = (float)profiles[j]->samples[ptrs[j]] * rate_mul, px = (total / (budget)) * sw, wx = (sample / (budget)) * sw; diff --git a/src/vg/vg_pxfont.h b/vg_pxfont.h similarity index 100% rename from src/vg/vg_pxfont.h rename to vg_pxfont.h diff --git a/src/vg/vg_shader.h b/vg_shader.h similarity index 100% rename from src/vg/vg_shader.h rename to vg_shader.h diff --git a/src/vg/vg_stdint.h b/vg_stdint.h similarity index 100% rename from src/vg/vg_stdint.h rename to vg_stdint.h diff --git a/src/vg/vg_steam.h b/vg_steam.h similarity index 99% rename from src/vg/vg_steam.h rename to vg_steam.h index 740ffda..b39da94 100644 --- a/src/vg/vg_steam.h +++ b/vg_steam.h @@ -2,6 +2,7 @@ #define VG_STEAM_H #include "vg.h" +#include "vg_log.h" /* * TODO: Combine interfaces and stuff here instead of having them in client code @@ -17,6 +18,7 @@ * 32-bit structure packing for each platform. */ #define VALVE_CALLBACK_PACK_SMALL +; #pragma pack( push, 4 ) #else #define VALVE_CALLBACK_PACK_LARGE diff --git a/src/vg/vg_steam_auth.h b/vg_steam_auth.h similarity index 99% rename from src/vg/vg_steam_auth.h rename to vg_steam_auth.h index 9ad1a2d..7d4002b 100644 --- a/src/vg/vg_steam_auth.h +++ b/vg_steam_auth.h @@ -2,6 +2,7 @@ #define VG_STEAM_AUTH_H #include "vg/vg_platform.h" +#include "vg/vg_io.h" typedef u32 HAuthTicket; enum{ k_HAuthTicketInvalid = 0 }; diff --git a/src/vg/vg_steam_friends.h b/vg_steam_friends.h similarity index 100% rename from src/vg/vg_steam_friends.h rename to vg_steam_friends.h diff --git a/src/vg/vg_steam_http.h b/vg_steam_http.h similarity index 100% rename from src/vg/vg_steam_http.h rename to vg_steam_http.h diff --git a/src/vg/vg_steam_networking.h b/vg_steam_networking.h similarity index 100% rename from src/vg/vg_steam_networking.h rename to vg_steam_networking.h diff --git a/src/vg/vg_steam_user_stats.h b/vg_steam_user_stats.h similarity index 100% rename from src/vg/vg_steam_user_stats.h rename to vg_steam_user_stats.h diff --git a/src/vg/vg_steam_utils.h b/vg_steam_utils.h similarity index 100% rename from src/vg/vg_steam_utils.h rename to vg_steam_utils.h diff --git a/src/vg/vg_store.h b/vg_store.h similarity index 100% rename from src/vg/vg_store.h rename to vg_store.h diff --git a/src/vg/vg_tex.h b/vg_tex.h similarity index 99% rename from src/vg/vg_tex.h rename to vg_tex.h index 0896b75..5c7c7f6 100644 --- a/src/vg/vg_tex.h +++ b/vg_tex.h @@ -26,7 +26,7 @@ VG_STATIC void vg_qoi_free( void *ptr ) #define QOI_MALLOC(sz) vg_qoi_malloc( sz ) #define QOI_FREE(p) vg_qoi_free( p ) -#include "phoboslab/qoi.h" +#include "submodules/qoi/qoi.h" struct vg_tex2d { diff --git a/src/vg/vg_ui.h b/vg_ui.h similarity index 100% rename from src/vg/vg_ui.h rename to vg_ui.h -- 2.25.1

    iI}u%IuK?azy5B%adunsQz4#JMuuDs0s2y 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%0D`Vi)n3;mnz8B$Mj` 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%0DS%jr2el6Lx{X`7QH8TW5; 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%0DM1lvrAPV2E^#7ptOe1O5EkfJiW?$YMUBL0#Vf^# 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